diff --git a/docs/API/CollectionClass.md b/docs/API/CollectionClass.md
index 546fa47a6bae96..f1270f98ade8a5 100644
--- a/docs/API/CollectionClass.md
+++ b/docs/API/CollectionClass.md
@@ -2230,7 +2230,7 @@ You can also pass a criteria parameter to define how the collection elements mus
|Constant| Type|Value|Comment|
|---|---|---|---|
|ck ascending|Integer|0|Elements are ordered in ascending order (default)|
- |ck descending|Integer|1|Elements are ordered in descending order
+ |ck descending|Integer|1|Elements are ordered in descending order|
This syntax orders scalar values in the collection only (other element types such as objects or collections are returned unordered).
@@ -3421,12 +3421,13 @@ You want to know if at least one collection value is >0.
-**.sort**() : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
+**.sort**() : Collection **.sort**( *ascOrDesc* : Integer ) : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
|Parameter|Type||Description|
|---------|--- |:---:|------|
+|ascOrDesc|Integer|->|`ck ascending` or `ck descending` (scalar values)|
|formula|4D.Function|->|Formula object|
|methodName|Text|->|Name of a method|
|extraParam |any |->|Parameter(s) for the method|
@@ -3440,7 +3441,17 @@ The `.sort()` function sorts the elements
>This function modifies the original collection.
-If `.sort()` is called with no parameters, only scalar values (number, text, date, booleans) are sorted. Elements are sorted by default in ascending order, according to their type. If the collection contains elements of different types, they are first grouped by type and sorted afterwards. Types are returned in the following order:
+If `.sort()` is called with no parameters, only scalar values (number, text, date, booleans) are sorted. Elements are sorted by default in ascending order, according to their type.
+You can also pass one of the following constants in the *ascOrDesc* parameter:
+
+ |Constant| Type|Value|Comment|
+ |---|---|---|---|
+ |ck ascending|Integer|0|Elements are ordered in ascending order (default)|
+ |ck descending|Integer|1|Elements are ordered in descending order|
+
+ This syntax orders scalar values in the collection only (other element types such as objects or collections are returned unordered).
+
+ If the collection contains elements of different types, they are first grouped by type and sorted afterwards. Types are returned in the following order:
1. null
2. booleans
diff --git a/docs/API/EntityClass.md b/docs/API/EntityClass.md
index 2b4675b68d7e47..13cba5842aa523 100644
--- a/docs/API/EntityClass.md
+++ b/docs/API/EntityClass.md
@@ -334,6 +334,7 @@ vCompareResult3 (only differences on $e1 touched attributes are returned)
|Release|Changes|
|---|---|
+|21|Added status 7 and 8|
|17|Added|
@@ -360,7 +361,7 @@ Otherwise, you can pass the `dk force drop if stamp changed` option in the *mode
**Result**
-The object returned by `.drop( )` contains the following properties:
+The object returned by `.drop()` contains the following properties:
|Property| | Type |Description|
|---|---|--- |---|
@@ -387,10 +388,12 @@ The object returned by `.drop( )` contains the following properties:
|Constant| Value| Comment|
|---|---|---|
-|`dk status entity does not exist anymore`|5|The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using entity.drop( ), this error can be returned when dk force drop if stamp changed option is used. When using entity.lock(), this error can be returned when dk reload if stamp changed option is used
**Associated statusText**: "Entity does not exist anymore"|
+|`dk status entity does not exist anymore`|5|The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using entity.drop(), this error can be returned when dk force drop if stamp changed option is used. When using entity.lock(), this error can be returned when dk reload if stamp changed option is used.
**Associated statusText**: "Entity does not exist anymore"|
|`dk status locked`|3|The entity is locked by a pessimistic lock. **Associated statusText**: "Already locked"|
+|`dk status validation failed`| 7| Non fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Mild Validation Error"|
|`dk status serious error`| 4| A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. **Associated statusText**: "Other error"
-|`dk status stamp has changed`| 2|The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save( )`: error only if the `dk auto merge` option is not used
with `.drop( )`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"
|
+|`dk status serious validation error`| 8| Fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Serious Validation Error"|
+|`dk status stamp has changed`| 2|The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"
|
|`dk status wrong permission`|1|The current privileges do not allow the drop of the entity. **Associated statusText**: "Permission Error"|
#### Example 1
@@ -987,10 +990,11 @@ The object returned by `.lock()` contains the following properties:
|Constant |Value| Comment|
|---|---|---|
-|`dk status entity does not exist anymore`| 5 |The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using `.drop( )`, this error can be returned when dk force drop if stamp changed option is used. When using `.lock()`, this error can be returned when `dk reload if stamp changed` option is used
**Associated statusText**: "Entity does not exist anymore"|
+|`dk status entity does not exist anymore`| 5 |The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using `.drop()`, this error can be returned when dk force drop if stamp changed option is used. When using `.lock()`, this error can be returned when `dk reload if stamp changed` option is used
**Associated statusText**: "Entity does not exist anymore"|
|`dk status locked`| 3 |The entity is locked by a pessimistic lock.**Associated statusText**: "Already locked"
-|`dk status serious error`| 4 |A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc.**Associated statusText**: "Other error"|
-|`dk status stamp has changed`|2|The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save( )`: error only if the `dk auto merge` option is not used
with `.drop( )`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"|
+|`dk status mild validation error`|7|Can be returned by the developer only in validate events and do not require|
+|`dk status serious error`| 4 |A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. **Associated statusText**: "Other error"|
+|`dk status stamp has changed`|2|The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"|
#### Example 1
@@ -1149,7 +1153,7 @@ The object returned by `.reload( )` contains the following properties:
|Constant| Value| Comment|
|---|---|---|
-|`dk status entity does not exist anymore`|5|The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using `.drop( )`, this error can be returned when `dk force drop if stamp changed` option is used. When using `.lock()`, this error can be returned when `dk reload if stamp changed` option is used
***Associated statusText***: "Entity does not exist anymore"|
+|`dk status entity does not exist anymore`|5|The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using `.drop()`, this error can be returned when `dk force drop if stamp changed` option is used. When using `.lock()`, this error can be returned when `dk reload if stamp changed` option is used
***Associated statusText***: "Entity does not exist anymore"|
|`dk status serious error`|4| A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. ***Associated statusText***: "Other error"|
#### Example
@@ -1180,6 +1184,7 @@ The object returned by `.reload( )` contains the following properties:
|Release|Changes|
|---|---|
+|21|Added status 7 and 8|
|17|Added|
@@ -1241,11 +1246,13 @@ The following values can be returned in the `status` and `statusText` properties
|Constant| Value |Comment|
|---|---|---|
-|`dk status automerge failed`| 6| (Only if the `dk auto merge` option is used) The automatic merge option failed when saving the entity.**Associated statusText**: "Auto merge failed"|
-|`dk status entity does not exist anymore`| 5| The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using `.drop( )`, this error can be returned when `dk force drop if stamp changed` option is used. When using `.lock()`, this error can be returned when `dk reload if stamp changed` option is used
**Associated statusText**: "Entity does not exist anymore"|
-|`dk status locked`| 3| The entity is locked by a pessimistic lock.**Associated statusText**: "Already locked"
-|`dk status serious error`|4|A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc.**Associated statusText**: "Other error"|
-|`dk status stamp has changed`|2|The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save( )`: error only if the `dk auto merge` option is not used
with `.drop( )`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"|
+|`dk status automerge failed`| 6| (Only if the `dk auto merge` option is used) The automatic merge option failed when saving the entity. **Associated statusText**: "Auto merge failed"|
+|`dk status entity does not exist anymore`| 5| The entity no longer exists in the data. This error can occur in the following cases:
the entity has been dropped (the stamp has changed and the memory space is now free)
the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). When using `.drop()`, this error can be returned when `dk force drop if stamp changed` option is used. When using `.lock()`, this error can be returned when `dk reload if stamp changed` option is used
**Associated statusText**: "Entity does not exist anymore"|
+|`dk status locked`| 3| The entity is locked by a pessimistic lock. **Associated statusText**: "Already locked"|
+|`dk status validation failed`| 7| Non fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Mild Validation Error"|
+|`dk status serious error`|4|A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. **Associated statusText**: "Other error"|
+|`dk status serious validation error`| 8| Fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Serious Validation Error"|
+|`dk status stamp has changed`|2|The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"|
|`dk status wrong permission`|1|The current privileges do not allow the save of the entity. **Associated statusText**: "Permission Error"|
#### Example 1
diff --git a/docs/API/SessionClass.md b/docs/API/SessionClass.md
index 0c4fe34b4bcd45..ed2886e8de489f 100644
--- a/docs/API/SessionClass.md
+++ b/docs/API/SessionClass.md
@@ -66,6 +66,7 @@ The availability of properties and functions in the `Session` object depends on
|Release|Changes|
|---|---|
+|21|Support of remote sessions|
|18 R6|Added|
@@ -84,7 +85,7 @@ The availability of properties and functions in the `Session` object depends on
:::note
-This function does nothing and always returns **True** with remote client, stored procedure, and standalone sessions.
+This function does nothing and always returns **True** with stored procedure sessions and standalone sessions.
:::
@@ -98,6 +99,8 @@ This function does not remove **promoted privileges** from the web process, whet
:::
+Regarding remote client sessions, the function only impacts [code accessing the web server](../WebServer/preemptiveWeb.md#writing-thread-safe-web-server-code).
+
#### Example
```4d
@@ -119,6 +122,7 @@ $isGuest:=Session.isGuest() //$isGuest is True
|Release|Changes|
|---|---|
+|21|Support of remote sessions|
|20 R9|Added|
@@ -130,7 +134,7 @@ $isGuest:=Session.isGuest() //$isGuest is True
|Parameter|Type||Description|
|---------|--- |:---:|------|
|lifespan|Integer|->|Session token lifespan in seconds|
-|Result|Text|<-|UUID of the session|
+|Result|Text|<-|UUID of the token|
@@ -138,7 +142,7 @@ $isGuest:=Session.isGuest() //$isGuest is True
:::note
-This function is only available with web user sessions. It returns an empty string in other contexts.
+This function is available with web user sessions and remote sessions. It returns an empty string in stored procedure and standalone sessions.
:::
@@ -146,9 +150,14 @@ The `.createOTP()` function create
For more information about the OTP tokens, please refer to [this section](../WebServer/sessions.md#session-token-otp).
-By default, if the *lifespan* parameter is omitted, the token is created with the same lifespan as the [`.idleTimeOut`](#idletimeout) of the session. You can set a custom timeout by passing a value in seconds in *lifespan*. If an expired token is used to restore a web user session, it is ignored.
+You can set a custom timeout by passing a value in seconds in *lifespan*. If an expired token is used to restore a session, it is ignored. By default, if the *lifespan* parameter is omitted:
+
+- with web user sessions, the token is created with the same lifespan as the [`.idleTimeOut`](#idletimeout) of the session.
+- with remote sessions, the token is created with a 10 seconds lifespan.
+
+For **web user sessions**, the returned token can be used in exchanges with third-party applications or websites to securely identify the session. For example, the session OTP token can be used with a payment application.
-The returned token can then be used in exchanges with third-party applications or websites to securely identify the session. For example, the session OTP token can be used with a payment application.
+For **remote sessions**, the returned token can be used on 4D Server to identitfy requests coming from a [remote 4D running Qodly forms in a Web area](../Desktop/clientServer.md#remote-user-sessions).
#### Example
@@ -271,6 +280,7 @@ $expiration:=Session.expirationDate //eg "2021-11-05T17:10:42Z"
|Release|Changes|
|---|---|
+|21|Support of remote client sessions|
|20 R6|Added|
@@ -294,7 +304,9 @@ This function returns privileges assigned to a Session using the [`setPrivileges
:::
-With remote client, stored procedure and standalone sessions, this function returns a collection only containing "WebAdmin".
+With remote client sessions, the privileges only concerns the code executed in the context of a [web request sent through a Web area](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+
+With stored procedure sessions and standalone sessions, this function returns a collection only containing "WebAdmin".
#### Example
@@ -370,7 +382,7 @@ $privileges := Session.getPrivileges()
|Release|Changes|
|---|---|
-|21|Returns True for promoted privileges|
+|21|Returns True for promoted privileges, Support of remote client sessions|
|18 R6|Added|
@@ -397,7 +409,9 @@ This function returns True for the *privilege* if called from a function that wa
:::
-With remote client, stored procedure and standalone sessions, this function always returns True, whatever the *privilege*.
+Regarding remote client sessions, the function only impacts [code accessing the web server](../WebServer/preemptiveWeb.md#writing-thread-safe-web-server-code).
+
+With stored procedure sessions and standalone sessions, this function always returns True, whatever the *privilege*.
#### Example
@@ -753,6 +767,7 @@ Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
|Release|Changes|
|---|---|
+|21|Support of remote client sessions|
|19 R8|Support of "roles" Settings property|
|18 R6|Added|
@@ -774,23 +789,21 @@ Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
:::note
-This function does nothing and always returns **False** with remote client, stored procedure, and standalone sessions.
+This function does nothing and always returns **False** with stored procedure sessions and standalone sessions.
:::
The `.setPrivileges()` function associates the privilege(s) and/or role(s) defined in the parameter to the session and returns **True** if the execution was successful.
- In the *privilege* parameter, pass a string containing a privilege name (or several comma-separated privilege names).
-
- In the *privileges* parameter, pass a collection of strings containing privilege names.
-
- In the *settings* parameter, pass an object containing the following properties:
|Property|Type|Description|
|---|---|---|
|privileges|Text or Collection|
String containing a privilege name, or
Collection of strings containing privilege names
|
|roles|Text or Collection|
String containing a role, or
Collection of strings containing roles
|
-|userName|Text|User name to associate to the session (optional)|
+|userName|Text|User name to associate to the session (optional, web sessions only). Not available in remote client sessions (ignored).|
:::note
@@ -804,6 +817,9 @@ By default when no privilege or role is associated to the session, the session i
The [`userName`](#username) property is available at session object level (read-only).
+Regarding remote client sessions, the function only concerns the code executed in the context of a [web request sent through a Web area](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+
+
#### Example
In a custom authentication method, you set the "WebAdmin" privilege to the user:
diff --git a/docs/API/WebServerClass.md b/docs/API/WebServerClass.md
index 1941427055e4db..5d1ff155b29183 100644
--- a/docs/API/WebServerClass.md
+++ b/docs/API/WebServerClass.md
@@ -24,6 +24,7 @@ They provide the following properties and functions:
|[](#corssettings) |
|[](#debuglog) |
|[](#defaulthomepage) |
+|[](#handlers) |
|[](#hstsenabled) |
|[](#hstsmaxage) |
|[](#httpcompressionlevel) |
@@ -47,6 +48,7 @@ They provide the following properties and functions:
|[](#opensslversion) |
|[](#perfectforwardsecrecy) |
|[](#rootfolder) |
+|[](#rules) |
|[](#scalablesession) |
|[](#sessioncookiedomain) |
|[](#sessioncookiename) |
@@ -181,6 +183,27 @@ The name of the default home
+
+## .handlers
+
+History
+
+|Release|Changes|
+|---|---|
+|21|Added|
+
+
+
+**.handlers** : Collection
+
+*Read-only property*
+
+A collection of custom HTTP handler objects. An HTTP handler object contains a listened URL pattern, a handled verb, and the code to be called. HTTP handlers can be defined through a HTTPHandlers.json file or the *settings* parameter of the [`.start()`](#start) function. For more information, please refer to the [HTTP Request handler](../WebServer/http-request-handler.md) page.
+
+
+
+
+
## .HSTSEnabled
@@ -490,6 +513,28 @@ The path of web server root folde
+
+
+## .rules
+
+History
+
+|Release|Changes|
+|---|---|
+|21|Added|
+
+
+
+**.rules** : Collection
+
+*Read-only property*
+
+A collection of rule objects currently handled to customize HTTP headers. A rule object contains a "regexPattern" property, as well as an action name with a value. HTTP rules can be defined through a HTTPRules.json file or the *settings* parameter of the [`.start()`](#start) function. For more information, please refer to the [HTTP Rules](../WebServer/http-rules.md) page.
+
+
+
+
+
## .scalableSession
diff --git a/docs/Concepts/error-handling.md b/docs/Concepts/error-handling.md
index eded3b2fd2274c..fbd03183263479 100644
--- a/docs/Concepts/error-handling.md
+++ b/docs/Concepts/error-handling.md
@@ -22,11 +22,11 @@ It is highly recommended to install a global error-handling method on 4D Server,
:::
-## Error or status
+## Predictable vs unpredictable errors
-Many 4D class functions, such as `entity.save()` or `transporter.send()`, return a *status* object. This object is used to store "predictable" errors in the runtime context, e.g. invalid password, locked entity, etc., that do not stop program execution. This category of errors can be handled by regular code.
+Many 4D class functions, such as [`entity.save()`](../API/EntityClass.md#save) or [`transporter.send()`](../API/SMTPTransporterClass.md#send), return a object containing *status* information. This object is used to store **predictable** errors in the runtime context, e.g. invalid password, locked entity, etc., that do not require to stop program execution. This category of errors, also named **silent errors** errors, can be handled by regular code. When such errors occur in an error handling context, i.e. a [`Try`](#tryexpression), [`Try/Catch`](#trycatchend-try) or an [error-handling method](#installing-an-error-handling-method), they do not interrupt the execution and do not trigger the error handling (e.g. the `Catch` part of the [`Try/Catch`](#trycatchend-try) is not executed). They are not listed in the [`Last errors`](../commands/last-errors.md) collection. The error is only returned in the `status` and `statusText` properties of the returned object. It can be processed according to your business logic.
-Other "unpredictable" errors include disk write error, network failure, or in general any unexpected interruption. This category of errors generates exceptions defined by [a *code*, a *message* and a *signature*](#error-codes) and needs to be handled through an error-handling method or a `Try()` keyword.
+The other category of errors are **unpredictable** errors, also named **serious errors**. They include disk write error, network failure, or in general any unexpected interruption. This category of errors generates exceptions defined by [a *code*, a *message* and a *signature*](#error-codes). They interrupt the execution and trigger the error processing of the [`Try`](#tryexpression), [`Try/Catch`](#trycatchend-try) or [error-handling method](#installing-an-error-handling-method) features. They are listed in the [`Last errors`](../commands/last-errors.md) collection. Note that serious errors can also return values in the `status` and `statusText` properties, e.g. `dk status serious error` - "Other error".
## Installing an error-handling method
diff --git a/docs/Debugging/debugLogFiles.md b/docs/Debugging/debugLogFiles.md
index bb45a2b90c8dd4..24c2ce546ee0a8 100644
--- a/docs/Debugging/debugLogFiles.md
+++ b/docs/Debugging/debugLogFiles.md
@@ -472,7 +472,7 @@ How to start this log:
- Use the `SET DATABASE PARAMETER` command:
```4d
- SET DATABASE PARAMETER(TCPUDP log; 1)
+ SET DATABASE PARAMETER(TCPUDP log recording; 1)
```
- Configure the log through a [JSON configuration file](#using-a-log-configuration-file):
diff --git a/docs/Desktop/clientServer.md b/docs/Desktop/clientServer.md
index 5a154133b56656..d4fd324c4ae7de 100644
--- a/docs/Desktop/clientServer.md
+++ b/docs/Desktop/clientServer.md
@@ -91,12 +91,19 @@ However, you need to pay attention to the following behavior differences compare
On the server, the [`Session`](../commands/session.md) command returns a `session` object describing the current user session. This object is handled through the functions and properties of the [`Session` class](../API/SessionClass.md).
+:::tip Related blog posts
+
+[4D remote session object with Client/Server connection and Stored procedure](https://blog.4d.com/new-4D-remote-session-object-with-client-server-connection-and-stored-procedure).
+
+:::
### Usage
-The `session` object allows you to get information about the remote user session. You can share data between all processes of the user session using the [`session.storage`](../API/SessionClass.md#storage) shared object.
+The `session` object allows you to handle information and privileges for the remote user session.
-For example, you can launch a user authentication and verification procedure when a client connects to the server, involving entering a code sent by e-mail or SMS into the application. You then add the user information to the session storage, enabling the server to identify the user. This way, the 4D server can access user information for all client processes, enabling customized code to be written according to the user's role.
+You can share data between all processes of the user session using the [`session.storage`](../API/SessionClass.md#storage) shared object. For example, you can launch a user authentication and verification procedure when a client connects to the server, involving entering a code sent by e-mail or SMS into the application. You then add the user information to the session storage, enabling the server to identify the user. This way, the 4D server can access user information for all client processes, enabling customized code to be written according to the user's role.
+
+You can also assign privileges to a remote user session to control access when the session comes from Qodly pages running in web areas.
### Availability
@@ -114,7 +121,62 @@ All stored procedures on the server share the same virtual user session. For mor
:::
-### See also (blog post)
+### Sharing the session with Qodly pages in Web areas
-[4D remote session object with Client/Server connection and Stored procedure](https://blog.4d.com/new-4D-remote-session-object-with-client-server-connection-and-stored-procedure).
+Remote client sessions can be used to handle Client/Server applications where [Qodly pages](https://developer.4d.com/qodly/4DQodlyPro/pageLoaders/pageLoaderOverview) are used for the interface, running on remote machines. With this configuration, your applications have modern CSS-based web interfaces but still benefit from the power and simplicity of integrated client/server development. In such applications, Qodly pages are executed within standard 4D [Web areas](../FormObjects/webArea_overview.md).
+
+To manage this configuration, you need to use remote client sessions. Actually, requests coming from both the remote 4D application and its Qodly pages loaded in Web areas need to work inside a single user session. You just have to share the same session between the remote client and its web pages so that you can have the same [session storage](../API/SessionClass.md#storage) and client license, whatever the request origin.
+
+Note that [privileges](../ORDA/privileges.md) should be set in the session before executing a web request from a Web area, so that the user automatically gets their privileges for web access (see example). Keep in mind that privileges only apply to requests coming from the web, not to the 4D code executed in a standard remote session.
+
+Shared sessions are handled through [OTP tokens](../WebServer/sessions.md#session-token-otp). After you created an OTP token on the server for the user session, you add the token (through the `$4DSID` parameter value) to web requests sent from web areas containing Qodly pages so that the user session on the server is identified and shared. On the web server side, if a web request contains an *OTP id* in the $4DSID parameter, the session corresponding to this OTP token is used.
+
+:::tip Related blog post
+
+[Share your 4D remote client session with web accesses](https://blog.4d.com/share-your-4d-remote-client-session-with-web-accesses)
+
+:::
+
+
+
+#### Example
+
+```4d
+var $otp : Text
+
+// Some privileges are put in the remote user session on the server for a further web access
+ds.resetPrivileges("basic")
+
+// An OTP is created on the server for this remote client session
+$otp:=ds.getOTP()
+
+
+// The user has already the required privileges for a web access
+// and the same session is shared between this remote user and the web Qodly app
+WA OPEN URL(*; "Welcome"; "http://127.0.0.1/$lib/renderer/?w=People&$4DSID="+$otp)
+
+```
+
+*resetPrivileges()* function in the Datastore class:
+
+```4d
+// This function is run on the server
+// and puts some privileges in the session for a further web access
+
+Function resetPrivileges($priv : Text)
+
+ Session.clearPrivileges()
+ Session.setPrivileges($priv)
+```
+
+*getOTP()* function in the Datastore class:
+
+```4d
+// This function is run on the server
+// and generates an OTP able to retrieve this remote user session
+Function getOTP(): Text
+
+ return Session.createOTP()
+
+```
diff --git a/docs/Extensions/develop-components.md b/docs/Extensions/develop-components.md
index 45dd5a33d1e99f..f777b12d03c500 100644
--- a/docs/Extensions/develop-components.md
+++ b/docs/Extensions/develop-components.md
@@ -1,6 +1,6 @@
---
id: develop-components
-title: Developing Extensions
+title: Developing Components
---
## Components
@@ -10,7 +10,7 @@ A 4D component is a set of 4D functions, methods, and forms representing one or
You can develop 4D components for your own needs and keep them private. You can also [share your components with the 4D community](https://github.com/topics/4d-component).
-### Definitions
+## Definitions
- **Matrix Project**: 4D project used for developing the component. The matrix project is a standard project with no specific attributes. A matrix project forms a single component.
- **Host Project**: Application project in which a component is installed and used.
@@ -23,7 +23,7 @@ You can [create a component directly from the host](#creating-components) projec
:::
-### Basics
+## Basics
Creating and installing 4D components is carried out directly from 4D:
@@ -116,7 +116,7 @@ Standard 4D IDE features are available for the component. You can execute the fo
- run methods,
- restore from trash or empty trash.
-### Scope of language commands
+## Scope of language commands
Except for [Unusable commands](#unusable-commands), a component can use any command of the 4D language.
@@ -158,7 +158,7 @@ The following commands are not compatible for use within a component because the
-### Sharing of project methods
+## Sharing of project methods
All the project methods of a matrix project are by definition included in the component (the project is the component), which means that they can be called and executed within the component.
@@ -190,11 +190,11 @@ EXECUTE METHOD($param)
> Keep in mind that an interpreted method can call a compiled method, but not the reverse, except via the use of the `EXECUTE METHOD` and `EXECUTE FORMULA` commands.
-### Sharing of classes
+## Sharing of classes
By default, component classes cannot be called from the 4D Code Editor of the host project. If you want your component classes to be exposed in the host project and its loaded components, you need to **declare a component namespace**. Additionally, you can control how component classes are suggested in the host Code Editor.
-#### Declaring the component namespace
+### Declaring the component namespace
To allow classes of your component to be exposed in the host projects and their loaded components, enter a value in the [**Component namespace in the class store** option in the General page](../settings/general.md#component-namespace-in-the-class-store) of the matrix project Settings. By default, the area is empty: component classes are not available outside of the component context.
@@ -227,7 +227,7 @@ Of course, it is recommended to use a distinguished name to avoid any conflict.
A component's ORDA classes are not available in its host project. For example, if there is a dataclass called Employees in your component, you will not be able to use a "cs.Mycomponent.Employee" class in the host project.
-#### Hidden classes
+### Hidden classes
Just like in any project, you can create hidden classes and functions in the component by prefixing names with an underscore ("_"). When a [component namespace is defined](#declaring-the-component-namespace), hidden classes and functions of the component will not appear as suggestions when using code completion.
@@ -251,7 +251,7 @@ A syntax file (JSON format) is then automatically created during the compilation
If you don't enter a [component namespace](#declaring-the-component-namespace), the resources for the classes and exposed methods are not generated even if the syntax file option is checked.
-### Passing variables
+## Passing variables
The local, process and interprocess variables are not shared between components and host projects. The only way to modify component variables from the host project and vice versa is using pointers.
@@ -311,12 +311,14 @@ In this case, it is necessary to use the comparison of pointers:
If(myptr1=myptr2) //This test returns False
```
-### Error handling
+## Error handling
-An [error-handling method](Concepts/error-handling.md) installed by the `ON ERR CALL` command only applies to the running application. In the case of an error generated by a component, the `ON ERR CALL` error-handling method of the host project is not called, and vice versa.
+An [error-handling method](Concepts/error-handling.md) installed by the [`ON ERR CALL`](../commands-legacy/on-err-call.md) command only applies to the running application. In the case of an error generated by a component, the `ON ERR CALL` error-handling method of the host project is not called, and vice versa.
+However, you can install a [component error handler in the host application](../Concepts/error-handling.md#scope-and-components) to manage uncaught errors from compponents.
-### Access to tables of the host project
+
+## Access to tables of the host project
Although components cannot use tables, pointers can allow host projects and components to communicate with each other. For example, here is a method that could be called from a component:
@@ -342,7 +344,7 @@ SAVE RECORD($tablepointer->)
> In the context of a component, 4D assumes that a reference to a table form is a reference to the host table form (as components can't have tables.)
-### Use of tables and fields
+## Use of tables and fields
A component cannot use the tables and fields defined in the 4D structure of the matrix project. However, you can create and use external databases, and then use their tables and fields according to your needs. You can create and manage external databases using SQL. An external database is a 4D project that is independent from the main 4D project, but that you can work with from the main 4D project. Using an external database means temporarily designating this database as the current database, in other words, as the target database for the SQL queries executed by 4D. You create external databases using the SQL `CREATE DATABASE` command.
@@ -423,7 +425,7 @@ Reading from an external database:
```
-### Use of forms
+## Use of forms
- Only “project forms” (forms that are not associated with any specific table) can be used in a component. Any project forms present in the matrix project can be used by the component.
- A component can call table forms of the host project. Note that in this case it is necessary to use pointers rather than table names between brackets [] to specify the forms in the code of the component.
@@ -435,7 +437,7 @@ Reading from an external database:
> In the context of a component, any referenced project form must belong to the component. For example, inside a component, referencing a host project form using `DIALOG` or `Open form window` will throw an error.
-### Use of resources
+## Use of resources
Components can use resources located in the Resources folder of the component.
@@ -444,7 +446,7 @@ Automatic mechanisms are operational: the XLIFF files found in the Resources fol
In a host project containing one or more components, each component as well as the host projects has its own “resources string.” Resources are partitioned between the different projects: it is not possible to access the resources of component A from component B or the host project.
-### Executing initialization code
+## Executing initialization code
A component can execute 4D code automatically when opening or closing the host database, for example in order to load and/or save the preferences or user states related to the operation of the host database.
@@ -453,7 +455,7 @@ Executing initialization or closing code is done by means of the `On Host Databa
> For security reasons, you must explicitly authorize the execution of the `On Host Database Event` database method in the host database in order to be able to call it. To do this, you must check the [**Execute "On Host Database Event" method of the components** option](../settings/security.md#options) in the Security page of the Settings.
-### Info.plist
+## Info.plist
Components can have an `Info.plist` file at their [root folder](../Project/architecture.md) to provide extra information readable by the system (macOS only) and the [Dependency manager](../Project/components.md#loading-components).
@@ -506,7 +508,7 @@ On macOS, information is available from the finder:
-### Protection of components: compilation
+## Protection of components: compilation
By default, all the code of a matrix project installed as a component is potentially visible from the host project. In particular:
@@ -520,48 +522,7 @@ To protect the code of a component effectively, simply [compile and build](Deskt
- The other project methods of the matrix project will never appear.
-### Sharing your components on GitHub
+## Sharing your components on GitHub
We encourage you to support the 4D developer community by sharing your components, preferably on the [GitHub platform](https://github.com/topics/4d-component). We recommend that you use the **`4d-component`** topic to be correctly referenced.
-
-## Plug-ins
-
-### Why the need for a plug-in?
-
-Although 4D provides hundred of built-in methods used to manipulate objects, records and implement user interface, some special use or feature (sometimes platform dependant) may be needed: one may need ODBC under Windows, another may need Apple services under macOS, while yet another may want to implement specific statistics tools, social network login, payment platform, file access over the network, a special user interface, or a private picture structure.
-
-It is obvious that covering all areas of both the macOS and Windows operating systems by way of 4D commands would certainly lead to a product with thousands of commands, and at the same time, most users would have no need for such a large set of capabilities. Also, creating such an all-encompassing tool would make the 4D environment incredibly complex and would take most users months of study before useful results could be expected.
-
-The modular nature of the 4D environment allows the creation of basic applications but does not preclude the development of highly complex systems. The 4D Plug-in architecture opens the 4D environment to any type of application or user. 4D Plug-ins multiply that application or user's power and productivity.
-
-### What is a plug-in and what can it do?
-
-A plug-in is a piece of code that 4D launches at start up. It adds functionality to 4D and thus increases its capacity.
-
-Usually, a plug-in does things that:
-- 4D cannot do (ie, specific platform technology),
-- will be very hard to write just using 4D,
-- are only available as Plug-in Entrypoint
-
-A plug-in usually contains a set of routines given to the 4D Developer. It can handle an External Area and run an external process.
-
-- A **plug-in routine** is a routine written in native language (usually C or C++) that causes an action.
-- An **external area** is a part of a form that can display almost everything and interact with the user when necessary.
-- An **external process** is a process that runs alone, usually in a loop, doing almost everything it wants. All process code belongs to the plug-in, 4D is simply present to receive/send events to the process.
-
-### Important note
-
-A plug-in can be very simple, with just one routine performing a very small task, or it can be very complex, involving hundred of routines and areas. There is virtually no limit to what a plug-in can do, however every plug-in developer should remember that a plug-in is a "sample" piece of code. It is the plug-in that runs within 4D, not the opposite. As a piece of code, it is the host of 4D; it is not a stand-alone application. It shares CPU time and memory with 4D and other plug-ins, thus, it should be a polite code, using just what is necessary to run. For example, in long loops, a plug-in should call `PA_Yield()` to give time to the 4D scheduler unless its task is critical for both it and the application.
-
-### How to create a plug-in?
-
-4D provides on GitHub an open-source [**plug-in SDK**](https://github.com/4d/4D-Plugin-SDK), containing the 4D Plugin API and the 4D Plugin Wizard:
-
-- the [**4D Plugin API**](https://github.com/4d/4D-Plugin-SDK/blob/master/4D%20Plugin%20API), written in C, adds more than 400 functions that help you to easily create your own plug-ins to add new functionnalities to your 4D application. 4D Plug-in API functions manage all the interactions between the 4D application and your plug-in.
-- The [**4D Plugin Wizard**](https://github.com/4d/4D-Plugin-SDK/blob/master/4D%20Plugin%20Wizard) is an essential tool that simplifies the task of developing 4D plug-ins. It writes the code 4D needs to correctly load and interact with a plug-in, allowing you to concentrate on your own code.
-
-
-### Sharing plug-ins
-
-We encourage you to support the 4D developer community by sharing your plug-ins, preferably on the [GitHub platform](https://github.com/topics/4d-plugin). We recommend that you use the **`4d-plugin`** topic to be correctly referenced.
\ No newline at end of file
diff --git a/docs/Extensions/overview.md b/docs/Extensions/overview.md
index 9aed3f28737e0e..571a9f4fb283fc 100644
--- a/docs/Extensions/overview.md
+++ b/docs/Extensions/overview.md
@@ -35,3 +35,31 @@ A subset of these components is listed by default in the [Dependency Manager](..
+- [**System workers**](../API/SystemWorkerClass.md) allow the 4D code to call any external process (a shell command, PHP, any script, etc.) and monitor its execution.
+- [**SQL commands**](../commands/theme/SQL) allow you to connect and use various SQL data sources.
+- The [**built-in HTTP client**](../API/HTTPRequestClass.md) can request any HTTP server and process data.
+- [**Web Areas**](../FormObjects/webArea_overview.md) can give access to web pages or various HTML contents within your forms.
+- [**Components**](Concepts/components.md). Components are made of 4D code. 4D proposes a set of utility components (see below) that you can install and use depending on your needs. You can also [develop your own 4D components](develop-components.md), or use third-party components. Many developers from the 4D community have shared 4D components (browse Github to have a list of public 4D components gathered with the [`4d-component`](https://github.com/topics/4d-component) topic).
+- [**Plug-ins**](../Concepts/plug-ins.md). Plug-ins can be built using any language. Plugins do things that 4D does not natively (e.g., specific platform technology), or would be very hard to write just using 4D. As described in [this page](develop-plug-ins.md), you can develop your own plug-ins. A lot of functionnalities are covered by the existing 4D plug-ins. Browse Github to have a list of public 4D plugins gathered with the [`4d-plugin`](https://github.com/topics/4d-plugin) topic.
+
+
+## Components developed by 4D
+
+4D proposes various components to the 4D community, covering many development needs. All 4D components can be found on the [**4D github repository**](https://github.com/4d).
+
+A subset of these components is listed by default in the [Dependency Manager](../Project/components.md), including:
+
+|Component|Github repository|Description|Main Features|
+|---|---|---|---|
+|4D AIKit|https://github.com/4d/4D-AIKit|Set of classes to connect to third-party OpenAI APIs|`OpenAIChat`, `OpenAIImage`...|
+|4D NetKit|https://github.com/4d/4D-NetKit|Set of web service tools to connect to third-party APIs|`OAuth2Provider` class, `New OAuth2 provider`, `OAuth2ProviderObject.getToken()` |
+|4D Progress|https://github.com/4d/4D-Progress|Open one or more progress bars in the same window|`Progress New`, `Progress SET ON STOP METHOD`, `Progress SET PROGRESS`, ... |
+|4D QPDF|https://github.com/4d/4D-QPDF|Extract attachments from PDF/A-3 files|`PDF Get attachments` |
+|4D SVG|https://github.com/4d/4D-SVG|Create and manipulate common svg graphic objects|`SVGTool_Display_viewer`, multiple `SVG_` methods |
+|4D ViewPro|https://github.com/4d/4d-view-pro|Spreadsheet features in your forms|See [4D View Pro documentation](ViewPro/getting-started.md)|
+|4D Widgets|https://github.com/4d/4D-Widgets|Manage DatePicker, TimePicker, SearchPicker 4D widgets|`DatePicker calendar`, `DateEntry area`, `TimeEntry`, `SearchPicker SET HELP TEXT`, ...|
+|4D WritePro Interface|https://github.com/4d/4D-WritePro-Interface|Manage 4D Write Pro palettes and [table wizard](../WritePro/writeprointerface.md)|`WP PictureSettings`, `WP ShowTabPages`, `WP SwitchToolbar`, `WP UpdateWidget`|
+|Build4D|https://github.com/4d-depot/Build4D|Compile, build, and sign projects|CI/CD |
+
+
+
diff --git a/docs/FormEditor/forms.md b/docs/FormEditor/forms.md
index 0346087194baba..53565e921469e0 100644
--- a/docs/FormEditor/forms.md
+++ b/docs/FormEditor/forms.md
@@ -97,6 +97,79 @@ There are no restrictions on the number of pages a form can have. The same field
A multi-page form has both a background page and several display pages. Objects that are placed on the background page may be visible on all display pages, but can be selected and edited only on the background page. In multi-page forms, you should put your button palette on the background page. You also need to include one or more objects on the background page that provide page navigation tools for the user.
+
+## Fluent UI rendering (Developer Preview)
+
+On Windows, 4D supports **Fluent UI** form rendering, Microsoft's modern graphical user interface design, based upon **WinUI 3** technology. **WinUI 3** is the foundation of the Windows App SDK and represents the upcoming Windows graphical interfaces.
+
+:::caution Developer Preview
+
+Fluent UI support is currently in the Developer Preview phase. It should not be used in production.
+
+:::
+
+:::info macOS
+
+This feature can only be used on Windows. On macOS, it is ignored.
+
+:::
+
+
+### Fluent UI rendering availability
+
+The Fluent UI rendering is available in the following execution environments only:
+
+- Windows with [Windows App SDK](https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/downloads) version 1.7.3 installed (you need to install this SDK on any Windows machine displaying your forms).
+- Merged [stand-alone](../Desktop/building.md#build-stand-alone-application) or [client](../Desktop/building.md#build-client-application) 4D application
+- [**Test application** feature](../Menus/bars.md#previewing-menu-bars) available from the Run menu.
+
+:::note
+
+If the Windows App SDK is not properly installed, 4D will render all your forms in classic mode with no error.
+
+:::
+
+### Enabling the Fluent UI rendering
+
+You can enable the Fluent UI rendering mode at the application level or at the form level. Form setting has priority over application setting.
+
+#### Application setting
+
+Check the **Use Fluent UI on Windows** option in the "Interface" page of the Settings dialog box.
+
+
+
+In this case, the Fluent UI rendering mode will be used by default on Windows for all forms.
+
+#### Form setting
+
+Each form can define its own rendering via the **Widget appearance** property. The following options are available:
+
+- **Inherited**: inherits the global application setting (default),
+- **Classic**: uses the classic Windows style,
+- **Fluent UI**: enables the modern rendering based on Fluent UI.
+
+
+The corresponding [JSON form property](./properties_JSONref.md) is `fluentUI` with value undefined (i.e. inherited, default value), "true" or "false".
+
+### Features and limitations
+
+Fluent UI rendering offers modern and attractive controls, support of dark/light system themes, smoother rendering optimized for high-resolution displays, and consistent user experience aligned with recent Microsoft applications.
+
+
+When using 4D forms with Fluent UI rendering, you need to pay attention to the following points:
+
+- The `FORM Window theme` command returns the actual display theme of the current form. Possible values: "Classic" or "FluentUI". If there is no current form or the command is called on macOS, and empty string is returned.
+- If [`GET STYLE SHEET INFO`](../commands-legacy/get-style-sheet-info.md) is called in the context of a form, the information returned relates to the current appearance of the form (Classic or FluentUI). If the command is called outside the context of a form, the information returned relates to the [global project settings](#application-setting).
+- [`SET MENU ITEM STYLE`](../commands-legacy/set-menu-item-style.md) with `Underline` *itemStyle* parameter is not supported (ignored) for pop up menus.
+- A focus ring can be added to picture and text [inputs](../FormObjects/input_overview.md).
+- [Stepper](../FormObjects/stepper.md) form object does not support [double-click event](../Events/onDoubleClicked.md).
+- [Circle buttons](../FormObjects/button_overview.md#circle) are supported (similar as macOS).
+- The [`WA ZOOM IN`](../commands-legacy/wa-zoom-in.md) / [`WA ZOOM OUT`](../commands-legacy/wa-zoom-out.md) commands are not supported in Web areas with system rendering engine.
+
+
+
+
## Inherited Forms
4D forms can use and be used as "inherited forms," meaning that all of the objects from *Form A* can be used in *Form B*. In this case, *Form B* "inherits" the objects from *Form A*.
diff --git a/docs/FormObjects/webArea_overview.md b/docs/FormObjects/webArea_overview.md
index 91d74d9e113ff3..b39e38109b49ce 100644
--- a/docs/FormObjects/webArea_overview.md
+++ b/docs/FormObjects/webArea_overview.md
@@ -10,6 +10,11 @@ It is possible to create several web areas in the same form. Note, however, that
Several dedicated [standard actions](#standard-actions), numerous [language commands](../category/web-area) as well as generic and specific [form events](#form-events) allow the developer to control the functioning of web areas. Specific variables can be used to exchange information between the area and the 4D environment.
+:::info Displaying Qodly pages
+
+In 4D client/server applications, Web areas can be used to display Qodly pages and [share the remote user session](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas). This feature allows you to design web-based interfaces for your client/server desktop applications.
+
+:::
## Specific properties
diff --git a/docs/Notes/updates.md b/docs/Notes/updates.md
index c0915d05838761..5f2fec8b24f0d2 100644
--- a/docs/Notes/updates.md
+++ b/docs/Notes/updates.md
@@ -9,15 +9,29 @@ Read [**What’s new in 4D 21**](https://blog.4d.com/en-whats-new-in-4d-21/), th
#### Highlights
-- Support of **AI Vector Searches** in the [`query()`](../API/DataClassClass.md#query-by-vector-similarity) function and in the [`$filter`](../REST/$filter.md#vector-similarity) REST API.
+- Support of AI Vector Searches in the [`query()`](../API/DataClassClass.md#query-by-vector-similarity) function and in the [`$filter`](../REST/$filter.md#vector-similarity) REST API.
- Support of TLS encryption for the [4D.TCPConnection](../API/TCPConnectionClass.md#4dtcpconnectionnew) class.
+- Web Server:
+ - new [HTTP rules](../WebServer/http-rules.md) to customize HTTP response headers,
+ - ability to set [HTTP request handlers](../WebServer/http-request-handler.md) using a `handlers` property in the *settings* parameter of the Web server [`start()`](../API/WebServerClass.md#start) function,
+ - the Web server object contains new [`rules`](../API/WebServerClass.md#rules) and [`handlers`](../API/WebServerClass.md#handlers) properties.
+- New [ORDA events on data](../ORDA/orda-events.md): validateSave, saving, afterSave, validateDrop, dropping, afterDrop.
- New option allowing to use certificates from Windows Certificate Store instead of a local certificates folder in [`HTTPRequest`](../API/HTTPRequestClass.md#4dhttprequestnew) and [`HTTPAgent`](../API/HTTPAgentClass.md#4dhttpagentnew) classes.
+- Client/server:
+ - You can display Qodly pages in Web areas and [share the remote client session](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+ - The [QUIC network layer](../settings/client-server.md#network-layer) has been enhanced to handle network interface changes transparently, for example when you travel with your laptop. See [this blog post](https://blog.4d.com/work-and-move-with-quic-and-network-switching).
- You can now [create components directly from the host project](../Extensions/develop-components.md#creating-components) and [edit their code from a dedicated tab](../Extensions/develop-components.md#editing-all-component-code) in the 4D Explorer without leaving or restarting the project.
- The 4D product activation step has been simplified and automated during [sign-in](../GettingStarted/Installation.md#sign-in).
- 4D AIKit component: new features to [invoke a specific tool automatically](../aikit/Classes/OpenAIChatHelper.md#registertool) and [specify a response format](../aikit/Classes/OpenAIChatCompletionsParameters.md#response-format).
- 4D Language:
- New "trim" commands to remove leading and trailing spaces from a string: [`Trim`](../commands/trim.md), [`Trim start`](../commands/trim-start.md), and [`Trim end`](../commands/trim-end.md).
- [`Num`](../commands/num.md) and [`String`](../commands/string.md) commands have been updated to support conversions in different bases (radix).
+- [**Fixed bug list**](https://bugs.4d.fr/fixedbugslist?version=21): list of all bugs that have been fixed in 4D 21.
+
+#### Developer Preview
+
+[**Fluent UI** rendering for 4D forms](../FormEditor/forms.md#fluent-ui-rendering-developer-preview) is proposed in Developer Preview during the beta test program.
+
#### Behavior changes
diff --git a/docs/ORDA/orda-events.md b/docs/ORDA/orda-events.md
index 6a52fdd62757c2..51552b941fda8c 100644
--- a/docs/ORDA/orda-events.md
+++ b/docs/ORDA/orda-events.md
@@ -1,12 +1,13 @@
---
id: orda-events
-title: ORDA Events
+title: Events
---
History
|Release|Changes|
|---|---|
+|21|Added events: validateSave / saving / afterSave / validateDrop / dropping / afterDrop
|20 R10|touched event added
@@ -17,6 +18,13 @@ You cannot directly trigger event function execution. Events are called automati
+:::tip Related blog post
+
+[ORDA – Handle an event-driven logic during data persistence actions](https://blog.4d.com/orda-handle-an-event-driven-logic-during-data-persistence-actions)
+
+:::
+
+
:::info Compatibility note
@@ -59,11 +67,26 @@ With other remote configurations (i.e. Qodly applications, [REST API requests](.
The following table lists ORDA events along with their rules.
-| Event | Level | Function name | (C/S) Executed on |
-| :--------------- |:--------------- | :----- | :-----: |
-| Entity instantiation | Entity | [`constructor()`](./ordaClasses.md#class-constructor-1) | client |
-| Attribute touched | Attribute | `event touched ()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword |
-| | Entity | `event touched()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword |
+| Event | Level | Function name | (C/S) Executed on |Can stop action by returning an error
+| :------- |:------- | :----- | :-----: |---|
+| Entity instantiation | Entity | [`constructor()`](./ordaClasses.md#class-constructor-1) | client | no|
+| Attribute touched | Attribute | `event touched ()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword | no|
+| | Entity | `event touched()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword | no|
+|Before saving an entity|Attribute|`validateSave ()`|server|yes|
+||Entity|`validateSave()`|server|yes|
+|When saving an entity|Attribute|`saving ()`|server|yes|
+||Entity|`saving()`|server|yes|
+|After saving an entity|Entity|`afterSave()`|server|no|
+|Before dropping an entity|Attribute|`validateDrop ()`|server|yes|
+||Entity|`validateDrop()`|server|yes|
+|When dropping an entity|Attribute|`dropping ()`|server|yes|
+||Entity|`dropping()`|server|yes|
+|After dropping an entity|Entity|`afterDrop()`|server|no|
+
+
+
+
+
:::note
@@ -77,9 +100,39 @@ Event functions accept a single *event* object as parameter. When the function i
| Property name | Availability | Type | Description |
| :--------------- |:--------------- |:--------------- | :--------------- |
-| `kind` | Always | String | Event name ("touched") |
-| *attributeName* | Only for events involving an attribute | String | Attribute name (*e.g.* "firstname") |
-| *dataClassName* | Always | String | Dataclass name (*e.g.* "Company") |
+| "kind" | Always | String | Event name: "touched", "validateSave", "saving", "afterSave", "validateDrop", "dropping", "afterDrop"| |
+| *attributeName* | Only for events implemented at attribute level ("validateSave", "saving", "validateDrop", "dropping") | String |Attribute name (*e.g.* "firstname") |
+| *dataClassName* | Always | String | Dataclass name (*e.g.* "Company") |
+| "savedAttributes" | Only in [`afterSave()`](#function-event-aftersave)|Collection of String| Names of attributes properly saved|
+| "droppedAttributes" |Only in [`afterDrop()`](#function-event-afterdrop)|Collection of String| Names of attributes properly dropped |
+| "saveStatus" | Only in [`afterSave()`](#function-event-aftersave) | String | "success" if the save was successful, "failed" otherwise |
+| "dropStatus" | Only in [`afterDrop()`](#function-event-afterdrop) | String | "success" if the drop was successful, "failed" otherwise|
+
+
+## Error object
+
+[Some event functions](#summary-table) can return an **error object** to raise an error and stop the running action.
+
+When an error occurs in an event, the other events are stopped at the first raised error and the action (save or drop) is also stopped. This error is sent before other potential errors like [stamp has changed, entity locked](../API/EntityClass.md#save), etc.
+
+### Error object properties
+
+|Property|Type|Description|Set by the developer|
+|---|---|----|----|
+|errCode|Integer|Same as for [`Last errors`](../commands/last-errors.md) command|Yes|
+|message|Text|Same as for [`Last errors`](../commands/last-errors.md) command|Yes|
+|extraDescription|Object|Free information to set up|Yes|
+|seriousError|Boolean|Used only with validate events (see below).
`True`: creates a [serious (unpredictable) error](../Concepts/error-handling.md#predictable-vs-unpredictable-errors) and triggers an exception. Adds the `dk status serious validation error` status
creates only a [silent (predictable) error](../Concepts/error-handling.md#predictable-vs-unpredictable-errors). Adds the `dk status validation failed` status
|Yes (default is false)|
+|componentSignature|Text|Always "DBEV"|No|
+
+- [Serious errors](../Concepts/error-handling.md#predictable-vs-unpredictable-errors) are stacked in the `errors` collection property of the **Result object** returned by the [`save()`](../API/EntityClass.md#save) or [`drop()`](../API/EntityClass.md#drop) functions.
+- In case of an error triggered by a **validate** event, the `seriousError` property allows you to choose the level of the error to generate:
+ - If **true**: a serious error is thrown and should be handled by the [error processing code](../Concepts/error-handling.md#predictable-vs-unpredictable-errors), such as a [try catch](../Concepts/error-handling.md#trycatchend-try). In the result object of the calling function, `status` gets `dk status serious validation error` and `statusText` gets "Serious Validation Error". The error is raised at the end of the event and reach the client requesting the save/drop action (REST client for example).
+ - If **false** (default): a [silent (predictable) error is generated](../Concepts/error-handling.md#predictable-vs-unpredictable-errors). It does not trigger any exception and is not stacked in the errors returned by the [`Last errors`](../commands/last-errors.md) command. In the result object of the calling function, `status` gets `dk status validation failed` and `statusText` gets "Mild Validation Error".
+- In case of an error triggered by a **saving/dropping** event, when an error object is returned, the error is always raised as a serious error whatever the `seriousError` property value.
+
+
+
## Event function description
@@ -97,8 +150,8 @@ Event functions accept a single *event* object as parameter. When the function i
This event is triggered each time a value is modified in the entity.
-- if you defined the function at the entity level (first syntax), it is triggered for modifications on any attribute of the entity.
-- if you defined the function at the attribute level (second syntax), it is triggered only for modifications on this attribute.
+- If you defined the function at the entity level (first syntax), it is triggered for modifications on any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is triggered only for modifications on this attribute.
This event is triggered as soon as the 4D Server / 4D engine can detect a modification of attribute value which can be due to the following actions:
@@ -112,7 +165,7 @@ This event is triggered as soon as the 4D Server / 4D engine can detect a modifi
The function receives an [*event* object](#event-parameter) as parameter.
-If this event [throws](../commands-legacy/throw.md) an error, it will not stop the undergoing action.
+If this function [throws](../commands/throw) an error, it will not stop the undergoing action.
:::note
@@ -291,6 +344,400 @@ Note over Qodly page: The People Qodly source lastname attribute is uppercased
+### `Function event validateSave`
+
+#### Syntax
+
+```4d
+Function event validateSave($event : Object)
+Function event validateSave ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is about to be saved.
+
+- if you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- if you defined the function at the attribute level (second syntax), it is called only for this attribute. This function is **not** executed if the attribute has not been touched in the entity.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+
+This event is triggered by the following functions:
+
+- [`entity.save()`](../API/EntityClass.md#save)
+- [`dataClass.fromCollection()`](../API/DataClassClass.md#fromcollection)
+
+This event is triggered **before** the entity is actually saved and lets you check data consistency so that you can stop the action if needed. For example, you can check in this event that "departure date" < "arrival date".
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+:::note
+
+It is not recommended to update the entity within this function (using `This`).
+
+:::
+
+#### Example
+In this example, the user is not allowed to save a product with a margin lower than the average. In case of an invalid price attribute, you return an error object and thus, stop the save action.
+```4d
+// ProductsEntity class
+Function event validateSave margin($event : Object) : Object
+
+var $result : Object
+var $marginAverage : Real
+
+$marginAverage:=ds.Products.query("category= :1"; This.category).average("margin")
+
+If (This.margin<$marginAverage)
+ $result:={\
+ errCode: 1; \
+ message: "The margin of this product ("+String(This.margin)+") is under the average"; \
+ extraDescription: {\
+ info: "For the "+This.category+" category the margin average is: "+String($marginAverage)};\
+ fatalError: False}
+End if
+
+return $result
+
+```
+
+
+
+### `Function event saving`
+
+#### Syntax
+
+```4d
+Function event saving($event : Object)
+Function event saving ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is being saved.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity. The function is executed even if no attribute has been touched in the entity (e.g. in case of sending data to an external app each time a save is done).
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute. The function is **not** executed if the attribute has not been touched in the entity.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following functions:
+
+- [`entity.save()`](../API/EntityClass.md#save)
+- [`dataClass.fromCollection()`](../API/DataClassClass.md#fromcollection)
+
+This event is triggered **while** the entity is actually saved. If a [`validateSave()`](#function-event-validatesave) event function was defined, the `saving()` event function is called if no error was triggered by `validateSave()`. For example, you can use this event to create a document on a Google Drive account.
+
+:::note
+
+The business logic should raise errors which can't be detected during the `validateSave()` events, e.g. a network error
+
+:::
+
+During the save action, 4D engine errors can be raised (index, stamp has changed, not enough space on disk).
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Example
+
+When a product is saved, some information is logged to an external system which may be unavailable.
+
+```4d
+Function event saving($event : Object) : Object
+
+var $result; $status : Object
+var $log : cs.Entity
+var $remote : 4D.DataStoreImplementation
+
+Try
+ $remote:=Open datastore({hostname: "events@acme.com"}; "logs")
+ $log:=$remote.Logs.new()
+ $log.productId:=This.ID
+ $log.stamp:=Timestamp
+ $log.event:="Created by "+Current user()
+ $status:=$log.save()
+Catch
+ $result:={\
+ errCode: Last errors.last().errCode;\
+ message: Last errors.last().message; \
+ extraDescription: {info: "The external Logs can't be reached"}}
+End try
+
+return $result
+
+
+```
+
+
+
+### `Function event afterSave`
+
+#### Syntax
+
+```4d
+Function event afterSave($event : Object)
+// code
+```
+
+This event is triggered just after an entity is saved in the data file, when at least one attribute was modified. It is not executed if no attribute has been touched in the entity.
+
+This event is useful after saving data to propagate the save action outside the application or to execute administration tasks. For example, it can be used to send a confirmation email after data have been saved. Or, in case of error while saving data, it can make a rollback to restore a consistent state of data.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+- To avoid infinite loops, calling a [`save()`](../API/EntityClass.md#save) on the current entity (through `This`) in this function is **not allowed**. It will raise an error.
+- Throwing an [error object](#error-object) is **not supported** by this function.
+
+
+#### Example 1
+
+If an error occurred in the above saving event, the product is recorded in the ProductsInFailure dataclass so an employee can review it later.
+
+
+```4d
+// ProductsEntity class
+Function event afterSave($event : Object)
+
+var $failure : cs.ProductsInFailureEntity
+var $status : Object
+
+ // $event.status.errors is filled if the error comes from a validateSave event
+If (($event.status.success=False) && ($event.status.errors=Null))
+ $failure:=ds.ProductsInFailure.new()
+ $failure.name:=This.name
+ $failure.category:=This.category
+ $failure.costPrice:=This.costPrice
+ $failure.retailPrice:=This.retailPrice
+ $failure.reason:="Error during the save action"
+ $failure.stamp:=Timestamp
+ $status:=$failure.save()
+End if
+
+```
+
+
+### `Function event validateDrop`
+
+#### Syntax
+
+```4d
+Function event validateDrop($event : Object)
+Function event validateDrop ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is about to be dropped.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+
+This event is triggered by the following features:
+
+- [`entity.drop()`](../API/EntityClass.md#drop)
+- [`entitySelection.drop()`](../API/DataClassClass.md#fromcollection)
+- [deletion control rules](https://doc.4d.com/4Dv20/4D/20.2/Relation-properties.300-6750290.en.html#107320) that can be defined at the database structure level.
+
+This event is triggered **before** the entity is actually dropped, allowing you to check data consistency and if necessary, to stop the drop action.
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+
+#### Example 1
+
+Products can be deleted only if they have been flagged TO DELETE.
+
+```4d
+ //ProductsEntity class
+Function event validateDrop status($event : Object) : Object
+
+If (This.status != "TO DELETE")
+
+ var $result:= New object()
+ $result.errCode:=1
+ $result.message:="The record can't be deleted"
+ $result.extraDescription:={attribute; $event.attributeName; info: "The status must be TO DELETE"}
+ $result.fatalError:=False
+ return $result
+End if
+```
+
+#### Example 2
+
+The user can delete products if they are flagged as "TO DELETE" and if their creation year is < current year -3.
+
+```4d
+ //ProductsEntity class
+Function event validateDrop($event : Object) : Object
+
+var $yearOffSet : Integer
+$yearOffSet:=Year of(Current date)-3
+
+If ((This.status != "TO DELETE") || (Year of(This.creationDate) >= $yearOffSet))
+ var $result:=New object()
+ $result.errCode:=1
+ $result.message:="The record can't be deleted"
+ $result.extraDescription:={info: "The status must be TO DELETE and the creation year must be lower than " + String($yearOffSet)}
+ $result.fatalError:=False
+ return $result
+End if
+```
+
+
+### `Function event dropping`
+
+#### Syntax
+
+```4d
+Function event dropping($event : Object)
+Function event dropping ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is being dropped.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following features:
+
+- [`entity.drop()`](../API/EntityClass.md#drop)
+- [`entitySelection.drop()`](../API/DataClassClass.md#fromcollection)
+- [deletion control rules](https://doc.4d.com/4Dv20/4D/20.2/Relation-properties.300-6750290.en.html#107320) that can be defined at the database structure level.
+
+This event is triggered **while** the entity is actually dropped. If a [`validateDrop()`](#function-event-validatedrop) event function was defined, the `dropping()` event function is called if no error was triggered by `validateDrop()`.
+
+:::note
+
+The business logic should raise errors which cannot be detected during the `validateDrop()` events, e.g. a network error.
+
+:::
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Example 1
+
+When dropping an order with *totalPrice >= 500*, a log file is updated.
+
+```4d
+ //OrderEntity class
+Function event dropping totalPrice ($event : Object)
+
+var $log : cs.LogEntity
+var $status: Object
+
+If (This.totalPrice >= 500)
+
+ $log:=ds.Log.new()
+ $log.orderID:=This.ID
+ $log.orderPrice:=This.totalPrice
+ $log.event:="Drop"
+ $log.creationDate:=Current date()
+ $status:=$log.save()
+
+ If($status.success=False)
+ throw ({errCode: 1; message: "Error while updating the log file"})
+ End if
+End if
+
+```
+
+#### Example 2
+
+When a product is dropped, a log file is updated.
+
+```4d
+ //ProductsEntity class
+Function event dropping ($event : Object)
+
+var $log : cs.LogEntity
+var $status: Object
+
+$log:=ds.Log.new()
+$log.productID:=This.ID
+$log.productPrice:=This.price
+$log.event:="Drop"
+$log.creationDate:=Current date()
+$status:=$log.save()
+
+If($status.success=False)
+ throw ({errCode: 1; message:"Error while updating the log file"})
+End if
+```
+
+### `Function event afterDrop`
+
+#### Syntax
+
+```4d
+Function event afterDrop($event : Object)
+// code
+```
+
+This event is triggered just after an entity is dropped.
+
+This event is useful after dropping data to propagate the drop action outside the application or to execute administration tasks. For example, it can be used to send a cancellation email after data have been dropped. Or, in case of error while dropping data, it can log an information for the administrator to check data consistency.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+- To avoid infinite loops, calling a [`drop()`](../API/EntityClass.md#drop) on the current entity (through `This`) in this function is **not allowed**. It will raise an error.
+- Throwing an [error object](#error-object) is **not supported** by this function.
+
+:::note
+
+The dropped entity is referenced by `This` and still exists in memory.
+
+:::
+
+#### Example 1
+
+Send a mail to the customer with the details of the dropped order.
+
+```4d
+ //OrderEntity class
+Function event afterDrop ($event : Object)
+
+var $oAuth2 : cs.NetKit.OAuth2Provider
+var $google : cs.NetKit.Google
+
+ //$param contains clientId, secretId...
+$oAuth2:=cs.NetKit.OAuth2Provider.new($param)
+$google:=cs.NetKit.Google.new($oAuth2; {mailType: "JMAP"})
+
+ //Email creation
+$email:=New object
+$email.from:="youremail@gmail.com"
+$email.to:="destinationmail@mail.com"
+$email.subject:="Your order is cancelled"
+$email.textBody:="Products numbers: " + This.products.number.join("-")
+
+ //Email sending
+$status:=$google.mail.send($email)
+```
+
+#### Example 2
+
+Create an action to do because there were errors in the [`dropping()`](#function-event-dropping) event.
+
+```4d
+ //ProductEntity class
+Function event afterDrop ($event : Object)
+
+var $action: cs.ActionEntity
+var $status: Object
+
+ // The drop action failed
+If($event.dropStatus = "failed")
+ $action:=ds.Action.new()
+ $action.label:=Last errors.first().message //message is "Error while dropping product XXX"
+ $action.status:="TO CHECK"
+ $status:=$action.save()
+End if
+
+```
diff --git a/docs/ORDA/privileges.md b/docs/ORDA/privileges.md
index 97f4d0003bf9dd..3930719954ae04 100644
--- a/docs/ORDA/privileges.md
+++ b/docs/ORDA/privileges.md
@@ -20,10 +20,11 @@ If a user attempts to execute an action and does not have the appropriate access

-### See also
+:::tip Related Blog posts
-For a detailed overview of the whole permissions architecture, please read the [**Filter access to your data with a complete system of permissions**](https://blog.4d.com/filter-access-to-your-data-with-a-complete-system-of-permissions/) blog post.
+[**Filter access to your data with a complete system of permissions**](https://blog.4d.com/filter-access-to-your-data-with-a-complete-system-of-permissions/)
+:::
## Resources
@@ -133,7 +134,7 @@ The default file has the following contents:
{
"privileges": [
{
- "privilege": "none",
+ "privilege": "all",
"includes": []
}
],
@@ -145,12 +146,12 @@ The default file has the following contents:
{
"applyTo": "ds",
"type": "datastore",
- "read": ["none"],
- "create": ["none"],
- "update": ["none"],
- "drop": ["none"],
- "execute": ["none"],
- "promote": ["none"]
+ "read": ["all"],
+ "create": ["all"],
+ "update": ["all"],
+ "drop": ["all"],
+ "execute": ["all"],
+ "promote": ["all"]
}
]
},
@@ -161,7 +162,8 @@ The default file has the following contents:
```
-For a highest level of security, the "none" privilege is assigned to all permissions in the datastore, thus data access on the whole `ds` object is disabled by default. It is recommended not to modified or use this locking privilege, but to add specific permissions to each resource you wish to make available from web or REST requests ([see example below](#example-of-privilege-configuration)).
+For a highest level of security, the "all" privilege is assigned to all permissions in the datastore, thus data access on the whole `ds` object is disabled by default. The principle is as follows: assigning a permission is like putting a lock on a door. Only sessions with privilege having the corresponding key (i.e., a permission) will be able to open the lock.
+It is recommended not to modified or use this locking privilege, but to add specific permissions to each resource you wish to make available from web or REST requests ([see example below](#example-of-privilege-configuration)).
:::caution
@@ -278,14 +280,14 @@ End if
## Example of privilege configuration
-The good practice is to keep all data access locked by default thanks to the "none" privilege and to configure the `roles.json` file to only open controlled parts to authorized sessions. For example, to allow some accesses to guest sessions:
+The good practice is to keep all data access locked by default thanks to the "all" privilege and to configure the `roles.json` file to only open controlled parts to authorized sessions. For example, to allow some accesses to "guest" sessions:
```json title="/Project/Sources/roles.json"
{
"privileges": [
{
- "privilege": "none",
+ "privilege": "all",
"includes": []
}
],
@@ -296,22 +298,22 @@ The good practice is to keep all data access locked by default thanks to the "no
"applyTo": "ds",
"type": "datastore",
"read": [
- "none"
+ "all"
],
"create": [
- "none"
+ "all"
],
"update": [
- "none"
+ "all"
],
"drop": [
- "none"
+ "all"
],
"execute": [
- "none"
+ "all"
],
"promote": [
- "none"
+ "all"
]
},
{
diff --git a/docs/Project/architecture.md b/docs/Project/architecture.md
index dd618d5cd5b887..0d3ddfef1e0bae 100644
--- a/docs/Project/architecture.md
+++ b/docs/Project/architecture.md
@@ -66,6 +66,7 @@ lists.json|Defined lists|JSON
filters.json|Defined filters|JSON
dependencies.json|Names of [components to load](components.md) in the project|JSON|
HTTPHandlers.json|Custom [HTTP request handlers](../WebServer/http-request-handler.md) defined for the web server|JSON|
+HTTPRules.json|Custom [HTTP rules](../WebServer/http-rules.md) defined for the web server|JSON|
styleSheets.css|CSS style sheets|CSS
styleSheets_mac.css|Mac css style sheets (from converted binary database)|CSS
styleSheets_windows.css|Windows css style sheets (from converted binary database)|CSS
diff --git a/docs/Project/components.md b/docs/Project/components.md
index fb4b3a96599988..25af5e563a0232 100644
--- a/docs/Project/components.md
+++ b/docs/Project/components.md
@@ -37,6 +37,22 @@ The "Contents" folder architecture is recommended for components if you want to
:::
+## Components made by 4D
+
+
+4D proposes a set of components developed in-house. If you want to use one of them, you need to download and install it from the [4D github repository](https://github.com/4d) automatically using the [Dependency manager](#monitoring-project-dependencies).
+
+
+|Component|Description|Main Features|
+|---|---|---|
+|[4D AiIKit](https://github.com/4d/4D-AIKit)|Set of classes to connect to third-party OpenAI APIs|`OpenAIChat`, `OpenAIImage`...|
+|[4D Labels](https://github.com/4d/4D-Labels)|Internal component required to build label templates||
+|[4D NetKit](https://developer.4d.com/4D-NetKit)|Set of web service tools to connect to third-party APIs|`OAuth2Provider` class, `New OAuth2 provider`, `OAuth2ProviderObject.getToken()` |
+|[4D Progress](https://github.com/4d/4D-Progress)|Open one or more progress bars in the same window|`Progress New`, `Progress SET ON STOP METHOD`, `Progress SET PROGRESS`, ... |
+|[4D SVG](https://github.com/4d/4D-SVG)|Create and manipulate common svg graphic objects|`SVGTool_Display_viewer`, multiple `SVG_` methods |
+|[4D ViewPro](ViewPro/getting-started.md)|Spreadsheet features in your forms|See [4D View Pro documentation](ViewPro/getting-started.md)|
+|[4D Widgets](https://github.com/4d/4D-Widgets)|Manage DatePicker, TimePicker, SearchPicker 4D widgets|`DatePicker calendar`, `DateEntry area`, `TimeEntry`, `SearchPicker SET HELP TEXT`, ...|
+|[4D WritePro Interface](https://github.com/4d/4D-WritePro-Interface)|Manage [4D Write Pro palettes](https://doc.4d.com/4Dv20R9/4D/20-R9/Entry-areas.300-7543821.en.html) and [table wizard](../WritePro/writeprointerface.md#table-wizard)|`WP PictureSettings`, `WP ShowTabPages`, `WP SwitchToolbar`, `WP UpdateWidget`|
## Component Locations
diff --git a/docs/WebServer/http-request-handler.md b/docs/WebServer/http-request-handler.md
index eff1b01ae2a29d..572d9c63ccb84d 100644
--- a/docs/WebServer/http-request-handler.md
+++ b/docs/WebServer/http-request-handler.md
@@ -18,23 +18,33 @@ Custom HTTP request handlers meet various needs, including:
## Requirements
-Custom HTTP Request handlers are supported:
+Custom HTTP Request handlers are supported in the following context:
-- when [scalable sessions](./sessions.md#enabling-web-sessions) are enabled,
-- with the main Web Server only (HTTP Request handlers that may have been defined in [Web Servers of components](../WebServer/webServerObject.md) are ignored).
+- [scalable sessions](./sessions.md#enabling-web-sessions) or [no sessions](../settings/web.md#no-sessions) are enabled,
+- a web server run locally by 4D or 4D Server, including those [run by components](./webServerObject.md).
:::warning
-[By default](../ORDA/privileges.md#default-file) for security reasons, external access to the datastore is not allowed in 4D. You need to configure the [ORDA privileges](../ORDA/privileges.md) to allow HTTP requests.
+For security reasons, external access to the datastore can be disallowed in 4D. You need to configure the [ORDA privileges](../ORDA/privileges.md) to allow HTTP requests.
:::
+## How to set handlers
-## HTTPHandlers.json File
+You can declare HTTP Request handlers:
-You define your custom HTTP Request handlers in a configuration file named **HTTPHandlers.json** stored in the [`Project/Sources`](../Project/architecture.md#sources) folder.
+- in a configuration file named **HTTPHandlers.json** stored in the [`Project/Sources`](../Project/architecture.md#sources) folder of the project. HTTP Request handlers are loaded and applied in the main Web server once it is started.
+- using a [`.handlers`](../API/WebServerClass.md#handlers) property set in the *settings* parameter of the [start()](../API/WebServerClass.md#start) function, for any web server object:
-This file contains all listened URL patterns, the handled verbs, and the code to be called. Handlers are provided as a collection in JSON format.
+```4d
+WEB Server.start($settings.handlers) //set rules at web server startup
+```
+
+If both a **HTTPHandlers.json** file and a call to the [`WEB Server`](../commands/web-server.md) command with a valid `$settings.handlers` are used, the `WEB Server` command has priority.
+
+The json file (or the object in the *settings* parameter) contains all listened URL patterns, the handled verbs, and the code to be called.
+
+Handlers are provided as a collection.
At runtime, the first pattern matching the URL is executed, the others are ignored.
diff --git a/docs/WebServer/http-rules.md b/docs/WebServer/http-rules.md
new file mode 100644
index 00000000000000..c13b871781d20b
--- /dev/null
+++ b/docs/WebServer/http-rules.md
@@ -0,0 +1,233 @@
+---
+id: http-rules
+title: HTTP Rules
+---
+
+You can define HTTP rules to control HTTP response headers for any requests received by the 4D web server, including REST requests. You can add, modify, or remove HTTP headers, send redirections or set the HTTP status. This feature is useful to implement security policies based upon the handling of headers.
+
+To define HTTP rules, you just need to write some RegEx to declare the URL patterns you want to control, as well as how to modify response headers. You can set these rules using a `HTTPRules.json` file stored in the project folder, or using the *settings* parameter [`start()`](../API/WebServerClass.md#start) function of the web server object.
+
+
+## Requirements
+
+HTTP rules are supported in the following contexts:
+
+- [scalable sessions](./sessions.md#enabling-web-sessions) or [no sessions](../settings/web.md#no-sessions) are enabled,
+- a web server run locally by 4D or 4D Server, including those [run by components](./webServerObject.md).
+
+
+## How to set rules
+
+You can declare HTTP response rules:
+
+- in a configuration file named **HTTPRules.json** stored in the [`Project/Sources`](../Project/architecture.md#sources) folder of the project. Rules are loaded and applied in the main Web server once it is started.
+- using a [`.rules`](../API/WebServerClass.md#rules) property set in the *settings* parameter of the [`start()`](../API/WebServerClass.md#start) function, for any web server object:
+
+```4d
+WEB Server.start($settings.rules) //set rules at web server startup
+```
+
+If both a **HTTPRules.json** file and a call to the [`WEB Server`](../commands/web-server.md) command with a valid `$settings.rules` are used, the `WEB Server` command has priority.
+
+If the URI of the request does not match any of the RegEx patterns, the web server returns a default response.
+
+
+
+## Rules Definition
+
+The **HTTPRules.json** file or the [`.rules`](../API/WebServerClass.md#rules) property must contain a collection of **rule objects**.
+
+A rule object is defined by:
+
+- a RegEx describing a URL pattern, e.g. "^(.*\\.(jpg|jpeg|png|gif))"
+- the name of the action to execute for the HTTP response, e.g. "removeHeaders"
+- the value of the action, e.g. "X-Unwanted-Header1"
+
+Other properties are ignored.
+
+
+### URL patterns
+
+URL patterns are given using **regular expressions**. To declare a regular expression pattern, use the "RegExPattern" property name.
+
+Ex: `"RegExPattern": "/Test/Authorized/(.*)"`
+
+When the web server receives a request, **all** URL patterns are triggered sequentially in the given order, and all matching patterns are executed. In case of several actions modifying similar resources, the last executed action is taken into account.
+
+### Actions
+
+The following action keywords are supported:
+
+|Keyword|Value type|Description|
+|---|---|----|
+|`removeHeaders`|Text or Collection of texts|Header(s) to remove from the HTTP responses. If a header to remove does not exist in the response header, it is ignored.|
+|`addHeaders`|Object|Name (text) and value (text) of header(s) to add to the HTTP responses.|
+|`setHeaders`|Object|Name (text) and value (text) of header(s) to modify in the HTTP responses. If a header to modify does not exist in the response header, it is added.|
+|`denyAccess`|Boolean|true to deny access to the resource, false to allow access. When the access to a resource is denied, the web server returns a 403 status by default |
+|`redirect`|Text|Redirection URL. When a redirection is triggered, the web server returns a 302 status by default|
+|`status`|Number|HTTP status|
+
+
+### Non-modifiable headers
+
+The following headers could not be modified by the `removeHeaders`, `setHeaders`, or `addHeaders` actions:
+
+- "Date",
+- "Content-Length"
+
+Modifying these headers do not generate errors, however modifications will be ignored.
+
+### Current rules
+
+You can know the current rules using the [`.rules` property of the Web Server object](../API/WebServerClass.md#rules):
+
+```
+var $rules : Collection
+$rules:=WEB Server.rules //current rules
+```
+
+## Examples
+
+Rules can be set using a `HTTPRules.json` file or the *settings* parameter of the [`.start()`](../API/WebServerClass.md#start) web server function.
+
+### Using a HTTPRules.json file
+
+```json
+
+[
+ {
+ "comment": "All requests: allow GET method for, remove 'Server' header and set security headers",
+ "regexPattern": "/(.*)",
+ "setHeaders": {
+ "Allow": "GET",
+ "X-Frame-Options": "SAMEORIGIN",
+ "Content-Security-Policy": "default-src 'self'"
+ },
+ "removeHeaders": [
+ "Server"
+ ]
+ },
+ {
+ "comment": "REST requests: allow POST method",
+ "regexPattern": "/rest/(.*)",
+ "addHeaders": {
+ "Allow": "POST"
+ }
+ },
+ {
+ "comment": "HTML files in 'doc' folder: set cache control",
+ "regexPattern": "/docs/(.*).html",
+ "setHeaders": {
+ "Cache-Control": "max-age=3600"
+ },
+ "removeHeaders": [
+ "X-Powered-By"
+ ]
+ },
+ {
+ "comment": "Status 503 on 'maintenance' page",
+ "regexPattern": "^/maintenance.html",
+ "status": 503
+ },
+ {
+ "comment": "Redirect CSS and JS files",
+ "regexPattern": "^(.*\\\\.(css|js))",
+ "redirect": "https://cdn.example.com/"
+ },
+ {
+ "comment": "Redirect images with permanent status code",
+ "regexPattern": "^(.*\\\\.(jpg|jpeg|png|gif))",
+ "redirect": "https://cdn.example.com/images/",
+ "status": 301
+ },
+ {
+ "comment": "Deny access for all resources placed in the 'private' folder",
+ "regexPattern": "/private/(.*)",
+ "denyAccess": true
+ },
+ {
+ "comment": "Allow access to all resources placed in the 'private/allowed' folder",
+ "regexPattern": "/private/allowed/(.*)",
+ "denyAccess": false
+ }
+]
+
+```
+
+### Using a *settings* parameter
+
+
+
+```4d
+var $rule:={}
+
+var $settings:={}
+
+$settings.rules:=[]
+
+$rule:={}
+$rule.comment:="All requests: allow GET method for, remove 'Server' header and set security headers"
+$rule.regexPattern:="/(.*)"
+$rule.setHeaders:={Allow: "GET"}
+$rule.setHeaders["X-Frame-Options"]:="SAMEORIGIN"
+$rule.setHeaders["Content-Security-Policy"]:="default-src 'self'"
+$rule.removeHeaders:=["Server"]
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="REST requests: allow POST method"
+$rule.regexPattern:="/rest/(.*)"
+$rule.addHeaders:={Allow: "POST"}
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="HTML files in 'doc' folder: set cache control"
+$rule.regexPattern:="/docs/(.*).html"
+$rule.setHeaders:={}
+$rule.setHeaders["Cache-Control"]:="max-age=3600"
+$rule.removeHeaders:=["X-Powered-By"]
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Status 503 on 'maintenance' page"
+$rule.regexPattern:="^/maintenance.html"
+$rule.status:=503
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Redirect CSS and JS files"
+$rule.regexPattern:="^(.*\\\\.(css|js))"
+$rule.redirect:="https://cdn.example.com/"
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Redirect images with permanent status code"
+$rule.regexPattern:="^(.*\\\\.(jpg|jpeg|png|gif))"
+$rule.redirect:="https://cdn.example.com/images/"
+$rule.status:=301
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Deny access for all resources placed in the 'private' folder"
+$rule.regexPattern:="/private/(.*)"
+$rule.denyAccess:=True
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Allow access to all resources placed in the 'private/allowed' folder"
+$rule.regexPattern:="/private/allowed/(.*)"
+$rule.denyAccess:=False
+$settings.rules.push($rule)
+
+$return:=WEB Server.start($settings)
+
+```
+
+
+
+
+:::tip Related blog post
+
+[New Way to Control Your HTTP Responses](https://blog.4d.com/new-way-to-control-your-http-responses/)
+
+:::
diff --git a/docs/WebServer/sessions.md b/docs/WebServer/sessions.md
index 9517e8938487eb..44314a3c4fd8da 100644
--- a/docs/WebServer/sessions.md
+++ b/docs/WebServer/sessions.md
@@ -221,6 +221,12 @@ The 4D web server allows you to generate, share, and use OTP (One-Time Passcode)
In 4D, OTP session tokens are useful when calling external URLs and being called back in another browser or device (mobile/computer). Typically, a third-party application sends a confirmation email containing a callback link on which the user has to click. The callback link includes the OTP token, so that the session which triggered the callback is loaded along with its data and privileges. This principle allows you to share the same session on multiple devices. Thanks to this architecture, the [session cookie](#session-implementation) is not exposed on the network, which eliminates the risk of man-in-the-middle attack.
+:::tips Related blog posts
+
+[Connect Your Web Apps to Third-Party Systems](https://blog.4d.com/connect-your-web-apps-to-third-party-systems/)
+
+:::
+
### Overview
The basic sequence of an OTP session token use in a 4D web application is the following:
@@ -495,8 +501,3 @@ A session token has a lifespan, and the session itself has a lifespan. The sessi
A session is only restored by a token if both the session token lifespan and the session lifespan have not expired. In other cases (the session token has expired and/or the session itself has expired), a guest session is created when a web request with a session token is received.
-:::note
-
-For more information, please refer to the [Connect Your Web Apps to Third-Party Systems](https://blog.4d.com/connect-your-web-apps-to-third-party-systems/) blog post.
-
-:::
\ No newline at end of file
diff --git a/docs/aikit/Classes/OpenAIChatHelper.md b/docs/aikit/Classes/OpenAIChatHelper.md
index 1977bff3cb0a6a..c55e7ab95ccf87 100644
--- a/docs/aikit/Classes/OpenAIChatHelper.md
+++ b/docs/aikit/Classes/OpenAIChatHelper.md
@@ -67,30 +67,42 @@ $chatHelper.reset() // Clear all previous messages and tools
### registerTool()
-**registerTool**(*tool* : Object; *handler* : 4D.Function)
+**registerTool**(*tool* : Object; *handler* : Object)
| Parameter | Type | Description |
|------------------|-------------|-------------------------------------------------------|
| *tool* | Object | The tool definition object (or [OpenAITool](OpenAITool.md) instance) |
-| *handler* | 4D.Function | The function to handle tool calls (optional if defined inside *tool*) |
+| *handler* | Object | The function to handle tool calls ([4D.Function](../../API/FunctionClass.md) or Object), optional if defined inside *tool* as *handler* property |
Registers a tool with its handler function for automatic tool call handling.
-If the handler is not provided, the tool's `handler` property will be used.
+
+The *handler* parameter can be:
+- A **4D.Function**: Direct handler function
+- An **Object**: An object containing a `formula` property matching the tool function name
The handler function receives an object containing the parameters passed from the OpenAI tool call. This object contains key-value pairs where the keys match the parameter names defined in the tool's schema, and the values are the actual arguments provided by the AI model.
+
#### Register Tool Example
```4D
-// Define a simple tool
+// Example 1: Simple registration with direct handler
var $tool:={type: "function"; function: {name: "get_weather"; description: "Get current weather"; parameters: {type: "object"; properties: {location: {type: "string"; description: "City name"}}}}}
-
-// Define a handler function that receives an argument { location: "a city" }
var $handler:=Formula(return "Sunny, 25°C in "+$1.location)
$chatHelper.registerTool($tool; $handler)
-// or
+
+// Example 2: Tool with handler property (no second parameter needed)
+var $tool:={name: "calculate"; description: "Perform calculations"; handler: Formula(return String(Num($1.expression)))}
+$chatHelper.registerTool($tool)
+
+// Example 3: Using object notation
$chatHelper.registerTool({tool: $tool; handler: $handler})
+
+// Example 4: Handler as object with formula matching tool name
+var $tool:={name: "getTime"; description: "Get current time"}
+var $handlerObj:=cs.MyTimeTool.new() // class with a getTime function
+$chatHelper.registerTool($tool; $handlerObj)
```
### registerTools()
@@ -101,34 +113,63 @@ $chatHelper.registerTool({tool: $tool; handler: $handler})
|-----------------------|---------|----------------------------------------------------------------|
| *toolsWithHandlers* | Variant | Object or Collection containing tools and their handlers |
-Registers multiple tools at once. The parameter can be either an object with function names as keys, or a collection of tool objects.
+Registers multiple tools at once. The parameter can be:
+- **Collection**: Array of tool objects (with handlers embedded or separate)
+- **Object**: Object with function names as keys mapping to tool definitions
+- **Object with `tools` attribute**: Object containing a `tools` collection and formula properties matching tool names
#### Register Multiple Tools Example
-```4D
-// Simple approach: handlers defined directly in tools
-var $weatherTool:={type: "function"; function: {name: "get_weather"; description: "Get current weather"; parameters: {type: "object"; properties: {location: {type: "string"; description: "City name"}}}}; \
- handler: Formula(return "Sunny, 25°C in "+$1.location)}
-var $calculatorTool:={type: "function"; function: {name: "calculate"; description: "Perform calculations"; parameters: {type: "object"; properties: {expression: {type: "string"; description: "Math expression"}}}}; \
- handler: Formula(return String(Num($1.expression)))}
-
-var $tools:={}
-$tools.get_weather:=$weatherTool
-$tools.calculate:=$calculatorTool
+##### Example 1: Collection format with handlers in tools
-$chatHelper.registerTools($tools)
+```4D
+var $weatherTool:={name: "getWeather"; description: "Get current weather"; handler: Formula(return "Sunny, 25°C in "+$1.location)}
+var $calculatorTool:={name: "calculate"; description: "Perform calculations"; handler: Formula(return String(Num($1.expression)))}
-// Using collection format
$chatHelper.registerTools([$weatherTool; $calculatorTool])
+```
-// Alternative: separate tool definitions from handlers (useful for better code organization)
+##### Example 2: Object format with separate tool and handler
+
+```4D
var $toolsWithSeparateHandlers:={}
-$toolsWithSeparateHandlers.get_weather:={tool: $weatherToolDefinition; handler: $weatherHandler}
+$toolsWithSeparateHandlers.getWeather:={tool: $weatherToolDefinition; handler: $weatherHandler}
$toolsWithSeparateHandlers.calculate:={tool: $calculatorToolDefinition; handler: $calculatorHandler}
$chatHelper.registerTools($toolsWithSeparateHandlers)
```
+##### Example 3: Object with tools collection attribute and formula properties
+
+MyTools class:
+```4D
+
+Class constructor
+ this.tools:=[{name: "getWeather"; description: "Get current weather"}; \
+ {name: "getTime"; description: "Get current time"}] // Collection of tool definitions
+
+Function getWeather($parameters: Object)
+ return "Sunny, 25°C"
+
+Function getTime($parameters: Object)
+ return String(Current time)
+```
+
+```4D
+$chatHelper.registerTools(cs.MyTools.new())
+```
+
+##### Example 4: Simple object format with tools as properties
+
+```4D
+var $tools:={}
+$tools.getWeather:=$weatherTool // Tool with handler property
+$tools.calculate:=$calculatorTool // Tool with handler property
+
+$chatHelper.registerTools($tools)
+```
+
+
### unregisterTool()
**unregisterTool**(*functionName* : Text)
diff --git a/docs/assets/en/FormEditor/winui-form.png b/docs/assets/en/FormEditor/winui-form.png
new file mode 100644
index 00000000000000..44f0b153852027
Binary files /dev/null and b/docs/assets/en/FormEditor/winui-form.png differ
diff --git a/docs/assets/en/FormEditor/winui-setting.png b/docs/assets/en/FormEditor/winui-setting.png
new file mode 100644
index 00000000000000..ad71386b9acada
Binary files /dev/null and b/docs/assets/en/FormEditor/winui-setting.png differ
diff --git a/docs/assets/en/FormObjects/fluentui-form.png b/docs/assets/en/FormObjects/fluentui-form.png
new file mode 100644
index 00000000000000..00d3b1d2d663ef
Binary files /dev/null and b/docs/assets/en/FormObjects/fluentui-form.png differ
diff --git a/docs/assets/en/FormObjects/fluentui-setting.png b/docs/assets/en/FormObjects/fluentui-setting.png
new file mode 100644
index 00000000000000..e8c5e02f62431f
Binary files /dev/null and b/docs/assets/en/FormObjects/fluentui-setting.png differ
diff --git a/docs/commands-legacy/get-database-parameter.md b/docs/commands-legacy/get-database-parameter.md
index a53773801105bf..e914d8c09c5fd2 100644
--- a/docs/commands-legacy/get-database-parameter.md
+++ b/docs/commands-legacy/get-database-parameter.md
@@ -945,7 +945,7 @@ For more information on the 4DIMAPLog\_X.txt files, please refer to the *Descrip
-### TCP log (131)
+### TCPUDP log recording (131)
**Possible values:**
@@ -953,7 +953,7 @@ For more information on the 4DIMAPLog\_X.txt files, please refer to the *Descrip
`1`: Logging is enabled.
-**Description:** Retrieves the status of the `4DTCPLog.txt` file for logging TCP events and returns whether the `4DTCPLog.txt` log file is currently active or not.
+**Description:** Retrieves the status of the `4DTCPUDPLog.txt` file for logging TCP events and returns whether the `4DTCPUDPLog.txt` log file is currently active or not.
diff --git a/docs/commands-legacy/set-database-parameter.md b/docs/commands-legacy/set-database-parameter.md
index dd1a99985cca7d..3266bac99350bd 100644
--- a/docs/commands-legacy/set-database-parameter.md
+++ b/docs/commands-legacy/set-database-parameter.md
@@ -944,7 +944,7 @@ For more information on the 4DIMAPLog\_X.txt files, please refer to the *Descrip
-### TCP log (131)
+### TCPUDP log recording (131)
**Scope:** 4D application.
@@ -952,7 +952,7 @@ For more information on the 4DIMAPLog\_X.txt files, please refer to the *Descrip
**Possible values:** `0`: Logging disabled (default), `1`: Logging enabled.
-**Description:** Enables or disables the `4DTCPLog.txt` file for logging TCP events.
+**Description:** Enables or disables the `4DTCPUDPLog.txt` file for logging TCP events.
diff --git a/docs/commands/session.md b/docs/commands/session.md
index 33f51850def1e0..26c0b687d009c0 100644
--- a/docs/commands/session.md
+++ b/docs/commands/session.md
@@ -55,6 +55,7 @@ The `Session` object of remote client sessions is available from:
- Project methods that have the [Execute on Server](../Project/code-overview.md#execute-on-server) attribute (they are executed in the "twinned" process of the client process),
- Triggers,
+- ORDA [data model functions](../ORDA/ordaClasses.md) (except those declared with the [`local`](../ORDA/ordaClasses.md#local-functions) keyword,
- `On Server Open Connection` and `On Server Shutdown Connection` database methods.
For more information on remote user sessions, please refer to the [**Remote client user sessions**](../Desktop/clientServer.md#remote-user-sessions) paragraph.
diff --git a/docs/settings/client-server.md b/docs/settings/client-server.md
index dd77820f8b0fd1..dc4d01c6f4ad85 100644
--- a/docs/settings/client-server.md
+++ b/docs/settings/client-server.md
@@ -77,10 +77,9 @@ This drop-down box contains 3 network layer options to choose between: **legacy*
- Since QUIC uses the UDP protocol, make sure UDP is allowed in your network security settings.
- QUIC automatically connects to the port 19813 for both application server and DB4D server.
- When the QUIC layer option is selected:
- - A beta message and an alert icon are displayed near the selector.
- [Client-server Connections Timeout settings](#client-server-connections-timeout) are hidden
- - The [Encrypt Client-Server communication checkbox](#encrypt-client-server-communications) is hidden (QUIC communications are always in TLS, whatever your secured mode is.).
- - **Compatibility**: You need to deploy your client/server applications with 4D v20 or higher before switching to the QUIC network layer.
+ - The [Encrypt Client-Server communication checkbox](#encrypt-client-server-communications) is hidden (QUIC communications are always in TLS, whatever your secured mode is).
+ - **Compatibility**: You need to deploy your client/server applications with 4D 20 or higher before switching to the QUIC network layer.
:::note
@@ -90,6 +89,12 @@ In case of a modification, you need to restart the application for the change to
#### Client-Server Connections Timeout
+:::note
+
+This option is not available when the [QUIC](#network-layer) network layer is selected.
+
+:::
+
This device is used to set the timeout (period of inactivity beyond which the connection is closed) between 4D Server and the client machines connecting to it. The Unlimited option removes the timeout. When this option is selected, client activity control is eliminated.
When a timeout is selected, the server will close the connection of a client if it does not receive any requests from the latter during the specified time limit.
@@ -102,6 +107,12 @@ When this option is checked, all the 4D remote machines connecting to the databa
#### Encrypt Client-Server Communications
+:::note
+
+This option is not available when the [QUIC](#network-layer) network layer option is selected.
+
+:::
+
This option lets you activate the secured mode for communications between the server machine and the 4D remote machines. This option is detailed in the [Encrypting Client/Server Connections](https://doc.4d.com/4Dv20/4D/20/Encrypting-ClientServer-Connections.300-6330533.en.html) section.
#### Update Resources folder during a session
diff --git a/docusaurus.config.js b/docusaurus.config.js
index dc53f56618f2b4..65e1261325dd2f 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -88,12 +88,12 @@ module.exports = {
return sortAlphabetically(sidebarItems);
},
versions: {
- '20-R10': {
- label: '20 R10',
+ '21': {
+ label: '21 BETA',
banner: 'none',
},
- '20-R9': {
- label: '20 R9',
+ '20-R10': {
+ label: '20 R10',
banner: 'none',
},
'20': {
diff --git a/i18n/en/docusaurus-plugin-content-docs/current.json b/i18n/en/docusaurus-plugin-content-docs/current.json
index 75c512ba7f60d9..3e35161b61cca9 100644
--- a/i18n/en/docusaurus-plugin-content-docs/current.json
+++ b/i18n/en/docusaurus-plugin-content-docs/current.json
@@ -1201,7 +1201,7 @@
},
"sidebar.docs.link.Build4D": {
"message": "Build4D",
- "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d-depot/Build4D?tab=readme-ov-file#readme"
+ "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d/Build4D"
},
"sidebar.docs.doc.Log Files": {
"message": "Log Files",
diff --git a/i18n/en/docusaurus-plugin-content-docs/version-20-R10.json b/i18n/en/docusaurus-plugin-content-docs/version-20-R10.json
index edf5bb207c95df..f9ca30411e42ee 100644
--- a/i18n/en/docusaurus-plugin-content-docs/version-20-R10.json
+++ b/i18n/en/docusaurus-plugin-content-docs/version-20-R10.json
@@ -797,7 +797,7 @@
},
"sidebar.docs.link.Build4D": {
"message": "Build4D",
- "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d-depot/Build4D?tab=readme-ov-file#readme"
+ "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d/Build4D"
},
"sidebar.docs.doc.Log Files": {
"message": "Log Files",
diff --git a/i18n/en/docusaurus-plugin-content-docs/version-20-R8.json b/i18n/en/docusaurus-plugin-content-docs/version-20-R8.json
deleted file mode 100644
index 82ae1617342e70..00000000000000
--- a/i18n/en/docusaurus-plugin-content-docs/version-20-R8.json
+++ /dev/null
@@ -1,1042 +0,0 @@
-{
- "version.label": {
- "message": "20 R8",
- "description": "The label for version 20-R8"
- },
- "sidebar.docs.category.Getting Started": {
- "message": "Getting Started",
- "description": "The label for category Getting Started in sidebar docs"
- },
- "sidebar.docs.category.Getting Started.link.generated-index.title": {
- "message": "Getting Started",
- "description": "The generated-index page title for category Getting Started in sidebar docs"
- },
- "sidebar.docs.category.Core Development": {
- "message": "Core Development",
- "description": "The label for category Core Development in sidebar docs"
- },
- "sidebar.docs.category.Core Development.link.generated-index.title": {
- "message": "Core Development",
- "description": "The generated-index page title for category Core Development in sidebar docs"
- },
- "sidebar.docs.category.Project Management": {
- "message": "Project Management",
- "description": "The label for category Project Management in sidebar docs"
- },
- "sidebar.docs.category.Settings": {
- "message": "Settings",
- "description": "The label for category Settings in sidebar docs"
- },
- "sidebar.docs.category.Development Environment": {
- "message": "Development Environment",
- "description": "The label for category Development Environment in sidebar docs"
- },
- "sidebar.docs.category.Debugging": {
- "message": "Debugging",
- "description": "The label for category Debugging in sidebar docs"
- },
- "sidebar.docs.category.ORDA": {
- "message": "ORDA",
- "description": "The label for category ORDA in sidebar docs"
- },
- "sidebar.docs.category.Processes": {
- "message": "Processes",
- "description": "The label for category Processes in sidebar docs"
- },
- "sidebar.docs.category.Preferences": {
- "message": "Preferences",
- "description": "The label for category Preferences in sidebar docs"
- },
- "sidebar.docs.category.4D Language": {
- "message": "4D Language",
- "description": "The label for category 4D Language in sidebar docs"
- },
- "sidebar.docs.category.4D Language.link.generated-index.title": {
- "message": "4D Language",
- "description": "The generated-index page title for category 4D Language in sidebar docs"
- },
- "sidebar.docs.category.Concepts": {
- "message": "Concepts",
- "description": "The label for category Concepts in sidebar docs"
- },
- "sidebar.docs.category.Data Types": {
- "message": "Data Types",
- "description": "The label for category Data Types in sidebar docs"
- },
- "sidebar.docs.category.Commands": {
- "message": "Commands",
- "description": "The label for category Commands in sidebar docs"
- },
- "sidebar.docs.category.Commands.link.generated-index.title": {
- "message": "Commands",
- "description": "The generated-index page title for category Commands in sidebar docs"
- },
- "sidebar.docs.category.4D Environment": {
- "message": "4D Environment",
- "description": "The label for category 4D Environment in sidebar docs"
- },
- "sidebar.docs.category.4D Environment.link.generated-index.title": {
- "message": "4D Environment",
- "description": "The generated-index page title for category 4D Environment in sidebar docs"
- },
- "sidebar.docs.category.Arrays": {
- "message": "Arrays",
- "description": "The label for category Arrays in sidebar docs"
- },
- "sidebar.docs.category.Arrays.link.generated-index.title": {
- "message": "Arrays",
- "description": "The generated-index page title for category Arrays in sidebar docs"
- },
- "sidebar.docs.category.Backup": {
- "message": "Backup",
- "description": "The label for category Backup in sidebar docs"
- },
- "sidebar.docs.category.Backup.link.generated-index.title": {
- "message": "Backup",
- "description": "The generated-index page title for category Backup in sidebar docs"
- },
- "sidebar.docs.category.BLOB": {
- "message": "BLOB",
- "description": "The label for category BLOB in sidebar docs"
- },
- "sidebar.docs.category.BLOB.link.generated-index.title": {
- "message": "BLOB",
- "description": "The generated-index page title for category BLOB in sidebar docs"
- },
- "sidebar.docs.category.Boolean": {
- "message": "Boolean",
- "description": "The label for category Boolean in sidebar docs"
- },
- "sidebar.docs.category.Boolean.link.generated-index.title": {
- "message": "Boolean",
- "description": "The generated-index page title for category Boolean in sidebar docs"
- },
- "sidebar.docs.category.Cache Management": {
- "message": "Cache Management",
- "description": "The label for category Cache Management in sidebar docs"
- },
- "sidebar.docs.category.Cache Management.link.generated-index.title": {
- "message": "Cache Management",
- "description": "The generated-index page title for category Cache Management in sidebar docs"
- },
- "sidebar.docs.category.Collections": {
- "message": "Collections",
- "description": "The label for category Collections in sidebar docs"
- },
- "sidebar.docs.category.Collections.link.generated-index.title": {
- "message": "Collections",
- "description": "The generated-index page title for category Collections in sidebar docs"
- },
- "sidebar.docs.category.Communications": {
- "message": "Communications",
- "description": "The label for category Communications in sidebar docs"
- },
- "sidebar.docs.category.Communications.link.generated-index.title": {
- "message": "Communications",
- "description": "The generated-index page title for category Communications in sidebar docs"
- },
- "sidebar.docs.category.Compiler": {
- "message": "Compiler",
- "description": "The label for category Compiler in sidebar docs"
- },
- "sidebar.docs.category.Compiler.link.generated-index.title": {
- "message": "Compiler",
- "description": "The generated-index page title for category Compiler in sidebar docs"
- },
- "sidebar.docs.category.Data Entry": {
- "message": "Data Entry",
- "description": "The label for category Data Entry in sidebar docs"
- },
- "sidebar.docs.category.Data Entry.link.generated-index.title": {
- "message": "Data Entry",
- "description": "The generated-index page title for category Data Entry in sidebar docs"
- },
- "sidebar.docs.category.Data Security": {
- "message": "Data Security",
- "description": "The label for category Data Security in sidebar docs"
- },
- "sidebar.docs.category.Data Security.link.generated-index.title": {
- "message": "Data Security",
- "description": "The generated-index page title for category Data Security in sidebar docs"
- },
- "sidebar.docs.category.Database Methods": {
- "message": "Database Methods",
- "description": "The label for category Database Methods in sidebar docs"
- },
- "sidebar.docs.category.Database Methods.link.generated-index.title": {
- "message": "Database Methods",
- "description": "The generated-index page title for category Database Methods in sidebar docs"
- },
- "sidebar.docs.category.Date and Time": {
- "message": "Date and Time",
- "description": "The label for category Date and Time in sidebar docs"
- },
- "sidebar.docs.category.Date and Time.link.generated-index.title": {
- "message": "Date and Time",
- "description": "The generated-index page title for category Date and Time in sidebar docs"
- },
- "sidebar.docs.category.Design Object Access": {
- "message": "Design Object Access",
- "description": "The label for category Design Object Access in sidebar docs"
- },
- "sidebar.docs.category.Design Object Access.link.generated-index.title": {
- "message": "Design Object Access",
- "description": "The generated-index page title for category Design Object Access in sidebar docs"
- },
- "sidebar.docs.category.Drag and Drop": {
- "message": "Drag and Drop",
- "description": "The label for category Drag and Drop in sidebar docs"
- },
- "sidebar.docs.category.Drag and Drop.link.generated-index.title": {
- "message": "Drag and Drop",
- "description": "The generated-index page title for category Drag and Drop in sidebar docs"
- },
- "sidebar.docs.category.Entry Control": {
- "message": "Entry Control",
- "description": "The label for category Entry Control in sidebar docs"
- },
- "sidebar.docs.category.Entry Control.link.generated-index.title": {
- "message": "Entry Control",
- "description": "The generated-index page title for category Entry Control in sidebar docs"
- },
- "sidebar.docs.category.File and Folder": {
- "message": "File and Folder",
- "description": "The label for category File and Folder in sidebar docs"
- },
- "sidebar.docs.category.File and Folder.link.generated-index.title": {
- "message": "File and Folder",
- "description": "The generated-index page title for category File and Folder in sidebar docs"
- },
- "sidebar.docs.category.Form Events": {
- "message": "Form Events",
- "description": "The label for category Form Events in sidebar docs"
- },
- "sidebar.docs.category.Form Events.link.generated-index.title": {
- "message": "Form Events",
- "description": "The generated-index page title for category Form Events in sidebar docs"
- },
- "sidebar.docs.category.Forms": {
- "message": "Forms",
- "description": "The label for category Forms in sidebar docs"
- },
- "sidebar.docs.category.Forms.link.generated-index.title": {
- "message": "Forms",
- "description": "The generated-index page title for category Forms in sidebar docs"
- },
- "sidebar.docs.category.Formulas": {
- "message": "Formulas",
- "description": "The label for category Formulas in sidebar docs"
- },
- "sidebar.docs.category.Formulas.link.generated-index.title": {
- "message": "Formulas",
- "description": "The generated-index page title for category Formulas in sidebar docs"
- },
- "sidebar.docs.category.Graphs": {
- "message": "Graphs",
- "description": "The label for category Graphs in sidebar docs"
- },
- "sidebar.docs.category.Graphs.link.generated-index.title": {
- "message": "Graphs",
- "description": "The generated-index page title for category Graphs in sidebar docs"
- },
- "sidebar.docs.category.HTTP": {
- "message": "HTTP",
- "description": "The label for category HTTP in sidebar docs"
- },
- "sidebar.docs.category.HTTP.link.generated-index.title": {
- "message": "HTTP",
- "description": "The generated-index page title for category HTTP in sidebar docs"
- },
- "sidebar.docs.category.Hierarchical Lists": {
- "message": "Hierarchical Lists",
- "description": "The label for category Hierarchical Lists in sidebar docs"
- },
- "sidebar.docs.category.Hierarchical Lists.link.generated-index.title": {
- "message": "Hierarchical Lists",
- "description": "The generated-index page title for category Hierarchical Lists in sidebar docs"
- },
- "sidebar.docs.category.Import and Export": {
- "message": "Import and Export",
- "description": "The label for category Import and Export in sidebar docs"
- },
- "sidebar.docs.category.Import and Export.link.generated-index.title": {
- "message": "Import and Export",
- "description": "The generated-index page title for category Import and Export in sidebar docs"
- },
- "sidebar.docs.category.Interruptions": {
- "message": "Interruptions",
- "description": "The label for category Interruptions in sidebar docs"
- },
- "sidebar.docs.category.Interruptions.link.generated-index.title": {
- "message": "Interruptions",
- "description": "The generated-index page title for category Interruptions in sidebar docs"
- },
- "sidebar.docs.category.JSON": {
- "message": "JSON",
- "description": "The label for category JSON in sidebar docs"
- },
- "sidebar.docs.category.JSON.link.generated-index.title": {
- "message": "JSON",
- "description": "The generated-index page title for category JSON in sidebar docs"
- },
- "sidebar.docs.category.LDAP": {
- "message": "LDAP",
- "description": "The label for category LDAP in sidebar docs"
- },
- "sidebar.docs.category.LDAP.link.generated-index.title": {
- "message": "LDAP",
- "description": "The generated-index page title for category LDAP in sidebar docs"
- },
- "sidebar.docs.category.Language": {
- "message": "Language",
- "description": "The label for category Language in sidebar docs"
- },
- "sidebar.docs.category.Language.link.generated-index.title": {
- "message": "Language",
- "description": "The generated-index page title for category Language in sidebar docs"
- },
- "sidebar.docs.category.Licenses": {
- "message": "Licenses",
- "description": "The label for category Licenses in sidebar docs"
- },
- "sidebar.docs.category.Licenses.link.generated-index.title": {
- "message": "Licenses",
- "description": "The generated-index page title for category Licenses in sidebar docs"
- },
- "sidebar.docs.category.List Box": {
- "message": "List Box",
- "description": "The label for category List Box in sidebar docs"
- },
- "sidebar.docs.category.List Box.link.generated-index.title": {
- "message": "List Box",
- "description": "The generated-index page title for category List Box in sidebar docs"
- },
- "sidebar.docs.category.Mail": {
- "message": "Mail",
- "description": "The label for category Mail in sidebar docs"
- },
- "sidebar.docs.category.Mail.link.generated-index.title": {
- "message": "Mail",
- "description": "The generated-index page title for category Mail in sidebar docs"
- },
- "sidebar.docs.category.Math": {
- "message": "Math",
- "description": "The label for category Math in sidebar docs"
- },
- "sidebar.docs.category.Math.link.generated-index.title": {
- "message": "Math",
- "description": "The generated-index page title for category Math in sidebar docs"
- },
- "sidebar.docs.category.Menus": {
- "message": "Menus",
- "description": "The label for category Menus in sidebar docs"
- },
- "sidebar.docs.category.Menus.link.generated-index.title": {
- "message": "Menus",
- "description": "The generated-index page title for category Menus in sidebar docs"
- },
- "sidebar.docs.category.Messages": {
- "message": "Messages",
- "description": "The label for category Messages in sidebar docs"
- },
- "sidebar.docs.category.Messages.link.generated-index.title": {
- "message": "Messages",
- "description": "The generated-index page title for category Messages in sidebar docs"
- },
- "sidebar.docs.category.Named Selections": {
- "message": "Named Selections",
- "description": "The label for category Named Selections in sidebar docs"
- },
- "sidebar.docs.category.Named Selections.link.generated-index.title": {
- "message": "Named Selections",
- "description": "The generated-index page title for category Named Selections in sidebar docs"
- },
- "sidebar.docs.category.Objects (Forms)": {
- "message": "Objects (Forms)",
- "description": "The label for category Objects (Forms) in sidebar docs"
- },
- "sidebar.docs.category.Objects (Forms).link.generated-index.title": {
- "message": "Objects (Forms)",
- "description": "The generated-index page title for category Objects (Forms) in sidebar docs"
- },
- "sidebar.docs.category.Objects (Language)": {
- "message": "Objects (Language)",
- "description": "The label for category Objects (Language) in sidebar docs"
- },
- "sidebar.docs.category.Objects (Language).link.generated-index.title": {
- "message": "Objects (Language)",
- "description": "The generated-index page title for category Objects (Language) in sidebar docs"
- },
- "sidebar.docs.category.On a Series": {
- "message": "On a Series",
- "description": "The label for category On a Series in sidebar docs"
- },
- "sidebar.docs.category.On a Series.link.generated-index.title": {
- "message": "On a Series",
- "description": "The generated-index page title for category On a Series in sidebar docs"
- },
- "sidebar.docs.category.PHP": {
- "message": "PHP",
- "description": "The label for category PHP in sidebar docs"
- },
- "sidebar.docs.category.PHP.link.generated-index.title": {
- "message": "PHP",
- "description": "The generated-index page title for category PHP in sidebar docs"
- },
- "sidebar.docs.category.Pasteboard": {
- "message": "Pasteboard",
- "description": "The label for category Pasteboard in sidebar docs"
- },
- "sidebar.docs.category.Pasteboard.link.generated-index.title": {
- "message": "Pasteboard",
- "description": "The generated-index page title for category Pasteboard in sidebar docs"
- },
- "sidebar.docs.category.Pictures": {
- "message": "Pictures",
- "description": "The label for category Pictures in sidebar docs"
- },
- "sidebar.docs.category.Pictures.link.generated-index.title": {
- "message": "Pictures",
- "description": "The generated-index page title for category Pictures in sidebar docs"
- },
- "sidebar.docs.category.Printing": {
- "message": "Printing",
- "description": "The label for category Printing in sidebar docs"
- },
- "sidebar.docs.category.Printing.link.generated-index.title": {
- "message": "Printing",
- "description": "The generated-index page title for category Printing in sidebar docs"
- },
- "sidebar.docs.category.Process (Communications)": {
- "message": "Process (Communications)",
- "description": "The label for category Process (Communications) in sidebar docs"
- },
- "sidebar.docs.category.Process (Communications).link.generated-index.title": {
- "message": "Process (Communications)",
- "description": "The generated-index page title for category Process (Communications) in sidebar docs"
- },
- "sidebar.docs.category.Process (User Interface)": {
- "message": "Process (User Interface)",
- "description": "The label for category Process (User Interface) in sidebar docs"
- },
- "sidebar.docs.category.Process (User Interface).link.generated-index.title": {
- "message": "Process (User Interface)",
- "description": "The generated-index page title for category Process (User Interface) in sidebar docs"
- },
- "sidebar.docs.category.Processes.link.generated-index.title": {
- "message": "Processes",
- "description": "The generated-index page title for category Processes in sidebar docs"
- },
- "sidebar.docs.category.Queries": {
- "message": "Queries",
- "description": "The label for category Queries in sidebar docs"
- },
- "sidebar.docs.category.Queries.link.generated-index.title": {
- "message": "Queries",
- "description": "The generated-index page title for category Queries in sidebar docs"
- },
- "sidebar.docs.category.Quick Report": {
- "message": "Quick Report",
- "description": "The label for category Quick Report in sidebar docs"
- },
- "sidebar.docs.category.Quick Report.link.generated-index.title": {
- "message": "Quick Report",
- "description": "The generated-index page title for category Quick Report in sidebar docs"
- },
- "sidebar.docs.category.Record Locking": {
- "message": "Record Locking",
- "description": "The label for category Record Locking in sidebar docs"
- },
- "sidebar.docs.category.Record Locking.link.generated-index.title": {
- "message": "Record Locking",
- "description": "The generated-index page title for category Record Locking in sidebar docs"
- },
- "sidebar.docs.category.Records": {
- "message": "Records",
- "description": "The label for category Records in sidebar docs"
- },
- "sidebar.docs.category.Records.link.generated-index.title": {
- "message": "Records",
- "description": "The generated-index page title for category Records in sidebar docs"
- },
- "sidebar.docs.category.Relations": {
- "message": "Relations",
- "description": "The label for category Relations in sidebar docs"
- },
- "sidebar.docs.category.Relations.link.generated-index.title": {
- "message": "Relations",
- "description": "The generated-index page title for category Relations in sidebar docs"
- },
- "sidebar.docs.category.Resources": {
- "message": "Resources",
- "description": "The label for category Resources in sidebar docs"
- },
- "sidebar.docs.category.Resources.link.generated-index.title": {
- "message": "Resources",
- "description": "The generated-index page title for category Resources in sidebar docs"
- },
- "sidebar.docs.category.SQL": {
- "message": "SQL",
- "description": "The label for category SQL in sidebar docs"
- },
- "sidebar.docs.category.SQL.link.generated-index.title": {
- "message": "SQL",
- "description": "The generated-index page title for category SQL in sidebar docs"
- },
- "sidebar.docs.category.SVG": {
- "message": "SVG",
- "description": "The label for category SVG in sidebar docs"
- },
- "sidebar.docs.category.SVG.link.generated-index.title": {
- "message": "SVG",
- "description": "The generated-index page title for category SVG in sidebar docs"
- },
- "sidebar.docs.category.Secured Protocol": {
- "message": "Secured Protocol",
- "description": "The label for category Secured Protocol in sidebar docs"
- },
- "sidebar.docs.category.Secured Protocol.link.generated-index.title": {
- "message": "Secured Protocol",
- "description": "The generated-index page title for category Secured Protocol in sidebar docs"
- },
- "sidebar.docs.category.Selection": {
- "message": "Selection",
- "description": "The label for category Selection in sidebar docs"
- },
- "sidebar.docs.category.Selection.link.generated-index.title": {
- "message": "Selection",
- "description": "The generated-index page title for category Selection in sidebar docs"
- },
- "sidebar.docs.category.Sets": {
- "message": "Sets",
- "description": "The label for category Sets in sidebar docs"
- },
- "sidebar.docs.category.Sets.link.generated-index.title": {
- "message": "Sets",
- "description": "The generated-index page title for category Sets in sidebar docs"
- },
- "sidebar.docs.category.Spell Checker": {
- "message": "Spell Checker",
- "description": "The label for category Spell Checker in sidebar docs"
- },
- "sidebar.docs.category.Spell Checker.link.generated-index.title": {
- "message": "Spell Checker",
- "description": "The generated-index page title for category Spell Checker in sidebar docs"
- },
- "sidebar.docs.category.String": {
- "message": "String",
- "description": "The label for category String in sidebar docs"
- },
- "sidebar.docs.category.String.link.generated-index.title": {
- "message": "String",
- "description": "The generated-index page title for category String in sidebar docs"
- },
- "sidebar.docs.category.Structure Access": {
- "message": "Structure Access",
- "description": "The label for category Structure Access in sidebar docs"
- },
- "sidebar.docs.category.Structure Access.link.generated-index.title": {
- "message": "Structure Access",
- "description": "The generated-index page title for category Structure Access in sidebar docs"
- },
- "sidebar.docs.category.Styled Text": {
- "message": "Styled Text",
- "description": "The label for category Styled Text in sidebar docs"
- },
- "sidebar.docs.category.Styled Text.link.generated-index.title": {
- "message": "Styled Text",
- "description": "The generated-index page title for category Styled Text in sidebar docs"
- },
- "sidebar.docs.category.Subrecords": {
- "message": "Subrecords",
- "description": "The label for category Subrecords in sidebar docs"
- },
- "sidebar.docs.category.Subrecords.link.generated-index.title": {
- "message": "Subrecords",
- "description": "The generated-index page title for category Subrecords in sidebar docs"
- },
- "sidebar.docs.category.System Documents": {
- "message": "System Documents",
- "description": "The label for category System Documents in sidebar docs"
- },
- "sidebar.docs.category.System Documents.link.generated-index.title": {
- "message": "System Documents",
- "description": "The generated-index page title for category System Documents in sidebar docs"
- },
- "sidebar.docs.category.System Environment": {
- "message": "System Environment",
- "description": "The label for category System Environment in sidebar docs"
- },
- "sidebar.docs.category.System Environment.link.generated-index.title": {
- "message": "System Environment",
- "description": "The generated-index page title for category System Environment in sidebar docs"
- },
- "sidebar.docs.category.Table": {
- "message": "Table",
- "description": "The label for category Table in sidebar docs"
- },
- "sidebar.docs.category.Table.link.generated-index.title": {
- "message": "Table",
- "description": "The generated-index page title for category Table in sidebar docs"
- },
- "sidebar.docs.category.Tools": {
- "message": "Tools",
- "description": "The label for category Tools in sidebar docs"
- },
- "sidebar.docs.category.Tools.link.generated-index.title": {
- "message": "Tools",
- "description": "The generated-index page title for category Tools in sidebar docs"
- },
- "sidebar.docs.category.Transactions": {
- "message": "Transactions",
- "description": "The label for category Transactions in sidebar docs"
- },
- "sidebar.docs.category.Transactions.link.generated-index.title": {
- "message": "Transactions",
- "description": "The generated-index page title for category Transactions in sidebar docs"
- },
- "sidebar.docs.category.Triggers": {
- "message": "Triggers",
- "description": "The label for category Triggers in sidebar docs"
- },
- "sidebar.docs.category.Triggers.link.generated-index.title": {
- "message": "Triggers",
- "description": "The generated-index page title for category Triggers in sidebar docs"
- },
- "sidebar.docs.category.User Interface": {
- "message": "User Interface",
- "description": "The label for category User Interface in sidebar docs"
- },
- "sidebar.docs.category.User Interface.link.generated-index.title": {
- "message": "User Interface",
- "description": "The generated-index page title for category User Interface in sidebar docs"
- },
- "sidebar.docs.category.Users and Groups": {
- "message": "Users and Groups",
- "description": "The label for category Users and Groups in sidebar docs"
- },
- "sidebar.docs.category.Users and Groups.link.generated-index.title": {
- "message": "Users and Groups",
- "description": "The generated-index page title for category Users and Groups in sidebar docs"
- },
- "sidebar.docs.category.Variables": {
- "message": "Variables",
- "description": "The label for category Variables in sidebar docs"
- },
- "sidebar.docs.category.Variables.link.generated-index.title": {
- "message": "Variables",
- "description": "The generated-index page title for category Variables in sidebar docs"
- },
- "sidebar.docs.category.Web Area": {
- "message": "Web Area",
- "description": "The label for category Web Area in sidebar docs"
- },
- "sidebar.docs.category.Web Area.link.generated-index.title": {
- "message": "Web Area",
- "description": "The generated-index page title for category Web Area in sidebar docs"
- },
- "sidebar.docs.category.Web Server": {
- "message": "Web Server",
- "description": "The label for category Web Server in sidebar docs"
- },
- "sidebar.docs.category.Web Server.link.generated-index.title": {
- "message": "Web Server",
- "description": "The generated-index page title for category Web Server in sidebar docs"
- },
- "sidebar.docs.category.Web Services (Client)": {
- "message": "Web Services (Client)",
- "description": "The label for category Web Services (Client) in sidebar docs"
- },
- "sidebar.docs.category.Web Services (Client).link.generated-index.title": {
- "message": "Web Services (Client)",
- "description": "The generated-index page title for category Web Services (Client) in sidebar docs"
- },
- "sidebar.docs.category.Web Services (Server)": {
- "message": "Web Services (Server)",
- "description": "The label for category Web Services (Server) in sidebar docs"
- },
- "sidebar.docs.category.Web Services (Server).link.generated-index.title": {
- "message": "Web Services (Server)",
- "description": "The generated-index page title for category Web Services (Server) in sidebar docs"
- },
- "sidebar.docs.category.Windows": {
- "message": "Windows",
- "description": "The label for category Windows in sidebar docs"
- },
- "sidebar.docs.category.Windows.link.generated-index.title": {
- "message": "Windows",
- "description": "The generated-index page title for category Windows in sidebar docs"
- },
- "sidebar.docs.category.XML DOM": {
- "message": "XML DOM",
- "description": "The label for category XML DOM in sidebar docs"
- },
- "sidebar.docs.category.XML DOM.link.generated-index.title": {
- "message": "XML DOM",
- "description": "The generated-index page title for category XML DOM in sidebar docs"
- },
- "sidebar.docs.category.XML SAX": {
- "message": "XML SAX",
- "description": "The label for category XML SAX in sidebar docs"
- },
- "sidebar.docs.category.XML SAX.link.generated-index.title": {
- "message": "XML SAX",
- "description": "The generated-index page title for category XML SAX in sidebar docs"
- },
- "sidebar.docs.category.XML": {
- "message": "XML",
- "description": "The label for category XML in sidebar docs"
- },
- "sidebar.docs.category.XML.link.generated-index.title": {
- "message": "XML",
- "description": "The generated-index page title for category XML in sidebar docs"
- },
- "sidebar.docs.category.Classes": {
- "message": "Classes",
- "description": "The label for category Classes in sidebar docs"
- },
- "sidebar.docs.category.Classes.link.generated-index.title": {
- "message": "Class Functions",
- "description": "The generated-index page title for category Classes in sidebar docs"
- },
- "sidebar.docs.category.Classes.link.generated-index.description": {
- "message": "List of built-in 4D classes",
- "description": "The generated-index page description for category Classes in sidebar docs"
- },
- "sidebar.docs.category.Administration": {
- "message": "Administration",
- "description": "The label for category Administration in sidebar docs"
- },
- "sidebar.docs.category.Administration.link.generated-index.title": {
- "message": "Administration",
- "description": "The generated-index page title for category Administration in sidebar docs"
- },
- "sidebar.docs.category.Administration.link.generated-index.description": {
- "message": "How to monitor your 4D applications",
- "description": "The generated-index page description for category Administration in sidebar docs"
- },
- "sidebar.docs.category.4D Server Administration Window": {
- "message": "4D Server Administration Window",
- "description": "The label for category 4D Server Administration Window in sidebar docs"
- },
- "sidebar.docs.category.Web Administration": {
- "message": "Web Administration",
- "description": "The label for category Web Administration in sidebar docs"
- },
- "sidebar.docs.category.Web Administration.link.generated-index.title": {
- "message": "Web Administration",
- "description": "The generated-index page title for category Web Administration in sidebar docs"
- },
- "sidebar.docs.category.Web Administration.link.generated-index.description": {
- "message": "4D web tools for administrating and monitoring your applications.",
- "description": "The generated-index page description for category Web Administration in sidebar docs"
- },
- "sidebar.docs.category.MSC": {
- "message": "MSC",
- "description": "The label for category MSC in sidebar docs"
- },
- "sidebar.docs.category.Backup and Restore": {
- "message": "Backup and Restore",
- "description": "The label for category Backup and Restore in sidebar docs"
- },
- "sidebar.docs.category.Extensions": {
- "message": "Extensions",
- "description": "The label for category Extensions in sidebar docs"
- },
- "sidebar.docs.category.4D View Pro": {
- "message": "4D View Pro",
- "description": "The label for category 4D View Pro in sidebar docs"
- },
- "sidebar.docs.category.4D View Pro.link.generated-index.title": {
- "message": "4D View Pro",
- "description": "The generated-index page title for category 4D View Pro in sidebar docs"
- },
- "sidebar.docs.category.A": {
- "message": "A",
- "description": "The label for category A in sidebar docs"
- },
- "sidebar.docs.category.A.link.generated-index.title": {
- "message": "A",
- "description": "The generated-index page title for category A in sidebar docs"
- },
- "sidebar.docs.category.C": {
- "message": "C",
- "description": "The label for category C in sidebar docs"
- },
- "sidebar.docs.category.C.link.generated-index.title": {
- "message": "C",
- "description": "The generated-index page title for category C in sidebar docs"
- },
- "sidebar.docs.category.D": {
- "message": "D",
- "description": "The label for category D in sidebar docs"
- },
- "sidebar.docs.category.D.link.generated-index.title": {
- "message": "D",
- "description": "The generated-index page title for category D in sidebar docs"
- },
- "sidebar.docs.category.E": {
- "message": "E",
- "description": "The label for category E in sidebar docs"
- },
- "sidebar.docs.category.E.link.generated-index.title": {
- "message": "E",
- "description": "The generated-index page title for category E in sidebar docs"
- },
- "sidebar.docs.category.F": {
- "message": "F",
- "description": "The label for category F in sidebar docs"
- },
- "sidebar.docs.category.F.link.generated-index.title": {
- "message": "F",
- "description": "The generated-index page title for category F in sidebar docs"
- },
- "sidebar.docs.category.G": {
- "message": "G",
- "description": "The label for category G in sidebar docs"
- },
- "sidebar.docs.category.G.link.generated-index.title": {
- "message": "G",
- "description": "The generated-index page title for category G in sidebar docs"
- },
- "sidebar.docs.category.I": {
- "message": "I",
- "description": "The label for category I in sidebar docs"
- },
- "sidebar.docs.category.I.link.generated-index.title": {
- "message": "I",
- "description": "The generated-index page title for category I in sidebar docs"
- },
- "sidebar.docs.category.M": {
- "message": "M",
- "description": "The label for category M in sidebar docs"
- },
- "sidebar.docs.category.M.link.generated-index.title": {
- "message": "M",
- "description": "The generated-index page title for category M in sidebar docs"
- },
- "sidebar.docs.category.N": {
- "message": "N",
- "description": "The label for category N in sidebar docs"
- },
- "sidebar.docs.category.N.link.generated-index.title": {
- "message": "N",
- "description": "The generated-index page title for category N in sidebar docs"
- },
- "sidebar.docs.category.O": {
- "message": "O",
- "description": "The label for category O in sidebar docs"
- },
- "sidebar.docs.category.O.link.generated-index.title": {
- "message": "O",
- "description": "The generated-index page title for category O in sidebar docs"
- },
- "sidebar.docs.category.P": {
- "message": "P",
- "description": "The label for category P in sidebar docs"
- },
- "sidebar.docs.category.P.link.generated-index.title": {
- "message": "P",
- "description": "The generated-index page title for category P in sidebar docs"
- },
- "sidebar.docs.category.R": {
- "message": "R",
- "description": "The label for category R in sidebar docs"
- },
- "sidebar.docs.category.R.link.generated-index.title": {
- "message": "R",
- "description": "The generated-index page title for category R in sidebar docs"
- },
- "sidebar.docs.category.S": {
- "message": "S",
- "description": "The label for category S in sidebar docs"
- },
- "sidebar.docs.category.S.link.generated-index.title": {
- "message": "S",
- "description": "The generated-index page title for category S in sidebar docs"
- },
- "sidebar.docs.category.4D Write Pro": {
- "message": "4D Write Pro",
- "description": "The label for category 4D Write Pro in sidebar docs"
- },
- "sidebar.docs.category.4D Write Pro.link.generated-index.title": {
- "message": "4D Write Pro",
- "description": "The generated-index page title for category 4D Write Pro in sidebar docs"
- },
- "sidebar.docs.category.Web Applications": {
- "message": "Web Applications",
- "description": "The label for category Web Applications in sidebar docs"
- },
- "sidebar.docs.category.Web Applications.link.generated-index.title": {
- "message": "Web Applications",
- "description": "The generated-index page title for category Web Applications in sidebar docs"
- },
- "sidebar.docs.category.Web Applications.link.generated-index.description": {
- "message": "Guides for developing Web applications with 4D",
- "description": "The generated-index page description for category Web Applications in sidebar docs"
- },
- "sidebar.docs.category.Web Development": {
- "message": "Web Development",
- "description": "The label for category Web Development in sidebar docs"
- },
- "sidebar.docs.category.Qodly Studio": {
- "message": "Qodly Studio",
- "description": "The label for category Qodly Studio in sidebar docs"
- },
- "sidebar.docs.category.Qodly Studio.link.generated-index.title": {
- "message": "Qodly Studio",
- "description": "The generated-index page title for category Qodly Studio in sidebar docs"
- },
- "sidebar.docs.category.Qodly Studio.link.generated-index.description": {
- "message": "Using Qodly Studio to build powerful web interfaces.",
- "description": "The generated-index page description for category Qodly Studio in sidebar docs"
- },
- "sidebar.docs.category.REST API": {
- "message": "REST API",
- "description": "The label for category REST API in sidebar docs"
- },
- "sidebar.docs.category.REST API.link.generated-index.title": {
- "message": "REST API",
- "description": "The generated-index page title for category REST API in sidebar docs"
- },
- "sidebar.docs.category.REST API.link.generated-index.description": {
- "message": "Exposing your datastore to REST and using the REST API.",
- "description": "The generated-index page description for category REST API in sidebar docs"
- },
- "sidebar.docs.category.Exposing your datastore in REST": {
- "message": "Exposing your datastore in REST",
- "description": "The label for category Exposing your datastore in REST in sidebar docs"
- },
- "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.title": {
- "message": "Exposing your datastore in REST",
- "description": "The generated-index page title for category Exposing your datastore in REST in sidebar docs"
- },
- "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.description": {
- "message": "Configure your datastore for REST access",
- "description": "The generated-index page description for category Exposing your datastore in REST in sidebar docs"
- },
- "sidebar.docs.category.API (general)": {
- "message": "API (general)",
- "description": "The label for category API (general) in sidebar docs"
- },
- "sidebar.docs.category.API (general).link.generated-index.title": {
- "message": "API (general)",
- "description": "The generated-index page title for category API (general) in sidebar docs"
- },
- "sidebar.docs.category.API (general).link.generated-index.description": {
- "message": "REST API for global information",
- "description": "The generated-index page description for category API (general) in sidebar docs"
- },
- "sidebar.docs.category.API (dataClass)": {
- "message": "API (dataClass)",
- "description": "The label for category API (dataClass) in sidebar docs"
- },
- "sidebar.docs.category.API (dataClass).link.generated-index.title": {
- "message": "API (dataClass)",
- "description": "The generated-index page title for category API (dataClass) in sidebar docs"
- },
- "sidebar.docs.category.API (dataClass).link.generated-index.description": {
- "message": "REST API for dataClass.",
- "description": "The generated-index page description for category API (dataClass) in sidebar docs"
- },
- "sidebar.docs.category.Desktop Applications": {
- "message": "Desktop Applications",
- "description": "The label for category Desktop Applications in sidebar docs"
- },
- "sidebar.docs.category.Desktop Applications.link.generated-index.title": {
- "message": "Desktop Applications",
- "description": "The generated-index page title for category Desktop Applications in sidebar docs"
- },
- "sidebar.docs.category.Desktop Applications.link.generated-index.description": {
- "message": "Guides for developing Desktop applications with 4D",
- "description": "The generated-index page description for category Desktop Applications in sidebar docs"
- },
- "sidebar.docs.category.Access Rights": {
- "message": "Access Rights",
- "description": "The label for category Access Rights in sidebar docs"
- },
- "sidebar.docs.category.Access Rights.link.generated-index.title": {
- "message": "Access Rights",
- "description": "The generated-index page title for category Access Rights in sidebar docs"
- },
- "sidebar.docs.category.Access Rights.link.generated-index.description": {
- "message": "Access control and user privileges for desktop applications.",
- "description": "The generated-index page description for category Access Rights in sidebar docs"
- },
- "sidebar.docs.category.Form Editor": {
- "message": "Form Editor",
- "description": "The label for category Form Editor in sidebar docs"
- },
- "sidebar.docs.category.Form Properties": {
- "message": "Form Properties",
- "description": "The label for category Form Properties in sidebar docs"
- },
- "sidebar.docs.category.Form Objects": {
- "message": "Form Objects",
- "description": "The label for category Form Objects in sidebar docs"
- },
- "sidebar.docs.category.Form Object Properties": {
- "message": "Form Object Properties",
- "description": "The label for category Form Object Properties in sidebar docs"
- },
- "sidebar.docs.category.Mobile Applications": {
- "message": "Mobile Applications",
- "description": "The label for category Mobile Applications in sidebar docs"
- },
- "sidebar.docs.link.4D Mobile App Server": {
- "message": "4D Mobile App Server",
- "description": "The label for link 4D Mobile App Server in sidebar docs, linking to https://github.com/4d-go-mobile/4D-Mobile-App-Server"
- },
- "sidebar.docs.link.4D NetKit": {
- "message": "4D NetKit",
- "description": "The label for link 4D NetKit in sidebar docs, linking to https://developer.4d.com/4D-NetKit"
- },
- "sidebar.docs.link.4D Progress": {
- "message": "4D Progress",
- "description": "The label for link 4D Progress in sidebar docs, linking to https://doc.4d.com/4Dv20R8/4D/20-R8/4D-Progress.100-7476284.en.html"
- },
- "sidebar.docs.link.4D SVG": {
- "message": "4D SVG",
- "description": "The label for link 4D SVG in sidebar docs, linking to https://doc.4d.com/4Dv20R8/4D/20-R8/4D-SVG-Component.100-7477155.en.html"
- },
- "sidebar.docs.link.4D Widgets": {
- "message": "4D Widgets",
- "description": "The label for link 4D Widgets in sidebar docs, linking to https://doc.4d.com/4Dv20R8/4D/20-R8/4D-Widgets.100-7477804.en.html"
- },
- "sidebar.docs.link.Go Mobile": {
- "message": "Go Mobile",
- "description": "The label for link Go Mobile in sidebar docs, linking to https://developer.4d.com/go-mobile/"
- },
- "sidebar.docs.link.4D for iOS (archive)": {
- "message": "4D for iOS (archive)",
- "description": "The label for link 4D for iOS (archive) in sidebar docs, linking to https://developer.4d.com/4d-for-ios"
- },
- "sidebar.docs.doc.Command Line Interface": {
- "message": "Command Line Interface",
- "description": "The label for the doc item Command Line Interface in sidebar docs, linking to the doc Admin/cli"
- },
- "sidebar.docs.doc.TLS Protocol": {
- "message": "TLS Protocol",
- "description": "The label for the doc item TLS Protocol in sidebar docs, linking to the doc Admin/tls"
- },
- "sidebar.docs.doc.Managing 4D Licenses": {
- "message": "Managing 4D Licenses",
- "description": "The label for the doc item Managing 4D Licenses in sidebar docs, linking to the doc Admin/licenses"
- },
- "sidebar.docs.doc.Data Collection": {
- "message": "Data Collection",
- "description": "The label for the doc item Data Collection in sidebar docs, linking to the doc Admin/data-collect"
- },
- "sidebar.docs.doc.Client/Server": {
- "message": "Client/Server",
- "description": "The label for the doc item Client/Server in sidebar docs, linking to the doc Desktop/clientServer"
- },
- "sidebar.docs.doc.User Settings": {
- "message": "User Settings",
- "description": "The label for the doc item User Settings in sidebar docs, linking to the doc Desktop/user-settings"
- },
- "sidebar.docs.doc.Build Application": {
- "message": "Build Application",
- "description": "The label for the doc item Build Application in sidebar docs, linking to the doc Desktop/building"
- }
-}
diff --git a/i18n/en/docusaurus-plugin-content-docs/version-20-R9.json b/i18n/en/docusaurus-plugin-content-docs/version-20-R9.json
deleted file mode 100644
index 6bc20d300d6f76..00000000000000
--- a/i18n/en/docusaurus-plugin-content-docs/version-20-R9.json
+++ /dev/null
@@ -1,742 +0,0 @@
-{
- "version.label": {
- "message": "20 R9",
- "description": "The label for version 20-R9"
- },
- "sidebar.docs.category.Getting Started": {
- "message": "Getting Started",
- "description": "The label for category Getting Started in sidebar docs"
- },
- "sidebar.docs.category.Getting Started.link.generated-index.title": {
- "message": "Getting Started",
- "description": "The generated-index page title for category Getting Started in sidebar docs"
- },
- "sidebar.docs.category.Core Development": {
- "message": "Core Development",
- "description": "The label for category Core Development in sidebar docs"
- },
- "sidebar.docs.category.Core Development.link.generated-index.title": {
- "message": "Core Development",
- "description": "The generated-index page title for category Core Development in sidebar docs"
- },
- "sidebar.docs.category.Project Management": {
- "message": "Project Management",
- "description": "The label for category Project Management in sidebar docs"
- },
- "sidebar.docs.category.Settings": {
- "message": "Settings",
- "description": "The label for category Settings in sidebar docs"
- },
- "sidebar.docs.category.Development Environment": {
- "message": "Development Environment",
- "description": "The label for category Development Environment in sidebar docs"
- },
- "sidebar.docs.category.Debugging": {
- "message": "Debugging",
- "description": "The label for category Debugging in sidebar docs"
- },
- "sidebar.docs.category.ORDA": {
- "message": "ORDA",
- "description": "The label for category ORDA in sidebar docs"
- },
- "sidebar.docs.category.Processes": {
- "message": "Processes",
- "description": "The label for category Processes in sidebar docs"
- },
- "sidebar.docs.category.Preferences": {
- "message": "Preferences",
- "description": "The label for category Preferences in sidebar docs"
- },
- "sidebar.docs.category.4D Language": {
- "message": "4D Language",
- "description": "The label for category 4D Language in sidebar docs"
- },
- "sidebar.docs.category.4D Language.link.generated-index.title": {
- "message": "4D Language",
- "description": "The generated-index page title for category 4D Language in sidebar docs"
- },
- "sidebar.docs.category.Concepts": {
- "message": "Concepts",
- "description": "The label for category Concepts in sidebar docs"
- },
- "sidebar.docs.category.Data Types": {
- "message": "Data Types",
- "description": "The label for category Data Types in sidebar docs"
- },
- "sidebar.docs.category.Commands": {
- "message": "Commands",
- "description": "The label for category Commands in sidebar docs"
- },
- "sidebar.docs.category.Commands.link.generated-index.title": {
- "message": "Commands",
- "description": "The generated-index page title for category Commands in sidebar docs"
- },
- "sidebar.docs.category.4D Environment": {
- "message": "4D Environment",
- "description": "The label for category 4D Environment in sidebar docs"
- },
- "sidebar.docs.category.Arrays": {
- "message": "Arrays",
- "description": "The label for category Arrays in sidebar docs"
- },
- "sidebar.docs.category.Backup": {
- "message": "Backup",
- "description": "The label for category Backup in sidebar docs"
- },
- "sidebar.docs.category.BLOB": {
- "message": "BLOB",
- "description": "The label for category BLOB in sidebar docs"
- },
- "sidebar.docs.category.Boolean": {
- "message": "Boolean",
- "description": "The label for category Boolean in sidebar docs"
- },
- "sidebar.docs.category.Cache Management": {
- "message": "Cache Management",
- "description": "The label for category Cache Management in sidebar docs"
- },
- "sidebar.docs.category.Collections": {
- "message": "Collections",
- "description": "The label for category Collections in sidebar docs"
- },
- "sidebar.docs.category.Communications": {
- "message": "Communications",
- "description": "The label for category Communications in sidebar docs"
- },
- "sidebar.docs.category.Compiler": {
- "message": "Compiler",
- "description": "The label for category Compiler in sidebar docs"
- },
- "sidebar.docs.category.Data Entry": {
- "message": "Data Entry",
- "description": "The label for category Data Entry in sidebar docs"
- },
- "sidebar.docs.category.Data Security": {
- "message": "Data Security",
- "description": "The label for category Data Security in sidebar docs"
- },
- "sidebar.docs.category.Database Methods": {
- "message": "Database Methods",
- "description": "The label for category Database Methods in sidebar docs"
- },
- "sidebar.docs.category.Date and Time": {
- "message": "Date and Time",
- "description": "The label for category Date and Time in sidebar docs"
- },
- "sidebar.docs.category.Design Object Access": {
- "message": "Design Object Access",
- "description": "The label for category Design Object Access in sidebar docs"
- },
- "sidebar.docs.category.Drag and Drop": {
- "message": "Drag and Drop",
- "description": "The label for category Drag and Drop in sidebar docs"
- },
- "sidebar.docs.category.Entry Control": {
- "message": "Entry Control",
- "description": "The label for category Entry Control in sidebar docs"
- },
- "sidebar.docs.category.File and Folder": {
- "message": "File and Folder",
- "description": "The label for category File and Folder in sidebar docs"
- },
- "sidebar.docs.category.Form Events": {
- "message": "Form Events",
- "description": "The label for category Form Events in sidebar docs"
- },
- "sidebar.docs.category.Forms": {
- "message": "Forms",
- "description": "The label for category Forms in sidebar docs"
- },
- "sidebar.docs.category.Formulas": {
- "message": "Formulas",
- "description": "The label for category Formulas in sidebar docs"
- },
- "sidebar.docs.category.Graphs": {
- "message": "Graphs",
- "description": "The label for category Graphs in sidebar docs"
- },
- "sidebar.docs.category.HTTP": {
- "message": "HTTP",
- "description": "The label for category HTTP in sidebar docs"
- },
- "sidebar.docs.category.Hierarchical Lists": {
- "message": "Hierarchical Lists",
- "description": "The label for category Hierarchical Lists in sidebar docs"
- },
- "sidebar.docs.category.Import and Export": {
- "message": "Import and Export",
- "description": "The label for category Import and Export in sidebar docs"
- },
- "sidebar.docs.category.Interruptions": {
- "message": "Interruptions",
- "description": "The label for category Interruptions in sidebar docs"
- },
- "sidebar.docs.category.JSON": {
- "message": "JSON",
- "description": "The label for category JSON in sidebar docs"
- },
- "sidebar.docs.category.LDAP": {
- "message": "LDAP",
- "description": "The label for category LDAP in sidebar docs"
- },
- "sidebar.docs.category.Language": {
- "message": "Language",
- "description": "The label for category Language in sidebar docs"
- },
- "sidebar.docs.category.Licenses": {
- "message": "Licenses",
- "description": "The label for category Licenses in sidebar docs"
- },
- "sidebar.docs.category.List Box": {
- "message": "List Box",
- "description": "The label for category List Box in sidebar docs"
- },
- "sidebar.docs.category.Mail": {
- "message": "Mail",
- "description": "The label for category Mail in sidebar docs"
- },
- "sidebar.docs.category.Math": {
- "message": "Math",
- "description": "The label for category Math in sidebar docs"
- },
- "sidebar.docs.category.Menus": {
- "message": "Menus",
- "description": "The label for category Menus in sidebar docs"
- },
- "sidebar.docs.category.Messages": {
- "message": "Messages",
- "description": "The label for category Messages in sidebar docs"
- },
- "sidebar.docs.category.Named Selections": {
- "message": "Named Selections",
- "description": "The label for category Named Selections in sidebar docs"
- },
- "sidebar.docs.category.Objects (Forms)": {
- "message": "Objects (Forms)",
- "description": "The label for category Objects (Forms) in sidebar docs"
- },
- "sidebar.docs.category.Objects (Language)": {
- "message": "Objects (Language)",
- "description": "The label for category Objects (Language) in sidebar docs"
- },
- "sidebar.docs.category.On a Series": {
- "message": "On a Series",
- "description": "The label for category On a Series in sidebar docs"
- },
- "sidebar.docs.category.PHP": {
- "message": "PHP",
- "description": "The label for category PHP in sidebar docs"
- },
- "sidebar.docs.category.Pasteboard": {
- "message": "Pasteboard",
- "description": "The label for category Pasteboard in sidebar docs"
- },
- "sidebar.docs.category.Pictures": {
- "message": "Pictures",
- "description": "The label for category Pictures in sidebar docs"
- },
- "sidebar.docs.category.Printing": {
- "message": "Printing",
- "description": "The label for category Printing in sidebar docs"
- },
- "sidebar.docs.category.Process (Communications)": {
- "message": "Process (Communications)",
- "description": "The label for category Process (Communications) in sidebar docs"
- },
- "sidebar.docs.category.Process (User Interface)": {
- "message": "Process (User Interface)",
- "description": "The label for category Process (User Interface) in sidebar docs"
- },
- "sidebar.docs.category.Queries": {
- "message": "Queries",
- "description": "The label for category Queries in sidebar docs"
- },
- "sidebar.docs.category.Quick Report": {
- "message": "Quick Report",
- "description": "The label for category Quick Report in sidebar docs"
- },
- "sidebar.docs.category.Record Locking": {
- "message": "Record Locking",
- "description": "The label for category Record Locking in sidebar docs"
- },
- "sidebar.docs.category.Records": {
- "message": "Records",
- "description": "The label for category Records in sidebar docs"
- },
- "sidebar.docs.category.Relations": {
- "message": "Relations",
- "description": "The label for category Relations in sidebar docs"
- },
- "sidebar.docs.category.Resources": {
- "message": "Resources",
- "description": "The label for category Resources in sidebar docs"
- },
- "sidebar.docs.category.SQL": {
- "message": "SQL",
- "description": "The label for category SQL in sidebar docs"
- },
- "sidebar.docs.category.SVG": {
- "message": "SVG",
- "description": "The label for category SVG in sidebar docs"
- },
- "sidebar.docs.category.Secured Protocol": {
- "message": "Secured Protocol",
- "description": "The label for category Secured Protocol in sidebar docs"
- },
- "sidebar.docs.category.Selection": {
- "message": "Selection",
- "description": "The label for category Selection in sidebar docs"
- },
- "sidebar.docs.category.Sets": {
- "message": "Sets",
- "description": "The label for category Sets in sidebar docs"
- },
- "sidebar.docs.category.Spell Checker": {
- "message": "Spell Checker",
- "description": "The label for category Spell Checker in sidebar docs"
- },
- "sidebar.docs.category.String": {
- "message": "String",
- "description": "The label for category String in sidebar docs"
- },
- "sidebar.docs.category.Structure Access": {
- "message": "Structure Access",
- "description": "The label for category Structure Access in sidebar docs"
- },
- "sidebar.docs.category.Styled Text": {
- "message": "Styled Text",
- "description": "The label for category Styled Text in sidebar docs"
- },
- "sidebar.docs.category.Subrecords": {
- "message": "Subrecords",
- "description": "The label for category Subrecords in sidebar docs"
- },
- "sidebar.docs.category.System Documents": {
- "message": "System Documents",
- "description": "The label for category System Documents in sidebar docs"
- },
- "sidebar.docs.category.System Environment": {
- "message": "System Environment",
- "description": "The label for category System Environment in sidebar docs"
- },
- "sidebar.docs.category.Table": {
- "message": "Table",
- "description": "The label for category Table in sidebar docs"
- },
- "sidebar.docs.category.Tools": {
- "message": "Tools",
- "description": "The label for category Tools in sidebar docs"
- },
- "sidebar.docs.category.Transactions": {
- "message": "Transactions",
- "description": "The label for category Transactions in sidebar docs"
- },
- "sidebar.docs.category.Triggers": {
- "message": "Triggers",
- "description": "The label for category Triggers in sidebar docs"
- },
- "sidebar.docs.category.User Interface": {
- "message": "User Interface",
- "description": "The label for category User Interface in sidebar docs"
- },
- "sidebar.docs.category.Users and Groups": {
- "message": "Users and Groups",
- "description": "The label for category Users and Groups in sidebar docs"
- },
- "sidebar.docs.category.Variables": {
- "message": "Variables",
- "description": "The label for category Variables in sidebar docs"
- },
- "sidebar.docs.category.Web Area": {
- "message": "Web Area",
- "description": "The label for category Web Area in sidebar docs"
- },
- "sidebar.docs.category.Web Server": {
- "message": "Web Server",
- "description": "The label for category Web Server in sidebar docs"
- },
- "sidebar.docs.category.Web Services (Client)": {
- "message": "Web Services (Client)",
- "description": "The label for category Web Services (Client) in sidebar docs"
- },
- "sidebar.docs.category.Web Services (Server)": {
- "message": "Web Services (Server)",
- "description": "The label for category Web Services (Server) in sidebar docs"
- },
- "sidebar.docs.category.Windows": {
- "message": "Windows",
- "description": "The label for category Windows in sidebar docs"
- },
- "sidebar.docs.category.XML DOM": {
- "message": "XML DOM",
- "description": "The label for category XML DOM in sidebar docs"
- },
- "sidebar.docs.category.XML SAX": {
- "message": "XML SAX",
- "description": "The label for category XML SAX in sidebar docs"
- },
- "sidebar.docs.category.XML": {
- "message": "XML",
- "description": "The label for category XML in sidebar docs"
- },
- "sidebar.docs.category.Classes": {
- "message": "Classes",
- "description": "The label for category Classes in sidebar docs"
- },
- "sidebar.docs.category.Classes.link.generated-index.title": {
- "message": "Class Functions",
- "description": "The generated-index page title for category Classes in sidebar docs"
- },
- "sidebar.docs.category.Classes.link.generated-index.description": {
- "message": "List of built-in 4D classes",
- "description": "The generated-index page description for category Classes in sidebar docs"
- },
- "sidebar.docs.category.Administration": {
- "message": "Administration",
- "description": "The label for category Administration in sidebar docs"
- },
- "sidebar.docs.category.Administration.link.generated-index.title": {
- "message": "Administration",
- "description": "The generated-index page title for category Administration in sidebar docs"
- },
- "sidebar.docs.category.Administration.link.generated-index.description": {
- "message": "How to monitor your 4D applications",
- "description": "The generated-index page description for category Administration in sidebar docs"
- },
- "sidebar.docs.category.4D Server Administration Window": {
- "message": "4D Server Administration Window",
- "description": "The label for category 4D Server Administration Window in sidebar docs"
- },
- "sidebar.docs.category.Web Administration": {
- "message": "Web Administration",
- "description": "The label for category Web Administration in sidebar docs"
- },
- "sidebar.docs.category.Web Administration.link.generated-index.title": {
- "message": "Web Administration",
- "description": "The generated-index page title for category Web Administration in sidebar docs"
- },
- "sidebar.docs.category.Web Administration.link.generated-index.description": {
- "message": "4D web tools for administrating and monitoring your applications.",
- "description": "The generated-index page description for category Web Administration in sidebar docs"
- },
- "sidebar.docs.category.MSC": {
- "message": "MSC",
- "description": "The label for category MSC in sidebar docs"
- },
- "sidebar.docs.category.Backup and Restore": {
- "message": "Backup and Restore",
- "description": "The label for category Backup and Restore in sidebar docs"
- },
- "sidebar.docs.category.Extensions": {
- "message": "Extensions",
- "description": "The label for category Extensions in sidebar docs"
- },
- "sidebar.docs.category.4D View Pro": {
- "message": "4D View Pro",
- "description": "The label for category 4D View Pro in sidebar docs"
- },
- "sidebar.docs.category.4D View Pro.link.generated-index.title": {
- "message": "4D View Pro",
- "description": "The generated-index page title for category 4D View Pro in sidebar docs"
- },
- "sidebar.docs.category.A": {
- "message": "A",
- "description": "The label for category A in sidebar docs"
- },
- "sidebar.docs.category.A.link.generated-index.title": {
- "message": "A",
- "description": "The generated-index page title for category A in sidebar docs"
- },
- "sidebar.docs.category.C": {
- "message": "C",
- "description": "The label for category C in sidebar docs"
- },
- "sidebar.docs.category.C.link.generated-index.title": {
- "message": "C",
- "description": "The generated-index page title for category C in sidebar docs"
- },
- "sidebar.docs.category.D": {
- "message": "D",
- "description": "The label for category D in sidebar docs"
- },
- "sidebar.docs.category.D.link.generated-index.title": {
- "message": "D",
- "description": "The generated-index page title for category D in sidebar docs"
- },
- "sidebar.docs.category.E": {
- "message": "E",
- "description": "The label for category E in sidebar docs"
- },
- "sidebar.docs.category.E.link.generated-index.title": {
- "message": "E",
- "description": "The generated-index page title for category E in sidebar docs"
- },
- "sidebar.docs.category.F": {
- "message": "F",
- "description": "The label for category F in sidebar docs"
- },
- "sidebar.docs.category.F.link.generated-index.title": {
- "message": "F",
- "description": "The generated-index page title for category F in sidebar docs"
- },
- "sidebar.docs.category.G": {
- "message": "G",
- "description": "The label for category G in sidebar docs"
- },
- "sidebar.docs.category.G.link.generated-index.title": {
- "message": "G",
- "description": "The generated-index page title for category G in sidebar docs"
- },
- "sidebar.docs.category.I": {
- "message": "I",
- "description": "The label for category I in sidebar docs"
- },
- "sidebar.docs.category.I.link.generated-index.title": {
- "message": "I",
- "description": "The generated-index page title for category I in sidebar docs"
- },
- "sidebar.docs.category.M": {
- "message": "M",
- "description": "The label for category M in sidebar docs"
- },
- "sidebar.docs.category.M.link.generated-index.title": {
- "message": "M",
- "description": "The generated-index page title for category M in sidebar docs"
- },
- "sidebar.docs.category.N": {
- "message": "N",
- "description": "The label for category N in sidebar docs"
- },
- "sidebar.docs.category.N.link.generated-index.title": {
- "message": "N",
- "description": "The generated-index page title for category N in sidebar docs"
- },
- "sidebar.docs.category.O": {
- "message": "O",
- "description": "The label for category O in sidebar docs"
- },
- "sidebar.docs.category.O.link.generated-index.title": {
- "message": "O",
- "description": "The generated-index page title for category O in sidebar docs"
- },
- "sidebar.docs.category.P": {
- "message": "P",
- "description": "The label for category P in sidebar docs"
- },
- "sidebar.docs.category.P.link.generated-index.title": {
- "message": "P",
- "description": "The generated-index page title for category P in sidebar docs"
- },
- "sidebar.docs.category.R": {
- "message": "R",
- "description": "The label for category R in sidebar docs"
- },
- "sidebar.docs.category.R.link.generated-index.title": {
- "message": "R",
- "description": "The generated-index page title for category R in sidebar docs"
- },
- "sidebar.docs.category.S": {
- "message": "S",
- "description": "The label for category S in sidebar docs"
- },
- "sidebar.docs.category.S.link.generated-index.title": {
- "message": "S",
- "description": "The generated-index page title for category S in sidebar docs"
- },
- "sidebar.docs.category.4D Write Pro": {
- "message": "4D Write Pro",
- "description": "The label for category 4D Write Pro in sidebar docs"
- },
- "sidebar.docs.category.4D Write Pro.link.generated-index.title": {
- "message": "4D Write Pro",
- "description": "The generated-index page title for category 4D Write Pro in sidebar docs"
- },
- "sidebar.docs.category.4D AIKit": {
- "message": "4D AIKit",
- "description": "The label for category 4D AIKit in sidebar docs"
- },
- "sidebar.docs.category.4D AIKit.link.generated-index.title": {
- "message": "4D AIKit",
- "description": "The generated-index page title for category 4D AIKit in sidebar docs"
- },
- "sidebar.docs.category.Web Applications": {
- "message": "Web Applications",
- "description": "The label for category Web Applications in sidebar docs"
- },
- "sidebar.docs.category.Web Applications.link.generated-index.title": {
- "message": "Web Applications",
- "description": "The generated-index page title for category Web Applications in sidebar docs"
- },
- "sidebar.docs.category.Web Applications.link.generated-index.description": {
- "message": "Guides for developing Web applications with 4D",
- "description": "The generated-index page description for category Web Applications in sidebar docs"
- },
- "sidebar.docs.category.Web Development": {
- "message": "Web Development",
- "description": "The label for category Web Development in sidebar docs"
- },
- "sidebar.docs.category.Qodly Studio": {
- "message": "Qodly Studio",
- "description": "The label for category Qodly Studio in sidebar docs"
- },
- "sidebar.docs.category.Qodly Studio.link.generated-index.title": {
- "message": "Qodly Studio",
- "description": "The generated-index page title for category Qodly Studio in sidebar docs"
- },
- "sidebar.docs.category.Qodly Studio.link.generated-index.description": {
- "message": "Using Qodly Studio to build powerful web interfaces.",
- "description": "The generated-index page description for category Qodly Studio in sidebar docs"
- },
- "sidebar.docs.category.REST API": {
- "message": "REST API",
- "description": "The label for category REST API in sidebar docs"
- },
- "sidebar.docs.category.REST API.link.generated-index.title": {
- "message": "REST API",
- "description": "The generated-index page title for category REST API in sidebar docs"
- },
- "sidebar.docs.category.REST API.link.generated-index.description": {
- "message": "Exposing your datastore to REST and using the REST API.",
- "description": "The generated-index page description for category REST API in sidebar docs"
- },
- "sidebar.docs.category.Exposing your datastore in REST": {
- "message": "Exposing your datastore in REST",
- "description": "The label for category Exposing your datastore in REST in sidebar docs"
- },
- "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.title": {
- "message": "Exposing your datastore in REST",
- "description": "The generated-index page title for category Exposing your datastore in REST in sidebar docs"
- },
- "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.description": {
- "message": "Configure your datastore for REST access",
- "description": "The generated-index page description for category Exposing your datastore in REST in sidebar docs"
- },
- "sidebar.docs.category.API (general)": {
- "message": "API (general)",
- "description": "The label for category API (general) in sidebar docs"
- },
- "sidebar.docs.category.API (general).link.generated-index.title": {
- "message": "API (general)",
- "description": "The generated-index page title for category API (general) in sidebar docs"
- },
- "sidebar.docs.category.API (general).link.generated-index.description": {
- "message": "REST API for global information",
- "description": "The generated-index page description for category API (general) in sidebar docs"
- },
- "sidebar.docs.category.API (dataClass)": {
- "message": "API (dataClass)",
- "description": "The label for category API (dataClass) in sidebar docs"
- },
- "sidebar.docs.category.API (dataClass).link.generated-index.title": {
- "message": "API (dataClass)",
- "description": "The generated-index page title for category API (dataClass) in sidebar docs"
- },
- "sidebar.docs.category.API (dataClass).link.generated-index.description": {
- "message": "REST API for dataClass.",
- "description": "The generated-index page description for category API (dataClass) in sidebar docs"
- },
- "sidebar.docs.category.Desktop Applications": {
- "message": "Desktop Applications",
- "description": "The label for category Desktop Applications in sidebar docs"
- },
- "sidebar.docs.category.Desktop Applications.link.generated-index.title": {
- "message": "Desktop Applications",
- "description": "The generated-index page title for category Desktop Applications in sidebar docs"
- },
- "sidebar.docs.category.Desktop Applications.link.generated-index.description": {
- "message": "Guides for developing Desktop applications with 4D",
- "description": "The generated-index page description for category Desktop Applications in sidebar docs"
- },
- "sidebar.docs.category.Access Rights": {
- "message": "Access Rights",
- "description": "The label for category Access Rights in sidebar docs"
- },
- "sidebar.docs.category.Access Rights.link.generated-index.title": {
- "message": "Access Rights",
- "description": "The generated-index page title for category Access Rights in sidebar docs"
- },
- "sidebar.docs.category.Access Rights.link.generated-index.description": {
- "message": "Access control and user privileges for desktop applications.",
- "description": "The generated-index page description for category Access Rights in sidebar docs"
- },
- "sidebar.docs.category.Form Editor": {
- "message": "Form Editor",
- "description": "The label for category Form Editor in sidebar docs"
- },
- "sidebar.docs.category.Form Properties": {
- "message": "Form Properties",
- "description": "The label for category Form Properties in sidebar docs"
- },
- "sidebar.docs.category.Form Objects": {
- "message": "Form Objects",
- "description": "The label for category Form Objects in sidebar docs"
- },
- "sidebar.docs.category.Form Object Properties": {
- "message": "Form Object Properties",
- "description": "The label for category Form Object Properties in sidebar docs"
- },
- "sidebar.docs.category.Mobile Applications": {
- "message": "Mobile Applications",
- "description": "The label for category Mobile Applications in sidebar docs"
- },
- "sidebar.docs.link.4D Mobile App Server": {
- "message": "4D Mobile App Server",
- "description": "The label for link 4D Mobile App Server in sidebar docs, linking to https://github.com/4d-go-mobile/4D-Mobile-App-Server"
- },
- "sidebar.docs.link.4D NetKit": {
- "message": "4D NetKit",
- "description": "The label for link 4D NetKit in sidebar docs, linking to https://developer.4d.com/4D-NetKit"
- },
- "sidebar.docs.link.4D Progress": {
- "message": "4D Progress",
- "description": "The label for link 4D Progress in sidebar docs, linking to https://doc.4d.com/4Dv20R9/4D/20-R9/4D-Progress.100-7545461.en.html"
- },
- "sidebar.docs.link.4D SVG": {
- "message": "4D SVG",
- "description": "The label for link 4D SVG in sidebar docs, linking to https://doc.4d.com/4Dv20R9/4D/20-R9/4D-SVG-Component.100-7546332.en.html"
- },
- "sidebar.docs.link.4D Widgets": {
- "message": "4D Widgets",
- "description": "The label for link 4D Widgets in sidebar docs, linking to https://doc.4d.com/4Dv20R9/4D/20-R9/4D-Widgets.100-7546981.en.html"
- },
- "sidebar.docs.link.Go Mobile": {
- "message": "Go Mobile",
- "description": "The label for link Go Mobile in sidebar docs, linking to https://developer.4d.com/go-mobile/"
- },
- "sidebar.docs.link.4D for iOS (archive)": {
- "message": "4D for iOS (archive)",
- "description": "The label for link 4D for iOS (archive) in sidebar docs, linking to https://developer.4d.com/4d-for-ios"
- },
- "sidebar.docs.doc.Command Line Interface": {
- "message": "Command Line Interface",
- "description": "The label for the doc item Command Line Interface in sidebar docs, linking to the doc Admin/cli"
- },
- "sidebar.docs.doc.TLS Protocol": {
- "message": "TLS Protocol",
- "description": "The label for the doc item TLS Protocol in sidebar docs, linking to the doc Admin/tls"
- },
- "sidebar.docs.doc.Licenses": {
- "message": "Licenses",
- "description": "The label for the doc item Licenses in sidebar docs, linking to the doc Admin/licenses"
- },
- "sidebar.docs.doc.Data Collection": {
- "message": "Data Collection",
- "description": "The label for the doc item Data Collection in sidebar docs, linking to the doc Admin/data-collect"
- },
- "sidebar.docs.doc.Client/Server": {
- "message": "Client/Server",
- "description": "The label for the doc item Client/Server in sidebar docs, linking to the doc Desktop/clientServer"
- },
- "sidebar.docs.doc.User Settings": {
- "message": "User Settings",
- "description": "The label for the doc item User Settings in sidebar docs, linking to the doc Desktop/user-settings"
- },
- "sidebar.docs.doc.Build Application": {
- "message": "Build Application",
- "description": "The label for the doc item Build Application in sidebar docs, linking to the doc Desktop/building"
- },
- "sidebar.docs.doc.Labels": {
- "message": "Labels",
- "description": "The label for the doc item Labels in sidebar docs, linking to the doc Desktop/labels"
- }
-}
diff --git a/i18n/en/docusaurus-plugin-content-docs/version-21.json b/i18n/en/docusaurus-plugin-content-docs/version-21.json
new file mode 100644
index 00000000000000..330a54ac2a4f0e
--- /dev/null
+++ b/i18n/en/docusaurus-plugin-content-docs/version-21.json
@@ -0,0 +1,478 @@
+{
+ "version.label": {
+ "message": "21 BETA",
+ "description": "The label for version 21"
+ },
+ "sidebar.docs.category.Getting Started": {
+ "message": "Getting Started",
+ "description": "The label for category Getting Started in sidebar docs"
+ },
+ "sidebar.docs.category.Getting Started.link.generated-index.title": {
+ "message": "Getting Started",
+ "description": "The generated-index page title for category Getting Started in sidebar docs"
+ },
+ "sidebar.docs.category.Project & IDE": {
+ "message": "Project & IDE",
+ "description": "The label for category Project & IDE in sidebar docs"
+ },
+ "sidebar.docs.category.Project & IDE.link.generated-index.title": {
+ "message": "Project & IDE",
+ "description": "The generated-index page title for category Project & IDE in sidebar docs"
+ },
+ "sidebar.docs.category.Dababase structure": {
+ "message": "Dababase structure",
+ "description": "The label for category Dababase structure in sidebar docs"
+ },
+ "sidebar.docs.category.Code & Methods": {
+ "message": "Code & Methods",
+ "description": "The label for category Code & Methods in sidebar docs"
+ },
+ "sidebar.docs.category.Settings": {
+ "message": "Settings",
+ "description": "The label for category Settings in sidebar docs"
+ },
+ "sidebar.docs.category.Debugging": {
+ "message": "Debugging",
+ "description": "The label for category Debugging in sidebar docs"
+ },
+ "sidebar.docs.category.Application Preferences": {
+ "message": "Application Preferences",
+ "description": "The label for category Application Preferences in sidebar docs"
+ },
+ "sidebar.docs.category.4D Language": {
+ "message": "4D Language",
+ "description": "The label for category 4D Language in sidebar docs"
+ },
+ "sidebar.docs.category.4D Language.link.generated-index.title": {
+ "message": "4D Language",
+ "description": "The generated-index page title for category 4D Language in sidebar docs"
+ },
+ "sidebar.docs.category.Concepts": {
+ "message": "Concepts",
+ "description": "The label for category Concepts in sidebar docs"
+ },
+ "sidebar.docs.category.Data Types": {
+ "message": "Data Types",
+ "description": "The label for category Data Types in sidebar docs"
+ },
+ "sidebar.docs.category.Commands by theme": {
+ "message": "Commands by theme",
+ "description": "The label for category Commands by theme in sidebar docs"
+ },
+ "sidebar.docs.category.Classes": {
+ "message": "Classes",
+ "description": "The label for category Classes in sidebar docs"
+ },
+ "sidebar.docs.category.Classes.link.generated-index.title": {
+ "message": "Classes",
+ "description": "The generated-index page title for category Classes in sidebar docs"
+ },
+ "sidebar.docs.category.Classes.link.generated-index.description": {
+ "message": "List of built-in 4D classes",
+ "description": "The generated-index page description for category Classes in sidebar docs"
+ },
+ "sidebar.docs.category.Core Development": {
+ "message": "Core Development",
+ "description": "The label for category Core Development in sidebar docs"
+ },
+ "sidebar.docs.category.Core Development.link.generated-index.title": {
+ "message": "Core Development",
+ "description": "The generated-index page title for category Core Development in sidebar docs"
+ },
+ "sidebar.docs.category.ORDA": {
+ "message": "ORDA",
+ "description": "The label for category ORDA in sidebar docs"
+ },
+ "sidebar.docs.category.Processes": {
+ "message": "Processes",
+ "description": "The label for category Processes in sidebar docs"
+ },
+ "sidebar.docs.category.Processes.link.generated-index.title": {
+ "message": "Processes",
+ "description": "The generated-index page title for category Processes in sidebar docs"
+ },
+ "sidebar.docs.category.Database Methods": {
+ "message": "Database Methods",
+ "description": "The label for category Database Methods in sidebar docs"
+ },
+ "sidebar.docs.category.Database Methods.link.generated-index.title": {
+ "message": "Database Methods",
+ "description": "The generated-index page title for category Database Methods in sidebar docs"
+ },
+ "sidebar.docs.category.Web Applications": {
+ "message": "Web Applications",
+ "description": "The label for category Web Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Web Applications.link.generated-index.title": {
+ "message": "Web Applications",
+ "description": "The generated-index page title for category Web Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Web Applications.link.generated-index.description": {
+ "message": "Guides for developing Web applications with 4D",
+ "description": "The generated-index page description for category Web Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Web Server": {
+ "message": "Web Server",
+ "description": "The label for category Web Server in sidebar docs"
+ },
+ "sidebar.docs.category.REST API": {
+ "message": "REST API",
+ "description": "The label for category REST API in sidebar docs"
+ },
+ "sidebar.docs.category.REST API.link.generated-index.title": {
+ "message": "REST API",
+ "description": "The generated-index page title for category REST API in sidebar docs"
+ },
+ "sidebar.docs.category.REST API.link.generated-index.description": {
+ "message": "Exposing your datastore to REST and using the REST API.",
+ "description": "The generated-index page description for category REST API in sidebar docs"
+ },
+ "sidebar.docs.category.Exposing your datastore in REST": {
+ "message": "Exposing your datastore in REST",
+ "description": "The label for category Exposing your datastore in REST in sidebar docs"
+ },
+ "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.title": {
+ "message": "Exposing your datastore in REST",
+ "description": "The generated-index page title for category Exposing your datastore in REST in sidebar docs"
+ },
+ "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.description": {
+ "message": "Configure your datastore for REST access",
+ "description": "The generated-index page description for category Exposing your datastore in REST in sidebar docs"
+ },
+ "sidebar.docs.category.API (general)": {
+ "message": "API (general)",
+ "description": "The label for category API (general) in sidebar docs"
+ },
+ "sidebar.docs.category.API (general).link.generated-index.title": {
+ "message": "API (general)",
+ "description": "The generated-index page title for category API (general) in sidebar docs"
+ },
+ "sidebar.docs.category.API (general).link.generated-index.description": {
+ "message": "REST API for global information",
+ "description": "The generated-index page description for category API (general) in sidebar docs"
+ },
+ "sidebar.docs.category.API (dataClass)": {
+ "message": "API (dataClass)",
+ "description": "The label for category API (dataClass) in sidebar docs"
+ },
+ "sidebar.docs.category.API (dataClass).link.generated-index.title": {
+ "message": "API (dataClass)",
+ "description": "The generated-index page title for category API (dataClass) in sidebar docs"
+ },
+ "sidebar.docs.category.API (dataClass).link.generated-index.description": {
+ "message": "REST API for dataClass.",
+ "description": "The generated-index page description for category API (dataClass) in sidebar docs"
+ },
+ "sidebar.docs.category.Desktop Applications": {
+ "message": "Desktop Applications",
+ "description": "The label for category Desktop Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Desktop Applications.link.generated-index.title": {
+ "message": "Desktop Applications",
+ "description": "The generated-index page title for category Desktop Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Desktop Applications.link.generated-index.description": {
+ "message": "Guides for developing Desktop applications with 4D",
+ "description": "The generated-index page description for category Desktop Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Forms": {
+ "message": "Forms",
+ "description": "The label for category Forms in sidebar docs"
+ },
+ "sidebar.docs.category.Form Editor": {
+ "message": "Form Editor",
+ "description": "The label for category Form Editor in sidebar docs"
+ },
+ "sidebar.docs.category.Form Properties": {
+ "message": "Form Properties",
+ "description": "The label for category Form Properties in sidebar docs"
+ },
+ "sidebar.docs.category.Form Objects": {
+ "message": "Form Objects",
+ "description": "The label for category Form Objects in sidebar docs"
+ },
+ "sidebar.docs.category.Form Object Properties": {
+ "message": "Form Object Properties",
+ "description": "The label for category Form Object Properties in sidebar docs"
+ },
+ "sidebar.docs.category.Form Events": {
+ "message": "Form Events",
+ "description": "The label for category Form Events in sidebar docs"
+ },
+ "sidebar.docs.category.Menus": {
+ "message": "Menus",
+ "description": "The label for category Menus in sidebar docs"
+ },
+ "sidebar.docs.category.Access Rights": {
+ "message": "Access Rights",
+ "description": "The label for category Access Rights in sidebar docs"
+ },
+ "sidebar.docs.category.Access Rights.link.generated-index.title": {
+ "message": "Access Rights",
+ "description": "The generated-index page title for category Access Rights in sidebar docs"
+ },
+ "sidebar.docs.category.Access Rights.link.generated-index.description": {
+ "message": "Access control and user privileges for desktop applications.",
+ "description": "The generated-index page description for category Access Rights in sidebar docs"
+ },
+ "sidebar.docs.category.Administration": {
+ "message": "Administration",
+ "description": "The label for category Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Administration.link.generated-index.title": {
+ "message": "Administration",
+ "description": "The generated-index page title for category Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Administration.link.generated-index.description": {
+ "message": "How to monitor your 4D applications",
+ "description": "The generated-index page description for category Administration in sidebar docs"
+ },
+ "sidebar.docs.category.4D Server Administration Window": {
+ "message": "4D Server Administration Window",
+ "description": "The label for category 4D Server Administration Window in sidebar docs"
+ },
+ "sidebar.docs.category.Web Administration": {
+ "message": "Web Administration",
+ "description": "The label for category Web Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Web Administration.link.generated-index.title": {
+ "message": "Web Administration",
+ "description": "The generated-index page title for category Web Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Web Administration.link.generated-index.description": {
+ "message": "4D web tools for administrating and monitoring your applications.",
+ "description": "The generated-index page description for category Web Administration in sidebar docs"
+ },
+ "sidebar.docs.category.MSC": {
+ "message": "MSC",
+ "description": "The label for category MSC in sidebar docs"
+ },
+ "sidebar.docs.category.Backup and Restore": {
+ "message": "Backup and Restore",
+ "description": "The label for category Backup and Restore in sidebar docs"
+ },
+ "sidebar.docs.category.Extensions": {
+ "message": "Extensions",
+ "description": "The label for category Extensions in sidebar docs"
+ },
+ "sidebar.docs.category.Extensions.link.generated-index.title": {
+ "message": "Extensions",
+ "description": "The generated-index page title for category Extensions in sidebar docs"
+ },
+ "sidebar.docs.category.Extending 4D applications": {
+ "message": "Extending 4D applications",
+ "description": "The label for category Extending 4D applications in sidebar docs"
+ },
+ "sidebar.docs.category.4D View Pro": {
+ "message": "4D View Pro",
+ "description": "The label for category 4D View Pro in sidebar docs"
+ },
+ "sidebar.docs.category.4D View Pro.link.generated-index.title": {
+ "message": "4D View Pro",
+ "description": "The generated-index page title for category 4D View Pro in sidebar docs"
+ },
+ "sidebar.docs.category.Commands": {
+ "message": "Commands",
+ "description": "The label for category Commands in sidebar docs"
+ },
+ "sidebar.docs.category.A": {
+ "message": "A",
+ "description": "The label for category A in sidebar docs"
+ },
+ "sidebar.docs.category.A.link.generated-index.title": {
+ "message": "A",
+ "description": "The generated-index page title for category A in sidebar docs"
+ },
+ "sidebar.docs.category.C": {
+ "message": "C",
+ "description": "The label for category C in sidebar docs"
+ },
+ "sidebar.docs.category.C.link.generated-index.title": {
+ "message": "C",
+ "description": "The generated-index page title for category C in sidebar docs"
+ },
+ "sidebar.docs.category.D": {
+ "message": "D",
+ "description": "The label for category D in sidebar docs"
+ },
+ "sidebar.docs.category.D.link.generated-index.title": {
+ "message": "D",
+ "description": "The generated-index page title for category D in sidebar docs"
+ },
+ "sidebar.docs.category.E": {
+ "message": "E",
+ "description": "The label for category E in sidebar docs"
+ },
+ "sidebar.docs.category.E.link.generated-index.title": {
+ "message": "E",
+ "description": "The generated-index page title for category E in sidebar docs"
+ },
+ "sidebar.docs.category.F": {
+ "message": "F",
+ "description": "The label for category F in sidebar docs"
+ },
+ "sidebar.docs.category.F.link.generated-index.title": {
+ "message": "F",
+ "description": "The generated-index page title for category F in sidebar docs"
+ },
+ "sidebar.docs.category.G": {
+ "message": "G",
+ "description": "The label for category G in sidebar docs"
+ },
+ "sidebar.docs.category.G.link.generated-index.title": {
+ "message": "G",
+ "description": "The generated-index page title for category G in sidebar docs"
+ },
+ "sidebar.docs.category.I": {
+ "message": "I",
+ "description": "The label for category I in sidebar docs"
+ },
+ "sidebar.docs.category.I.link.generated-index.title": {
+ "message": "I",
+ "description": "The generated-index page title for category I in sidebar docs"
+ },
+ "sidebar.docs.category.M": {
+ "message": "M",
+ "description": "The label for category M in sidebar docs"
+ },
+ "sidebar.docs.category.M.link.generated-index.title": {
+ "message": "M",
+ "description": "The generated-index page title for category M in sidebar docs"
+ },
+ "sidebar.docs.category.N": {
+ "message": "N",
+ "description": "The label for category N in sidebar docs"
+ },
+ "sidebar.docs.category.N.link.generated-index.title": {
+ "message": "N",
+ "description": "The generated-index page title for category N in sidebar docs"
+ },
+ "sidebar.docs.category.O": {
+ "message": "O",
+ "description": "The label for category O in sidebar docs"
+ },
+ "sidebar.docs.category.O.link.generated-index.title": {
+ "message": "O",
+ "description": "The generated-index page title for category O in sidebar docs"
+ },
+ "sidebar.docs.category.P": {
+ "message": "P",
+ "description": "The label for category P in sidebar docs"
+ },
+ "sidebar.docs.category.P.link.generated-index.title": {
+ "message": "P",
+ "description": "The generated-index page title for category P in sidebar docs"
+ },
+ "sidebar.docs.category.R": {
+ "message": "R",
+ "description": "The label for category R in sidebar docs"
+ },
+ "sidebar.docs.category.R.link.generated-index.title": {
+ "message": "R",
+ "description": "The generated-index page title for category R in sidebar docs"
+ },
+ "sidebar.docs.category.S": {
+ "message": "S",
+ "description": "The label for category S in sidebar docs"
+ },
+ "sidebar.docs.category.S.link.generated-index.title": {
+ "message": "S",
+ "description": "The generated-index page title for category S in sidebar docs"
+ },
+ "sidebar.docs.category.4D Write Pro": {
+ "message": "4D Write Pro",
+ "description": "The label for category 4D Write Pro in sidebar docs"
+ },
+ "sidebar.docs.category.4D Write Pro.link.generated-index.title": {
+ "message": "4D Write Pro",
+ "description": "The generated-index page title for category 4D Write Pro in sidebar docs"
+ },
+ "sidebar.docs.category.Document Elements": {
+ "message": "Document Elements",
+ "description": "The label for category Document Elements in sidebar docs"
+ },
+ "sidebar.docs.category.Document Elements.link.generated-index.title": {
+ "message": "Document Elements",
+ "description": "The generated-index page title for category Document Elements in sidebar docs"
+ },
+ "sidebar.docs.category.Import and Export": {
+ "message": "Import and Export",
+ "description": "The label for category Import and Export in sidebar docs"
+ },
+ "sidebar.docs.category.Import and Export.link.generated-index.title": {
+ "message": "Import and Export",
+ "description": "The generated-index page title for category Import and Export in sidebar docs"
+ },
+ "sidebar.docs.category.4D AIKit": {
+ "message": "4D AIKit",
+ "description": "The label for category 4D AIKit in sidebar docs"
+ },
+ "sidebar.docs.category.4D AIKit.link.generated-index.title": {
+ "message": "4D AIKit",
+ "description": "The generated-index page title for category 4D AIKit in sidebar docs"
+ },
+ "sidebar.docs.link.4D Qodly Pro": {
+ "message": "4D Qodly Pro",
+ "description": "The label for link 4D Qodly Pro in sidebar docs, linking to https://developer.qodly.com/docs"
+ },
+ "sidebar.docs.link.4D NetKit": {
+ "message": "4D NetKit",
+ "description": "The label for link 4D NetKit in sidebar docs, linking to https://developer.4d.com/4D-NetKit"
+ },
+ "sidebar.docs.link.4D Progress": {
+ "message": "4D Progress",
+ "description": "The label for link 4D Progress in sidebar docs, linking to https://github.com/4d/4D-Progress/blob/main/README.md"
+ },
+ "sidebar.docs.link.4D SVG": {
+ "message": "4D SVG",
+ "description": "The label for link 4D SVG in sidebar docs, linking to https://developer.4d.com/4D-SVG"
+ },
+ "sidebar.docs.link.4D Widgets": {
+ "message": "4D Widgets",
+ "description": "The label for link 4D Widgets in sidebar docs, linking to https://github.com/4d/4D-Widgets/blob/main/Readme.md"
+ },
+ "sidebar.docs.link.4D QPDF": {
+ "message": "4D QPDF",
+ "description": "The label for link 4D QPDF in sidebar docs, linking to https://github.com/4d/4D-QPDF?tab=readme-ov-file#readme"
+ },
+ "sidebar.docs.link.Go Mobile with 4D": {
+ "message": "Go Mobile with 4D",
+ "description": "The label for link Go Mobile with 4D in sidebar docs, linking to https://developer.4d.com/go-mobile/"
+ },
+ "sidebar.docs.link.4D Mobile App Server": {
+ "message": "4D Mobile App Server",
+ "description": "The label for link 4D Mobile App Server in sidebar docs, linking to https://github.com/4d/4D-Mobile-App-Server/blob/main/README.md"
+ },
+ "sidebar.docs.link.Build4D": {
+ "message": "Build4D",
+ "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d/Build4D"
+ },
+ "sidebar.docs.doc.Client/Server": {
+ "message": "Client/Server",
+ "description": "The label for the doc item Client/Server in sidebar docs, linking to the doc Desktop/clientServer"
+ },
+ "sidebar.docs.doc.Labels": {
+ "message": "Labels",
+ "description": "The label for the doc item Labels in sidebar docs, linking to the doc Desktop/labels"
+ },
+ "sidebar.docs.doc.Command Line Interface": {
+ "message": "Command Line Interface",
+ "description": "The label for the doc item Command Line Interface in sidebar docs, linking to the doc Admin/cli"
+ },
+ "sidebar.docs.doc.TLS Protocol": {
+ "message": "TLS Protocol",
+ "description": "The label for the doc item TLS Protocol in sidebar docs, linking to the doc Admin/tls"
+ },
+ "sidebar.docs.doc.Licenses": {
+ "message": "Licenses",
+ "description": "The label for the doc item Licenses in sidebar docs, linking to the doc Admin/licenses"
+ },
+ "sidebar.docs.doc.Log Files": {
+ "message": "Log Files",
+ "description": "The label for the doc item Log Files in sidebar docs, linking to the doc Debugging/debugLogFiles"
+ },
+ "sidebar.docs.doc.Data Collection": {
+ "message": "Data Collection",
+ "description": "The label for the doc item Data Collection in sidebar docs, linking to the doc Admin/data-collect"
+ }
+}
diff --git a/i18n/es/docusaurus-plugin-content-docs/current.json b/i18n/es/docusaurus-plugin-content-docs/current.json
index 8b31f0ee3df59f..e3c34962a3e34d 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current.json
+++ b/i18n/es/docusaurus-plugin-content-docs/current.json
@@ -1201,7 +1201,7 @@
},
"sidebar.docs.link.Build4D": {
"message": "Build4D",
- "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d-depot/Build4D?tab=readme-ov-file#readme"
+ "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d/Build4D"
},
"sidebar.docs.doc.Log Files": {
"message": "Archivos de registro",
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/CollectionClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/CollectionClass.md
index fcc9101bc417fb..52e214a97ff15e 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/API/CollectionClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/API/CollectionClass.md
@@ -3148,12 +3148,13 @@ Soporte de fórmula
-**.sort**() : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
+**.sort**() : Collection **.sort**( *ascOrDesc* : Integer ) : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
| Parámetros | Tipo | | Descripción |
| ---------- | --------------------------- | :-------------------------: | --------------------- |
+| ascOrDesc | Integer | -> | Ejemplo 1 |
| formula | 4D.Function | -> | Objeto fórmula |
| methodName | Text | -> | Nombre de un método |
| extraParam | any | -> | Parámetros del método |
@@ -3167,7 +3168,19 @@ La función `.sort()` ordena los elemento
> Esta función modifica la colección original.
-Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo. Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
+Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo.
+You can also pass one of the following constants in the *ascOrDesc* parameter:
+
+```
+|Constant| Type|Value|Comment|
+|---|---|---|---|
+|ck ascending|Integer|0|Elements are ordered in ascending order (default)|
+|ck descending|Integer|1|Elements are ordered in descending order|
+
+This syntax orders scalar values in the collection only (other element types such as objects or collections are returned unordered).
+```
+
+Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
1. null
2. booleans
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/EntityClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/EntityClass.md
index 23b4b0ff90dafe..4fbea5520fbe57 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/API/EntityClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/API/EntityClass.md
@@ -338,9 +338,10 @@ vCompareResult1 (se devuelven todas las diferencias):
Historia
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------- |
+| 21 | Added status 7 and 8 |
+| 17 | Añadidos |
@@ -367,7 +368,7 @@ De lo contrario, puede pasar la opción `dk force drop if stamp changed` en el p
**Resultado**
-El objeto devuelto por `.drop()` contiene las siguientes propiedades:
+The object returned by `.drop()` contains the following properties:
| Propiedad | | Tipo | Descripción |
| --------------------------------- | ----------------------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -392,13 +393,15 @@ El objeto devuelto por `.drop()` contiene las siguientes propiedades:
(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). Cuando se utiliza entity.drop( ), este error puede ser devuelto cuando se utiliza la opción dk force drop if stamp changed. Cuando se utiliza entity.lock(), se puede devolver este error cuando la opción dk reload if stamp changed es utilizada
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
-| `dk status stamp has changed` | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
con `.save()`: error solo si no se utiliza la opción `dk auto merge`
con `.drop()`: error solo si no se utiliza la opción `dk force drop if stamp changed`
con `.lock()`: error solo si no se utiliza la opción `dk reload if stamp changed`
**Estado asociado**: "Stamp has changed"
|
-| `dk status wrong permission` | 1 | Los privilegios actuales no permiten suprimir la entidad. **Associated statusText**: "Permission Error" |
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using entity.drop(), this error can be returned when dk force drop if stamp changed option is used. When using entity.lock(), this error can be returned when dk reload if stamp changed option is used.
**Associated statusText**: "Entity does not exist anymore" |
+| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
+| `dk status validation failed` | 7 | Non fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Mild Validation Error" |
+| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
+| `dk status serious validation error` | 8 | Fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Serious Validation Error" |
+| `dk status stamp has changed` | 2 | The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"
|
+| `dk status wrong permission` | 1 | Los privilegios actuales no permiten suprimir la entidad. **Associated statusText**: "Permission Error" |
#### Ejemplo 1
@@ -1012,12 +1015,13 @@ El objeto devuelto por `.lock()` contiene las siguientes propiedades:
(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). Cuando se utiliza `.drop( )`, este error puede devolverse cuando se utiliza la opción `dk force drop if stamp changed`. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
-| `dk status stamp has changed` | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
con `.save()`: error solo si no se utiliza la opción `dk auto merge`
con `.drop()`: error solo si no se utiliza la opción `dk force drop if stamp changed`
con `.lock()`: error solo si no se utiliza la opción `dk reload if stamp changed`
**Estado asociado**: "Stamp has changed" |
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using `.drop()`, this error can be returned when dk force drop if stamp changed option is used. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
+| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
+| `dk status mild validation error` | 7 | Can be returned by the developer only in validate events and do not require |
+| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
+| `dk status stamp has changed` | 2 | The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed" |
#### Ejemplo 1
@@ -1179,10 +1183,10 @@ El objeto devuelto por `.reload( )` contiene las siguientes propiedades:
(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. ***statusText asociado***: "Other error" |
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using `.drop()`, this error can be returned when `dk force drop if stamp changed` option is used. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
+| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. ***statusText asociado***: "Other error" |
#### Ejemplo
@@ -1211,9 +1215,10 @@ El objeto devuelto por `.reload( )` contiene las siguientes propiedades:
Historia
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------- |
+| 21 | Added status 7 and 8 |
+| 17 | Añadidos |
@@ -1273,14 +1278,16 @@ El objeto devuelto por `.save()` contiene las siguientes propiedades:
Los siguientes valores pueden ser devueltos en las propiedades `status`y `statusText` del objeto Result en caso de error:
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status automerge failed` | 6 | (Sólo si se utiliza la opción `dk auto merge`) La opción de fusión automática falló al guardar la entidad. **statusText asociado**: "Auto merge failed" |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
-| `dk status stamp has changed` | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
con `.save()`: error solo si no se utiliza la opción `dk auto merge`
con `.drop()`: error solo si no se utiliza la opción `dk force drop if stamp changed`
con `.lock()`: error solo si no se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Stamp has changed" |
-| `dk status wrong permission` | 1 | Los privilegios actuales no permiten guardar la entidad. **Associated statusText**: "Permission Error" |
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `dk status automerge failed` | 6 | (Only if the `dk auto merge` option is used) The automatic merge option failed when saving the entity. **Associated statusText**: "Auto merge failed" |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using `.drop()`, this error can be returned when `dk force drop if stamp changed` option is used. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
+| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
+| `dk status validation failed` | 7 | Non fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Mild Validation Error" |
+| `dk status serious error` | 4 | A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. **Associated statusText**: "Other error" |
+| `dk status serious validation error` | 8 | Fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Serious Validation Error" |
+| `dk status stamp has changed` | 2 | The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed" |
+| `dk status wrong permission` | 1 | Los privilegios actuales no permiten guardar la entidad. **Associated statusText**: "Permission Error" |
#### Ejemplo 1
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md
index 316f5d2393ffd9..7b9392b7d194f3 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/API/SessionClass.md
@@ -54,9 +54,10 @@ La disponibilidad de las propiedades y funciones del objeto `Session` depende de
Historia
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------- |
+| 21 | Support of remote sessions |
+| 18 R6 | Añadidos |
@@ -74,7 +75,7 @@ La disponibilidad de las propiedades y funciones del objeto `Session` depende de
:::note
-Esta función no hace nada y siempre devuelve **True** con cliente remoto, procedimiento almacenado y sesiones independientes.
+This function does nothing and always returns **True** with stored procedure sessions and standalone sessions.
:::
@@ -88,6 +89,8 @@ Esta función no elimina los **privilegios promovidos** del proceso web, tanto s
:::
+Regarding remote client sessions, the function only impacts [code accessing the web server](../WebServer/preemptiveWeb.md#writing-thread-safe-web-server-code).
+
#### Ejemplo
```4d
@@ -107,9 +110,10 @@ $isGuest:=Session.isGuest() //$isGuest es True
Historia
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R9 | Añadidos |
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------- |
+| 21 | Support of remote sessions |
+| 20 R9 | Añadidos |
@@ -120,7 +124,7 @@ $isGuest:=Session.isGuest() //$isGuest es True
| Parámetros | Tipo | | Descripción |
| ---------- | ------- | :-------------------------: | --------------------------------------------------- |
| lifespan | Integer | -> | Duración de la vida del token de sesión en segundos |
-| Resultado | Text | <- | UUID de la sesión |
+| Resultado | Text | <- | UUID del token |
@@ -128,7 +132,7 @@ $isGuest:=Session.isGuest() //$isGuest es True
:::note
-Esta función solo está disponible con sesiones usuario web. Devuelve una cadena vacía en otros contextos.
+This function is available with web user sessions and remote sessions. It returns an empty string in stored procedure and standalone sessions.
:::
@@ -136,9 +140,14 @@ La función `.createOTP()` crea un
Para más información sobre los tokens OTP, por favor consulte [esta sección](../WebServer/sessions.md#session-token-otp).
-Por defecto, si se omite el parámetro *lifespan*, el token se crea con el mismo tiempo de vida que el [`.idleTimeOut`](#idletimeout) de la sesión. Puede definir un tiempo de espera personalizado pasando un valor en segundos en *lifespan*. Si se utiliza un token caducado para restaurar una sesión de usuario web, se ignora.
+Puede definir un tiempo de espera personalizado pasando un valor en segundos en *lifespan*. If an expired token is used to restore a session, it is ignored. By default, if the *lifespan* parameter is omitted:
+
+- with web user sessions, the token is created with the same lifespan as the [`.idleTimeOut`](#idletimeout) of the session.
+- with remote sessions, the token is created with a 10 seconds lifespan.
-El token devuelto puede ser utilizado en intercambios con aplicaciones de terceros o sitios web para identificar la sesión de forma segura. Por ejemplo, el token OTP de sesión se puede utilizar con una aplicación de pago.
+For **web user sessions**, the returned token can be used in exchanges with third-party applications or websites to securely identify the session. Por ejemplo, el token OTP de sesión se puede utilizar con una aplicación de pago.
+
+For **remote sessions**, the returned token can be used on 4D Server to identitfy requests coming from a [remote 4D running Qodly forms in a Web area](../Desktop/clientServer.md#remote-user-sessions).
#### Ejemplo
@@ -253,9 +262,10 @@ $expiration:=Session.expirationDate //eg "2021-11-05T17:10:42Z"
Historia
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R6 | Añadidos |
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------- |
+| 21 | Soporte de sesiones cliente remotas |
+| 20 R6 | Añadidos |
@@ -279,7 +289,9 @@ Esta función devuelve los privilegios asignados a una Sesión utilizando única
:::
-Con clientes remotos, procedimientos almacenados y sesiones independientes, esta función devuelve una colección que sólo contiene "WebAdmin".
+With remote client sessions, the privileges only concerns the code executed in the context of a [web request sent through a Web area](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+
+With stored procedure sessions and standalone sessions, this function returns a collection only containing "WebAdmin".
#### Ejemplo
@@ -348,10 +360,10 @@ $privileges := Session.getPrivileges()
Historia
-| Lanzamiento | Modificaciones |
-| ----------- | --------------------------------------------- |
-| 21 | Devuelve True para los privilegios promovidos |
-| 18 R6 | Añadidos |
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------------------------------- |
+| 21 | Returns True for promoted privileges, Support of remote client sessions |
+| 18 R6 | Añadidos |
@@ -376,7 +388,9 @@ Esta función devuelve True para el *privilegio* si se llama desde una función
:::
-Con cliente remoto, procedimientos almacenados y sesiones independientes, esta función siempre devuelve True, sea cual sea el *privilege*.
+Regarding remote client sessions, the function only impacts [code accessing the web server](../WebServer/preemptiveWeb.md#writing-thread-safe-web-server-code).
+
+With stored procedure sessions and standalone sessions, this function always returns True, whatever the *privilege*.
#### Ejemplo
@@ -717,6 +731,7 @@ Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
| Lanzamiento | Modificaciones |
| ----------- | --------------------------------------------------- |
+| 21 | Soporte de sesiones cliente remotas |
| 19 R8 | Compatibilidad con la propiedad "roles" en Settings |
| 18 R6 | Añadidos |
@@ -739,23 +754,21 @@ Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
:::note
-Esta función no hace nada y siempre devuelve **False** con cliente remoto, procedimiento almacenado y sesiones independientes.
+This function does nothing and always returns **False** with stored procedure sessions and standalone sessions.
:::
La función `.setPrivileges()` asocia a la sesión los privilegios y/o roles definidos en el parámetro y devuelve **True** si la ejecución se ha realizado correctamente.
- En el parámetro *privilege*, pase una cadena que contenga un nombre de privilegio (o varios nombres de privilegio separados por comas).
-
- En el parámetro *privileges*, pase una colección de cadenas que contengan nombres de privilegios.
-
- En el parámetro *settings*, pase un objeto que contenga las siguientes propiedades:
-| Propiedad | Tipo | Descripción |
-| ---------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------- |
-| privileges | Text o Collection |
Cadena que contiene un nombre de privilegio, o
Colección de cadenas que contienen nombres de privilegios
|
-| roles | Text o Collection |
Cadena que contiene un rol, o
Colección de cadenas que contienen roles
|
-| userName | Text | Nombre de usuario para asociar a la sesión (opcional) |
+| Propiedad | Tipo | Descripción |
+| ---------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| privileges | Text o Collection |
Cadena que contiene un nombre de privilegio, o
Colección de cadenas que contienen nombres de privilegios
|
+| roles | Text o Collection |
Cadena que contiene un rol, o
Colección de cadenas que contienen roles
|
+| userName | Text | User name to associate to the session (optional, web sessions only). Not available in remote client sessions (ignored). |
:::note
@@ -769,6 +782,8 @@ Por defecto, cuando no hay ningún privilegio o rol asociado a la sesión, la se
La propiedad [`userName`](#username) está disponible a nivel de objeto de sesión (sólo lectura).
+Regarding remote client sessions, the function only concerns the code executed in the context of a [web request sent through a Web area](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+
#### Ejemplo
En un método de autenticación personalizado, se establece el privilegio "WebAdmin" para el usuario:
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/API/WebServerClass.md b/i18n/es/docusaurus-plugin-content-docs/current/API/WebServerClass.md
index 253c6616ecccf2..6fed6a0c01983c 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/API/WebServerClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/API/WebServerClass.md
@@ -23,6 +23,7 @@ Ofrecen las siguientes propiedades y funciones:
| [](#corssettings) |
| [](#debuglog) |
| [](#defaulthomepage) |
+| [](#handlers) |
| [](#hstsenabled) |
| [](#hstsmaxage) |
| [](#httpcompressionlevel) |
@@ -46,6 +47,7 @@ Ofrecen las siguientes propiedades y funciones:
| [](#opensslversion) |
| [](#perfectforwardsecrecy) |
| [](#rootfolder) |
+| [](#rules) |
| [](#scalablesession) |
| [](#sessioncookiedomain) |
| [](#sessioncookiename) |
@@ -169,6 +171,26 @@ El nombre de la página de i
+
+
+## .handlers
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 21 | Añadidos |
+
+
+
+**.handlers** : Collection
+
+*Propiedad de sólo lectura*
+
+A collection of custom HTTP handler objects. An HTTP handler object contains a listened URL pattern, a handled verb, and the code to be called. HTTP handlers can be defined through a HTTPHandlers.json file or the *settings* parameter of the [`.start()`](#start) function. For more information, please refer to the [HTTP Request handler](../WebServer/http-request-handler.md) page.
+
+
+
## .HSTSEnabled
@@ -457,6 +479,26 @@ La ruta de la carpeta raíz del s
+
+
+## .rules
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 21 | Añadidos |
+
+
+
+**.rules** : Collection
+
+*Propiedad de sólo lectura*
+
+A collection of rule objects currently handled to customize HTTP headers. A rule object contains a "regexPattern" property, as well as an action name with a value. HTTP rules can be defined through a HTTPRules.json file or the *settings* parameter of the [`.start()`](#start) function. For more information, please refer to the [HTTP Rules](../WebServer/http-rules.md) page.
+
+
+
## .scalableSession
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/error-handling.md b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/error-handling.md
index f6480d0644fb1a..706dcbef348f6c 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/Concepts/error-handling.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/Concepts/error-handling.md
@@ -21,11 +21,11 @@ Es muy recomendable instalar un método global de gestión de errores en 4D Serv
:::
-## Error o estado
+## Predictable vs unpredictable errors
-Muchas funciones de clase 4D, como `entity.save()` o `transporter.send()`, devuelven un objeto *status*. Este objeto se utiliza para almacenar errores "predecibles" en el contexto de ejecución, por ejemplo, una contraseña no válida, una entidad bloqueada, etc., que no detienen la ejecución del programa. Esta categoría de errores puede ser manejada por el código habitual.
+Many 4D class functions, such as [`entity.save()`](../API/EntityClass.md#save) or [`transporter.send()`](../API/SMTPTransporterClass.md#send), return a object containing *status* information. This object is used to store **predictable** errors in the runtime context, e.g. invalid password, locked entity, etc., that do not require to stop program execution. This category of errors, also named **silent errors** errors, can be handled by regular code. When such errors occur in an error handling context, i.e. a [`Try`](#tryexpression), [`Try/Catch`](#trycatchend-try) or an [error-handling method](#installing-an-error-handling-method), they do not interrupt the execution and do not trigger the error handling (e.g. the `Catch` part of the [`Try/Catch`](#trycatchend-try) is not executed). They are not listed in the [`Last errors`](../commands/last-errors.md) collection. The error is only returned in the `status` and `statusText` properties of the returned object. It can be processed according to your business logic.
-Otros errores "imprevisibles" son el error de escritura en el disco, el fallo de la red o, en general, cualquier interrupción inesperada. Esta categoría de errores genera excepciones definidas por [un *código*, un *mensaje* y una *firma*](#error-codes) y necesita ser manejada a través de un método de gestión de errores o una palabra clave `Try()`.
+The other category of errors are **unpredictable** errors, also named **serious errors**. They include disk write error, network failure, or in general any unexpected interruption. This category of errors generates exceptions defined by [a *code*, a *message* and a *signature*](#error-codes). They interrupt the execution and trigger the error processing of the [`Try`](#tryexpression), [`Try/Catch`](#trycatchend-try) or [error-handling method](#installing-an-error-handling-method) features. They are listed in the [`Last errors`](../commands/last-errors.md) collection. Note that serious errors can also return values in the `status` and `statusText` properties, e.g. `dk status serious error` - "Other error".
## Instalación de un método de gestión de errores
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Debugging/debugLogFiles.md b/i18n/es/docusaurus-plugin-content-docs/current/Debugging/debugLogFiles.md
index 578200aea20193..63614024cc5110 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/Debugging/debugLogFiles.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/Debugging/debugLogFiles.md
@@ -465,7 +465,7 @@ Como iniciar este historial:
- Utilice el comando `SET DATABASE PARAMETER`:
```4d
- SET DATABASE PARAMETER(TCPUDP log; 1)
+ SET DATABASE PARAMETER(TCPUDP log recording; 1)
```
- Cómo activar el archivo
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Desktop/clientServer.md b/i18n/es/docusaurus-plugin-content-docs/current/Desktop/clientServer.md
index cd3931491d7495..3fb97a773f2ad5 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/Desktop/clientServer.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/Desktop/clientServer.md
@@ -89,11 +89,19 @@ Sin embargo, debe prestar atención a las siguientes diferencias de comportamien
En el servidor, el comando [`Session`](../commands/session.md) devuelve un objeto `session` que describe la sesión de usuario actual. Este objeto se maneja a través de las funciones y propiedades de la [clase `Session`](../API/SessionClass.md).
+:::tip Entradas de blog relacionadas
+
+[Objeto sesión remota 4D con conexión cliente/servidor y procedimiento almacenado](https://blog.4d.com/new-4D-remote-session-object-with-client-server-connection-and-stored-procedure).
+
+:::
+
### Utilización
-El objeto `session` permite obtener información sobre la sesión del usuario remoto. Puede compartir datos entre todos los procesos de la sesión del usuario utilizando el objeto compartido [`session.storage`](../API/SessionClass.md#storage).
+The `session` object allows you to handle information and privileges for the remote user session.
+
+Puede compartir datos entre todos los procesos de la sesión del usuario utilizando el objeto compartido [`session.storage`](../API/SessionClass.md#storage). Por ejemplo, puede iniciar un procedimiento de autenticación y verificación de usuario cuando un cliente se conecta al servidor, que involucra ingresar un código enviado por correo electrónico o SMS en la aplicación. A continuación, añada la información de usuario al almacenamiento de sesión, permitiendo al servidor identificar al usuario. De este modo, el servidor 4D puede acceder a la información del usuario para todos los procesos del cliente, lo que permite escribir código personalizado según el rol del usuario.
-Por ejemplo, puede iniciar un procedimiento de autenticación y verificación de usuario cuando un cliente se conecta al servidor, que involucra ingresar un código enviado por correo electrónico o SMS en la aplicación. A continuación, añada la información de usuario al almacenamiento de sesión, permitiendo al servidor identificar al usuario. De este modo, el servidor 4D puede acceder a la información del usuario para todos los procesos del cliente, lo que permite escribir código personalizado según el rol del usuario.
+You can also assign privileges to a remote user session to control access when the session comes from Qodly pages running in web areas.
### Disponibilidad
@@ -110,7 +118,60 @@ Todos los procedimientos almacenados en el servidor comparten la misma sesión d
:::
-### Ver también (entrada de blog)
+### Sharing the session with Qodly pages in Web areas
-[Objeto sesión remota 4D con conexión cliente/servidor y procedimiento almacenado](https://blog.4d.com/new-4D-remote-session-object-with-client-server-connection-and-stored-procedure).
+Remote client sessions can be used to handle Client/Server applications where [Qodly pages](https://developer.4d.com/qodly/4DQodlyPro/pageLoaders/pageLoaderOverview) are used for the interface, running on remote machines. With this configuration, your applications have modern CSS-based web interfaces but still benefit from the power and simplicity of integrated client/server development. In such applications, Qodly pages are executed within standard 4D [Web areas](../FormObjects/webArea_overview.md).
+
+To manage this configuration, you need to use remote client sessions. Actually, requests coming from both the remote 4D application and its Qodly pages loaded in Web areas need to work inside a single user session. You just have to share the same session between the remote client and its web pages so that you can have the same [session storage](../API/SessionClass.md#storage) and client license, whatever the request origin.
+
+Note that [privileges](../ORDA/privileges.md) should be set in the session before executing a web request from a Web area, so that the user automatically gets their privileges for web access (see example). Keep in mind that privileges only apply to requests coming from the web, not to the 4D code executed in a standard remote session.
+
+Shared sessions are handled through [OTP tokens](../WebServer/sessions.md#session-token-otp). After you created an OTP token on the server for the user session, you add the token (through the `$4DSID` parameter value) to web requests sent from web areas containing Qodly pages so that the user session on the server is identified and shared. On the web server side, if a web request contains an *OTP id* in the $4DSID parameter, the session corresponding to this OTP token is used.
+
+:::tip Entrada de blog relacionada
+
+[Share your 4D remote client session with web accesses](https://blog.4d.com/share-your-4d-remote-client-session-with-web-accesses)
+
+:::
+
+#### Ejemplo
+
+```4d
+var $otp : Text
+
+// Some privileges are put in the remote user session on the server for a further web access
+ds.resetPrivileges("basic")
+
+// An OTP is created on the server for this remote client session
+$otp:=ds.getOTP()
+
+
+// The user has already the required privileges for a web access
+// and the same session is shared between this remote user and the web Qodly app
+WA OPEN URL(*; "Welcome"; "http://127.0.0.1/$lib/renderer/?w=People&$4DSID="+$otp)
+
+```
+
+*resetPrivileges()* function in the Datastore class:
+
+```4d
+// This function is run on the server
+// and puts some privileges in the session for a further web access
+
+Function resetPrivileges($priv : Text)
+
+ Session.clearPrivileges()
+ Session.setPrivileges($priv)
+```
+
+*getOTP()* function in the Datastore class:
+
+```4d
+// This function is run on the server
+// and generates an OTP able to retrieve this remote user session
+Function getOTP(): Text
+
+ return Session.createOTP()
+
+```
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Events/onValidate.md b/i18n/es/docusaurus-plugin-content-docs/current/Events/onValidate.md
index 71966a0a209251..d833eb400cba72 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/Events/onValidate.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/Events/onValidate.md
@@ -9,7 +9,7 @@ title: On Validate
## Descripción
-Este evento se dispara cuando la entrada de datos del registro ha sido validada, por ejemplo después de una llamada al comando `SAVE RECORD` o una [acción estándar](FormObjects/properties_Action.md#standard-action) `accept`.
+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).
### Subformulario
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/Extensions/develop-components.md b/i18n/es/docusaurus-plugin-content-docs/current/Extensions/develop-components.md
index d30583040e900b..46c729eb7bc391 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/Extensions/develop-components.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/Extensions/develop-components.md
@@ -1,6 +1,6 @@
---
id: develop-components
-title: Desarrollo de extensiones
+title: Componentes de desarrollo
---
## Componentes
@@ -9,7 +9,7 @@ Un componente 4D es un conjunto de funciones, métodos y formularios 4D que repr
Puede desarrollar componentes 4D para sus propias necesidades y mantenerlos en privado. También puede [compartir sus componentes con la comunidad 4D](https://github.com/topics/4d-component).
-### Definiciones
+## Definiciones
- **Base proyecto**: proyecto 4D utilizado para desarrollar el componente. El proyecto matriz es una base estándar sin atributos específicos. Un proyecto matricial forma un único componente.
- **Proyecto local**: proyecto aplicación en la que se instala y utiliza un componente.
@@ -21,7 +21,7 @@ Puede [crear un componente directamente desde el proyecto local](#creating-compo
:::
-### Básicos
+## Básicos
La creación e instalación de los componentes 4D se realiza directamente desde 4D:
@@ -114,7 +114,7 @@ Las funcionalidades estándar del IDE 4D están disponibles para el componente.
- ejecutar métodos,
- restaurar desde la papelera o vaciar la papelera.
-### Alcance de los comandos del lenguaje
+## Alcance de los comandos del lenguaje
A excepción de los [comandos no utilizables](#unusable-commands), un componente puede utilizar cualquier comando del lenguaje 4D.
@@ -153,7 +153,7 @@ Los siguientes comandos no son compatibles para su uso dentro de un componente p
- El comando `Current form table` devuelve `Nil` cuando se llama en el contexto de un formulario proyecto. Por consiguiente, no puede utilizarse en un componente.
- Comandos del lenguaje de definición de datos SQL (`CREATE TABLE`, `DROP TABLE`, etc.) no se puede utilizar en el proyecto del componente. Sin embargo, se soportan con bases de datos externas (ver el comando SQL `CREATE DATABASE`).
-### Compartir métodos proyecto
+## Compartir métodos proyecto
Todos los métodos proyecto de un proyecto matricial son por definición incluidos en el componente (el proyecto es el componente), lo que significa que pueden ser llamados y ejecutados dentro del componente.
@@ -183,11 +183,11 @@ EXECUTE METHOD($param)
> Una base local interpretada que contenga componentes interpretados puede ser compilada o verificada sintácticamente si no llama a métodos del componente interpretado. De lo contrario, aparecerá una caja de diálogo de advertencia cuando intente iniciar la compilación o una comprobación de sintaxis y no será posible realizar la operación.
> Tenga en cuenta que un método interpretado puede llamar a un método compilado, pero no a la inversa, excepto mediante el uso de los comandos `EXECUTE METHOD` y `EXECUTE FORMULA`.
-### Compartir clases
+## Compartir clases
Por defecto, las clases de los componentes no pueden ser llamadas desde el editor de código 4D del proyecto local. Si desea exponer la clase del componente al proyecto principal y a los componentes que se están cargando, debe **declarar un espacio de nombres de componente**. Además, puede controlar cómo se sugieren las clases de los componentes en el Editor de código local.
-#### Declaración del namespace
+### Declaración del namespace
Para permitir que las clases de su componente se expongan en los proyectos locales y sus componentes cargados, introduzca un valor en la opción [**namespace del componente en la class store** en la página General](../settings/general.md#component-namespace-in-the-class-store) de las Propiedades del proyecto matriz. Por defecto, el área está vacía: las clases de componentes no están disponibles fuera del contexto de los componentes.
@@ -220,7 +220,7 @@ Por supuesto, se recomienda utilizar un nombre distintivo para evitar cualquier
Las clases ORDA de un componente no están disponibles en el proyecto local. Por ejemplo, si hay una dataclass llamada Employees en su componente, no podrá utilizar una clase "cs.Mycomponent.Employee" en el proyecto local.
-#### Clases ocultas
+### Clases ocultas
Como en todo proyecto, puede crear clases y funciones ocultas en el componente anteponiendo a los nombres un guión bajo ("_"). Cuando se define un [namespace de componente](#declaring-the-component-namespace), las clases y funciones ocultas del componente no aparecerán como sugerencias al utilizar completar el código.
@@ -243,7 +243,7 @@ Un archivo de sintaxis (formato JSON) se crea automáticamente durante la fase d
Si no ingresa un [namespace](#declaring-the-component-namespace), los recursos de las clases y de los métodos exposed no se generan incluso si la opción de archivo de sintaxis está marcada.
-### Paso de variables
+## Paso de variables
Las variables locales, proceso e interproceso no se comparten entre los componentes y los proyectos locales. La única forma de modificar las variables del componente desde el proyecto local y viceversa es utilizando punteros.
@@ -305,11 +305,13 @@ En este caso, es necesario utilizar la comparación de punteros:
If(myptr1=myptr2) //Esta prueba devuelve False
```
-### Gestión de errores
+## Gestión de errores
-Un [método de gestión de errores](Concepts/error-handling.md) instalado por el comando `ON ERR CALL` sólo se aplica a la aplicación en ejecución. En el caso de un error generado por un componente, no se llama al método de gestión de errores `ON ERR CALL` del proyecto local, y viceversa.
+An [error-handling method](Concepts/error-handling.md) installed by the [`ON ERR CALL`](../commands-legacy/on-err-call.md) command only applies to the running application. En el caso de un error generado por un componente, no se llama al método de gestión de errores `ON ERR CALL` del proyecto local, y viceversa.
-### Acceso a las tablas del proyecto local
+However, you can install a [component error handler in the host application](../Concepts/error-handling.md#scope-and-components) to manage uncaught errors from compponents.
+
+## Acceso a las tablas del proyecto local
Aunque los componentes no pueden utilizar tablas, los punteros pueden permitir que los proyectos locales y los componentes se comuniquen entre sí. Por ejemplo, este es un método que podría ser llamado desde un componente:
@@ -335,7 +337,7 @@ SAVE RECORD($tablepointer-
> En el contexto de un componente, 4D asume que una referencia a un formulario tabla es una referencia al formulario tabla local (ya que los componentes no pueden tener tablas.)
-### Uso de tablas y campos
+## Uso de tablas y campos
Un componente no puede utilizar las tablas y campos definidos en la estructura 4D del proyecto matriz. Sin embargo, puede crear y utilizar bases externas, y luego utilizar sus tablas y campos según sus necesidades. Puede crear y gestionar bases externas utilizando SQL. Sin embargo, puede crear y utilizar bases externas, y luego utilizar sus tablas y campos según sus necesidades. Utilizar una base externa significa designar temporalmente esta base como base actual, es decir, como la base de destino para las consultas SQL ejecutadas por 4D. Las bases externas se crean con el comando SQL `CREATE DATABASE`.
@@ -415,7 +417,7 @@ Lectura en una base de datos externa:
End SQL
```
-### Utilización de formularios
+## Utilización de formularios
- Sólo los "formularios de proyecto" (formularios que no están asociados a ninguna tabla específica) pueden utilizarse en un componente. Sólo los "formularios de proyecto" (formularios que no están asociados a ninguna tabla específica) pueden utilizarse en un componente.
- Un componente puede llamar a formularios tabla del proyecto local. Tenga en cuenta que en este caso es necesario utilizar punteros en lugar de nombres de tablas entre paréntesis [] para especificar los formularios en el código del componente.
@@ -426,7 +428,7 @@ Lectura en una base de datos externa:
> En el contexto de un componente, cualquier formulario de proyecto referenciado debe pertenecer al componente. Por ejemplo, dentro de un componente, hacer referencia a un formulario proyecto local utilizando `DIALOG` u `Open form window` arrojará un error.
-### Utilización de recursos
+## Utilización de recursos
Los componentes pueden utilizar recursos situados en la carpeta Resources del componente.
@@ -434,7 +436,7 @@ Los mecanismos automáticos son operacionales: los archivos XLIFF encontrados en
En un proyecto local que contiene uno o más componentes, cada componente, así como los proyectos locales, tiene su propia "cadena de recursos." Los recursos están divididos entre las diferentes proyectos: no es posible acceder a los recursos del componente A desde el componente B o desde el proyecto local.
-### Ejecución del código de inicialización
+## Ejecución del código de inicialización
Un componente puede ejecutar automáticamente código 4D al abrir o cerrar la base local, por ejemplo para cargar y/o guardar las preferencias o los estados usuario relacionados con el funcionamiento de la base local.
@@ -442,7 +444,7 @@ La ejecución del código de inicialización o cierre se realiza mediante el mé
> Por razones de seguridad, debe autorizar explícitamente la ejecución del método base `On Host Database Event` en la base local para poder llamarlo. Para ello, debe marcar la opción [**Ejecutar el método "On Host Database Event" de los componentes**](../settings/security.md#options) en la página Seguridad de la Configuración.
-### Info.plist
+## Info.plist
Los componentes pueden tener un archivo `Info.plist` en su [carpeta raíz](../Project/architecture.md) para ofrecer información extra legible por el sistema (sólo macOS) y el [Gestor de dependencias](../Project/components.md#loading-components).
@@ -491,7 +493,7 @@ En macOS, la información está disponible en el Finder:

-### Protección de los componentes: compilación
+## Protección de los componentes: compilación
Por defecto, todo el código de un proyecto matriz instalado como componente es potencialmente visible desde el proyecto local. En particular:
@@ -504,47 +506,7 @@ Para proteger eficazmente el código de un componente, basta con [compilar y gen
- Los métodos, clases y funciones del proyecto compartido pueden ser llamados desde los métodos proyecto locales y también se muestran en la página de métodos del Explorador. Sin embargo, su contenido no aparecerá en el área de vista previa ni en el depurador.
- Los otros métodos proyecto del proyecto matriz nunca aparecerán.
-### Compartiendo sus componentes en GitHub
+## Compartiendo sus componentes en GitHub
Lo animamos a que apoye a la comunidad de desarrolladores 4D compartiendo sus componentes, preferiblemente en la plataforma [GitHub](https://github.com/topics/4d-component). Recomendamos que utilice el tema **`4d-component`** para ser referenciado correctamente.
-## Plug-ins
-
-### ¿Por qué es necesario un plug-in?
-
-Aunque 4D ofrece cientos de métodos integrados para manipular objetos, registros e implementar la interfaz de usuario, es posible que se necesite algún uso o característica especial (que a veces depende de la plataforma): uno puede necesitar ODBC en Windows, otro puede necesitar los servicios de Apple en macOS, mientras que otro puede querer implementar herramientas estadísticas específicas, inicio de sesión en redes sociales, plataforma de pago, acceso a archivos a través de la red, una interfaz de usuario especial o una estructura de imagen privada.
-
-Es evidente que cubrir todas las áreas de los sistemas operativos macOS y Windows por medio de los comandos de 4D sin duda conduciría a un producto con miles de comandos, y al mismo tiempo, la mayoría de los usuarios no tendrían necesidad de un conjunto tan grande de funcionalidades. Además, la creación de una herramienta tan completa haría que el entorno 4D fuera increíblemente complejo y llevaría a la mayoría de los usuarios meses de estudio antes de poder esperar resultados útiles.
-
-La naturaleza modular del entorno 4D permite la creación de aplicaciones básicas, pero no impide el desarrollo de sistemas muy complejos. La arquitectura del plug-in 4D abre el entorno 4D a todo tipo de aplicaciones o de usuario. Los plug-ins 4D multiplican la potencia y la productividad de la aplicación o del usuario.
-
-### ¿Qué es un plug-in y qué puede hacer?
-
-Un plug-in es una pieza de código que 4D lanza al inicio. Añade funcionalidad a 4D y aumenta así su capacidad.
-
-Normalmente, un plug-in hace cosas que:
-
-- 4D no puede efectuar (es decir, una tecnología de plataforma específica),
-- será muy difícil de escribir sólo con 4D,
-- sólo están disponibles como punto de entrada del plug-in
-
-Un plug-in suele contener un conjunto de rutinas entregadas al desarrollador 4D. Puede manejar un Área Externa y ejecutar un proceso externo.
-
-- Una **rutina de conexión** es una rutina escrita en lenguaje nativo (normalmente C o C++) que provoca una acción.
-- Un **área externa** es una parte de un formulario que puede mostrar casi todo e interactuar con el usuario cuando sea necesario.
-- Un **proceso externo** es un proceso que se ejecuta solo, normalmente en un bucle, haciendo casi todo lo que quiere. Todo el código del proceso pertenece al plug-in, 4D simplemente está presente para recibir/enviar eventos al proceso.
-
-### Nota importante
-
-Un plug-in puede ser muy sencillo, con una sola rutina que realice una tarea muy pequeña, o puede ser muy complejo, con cientos de rutinas y áreas. Prácticamente no hay límite para lo que puede hacer un plug-in, sin embargo todo desarrollador de plug-ins debe recordar que un plug-in es una parte de código "de muestra". Es el plug-in que se ejecuta dentro de 4D, no lo contrario. Como parte de código, es el anfitrión de 4D; no es una aplicación independiente. Comparte el tiempo de la CPU y la memoria con 4D y otros plug-ins, por lo tanto, debería ser un código conciso, utilizando sólo lo necesario para funcionar. Por ejemplo, en los bucles largos, un plug-in debe llamar a `PA_Yield()` para dar tiempo al planificador 4D a menos que su tarea sea crítica tanto para él como para la aplicación.
-
-### ¿Cómo crear un plug-in?
-
-4D ofrece en GitHub un código abierto [**plug-in SDK**](https://github.com/4d/4D-Plugin-SDK), que contiene el plug-in API 4D y el asistente de plugins 4D:
-
-- el [**Plugin API 4D**](https://github.com/4d/4D-Plugin-SDK/blob/master/4D%20Plugin%20API), escrito en C, añade más de 400 funciones que le ayudan a crear fácilmente sus propios plug-ins para añadir nuevas funcionalidades a su aplicación 4D. Las funciones del plug-in de API de 4D gestionan todas las interacciones entre la aplicación 4D y su plug-in.
-- El [**asistente de plugins 4D**](https://github.com/4d/4D-Plugin-SDK/blob/master/4D%20Plugin%20Wizard) es una herramienta esencial que simplifica la tarea de desarrollar plug-ins 4D. Escribe el código que 4D necesita para cargar e interactuar correctamente con un plug-in, permitiéndole concentrarse en su propio código.
-
-### Compartir los plug-ins
-
-Lo animamos a que apoye a la comunidad de desarrolladores 4D compartiendo sus plug-ins, preferiblemente en la [plataforma GitHub](https://github.com/topics/4d-plugin). Recomendamos que utilice el tema **`4d-plugin`** para ser referenciado correctamente.
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/forms.md b/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/forms.md
index f780ef9be2a24d..dc0b5a8bdb81ab 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/forms.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/FormEditor/forms.md
@@ -96,6 +96,73 @@ No hay restricciones en el número de páginas que puede tener un formulario. El
Un formulario multipáginas tiene una página de fondo y varias páginas de visualización. Los objetos que se colocan en la página de fondo pueden ser visibles en todas las páginas de visualización, pero sólo se pueden seleccionar y editar en la página de fondo. En los formularios multipágina, debe colocar su paleta de botones en la página de fondo. También es necesario incluir uno o más objetos en la página de fondo que ofrezcan las herramientas de navegación para el usuario.
+## Fluent UI rendering (Developer Preview)
+
+On Windows, 4D supports **Fluent UI** form rendering, Microsoft's modern graphical user interface design, based upon **WinUI 3** technology. **WinUI 3** is the foundation of the Windows App SDK and represents the upcoming Windows graphical interfaces.
+
+:::caution Vista previa para desarrolladores
+
+Fluent UI support is currently in the Developer Preview phase. No debe utilizarse en producción.
+
+:::
+
+:::info macOS
+
+This feature can only be used on Windows. On macOS, it is ignored.
+
+:::
+
+### Fluent UI rendering availability
+
+The Fluent UI rendering is available in the following execution environments only:
+
+- Windows with [Windows App SDK](https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/downloads) version 1.7.3 installed (you need to install this SDK on any Windows machine displaying your forms).
+- Fusionado aplicación 4D [autónomo](../Desktop/building.md#build-stand-alone-application) o [cliente](../Desktop/building.md#build-client-application)
+- [**Test application** feature](../Menus/bars.md#previewing-menu-bars) available from the Run menu.
+
+:::note
+
+If the Windows App SDK is not properly installed, 4D will render all your forms in classic mode with no error.
+
+:::
+
+### Enabling the Fluent UI rendering
+
+You can enable the Fluent UI rendering mode at the application level or at the form level. Form setting has priority over application setting.
+
+#### Application setting
+
+Check the **Use Fluent UI on Windows** option in the "Interface" page of the Settings dialog box.
+
+
+
+In this case, the Fluent UI rendering mode will be used by default on Windows for all forms.
+
+#### Form setting
+
+Each form can define its own rendering via the **Widget appearance** property. Las siguientes opciones están disponibles:
+
+- **Inherited**: inherits the global application setting (default),
+- **Classic**: uses the classic Windows style,
+- **Fluent UI**: enables the modern rendering based on Fluent UI.
+ 
+
+The corresponding [JSON form property](./properties_JSONref.md) is `fluentUI` with value undefined (i.e. inherited, default value), "true" or "false".
+
+### Features and limitations
+
+Fluent UI rendering offers modern and attractive controls, support of dark/light system themes, smoother rendering optimized for high-resolution displays, and consistent user experience aligned with recent Microsoft applications.
+
+When using 4D forms with Fluent UI rendering, you need to pay attention to the following points:
+
+- The `FORM Window theme` command returns the actual display theme of the current form. Possible values: "Classic" or "FluentUI". If there is no current form or the command is called on macOS, and empty string is returned.
+- If [`GET STYLE SHEET INFO`](../commands-legacy/get-style-sheet-info.md) is called in the context of a form, the information returned relates to the current appearance of the form (Classic or FluentUI). If the command is called outside the context of a form, the information returned relates to the [global project settings](#application-setting).
+- [`SET MENU ITEM STYLE`](../commands-legacy/set-menu-item-style.md) with `Underline` *itemStyle* parameter is not supported (ignored) for pop up menus.
+- A focus ring can be added to picture and text [inputs](../FormObjects/input_overview.md).
+- [Stepper](../FormObjects/stepper.md) form object does not support [double-click event](../Events/onDoubleClicked.md).
+- [Circle buttons](../FormObjects/button_overview.md#circle) are supported (similar as macOS).
+- The [`WA ZOOM IN`](../commands-legacy/wa-zoom-in.md) / [`WA ZOOM OUT`](../commands-legacy/wa-zoom-out.md) commands are not supported in Web areas with system rendering engine.
+
## Formularios heredados
Los formularios 4D pueden utilizar y ser utilizados como "formularios heredados", lo que significa que todos los objetos de *Formulario A* pueden ser utilizados en *Formulario B*. En este caso, *Formulario B* "hereda" los objetos de *Formulario A*.
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/properties_Display.md b/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/properties_Display.md
index b3a191cc8b7ee9..70acd1ce6ab087 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/properties_Display.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/properties_Display.md
@@ -104,7 +104,7 @@ Se pueden crear formatos de fecha personalizados utilizando varios patrones desc
:::note blankIfNull
-- Por defecto, una fecha null se muestra con ceros, por ejemplo 00/00/00. Con la opción "blankIfNull", una fecha null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado.
+- By default, a [null date](../Concepts/dt_date.md#date-literals) is displayed with zeros, e.g. 00/00/00. Con la opción "blankIfNull", una fecha null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado.
- Las [columnas list box](listbox_overview.md#list-box-columns) y los [pies List box](listbox_overview.md#list-box-footers) de tipo fecha utilizan siempre el comportamiento "blank if null" (no se puede desactivar).
:::
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/webArea_overview.md b/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/webArea_overview.md
index 1b6be15a37a604..deebe6ce0e1e73 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/webArea_overview.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/FormObjects/webArea_overview.md
@@ -9,6 +9,12 @@ Es posible crear varias áreas web en el mismo formulario. Tenga en cuenta, sin
Varias [acciones estándar](#standard-actions) dedicadas, numerosos [comandos de lenguaje](../category/web-area) así como [eventos de formulario](#form-events) genéricos y específicos permiten al desarrollador controlar el funcionamiento de las áreas web. Se pueden utilizar variables específicas para intercambiar información entre el área y el entorno 4D.
+:::info Displaying Qodly pages
+
+In 4D client/server applications, Web areas can be used to display Qodly pages and [share the remote user session](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas). This feature allows you to design web-based interfaces for your client/server desktop applications.
+
+:::
+
## Propiedades específicas
### Variables asociadas
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 7e2cc59e6c4e84..dc1ab8c8306146 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/Notes/updates.md
@@ -9,15 +9,28 @@ Lea [**Novedades en 4D 21**](https://blog.4d.com/en-whats-new-in-4d-21/), la ent
#### Lo más destacado
-- Support of **AI Vector Searches** in the [`query()`](../API/DataClassClass.md#query-by-vector-similarity) function and in the [`$filter`](../REST/$filter.md#vector-similarity) REST API.
+- Support of AI Vector Searches in the [`query()`](../API/DataClassClass.md#query-by-vector-similarity) function and in the [`$filter`](../REST/$filter.md#vector-similarity) REST API.
- Support of TLS encryption for the [4D.TCPConnection](../API/TCPConnectionClass.md#4dtcpconnectionnew) class.
+- Servidor Web:
+ - new [HTTP rules](../WebServer/http-rules.md) to customize HTTP response headers,
+ - ability to set [HTTP request handlers](../WebServer/http-request-handler.md) using a `handlers` property in the *settings* parameter of the Web server [`start()`](../API/WebServerClass.md#start) function,
+ - the Web server object contains new [`rules`](../API/WebServerClass.md#rules) and [`handlers`](../API/WebServerClass.md#handlers) properties.
+- New [ORDA events on data](../ORDA/orda-events.md): validateSave, saving, afterSave, validateDrop, dropping, afterDrop.
- New option allowing to use certificates from Windows Certificate Store instead of a local certificates folder in [`HTTPRequest`](../API/HTTPRequestClass.md#4dhttprequestnew) and [`HTTPAgent`](../API/HTTPAgentClass.md#4dhttpagentnew) classes.
+- Cliente/servidor:
+ - You can display Qodly pages in Web areas and [share the remote client session](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+ - The [QUIC network layer](../settings/client-server.md#network-layer) has been enhanced to handle network interface changes transparently, for example when you travel with your laptop. See [this blog post](https://blog.4d.com/work-and-move-with-quic-and-network-switching).
- You can now [create components directly from the host project](../Extensions/develop-components.md#creating-components) and [edit their code from a dedicated tab](../Extensions/develop-components.md#editing-all-component-code) in the 4D Explorer without leaving or restarting the project.
- The 4D product activation step has been simplified and automated during [sign-in](../GettingStarted/Installation.md#sign-in).
- 4D AIKit component: new features to [invoke a specific tool automatically](../aikit/Classes/OpenAIChatHelper.md#registertool) and [specify a response format](../aikit/Classes/OpenAIChatCompletionsParameters.md#response-format).
- Lenguaje 4D:
- New "trim" commands to remove leading and trailing spaces from a string: [`Trim`](../commands/trim.md), [`Trim start`](../commands/trim-start.md), and [`Trim end`](../commands/trim-end.md).
- Los comandos [`Num`](../commands/num.md) y [`String`](../commands/string.md) han sido actualizados para soportar conversiones en diferentes bases (radix).
+- [**Fixed bug list**](https://bugs.4d.fr/fixedbugslist?version=21): list of all bugs that have been fixed in 4D 21.
+
+#### Vista previa para desarrolladores
+
+[**Fluent UI** rendering for 4D forms](../FormEditor/forms.md#fluent-ui-rendering-developer-preview) is proposed in Developer Preview during the beta test program.
#### Cambios de comportamiento
@@ -67,6 +80,7 @@ In binary databases, you need to select the required components in the 4D instal
- Web services (SOAP): when [scalable sessions](../WebServer/sessions.md#enabling-web-sessions) are enabled, web services now run in [**preemptive processes**](../Develop/preemptive.md) in compiled mode. Make sure your SOAP code is thread-safe.
- Web server: the support of deprecated `4DSYNC/` and `4DCGI/` URLs is removed. No specific processing is done on these URLs anymore.
- Web user sessions are now returned by [`Process activity`](../commands/process-activity.md).
+- The [`HIGHLIGHT TEXT`](../commands/highlight-text) command is now supported in the context of subforms.
#### Cambios de comportamiento
@@ -74,6 +88,30 @@ In binary databases, you need to select the required components in the 4D instal
- Web server: the support of deprecated `4DSYNC/` and `4DCGI/` URLs is removed. No specific processing is done on these URLs anymore.
- Web user sessions are now returned by [`Process activity`](../commands/process-activity.md).
+#### Cambios de comportamiento
+
+:::caution Index rebuild
+
+4D 21 includes an ICU library update ([see below](#library-table)) which will force an automatic rebuild of indexes of type alpha, text, and object. Dependiendo del tamaño del archivo de datos, esta operación puede llevar un tiempo y puede ser necesario planificarla.
+
+:::
+
+- Web services (SOAP): when [scalable sessions](../WebServer/sessions.md#enabling-web-sessions) are enabled, web services now run in [**preemptive processes**](../Develop/preemptive.md) in compiled mode. Make sure your SOAP code is thread-safe.
+- Web server: the support of deprecated `4DSYNC/` and `4DCGI/` URLs is removed. No specific processing is done on these URLs anymore.
+- Web user sessions are now returned by [`Process activity`](../commands/process-activity.md).
+- The [`HIGHLIGHT TEXT`](../commands/highlight-text) command is now supported in the context of subforms.
+- **Components no longer embedded**: starting with 4D 21, components developed by 4D (4D NetKit, 4D SVG..., see [this list](../Extensions/overview-old.md)) are no longer embedded in the 4D application. When upgrading a project to 4D 21 or higher, a dialog box is displayed:
+ 
+ \- **Import**: import automatically 4D components as dependencies to the project
+ \- **Ignore**: do not import components and let you [manage components manually](../Project/components.md)
+ \- **Ask later**: do not import components and display the dialog at the next project opening.
+
+:::note
+
+In binary databases, you need to select the required components in the 4D installer or download them from the [4D Product Download portal](https://product-download.4d.com/?type=components).
+
+:::
+
## 4D 20 R10
Lea las [**Novedades en 4D 20 R10**](https://blog.4d.com/en-whats-new-in-4d-20-R10/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R10.
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/ORDA/orda-events.md b/i18n/es/docusaurus-plugin-content-docs/current/ORDA/orda-events.md
index 163716adebf666..086ad86ee9d7d0 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/ORDA/orda-events.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/ORDA/orda-events.md
@@ -1,13 +1,14 @@
---
id: orda-events
-title: Eventos ORDA
+title: Events
---
Historia
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------- |
-| 20 R10 | touched event added |
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------------------------------------------------------------- |
+| 21 | Added events: validateSave / saving / afterSave / validateDrop / dropping / afterDrop |
+| 20 R10 | touched event added |
@@ -15,6 +16,12 @@ ORDA events are functions that are automatically invoked by ORDA each time entit
No se puede activar directamente la ejecución de la función de evento. Events are called automatically by ORDA based on user actions or operations performed through code on entities and their attributes.
+:::tip Entrada de blog relacionada
+
+[ORDA – Handle an event-driven logic during data persistence actions](https://blog.4d.com/orda-handle-an-event-driven-logic-during-data-persistence-actions)
+
+:::
+
:::info Nota de compatibilidad
ORDA events in the datastore are equivalent to triggers in the 4D database. However, actions triggered at the 4D database level using the 4D classic language commands or standard actions do not trigger ORDA events.
@@ -51,11 +58,21 @@ Con otras configuraciones remotas (p. ej. Qodly applications, [REST API requests
La siguiente tabla lista los eventos ORDA junto con sus reglas.
-| Evento | Nivel | Nombre de la función | (C/S) Ejecutado en |
-| :------------------------- | :------- | :------------------------------------------------------ | :------------------------------------------------------------------: |
-| Instanciación de entidades | Entity | [`constructor()`](./ordaClasses.md#class-constructor-1) | client |
-| Atributo tocado | Atributo | `event touched ()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword |
-| | Entity | `event touched()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword |
+| Evento | Nivel | Nombre de la función | (C/S) Ejecutado en | Can stop action by returning an error |
+| :------------------------- | :------- | :------------------------------------------------------ | :------------------------------------------------------------------: | ------------------------------------- |
+| Instanciación de entidades | Entity | [`constructor()`](./ordaClasses.md#class-constructor-1) | client | no |
+| Atributo tocado | Atributo | `event touched ()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword | no |
+| | Entity | `event touched()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword | no |
+| Before saving an entity | Atributo | `validateSave ()` | server | sí |
+| | Entity | `validateSave()` | server | sí |
+| When saving an entity | Atributo | `saving ()` | server | sí |
+| | Entity | `saving()` | server | sí |
+| After saving an entity | Entity | `afterSave()` | server | no |
+| Before dropping an entity | Atributo | `validateDrop ()` | server | sí |
+| | Entity | `validateDrop()` | server | sí |
+| When dropping an entity | Atributo | `dropping ()` | server | sí |
+| | Entity | `dropping()` | server | sí |
+| After dropping an entity | Entity | `afterDrop()` | server | no |
:::note
@@ -67,11 +84,37 @@ The [`constructor()`](./ordaClasses.md#class-constructor-1) function is not actu
Event functions accept a single *event* object as parameter. When the function is called, the parameter is filled with several properties:
-| Nombre de propiedad | Disponibilidad | Tipo | Descripción |
-| :------------------ | :------------------------------------------- | :----- | :-------------------------------------------------------------------------- |
-| `kind` | siempre | String | Nombre del evento ("touched") |
-| *attributeName* | Sólo para eventos que involucran un atributo | String | Nombre del atributo (por ejemplo, "nombre") |
-| *dataClassName* | siempre | String | Nombre de la Dataclass (*ej.* "Company") |
+| Nombre de propiedad | Disponibilidad | Tipo | Descripción | |
+| :------------------ | :----------------------------------------------------------------------------------------------------------------------- | :------------------- | :-------------------------------------------------------------------------------------------------------------------- | - |
+| "kind" | siempre | String | Event name: "touched", "validateSave", "saving", "afterSave", "validateDrop", "dropping", "afterDrop" | |
+| *attributeName* | Only for events implemented at attribute level ("validateSave", "saving", "validateDrop", "dropping") | String | Nombre del atributo (por ejemplo, "nombre") | |
+| *dataClassName* | siempre | String | Nombre de la Dataclass (*ej.* "Company") | |
+| "savedAttributes" | Only in [`afterSave()`](#function-event-aftersave) | Collection of String | Names of attributes properly saved | |
+| "droppedAttributes" | Only in [`afterDrop()`](#function-event-afterdrop) | Collection of String | Names of attributes properly dropped | |
+| "saveStatus" | Only in [`afterSave()`](#function-event-aftersave) | String | "success" if the save was successful, "failed" otherwise | |
+| "dropStatus" | Only in [`afterDrop()`](#function-event-afterdrop) | String | "success" if the drop was successful, "failed" otherwise | |
+
+## Error object
+
+[Some event functions](#summary-table) can return an **error object** to raise an error and stop the running action.
+
+When an error occurs in an event, the other events are stopped at the first raised error and the action (save or drop) is also stopped. This error is sent before other potential errors like [stamp has changed, entity locked](../API/EntityClass.md#save), etc.
+
+### Error object properties
+
+| Propiedad | Tipo | Descripción | Set by the developer |
+| ------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
+| errCode | Integer | Same as for [`Last errors`](../commands/last-errors.md) command | Sí |
+| message | Text | Same as for [`Last errors`](../commands/last-errors.md) command | Sí |
+| extraDescription | Object | Free information to set up | Sí |
+| seriousError | Boolean | Used only with validate events (see below).
`True`: creates a [serious (unpredictable) error](../Concepts/error-handling.md#predictable-vs-unpredictable-errors) and triggers an exception. Adds the `dk status serious validation error` status
creates only a [silent (predictable) error](../Concepts/error-handling.md#predictable-vs-unpredictable-errors). Adds the `dk status validation failed` status
| Yes (default is false) |
+| componentSignature | Text | Always "DBEV" | No |
+
+- [Serious errors](../Concepts/error-handling.md#predictable-vs-unpredictable-errors) are stacked in the `errors` collection property of the **Result object** returned by the [`save()`](../API/EntityClass.md#save) or [`drop()`](../API/EntityClass.md#drop) functions.
+- In case of an error triggered by a **validate** event, the `seriousError` property allows you to choose the level of the error to generate:
+ - If **true**: a serious error is thrown and should be handled by the [error processing code](../Concepts/error-handling.md#predictable-vs-unpredictable-errors), such as a [try catch](../Concepts/error-handling.md#trycatchend-try). In the result object of the calling function, `status` gets `dk status serious validation error` and `statusText` gets "Serious Validation Error". The error is raised at the end of the event and reach the client requesting the save/drop action (REST client for example).
+ - If **false** (default): a [silent (predictable) error is generated](../Concepts/error-handling.md#predictable-vs-unpredictable-errors). It does not trigger any exception and is not stacked in the errors returned by the [`Last errors`](../commands/last-errors.md) command. In the result object of the calling function, `status` gets `dk status validation failed` and `statusText` gets "Mild Validation Error".
+- In case of an error triggered by a **saving/dropping** event, when an error object is returned, the error is always raised as a serious error whatever the `seriousError` property value.
## Event function description
@@ -87,8 +130,8 @@ Event functions accept a single *event* object as parameter. When the function i
This event is triggered each time a value is modified in the entity.
-- if you defined the function at the entity level (first syntax), it is triggered for modifications on any attribute of the entity.
-- if you defined the function at the attribute level (second syntax), it is triggered only for modifications on this attribute.
+- If you defined the function at the entity level (first syntax), it is triggered for modifications on any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is triggered only for modifications on this attribute.
This event is triggered as soon as the 4D Server / 4D engine can detect a modification of attribute value which can be due to the following actions:
@@ -101,7 +144,7 @@ This event is triggered as soon as the 4D Server / 4D engine can detect a modifi
The function receives an [*event* object](#event-parameter) as parameter.
-If this event [throws](../commands-legacy/throw.md) an error, it will not stop the undergoing action.
+If this function [throws](../commands/throw) an error, it will not stop the undergoing action.
:::note
@@ -271,10 +314,389 @@ Note over Qodly page: The People Qodly source lastname attribute is uppercased
```
+### `Function event validateSave`
+
+#### Sintaxis
+
+```4d
+Function event validateSave($event : Object)
+Function event validateSave ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is about to be saved.
+
+- if you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- if you defined the function at the attribute level (second syntax), it is called only for this attribute. This function is **not** executed if the attribute has not been touched in the entity.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following functions:
+
+- [`entity.save()`](../API/EntityClass.md#save)
+- [`dataClass.fromCollection()`](../API/DataClassClass.md#fromcollection)
+
+This event is triggered **before** the entity is actually saved and lets you check data consistency so that you can stop the action if needed. For example, you can check in this event that "departure date" < "arrival date".
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+:::note
+
+It is not recommended to update the entity within this function (using `This`).
+
+:::
+
+#### Ejemplo
+
+In this example, the user is not allowed to save a product with a margin lower than the average. In case of an invalid price attribute, you return an error object and thus, stop the save action.
+
+```4d
+// ProductsEntity class
+Function event validateSave margin($event : Object) : Object
+
+var $result : Object
+var $marginAverage : Real
+
+$marginAverage:=ds.Products.query("category= :1"; This.category).average("margin")
+
+If (This.margin<$marginAverage)
+ $result:={\
+ errCode: 1; \
+ message: "The margin of this product ("+String(This.margin)+") is under the average"; \
+ extraDescription: {\
+ info: "For the "+This.category+" category the margin average is: "+String($marginAverage)};\
+ fatalError: False}
+End if
+
+return $result
+
+```
+
+### `Function event saving`
+
+#### Sintaxis
+
+```4d
+Function event saving($event : Object)
+Function event saving ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is being saved.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity. The function is executed even if no attribute has been touched in the entity (e.g. in case of sending data to an external app each time a save is done).
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute. The function is **not** executed if the attribute has not been touched in the entity.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following functions:
+
+- [`entity.save()`](../API/EntityClass.md#save)
+- [`dataClass.fromCollection()`](../API/DataClassClass.md#fromcollection)
+
+This event is triggered **while** the entity is actually saved. If a [`validateSave()`](#function-event-validatesave) event function was defined, the `saving()` event function is called if no error was triggered by `validateSave()`. For example, you can use this event to create a document on a Google Drive account.
+
+:::note
+
+The business logic should raise errors which can't be detected during the `validateSave()` events, e.g. a network error
+
+:::
+
+During the save action, 4D engine errors can be raised (index, stamp has changed, not enough space on disk).
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Ejemplo
+
+When a product is saved, some information is logged to an external system which may be unavailable.
+
+```4d
+Function event saving($event : Object) : Object
+
+var $result; $status : Object
+var $log : cs.Entity
+var $remote : 4D.DataStoreImplementation
+
+Try
+ $remote:=Open datastore({hostname: "events@acme.com"}; "logs")
+ $log:=$remote.Logs.new()
+ $log.productId:=This.ID
+ $log.stamp:=Timestamp
+ $log.event:="Created by "+Current user()
+ $status:=$log.save()
+Catch
+ $result:={\
+ errCode: Last errors.last().errCode;\
+ message: Last errors.last().message; \
+ extraDescription: {info: "The external Logs can't be reached"}}
+End try
+
+return $result
+
+
+```
+
+### `Function event afterSave`
+
+#### Sintaxis
+
+```4d
+Function event afterSave($event : Object)
+// code
+```
+
+This event is triggered just after an entity is saved in the data file, when at least one attribute was modified. It is not executed if no attribute has been touched in the entity.
+
+This event is useful after saving data to propagate the save action outside the application or to execute administration tasks. For example, it can be used to send a confirmation email after data have been saved. Or, in case of error while saving data, it can make a rollback to restore a consistent state of data.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+- To avoid infinite loops, calling a [`save()`](../API/EntityClass.md#save) on the current entity (through `This`) in this function is **not allowed**. It will raise an error.
+- Throwing an [error object](#error-object) is **not supported** by this function.
+
+#### Ejemplo 1
+
+If an error occurred in the above saving event, the product is recorded in the ProductsInFailure dataclass so an employee can review it later.
+
+```4d
+// ProductsEntity class
+Function event afterSave($event : Object)
+
+var $failure : cs.ProductsInFailureEntity
+var $status : Object
+
+ // $event.status.errors is filled if the error comes from a validateSave event
+If (($event.status.success=False) && ($event.status.errors=Null))
+ $failure:=ds.ProductsInFailure.new()
+ $failure.name:=This.name
+ $failure.category:=This.category
+ $failure.costPrice:=This.costPrice
+ $failure.retailPrice:=This.retailPrice
+ $failure.reason:="Error during the save action"
+ $failure.stamp:=Timestamp
+ $status:=$failure.save()
+End if
+
+```
+
+### `Function event validateDrop`
+
+#### Sintaxis
+
+```4d
+Function event validateDrop($event : Object)
+Function event validateDrop ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is about to be dropped.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following features:
+
+- [`entity.drop()`](../API/EntityClass.md#drop)
+- [`entitySelection.drop()`](../API/DataClassClass.md#fromcollection)
+- [deletion control rules](https://doc.4d.com/4Dv20/4D/20.2/Relation-properties.300-6750290.en.html#107320) that can be defined at the database structure level.
+
+This event is triggered **before** the entity is actually dropped, allowing you to check data consistency and if necessary, to stop the drop action.
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Ejemplo 1
+
+Products can be deleted only if they have been flagged TO DELETE.
+
+```4d
+ //ProductsEntity class
+Function event validateDrop status($event : Object) : Object
+
+If (This.status != "TO DELETE")
+
+ var $result:= New object()
+ $result.errCode:=1
+ $result.message:="The record can't be deleted"
+ $result.extraDescription:={attribute; $event.attributeName; info: "The status must be TO DELETE"}
+ $result.fatalError:=False
+ return $result
+End if
+```
+
+#### Ejemplo 2
+
+The user can delete products if they are flagged as "TO DELETE" and if their creation year is < current year -3.
+
+```4d
+ //ProductsEntity class
+Function event validateDrop($event : Object) : Object
+
+var $yearOffSet : Integer
+$yearOffSet:=Year of(Current date)-3
+
+If ((This.status != "TO DELETE") || (Year of(This.creationDate) >= $yearOffSet))
+ var $result:=New object()
+ $result.errCode:=1
+ $result.message:="The record can't be deleted"
+ $result.extraDescription:={info: "The status must be TO DELETE and the creation year must be lower than " + String($yearOffSet)}
+ $result.fatalError:=False
+ return $result
+End if
+```
+
+### `Function event dropping`
+
+#### Sintaxis
+
+```4d
+Function event dropping($event : Object)
+Function event dropping ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is being dropped.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following features:
+
+- [`entity.drop()`](../API/EntityClass.md#drop)
+- [`entitySelection.drop()`](../API/DataClassClass.md#fromcollection)
+- [deletion control rules](https://doc.4d.com/4Dv20/4D/20.2/Relation-properties.300-6750290.en.html#107320) that can be defined at the database structure level.
+
+This event is triggered **while** the entity is actually dropped. If a [`validateDrop()`](#function-event-validatedrop) event function was defined, the `dropping()` event function is called if no error was triggered by `validateDrop()`.
+
+:::note
+
+The business logic should raise errors which cannot be detected during the `validateDrop()` events, e.g. a network error.
+
+:::
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Ejemplo 1
+
+When dropping an order with *totalPrice >= 500*, a log file is updated.
+
+```4d
+ //OrderEntity class
+Function event dropping totalPrice ($event : Object)
+
+var $log : cs.LogEntity
+var $status: Object
+
+If (This.totalPrice >= 500)
+
+ $log:=ds.Log.new()
+ $log.orderID:=This.ID
+ $log.orderPrice:=This.totalPrice
+ $log.event:="Drop"
+ $log.creationDate:=Current date()
+ $status:=$log.save()
+
+ If($status.success=False)
+ throw ({errCode: 1; message: "Error while updating the log file"})
+ End if
+End if
+
+```
+
+#### Ejemplo 2
+
+When a product is dropped, a log file is updated.
+
+```4d
+ //ProductsEntity class
+Function event dropping ($event : Object)
+
+var $log : cs.LogEntity
+var $status: Object
+
+$log:=ds.Log.new()
+$log.productID:=This.ID
+$log.productPrice:=This.price
+$log.event:="Drop"
+$log.creationDate:=Current date()
+$status:=$log.save()
+
+If($status.success=False)
+ throw ({errCode: 1; message:"Error while updating the log file"})
+End if
+```
+
+### `Function event afterDrop`
+#### Sintaxis
+
+```4d
+Function event afterDrop($event : Object)
+// code
+```
+This event is triggered just after an entity is dropped.
+This event is useful after dropping data to propagate the drop action outside the application or to execute administration tasks. For example, it can be used to send a cancellation email after data have been dropped. Or, in case of error while dropping data, it can log an information for the administrator to check data consistency.
+The function receives an [*event* object](#event-parameter) as parameter.
+- To avoid infinite loops, calling a [`drop()`](../API/EntityClass.md#drop) on the current entity (through `This`) in this function is **not allowed**. It will raise an error.
+- Throwing an [error object](#error-object) is **not supported** by this function.
+:::note
+
+The dropped entity is referenced by `This` and still exists in memory.
+
+:::
+
+#### Ejemplo 1
+
+Send a mail to the customer with the details of the dropped order.
+
+```4d
+ //OrderEntity class
+Function event afterDrop ($event : Object)
+
+var $oAuth2 : cs.NetKit.OAuth2Provider
+var $google : cs.NetKit.Google
+
+ //$param contains clientId, secretId...
+$oAuth2:=cs.NetKit.OAuth2Provider.new($param)
+$google:=cs.NetKit.Google.new($oAuth2; {mailType: "JMAP"})
+
+ //Email creation
+$email:=New object
+$email.from:="youremail@gmail.com"
+$email.to:="destinationmail@mail.com"
+$email.subject:="Your order is cancelled"
+$email.textBody:="Products numbers: " + This.products.number.join("-")
+
+ //Email sending
+$status:=$google.mail.send($email)
+```
+
+#### Ejemplo 2
+
+Create an action to do because there were errors in the [`dropping()`](#function-event-dropping) event.
+
+```4d
+ //ProductEntity class
+Function event afterDrop ($event : Object)
+
+var $action: cs.ActionEntity
+var $status: Object
+
+ // The drop action failed
+If($event.dropStatus = "failed")
+ $action:=ds.Action.new()
+ $action.label:=Last errors.first().message //message is "Error while dropping product XXX"
+ $action.status:="TO CHECK"
+ $status:=$action.save()
+End if
+
+```
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/ORDA/privileges.md b/i18n/es/docusaurus-plugin-content-docs/current/ORDA/privileges.md
index 170f48002e2034..2e61015157e2aa 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/ORDA/privileges.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/ORDA/privileges.md
@@ -17,9 +17,11 @@ Si un usuario intenta ejecutar una acción y no tiene los derechos de acceso ade

-### Ver también
+:::tip Related Blog posts
-Para una descripción detallada de toda la arquitectura de permisos, por favor lea el blog [**Filtrar acceso a sus datos con un sistema completo de permisos**](https://blog.4d.com/filter-access-to-your-data-with-a-complete-system-of-permissions/).
+[**Filter access to your data with a complete system of permissions**](https://blog.4d.com/filter-access-to-your-data-with-a-complete-system-of-permissions/)
+
+:::
## Resources
@@ -122,7 +124,7 @@ El archivo por defecto tiene el siguiente contenido:
{
"privileges": [
{
- "privilege": "none",
+ "privilege": "all",
"includes": []
}
],
@@ -134,12 +136,12 @@ El archivo por defecto tiene el siguiente contenido:
{
"applyTo": "ds",
"type": "datastore",
- "read": ["none"],
- "create": ["none"],
- "update": ["none"],
- "drop": ["none"],
- "execute": ["none"],
- "promote": ["none"]
+ "read": ["all"],
+ "create": ["all"],
+ "update": ["all"],
+ "drop": ["all"],
+ "execute": ["all"],
+ "promote": ["all"]
}
]
},
@@ -150,7 +152,8 @@ El archivo por defecto tiene el siguiente contenido:
```
-Para un nivel de seguridad más alto, el privilegio "none" se asigna a todos los permisos en el datastore, por lo tanto el acceso de datos en todo el objeto `ds` está deshabilitado por defecto. Se recomienda no modificar ni utilizar este privilegio de bloqueo, sino agregar permisos específicos a cada recurso que desee poner a disposición desde solicitudes web o REST ([ver ejemplo a continuación](#example-of-privilege-configuration)).
+For a highest level of security, the "all" privilege is assigned to all permissions in the datastore, thus data access on the whole `ds` object is disabled by default. The principle is as follows: assigning a permission is like putting a lock on a door. Only sessions with privilege having the corresponding key (i.e., a permission) will be able to open the lock.
+Se recomienda no modificar ni utilizar este privilegio de bloqueo, sino agregar permisos específicos a cada recurso que desee poner a disposición desde solicitudes web o REST ([ver ejemplo a continuación](#example-of-privilege-configuration)).
:::caution
@@ -264,14 +267,14 @@ End if
## Ejemplo de configuración de privilegios
-La buena práctica es mantener todos los datos bloqueados por defecto gracias al privilegio "none" y configurar el archivo `roles.json` para abrir sólo las partes controladas a las sesiones autorizadas. Por ejemplo, para permitir algunos accesos a sesiones invitadas:
+The good practice is to keep all data access locked by default thanks to the "all" privilege and to configure the `roles.json` file to only open controlled parts to authorized sessions. For example, to allow some accesses to "guest" sessions:
```json title="/Project/Sources/roles.json"
{
"privileges": [
{
- "privilege": "none",
+ "privilege": "all",
"includes": []
}
],
@@ -282,22 +285,22 @@ La buena práctica es mantener todos los datos bloqueados por defecto gracias al
"applyTo": "ds",
"type": "datastore",
"read": [
- "none"
+ "all"
],
"create": [
- "none"
+ "all"
],
"update": [
- "none"
+ "all"
],
"drop": [
- "none"
+ "all"
],
"execute": [
- "none"
+ "all"
],
"promote": [
- "none"
+ "all"
]
},
{
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 a68cafc8accf20..e0ab5ee9560f84 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/Project/architecture.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/Project/architecture.md
@@ -64,6 +64,7 @@ Este archivo de texto también puede contener llaves de configuración, en parti
| filters.json | Filtros definidos | JSON |
| dependencies.json | Nombres de [componentes a cargar](components.md) en el proyecto | JSON |
| HTTPHandlers.json | Personalizado [HTTP request handlers](../WebServer/http-request-handler.md) definido para el servidor web | JSON |
+| HTTPRules.json | Custom [HTTP response headers](../WebServer/http-responses.md) defined for the web server | JSON |
| styleSheets.css | Hojas de estilo CSS | CSS |
| styleSheets_mac.css | Hojas de estilo css de Mac (a partir de una base binaria convertida) | CSS |
| styleSheets_windows.css | Hojas de estilo css en Windows (a partir de una base binaria convertida) | CSS |
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/WebServer/http-request-handler.md b/i18n/es/docusaurus-plugin-content-docs/current/WebServer/http-request-handler.md
index 3c97eba7683dee..facb115670bf95 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/WebServer/http-request-handler.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/WebServer/http-request-handler.md
@@ -17,22 +17,33 @@ Custom HTTP request handlers meet various needs, including:
## Requisitos
-Se soportan gestores de solicitudes HTTP personalizados:
+Custom HTTP Request handlers are supported in the following context:
-- cuando las [sesiones escalables](./sessions.md#enabling-web-sessions) están habilitadas,
-- with the main Web Server only (HTTP Request handlers that may have been defined in [Web Servers of components](../WebServer/webServerObject.md) are ignored).
+- [scalable sessions](./sessions.md#enabling-web-sessions) or [no sessions](../settings/web.md#no-sessions) are enabled,
+- a web server run locally by 4D or 4D Server, including those [run by components](./webServerObject.md).
:::warning
-[Por defecto](../ORDA/privileges.md#default-file) por razones de seguridad, el acceso externo al datastore no está permitido en 4D. You need to configure the [ORDA privileges](../ORDA/privileges.md) to allow HTTP requests.
+For security reasons, external access to the datastore can be disallowed in 4D. You need to configure the [ORDA privileges](../ORDA/privileges.md) to allow HTTP requests.
:::
-## Archivo HTTPHandlers.json
+## How to set handlers
-Define sus manejadores de petición HTTP personalizados en un archivo de configuración llamado **HTTPHandlers.json** almacenado en la carpeta [`Project/Sources`](../Project/architecture.md#sources).
+You can declare HTTP Request handlers:
-This file contains all listened URL patterns, the handled verbs, and the code to be called. Los administradores se proporcionan en forma de colección en formato JSON.
+- in a configuration file named **HTTPHandlers.json** stored in the [`Project/Sources`](../Project/architecture.md#sources) folder of the project. HTTP Request handlers are loaded and applied in the main Web server once it is started.
+- using a [`.handlers`](../API/WebServerClass.md#handlers) property set in the *settings* parameter of the [start()](../API/WebServerClass.md#start) function, for any web server object:
+
+```4d
+WEB Server.start($settings.handlers) //set rules at web server startup
+```
+
+If both a **HTTPHandlers.json** file and a call to the [`WEB Server`](../commands/web-server.md) command with a valid `$settings.handlers` are used, the `WEB Server` command has priority.
+
+The json file (or the object in the *settings* parameter) contains all listened URL patterns, the handled verbs, and the code to be called.
+
+Handlers are provided as a collection.
At runtime, the first pattern matching the URL is executed, the others are ignored.
@@ -60,7 +71,7 @@ You must restart the Web server so that modifications made in this file are take
## Definición del gestor
-A handler is defined by:
+Un manejador está definido por:
- a listened URL pattern
- a function and its class where the code is implemented to handle the listened URL pattern
@@ -135,7 +146,7 @@ You declare the code to be executed when a defined URL pattern is intercepted us
You can use the "verbs" property in the handler definition to declare HTTP verbs that are supported in incoming requests for this handler. A request that uses a verb that is not explicitely allowed is automatically rejected by the server.
-You can declare several verbs, separated by a comma. Verb names are not case sensitive.
+You can declare several verbs, separated by a comma. Los nombres de verbos no distinguen entre mayúsculas y minúsculas.
Ej: `"verbs" : "PUT, POST"`
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/WebServer/http-rules.md b/i18n/es/docusaurus-plugin-content-docs/current/WebServer/http-rules.md
new file mode 100644
index 00000000000000..e087d1672ba793
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/current/WebServer/http-rules.md
@@ -0,0 +1,222 @@
+---
+id: http-rules
+title: HTTP Rules
+---
+
+You can define HTTP rules to control HTTP response headers for any requests received by the 4D web server, including REST requests. You can add, modify, or remove HTTP headers, send redirections or set the HTTP status. This feature is useful to implement security policies based upon the handling of headers.
+
+To define HTTP rules, you just need to write some RegEx to declare the URL patterns you want to control, as well as how to modify response headers. You can set these rules using a `HTTPRules.json` file stored in the project folder, or using the *settings* parameter [`start()`](../API/WebServerClass.md#start) function of the web server object.
+
+## Requisitos
+
+HTTP rules are supported in the following contexts:
+
+- [scalable sessions](./sessions.md#enabling-web-sessions) or [no sessions](../settings/web.md#no-sessions) are enabled,
+- a web server run locally by 4D or 4D Server, including those [run by components](./webServerObject.md).
+
+## How to set rules
+
+You can declare HTTP response rules:
+
+- in a configuration file named **HTTPRules.json** stored in the [`Project/Sources`](../Project/architecture.md#sources) folder of the project. Rules are loaded and applied in the main Web server once it is started.
+- using a [`.rules`](../API/WebServerClass.md#rules) property set in the *settings* parameter of the [`start()`](../API/WebServerClass.md#start) function, for any web server object:
+
+```4d
+WEB Server.start($settings.rules) //set rules at web server startup
+```
+
+If both a **HTTPRules.json** file and a call to the [`WEB Server`](../commands/web-server.md) command with a valid `$settings.rules` are used, the `WEB Server` command has priority.
+
+If the URI of the request does not match any of the RegEx patterns, the web server returns a default response.
+
+## Rules Definition
+
+The **HTTPRules.json** file or the [`.rules`](../API/WebServerClass.md#rules) property must contain a collection of **rule objects**.
+
+A rule object is defined by:
+
+- a RegEx describing a URL pattern, e.g. "^(.\*\\.(jpg|jpeg|png|gif))"
+- the name of the action to execute for the HTTP response, e.g. "removeHeaders"
+- the value of the action, e.g. "X-Unwanted-Header1"
+
+Other properties are ignored.
+
+### Patrones de la URL
+
+URL patterns are given using **regular expressions**. To declare a regular expression pattern, use the "RegExPattern" property name.
+
+Ex: `"RegExPattern": "/Test/Authorized/(.*)"`
+
+When the web server receives a request, **all** URL patterns are triggered sequentially in the given order, and all matching patterns are executed. In case of several actions modifying similar resources, the last executed action is taken into account.
+
+### Acciones
+
+The following action keywords are supported:
+
+| Palabras clave | Tipo de valor | Descripción |
+| --------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `removeHeaders` | Text or Collection of texts | Header(s) to remove from the HTTP responses. If a header to remove does not exist in the response header, it is ignored. |
+| `addHeaders` | Object | Name (text) and value (text) of header(s) to add to the HTTP responses. |
+| `setHeaders` | Object | Name (text) and value (text) of header(s) to modify in the HTTP responses. If a header to modify does not exist in the response header, it is added. |
+| `denyAccess` | Boolean | true to deny access to the resource, false to allow access. When the access to a resource is denied, the web server returns a 403 status by default |
+| `redirect` | Text | Redirection URL. When a redirection is triggered, the web server returns a 302 status by default |
+| `status` | Number | HTTP status |
+
+### Non-modifiable headers
+
+The following headers could not be modified by the `removeHeaders`, `setHeaders`, or `addHeaders` actions:
+
+- "Date",
+- "Content-Length"
+
+Modifying these headers do not generate errors, however modifications will be ignored.
+
+### Current rules
+
+You can know the current rules using the [`.rules` property of the Web Server object](../API/WebServerClass.md#rules):
+
+```
+var $rules : Collection
+$rules:=WEB Server.rules //current rules
+```
+
+## Ejemplos
+
+Rules can be set using a `HTTPRules.json` file or the *settings* parameter of the [`.start()`](../API/WebServerClass.md#start) web server function.
+
+### Using a HTTPRules.json file
+
+```json
+
+[
+ {
+ "comment": "All requests: allow GET method for, remove 'Server' header and set security headers",
+ "regexPattern": "/(.*)",
+ "setHeaders": {
+ "Allow": "GET",
+ "X-Frame-Options": "SAMEORIGIN",
+ "Content-Security-Policy": "default-src 'self'"
+ },
+ "removeHeaders": [
+ "Server"
+ ]
+ },
+ {
+ "comment": "REST requests: allow POST method",
+ "regexPattern": "/rest/(.*)",
+ "addHeaders": {
+ "Allow": "POST"
+ }
+ },
+ {
+ "comment": "HTML files in 'doc' folder: set cache control",
+ "regexPattern": "/docs/(.*).html",
+ "setHeaders": {
+ "Cache-Control": "max-age=3600"
+ },
+ "removeHeaders": [
+ "X-Powered-By"
+ ]
+ },
+ {
+ "comment": "Status 503 on 'maintenance' page",
+ "regexPattern": "^/maintenance.html",
+ "status": 503
+ },
+ {
+ "comment": "Redirect CSS and JS files",
+ "regexPattern": "^(.*\\\\.(css|js))",
+ "redirect": "https://cdn.example.com/"
+ },
+ {
+ "comment": "Redirect images with permanent status code",
+ "regexPattern": "^(.*\\\\.(jpg|jpeg|png|gif))",
+ "redirect": "https://cdn.example.com/images/",
+ "status": 301
+ },
+ {
+ "comment": "Deny access for all resources placed in the 'private' folder",
+ "regexPattern": "/private/(.*)",
+ "denyAccess": true
+ },
+ {
+ "comment": "Allow access to all resources placed in the 'private/allowed' folder",
+ "regexPattern": "/private/allowed/(.*)",
+ "denyAccess": false
+ }
+]
+
+```
+
+### Using a *settings* parameter
+
+```4d
+var $rule:={}
+
+var $settings:={}
+
+$settings.rules:=[]
+
+$rule:={}
+$rule.comment:="All requests: allow GET method for, remove 'Server' header and set security headers"
+$rule.regexPattern:="/(.*)"
+$rule.setHeaders:={Allow: "GET"}
+$rule.setHeaders["X-Frame-Options"]:="SAMEORIGIN"
+$rule.setHeaders["Content-Security-Policy"]:="default-src 'self'"
+$rule.removeHeaders:=["Server"]
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="REST requests: allow POST method"
+$rule.regexPattern:="/rest/(.*)"
+$rule.addHeaders:={Allow: "POST"}
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="HTML files in 'doc' folder: set cache control"
+$rule.regexPattern:="/docs/(.*).html"
+$rule.setHeaders:={}
+$rule.setHeaders["Cache-Control"]:="max-age=3600"
+$rule.removeHeaders:=["X-Powered-By"]
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Status 503 on 'maintenance' page"
+$rule.regexPattern:="^/maintenance.html"
+$rule.status:=503
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Redirect CSS and JS files"
+$rule.regexPattern:="^(.*\\\\.(css|js))"
+$rule.redirect:="https://cdn.example.com/"
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Redirect images with permanent status code"
+$rule.regexPattern:="^(.*\\\\.(jpg|jpeg|png|gif))"
+$rule.redirect:="https://cdn.example.com/images/"
+$rule.status:=301
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Deny access for all resources placed in the 'private' folder"
+$rule.regexPattern:="/private/(.*)"
+$rule.denyAccess:=True
+$settings.rules.push($rule)
+
+$rule:={}
+$rule.comment:="Allow access to all resources placed in the 'private/allowed' folder"
+$rule.regexPattern:="/private/allowed/(.*)"
+$rule.denyAccess:=False
+$settings.rules.push($rule)
+
+$return:=WEB Server.start($settings)
+
+```
+
+:::tip Entrada de blog relacionada
+
+[New Way to Control Your HTTP Responses](https://blog.4d.com/new-way-to-control-your-http-responses/)
+
+:::
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/WebServer/sessions.md b/i18n/es/docusaurus-plugin-content-docs/current/WebServer/sessions.md
index fe9326d7a213cd..b2a3a87835a17c 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/WebServer/sessions.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/WebServer/sessions.md
@@ -213,6 +213,12 @@ El servidor web 4D le permite generar, compartir y utilizar tokens de sesión OT
In 4D, OTP session tokens are useful when calling external URLs and being called back in another browser or device (mobile/computer). Typically, a third-party application sends a confirmation email containing a callback link on which the user has to click. The callback link includes the OTP token, so that the session which triggered the callback is loaded along with its data and privileges. This principle allows you to share the same session on multiple devices. Gracias a esta arquitectura, la [cookie de sesión](#session-implementation) no está expuesta en la red, lo que elimina el riesgo de un ataque de hombre en el medio.
+:::tips Entradas de blog relacionadas
+
+[Connect Your Web Apps to Third-Party Systems](https://blog.4d.com/connect-your-web-apps-to-third-party-systems/)
+
+:::
+
### Generalidades
La secuencia básica de uso de un testigo de sesión OTP en una aplicación web 4D es la siguiente:
@@ -477,8 +483,4 @@ Un testigo de sesión tiene una vida útil, y la propia sesión tiene una vida
Una sesión solo se restaura mediante un token si tanto la vida útil del token de sesión como la vida útil de la sesión no han expirado. En otros casos (el testigo de sesión ha caducado y/o la propia sesión ha caducado), se crea una sesión de invitado cuando se recibe una petición web con un testigo de sesión.
-:::note
-
-Para obtener más información, consulte la entrada de blog [Conecte sus aplicaciones web a sistemas de terceros](https://blog.4d.com/connect-your-web-apps-to-third-party-systems/).
-:::
\ No newline at end of file
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 dbbbce5acd7947..2d506c2ba0ee11 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
@@ -124,7 +124,7 @@ When using `json_schema` type, you can specify:
- **`schema`**: The JSON schema definition
- **`strict`**: Whether to enforce strict adherence to the schema
-### Important Notes
+### Notas Importantes
- Not all models support structured outputs (json_object or json_schema), so check model capabilities before using them.
- When using `json_object` format, you should include instructions in your system message to respond in JSON format
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatHelper.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatHelper.md
index f1e97463ac8b55..6136f03703b7cb 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatHelper.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIChatHelper.md
@@ -56,7 +56,7 @@ $result:=$chatHelper.prompt("Why 42?")
Resets the chat context by clearing all messages and unregistering all tools. This effectively starts a fresh conversation while keeping the system prompt and parameters intact.
-#### Reset Example
+#### Ejemplo de reinicio
```4D
$chatHelper.prompt("Hello!")
@@ -65,30 +65,42 @@ $chatHelper.reset() // Clear all previous messages and tools
### registerTool()
-**registerTool**(*tool* : Object; *handler* : 4D.Function)
+**registerTool**(*tool* : Object; *handler* : Object)
-| Parámetros | Tipo | Descripción |
-| ---------- | --------------------------- | ---------------------------------------------------------------------------------------- |
-| *tool* | Object | The tool definition object (or [OpenAITool](OpenAITool.md) instance) |
-| *handler* | 4D.Function | The function to handle tool calls (optional if defined inside *tool*) |
+| Parámetros | Tipo | Descripción |
+| ---------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| *tool* | Object | The tool definition object (or [OpenAITool](OpenAITool.md) instance) |
+| *handler* | Object | The function to handle tool calls ([4D.Function](../../API/FunctionClass.md) or Object), optional if defined inside *tool* as *handler* property |
Registers a tool with its handler function for automatic tool call handling.
-If the handler is not provided, the tool's `handler` property will be used.
+
+The *handler* parameter can be:
+
+- A **4D.Function**: Direct handler function
+- An **Object**: An object containing a `formula` property matching the tool function name
The handler function receives an object containing the parameters passed from the OpenAI tool call. This object contains key-value pairs where the keys match the parameter names defined in the tool's schema, and the values are the actual arguments provided by the AI model.
#### Register Tool Example
```4D
-// Define a simple tool
+// Example 1: Simple registration with direct handler
var $tool:={type: "function"; function: {name: "get_weather"; description: "Get current weather"; parameters: {type: "object"; properties: {location: {type: "string"; description: "City name"}}}}}
-
-// Define a handler function that receives an argument { location: "a city" }
var $handler:=Formula(return "Sunny, 25°C in "+$1.location)
$chatHelper.registerTool($tool; $handler)
-// or
+
+// Example 2: Tool with handler property (no second parameter needed)
+var $tool:={name: "calculate"; description: "Perform calculations"; handler: Formula(return String(Num($1.expression)))}
+$chatHelper.registerTool($tool)
+
+// Example 3: Using object notation
$chatHelper.registerTool({tool: $tool; handler: $handler})
+
+// Example 4: Handler as object with formula matching tool name
+var $tool:={name: "getTime"; description: "Get current time"}
+var $handlerObj:=cs.MyTimeTool.new() // class with a getTime function
+$chatHelper.registerTool($tool; $handlerObj)
```
### registerTools()
@@ -99,34 +111,64 @@ $chatHelper.registerTool({tool: $tool; handler: $handler})
| ------------------- | ------- | -------------------------------------------------------- |
| *toolsWithHandlers* | Variant | Object or Collection containing tools and their handlers |
-Registers multiple tools at once. The parameter can be either an object with function names as keys, or a collection of tool objects.
+Registers multiple tools at once. The parameter can be:
+
+- **Collection**: Array of tool objects (with handlers embedded or separate)
+- **Object**: Object with function names as keys mapping to tool definitions
+- **Object with `tools` attribute**: Object containing a `tools` collection and formula properties matching tool names
#### Register Multiple Tools Example
-```4D
-// Simple approach: handlers defined directly in tools
-var $weatherTool:={type: "function"; function: {name: "get_weather"; description: "Get current weather"; parameters: {type: "object"; properties: {location: {type: "string"; description: "City name"}}}}; \
- handler: Formula(return "Sunny, 25°C in "+$1.location)}
-var $calculatorTool:={type: "function"; function: {name: "calculate"; description: "Perform calculations"; parameters: {type: "object"; properties: {expression: {type: "string"; description: "Math expression"}}}}; \
- handler: Formula(return String(Num($1.expression)))}
+##### Example 1: Collection format with handlers in tools
-var $tools:={}
-$tools.get_weather:=$weatherTool
-$tools.calculate:=$calculatorTool
-
-$chatHelper.registerTools($tools)
+```4D
+var $weatherTool:={name: "getWeather"; description: "Get current weather"; handler: Formula(return "Sunny, 25°C in "+$1.location)}
+var $calculatorTool:={name: "calculate"; description: "Perform calculations"; handler: Formula(return String(Num($1.expression)))}
-// Using collection format
$chatHelper.registerTools([$weatherTool; $calculatorTool])
+```
-// Alternative: separate tool definitions from handlers (useful for better code organization)
+##### Example 2: Object format with separate tool and handler
+
+```4D
var $toolsWithSeparateHandlers:={}
-$toolsWithSeparateHandlers.get_weather:={tool: $weatherToolDefinition; handler: $weatherHandler}
+$toolsWithSeparateHandlers.getWeather:={tool: $weatherToolDefinition; handler: $weatherHandler}
$toolsWithSeparateHandlers.calculate:={tool: $calculatorToolDefinition; handler: $calculatorHandler}
$chatHelper.registerTools($toolsWithSeparateHandlers)
```
+##### Example 3: Object with tools collection attribute and formula properties
+
+MyTools class:
+
+```4D
+
+Class constructor
+ this.tools:=[{name: "getWeather"; description: "Get current weather"}; \
+ {name: "getTime"; description: "Get current time"}] // Collection of tool definitions
+
+Function getWeather($parameters: Object)
+ return "Sunny, 25°C"
+
+Function getTime($parameters: Object)
+ return String(Current time)
+```
+
+```4D
+$chatHelper.registerTools(cs.MyTools.new())
+```
+
+##### Example 4: Simple object format with tools as properties
+
+```4D
+var $tools:={}
+$tools.getWeather:=$weatherTool // Tool with handler property
+$tools.calculate:=$calculatorTool // Tool with handler property
+
+$chatHelper.registerTools($tools)
+```
+
### unregisterTool()
**unregisterTool**(*functionName* : Text)
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIParameters.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIParameters.md
index 521e885edf667e..c9d5d0ca9004d2 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIParameters.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAIParameters.md
@@ -28,6 +28,17 @@ Use these callback properties for more granular control over success and error h
See [documentation about asynchronous code for examples](../asynchronous-call.md)
+Use these callback properties for more granular control over success and error handling:
+
+| Propiedad | Tipo | Descripción |
+| ------------ | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `onResponse` | 4D.Function | A function to be called asynchronously when the request finishes **successfully**. Asegúrese de que el proceso actual no termina. |
+| `onError` | 4D.Function | A function to be called asynchronously when the request finishes **with errors**. Asegúrese de que el proceso actual no termina. |
+
+> The callback function will receive the same result object type (one of [OpenAIResult](./OpenAIResult.md) child classes) that would be returned by the function in synchronous code.
+
+See [documentation about asynchronous code for examples](../asynchronous-call.md)
+
### Propiedades de la red
| Propiedad | Tipo | Descripción |
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAITool.md b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAITool.md
index db6ea2e06980dc..4a2bbe4632aec8 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAITool.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/aikit/Classes/OpenAITool.md
@@ -15,10 +15,10 @@ See [OpenAIMessage](OpenAIMessage.md) to see how to responds to a tool call.
### Root Properties
-| Propiedad | Tipo | Por defecto | Descripción |
-| --------- | ------- | ------------ | ------------------------------------------------------------------------------------------------------------------------ |
-| `tipo` | Text | `"function"` | The type of tool. Currently supports `"function"`, `"custom"`, and other built-in types. |
-| `strict` | Boolean | `False` | Whether to enforce strict schema validation for function parameters. |
+| Propiedad | Tipo | Por defecto | Descripción |
+| --------- | ------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------ |
+| `tipo` | Text | `"function"` | El tipo de herramienta. Currently supports `"function"`, `"custom"`, and other built-in types. |
+| `strict` | Boolean | `False` | Whether to enforce strict schema validation for function parameters. |
### Common Properties
@@ -39,12 +39,12 @@ See [OpenAIMessage](OpenAIMessage.md) to see how to responds to a tool call.
**new**(*object* : Object) : OpenAITool
-| Parámetros | Tipo | Descripción |
-| ---------- | ---------- | --------------------------------- |
-| *object* | Object | Configuration object for the tool |
-| Resultado | OpenAITool | New instance of OpenAITool |
+| Parámetros | Tipo | Descripción |
+| ---------- | ---------- | ----------------------------------------- |
+| *object* | Object | Objeto de configuración de la herramienta |
+| Resultado | OpenAITool | New instance of OpenAITool |
-Creates a new OpenAITool instance. The constructor accepts both simplified format and OpenAI API format.
+Crea una nueva instancia de OpenAITool. The constructor accepts both simplified format and OpenAI API format.
#### Supported formats
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormEditor/winui-form.png b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormEditor/winui-form.png
new file mode 100644
index 00000000000000..44f0b153852027
Binary files /dev/null and b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormEditor/winui-form.png differ
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormEditor/winui-setting.png b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormEditor/winui-setting.png
new file mode 100644
index 00000000000000..ad71386b9acada
Binary files /dev/null and b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormEditor/winui-setting.png differ
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormObjects/fluentui-form.png b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormObjects/fluentui-form.png
new file mode 100644
index 00000000000000..00d3b1d2d663ef
Binary files /dev/null and b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormObjects/fluentui-form.png differ
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormObjects/fluentui-setting.png b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormObjects/fluentui-setting.png
new file mode 100644
index 00000000000000..e8c5e02f62431f
Binary files /dev/null and b/i18n/es/docusaurus-plugin-content-docs/current/assets/en/FormObjects/fluentui-setting.png differ
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/get-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/get-database-parameter.md
index 2c262c04c94815..2550c0af3456b0 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/get-database-parameter.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/get-database-parameter.md
@@ -977,6 +977,27 @@ Este selector permite suspender/reanudar todas las operaciones de registro inici
+### TCPUDP log recording (131)
+
+**Scope:** 4D application.
+
+**Kept between two sessions:** No.
+
+**Possible values:** `0`: Logging disabled (default), `1`: Logging enabled.
+
+**Description:** Enables or disables the `4DTCPUDPLog.txt` file for logging TCP events.
+
+
+
+### RDP optimization (133)
+
+**Scope:** 4D application.
+
+**Kept between two sessions:** No.
+
+**Possible values:** `0`: Disabled (default), `1`: Enabled.
+
+**Description:** Enables or disables optimizations for RDP (Remote Desktop Protocol). When enabled, optimizes in particular the use of shared clipboard in RDP connections, which can otherwise lead to freezing issues. Note that this selector disables the support in clipboard for images encoded as data uri in raw text (only concerns images dropped or explicitly copied as text from a browser).
## Selectores hilo seguro
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/set-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/set-database-parameter.md
index 90f91fef5be0e4..2aa47763c6f437 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/set-database-parameter.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/commands-legacy/set-database-parameter.md
@@ -975,6 +975,27 @@ Para más información sobre los archivos 4DIMAPLog\_X.txt, consulte la sección
Este selector permite suspender/reanudar todas las operaciones de registro iniciadas en la aplicación (excepto los registros ORDA). Esta función puede ser útil para aligerar temporalmente las tareas de la aplicación 4D o programar las operaciones de registro.
+### TCPUDP log recording (131)
+
+**Scope:** 4D application.
+
+**Kept between two sessions:** No.
+
+**Possible values:** `0`: Logging disabled (default), `1`: Logging enabled.
+
+**Description:** Enables or disables the `4DTCPUDPLog.txt` file for logging TCP events.
+
+
+
+### RDP optimization (133)
+
+**Scope:** 4D application.
+
+**Kept between two sessions:** No.
+
+**Possible values:** `0`: Disabled (default), `1`: Enabled.
+
+**Description:** Enables or disables optimizations for RDP (Remote Desktop Protocol). When enabled, optimizes in particular the use of shared clipboard in RDP connections, which can otherwise lead to freezing issues. Note that this selector disables the support in clipboard for images encoded as data uri in raw text (only concerns images dropped or explicitly copied as text from a browser).
@@ -1012,6 +1033,7 @@ La siguiente instrucción evitará un posible problema de timeout:
...
```
+
#### Ejemplo 2
Este ejemplo forza temporalmente la ejecución de un comando búsqueda por fórmula en el equipo cliente:
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/commands/session.md b/i18n/es/docusaurus-plugin-content-docs/current/commands/session.md
index 0a3afd2bb9e93f..c7a55da29c5d8a 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/commands/session.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/commands/session.md
@@ -57,6 +57,7 @@ El objeto `Session` de las sesiones cliente remotas está disponible desde:
- Métodos proyecto que tienen el atributo [Ejecutar en el Servidor](../Project/code-overview.md#execute-on-server) (se ejecutan en el proceso "twinned" del proceso cliente),
- Triggers,
+- ORDA [funciones del modelo de datos](../ORDA/ordaClasses.md) (excepto las declaradas con la palabra clave [`local`](../ORDA/ordaClasses.md#local-functions),
- Los métodos base `On Server Open Connection` y `On Server Shutdown Connection` de la base de datos.
Para más información sobre las sesiones usuario remoto, por favor consulte el párrafo [**Sesiones usuario cliente remoto**](../Desktop/clientServer.md#remote-user-sessions).
diff --git a/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md b/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md
index 40f657ba12dfd0..ae4858136b99f8 100644
--- a/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md
+++ b/i18n/es/docusaurus-plugin-content-docs/current/settings/client-server.md
@@ -78,10 +78,9 @@ Esta caja desplegable contiene 3 opciones de capa de red a elegir entre: **legac
- Dado que QUIC utiliza el protocolo UDP, asegúrese de que UDP está permitido en la configuración de seguridad de su red.
- QUIC se conecta automáticamente al puerto 19813 tanto para el servidor de aplicaciones como para el servidor DB4D.
- Cuando se selecciona la opción de capa QUIC:
- - Cerca del selector aparece un mensaje beta y un icono de alerta.
- [los parámetros del tiempo de espera de las conexiones cliente-servidor](#client-server-connections-timeout) están ocultos
- - La casilla de verificación [Encriptar comunicación Cliente-Servidor](#encrypt-client-server-communications) está oculta (las comunicaciones QUIC son siempre en TLS, sea cual sea su modo seguro).
- - **Compatibilidad**: necesita desplegar sus aplicaciones cliente/servidor con 4D v20 o superior antes de cambiar a la capa de red QUIC.
+ - The [Encrypt Client-Server communication checkbox](#encrypt-client-server-communications) is hidden (QUIC communications are always in TLS, whatever your secured mode is).
+ - **Compatibility**: You need to deploy your client/server applications with 4D 20 or higher before switching to the QUIC network layer.
:::note
@@ -91,6 +90,12 @@ En caso de modificación, deberá reiniciar la aplicación para que se tenga en
#### Tiempo antes de desconexión Cliente-Servidor
+::note
+
+This option is not available when the [QUIC](#network-layer) network layer is selected.
+
+:::
+
Este dispositivo se utiliza para definir el tiempo de espera (periodo de inactividad más allá del cual se cierra la conexión) entre 4D Server y las máquinas cliente que se conectan a él. La opción ilimitada elimina el tiempo de espera. Cuando se selecciona esta opción, se elimina el control de la actividad del cliente.
Cuando se selecciona un tiempo de espera, el servidor cerrará la conexión de un cliente si no recibe ninguna petición de éste durante el tiempo límite especificado.
@@ -103,6 +108,12 @@ Cuando esta opción está marcada, todas las máquinas remotas 4D que se conecta
#### Cifrar las comunicaciones Cliente-Servidor
+::note
+
+This option is not available when the [QUIC](#network-layer) network layer option is selected.
+
+:::
+
Esta opción permite activar el modo seguro para las comunicaciones entre la máquina servidor y las máquinas remotas 4D. Esta opción se detalla en la sección [Cifrar las de conexiones cliente/servidor](https://doc.4d.com/4Dv20/4D/20/Encrypting-ClientServer-Connections.300-6330533.en.html).
#### Actualizar la carpeta Resources durante una sesión
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-19/API/CollectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-19/API/CollectionClass.md
index 46d751b0ae0dd7..06e3a6417575d3 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-19/API/CollectionClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-19/API/CollectionClass.md
@@ -2502,24 +2502,33 @@ Con el siguiente método *NumberGreaterThan0*:
-**.sort**() : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
+**.sort**() : Collection **.sort**( *ascOrDesc* : Integer ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
| Parámetros | Tipo | | Descripción |
| ---------- | ---------- |:--:| ---------------------------------------------------------------------- |
+| ascOrDesc | Integer | -> | `ck ascending` o `ck descending` (valores escalares) |
| methodName | Text | -> | Nombre del método utilizado para especificar el orden de clasificación |
| extraParam | any | -> | Parámetros del método |
-| Resultado | Collection | <- | Colección original ordenada|
-
-|
+| Resultado | Collection | <- | La nueva colección |
+
#### Descripción
La función `.orderBy()` ordena los elementos de la colección original y también devuelve la colección ordenada.
> Esta función modifica la colección original.
-Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo. Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si *attributePath* lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
+Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo. You can also pass one of the following constants in the *ascOrDesc* parameter:
+
+ |Constant| Type|Value|Comment|
+ |---|---|---|---|
+ |ck ascending|Integer|0|Elements are ordered in ascending order (default)|
+ |ck descending|Integer|1|Elements are ordered in descending order|
+
+ This syntax orders scalar values in the collection only (other element types such as objects or collections are returned unordered).
+
+ Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si *attributePath* lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
1. null
2. booleans
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 601f7f630e4e78..e5188fe1e9f7f2 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
-Este evento se dispara cuando la entrada de datos del registro ha sido validada, por ejemplo después de una llamada al comando `SAVE RECORD` o una [acción estándar](FormObjects/properties_Action.md#standard-action) `accept`.
+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).
### Subformulario
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10.json b/i18n/es/docusaurus-plugin-content-docs/version-20-R10.json
index cf90be1e14a8b7..89d4803b4e8acd 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10.json
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10.json
@@ -797,7 +797,7 @@
},
"sidebar.docs.link.Build4D": {
"message": "Build4D",
- "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d-depot/Build4D?tab=readme-ov-file#readme"
+ "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d/Build4D"
},
"sidebar.docs.doc.Log Files": {
"message": "Archivos de registro",
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/CollectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/CollectionClass.md
index fcc9101bc417fb..de25918e361018 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/CollectionClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/CollectionClass.md
@@ -3148,12 +3148,13 @@ Soporte de fórmula
-**.sort**() : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
+**.sort**() : Collection **.sort**( *ascOrDesc* : Integer ) : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
| Parámetros | Tipo | | Descripción |
| ---------- | --------------------------- | :-------------------------: | --------------------- |
+| ascOrDesc | Integer | -> | Ejemplo 1 |
| formula | 4D.Function | -> | Objeto fórmula |
| methodName | Text | -> | Nombre de un método |
| extraParam | any | -> | Parámetros del método |
@@ -3167,7 +3168,19 @@ La función `.sort()` ordena los elemento
> Esta función modifica la colección original.
-Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo. Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
+Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo.
+You can also pass one of the following constants in the *ascOrDesc* parameter:
+
+ ```
+ |Constant| Type|Value|Comment|
+ |---|---|---|---|
+ |ck ascending|Integer|0|Elements are ordered in ascending order (default)|
+ |ck descending|Integer|1|Elements are ordered in descending order|
+
+ This syntax orders scalar values in the collection only (other element types such as objects or collections are returned unordered).
+ ```
+
+Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
1. null
2. booleans
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/SessionClass.md
index c9b917d7e87c0f..f9fd60a5858123 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/SessionClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/API/SessionClass.md
@@ -120,7 +120,7 @@ $isGuest:=Session.isGuest() //$isGuest es True
| Parámetros | Tipo | | Descripción |
| ---------- | ------- | :-------------------------: | --------------------------------------------------- |
| lifespan | Integer | -> | Duración de la vida del token de sesión en segundos |
-| Resultado | Text | <- | UUID de la sesión |
+| Resultado | Text | <- | UUID of the OTP token |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Debugging/debugLogFiles.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Debugging/debugLogFiles.md
index 694c4bb85ced73..d6b32a4f015be7 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Debugging/debugLogFiles.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Debugging/debugLogFiles.md
@@ -465,7 +465,7 @@ Como iniciar este historial:
- Utilice el comando `SET DATABASE PARAMETER`:
```4d
- SET DATABASE PARAMETER(TCPUDP log; 1)
+ SET DATABASE PARAMETER(TCPUDP log recording; 1)
```
- Cómo activar el archivo
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Events/onValidate.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Events/onValidate.md
index 71966a0a209251..d833eb400cba72 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Events/onValidate.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Events/onValidate.md
@@ -9,7 +9,7 @@ title: On Validate
## Descripción
-Este evento se dispara cuando la entrada de datos del registro ha sido validada, por ejemplo después de una llamada al comando `SAVE RECORD` o una [acción estándar](FormObjects/properties_Action.md#standard-action) `accept`.
+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).
### Subformulario
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Extensions/develop-components.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Extensions/develop-components.md
index 5eac54c23b433e..d0f1ad03afe652 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Extensions/develop-components.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/Extensions/develop-components.md
@@ -236,6 +236,8 @@ En este caso, es necesario utilizar la comparación de punteros:
Un [método de gestión de errores](Concepts/error-handling.md) instalado por el comando `ON ERR CALL` sólo se aplica a la aplicación en ejecución. En el caso de un error generado por un componente, no se llama al método de gestión de errores `ON ERR CALL` del proyecto local, y viceversa.
+However, you can install a [component error handler in the host application](../Concepts/error-handling.md#scope-and-components) to manage uncaught errors from compponents.
+
## Acceso a las tablas del proyecto local
Aunque los componentes no pueden utilizar tablas, los punteros pueden permitir que los proyectos locales y los componentes se comuniquen entre sí. Por ejemplo, este es un método que podría ser llamado desde un componente:
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/FormObjects/properties_Display.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/FormObjects/properties_Display.md
index ca733dcfcb0442..3a07c0739f87c1 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/FormObjects/properties_Display.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/FormObjects/properties_Display.md
@@ -100,7 +100,7 @@ Se pueden crear formatos de fecha personalizados utilizando varios patrones desc
:::note blankIfNull
-- Por defecto, una fecha null se muestra con ceros, por ejemplo 00/00/00. Con la opción "blankIfNull", una fecha null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado.
+- By default, a [null date](../Concepts/dt_date.md#date-literals) is displayed with zeros, e.g. 00/00/00. Con la opción "blankIfNull", una fecha null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado.
- Las [columnas list box](listbox_overview.md#list-box-columns) y los [pies List box](listbox_overview.md#list-box-footers) de tipo fecha utilizan siempre el comportamiento "blank if null" (no se puede desactivar).
:::
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/WebServer/http-request-handler.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/WebServer/http-request-handler.md
index 3c97eba7683dee..979c997dc5f3c5 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R10/WebServer/http-request-handler.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20-R10/WebServer/http-request-handler.md
@@ -60,7 +60,7 @@ You must restart the Web server so that modifications made in this file are take
## Definición del gestor
-A handler is defined by:
+Un manejador está definido por:
- a listened URL pattern
- a function and its class where the code is implemented to handle the listened URL pattern
@@ -135,7 +135,7 @@ You declare the code to be executed when a defined URL pattern is intercepted us
You can use the "verbs" property in the handler definition to declare HTTP verbs that are supported in incoming requests for this handler. A request that uses a verb that is not explicitely allowed is automatically rejected by the server.
-You can declare several verbs, separated by a comma. Verb names are not case sensitive.
+You can declare several verbs, separated by a comma. Los nombres de verbos no distinguen entre mayúsculas y minúsculas.
Ej: `"verbs" : "PUT, POST"`
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/CollectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/CollectionClass.md
deleted file mode 100644
index fcc9101bc417fb..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/CollectionClass.md
+++ /dev/null
@@ -1,3323 +0,0 @@
----
-id: CollectionClass
-title: Collection
----
-
-La clase Collection gestiona variables de tipo [Collection](Concepts/dt_collection.md).
-
-Una colección es inicializada con los comandos [`New collection`](../commands/new-collection.md) o [`New shared collection`](../commands/new-shared-collection.md).
-
-### Ejemplo
-
-```4d
-Notas
-```
-
-### Resumen
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------ |
-| [](#at) |
-| [](#average) |
-| [](#clear) |
-| [](#combine) |
-| [](#concat) |
-| [](#copy) |
-| [](#count) |
-| [](#countvalues) |
-| [](#distinct) |
-| [](#equal) |
-| [](#every) |
-| [](#extract) |
-| [](#fill) |
-| [](#filter) |
-| [](#find) |
-| [](#find) |
-| [](#first) |
-| [](#flat) |
-| [](#flatmap) |
-| [](#includes) |
-| [](#indexof) |
-| [](#indices) |
-| [](#insert) |
-| [](#join) |
-| [](#last) |
-| [](#lastindexof) |
-| [](#length) |
-| [](#map) |
-| [](#max) |
-| [](#min) |
-| [](#multisort) |
-| [](#orderby) |
-| [](#orderbymethod) |
-| [](#pop) |
-| [](#push) |
-| [](#query) |
-| [](#reduce) |
-| [](#reduceright) |
-| [](#remove) |
-| [](#resize) |
-| [](#reverse) |
-| [](#shift) |
-| [](#slice) |
-| [](#some) |
-| [](#sort) |
-| [](#sum) |
-| [](#unshift) |
-
-
-
-## .at()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.at**( *index* : Integer ) : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------------ |
-| index | Integer | -> | Índice del elemento a devolver |
-| Resultado | any | <- | El elemento en ese índice |
-
-
-
-#### Descripción
-
-La función `.at()` devuelve el elemento en la posición *index*, permitiendo enteros positivos y negativos.
-
-> Esta función no modifica la colección original.
-
-Los números enteros negativos cuentan hacia atrás desde el último elemento de la colección.
-
-Igual a
-
-#### Ejemplo
-
-```4d
-Lanzamiento
-```
-
-
-
-
-
-## .average()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.average**( {*propertyPath* : Text } ) : Real
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | --------------- | :-------------------------: | ---------------------------------------------------------------- |
-| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
-| Resultado | Real, Undefined | <- | donde: |
-
-
-
-#### Descripción
-
-La función `.average()` devuelve la media aritmética (promedio) de los valores definidos en la instancia de la colección.
-
-Para el cálculo sólo se tienen en cuenta los elementos numéricos (se ignoran otros tipos de elementos).
-
-Si la colección contiene objetos, pasa el parámetro *propertyPath* para indicar la propiedad del objeto a tener en cuenta.
-
-`.average()` devuelve `undefined` si:
-
-- la colección está vacía,
-- la colección no contiene elementos numéricos,
-- *propertyPath* no se encuentra en la colección.
-
-#### Ejemplo 1
-
-```4d
- var $col : Collection
- $col:=New collection(10;20;"Monday";True;6)
- $vAvg:=$col.average() //12
-```
-
-#### Ejemplo 2
-
-```4d
- var $col : Collection
- $col:=New collection
- $col.push(New object("name";"Smith";"salary";10000))
- $col.push(New object("name";"Wesson";"salary";50000))
- $col.push(New object("name";"Gross";"salary";10500))
- $vAvg:=$col.average("salary") //23500
-```
-
-
-
-
-
-## .clear()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.clear()** : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ------------------------------------------- |
-| Resultado | Collection | <- | Colección original sin elementos eliminados |
-
-
-
-#### Descripción
-
-La función `.clear()` elimina todos los elementos de la instancia de la colección y devuelve una colección vacía.
-
-> Esta función modifica la colección original.
-
-#### Ejemplo
-
-```4d
-var $col : Collection
-$col:=New collection(1;2;5)
-$col.clear()
-$vSize:=$col.length //$vSize=0
-```
-
-
-
-
-
-## .combine()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.combine**( *col2* : Collection {; *index* : Integer } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------ |
-| col2 | Collection | -> | Colección a combinar |
-| index | Integer | -> | Posición a la que se deben combinar los elementos de inserción en la colección (por defecto=length+1) |
-| Resultado | Collection | <- | Colección original sin elementos eliminados |
-
-
-
-#### Descripción
-
-La función `.combine()` inserta elementos *col2* al final o en la posición *index* especificada en la instancia de la colección y devuelve la colección modificada. A diferencia de la función `.insert()`, `.combine()` añade cada valor de *col2* en la colección original, y no como un único elemento de la colección.
-
-> Esta función modifica la colección original.
-
-Por defecto, los elementos *col2* se añaden al final de la colección original. Puede pasar en *index* la posición donde desea insertar los elementos *col2* en la colección.
-
-> **Atención**: recuerde que los elementos de la colección están numerados desde 0.
-
-- Si *index* es mayor que la longitud de la colección, el índice inicial real se definirá en la longitud de la colección.
-- Si *index* < 0, se recalcula como *index:=index+length* (se considera el desplazamiento desde el final de la colección).
-- En caso de incoherencia, se aplican las siguientes reglas:
-
-#### Ejemplo
-
-```4d
-var $c; $fruits : Collection
-$c:=New collection(1;2;3;4;5;6)
-$fruits:=New collection("Orange";"Banana";"Apple";"Grape")
-$c.combine($fruits;3) //[1,2,3,"Orange","Banana","Apple","Grape",4,5,6]
-```
-
-
-
-
-
-## .concat()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.concat**( *value* : any { *;...valueN* } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | -------------------------------------------------------------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| value | Number, Text, Object, Collection, Date, Time, Boolean, Picture | -> | Valores a concatenar. Si *value* es una colección, todos sus elementos se añaden al final de la colección original. |
-| Resultado | Collection | <- | Colección original con valores rellenados |
-
-
-
-#### Descripción
-
-La función.`.concat()` devuelve una nueva colección que contiene los elementos de la colección original con todos los elementos del parámetro *value* añadidos al final.
-
-> Esta función no modifica la colección original.
-
-La colección devuelta contiene el elemento especificado por *startFrom* y todos los elementos subsiguientes hasta, pero sin incluir, el elemento especificado por *end*. Si sólo se especifica el parámetro *startFrom*, la colección devuelta contiene todos los elementos desde *startFrom* hasta el último elemento de la colección original.
-
-#### Ejemplo
-
-```4d
-var $c : Collection
-$c:=New collection(1;2;3;4;5)
-$fruits:=New collection("Orange";"Banana";"Apple";"Grape")
-$fruits.push(New object("Intruder";"Tomato"))
-$c2:=$c.concat($fruits) //[1,2,3,4,5,"Orange","Banana","Apple","Grape",{"Intruder":"Tomato"}]
-$c2:=$c.concat(6;7;8) //[1,2,3,4,5,6,7,8]
-```
-
-
-
-
-
-## .copy()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------------------------------------------------- |
-| 18 R3 | Nueva opción *ck shared*. Nuevos parámetros *groupWith* |
-| v16 R6 | Añadidos |
-
-
-
-**.copy**() : Collection **.copy**( *option* : Integer ) : Collection **.copy**( *option* : Integer ; *groupWithCol* : Collection ) : Collection **.copy**( *option* : Integer ; *groupWithObj* : Object ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ---------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------- |
-| option | Integer | -> | `ck resolve pointers`: resolver punteros antes de copiar, `ck shared`: devolver una colección compartida |
-| groupWithCol | Collection | -> | Colección compartida que se agrupa con la colección resultante |
-| groupWithObj | Object | -> | Objeto compartido que se agrupa con la colección resultante |
-| Resultado | Collection | <- | Colección original ordenada |
-
-
-
-#### Descripción
-
-La función `.copy()` devuelve una copia profunda de la instancia de la colección. ***Deep copy*** significa que los objetos o colecciones dentro de la colección original se duplican y no comparten ninguna referencia con la colección devuelta.
-
-> Esta función no modifica la colección original.
-
-Lanzamiento
-
-| option | Descripción |
-| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ck resolve pointers` | Si la colección original contiene valores de tipo puntero, por defecto la copia también contiene los punteros. Si la colección original contiene valores de tipo puntero, por defecto la copia también contiene los punteros. En este caso, cada puntero presente en la colección se evalúa al copiar y se utiliza su valor desreferenciado. |
-| `ck shared` | Por defecto, `copy()` devuelve una colección Clásica (no compartida), incluso si el comando se aplica a una colección compartida. Pasa la constante `ck shared` para crear una colección compartida. En este caso, puede utilizar el parámetro *groupWith* para asociar la colección compartida con otra colección u objeto (ver más adelante). |
-
-Ejemplo 2
-
-:::note
-
-Los objetos Datastore, dataclass y entity no son copiables. Si se llama a `.copy()` con ellos, se devuelven valores `Null`.
-
-:::
-
-#### Ejemplo 1
-
-Queremos copiar la colección regular (no compartida) *$lastnames* en el objeto compartido *$sharedObject*. Para ello, debemos crear una copia compartida de la colección (*$sharedLastnames*).
-
-```4d
-var $sharedObject : Object
-var $lastnames;$sharedLastnames : Collection
-var $text : Text
-
-$sharedObject:=New shared object
-
-$text:=Document to text(Get 4D folder(Current resources folder)+"lastnames.txt")
-$lastnames:=JSON Parse($text) //$lastnames es una colección estándar
-
-$sharedLastnames:=$lastnames.copy(ck shared) //$sharedLastnames es una colección compartida
-
-//Now we can put $sharedLastnames into $sharedObject
-Use($sharedObject)
- $sharedObject.lastnames:=$sharedLastnames
-End use
-```
-
-#### Ejemplo 2
-
-Queremos combinar *$sharedColl1* y *$sharedColl2*. Dado que pertenecen a diferentes grupos compartidos, una combinación directa daría lugar a un error. Dado que pertenecen a diferentes grupos compartidos, una combinación directa daría lugar a un error.
-
-```4d
-var $sharedColl1;$sharedColl2;$copyColl : Collection
-
-$sharedColl1:=New shared collection(New shared object("lastname";"Smith"))
-$sharedColl2:=New shared collection(New shared object("lastname";"Brown"))
-
-//$copyColl pertenece al mismo grupo compartido que $sharedColl2
- $copyColl:=$sharedColl1.copy(ck shared;$sharedColl2)
- Use($sharedColl2)
- $sharedColl2.combine($copyColl)
- End use
-```
-
-#### Ejemplo 3
-
-Tenemos una distribución estándar (*$lastnames*) y queremos ponerla en el **Storage** de la aplicación. Para ello, debemos crear previamente una copia compartida (*$sharedLastnames*).
-
-```4d
-var $lastnames;$sharedLastnames : Collection
-var $text : Text
-
-$text:=Document to text(Get 4D folder(Current resources folder)+"lastnames.txt")
-$lastnames:=JSON Parse($text) //$lastnames es una colección clásica
-
-$sharedLastnames:=$lastnames.copy(ck shared) // copia compartida
-
-Use(Storage)
- Storage.lastnames:=$sharedLastnames
-End use
-```
-
-#### Ejemplo 4
-
-Primer elemento de la colección
-
-```4d
-Mayor que
-```
-
-
-
-
-
-## .count()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.count**( { *propertyPath* : Text } ) : Real
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ---- | :-------------------------: | ---------------------------------------------------------------- |
-| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
-| Resultado | Real | <- | Primer elemento de la colección |
-
-
-
-#### Descripción
-
-La función `.count()` devuelve el número de elementos no nulos en la colección.
-
-Si la colección contiene objetos, puede pasar el parámetro *propertyPath*. En este caso, sólo se tienen en cuenta los elementos que contienen el *propertyPath*.
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- var $count1;$count2 : Real
- $col:=New collection(20;30;Null;40)
- $col.push(New object("name";"Smith";"salary";10000))
- $col.push(New object("name";"Wesson";"salary";50000))
- $col.push(New object("name";"Gross";"salary";10500))
- $col.push(New object("lastName";"Henry";"salary";12000))
- $count1:=$col.count() //$count1=7
- $count2:=$col.count("name") //$count2=3
-
-```
-
-
-
-
-
-## .countValues()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.countValues**( *value* : any {; *propertyPath* : Text } ) : Real
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ----------------------------------------------- | :-------------------------: | ---------------------------------------------------------------- |
-| value | Text, Number, Boolean, Date, Object, Collection | -> | Valor a contar |
-| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
-| Resultado | Real | <- | Valor a contar |
-
-
-
-#### Descripción
-
-La función `.countValues()` devuelve el número de veces que se encuentra el valor en la colección.
-
-Puede pasar en *value*:
-
-- un valor escalar (texto, número, booleano, fecha),
-- una referencia de objeto o de colección.
-
-Para encontrar un elemento, el tipo de *value* debe ser equivalente al tipo del elemento; el método utiliza el operador de igualdad.
-
-El parámetro opcional *propertyPath* permite contar valores dentro de una colección de objetos: pase en *propertyPath* la ruta de la propiedad cuyos valores quiere contar.
-
-> Esta función no modifica la colección original.
-
-#### Ejemplo 1
-
-```4d
- var $col : Collection
- var $vCount : Integer
- $col:=New collection(1;2;5;5;5;3;6;4)
- $vCount:=$col.countValues(5) // $vCount=3
-```
-
-#### Ejemplo 2
-
-```4d
- var $col : Collection
- var $vCount : Integer
- $col:=New collection
- $col.push(New object("name";"Smith";"age";5))
- $col.push(New object("name";"Wesson";"age";2))
- $col.push(New object("name";"Jones";"age";3))
- $col.push(New object("name";"Henry";"age";4))
- $col.push(New object("name";"Gross";"age";5))
- $vCount:=$col.countValues(5;"age") //$vCount=2
-```
-
-#### Ejemplo 3
-
-```4d
- var $numbers; $letters : Collection
- var $vCount : Integer
-
- $letters:=New collection("a";"b";"c")
- $numbers:=New collection(1;2;$letters;3;4;5)
-
- $vCount:=$numbers.countValues($letters) //$vCount=1
-```
-
-
-
-
-
-## .distinct()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ---------------------------- |
-| 20 | Soporte de `ck count values` |
-| v16 R6 | Añadidos |
-
-
-
-**.distinct**( {*options* : Integer} ) : Collection **.distinct**( *propertyPath* : Text {; *options* : Integer } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ---------- | :-------------------------: | ------------------------------------------------------- |
-| propertyPath | Text | -> | Ruta del atributo cuyos valores distintos desea obtener |
-| options | Integer | -> | `ck diacritical`, `ck count values` |
-| Resultado | Collection | <- | Lanzamiento |
-
-
-
-#### Descripción
-
-La función `.distinct()` devuelve una colección que contiene sólo valores distintos (diferentes) de la colección original.
-
-> Esta función no modifica la colección original.
-
-La colección devuelta se clasifica automáticamente. Los valores **Null** no son devueltos.
-
-Si la colección contiene objetos, puede pasar el parámetro *propertyPath* para indicar la propiedad del objeto cuyos valores distintos desea obtener.
-
-Ejemplos
-
-| Constante | Valor | Comentario |
-| ----------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ck diacritical` | 8 | La evaluación distingue entre mayúsculas y minúsculas y diferencia los caracteres acentuados. Por defecto si se omite, se realiza una evaluación no diacrítica |
-| `ck count values` | 32 | Devuelve el conteo de elementos para cada valor distinto. Cuando se pasa esta opción, `.distinct()` devuelve una colección de objetos que contienen un par de atributos `{"value":*value*; "count":*count*}`. |
-
-#### Ejemplos
-
-```4d
- var $c; $c2; $c3 : Collection
- $c:=New collection
- $c.push("a";"b";"c";"A";"B";"c";"b";"b")
- $c.push(New object("size";1))
- $c.push(New object("size";3))
- $c.push(New object("size";1))
- $c2:=$c.distinct() //$c2=["a","b","c",{"size":1},{"size":3},{"size":1}]
- $c2:=$c.distinct(ck diacritical) //$c2=["a","A","b","B","c",{"size":1},{"size":3},{"size":1}]
- $c2:=$c.distinct("size") //$c2=[1,3]
- $c3:=$c.distinct("size";ck count values) //$c3=[{value:1,count:2},{value:3,count:1}]
-
-```
-
-
-
-
-
-## .equal()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.equal**( *collection2* : Collection {; *option* : Integer } ) : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ---------- | :-------------------------: | -------------------------------------------------------------------------------------------------- |
-| collection2 | Collection | -> | Colección a comparar |
-| option | Integer | -> | `ck diacritical`: evaluación diacrítica ("A" # "a" por ejemplo) |
-| Resultado | Boolean | <- | Descripción |
-
-
-
-#### Descripción
-
-La función `.equal()` compara recursivamente el contenido de la colección y *collection2* (comparación profunda/deep comparison) y devuelve **true** si son idénticas.
-
-:::note Notas
-
-- La función `.equal()` solo comprueba la igualdad para los elementos de tipo cadena, booleano, número y null en las colecciones. No verifica la igualdad para objetos nativos.
-- Constantes **null**: utilizando la palabra clave "null" se encontrarán las propiedades **null** y **undefined**.
-
-:::
-
-Por defecto, se realiza una evaluación no diacrítica. La evaluación distingue entre mayúsculas y minúsculas y diferencia los caracteres acentuados.
-
-:::tip
-
-Una comparación recursiva de colecciones puede llevar mucho tiempo si la colección es grande y contiene numerosos niveles. Si sólo desea comparar dos referencias de colección, puede considerar utilizar el operador de comparación [`=` para las referencias de colección](../Concepts/dt_collection.md#collection-operators).
-
-:::
-
-#### Ejemplo
-
-```4d
- var $c; $c2 : Collection
- var $b : Boolean
-
- $c:=New collection(New object("a";1;"b";"orange");2;3)
- $c2:=New collection(New object("a";1;"b";"orange");2;3;4)
- $b:=$c.equal($c2) // false
-
- $c:=New collection(New object("1";"a";"b";"orange");2;3)
- $c2:=New collection(New object("a";1;"b";"orange");2;3)
- $b:=$c.equal($c2) // false
-
- $c:=New collection(New object("a";1;"b";"orange");2;3)
- $c2:=New collection(New object("a";1;"b";"ORange");2;3)
- $b:=$c.equal($c2) // true
-
- $c:=New collection(New object("a";1;"b";"orange");2;3)
- $c2:=New collection(New object("a";1;"b";"ORange");2;3)
- $b:=$c.equal($c2;ck diacritical) //false
-```
-
-
-
-
-
-## .every()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.every**( { *startFrom* : Integer ; } *formula* : 4D.Function { ;*...param* : any } ) : Boolean **.every**( { *startFrom* : Integer ; } *methodName* : Text { ;*...param* : any } ) : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
-| startFrom | Integer | -> | Índice para iniciar la prueba en |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
-| Resultado | Boolean | <- | Lanzamiento |
-
-
-
-#### Descripción
-
-La función `.every()` devuelve **true** si todos los elementos de la colección han superado con éxito una prueba implementada en el objeto *formula* o el método *methodName*.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a evaluar
-- en *$2*: param
-- en *$N...*: paramN...
-
-Puede definir los siguientes parámetros:
-
-- (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario.
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-En todos los casos, en el momento en que la función.every() encuentra el primer elemento de la colección evaluado como false, deja de llamar a la retrollamada y devuelve false\*\*.
-
-Por defecto, `.every()` evalúa toda la colección. Opcionalmente, se puede pasar en *startFrom* el índice del elemento desde el que iniciar la prueba.
-
-- Si *startFrom* >= la longitud de la colección, se devuelve **false**, lo que significa que no se prueba la colección.
-- Diferente de Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
-- Si *startFrom* = 0, se busca en toda la colección (por defecto).
-
-#### Ejemplo 1
-
-```4d
-var $c : Collection
-var $b : Boolean
-var $f : 4D.Function
-
-$f:=Formula($1.value>0)
-$c:=New collection
-$c.push(5;3;1;4;6;2)
-$b:=$c.every($f) //devuelve true
-$c.push(-1)
-$b:=$c.every($f) //devuelve false
-```
-
-#### Ejemplo 2
-
-Este ejemplo comprueba que todos los elementos de una colección son de tipo real:
-
-```4d
-var $c : Collection
-var $b : Boolean
-var $f : 4D.Function
-
-$f:=Formula(Value type($1.value)=$2
-$c:=New collection
-$c.push(5;3;1;4;6;2)
-$b:=$c.every($f;Is real) //$b=true
-$c:=$c.push(New object("name";"Cleveland";"zc";35049))
-$c:=$c.push(New object("name";"Blountsville";"zc";35031))
-$b:=$c.every($f;Is real) //$b=false
-```
-
-
-
-
-
-## .extract()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.extract**( *propertyPath* : Text { ; *option* : Integer } ) : Collection **.extract**( *propertyPath* : Text ; *targetPath* : Text { ;...*propertyPathOrTargetPathN* : Text } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ---------- | :-------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| propertyPath | Text | -> | Ruta de la propiedad del objeto cuyos valores deben ser extraídos a la nueva colección |
-| targetpath | Text | -> | Ruta de la propiedad de destino o nombre de la propiedad |
-| option | Integer | -> | `ck keep null`: incluye la propiedad null en la colección devuelta (se ignora por defecto). Parámetro ignorado si se pasa *targetPath*. |
-| Resultado | Collection | <- | Nueva colección que contiene los valores extraídos |
-
-
-
-#### Descripción
-
-La función `.extract()` crea y devuelve una nueva colección que contiene valores *propertyPath* extraídos de la colección original de objetos.
-
-> Esta función no modifica la colección original.
-
-El contenido de la colección devuelta depende del parámetro *targetPath*:
-
-- Si se omite el parámetro *targetPath*, `.extract()` llena la nueva colección con los valores *propertyPath* de la colección original.
-
- Por defecto, los elementos cuya *propertyPath* es null o indefinida se ignoran en la colección resultante. Puede pasar la constante `ck keep null` en el parámetro *option* para incluir estos valores como elementos null en la colección devuelta.
-
-- Si se pasan uno o más parámetros *targetPath* (correspondientes a uno o más parámetros *propertyPath*), `.extract()` llena la nueva colección con las propiedades *propertyPath* y cada elemento de la nueva colección es un objeto con propiedades *targetPath* llenadas con las propiedades *propertyPath* coincidentes. Se conservan los valores null (el parámetro *opción* se ignora con esta sintaxis).
-
-#### Ejemplo 1
-
-```4d
-var $c : Collection
-$c:=New collection
-$c.push(New object("name";"Cleveland"))
-$c.push(New object("zip";5321))
-$c.push(New object("name";"Blountsville"))
-$c.push(42)
-$c2:=$c.extract("name") // $c2=[Cleveland,Blountsville]
-$c2:=$c.extract("name";ck keep null) //$c2=[Cleveland,null,Blountsville,null]
-```
-
-#### Ejemplo 2
-
-```4d
-var $c : Collection
-$c:=New collection
-$c.push(New object("zc";35060))
-$c.push(New object("name";Null;"zc";35049))
-$c.push(New object("name";"Cleveland";"zc";35049))
-$c.push(New object("name";"Blountsville";"zc";35031))
-$c.push(New object("name";"Adger";"zc";35006))
-$c.push(New object("name";"Clanton";"zc";35046))
-$c.push(New object("name";"Clanton";"zc";35045))
-$c2:=$c.extract("name";"City") //$c2=[{City:null},{City:Cleveland},{City:Blountsville},{City:Adger},{City:Clanton},{City:Clanton}]
-$c2:=$c.extract("name";"City";"zc";"Zip") //$c2=[{Zip:35060},{City:null,Zip:35049},{City:Cleveland,Zip:35049},{City:Blountsville,Zip:35031},{City:Adger,Zip:35006},{City:Clanton,Zip:35046},{City:Clanton,Zip:35045}]
-```
-
-
-
-
-
-## .fill()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.fill**( *value* : any ) : Collection **.fill**( *value* : any ; *startFrom* : Integer { ; *end* : Integer } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ----------------------------------------------- | :-------------------------: | ---------------------------------------------- |
-| value | number, Text, Collection, Object, Date, Boolean | -> | Valor a asignar |
-| startFrom | Integer | -> | Índice de inicio (incluido) |
-| end | Integer | -> | Índice final (no incluido) |
-| Resultado | collection | <- | Colección original con valores rellenados |
-
-
-
-#### Descripción
-
-La función.fill() llena la colección con el value especificado, opcionalmente desde el índice startFrom hasta el índice end, y devuelve la colección resultante.
-
-> Esta función modifica la colección original.
-
-- Si se omite el parámetro *startFrom*, *value* se aplica a todos los elementos de la colección (*startFrom*=0).
-- Si se pasa el parámetro *startFrom* y se omite *end*, *value* se aplica a los elementos de la colección a partir de *startFrom* hasta el último elemento de la colección (*end*=length).
-- Si se pasan tanto el parámetro *startFrom* como *end*, *value* se aplica a los elementos de la colección empezando en *startFrom* hasta el elemento *end*.
-
-En caso de incoherencia, se aplican las siguientes reglas:
-
-- Si *startFrom* < 0, se recalcula como *startFrom:=startFrom+length* (se considera el desplazamiento desde el final de la colección). Si el valor calculado es negativo, *startFrom* toma el valor 0.
-- Si *end* < 0 , se recalcula como *end:=end+length*.
-- Si *end* < *startFrom* (valores pasados o calculados), el método no hace nada.
-
-#### Ejemplo
-
-```4d
- var $c : Collection
- $c:=New collection(1;2;3;"Lemon";Null;"";4;5)
- $c.fill("2") // $c:=[2,2,2,2,2,2,2,2]
- $c.fill("Hello";5) // $c=[2,2,2,2,2,Hello,Hello,Hello]
- $c.fill(0;1;5) // $c=[2,0,0,0,0,Hello,Hello,Hello]
- $c.fill("world";1;-5) //-5+8=3 -> $c=[2,"world","world",0,0,Hello,Hello,Hello]
-```
-
-
-
-
-
-## .filter()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.filter**( *formula* : 4D.Function { ; *...param* : any } ) : Collection **.filter**( *methodName* : Text { ; *...param* : any } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
-| Resultado | Collection | <- | Nueva colección que contiene elementos filtrados (copia superficial) |
-
-
-
-#### Descripción
-
-La función `.filter()` devuelve una nueva colección que contiene todos los elementos de la colección original para los que el resultado de *formula* o *methodName* es **true**. Esta función devuelve una ***shallow copy***, lo que significa que los objetos o colecciones de ambas colecciones comparten la misma referencia. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para filtrar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-Se llama a la retrollamada con los parámetros pasados en *param* (opcional) y un objeto en primer parámetro (*$1*). La retrollamada puede realizar cualquier prueba, con o sin el parámetro(s) y debe devolver **true** para cada elemento que cumpla la condición y por lo tanto, debe añadirse a la nueva colección.
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a evaluar
-- en *$2*: param
-- en *$N...*: paramN...
-
-Puede definir los siguientes parámetros:
-
-- *$1.result* (booleano): **true** si el valor del elemento coincide con la condición de filtro y debe conservarse, **false** en caso contrario.
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-:::note
-
-Cuando se utiliza *methodName* como callback, y si el método no devuelve ningún valor, `.filter()` buscará la propiedad *$1.result* que debe definir como *true* para cada elemento que cumpla la condición.
-
-:::
-
-#### Ejemplo 1
-
-Desea obtener la colección de elementos de texto cuya longitud es inferior a 6:
-
-```4d
-var $col;$colNew : Collection
-$col:=New collection("hello";"world";"red horse";66;"tim";"san jose";"miami")
-$colNew:=$col.filter(Formula((Value type($1.value)=Is text) && (Length($1.value)<$2)); 6)
- //$colNew=["hello","world","tim","miami"]
-```
-
-#### Ejemplo 2
-
-Quiere filtrar los elementos según su tipo de valor:
-
-```4d
- var $c;$c2;$c3 : Collection
- var $f : 4D.Function
-
- $f:=Formula(OB Get type($1;"value")=$2)
- $c:=New collection(5;3;1;4;6;2)
- $c.push(New object("name";"Cleveland";"zc";35049))
- $c.push(New object("name";"Blountsville";"zc";35031))
- $c2:=$c.filter($f;Is real) // $c2=[5,3,1,4,6,2]
- $c3:=$c.filter($f;Is object)
- // $c3=[{name:Cleveland,zc:35049},{name:Blountsville,zc:35031}]
-```
-
-
-
-
-
-## .find()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.find**( { *startFrom* : Integer ; } *formula* : 4D.Function { ; *...param* : any } ) : any **.find**( { *startFrom* : Integer ; } *methodName* : Text { ; *...param* : any } ) : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
-| Resultado | any | <- | La función `.multiSort()` permite realizar una ordenación sincronizada multinivel sobre un conjunto de colecciones. |
-
-
-
-#### Descripción
-
-La función `.find()` devuelve el primer valor de la colección para el que el resultado de *formula* o de *methodName*, aplicado a cada elemento, devuelve **true**.
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a evaluar
-- en *$2*: param
-- en *$N...*: paramN...
-
-Puede definir los siguientes parámetros:
-
-- (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario.
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-Por defecto, `.find()` busca en toda la colección. Opcionalmente, se puede pasar en *startFrom* el índice del elemento desde el que iniciar la búsqueda.
-
-- Si *startFrom* >= la longitud de la colección, se devuelve -1, lo que significa que la colección no se busca.
-- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
- **Nota**: incluso si *startFrom* es negativo, la colección se sigue buscando de izquierda a derecha.
-- Si *startFrom* = 0, se busca en toda la colección (por defecto).
-
-#### Ejemplo 1
-
-Quiere obtener el primer elemento de texto con una longitud menor que 5:
-
-```4d
-var $col : Collection
-$col:=New collection("hello";"world";4;"red horse";"tim";"san jose")
-$value:=$col.find(Formula((Value type($1.value)=Is text) && (Length($1.value)<$2)); 5) //$value="tim"
-```
-
-#### Ejemplo 2
-
-Quiere encontrar el nombre de una ciudad dentro de una colección:
-
-```4d
-var $c : Collection
-var $c2 : Object
-$c:=New collection
-$c.push(New object("name"; "Cleveland"; "zc"; 35049))
-$c.push(New object("name"; "Blountsville"; "zc"; 35031))
-$c.push(New object("name"; "Adger"; "zc"; 35006))
-$c.push(New object("name"; "Clanton"; "zc"; 35046))
-$c.push(New object("name"; "Clanton"; "zc"; 35045))
-
-$c2:=$c.find(Formula($1.value.name=$2); "Clanton") //$c2={name:Clanton,zc:35046}
-
-```
-
-
-
-
-
-## .findIndex()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.findIndex**( { *startFrom* : Integer ; } *formula* : 4D.Function { ; *...param* : any } ) : Integer **.findIndex**( { *startFrom* : Integer ; } *methodName* : Text { ; *...param* : any } ) : Integer
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
-| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
-| Resultado | Integer | <- | Índice del primer valor encontrado, o -1 si no se encuentra |
-
-
-
-#### Descripción
-
-La función `.findIndex()` devuelve el índice, en la colección, del primer valor para el que *formula* o *methodName*, aplicados sobre cada elemento, devuelven **true**.
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- *methodName*, el nombre de un método proyecto (texto).
-
-La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a evaluar
-- en *$2*: param
-- en *$N...*: paramN...
-
-Puede definir los siguientes parámetros:
-
-- (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario.
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-Por defecto, `.findIndex()` busca en toda la colección. Opcionalmente, se puede pasar en *startFrom* el índice del elemento desde el que iniciar la búsqueda.
-
-- Si *startFrom* >= la longitud de la colección, se devuelve -1, lo que significa que la colección no se busca.
-- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
- **Nota**: incluso si *startFrom* es negativo, la colección se sigue buscando de izquierda a derecha.
-- Si *startFrom* = 0, se busca en toda la colección (por defecto).
-
-#### Ejemplo
-
-Quiere encontrar la posición del primer nombre de ciudad dentro de una colección:
-
-```4d
-var $c : Collection
-var $val2;$val3 : Integer
-$c:=New collection
-$c.push(New object("name";"Cleveland";"zc";35049))
-$c.push(New object("name";"Blountsville";"zc";35031))
-$c.push(New object("name";"Adger";"zc";35006))
-$c.push(New object("name";"Clanton";"zc";35046))
-$c.push(New object("name";"Clanton";"zc";35045))
-$val2:=$c.findIndex(Formula($1.value.name=$2);"Clanton") // $val2=3
-$val3:=$c.findIndex($val2+1;Formula($1.value.name=$2);"Clanton") //$val3=4
-```
-
-
-
-
-
-## .first()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.first**() : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-------------------------: | ------------------------------- |
-| Resultado | any | <- | Primer elemento de la colección |
-
-
-
-#### Descripción
-
-La función `.first()` devuelve el primer elemento de la colección.
-
-> Esta función no modifica la colección original.
-
-La función devuelve Undefined si la colección está vacía.
-
-#### Ejemplo
-
-```4d
-var $col; $emptyCol : Collection
-var $first : Variante
-$col:=New collection(10; 20; 30; "hello"; 50)
-$first:=$col.first() // 10
-
-$emptyCol:=New collection() //vacío
-// $first:=$emptyCol[0] //daría error
-$first:=$emptyCol.first() // devuelve Undefined
-```
-
-
-
-
-
-## .flat()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.flat**( { *depth* : Integer } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------- |
-| depth | Integer | -> | A qué profundidad debe aplanarse una estructura de colección anidada. Por defecto=1 |
-| Resultado | Collection | <- | Colección aplanada |
-
-
-
-#### Descripción
-
-La función `.flat()` crea una nueva colección con todos los elementos de la subcolección concatenados recursivamente hasta la *depth* especificada.
-
-Por defecto, si se omite el parámetro *depth*, sólo se aplanará el primer nivel de la estructura de la colección anidada.
-
-> Esta función no modifica la colección original.
-
-#### Ejemplo
-
-```4d
-$col:=New collection(1; 2; New collection(3; 4))
-$col.flat()
-// [1, 2, 3, 4]
-
-$col:=New collection(1; 2; New collection(3; 4; New collection(5; 6)))
-$col.flat()
-// [1, 2, 3, 4, [5, 6]]
-
-$col:=New collection(1; 2; New collection(3; 4; New collection(5; 6)))
-$col.flat(2)
-// [1, 2, 3, 4, 5, 6]
-
-$col:=New collection(1; 2; New collection(3; 4; 5; 6; New collection(7; 8; New collection(9; 10))))
-$col.flat(MAXLONG)
-// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-```
-
-
-
-
-
-## .flatMap()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.flatMap**( *formula* : 4D.Function { ; *...param* : any } ) : Collection **.flatMap**( *methodName* : Text { ; *...param* : any } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
-| Resultado | Collection | <- | Comentario |
-
-
-
-#### Descripción
-
-La función `.flatMap()` crea una nueva colección basada en el resultado de la llamada a la función *formula* 4D o al método *methodName* sobre cada elemento de la colección original y aplanada por una profundidad de 1. Opcionalmente, puede pasar parámetros a *formula* o *methodName* utilizando los parámetros *param*.
-
-Esta función es idéntica a una llamada a [`map()`](#map) seguida de una llamada a [`flat()`](#flat) de profundidad 1.
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-La retrollamada se llama con los parámetros pasados en *param* (opcional). The callback is called with the parameter(s) passed in param (optional). Recibe un `Object` en el primer parámetro ($1).
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a evaluar
-- en *$2*: param
-- en *$N...*: paramN...
-
-Puede definir los siguientes parámetros:
-
-- (obligatorio si ha utilizado un método) *$1.result* (cualquier tipo): nuevo valor transformado para añadir a la colección resultante
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-#### Ejemplo 1
-
-```4d
-var $col ; $result : Collection
-$col:=New collection(1; 2; 3; 4)
-
-$result:=$col.map(Formula(New collection($1.value*2)))
- // [[2],[4],[6],[8]]
-
-$result:=$col.flatMap(Formula(New collection($1.value*2)))
-// [2,4,6,8]
-```
-
-#### Ejemplo 2
-
-```
-var $col; $result : Collection
-$col:=New collection("Hello how"; ""; "are you ?")
-
-$result:=$col.map(Formula(Split string($1.value; " ")))
-// [["Hello", "how"], [], ["are", "you", "?"]]
-
-$result:=$col.flatMap(Formula(Split string($1.value; " ")))
-// ["Hello", "how", "are", "you", "?"]
-```
-
-#### Ejemplo 3
-
-Desea calcular el porcentaje de cada valor de la colección con respecto al total:
-
-```4d
-var $c; $c2 : Collection
-var $f : 4D.Function
-$c:=New collection(1; 4; 9; 10; 20)
-$f:=Formula(New collection($1.value;Round(($1.value/$2)*100; 2)))
-$c2:=$c.flatMap($f; $c.sum())
- //$c2=[1, 2.27, 4, 9.09,9, 20.45,10, 22.73, 20, 45.45]
-```
-
-
-
-
-
-## .includes()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.includes**( *toSearch* : expression { ; *startFrom* : Integer } ) : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------- | :-------------------------: | ----------------------------------------------- |
-| toSearch | expresión | -> | Expresión a buscar en la colección |
-| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
-| Resultado | Boolean | <- | True si *toSearch* se encuentra en la colección |
-
-
-
-#### Descripción
-
-La función `.includes()` devuelve True si la expresión *toSearch* se encuentra entre los elementos de la colección, en caso contrario False.
-
-> Esta función no modifica la colección original.
-
-En *toSearch*, pase la expresión a encontrar en la colección. Puede pasar:
-
-- un valor escalar (texto, número, booleano, fecha),
-- el valor null,
-- una referencia de objeto o de colección.
-
-*toSearch* debe coincidir exactamente con el elemento a encontrar (se aplican las mismas reglas que para el operador de igualdad del tipo de datos).
-
-Diferente de Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
-
-- Si *startFrom* >= la longitud de la colección, se devuelve False, lo que significa que no se busca en la colección.
-- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*). **Atención**: recuerde que los elementos de la colección están numerados desde 0.
-- Si *startFrom* = 0, se busca en toda la colección (por defecto).
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- var $in : Boolean
- var $obj : Object
- $obj:=New object("value"; 10)
- $col:=New collection(1;2;"Henry";5;3;"Albert";6;4;"Alan";5;$obj)
- $in:=$col.includes(3) //True
- $in:=$col.includes(5;6) //True
- $in:=$col.includes("al@") //True
- $in:=$col.includes("Hello") //False
- $in:=$col.includes($obj) //True
- $in:=$col.includes(New object("value"; 10)) //False
-```
-
-
-
-
-
-## .indexOf()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.indexOf**( *toSearch* : expression { ; *startFrom* : Integer } ) : Integer
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------- | :-------------------------: | ---------------------------------- |
-| toSearch | expresión | -> | Expresión a buscar en la colección |
-| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
-| Resultado | Integer | <- | Descripción |
-
-
-
-#### Descripción
-
-La función `.indexOf()` busca la expresión *toSearch* entre los elementos de la colección y devuelve el índice de la primera ocurrencia encontrada, o -1 si no se encontró.
-
-> Esta función no modifica la colección original.
-
-En *toSearch*, pase la expresión a encontrar en la colección. Puede pasar:
-
-- un valor escalar (texto, número, booleano, fecha),
-- el valor null,
-- una referencia de objeto o de colección.
-
-*toSearch* debe coincidir exactamente con el elemento a encontrar (se aplican las mismas reglas que para el operador de igualdad del tipo de datos).
-
-Diferente de Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
-
-- Si *startFrom* >= la longitud de la colección, se devuelve -1, lo que significa que la colección no se busca.
-- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
- **Nota**: incluso si *startFrom* es negativo, la colección se sigue buscando de izquierda a derecha.
-- Si *startFrom* = 0, se busca en toda la colección (por defecto).
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- var $i : Integer
- $col:=New collection(1;2;"Henry";5;3;"Albert";6;4;"Alan";5)
- $i:=$col.indexOf(3) //$i=4
- $i:=$col.indexOf(5;5) //$i=9
- $i:=$col.indexOf("al@") //$i=5
- $i:=$col.indexOf("Hello") //$i=-1
-```
-
-
-
-
-
-## .indices()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.indices**( *queryString* : Text { ; *...value* : any } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------- |
-| queryString | Text | -> | Criterio de búsqueda |
-| value | any | -> | Valor(es) a comparar cuando se utiliza(n) marcador(es) de posición |
-| Resultado | Collection | <- | Índice(s) de elementos que coinciden con queryString en la colección |
-
-
-
-#### Descripción
-
-La función `.indices()` funciona exactamente igual que la función [`.query()`](#query) pero devuelve índices, en la colección original, de elementos de la colección de objetos que coinciden con las condiciones de búsqueda *queryString*, y no elementos en sí. Los índices se devuelven en orden ascendente.
-
-> Esta función no modifica la colección original.
-
-El parámetro *queryString* utiliza la siguiente sintaxis:
-
-```4d
-propertyPath comparator value {logicalOperator propertyPath comparator value}
-```
-
-Para una descripción detallada de los parámetros *queryString* y *value*, consulte la función `dataClass.query()`.
-
-#### Ejemplo
-
-```4d
- var $c; $icol : Collection
- $c:=New collection
- $c.push(New object("name";"Cleveland";"zc";35049))
- $c.push(New object("name";"Blountsville";"zc";35031))
-
- $c.push(New object("name";"Adger";"zc";35006))
- $c.push(New object("name";"Clanton";"zc";35046))
- $c.push(New object("name";"Clanton";"zc";35045))
- $icol:=$c.indices("name = :1";"Cleveland") // $icol=[0]
- $icol:=$c.indices("zc > 35040") // $icol=[0,3,4]
-```
-
-
-
-
-
-## .insert()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.insert**( *index* : Integer ; *element* : any ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | -------------------------------------------------------- |
-| index | Integer | -> | Dónde insertar el elemento |
-| element | any | -> | Elemento a insertar en la colección |
-| Resultado | Collection | <- | Colección original que contiene los elementos insertados |
-
-
-
-#### Descripción
-
-La función `.insert()` inserta *element* en la posición *index* especificada en la instancia de la colección y devuelve la colección modificada.
-
-> Esta función modifica la colección original.
-
-En *index*, pase la posición donde quiere insertar el elemento en la colección.
-
-> **Atención**: recuerde que los elementos de la colección están numerados desde 0.
-
-- Si *index* la longitud de la colección, el índice inicial real se fijará en la longitud de la colección.
-- Si *index* <0, se recalcula como *index:=index+length* (se considera el desplazamiento desde el final de la colección).
-- Si el valor calculado es negativo, index toma el valor 0.
-
-Se puede insertar cualquier tipo de elemento aceptado por una colección, incluso otra colección.
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- $col:=New collection("a";"b";"c";"d") //$col=["a","b","c","d"]
- $col.insert(2;"X") //$col=["a","b","X","c","d"]
- $col.insert(-2;"Y") //$col=["a","b","X","Y","c","d"]
- $col.insert(-10;"Hi") //$col=["Hi","a","b","X","Y","c","d"]
-```
-
-
-
-
-
-## .join()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.join**( *delimiter* : Text { ; *option* : Integer } ) : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | --------------------------------------------------------------------------------------------- |
-| delimiter | Text | -> | Separador a utilizar entre elementos |
-| option | Integer | -> | `ck ignore null or empty`: ignorar las cadenas nulas y vacías en el resultado |
-| Resultado | Text | <- | Cadena que contiene todos los elementos de la colección, separados por un delimitador |
-
-
-
-#### Descripción
-
-La función `.join()` convierte todos los elementos de la colección en cadenas y las concatena utilizando la cadena delimiter especificada como separador.La función devuelve la cadena resultante.
-
-> Esta función no modifica la colección original.
-
-Por defecto, los elementos nulos o vacíos de la colección se devuelven en la cadena resultante. Pase la constante `ck ignore null or empty` en el parámetro *option* si quiere eliminarlos de la cadena resultante.
-
-#### Ejemplo
-
-```4d
- var $c : Collection
- var $t1;$t2 : Text
- $c:=New collection(1;2;3;"Paris";Null;"";4;5)
- $t1:=$c.join("|") //1|2|3|Paris|null||4|5
- $t2:=$c.join("|";ck ignore null or empty) //1|2|3|Paris|4|5
-```
-
-
-
-
-
-## .last()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.last**() : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-------------------------: | ------------------------------- |
-| Resultado | any | <- | Último elemento de la colección |
-
-
-
-#### Descripción
-
-La función `.last()` devuelve el último elemento de la colección.
-
-> Esta función no modifica la colección original.
-
-La función devuelve Undefined si la colección está vacía.
-
-#### Ejemplo
-
-```4d
-Propiedad
-```
-
-
-
-
-
-## .lastIndexOf()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.lastIndexOf**( *toSearch* : expression { ; *startFrom* : Integer } ) : Integer
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------- | :-------------------------: | --------------------------------------------------------------------------------- |
-| toSearch | expresión | -> | El elemento que se va a buscar dentro de la colección |
-| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
-| Resultado | Integer | <- | Índice de la última ocurrencia de toSearch en la colección, -1 si no se encuentra |
-
-
-
-#### Descripción
-
-La función `.lastIndexOf()` busca la expresión *toSearch* entre los elementos de la colección y devuelve el índice de la última ocurrencia , o -1 si no se encontró.
-
-> Esta función no modifica la colección original.
-
-En *toSearch*, pase la expresión a encontrar en la colección. Puede pasar:
-
-- un valor escalar (texto, número, booleano, fecha),
-- el valor null,
-- una referencia de objeto o de colección.
-
-*toSearch* debe coincidir exactamente con el elemento a encontrar (se aplican las mismas reglas que para el operador de igualdad del tipo de datos).
-
-Opcionalmente, puede pasar el índice de la colección desde el cual iniciar una búsqueda en reversa en *startFrom*.
-
-- Si *startFrom* >= la longitud de la colección menos uno (coll.length-1), se busca en toda la colección (por defecto).
-- Si *startFrom* < 0, se recalcula como *startFrom:=startFrom+length* (se considera el desplazamiento desde el final de la colección). Si el valor calculado es negativo, se devuelve -1 (no se busca en la colección).
- **Nota:** incluso si *startFrom* es negativo, la colección se sigue buscando de derecha a izquierda.
-- Si *startFrom* = 0, se devuelve -1 lo que significa que la colección no se busca.
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- var $pos1;$pos2;$pos3;$pos4;$pos5 : Integer
- $col:=Split string("a,b,c,d,e,f,g,h,i,j,e,k,e";",") //$col.length=13
- $pos1:=$col.lastIndexOf("e") //devuelve 12
- $pos2:=$col.lastIndexOf("e";6) //devuelve 4
- $pos3:=$col.lastIndexOf("e";15) //devuelve 12
- $pos4:=$col.lastIndexOf("e";-2) //devuelve 10
- $pos5:=$col.lastIndexOf("x") //devuelve -1
-```
-
-
-
-
-
-## .length
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R5 | Añadidos |
-
-
-
-**.length** : Integer
-
-#### Descripción
-
-La propiedad `.length` devuelve el número de elementos en la colección.
-
-La propiedad `.length` se inicializa cuando se crea la colección. Añadir o eliminar elementos actualiza la longitud, si es necesario. Esta propiedad es **sólo lectura** (no se puede utilizar para definir el tamaño de la colección).
-
-#### Ejemplo
-
-```4d
-Tipo
-```
-
-
-
-
-
-## .map()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.map**( *formula* : 4D.Function { ; *...param* : any } ) : Collection **.map**( *methodName* : Text { ; *...param* : any } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
-| Resultado | Collection | <- | `.pop()`, utilizado junto con [`.push()`](#push), puede utilizarse para implementar una funcionalidad primera entrada última salida de tratamiento de datos apilados: |
-
-
-
-#### Descripción
-
-La función `.map()` crea una nueva colección basada en el resultado de la llamada a la función *formula* 4D o al método *methodName* sobre cada elemento de la colección original. Opcionalmente, puede pasar parámetros a *formula* o *methodName* utilizando los parámetros *param*. `.map()` siempre devuelve una colección con el mismo tamaño que la colección original, excepto si se utilizó *$1.stop* (ver más abajo).
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-La retrollamada se llama con los parámetros pasados en *param* (opcional). The callback is called with the parameter(s) passed in param (optional). Recibe un `Object` en el primer parámetro ($1).
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a evaluar
-- en *$2*: param
-- en *$N...*: paramN...
-
-Puede definir los siguientes parámetros:
-
-- (obligatorio si ha utilizado un método) *$1.result* (cualquier tipo): nuevo valor transformado para añadir a la colección resultante
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-#### Ejemplo
-
-```4d
-var $c; $c2 : Collection
-$c:=New collection(1; 4; 9; 10; 20)
-$c2:=$c.map(Formula(Round(($1.value/$2)*100; 2)); $c.sum())
- //$c2=[2.27,9.09,20.45,22.73,45.45]
-```
-
-
-
-
-
-## .max()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.max**( { *propertyPath* : Text } ) : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ----------------------------------------------- | :-------------------------: | ------------------------------------------------------------------- |
-| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para la evaluación |
-| Resultado | Boolean, Text, Number, Collection, Object, Date | <- | Valor máximo en la colección |
-
-
-
-#### Descripción
-
-La función `.max()` devuelve el elemento con el valor más alto de la colección (el último elemento de la colección tal y como se ordenaría en orden ascendente utilizando la función [`.sort()`](#sort)).
-
-> Esta función no modifica la colección original.
-
-Si la colección contiene diferentes tipos de valores, la función `.max()` devolverá el valor máximo dentro del último tipo de elemento en el orden de la lista de tipos (ver la descripción de [`.sort()`](#sort)).
-
-Si la colección contiene objetos, pase el parámetro *propertyPath* para indicar la propiedad del objeto cuyo valor máximo desea obtener.
-
-Si la colección está vacía, `.max()` devuelve *Undefined*.
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- $col:=New collection(200;150;55)
- $col.push(New object("name";"Smith";"salary";10000))
- $col.push(New object("name";"Wesson";"salary";50000))
- $col.push(New object("name";"Alabama";"salary";10500))
- $max:=$col.max() //{name:Alabama,salary:10500}
- $maxSal:=$col.max("salary") //50000
- $maxName:=$col.max("name") //"Wesson"
-```
-
-
-
-
-
-## .min()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.min**( { *propertyPath* : Text } ) : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ----------------------------------------------- | :-------------------------: | ------------------------------------------------------------------- |
-| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para la evaluación |
-| Resultado | Boolean, Text, Number, Collection, Object, Date | <- | Valor mínimo en la colección |
-
-
-
-#### Descripción
-
-La función `.min()` devuelve el elemento con el valor más pequeño de la colección (el primer elemento de la colección tal y como se ordenaría en orden ascendente utilizando la función [`.sort()`](#sort)).
-
-> Esta función no modifica la colección original.
-
-Si la colección contiene diferentes tipos de valores, la función `.min()` devolverá el valor mínimo dentro del primer tipo de elemento en el orden de la lista de tipos (ver la descripción de [`.sort()`](#sort)).
-
-Si la colección contiene objetos, pase el parámetro *propertyPath* para indicar la propiedad del objeto cuyo valor mínimo desea obtener.
-
-Si la colección está vacía, `.min()` devuelve *Undefined*.
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- $col:=New collection(200;150;55)
- $col.push(New object("name";"Smith";"salary";10000))
- $col.push(New object("name";"Wesson";"salary";50000))
- $col.push(New object("name";"Alabama";"salary";10500))
- $min:=$col.min() //55
- $minSal:=$col.min("salary") //10000
- $minName:=$col.min("name") //"Alabama"
-```
-
-
-
-
-
-## .multiSort()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R3 | Añadidos |
-
-
-
-**.multiSort**() : Collection **.multiSort**( *colsToSort* : Collection ) : Collection **.multiSort**( *formula* : 4D.Function ; *colsToSort* : Collection ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| colsToSort | Collection | -> | Colección de colecciones y/u objetos con propiedades {`collection`:*colToSort*;`order`:`ck ascending` o `ck descending`} |
-| Resultado | Collection | <- | La nueva colección |
-
-
-
-#### Descripción
-
-Ejemplo 2
-
-> Esta función modifica la colección original, así como todas las colecciones utilizadas en el parámetro *colsToSort*.
-
-Si se llama a `.multiSort()` sin parámetros, la función tiene el mismo efecto que la función [`.sort()`](#sort): la colección se ordena (sólo valores escalares) en orden ascendente por defecto, según su tipo. Si la colección contiene valores de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
-
-1. null
-2. booleans
-3. cadenas
-4. numbers
-5. objects
-6. collections
-7. dates
-
-**Ordenación sincronizada de un nivel**
-
-Para ordenar varias colecciones de forma sincrónica, basta con pasar en *colsToSort* una colección de colecciones para ordenar. Puede pasar un número ilimitado de colecciones. La colección original se ordenará en orden ascendente y todas las colecciones *colsToSort* se ordenarán de forma sincronizada.
-
-:::note
-
-Todas las colecciones *colsToSort* deben tener el mismo número de elementos, de lo contrario se devuelve un error.
-
-:::
-
-Si desea ordenar las colecciones en algún otro orden que no sea ascendente, debe suministrar una *formula* ([objeto Formula](../commands/formula.md)) que defina el orden de clasificación. El valor de retorno debe ser un booleano que indica el orden relativo de los dos elementos: **True** si *$1.value* es menor que *$1.value2*, **False** si *$1.value* es mayor que *$1.value2*. Puede ofrecer parámetros adicionales a la fórmula si es necesario.
-
-La fórmula recibe los siguientes parámetros:
-
-- $1 (objeto), donde:
- - *$1.value* (todo tipo): valor del primer elemento a comparar
- - *$1.value2* (todo tipo): valor del segundo elemento a comparar
-- $2...$N (cualquier tipo): parámetros adicionales
-
-**Ordenación sincronizada multinivel**
-
-Ordenar una colección de números de forma ascendente y descendente:
-
-Los niveles de ordenación vienen determinados por el orden en que se pasan las colecciones en el parámetro *colsToSort*: la posición de un objeto `collection`/`order` en la sintaxis determina su nivel de ordenación.
-
-:::note
-
-Ordenar una colección de números de forma ascendente y descendente:
-
-:::
-
-#### Ejemplo 1
-
-Descripción
-
-```4d
-var $col;$col2;$col3 : Collection
-$col:=["A"; "C"; "B"]
-$col2:=[1; 2; 3]
-$col3:=[["Jim"; "Philip"; "Maria"]; ["blue"; "green"]; ["11"; 22; "33"]]
-
-$col.multiSort([$col2; $col3])
-//$col=["A","B","C"]
-//$col2=[1,3,2]
-//$col3[0]=["Jim","Philip","Maria"]
-//$col3[1]=["11",22,"33"]
-//$col3[2]=["blue","green"]
-
-```
-
-#### Ejemplo 2
-
-Desea ordenar tres colecciones sincronizadas: city, country y continent. Quiere una ordenación ascendente de la primera y la tercera colección y sincronización para la segunda colección:
-
-```4d
-var $city : Collection
-var $country : Collection
-var $continent : Collection
-
-$city:=["Paris"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
-$country:=["France"; "France"; "Morocco"; "Germany"; "US"]
-$continent:=["Europe"; "Europe"; "Africa"; "Europe"; "America"]
-
-$continent.multiSort([$country; {collection: $city; order: ck ascending}])
-//$continent=["Africa","America","Europe","Europe","Europe"]
-//$country=["Morocco","US","France","France","Germany"]
-//$city=["Rabat","San Diego","Lyon","Paris","Eching"]
-
-```
-
-#### Ejemplo 3
-
-También puede sincronizar colecciones de objetos.
-
-```4d
-var $name : Collection
-var $address : Collection
-$name:=[]
-$name.push({firstname: "John"; lastname: "Smith"})
-$name.push({firstname: "Alain"; lastname: "Martin"})
-$name.push({firstname: "Jane"; lastname: "Doe"})
-$name.push({firstname: "John"; lastname: "Doe"})
-$address:=[]
-$address.push({city: "Paris"; country: "France"})
-$address.push({city: "Lyon"; country: "France"})
-$address.push({city: "Eching"; country: "Germany"})
-$address.push({city: "Berlin"; country: "Germany"})
-
-$name.multiSort(Formula($1.value.firstname<$1.value2.firstname); [$address])
-//"Alain Martin","Jane Doe","John Smith","John Doe"
-//"Lyon France","Eching Germany","Paris France","Berlin Germany"
-
-```
-
-
-
-
-
-## .orderBy()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.orderBy**( ) : Collection **.orderBy**( *pathStrings* : Text ) : Collection **.orderBy**( *pathObjects* : Collection ) : Collection **.orderBy**( *ascOrDesc* : Integer ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------- |
-| pathStrings | Text | -> | Ruta(s) de propiedad(es) a utilizar para ordenar la colección |
-| pathObjects | Collection | -> | Colección de objetos criterio |
-| ascOrDesc | Integer | -> | Ejemplo 1 |
-| Resultado | Collection | <- | Copia ordenada de la colección (copia superficial) |
-
-
-
-#### Descripción
-
-La función `.orderBy()` devuelve una nueva colección que contiene todos los elementos de la colección en el orden especificado.
-
-Esta función devuelve una *copia superficial*, lo que significa que los objetos o colecciones de ambas colecciones comparten la misma referencia. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
-
-> Esta función no modifica la colección original.
-
-Si no se pasa ningún parámetro, la función ordena los valores escalares de la colección en orden ascendente (otros tipos de elementos como objetos o colecciones se devuelven con un orden interno). Puede modificar este orden automático pasando las constantes `ck ascending` o `ck descending` en el parámetro *ascOrDesc* (ver más abajo).
-
-También puede pasar un parámetro de criterios para definir cómo deben ordenarse los elementos de la colección. Se admiten tres sintaxis para este parámetro:
-
-- *pathStrings* : Texto (fórmula). **Sintaxis**: `propertyPath1 {desc or asc}, propertyPath2 {desc or asc},...` (orden por defecto: asc). *pathStrings* contiene una fórmula compuesta de 1 a x rutas de propiedades y (opcionalmente) órdenes de clasificación, separados por comas. El orden en que se pasan las propiedades determina la prioridad de ordenación de los elementos de la colección. Por defecto, las propiedades se clasifican en orden ascendente. Puede definir el orden de clasificación de una propiedad en la cadena de criterios, separado de la ruta de la propiedad por un solo espacio: pase "asc" para ordenar en orden ascendente o "desc" en orden descendente.
-
-- *pathObjects* : Collection. Puede añadir tantos objetos en la colección *pathObjects* como sea necesario. Por defecto, las propiedades se clasifican en orden ascendente ("descending" es false). Cada elemento de la colección contiene un objeto estructurado de la siguiente manera:
-
-```4d
-{
- "propertyPath": string,
-
-
- "descending": boolean
-
-}
-```
-
-- *ascOrDesc* : Integer. Se pasa una de las siguientes constantes del tema **Objects and collections**:
-
- | Constante | Tipo | Valor | Comentario |
- | ------------- | ------- | ----- | ----------------------------------------------------------------------------- |
- | ck ascending | Integer | 0 | Los elementos se ordenan de forma ascendente (por defecto) |
- | ck descending | Integer | 1 | Los elementos se ordenan de forma descendente |
-
- Esta sintaxis sólo ordena los valores escalares de la colección (otros tipos de elementos, como objetos o colecciones, se devuelven desordenados).
-
-Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
-
-1. null
-2. booleans
-3. cadenas
-4. numbers
-5. objects
-6. collections
-7. dates
-
-#### Ejemplo 1
-
-Ordenar una colección de números de forma ascendente y descendente:
-
-```4d
- var $c; $c2; $c3 : Collection
- $c:=New collection
- For($vCounter;1;10)
- $c.push(Random)
- End for
- $c2:=$c.orderBy(ck ascending)
- $c3:=$c.orderBy(ck descending)
-```
-
-#### Ejemplo 2
-
-Ordenar una colección de objetos a partir de una fórmula de texto con nombres de propiedades:
-
-```4d
- var $c; $c2 : Collection
- $c:=New collection
- For($vCounter;1;10)
- $c.push(New object("id";$vCounter;"value";Random))
- End for
- $c2:=$c.orderBy("value desc")
- $c2:=$c.orderBy("value desc, id")
- $c2:=$c.orderBy("value desc, id asc")
-```
-
-Ordenar una colección de objetos con una ruta de propiedades:
-
-```4d
- var $c; $c2 : Collection
- $c:=New collection
- $c.push(New object("name";"Cleveland";"phones";New object("p1";"01";"p2";"02")))
- $c.push(New object("name";"Blountsville";"phones";New object("p1";"00";"p2";"03")))
-
- $c2:=$c.orderBy("phones.p1 asc")
-```
-
-#### Ejemplo 3
-
-Ordenar una colección de objetos utilizando una colección de objetos criterio:
-
-```4d
- var $crit; $c; $c2 : COllection
- $crit:=New collection
- $c:=New collection
- For($vCounter;1;10)
- $c.push(New object("id";$vCounter;"value";Random))
- End for
- $crit.push(New object("propertyPath";"value";"descending";True))
- $crit.push(New object("propertyPath";"id";"descending";False))
- $c2:=$c.orderBy($crit)
-```
-
-Ordenar con una ruta de propiedad:
-
-```4d
-
- var $crit; $c; $c2 : Collection
- $c:=New collection
- $c.push(New object("name";"Cleveland";"phones";New object("p1";"01";"p2";"02")))
- $c.push(New object("name";"Blountsville";"phones";New object("p1";"00";"p2";"03")))
- $crit:=New collection(New object("propertyPath";"phones.p2";"descending";True))
- $c2:=$c.orderBy($crit)
-```
-
-
-
-
-
-## .orderByMethod()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.orderByMethod**( *formula* : 4D.Function { ; ...*extraParam* : expression } ) : Collection **.orderByMethod**( *methodName* : Text { ; ...*extraParam* : expression } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| extraParam | any | -> | Parámetro(s) a pasar |
-| Resultado | Collection | <- | Copia ordenada de la colección (copia superficial) |
-
-
-
-#### Descripción
-
-La función `.orderByMethod()` devuelve una nueva colección que contiene todos los elementos de la colección en el orden definido mediante la función *formula* 4D o el método *methodName*.
-
-Esta función devuelve una *copia superficial*, lo que significa que los objetos o colecciones de ambas colecciones comparten la misma referencia. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-
-- o *methodName*, el nombre de un método proyecto (texto).
-
-En la retrolamada, pase un código que compare dos valores y devuelva **true** si el primer valor es menor que el segundo. Puede ofrecer los parámetros *extraParam* a la retrollamada si es necesario.
-
-La retrollamada recibe los siguientes parámetros:
-
-- $1 (objeto), donde:
- - *$1.value* (todo tipo): valor del primer elemento a comparar
- - *$1.value2* (todo tipo): valor del segundo elemento a comparar
- - $2...$N (cualquier tipo): parámetros adicionales
-
-Si utilizó un método, debe definir el siguiente parámetro:
-
-- *$1.result* (boolean): **true** si *$1.value < $1.value2*, **false** de lo contrario
-
-#### Ejemplo 1
-
-Desea ordenar una colección de cadenas en orden numérico en lugar de orden alfabético:
-
-```4d
- var $c; $c2; $c3 : Collection
- $c:=New collection
- $c.push("33";"4";"1111";"222")
- $c2:=$c.orderBy() //$c2=["1111","222","33","4"], alphabetical order
- $c3:=$c.orderByMethod(Formula(Num($1.value)Length(String($1.value2))))
- //$c2=[Passion fruit,Blackberry,Orange,Banana,Apple,Grape,pear,fig]
-```
-
-#### Ejemplo 3
-
-Ordenar los elementos de la colección por código de caracteres o alfabéticamente:
-
-```4d
-var $strings1; $strings2 : Collection
-$strings1:=New collection("Alpha";"Charlie";"alpha";"bravo";"Bravo";"charlie")
-
-//utilizando el código de caracteres:
-$strings2:=$strings1.orderByMethod(Function(sortCollection);sk character codes)
-// result : ["Alpha","Bravo","Charlie","alpha","bravo","charlie"]
-
-//utilizando el lenguaje:
-$strings2:=$strings1.orderByMethod(Function(sortCollection);sk strict)
-// resultado : ["alpha","Alpha","bravo","Bravo","charlie","Charlie"]
-```
-
-Con el siguiente método ***Flatten***:
-
-```4d
-#DECLARE ($toSort : Object ; $option : Integer)
-
-$toSort.result:=(Compare strings($toSort.value;$toSort.value2;$option2)<0)
-```
-
-
-
-
-
-## .pop()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.pop()** : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-------------------------: | ------------------------------- |
-| Resultado | any | <- | Último elemento de la colección |
-
-
-
-#### Descripción
-
-La función `.pop()` elimina el último elemento de la colección y lo devuelve como resultado de la función.
-
-> Esta función modifica la colección original.
-
-Cuando se aplica a una colección vacía, `.pop()` devuelve ***undefined***.
-
-#### Ejemplo
-
-`.pop()`, utilizado junto con [`.push()`](#push), puede utilizarse para implementar una funcionalidad primera entrada última salida de tratamiento de datos apilados:
-
-```4d
-Lanzamiento
-```
-
-
-
-
-
-## .push()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.push**( *element* : any { ;...*elementN* } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ------------------------------------------------------ |
-| element | any | -> | Elemento(s) a añadir a la colección |
-| Resultado | Collection | <- | Colección que contiene los elementos añadidos |
-
-
-
-#### Descripción
-
-La función `.push()` añade uno o más *elemento*(s) al final de la instancia de la colección y devuelve la colección editada.
-
-> Esta función modifica la colección original.
-
-#### Ejemplo 1
-
-```4d
- var $col : Collection
- $col:=New collection(1;2) //$col=[1,2]
- $col.push(3) //$col=[1,2,3]
- $col.push(6;New object("firstname";"John";"lastname";"Smith"))
- //$col=[1,2,3,6,{firstname:John,lastname:Smith}
-```
-
-#### Ejemplo 2
-
-Desea ordenar la colección resultante:
-
-```4d
- var $col; $sortedCol : Collection
- $col:=New collection(5;3;9) //$col=[5,3,9]
- $sortedCol:=$col.push(7;50).sort()
- //$col=[5,3,9,7,50]
- //$sortedCol=[3,5,7,9,50]
-```
-
-
-
-
-
-## .query()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------------ |
-| 20 R6 | Ejemplo 1 |
-| 17 R5 | Soporte de querySettings |
-| v16 R6 | Añadidos |
-
-
-
-**.query**( *queryString* : Text ) : Collection **.query**( *queryString* : Text ; *...value* : any ) : Collection **.query**( *queryString* : Text ; *querySettings* : Object ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------- |
-| queryString | Text | -> | Criterio de búsqueda |
-| value | any | -> | Valor(es) a comparar cuando se utiliza(n) marcador(es) de posición |
-| querySettings | Object | -> | Opciones de búsqueda: parámetros, atributos |
-| Resultado | Collection | <- | Descripción |
-
-
-
-#### Descripción
-
-La función `.query()` devuelve todos los elementos de una colección de objetos que coinciden con las condiciones de búsqueda definidas por *queryString* y (opcionalmente) *value* o *querySettings*. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
-
-Se devuelve una colección vacía si la colección en la que se ejecuta la consulta no contiene el *valor* buscado.
-
-> Esta función no modifica la colección original.
-
-#### parámetro queryString
-
-El parámetro *queryString* utiliza la siguiente sintaxis:
-
-```4d
-propertyPath comparator value {logicalOperator propertyPath comparator value}
-```
-
-donde:
-
-- **propertyPath**: ruta de la propiedad sobre la cual quiere ejecutar la consulta. Este parámetro puede ser un nombre simple (por ejemplo, "país") o cualquier ruta de atributo válida (por ejemplo, "país.nombre"). En el caso de una ruta de atributo cuyo tipo es `Collection`, se utiliza la notación `[]` para manejar todas las ocurrencias (por ejemplo `children[].age`).
-
-- **comparator**: símbolo que compara *propertyPath* y *value*. Se soportan los siguientes símbolos:
-
-| Comparación | Símbolo(s) | Comentario |
-| ------------------------------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Igual a | =, == | Obtiene los datos coincidentes, admite el comodín (@), no distingue entre mayúsculas de minúsculas ni diacríticas. |
-| | ===, IS | Obtiene los datos coincidentes, considera @ como carácter estándar, no distingue entre mayúsculas de minúsculas ni diacríticas |
-| Diferente de | #, != | Soporta el comodín (@). Equivale a "Condición no aplicada en una instrucción" ). |
-| | !==, IS NOT | Considera la @ como un caracter estándar |
-| Condición No aplicada a una sentencia | NOT | Los paréntesis son obligatorios cuando se utiliza NOT antes de una instrucción que contiene varios operadores. Equivalente a "No igual a"). |
-| Menor que | < | |
-| Mayor que | > | |
-| Menor o igual que | <= | |
-| Mayor o igual que | > = | |
-| Incluído en | IN | Devuelve los datos iguales a al menos uno de los valores de una colección o de un conjunto de valores, admite el comodín (@) |
-
-- **valor**: valor a comparar con el valor actual de la propiedad de cada elemento de la colección. Puede ser cualquier valor de expresión constante que coincida con la propiedad del tipo de datos del elemento o un [**marcador de posición**](#using-placeholders).
- For example, if the string "v20" is entered as value to compare with an integer attribute, it will be converted to 20.
- - La constante de tipo **texto** puede pasarse con o sin comillas simples (ver **Uso de comillas** más abajo). Para consultar una cadena dentro de otra cadena (una consulta de tipo "contiene"), utilice el símbolo de comodín (@) en el valor para aislar la cadena a buscar como se muestra en este ejemplo: "@Smith@". Las siguientes palabras claves están prohibidas para las constantes de texto: true, false.
- - Valores constantes de tipo **booleano**: **true** o **false** (Sensible a las mayúsculas y minúsculas).
- - Valores constantes de **tipo numérico**: los decimales se separan con un '.' (punto).
- - Constantes de tipo **date**: formato "YYYY-MM-DD"
- - Constantes **null**: utilizando la palabra clave "null" se encontrarán las propiedades **null** y **undefined**.
- - en el caso de una búsqueda con un comparador IN, *value* debe ser una colección, o los valores que coincidan con el tipo de la ruta del atributo entre \[ ] separados por comas (para las cadenas, los caracteres `"` deben escaparse con `\`).
-
-- **logicalOperator**: utilizado para unir condiciones múltiples en la búsqueda (opcional). Puede utilizar uno de los siguientes operadores lógicos (se puede utilizar el nombre o el símbolo):
-
-| Conjunción | Símbolo(s) |
-| ---------- | ----------------------------------------------------------------------------------- |
-| AND | &, &&, and |
-| O | |,||, or |
-
-#### Utilizar comillas
-
-Cuando utilice comillas dentro de las consultas, debe utilizar comillas simples ' ' dentro de la consulta y comillas dobles " " para encerrar toda la consulta, de lo contrario se devuelve un error. Por ejemplo:
-
-```4d
-"employee.name = 'smith' AND employee.firstname = 'john'"
-```
-
-> Las comillas simples (') no se admiten en los valores buscados, ya que romperían la cadena de búsqueda. Por ejemplo, "comp.name = 'John's pizza' " generará un error. Si necesita buscar en valores con comillas simples, puede considerar el uso de marcadores de posición (ver más abajo).
-
-#### Uso del paréntesis
-
-Puede utilizar paréntesis en la búsqueda para dar prioridad al cálculo. Por ejemplo, puede organizar una búsqueda de la siguiente manera:
-
-```4d
-"(employee.age >= 30 OR employee.age <= 65) AND (employee.salary <= 10000 OR employee.status = 'Manager')"
-```
-
-#### Uso de marcadores de posición
-
-4D le permite utilizar marcadores de posición para los argumentos *propertyPath* y *value* dentro del parámetro *queryString*. Un marcador es un parámetro que se inserta en las cadenas de búsqueda y que se sustituye por otro valor cuando se evalúa la cadena de búsqueda. El valor de los marcadores se evalúa una vez al principio de la búsqueda; no se evalúa para cada elemento.
-
-Lanzamiento
-
-- **Marcadores de posición indexados**: los parámetros se insertan como `:paramIndex` (por ejemplo ":1", ":2"...) en *queryString* y sus valores correspondientes son proporcionados por la secuencia de parámetros *value*. en *queryString* y sus valores correspondientes son proporcionados por la secuencia de parámetros *value*.
-
-Ejemplo:
-
-```4d
-$c:=$myCol.query(":1=:2";"city";"Chicago")
-```
-
-- Copia ordenada de la colección (copia superficial)
-
-Ejemplo:
-
-```4d
-$o.attributes:={att:"city"}
-$o.parameters:={name:"Chicago")
-$c:=$myCol.query(":att=:name";$o)
-```
-
-Puede mezclar todos los tipos de argumentos en *queryString*. Puede mezclar todos los tipos de argumentos en *queryString*.
-
-- valores directos (sin marcadores),
-- marcadores indexados y/o con nombre.
-
-El uso de marcadores de posición en las búsquedas **se recomienda** por las siguientes razones:
-
-1. Evita la inserción de código malicioso: si utiliza directamente variables completadas por el usuario dentro de la cadena de búsqueda, un usuario podría modificar las condiciones de búsqueda introduciendo argumentos de búsqueda adicionales. Por ejemplo, imagine una cadena de búsqueda como:
-
-```4d
- $vquery:="status = 'public' & name = "+myname //el usuario introduce su nombre
- $result:=$col.query($vquery)
-```
-
-Esta búsqueda parece segura ya que se filtran los datos no públicos. Sin embargo, si el usuario introduce en el área *myname* algo como *"smith OR status='private'*, la cadena de consulta se modificaría en el paso de interpretación y podría devolver datos privados.
-
-Cuando se utilizan marcadores de posición, no es posible anular las condiciones de seguridad:
-
-```4d
- $result:=$col.query("status='public' & name=:1";myname)
-```
-
-En este caso, si el usuario introduce *smith OR status='private'* en el área *myname*, no se interpretará en la cadena de búsqueda, sino que sólo se pasará como valor. La búsqueda de una persona llamada "smith OR status='private'" simplemente fallará.
-
-2. Evita tener que preocuparse por cuestiones de formato o caracteres, especialmente cuando se manejan los parámetros *propertyPath* o *value* que pueden contener caracteres no alfanuméricos como ".", "['...
-
-3. Permite el uso de variables o expresiones en los argumentos de búsqueda. Ejemplos:
-
-```4d
-$result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
-$result2:=$col.query("company.name = :1";"John's Pizzas")
-```
-
-> El uso de una [**referencia de colección** o **referencia de objeto**](#objeto-o-referencia-de-colección-como-valor) en el parámetro *value* no está soportado con esta sintaxis. Debe utilizar el parámetro [*querySettings*](#querysettings-parameter).
-
-#### Búsqueda de valores null
-
-Cuando se buscan valores null, no se puede utilizar la sintaxis de marcador de posición porque el motor de búsqueda considera null como un valor de comparación invalido. Por ejemplo, si ejecuta la siguiente búsqueda:
-
-```4d
-Lanzamiento
-```
-
-No obtendrá el resultado esperado porque el valor null será evaluado por 4D como un error resultante de la evaluación del parámetro (por ejemplo, un atributo procedente de otra búsqueda). Para este tipo de búsquedas, debe utilizar la sintaxis de búsqueda directa:
-
-```4d
-Lanzamiento
-```
-
-#### Referencia de objeto o de colección como valor
-
-Puede consultar en una colección utilizando una referencia de objeto o una referencia de colección como parámetro *value* a comparar. La consulta coincidirá con los objetos de la colección que se refieran a (apunten a) la misma **instancia** de objeto o de colección.
-
-Para una descripción detallada de los parámetros *queryString* y *value*, consulte la función `dataClass.query()`.
-
-| Comparación | Símbolo(s) |
-| ------------ | ----------------------------- |
-| Igual a | =, == |
-| Diferente de | #, != |
-
-Para construir una consulta con un objeto o una referencia de colección, debe utilizar la sintaxis del parámetro *querySettings*. Ejemplo con una referencia de objeto:
-
-```4d
-var $o1:={a: 1}
-var $o2:={a: 1} /mismo objeto pero otra referencia
-var $o3:=$o1 /mismo objeto y referencia
-
-var $col; $colResult : Collection
-
-$col:=[{o: $o1}; {o: $o2}; {o: $o3}]
-$colResult:=$col.query("o = :v"; {parameters: {v: $o3}})
- //$colResult.length=2
- //$colResult[0].o=$o1 es true
- //$colResult[1].o=$o1 es true
-
-```
-
-Ejemplo con una referencia de colección:
-
-```4d
-
-$c1:=[1; 2; 3]
-$c2:=[1; 2; 3] //misma colección pero otra referencia
-$c3:=$c1 //misma colección y referencia
-
-$col:=[{c: $c1}; {c: $c2}; {c: $c3}]
-$col2:=$col.query("c = :v"; {parameters: {v: $c3}})
- //$col2.length=2
- //$col2[0].c=$c1 es true
- //$col2[1].c=$c1 es true
-
-```
-
-#### Parámetro querySettings
-
-En el parámetro *querySettings*, puede pasar un objeto que contenga marcadores de posición de consulta como objetos. Se soportan las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| parameters | Object | **Marcadores de posición con nombre para los valores** utilizados en *queryString*. Los valores se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para un valor en *queryString* o formula (":placeholder") y valor es el valor a comparar. Puede combinar marcadores de posición indexados (valores pasados directamente en parámetros de valor) y valores de marcadores de posición con nombre en la misma búsqueda. |
-| attributes | Object | **Marcadores de posición con nombre para rutas de atributos** utilizados en la *queryString*. Los atributos se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para una ruta de atributo en *queryString* (":placeholder"), y valor puede ser una cadena o una colección de cadenas. Cada valor es una ruta que puede designar una propiedad en un objeto de la colección
Tipo de objeto
Descripción
Cadena
Ruta de acceso del atributo expresado utilizando la notación de punto, por ejemplo, "name" o "user.address.zipCode"
Colección de cadenas
Cada cadena de la colección representa un nivel de attributePath, por ejemplo, `\["name"]` o `\["user","address","zipCode"]`. El uso de una colección permite realizar consultas sobre atributos con nombres que no son compatibles a la notación de puntos, por ejemplo, \["4Dv17.1", "en\/fr"]
Puede mezclar marcadores de posición indexados (valores pasados directamente en los parámetros *value*) y los valores de marcadores de posición con nombre en la misma consulta. |
-
-:::note
-
-El uso de este parámetro es obligatorio si desea consultar en una colección [utilizando una **referencia de colección** o una **referencia de un objeto**](#object-or-collection-reference-as-value).
-
-:::
-
-#### Ejemplo 1
-
-```4d
- var $c; $c2; $c3 : Collection
- $c:=New collection
- $c.push(New object("name";"Cleveland";"zc";35049))
- $c.push(New object("name";"Blountsville";"zc";35031))
- $c.push(New object("name";"Adger";"zc";35006))
- $c.push(New object("name";"Clanton";"zc";35046))
- $c.push(New object("name";"Clanton";"zc";35045))
- $c2:=$c.query("name = :1";"Cleveland") //$c2=[{name:Cleveland,zc:35049}]
- $c3:=$c.query("zc > 35040") //$c3=[{name:Cleveland,zc:35049},{name:Clanton,zc:35046},{name:Clanton,zc:35045}]
-```
-
-#### Ejemplo 2
-
-```4d
- var $c : Collection
- $c:=New collection
- $c.push(New object("name";"Smith";"dateHired";!22-05-2002!;"age";45))
- $c.push(New object("name";"Wesson";"dateHired";!30-11-2017!))
- $c.push(New object("name";"Winch";"dateHired";!16-05-2018!;"age";36))
-
- $c.push(New object("name";"Sterling";"dateHired";!10-5-1999!;"age";Null))
- $c.push(New object("name";"Mark";"dateHired";!01-01-2002!))
-```
-
-Este ejemplo devuelve las personas cuyo nombre contiene "in":
-
-```4d
- $col:=$c.query("name = :1";"@in@")
- //$col=[{name:Winch...},{name:Sterling...}]
-```
-
-Este ejemplo devuelve las personas cuyo nombre no empieza por una cadena de una variable (introducida por el usuario, por ejemplo):
-
-```4d
- $col:=$c.query("name # :1";$aString+"@")
- //if $astring="W"
- //$col=[{name:Smith...},{name:Sterling...},{name:Mark...}]
-```
-
-Este ejemplo devuelve las personas cuya edad no se conoce (propiedad definida como null o indefinida):
-
-```4d
-Ejemplo
-```
-
-Este ejemplo devuelve las personas contratadas hace más de 90 días:
-
-```4d
-Comentario
-```
-
-#### Ejemplo 3
-
-Búsquedas con fechas:
-
-```4d
-
-$entitySelection:=ds.Employee.query("birthDate > :1";"1970-01-01")
-$entitySelection:=ds.Employee.query("birthDate <= :1";Current date-10950)
-```
-
-:::info
-
-Descripción Descripción Sin embargo, ten en cuenta que las fórmulas no están soportadas por la función `collection.query()`, ni en el parámetro *queryString* ni como parámetro objeto *formula*.
-
-:::
-
-
-
-
-
-## .reduce()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.reduce**( *formula* : 4D.Function { ; *initValue* : any { ; *...param* : expression }} ) : any **.reduce**( *methodName* : Text { ; *initValue* : any { ; *...param* : expression }} ) : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ----------------------------------------------- | :-------------------------: | --------------------------------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| initValue | Text, Number, Object, Collection, Date, Boolean | -> | Colección que contiene los elementos añadidos |
-| param | expresión | -> | Parámetro(s) a pasar |
-| Resultado | Text, Number, Object, Collection, Date, Boolean | <- | donde: |
-
-
-
-#### Descripción
-
-La función `.reduce()` aplica la retrollamada *formula* o *methodName* a un acumulador y cada elemento de la colección (de izquierda a derecha) para reducirlo a un único valor.
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-Tipo
-
-Puede pasar el valor para inicializar el acumulador en *initValue*. Si se omite, *$1.accumulator* empieza por *Undefined*.
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a procesar
-- en *$2: param*
-- en *$N...*: *paramN...*
-
-La retrollamada define los siguientes parámetros:
-
-- Descripción
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-#### Ejemplo 1
-
-```4d
-var $c : Collection
-$c:=New collection(5;3;5;1;3;4;4;6;2;2)
-$r:=$c.reduce(Formula($1.accumulator*=$1.value); 1) //devuelve 86400
-```
-
-#### Ejemplo 2
-
-Este ejemplo permite reducir varios elementos de la colección a uno solo:
-
-```4d
- var $c;$r : Collection
- $c:=New collection
- $c.push(New collection(0;1))
- $c.push(New collection(2;3))
- $c.push(New collection(4;5))
- $c.push(New collection(6;7))
- $r:=$c.reduce(Formula(Flatten)) //$r=[0,1,2,3,4,5,6,7]
-```
-
-Con el siguiente método ***Flatten***:
-
-```4d
- If($1.accumulator=Null)
- $1.accumulator:=New collection
- End if
- $1.accumulator.combine($1.value)
-```
-
-
-
-
-
-## .reduceRight()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.reduceRight**( *formula* : 4D.Function { ; *initValue* : any { ; *...param* : expression }} ) : any **.reduceRight**( *methodName* : Text { ; *initValue* : any { ; *...param* : expression }} ) : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ----------------------------------------------- | :-------------------------: | --------------------------------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| initValue | Text, Number, Object, Collection, Date, Boolean | -> | Colección que contiene los elementos añadidos |
-| param | expresión | -> | Parámetro(s) a pasar |
-| Resultado | Text, Number, Object, Collection, Date, Boolean | <- | donde: |
-
-
-
-#### Descripción
-
-La función `.reduceRight()` aplica la retrollamada *formula* o *methodName* contra un acumulador y cada elemento de la colección (de derecha a izquierda) para reducirlo a un único valor.
-
-> Esta función no modifica la colección original.
-
-Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-Tipo
-
-Puede pasar el valor para inicializar el acumulador en *initValue*. Si se omite, *$1.accumulator* empieza por *Undefined*.
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a procesar
-- en *$2: param*
-- en *$N...*: *paramN...*
-
-La retrollamada define los siguientes parámetros:
-
-- Descripción
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-#### Ejemplo 1
-
-```4d
-Tipo
-```
-
-#### Ejemplo 2
-
-Este ejemplo permite reducir varios elementos de la colección a uno solo:
-
-```4d
- var $c;$r : Collection
- $c:=New collection
- $c.push(New collection(0;1))
- $c.push(New collection(2;3))
- $c.push(New collection(4;5))
- $c.push(New collection(6;7))
- $r:=$c.reduceRight(Formula(Flatten)) //$r=[6,7,4,5,2,3,0,1]
-```
-
-Con el siguiente método ***Flatten***:
-
-```4d
-Ejemplo 4
-```
-
-
-
-
-
-## .remove()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.remove**( *index* : Integer { ; *howMany* : Integer } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------- |
-| index | Integer | -> | Elemento en el que se inicia la eliminación |
-| howMany | Integer | -> | Número de elementos a eliminar, o 1 elemento si se omite |
-| Resultado | Collection | <- | Colección modificada sin elemento(s) eliminado(s) |
-
-
-
-#### Descripción
-
-La función `.remove()` elimina uno o más elementos a partir de la posición *index* especificada en la colección y devuelve la colección editada.
-
-> Esta función modifica la colección original.
-
-Lanzamiento
-
-> **Atención**: recuerde que los elementos de la colección están numerados desde 0. Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
-
-- Si *index* < 0, se recalcula como *index:=index+length* (se considera el desplazamiento desde el final de la colección).
-- Lanzamiento
-- Ejemplo 1
-
-En *howMany*, pase el número de elementos a eliminar de *index*. Si no se especifica *howMany*, se elimina un elemento.
-
-Si se intenta eliminar un elemento de una colección vacía, el método no hace nada (no se genera ningún error).
-
-#### Ejemplo
-
-```4d
- var $col : Collection
- $col:=New collection("a";"b";"c";"d";"e";"f";"g";"h")
- $col.remove(3) // $col=["a","b","c","e","f","g","h"]
- $col.remove(3;2) // $col=["a","b","c","g","h"]
- $col.remove(-8;1) // $col=["b","c","g","h"]
- $col.remove(-3;1) // $col=["b","g","h"]
-```
-
-
-
-
-
-## .resize()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.resize**( *size* : Integer { ; *defaultValue* : any } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ----------------------------------------------- | :-------------------------: | ------------------------------------------------------------------------------------------- |
-| size | Integer | -> | Nuevo tamaño de la colección |
-| defaultValue | Number, Text, Object, Collection, Date, Boolean | -> | Valor por defecto para llenar nuevos elementos |
-| Resultado | Collection | <- | o *methodName*, el nombre de un método proyecto (texto). |
-
-
-
-#### Descripción
-
-La función `.resize()` ajusta la longitud de la colección al nuevo tamaño especificado y devuelve la colección redimensionada.
-
-> Esta función modifica la colección original.
-
-- Ejemplo 1
-- Ejemplo 1
-
-Por defecto, los nuevos elementos se llenan con valores **null**. Puede especificar el valor a llenar en los elementos añadidos utilizando el parámetro *defaultValue*.
-
-#### Ejemplo
-
-```4d
- var $c : Collection
- $c:=New collection
- $c.resize(10) // $c=[null,null,null,null,null,null,null,null,null,null]
-
- $c:=New collection
- $c.resize(10;0) // $c=[0,0,0,0,0,0,0,0,0,0]
-
- $c:=New collection(1;2;3;4;5)
- $c.resize(10;New object("name";"X")) //$c=[1,2,3,4,5,{name:X},{name:X},{name:X},{name:X},{name:X}]
-
- $c:=New collection(1;2;3;4;5)
- $c.resize(2) //$c=[1,2]
-
-```
-
-
-
-
-
-## .reverse()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.reverse( )** : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Resultado | Collection | <- | (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario. |
-
-
-
-#### Descripción
-
-La función `.reverse()` devuelve una copia profunda de la colección con todos sus elementos en orden inverso. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
-
-> Esta función no modifica la colección original.
-
-#### Ejemplo
-
-```4d
- var $c; $c2 : Collection
- $c:=New collection(1;3;5;2;4;6)
- $c2:=$c.reverse() //$c2=[6,4,2,5,3,1]
-```
-
-
-
-
-
-## .shift()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.shift()** : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-------------------------: | ------------------------------- |
-| Resultado | any | <- | Primer elemento de la colección |
-
-
-
-#### Descripción
-
-La función `.shift()` elimina el primer elemento de la colección y lo devuelve como resultado de la función.
-
-> Esta función modifica la colección original.
-
-Si la colección está vacía, este método no hace nada.
-
-#### Ejemplo
-
-```4d
- var $c : Collection
- var $val : Variant
- $c:=New collection(1;2;4;5;6;7;8)
- $val:=$c.shift()
- // $val=1
- // $c=[2,4,5,6,7,8]
-```
-
-
-
-
-
-## .slice()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.slice**( *startFrom* : Integer { ; *end* : Integer } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ---------------------------------------------- |
-| startFrom | Integer | -> | Índice de inicio (incluido) |
-| end | Integer | -> | Índice final (no incluido) |
-| Resultado | Collection | <- | Resultado |
-
-
-
-#### Descripción
-
-La función `.slice()` devuelve una parte de una colección en una nueva colección, seleccionada de la posición *startFrom* a la posición *end* (no incluye *end*). Esta función devuelve una *copia superficial* de la colección. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
-
-> Esta función no modifica la colección original.
-
-La colección devuelta contiene el elemento especificado por *startFrom* y todos los elementos subsiguientes hasta, pero sin incluir, el elemento especificado por *end*. Si sólo se especifica el parámetro *startFrom*, la colección devuelta contiene todos los elementos desde *startFrom* hasta el último elemento de la colección original.
-
-- Si *startFrom* < 0, se recalcula como *startFrom:=startFrom+length* (se considera el desplazamiento desde el final de la colección).
-- Descripción
-- Si *end* < 0 , se recalcula como *end:=end+length*.
-- Este ejemplo permite reducir varios elementos de la colección a uno solo:
-
-#### Ejemplo
-
-```4d
- var $c; $nc : Collection
- $c:=New collection(1;2;3;4;5)
- $nc:=$c.slice(0;3) //$nc=[1,2,3]
- $nc:=$c.slice(3) //$nc=[4,5]
- $nc:=$c.slice(1;-1) //$nc=[2,3,4]
- $nc:=$c.slice(-3;-2) //$nc=[3]
-```
-
-
-
-
-
-## .some()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.some**( { *startFrom* : Integer ; } *formula* : 4D.Function { ; *...param* : any } ) : Boolean **.some**( { *startFrom* : Integer ; } *methodName* : Text { ; *...param* : any } ) : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | ------------------------------------------------------------ |
-| startFrom | Integer | -> | Índice para iniciar la prueba en |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| param | any | -> | Parámetro(s) a pasar |
-| Resultado | Boolean | <- | True si al menos un elemento ha superado la prueba con éxito |
-
-
-
-#### Descripción
-
-La función `.some()` devuelve true si al menos un elemento de la colección ha pasado con éxito una prueba implementada en el código *formula* o *methodName* suministrado.
-
-Se designa el código 4D de retrollamada (callback) a ejecutar para evaluar los elementos de la colección utilizando:
-
-- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
-- o *methodName*, el nombre de un método proyecto (texto).
-
-La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
-
-La retrollamada recibe los siguientes parámetros:
-
-- en *$1.value*: valor del elemento a procesar
-- en *$2: param*
-- en *$N...*: *paramN...*
-
-Puede definir los siguientes parámetros:
-
-- Expresión a buscar en la colección
-- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
-
-En todo caso, en el momento en que la función `.some()` encuentra el primer elemento de la colección que devuelve true, deja de llamar a la llamada de retorno y devuelve **true**.
-
-Por defecto, `.some()` comprueba toda la colección. Opcionalmente, puede pasar el índice de un elemento desde el cual iniciar la prueba en *startFrom*.
-
-- Tipo
-
-- Añadidos
-
-- Si *startFrom* = 0, se busca en toda la colección (por defecto).
-
-#### Ejemplo
-
-Soporte de fórmula
-
-```4d
- var $c : Collection
- var $b : Boolean
- $c:=New collection
- $c.push(-5;-3;-1;-4;-6;-2)
- $b:=$c.some(Formula($1.value>0)) // $b=false
- $c.push(1)
- $b:=$c.some(Formula($1.value>0)) // $b=true
-
- $c:=New collection
- $c.push(1;-5;-3;-1;-4;-6;-2)
- $b:=$c.some(Formula($1.value>0)) //$b=true
- $b:=$c.some(1;Formula($1.value>0)) //$b=false
-```
-
-
-
-
-
-## .sort()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------ |
-| 19 R6 | Soporte de fórmula |
-| v16 R6 | Añadidos |
-
-
-
-**.sort**() : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | --------------------------- | :-------------------------: | --------------------- |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| extraParam | any | -> | Parámetros del método |
-| Resultado | Collection | <- | La nueva colección |
-
-
-
-#### Descripción
-
-La función `.sort()` ordena los elementos de la colección original y además devuelve la colección ordenada.
-
-> Esta función modifica la colección original.
-
-Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo. Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
-
-1. null
-2. booleans
-3. cadenas
-4. numbers
-5. objects
-6. collections
-7. dates
-
-Si quiere ordenar los elementos de la colección en algún otro orden o ordenar cualquier tipo de elemento, debe suministrar en *formula* ([objeto Formula](FunctionClass.md)) o *methodName* (Text) una retro llamada que define el orden de clasificación. El valor de retorno debe ser un booleano que indica el orden relativo de los dos elementos: **True** si *$1.value* es menor que *$1.value2*, **False** si *$1.value* es mayor que *$1.value2*. Puede ofrecer parámetros adicionales a la retrollamada si es necesario.
-
-La retrollamada recibe los siguientes parámetros:
-
-- $1 (objeto), donde:
- - *$1.value* (todo tipo): valor del primer elemento a comparar
- - *$1.value2* (todo tipo): valor del segundo elemento a comparar
-- $2...$N (cualquier tipo): parámetros adicionales
-
-Resultado
-
-- Elemento a insertar en la colección
-
-#### Ejemplo 1
-
-```4d
- var $col; $col2 : Collection
- $col:=New collection("Tom";5;"Mary";3;"Henry";1;"Jane";4;"Artie";6;"Chip";2)
- $col2:=$col.sort() // $col2=["Artie","Chip","Henry","Jane","Mary","Tom",1,2,3,4,5,6]
- // $col=["Artie","Chip","Henry","Jane","Mary","Tom",1,2,3,4,5,6]
-```
-
-#### Ejemplo 2
-
-```4d
- var $col; $col2 : Collection
- $col:=New collection(10;20)
- $col2:=$col.push(5;3;1;4;6;2).sort() //$col2=[1,2,3,4,5,6,10,20]
-```
-
-#### Ejemplo 3
-
-```4d
-var $col; $col2; $col3 : Collection
-$col:=New collection(33;4;66;1111;222)
-$col2:=$col.sort() //numerical sort: [4,33,66,222,1111]
-$col3:=$col.sort(Formula(String($1.value)
-
-
-
-## .sum()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.sum**( { *propertyPath* : Text } ) : Real
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ---- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
-| Resultado | Real | <- | `.pop()`, utilizado junto con [`.push()`](#push), puede utilizarse para implementar una funcionalidad primera entrada última salida de tratamiento de datos apilados: |
-
-
-
-#### Descripción
-
-La función `.sum()` devuelve la suma de todos los valores de la instancia de la colección.
-
-Para el cálculo sólo se tienen en cuenta los elementos numéricos (se ignoran otros tipos de elementos).
-
-Si la colección contiene objetos, pasa el parámetro *propertyPath* para indicar la propiedad del objeto a tener en cuenta.
-
-`.sum()` devuelve 0 si:
-
-- la colección está vacía,
-- la colección no contiene elementos numéricos,
-- *propertyPath* no se encuentra en la colección.
-
-#### Ejemplo 1
-
-```4d
- var $col : Collection
- var $vSum : Real
- $col:=New collection(10;20;"Monday";True;2)
- $vSum:=$col.sum() //32
-```
-
-#### Ejemplo 2
-
-```4d
- var $col : Collection
- var $vSum : Real
- $col:=New collection
- $col.push(New object("name";"Smith";"salary";10000))
- $col.push(New object("name";"Wesson";"salary";50000))
- $col.push(New object("name";"Gross";"salary";10500,5))
- $vSum:=$col.sum("salary") //$vSum=70500,5
-```
-
-
-
-
-
-## .unshift()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| v16 R6 | Añadidos |
-
-
-
-**.unshift**( *value* : any { ;...*valueN* : any } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | -------------------------------------- | :-------------------------: | -------------------------------------------------------------------- |
-| value | Text, Number, Object, Collection, Date | -> | Valor(es) a insertar al principio de la colección |
-| Resultado | Collection | <- | Colección que contiene los elementos añadidos |
-| | | | |
-
-
-
-#### Descripción
-
-La función `.unshift()` inserta el *valor*(es) dado al principio de la colección y devuelve la colección modificada.
-
-> Esta función modifica la colección original.
-
-Si se pasan varios valores, se insertan todos a la vez, lo que significa que aparecen en la colección resultante en el mismo orden que en la lista de argumentos.
-
-#### Ejemplo
-
-```4d
- var $c : Collection
- $c:=New collection(1;2)
- $c.unshift(4) // $c=[4,1,2]
- $c.unshift(5) //$c=[5,4,1,2]
- $c.unshift(6;7) // $c=[6,7,5,4,1,2]
-```
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/CryptoKeyClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/CryptoKeyClass.md
deleted file mode 100644
index 737c9934e265a3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/CryptoKeyClass.md
+++ /dev/null
@@ -1,451 +0,0 @@
----
-id: CryptoKeyClass
-title: CryptoKey
----
-
-La clase `CryptoKey` del lenguaje 4D encapsula un par de llaves de cifrado asimétrico.
-
-Esta clase está disponible en el "class store" de `4D`.
-
-:::info Ver también
-
-Para obtener una visión general de esta clase, consulte la entrada del blog [**CryptoKey: cifrar, descifrar, firmar y verificar**](https://blog.4d.com/cryptokey-encrypt-decrypt-sign-and-verify/).
-
-:::
-
-### Resumen
-
-| |
-| ---------------------------------------------------------------------------------------------------------------------------- |
-| [](#4dcryptokeynew) |
-| [](#curve) |
-| [](#decrypt) |
-| [](#encrypt) |
-| [](#getprivatekey) |
-| [](#getpublickey) |
-| [](#pem) |
-| [](#sign) |
-| [](#size) |
-| [](#type) |
-| [](#verify) |
-
-## 4D.CryptoKey.new()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**4D.CryptoKey.new**( *settings* : Object ) : 4D.CryptoKey
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------- | --------------------------- | ------------------------------------------------- |
-| settings | Object | -> | Parámetros para generar o cargar un par de llaves |
-| Resultado | 4D.CryptoKey | <- | Objeto que encapsula un par de llaves de cifrado |
-
-
-
-La función `4D.CryptoKey.new()` crea un nuevo objeto `4D.CryptoKey` que encapsula un par de llaves de cifrado, en función del parámetro *settings*. It allows to generate a new RSA or ECDSA key, or to load an existing key pair from a PEM definition.
-
-#### *settings*
-
-| Propiedad | Tipo | Descripción |
-| --------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type) | text | Define el tipo de clave a crear:
"RSA": genera un par de llaves RSA, utilizando [.size](#size) como tamaño.
"ECDSA": genera un par de llaves Elliptic Curve Digital Signature Algorithm, utilizando [.curve](#curve) como curva. Tenga en cuenta que las llaves ECDSA no pueden utilizarse para cifrar, sino sólo para firmar.
"PEM": carga una definición de par de llaves en formato PEM, utilizando [.pem](#pem).
|
-| [curve](#curve) | text | Nombre de la curva ECDSA |
-| [pem](#pem) | text | Definición PEM de una llave de cifrado a cargar |
-| [size](#size) | integer | Tamaño de la llave RSA en bits |
-
-#### *CryptoKey*
-
-El objeto `CryptoKey` devuelto encapsula un par de llaves de cifrado. It is a shared object and can therefore be used by multiple 4D processes simultaneously.
-
-#### Ejemplo 1
-
-Un mensaje está firmado por una llave privada y la firma es verificada por la llave pública correspondiente. El siguiente código firma y verifica una firma de mensaje simple.
-
-- Lado bob:
-
-```4d
-// Crear el mensaje
-$message:="hello world"
-Folder(fk desktop folder).file("message.txt").setText($message)
-
-// Crear una clave
-$type:=New object("type";"RSA")
-$key:=4D.CryptoKey.new($type)
-
-// Obtener la llave pública y guardarla
-Folder(fk desktop folder).file("public.pem").setText($key.getPublicKey())
-
-// Obtener firma como base64 y guardarla
-Folder(fk desktop folder).file("signature").setText($key.sign($message;$type))
-
-/*Bob envía el mensaje, la llave pública y la firma a Alice*/
-```
-
-- Lado Alice:
-
-```4d
-// Obtener mensaje, llave pública y firma
-$message:=Folder(fk desktop folder).file("message.txt").getText()
-$publicKey:=Folder(fk desktop folder).file("public.pem").getText()
-$signature:=Folder(fk desktop folder).file("signature"). etText()
-
-// Crear una llave
-$type:=New object("type";"PEM";"pem";$publicKey)
-$key:=4D.CryptoKey.new($type)
-
-// Verificar la firma
-If ($key.verify($message;$signature;$type).success)
-// La firma es válida
-
-End if
-```
-
-#### Ejemplo 2
-
-El siguiente código de ejemplo firma y verifica un mensaje utilizando un nuevo par de llaves ECDSA, por ejemplo para hacer un token web JSON ES256.
-
-```4d
- // Generar un nuevo par de llaves ECDSA
-$key:=4D.CryptoKey.new(New object("type";"ECDSA";"curve";"prime256v1"))
-
- // Obtener la firma como base64
-$message:="hello world"
-$signature:=$key.sign($message;New object("hash";"SHA256"))
-
- // Verificar firma
-$status:=$key.verify($message;$signature;New object("hash";"SHA256"))
-ASSERT($status.success)
-```
-
-
-
-## .curve
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.curve** : Text
-
-Definido sólo para las llaves ECDSA: el nombre de la curva normalizada de la llave. .
-
-
-
-
-
-## .decrypt()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.decrypt**( *message* : Text ; *options* : Object ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | --------------------------- | ----------------------------------------------------------------------------------------------------------- |
-| message | Text | -> | Cadena mensaje que se descodificará utilizando `options.encodingEncrypted` y se descifrará. |
-| options | Object | -> | Opciones de decodificación |
-| Resultado | Object | <- | Estado |
-
-
-
-La función `.decrypt()` descifra el parámetro *message* utilizando la llave **privada**. El algoritmo utilizado depende del tipo de la llave.
-
-La llave debe ser una llave RSA, el algoritmo es RSA-OAEP (ver [RFC 3447](https://tools.ietf.org/html/rfc3447)).
-
-#### *options*
-
-| Propiedad | Tipo | Descripción |
-| ----------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". |
-| encodingEncrypted | text | Codificación utilizada para convertir el parámetro `message` en la representación binaria a descifrar. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
-| encodingDecrypted | text | Codificación utilizada para convertir el mensaje binario descifrado en la cadena de resultados. Puede ser "UTF-8", "Base64", o "Base64URL". Por defecto es "UTF-8". |
-
-#### *Resultado*
-
-La función devuelve un objeto status con la propiedad `success` definida en `true` si el *message* pudo ser desencriptado con éxito.
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---------- | ------------------------------------------------------------------------ |
-| success | boolean | True si el mensaje ha sido descifrado con éxito |
-| resultado | text | Mensaje descifrado y decodificado utilizando `options.encodingDecrypted` |
-| errors | collection | Si `success` es `false`, puede contener una colección de errores |
-
-En caso de que *message* no haya podido ser descifrado por no haber sido cifrado con la misma clave o algoritmo, el objeto `status` devuelto contiene una colección de errores en `status.errors`.
-
-
-
-
-
-## .encrypt()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.encrypt**( *message* : Text ; *options* : Object ) : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | --------------------------- | ----------------------------------------------------------------------------------------------- |
-| message | Text | -> | Cadena mensaje a codificar utilizando `options.encodingDecrypted` y encriptada. |
-| options | Object | -> | Opciones de codificación |
-| Resultado | Text | <- | Mensaje encriptado y codificado utilizando la opción `options.encodingEncrypted` |
-
-
-
-La función `.encrypt()` cifra el parámetro *message* utilizando la llave **pública**. El algoritmo utilizado depende del tipo de la llave.
-
-La llave debe ser una llave RSA, el algoritmo es RSA-OAEP (ver [RFC 3447](https://tools.ietf.org/html/rfc3447)).
-
-##### *options*
-
-| Propiedad | Tipo | Descripción |
-| ----------------- | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". |
-| encodingEncrypted | text | Codificación utilizada para convertir el mensaje binario encriptado en la cadena de resultados. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
-| encodingDecrypted | text | Codificación utilizada para convertir el parámetro `message` en la representación binaria a cifrar. Puede ser "UTF-8", "Base64", o "Base64URL". Por defecto es "UTF-8". |
-
-#### *Resultado*
-
-El valor devuelto es un mensaje encriptado.
-
-
-
-
-
-## .getPrivateKey()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.getPrivateKey()** : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | --------------------------- | ---------------------------- |
-| Resultado | Text | <- | Llave privada en formato PEM |
-
-
-
-La función `.getPrivateKey()` devuelve la llave privada del objeto `CryptoKey` en formato PEM, o una cadena vacía si no está disponible.
-
-#### *Resultado*
-
-El valor devuelto es la llave privada.
-
-
-
-
-
-## .getPublicKey()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.getPublicKey**() : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | --------------------------- | ---------------------------- |
-| Resultado | Text | <- | Llave pública en formato PEM |
-
-
-
-La función `.getPublicKey()` devuelve la llave pública del objeto `CryptoKey` en formato PEM, o una cadena vacía si no hay ninguna disponible.
-
-#### *Resultado*
-
-El valor devuelto es la llave pública.
-
-
-
----
-
-
-
-## .pem
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.pem** : Text
-
-Definición PEM de una llave de cifrado a cargar. Si la llave es una llave privada, se deducirá de ella la llave pública RSA o ECDSA.
-
-
-
-
-
-## .sign()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------- |
-| 20 R8 | Soporte de mensajes como Blob |
-| 18 R4 | Añadidos |
-
-
-
-.**sign** (*message* : Text ; *options* : Object) : Text .**sign** (*message* : Blob ; *options* : Object) : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------ | --------------------------- | --------------------------------------------------------------------- |
-| message | Texto O Blob | -> | Mensaje a firmar |
-| options | Object | -> | Opciones de firma |
-| Resultado | Text | <- | Firma en representación Base64 o Base64URL, según la opción "encoding |
-
-
-
-La función `.sign()` firma la representación utf8 de una cadena *message* o Blob utilizando las llaves del objeto `CryptoKey` y las *options* suministradas. Devuelve su firma en formato base64 o base64URL, dependiendo del valor del atributo `options.encoding` que le haya pasado.
-
-La `CryptoKey` debe contener una llave **privada** válida.
-
-#### *options*
-
-| Propiedad | Tipo | Descripción |
-| ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". Cuando se utiliza para producir un JWT, el tamaño del hash debe coincidir con el tamaño del algoritmo PS@, ES@, RS@ o PS@ |
-| encodingEncrypted | text | Codificación utilizada para convertir el mensaje binario encriptado en la cadena de resultados. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
-| pss | boolean | Utilice el Probabilistic Signature Scheme (PSS). Se ignora si la llave no es una llave RSA. Pase `true` al producir un JWT para el algoritmo PS@ |
-| encoding | text | Representation of provided signature. Possible values are "Base64" or "Base64URL". Por defecto es "Base64". |
-
-#### *Resultado*
-
-La representación utf8 de *message*.
-
-
-
-
-
-## .size
-
-
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.size** : Integer
-
-Definido sólo para llaves RSA: el tamaño de la llave en bits. .
-
-
-
-## .type
-
-
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.type** : Text
-
-Contiene el nombre del tipo de llave - "RSA", "ECDSA", "PEM" .
-
-- "RSA": un par de llaves RSA, utilizando `settings.size` como [.size](#size).
-- "ECDSA": un par de llaves Elliptic Curve Digital Signature Algorithm, utilizando `settings.curve` como [.curve](#curve). Tenga en cuenta que las llaves ECDSA no pueden utilizarse para el cifrado, sino sólo para la firma.
-- "PEM": definición de par de llaves en formato PEM, utilizando `settings.pem` como [.pem](#pem).
-
-
-
-## .verify()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------- |
-| 20 R8 | Soporte de mensajes como Blob |
-| 18 R4 | Añadidos |
-
-
-
-**.verify**( *message* : Text ; *signature* : Text ; *options* : Object) : Object *.verify**( *message* : Blob ; *signature* : Text ; *options* : Object) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------ | --------------------------- | --------------------------------------------------------------------------------------------- |
-| message | Texto O Blob | -> | Mensaje utilizado para producir la firma |
-| signature | Text | -> | Firma a verificar, en representación Base64 o Base64URL, según el valor de `options.encoding` |
-| options | Object | -> | Opciones de firma |
-| Resultado | Object | <- | Estado de la verificación |
-
-
-
-La función `.verify()` verifica la firma base64 contra la representación utf8 del *message* usando las llaves del objeto `CryptoKey` y las *options* suministradas.
-
-La `CryptoKey` debe contener una llave **pública** válida.
-
-#### *options*
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". Cuando se utiliza para producir un JWT, el tamaño del hash debe coincidir con el tamaño del algoritmo PS@, ES@, RS@ o PS@ |
-| pss | boolean | Utilice el Probabilistic Signature Scheme (PSS). Se ignora si la llave no es una llave RSA. Pase `true` al verificar un JWT para el algoritmo PS@ |
-| encoding | text | Codificación utilizada para convertir el mensaje binario encriptado en la cadena de resultados. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
-
-#### *Resultado*
-
-La función devuelve un objeto de estado con la propiedad `success` en `true` si `message` ha podido ser verificado con éxito (es decir, la firma coincide).
-
-En caso de que la firma no se haya podido verificar porque no se ha firmado con el mismo *message*, llave o algoritmo, el objeto `status` que se devuelve contiene una colección de errores en `status.errors`.
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---------- | ---------------------------------------------------------------- |
-| success | boolean | True si la firma coincide con el mensaje |
-| errors | collection | Si `success` es `false`, puede contener una colección de errores |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataClassClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataClassClass.md
deleted file mode 100644
index 668d10d6b8155c..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataClassClass.md
+++ /dev/null
@@ -1,1598 +0,0 @@
----
-id: DataClassClass
-title: DataClass
----
-
-Una [DataClass](ORDA/dsMapping.md#dataclass) ofrece un objeto de interfaz a una tabla de la base de datos. Todas las dataclasses de una aplicación 4D están disponibles como propiedad del [datastore](ORDA/dsMapping.md#datastore) `ds`.
-
-### Resumen
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#attributename) |
-| [](#all) |
-| [](#clearremotecache) |
-| [](#fromcollection) |
-| [](#get) |
-| [](#getcount) |
-| [](#getdatastore) |
-| [](#getinfo) |
-| [](#getremotecache) |
-| [](#new) |
-| [](#newselection) |
-| [](#query) |
-| [](#setremotecachesettings) |
-
-
-
-## .*attributeName*
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------------- |
-| 19 R3 | Añadido el atributo .exposed |
-| 17 | Añadidos |
-
-
-
-***.attributeName*** : object
-
-#### Descripción
-
-Los atributos de las clases de datos sonobjetos que están disponibles directamente como propiedades de estas clases.
-
-Los objetos devueltos tienen propiedades que puede leer para obtener información sobre los atributos de su clase de datos.
-
-> Los objetos del atributo Dataclass pueden ser modificados, pero la estructura subyacente de la base de datos no será alterada.
-
-#### Objeto devuelto
-
-Los objetos de atributo devueltos contienen las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| autoFilled | Boolean | True si el valor del atributo es rellenado automáticamente por 4D. Corresponde a las siguientes propiedades de campo 4D: "Autoincremento" para campos de tipo numérico y "Auto UUID" para campos UUID (alfa). No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
-| exposed | Boolean | True si el atributo está expuesto en REST |
-| fieldNumber | integer | Número de campo 4D interno del atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
-| fieldType | Integer | Tipo de campo de base de datos 4D del atributo. Depende del atributo `kind`. Valores posibles:
si `.kind` = "storage": tipo de campo 4D correspondiente, ver [`Value type`](../commands-legacy/value-type.md)
si `.kind` = "relatedEntity": 38 (`is object`)
si `.kind` = "relatedEntities": 42 (`is collection`)
si `.kind` = "calculated" o "alias" = igual que arriba, dependiendo del valor resultante (tipo de campo, relatedEntity o relatedEntities)
|
-| indexed | Boolean | True si hay un índice B-tree o Cluster B-tree en el atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
-| inverseName | Text | Nombre del atributo que se encuentra al otro lado de la relación. Sólo se devuelve cuando `.kind` = "relatedEntity" o "relatedEntities". |
-| keywordIndexed | Boolean | True si existe un índice de palabras clave en el atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
-| kind | Text | Categoría del atributo. Valores posibles:
"storage": atributo de almacenamiento (o escalar), es decir, un atributo que almacena un valor, no una referencia a otro atributo
"calculated": atributo calculado, es decir, definido a través de una [`función get`](../ORDA/ordaClasses.md#function-get-attributename)
"alias": atributo construido sobre [otro atributo](../ORDA/ordaClasses.md#alias-attributes-1)
"relatedEntity": atributo de relación N -> 1 (referencia a una entidad)
"relatedEntities": atributo de relación 1 -> N (referencia a una selección de entidades)
|
-| mandatory | Boolean | True si se rechaza la entrada de valores null para el atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". Nota: esta propiedad corresponde a la propiedad de campo "Rechazar entrada de valor NULL" a nivel de base de datos 4D. No tiene relación con la propiedad "Obligatorio" existente, que es una opción de control de entrada de datos para una tabla. |
-| name | Text | Nombre del atributo como cadena |
-| path | Text | Ruta de [un atributo alias](../ORDA/ordaClasses.md#alias-attributes-1) basada en una relación |
-| readOnly | Boolean | True si el atributo es de sólo lectura. Por ejemplo, los atributos calculados sin la [función `set`](../ORDA/ordaClasses.md#function-set-attributename) son de solo lectura. |
-| relatedDataClass | Text | Nombre del dataclass relacionado con el atributo. Sólo se devuelve cuando `.kind` = "relatedEntity" o "relatedEntities". |
-| type | Text | Tipo de valor conceptual del atributo, útil para la programación genérica. Depende del atributo `kind`. Valores posibles:
si `.kind` = "storage": "blob", "bool", "date", "image", "number", "object" o "string". "number" se devuelve para todo tipo numérico, incluyendo duración; "string" se devuelve para los tipos de atributos uuid, alfa y texto; los atributos "blob" son [objetos blob](../Concepts/dt_blob.md#blob-types).
si `.kind` = "relatedEntity": nombre de la clase de datos relacionada
si `.kind` = "relatedEntities": nombre de la clase de datos relacionada + sufijo "Selection"
si `.kind` = "calculated" o "alias": igual que en los casos anteriores, dependiendo del resultado
|
-| unique | Boolean | True si el valor del atributo debe ser único. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
-
-:::tip
-
-Para programación genérica, utilice `Bool(attributeName.property)`, `Num(attributeName.property)` o `String(attributeName.property)` (dependiendo del tipo de propiedad) para obtener un valor válido incluso si la propiedad no se devuelve.
-
-:::
-
-#### Ejemplo 1
-
-```4d
-$salary:=ds.Employee.salary //devuelve el atributo salary en la clase de datos Employee
-$compCity:=ds.Company["city"] //devuelve el atributo city en la clase de datos Company
-```
-
-#### Ejemplo 2
-
-Considerando la siguiente estructura de la base:
-
-
-
-```4d
-var $firstnameAtt;$employerAtt;$employeesAtt : Object
-
- $firstnameAtt:=ds.Employee.firstname
- //{name:firstname,kind:storage,fieldType:0,type:string,fieldNumber:2,indexed:true,
- //keyWordIndexed:false,autoFilled:false,mandatory:false,unique:false}
-
- $employerAtt:=ds.Employee.employer
- //{name:employer,kind:relatedEntity,relatedDataClass:Company,
- //fieldType:38,type:Company,inverseName:employees}
- //38=Is object
-
- $employeesAtt:=ds.Company.employees
- //{name:employees,kind:relatedEntities,relatedDataClass:Employee,
- //fieldType:42,type:EmployeeSelection,inverseName:employer}
- //42=Is collection
-```
-
-#### Ejemplo 3
-
-Considerando las propiedades de tabla siguientes:
-
-
-
-```4d
- var $sequenceNumberAtt : Object
- $sequenceNumberAtt=ds.Employee.sequenceNumber
- //{name:sequenceNumber,kind:storage,fieldType:0,type:string,fieldNumber:13,
- //indexed:true,keyWordIndexed:false,autoFilled:true,mandatory:false,unique:true}
-```
-
-
-
-## .all()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------- |
-| 17 R5 | Soporte del parámetro *settings* |
-| 17 | Añadidos |
-
-
-
-**.all** ( { *settings* : Object } ) : 4D.EntitySelection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------------- | :-------------------------: | ------------------------------------------------------------------------ |
-| settings | Object | -> | Opciones de construcción: context |
-| Resultado | 4D.EntitySelection | <- | Referencias sobre todas las entidades relacionadas con la clase de datos |
-
-
-
-#### Descripción
-
-La función `.all()` consulta el datastore para encontrar todas las entidades relacionadas con la dataclass y las devuelve como una selección de entidades.
-
-Las entidades se devuelven en el orden por defecto, que es inicialmente el orden en que fueron creadas. Tenga en cuenta, sin embargo, que si se han eliminado entidades y se han añadido otras nuevas, el orden por defecto ya no refleja el orden de creación.
-
-Si no se encuentra la entidad correspondiente, se devuelve una selección de entidades vacía.
-
-Se aplica carga diferida.
-
-**settings**
-
-En el parámetro opcional *settings* se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| context | Text | Etiqueta para el contexto de optimización aplicado a la selección de entidades. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está [diseñada para el procesamiento cliente/servidor ORDA](../ORDA/client-server-optimization.md). |
-
-> Para conocer el número total de entidades de una dataclass, se recomienda utilizar la función [`getCount()`](#getcount) que está más optimizada que la expresión `ds.myClass.all().length`.
-
-#### Ejemplo
-
-```4d
- var $allEmp : cs.EmployeeSelection
- $allEmp:=ds.Employee.all()
-```
-
-## .clearRemoteCache()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.clearRemoteCache()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.clearRemoteCache()` vacía la caché ORDA de una dataclass.
-
-> Esta función no reinicializa los valores `timeout` y `maxEntries`.
-
-#### Ejemplo
-
-```4d
-var $ds : 4D.DataStoreImplementation
-var $persons : cs.PersonsSelection
-var $p : cs.PersonsEntity
-var $cache : Object
-var $info : Collection
-var $text : Text
-
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-$persons:=$ds.Persons.all()
-$text:=""
-For each ($p; $persons)
- $text:=$p.firstname+" lives in "+$p.address.city+" / "
-End for each
-
-$cache:=$ds.Persons.getRemoteCache()
-
-$ds.Persons.clearRemoteCache()
-// Caché de la dataclass Persons = {timeout:30;maxEntries:30000;stamp:255;entries:[]}
-```
-
-#### Ver también
-
-[`entitySelection.refresh()`](EntitySelectionClass.md#refresh)
-
-
-
-## .fromCollection()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------- |
-| 17 R5 | Soporte del parámetro *settings* |
-| 17 | Añadidos |
-
-
-
-**.fromCollection**( *objectCol* : Collection { ; *settings* : Object } ) : 4D.EntitySelection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------------- | :-------------------------: | ------------------------------------------------- |
-| objectCol | Collection | -> | Colección de objetos a mapear con entidades |
-| settings | Object | -> | Opciones de construcción: context |
-| Resultado | 4D.EntitySelection | <- | Selección de entidades llenadas de la colección |
-
-
-
-#### Descripción
-
-La función `.fromCollection()` actualiza o crea entidades en la clase de datos según la colección de objetos *objectCol*, y devuelve la selección de entidades correspondiente.
-
-En el parámetro *objectCol*, pasa una colección de objetos para crear nuevas entidades o actualizar las existentes de la dataclass. Los nombres de las propiedades deben ser los mismos que los de los atributos de la clase de datos. Si un nombre de propiedad no existe en la clase de datos, se ignora. Si un valor de atributo no está definido en la colección, su valor es null.
-
-El mapeo entre los objetos de la colección y las entidades se realiza sobre los **nombres de atributos** y sus **tipos de datos**. Si la propiedad de un objeto tiene el mismo nombre que el atributo de una entidad pero sus tipos no coinciden, el atributo de la entidad no se llena.
-
-**Crear o actualizar modo**
-
-Para cada objeto de *objectCol*:
-
-- Si el objeto contiene una propiedad booleana "\__NEW" establecida en false (o no contiene una propiedad booleana "\__NEW"), la entidad se actualiza o se crea con los valores correspondientes de las propiedades del objeto. No se realiza ninguna comprobación con respecto a la llave primaria:
- - Si la llave primaria se da y existe, la entidad se actualiza. En este caso, la llave primaria puede darse tal cual o con una propiedad "\_\_KEY" (llenada con el valor de la llave primaria).
- - If the primary key is given (as is) and does not exist, the entity is created
- - Si no se da la llave primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas estándar de la base de datos.
-- Si el objeto contiene una propiedad booleana "\_\_NEW" definida como **true**, la entidad se crea con los valores correspondientes de los atributos del objeto. Se realiza una verificación con respecto a la llave primaria:
- - Si se da la llave primaria (tal cual) y existe, se envía un error
- - If the primary key is given (as is) and does not exist, the entity is created
- - Si no se da la primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas estándar de la base de datos.
-
-> La propiedad "\__KEY" que contiene un valor sólo se tiene en cuenta cuando la propiedad "\__NEW" tiene el valor **false** (o se omite) y existe una entidad correspondiente. The use of a \_\_KEY property allows independence from the primary key attribute name.
-
-**Entidades relacionadas**
-
-Los objetos de *objectCol* pueden contener uno o más objetos anidados que presentan una o más entidades relacionadas, lo que puede ser útil para crear o actualizar enlaces entre entidades.
-
-Los objetos anidados que presentan entidades relacionadas deben contener una propiedad "\_\*KEY" (llenada con el valor de la llave primaria de la entidad relacionada) o el atributo de llave primaria de la propia entidad relacionada. El uso de una propiedad \*\_KEY permite la independencia del nombre del atributo de la llave primaria.
-
-> El contenido de las entidades relacionadas no puede ser creado / actualizado a través de este mecanismo.
-
-**Stamp**
-
-Si se da un atributo \_\_STAMP, se realiza una comprobación con el sello en el almacén de datos y se puede devolver un error ("El sello dado no coincide con el actual para el registro# XX de la tabla XXXX"). Para obtener más información, consulte [Bloqueo de entidades](ORDA/entities.md#bloqueo-de-entidades).
-
-**settings**
-
-En el parámetro opcional *settings* se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| context | Text | Etiqueta para el contexto de optimización aplicado a la selección de entidades. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está [diseñada para el procesamiento cliente/servidor ORDA](../ORDA/client-server-optimization.md). |
-
-#### Ejemplo 1
-
-Queremos actualizar una entidad existente. La propiedad \_\_NEW no se da, la llave primaria del empleado se da y existe:
-
-```4d
- var $empsCollection : Collection
- var $emp : Object
- var $employees : cs.EmployeeSelection
-
- $empsCollection:=New collection
- $emp:=New object
- $emp.ID:=668 //Existing PK in Employee table
- $emp.firstName:="Arthur"
- $emp.lastName:="Martin"
- $emp.employer:=New object("ID";121) //PK existente en la dataClass relacionada Company
- // Para este empleado, podemos cambiar la Empresa utilizando otro PK existente en la clase de datos relacionada Company
- $empsCollection.push($emp)
- $employees:=ds.Employee.fromCollection($empsCollection)
-```
-
-#### Ejemplo 2
-
-Queremos actualizar una entidad existente. La propiedad \_\*NEW no se da, la llave primaria del empleado está con el atributo \*\_KEY y existe:
-
-```4d
- var $empsCollection : Collection
- var $emp : Object
- var $employees : cs.EmployeeSelection
-
- $empsCollection:=New collection
- $emp:=New object
- $emp.__KEY:=1720 //PK existente en la tabla Employee
- $emp.firstName:="John"
- $emp.lastName:="Boorman"
- $emp.employer:=New object("ID";121) // PK existente en la dataClass relacionada Company
- // Para este empleado, podemos cambiar la Empresa utilizando otro PK existente en la dataClass relacionada Company
- $empsCollection.push($emp)
- $employees:=ds.Employee.fromCollection($empsCollection)
-```
-
-#### Ejemplo 3
-
-Queremos crear simplemente una nueva entidad a partir de una colección:
-
-```4d
- var $empsCollection : Collection
- var $emp : Object
- var $employees : cs.EmployeeSelection
-
- $empsCollection:=New collection
- $emp:=New object
- $emp.firstName:="Victor"
- $emp.lastName:="Hugo"
- $empsCollection.push($emp)
- $employees:=ds.Employee.fromCollection($empsCollection)
-```
-
-#### Ejemplo 4
-
-Queremos crear una entidad. La propiedad \_\_NEW es True, la llave primaria del empleado no se da:
-
-```4d
- var $empsCollection : Collection
- var $emp : Object
- var $employees : cs.EmployeeSelection
-
- $empsCollection:=New collection
- $emp:=New object
- $emp.firstName:="Mary"
- $emp.lastName:="Smith"
- $emp.employer:=New object("__KEY";121) //PK existente en la dataClass Company
- $emp.__NEW:=True
- $empsCollection.push($emp)
- $employees:=ds.Employee.fromCollection($empsCollection)
-
-
-
-
-
-
-```
-
-#### Ejemplo 5
-
-Queremos crear una entidad. La propiedad \_\_NEW se omite, la llave primaria del empleado se da y no existe:
-
-```4d
- var $empsCollection : Collection
- var $emp : Object
- var $employees : cs.EmployeeSelection
-
- $empsCollection:=New collection
- $emp:=New object
- $emp.ID:=10000 //Llave primaria inexistente
- $emp.firstName:="Françoise"
- $emp.lastName:="Sagan"
- $empsCollection.push($emp)
- $employees:=ds.Employee.fromCollection($empsCollection)
-```
-
-#### Ejemplo 6
-
-En este ejemplo, la primera entidad se creará y guardará pero la segunda fallará ya que ambas utilizan la misma llave primaria:
-
-```4d
- var $empsCollection : Collection
- var $emp; $emp2 : Object
- var $employees : cs.EmployeeSelection
-
- $empsCollection:=New collection
- $emp:=New object
- $emp.ID:=10001 // Llave primaria inexistente
- $emp.firstName:="Simone"
- $emp.lastName:="Martin"
- $emp.__NEW:=True
- $empsCollection.push($emp)
-
- $emp2:=New object
- $emp2.ID:=10001 // La misma llave primaria, ya existente
- $emp2.firstName:="Marc"
- $emp2.lastName:="Smith"
- $emp2.__NEW:=True
- $empsCollection.push($emp2)
- $employees:=ds.Employee.fromCollection($empsCollection)
- //se crea la primera entidad
- //error de llave duplicada para la segunda entidad
-```
-
-#### Ver también
-
-[**.toCollection()**](EntitySelectionClass.md#tocollection)
-
-
-
-
-
-## .get()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.get**( *primaryKey* : Integer { ; *settings* : Object } ) : 4D.Entity **.get**( *primaryKey* : Text { ; *settings* : Object } ) : 4D.Entity
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------- | :-------------------------: | ---------------------------------------------------- |
-| primaryKey | Integer OR Text | -> | Valor de la llave primaria de la entidad a recuperar |
-| settings | Object | -> | Opciones de construcción: context |
-| Resultado | 4D.Entity | <- | Entidad que coincide con la llave primaria designada |
-
-
-
-#### Descripción
-
-La función `.get()` consulta la clase de datos para recuperar la entidad que coincide con el parámetro *primaryKey*.
-
-En *primaryKey*, pase el valor de la llave primaria de la entidad a recuperar. El tipo de valor debe coincidir con el tipo de la llave primaria definida en el almacén de datos (Entero o Texto). El tipo de valor debe coincidir con el tipo de la llave primaria definida en el almacén de datos (Entero o Texto).
-
-Si no se encuentra ninguna entidad con *primaryKey*, se devuelve una entidad **Null**.
-
-Se aplica la carga diferida, lo que significa que los datos relacionados se cargan desde el disco sólo cuando son necesarios.
-
-**settings**
-
-En el parámetro opcional *settings* se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| context | Text | Etiqueta para el contexto de optimización automática aplicado a la entidad. Este contexto será utilizado por el código siguiente que carga la entidad para que pueda beneficiarse de la optimización. Esta funcionalidad está [diseñada para el procesamiento cliente/servidor ORDA](../ORDA/client-server-optimization.md). |
-
-:::info
-
-Cuando se llama a la función `.get()` **sin** parámetro *settings*, se envía directamente al servidor una petición de valores de atributos (la [caché ORDA](../ORDA/client-server-optimization.md#orda-cache) no se utiliza). Por otro parte, cuando se llama a la función `.get()` **con** un `context` pasado en el parámetro *settings*, los valores de los atributos se recuperan de la caché ORDA correspondiente al contexto. En este caso, puede ser aconsejable llamar a [`reload()`](EntityClass.md#reload) para asegurarse de recuperar los datos más recientes del servidor.
-
-:::
-
-#### Ejemplo 1
-
-```4d
- var $entity : cs.EmployeeEntity
- var $entity2 : cs.InvoiceEntity
- $entity:=ds.Employee.get(167) // devuelve la entidad cuyo valor de llave primaria es 167
- $entity2:=ds.Invoice.get("DGGX20030") // devuelve la entidad cuyo valor de llave primaria es "DGGX20030"
-```
-
-#### Ejemplo 2
-
-Este ejemplo ilustra el uso de la propiedad *context*:
-
-```4d
- var $e1; $e2; $e3; $e4 : cs.EmployeeEntity
- var $settings; $settings2 : Object
-
- $settings:=New object("context";"detail")
- $settings2:=New object("context";"summary")
-
- $e1:=ds.Employee.get(1;$settings)
- completeAllData($e1) // En el método completeAllData, se lanza una optimización y se asocia al contexto "detail"
-
- $e2:=ds.Employee.get(2;$settings)
- completeAllData($e2) // En el método completeAllData, se aplica la optimización asociada al contexto "detail"
-
- $e3:=ds.Employee.get(3;$settings2)
- completeSummary($e3) //En el método completeSummary, se lanza una optimización y se asocia al contexto "summary"
-
- $e4:=ds.Employee.get(4;$settings2)
- completeSummary($e4) //En el método completeSummary se aplica la optimización asociada al contexto "summary"
-```
-
-
-
-
-
-## .getCount()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.getCount()** : Integer
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | --------------------------- | ----------------------------------- |
-| resultado | Integer | <- | Número de entidades en la dataclass |
-
-
-
-#### Descripción
-
-La función `.getCount()` devuelve el número de entidades de una clase de datos.
-
-Si se utiliza esta función dentro de una transacción, se tendrán en cuenta las entidades creadas durante la misma.
-
-#### Ejemplo
-
-```4d
-var $ds : 4D.DataStoreImplementation
-var $number : Integer
-
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-$number:=$ds.Persons.getCount()
-```
-
-
-
-
-
-## .getDataStore()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.getDataStore()** : cs.DataStore
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------- | :-------------------------: | ------------------------- |
-| Resultado | cs.DataStore | <- | Datastore de la dataclass |
-
-
-
-#### Descripción
-
-La función `.getDataStore()` devuelve el datastore para la clase de datos especificada.
-
-El almacén de datos puede ser:
-
-- el datastore principal, devuelto por el comando `ds`.
-- un datastore remoto, abierto utilizando el comando `Open datastore`.
-
-#### Ejemplo
-
-El método proyecto ***SearchDuplicate*** busca valores duplicados en cualquier clase de datos.
-
-```4d
- var $pet : cs.CatsEntity
-
- $pet:=ds.Cats.all().first() //obtener una entidad
- SearchDuplicate($pet;"Dogs")
-```
-
-```4d
- // método SearchDuplicate
- // SearchDuplicate(entity_to_search;dataclass_name)
-
- #DECLARE ($pet : Object ; $dataClassName : Text)
- var $dataStore; $duplicates : Object
-
- $dataStore:=$pet.getDataClass().getDataStore()
- $duplicates:=$dataStore[$dataClassName].query("name=:1";$pet.name)
-```
-
-
-
-
-
-## .getInfo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ---------------------------------- |
-| 19 R3 | Se ha añadido la propiedad exposed |
-| 17 R5 | Añadidos |
-
-
-
-**.getInfo()** : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | --------------------------- | ----------------------------------- |
-| Resultado | Object | <- | Información sobre la clase de datos |
-
-
-
-#### Descripción
-
-La función `.getInfo()` devuelve un objeto que suministra información sobre la clase de datos. Esta función es útil para configurar el código genérico.
-
-**Objeto devuelto**
-
-| Propiedad | Tipo | Descripción |
-| ----------- | ------- | ------------------------------------------------ |
-| exposed | Boolean | True si la dataclass está expuesta en REST |
-| name | Text | Nombre de la dataclass |
-| primaryKey | Text | Nombre de la llave primaria de la clase de datos |
-| tableNumber | Integer | Número de la tabla 4D interna |
-
-#### Ejemplo 1
-
-```4d
- #DECLARE ($entity : Object)
- var $status : Object
-
- computeEmployeeNumber($entity) //realizar algunas acciones en la entidad
-
- $status:=$entity.save()
- if($status.success)
- ALERT("Record updated in table "+$entity.getDataClass().getInfo().name)
- End if
-```
-
-#### Ejemplo 2
-
-```4d
- var $settings : Object
- var $es : cs.ClientsSelection
-
- $settings:=New object
- $settings.parameters:=New object("receivedIds";getIds())
- $settings.attributes:=New object("pk";ds.Clients.getInfo().primaryKey)
- $es:=ds.Clients.query(":pk in :receivedIds";$settings)
-```
-
-#### Ejemplo 3
-
-```4d
- var $pk : Text
- var $dataClassAttribute : Object
-
- $pk:=ds.Employee.getInfo().primaryKey
- $dataClassAttribute:=ds.Employee[$pk] // Si es necesario, el atributo que coincide con la llave primaria es accesible
-```
-
-
-
-## .getRemoteCache()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.getRemoteCache**() : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | --------------------------- | ----------------------------------------------------------------------------------------- |
-| resultado | Object | <- | Objeto que describe el contenido de la caché ORDA para la clase de datos. |
-
-
-
-> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
-
-#### Descripción
-
-La función `.getRemoteCache()` devuelve un objeto que contiene el contenido de la caché ORDA para una clase de datos.
-
-Llamar a esta función desde una aplicación monopuesto de 4D devuelve `Null`.
-
-El objeto devuelto tiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ---------- | ------------------------------------------------------------------------------------------------------ |
-| maxEntries | Integer | Número máximo de colecciones "entries". |
-| stamp | Integer | Marcador de la caché. |
-| timeout | Integer | Tiempo restante antes de que las nuevas entradas de la caché se marquen como vencidas. |
-| entries | Collection | Contiene un objeto de entrada para cada entidad en la caché. |
-
-Cada objeto entrada de la colección `entries` contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------- | ------------------------------------------------------------ |
-| data | Object | Objeto que contiene los datos de la entrada. |
-| expired | Boolean | True si la entrada ha expirado. |
-| key | Text | Llave primaria de la entidad. |
-
-El objeto `data` de cada entrada contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ----------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| __KEY | Text | Llave primaria de la entidad |
-| __STAMP | Integer | Stamp de la entidad en la base de datos |
-| __TIMESTAMP | Text | Timestamp de la entidad en la base de datos (el formato es YYYY-MM-DDTHH:MM:SS:ms:Z) |
-| dataClassAttributeName | Variant | Si hay datos en la caché para un atributo de dataclass, se devuelven en una propiedad con el mismo tipo que en la base de datos. |
-
-Los datos relativos a las entidades relacionadas se almacenan en la caché del objeto de datos.
-
-#### Ejemplo
-
-En el siguiente ejemplo, `$ds.Persons.all()` carga la primera entidad con todos sus atributos. A continuación, se activa el optimizado de la solicitud, de modo que sólo se cargan `firstname` y `address.city`.
-
-Tenga en cuenta que `address.city` se carga en la caché de la dataclass `Persons`.
-
-Sólo se almacena en la caché la primera entidad de la dataclass `Address`. Se carga durante la primera iteración del bucle.
-
-```4d
-var $ds : 4D.DataStoreImplementation
-var $persons : cs.PersonsSelection
-var $p : cs.PersonsEntity
-var $cachePersons; $cacheAddress : Object
-var $text : Text
-
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-$persons:=$ds.Persons.all()
-
-$text:=""
-For each ($p; $persons)
- $text:=$p.firstname+" lives in "+$p.address.city+" / "
-End for each
-
-$cachePersons:=$ds.Persons.getRemoteCache()
-$cacheAddress:=$ds.Adress.getRemoteCache()
-```
-
-#### Ver también
-
-[.setRemoteCacheSettings()](#setremotecachesettings) [.clearRemoteCache()](#clearremotecache)
-
-
-
-## .new()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.new()** : 4D.Entity
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------- | --------------------------- | ------------------------------------------------ |
-| Resultado | 4D.Entity | <- | Nueva entidad que coincide con la clase de datos |
-
-
-
-#### Descripción
-
-La función `.new()` crea en memoria y devuelve una nueva entidad en blanco relacionada con la Dataclass.
-
-El objeto entidad se crea en memoria y no se guarda en la base de datos hasta que se llama a la función [`.save( )`](EntityClass.md#save). Si la entidad se borra antes de ser guardada, no se puede recuperar.
-
-**4D Server**: en cliente-servidor, si la llave primaria de la tabla correspondiente se autoincrementa, se calculará cuando la entidad se guarde en el servidor.
-
-Todos los atributos de la entidad se inicializan con el valor **null**.
-
-> Los atributos se pueden inicializar con valores por defecto si se selecciona la opción **Traducir los NULL a valores vacíos** al nivel de la estructura de la base 4D.
-
-#### Ejemplo
-
-Este ejemplo crea una nueva entidad en la clase de datos "Log" y registra la información en el atributo "info":
-
-```4d
- var $entity : cs.LogEntity
- $entity:=ds.Log.new() //crea una referencia
- $entity.info:="New entry" //almacenar alguna información
- $entity.save() //guardar la entidad
-```
-
-
-
-
-
-## .newSelection()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.newSelection**( { *keepOrder* : Integer } ) : 4D.EntitySelection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| keepOrder | Integer | -> | `dk keep ordered`: crea una entity selection ordenada, `dk non ordered`: crea una entity selection no ordenada (por defecto si se omite) |
-| Resultado | 4D.EntitySelection | <- | Nueva selección de entidades en blanco relacionadas con la clase de datos |
-
-
-
-#### Descripción
-
-La función `.newSelection()` crea una nueva selección de entidades en blanco, no compartible, relacionada con la clase de datos, en memoria.
-
-> Para obtener información sobre las selecciones de entidades no compartibles, consulte [esta sección](ORDA/entities.md#shareable-or-alterable-entity-selections).
-
-Si desea crear una selección de entidades ordenada, pase el selector `dk keep ordered` en el parámetro *keepOrder*. Por defecto, si se omite este parámetro, o si se pasa el selector `dk non ordered`, el método crea una selección de entidades no ordenada. Las selecciones de entidades desordenadas son más rápidas pero no se puede confiar en las posiciones de las entidades. Las selecciones de entidades desordenadas son más rápidas pero no se puede confiar en las posiciones de las entidades.
-
-Cuando se crea, la selección de entidades no contiene ninguna entidad (`mySelection.length` devuelve 0). Este método permite construir gradualmente selecciones de entidades haciendo llamadas posteriores a la función [`add()`](EntitySelectionClass.md#add).
-
-#### Ejemplo
-
-```4d
- var $USelection; $OSelection : cs.EmployeeSelection
- $USelection:=ds.Employee.newSelection() //crea una selección de entidades vacía y desordenada
- $OSelection:=ds.Employee.newSelection(dk keep ordered) //crea una selección de entidades vacía y ordenada
-```
-
-
-
-
-
-## .query()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------------------------------ |
-| 17 R6 | Soporte de los parámetros Formula |
-| 17 R5 | Soporte de los marcadores para los valores |
-| 17 | Añadidos |
-
-
-
-**.query**( *queryString* : Text { ; *...value* : any } { ; *querySettings* : Object } ) : 4D.EntitySelection **.query**( *formula* : Object { ; *querySettings* : Object } ) : 4D.EntitySelection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------- | ---------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| queryString | Text | -> | Criterios de búsqueda como cadena |
-| formula | Object | -> | Criterios de búsqueda como objeto fórmula |
-| value | any | -> | Valor(es) a utilizar para los marcadores de posición indexados |
-| querySettings | Object | -> | Opciones de búsqueda: parameters, attributes, args, allowFormulas, context, queryPath, queryPlan |
-| Resultado | 4D.EntitySelection | <- | Nueva selección de entidades formada por las entidades de la clase de datos que cumplen los criterios de búsqueda especificados en *queryString* o *formula* |
-
-
-
-#### Descripción
-
-La función `.query()` busca las entidades que cumplan con los criterios de búsqueda especificados en *queryString* o *formula* y (opcionalmente) *value*(s), para todas las entidades de la dataclass, y devuelve un nuevo objeto de tipo `EntitySelection` que contiene todas las entidades encontradas. Se aplica carga diferida.
-
-Si no se encuentran entidades coincidentes, se devuelve una `EntitySelection` vacía.
-
-#### parámetro queryString
-
-El parámetro *queryString* utiliza la siguiente sintaxis:
-
-```4d
-attributePath|formula comparator value
- {logicalOperator attributePath|formula comparator value}
- {order by attributePath {desc | asc}}
-```
-
-donde:
-
-- **attributePath**: ruta del atributo sobre el que se quiere ejecutar la búsqueda. Este parámetro puede ser un nombre simple (por ejemplo, "país") o cualquier ruta de atributo válida (por ejemplo, "país.nombre"). En el caso de una ruta de atributo cuyo tipo es `Collection`, se utiliza la notación `[]` para manejar todas las ocurrencias (por ejemplo `children[].age`).
-
-> \*No puede utilizar directamente atributos cuyo nombre contenga caracteres especiales como ".", "\[ ]", o "=", ">", "#"..., porque se evaluarán incorrectamente en la cadena de consulta. Si necesita consultar dichos atributos, debe considerar el uso de marcadores, que permiten un rango ampliado de caracteres en las rutas de los atributos (ver **Uso de marcadores de posición** *a continuación*)
-
-- **formula**: una fórmula válida pasada como `Text` u `Object`. La fórmula se evaluará para cada entidad procesada y debe devolver un valor booleano. Dentro de la fórmula, la entidad está disponible a través del objeto `This`.
-
- - **Text**: la cadena de fórmulas debe ir precedida de la declaración `eval()`, para que el analizador de consultas evalúe la expresión correctamente. Por ejemplo: *"eval(length(This.lastname) >=30) "*
- - **Objeto**: el [objeto fórmula](FunctionClass.md) se pasa como **placeholder** (ver más abajo). La fórmula debe haber sido creada utilizando el comando [`Formula`](../commands/formula.md) o [`Formula from string`](../commands/formula-from-string.md).
-
-> * Tenga en cuenta que las fórmulas 4D sólo admiten los símbolos `&` y `|` como operadores lógicos.
-> * Si la fórmula no es el único criterio de búsqueda, el optimizador del motor de búsquedas podría procesar previamente otros criterios (por ejemplo, los atributos indexados) y, por tanto, la fórmula podría evaluarse sólo para un subconjunto de entidades.
-
-Las fórmulas en las consultas pueden recibir parámetros a través de $1. Este punto se detalla en el párrafo **Parámetro fórmula** más abajo.
-
-> - También puede pasar directamente un objeto parámetro `formula` en lugar del parámetro `queryString` (recomendado cuando las fórmulas son más complejas). Vea el párrafo **Parámetros fórmula** abajo.
-> - Por razones de seguridad, las llamadas a fórmulas dentro de las funciones `query()` pueden ser desestimadas. Ver la descripción del parámetro `querySettings`.
-
-- **comparator**: símbolo que compara *attributePath* y *value*. Se soportan los siguientes símbolos:
-
-| Comparación | Símbolo(s) | Comentario |
-| ------------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Igual a | =, == | Obtiene los datos coincidentes, admite el comodín (@), no distingue entre mayúsculas de minúsculas ni diacríticas. |
-| | ===, IS | Obtiene los datos coincidentes, considera @ como carácter estándar, no distingue entre mayúsculas de minúsculas ni diacríticas |
-| Diferente de | #, != | Soporta el comodín (@). Equivale a "Condición no aplicada en una sentencia" ([ver más abajo](#not-equal-to-in-collections)). |
-| | !==, IS NOT | Considera la @ como un caracter estándar |
-| Condición No aplicada a una sentencia | NOT | Los paréntesis son obligatorios cuando se utiliza NOT antes de una instrucción que contiene varios operadores. Equivalente a "Not equal to" ([ver abajo](#not-equal-to-in-collections)). |
-| Menor que | < | |
-| Mayor que | > | |
-| Menor o igual que | <= | |
-| Mayor o igual que | > = | |
-| Incluído en | IN | Devuelve los datos iguales a al menos uno de los valores de una colección o de un conjunto de valores, admite el comodín (@) |
-| Contiene palabra clave | % | Las palabras claves pueden utilizarse en atributos de tipo texto o imagen |
-
-- Puede ser un **marcador de posición** (ver **Uso de marcadores de posición** más adelante) o cualquier expresión que coincida con la propiedad de tipo de datos. **value**: el valor a comparar con el valor actual de la propiedad de cada entidad en la selección de entidades. Por ejemplo, si se introduce la cadena "v20" como **value** para comparar con un atributo entero, se convertirá a 20. For example, if the string "v20" is entered as value to compare with an integer attribute, it will be converted to 20.
- For example, if the string "v20" is entered as value to compare with an integer attribute, it will be converted to 20.
- - La constante de tipo **texto** puede pasarse con o sin comillas simples (ver **Uso de comillas** más abajo). Para consultar una cadena dentro de otra cadena (una consulta de tipo "contiene"), utilice el símbolo de comodín (@) en el valor para aislar la cadena a buscar como se muestra en este ejemplo: "@Smith@". Las siguientes palabras claves están prohibidas para las constantes de texto: true, false.
- - Valores constantes de tipo **booleano**: **true** o **false** (Sensible a las mayúsculas y minúsculas).
- - Valores constantes de **tipo numérico**: los decimales se separan con un '.' (punto).
- - Constantes de tipo **date**: formato "YYYY-MM-DD"
- - Constantes **null**: utilizando la palabra clave "null" se encontrarán las propiedades **null** y **undefined**.
- - en el caso de una búsqueda con un comparador IN, *value* debe ser una colección, o los valores que coincidan con el tipo de la ruta del atributo entre \[ ] separados por comas (para las cadenas, los caracteres `"` deben escaparse con `\`).
-- **logicalOperator**: utilizado para unir condiciones múltiples en la búsqueda (opcional). Puede utilizar uno de los siguientes operadores lógicos (se puede utilizar el nombre o el símbolo):
-
-| Conjunción | Símbolo(s) |
-| ---------- | ----------------------------------------------------------------------------------- |
-| AND | &, &&, and |
-| O | |,||, or |
-
-- **order by attributePath**: puede incluir una declaración order by *attributePath* en la consulta para que los datos resultantes se ordenen según esa declaración. Puede utilizar varias sentencias order by, separadas por comas (por ejemplo, order by *attributePath1* desc, *attributePath2* asc). Por defecto, el orden es ascendente. Pase 'desc' para definir un orden descendente y 'asc' para definir un orden ascendente.
-
-> Si utiliza esta instrucción, la selección de entidades devuelta estará ordenada (para más información, consulte [Selecciones de entidades ordenadas o desordenadas](ORDA/dsMapping.md#ordered-or-unordered-entity-selection)).
-
-#### Utilizar comillas
-
-Cuando utilice comillas dentro de las consultas, debe utilizar comillas simples ' ' dentro de la consulta y comillas dobles " " para encerrar toda la consulta, de lo contrario se devuelve un error. Por ejemplo:
-
-```4d
-"employee.name = 'smith' AND employee.firstname = 'john'"
-```
-
-> Las comillas simples (') no se admiten en los valores buscados, ya que romperían la cadena de búsqueda. Por ejemplo, "comp.name = 'John's pizza' " generará un error. Si necesita buscar en valores con comillas simples, puede considerar el uso de marcadores de posición (ver más abajo).
-
-#### Uso del paréntesis
-
-Puede utilizar paréntesis en la búsqueda para dar prioridad al cálculo. Por ejemplo, puede organizar una búsqueda de la siguiente manera:
-
-```4d
-"(employee.age >= 30 OR employee.age <= 65) AND (employee.salary <= 10000 OR employee.status = 'Manager')"
-```
-
-#### Uso de marcadores de posición
-
-4D le permite utilizar marcadores de posición para los argumentos *attributePath*, *formula* y *value* en el parámetro *queryString*. Un marcador es un parámetro que se inserta en las cadenas de búsqueda y que se sustituye por otro valor cuando se evalúa la cadena de búsqueda. El valor de los marcadores se evalúa una vez al principio de la búsqueda; no se evalúa para cada elemento.
-
-Se pueden utilizar dos tipos de marcadores de posición: **marcadores de posición indexados** y **marcadores de posición con nombre**:
-
-| | Marcadores de posición indexados | Nombre del marcador de posición |
-| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Definición | Los parámetros se insertan como `:paramIndex` (por ejemplo :1, :2...) en *queryString* y sus valores correspondientes son proporcionados por la secuencia de parámetros *value*. Puede usar hasta 128 parámetros *value* | Los parámetros se insertan como: `:paramName` (por ejemplo :myparam) y sus valores se proporcionan en los atributos y/o objetos de parámetros en el parámetro *querySettings* |
-| Ejemplo | `$r:=class.query(":1=:2";"city";"Chicago")` | `$o.attributes:=New object("att";"city")` `$o.parameters:=New object("name";"Chicago")` `$r:=class.query(":att=:name";$o)` |
-
-Puede mezclar todos los tipos de argumentos en *queryString*. Una *queryString* puede contener, para los parámetros *attributePath*, *formula* y *value*:
-
-- valores directos (sin marcadores),
-- marcadores indexados y/o con nombre.
-
-El uso de marcadores de posición en las búsquedas **se recomienda** por las siguientes razones:
-
-1. Evita la inserción de código malicioso: si utiliza directamente variables completadas por el usuario dentro de la cadena de búsqueda, un usuario podría modificar las condiciones de búsqueda introduciendo argumentos de búsqueda adicionales. Por ejemplo, imagine una cadena de búsqueda como:
-
- ```4d
- $vquery:="status = 'public' & name = "+myname //el usuario introduce su nombre
- $result:=$col.query($vquery)
- ```
-
-Esta búsqueda parece segura ya que se filtran los datos no públicos. Sin embargo, si el usuario introduce en el área *myname* algo como *"smith OR status='private'*, la cadena de consulta se modificaría en el paso de interpretación y podría devolver datos privados.
-
-Cuando se utilizan marcadores de posición, no es posible anular las condiciones de seguridad:
-
- ```4d
- $result:=$col.query("status='public' & name=:1";myname)
- ```
-
-En este caso, si el usuario introduce *smith OR status='private'* en el área *myname*, no se interpretará en la cadena de búsqueda, sino que sólo se pasará como valor. La búsqueda de una persona llamada "smith OR status='private'" simplemente fallará.
-
-2. Evita tener que preocuparse por cuestiones de formato o caracteres, especialmente cuando se manejan los parámetros *attributePath* o *value* que pueden contener caracteres no alfanuméricos como ".", "['...
-
-3. Permite el uso de variables o expresiones en los argumentos de búsqueda. Ejemplos:
-
- ```4d
- $result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
- $result2:=$col.query("company.name = :1";"John's Pizzas")
- ```
-
-#### Búsqueda de valores null
-
-Cuando se buscan valores null, no se puede utilizar la sintaxis de marcador de posición porque el motor de búsqueda considera null como un valor de comparación invalido. Por ejemplo, si ejecuta la siguiente búsqueda:
-
-```4d
-$vSingles:=ds.Person.query("spouse = :1";Null) // NO funcionará
-```
-
-No obtendrá el resultado esperado porque el valor null será evaluado por 4D como un error resultante de la evaluación del parámetro (por ejemplo, un atributo procedente de otra búsqueda). Para este tipo de búsquedas, debe utilizar la sintaxis de búsqueda directa:
-
-```4d
- $vSingles:=ds.Person.query("spouse = null") // Sintaxis correcta
-```
-
-#### Diferente a valores null o undefined
-
-El comparador "no igual a *value*" (`#` o `!=`) no devuelve atributos cuyo valor es null o indefinido. Por ejemplo, la siguiente consulta solo devolverá personas cuyo estado "info.married" es `false` y no personas cuya propiedad "info.married" es "null" o falta:
-
-```4d
-$notMarried:=ds.Person.query("info.married#true") //encuentra personas con valor de atributo false
-```
-
-Si desea encontrar personas cuyo estado "info.married" es `false`, null, o indefinido, debe escribir:
-
-```4d
-$notMarried:=ds.Person.query("info.married#true | info.married=null") //encuentra atributos false, null e undefined
-```
-
-#### No igual a en colecciones
-
-Al buscar dentro de atributos de objetos de dataclass que contengan las colecciones, el comparador "not equal to *value*" (`#` o `!=`) encontrará los elementos en los que TODAS las propiedades sean diferentes de *value* (y no aquellos en los que AL MENOS una propiedad sea diferente de *value*, que es como funcionan otros comparadores). Básicamente, equivale a buscar "Not(buscar elementos de la colección cuya propiedad sea igual a *value*"). Por ejemplo, con las siguientes entidades:
-
-```
-Entity 1:
-ds. Class.name: "A"
-ds.Class.info:
- { "coll" : [ {
- "val":1,
- "val":1
- } ] }
-
-Entity 2:
-ds. Class.name: "B"
-ds.Class.info:
- { "coll" : [ {
- "val":1,
- "val":0
- } ] }
-
-Entity 3:
-ds. Class.name: "C"
-ds.Class.info:
- { "coll" : [ {
- "val":0,
- "val":0
- } ] }
-```
-
-Considere los siguientes resultados:
-
-```4d
-ds.Class.query("info.coll[].val = :1";0)
-// devuelve B y C
-// encuentra "entidades con 0 en al menos una propiedad val"
-
-ds.Class.query("info.coll[].val != :1";0)
-// sólo devuelve A
-// encuentra "entidades en las que todas las propiedades val son distintas de 0"
-// lo que equivale a
-ds.Class.query(not("info.coll[].val = :1";0))
-```
-
-Si desea implementar una búsqueda que encuentre entidades en las que "al menos una propiedad sea diferente del *value*", deberá utilizar una notación especial utilizando una letra en el `[]`:
-
-```4d
-ds.Class.query("info.coll[a].val != :1";0)
-// devuelve A y B
-// encuentra "entidades donde al menos una propiedad val es diferente de 0"
-```
-
-Puede utilizar cualquier letra del alfabeto como notación `[a]`.
-
-#### Vinculación de los argumentos de búsqueda y los atributos de colección
-
-Para ello, es necesario vincular los argumentos de la búsqueda a los elementos de colección, de modo que sólo se encuentren los elementos únicos que contengan argumentos vinculados. Al buscar dentro de los atributos de objetos de clases de datos que contengan colecciones utilizando varios argumentos de consulta unidos por el operador AND, es posible que desee asegurarse de que sólo se devuelvan entidades que contengan elementos que coincidan con todos los argumentos, y no entidades en las que los argumentos puedan encontrarse en elementos diferentes.
-
-Por ejemplo, con las dos entidades siguientes:
-
-```
-Entity 1:
-ds. People.name: "martin"
-ds. People.places:
- { "locations" : [ {
- "kind":"home",
- "city":"paris"
- } ] }
-
-Entity 2:
-ds. People.name: "smith"
-ds. People.places:
- { "locations" : [ {
- "kind":"home",
- "city":"lyon"
- } , {
- "kind":"office",
- "city":"paris"
- } ] }
-```
-
-Quiere encontrar personas con un tipo de ubicación "home" en la ciudad "paris". Si escribe:
-
-```4d
-ds.People.query("places.locations[].kind= :1 and places.locations[].city= :2";"home";"paris")
-```
-
-... la búsqueda devolverá "martin" **y** "smith" porque "smith" tiene un elemento "locations" cuyo "tipo" es "home" y un elemento "locations" cuya "ciudad" es "paris", aunque sean elementos diferentes.
-
-Si quiere obtener sólo las entidades en las que los argumentos correspondientes están en el mismo elemento de colección, necesita enlazar **los argumentos**. Para enlazar los argumentos de búsqueda:
-
-- Añada una letra entre los \[] en la primera ruta a enlazar y repita la misma letra en todos los argumentos enlazados. Por ejemplo: `locations[a].city y locations[a].kind`. Puede utilizar cualquier letra del alfabeto latino (no diferencia entre mayúsculas y minúsculas).
-- Para añadir diferentes criterios vinculados en la misma consulta, utilice otra letra. Puede crear hasta 26 combinaciones de criterios en una sola consulta.
-
-Con las entidades anteriores, si escribe:
-
-```4d
-ds.People.query("places.locations[a].kind= :1 and places.locations[a].city= :2";"home";"paris")
-```
-
-... la búsqueda sólo devolverá "martin" porque tiene un elemento "locations" cuyo "kind" es "home" y cuyo "city" es "paris". La búsqueda no devolverá "smith" porque los valores "home" y "paris" no están en el mismo elemento de colección.
-
-#### Búsquedas en las relaciones Muchos a Muchos
-
-ORDA ofrece una sintaxis especial para facilitar las consultas en las relaciones de muchos a muchos. En este contexto, puede ser necesario buscar diferentes valores con un operador `AND` PERO en el mismo atributo. Por ejemplo, de una mirada a la siguiente estructura:
-
-
-
-Imagine que quiere buscar todas las películas en las que un actor A *y* un actor B tienen un papel. Si escribe una búsqueda simple utilizando un operador `AND`, no funcionará:
-
-```4d
-// código inválido
-$es:=ds.Movie.query("roles.actor.lastName = :1 AND roles.actor.lastName = :2";"Hanks";"Ryan")
-// $es está vacía
-```
-
-Básicamente, el problema está relacionado con la lógica interna de la búsqueda: no se puede buscar un atributo cuyo valor sea tanto "A" como "B".
-
-Para poder realizar este tipo de consultas, ORDA permite una sintaxis especial: basta con añadir un *índice de clase* entre **{}** en todos los atributos de relación adicionales utilizados en la cadena de búsqueda:
-
-```4d
-"relationAttribute.attribute = :1 AND relationAttribute{x}.attribute = :2 [AND relationAttribute{y}.attribute...]"
-```
-
-**{x}** indica a ORDA que cree otra referencia para el atributo relacional. A continuación, realizará todas las operaciones de mapa de bits internas necesarias. Tenga en cuenta que **x** puede ser cualquier número **excepto 0**: {1}, o {2}, o {1540}... ORDA sólo necesita una referencia única en la búsqueda para cada clase índice.
-
-En nuestro ejemplo, sería:
-
-```4d
-// código válido
-$es:=ds.Movie.query("roles.actor.lastName = :1 AND roles.actor{2}.lastName = :2";"Hanks";"Ryan")
-// $es contient des films (You've Got Mail, Sleepless in Seattle, Joe Versus the Volcano)
-```
-
-#### parámetro formula
-
-Como alternativa a la inserción de fórmulas dentro del parámetro *queryString* (ver arriba), puede pasar directamente un objeto fórmula como criterio de búsqueda booleano. La utilización de un objeto fórmula para las búsquedas es **recomendada** ya que se beneficia de la tokenización, y el código es más fácil de buscar/leer.
-
-La fórmula debe haber sido creada utilizando el comando [`Formula`](../commands/formula.md) o [`Formula from string`](../commands/formula-from-string.md). En este caso:
-
-- *formula* se evalúa para cada entidad y debe devolver true o false. Durante la ejecución de la búsqueda, si el resultado de la fórmula no es un booleano, se considera como false.
-- dentro de la *formula*, la entidad está disponible a través del objeto `This`.
-- if the `Formula` object is **null**, the error 1626 ("Expecting a text or formula") is generated, that you can intercept using a method installed with `ON ERR CALL`.
-
-> Por razones de seguridad, las llamadas a fórmulas dentro de las funciones `query()` pueden ser desestimadas. Ver la descripción del parámetro *querySettings*.
-
-#### Pasar parámetros a fórmulas
-
-Toda *formula* llamada por la función `query()` puede recibir los parámetros:
-
-- Los parámetros deben pasarse a través de la propiedad **args** (objeto) del parámetro *querySettings*.
-- La fórmula recibe este objeto **args** como parámetro **$1**.
-
-Este pequeño código muestra los principios de cómo se pasan los parámetros a los métodos:
-
-```4d
- $settings:=New object("args";New object("exclude";"-")) //objeto args a pasar los parámetros
- $es:=ds.Students.query("eval(checkName($1.exclude))";$settings) //args se recibe en $1
-```
-
-En el ejemplo 3 se ofrecen más ejemplos.
-
-**4D Server**: en cliente/servidor, las fórmulas se ejecutan en el servidor. En este contexto, sólo el objeto `querySettings.args` se envía a las fórmulas.
-
-#### Parámetro querySettings
-
-En el parámetro *querySettings* se puede pasar un objeto que contenga opciones adicionales. Se soportan las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| parameters | Object | **Marcadores de posición con nombre para los valores** utilizados en *queryString* o *formula*. Los valores se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para un valor en *queryString* o *formula* (":placeholder") y valor es el valor a comparar. Puede combinar marcadores de posición indexados (valores pasados directamente en parámetros de valor) y valores de marcadores de posición con nombre en la misma búsqueda. |
-| attributes | Object | **Marcadores de posición con nombre para rutas de atributos** utilizados en *queryString* o *formula*. Los atributos se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para una ruta de atributo en *queryString* o *formula* (":placeholder") y valor puede ser una cadena o una colección de cadenas. Cada valor es una ruta que puede designar un escalar o un atributo relacionado de la clase de datos o una propiedad en un campo objeto de la clase de datos
Tipo de datos
Descripción
Cadena
attributePath expresado utilizando la notación de puntos, por ejemplo "name" o "user.address.zipCode"
Colección de cadenas
Cada cadena de la colección representa un nivel de attributePath, por ejemplo, \["name"] o \["user","address","zipCode"]. El uso de una colección permite realizar consultas sobre atributos con nombres que no son compatibles a la notación de puntos, por ejemplo, \["4Dv17.1", "en\/fr"]
Puede mezclar marcadores de posición indexados (valores pasados directamente en los parámetros *value*) y los valores de marcadores de posición con nombre en la misma consulta. |
-| args | Object | Parámetro(s) a pasar a las fórmulas, si las hay. El objeto **args** se recibirá en $1 dentro de las fórmulas y, por tanto, sus valores estarán disponibles a través de *$1.property* (ver el ejemplo 3). |
-| allowFormulas | Boolean | True para permitir las llamadas de fórmulas en la búsqueda (por defecto). Pase false para desautorizar la ejecución de fórmulas. Si se define como false y `query()` recibe una fórmula, se envía un error (1278 - Fórmula no autorizada en este método miembro). |
-| context | Text | Etiqueta para el contexto de optimización automática aplicado a la entity selection. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está diseñada para el procesamiento cliente/servidor; para más información, consulte la sección [**Optimización cliente/servidor**](../ORDA/client-server-optimization.md#optimization-context). |
-| queryPlan | Boolean | En la entity selection resultante, devuelve o no la descripción detallada de la búsqueda justo antes de que se ejecute, es decir, la búsqueda planificada. La propiedad devuelta es un objeto que incluye cada búsqueda y sub búsqueda prevista (en el caso de una búsqueda compleja). Esta opción es útil durante la fase de desarrollo de una aplicación. Suele utilizarse junto con queryPath. Por defecto si se omite: false. |
-| queryPath | Boolean | En la entity selection resultante, devuelve o no la descripción detallada de la búsqueda tal cual es realizada. La propiedad devuelta es un objeto que contiene la ruta utilizada para la búsqueda (normalmente idéntica a la de queryPlan, pero puede diferir si el motor consigue optimizar la búsqueda), así como el tiempo de procesamiento y el número de registros encontrados. Esta opción es útil durante la fase de desarrollo de una aplicación. Por defecto si se omite: false. |
-
-#### Sobre queryPlan y queryPath
-
-La información registrada en `queryPlan`/`queryPath` incluye el tipo de búsqueda (indexada y secuencial) y cada subconsulta necesaria junto con los operadores de conjunción. Las rutas de acceso de las peticiones también contienen el número de entidades encontradas y el tiempo necesario para ejecutar cada criterio de búsqueda. Las rutas de acceso de las peticiones también contienen el número de entidades encontradas y el tiempo necesario para ejecutar cada criterio de búsqueda. Generalmente, la descripción del plan de consulta y su ruta de acceso son idénticas, pero pueden diferir porque 4D puede implementar optimizaciones dinámicas cuando se ejecuta una consulta para mejorar el rendimiento. Por ejemplo, el motor 4D puede convertir dinámicamente una consulta indexada en una secuencial si estima que es más rápida. Este caso concreto puede darse cuando el número de entidades que se buscan es bajo.
-
-Por ejemplo, si ejecuta la siguiente búsqueda:
-
-```4d
- $sel:=ds.Employee.query("salary < :1 and employer.name = :2 or employer.revenues > :3";\
- 50000;"Lima West Kilo";10000000;New object("queryPath";True;"queryPlan";True))
-```
-
-queryPlan:
-
-```4d
-{Or:[{And:[{item:[index : Employee.salary ] < 50000},
- {item:Join on Table : Company : Employee.employerID = Company.ID,
- subquery:[{item:[index : Company.name ] = Lima West Kilo}]}]},
- {item:Join on Table : Company : Employee.employerID = Company.ID,
- subquery:[{item:[index : Company.revenues ] > 10000000}]}]}
-```
-
-queryPath:
-
-```4d
-{steps:[{description:OR,time:63,recordsfounds:1388132,
- steps:[{description:AND,time:32,recordsfounds:131,
- steps:[{description:[index : Employee.salary ] < 50000,time:16,recordsfounds:728260},{description:Join on Table : Company : Employee.employerID = Company.ID,time:0,recordsfounds:131,
- steps:[{steps:[{description:[index : Company.name ] = Lima West Kilo,time:0,recordsfounds:1}]}]}]},{description:Join on Table : Company : Employee.employerID = Company.ID,time:31,recordsfounds:1388132,
- steps:[{steps:[{description:[index : Company.revenues ] > 10000000,time:0,recordsfounds:933}]}]}]}]}
-```
-
-#### Ejemplo 1
-
-Esta sección ofrece varios ejemplos de búsquedas.
-
-Búsquedas en una cadena:
-
-```4d
-$entitySelection:=ds.Customer.query("firstName = 'S@'")
-```
-
-Búsqueda con una instrucción NOT:
-
-```4d
-$entitySelection:=ds.Employee.query("not(firstName=Kim)")
-```
-
-Búsquedas con fechas:
-
-```4d
-$entitySelection:=ds.Employee.query("birthDate > :1";"1970-01-01")
-$entitySelection:=ds.Employee.query("birthDate <= :1";Current date-10950)
-```
-
-Búsqueda con marcadores de posición indexados para los valores:
-
-```4d
-$entitySelection:=ds.Customer.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")
-```
-
-Búsqueda con marcadores de posición indexados para valores en una dataclass relacionada:
-
-```4d
-$entitySelection:=ds.Employee.query("lastName = :1 and manager.lastName = :2";"M@";"S@")
-```
-
-Búsqueda con marcador de posición indexado que incluye una instrucción de orden descendente:
-
-```4d
-$entitySelection:=ds.Student.query("nationality = :1 order by campus.name desc, lastname";"French")
-```
-
-Búsqueda con marcadores de posición con nombre para los valores:
-
-```4d
-var $querySettings : Object
-var $managedCustomers : cs.CustomerSelection
-$querySettings:=New object
-$querySettings.parameters:=New object("userId";1234;"extraInfo";New object("name";"Smith"))
-$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name = :extraInfo.name";$querySettings)
-```
-
-Búsqueda que utiliza marcadores de posición con nombre e indexados para los valores:
-
-```4d
-var $querySettings : Object
-var $managedCustomers : cs.CustomerSelection
-$querySettings.parameters:=New object("userId";1234)
-$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name=:1";"Smith";$querySettings)
-```
-
-Búsqueda con objetos queryPlan y queryPath:
-
-```4d
-$entitySelection:=ds.Employee.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";New object("queryPlan";True;"queryPath";True))
-
- //puede obtener estas propiedades en la selección de entidades resultante
-var $queryPlan; $queryPath : Object
-$queryPlan:=$entitySelection.queryPlan
-$queryPath:=$entitySelection.queryPath
-```
-
-Búsqueda con una ruta de atributo de tipo Colección:
-
-```4d
-$entitySelection:=ds.Employee.query("extraInfo.hobbies[].name = :1";"horsebackriding")
-```
-
-Búsqueda con una ruta de atributos de tipo Collection y atributos vinculados:
-
-```4d
-$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and extraInfo.hobbies[a].level=:2";"horsebackriding";2)
-```
-
-Búsqueda con una ruta de atributos de tipo Collection y múltiples atributos vinculados:
-
-```4d
-$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and
- extraInfo.hobbies[a].level = :2 and extraInfo.hobbies[b].name = :3 and
- extraInfo.hobbies[b].level = :4";"horsebackriding";2;"Tennis";5)
-```
-
-Búsqueda con una ruta de atributo de tipo Objeto:
-
-```4d
-$entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")
-```
-
-Búsqueda con una instrucción IN:
-
-```4d
-$entitySelection:=ds.Employee.query("firstName in :1";New collection("Kim";"Dixie"))
-```
-
-Búsqueda con instrucción NOT (IN):
-
-```4d
-$entitySelection:=ds.Employee.query("not (firstName in :1)";New collection("John";"Jane"))
-```
-
-Búsqueda con marcadores de posición indexados para los atributos:
-
-```4d
-var $es : cs.EmployeeSelection
-$es:=ds.Employee.query(":1 = 1234 and :2 = 'Smith'";"salesperson.userId";"name")
- //salesperson es una entidad relacionada
-```
-
-Búsqueda con marcadores de posición indexados para los atributos y marcadores de posición con nombre para los valores:
-
-```4d
-var $es : cs.EmployeeSelection
-var $querySettings : Object
-$querySettings:=New object
-$querySettings.parameters:=New object("customerName";"Smith")
-$es:=ds.Customer.query(":1 = 1234 and :2 = :customerName";"salesperson.userId";"name";$querySettings)
- //salesperson es una entidad relacionada
-```
-
-Búsqueda con marcadores de posición indexados para los atributos y los valores:
-
-```4d
-var $es : cs.EmployeeSelection
-$es:=ds.Clients.query(":1 = 1234 and :2 = :3";"salesperson.userId";"name";"Smith")
- //salesperson es una entidad relacionada
-```
-
-#### Ejemplo 2
-
-Esta sección ilustra las búsquedas con marcadores de posición con nombre para los atributos.
-
-Dada una dataclass Employee con 2 entidades:
-
-Entidad 1:
-
-```4d
-name: "Marie"
-number: 46
-softwares:{
-"Word 10.2": "Installed",
-"Excel 11.3": "To be upgraded",
-"Powerpoint 12.4": "Not installed"
-}
-```
-
-Entidad 2:
-
-```4d
-name: "Sophie"
-number: 47
-softwares:{
-"Word 10.2": "Not installed",
-"Excel 11.3": "To be upgraded",
-"Powerpoint 12.4": "Not installed"
-}
-```
-
-Búsqueda con marcadores de posición con nombre para los atributos:
-
-```4d
- var $querySettings : Object
- var $es : cs.EmployeeSelection
- $querySettings:=New object
- $querySettings.attributes:=New object("attName";"name";"attWord";New collection("softwares";"Word 10.2"))
- $es:=ds.Employee.query(":attName = 'Marie' and :attWord = 'Installed'";$querySettings)
- //$es.length=1 (Employee Marie)
-```
-
-Búsqueda con marcadores de posición con nombre para los atributos y los valores:
-
-```4d
- var $querySettings : Object
- var $es : cs.EmployeeSelection
- var $name : Text
- $querySettings:=New object
- //Placeholders para los valores
- //Se pide al usuario un nombre
- $name:=Request("Por favor, introduzca el nombre a buscar:")
- If(OK=1)
- $querySettings.parameters:=New object("givenName";$name)
- //Placeholders para las rutas de atributos
- $querySettings.attributes:=New object("attName";"name")
- $es:=ds.Employee.query(":attName= :givenName";$querySettings)
- End if
-```
-
-#### Ejemplo 3
-
-Estos ejemplos ilustran las distintas formas de utilizar fórmulas con o sin parámetros en sus búsquedas.
-
-La fórmula se da como texto con `eval()` en el parámetro *queryString*:
-
-```4d
- var $es : cs.StudentsSelection
- $es:=ds.Students.query("eval(length(This.lastname) >=30) and nationality='French'")
-```
-
-La fórmula se da como un objeto `Formula` a través de un marcador de posición:
-
-```4d
- var $es : cs.StudentsSelection
- var $formula : Object
- $formula:=Formula(Length(This.lastname)>=30)
- $es:=ds.Students.query(":1 and nationality='French'";$formula)
-```
-
-Sólo se da como criterio un objeto `Formula`:
-
-```4d
- var $es : cs.StudentsSelection
- var $formula : Object
- $formula:=Formula(Length(This.lastname)>=30)
- $es:=ds.Students.query($formula)
-```
-
-Se pueden aplicar varias fórmulas:
-
-```4d
- var $formula1; $1; $formula2 ;$0 : Object
- $formula1:=$1
- $formula2:=Formula(Length(This.firstname)>=30)
- $0:=ds.Students.query(":1 and :2 and nationality='French'";$formula1;$formula2)
-```
-
-Una fórmula texto en *queryString* recibe un parámetro:
-
-```4d
- var $es : cs.StudentsSelection
- var $settings : Object
- $settings:=New object()
- $settings.args:=New object("filter";"-")
- $es:=ds.Students.query("eval(checkName($1.filter)) and nationality=:1";"French";$settings)
-```
-
-```4d
- //checkName method
- #DECLARE($exclude : Text) -> $result : Boolean
- $result:=(Position($exclude;This.lastname)=0)
-```
-
-Utilizando el mismo método ***checkName***, un objeto `Formula` como marcador de posición recibe un parámetro:
-
-```4d
- var $es : cs.StudentsSelection
- var $settings; $formula : Object
- $formula:=Formula(checkName($1.filter))
- $settings:=New object()
- $settings.args:=New object("filter";"-")
- $es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
- $settings.args.filter:="*" // cambiar los parámetros sin actualizar el objeto $formula
- $es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
-```
-
-Queremos desautorizar las fórmulas, por ejemplo, cuando el usuario introduce su consulta:
-
-```4d
- var $es : cs.StudentsSelection
- var $settings : Object
- var $queryString : Text
- $queryString:=Request("Enter your query:")
- if(OK=1)
- $settings:=New object("allowFormulas";False)
- $es:=ds.Students.query($queryString;$settings) //Se produce un error si $queryString contiene una fórmula
- End if
-```
-
-#### Ver también
-
-[`.query()`](EntitySelectionClass.md#query) para las selecciones de entidades
-
-
-
-## .setRemoteCacheSettings()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.setRemoteCacheSettings**(*settings* : Object)
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | -- | ------------------------------------------------------------------------------------------------------------ |
-| settings | Object | -> | Objeto que define el tiempo de espera y el tamaño máximo de la caché ORDA para el dataclass. |
-
-
-
-> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
-
-#### Descripción
-
-La función `.setRemoteCacheSettings()` define el tiempo de espera y el tamaño máximo de la caché ORDA para una dataclass..
-
-En el parámetro *settings*, pase un objeto con las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ------- | --------------------------------------------- |
-| timeout | Integer | Tiempo de espera en segundos. |
-| maxEntries | Integer | Número máximo de entidades. |
-
-`timeout` define el tiempo de espera de la caché ORDA para la dataclass (por defecto es 30 segundos). Una vez transcurrido el tiempo de espera, las entidades de la dataclass en la caché son consideradas como vencidas. Esto significa que:
-
-- los datos siguen estando ahí
-- la próxima vez que se necesiten los datos, se le pedirán al servidor
-- 4D elimina automáticamente los datos caducados cuando se alcanza el número máximo de entidades
-
-Definir la propiedad `timeout` define un nuevo timeout para las entidades ya presentes en la caché. Es útil cuando se trabaja con los datos que no cambian con mucha frecuencia y, por tanto, cuando no son necesarias nuevas peticiones al servidor.
-
-`maxEntries` define el número máximo de entidades en la caché ORDA. Por defecto es 30 000.
-
-El número de entradas mínimo es 300, por lo que el valor de `maxEntries` debe ser igual o superior a 300. En caso contrario, se ignora y el número máximo de entradas se fija en 300.
-
-Si no se pasan propiedades válidas como `timeout` y `maxEntries`, la caché permanece sin cambios, con sus valores por defecto o previamente definidos.
-
-Cuando se guarda una entidad, se actualiza en la caché y vence una vez alcanzado el timeout.
-
-#### Ejemplo
-
-```4d
-var $ds : 4D.DataStoreImplementation
-
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-$ds.Buildings.setRemoteCacheSettings(New object("timeout"; 60; "maxEntries"; 350))
-```
-
-#### Ver también
-
-[.clearRemoteCache()](#clearremotecache) [.getRemoteCache()](#clearremotecache)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataStoreClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataStoreClass.md
deleted file mode 100644
index be734cc3c89a5e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataStoreClass.md
+++ /dev/null
@@ -1,1261 +0,0 @@
----
-id: DataStoreClass
-title: DataStore
----
-
-Un [Datastore](ORDA/dsMapping.md#datastore) es el objeto de interfaz suministrado por ORDA para referenciar y acceder a una base de datos. Los objetos `Datastore` son devueltos por los siguientes comandos:
-
-- [ds](../commands/ds.md): un acceso directo al datastore principal
-- [Open datastore](../commands/open-datastore.md): para abrir cualquier datastore remoto
-
-### Resumen
-
-| |
-| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#canceltransaction) |
-| [](#clearallremotecontexts) |
-| [](#dataclassname) |
-| [](#encryptionstatus) |
-| [](#flushandlock) |
-| [](#getallremotecontexts) |
-| [](#getglobalstamp) |
-| [](#getinfo) |
-| [](#getremotecontextinfo) |
-| [](#getrequestlog) |
-| [](#locked) |
-| [](#makeselectionsalterable) |
-| [](#providedatakey) |
-| [](#setadminprotection) |
-| [](#setglobalstamp) |
-| [](#setremotecontextinfo) |
-| [](#startrequestlog) |
-| [](#starttransaction) |
-| [](#stoprequestlog) |
-| [](#unlock) |
-| [](#validatetransaction) |
-
-## *.dataclassName*
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-***.dataclassName*** : 4D.DataClass
-
-#### Descripción
-
-Cada dataclass en un datastore está disponible como propiedad del objeto [DataStore](ORDA/dsMapping.md#datastore). El objeto devuelto contiene una descripción de la clase de datos.
-
-#### Ejemplo
-
-```4d
- var $emp : cs.Employee
- var $sel : cs.EmployeeSelection
- $emp:=ds.Employee //$emp contiene la dataclass Employee
- $sel:=$emp.all() //obtiene una selección de entidades de todos los empleados
-
- //también puede escribir directamente:
- $sel:=ds.Employee.all()
-```
-
-
-
-## .cancelTransaction()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 | Añadidos |
-
-
-
-**.cancelTransaction()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.cancelTransaction()` cancela la transacción abierta por la función [`.startTransaction()`](#starttransaction) en el nivel correspondiente en el proceso actual para el datastore especificado.
-
-La función `.cancelTransaction()` cancela cualquier cambio realizado en los datos durante la transacción.
-
-Puede anidar varias transacciones (subtransacciones). Si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente mediante la función [`.validateTransaction()`](#validatetransaction).
-
-#### Ejemplo
-
-Ver el ejemplo de la función [`.startTransaction() `](#starttransaction).
-
-
-
-## .clearAllRemoteContexts()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.clearAllRemoteContexts()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.clearAllRemoteContexts()` borra todos los atributos de todos los contextos activos en el datastore.
-
-Esta función se utiliza principalmente en el contexto de la depuración. Una cosa a tener en cuenta es que cuando se abre el depurador, éste envía peticiones al servidor y consulta todos los atributos de la clase de datos para mostrarlos. Esto puede sobrecargar sus contextos con datos innecesarios.
-
-En estos casos, puedes utilizar `.clearAllRemoteContexts()` para borrar sus contextos y mantenerlos limpios.
-
-#### Ver también
-
-[.getRemoteContextInfo()](#getremotecontextinfo) [.getAllRemoteContexts()](#getallremotecontexts) [.setRemoteContextInfo()](#setremotecontextinfo)
-
-
-
-## .encryptionStatus()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.encryptionStatus()**: Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ------------------------------------------------------------------------ |
-| Resultado | Object | <- | Información sobre el cifrado del almacén de datos actual y de cada tabla |
-
-
-
-#### Descripción
-
-La función `.encryptionStatus()` devuelve un objeto que suministra el estado de cifrado del archivo de datos actual (es decir, el archivo de datos del datastore `ds`). También se proporciona el estado de cada tabla.
-
-> Utilice el comando `Data file encryption status` para determinar el estado de encriptación de cualquier otro archivo de datos.
-
-**Valor devuelto**
-
-El objeto devuelto contiene las siguientes propiedades:
-
-| Propiedad | | | Tipo | Descripción |
-| ----------- | ----------- | ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
-| isEncrypted | | | Boolean | True si el archivo de datos está encriptado |
-| keyProvided | | | Boolean | True si se proporciona la llave de encriptación que coincide con el archivo de datos encriptados(\*). |
-| tablas | | | Object | Objeto que contiene tantas propiedades como tablas encriptadas o codificadas. |
-| | *tableName* | | Object | Tabla encriptada o cifrada |
-| | | name | Text | Nombre de la tabla |
-| | | num | Number | Número de tabla |
-| | | isEncryptable | Boolean | Verdadero si la tabla está declarada como encriptada en el archivo de estructura |
-| | | isEncrypted | Boolean | True si los registros de la tabla están encriptados en el archivo de datos |
-
-(\*) Se puede suministrar la llave de encriptación:
-
-- con el comando `.provideDataKey()`,
-- en la raíz de un dispositivo conectado antes de abrir el almacén de datos,
-- con el comando `Discover data key`.
-
-#### Ejemplo
-
-Quiere saber el número de tablas encriptadas en el archivo de datos actual:
-
-```4d
- var $status : Object
-
- $status:=ds.encryptionStatus()
-
- If($status.isEncrypted) //the database is encrypted
- C_LONGINT($vcount)
- C_TEXT($tabName)
- For each($tabName;$status.tables)
- If($status.tables[$tabName].isEncrypted)
- $vcount:=$vcount+1
- End if
- End for each
- ALERT(String($vcount)+" encrypted table(s) in this datastore.")
- Else
- ALERT("This database is not encrypted.")
- End if
-```
-
-
-
-## .flushAndLock()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.flushAndLock()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | - | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.flushAndLock()` vacía la caché del datastore local e impide que otros procesos realicen operaciones de escritura en la base de datos. El datastore se pone en un estado consistente y congelado. Es necesario llamar a esta función antes de ejecutar una instantánea de la aplicación, por ejemplo.
-
-:::info
-
-Esta función sólo puede llamarse:
-
-- en el datastore local ([`ds`](../commands/ds.md)).
-- en entorno cliente/servidor, en la máquina servidor.
-
-:::
-
-Una vez ejecutada esta función, las operaciones de escritura como `.save()` u otras llamadas a `.flushAndLock()` se congelan en todos los demás procesos hasta que se desbloquee el datastore.
-
-Cuando se han realizado varias llamadas a `.flushAndLock()` en el mismo proceso, se debe ejecutar el mismo número de llamadas a [`.unlock()`](#unlock) para desbloquear realmente el datastore.
-
-El datastore se desbloquea cuando:
-
-- la función [`.unlock()`](#unlock) es llamada en el mismo proceso, o
-- el proceso que llamó a la función `.flushAndLock()` es eliminado.
-
-Si el datastore ya está bloqueado desde otro proceso, la llamada a `.flushAndLock()` se congela y se ejecutará cuando se desbloquee el datastore.
-
-Se produce un error si la función `.flushAndLock()` no puede ejecutarse (por ejemplo, se ejecuta en un 4D remoto), .
-
-:::caution
-
-Otras funciones y servicios 4D, como [backup](../Backup/backup.md), [vss](https://doc.4d.com/4Dv20/4D/20/Using-Volume-Shadow-Copy-Service-on-Windows.300-6330532.en.html) y [MSC](../MSC/overview.md) también pueden bloquear el almacén de datos. Antes de llamar a `.flushAndLock()`, asegúrese de que no se está utilizando ninguna otra acción de bloqueo, para evitar cualquier interacción inesperada.
-
-:::
-
-#### Ejemplo
-
-Desea crear una copia de la carpeta de datos junto con su archivo de historial actual:
-
-```4d
-$destination:=Folder(fk documents folder).folder("Archive")
-$destination.create()
-
-ds.flushAndLock() //Bloquear operaciones de escritura de otros procesos
-
-$dataFolder:=Folder(fk data folder)
-$dataFolder.copyTo($destination) //Copiar la carpeta de datos
-
-$oldJournalPath:=New log file //Cerrar el historial y crear uno nuevo
-$oldJournal:=File($oldJournalPath; fk platform path)
-$oldJournal.moveTo($destination) //Guardar el antiguo historial con datos
-
-ds.unlock() //Nuestra copia ha terminado, ahora podemos desbloquear el datastore
-```
-
-#### Ver también
-
-[.locked()](#locked) [.unlock()](#unlock)
-
-## .getAllRemoteContexts()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.getAllRemoteContexts()** : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | --------------------------- | ---------------------------------------------- |
-| Resultado | Collection | <- | Colección de objetos contextos de optimización |
-
-
-
-> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
-
-#### Descripción
-
-La función `.getAllRemoteContexts()` devuelve una colección de objetos que contienen información sobre todos los contextos de optimización activos en el datastore.
-
-> Para obtener más información sobre cómo se pueden crear contextos, consulte [Optimización cliente/servidor](../ORDA/client-server-optimization.md#optimization-context).
-
-Cada objeto de la colección devuelta tiene las propiedades enumeradas en la sección [`.getRemoteContextInfo()`](#getremotecontextinfo).
-
-#### Ejemplo
-
-El siguiente código define dos contextos y los recupera utilizando `.getAllRemoteContexts()`:
-
-```4d
-var $ds : 4D.DataStoreImplementation
-var $persons : cs.PersonsSelection
-var $addresses : cs.AddressSelection
-var $p : cs.PersonsEntity
-var $a : cs.AddressEntity
-var $contextA; $contextB : Object
-var $info : Collection
-var $text : Text
-
-// Open remote datastore
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-// Set context A
-$contextA:=New object("context"; "contextA")
-$persons:=$ds.Persons.all($contextA)
-$text:=""
-For each ($p; $persons)
- $text:=$p.firstname+" lives in "+$p.address.city+" / "
-End for each
-
-// Set context B
-$contextB:=New object("context"; "contextB")
-$addresses:=$ds.Address.all($contextB)
-$text:=""
-For each ($a; $addresses)
- $text:=$a.zipCode
-End for each
-
-// Get all remote contexts (in this case, contextA and contextB)
-$info:=$ds.getAllRemoteContexts()
-//$info = [{name:"contextB"; dataclass: "Address"; main:"zipCode"},
-{name:"contextA";dataclass:"Persons";main:"firstname,address.city"}]
-```
-
-> Este ejemplo sirve como demostración, no está pensado para una implementación real.
-
-#### Ver también
-
-[.getRemoteContextInfo()](#getremotecontextinfo) [.setRemoteContextInfo()](#setremotecontextinfo) [.clearAllRemoteContexts()](#clearallremotecontexts)
-
-## .getGlobalStamp()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R3 | Añadidos |
-
-
-
-**.getGlobalStamp**() : Real
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | --------------------------- | ------------------------------------------------ |
-| Resultado | Real | <- | Valor actual del marcador de modificación global |
-
-
-
-#### Descripción
-
-The `.getGlobalStamp()` function returns the current value of the global modification stamp of the datastore.
-
-:::info
-
-Esta función sólo puede llamarse:
-
-- en el datastore local ([`ds`](../commands/ds.md)).
-- en entorno cliente/servidor, en la máquina servidor.
-
-:::
-
-Para más información sobre el marcador global y el seguimiento de las modificaciones de datos, por favor consulte la página [**Uso del marcador global**](../ORDA/global-stamp.md).
-
-#### Ejemplo
-
-```4d
-var $currentStamp : Real
-var $hasModifications : Boolean
-
-$currentStamp:=ds.getGlobalStamp()
-methodWhichCouldModifyEmployees //ejecutar código
-$hasModifications:=($currentStamp # ds.getGlobalStamp())
-```
-
-#### Ver también
-
-[.setGlobalStamp()](#setglobalstamp)
-
-
-
-## .getInfo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.getInfo()**: Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | -------------------------------- |
-| Resultado | Object | <- | Propiedades del almacén de datos |
-
-
-
-#### Descripción
-
-La función `.getInfo()` devuelve un objeto que proporciona información sobre el datastore. Esta función es útil para configurar el código genérico.
-
-**Objeto devuelto**
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| type | string |
"4D": datastore principal, disponible a través de ds
"4D Server": datastore remoto, abrir con Open datastore
|
-| networked | boolean |
True: el datastore se alcanza a través de una conexión de red.
False: el datastore no se alcanza a través de una conexión de red (base de datos local)
|
-| localID | text | ID del almacén de datos en la máquina. ID del almacén de datos en la máquina. Cadena vacía ("") para el almacén de datos principal. |
-| connection | object | Objeto que describe la conexión del almacén de datos remoto (no se devuelve para el almacén de datos principal). Propiedades disponibles:
Propiedad
Tipo
Descripción
nombre de host
texto
Dirección IP o nombre del datastore remoto + ":" + número de puerto
tls
booleano
True si se utiliza una conexión segura con el datastore remoto
idleTimeout
número
Tiempo de inactividad de la sesión (en minutos)
usuario
texto
Usuario autenticado en el almacén de datos remoto
|
-
-- Si la función `.getInfo()` se ejecuta en un 4D Server o en un 4D monopuesto, `networked` es False.
-- Si la función `.getInfo()` se ejecuta en un 4D remoto, `networked` es True
-
-#### Ejemplo 1
-
-```4d
- var $info : Object
-
- $info:=ds.getInfo() //Ejecutado en 4D Server o 4D
- //{"type":"4D","networked":false,"localID":""}
-
- $info:=ds.getInfo() // Ejecutado en 4D remoto
- //{"type":"4D","networked":true,"localID":""}
-```
-
-#### Ejemplo 2
-
-En un almacén de datos remoto:
-
-```4d
- var $remoteDS : 4D.DataStoreImplementation
- var $info; $connectTo : Object
-
- $connectTo:=New object("hostname";"111.222.33.44:8044";"user";"marie";"password";"aaaa")
- $remoteDS:=Open datastore($connectTo;"students")
- $info:=$remoteDS.getInfo()
-
- //{"type":"4D Server",
- //"localID":"students",
- //"networked":true,
- //"connection":{hostname:"111.222.33.44:8044","tls":false,"idleTimeout":2880,"user":"marie"}}
-```
-
-
-
-## .getRemoteContextInfo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.getRemoteContextInfo**(*contextName* : Text) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ------ | --------------------------- | ------------------------ |
-| contextName | Text | -> | Nombre del contexto |
-| Resultado | Object | <- | Descripción del contexto |
-
-
-
-> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
-
-#### Descripción
-
-La función `.getRemoteContextInfo()` devuelve un objeto que contiene información sobre el contexto de optimización *contextName* en el datastore.
-
-Para obtener más información sobre cómo se pueden crear contextos de optimización, consulte [optimización cliente/servidor](../ORDA/client-server-optimization.md#optimization-context).
-
-#### Objeto devuelto
-
-El objeto devuelto tiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ----------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| name | Text | Nombre del contexto |
-| main | Text | Atributo(s) asociado(s) al contexto (los nombres de atributos están separados por comas) |
-| dataclass | Text | Nombre de la clase de datos |
-| currentItem (opcional) | Text | Los atributos del [modo página](../ORDA/client-server-optimization.md#entity-selection-based-list-box) si el contexto está vinculado a un list box. Se devuelve como `Null` o elemento de texto vacío si el nombre del contexto no se utiliza para un list box, o si no hay contexto para el elemento actual (currentItem) |
-
-Como los contextos se comportan como filtros de atributos, si *main* se devuelve vacío, significa que no se aplica ningún filtro, y que el servidor devuelve todos los atributos de la dataclass.
-
-#### Ejemplo
-
-Ver el ejemplo de la sección [`.setRemoteContextInfo()`](#example-1-3).
-
-#### Ver también
-
-[.setRemoteContextInfo()](#setremotecontextinfo) [.getAllRemoteContexts()](#getallremotecontexts) [.clearAllRemoteContexts()](#clearallremotecontexts)
-
-
-
-## .getRequestLog()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R6 | Añadidos |
-
-
-
-**.getRequestLog()** : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | -------------------------------------------------------------- |
-| Resultado | Collection | <- | Colección de objetos, donde cada objeto describe una solicitud |
-
-
-
-#### Descripción
-
-La función `.getRequestLog()` devuelve las peticiones ORDA registradas en memoria del lado del cliente. El registro de peticiones ORDA debe haber sido activado previamente utilizando la función [`.startRequestLog()`](#startrequestlog).
-
-Esta función debe ser llamada en un 4D remoto, de lo contrario devuelve una colección vacía. Está diseñado para fines de depuración en configuraciones cliente/servidor.
-
-**Valor devuelto**
-
-Colección de objetos de petición apilados. La solicitud más reciente tiene el índice 0.
-
-Para una descripción del formato del registro de peticiones ORDA, por favor consulte la sección [**Peticiones ORDA**](../Debugging/debugLogFiles.md#orda-requests).
-
-#### Ejemplo
-
-Vea el ejemplo 2 de [`.startRequestLog()`](#startrequestlog).
-
-
-
-
-
-## .isAdminProtected()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.isAdminProtected()** : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------ |
-| Resultado | Boolean | <- | True si el acceso al Explorador de Datos está desactivado, False si está activado (por defecto) |
-
-
-
-#### Descripción
-
-La función `.isAdminProtected()` devuelve `True` si se ha desactivado el acceso al [Data Explorer](Admin/dataExplorer.md) para la sesión de trabajo.
-
-Por defecto, se concede acceso al Data Explorer para las sesiones `webAdmin`, pero se puede desactivar para evitar cualquier acceso a los datos por parte de los administradores (ver la función [`.setAdminProtection()`](#setadminprotection)).
-
-#### Ver también
-
-[`.setAdminProtection()`](#setadminprotection)
-
-
-
-## .locked()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.locked()** : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | --------------------------- | ----------------- |
-| Resultado | Boolean | <- | True si bloqueado |
-
-
-
-#### Descripción
-
-La función `.locked()` devuelve True si el datastore local está bloqueado actualmente.
-
-Puede bloquear el datastore utilizando la función [.flushAndLock()](#flushandlock) antes de ejecutar una instantánea del archivo de datos, por ejemplo.
-
-:::caution
-
-La función también devolverá `True` si el datastore fue bloqueado por otra función de administración como el backup o el vss (ver [.flushAndLock()](#flushandlock)).
-
-:::
-
-#### Ver también
-
-[.flushAndLock()](#flushandlock) [.unlock()](#unlock)
-
-
-
-## .makeSelectionsAlterable()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R5 | Añadidos |
-
-
-
-**.makeSelectionsAlterable()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.makeSelectionsAlterable()` define todas las selecciones de entidades como alterables por defecto en los datastores de la aplicación actual (incluyendo [datastores remotos](ORDA/remoteDatastores.md)). Está pensado para ser utilizado una vez, por ejemplo en el método base `On Startup`.
-
-Cuando no se llama a esta función, las nuevas selecciones de entidades pueden ser compartibles, dependiendo de la naturaleza de su "padre", o de [cómo se crean](ORDA/entities.md#shareable-or-alterable-entity-selections).
-
-> Esta función no modifica las selecciones de entidades creadas por [`.copy()`](./EntitySelectionClass.md#copy) o `OB Copy` cuando se utiliza la opción explícita `ck shared`.
-
-> **Compatibilidad**: esta función sólo debe utilizarse en proyectos convertidos desde versiones de 4D anteriores a 4D v18 R5 y que contengan llamadas [.add()](EntitySelectionClass.md#add). En este contexto, el uso de `.makeSelectionsAlterable()` puede ahorrar tiempo al restaurar instantáneamente el comportamiento anterior de 4D en los proyectos existentes.
-> Por otro lado, utilizar este método en proyectos nuevos creados en 4D v18 R5 y superiores **no es recomendable**, ya que impide compartir las selecciones de entidades, lo que ofrece mayor rendimiento y escalabilidad.
-
-
-
-
-
-## .provideDataKey()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.provideDataKey**( *curPassPhrase* : Text ) : Object **.provideDataKey**( *curDataKey* : Object ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------- | ------ | --------------------------- | -------------------------------------------------------- |
-| curPassPhrase | Text | -> | Frase de cifrado actual |
-| curDataKey | Object | -> | Llave de encriptación de datos actual |
-| Resultado | Object | <- | Resultado de la coincidencia de la llave de encriptación |
-
-
-
-#### Descripción
-
-La función `.provideDataKey()` permite suministrar una llave de cifrado de datos para el archivo de datos actual del datastore y detecta si la llave coincide con los datos cifrados. Esta función se puede utilizar al abrir una base encriptada, o al ejecutar cualquier operación de encriptación que requiera la llave de encriptación, como por ejemplo volver a encriptar el archivo de datos.
-
-> - La función `.provideDataKey()` debe ser llamada en una base de datos encriptada. Si se llama en una base no cifrada, el error 2003 (la llave de cifrado no coincide con los datos.) es devuelto. Utilice el comando `Data file encryption status` para determinar si la base de datos está encriptada.
-> - La función `.provideDataKey()` no puede ser llamada desde un 4D remoto o un datastore remoto encriptado.
-
-Si utiliza el parámetro *curPassPhrase*, pase la cadena utilizada para generar la llave de cifrado de datos. Cuando se utiliza este parámetro, se genera una llave de encriptación.
-
-Si utiliza el parámetro *curDataKey*, pase un objeto (con la propiedad *encodedKey*) que contenga la llave de cifrado de los datos. Esta llave puede haber sido generada con el comando `New data key`.
-
-Si se aporta una llave de cifrado de datos válida, se añade a la *keyChain* de la memoria y se activa el modo de cifrado:
-
-- todas las modificaciones de datos en las tablas encriptadas se cifran en el disco (.4DD, .journal. 4Dindx)
-- todos los datos cargados desde tablas encriptadas se descifran en memoria
-
-**Resultado**
-
-El resultado de la orden se describe en el objeto devuelto:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | -------------------------------------------------------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la llave de encriptación proporcionada coincide con los datos encriptados, False en caso contrario |
-| | | | Las siguientes propiedades se devuelven sólo si success es *FALSE* |
-| status | | Number | Código de error (4 si la llave de encriptación suministrada es errónea) |
-| statusText | | Text | Mensaje de error |
-| errors | | Collection | Pila de errores. El primer error tiene el índice más alto |
-| | \[ ].componentSignature | Text | Nombre del componente interno |
-| | \[ ].errCode | Number | Número de error |
-| | \[ ].message | Text | Mensaje de error |
-
-Si no se proporciona *curPassphrase* o *curDataKey*, `.provideDataKey()` devuelve **null** (no se genera ningún error).
-
-#### Ejemplo
-
-```4d
- var $keyStatus : Object
- var $passphrase : Text
-
- $passphrase:=Request("Enter the passphrase")
- If(OK=1)
- $keyStatus:=ds.provideDataKey($passphrase)
- If($keyStatus.success)
- ALERT("You have provided a valid encryption key")
- Else
- ALERT("You have provided an invalid encryption key, you will not be able to work with encrypted data")
- End if
- End if
-```
-
-
-
-
-
-## .setAdminProtection()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.setAdminProtection**( *status* : Boolean )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | -- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| status | Boolean | -> | True para desactivar el acceso Data Explorer a los datos del puerto `webAdmin`, False (por defecto) para otorgar el acceso |
-
-
-
-#### Descripción
-
-La función `.setAdminProtection()` permite deshabilitar cualquier acceso a datos en el [puerto web admin](Admin/webAdmin.md#http-port), incluso para el [Explorador de datos](Admin/dataExplorer.md) en sesiones `WebAdmin`.
-
-Por defecto, cuando no se llama a la función, el acceso a los datos se concede siempre en el puerto de administración web para una sesión con privilegio `WebAdmin` utilizando el Explorador de Datos. En algunas configuraciones, por ejemplo, cuando el servidor de aplicaciones está alojado en una máquina de terceros, es posible que no desee que el administrador pueda ver sus datos, aunque puede editar la configuración del servidor, incluyendo los parámetros [access key](Admin/webAdmin.md#access-key).
-
-En este caso, puede llamar a esta función para deshabilitar el acceso a los datos del Explorador de Datos en el puerto de administración web de la máquina, incluso si la sesión de usuario tiene el privilegio `WebAdmin`. Cuando se ejecuta esta función, el archivo de datos se protege inmediatamente y el estado se almacena en el disco: el archivo de datos estará protegido incluso si se reinicia la aplicación.
-
-#### Ejemplo
-
-Se crea un método proyecto *protectDataFile* para llamar antes de los despliegues, por ejemplo:
-
-```4d
- ds.setAdminProtection(True) //Desactiva el acceso a los datos del Explorador de datos
-```
-
-#### Ver también
-
-[`.isAdminProtected()`](#isadminprotected)
-
-
-
-## .setGlobalStamp()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R3 | Añadidos |
-
-
-
-**.setGlobalStamp**( *newStamp* : Real)
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | -- | ----------------------------------------------- |
-| newStamp | Real | -> | Nuevo valor del marcador de modificación global |
-
-
-
-:::info Modo avanzado
-
-Esta función está destinada a los desarrolladores que necesiten modificar el valor actual del marcador global. Debe utilizarse con cuidado.
-
-:::
-
-#### Descripción
-
-La función `.setGlobalStamp()` define *newStamp* como nuevo valor para del marcador de modificación global actual del datastore.
-
-:::info
-
-Esta función sólo puede llamarse:
-
-- en el datastore local ([`ds`](../commands/ds.md)).
-- en entorno cliente/servidor, en la máquina servidor.
-
-:::
-
-Para más información sobre el marcador global y el seguimiento de las modificaciones de datos, por favor consulte la página [**Uso del marcador global**](../ORDA/global-stamp.md).
-
-#### Ejemplo
-
-El siguiente código define el marcador de modificación global:
-
-```4d
-var $newValue: Real
-$newValue:=ReadValueFrom //obtener un nuevo valor para asignar
-ds.setGlobalStamp($newValue)
-```
-
-#### Ver también
-
-[.getGlobalStamp()](#getglobalstamp)
-
-## .setRemoteContextInfo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R5 | Añadidos |
-
-
-
-**.setRemoteContextInfo**( *contextName* : Text ; *dataClassName* : Text ; *attributes* : Text {; *contextType* : Text { ; *pageLength* : Integer}}) **.setRemoteContextInfo**( *contextName* : Text ; *dataClassName* : Text; *attributesColl* : Collection {; *contextType* : Text { ; *pageLength* : Integer }} ) **.setRemoteContextInfo**( *contextName* : Text ; *dataClassObject* : 4D.DataClass ; *attributes* : Text {; *contextType* : Text { ; *pageLength* : Integer }}) **.setRemoteContextInfo**( *contextName* : Text ; *dataClassObject* : 4D.DataClass ; *attributesColl* : Collection {; *contextType* : Text { ; *pageLength* : Integer }} )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| --------------- | ---------------------------- | -- | -------------------------------------------------------------------------------------------------------------- |
-| contextName | Text | -> | Nombre del contexto |
-| dataClassName | Text | -> | Nombre de la dataclass |
-| dataClassObject | 4D.DataClass | -> | dataclass object (e.g datastore. Employee) |
-| attributes | Text | -> | Lista de atributos separados por comas |
-| attributesColl | Collection | -> | Colección de nombres de atributos (text) |
-| contextType | Text | -> | Si se suministra, el valor debe ser "main" o "currentItem" |
-| pageLength | Integer | -> | Longitud de la página de la selección de entidades asociada al contexto (por defecto es 80) |
-
-
-
-> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
-
-#### Descripción
-
-La función `.setRemoteContextInfo()` vincula los atributos de la dataclass especificada al contexto de optimización *contextName*. Si ya existe un contexto de optimización para los atributos especificados, este comando lo reemplaza.
-
-Cuando se pasa un contexto a las funciones de clase ORDA, la optimización de las peticiones REST se activa inmediatamente:
-
-- la primera entidad no está totalmente cargada como se hace en el modo automático
-- las páginas de 80 entidades (o de `pageLength` entidades) se piden inmediatamente al servidor con sólo los atributos del contexto
-
-> Para más información sobre cómo se crean los contextos de optimización, consulte el [párrafo de optimización cliente/servidor](../ORDA/client-server-optimization.md#optimization-context)
-
-En *contextName*, pase el nombre del contexto de optimización para vincularlo a los atributos de la dataclass.
-
-Para designar la dataclass que recibirá el contexto, puede pasar un *dataClassName* o un *dataClassObject*.
-
-Para designar los atributos a vincular al contexto, pase una lista de atributos separados por una coma en *attributes* (Text), o una colección de nombres de atributos en *attributesColl* (colección de textos).
-
-Si *attributes* es un texto vacío, o si *attributesColl* es una colección vacía, todos los atributos escalares de la dataclass se integran al contexto de optimización. Si se pasa un atributo que no existe en la dataclass, la función lo ignora y se genera un error.
-
-Puede pasar un *contextType* para especificar si el contexto es un contexto estándar o el contexto del elemento actual de la selección de entidades mostrada en un list box:
-
-- Si el valor es "main" (por defecto), *contextName* designa un contexto estándar.
-- Si su valor es "currentItem", los atributos pasados se ponen en el contexto del elemento actual. Ver [List box basado en una entity selection](../ORDA/client-server-optimization.md#entity-selection-based-list-box).
-
-En *pageLength*, especifique el número de entidades de dataclass a solicitar al servidor.
-
-Puede pasar un *pageLength* para un atributo relacional que es una selección de entidades (de una a muchas). La sintaxis es `relationAttributeName:pageLength` (por ejemplo, empleados:20).
-
-#### Ejemplo 1
-
-```4d
-var $ds : 4D.DataStoreImplementation
-var $persons : cs.PersonsSelection
-var $p : cs.PersonsEntity
-var $contextA : Object
-var $info : Object
-var $text : Text
-
-// Abrir datastore remoto
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-// Definir el contexto
-$contextA:=New object("context"; "contextA")
-$ds.setRemoteContextInfo("contextA"; $ds.Persons; "firstname, lastname")
-
-// Envía las peticiones al servidor utilizando un bucle
-$persons:=$ds.Persons.all($contextA)
-$text:=""
-For each ($p; $persons)
- $text:=$p.firstname + " " + $p.lastname
-End for each
-
-// Verificar el contenido del contexto
-$info:=$ds.getRemoteContextInfo("contextA")
-// $info = {name:"contextA";dataclass:"Persons";main:"firstname, lastname"}
-```
-
-> Este ejemplo sirve como demostración, no está pensado para una implementación real.
-
-#### Ejemplo 2
-
-El siguiente fragmento de código solicita al servidor páginas de 30 entidades de la dataclass `Address`. Las entidades devueltas sólo contienen el atributo `zipCode`.
-
-Por cada entidad `Address` se devuelven 20 entidades Persons, que sólo contienen los atributos `lastname` y `firstname`:
-
-```4d
-var $ds : 4D.DataStoreImplementation
-
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-$ds.setRemoteContextInfo("contextA"; $ds.Address; "zipCode, persons:20,\
-persons.lastname, persons.firstname"; "main"; 30)
-```
-
-#### Ejemplo 3 - Listbox
-
-```4d
-// When the form loads
-Case of
- : (Form event code=On Load)
-
- Form.ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
- // Set the attributes of the page context
- Form.ds.setRemoteContextInfo("LB"; Form.ds.Persons; "age, gender,\
- children"; "currentItem")
-
- Form.settings:=New object("context"; "LB")
- Form.persons:=Form.ds.Persons.all(Form.settings)
- // Form.persons is displayed in a list box
-End case
-
-// When you get the attributes in the context of the current item: Form.currentItemLearntAttributes:=Form.selectedPerson.getRemoteContextAttributes()
-// Form.currentItemLearntAttributes = "age, gender, children"
-```
-
-#### Ver también
-
-[.getRemoteContextInfo()](#getremotecontextinfo) [.getAllRemoteContexts()](#getallremotecontexts) [.clearAllRemoteContexts()](#clearallremotecontexts)
-
-
-
-## .startRequestLog()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------------------------- |
-| 20 | Soporte del lado del servidor, nuevo parámetro `options` |
-| 17 R6 | Añadidos |
-
-
-
-**.startRequestLog**() **.startRequestLog**( *file* : 4D.File ) **.startRequestLog**( *file* : 4D.File ; *options* : Integer ) **.startRequestLog**( *reqNum* : Integer )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ----------------------- | -- | ---------------------------------------------------------------------------------- |
-| file | 4D.File | -> | Objeto File |
-| options | Integer | -> | Opción de registro de respuesta (servidor únicamente) |
-| reqNum | Integer | -> | Número de peticiones a mantener en memoria (cliente únicamente) |
-
-
-
-#### Descripción
-
-La función `.startRequestLog()` inicia el registro de peticiones ORDA del lado del cliente o del lado del servidor. Está diseñado para fines de depuración en configuraciones cliente/servidor.
-
-:::info
-
-Para una descripción del formato del registro de peticiones ORDA, por favor consulte la sección [**Peticiones ORDA**](../Debugging/debugLogFiles.md#orda-requests).
-
-:::
-
-#### Del lado del cliente
-
-Para crear un registro de peticiones ORDA del lado del cliente, llame a esta función en una máquina remota. El registro puede enviarse a un archivo o a la memoria, según el tipo de parámetro:
-
-- Si se pasa un objeto *file* creado con el comando `File`, los datos de registro se escriben en este archivo como una colección de objetos (formato JSON). Cada objeto representa una petición. Si el archivo no existe ya, se crea. En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él.
- En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él.
- Si se llama a `.startRequestLog()` con un archivo mientras se inició previamente un registro en memoria, el registro en memoria se detiene y se vacía.
-
-> Debe añadirse manualmente un carácter \N al final del archivo para realizar una validación JSON
-
-- Si se pasa un entero *reqNum*, se vacía el registro en memoria (si lo hay) y se inicializa un nuevo registro. Mantendrá *reqNum* en memoria las peticiones hasta que se alcance el número, en cuyo caso se vacían las entradas más antiguas (pila FIFO). Si se llama a `.startRequestLog()` con un *reqNum* mientras se ha iniciado previamente un registro en un archivo, se detiene el registro en el archivo.
-
-- Si no ha pasado ningún parámetro, el registro se inicia en la memoria. Si `.startRequestLog()` fue llamado previamente con un *reqNum* (antes de una `.stopRequestLog()`), los datos del registro se apilan en memoria hasta la próxima vez que se vacíe el registro o se llame a `.stopRequestLog()`.
-
-#### Del lado del servidor
-
-Para crear un registro de peticiones ORDA del lado del servidor, llame a esta función en la máquina servidor. Para crear un registro de peticiones ORDA del lado del servidor, llame a esta función en la máquina servidor. Cada objeto representa una petición. Si el archivo no existe, se crea. En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él.
-
-- Si ha pasado el parámetro *file*, los datos de registro se escriben en este archivo, en la ubicación solicitada. - Si omite el parámetro *file* o si es null, los datos del registro se escriben en un archivo llamado *ordaRequests.jsonl* y se almacenan en la carpeta "/LOGS".
-- El parámetro *options* puede utilizarse para especificar si la respuesta del servidor debe registrarse y si debe incluir el cuerpo. Por defecto, cuando se omite el parámetro, se registra la respuesta completa. En este parámetro se pueden utilizar las siguientes constantes:
-
-| Constante | Descripción |
-| ----------------------------- | -------------------------------------------------------------------------- |
-| srl log all | Registrar la respuesta por completo (valor por defecto) |
-| srl log no response | Desactivar el registro de la respuesta |
-| srl log response without body | Registrar la respuesta sin el cuerpo |
-
-#### Ejemplo 1
-
-Desea registrar las solicitudes de los clientes ORDA en un archivo y utilizar el número de secuencia del registro:
-
-```4d
- var $file : 4D.File
- var $e : cs.PersonsEntity
-
- $file:=File("/LOGS/ORDARequests.txt") //logs folder
-
- SET DATABASE PARAMETER(Client Log Recording;1) //para activar el número de secuencia log global
- ds.startRequestLog($file)
- $e:=ds.Persons.get(30001) //send a request
- ds.stopRequestLog()
- SET DATABASE PARAMETER(Client Log Recording;0)
-```
-
-#### Ejemplo 2
-
-Quiere registrar las peticiones de los clientes ORDA en la memoria:
-
-```4d
- var $es : cs.PersonsSelection
- var $log : Collection
-
- ds.startRequestLog(3) //mantener 3 peticiones en memoria
-
- $es:=ds.Persons.query("name=:1";"Marie")
- $es:=ds.Persons.query("name IN :1";New collection("Marie"))
- $es:=ds.Persons.query("name=:1";"So@")
-
- $log:=ds.getRequestLog()
- ALERT("The longest request lasted: "+String($log.max("duration"))+" ms")
-```
-
-#### Ejemplo 3
-
-Desea registrar las peticiones del servidor ORDA en un archivo específico y habilitar el número de secuencia de registro y la duración:
-
-```4d
-SET DATABASE PARAMETER(4D Server Log Recording;1)
-
-$file:=Folder(fk logs folder).file("myOrdaLog.jsonl")
-ds.startRequestLog($file)
-...
-ds.stopRequestLog()
-SET DATABASE PARAMETER(4D Server Log Recording;0)
-
-
-```
-
-
-
-
-
-## .startTransaction()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 | Añadidos |
-
-
-
-**.startTransaction()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.startTransaction()` inicia una transacción en el proceso actual en la base de datos que coincide con el datastore al que se aplica. Todos los cambios realizados en las entidades del almacén de datos en el proceso de la transacción se almacenan temporalmente hasta que la transacción se valida o se cancela.
-
-> Si se llama a este método en el almacén de datos principal (es decir, el almacén de datos devuelto por el comando `ds`), la transacción se aplica a todas las operaciones realizadas en el almacén de datos principal y en la base de datos subyacente, incluyendo por tanto ORDA y los lenguajes clásicos.
-
-Puede anidar varias transacciones (subtransacciones). Cada transacción o sub-transacción debe ser eventualmente cancelada o validada. Note que si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente mediante la función `.validateTransaction()`.
-
-#### Ejemplo
-
-```4d
- var $connect; $status : Object
- var $person : cs.PersonsEntity
- var $ds : 4D.DataStoreImplementation
- var $choice : Text
- var $error : Boolean
-
- Case of
- :($choice="local")
- $ds:=ds
- :($choice="remote")
- $connect:=New object("hostname";"111.222.3.4:8044")
- $ds:=Open datastore($connect;"myRemoteDS")
- End case
-
- $ds.startTransaction()
- $person:=$ds.Persons.query("lastname=:1";"Peters").first()
-
- If($person#Null)
- $person.lastname:="Smith"
- $status:=$person.save()
- End if
- ...
- ...
- If($error)
- $ds.cancelTransaction()
- Else
- $ds.validateTransaction()
- End if
-```
-
-
-
-
-
-## .stopRequestLog()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------- |
-| 20 | Soporte del lado del servidor |
-| 17 R6 | Añadidos |
-
-
-
-**.stopRequestLog()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | - | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.stopRequestLog()` detiene cualquier registro de las peticiones ORDA en la máquina en la que se llama (cliente o servidor).
-
-En realidad, cierra el documento abierto en el disco. Del lado del cliente, si el registro se inició en memoria, se detiene.
-
-Esta función no hace nada si el registro de peticiones ORDA no se inició en la máquina.
-
-#### Ejemplo
-
-Ver ejemplos para [`.startRequestLog()`](#startrequestlog).
-
-
-
-## .unlock()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 | Añadidos |
-
-
-
-**.unlock()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | - | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.unlock()` elimina el bloqueo actual de las operaciones de escritura en el datastore, si se ha definido en el mismo proceso. Las operaciones de escritura pueden bloquearse en el almacén de datos local mediante la función [`.flushAndLock()`](#flushandlock).
-
-Si el bloqueo actual era el único bloqueo en el datastore, las operaciones de escritura se activan inmediatamente. Si la función `.flushAndLock()` fue llamada varias veces en el proceso, el mismo número de `.unlock()` debe ser llamado para realmente desbloquear el datastore.
-
-La función `.unlock()` debe ser llamada desde el proceso que llamó a la correspondiente `.flushAndLock()`, de lo contrario la función no hace nada y el bloqueo no se elimina.
-
-Si se llama a la función `.unlock()` en un datastore desbloqueado, no hace nada.
-
-#### Ver también
-
-[.flushAndLock()](#flushandlock) [.locked()](#locked)
-
-
-
-## .validateTransaction()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 | Añadidos |
-
-
-
-**.validateTransaction()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | - | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.validateTransaction()` acepta la transacción que se inició con [`.startTransaction()`](#starttransaction) en el nivel correspondiente en el datastore especificado.
-
-La función guarda los cambios en los datos del almacén de datos que se produjeron durante la transacción.
-
-Puede anidar varias transacciones (subtransacciones). Si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente utilizando esta función.
-
-#### Ejemplo
-
-Ver el ejemplo de la función [`.startTransaction()`](#starttransaction).
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/EntityClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/EntityClass.md
deleted file mode 100644
index 23b4b0ff90dafe..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/EntityClass.md
+++ /dev/null
@@ -1,1825 +0,0 @@
----
-id: EntityClass
-title: Entity
----
-
-Una [entidad](ORDA/dsMapping.md#entity) es una instancia de una [Dataclass](ORDA/dsMapping.md#dataclass), como un registro de la tabla que coincide con la dataclass en su datastore asociado. Contiene los mismos atributos que la clase de datos, así como los valores de los datos y las propiedades y funciones específicas.
-
-### Resumen
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#attributename) |
-| [](#clone) |
-| [](#diff) |
-| [](#drop) |
-| [](#first) |
-| [](#fromobject) |
-| [](#getdataclass) |
-| [](#getkey) |
-| [](#getremotecontextattributes) |
-| [](#getselection) |
-| [](#getstamp) |
-| [](#indexof) |
-| [](#isnew) |
-| [](#last) |
-| [](#lock) |
-| [](#next) |
-| [](#previous) |
-| [](#reload) |
-| [](#save) |
-| [](#toobject) |
-| [](#touched) |
-| [](#touchedattributes) |
-| [](#unlock) |
-
-
-
-## .*attributeName*
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-***.attributeName*** : any
-
-#### Descripción
-
-Todo atributo de la dataclass está disponible como una propiedad de una entidad, que almacena el valor del atributo para la entidad.
-
-> Los atributos dataclass también se pueden alcanzar utilizando la sintaxis alternativa con \[ ].
-
-El tipo de valor del atributo depende del tipo [kind](DataClassClass.md#attributename) (relation o storage):
-
-- Si el tipo de *attributeName* es **storage**:
- `.attributeName` devuelve un valor del mismo tipo que *attributeName*.
-- Si el tipo de *attributeName* es **relatedEntity**:
- `.attributeName` devuelve la entidad relacionada. Los valores de la entidad relacionada están disponibles directamente a través de las propiedades en cascada, por ejemplo "myEntity.employer.employees\[0].lastname".
-- Si el tipo *attributeName* es **relatedEnties**:
- `.attributeName` devuelve una nueva selección de entidades relacionadas. Se eliminan los duplicados (se devuelve una entity selection desordenada).
-
-#### Ejemplo
-
-```4d
- var $myEntity : cs.EmployeeEntity
- $myEntity:=ds.Employee.new() //Crear una nueva entidad
- $myEntity.name:="Dupont" // asignar 'Dupont' al atributo 'name'
- $myEntity.firstname:="John" //asignar 'John' al atributo 'firstname'
- $myEntity.save() //guardar la entidad
-```
-
-
-
-
-
-## .clone()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.clone()** : 4D.Entity
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------- | :-------------------------: | --------------------------------------------- |
-| Resultado | 4D.Entity | <- | Nueva entidad que hace referencia al registro |
-
-
-
-#### Descripción
-
-La función `.clone()` crea en la memoria una nueva entidad que hace referencia al mismo registro que la entidad original.
-
-Esta función permite actualizar las entidades por separado. Sin embargo, tenga en cuenta que, por razones de rendimiento, la nueva entidad comparte la misma referencia de atributos de objeto que la entidad clonada.
-
-> Tenga en cuenta que toda modificación realizada a las entidades se guardará en el registro referenciado sólo cuando se ejecute la función [`.save()`](#save).
-
-Esta función sólo puede utilizarse con entidades ya guardadas en la base de datos. No se puede llamar a una entidad recién creada (para la que [`isNew()`](#isnew) devuelve **True**).
-
-#### Ejemplo 1
-
-```4d
- var $emp; $empCloned : cs.EmployeeEntity
- $emp:=ds.Employee.get(672)
- $empCloned:=$emp.clone()
-
- $emp.lastName:="Smith" //Las actualizaciones realizadas en $emp no se realizan en $empCloned
-
-```
-
-#### Ejemplo 2
-
-Si no desea que la nueva entidad comparta referencias de atributos de tipo objeto, debe copiarlas.
-
-```4d
- var $emp; $empCloned : cs.EmployeeEntity
- $emp:=ds.Employee.all().first()
- $empCloned:=$emp.clone()
- $empCloned.objectAtt:=OB Copy($emp.objectAtt)
-```
-
-
-
-
-
-## .diff()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.diff**( *entityToCompare* : 4D.Entity { ; *attributesToCompare* : Collection } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------------- | ------------------------- | :-------------------------: | ------------------------------------------ |
-| entityToCompare | 4D.Entity | -> | Entidad a comparar con la entidad original |
-| attributesToCompare | Collection | -> | Nombre de los atributos a comparar |
-| Resultado | Collection | <- | Diferencias entre las entidades |
-
-
-
-#### Descripción
-
-La función `.diff()` compara el contenido de dos entidades y devuelve sus diferencias.
-
-En *entityToCompare*, pase la entidad que se va a comparar con la entidad original.
-
-En *attributesToCompare*, puede designar atributos específicos a comparar. Si se suministra, la comparación se realiza sólo en los atributos especificados. Si no se suministra, se devuelven todas las diferencias entre las entidades.
-
-Las diferencias se devuelven como una colección de objetos cuyas propiedades son:
-
-| Nombre de propiedad | Tipo | Descripción |
-| ------------------- | ----------------------------------------- | --------------------------------------- |
-| attributeName | Text | Nombre del atributo |
-| value | cualquiera - Depende del tipo de atributo | Valor del atributo en la entidad |
-| otherValue | cualquiera - Depende del tipo de atributo | Valor del atributo en *entityToCompare* |
-
-Sólo se incluyen en la colección los atributos con valores diferentes. Si no se encuentran diferencias, `.diff()` devuelve una colección vacía.
-
-La función se aplica a las propiedades cuyo [kind](DataClassClass.md#attributename) es **storage** o **relatedEntity**. En caso de que se haya actualizado una entidad relacionada (es decir, la llave foránea), el nombre de la entidad relacionada y su nombre de llave primaria se devuelven como propiedades *attributeName* (*value* y *otherValue* están vacíos para el nombre de la entidad relacionada).
-
-Si una de las entidades comparadas es **Null**, se produce un error.
-
-#### Ejemplo 1
-
-```4d
- var $diff1; $diff2 : Collection
- employee:=ds.Employee.query("ID=1001").first()
- $clone:=employee.clone()
- employee.firstName:="MARIE"
- employee.lastName:="SOPHIE"
- employee.salary:=500
- $diff1:=$clone.diff(employee) // Se devuelven todas las diferencias
- $diff2:=$clone.diff(employee;New collection("firstName"; "lastName"))
- // Sólo se devuelven las diferencias en firstName y lastName
-```
-
-$diff1:
-
-```4d
-[
- {
- "attributeName": "firstName",
- "value": "Natasha",
- "otherValue": "MARIE"
- },
- {
- "attributeName": "lastName",
- "value": "Locke",
- "otherValue": "SOPHIE"
- },
- {
- "attributeName": "salary",
- "value": 66600,
- "otherValue": 500
- }
-]
-$diff2:
-
-[
- {
- "attributeName": "firstName",
- "value": "Natasha",
- "otherValue": "MARIE"
- },
- {
- "attributeName": "lastName",
- "value": "Locke",
- "otherValue": "SOPHIE"
- }
-]
-```
-
-#### Ejemplo 2
-
-```4d
- var vCompareResult1; vCompareResult2; vCompareResult3; $attributesToInspect : Collection
- vCompareResult1:=New collection
- vCompareResult2:=New collection
- vCompareResult3:=New collection
- $attributesToInspect:=New collection
-
- $e1:=ds.Employee.get(636)
- $e2:=ds.Employee.get(636)
-
- $e1.firstName:=$e1.firstName+" update"
- $e1.lastName:=$e1.lastName+" update"
-
- $c:=ds.Company.get(117)
- $e1.employer:=$c
- $e2.salary:=100
-
- $attributesToInspect.push("firstName")
- $attributesToInspect.push("lastName")
-
- vCompareResult1:=$e1.diff($e2)
- vCompareResult2:=$e1.diff($e2;$attributesToInspect)
- vCompareResult3:=$e1.diff($e2;$e1.touchedAttributes())
-```
-
-vCompareResult3 (sólo se devuelven las diferencias en atributos tocados $e1)
-
-```4d
-[
- {
- "attributeName": "firstName",
- "value": "Karla update",
- "otherValue": "Karla"
- },
- {
- "attributeName": "lastName",
- "value": "Marrero update",
- "otherValue": "Marrero"
- },
- {
- "attributeName": "salary",
- "value": 33500,
- "otherValue": 100
- },
- {
- "attributeName": "employerID",
- "value": 117,
- "otherValue": 118
- },
- {
- "attributeName": "employer",
- "value": "[object Entity]",// Entity 117 from Company
- "otherValue": "[object Entity]"// Entity 118 from Company
- }
-]
-```
-
-vCompareResult2 (sólo se devuelven las diferencias en $attributesToInspect)
-
-```4d
-[
- {
- "attributeName": "firstName",
- "value": "Karla update",
- "otherValue": "Karla"
- },
- {
- "attributeName": "lastName",
- "value": "Marrero update",
- "otherValue": "Marrero"
- }
-]
-```
-
-vCompareResult1 (se devuelven todas las diferencias):
-
-```4d
-[
- {
- "attributeName": "firstName",
- "value": "Karla update",
- "otherValue": "Karla"
- },
- {
- "attributeName": "lastName",
- "value": "Marrero update",
- "otherValue": "Marrero"
- },
- {
- "attributeName": "employerID",
- "value": 117,
- "otherValue": 118
- },
- {
- "attributeName": "employer",
- "value": "[object Entity]",// Entity 117 from Company
- "otherValue": "[object Entity]"// Entity 118 from Company
-
- }
-]
-```
-
-
-
-
-
-## .drop()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.drop**( {*mode* : Integer} ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | -------------------------------------------------------------------------------------------------- |
-| mode | Integer | -> | `dk force drop if stamp changed`: activa el soltar incluso si el sello ha cambiado |
-| Resultado | Object | <- | Resultado de la operación soltar |
-
-
-
-#### Descripción
-
-La función `.drop()` elimina los datos contenidos en la entidad desde el almacén de datos, desde la tabla relacionada con su Dataclass. Tenga en cuenta que la entidad permanece en la memoria.
-
-En una aplicación multiusuario o multiproceso, la función `.drop()` se ejecuta bajo un mecanismo ["bloqueo optimista"](ORDA/entities.md#entity-locking), en el que un sello de bloqueo interno se incrementa automáticamente cada vez que se guarda el registro.
-
-Por defecto, si se omite el parámetro *mode*, la función devolverá un error (ver más abajo) si la misma entidad fue modificada (es decir, el sello ha cambiado) por otro proceso o usuario en el ínterin.
-
-De lo contrario, puede pasar la opción `dk force drop if stamp changed` en el parámetro *mode*: en este caso, la entidad se elimina incluso si el marcador ha cambiado (y la llave primaria sigue siendo la misma).
-
-**Resultado**
-
-El objeto devuelto por `.drop()` contiene las siguientes propiedades:
-
-| Propiedad | | Tipo | Descripción |
-| --------------------------------- | ----------------------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| success | | boolean | true si la acción de soltar tiene éxito, false en caso contrario. |
-| | | | ***Disponible sólo en caso de error:*** |
-| status(\*) | | number | Código de error, ver abajo |
-| statusText(\*) | | text | Descripción del error, ver abajo |
-| | | | ***Disponible sólo en caso de error de bloqueo pesimista:*** |
-| LockKindText | | text | "Locked by record" |
-| lockInfo | | object | Información sobre el origen del bloqueo |
-| | task_id | number | Id del proceso |
-| | user_name | text | Nombre de usuario de la sesión en la máquina |
-| | user4d_alias | text | Alias usuario si está definido por `SET USER ALIAS`, si no, nombre de usuario en el directorio 4D |
-| | host_name | text | Nombre de la máquina |
-| | task_name | text | Nombre del proceso |
-| | client_version | text | |
-| | | | ***Disponible sólo en caso de error grave (un error grave puede ser intentar duplicar una llave primaria, disco lleno...):*** |
-| errors | | collection of objects | |
-| | message | text | Mensaje de error |
-| | component signature | text | firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) |
-| | errCode | number | Código de error |
-
-(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
-
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). Cuando se utiliza entity.drop( ), este error puede ser devuelto cuando se utiliza la opción dk force drop if stamp changed. Cuando se utiliza entity.lock(), se puede devolver este error cuando la opción dk reload if stamp changed es utilizada
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
-| `dk status stamp has changed` | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
con `.save()`: error solo si no se utiliza la opción `dk auto merge`
con `.drop()`: error solo si no se utiliza la opción `dk force drop if stamp changed`
con `.lock()`: error solo si no se utiliza la opción `dk reload if stamp changed`
**Estado asociado**: "Stamp has changed"
|
-| `dk status wrong permission` | 1 | Los privilegios actuales no permiten suprimir la entidad. **Associated statusText**: "Permission Error" |
-
-#### Ejemplo 1
-
-Ejemplo sin la opción `dk force drop if stamp changed`:
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee : cs.EmployeeEntity
- var $status : Object
- $employees:=ds.Employee.query("lastName=:1";"Smith")
- $employee:=$employees.first()
- $status:=$employee.drop()
- Case of
- :($status.success)
- ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //La entidad soltada permanece en la memoria
- :($status.status=dk status stamp has changed)
- ALERT($status.statusText)
- End case
-```
-
-#### Ejemplo 2
-
-Ejemplo con la opción `dk force drop if stamp changed`:
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee : cs.EmployeeEntity
- var $status : Object
- $employees:=ds.Employee.query("lastName=:1";"Smith")
- $employee:=$employees.first()
- $status:=$employee.drop(dk force drop if stamp changed)
- Case of
- :($status.success)
- ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //La entidad soltada permanece en la memoria
- :($status.status=dk status entity does not exist anymore)
- ALERT($status.statusText)
- End case
-```
-
-
-
-
-
-## .first()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.first()**: 4D.Entity
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------- | :-------------------------: | ---------------------------------------------------------------------------------------------------------- |
-| Resultado | 4D.Entity | <- | Referencia a la primera entidad de una selección de entidades (Null si no se encuentra) |
-
-
-
-#### Descripción
-
-La función `.first()` devuelve una referencia a la entidad en primera posición de la selección de entidades a la que pertenece la entidad.
-
-Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection( )](#getselection) devuelve Null), la función devuelve un valor Null.
-
-#### Ejemplo
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee; $firstEmployee : cs.EmployeeEntity
- $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
- $employee:=$employees[2]
- $firstEmployee:=$employee.first() //$firstEmployee es la primera entidad de la selección de entidades $employees
-```
-
-
-
-
-
-## .fromObject()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.fromObject**( *filler* : Object )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-: | -------------------------------------------- |
-| filler | Object | -> | Objeto a partir del cual se llena la entidad |
-
-
-
-#### Descripción
-
-La función `.fromObject()` llena una entidad con el contenido de *filler*.
-
-> Esta función modifica la entidad original.
-
-El mapeo entre el objeto y la entidad se realiza sobre los nombres de los atributos:
-
-- Si una propiedad del objeto no existe en la dataclass, se ignora.
-- Los tipos de datos deben ser equivalentes. Si hay una diferencia de tipo entre el objeto y la dataclass, 4D intenta convertir los datos siempre que sea posible (ver [`Convertir tipos de datos`](Concepts/data-types.md#converting-data-types)), de lo contrario el atributo se deja sin tocar.
-- La llave primaria puede darse tal cual o con una propiedad "__KEY" (llenada con el valor de la llave primaria). La llave primaria puede darse tal cual o con una propiedad "__KEY" (llenada con el valor de la llave primaria). Si no se da la llave primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas de la base de datos. El autoincremento sólo se calcula si la llave primaria es nula.
-
-*filler* puede manejar una entidad relacionada bajo las siguientes condiciones:
-
-- *filler* contiene la propia llave foránea, o
-- *filler* contiene un objeto de propiedad con el mismo nombre que la entidad relacionada, que contiene una única propiedad denominada "\_\_KEY".
-- si la entidad relacionada no existe, se ignora.
-
-#### Ejemplo
-
-Con el siguiente objeto $o:
-
-```4d
-{
- "firstName": "Mary",
- "lastName": "Smith",
- "salary": 36500,
- "birthDate": "1958-10-27T00:00:00.000Z",
- "woman": true,
- "managerID": 411,// relatedEntity dada con PK
- "employerID": 20 // relatedEntity dada con PK
-}
-```
-
-El siguiente código creará una entidad con entidades relacionadas con el gerente y el empleador.
-
-```4d
- var $o : Object
- var $entity : cs.EmpEntity
- $entity:=ds.Emp.new()
- $entity.fromObject($o)
- $entity.save()
-```
-
-También puede utilizar una entidad relacionada dada como objeto:
-
-```4d
-
-{
- "firstName": "Marie",
- "lastName": "Lechat",
- "salary": 68400,
- "birthDate": "1971-09-03T00:00:00.000Z",
- "woman": false,
- "employer": {// relatedEntity dada como un objeto
- "__KEY": "21"
- },
- "manager": {// relatedEntity dada como un objeto
- "__KEY": "411"
- }
-}
-```
-
-
-
-
-
-## .getDataClass()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.getDataClass()** : 4D.DataClass
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------- | :-------------------------: | -------------------------------------------- |
-| Resultado | 4D.DataClass | <- | Objeto DataClass al que pertenece la entidad |
-
-
-
-#### Descripción
-
-La función `.getDataClass()` devuelve la dataclass de la entidad. .
-
-#### Ejemplo
-
-El siguiente código genérico duplica cualquier entidad:
-
-```4d
- //método duplicate_entity
- //duplicate_entity($entity)
-
- #DECLARE($entity : 4D.Entity)
- var $entityNew : 4D.Entity
- var $status : Object
-
- $entityNew:=$entity.getDataClass().new() //crea una nueva entidad en la dataclass padre
- $entityNew.fromObject($entity.toObject()) //obtiene todos los atributos
- $entityNew[$entity.getDataClass().getInfo().primaryKey]:=Null //restablece la llave primaria
- $status:=$entityNew.save() //guarda la entidad duplicada
-```
-
-
-
-
-
-## .getKey()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.getKey**( { *mode* : Integer } ) : any
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------- |
-| mode | Integer | -> | `dk key as string`: la llave primaria se devuelve como una cadena, sin importar el tipo de llave primaria |
-| Resultado | any | <- | Valor de la llave primaria de la entidad (Integer or Text) |
-
-
-
-#### Descripción
-
-La función `.getKey()` devuelve el valor de la llave primaria.
-
-Las llaves primarias pueden ser números (enteros) o cadenas. Puede "forzar" que el valor de la llave primaria devuelto sea una cadena, sin importar el tipo de llave primaria real, pasando la opción `dk key as string` en el parámetro *mode*.
-
-#### Ejemplo
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee : cs.EmployeeEntity
- $employees:=ds.Employee.query("lastName=:1";"Smith")
- $employee:=$employees[0]
- ALERT("The primary key is "+$employee.getKey(dk key as string))
-```
-
-
-
-## .getRemoteContextAttributes()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19R5 | Añadidos |
-
-
-
-**.getRemoteContextAttributes()** : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | --------------------------- | --------------------------------------------------------------------- |
-| resultado | Text | <- | Atributos de contexto vinculados a la entidad, separados por una coma |
-
-
-
-> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
-
-#### Descripción
-
-La función `.getRemoteContextAttributes()` devuelve información sobre el contexto de optimización utilizado por la entidad .
-
-Si no hay un [contexto de optimización](../ORDA/client-server-optimization.md) para la entidad, la función devuelve un texto vacío.
-
-#### Ejemplo
-
-```4d
-var $ds : 4D.DataStoreImplementation
-var $address : cs.AddressEntity
-var $p : cs.PersonsEntity
-var $contextA : Object
-var $info : Text
-var $text : Text
-
-$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
-
-$contextA:=New object("context"; "contextA")
-
-$address:=$ds.Address.get(1; $contextA)
-$text:=""
-For each ($p; $address.persons)
- $text:=$p.firstname+" "+$p.lastname
-End for each
-
-$info:=$address.getRemoteContextAttributes()
-
-//$info = "persons,persons.lastname,persons.firstname"
-```
-
-#### Ver también
-
-[EntitySelection.getRemoteContextAttributes()](./EntitySelectionClass.md#getremotecontextattributes) [.clearAllRemoteContexts()](./DataStoreClass.md#clearallremotecontexts) [.getRemoteContextInfo()](./DataStoreClass.md#getremotecontextinfo) [.getAllRemoteContexts()](./DataStoreClass.md#getallremotecontexts) [.setRemoteContextInfo()](./DataStoreClass.md#setremotecontextinfo)
-
-
-
-## .getSelection()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.getSelection()**: 4D.EntitySelection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------------- | :-------------------------: | ------------------------------------------------------------------------------------------- |
-| Resultado | 4D.EntitySelection | <- | Entity selection a la que pertenece la entidad (nula si no se encuentra) |
-
-
-
-#### Descripción
-
-La función `.getSelection()` devuelve la selección de entidades a la que pertenece la entidad.
-
-Si la entidad no pertenece a una selección de entidades, la función devuelve Null.
-
-#### Ejemplo
-
-```4d
- var $emp : cs.EmployeeEntity
- var $employees; $employees2 : cs.EmployeeSelection
- $emp:=ds.Employee.get(672) // Esta entidad no pertenece a ninguna selección de entidades
- $employees:=$emp.getSelection() // $employees es Null
-
- $employees2:=ds.Employee.query("lastName=:1";"Smith") //Esta selección de entidades contiene 6 entidades
- $emp:=$employees2[0] // Esta entidad pertenece a una selección de entidades
-
- ALERT("La entity selection contiene "+String($emp.getSelection().length)+" entidades")
-```
-
-
-
-
-
-## .getStamp()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.getStamp()** : Integer
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ---------------------------------------------------------------------------- |
-| Resultado | Integer | <- | Sello de la entidad (0 si la entidad acaba de ser creada) |
-
-
-
-#### Descripción
-
-La función `.getStamp()` devuelve el valor actual del sello de la entidad.
-
-El sello interno se incrementa automáticamente en 4D cada vez que se guarda la entidad. Gestiona los accesos y modificaciones concurrentes de los usuarios a las mismas entidades (ver [**Bloqueo de entidades**](ORDA/entities.md#bloqueo-de-una-entidad)).
-
-> Para una entidad nueva (nunca guardada), la función devuelve 0. Para saber si una entidad acaba de ser creada, se recomienda utilizar [.isNew()](#isnew).
-
-#### Ejemplo
-
-```4d
- var $entity : cs.EmployeeEntity
- var $stamp : Integer
-
- $entity:=ds.Employee.new()
- $entity.lastname:="Smith"
- $entity.save()
- $stamp:=$entity.getStamp() //$stamp=1
-
- $entity.lastname:="Wesson"
- $entity.save()
- $stamp:=$entity.getStamp() //$stamp=2
-```
-
-
-
-
-
-## .indexOf()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.indexOf**( { *entitySelection* : 4D.EntitySelection } ) : Integer
-
-
-
-| Parámetros | Tipo | | Descripción |
-| --------------- | ---------------------------------- | :-------------------------: | ------------------------------------------------------------------------- |
-| entitySelection | 4D.EntitySelection | -> | La posición de la entidad se da en función de esta selección de entidades |
-| Resultado | Integer | <- | Posición de la entidad en una selección de entidades |
-
-
-
-#### Descripción
-
-La función `.indexOf()` devuelve la posición de la entidad en una entity selection.
-
-Por defecto, si se omite el parámetro *entitySelection*, la función devuelve la posición de la entidad dentro de su propia selección de entidades. En caso contrario, devuelve la posición de la entidad dentro de la *entitySelection* especificada.
-
-El valor resultante se incluye entre 0 y la longitud de la selección de entidades -1.
-
-- Si la entidad no tiene una selección de entidad o no pertenece a *entitySelection*, la función devuelve -1.
-- Si *entitySelection* es Null o no pertenece a la misma clase de datos que la entidad, se produce un error.
-
-#### Ejemplo
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee : cs.EmployeeEntity
- $employees:=ds.Employee.query("lastName = :1";"H@") //Esta entity selection contiene 3 entidades
- $employee:=$employees[1] //Esta entidad pertenece a una entity selection
- ALERT("El índice de la entidad en su propia selección de entidades es "+String($employee.indexOf())) //1
-
- $employee:=ds.Employee.get(725) //Esta entidad no pertenece a una selección de entidades
- ALERT("El índice de la entidad es "+String($employee.indexOf())) // -1
-```
-
-
-
-
-
-## .isNew()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.isNew()** : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------- |
-| Resultado | Boolean | <- | True si la entidad acaba de ser creada y aún no se ha guardado. En caso contrario, False. |
-
-
-
-#### Descripción
-
-La función `.isNew()` devuelve True si la entidad a la que se aplica acaba de ser creada y aún no ha sido guardada en el datastore. .
-
-#### Ejemplo
-
-```4d
- var $emp : cs.EmployeeEntity
-
- $emp:=ds.Employee.new()
-
- If($emp.isNew())
- ALERT("This is a new entity")
- End if
-```
-
-
-
-
-
-## .last()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.last()** : 4D.Entity
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------- | :-------------------------: | --------------------------------------------------------------------------------------------------------- |
-| Resultado | 4D.Entity | <- | Referencia a la última entidad de una selección de entidades (Null si no se encuentra) |
-
-
-
-#### Descripción
-
-La función `.last()` devuelve una referencia a la entidad en la última posición de la selección de entidades a la que pertenece la entidad.
-
-Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection( )](#getselection) devuelve Null), la función devuelve un valor Null.
-
-#### Ejemplo
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee; $lastEmployee : cs.EmployeeEntity
- $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
- $employee:=$employees[0]
- $lastEmployee:=$employee.last() //$lastEmployee es la última entidad de la selección de entidades $employees
-```
-
-
-
-
-
-## .lock()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.lock**( { *mode* : Integer } ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | --------------------------------------------------------------------------------------------------- |
-| mode | Integer | -> | `dk reload if stamp changed`: recargar antes de bloquear si el marcador ha cambiado |
-| Resultado | Object | <- | Resultado de la operación de bloqueo |
-
-
-
-#### Descripción
-
-La función `.lock()` pone un bloqueo pesimista en el registro referenciado por la entidad. El [bloqueo se establece](ORDA/entities.md#bloqueo-de-una-entidad) para un registro y todas las referencias de la entidad en el proceso actual.
-
-Otros procesos verán este registro como bloqueado (la propiedad `result.success` contendrá False si intentan bloquear la misma entidad usando esta función). Sólo las funciones ejecutadas en la sesión de "bloqueo" pueden editar y guardar los atributos de la entidad. La entidad puede ser cargada como de sólo lectura por otras sesiones, pero no podrán introducir y guardar valores.
-
-Un registro bloqueado por `.lock()` se desbloquea:
-
-- cuando la función [`unlock()`](#unlock) se llama en una entidad correspondiente en el mismo proceso
-- automáticamente, cuando ya no es referenciado por ninguna entidad en la memoria. Por ejemplo, si el bloqueo se pone sólo en una referencia local de una entidad, la entidad se desbloquea cuando la función termina. Mientras haya referencias a la entidad en la memoria, el registro permanece bloqueado.
-
-:::note Notas
-
-- [`unlock()`](#unlock) debe ser llamado tantas veces como `lock()` fue llamado en el mismo proceso para que la entidad sea realmente desbloqueada.
-- Una entidad también puede ser [bloqueada por una sesión REST](../REST/$lock.md), en cuyo caso solo puede ser desbloqueada por la sesión.
-
-:::
-
-Por defecto, si se omite el parámetro *mode*, la función devolverá un error (ver más abajo) si la misma entidad fue modificada (es decir, el sello ha cambiado) por otro proceso o usuario en el ínterin.
-
-De lo contrario, puede pasar la opción `dk reload if stamp changed` en el parámetro *mode*: en este caso, no se devuelve error y la entidad se recarga cuando el sello cambia (si la entidad aún existe y la llave primaria sigue siendo la misma).
-
-**Resultado**
-
-El objeto devuelto por `.lock()` contiene las siguientes propiedades:
-
-| Propiedad | | Tipo | Descripción |
-| --------------------------------- | ----------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| success | | boolean | true si la acción de bloqueo tiene éxito (o si la entidad ya está bloqueada en el proceso actual), false en caso contrario. |
-| | | | ***Disponible sólo si se utiliza la opción `dk reload if stamp changed`:*** |
-| **wasReloaded** | | boolean | true si la entidad fue recargada con éxito, false en caso contrario. |
-| | | | ***Disponible sólo en caso de error:*** |
-| status(\*) | | number | Código de error, ver abajo |
-| statusText(\*) | | text | Descripción del error, ver abajo |
-| | | | ***Disponible sólo en caso de error de bloqueo pesimista:*** |
-| lockKindText | | text | "Locked by record" si está bloqueado por un proceso 4D, "Locked by session" si está bloqueado por una sesión REST |
-| lockInfo | | object | Información sobre el origen del bloqueo. Las propiedades devueltas dependen del origen del bloqueo (proceso 4D o sesión REST). |
-| | | | ***Disponible sólo para un bloqueo por proceso 4D:*** |
-| | task_id | number | ID del Proceso |
-| | user_name | text | Nombre de usuario de la sesión en la máquina |
-| | user4d_alias | text | Nombre o alias del usuario 4D |
-| | user4d_id | number | ID del usuario en el directorio de la base de datos 4D |
-| | host_name | text | Nombre de la máquina |
-| | task_name | text | Nombre del proceso |
-| | client_version | text | Versión del cliente |
-| | | | ***Disponible sólo para un bloqueo por sesión REST:*** |
-| | host | text | URL que bloqueó la entidad (por ejemplo, "`www.myserver.com`") |
-| | IPAddr | text | Dirección IP del bloqueo (por ejemplo: "127.0.0.1") |
-| | userAgent | text | userAgent del origen del bloqueo (ej: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36") |
-| | | | ***Disponible sólo en caso de error crítico*** (llave primaria duplicada, disco lleno...): |
-| errors | | collection of objects | |
-| | message | text | Mensaje de error |
-| | component signature | text | firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) |
-| | errCode | number | Código de error |
-
-(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
-
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). Cuando se utiliza `.drop( )`, este error puede devolverse cuando se utiliza la opción `dk force drop if stamp changed`. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
-| `dk status stamp has changed` | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
con `.save()`: error solo si no se utiliza la opción `dk auto merge`
con `.drop()`: error solo si no se utiliza la opción `dk force drop if stamp changed`
con `.lock()`: error solo si no se utiliza la opción `dk reload if stamp changed`
**Estado asociado**: "Stamp has changed" |
-
-#### Ejemplo 1
-
-Ejemplo con error:
-
-```4d
- var $employee : cs.EmployeeEntity
- var $status : Object
- $employee:=ds.Employee.get(716)
- $status:=$employee.lock()
- Case of
- :($status.success)
- ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
- :($status.status=dk status stamp has changed)
- ALERT($status.statusText)
- End case
-```
-
-#### Ejemplo 2
-
-Ejemplo con la opción `dk reload if stamp changed`:
-
-```4d
- var $employee : cs.EmployeeEntity
- var $status : Object
- $employee:=ds.Employee.get(717)
- $status:=$employee.lock(dk reload if stamp changed)
- Case of
- :($status.success)
- ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
- :($status.status=dk status entity does not exist anymore)
- ALERT($status.statusText)
- End case
-```
-
-
-
-
-
-## .next()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.next()** : 4D.Entity
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------- | :-------------------------: | ----------------------------------------------------------------------------------------------------------- |
-| Resultado | 4D.Entity | <- | Referencia a la siguiente entidad en la selección de entidades (Null si no se encuentra) |
-
-
-
-#### Descripción
-
-La función `.next()` devuelve una referencia a la siguiente entidad en la selección de entidades a la que pertenece la entidad.
-
-Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection()](#getselection) devuelve Null), la función devuelve un valor Null.
-
-Si no hay una entidad siguiente válida en la selección de entidades (es decir, se encuentra en la última entidad de la selección), la función devuelve Null. Si la siguiente entidad ha sido descartada, la función devuelve la siguiente entidad válida (y eventualmente Null).
-
-#### Ejemplo
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee; $nextEmployee : cs.EmployeeEntity
- $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
- $employee:=$employees[0]
- $nextEmployee:=$employee.next() //$nextEmployee es la segunda entidad de entidad
-selection $employees
-
-```
-
-
-
-
-
-## .previous()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.previous()** : 4D.Entity
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------- | :-------------------------: | ---------------------------------------------------------------------------------------------------------- |
-| Resultado | 4D.Entity | <- | Referencia a la entidad anterior en la selección de entidades (Null si no se encuentra) |
-
-
-
-#### Descripción
-
-La función `.previous()` devuelve una referencia a la entidad anterior en la selección de entidades a la que pertenece la entidad.
-
-Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection()](#getselection) devuelve Null), la función devuelve un valor Null.
-
-Si no hay una entidad anterior válida en la selección de entidades (es decir, se encuentra en la primera entidad de la selección), la función devuelve Null. Si la entidad anterior ha sido soltada, la función devuelve la entidad válida anterior (y eventualmente Null).
-
-#### Ejemplo
-
-```4d
- var $employees : cs.EmployeeSelection
- var $employee; $previousEmployee : cs.EmployeeEntity
- $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
- $employee:=$employees[1]
- $previousEmployee:=$employee.previous() //$previousEmployee es la primera entidad de la selección de entidades $employees
-```
-
-
-
-
-
-## .reload()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.reload()** : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ------------- |
-| Resultado | Object | <- | Objeto estado |
-
-
-
-#### Descripción
-
-La función `.reload()` recarga el contenido de la entidad en memoria, según la información almacenada en la tabla relacionada con la dataclass en el datastore. La recarga se realiza sólo si la entidad sigue existiendo con la misma llave primaria.
-
-**Resultado**
-
-El objeto devuelto por `.reload( )` contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| --------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| success | boolean | True si la acción de recarga tiene éxito, False en caso contrario. ***Disponible sólo en caso de error***: |
-| status(\*) | number | Código de error, ver abajo |
-| statusText(\*) | text | Descripción del error, ver abajo |
-
-(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
-
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. ***statusText asociado***: "Other error" |
-
-#### Ejemplo
-
-```4d
- var $employee : cs.EmployeeEntity
- var $employees : cs.EmployeeSelection
- var $result : Object
-
- $employees:=ds.Employee.query("lastName=:1";"Hollis")
- $employee:=$employees[0]
- $employee.firstName:="Mary"
- $result:=$employee.reload()
- Case of
- :($result.success)
- ALERT("Reload has been done")
- :($result.status=dk status entity does not exist anymore)
- ALERT("The entity has been dropped")
- End case
-```
-
-
-
-
-
-## .save()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.save**( { *mode* : Integer } ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ----------------------------------------------------------------- |
-| mode | Integer | -> | `dk auto merge`: activa el modo "automatic merge" |
-| Resultado | Object | <- | Resultado de la operación guardar |
-
-
-
-#### Descripción
-
-La función `.save()` guarda los cambios realizados en la entidad en la tabla relacionada con su dataClass. Debe llamar a este método después de crear o modificar una entidad si quiere guardar los cambios realizados en ella.
-
-La operación de guardar se ejecuta sólo si se ha "tocado" al menos un atributo de la entidad (ver las funciones [`.touched()`](#touched) y [`.touchedAttributes()`](#touchedattributes)). En caso contrario, la función no hace nada (no se llama al activador).
-
-En una aplicación multiusuario o multiproceso, la función `.save()` se ejecuta con el mecanismo del ["bloqueo optimista"](ORDA/entities.md#entity-locking), en el que un contador interno (stamp) se incrementa automáticamente cada vez que se guarda el registro.
-
-Por defecto, si se omite el parámetro *mode*, el método devolverá un error (ver más abajo) siempre que la misma entidad haya sido modificada por otro proceso o usuario mientras tanto, sin importar el atributo o atributos modificados.
-
-En caso contrario, se puede pasar la opción `dk auto merge` en el parámetro *mode*: cuando el modo "automatic merge" está activado, una modificación realizada simultáneamente por otro proceso/usuario en la misma entidad pero en un atributo diferente no dará lugar a un error. Los datos resultantes guardados en la entidad serán la combinación (la "fusión") de todas las modificaciones no concurrentes (si se aplicaron modificaciones al mismo atributo, el guardado falla y se devuelve un error, incluso con el modo de fusión automática).
-
-> El modo de fusión automática no está disponible para los atributos de tipo Imagen, Objeto y Texto cuando se almacenan fuera del registro. Los cambios concurrentes en estos atributos darán lugar a un error `dk status stamp has changed`.
-
-**Resultado**
-
-El objeto devuelto por `.save()` contiene las siguientes propiedades:
-
-| Propiedad | | Tipo | Descripción |
-| ------------ | ----------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| success | | boolean | True si la acción guardar tiene éxito, false en caso contrario. |
-| | | | ***Disponible sólo si se utiliza la opción `dk auto merge`***: |
-| autoMerged | | boolean | True si se ha realizado una fusión automática, False en caso contrario. |
-| | | | ***Disponible sólo en caso de error***: |
-| status | | number | Código de error, [ver abajo](#status-and-statustext) |
-| statusText | | text | Descripción del error, [ver abajo](#status-and-statustext) |
-| | | | ***Disponible sólo en caso de error de bloqueo pesimista***: |
-| lockKindText | | text | "Locked by record" |
-| lockInfo | | object | Información sobre el origen del bloqueo |
-| | task_id | number | Id del proceso |
-| | user_name | text | Nombre de usuario de la sesión en la máquina |
-| | user4d_alias | text | Alias usuario si está definido por `SET USER ALIAS`, si no, nombre de usuario en el directorio 4D |
-| | host_name | text | Nombre de la máquina |
-| | task_name | text | Nombre del proceso |
-| | client_version | text | |
-| | | | ***Disponible sólo en caso de error crítico*** (error crítico - puede ser intentar duplicar una llave primaria, disco lleno...): |
-| errors | | collection of objects | |
-| | message | text | Mensaje de error |
-| | componentSignature | text | Firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) |
-| | errCode | number | Código de error |
-
-##### status y statusText
-
-Los siguientes valores pueden ser devueltos en las propiedades `status`y `statusText` del objeto Result en caso de error:
-
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `dk status automerge failed` | 6 | (Sólo si se utiliza la opción `dk auto merge`) La opción de fusión automática falló al guardar la entidad. **statusText asociado**: "Auto merge failed" |
-| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). the entity has been dropped and replaced by another one with another primary key (the stamp has changed and a new entity now uses the memory space). Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
-| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
-| `dk status serious error` | 4 | Un error grave es un error de base de datos de bajo nivel (por ejemplo, una llave duplicada), un error de hardware, etc. **statusText asociado**: "Other error" |
-| `dk status stamp has changed` | 2 | El valor del marcador interno de la entidad no coincide con el de la entidad almacenada en los datos (bloqueo optimista).
con `.save()`: error solo si no se utiliza la opción `dk auto merge`
con `.drop()`: error solo si no se utiliza la opción `dk force drop if stamp changed`
con `.lock()`: error solo si no se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Stamp has changed" |
-| `dk status wrong permission` | 1 | Los privilegios actuales no permiten guardar la entidad. **Associated statusText**: "Permission Error" |
-
-#### Ejemplo 1
-
-Crear una nueva entidad:
-
-```4d
- var $status : Object
- var $employee : cs.EmployeeEntity
- $employee:=ds.Employee.new()
- $employee.firstName:="Mary"
- $employee.lastName:="Smith"
- $status:=$employee.save()
- If($status.success)
- ALERT("Employee created")
- End if
-```
-
-#### Ejemplo 2
-
-Actualizando una entidad sin opción `dk auto merge`:
-
-```4d
- var $status : Object
- var $employee : cs.EmployeeEntity
- var $employees : cs.EmployeeSelection
- $employees:=ds.Employee.query("lastName=:1";"Smith")
- $employee:=$employees.first()
- $employee.lastName:="Mac Arthur"
- $status:=$employee.save()
- Case of
- :($status.success)
- ALERT("Employee updated")
- :($status.status=dk status stamp has changed)
- ALERT($status.statusText)
- End case
-```
-
-#### Ejemplo 3
-
-Actualización de una entidad con la opción `dk auto merge`:
-
-```4d
- var $status : Object
-
- var $employee : cs.EmployeeEntity
- var $employees : cs.EmployeeSelection
-
- $employees:=ds.Employee.query("lastName=:1";"Smith")
- $employee:=$employees.first()
- $employee.lastName:="Mac Arthur"
- $status:=$employee.save(dk auto merge)
- Case of
- :($status.success)
- ALERT("Employee updated")
- :($status.status=dk status automerge failed)
- ALERT($status.statusText)
- End case
-```
-
-
-
-
-
-## .toObject()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.toObject**() : Object **.toObject**( *filterString* : Text { ; *options* : Integer} ) : Object **.toObject**( *filterCol* : Collection { ; *options* : Integer } ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------ | ---------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| filterString | Text | -> | Atributo(s) a extraer (cadena separada por comas) |
-| filterCol | Collection | -> | Colección de atributos a extraer |
-| options | Integer | -> | `dk with primary key`: adds the \_\_KEY property; `dk with stamp`: adds the \_STAMP property |
-| Resultado | Object | <- | Objeto creado a partir de la entidad |
-
-
-
-#### Descripción
-
-La función `.toObject()` devuelve un objeto que ha sido construido a partir de la entidad. Los nombres de las propiedades en el objeto coinciden con los nombres de los atributos de la entidad.
-
-Si no se especifica ningún filtro, o si el parámetro *filterString* contiene una cadena vacía o "\*", el objeto devuelto contendrá:
-
-- todos los atributos de la entidad de almacenamiento
-- atributos de [kind](DataClassClass.md#attributename) `relatedEntity`: se obtiene una propiedad con el mismo nombre que la entidad relacionada (nombre del enlace muchos-a-uno). El atributo se extrae con la forma simple.
-- atributos de [kind](DataClassClass.md#attributename) `relatedEntities`: no se devuelve el atributo.
-
-En el primer parámetro, se pasa el atributo o atributos de la entidad a extraer. Puede pasar:
-
-- *filterString*: una cadena con rutas de propiedades separadas por comas: "propertyPath1, propertyPath2, ...", o
-- *filterCol*: una colección de cadenas: \["propertyPath1","propertyPath2";...]
-
-Si se especifica un filtro para los atributos cuyo [kind](DataClassClass.md#attributename) es relatedEntity:
-
-- propertyPath = "relatedEntity" -> se extrae de forma sencilla: un objeto con la propiedad \_\_KEY (llave primaria).
-- propertyPath = "relatedEntity.\*" -> se extraen todas las propiedades
-- propertyPath = "relatedEntity.propertyName1; relatedEntity.propertyName2; ..." -> sólo se extraen esas propiedades
-
-Si se especifica un filtro para los atributos cuyo [kind](DataClassClass.md#attributename) es relatedEntities:
-
-- propertyPath = "relatedEntities.\*" -> se extraen todas las propiedades
-- propertyPath = "relatedEntities.propertyName1; relatedEntities.propertyName2; ..." -> sólo se extraen esas propiedades
-
-En el parámetro *options*, puedes pasar el selector `dk with primary key` y/o `dk with stamp` para agregar las llaves primarias y/o los stamps en los objetos extraídos.
-
-:::caution Atención
-
-Si utiliza otro atributo distinto de la llave primaria como atributo Uno en una relación, el valor de este atributo se escribirá en la propiedad "__KEY". Si utiliza otro atributo distinto de la llave primaria como atributo Uno en una relación, el valor de este atributo se escribirá en la propiedad "__KEY".
-
-:::
-
-#### Ejemplo 1
-
-En todos los ejemplos de esta sección se utilizará la siguiente estructura:
-
-
-
-Sin parámetro de filtro:
-
-```4d
-employeeObject:=employeeSelected.toObject()
-```
-
-Ejemplo con el tipo relatedEntity con una forma simple:
-
-```4d
-{
- "ID": 413,
- "firstName": "Greg",
- "lastName": "Wahl",
- "salary": 0,
- "birthDate": "1963-02-01T00:00:00.000Z",
- "woman": false,
- "managerID": 412,
- "employerID": 20,
- "photo": "[object Picture]",
- "extra": null,
- "employer": { // relatedEntity extracted with simple form
- "__KEY": 20
- },
- "manager": {
- "__KEY": 412
- }
-}
-```
-
-#### Ejemplo 2
-
-Extraer la llave primaria y el sello:
-
-```4d
-employeeObject:=employeeSelected.toObject("";dk with primary key+dk with stamp)
-```
-
-Ejemplo con el tipo relatedEntity con una forma simple:
-
-```4d
-{
- "__KEY": 413,
- "__STAMP": 1,
- "ID": 413,
- "firstName": "Greg",
- "lastName": "Wahl",
- "salary": 0,
- "birthDate": "1963-02-01T00:00:00.000Z",
- "woman": false,
- "managerID": 412,
- "employerID": 20,
- "photo": "[object Picture]",
- "extra": null,
- "employer": {
- "__KEY": 20
- },
- "manager": {
- "__KEY": 412
- }
-}
-```
-
-#### Ejemplo 3
-
-Extrayendo todas las propiedades de `relatedEntities`:
-
-```4d
-employeeObject:=employeeSelected.toObject("directReports.*")
-```
-
-```4d
-{
- "directReports": [
- {
- "ID": 418,
- "firstName": "Lorena",
- "lastName": "Boothe",
- "salary": 44800,
- "birthDate": "1970-10-02T00:00:00.000Z",
- "woman": true,
- "managerID": 413,
- "employerID": 20,
- "photo": "[object Picture]",
- "extra": null,
- "employer": {
- "__KEY": 20
- },
- "manager": {
- "__KEY": 413
- }
- },
- {
- "ID": 419,
- "firstName": "Drew",
- "lastName": "Caudill",
- "salary": 41000,
- "birthDate": "2030-01-12T00:00:00.000Z",
- "woman": false,
- "managerID": 413,
- "employerID": 20,
- "photo": "[object Picture]",
- "extra": null,
- "employer": {
- "__KEY": 20
- },
- "manager": {
- "__KEY": 413
- }
- },
- {
- "ID": 420,
- "firstName": "Nathan",
- "lastName": "Gomes",
- "salary": 46300,
- "birthDate": "2010-05-29T00:00:00.000Z",
- "woman": false,
- "managerID": 413,
- "employerID": 20,
- "photo": "[object Picture]",
- "extra": null,
- "employer": {
- "__KEY": 20
- },
- "manager": {
- "__KEY": 413
- }
- }
- ]
-}
-```
-
-#### Ejemplo 4
-
-Extracción de algunas propiedades de `relatedEntities`:
-
-```4d
- employeeObject:=employeeSelected.toObject("firstName, directReports.lastName")
-```
-
-Ejemplo con el tipo relatedEntity con una forma simple:
-
-```4d
-{
- "firstName": "Greg",
- "directReports": [
- {
- "lastName": "Boothe"
- },
- {
- "lastName": "Caudill"
- },
- {
- "lastName": "Gomes"
- }
- ]
-}
-```
-
-#### Ejemplo 5
-
-Extrayendo un `relatedEntity` con una forma simple:
-
-```4d
- $coll:=New collection("firstName";"employer")
- employeeObject:=employeeSelected.toObject($coll)
-```
-
-Ejemplo con el tipo relatedEntity con una forma simple:
-
-```4d
-{
- "firstName": "Greg",
- "employer": {
- "__KEY": 20
- }
-}
-```
-
-#### Ejemplo 6
-
-Extrayendo todas las propiedades de una `relatedEntity`:
-
-```4d
- employeeObject:=employeeSelected.toObject("employer.*")
-```
-
-Ejemplo con el tipo relatedEntity con una forma simple:
-
-```4d
-{
- "employer": {
- "ID": 20,
- "name": "India Astral Secretary",
- "creationDate": "1984-08-25T00:00:00.000Z",
- "revenues": 12000000,
- "extra": null
- }
-}
-```
-
-#### Ejemplo 7
-
-Extracción de algunas propiedades de una `relatedEntity`:
-
-```4d
- $col:=New collection
- $col.push("employer.name")
- $col.push("employer.revenues")
- employeeObject:=employeeSelected.toObject($col)
-```
-
-Ejemplo con el tipo relatedEntity con una forma simple:
-
-```4d
-{
- "employer": {
- "name": "India Astral Secretary",
- "revenues": 12000000
- }
-}
-```
-
-
-
-
-
-## .touched()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.touched()** : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------- |
-| Resultado | Boolean | <- | True si se ha modificado al menos un atributo de la entidad y aún no se ha guardado, si no, False |
-
-
-
-#### Descripción
-
-La función `.touched()` devuelve True si al menos un atributo de la entidad ha sido modificado desde que la entidad fue cargada en memoria o guardada. Puede utilizar esta función para determinar si necesita guardar la entidad.
-
-Esto solo se aplica a los atributos de [`kind`](DataClassClass.md#returned-object) "storage" o "relatedEntity".
-
-Para una nueva entidad que acaba de ser creada (con [`.new()`](DataClassClass.md#new)), la función devuelve False. Sin embargo, en este contexto, si accede a un atributo cuya [propiedad `autoFilled`](./DataClassClass.md#returned-object) es True, la función `.touched()` entonces devolverá True. Por ejemplo, después de ejecutar `$id:=ds.Employee.ID` para una nueva entidad (asumiendo que el atributo ID tiene la propiedad "Autoincrement"), `.touched()` devuelve True.
-
-#### Ejemplo
-
-En este ejemplo, comprobamos si es necesario guardar la entidad:
-
-```4d
- var $emp : cs.EmployeeEntity
- $emp:=ds.Employee.get(672)
- $emp.firstName:=$emp.firstName //Aunque se actualice con el mismo valor, el atributo se marca como tocado
-
- If($emp.touched()) //si se ha modificado al menos uno de los atributos
- $emp.save()
- End if // de lo contrario, no es necesario guardar la entidad
-```
-
-
-
-
-
-## .touchedAttributes()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.touchedAttributes()** : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ----------------------------------------------- |
-| Resultado | Collection | <- | Nombres de atributos tocados, o colección vacía |
-
-
-
-#### Descripción
-
-La función`.touchedAttributes()` devuelve los nombres de los atributos que han sido modificados desde que la entidad fue cargada en memoria.
-
-Esto solo se aplica a los atributos de [`kind`](DataClassClass.md#returned-object) "storage" o "relatedEntity".
-
-En el caso de que se haya tocado una entidad relacionada (es decir, la llave externa), se devuelve el nombre de la entidad relacionada y el nombre de su llave primaria.
-
-Si no se ha tocado ningún atributo de entidad, el método devuelve una colección vacía.
-
-#### Ejemplo 1
-
-```4d
- var $touchedAttributes : Collection
- var $emp : cs.EmployeeEntity
-
- $touchedAttributes:=New collection
- $emp:=ds.Employee.get(725)
- $emp.firstName:=$emp.firstName //Aunque se actualice con el mismo valor, el atributo se marca como tocado
- $emp.lastName:="Martin"
- $touchedAttributes:=$emp.touchedAttributes()
- //$touchedAttributes: ["firstName","lastName"]
-```
-
-#### Ejemplo 2
-
-```4d
- var $touchedAttributes : Collection
- var $emp : cs.EmployeeEntity
- var $company : cs.CompanyEntity
-
- $touchedAttributes:=New collection
-
- $emp:=ds.Employee.get(672)
- $emp.firstName:=$emp.firstName
- $emp.lastName:="Martin"
-
- $company:=ds.Company.get(121)
- $emp.employer:=$company
-
- $touchedAttributes:=$emp.touchedAttributes()
-
- //collection $touchedAttributes: ["firstName","lastName","employer","employerID"]
-```
-
-En este caso:
-
-- firstName y lastName tienen un tipo `storage`
-- el empleador tiene un tipo `relatedEntity`
-- employerID es la llave extranjera de la entidad relacionada con el empleador
-
-
-
-
-
-## .unlock()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 | Añadidos |
-
-
-
-**.unlock()** : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ------------- |
-| Resultado | Object | <- | Objeto estado |
-
-
-
-#### Descripción
-
-La función `.unlock()` elimina el bloqueo pesimista del registro que coincide con la entidad en el datastore y la tabla relacionada con su dataclass.
-
-> Para más información, por favor consulte la sección [Bloqueo de entidades](ORDA/entities.md#bloqueo-de-una-entidad).
-
-Un registro se desbloquea automáticamente cuando ya no es referenciado por ninguna entidad en el proceso de bloqueo (por ejemplo: si el bloqueo se pone sólo en una referencia local de una entidad, la entidad y, por tanto, el registro se desbloquea cuando el proceso termina).
-
-Cuando un registro se bloquea, debe desbloquearse desde el proceso de bloqueo y en la referencia de la entidad que puso el bloqueo. Por ejemplo:
-
-```4d
- $e1:=ds.Emp.all()[0]
- $e2:=ds.Emp.all()[0]
- $res:=$e1.lock() //$res.success=true
- $res:=$e2.unlock() //$res.success=false
- $res:=$e1.unlock() //$res.success=true
-```
-
-:::note
-
-`unlock()` debe ser llamado tantas veces como [`lock()`](#lock) fue llamado en el mismo proceso para que la entidad sea realmente desbloqueada.
-
-:::
-
-**Resultado**
-
-El objeto devuelto por `.unlock()` contiene la siguiente propiedad:
-
-| Propiedad | Tipo | Descripción |
-| ------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| success | Boolean | True si la acción de desbloquear tiene éxito, False en caso contrario. Si el desbloqueo se realiza en una entidad abandonada, en un registro no bloqueado o en un registro bloqueado por otro proceso o entidad, el éxito es False. |
-| wasNotLocked | Boolean | (sólo si "success" es False) True si la entidad no fue bloqueada en el proceso. |
-
-#### Ejemplo
-
-```4d
- var $employee : cs.EmployeeEntity
- var $status : Object
-
- $employee:=ds.Employee.get(725)
- $status:=$employee.lock()
- ... //processing
- $status:=$employee.unlock()
- If($status.success)
- ALERT("The entity is now unlocked")
- End if
-```
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FileClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FileClass.md
deleted file mode 100644
index 3bafab3bf560de..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FileClass.md
+++ /dev/null
@@ -1,799 +0,0 @@
----
-id: FileClass
-title: File
----
-
-Los objetos `File` se crean con el comando [`File`](../commands/file.md). Contienen referencias a archivos de disco que pueden o no existir realmente en el disco. Por ejemplo, cuando ejecuta el comando `File` para crear un nuevo archivo, se crea un objeto `File` válido pero en realidad nada se guarda en el disco hasta que se llama a la función [`file.create( )`](#create).
-
-### Ejemplo
-
-El siguiente ejemplo crea un archivo de preferencias en la carpeta del proyecto:
-
-```code4d
-var $created : Boolean
-$created:=File("/PACKAGE/SpecialPrefs/"+Current user+".myPrefs").create()
-```
-
-### Rutas de acceso
-
-Los objetos `File` soportan varios nombres de ruta, incluyendo la sintaxis `filesystems` o `posix`. Los nombres de ruta soportados se detallan en la página [**Rutas de acceso**](../Concepts/paths.md).
-
-### Objeto File
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------- |
-| [](#copyto) |
-| [](#create) |
-| [](#createalias) |
-| [](#creationdate) |
-| [](#creationtime) |
-| [](#delete) |
-| [](#exists) |
-| [](#extension) |
-| [](#fullname) |
-| [](#getappinfo) |
-| [](#getcontent) |
-| [](#geticon) |
-| [](#gettext) |
-| [](#hidden) |
-| [](#isalias) |
-| [](#isfile) |
-| [](#isfolder) |
-| [](#iswritable) |
-| [](#modificationdate) |
-| [](#modificationtime) |
-| [](#moveto) |
-| [](#name) |
-| [](#open) |
-| [](#original) |
-| [](#parent) |
-| [](#path) |
-| [](#platformpath) |
-| [](#rename) |
-| [](#setappinfo) |
-| [](#setcontent) |
-| [](#settext) |
-| [](#size) |
-
-## 4D.File.new()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-
-
-**4D.File.new** ( *path* : Text { ; *pathType* : Integer } ) : 4D.File **4D.File.new** ( *fileConstant* : Integer ) : 4D.File
-
-#### Descripción
-
-Lanzamiento Es idéntico al comando [`File`](../commands/file.md) (atajo).
-
-> Se recomienda utilizar el comando de acceso directo [`File`](../commands/file.md) en lugar de `4D.File.new()`.
-
-
-
-
-
-## .create()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-
-
-**No disponible para archivos ZIP**
-
-**.create()** : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | --------------------------- | ------------------------------------------------------------------ |
-| Resultado | Boolean | <- | True si el archivo se ha creado con éxito, false en caso contrario |
-
-
-
-#### Descripción
-
-La función `.create()` crea un archivo en el disco según las propiedades del objeto `File`.
-
-Si es necesario, la función crea la jerarquía de carpetas como se describe en las propiedades [platformPath](#platformpath) o [path](#path). Si el archivo ya existe en el disco, la función no hace nada (no se lanza ningún error) y devuelve false.
-
-**Valor devuelto**
-
-- **True** si el archivo se crea con éxito;
-- **False** si ya existe un archivo con el mismo nombre o si ha ocurrido un error.
-
-#### Ejemplo
-
-Creación de un archivo de preferencias en la carpeta principal:
-
-```4d
- var $created : Boolean
- $created:=File("/PACKAGE/SpecialPrefs/"+Current user+".myPrefs").create()
-```
-
-
-
-
-
-## .createAlias()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.createAlias**( *destinationFolder* : 4D.Folder ; *aliasName* : Text { ; *aliasType* : Integer } ) : 4D.File
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------------- | ------------------------- | --------------------------- | ---------------------------------------------------- |
-| destinationFolder | 4D.Folder | -> | Carpeta de destino para el alias o el acceso directo |
-| aliasName | Text | -> | Nombre del alias o del atajo |
-| aliasType | Integer | -> | Tipo de enlace del alias |
-| Resultado | 4D.File | <- | Referencia del archivo del alias o de atajo |
-
-
-
-#### Descripción
-
-La función `.createAlias()` crea un alias (macOS) o un acceso directo (Windows) al archivo con el nombre *aliasName* especificado en la carpeta designada por el objeto *destinationFolder*.
-
-Pase el nombre del alias o del acceso directo a crear en el parámetro *aliasName*.
-
-Por defecto en macOS, la función crea un alias estándar. También puede crear un enlace simbólico utilizando el parámetro *aliasType*. Las siguientes constantes están disponibles:
-
-| Constante | Valor | Comentario |
-| ------------------ | ----- | ----------------------------------------------------- |
-| `fk alias link` | 0 | Enlace de alias (por defecto) |
-| `fk symbolic link` | 1 | Enlace simbólico (sólo para macOS) |
-
-En Windows, siempre se crea un acceso directo (archivo.lnk) (el parámetro *aliasType* es ignorado).
-
-**Objeto devuelto**
-
-Un objeto `4D.File` con la propiedad `isAlias` definida en **true**.
-
-#### Ejemplo
-
-Quiere crear un alias para un archivo en su carpeta principal:
-
-```4d
- $myFile:=Folder(fk documents folder).file("Archives/ReadMe.txt")
- $aliasFile:=$myFile.createAlias(File("/PACKAGE");"ReadMe")
-```
-
-
-
-
-
-
-
-
-
-## .delete()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.delete**()
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `.delete()` borra el archivo.
-
-Si el archivo no existe en el disco, la función no hace nada (no se genera ningún error).
-
-Si el archivo está abierto, el resultado depende del sistema operativo:
-
-- en Windows, se genera un error,
-- en macOS, no se genera ningún error y el archivo se elimina.
-
-:::caution
-
-`.delete()` puede eliminar cualquier archivo de un disco. Esto incluye los documentos creados con otras aplicaciones, así como las propias aplicaciones. `.delete()` debe utilizarse con extrema precaución. Eliminar un archivo es una operación permanente y no se puede deshacer.
-
-:::
-
-#### Ejemplo
-
-Desea eliminar un archivo específico en la carpeta de la base de datos:
-
-```4d
- $tempo:=File("/PACKAGE/SpecialPrefs/"+Current user+".prefs")
- If($tempo.exists)
- $tempo.delete()
- ALERT("User preference file deleted.")
- End if
-```
-
-
-
-
-
-
-
-
-
-
-
-## .getAppInfo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | --------------------------------------------- |
-| 20 R9 | Lectura de los UUIDs en los ejecutables macOS |
-| 19 | Añadidos |
-
-
-
-**.getAppInfo**() : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | --------------------------- | ---------------------------------------- |
-| Resultado | Object | <- | Información del archivo de la aplicación |
-
-
-
-#### Descripción
-
-La función `.getAppInfo()` devuelve el contenido de la información de un archivo de aplicación como un objeto.
-
-La función debe ser usada con un archivo existente y soportado: **.plist** (todas las plataformas), **.exe**/**.dll** (Windows), o **ejecutable macOS**. Si el archivo no existe en el disco o no es un archivo soportado, la función devuelve un objeto vacío (no se genera ningún error).
-
-**Objeto devuelto con un archivo .plist (todas las plataformas)**
-
-El contenido xml del archivo se analiza y las llaves se devuelven como propiedades del objeto, conservando sus tipos (texto, booleano, numérico). `.plist dict` se devuelve como un objeto JSON y `.plist array` se devuelve como un array JSON.
-
-:::note
-
-La función sólo admite archivos .plist en formato xml (basados en texto). Se devuelve un error si se utiliza con un archivo .plist en formato binario.
-
-:::
-
-**Objeto devuelto con un archivo .exe o .dll (sólo Windows)**
-
-Todos los valores de propiedades son de tipo Texto.
-
-| Propiedad | Tipo |
-| ---------------- | ---- |
-| InternalName | Text |
-| ProductName | Text |
-| CompanyName | Text |
-| LegalCopyright | Text |
-| ProductVersion | Text |
-| FileDescription | Text |
-| FileVersion | Text |
-| OriginalFilename | Text |
-
-**Objeto devuelto con un archivo ejecutable macOS (solo macOS)**
-
-:::note
-
-Un archivo ejecutable macOS se encuentra dentro de un paquete (por ejemplo, myApp.app/Contents/MacOS/myApp).
-
-:::
-
-La función devuelve un objeto `archs` que contiene una colección de objetos que describen cada arquitectura encontrada en el ejecutable (un gran ejecutable puede integrar varias arquitecturas). Cada objeto de la colección contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------ | -------------------------------------------------------------------------------------- |
-| name | Text | Nombre de la arquitectura ("arm64" o "x86_64") |
-| type | Number | Identificador numérico de la arquitectura |
-| uuid | Text | Representación textual del uuid del ejecutable |
-
-#### Ejemplo 1
-
-```4d
- // mostrar información de derechos de autor de una info.plist (cualquier plataforma)
-var $infoPlistFile : 4D.File
-var $info : Object
-$infoPlistFile:=File("/RESOURCES/info.plist")
-$info:=$infoPlistFile.getAppInfo()
-ALERT($info.Copyright)
-```
-
-#### Ejemplo 2
-
-```4d
- // mostrar información de copyright del archivo .exe de aplicación (windows)
-var $exeFile : 4D.File
-var $info : Object
-$exeFile:=File(Application file; fk platform path)
-$info:=$exeFile.getAppInfo()
-ALERT($info.LegalCopyright)
-```
-
-#### Ejemplo 3
-
-```4d
- // Obtener uuids de una aplicación (macOS)
-var $app:=File("/Applications/myApp.app/Contents/MacOS/myApp")
-var $info:=$app.getAppInfo()
-```
-
-Resultado en *$info*:
-
-```json
-{
- "archs":
- [
- {
- "name":"x86_64",
- "type":16777223,
- "uuid":"3840983CDA32392DA4D1D32F08AB3212"
- },
- {
- "name":"arm64",
- "type":16777228,
- "uuid":"E49F6BA275B931DDA183C0B0CDF0ADAF"
- }
- ]
-}
-```
-
-#### Ver también
-
-[.setAppInfo()](#setappinfo)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## .moveTo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.moveTo**( *destinationFolder* : 4D.Folder { ; *newName* : Text } ) : 4D.File
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------------- | ------------------------- | --------------------------- | -------------------------------------- |
-| destinationFolder | 4D.Folder | -> | Carpeta de destino |
-| newName | Text | -> | Nombre completo del archivo trasladado |
-| Resultado | 4D.File | <- | Archivo movido |
-
-
-
-#### Descripción
-
-La función `.moveTo()` mueve o renombra el objeto `File` en la carpeta especificada *destinationFolder*.
-
-La *destinationFolder* debe existir en el disco, de lo contrario se genera un error.
-
-Por defecto, el archivo conserva su nombre cuando se mueve. Si desea renombrar el archivo desplazado, pase el nombre completo en el parámetro *newName*. El nuevo nombre debe cumplir con las reglas de nomenclatura (por ejemplo, no debe contener caracteres como ":", "/", etc.), de lo contrario se devuelve un error.
-
-**Objeto devuelto**
-
-El objeto `File` movido.
-
-#### Ejemplo
-
-```4d
-$DocFolder:=Folder(fk documents folder)
-$myFile:=$DocFolder.file("Current/Infos.txt")
-$myFile.moveTo($DocFolder.folder("Archives");"Infos_old.txt")
-```
-
-
-
-
-
-
-
-## .open()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R7 | Añadidos |
-
-
-
-**.open**( { *mode* : Text } ) : 4D.FileHandle **.open**( { *options* : Object } ) : 4D.FileHandle
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------------------------------ | --------------------------- | ----------------------------------------------------------- |
-| mode | Text | -> | Modo de apertura: "read", "write", "append" |
-| options | Object | -> | Opciones de apertura |
-| Resultado | [4D.FileHandle](FileHandleClass) | <- | Nuevo objeto File handle |
-
-
-
-#### Descripción
-
-La función `.open()` crea y devuelve un nuevo objeto [4D.FileHandle](FileHandleClass) en el archivo, en el modo especificado o con las opciones especificadas. Puede utilizar las funciones y propiedades de la clase [4D.FileHandle](FileHandleClass) para escribir, leer o añadir contenido al archivo.
-
-Si utiliza el parámetro *mode* (texto), pase el modo de apertura para el file handle:
-
-| *mode* | Descripción |
-| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| "read" | (Por defecto) Crea un file handle para leer los valores en el archivo. Si el archivo no existe en el disco, se devuelve un error. Puede abrir tantos file handles como quiera en modo "read" en el mismo objeto File. |
-| "write" | Crea un file handle para escribir valores en el archivo (empezando por el inicio del contenido del archivo). Si el archivo no existe en el disco, se crea. Sólo se puede abrir un file handle en modo "write" en el mismo objeto File. |
-| "append" | Crea un file handle para escribir los valores en el archivo (empezando por el final del contenido del archivo). Si el archivo no existe en el disco, se crea. Sólo se puede abrir un file handle en modo "append" en el mismo objeto File. |
-
-> El valor de *mode* es sensible a las mayúsculas y minúsculas.
-
-Si utiliza el parámetro *options* (object), puede pasar más opciones para el file handle a través de las siguientes propiedades (estas propiedades se pueden leer después desde el objeto [file handle](FileHandleClass) abierto):
-
-| *options* | Tipo | Descripción | Por defecto |
-| ----------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
-| `.mode` | Text | Modo de apertura (ver *mode* arriba) | "read" |
-| `.charset` | Text | Conjunto de caracteres utilizado al leer o escribir en el archivo. Utilice el nombre estándar del conjunto (por ejemplo, "ISO-8859-1" o "UTF-8") | "UTF-8" |
-| `.breakModeRead` | Texto o número | Modo de procesamiento de los saltos de línea utilizados al leer el archivo (ver abajo) | "native" o 1 |
-| `.breakModeWrite` | Texto o número | Modo de procesamiento de los saltos de línea utilizados al escribir en el archivo (ver abajo) | "native" o 1 |
-
-La función reemplaza todos los delimitadores originales de final de línea. Por defecto, se utiliza el delimitador nativo, pero puede definir otro delimitador. Las propiedades `.breakModeRead` y `.breakModeWrite` indican el procesamiento a aplicar a los caracteres de fin de línea en el documento. Puede utilizar uno de los siguientes valores (texto o número):
-
-| Modo de ruptura en texto | Break mode en numérico (constante) | Descripción |
-| ------------------------ | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| "native" | 1 (`Document with native format`) | (Por defecto) Los saltos de línea se convierten al formato nativo del sistema operativo: LF (salto de línea) en macOS, CRLF (retorno de carro + salto de línea) en Windows |
-| "crlf" | 2 (`Document with CRLF`) | Los fines de línea se convierten en CRLF (retorno de carro + salto de línea), el formato predeterminado de Windows |
-| "cr" | 3 (`Document with CR`) | Los fines de línea se convierten en CR (retorno de carro), el formato clásico por defecto de Mac OS |
-| "lf" | 4 (`Document with LF`) | Los fines de línea se convierten en LF (salto de línea), el formato Unix y macOS por defecto |
-
-> El valor del parámetro *break mode as text* es sensible a las mayúsculas y minúsculas.
-
-#### Ejemplo
-
-Quiere crear un file handle para leer el archivo "ReadMe.txt":
-
-```4d
-var $f : 4D.File
-var $fhandle : 4D.FileHandle
-
-$f:=File("C:\\Documents\\Archives\\ReadMe.txt";fk platform path)
-$fhandle:=$f.open("read")
-
-```
-
-
-
-
-
-
-
-
-
-
-
-
-
-## .rename()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.rename**( *newName* : Text ) : 4D.File
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ----------------------- | --------------------------- | --------------------------------- |
-| newName | Text | -> | Nuevo nombre completo del archivo |
-| Resultado | 4D.File | <- | Archivo renombrado |
-
-
-
-#### Descripción
-
-La función `.rename()` renombra el archivo con el nombre que se ha pasado en *newName* y devuelve el objeto `File` renombrado.
-
-El parámetro *newName* debe cumplir con las reglas de nomenclatura (por ejemplo, no debe contener caracteres como ":", "/", etc.), de lo contrario se devuelve un error. Si ya existe un archivo con el mismo nombre, se devuelve un error.
-
-Tenga en cuenta que la función modifica el nombre completo del archivo, es decir, si no pasa una extensión en *newName*, el archivo tendrá un nombre sin extensión.
-
-**Objeto devuelto**
-
-El objeto `File` renombrado.
-
-#### Ejemplo
-
-Quiere renombrar "ReadMe.txt" como "ReadMe_new.txt":
-
-```4d
- $toRename:=File("C:\\Documents\\Archives\\ReadMe.txt";fk platform path)
- $newName:=$toRename.rename($toRename.name+"_new"+$toRename.extension)
-```
-
-
-
-## .setAppInfo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | --------------------------------------------- |
-| 20 R9 | Lectura de los UUIDs en los ejecutables macOS |
-| 20 | Soporte de WinIcon |
-| 19 | Añadidos |
-
-
-
-**.setAppInfo**( *info* : Object )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | -- | ----------------------------------------------------------------------- |
-| info | Object | -> | Propiedades para escribir en la información de un archivo de aplicación |
-
-
-
-#### Descripción
-
-La función `.setAppInfo()` escribe las propiedades *info* como contenido informativo de un archivo de aplicación.
-
-La función sólo se puede usar con los siguientes tipos de archivos: **.plist** (todas las plataformas), existente **.exe**/**.dll** (Windows), o **ejecutable macOS**. If used with another file type or with *.exe*\*/**.dll** files that do not already exist on disk, the function does nothing (no error is generated).
-
-Parámetro ***info* con un archivo .plist (todas las plataformas)**
-
-:::note
-
-La función sólo admite archivos .plist en formato xml (basados en texto). Se devuelve un error si se utiliza con un archivo .plist en formato binario.
-
-:::
-
-Si el archivo .plist ya existe en el disco, se actualiza. De lo contrario, se creará.
-
-Cada propiedad válida definida en el parámetro objeto *info* se escribe en el archivo .plist en forma de llave. Se aceptan todos los nombre de llaves. Los tipos de valores se conservan cuando es posible.
-
-Si un conjunto de llaves en el parámetro *info* ya está definido en el archivo .plist, su valor se actualiza manteniendo su tipo original. Las demás llaves existentes en el archivo .plist no se modifican.
-
-:::note
-
-Para definir un valor de tipo Fecha, el formato a utilizar es una cadena de timestamp json formada en ISO UTC sin milisegundos ("2003-02-01T01:02:03Z") como en el editor de plist Xcode.
-
-:::
-
-**Parámetro objeto *info* con un archivo .exe o .dll (sólo Windows)**
-
-Cada propiedad válida definida en el parámetro objeto *info* se escribe en el recurso de versión del archivo .exe o .dll. Las propiedades disponibles son (toda otra propiedad será ignorada):
-
-| Propiedad | Tipo | Comentario |
-| ---------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| InternalName | Text | |
-| ProductName | Text | |
-| CompanyName | Text | |
-| LegalCopyright | Text | |
-| ProductVersion | Text | |
-| FileDescription | Text | |
-| FileVersion | Text | |
-| OriginalFilename | Text | |
-| WinIcon | Text | Ruta Posix del archivo .ico. Esta propiedad sólo se aplica a los archivos ejecutables generados por 4D. |
-
-Para todas las propiedades excepto `WinIcon`, si se pasa un texto nulo o vacío como valor, se escribe una cadena vacía en la propiedad. Si pasa un valor de tipo diferente a texto, se convierte en una cadena.
-
-Para la propiedad `WinIcon`, si el archivo del icono no existe o tiene un formato incorrecto, se genera un error.
-
-**Parámetro *info* con un archivo ejecutable macOS (sólo macOS)**
-
-*info* debe ser un objeto con una única propiedad llamada `archs` que es una colección de objetos en el formato devuelto por [`getAppInfo()`](#getappinfo). Cada objeto debe contener al menos las propiedades `type` y `uuid` (`name` no es usado).
-
-Cada objeto de la colección *info*.archs debe contener las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------ | ----------------------------------------------------- |
-| type | Number | Identificador numérico de la arquitectura a modificar |
-| uuid | Text | Representación textual del nuevo uuid ejecutable |
-
-#### Ejemplo 1
-
-```4d
- // definir algunas llaves en un archivo info.plist (todas las plataformas)
-var $infoPlistFile : 4D.File
-var $info : Object
-$infoPlistFile:=File("/RESOURCES/info.plist")
-$info:=New object
-$info.Copyright:="Copyright 4D 2023" //text
-$info.ProductVersion:=12 //integer
-$info.ShipmentDate:="2023-04-22T06:00:00Z" //timestamp
-$info.CFBundleIconFile:="myApp.icns" //para macOS
-$infoPlistFile.setAppInfo($info)
-```
-
-#### Ejemplo 2
-
-```4d
- // definir el copyright y versión de un archivo .exe (Windows)
-var $exeFile; $iconFile : 4D.File
-var $info : Object
-$exeFile:=File(Application file; fk platform path)
-$iconFile:=File("/RESOURCES/myApp.ico")
-$info:=New object
-$info.LegalCopyright:="Copyright 4D 2023"
-$info.ProductVersion:="1.0.0"
-$info.WinIcon:=$iconFile.path
-$exeFile.setAppInfo($info)
-```
-
-#### Ejemplo 3
-
-```4d
-// regenerar uuids de una aplicación (macOS)
-
-// leer uuids de myApp
-var $app:=File("/Applications/myApp.app/Contents/MacOS/myApp")
-var $info:=$app.getAppInfo()
-
-// regenera los uuids para todas las arquitecturas
-For each ($i; $info.archs)
- $i.uuid:=Generate UUID
-End for each
-
-// actualiza la app con los nuevos uuids
-$app.setAppInfo($info)
-```
-
-#### Ver también
-
-[.getAppInfo()](#getappinfo)
-
-
-
-## .setContent()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 17 R5 | Añadidos |
-
-
-
-**.setContent** ( *content* : Blob )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | -- | ----------------------------- |
-| content | BLOB | -> | Nuevos contenidos del archivo |
-
-
-
-#### Descripción
-
-La función `.setContent( )` reescribe todo el contenido del archivo utilizando los datos almacenados en el BLOB *content*. Para obtener información sobre BLOBs, consulte la sección [BLOB](Concepts/dt_blob.md).
-
-#### Ejemplo
-
-```4d
- $myFile:=Folder(fk documents folder).file("Archives/data.txt")
- $myFile.setContent([aTable]aBlobField)
-```
-
-
-
-
-
-## .setText()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------------------------------------------------------------------------------------------- |
-| 19 R3 | Por defecto para los nuevos proyectos: sin BOM y (macOS) LF para EOL |
-| 17 R5 | Añadidos |
-
-
-
-**.setText** ( *text* : Text {; *charSetName* : Text { ; *breakMode* : Integer } } ) **.setText** ( *text* : Text {; *charSetNum* : Integer { ; *breakMode* : Integer } } )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ------- | -- | ------------------------------------------ |
-| text | Text | -> | Texto a almacenar en el archivo |
-| charSetName | Text | -> | Nombre del juego de caracteres |
-| charSetNum | Integer | -> | Número del conjunto de caracteres |
-| breakMode | Integer | -> | Modo de tratamiento de los saltos de línea |
-
-
-
-#### Descripción
-
-La función `.setText()` escribe *text* como el nuevo contenido del archivo.
-
-Si el archivo referenciado en el objeto `File` no existe en el disco, la función lo crea. Cuando el archivo ya existe en el disco, se borra su contenido anterior, excepto si ya está abierto, en cuyo caso se bloquea su contenido y se genera un error.
-
-En *text*, pase el texto a escribir en el archivo. Puede ser un texto literal ("my text"), o un campo / variable texto 4D.
-
-Opcionalmente, puede designar el conjunto de caracteres que se utilizará para la escritura del contenido. Puede pasar:
-
-- en *charSetName*, una cadena que contiene el nombre del conjunto estándar (por ejemplo "ISO-8859-1" o "UTF-8"),
-- o en *charSetNum*, el ID MIBEnum (número) del nombre del conjunto estándar.
-
-> Para conocer la lista de los conjuntos de caracteres que soporta 4D, consulte la descripción del comando `CONVERT FROM TEXT`.
-
-Si existe una marca de orden de bytes (BOM) para el conjunto de caracteres, 4D la inserta en el archivo a menos que el conjunto de caracteres utilizado contenga el sufijo "-no-bom" (por ejemplo, "UTF-8-no-bom"). Si no especifica un conjunto de caracteres, por defecto 4D utiliza el conjunto de caracteres "UTF-8" sin BOM.
-
-En *breakMode*, se puede pasar un número que indica el procesamiento a aplicar a los caracteres de fin de línea antes de guardarlos en el archivo. Las siguientes constantes, que se encuentran en el tema **Documentos sistema**, están disponibles:
-
-| Constante | Valor | Comentario |
-| ----------------------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `Document unchanged` | 0 | Sin procesar |
-| `Document with native format` | 1 | (Por defecto) Los saltos de línea se convierten al formato nativo del sistema operativo: LF (salto de línea) en macOS, CRLF (salto de línea + retorno de carro) en Windows |
-| `Document with CRLF` | 2 | Los fines de línea se convierten en CRLF (retorno de carro + salto de línea), el formato predeterminado de Windows |
-| `Document with CR` | 3 | Los fines de línea se convierten en CR (retorno de carro), el formato clásico por defecto de Mac OS |
-| `Document with LF` | 4 | Los fines de línea se convierten en LF (salto de línea), el formato Unix y macOS por defecto |
-
-Por defecto, cuando se omite el parámetro *breakMode*, los saltos de línea se procesan en modo nativo (1).
-
-> **Nota de compatibilidad**: las opciones de compatibilidad están disponibles para la gestión de EOL y de BOM. Ver la [página Compatibilidad](https://doc.4d.com/4Dv20/4D/20.2/Compatibility-page.300-6750362.en.html) en doc.4d.com.
-
-#### Ejemplo
-
-```4d
-$myFile:=File("C:\\Documents\\Hello.txt";fk platform path)
-$myFile.setText("Hello world")
-```
-
-
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/HTTPAgentClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/HTTPAgentClass.md
deleted file mode 100644
index d5e1f950e289e0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/HTTPAgentClass.md
+++ /dev/null
@@ -1,150 +0,0 @@
----
-id: HTTPAgentClass
-title: HTTPAgent
----
-
-La clase `HTTPAgent` permite manejar [objetos`HTTPAgent`](#httpagent-object) que pueden ser utilizados para gestionar la persistencia y reutilización de conexiones a servidores utilizando la [clase HTTPRequest](HTTPRequestClass.md).
-
-La clase `HTTPAgent` está disponible en el class store `4D`. Puede crear un nuevo [`objeto HTTPAgent`](#httpagent-object) utilizando la función [4D.HTTPAgent.new()](#4dhttpagentnew).
-
-Cuando no hay ningún agente asociado a una petición HTTP, se utiliza un agente global con valores por defecto. El agente por defecto es la forma más simple de agente HTTP, adecuado para casos de uso básicos. Los agentes personalizados se recomiendan para tener un mayor control, a nivel de agente en lugar de para cada petición HTTP, sobre aspectos específicos de la conexión como la configuración de keep-alive, los tiempos de espera o las configuraciones TLS/SSL.
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R6 | Clase añadida |
-
-
-
-### Objeto HTTPAgent
-
-Un objeto HTTPAgent es un objeto compartible.
-
-Los objetos HTTPAgent ofrecen las siguientes propiedades y funciones:
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#params) |
-| [](#requestscount) |
-| [](#freesocketscount) |
-
-:::tip
-
-Dado que HTTPAgent es un objeto compartible, puede añadir uno a una clase singleton para poder utilizar el mismo agente para todas sus peticiones al mismo servidor.
-
-:::
-
-## 4D.HTTPAgent.new()
-
-**4D.HTTPAgent.new**( { *options* : Object } ) : 4D.HTTPAgent
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------------------------------- | :-------------------------: | -------------------------------------- |
-| options | Object | -> | opciones por defecto para el HTTPAgent |
-| Resultado | [4D.HTTPAgent](#httpagent-object) | <- | Nuevo objeto HTTPAgent |
-
-
-
-#### Descripción
-
-La función `4D.HTTPAgent.new()` crea un objeto HTTPAgent compartible con las *opciones* definidas, y devuelve un objeto `4D.HTTPAgent`.
-
-El [`objeto HTTPAgent`] devuelto (#httpagent-object) se utiliza para personalizar las conexiones a servidores HTTP.
-
-#### Parámetro *options*
-
-En el parámetro *options*, pase un objeto que pueda contener las siguientes propiedades (todas las propiedades son opcionales):
-
-:::note
-
-Las opciones de HTTPAgent se fusionarán con [opciones HTTPRequest](HTTPRequestClass.md#4dhttprequestnew) (las opciones de HTTPRequest tienen preferencia); si no se define un agente específico, se utilizará un agente global.
-
-:::
-
-| Propiedad | Tipo | Por defecto | Descripción |
-| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
-| keepAlive | Boolean | true | Activa keep alive para el agente |
-| maxSockets | Integer | 65535 | Número máximo de sockets por servidor |
-| maxTotalSockets | Integer | 65535 | Número máximo de sockets para el agente |
-| timeout | Real | indefinido | Si se define, tiempo después del cual se cierra un socket no utilizado |
-| certificatesFolder | Folder | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la carpeta activa de certificados de cliente para las solicitudes que utilizan el agente |
-| minTLSVersion | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la versión mínima de TLS para las solicitudes que utilizan este agente |
-| protocol | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Protocolo usado para las peticiones utilizando el agente |
-| validateTLSCertificate | Boolean | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Validar el certificado Tls para las solicitudes que utilizan el agente |
-
-:::note
-
-Lanzamiento En ese caso, cada servidor tendrá su propio grupo de conexiones utilizando las mismas opciones de agente.
-
-:::
-
-#### Ejemplo
-
-Creación del HTTPAgent:
-
-```4d
-var $options:={}
-$options.maxSockets:=5 //5 es el número máximo de sockets por servidor
-$options.maxTotalSockets:=10 //10 es el número máximo de sockets para el agente
-$options.validateTLSCertificate:=True //Validar el certificado del servidor
-
-var $myAgent:=4D.HTTPAgent.new($options)
-
-```
-
-Enviando una solicitud para comprobar la hora local de cualquier ciudad:
-
-```4d
-var $options:={}
-$options.method:="GET"
-$options.agent:=$myAgent
-var $myRequest:=4D.HTTPRequest.new("http://worldtimeapi.org/api/timezone/Europe/Paris"; $options)
-
-```
-
-:::note
-
-Cuando no hay ningún agente asociado a una HTTPRequest, se utiliza un agente global con valores por defecto.
-
-:::
-
-
-
-## .params
-
-**options** : Object
-
-#### Descripción
-
-El objeto de propiedad `.params` contiene las opciones utilizadas actualmente del HTTPAgent.
-
-
-
-
-
-## .requestsCount
-
-**requestsCount** : Integer
-
-#### Descripción
-
-La propiedad `.requestsCount` contiene el número de peticiones gestionadas actualmente por el HTTPAgent.
-
-
-
-
-
-## .freeSocketsCount
-
-**freeSocketsCount** : Integer
-
-#### Descripción
-
-La propiedad `.freeSocketsCount` contiene el número de sockets libres de `maxSockets` asociados al HTTPAgent.
-
-
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/HTTPRequestClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/HTTPRequestClass.md
deleted file mode 100644
index 2af945374e7040..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/HTTPRequestClass.md
+++ /dev/null
@@ -1,427 +0,0 @@
----
-id: HTTPRequestClass
-title: HTTPRequest
----
-
-La clase `HTTPRequest` permite manejar [objetos `HTTPRequest`](#httprequest-object) que se pueden utilizar para configurar y enviar solicitudes a un servidor HTTP, así como para procesar las respuestas del servidor HTTP.
-
-La clase `HTTPRequest` está disponible en el class store `4D`. Para crear y enviar peticiones HTTP se utiliza la función [4D.HTTPRequest.new()](#4dhttprequestnew), que devuelve un [objeto `HTTPRequest`](#httprequest-object).
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R6 | Clase añadida |
-
-
-
-### Ejemplo
-
-Crear una clase `MyHttpRequestOptions` para las opciones de la petición:
-
-```4d
-Class constructor($method : Text; $headers : Object; $body : Text)
-This.method:=$method
-This.headers:=$headers
-This.body:=$body
-
-Function onResponse($request : 4D.HTTPRequest; $event : Object)
-// Mi método onResponse, si quiere manejar la petición de forma asíncrona
-
-Function onError($request : 4D.HTTPRequest; $event : Object)
-// Mi método onError, si quiere manejar la petición de forma asíncrona
-```
-
-Ahora puede crear su petición:
-
-```4d
-var $headers : Object
-$headers:=New object()
-$headers["field1"]:="value1"
-
-var myHttpRequestOptions : cs.MyHttpRequestOptions
-myHttpRequestOptions := cs.MyHttpRequestOptions.new("GET"; $headers; "")
-
-var $request : 4D.HTTPRequest
-$request:=4D.HTTPRequest.new("www.google.com"; myHttpRequestOptions)
-$request.wait() // Si desea gestionar la solicitud de forma sincrónica
-// Ahora puede utilizar $request.response para acceder al resultado de la petición o $request.error para comprobar el error que se ha producido.
-```
-
-### Objeto HTTPRequest
-
-Un objeto HTTPRequest es un objeto no compartible.
-
-Los objetos HTTPRequest ofrecen las siguientes propiedades y funciones:
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#agent) |
-| [](#datatype) |
-| [](#encoding) |
-| [](#errors) |
-| [](#headers) |
-| [](#method) |
-| [](#protocol) |
-| [](#response) |
-| [](#datatype) |
-| [](#terminate) |
-| [](#terminated) |
-| [](#timeout) |
-| [](#url) |
-| [](#wait) |
-
-
-
-## 4D.HTTPRequest.new()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------------------------------------------- |
-| 20 | Validación TLS por defecto |
-| 19 R7 | Soporte de las propiedades *automaticRedirections* y *decodeData* |
-
-
-
-**4D.HTTPRequest.new**( *url* : Text { ; *options* : Object } ) : 4D.HTTPRequest
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------------ | :-------------------------: | ------------------------------------------- |
-| url | Text | -> | URL a la que enviar la solicitud |
-| options | Object | -> | Propiedades de configuración de la petición |
-| Resultado | 4D.HTTPRequest | <- | Nuevo objeto HTTPRequest |
-
-
-
-#### Descripción
-
-La función `4D.HTTPRequest.new()` crea y envía una solicitud HTTP al servidor HTTP definido en *url* con las opciones definidas, y devuelve un objeto `4D.HTTPRequest`.
-
-El objeto `HTTPRequest` devuelto se utiliza para procesar las respuestas del servidor HTTP y llamar a los métodos.
-
-En *url*, pase la URL a la que desea enviar la petición. La sintaxis a utilizar es:
-
-```
-{http://}[{user}:[{password}]@]host[:{port}][/{path}][?{queryString}]
-{https://}[{user}:[{password}]@]host[:{port}][/{path}][?{queryString}]
-```
-
-Si se omite la parte "scheme" (`http://` o `https://`), se envía una petición https.
-
-Por ejemplo, puede pasar las siguientes cadenas:
-
-```
- http://www.myserver.com
- www.myserver.com/path
- http://www.myserver.com/path?name="jones"
- https://www.myserver.com/login
- http://123.45.67.89:8083
- http://john:smith@123.45.67.89:8083
- http://[2001:0db8:0000:0000:0000:ff00:0042:8329]
- http://[2001:0db8:0000:0000:0000:ff00:0042:8329]:8080/index.html (**)
-```
-
-#### Parámetro *options*
-
-En el parámetro *options*, pase un objeto que puede contener las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción | Por defecto |
-| ---------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
-| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPAgent a utilizar para la HTTPRequest. Las opciones del agente se fusionarán con las opciones de la petición (las opciones de la petición tienen prioridad). Si no se define un agente específico, se utiliza un agente global con valores predeterminados. | Objeto agente global |
-| automaticRedirections | Boolean | Si es true, las redirecciones se realizan automáticamente (se gestionan hasta 5 redirecciones, se devuelve la 6ª respuesta de redirección si la hay) | True |
-| body | Variant | Cuerpo de la petición (necesario en el caso de las peticiones `post` o `put`). Puede ser un texto, un blob, o un objeto. El content-type se determina a partir del tipo de esta propiedad a menos que se defina dentro de los encabezados | indefinido |
-| certificatesFolder | [Folder](FolderClass.md) | Define la carpeta de certificados de cliente activa | indefinido |
-| dataType | Text | Tipo de atributo del cuerpo de la respuesta. Valores: "text", "blob", "object", o "auto". Si "auto", el tipo de contenido del cuerpo se deducirá de su tipo MIME (object para JSON, texto para texto, javascript, xml, mensaje http y formulario codificado en url, blob en caso contrario) | "auto" |
-| decodeData | Boolean | Si true, los datos recibidos en la retrollamada `onData` se descomprimen | False |
-| encoding | Text | Se utiliza sólo en caso de peticiones con un `body` (métodos `post` o `put`). Codificación del contenido del cuerpo de la petición si es un texto, se ignora si se define content-type dentro de los encabezados | "UTF-8" |
-| headers | Object | Encabezados de la petición. Sintaxis: `headers.key=value` (*value* puede ser una colección si la misma llave debe aparecer varias veces) | Objeto vacío |
-| method | Text | "POST", "GET" u otro método | "GET" |
-| minTLSVersion | Text | Define la versión mínima de TLS: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" |
-| onData | [Function](FunctionClass.md) | Retrollamada cuando se reciben los datos del cuerpo. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
-| onError | [Function](FunctionClass.md) | Retrollamada cuando ocurre un error. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
-| onHeaders | [Function](FunctionClass.md) | Retrollamada cuando se reciben los encabezados. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
-| onResponse | [Function](FunctionClass.md) | Retrollamada cuando se recibe una respuesta. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
-| onTerminate | [Function](FunctionClass.md) | Retrollamada cuando la petición haya terminado. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
-| protocol | Text | "auto" o "HTTP1". "auto" significa HTTP1 en la implementación actual | "auto" |
-| proxyAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del proxy de gestión de objetos | indefinido |
-| serverAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del servidor de gestión de objetos | indefinido |
-| returnResponseBody | Boolean | Si false, el cuerpo de la respuesta no se devuelve en el [objeto `response`](#response). Devuelve un error si es false y `onData` es undefined | True |
-| timeout | Real | Tiempo de espera en segundos. Indefinido = sin tiempo de espera | Indefinido |
-| validateTLSCertificate | Boolean | Si false, 4D no valida el certificado TLS y no devuelve un error si no es válido (es decir, caducado, autofirmado...). Importante: en la implementación actual, la propia Autoridad de Certificación no se verifica. | True |
-
-#### Función callback (retrollamada)
-
-Todas las funciones de retrollamada reciben dos parámetros objeto:
-
-| Parámetros | Tipo |
-| ---------- | ------------------------------------------- |
-| $param1 | [`Objeto HTTPRequest`](#httprequest-object) |
-| $param2 | [Objeto `Event`](#event-object) |
-
-Esta es la secuencia de llamadas de retorno:
-
-1. `onHeaders` se llama siempre una vez
-
-2. `onData` se llama cero o varias veces (no se llama si la petición no tiene cuerpo)
-
-3. Si no se ha producido ningún error, `onResponse` siempre se llama una vez
-
-4. Si se produce un error, `onError` se ejecuta una vez (y termina la petición)
-
-5. `onTerminate` se ejecuta siempre una vez
-
-:::info
-
-Para que las funciones de retrollamada se llamen cuando no utilice [`wait()`](#wait) (llamada asíncrona), el proceso debe ser un [worker](../Develop/processes.md#worker-processes) creado con [`CALL WORKER`](../commands-legacy/call-worker.md), NO [`New process`](../commands-legacy/new-process.md).
-
-:::
-
-#### objeto evento
-
-Un objeto `event` es devuelto cuando una [función de callback](#callback-functions) es llamada. Contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| --------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------- |
-| .data | blob | Datos recibidos. Siempre es *undefined* excepto en la retrollamada `onData` |
-| .type | text | Tipo de evento. Valores posibles: "response", "error", "headers", "data", o "terminate |
-
-#### authentication object
-
-Un objeto de autenticación maneja la propiedad `options.serverAuthentication` o `options.proxyAuthentication`. Puede contener las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción | Por defecto |
-| ---------- | ---- | --------------------------------------------------------------------------------- | ----------- |
-| name | Text | Nombre usado para la autenticación | indefinido |
-| contraseña | Text | Contraseña utilizada para la autenticación | indefinido |
-| method | Text | Método utilizado para la autenticación: "basic", "digest", "auto" | "auto" |
-
-
-
-
-
-## .agent
-
-**agent** : 4D.HTTPAgent
-
-#### Descripción
-
-La propiedad `.agent` contiene el objeto `agent` pasado en [`options`](#options-parameter) o el objeto agente global si se omitió.
-
-
-
-
-
-## .dataType
-
-**dataType** : Text
-
-#### Descripción
-
-La propiedad `.dataType` contiene el `dataType` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew), "auto" si se omitió.
-
-
-
-
-
-## .encoding
-
-**encoding** : Text
-
-#### Descripción
-
-La propiedad `.encoding` contiene el `encoding` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew), "UTF-8" si se omitió.
-
-
-
-
-
-## .errors
-
-**errors** : Collection
-
-#### Descripción
-
-La propiedad `.errors` contiene la colección de todos los errores si se ha generado al menos un error.
-
-Este es el contenido de la propiedad `.errors`:
-
-| Propiedad | | Tipo | Descripción |
-| --------- | ----------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------- |
-| errors | | Collection | Pila de error 4D en caso de error |
-| | [].errCode | Number | Código de error 4D |
-| | [].message | Text | Descripción del error 4D |
-| | [].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-
-
-
-
-## .headers
-
-**headers** : Object
-
-#### Descripción
-
-La propiedad `.headers` contiene los `headers` pasados en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). Si se omite, contiene un objeto vacío.
-
-
-
-
-
-## .method
-
-**method** : Text
-
-#### Descripción
-
-La propiedad `.method` contiene el `method` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . .
-
-
-
-
-
-## .protocol
-
-**protocol** : Text
-
-#### Descripción
-
-La propiedad `.protocol` contiene el `protocol` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . Si se ha omitido o si se ha utilizado "auto", contiene la versión del protocolo utilizada.
-
-
-
-
-
-## .response
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------------------------------------------------------------- |
-| 19 R8 | `.headers` devuelve los nombres en minúsculas. Nueva propiedad `.rawHeaders` |
-
-
-
-**response** : Object
-
-#### Descripción
-
-La propiedad `.response` contiene la respuesta a la solicitud si ha recibido al menos el código de estado, de lo contrario undefined.
-
-Un objeto `response` es un objeto no compartible. Ofrece las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| --------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| .body | Variant | Cuerpo de la respuesta. El tipo del mensaje se define según la propiedad [`dataType`](#datatype). Indefinido si el cuerpo no se ha recibido todavía |
-| .headers | Object | Encabezados de la respuesta. Los nombres de los encabezados se devuelven en minúsculas. `.key` = valor (el valor puede ser una colección si la misma llave aparece varias veces). Indefinido si el los encabezados no se ha recibido aún. |
-| .status | Number | Código de estado de la respuesta |
-| .statusText | Text | Mensaje explicando el código de estado |
-| .rawHeaders | Object | Encabezados de la respuesta. Los nombres de los encabezadoss se devuelven intactos (con sus mayúsculas y minúsculas originales). `.key` = valor (el valor puede ser una colección si la misma llave aparece varias veces). Indefinido si el los encabezados no se ha recibido aún. |
-
-
-
-
-
-## .returnResponseBody
-
-**returnResponseBody** : Boolean
-
-#### Descripción
-
-La propiedad `.returnResponseBody` contiene el `returnResponseBody` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . Si se omite, contiene True.
-
-
-
-
-
-## .terminate()
-
-**.terminate()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-> Esta función es hilo seguro.
-
-La función `.terminate()` interrumpe la solicitud HTTP. Activa el evento `onTerminate`.
-
-
-
-
-
-## .terminated
-
-**terminated** : Boolean
-
-#### Descripción
-
-La propiedad `.terminated` contiene True si la solicitud es terminada (después de la llamada a `onTerminate`), false de lo contrario.
-
-
-
-
-
-## .timeout
-
-**timeout** : Real
-
-#### Descripción
-
-La propiedad `.timeout` contiene el `timeout` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . .
-
-
-
-
-
-## .url
-
-**url** : Text
-
-#### Descripción
-
-La propiedad `.url` contiene la URL de la solicitud HTTP.
-
-
-
-
-
-## .wait()
-
-**.wait**( { *timeout* : Real } ) : 4D.HTTPRequest
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------------------ | :-------------------------: | ----------------------------------- |
-| timeout | Real | -> | Tiempo máximo de espera en segundos |
-| Resultado | 4D.HTTPRequest | <- | Objeto HTTPRequest |
-
-
-
-#### Descripción
-
-> Esta función es hilo seguro.
-
-La función `wait()` espera una respuesta del servidor o hasta que se alcance el `timeout` especificado.
-
-Si se pasa un *timeout*, la función espera la duración especificada en este parámetro. Se aceptan decimales.
-
-Si la respuesta del servidor ya ha llegado, la función regresa inmediatamente.
-
-:::note
-
-Durante la ejecución de .wait(), se ejecutan las funciones de retrollamada de los workers, tanto si proceden de otras instancias `HTTPRequest` o [`SystemWorker`](SystemWorkerClass.md), como de otras llamadas [`CALL WORKER`](../commands-legacy/call-worker.md). Puede salir de un .wait() llamando a [`terminate()`](#terminate) desde una retrollamada.
-
-:::
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/IMAPTransporterClass.md
deleted file mode 100644
index e3e944343abe61..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/IMAPTransporterClass.md
+++ /dev/null
@@ -1,1850 +0,0 @@
----
-id: IMAPTransporterClass
-title: IMAPTransporter
----
-
-La clase `IMAPTransporter` le permite recuperar mensajes de un servidor de correo IMAP.
-
-### Objeto IMAP Transporter
-
-Los objetos IMAP Transporter se instancian con el comando [IMAP New transporter](../commands/imap-new-transporter.md). Ofrecen las siguientes propiedades y funciones:
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#acceptunsecureconnection) |
-| [](#addflags) |
-| [](#append) |
-| [](#authenticationmode) |
-| [](#checkconnection) |
-| [](#checkconnectiondelay) |
-| [](#connectiontimeout) |
-| [](#copy) |
-| [](#createbox) |
-| [](#delete) |
-| [](#deletebox) |
-| [](#expunge) |
-| [](#getboxinfo) |
-| [](#getboxlist) |
-| [](#getdelimiter) |
-| [](#getmail) |
-| [](#getmails) |
-| [](#getmimeasblob) |
-| [](#host) |
-| [](#logfile) |
-| [](#move) |
-| [](#numtoid) |
-| [](#removeflags) |
-| [](#renamebox) |
-| [](#port) |
-| [](#searchmails) |
-| [](#selectbox) |
-| [](#subscribe) |
-| [](#unsubscribe) |
-| [](#user) |
-
-## 4D.IMAPTransporter.new()
-
-**4D.IMAPTransporter.new**( *server* : Object ) : 4D.IMAPTransporter
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------------------------------- | :-------------------------: | ----------------------------------------------------- |
-| server | Object | -> | Información del servidor de correo |
-| Resultado | 4D.IMAPTransporter | <- | [Objeto transportador IMAP](#objeto-imap-transporter) |
-
-
-
-#### Descripción
-
-La función `4D.IMAPTransporter.new()` crea y devuelve un nuevo objeto de tipo `4D.IMAPTransporter`. Es idéntico al comando [`IMAP New transporter`](../commands/imap-new-transporter.md) (acceso directo).
-
-
-
-
-
-## .addFlags()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------- |
-| 20 | Soporta palabras claves personalizadas |
-| 18 R6 | Añadidos |
-
-
-
-**.addFlags**( *msgIDs* : any ; *keywords* : Object ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 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 claves a añadir |
-| Resultado | Object | <- | Estado de la operación addFlags |
-
-
-
-#### Descripción
-
-La función `.addFlags()` agrega banderas a los `msgIDs` para las `keywords` especificadas.
-
-En el parámetro `msgIDs`, puedes pasar:
-
-- una *colección* que contiene los IDs únicos de mensajes específicos o
-- el ID único (*text*) de un solo mensaje o
-- la siguiente constante (*longint*) para todos los mensajes del buzón seleccionado:
-
-| Constante | Valor | Comentario |
-| --------- | ----- | ----------------------------------------------------- |
-| IMAP all | 1 | Seleccionar todos los mensajes del buzón seleccionado |
-
-El parámetro `keywords` permite definir las banderas a añadir a `msgIDs`. Puede utilizar las siguientes banderas estándar, así como banderas personalizadas (la compatibilidad con banderas personalizadas depende de la implementación del servidor):
-
-| Propiedad | Tipo | Descripción |
-| --------------- | ------- | ---------------------------------------------------- |
-| $draft | Boolean | True para añadir el marcador "draft" al mensaje |
-| $seen | Boolean | True para añadir el marcador "seen" al mensaje |
-| $flagged | Boolean | True para añadir el marcador "flagged" al mensaje |
-| $answered | Boolean | True para añadir el marcador "answered" al mensaje |
-| $deleted | Boolean | True para añadir el marcador "deleted" al mensaje |
-| `` | Boolean | True para añadir la bandera personalizada al mensaje |
-
-Los nombres de las banderas personalizadas deben respetar esta regla: la palabra clave debe ser una cadena que no distinga entre mayúsculas y minúsculas, excluyendo los caracteres de control y el espacio, y no puede incluir ninguno de estos caracteres: `( ) { ] % * " \`
-
-> - Para que una palabra clave se tenga en cuenta tiene que ser true.
-> - La interpretación de los indicadores de palabras claves puede variar según el cliente de correo.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-```4d
-var $options;$transporter;$boxInfo;$status : Object
-
-$options:=New object
-$options.host:="imap.gmail.com"
-$options.port:=993
-$options.user:="4d@gmail.com"
-$options.password:="xxxxx"
-
-// Crear transportador
-$transporter:=IMAP New transporter($options)
-
-// Seleccionar buzón de correo
-$boxInfo:=$transporter.selectBox("INBOX")
-
-// Marcar todos los mensajes de INBOX como leídos/vistos
-$flags:=New object
-$flags["$seen"]:=True
-$status:=$transporter.addFlags(IMAP all;$flags)
-```
-
-
-
-
-
-## .append()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.append**( *mailObj* : Object ; *destinationBox* : Text ; *options* : Object ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| -------------- | ------ | :-------------------------: | ------------------------------------------- |
-| mailObj | Object | -> | Objeto Email |
-| destinationBox | Text | -> | Buzón para recibir el objeto Email |
-| options | Object | -> | Objeto que contiene información del charset |
-| Resultado | Object | <- | Estado de la operación |
-
-
-
-#### Descripción
-
-La función `.append()` añade un `mailObj` al `destinationBox`.
-
-En el parámetro `mailObj`, pase un objeto email. Para obtener una descripción completa de las propiedades del correo, consulte [objeto Email](EmailObjectClass.md#objeto-email). La función `.append()` soporta los marcadores de palabras claves en el atributo `keywords` de objetos Email.
-
-El parámetro opcional `destinationBox` permite pasar el nombre de un buzón donde se añadirá el objeto `mailObj`. Si se omite, se utiliza el buzón actual.
-
-En el parámetro opcional `options`, puede pasar un objeto para definir el conjunto de caracteres y la codificación para partes específicas del correo electrónico. Propiedades disponibles:
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| headerCharset | Text | Charset y codificación utilizados para las siguientes partes del correo electrónico: asunto, nombres de archivos adjuntos y atributo(s) del nombre del correo electrónico. Valores posibles: ver la tabla de charsets posibles a continuación |
-| bodyCharset | Text | Charset y codificación utilizados para el contenido html y el texto del cuerpo del correo electrónico. Valores posibles: ver la tabla de charsets posibles a continuación |
-
-Charsets posibles:
-
-| Constante | Valor | Comentario |
-| ------------------------ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| mail mode ISO2022JP | US-ASCII_ISO-2022-JP_UTF8_QP |
headerCharset: US-ASCII si es posible, Japanese (ISO-2022-JP) &Quoted-printable si es posible, de lo contrario UTF-8 & Quoted-printable
bodyCharset: US-ASCII si es posible, Japanese (ISO-2022-JP) & 7-bit si es posible, de lo contrario UTF-8 & Quoted-printable
|
-| mail mode ISO88591 | ISO-8859-1 |
headerCharset: ISO-8859-1 & Quoted-printable
bodyCharset: ISO-8859-1 & 8-bit
|
-| mail mode UTF8 | US-ASCII_UTF8_QP | headerCharset & bodyCharset: US-ASCII si es posible, de lo contrario UTF-8 & Quoted-printable (**valor por defecto**) |
-| mail mode UTF8 in base64 | US-ASCII_UTF8_B64 | headerCharset & bodyCharset: US-ASCII si es posible, de lo contrario UTF-8 & base64 |
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-Para guardar un correo electrónico en el buzón de borradores:
-
-```4d
-var $settings; $status; $msg; $imap: Object
-
-$settings:=New object("host"; "domain.com"; "user"; "xxxx"; "password"; "xxxx"; "port"; 993)
-
-$imap:=IMAP New transporter($settings)
-
-$msg:=New object
-$msg.from:="xxxx@domain.com"
-$msg.subject:="Lorem Ipsum"
-$msg.textBody:="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
-$msg.keywords:=New object
-$msg.keywords["$seen"]:=True//flag the message as read
-$msg.keywords["$draft"]:=True//flag the message as a draft
-
-$status:=$imap.append($msg; "Drafts")
-```
-
-
-
-
-
-
-
-
-
-## .checkConnectionDelay
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.checkConnectionDelay** : Integer
-
-#### Descripción
-
-La propiedad `.checkConnectionDelay` contiene el tiempo máximo (en segundos) permitido antes de verificar la conexión con el servidor. Si se supera este tiempo entre dos llamadas al método, se comprobará la conexión con el servidor. Por defecto, si la propiedad no se ha definido en el objeto *server*, el valor es de 300.
-
-> **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.
-
-
-
-
-
-
-
-## .copy()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R5 | Añadidos |
-
-
-
-**.copy**( *msgsIDs* : Collection ; *destinationBox* : Text ) : Object **.copy**( *allMsgs* : Integer ; *destinationBox* : Text ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| -------------- | ---------- | :-------------------------: | ---------------------------------------------------------------------------- |
-| msgsIDs | Collection | -> | Colección de identificadores únicos de mensajes (cadenas) |
-| allMsgs | Integer | -> | `IMAP all`: todos los mensajes en el buzón seleccionado |
-| destinationBox | Text | -> | Buzón para recibir mensajes copiados |
-| Resultado | Object | <- | Estado de la operación de copia |
-
-
-
-#### Descripción
-
-La función `.copy()` copia los mensajes definidos por *msgsIDs* o *allMsgs* en la *destinationBox* en el servidor IMAP.
-
-Puede pasar:
-
-- en el parámetro *msgsIDs*, una colección que contiene los IDs únicos de los mensajes específicos a copiar, o
-- en el parámetro *allMsgs*, la constante `IMAP all` (entero) para copiar todos los mensajes del buzón seleccionado.
-
-El parámetro *destinationBox* permite pasar un valor texto con el nombre del buzón donde se colocarán las copias de los mensajes.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo 1
-
-Para copiar una selección de mensajes:
-
-```4d
- var $server;$boxInfo;$status : Object
- var $mailIds : Collection
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("inbox")
-
- //obtener la colección de IDs únicos de los mensajes
- $mailIds:=$transporter.searchMails("subject \"4D new feature:\"")
-
- // copiar los mensajes encontrados en el buzón "documents"
- $status:=$transporter.copy($mailIds;"documents")
-```
-
-#### Ejemplo 2
-
-Para copiar todos los mensajes del buzón actual:
-
-```4d
- var $server;$boxInfo;$status : Object
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
-
- $boxInfo:=$transporter.selectBox("inbox")
-
- // copiar los mensajes encontrados en el buzón "documents"
- $status:=$transporter.copy(IMAP all;"documents")
-```
-
-
-
-
-
-## .createBox()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 | Añadidos |
-
-
-
-**.createBox**( *name* : Text ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | -------------------------------------------- |
-| name | Text | -> | Nombre del nuevo buzón |
-| Resultado | Object | <- | Estado de la operación de creación del buzón |
-
-
-
-#### Descripción
-
-La función `.createBox()` crea un buzón con el nombre dado. Si el caracter separador de jerarquía del servidor IMAP aparece en otra parte del nombre del buzón, el servidor IMAP creará todos los nombre padre necesarios para crear el buzón dado.
-
-En otras palabras, un intento de crear "Projects/IMAP/Doc" en un servidor en el que "/" es el carácter separador de jerarquía creará:
-
-- Sólo el buzón "Doc" si "Projects" & "IMAP" ya existen.
-- Los buzones "IMAP" & "Doc" si sólo existe "Projects".
-- Los buzones "Projects" & "IMAP" & "Doc", si no existen.
-
-En el parámetro `name`, pase el nombre del nuevo buzón.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-Para crear un nuevo buzón "Invoices":
-
-```4d
-var $pw : text
-var $options; $transporter; $status : object
-
-$options:=New object
-
-$pw:=Request("Please enter your password:")
-If(OK=1)
-$options.host:="imap.gmail.com"
-$options.user:="test@gmail.com"
-$options.password:=$pw
-
-$transporter:=IMAP New transporter($options)
-
-$status:=$transporter.createBox("Invoices")
-
-If ($status.success)
-ALERT("Mailbox creation successful!")
-Else
-ALERT("Error: "+$status.statusText)
-End if
-End if
-```
-
-
-
-
-
-## .delete()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R5 | Añadidos |
-
-
-
-**.delete**( *msgsIDs* : Collection ) : Object **.delete**( *allMsgs* : Integer ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ---------------------------------------------------------------------------- |
-| msgsIDs | Collection | -> | Colección de identificadores únicos de mensajes (cadenas) |
-| allMsgs | Integer | -> | `IMAP all`: todos los mensajes en el buzón seleccionado |
-| Resultado | Object | <- | Estado de la operación de eliminación |
-
-
-
-#### Descripción
-
-La función `.delete()` define el marcador "deleted" para los mensajes definidos en `msgsIDs` o `allMsgs`.
-
-Puede pasar:
-
-- en el parámetro `msgsIDs`, una colección contiene los IDs únicos de los mensajes específicos a eliminar, o
-- en el parámetro `allMsgs`, la constante `IMAP all` (entero) para borrar todos los mensajes en el buzón de correo seleccionado.
-
-La ejecución de esta función no elimina realmente los mensajes. Los mensajes con el marcador "delete" pueden seguir siendo encontrados por la función [.searchMails()](#searchmails). Los mensajes marcados se eliminan del servidor IMAP con la [función `.expunge()`](#expunge) o al seleccionar otro buzón o cuando el [objeto transporter](#imap-transporter-object) (creado con [IMAP New transporter](../commands/imap-new-transporter.md)) es destruido.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo 1
-
-Para eliminar una selección de mensajes:
-
-```4d
- var $server;$boxInfo;$status : Object
- var $mailIds : Collection
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("Inbox")
-
- //obtener la colección de IDs únicos de los mensajes
- $mailIds:=$transporter.searchMails("subject \"Reports\"")
-
- // Borrar los mensajes seleccionados
- $status:=$transporter.delete($mailIds)
-```
-
-#### Ejemplo 2
-
-Para eliminar todos los mensajes del buzón actual:
-
-```4d
- var $server;$boxInfo;$status : Object
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("Junk Email")
-
- // Borrar los mensajes seleccionados en el buzón actual
- $status:=$transporter.delete(IMAP all)
-```
-
-
-
-
-
-## .deleteBox()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 | Añadidos |
-
-
-
-**.deleteBox**( *name* : Text ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ----------------------------------------------- |
-| name | Text | -> | Nombre del buzón a eliminar |
-| Resultado | Object | <- | Estado de la operación de eliminación del buzón |
-
-
-
-#### Descripción
-
-La función `.deleteBox()` elimina permanentemente el buzón de correo con el `name` dado del servidor IMAP. Intentar eliminar un INBOX o un buzón que no existe generará un error.
-
-En el parámetro `name`, pase el nombre del buzón a eliminar.
-
-> - La función no puede eliminar un buzón que tiene buzones hijos si el buzón padre tiene el atributo "\Noselect".
-> - Todos los mensajes del buzón eliminado también se borrarán.
-> - La posibilidad de eliminar un buzón depende del servidor de correo.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-Para eliminar el buzón secundario "Nova Orion Industries" del interior del buzón "Bills":
-
-```4d
-var $pw; $name : text
-var $options; $transporter; $status : object
-
-$options:=New object
-
-$pw:=Request("Please enter your password:")
-
-If(OK=1) $options.host:="imap.gmail.com"
-$options.user:="test@gmail.com"
-$options.password:=$pw
-
-$transporter:=IMAP New transporter($options)
-
-// eliminar buzón
-$name:="Bills"+$transporter.getDelimiter()+"Nova Orion Industries"
-$status:=$transporter.deleteBox($name)
-
-If ($status.success)
- ALERT("Mailbox deletion successful!")
- Else
- ALERT("Error: "+$status.statusText)
- End if
-End if
-```
-
-
-
-
-
-## .expunge()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.expunge()** : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ------------------------------ |
-| Resultado | Object | <- | Estado de la operación expunge |
-
-
-
-#### Descripción
-
-La función `.expunge()` elimina todos los mensajes con la bandera "eliminada" del servidor de correo IMAP. La bandera "deleted" puede definirse con los métodos [`.delete()`](#delete) o [`.addFlags()`](#addflags).
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-```4d
-var $options;$transporter;$boxInfo;$status : Object
-var $ids : Collection
-
-$options:=New object
-$options.host:="imap.gmail.com"
-$options.port:=993
-$options.user:="4d@gmail.com"
-$options.password:="xxxxx"
-
-// Crear transportador
-$transporter:=IMAP New transporter($options)
-
-// Seleccionar buzón
-$boxInfo:=$transporter.selectBox("INBOX")
-
-// Buscar y eliminar todos los mensajes vistos en INBOX
-$ids:=$transporter.searchMails("SEEN")
-$status:=$transporter.delete($ids)
-
-// Purgar todos los mensajes marcados como borrados
-$status:=$transporter.expunge()
-```
-
-
-
-
-
-## .getBoxInfo()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | --------------------- |
-| 20 | \*se devuelve el *id* |
-| 18 R5 | *name* es opcional |
-| 18 R4 | Añadidos |
-
-
-
-**.getBoxInfo**( { *name* : Text }) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ---------------- |
-| name | Text | -> | Nombre del buzón |
-| Resultado | Object | <- | objeto boxInfo |
-
-
-
-#### Descripción
-
-La función `.getBoxInfo()` devuelve un objeto `boxInfo` correspondiente al buzón de correo actual o el buzón de correo *name*. Esta función devuelve la misma información que [`.selectBox()`](#selectbox) sin cambiar el buzón actual.
-
-En el parámetro opcional *name*, pase el nombre del buzón a acceder. El nombre representa una jerarquía inequívoca de izquierda a derecha, con niveles separados por un carácter delimitador específico. El delimitador se puede encontrar con la función [`.getDelimiter()`](#getdelimiter).
-
-Si el buzón *name* no es seleccionable o no existe, la función genera un error y devuelve **null**.
-
-**Objeto devuelto**
-
-El objeto `boxInfo` devuelto contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ------ | ------------------------------------------------------------------------------------------------- |
-| name | Text | Nombre del buzón |
-| mailCount | Number | Número de mensajes en el buzón |
-| mailRecent | Number | Número de mensajes con el marcador "reciente" (que indica los mensajes nuevos) |
-| id | text | Id. único del buzón |
-| mailUnseen | Number | Número de mensajes marcados como "unseen" |
-
-#### Ejemplo
-
-```4d
- var $transporter : 4D.IMAPTransporter
- $transporter:=IMAP New transporter($server)
-
- $info:=$transporter.getBoxInfo("INBOX")
- ALERT("INBOX contains "+String($info.mailRecent)+" recent emails.")
-```
-
-
-
-
-
-## .getBoxList()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------------------- |
-| 18 R4 | Añadidos |
-| 19 | Añadir parámetro `isSubscribed` |
-
-
-
-**.getBoxList**( { *parameters* : Object } ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ---------------------------- |
-| parameters | Object | -> | Objeto de parámetro |
-| Resultado | Collection | <- | Colección de objetos mailbox |
-
-
-
-#### Descripción
-
-La función `.getBoxList()` devuelve una colección de bandejas de entrada que describe todas las bandejas de entrada disponibles. Esta función permite gestionar localmente la lista de mensajes localizados en el servidor de correo IMAP.
-
-En el parámetro opcional `parameters`, pase un objeto que contenga valores para filtrar los buzones devueltos. Puede pasar:
-
-| Propiedad | Tipo | Descripción |
-| ----------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| isSubscribed | Boolean |
**True** para devolver sólo los buzones a los que se haya suscrito
**False** para devolver todos los buzones disponibles
|
-| names | Collection | Colección de objetos que contienen un atributo "name" o colección de textos que contienen los nombres de las cajas |
-| withBoxProperties | Boolean | Si true (por defecto): agrega los atributos `selectable`, `inferior` e `interesting` al objeto de resultado. Si es false, se omiten estos atributos. |
-| withBoxInfo | Boolean | El valor por defecto es false. Si true, agrega los atributos `mailCount`, `mailRecent` e `id` al objeto resultado. |
-
-#### Resultado
-
-Cada objeto de la colección devuelta contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ------------------------------------------------------------------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| \[].name | Text | Nombre del buzón. Devuelto si withBoxProperties=true o withBoxInfo=true |
-| \[].selectable | Boolean | Indica si los derechos de acceso permiten o no seleccionar el buzón de correo:
true - el buzón puede ser seleccionado
false - el buzón de correo no puede ser seleccionado
Devuelto si withBoxProperties=true |
-| \[].inferior | Boolean | Indica si los derechos de acceso permiten o no crear una jerarquía inferior en el buzón:
true - se puede crear un nivel inferior
false - no se puede crear un nivel inferior
Se devuelve si withBoxProperties=true |
-| \[].interesting | Boolean | Indica si el buzón ha sido marcado como "interesante" por el servidor:
true - El buzón ha sido marcado como "interesante" por el servidor. Por ejemplo, puede contener nuevos mensajes.
false - El buzón no ha sido marcado como "interesante" por el servidor.
Devuelto si withBoxProperties=true |
-| [].mailCount | Number | Número de mensajes en el buzón. Devuelto si withBoxInfo=true |
-| [].mailRecent | Number | Número de mensajes marcados como "recent" (indicando nuevos mensajes). Devuelto si withBoxInfo=true |
-| [].mailUnseen | Number | Número de mensajes marcados como "unseen". Devuelto si withBoxInfo=true |
-| [].id | Text | Identificador único del buzón. Devuelto si withBoxInfo=true |
-
-Si la cuenta no contiene buzones, se devuelve una colección vacía.
-
-> - Si no hay ninguna conexión abierta, `.getBoxList()` abrirá una conexión.
-> - Si la conexión no ha sido utilizada desde el retraso de conexión designado (ver `IMAP New transporter`), la función `.checkConnection()` se llama automáticamente.
-
-#### Ejemplo
-
-```4d
- var $transporter : 4D.IMAPTransporter
- $transporter:=IMAP New transporter($server)
-
- $boxList:=$transporter.getBoxList()
-
- For each($box;$boxList)
- If($box.interesting)
- $split:=Split string($box.name;$transporter.getDelimiter())
- ALERT("New emails are available in the box: "+$split[$split.length-1])
- End if
- End for each
-```
-
-
-
-
-
-## .getDelimiter()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.getDelimiter()** : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-------------------------: | --------------------------------- |
-| Resultado | Text | <- | Caracter delimitador de jerarquía |
-
-
-
-#### Descripción
-
-La función `.getDelimiter()` devuelve el caracter utilizado para delimitar niveles de jerarquía en el nombre del buzón.
-
-El delimitador es un carácter que puede utilizarse para:
-
-- crear buzones de nivel inferior
-- buscar más arriba o más abajo en la jerarquía del buzón
-
-#### Resultado
-
-Caracter delimitador del nombre del buzón.
-
-> - Si no hay ninguna conexión abierta, `.getDelimiter()` abrirá una conexión.
-> - Si la conexión no se ha utilizado desde la [duración máxima definida](#checkconnectiondelay), se llama automáticamente a la función [`.checkConnection()`](#checkconnection).
-
-#### Ejemplo
-
-```4d
- var $transporter : 4D.IMAPTransporter
- $transporter:=IMAP New transporter($server)
-
- $boxList:=$transporter.getBoxList()
-
- For each($box;$boxList)
- If($box.interesting)
- $split:=Split string($box.name;$transporter.getDelimiter())
- ALERT("New emails are available in the box: "+$split[$split.length-1])
- End if
- End for each
-```
-
-
-
-
-
-## .getMail()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.getMail**( *msgNumber*: Integer { ; *options* : Object } ) : Object **.getMail**( *msgID*: Text { ; *options* : Object } ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ---------------------------------------------- |
-| msgNumber | Integer | -> | Número de secuencia del mensaje |
-| msgID | Text | -> | ID único del mensaje |
-| options | Object | -> | Instrucciones sobre la gestión de mensajes |
-| Resultado | Object | <- | [Objet Email](EmailObjectClass.md#objet-email) |
-
-
-
-#### Descripción
-
-La función `.getMail()` devuelve el objeto `Email` correspondiente al *msgNumber* o *msgID* en el buzón designado por el `IMAP_transporter`. Esta función permite recuperar la información sobre el email.
-
-En el primer parámetro, puede pasar:
-
-- *msgNumber*, un valor *integer* indicando el número de secuencia del mensaje a recuperar o
-- *msgID*, un valor *text* indicando el ID único del mensaje a recuperar.
-
-El parámetro opcional *options* permite pasar un objeto que define las instrucciones adicionales para la gestión del mensaje. Las siguientes propiedades están disponibles:
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| updateSeen | boolean | Si True, el mensaje se marca como "visto" en el buzón. Si es False, el mensaje no se marca como "visto". Valor por defecto: True |
-| withBody | boolean | Pase True para devolver el cuerpo del mensaje. Si es False, sólo se devuelve el encabezado del mensaje. Valor por defecto: True |
-
-> - La función genera un error y devuelve **Null** si *msgID* designa un mensaje inexistente,
-> - Si no se selecciona ningún buzón con la función [`.selectBox()`](#selectbox), se genera un error,
-> - Si no hay ninguna conexión abierta, `.getMail()` abrirá una conexión el último buzón especificado con [`.selectBox()`](#selectbox)\`.
-
-#### Resultado
-
-`.getMail()` devuelve un objeto [`Email`](EmailObjectClass.md#email-object) con las siguientes propiedades IMAP específicas: *id*, *receivedAt*, y *size*.
-
-#### Ejemplo
-
-Quiere obtener el mensaje con ID = 1:
-
-```4d
- var $server : Object
- var $info; $mail; $boxInfo : Variant
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- //crear transportador
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("Inbox")
-
- //obtener el objeto Email con ID 1
- $mail:=$transporter.getMail(1)
-```
-
-
-
-
-
-## .getMails()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R5 | Añadidos |
-
-
-
-**.getMails**( *ids* : Collection { ; *options* : Object } ) : Object **.getMails**( *startMsg* : Integer ; *endMsg* : Integer { ; *options* : Object } ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| ids | Collection | -> | Colección de identificadores de mensajes |
-| startMsg | Integer | -> | Número de secuencia del primer mensaje |
-| endMsg | Integer | -> | Número de secuencia del último mensaje |
-| options | Object | -> | Instrucciones sobre la gestión de mensajes |
-| Resultado | Object | <- | Objeto que contiene
una colección de [objetos Email](EmailObjectClass.md#email-object) y
una colección de IDs o de números para los mensajes que faltan, si los hay
|
-
-
-
-#### Descripción
-
-La función `.getMails()` devuelve un objeto que contiene una colección de objetos `Email`.
-
-**Primera sintaxis:**
-
-***.getMails( ids { ; options } ) -> result***
-
-La primera sintaxis permite recuperar los mensajes en función de sus identificadores.
-
-En el parámetro *ids*, pase una colección de IDs para los mensajes a devolver. Puedes obtener los IDs con [`.getMail()`](#getmail).
-
-El parámetro opcional *options* permite definir las partes de los mensajes a devolver. Consulte la tabla **Options** a continuación para obtener una descripción de las propiedades disponibles.
-
-**Segunda sintaxis:**
-
-***.getMails( startMsg ; endMsg { ; options } ) -> result***
-
-La segunda sintaxis permite recuperar los mensajes en función de un rango secuencial. Los valores pasados representan la posición de los mensajes en el buzón.
-
-En el parámetro *startMsg*, pase un valor *entero* correspondiente al número del primer mensaje en un rango secuencial. Si se pasa un número negativo (*startMsg* <= 0), se utilizará el primer mensaje del buzón como inicio de la secuencia.
-
-En el parámetro *endMsg*, pase un valor *entero* correspondiente al número del último mensaje que se incluirá en un rango secuencial. Si se pasa un número negativo (*endMsg* <= 0), se utilizará el último mensaje del buzón como fin de secuencia.
-
-El parámetro opcional *options* permite definir las partes de los mensajes a devolver.
-
-**Options**
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| updateSeen | Boolean | Si True, los mensajes especificados se marcan como "vistos" en el buzón. Si False, los mensajes no se marcan como "vistos". Valor por defecto: True |
-| withBody | Boolean | Pase True para devolver el cuerpo de los mensajes específicos. Si False, sólo se devuelve los encabezados de los mensajes. Valor por defecto: True |
-
-> - Si no se selecciona ningún buzón con el comando [`.selectBox()`](#selectbox), se genera un error.
-> - Si no hay ninguna conexión abierta, `.getMails()` abrirá una conexión el último buzón especificado con [`.selectBox()`](#selectbox).
-
-#### Resultado
-
-`.getMails()` devuelve un objeto que contiene las siguientes colecciones:
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| lista | Collection | Colección de [`objetos Email`](EmailObjectClass.md#objeto-email). Si no se encuentran objetos Email, se devuelve una colección vacía. |
-| notFound | Collection | Colección de:
primera sintaxis - IDs de mensajes previamente pasados que no existen
segunda sintaxis - números de secuencia de mensajes entre startMsg y endMsg que no existen
Si se encuentran todos los mensajes, se devuelve una colección vacía. |
-
-#### Ejemplo
-
-Quiere recuperar los 20 correos electrónicos más recientes sin cambiar el estado "visto":
-
-```4d
- var $server,$boxInfo,$result : Object
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- //crear transportador
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("INBOX")
-
- If($boxInfo.mailCount>0)
- // recuperar los encabezados de los últimos 20 mensajes sin marcarlos como leídos
- $result:=$transporter.getMails($boxInfo.mailCount-20;$boxInfo.mailCount;\
- New object("withBody";False;"updateSeen";False))
- For each($mail;$result.list)
- // ...
- End for each
- End if
-```
-
-
-
-
-
-## .getMIMEAsBlob()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R4 | Añadidos |
-
-
-
-**.getMIMEAsBlob**( *msgNumber* : Integer { ; *updateSeen* : Boolean } ) : Blob **.getMIMEAsBlob**( *msgID* : Text { ; *updateSeen* : Boolean } ) : Blob
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------- |
-| msgNumber | Integer | -> | Número de secuencia del mensaje |
-| msgID | Text | -> | ID único del mensaje |
-| updateSeen | Boolean | -> | Si True, el mensaje se marca como "visto" en el buzón. Si False, el mensaje se deja igual. |
-| Resultado | BLOB | <- | Blob de la cadena MIME devuelta por el servidor de correo |
-
-
-
-#### Descripción
-
-La función `.getMIMEAsBlob()` devuelve un BLOB con el contenido MIME del mensaje correspondiente al *msgNumber* o *msgID* en el buzón designado por el `IMAP_transporter`.
-
-En el primer parámetro, puede pasar:
-
-- *msgNumber*, un valor *integer* indicando el número de secuencia del mensaje a recuperar o
-- *msgID*, un valor *text* indicando el ID único del mensaje a recuperar.
-
-El parámetro opcional *updateSeen* permite indicar si el mensaje está marcado como "visto" en el buzón. Puede pasar:
-
-- **True** - para marcar el mensaje como "visto" (indicando que el mensaje ha sido leído)
-- **False** - para dejar intacto el estado "visto" del mensaje
-
-> * La función devuelve un BLOB vacío si *msgNumber* o msgID\* designa un mensaje inexistente,
-> * Si no se selecciona ningún buzón con el comando [`.selectBox()`](#selectbox), se genera un error,
-> * Si no hay ninguna conexión abierta, `.getMIMEAsBlob()` abrirá una conexión el último buzón especificado con `.selectBox()`.
-
-#### Resultado
-
-`.getMIMEAsBlob()` devuelve un `BLOB` que puede almacenarse en una base de datos o convertirse en un objeto [`Email`](EmailObjectClass.md#email-object) con el comando `MAIL Convert from MIME`.
-
-#### Ejemplo
-
-```4d
- var $server : Object
- var $boxInfo : Variant
- var $blob : Blob
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com"
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- //crear transportador
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("Inbox")
-
- //obtener BLOB
- $blob:=$transporter.getMIMEAsBlob(1)
-```
-
-
-
-
-
-
-
-
-
-## .move()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R5 | Añadidos |
-
-
-
-**.move**( *msgsIDs* : Collection ; *destinationBox* : Text ) : Object **.move**( *allMsgs* : Integer ; *destinationBox* : Text ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| -------------- | ---------- | :-------------------------: | ---------------------------------------------------------------------------- |
-| msgsIDs | Collection | -> | Colección de identificadores únicos de mensajes (cadenas) |
-| allMsgs | Integer | -> | `IMAP all`: todos los mensajes en el buzón seleccionado |
-| destinationBox | Text | -> | Buzón para recibir los mensajes desplazados |
-| Resultado | Object | <- | Estado de la operación de desplazamiento |
-
-
-
-#### Descripción
-
-La función `.move()` mueve los mensajes definidos por *msgsIDs* o *allMsgs* a la *destinationBox* del servidor IMAP.
-
-Puede pasar:
-
-- en el parámetro *msgsIDs*, una colección contiene los IDs únicos de los mensajes específicos a mover, o
-- en el parámetro *allMsgs*, la constante `IMAP all` (entero) para desplazar todos los mensajes del buzón seleccionado.
-
-El parámetro *destinationBox* permite pasar un valor texto con el nombre del buzón donde los mensajes serán desplazados.
-
-> Esta función sólo es compatible con los servidores IMAP que cumplen la RFC [8474](https://tools.ietf.org/html/rfc8474).
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo 1
-
-Para mover una selección de mensajes:
-
-```4d
- var $server;$boxInfo;$status : Object
- var $mailIds : Collection
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("inbox")
-
- //obtener la colección de IDs únicos de los mensajes
- $mailIds:=$transporter.searchMails("subject \"4D new feature:\"")
-
- // Mover los mensajes encontrados del buzón actual al buzón "documents"
- $status:=$transporter.move($mailIds;"documents")
-```
-
-#### Ejemplo 2
-
-Para mover todos los mensajes del buzón actual:
-
-```4d
- var $server;$boxInfo;$status : Object
- var $transporter : 4D.IMAPTransporter
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("inbox")
-
- // mover todos los mensajes del buzón actual al buzón "documents"
- $status:=$transporter.move(IMAP all;"documents")
-```
-
-
-
-
-
-## .numToID()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R5 | Añadidos |
-
-
-
-**.numToID**( *startMsg* : Integer ; *endMsg* : Integer ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ----------------------------------------------- |
-| startMsg | Integer | -> | Número de secuencia del primer mensaje |
-| endMsg | Integer | -> | Número de secuencia del último mensaje |
-| Resultado | Collection | <- | Colección de identificadores de mensajes únicos |
-
-
-
-#### Descripción
-
-La función `.numToID()` convierte los números de secuencia en IDs únicos IMAP para los mensajes en el rango secuencial designado por *startMsg* y *endMsg* en el buzón actualmente seleccionado.
-
-En el parámetro *startMsg*, pase un valor entero correspondiente al número del primer mensaje en un rango secuencial. Si se pasa un número negativo (*startMsg* <= 0), se utilizará el primer mensaje del buzón como inicio de la secuencia.
-
-En el parámetro *endMsg*, pase un valor entero correspondiente al número del último mensaje que se incluirá en un rango secuencial. Si se pasa un número negativo (*endMsg* <= 0), se utilizará el último mensaje del buzón como fin de secuencia.
-
-#### Resultado
-
-La función devuelve una colección de cadenas (IDs únicos).
-
-#### Ejemplo
-
-```4d
- var $transporter : 4D.IMAPTransporter
- var $server;$boxInfo;$status : Object
- var $mailIds : Collection
-
- $server:=New object
- $server.host:="imap.gmail.com" //Obligatorio
- $server.port:=993
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- $transporter:=IMAP New transporter($server)
-
- //seleccionar buzón
- $boxInfo:=$transporter.selectBox("inbox")
-
- //obtener los ID de los 5 últimos mensajes recibidos
- $mailIds:=$transporter.numToID(($boxInfo.mailCount-5);$boxInfo.mailCount)
-
- //eliminar los mensajes del buzón actual
- $status:=$transporter.delete($mailIds)
-```
-
-
-
-
-
-## .removeFlags()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------- |
-| 20 | Soporta palabras claves personalizadas |
-| 18 R6 | Añadidos |
-
-
-
-**.removeFlags**( *msgIDs* : any ; *keywords* : Object ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 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 claves a eliminar |
-| Resultado | Object | <- | Estado de la operación removeFlags |
-
-
-
-#### Descripción
-
-La función `.removeFlags()` elimina las banderas de los `msgIDs` para las `keywords` especificadas.
-
-En el parámetro `msgIDs`, puedes pasar:
-
-- una *colección* que contiene los IDs únicos de mensajes específicos o
-- el ID único (*text*) de un solo mensaje o
-- la siguiente constante (*longint*) para todos los mensajes del buzón seleccionado:
-
-| Constante | Valor | Comentario |
-| --------- | ----- | ----------------------------------------------------- |
-| IMAP all | 1 | Seleccionar todos los mensajes del buzón seleccionado |
-
-El parámetro `keywords` permite definir las banderas a eliminar de `msgIDs`. Puede utilizar las siguientes banderas estándar, así como banderas personalizadas:
-
-| Parámetros | Tipo | Descripción |
-| --------------- | ------- | ------------------------------------------------------- |
-| $draft | Boolean | True para eliminar el marcador "draft" del mensaje |
-| $seen | Boolean | True para eliminar el marcador "seen" del mensaje |
-| $flagged | Boolean | True para eliminar el marcador "flagged" del mensaje |
-| $answered | Boolean | True para eliminar el marcador "answered" del mensaje |
-| $deleted | Boolean | True para eliminar el marcador "deleted" del mensaje |
-| `` | Boolean | True para eliminar la bandera personalizada del mensaje |
-
-Consulte [.addFlags()](#addflags) para obtener más información sobre las banderas personalizadas.
-
-> - Para que una palabra clave se tenga en cuenta tiene que ser true.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-```4d
-var $options;$transporter;$boxInfo;$status : Object
-
-$options:=New object
-$options.host:="imap.gmail.com"
-$options.port:=993
-$options.user:="4d@gmail.com"
-$options.password:="xxxxx"
-
-// Crear transportador
-$transporter:=IMAP New transporter($options)
-
-// Seleccionar buzón
-$boxInfo:=$transporter.selectBox("INBOX")
-
-// Marcar todos los mensajes de INBOX como no vistos
-$flags:=New object
-$flags["$seen"]:=True
-$status:=$transporter.removeFlags(IMAP all;$flags)
-```
-
-
-
-
-
-## .renameBox()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 | Añadidos |
-
-
-
-**.renameBox**( *currentName* : Text ; *newName* : Text ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ------ | :-------------------------: | -------------------------------- |
-| currentName | Text | -> | Nombre del nuevo actual |
-| newName | Text | -> | Nuevo nombre del buzón |
-| Resultado | Object | <- | Estado de la operación renombrar |
-
-
-
-#### Descripción
-
-La función `.renameBox()` cambia el nombre de un buzón en el servidor IMAP. Si se intenta renombrar un buzón desde un nombre de buzón que no existe o a un nombre de buzón que ya existe, se generará un error.
-
-En el parámetro `currentName`, pase el nombre del buzón a renombrar.
-
-Pase el nuevo nombre del buzón en el parámetro `newName`.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-Para cambiar el nombre de su buzón de "Invoices" a "Bills":
-
-```4d
-var $pw : text
-var $options; $transporter; $status : object
-
-$options:=Nuevo objeto
-
-$pw:=Request("Por favor, introduzca su contraseña:")
-
-If(OK=1) $options.host:="imap.gmail.com"
-
-$options.user:="test@gmail.com"
-$options.password:=$pw
-
-$transporter:=IMAP New transporter($options)
-
-// renombrar buzón
-$status:=$transporter.renameBox("Facturas"; "Facturas")
-
-If ($status.success)
- ALERT("¡Cambio de nombre de buzón correcto!")
- Else
- ALERT("Error: "+$status.statusText)
- End if
-End if
-```
-
-
-
-
-
-
-
-## .searchMails()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R5 | Añadidos |
-
-
-
-**.searchMails**( *searchCriteria* : Text ) : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| -------------- | ---------- | :-------------------------: | -------------------------------- |
-| searchCriteria | Text | -> | Criterio de búsqueda |
-| Resultado | Collection | <- | Colección de números de mensajes |
-
-
-
-#### Descripción
-
-> Esta función se basa en la especificación del [protocolo IMAP](https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol).
-
-La función `.searchMails()` busca los mensajes que coincidan con los criterios de búsqueda *searchCriteria* dados en el buzón actual. *searchCriteria* consiste en una o más llaves de búsqueda.
-
-*searchCriteria* es un parámetro texto que enumera una o varias llaves de búsqueda (ver [llaves de búsqueda autorizadas](#authorized-search-keys) abajo) asociadas o no a valores a buscar. Una llave de búsqueda puede ser uno o varios elementos. Por ejemplo:
-
-```
-SearchKey1 = FLAGGED
-SearchKey2 = NOT FLAGGED
-SearchKey3 = FLAGGED DRAFT
-```
-
-> Para obtener la información de un buzón sin cambiar el buzón actual, utilice .getBoxInfo().
-
-- Si el *searchCriteria* es una cadena null, la búsqueda será equivalente a un "seleccionar todo".
-- Si *searchCriteria* incluye varias llaves de búsqueda, el resultado es la intersección (función AND) de todos los mensajes que coinciden con esas llaves.
-
-```
-searchCriteria = FLAGGED FROM "SMITH"
-```
-
-... devuelve todos los mensajes con el marcador \Flagged AND activado y enviados por Smith.
-
-- Puede utilizar los operadores **OR** o **NOT** de la siguiente manera:
-
-```
-searchCriteria = OR SEEN FLAGGED
-```
-
-... devuelve todos los mensajes con el marcador \Seen O \Flagged
-
-```
-searchCriteria = NOT SEEN
-```
-
-... devuelve todos los mensajes con el marcador \Seen.
-
-```
-searchCriteria = HEADER CONTENT-TYPE "MIXED" NOT HEADER CONTENT-TYPE "TEXT"...
-```
-
-... devuelve los mensajes cuyo encabezado content-type contiene "Mixed" y no contiene "Text".
-
-```
-searchCriteria = HEADER CONTENT-TYPE "E" NOT SUBJECT "o" NOT HEADER CONTENT-TYPE "MIXED"
-```
-
-... devuelve los mensajes cuyo encabezado content-type contiene " e " y cuyo encabezado Subject no contiene " o " y cuyo encabezado content-type no es " Mixed ".
-
-En cuanto a los dos últimos ejemplos, observe que el resultado de la búsqueda es diferente cuando se eliminan los paréntesis de la primera lista de llaves de búsqueda.
-
-- El parámetro *searchCriteria* puede incluir opcionalmente la instrucción \[CHARSET]. Esta instrucción consiste en la palabra "CHARSET" seguida de un conjunto de caracteres definido \[CHARSET] (US ASCII, ISO-8859). Indica el conjunto de caracteres de la cadena *searchCriteria*. Por lo tanto, debe convertir la cadena *searchCriteria* al conjunto de caracteres especificado si utiliza la instrucción \[CHARSET] (consulte los comandos `CONVERT FROM TEXT` o `Convert to text`).
- Por defecto, 4D codifica la cadena de criterios searchCriteria en Quotable Printable si contiene los caracteres extendidos.
-
-```
-searchCriteria = CHARSET "ISO-8859" BODY "Help"
-```
-
-... significa que los criterios de búsqueda utilizan el conjunto de caracteres iso-8859 y el servidor tendrá que convertir los criterios de búsqueda antes de buscar, si es necesario.
-
-#### Tipos de valores de búsqueda
-
-Las claves de búsqueda pueden solicitar el valor a buscar:
-
-- **Valores de tipo fecha**: los valores de tipo fecha se colocan en cadenas con el siguiente formato: *date-day+"-"+date-month+"-"+date-year* donde date-day indica la fecha del día del mes (2 caracteres como máximo), date-month indica el mes (Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Dec) y date-year indica el año (4 dígitos).
- Ejemplo: `searchCriteria = SENTBEFORE 1-Feb-2020` (una fecha no suele necesitar comillas, ya que no contiene caracteres especiales)
-
-- **Valores de tipo cadena**: la cadena puede contener cualquier caracter y debe ir entre comillas. Si la cadena no contiene ningún caracter especial, como el espacio, por ejemplo, no es necesario colocarla entre comillas. Al colocar entre comillas estas cadenas se garantiza que su valor se interpretará correctamente.
- Ejemplo: `searchCriteria = FROM "SMITH"`
- Para todas las llaves de búsqueda que utilizan cadenas, un mensaje coincide con la llave si la cadena es una subcadena del campo. Las coincidencias no diferencian entre mayúsculas y minúsculas.
-
-- **Llaves de búsqueda con un valor nombres de campo**: los valores de tipo nombre de campo contienen el nombre de un campo de encabezado.
- Ejemplo: `searchCriteria = HEADER CONTENT-TYPE "MIXED"`
-
-- **Llaves de búsqueda con 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`
-
-- **Llaves de búsqueda con un valor de 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 indicador \Answered activado.
-
-#### Teclas de búsqueda disponibles
-
-**ALL**: todos los mensajes en el buzón.
-**ANSWERED**: mensajes con el indicador \Answered activado.
-**UNANSWERED**: mensajes que no tienen el indicador \Answered activo.
-**DELETED**: mensajes con el indicador \Deleted activado.
-**UNDELETED**: mensajes que no tienen el indicador \Deleted activado.
-**DRAFT**: mensajes con el indicador \Draft activado.
-**UNDRAFT**: mensajes que no tienen el indicador \Draft activado.
-**FLAGGED**: mensajes con el indicador \Flagged activado.
-**UNFLAGGED**: mensajes que no tienen el indicador \Flagged activado.
-**RECENT**: mensajes que tienen el indicador \Recent activado.
-**OLD**: mensajes que no tienen el indicador \Recent activado.
-**SEEN**: mensajes que tienen el indicador \Seen activo.
-**UNSEEN**: mensajes que no tienen el indicador \Seen activo.
-**NEW**: mensajes que tienen el indicador \Recent activado pero no el indicador \Seen. Esto es funcionalmente equivalente a “(RECENT UNSEEN)”.
-**KEYWORD *flag***: mensajes con el conjunto de palabras clave especificado.
-**UNKEYWORD *flag***: mensajes que no tienen la palabra clave especificada.
-**BEFORE *date***: mensajes cuya fecha interna es anterior a la fecha especificada.
-**ON *date***: mensajes cuya fecha interna está dentro de la fecha especificada.
-**SINCE *date***: mensajes cuya fecha interna es anterior o posterior a la fecha especificada.
-**SENTBEFORE *date***: mensajes cuyo encabezado Date es anterior a la fecha especificada.
-**SENTON *date***: mensajes cuyo encabezado Date está dentro de la fecha especificada.
-**SENTSINCE *date***: mensajes cuyo encabezado Date está dentro o posterior a la fecha especificada.
-**TO *string***: mensajes que contienen la cadena especificada en el encabezado TO.
-**FROM *string***: mensajes que contienen la cadena especificada en el encabezado FROM.
-**CC *string***: mensajes que contienen la cadena especificada en el encabezado CC.
-**BCC *string***: mensajes que contienen la cadena especificada en el encabezado BCC.
-**SUBJECT *string***: mensajes que contienen la cadena especificada en el encabezado Asunto.
-**BODY *string***: mensajes que contienen la cadena especificada en el cuerpo del mensaje.
-**TEXT *string***: mensajes que contienen la cadena especificada en el encabezado o en el cuerpo del mensaje.
-**HEADER *field-name* *string***: mensajes que tienen un encabezado con el nombre de campo especificado y que contiene la cadena especificada en el field-body.
-**UID *message-UID***: mensajes con identificadores únicos correspondientes al conjunto de identificadores únicos especificados.
-**LARGER *n***: mensajes con un tamaño superior al número de bytes especificado.
-**SMALLER *n***: mensajes con un tamaño menor que el número especificado de bytes.
-**NOT *search-key***: mensajes que no coinciden con la llave de búsqueda especificada.
-**OR *search-key1* *search-key2***: mensajes que corresponden con cualquiera de las palabras clave de búsqueda.
-
-
-
-
-
-## .selectBox()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------------- |
-| 20 | *id*, *flags*, *permanentFlags* se devuelven |
-| 18 R4 | Añadidos |
-
-
-
-**.selectBox**( *name* : Text { ; *state* : Integer } ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------- |
-| name | Text | -> | Nombre del buzón |
-| state | Integer | -> | Estado de acceso al buzón |
-| Resultado | Object | <- | objeto boxInfo |
-
-
-
-#### Descripción
-
-La función `.selectBox()` selecciona el buzón *name* como buzón actual. Esta función permite recuperar la información sobre el buzón.
-
-> Para obtener la información de un buzón sin cambiar el buzón actual, utilice [`.getBoxInfo()`](#getboxinfo).
-
-En el parámetro *name*, pase el nombre del buzón a acceder. El nombre representa una jerarquía inequívoca de izquierda a derecha, con niveles separados por un carácter delimitador específico. El delimitador se puede encontrar con la función [`.getDelimiter()`](#getdelimiter).
-
-El parámetro opcional *state* define el tipo de acceso al buzón. Los valores posibles son:
-
-| Constante | Valor | Comentario |
-| --------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| IMAP read only state | 1 | Se accede al buzón seleccionado con privilegios de sólo lectura. Los mensajes con la bandera "reciente" (que indica que son nuevos) no se modifican. |
-| IMAP read write state | 0 | Se accede al buzón seleccionado con privilegios de lectura y escritura. Los mensajes se consideran "vistos" y pierden la bandera "reciente" (que indica que son mensajes nuevos). Default value: |
-
-> - La función genera un error y devuelve **Null** si *name* designa un buzón inexistente.
-> - Si no hay ninguna conexión abierta, `.selectBox()` abrirá una conexión.
-> - Si la conexión no ha sido usada desde la demora de conexión designada (ver `IMAP New transporter`), la función [`.checkConnection()`](#checkconnection) es llamada automáticamente.
-
-**Objeto devuelto**
-
-El objeto `boxInfo` devuelto contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| -------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| name | Text | Nombre del buzón |
-| mailCount | number | Número de mensajes en el buzón |
-| mailRecent | number | Número de mensajes con la bandera "recent" |
-| id | text | Id. único del buzón |
-| flags | text | Lista de banderas utilizadas actualmente para el buzón, separadas por espacios |
-| permanentFlags | text | Lista de banderas que el cliente puede cambiar permanentemente (excepto el indicador \Recent, que gestiona el servidor IMAP), separados por espacios |
-
-:::info
-
-Si la cadena `permanentFlags` incluye la bandera especial \*, significa que el servidor soporta [banderas personalizadas](#addflags).
-
-:::
-
-#### Ejemplo
-
-```4d
- var $server; $boxinfo : Object
- $server:=New object
- $server.host:="imap.gmail.com" //Mandatory
- $server.user:="4d@gmail.com"
- $server.password:="XXXXXXXX"
-
- var $transporter : 4D.IMAPTransporter
- $transporter:=IMAP New transporter($server)
- $boxInfo:=$transporter.selectBox("INBOX")
-```
-
-
-
-
-
-## .subscribe()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 | Añadidos |
-
-
-
-**.subscribe**( *name* : Text ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | -------------------------------- |
-| name | Text | -> | Nombre del buzón |
-| Resultado | Object | <- | Estado de la operación subscribe |
-
-
-
-#### Descripción
-
-La función `.subscribe()` permite añadir el buzón especificado al conjunto de buzones "suscritos" del servidor IMAP. De este modo, puede optar por acotar una gran lista de buzones disponibles suscribiéndose a los que habitualmente consulta.
-
-En el parámetro `name`, pase el nombre del buzón a añadir (suscribir) a sus buzones "suscritos".
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-Para suscribirse al buzón "Atlas Corp" en la jerarquía "Bills":
-
-```4d
-var $pw; $name : text
-var $options; $transporter; $status : object
-
-$options:=New object
-
-$pw:=Request("Please enter your password:")
-
-If(OK=1) $options.host:="imap.gmail.com"
-$options.user:="test@gmail.com"
-$options.password:=$pw
-
-$transporter:=IMAP New transporter($options)
-
-$name:="Bills"+$transporter.getDelimiter()+"Atlas Corp"
-$status:=$transporter.subscribe($name)
-
-If ($status.success)
- ALERT("Mailbox subscription successful!")
- Else
- ALERT("Error: "+$status.statusText)
- End if
-End if
-```
-
-
-
-
-
-## .unsubscribe()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 | Añadidos |
-
-
-
-**.unsubscribe**( *name* : Text ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | :-------------------------: | ---------------------------------- |
-| name | Text | -> | Nombre del buzón |
-| Resultado | Object | <- | Estado de la operación unsubscribe |
-
-
-
-#### Descripción
-
-La función `.unsubscribe()` elimina un buzón de un conjunto de buzones suscritos. Esto le permite reducir el número de buzones que suele ver.
-
-En el parámetro `name`, pase el nombre del buzón a eliminar (darse de baja) de sus buzones activos.
-
-**Objeto devuelto**
-
-La función devuelve un objeto que describe el estado IMAP:
-
-| Propiedad | | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
-| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
-| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
-| | \[].errcode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-#### Ejemplo
-
-Para desuscribirse del buzón "Atlas Corp" en la jerarquía "Bills":
-
-```4d
-var $pw; $name : text
-var $options; $transporter; $status : object
-
-$options:=New object
-
-$pw:=Request("Please enter your password:")
-
-If(OK=1) $options.host:="imap.gmail.com"
-$options.user:="test@gmail.com"
-$options.password:=$pw
-
-$transporter:=IMAP New transporter($options)
-
-$name:="Bills"+$transporter.getDelimiter()+"Atlas Corp"
-$status:=$transporter.unsubscribe($name)
-
-If ($status.success)
- ALERT("Mailbox unsubscription successful!")
- Else
- ALERT("Error: "+$status.statusText)
- End if
-End if
-```
-
-
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SessionClass.md
deleted file mode 100644
index 063efcfdc668e1..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SessionClass.md
+++ /dev/null
@@ -1,724 +0,0 @@
----
-id: SessionClass
-title: Session
----
-
-Los objetos de sesión son devueltos por el comando [`Session`](../commands/session.md). Estos objetos ofrecen al desarrollador una interfaz que permite gestionar la sesión de usuario actual y ejecutar acciones como almacenar datos contextuales, compartir información entre procesos de sesión, lanzar procesos preferentes relacionados con la sesión o (sólo web) gestionar [privilegios](../ORDA/privileges.md).
-
-:::info Para aprender más
-
-Articulos de blog sobre esta funcionalidad:
-
-- [Sesiones escalables para aplicaciones web avanzadas](https://blog.4d.com/scalable-sessions-for-advanced-web-applications/)
-- [Permissions: inspeccionar los privilegios de la sesión para facilitar la depuración](https://blog.4d.com/permissions-inspect-session-privileges-for-easy-debugging/)
-
-:::
-
-### Tipos de sesiones
-
-Los siguientes tipos de sesiones están soportados por esta clase:
-
-- [**Sesiones usuario web**](WebServer/sessions.md): las sesiones usuario web están disponibles cuando [las sesiones escalables están activas en su proyecto](WebServer/sessions.md#enabling-web-sessions). Se utilizan para conexiones Web y REST, y se les pueden asignar privilegios.
-- [Sesiones usuario cliente remoto\*\*](../Desktop/clientServer.md#remote-user-sessions): en las aplicaciones cliente/servidor, los usuarios remotos tienen sus propias sesiones gestionadas en el servidor.
-- [**Sesión de procedimientos almacenados**](https://doc.4d.com/4Dv20/4D/20/4D-Server-and-the-4D-Language.300-6330554.en.html): todos los procedimientos almacenados ejecutados en el servidor comparten la misma sesión usuario virtual.
-- [**Sesión independiente**](../Project/overview.md#development): objeto de sesión local devuelto en una aplicación de un solo usuario (útil en las fases de desarrollo y prueba de aplicaciones cliente/servidor).
-
-:::note
-
-La disponibilidad de las propiedades y funciones del objeto `Session` depende del tipo de sesión.
-
-:::
-
-### Resumen
-
-| |
-| ---------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#clearprivileges) |
-| [](#createotp) |
-| [](#expirationdate) |
-| [](#getprivileges) |
-| [](#hasprivilege) |
-| [](#id) |
-| [](#idletimeout) |
-| [](#info) |
-| [](#isguest) |
-| [](#restore) |
-| [](#setprivileges) |
-| [](#storage) |
-| [](#username) |
-
-
-
-## .clearPrivileges()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.clearPrivileges()** : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | -------------------------------------------------- |
-| Resultado | Boolean | <- | True si la ejecución se ha realizado correctamente |
-
-
-
-#### Descripción
-
-:::note
-
-Esta función no hace nada y siempre devuelve **True** con cliente remoto, procedimiento almacenado y sesiones independientes.
-
-:::
-
-La función `.clearPrivileges()` elimina todos los privilegios asociados a la sesión y devuelve **True** si la ejecución se ha realizado correctamente. A menos que esté en modo ["forceLogin"](../REST/authUsers.md#force-login-mode), la sesión se convierte automáticamente en una sesión de Invitado.
-
-:::note
-
-En modo "forceLogin", `.clearPrivileges()` no transforma la sesión a una sesión de invitado, sólo elimina los privilegios de la sesión.
-
-:::
-
-#### Ejemplo
-
-```4d
-//Invalidar una sesión usuario web
-var $isGuest : Boolean
-var $isOK : Boolean
-
-$isOK:=Session.clearPrivileges()
-$isGuest:=Session.isGuest() //$isGuest es True
-```
-
-
-
-
-
-## .createOTP()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R9 | Añadidos |
-
-
-
-**.createOTP** ( { *lifespan* : Integer } ) : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | --------------------------------------------------- |
-| lifespan | Integer | -> | Duración de la vida del token de sesión en segundos |
-| Resultado | Text | <- | UUID de la sesión |
-
-
-
-#### Descripción
-
-:::note
-
-Esta función solo está disponible con sesiones usuario web. Devuelve una cadena vacía en otros contextos.
-
-:::
-
-La función `.createOTP()` crea un nuevo OTP (One Time Passcode) para la sesión y devuelve su token UUID. Este token es único en la sesión en la que fue generado.
-
-Para más información sobre los tokens OTP, por favor consulte [esta sección](../WebServer/sessions.md#session-token-otp).
-
-Por defecto, si se omite el parámetro *lifespan*, el token se crea con el mismo tiempo de vida que el [`.idleTimeOut`](#idletimeout) de la sesión. Puede definir un tiempo de espera personalizado pasando un valor en segundos en *lifespan*. Si se utiliza un token caducado para restaurar una sesión de usuario web, se ignora.
-
-El token devuelto puede ser utilizado en intercambios con aplicaciones de terceros o sitios web para identificar la sesión de forma segura. Por ejemplo, el token OTP de sesión se puede utilizar con una aplicación de pago.
-
-#### Ejemplo
-
-```4d
-var $token : Text
-$token := Session.createOTP( 60 ) //el token es válido durante 1 mn
-```
-
-
-
-
-
-## .expirationDate
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.expirationDate** : Text
-
-#### Descripción
-
-:::note
-
-Esta propiedad sólo está disponible con sesiones de usuario web.
-
-:::
-
-La propiedad `.expirationDate` contiene la fecha y hora de expiración de la cookie de sesión. El valor se expresa como texto en el formato ISO 8601: `YYYY-MM-DDTHH:MM:SS.mmmZ`.
-
-Esta propiedad es de **solo lectura**. Se recalcula automáticamente si se modifica el valor de la propiedad [`.idleTimeout`](#idletimeout).
-
-#### Ejemplo
-
-```4d
-var $expiration : Text
-$expiration:=Session.expirationDate //eg "2021-11-05T17:10:42Z"
-```
-
-
-
-
-
-## .getPrivileges()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R6 | Añadidos |
-
-
-
-**.getPrivileges**() : Collection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ---------------------------------------------------------------- |
-| Resultado | Collection | <- | Colección de nombres de privilegios (cadenas) |
-
-
-
-#### Descripción
-
-La función `.getPrivileges()` devuelve una colección de todos los nombres de privilegios asociados a la sesión.
-
-Con clientes remotos, procedimientos almacenados y sesiones independientes, esta función devuelve una colección que sólo contiene "WebAdmin".
-
-:::info
-
-Los privilegios se asignan a una Sesión utilizando la función [`setPrivileges()`](#setprivileges).
-
-:::
-
-#### Ejemplo
-
-Se ha definido el siguiente archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file):
-
-```json
-{
- "privileges":[
- {
- "privilege":"simple",
- "includes":[
-
- ]
- },
- {
- "privilege":"medium",
- "includes":[
- "simple"
- ]
- }
- ],
- "roles":[
- {
- "role":"Medium",
- "privileges":[
- "medium"
- ]
- }
- ],
- "permissions":{
- "allowed":[
-
- ]
- }
-}
-```
-
-El rol de sesión se asigna en una función datastore `authentify()`:
-
-```4d
- //Clase Datastore
-
-exposed Function authentify($role : Text) : Text
- Session.clearPrivileges()
- Session.setPrivileges({roles: $role})
-```
-
-Asumiendo que la función `authentify()` es llamada con el rol "Medium":
-
-```4d
-var $privileges : Collection
-$privileges := Session.getPrivileges()
-//$privileges: ["simple","medium"]
-```
-
-#### Ver también
-
-[.setPrivileges()](#setprivileges)
-[Permisos - Inspeccionar los privilegios en la sesión para una fácil depuración (entrada de blog)](https://blog.4d.com/permissions-inspect-the-privileges-in-the-session-for-an-easy-debugging)
-
-
-
-
-
-## .hasPrivilege()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.hasPrivilege**( *privilege* : Text ) : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------------------------------------------ |
-| privilege | Text | -> | Nombre del privilegio a verificar |
-| Resultado | Boolean | <- | True si la sesión tiene *privilege*, False en caso contrario |
-
-
-
-#### Descripción
-
-La función `.hasPrivilege()` devuelve True si *privilege* está asociado a la sesión, y False en caso contrario.
-
-Con cliente remoto, procedimientos almacenados y sesiones independientes, esta función siempre devuelve True, sea cual sea el *privilege*.
-
-#### Ejemplo
-
-Quiere comprobar si el privilegio "WebAdmin" está asociado a la sesión usuario web:
-
-```4d
-If (Session.hasPrivilege("WebAdmin"))
- //Acceso concedido, no hacer nada
-Else
- //Mostrar una página de autenticación
-
-End if
-```
-
-#### Ver también
-
-[*Publicaciones de blog sobre esta funcionalidad*](https://blog.4d.com/?s=hasPrivilege)
-
-
-
-
-
-## .id
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R5 | Añadidos |
-
-
-
-**.id** : Text
-
-#### Descripción
-
-La propiedad `.id` contiene el identificador único (UUID) de la sesión de usuario. Con 4D Server, esta cadena única es asignada automáticamente por el servidor para cada sesión y permite identificar sus procesos.
-
-:::tip
-
-Puede utilizar esta propiedad para obtener el objeto [`.storage`](#storage) de una sesión gracias al comando [`Session storage`](../commands/session-storage.md).
-
-:::
-
-
-
-
-
-## .idleTimeout
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-
-|18 R6|Añadido|
-
-
-
-**.idleTimeout** : Integer
-
-#### Descripción
-
-:::note
-
-Esta propiedad sólo está disponible con sesiones de usuario web.
-
-:::
-
-La propiedad `.idleTimeout` contiene el tiempo de inactividad de la sesión (en minutos), después del cual la sesión es cerrada automáticamente por 4D.
-
-Si no se define esta propiedad, el valor por defecto es 60 (1h).
-
-Cuando se define esta propiedad, la propiedad [`expirationDate`](#expirationdate) se actualiza en consecuencia.
-
-> El valor no puede ser inferior a 60: si se define un valor inferior, el tiempo de espera se eleva hasta 60.
-
-Esta propiedad está en **lectura escritura**.
-
-#### Ejemplo
-
-```4d
-If (Session.isGuest())
- // Una sesión de invitado se cerrará tras 60 minutos de inactividad
- Session.idleTimeout:=60
-Else
- // Otras sesiones se cerrarán tras 120 minutos de inactividad
- Session.idleTimeout:=120
-End if
-
-```
-
-
-
-
-
-## .info
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R5 | Añadidos |
-
-
-
-**.info** : Object
-
-#### Descripción
-
-:::note
-
-Esta propiedad solo está disponible con clientes remotos, procedimientos almacenados y sesiones independientes.
-
-:::
-
-La propiedad `.info` describe la sesión del cliente remoto o del procedimiento almacenado en el servidor, o la sesión autónoma.
-
-:::note
-
-- El objeto `.info` es el mismo objeto que el devuelto en la propiedad "session" por el comando [`Process activity`](../commands/process-activity.md) para sesiones de cliente remoto y procedimientos almacenados.
-- El objeto `.info` es el mismo que devuelve el comando [`Session info`](../commands/session-info.md) para una sesión autónoma.
-
-:::
-
-El objeto `.info` contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| type | Text | Tipo de sesión: "remote", "storedProcedure", "standalone" |
-| userName | Text | Nombre de usuario 4D (mismo valor que [`.userName`](#username)) |
-| machineName | Text | Sesiones remotas: nombre de la máquina remota. Sesión de procedimientos almacenados: nombre del equipo servidor. Sesión autónoma: nombre de la máquina |
-| systemUserName | Text | Sesiones remotas: nombre de la sesión del sistema abierta en la máquina remota. |
-| IPAddress | Text | Dirección IP de la máquina remota |
-| hostType | Text | Tipo de host: "windows" o "mac" |
-| creationDateTime | Date ISO 8601 | Fecha y hora de creación de la sesión. Sesión autónoma: fecha y hora de inicio de la aplicación |
-| state | Text | Estado de la sesión: "active", "postponed", "sleeping" |
-| ID | Text | UUID de sesión (el mismo valor que [`.id`](#id)) |
-| persistentID | Text | Sesiones remotas: ID persistente de la sesión |
-
-:::note
-
-Dado que `.info` es una propiedad calculada, se recomienda llamarla una vez y luego almacenarla en una variable local si se desea realizar algún procesamiento sobre sus propiedades.
-
-:::
-
-
-
-
-
-## .isGuest()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R6 | Añadidos |
-
-
-
-**.isGuest()** : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | -------------------------------------------------------------- |
-| Resultado | Boolean | <- | True si la sesión es una sesión Guest, False en caso contrario |
-
-
-
-#### Descripción
-
-:::note
-
-Esta función siempre devuelve **False** con clientes remotos, procedimientos almacenados y sesiones independientes.
-
-:::
-
-La función `.isGuest()` devuelve True si la sesión es una sesión Guest (es decir, no tiene privilegios).
-
-#### Ejemplo
-
-En el método base `On Web Connection`:
-
-```4d
-If (Session.isGuest())
- //Hacer algo para el usuario invitado
-End if
-```
-
-
-
-
-
-## .restore()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R9 | Añadidos |
-
-
-
-**.restore** ( *token* : Text ) : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------ |
-| token | Text | -> | UUID del token de sesión |
-| Resultado | Boolean | <- | True si la sesión actual ha sido reemplazada con éxito por la sesión del token |
-
-
-
-#### Descripción
-
-:::note
-
-Esta función solo está disponible con sesiones usuario web. Devuelve False en otros contextos.
-
-:::
-
-La función `.restore()` sustituye la sesión actual del usuario web por su sesión original correspondiente al *token* UUID. El almacenamiento y los privilegios de la sesión son restaurados.
-
-Si la sesión original del usuario ha sido correctamente restaurada, la función devuelve `true`.
-
-La función devuelve `false` si:
-
-- el token de sesión ya ha sido utilizado,
-- el token de sesión ha caducado,
-- el token de sesión no existe,
-- la propia sesión original ha caducado.
-
-En este caso, la sesión actual de usuario web se deja sin tocar (no se restaura la sesión).
-
-#### Ejemplo
-
-En un singleton llamado por un HTTP Request handler personalizado:
-
-```4d
-shared singleton Class constructor()
-
-Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
- Session.restore($request.urlQuery.state)
-```
-
-#### Ver también
-
-[`.createOTP()`](#createotp)
-
-
-
-
-
-## .setPrivileges()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | --------------------------------------------------- |
-| 19 R8 | Compatibilidad con la propiedad "roles" en Settings |
-| 18 R6 | Añadidos |
-
-
-
-**.setPrivileges**( *privilege* : Text ) : Boolean **.setPrivileges**( *privileges* : Collection ) **.setPrivileges**( *settings* : Object ) : Boolean
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---------- | :-------------------------: | ------------------------------------------------------------------------------ |
-| privilege | Text | -> | Nombre del privilegio |
-| privileges | Collection | -> | Colección de nombres de privilegios |
-| settings | Object | -> | Objeto con una propiedad "privilegios" (cadena o colección) |
-| Resultado | Boolean | <- | True si la ejecución se ha realizado correctamente |
-
-
-
-#### Descripción
-
-:::note
-
-Esta función no hace nada y siempre devuelve **False** con cliente remoto, procedimiento almacenado y sesiones independientes.
-
-:::
-
-La función `.setPrivileges()` asocia a la sesión los privilegios y/o roles definidos en el parámetro y devuelve **True** si la ejecución se ha realizado correctamente.
-
-- En el parámetro *privilege*, pase una cadena que contenga un nombre de privilegio (o varios nombres de privilegio separados por comas).
-
-- En el parámetro *privileges*, pase una colección de cadenas que contengan nombres de privilegios.
-
-- En el parámetro *settings*, pase un objeto que contenga las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------- |
-| privileges | Text o Collection |
Cadena que contiene un nombre de privilegio, o
Colección de cadenas que contienen nombres de privilegios
|
-| roles | Text o Collection |
Cadena que contiene un rol, o
Colección de cadenas que contienen roles
|
-| userName | Text | Nombre de usuario para asociar a la sesión (opcional) |
-
-:::note
-
-Los privilegios y los roles se definen en el archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file) del proyecto. Para más información, consulte la sección [**Privilegios**](../ORDA/privileges.md).
-
-:::
-
-Si la propiedad `privileges` o `roles` contiene un nombre que no está declarado en el archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file), se ignora.
-
-Por defecto, cuando no hay ningún privilegio o rol asociado a la sesión, la sesión es una [sesión de invitado](#isguest).
-
-La propiedad [`userName`](#username) está disponible a nivel de objeto de sesión (sólo lectura).
-
-#### Ejemplo
-
-En un método de autenticación personalizado, se establece el privilegio "WebAdmin" para el usuario:
-
-```4d
-var $userOK : Boolean
-
-... //Autenticar al usuario
-
-If ($userOK) //El usuario ha sido aprobado
- var $info : Object
- $info:=New object()
- $info.privileges:=New collection("WebAdmin")
- Session.setPrivileges($info)
-End if
-
-```
-
-#### Ver también
-
-[.getPrivileges()](#getprivileges)
-
-
-
-
-
-## .storage
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------------------------------------------------------ |
-| 20 R5 | Soporte de cliente remoto y sesiones de procedimientos almacenados |
-| 18 R6 | Añadidos |
-
-
-
-**.storage** : Object
-
-#### Descripción
-
-La propiedad `.storage` contiene un objeto compartido que puede utilizarse para almacenar información disponible para todos los procesos de la sesión.
-
-Cuando se crea un objeto `Session`, la propiedad `.storage` está vacía. Al ser un objeto compartido, esta propiedad estará disponible en el objeto `Storage` del servidor.
-
-> Al igual que el objeto `Storage` del servidor, la propiedad `.storage` es siempre "single": añadir un objeto compartido o una colección compartida a `.storage` no crea un grupo compartido.
-
-Esta propiedad es **sólo lectura** en sí misma pero devuelve un objeto de lectura-escritura.
-
-:::tip
-
-Puede obtener la propiedad `.storage` de una sesión utilizando el comando [`Session storage`](../commands/session-storage.md).
-
-:::
-
-#### Ejemplo de sesión web
-
-Desea almacenar la IP del cliente en la propiedad `.storage`. Puede escribir en el método base `On Web Authentication`:
-
-```4d
-If (Session.storage.clientIP=Null) //first access
- Use (Session.storage)
- Session.storage.clientIP:=New shared object("value"; $clientIP)
- End use
-End if
-```
-
-#### Ejemplo de sesión remota
-
-Desea compartir datos entre procesos de la misma sesión:
-
-```4d
-Use (Session.storage)
- Session.storage.settings:=New shared object("property"; $value; "property2"; $value2)
-End use
-```
-
-
-
-
-
-## .userName
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------------------------------------------------------ |
-| 20 R5 | Soporte de cliente remoto y sesiones de procedimientos almacenados |
-| 18 R6 | Añadidos |
-
-
-
-**.userName** : Text
-
-#### Descripción
-
-La propiedad `.userName` contiene el nombre de usuario asociado a la sesión. Puede utilizarlo para identificar al usuario dentro de su código.
-
-- Con las sesiones web, esta propiedad es una cadena vacía por defecto. Puede definirse mediante la propiedad `privileges` de la función [`setPrivileges()`](#setprivileges).
-- Con sesiones remotas y de procedimientos almacenados, esta propiedad devuelve el mismo nombre de usuario que el comando [`Current user`](../commands-legacy/current-user.md).
-- Con sesiones independientes, esta propiedad contiene "diseñador" o el nombre definido con el comando [`SET USER ALIAS`](../commands-legacy/set-user-alias.md).
-
-Esta propiedad es **solo lectura**.
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/TCPConnectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/TCPConnectionClass.md
deleted file mode 100644
index 3591271dd16d3a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/TCPConnectionClass.md
+++ /dev/null
@@ -1,346 +0,0 @@
----
-id: TCPConnectionClass
-title: TCPConnection
----
-
-La clase `TCPConnection` permite gestionar conexiones cliente del Protocolo de Control de Transmisión (TCP) a un [servidor](./TCPListenerClass.md), permitiendo enviar y recibir datos, y manejar eventos del ciclo de vida de la conexión mediante retrollamadas.
-
-La clase `TCPConnection` está disponible en el class store `4D`. Puede crear una conexión TCP utilizando la función [4D.TCPConnection.new()](#4dtcpconnectionnew) que devuelve un [TCPConnection object](#tcpconnection-object).
-
-Todas las funciones de la clase `TCPConnection` son hilo seguro.
-
-Gracias al *refcounting* estándar de los objetos 4D, una TCPConnection se libera automáticamente cuando deja de estar referenciada. En consecuencia, los recursos asociados, se limpian adecuadamente sin necesidad de un cierre explícito.
-
-Los objetos TCPConnection se liberan cuando ya no existen referencias a ellos en memoria. Esto ocurre típicamente, por ejemplo, al final de una ejecución de un método para variables locales. Si desea "forzar" el cierre de una conexión en cualquier momento, [**nulifique** sus referencias poniéndolas en **Null**](../Concepts/dt_object.md#resources).
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------------------------- |
-| 20 R9 | Nuevos atributos `listener`, `address` y `port` |
-| 20 R8 | Clase añadida |
-
-
-
-### Ejemplos
-
-Los siguientes ejemplos demuestran cómo utilizar las clases 4D.TCPConnection y 4D.TCPEvent para gestionar una conexión cliente TCP, manejar eventos, enviar datos y cerrar correctamente la conexión. Se ofrecen ejemplos tanto síncronos como asíncronos.
-
-#### Ejemplo sincrónico
-
-Este ejemplo muestra cómo establecer una conexión, enviar datos y cerrarla utilizando un simple objeto para la configuración:
-
-```4d
-var $domain : Text := "127.0.0.1"
-var $port : Integer := 10000
-var $options : Object := New object() // Objeto de configuración
-var $tcpClient : 4D.TCPConnection
-var $message : Text := "test message"
-
-// Abrir una conexión
-$tcpClient := 4D.TCPConnection.new($domain; $port; $options)
-
-// Enviar datos
-var $blobData : Blob
-TEXT TO BLOB($message; $blobData; UTF8 text without length)
-$tcpClient.send($blobData)
-
-// Apagar
-$tcpClient.shutdown()
-$tcpClient.wait(0)
-
-```
-
-#### Ejemplo asincrónico
-
-Este ejemplo define una clase que maneja el ciclo de vida de la conexión y los eventos, mostrando cómo trabajar de forma asíncrona:
-
-```4d
-// Definición de la clase: cs.MyAsyncTCPConnection
-
-Class constructor($url : Text; $port : Integer)
- This.connection := Null
- This.url := $url
- This.port := $port
-
-// Conectarse a uno de los servidores lanzados dentro de los workers
-Function connect()
- This.connection := 4D.TCPConnection.new(This.url; This.port; This)
-
-// Desconectarse del servidor
-Function disconnect()
- This.connection.shutdown()
- This.connection := Null
-
-// Enviar datos al servidor
-Function getInfo()
- var $blob : Blob
- TEXT TO BLOB("Información"; $blob)
- This.connection.send($blob)
-
-// Retrollamada cuando la conexión se ha establecido correctamente
-Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
- ALERT("Conexión establecida")
-
-// Retrollamada cuando la conexión se ha cerrado correctamente
-Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
- ALERT("Conexión cerrada")
-
-// Retrollamada cuando se reciben datos del servidor
-Function onData($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
- ALERT(BLOB to text($event.data; UTF8 text without length))
-
- //Atención: no hay garantía de que reciba todos los datos que necesita en un solo paquete de red.
-
-// Retrollamada cuando la conexión se cierra inesperadamente
-Function onError($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
- ALERT("Error de conexión")
-
-// Retrollamada después de onShutdown/onError justo antes de que el objeto TCPConnection sea liberado
-Function onTerminate($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
- ALERT("Conexión terminada")
-
-
-```
-
-##### Ejemplo de uso
-
-Crea un nuevo método llamado AsyncTCP, para inicializar y gestionar la conexión TCP:
-
-```4d
-var $myObject : cs.MyAsyncTCPConnection
-$myObject := cs.MyAsyncTCPConnection.new("myURL"; 10000)
-$myObject.connect()
-$myObject.getInfo()
-$myObject.disconnect()
-
-```
-
-Llama al método AsyncTCP en un worker:
-
-```4d
-CALL WORKER("new process"; "Async_TCP")
-
-```
-
-### Objeto TCPConnection
-
-Un objeto TCPConnection es un objeto no compartible.
-
-Los objetos TCPConnection ofrecen las siguientes propiedades y funciones:
-
-| |
-| --------------------------------------------------------------------------------------------------------------------- |
-| [](#address) |
-| [](#closed) |
-| [](#errors) |
-| [](#listener) |
-| [](#nodelay) |
-| [](#port) |
-| [](#send) |
-| [](#shutdown) |
-| [](#wait) |
-
-
-
-## 4D.TCPConnection.new()
-
-**4D.TCPConnection.new**( *serverAddress* : Text ; *serverPort* : Number ; *options* : Object ) : 4D.TCPConnection
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------- | -------------------------------- | --------------------------- | ------------------------------------------------------------- |
-| serverAddress | Text | -> | Nombre de dominio o dirección IP del servidor |
-| serverPort | Integer | -> | Número de puerto del servidor |
-| options | Object | -> | Configuración [opciones](#options-parameter) para la conexión |
-| Resultado | 4D.TCPConnection | <- | Nuevo objeto TCPConnection |
-
-
-
-#### Descripción
-
-The `4D.TCPConnection.new()` function creates a new TCP connection to the specified *serverAddress* and *serverPort*, using the defined *options*, and returns a `4D.TCPConnection` object.
-
-#### Parámetro *options*
-
-En el parámetro *options*, pase un objeto que puede contener las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción | Por defecto |
-| ------------ | ------- | --------------------------------------------------------------------------- | ----------- |
-| onConnection | Formula | Retrollamada que se activa cuando se establece la conexión. | Indefinido |
-| onData | Formula | Retrollamada activada cuando se reciben datos | Indefinido |
-| onShutdown | Formula | Retrollamada activada cuando la conexión se cierra correctamente | Indefinido |
-| onError | Formula | Retrollamada en caso de error | Indefinido |
-| onTerminate | Formula | Retrollamada activada justo antes de que se libere la TCPConnection | Indefinido |
-| noDelay | Boolean | **Sólo lectura** cesactiva el algoritmo de Nagle si `true` | False |
-
-#### Función callback (retrollamada)
-
-Todas las funciones de retrollamada reciben dos parámetros:
-
-| Parámetros | Tipo | Descripción |
-| ----------- | ----------------------------------------------- | ----------------------------------------------------- |
-| $connection | [objeto `TCPConnection`](#tcpconnection-object) | La instancia de conexión TCP actual. |
-| $event | [objeto `TCPEvent`](#tcpevent-object) | Contiene información sobre el evento. |
-
-**Secuencia de retrollamadas:**
-
-1. `onConnection` se activa cuando se establece la conexión.
-2. `onData` se activa cada vez que se reciben datos.
-3. Se activa `onShutdown` o `onError`:
- - `onShutdown` se activa cuando la conexión se cierra correctamente.
- - `onError` se activa si se produce un error.
-4. `onTerminate` siempre se activa justo antes de que la TCPConnection se libere (la conexión se cierra o se produce un error).
-
-#### Objeto TCPEvent
-
-Un objeto [`TCPEvent`](TCPEventClass.md) es devuelto cuando se llama una [función de retrollamada](#callback-functions).
-
-
-
-
-
-## .address
-
-**address** : Text
-
-#### Descripción
-
-La propiedad `.address` contiene la dirección IP o el nombre de dominio de la máquina remota.
-
-
-
-
-
-## .closed
-
-**closed** : Boolean
-
-#### Descripción
-
-La propiedad `.closed` contiene si la conexión está cerrada. Devuelve `true` si la conexión se ha cerrado, ya sea debido a un error, una llamada a `shutdown()`, o el cierre por parte del servidor.
-
-
-
-
-
-## .errors
-
-**errors** : Collection
-
-#### Descripción
-
-La propiedad `.errors` contiene una colección de objetos de error asociados a la conexión. Cada objeto de error incluye el código de error, una descripción y la firma del componente que causó el error.
-
-| Propiedad | | Tipo | Descripción |
-| --------- | ----------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------- |
-| errors | | Collection | Pila de error 4D en caso de error |
-| | [].errCode | Number | Código de error 4D |
-| | [].message | Text | Descripción del error 4D |
-| | [].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-
-
-
-
-## .listener
-
-**listener** : Object
-
-#### Descripción
-
-La propiedad `.listener` contiene el objeto [`TCPListener`](./TCPListenerClass.md) que creó la `TCPConnection`, si existe. Esta propiedad es de **solo lectura**.
-
-
-
-
-
-## .noDelay
-
-**noDelay** : Boolean
-
-#### Descripción
-
-La propiedad `.noDelay` contiene si el algoritmo de Nagle está desactivado (`true`) o activado (`false`). Esta propiedad es de **solo lectura**.
-
-
-
-
-
-## .port
-
-**port** : Number
-
-#### Descripción
-
-La propiedad `.port` contiene el número de puerto de la máquina remota. Esta propiedad es de **solo lectura**.
-
-
-
-
-
-## .send()
-
-**.send**( *data* : Blob )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | -- | -------------- |
-| data | Blob | -> | Datos a enviar |
-
-
-
-#### Descripción
-
-La función `send()` envía datos al servidor. Si la conexión no se ha establecido todavía, los datos se envían una vez que se ha establecido la conexión.
-
-
-
-
-
-## .shutdown()
-
-**.shutdown**()
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-#### Descripción
-
-La función `shutdown()`cierra el canal *write* de la conexión (cliente a servidor) mientras se mantiene abierto el canal *read* (servidor al flujo del cliente) permitiéndole continuar recibiendo datos hasta que la conexión sea completamente cerrada por el servidor o se produzca un error.
-
-
-
-
-
-## .wait()
-
-**.wait**( { *timeout* : Real } )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | :-: | ----------------------------------- |
-| timeout | Real | -> | Tiempo máximo de espera en segundos |
-
-
-
-#### Descripción
-
-La función `wait()` espera hasta que se cierre la conexión TCP o se alcance el `timeout` especificado
-
-:::note
-
-Durante la ejecución de `.wait()`, se ejecutan funciones de retrollamda, tanto si proceden de otras instancias de `SystemWorker`. Puede salir de un `.wait()` llamando a [`shutdown()`](#shutdown) desde una retrollamada.
-
-:::
-
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebServerClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebServerClass.md
deleted file mode 100644
index 253c6616ecccf2..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebServerClass.md
+++ /dev/null
@@ -1,645 +0,0 @@
----
-id: WebServerClass
-title: WebServer
----
-
-La API clase `WebServer` le permite iniciar y controlar un servidor web para la aplicación principal (host) así como para cada componente alojado (ver la descripción general del [objeto servidor web](WebServer/webServerObject.md)). Esta clase está disponible en el "class store" de `4D`.
-
-### Objeto servidor web
-
-Los objetos servidor web se instancian con el comando [`WEB Server`](../commands/web-server.md).
-
-Ofrecen las siguientes propiedades y funciones:
-
-### Resumen
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](#accesskeydefined) |
-| [](#certificatefolder) |
-| [](#characterset) |
-| [](#ciphersuite) |
-| [](#corsenabled) |
-| [](#corssettings) |
-| [](#debuglog) |
-| [](#defaulthomepage) |
-| [](#hstsenabled) |
-| [](#hstsmaxage) |
-| [](#httpcompressionlevel) |
-| [](#httpcompressionthreshold) |
-| [](#httpenabled) |
-| [](#httpport) |
-| [](#httptrace) |
-| [](#httpsenabled) |
-| [](#httpsport) |
-| [](#inactiveprocesstimeout) |
-| [](#inactivesessiontimeout) |
-| [](#ipaddresstolisten) |
-| [](#isrunning) |
-| [](#keepsession) |
-| [](#logrecording) |
-| [](#maxconcurrentprocesses) |
-| [](#maxrequestsize) |
-| [](#maxsessions) |
-| [](#mintlsversion) |
-| [](#name) |
-| [](#opensslversion) |
-| [](#perfectforwardsecrecy) |
-| [](#rootfolder) |
-| [](#scalablesession) |
-| [](#sessioncookiedomain) |
-| [](#sessioncookiename) |
-| [](#sessioncookiepath) |
-| [](#sessioncookiesamesite) |
-| [](#sessionipaddressvalidation) |
-| [](#start) |
-| [](#stop) |
-
-## .accessKeyDefined
-
-**.accessKeyDefined** : Boolean
-
-La propiedad **.accessKeyDefined** contiene true si se define una llave de acceso en la configuración del servidor web. Esta propiedad es utilizada por el servidor web de WebAdmin para validar la configuración de seguridad de la interfaz de administración.
-
-
-
-## .certificateFolder
-
-**.certificateFolder** : Text
-
-Ruta de la carpeta donde se encuentran los archivos de los certificados. La ruta se formatea en la ruta completa POSIX utilizando filesystems. Cuando se utiliza esta propiedad en el parámetro `settings` de la función [`.start()`](#start) puede ser un objeto [`Folder`](FolderClass.md).
-
-
-
-
-
-## .characterSet
-
-**.characterSet** : Number **.characterSet** : Text
-
-El conjunto de caracteres que el Servidor Web 4D debe utilizar para comunicarse con los navegadores que se conectan a la aplicación. El valor por defecto depende del lenguaje del sistema operativo. El valor por defecto depende del lenguaje del sistema operativo. 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
-- 13 = ISO-8859-10
-- 17 = Shift-JIS
-- 2024 = Windows-31J
-- 2026 = Big5
-- 38 = euc-kr
-- 106 = UTF-8
-- 2250 = Windows-1250
-- 2251 = Windows-1251
-- 2253 = Windows-1253
-- 2255 = Windows-1255
-- 2256 = Windows-1256
-
-
-
-
-
-## .cipherSuite
-
-**.cipherSuite** : Text
-
-La 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.
-
-
-
-
-
-## .CORSEnabled
-
-**.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. Por razones de seguridad, las peticiones "cross-domain" están prohibidas por defecto a nivel del navegador. 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)
-
-Para más información sobre CORS, consulte la página [Cross-origin resource sharing page](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) en Wikipedia.
-
-
-
-
-
-## .CORSSettings
-
-**.CORSSettings** : Collection
-
-Contiene la lista de hosts y de métodos autorizados para el servicio CORS (ver la propiedad [`CORSEnabled`](#corsenabled)). Cada objeto debe contener una propiedad **host** y, opcionalmente, una propiedad **methods**:
-
-- **host** (texto, obligatorio): nombre de dominio o dirección IP desde donde las páginas externas pueden enviar solicitudes de datos al Servidor a través de CORS. Se pueden añadir múltiples atributos de dominio para crear una lista blanca. Si *host* no está presente o está vacío, el objeto se ignora. Se soportan varias sintaxis:
- - 192.168.5.17:8081
- - 192.168.5.17
- - 192.168.\*
- - 192.168.\*:8081
- -
- -
- -
- - \*.myDomain.com
- - myProject.myDomain.com
- - \*
-
-- **methods** (texto, opcional): método(s) HTTP aceptado(s) para el host CORS correspondiente. Separe cada método con un ";" (por ejemplo: "post;get"). Separe cada método con un ";" (por ejemplo: "post;get").
-
-
-
-
-
-## .debugLog
-
-**.debugLog** : Integer
-
-El estado del archivo de registro de peticiones HTTP (HTTPDebugLog_nn.txt, almacenado en la carpeta "Logs" de la aplicación -- nn es el número de archivo).
-
-- 0 = desactivado
-- 1 = activado sin partes del cuerpo (en este caso se suministra el tamaño del cuerpo)
-- 3 = activado con las partes del cuerpo en respuesta únicamente
-- 5 = activado con las partes del cuerpo en petición únicamente
-- 7 = activado con las partes del cuerpo en respuesta y petición
-
-
-
-
-
-## .defaultHomepage
-
-**.defaultHomepage** : Text
-
-El nombre de la página de inicio por defecto o "" para no enviar la página de inicio personalizada.
-
-
-
-
-
-## .HSTSEnabled
-
-**.HSTSEnabled** : Boolean
-
-El estado 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. HSTS permite al servidor web declarar que los navegadores sólo deben interactuar con él a través de conexiones HTTPS seguras. HSTS requiere que HTTPS esté activado en el servidor. HTTP también debe estar activado para permitir las conexiones cliente iniciales.
-
-
-
-
-
-## .HSTSMaxAge
-
-**.HSTSMaxAge** : Integer
-
-El máximo de tiempo (en segundos) que HSTS está activo 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).
-
-
-
-
-
-## .HTTPCompressionLevel
-
-**.HTTPCompressionLevel** : Integer
-
-El nivel de compresión para todos los intercambios HTTP comprimidos para el servidor HTTP 4D (peticiones del cliente o respuestas del 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:
-
-- 1 a 9 (donde 1 es la compresión más rápida y 9 la más alta).
-- -1 = definir un compromiso entre la velocidad y la tasa de compresión.
-
-Valores posibles:
-
-
-
-
-
-## .HTTPCompressionThreshold
-
-**.HTTPCompressionThreshold** : Integer
-
-El umbral de tamaño (bytes) para las solicitudes por debajo del cual los intercambios no deben ser comprimidos. 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
-
-
-
-
-
-## .HTTPEnabled
-
-**.HTTPEnabled** : Boolean
-
-El estado del protocolo HTTP.
-
-
-
-
-
-## .HTTPPort
-
-**.HTTPPort** : Integer
-
-El número de puerto IP de escucha para HTTP.
-
-Por defecto = 80
-
-
-
-
-
-## .HTTPTrace
-
-**.HTTPTrace** : Boolean
-
-La 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.
-
-
-
-
-
-## .HTTPSEnabled
-
-**.HTTPSEnabled** : Boolean
-
-El estado del protocolo HTTPS.
-
-
-
-
-
-## .HTTPSPort
-
-**.HTTPSPort** : Integer
-
-El número de puerto IP de escucha para HTTPS.
-
-Por defecto = 443
-
-
-
-
-
-## .inactiveProcessTimeout
-
-**.inactiveProcessTimeout** : Integer
-
-> Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession).
-
-La duración (en minutos) de los procesos de sesión heredados 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`, luego se destruye el contexto de sesión heredado.
-
-Por defecto = 480 minutos
-
-
-
-
-
-## .inactiveSessionTimeout
-
-**.inactiveSessionTimeout** : Integer
-
-> Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession).
-
-La duración (en minutos) de las sesiones heredadas inactivas (duración establecida 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
-
-
-
-
-
-## .IPAddressToListen
-
-**.IPAddressToListen** : Text
-
-La 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.
-
-
-
-
-
-## .isRunning
-
-**.isRunning** : Boolean
-
-*Propiedad de sólo lectura*
-
-El estado de ejecución del servidor web.
-
-
-
-
-
-## .keepSession
-
-**.keepSession** : Boolean
-
-Contiene `True` si las sesiones heredadas están activadas en el servidor web, `False` en caso contrario.
-
-##### Ver también
-
-[.scalableSession](#scalablesession)
-
-
-
-
-
-## .logRecording
-
-**.logRecording** : Integer
-
-El valor de registro log (logweb.txt).
-
-- 0 = No registrar (por defecto)
-- 1 = Registro en formato CLF
-- 2 = Registro en formato DLF
-- 3 = Registro en formato ELF
-- 4 = Registro en formato WLF
-
-
-
-
-
-## .maxConcurrentProcesses
-
-**.maxConcurrentProcesses** : Integer
-
-El número máximo de procesos web concurrentes que soporta 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
-
-Valores posibles: 500000 - 2147483648
-
-
-
-
-
-## .maxRequestSize
-
-**.maxRequestSize** : Integer
-
-Contiene el tamaño máximo (en bytes) de las peticiones HTTP entrantes (POST) que el servidor web puede procesar. Pasar el valor máximo (2147483647) significa que, en la práctica, no se define ningún límite. Este límite se utiliza para evitar la saturación del servidor web debido a peticiones entrantes demasiado grandes. Si una petición alcanza este límite, el servidor web la rechaza.
-
-Valores posibles: 500000 - 2147483647
-
-
-
-
-
-## .maxSessions
-
-**.maxSessions** : Integer
-
-> Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession).
-
-Contiene el número máximo de sesiones simultáneas legacy. Cuando alcanza el límite, se cierra la sesión heredada más antigua (y se llama al método base `On Web Legacy Close Session`) si el servidor web necesita crear una nueva. El número de sesiones heredadas simultáneas no puede superar el número total de procesos web (propiedad `maxConcurrentProcesses`, 100 por defecto)
-
-
-
-
-
-## .minTLSVersion
-
-**.minTLSVersion** : Integer
-
-La versión TLS mínima 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:
-
-- 1 = TLSv1_0
-- 2 = TLSv1_1
-- 3 = TLSv1_2 (por defecto)
-- 4 = TLSv1_3
-
-Valores posibles:
-
-
-
-
-
-## .name
-
-**.name** : Text
-
-*Propiedad de sólo lectura*
-
-The name of the web server application.
-
-
-
-
-
-## .openSSLVersion
-
-**.openSSLVersion** : Text
-
-*Propiedad de sólo lectura*
-
-La versión de la librería OpenSSL utilizada.
-
-
-
-
-
-## .perfectForwardSecrecy
-
-**.perfectForwardSecrecy** : Boolean
-
-*Propiedad de sólo lectura*
-
-La disponibilidad de PFS en el servidor.
-
-
-
-
-
-## .rootFolder
-
-**.rootFolder** : Text
-
-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`.
-
-
-
-
-
-## .scalableSession
-
-**.scalableSession** : Boolean
-
-Contiene `True` si se utilizan sesiones escalables en el servidor web, y `False` en caso contrario.
-
-##### Ver también
-
-[.keepSession](#keepsession)
-
-
-
-
-
-## .sessionCookieDomain
-
-**.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.
-
-
-
-
-
-## .sessionCookieName
-
-**.sessionCookieName** : Text
-
-El nombre de la cookie utilizada para almacenar el ID de sesión.
-
-*Propiedad de sólo lectura*
-
-
-
-
-
-## .sessionCookiePath
-
-**.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.
-
-
-
-
-
-## .sessionCookieSameSite
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 | Añadidos |
-
-
-
-**.sessionCookieSameSite** : Text
-
-El valor de la cookie de sesión "SameSite". Valores posibles (utilizando constantes):
-
-| Constante | Valor | Descripción |
-| ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Web SameSite Strict | "Strict" | *Valor por defecto* - Las cookies sólo se envían en un contexto interno (first-party) |
-| Web SameSite Lax | "Lax" | Las cookies también se envían en las sub-solicitudes entre sitios, pero sólo cuando un usuario está navegando hacia el sitio de origen (es decir, cuando sigue un enlace). |
-| Web SameSite None | "None" | Las cookies se envían en todos los contextos, es decir, en las respuestas a las solicitudes de primera parte y de origen cruzado. |
-
-Consulta la descripción de [cookies de sesión SameSite](WebServer/webServerConfig.md#session-cookie-samesite) para obtener información detallada.
-
-
-
-
-
-## .sessionIPAddressValidation
-
-**.sessionIPAddressValidation** : Boolean
-
-> Esta propiedad no se utiliza en [modo sesiones escalables](#scalablesession) (no hay validación de dirección IP).
-
-La 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).
-
-
-
-
-
-## .start()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R3 | Añadidos |
-
-
-
-**.start**() : Object **.start**( *settings* : Object ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | --------------------------- | ----------------------------------------------- |
-| settings | Object | -> | Parámetros del servidor web a definir al inicio |
-| Resultado | Object | <- | Estado del inicio del servidor web |
-
-
-
-La función `.start()` inicia el servidor web en el que se aplica, utilizando las propiedades definidas en el parámetro opcional del objeto *settings*.
-
-El servidor web se inicia con los parámetros por defecto definidos en el archivo de configuración del proyecto o (base host únicamente) utilizando el comando `WEB SET OPTION`. Sin embargo, utilizando el parámetro *settings*, se pueden definir propiedades personalizadas para la sesión del servidor web.
-
-Todas los parámetros de los [objetos Servidor Web](../commands/web-server.md) pueden personalizarse, excepto las propiedades de sólo lectura ([.isRunning](#isrunning), [.name](#name), [.openSSLVersion](#opensslversion), [.perfectForwardSecrecy](#perfectforwardsecrecy) y [.sessionCookieName](#sessioncookiename)).
-
-Los parámetros de sesión personalizados se reiniciarán cuando se llame la función [`.stop()`](#stop).
-
-#### Objeto devuelto
-
-La función devuelve un objeto que describe el estado de lanzamiento del servidor web. Este objeto puede contener las siguientes propiedades:
-
-| Propiedad | | Tipo | Descripción |
-| --------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------- |
-| success | | Boolean | True si el servidor web se ha iniciado correctamente, False en caso contrario |
-| errors | | Collection | Pila de errores 4D (no se devuelve si el servidor web se inició con éxito) |
-| | \[].errCode | Number | Código de error 4D |
-| | \[].message | Text | Descripción del error 4D |
-| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
-
-> Si el servidor web ya fue lanzado, se devuelve un error.
-
-#### Ejemplo
-
-```4d
- var $settings;$result : Object
- var $webServer : 4D.WebServer
-
- $settings:=New object("HTTPPort";8080;"defaultHomepage";"myAdminHomepage.html")
-
- $webServer:=WEB Server
- $result:=$webServer.start($settings)
- If($result.success)
- //...
- End if
-```
-
-
-
-
-
-## .stop()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 18 R3 | Añadidos |
-
-
-
-**.stop()**
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ---- | - | ---------------------------- |
-| | | | No requiere ningún parámetro |
-
-
-
-La función `.stop()` detiene el servidor web sobre el que se aplica.
-
-Si el servidor web se ha iniciado, todas las conexiones y procesos web se cierran, una vez que las peticiones actualmente gestionadas han finalizado. Si el servidor web no se ha iniciado, el método no hace nada.
-
-> Esta función reinicia los parámetros web personalizados definidos para la sesión utilizando el parámetro *settings* de la función [`.start()`](#start), si los hay.
-
-#### Ejemplo
-
-Para detener el servidor web de la base:
-
-```4d
- var $webServer : 4D.WebServer
-
- $webServer:=WEB Server(Web server database)
- $webServer.stop()
-```
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebSocketClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebSocketClass.md
deleted file mode 100644
index 54894c3af956cc..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebSocketClass.md
+++ /dev/null
@@ -1,258 +0,0 @@
----
-id: WebSocketClass
-title: WebSocket
----
-
-La clase `WebSocket` permite abrir una conexión de cliente WebSocket con un servidor, enviar y recibir datos y cerrar la conexión.
-
-Las conexiones cliente WebSocket son útiles, por ejemplo, para recibir datos financieros en tiempo real o enviar y recibir mensajes de un chat.
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 20 R2 | Añadidos |
-
-
-
-### Ejemplo
-
-En este ejemplo, creamos un cliente WebSocket muy básico.
-
-1. Cree la clase usuario `WSConnectionHandler` que contiene la(s) función(es) de retrollamada utilizada(s) para gestionar las retrollamadas evento WebSocket:
-
-```4d
-// WSConnectionHandler class
-
-Class constructor
-
-Function onMessage($ws : 4D.WebSocket; $event : Object)
- ALERT($event.data)
-
-Function onTerminate($ws : 4D.WebSocket; $event : Object)
- ALERT("Connection closed")
-```
-
-2. Conécte al servidor WebSocket desde un formulario 4D instanciando un 4D.WebSocket:
-
-```4d
-Form.webSocket:=4D.WebSocket.new($wssUrl; cs.WSConnectionHandler.new())
-```
-
-3. Para enviar mensajes al servidor WebSocket desde el formulario 4D, puede escribir:
-
-```4d
-Form.webSocket.send("Hello world")
-
-```
-
-### Objeto WebSocket
-
-Los objetos WebSocket ofrecen las siguientes propiedades y funciones:
-
-| |
-| -------------------------------------------------------------------------------------------------------------------------- |
-| [](#datatype) |
-| [](#handler) |
-| [](#id) |
-| [](#send) |
-| [](#status) |
-| [](#terminate) |
-| [](#url) |
-
-## 4D.WebSocket.new()
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------------------------- |
-| 20 R3 | Soporte de la propiedad `headers` en *connectionHandler* |
-
-
-
-**4D.WebSocket.new**( *url* : Text { ; *connectionHandler* : Object } ) : 4D.WebSocket
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------------------------------------------- | ---------------------------- | :-------------------------: | ---------------------------------------------- |
-| url | Text | -> | URL a la que conectarse |
-| [connectionHandler](#connectionhandler-parameter) | Object | -> | Objeto que declara las retrollamadas WebSocket |
-| Resultado | 4D.WebSocket | <- | Nuevo [objeto WebSocket](#websocket-object) |
-
-
-
-La función `4D.WebSocket.new()` crea y devuelve un nuevo [objeto `4D.WebSocket`](#websocket-object) conectado al servidor WebSocket en la dirección especificada en *url*. El objeto `4D.WebSocket` ofrece una API para crear y gestionar una conexión WebSocket a un servidor, así como para enviar y recibir datos hacia y desde el servidor.
-
-En *url*, pase la URL a la que responderá el servidor WebSocket. Se pueden utilizar los siguientes patrones de URL:
-
-- `ws://host[:port]path[?query]` para conexiones estándar
-- `wss://host[:port]path[?query]` para conexiones seguras TLS
-
-Si la conexión no es posible, se devuelve un objeto `null` y se genera un error (que puede interceptar utilizando un método instalado con `ON ERR CALL`).
-
-### Parámetro *connectionHandler*
-
-En *connectionHandler*, puede pasar un objeto que contenga funciones de retrollamada a ser llamadas según los eventos de conexión, así como el tipo de datos y encabezados a manejar.
-
-- Las retrollamadas se llaman automáticamente en el contexto del formulario o worker que inicia la conexión.
-- El WebSocket será válido siempre y cuando el formulario o trabajador no esté cerrado.
-
-| Propiedad | Tipo | Descripción |
-| ----------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| onMessage | [Function](FunctionClass.md) | Función de retrollamada para datos WebSocket. Llamada cada vez que el WebSocket ha recibido datos. La retrollamada recibe los siguientes parámetros
:`$1`: objeto WebSocket`$2`
: objeto
`$2.type` (texto): siempre "message"
`$2.data` (texto, blob u objeto, ver `dataType`): datos recibidos
|
-| onError | [Function](FunctionClass.md) | Función de retrollamada para errores de ejecución. La retrollamada recibe los siguientes parámetros
:`$1`: objeto WebSocket`$2`
: objeto
`$2.type` (texto): siempre "error"
`$2.errors`: colección de pilas de errores 4D en caso de error de ejecución.
`[].errCode` (número): código de error 4D
`[].message` (texto): descripción del error 4D
`[].componentSignature` (texto): firma del componente interno que ha devuelto el error
|
-| onTerminate | [Function](FunctionClass.md) | Función de retrollamada cuando el WebSocket se termina. La retrollamada recibe los siguientes parámetros:
`$1`: objeto WebSocket
`$2`: objeto
`$2.code` (número, solo lectura): unsigned short contiene el código de cierre enviado por el servidor.
`$2.reason` (texto, solo lectura): razón por la cual el servidor cerró la conexión. Esto es específico al servidor y al subprotocolo particular.
|
-| onOpen | [Function](FunctionClass.md) | Función de retrollamada cuando el webSocket está abierto. La retrollamada recibe los siguientes parámetros
:`$1`: objeto WebSocket
:`$2` objeto
`$2.type` (texto): siempre "open"
|
-| dataType | Text | Tipo de datos recibidos o enviados. Valores disponibles: "text" (por defecto), "blob", "object". "text" = utf-8 |
-| headers | Object | Encabezados del WebSocket.
Sintaxis para la asignación de llave estándar: `headers.*llave*:=*value*` (*value* puede ser una Colección si la misma llave aparece varias veces)
Sintaxis para asignación de Cookie (caso particular): `headers.Cookie:="*name*=*value* {; *name2*=*value2*{; ... } }"`
|
-
-Esta es la secuencia de llamadas de retorno:
-
-1. `onOpen` se ejecuta una vez
-2. Cero o varios `onMessage` son ejecutados
-3. Cero o un `onError` es ejecutado (detiene el procesamiento)
-4. `onTerminate` se ejecuta siempre una vez
-
-#### Ejemplo
-
-Quiere definir los encabezados en la clase usuario `WSConnectionHandler`:
-
-```4d
-// Clase WSConnectionHandler
-
-Class constructor($myToken:Text)
-
-// Creación de los encabezados enviados al servidor
-This.headers:=New object("x-authorization";$myToken)
-// Definimos dos cookies
-This.headers.Cookie:="yummy_cookie=choco; tasty_cookie=fresa"
-...
-
-```
-
-
-
-## .dataType
-
-**.dataType** : Text
-
-#### Descripción
-
-La propiedad `.dataType` contiene el tipo de contenido del cuerpo de la respuesta. Puede ser "text", "blob" u "object".
-
-Esta propiedad es de sólo lectura.
-
-
-
-
-
-## .handler
-
-**.handler** : Object
-
-#### Descripción
-
-La propiedad `.handler` contiene el accessor que obtiene el objeto `connectionHandler` utilizado para iniciar la conexión.
-
-Esta propiedad es de sólo lectura.
-
-
-
-
-
-## .id
-
-**.id** : Integer
-
-#### Descripción
-
-La propiedad `.id` contiene el identificador único de la conexión.
-
-Esta propiedad es de sólo lectura.
-
-
-
-
-
-## .send()
-
-**.send**( *message* : Text ) **.send**( *message* : Blob ) **.send**( *message* : Object )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------------------ | :-: | ---------------- |
-| message | Text, Blob, Object | -> | Mensaje a enviar |
-
-
-
-#### Descripción
-
-La función `.send()` envía *message* al servidor WebSocket en el tipo de datos definido (Texto, Blob u Objeto).
-
-Los siguientes contenidos se envían en función del tipo de *message*:
-
-| Tipo | Contenido |
-| ------ | ------------------------------------------------------------------------------------------------------------------------- |
-| Text | Texto en UTF-8 |
-| Blob | Datos binarios |
-| Object | Texto en JSON UTF-8 (mismo resultado que con [`JSON Stringify`](../commands-legacy/json-stringify.md)) |
-
-
-
-
-
-## .status
-
-**.status** : Text
-
-#### Descripción
-
-La propiedad `.status` contiene el estado actual de la conexión (puede ser "Connecting", "Closing", "Closed", o "Connected").
-
-Esta propiedad es de sólo lectura.
-
-
-
-
-
-## .terminate()
-
-**.terminate**( { *code* : Integer { ; *reason* : Text } } )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-: | ---------------------------------------------------------- |
-| code | Integer | -> | Código de estado que explica por qué se cierra la conexión |
-| reason | Text | -> | La razón por la que se cierra la conexión |
-
-
-
-#### Descripción
-
-La función `.terminate()` cierra la conexión WebSocket, junto con los parámetros opcionales *code* y *reason*.
-
-En *code*, puede pasar un código de estado que explique por qué se está cerrando la conexión (ver también [WebSocket Connection Close Code in the RFC6455](https://www.rfc-editor.org/rfc/rfc6455.html#section-7.1.5)):
-
-- Si no se especifica, el código de cierre de la conexión se establece automáticamente en 1000 para un cierre normal o, en caso contrario, en otro valor estándar del rango 1001-1015 que indique la razón real por la que se cerró la conexión.
-- Si se especifica, el valor de este parámetro de código anula el ajuste automático. El valor debe ser un número entero. O 1000, o un código personalizado en el rango 3000-4999. Si especifica un valor *code*, también debe especificar un valor *reason*.
-
-En *reason*, puede pasar una cadena que describa por qué se está cerrando la conexión.
-
-
-
-
-
-## .url
-
-**.url** : Text
-
-#### Descripción
-
-La propiedad `.url` contiene la URL a la que se ha conectado el WebSocket. Es la URL que ha pasado a la función [`new()`](#4dwebsocketnew).
-
-Esta propiedad es de sólo lectura.
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/cli.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/cli.md
deleted file mode 100644
index ae639e17578b53..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/cli.md
+++ /dev/null
@@ -1,265 +0,0 @@
----
-id: cli
-title: |-
- Interfaz de línea de
- comando
----
-
-Puede utilizar el Terminal de macOS o la consola de Windows para manejar sus aplicaciones 4D (4D, 4D Server, aplicación fusionada y [tool4d](#tool4d)) utilizando líneas de comando. Más concretamente,
-esta funcionalidad le permite:
-
-- lanzar una base de
- datos de forma remota, lo que puede ser especialmente útil para administrar los servidores
- web.
-- ejecutar pruebas
- automáticas para sus aplicaciones.
-
-## Información básica
-
-Puede ejecutar
-líneas de comando para las aplicaciones 4D utilizando el terminal macOS o la consola
-Windows.
-
-- En macOS, debe utilizar el comando `open`.
-- En Windows, puede
- pasar los argumentos directamente.
-
-> En macOS, se pueden
-> pasar los argumentos directamente yendo a la carpeta donde se encuentra la aplicación
-> dentro del paquete (Contents/MacOS), lo que permite direccionar el flujo stderr. Por ejemplo, si el paquete 4D se encuentra en la carpeta `MyFolder`, debe escribir la línea de comandos de la siguiente manera: `/MyFolder/4D.app/Contents/MacOS/4D`. Sin embargo, recomendamos que utilice el comando `open` siempre que no necesite acceder al stream stderr.
-
-Lanzar una
-aplicación 4D
--------------
-
-A continuación se describen las líneas de comando y los
-argumentos soportados para lanzar aplicaciones 4D.
-
-Sintaxis:
-
-```
- [--version] [--help] [--project] [ [--data ]]
-[--opening-mode interpreted | compiled] [--create-data] [--user-param ] [--headless] [--dataless]
-[--webadmin-settings-file] [--webadmin-access-key] [--webadmin-auto-start] [--webadmin-store-settings]
-[--utility] [--skip-onstartup] [--startup-method ]
-```
-
-| Argumento | Valor | Descripción |
-| :-------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `applicationPath` | Ruta de 4D, 4D Server, aplicación fusionada o tool4d | Lanza la aplicación. Si no es sin interfaz: idéntico a
hacer doble clic en la aplicación; cuando se llama sin argumento de archivo de estructura,
la aplicación se ejecuta y aparece la caja de diálogo "seleccionar base de
datos". |
-| `--version` | | Muestra la versión de la aplicación y sale |
-| `--help` | | Muestra el mensaje de ayuda y sale. Argumentos
alternativos: -?, -h |
-| `--project` | projectPath
| packagePath | 4dlinkPath | Archivo de proyecto
a abrir con el archivo de datos actual. No aparece ninguna
caja de diálogo. |
-| `--data` | dataPath | Archivo de datos a
abrir con el archivo de proyecto designado. Si no se especifica, se utiliza el último archivo de datos
abierto. |
-| `--opening-mode` | interpreted
| compiled | Base de datos de
peticiones a abrir en modo interpretado o compilado. No se lanza ningún
error si el modo solicitado no está disponible. |
-| `--create-data` | | Crea automáticamente
un nuevo archivo de datos si no se encuentra un archivo de datos válido. No aparece ninguna
caja de diálogo. 4D utiliza el nombre
del archivo pasado en el argumento "--data" si lo hay (genera un error si ya
existe un archivo con el mismo nombre). |
-| `--user-param` | Cadena usuario
personalizada | Una cadena que estará disponible en la aplicación a través del comando [`Get database parameter`](../commands-legacy/get-database-parameter.md) (la cadena no debe comenzar por un carácter "-", que está reservado). |
-| `--headless` | | Lanza 4D, 4D Server o la aplicación fusionada sin interfaz (modo headless). En este modo:
El modo Diseño no está disponible, la base de datos se inicia en modo Aplicación
No se muestra la barra de herramientas, la barra de menú, la ventana MDI ni la pantalla de presentación
No se muestra ningún icono en el dock o la barra de tareas
La base de datos abierta no se registra en el menú "Bases de datos recientes"
Se inicia automáticamente el registro de diagnóstico (ver [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md), selector 79)
Se intercepta cada llamada a una caja de diálogo y se suministra una respuesta automática (por ejemplo, OK para el comando [ALERT](../commands-legacy/alert.md), Abort para un diálogo de error...). Todos los comandos interceptados(\*) se registran en el historial de diagnóstico.
Para las necesidades de mantenimiento, puede enviar cualquier texto a los flujos de salida estándar utilizando el comando [LOG EVENT](../commands-legacy/log-event.md). Tenga en cuenta que las aplicaciones 4D sin interfaz sólo pueden cerrarse mediante una llamada a [QUIT 4D](../commands-legacy/quit-4d.md) o utilizando el administrador de tareas del sistema operativo. |
-| `--dataless` | | Lanza 4D, 4D Server, la aplicación fusionada o tool4d en modo sin datos. El modo sin datos es útil cuando 4D ejecuta tareas sin necesidad de datos (compilación de proyectos, por ejemplo). En este modo:
No se abre ningún archivo que contenga datos, aunque se especifique en la línea de comandos o en el archivo `.4DLink`, o cuando se utilicen los comandos `CREATE DATA FILE` y `OPEN DATA FILE`.
Los comandos que manipulen datos generarán un error. Por ejemplo, `CREATE RECORD` muestra el mensaje “no hay tabla a la cual aplicar el comando”.
**Nota**:
si se pasa en la línea de comandos, el modo dataless se aplica a todas las bases de datos abiertas en 4D, siempre y cuando la aplicación no se cierre.
Si se pasa utilizando el archivo `.4DLink`, el modo dataless solo se aplica a la base de datos especificada en el archivo `.4DLink`. Para más información sobre los archivos `.4DLink`, ver [Atajos para abrir proyectos](../GettingStarted/creating.md#project-opening-shortcuts).
|
-| `--webadmin-settings-file` | Ruta del archivo | Ruta del archivo `.4DSettings` personalizado para el [servidor web WebAdmin](webAdmin.md). No disponible con [tool4d](#tool4d). |
-| `--webadmin-access-key` | Text | Llave de acceso para el [servidor web WebAdmin](webAdmin.md). No disponible con [tool4d](#tool4d). |
-| `--webadmin-auto-start` | Boolean | Estado del lanzamiento automático del [servidor web WebAdmin](webAdmin.md). No disponible con [tool4d](#tool4d). |
-| `--webadmin-store-settings` | | Almacena la llave de acceso y los parámetros de inicio automático en el archivo de parámetros actualmente utilizado (es decir, el archivo [`WebAdmin.4DSettings`](webAdmin.md#webadmin-settings) por defecto o un archivo personalizado designado con el parámetro `--webadmin-settings-path`). Utilice el argumento `--webadmin-store-settings` para guardar esta configuración si es necesario. No disponible con [tool4d](#tool4d). |
-| `--utility` | | Sólo disponible con 4D Server. Sólo disponible con 4D Server. |
-| `--skip-onstartup` | | Lanza el proyecto sin ejecutar ningún método "automático", incluyendo los métodos base `On Startup` y `On Exit` |
-| `--startup-method` | Nombre del método proyecto (cadena) | Método de proyecto a ejecutar inmediatamente después del método base `On Startup` (si no se omite con `--skip-onstartup`). |
-
-(\*) Algunos diálogos se muestran antes de abrir la base de datos, por lo que es imposible escribir en el [archivo de registro de diagnóstico](Debugging/debugLogFiles.md#4ddiagnosticlogtxt) (alerta de licencia, diálogo de conversión, selección de bases de datos, selección de archivos de datos). En este caso, se
-lanza un mensaje de error tanto en el flujo stderr como en el registro de eventos sistema,
-y luego la aplicación se cierra.
-
-### Ejemplos
-
-> La carpeta actual
-> del usuario se alcanza utilizando el comando "~ " en macOS y el comando
-> "%HOMEPATH%" en Windows.
-
-Lance una aplicación 4D almacenada en el escritorio:
-
-- macOS:
-
-```bash
-open ~/Desktop/4D.app
- open "~/Desktop/4D Server.app"
-```
-
-- Windows:
-
-```bash
-%HOMEPATH%\Desktop\4D\4D.exe
- %HOMEPATH%\Desktop\"4D Server.exe"
-```
-
-Abra un paquete en macOS:
-
-```bash
---args ~/Documents/myDB.4dbase
-```
-
-Abra un archivo de proyecto:
-
-- macOS:
-
-```bash
---args ~/Documents/myProj/Project/myProj.4DProject
-```
-
-- Windows:
-
-```bash
-%HOMEPATH%\Documents\myProj\Project\myProj.4DProject
-```
-
-Abra un archivo de proyecto y un archivo de datos:
-
-- macOS:
-
-```bash
---args --project ~/Documents/myProj/Project/myProj.4DProject
- --data ~/Documents/data/myData.4DD
-```
-
-- Windows:
-
-```bash
---project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject
- --data %HOMEPATH%\Documents\data\myData.4DD
- o:
- /project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject /data
- %HOMEPATH%\Documents\data\myData.4DD
-```
-
-Abra un archivo .4DLink:
-
-- macOS:
-
-```bash
-~/Desktop/MyDatabase.4DLink
-```
-
-- Windows:
-
-```bash
-%HOMEPATH%\Desktop\MyDatabase.4DLink
-```
-
-Lance la aplicación en modo compilado y cree un archivo de datos
-si no está disponible:
-
-- macOS:
-
-```bash
-~/Documents/myBase.4dbase --args --opening-mode compiled
- --create-data true
-```
-
-- Windows:
-
-```bash
-%HOMEPATH%\Documents\myBase.4dbase\myDB.4db --opening-mode
- compiled --create-data true
-```
-
-Lance la aplicación con un archivo proyecto y un archivo de datos
-y pase una cadena como parámetro de usuario:
-
-- macOS:
-
-```bash
---args --project ~/Documents/myProj/Project/myProj.4DProject
- --data ~/Documents/data/myData.4DD --user-param "Hello world"
-```
-
-- Windows:
-
-```bash
---project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject
- --data %HOMEPATH%\Documents\data\myData.4DD --user-param "Hello world"
-```
-
-Apertura sin interfaz (modo headless):
-
-- macOS:
-
-```bash
---args --project ~/Documents/myProj/Project/myProj.4DProject --data ~/Documents/data/myData.4DD --headless
-```
-
-- Windows:
-
-```bash
---project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject
- --data %HOMEPATH%\Documents\data\myData.4DD --headless
-```
-
-## tool4d
-
-**tool4d** es una aplicación gratuita, ligera y autónoma que le permite abrir un proyecto 4D en modo sin interfaz y ejecutar código 4D utilizando la lìnea de comando (CLI).
-
-tool4d está disponible en Windows y macOS y siempre está asociado
-a una versión 4D (misma versión y número de compilación). Sólo está disponible en inglés.
-
-tool4d es una herramienta perfecta si desea:
-
-- implementar una cadena CI/CD para su aplicación 4D,
-- utilizar un ejecutable 4D ligero para ejecutar scripts 4D, por
- ejemplo para ejecutar pruebas unitarias automáticas.
-
-### Uso de tool4d
-
-Puedes obtener tool4d de la [Página de descarga de productos](https://product-download.4d.com/).
-
-Se utiliza tool4d ejecutando una [línea de comandos](#launch-a-4d-application) con un proyecto 4D estándar. Puede utilizar todos los argumentos descritos en la tabla anterior, excepto --`webadmin` ya que este componente está [desactivado en tool4d](#disabled-4d-features). Con tool4d, se lanza la siguiente secuencia específica:
-
-1. La herramienta 4D ejecuta el método base `On Startup` (y todos los métodos "automáticos" como el [método usuario](../Users/handling_users_groups.md#propiedades-del-usuario)), excepto si se pasa el argumento `--skip-onstartup`.
-2. tool4d ejecuta el método designado por el argumento `--startup-method`, si existe.
-3. tool4d ejecuta el método base `On Exit`, excepto si se pasa el argumento `--skip-onstartup`.
-4. tool4d cierra.
-
-En Windows, tool4d es una aplicación de consola, de modo que el stream `stdout` se muestra en el terminal (cmd, powershell...).
-
-:::note Notas
-
-- tool4d siempre se ejecuta sin interfaz (la opción de línea de comandos `headless` es inútil).
-- El comando [`Application type`](../commands-legacy/application-type.md) devuelve el valor 6 ("tool4d") cuando se llama desde la aplicación tool4d.
-- el [archivo de registro de diagnóstico](../Debugging/debugLogFiles.md#4ddiagnosticlogtxt) tiene el prefijo "4DDiagnosticLogTool".
-
-:::
-
-### Funcionalidades 4D desactivadas
-
-Tenga en cuenta que tool4d se ejecuta automáticamente en **modo sin interfaz** (ver `--headless` en [esta tabla](#launch-a-4d-application)), y no da acceso al IDE 4D ni a ninguno de sus servidores. En concreto, se desactivan las siguientes funcionalidades:
-
-- servidor de aplicaciones, servidor web, servidor SQL,
-- programador de copias de seguridad,
-- ODBC y SQL pass-through,
-- todos los componentes como 4D View Pro, 4D SVG, 4D NetKit...,
-- corrector ortográfico hunspell,
-- corrector ortográfico japonés (librería *mecab*),
-- WebAdmin
-- CEF,
-- PHP,
-- depurador remoto (depurador local, el comando `TRACE` y los puntos de interrupción se ignoran en las aplicaciones sin interfaz).
-
-## 4D Server en modo utilitario
-
-Puede lanzar una instancia 4D Server en modo utilitario (sin interfaz) utilizando la opción CLI `--utility`. En este caso, se activa el siguiente flujo de trabajo:
-
-1. 4D Server ejecuta el método base `On Startup` (y todos los métodos "automáticos" como el [método usuario](../Users/handling_users_groups.md#user-properties)), excepto si se pasa el parámetro `--skip-onstartup`.
-2. 4D Server ejecuta el método designado por el `--startup-method`, si existe.
-3. El servidor 4D ejecuta el método base `On Exit`, excepto si se pasa el parámetro `--skip-onstartup`.
-4. 4D Server se cierra.
-
-:::info
-
-A diferencia de tool4d, 4D Server en modo utilitario tiene todas
-sus funcionalidades activadas. Sin embargo, el servidor de aplicaciones y el resto de servidores
-no se inician.
-
-:::
-
-:::tip Ver también
-
-Ver [esta publicación de blog](https://blog.4d.com/a-tool-for-4d-code-execution-in-cli/) para ejemplos de cómo utilizar tool4d y 4D Server en modo utilitario.
-
-:::
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/data-collect.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/data-collect.md
deleted file mode 100644
index 41d5be7e1108d2..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/data-collect.md
+++ /dev/null
@@ -1,155 +0,0 @@
----
-id: data-collect
-title: Recopilación de datos
----
-
-Para que nuestros productos sean siempre mejores, recogemos automáticamente los datos relativos a las estadísticas de uso de las aplicaciones 4D Server en funcionamiento. Los datos recogidos son completamente anónimos y se transfieren sin afectar la experiencia del usuario.
-
-Esta página explica:
-
-- qué información se recoge,
-- dónde se almacena la información y cuándo se envía a 4D,
-- cómo desactivar la recopilación automática de datos en las aplicaciones integradas cliente/servidor.
-
-## Información recopilada
-
-Los datos se recogen durante los siguientes eventos:
-
-- inicio de la base de datos,
-- cierre de base de datos,
-- inicio del servidor web,
-- uso de funciones específicas como php, open datastore, depurador remoto,
-- conexión con el cliente,
-- envío de recolección de datos.
-
-También se recogen algunos datos a intervalos regulares.
-
-### Recogidos al iniciar la base de datos
-
-| Datos | Tipo | Notas |
-| ----------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
-| CPU | Text | Nombre, tipo y velocidad del procesador |
-| numberOfCores | Number | Número total de núcleos |
-| memory | Number | Volumen de almacenamiento de memoria (en bytes) disponible en la máquina |
-| system | Text | Versión del sistema operativo y número de build |
-| headless | Boolean | True si la aplicación se ejecuta en modo sin interfaz |
-| version | Number | Número de versión de la aplicación 4D |
-| buildNumber | Number | Número de build de la aplicación 4D |
-| license | Object | Nombre comercial y descripción de las licencias de los productos |
-| isRosetta | Boolean | True si 4D es emulado a través de Rosetta en macOS, False en caso contrario (no emulado o en Windows). |
-| uniqueID | Text | ID único de 4D Server |
-| id | Texto (cadena con hash) | Identificador único asociado a la base de datos (*Polinomio Rolling hash del nombre de la base*) |
-| dataFileSize | Number | Tamaño del archivo de datos en bytes |
-| indexesSize | Number | Tamaño del índice en bytes |
-| cacheSize | Number | Tamaño de caché en bytes |
-| usingLegacyNetworkLayer | Boolean | True si se utiliza la capa de red heredada para el servidor de aplicaciones |
-| usingQUICNetworkLayer | Boolean | True si la base utiliza la capa de red QUIC |
-| encryptedConnections | Boolean | True si las conexiones cliente/servidor están encriptadas |
-| encrypted | Boolean | True si el archivo de datos está encriptado |
-| compiled | Boolean | True si la aplicación está compilada |
-| isEngined | Boolean | True si la aplicación se fusiona con 4D Volume Desktop |
-| projectMode | Boolean | True si la aplicación es un proyecto |
-| mobile | Collection | Información sobre sesiones móviles |
-
-### Recogidos al inicio del servidor web y en el envío de la recolección de datos
-
-| Datos | Tipo | Notas |
-| --------- | ------ | ---------------------------------------------------------------------------- |
-| webServer | Object | "started":true si el servidor web está arrancando o iniciado |
-
-### Recolectado durante la creación de una nueva sesión web
-
-| Datos | Tipo | Notas |
-| --------------------------------------------------- | ------ | ---------------------------------------------------------------------------------------------- |
-| databases.webMaxLicensedSessions | Number | Número máximo de sesiones web no REST en el servidor que utilizan la licencia del servidor web |
-| databases.restMaxLicensedSessions | Number | Número máximo de sesiones web REST en el servidor que utilizan la licencia REST |
-| databases.webMaxUnlicensedSessions | Number | Número máximo de otras sesiones web no REST en el servidor |
-| databases.restMaxUnlicensedSessions | Number | Número máximo de otras sesiones web REST en el servidor |
-
-### Recolectadoo al abrir el datastore
-
-| Datos | Tipo | Notas |
-| ------------------------------------------------- | ------ | ---------------------------------------------------------------- |
-| databases.externalDatastoreOpened | Number | Número de llamadas a `Open datastore` |
-| databases.internalDatastoreOpened | Number | Número de veces que un servidor externo abre el almacén de datos |
-
-### Recogidas a intervalos regulares
-
-| Datos | Tipo | Notas |
-| --------------------------- | ------ | ----------------------------------------- |
-| maximumNumberOfWebProcesses | Number | Número máximo de procesos web simultáneos |
-| maximumUsedPhysicalMemory | Number | Uso máximo de la memoria física |
-| maximumUsedVirtualMemory | Number | Uso máximo de la memoria virtual |
-
-### Recogida en el envío de datos
-
-| Datos | Tipo | Notas |
-| ---------------------------------------------- | ------- | ---------------------------------------------------------------------------------------- |
-| uptime | Number | Tiempo transcurrido (en segundos) desde que se abrió la base 4D local |
-| cacheReadBytes | Object | Número de bytes leídos de la caché |
-| cacheMissBytes | Object | Número de bytes perdidos de la caché |
-| cacheReadCount | Object | Número de lecturas en la caché |
-| cacheMissCount | Object | Número de lecturas perdidas en la caché |
-| dataSegment1.diskReadBytes | Object | Número de bytes leídos en el archivo de datos |
-| dataSegment1.diskWriteBytes | Object | Número de bytes escritos en el archivo de datos |
-| dataSegment1.diskReadCount | Object | Número de lecturas en el archivo de datos |
-| dataSegment1.diskWriteCount | Object | Número de escrituras en el archivo de datos |
-| indexSegment.diskReadBytes | Number | Número de bytes leídos en el archivo índice |
-| indexSegment.diskWriteBytes | Number | Número de bytes escritos en el archivo índice |
-| indexSegment.diskReadCount | Number | Número de lecturas en el archivo índice |
-| indexSegment.diskWriteCount | Number | Número de escrituras en el archivo índice |
-| databases.webScalableSessions | Boolean | True si las sesiones escalables están activadas |
-| databases.webIPAddressesNumber | Number | Número de direcciones IP diferentes que hicieron una petición a 4D Server |
-
-### Recolección al cierre de la base y envío de los datos
-
-| Datos | Tipo | Notas |
-| ------------------------------ | ------ | ------------------------------------------------------------------- |
-| webserverHits | Number | Número de visitas al servidor web durante la recolección de datos |
-| restHits | Number | Número de accesos al servidor REST durante la recolección de datos |
-| webserverBytesIn | Number | Bytes recibidos por el servidor web durante la recolección de datos |
-| webserverBytesOut | Number | Bytes enviados por el servidor web durante la recolección de datos |
-| qodly.webforms | Number | Número de formularios web Qodly |
-
-### Recolectado en cada nueva llamada al depurador remoto
-
-| Datos | Tipo | Notas |
-| ----------------------------------------------------------- | ------ | ------------------------------------------------------------- |
-| databases.remoteDebugger4DRemoteAttachments | Number | Número de adjuntos al depurador remoto desde un 4D remoto |
-| databases.remoteDebuggerQodlyAttachments | Number | Número de archivos adjuntos al depurador remoto de Qodly |
-| databases.remoteDebuggerVSCodeAttachments | Number | Número de archivos adjuntos al depurador remoto desde VS Code |
-
-### Recolección cada vez que se llama a PHP execute
-
-| Datos | Tipo | Notas |
-| ----------- | ------- | ----------------------------------------------------------------------------------------- |
-| phpCall | Number | Número de llamadas a `PHP execute` |
-| externalPHP | Boolean | True si el cliente realiza una llamada a `PHP execute` y utiliza su propia versión de php |
-
-### Recolección en la conexión del cliente
-
-| Datos | Tipo | Notas |
-| -------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------- |
-| maximum4DClientConnections | Number | Número máximo de conexiones 4D Client al servidor |
-| connectionSystems | Collection | Sistema operativo del cliente sin el número de compilación (entre paréntesis) y número de clientes que lo utilizan |
-
-## ¿Dónde se almacena y envía?
-
-Los datos recolectados se escriben en un archivo de texto (formato JSON) por base de datos cuando 4D Server cierra. El archivo se guarda dentro de la [carpeta activa de 4D](../commands-legacy/get-4d-folder.md), es decir:
-
-- en Windows: `Users\[userName]\AppData\Roaming\4D Server`
-- en macOS: `/Users/[userName]/Library/ApplicationSupport/4D Server`
-
-Una vez a la semana, el archivo se envía automáticamente por la red a 4D. A continuación, el archivo se elimina de la carpeta activa de 4D.
-
-
-
-> Si el archivo no ha podido ser enviado por alguna razón, no obstante se elimina y no se muestra ningún mensaje de error del lado de 4D Server.
-
-El archivo se envía a la siguiente dirección del servidor: `https://dcollector.4d.com` (ip: 195.68.52.83).
-
-## Desactivar la recopilación de datos en las aplicaciones cliente/servidor integradas
-
-Puede desactivar la recolección automática de datos en [aplicaciones integradas cliente/servidor](../Desktop/building.md#clientserver-page).
-
-Para desactivar la colección, pase el valor **False** a la llave [`ServerDataCollection`](https://doc.4d.com/4Dv20/4D/20/ServerDataCollection.300-6335775.en.html) en el archivo `buildApp.4DSettings`, utilizado para crear la aplicación cliente/servidor.
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/licenses.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/licenses.md
deleted file mode 100644
index b92609963e4adf..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/licenses.md
+++ /dev/null
@@ -1,173 +0,0 @@
----
-id: licenses
-title: Licencias
----
-
-## Visión general de las licencias 4D
-
-Para utilizar los productos y funcionalidades 4D, necesita instalar las licencias apropiadas en su ordenador. 4D ofrece dos categorías de licencias:
-
-- **Licencias de desarrollo**, necesarias para trabajar con 4D y 4D Server IDE.
-- **Licencias de despliegue**, necesarias para desplegar sus aplicaciones personalizadas creadas con 4D.
-
-### Licencias de desarrollo
-
-Las licencias de desarrollo son necesarias para acceder al entorno Diseño 4D y a las funcionalidades. Por ejemplo, *4D Developer Pro* es una licencia de desarrollo monopuesto. Las licencias de desarrollo registradas se instalan automáticamente [al iniciar sesión](GettingStarted/Installation.md) en el Asistente de bienvenida, o puede añadirlas utilizando el diálogo [Activación instantánea](#instant-activation).
-
-### Licencias de despliegue
-
-Las licencias de despliegue pueden ser anidadas en el paso de creación por el desarrollador o introducido en el primer lanzamiento por el usuario final, como se describe en la siguiente tabla:
-
-| Licencia de despliegue | Descripción | Dónde introducirla |
-| ------------------------ | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
-| *4D OEM Desktop* | Licencia personalizada incorporada, contacte al equipo de ventas 4D para obtener información | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
-| *4D Unlimited Desktop* | **Descontinuada** - Licencia personalizada integrada | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
-| *4D Desktop* | Licencia por usuario, que permite utilizar aplicaciones 4D independientes | Diálogo [Primera activación](#first-activation) en la máquina usuario |
-| *4D Server OEM* | Licencia personalizada incorporada, contacte al equipo de ventas 4D para obtener información | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
-| *4D XML Keys Activation* | Utilizado para activar las licencias OEM del 4D Server | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
-| *4D Server* | Licencia por usuario, que les permite utilizar 4D Server y clientes | Diálogo [Primera activación](#first-activation) en la máquina usuario |
-
-### Vencimiento
-
-Algunas licencias 4D tienen una fecha de caducidad, después de la cual deben ser renovadas. Cuando la suscripción a la licencia se renueva en 4D Store, sus licencias se actualizan automáticamente en sus aplicaciones 4D al iniciar el proceso [cuando se conecta](GettingStarted/Installation.md) en el Asistente de bienvenida.
-
-En algunos casos, la actualización de la licencia puede necesitar que haga clic en el botón [**Actualizar**](#refresh) de la caja de diálogo del Gestor de licencias.
-
-## Activación de licencias
-
-Una vez instalados en su disco, debe activar sus productos 4D para poder utilizarlos. Normalmente, **la activación es automática** si [inicia sesión con su cuenta 4D](GettingStarted/Installation.md) en el asistente de bienvenida.
-
-Sin embargo, en algunos casos específicos podría ser necesario activar las licencias manualmente, por ejemplo si:
-
-- su configuración no permite la activación automática,
-- ha comprado licencias de desarrollo adicionales.
-
-No es necesaria la activación para los siguientes usos:
-
-- 4D utilizado en modo remoto (conexión a un 4D Server)
-- 4D utilizado en modo local con un proyecto aplicación interpretado sin acceso al entorno Diseño.
-
-### Primera activación
-
-Con 4D, seleccione el comando **Gestión de licencias...** del menú **Ayuda** de la aplicación. Con 4D Server, basta con lanzar la aplicación 4D Server. Aparece el diálogo para seleccionar el modo de activación.
-
-
-
-4D ofrece tres modos de activación. Recomendamos **Activación inmediata**.
-
-### Activación inmediata
-
-Introduzca su identificación de usuario (correo electrónico o cuenta 4D) así como su contraseña. Si no tiene una cuenta de usuario, deberá crearla en la siguiente dirección:
-
-[https://account.4d.com/us/login.shtml](https://account.4d.com/us/login.shtml)
-
-
-
-A continuación, introduzca el número de licencia del producto que desea activar. Este número se facilita por correo electrónico o por correo tras la compra de un producto.
-
-
-
-### Activación diferida
-
-Si no puede utilizar la [activación inmediata](#instant-activation) porque su ordenador no tiene acceso a Internet, proceda a la activación diferida siguiendo los siguientes pasos.
-
-1. En la ventana del Administrador de licencias, seleccione la pestaña **Activación diferida**.
-2. Ingrese el número de licencia y su dirección de correo electrónico, luego haga clic en **Generar archivo** para crear el archivo de ID (*reg.txt*).
-
-
-
-3. Guarde el archivo *reg.txt* en una unidad USB y llévelo a un ordenador que tenga acceso a Internet.
-4. En la máquina con acceso a Internet, inicie sesión en [https://activation.4d.com](https://activation.4d.com).
-5. En la página Web, haz clic en el botón **Elegir archivo...** y seleccione el archivo *reg.txt* de los pasos 3 y 4; luego haga clic en el botón **Activate**.
-6. Descargue los archivos seriales.
-
-
-
-7. Guarde el(los) archivo(s) *license4d* en un medio compartido y transfiéralo(s) de nuevo a la máquina 4D del paso 1.
-8. Ahora, de vuelta en la máquina con 4D, aún en la página de **Activación Diferida**, haga clic en **Siguiente**; luego clic en el botón **Cargar...** y seleccione un archivo *license4d* de los medios compartidos del paso 7.
-
-
-
-Con el archivo de licencia cargado, haga clic en **Siguiente**.
-
-
-
-9. Haga clic en el botón **Añadir N°** para añadir otra licencia. Repita estos pasos hasta que se hayan integrado todas las licencias del paso 6.
-
-Su aplicación 4D está ahora activada.
-
-### Activación de emergencia
-
-Este modo puede utilizarse para una activación temporal especial de 4D (5 días como máximo) sin conectarse al sitio web de 4D. Esta activación sólo puede utilizarse una vez.
-
-## Refresh
-
-Las licencias generalmente se actualizan automáticamente al inicio de su aplicación 4D.
-
-Puede utilizar el botón **Refrescar** en los siguientes contextos:
-
-- Cuando haya comprado una expansión adicional y quiera activarla,
-- Cuando necesite actualizar un número de licencia caducado (Partners o evoluciones).
-
-Elija el comando **Administrador de licencias...** del menú **Ayuda** de la aplicación 4D o 4D Server, y luego haga clic en el botón **Refrescar**:
-
-
-
-Este botón lo conecta con nuestra base clientes y activa automáticamente todas las licencias nueva o actualizadas relacionadas con la licencia actual (la licencia actual se muestra en **negrita** en la lista de "Licencias activas"). Sólo se le pedirá su cuenta de usuario y su contraseña.
-
-- Si ha adquirido expansiones adicionales para un servidor 4D, no es necesario introducir ningún número de licencia, simplemente haga clic en **Refrescar**.
-- En la primera activación de un 4D Server, basta con introducir el número de servidor y todas las expansiones adquiridas se asignan automáticamente.
-
-## 4D Online Store
-
-En 4D Store, puede pedir, actualizar, extender y/o gestionar los productos 4D. Puede llegar a la tienda en la siguiente dirección: [https://store.4d.com/us/](https://store.4d.com/us/) (deberá seleccionar su país).
-
-Haga clic en **Inicio de sesión** para acceder con su cuenta actual o en **Nueva cuenta** para crear una nueva, y luego siga las instrucciones que aparecen en pantalla.
-
-### Gestión de licencias
-
-Después de iniciar sesión, puede hacer clic en **Lista de licencias** en la parte superior derecha de la página:
-
-
-
-Aquí puede gestionar sus licencias asignándolas a proyectos.
-
-Seleccione la licencia adecuada de la lista y, a continuación, haga clic en **Enlazar a un proyecto... >**:
-
-
-
-Puede seleccionar un proyecto existente o crear uno nuevo:
-
-
-
-
-
-Puede utilizar los proyectos para organizar sus licencias según sus necesidades:
-
-
-
-## Solución de problemas
-
-Si el proceso de instalación o activación falla, compruebe la siguiente tabla, en la que se indican las causas más comunes de mal funcionamiento:
-
-| Síntomas | Causas posibles | Solución(es) |
-| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Imposible descargar el producto desde el sitio web de 4D | Sitio de Internet no disponible, aplicación antivirus, cortafuegos | 1- Inténtelo de nuevo más tarde O 2- Desactive temporalmente su aplicación antivirus o su cortafuegos. |
-| Imposible instalar el producto en el disco (instalación rechazada). | Derechos de acceso de usuario insuficientes | Abra una sesión con derechos de acceso que le permitan instalar aplicaciones (acceso administrador) |
-| Fallo de activación en línea | Aplicación antivirus, cortafuegos, proxy | 1- Desactivar temporalmente su aplicación antivirus o su cortafuegos O 2- Utilizar la activación diferida (no disponible con las licencias de las versiones "R") |
-
-Si esta información no le ayuda a resolver su problema, contacte 4D o a su distribuidor local.
-
-## Contactos
-
-Para cualquier pregunta sobre la instalación o activación de su producto, póngase en contacto con 4D, Inc. o con su distribuidor local.
-
-Para US:
-
-- Web: [https://us.4d.com/4d-technical-support](https://us.4d.com/4d-technical-support)
-- Tel: 1-408-557-4600
-
-Para UK:
-
-- Web: [https://uk.4d.com/4d-technical-support](https://uk.4d.com/4d-technical-support)
-- Teléfono: 01625 536178
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/log.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/log.md
deleted file mode 100644
index dabda388707050..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/log.md
+++ /dev/null
@@ -1,89 +0,0 @@
----
-id: log
-title: Archivo de historial (.journal)
----
-
-Una aplicación de uso continuo siempre está registrando cambios, adiciones o supresiones. Realizar copias de seguridad periódicas de los datos es importante, pero no permite (en caso de incidente) restaurar los datos introducidos desde la última copia de seguridad. Para responder a esta necesidad, 4D ofrece ahora una herramienta específica: el archivo de historial. Este archivo permite garantizar la seguridad permanente de los datos.
-
-Además, 4D trabaja continuamente con una caché de datos en la memoria. Esto acelera el funcionamiento de las aplicaciones; de hecho, el acceso a la memoria es más rápido que el acceso al disco duro. Todos los cambios realizados en los datos de la aplicación se almacenan temporalmente en la caché antes de escribirse en el disco duro. Si se produce un incidente en la aplicación antes de que los datos almacenados en la caché puedan escribirse en el disco, deberá incluir el archivo de historial actual para poder recuperar la aplicación por completo.
-
-Por último, 4D dispone de funciones que analizan el contenido del archivo de historial, permitiendo revertir las operaciones realizadas sobre los datos de la aplicación. Estas funciones están disponibles en el CSM: consulte la página [Análisis de actividades](MSC/analysis.md) y la página [Retroceder](MSC/rollback.md).
-
-## Funcionamiento del archivo de historial
-
-El archivo de historial generado por 4D contiene una descripción de todas las operaciones realizadas en los datos de las tablas registradas en el diario, que se registran de forma secuencial. Por defecto, todas las tablas se registran en el diario, es decir, se incluyen en el archivo de historial, pero puede anular la selección de tablas individuales mediante la propiedad **Incluir en el archivo de historial**.
-
-Así, cada operación realizada por un usuario provoca dos acciones simultáneas: la primera en el archivo de datos (la instrucción se ejecuta normalmente) y la segunda en el archivo de historial (se registra la descripción de la operación). El archivo de historial se crea de forma independiente, sin perturbar ni ralentizar el trabajo del usuario. El archivo de historial se crea de forma independiente, sin perturbar ni ralentizar el trabajo del usuario. El archivo de historial registra los siguientes tipos de acciones:
-
-- Apertura y cierre del archivo de datos,
-- Apertura y cierre del proceso (contextos),
-- Adición de registros o BLOBs,
-- Modificación de registros,
-- Eliminación de registros,
-- Creación y cierre de transacciones.
-
-Para más información sobre estas acciones, consulte la página [Análisis de actividades](MSC/analysis.md) del CSM.
-
-4D gestiona el archivo de historial. Tiene en cuenta todas las operaciones que afectan al archivo de datos por igual, independientemente de las manipulaciones realizadas por un usuario, métodos 4D, el motor SQL, los plug-ins, o un navegador web o una aplicación móvil.
-
-La siguiente ilustración resume el funcionamiento del archivo de historial:
-
-
-
-El archivo de historial actual se guarda automáticamente con el archivo de datos actual. Este mecanismo tiene dos ventajas distintas:
-
-- Evitar la saturación del volumen de disco donde se almacena el archivo de historial. Sin una copia de seguridad, el archivo de historial se haría cada vez más grande con el uso, y acabaría utilizando todo el espacio disponible en el disco. Para cada copia de seguridad del archivo de datos, 4D o 4D Server cierra el archivo de historial actual e inmediatamente inicia un nuevo archivo vacío, evitando así el riesgo de saturación. A continuación, el archivo de historial antiguo se archiva y, finalmente, se destruye en función del mecanismo de gestión de los conjuntos de copias de seguridad.
-- Conservar los archivos de historial correspondientes a las copias de seguridad para poder analizar o reparar una aplicación en un momento posterior. La integración de un archivo de historial sólo puede hacerse en la aplicación a la que corresponde. Para poder integrar correctamente un archivo de historial en una copia de seguridad, es importante que las copias de seguridad y los archivos de historial se archiven simultáneamente.
-
-## Crear el archivo de historial
-
-Por defecto, toda aplicación creada con 4D utiliza un archivo de historial (opción definida en la página **General** de las Preferencias). El archivo de historial se llama *data.journal* y se coloca en la carpeta Data.
-
-Puede averiguar si su aplicación utiliza un archivo de historial en cualquier momento: sólo tiene que comprobar si la opción **Utilizar el archivo de historial** está seleccionada en la página **Backup/Configuración** de las Propiedades. Si deselecciona esta opción, o si utiliza una aplicación sin archivo de historial y desea configurar una estrategia de copia de seguridad con un archivo de historial, tendrá que crear uno.
-
-Para crear un archivo de historial:
-
-1. En la página **Copia de seguridad/Configuración** de las Propiedades de estructura, marque la opción **Utilizar el archivo de historial**.
- El programa muestra una caja de diálogo estándar de abrir/nuevo archivo. Por defecto, el archivo de historial se llama *data.journal*.
-
-2. Mantenga el nombre por defecto o cambie el nombre, y luego seleccione la ubicación del archivo.
- Si tiene al menos dos discos duros, se recomienda colocar el archivo de historial en un disco distinto al que contiene el proyecto de aplicación. Si se pierde el disco duro de la aplicación, aún puede recuperar su archivo de historial.
-
-3. Presione **Guardar**.
- El disco y el nombre del archivo de historial abierto se muestran ahora en el área **Utilizar historial** de la caja de diálogo. Puede hacer clic en esta área para que aparezca un menú emergente con la ruta del historial en el disco.
-
-4. Valide la caja de diálogo de las Propiedades.
-
-Para poder crear directamente un archivo de historial, los datos deben estar en una de las siguientes situaciones:
-
-- El archivo de datos está en blanco,
-- Acaba de realizar una copia de seguridad y aún no se han realizado cambios en los datos.
-
-Si hace clic en Aceptar, la copia de seguridad comienza inmediatamente, y luego se activa el archivo de historial. Si hace clic en **Aceptar**, la copia de seguridad comienza inmediatamente, y luego se activa el archivo de historial. Si hace clic en **Cancelar**, la solicitud se guarda pero la creación del archivo de historial se pospone y en realidad sólo se creará después de la siguiente copia de seguridad de la aplicación. Esta precaución es indispensable porque, para restaurar una aplicación después de algún incidente, necesitará una copia de la aplicación en la que se integrarán las operaciones registradas en el archivo de historial.
-
-Sin tener que hacer nada más, todas las operaciones realizadas sobre los datos se registran en este archivo y se utilizarán en el futuro cuando se abra la aplicación.
-
-Debe crear otro archivo de historial si crea un nuevo archivo de datos. Debe establecer o crear otro archivo de historial si abre otro archivo de datos que no está asociado a un archivo de historial (o si falta el archivo de historial).
-
-## Parámetros del archivo de historial
-
-Los [parámetros del archivo de historial](settings.md#log-management) se basa en dos datos: un valor booleano y una ruta.
-
-1. **Valor booleano**: indica si la funcionalidad "Utilizar archivo de registro" está activada o desactivada en la aplicación. Por defecto, el valor booleano se almacena en *catalog.4DCatalog*. Sin embargo, cuando se activan los [parámetros usuario](../Desktop/user-settings.md), la configuración del archivo *catalog.4DCatalog* se anula, y el valor booleano puede definirse tanto en el archivo *Backup.4DSettings* [junto al archivo de datos](../Project/architecture.md#settings-user-data) como en el archivo *Backup.4DSettings* [en la carpeta del proyecto](../Project/architecture.md#settings-user) (ver también la documentación de la llave de backup xml `JournalFileEnabled` en [doc.4d.com](https://doc.4d.com)).
-
-2. **Ruta**: una cadena que indica dónde se encuentra el archivo de registro. La ruta del archivo de registro siempre se almacena en el archivo de datos vinculados.
-
-## Cerrar el historial
-
-Si desea dejar de registrar las operaciones en el archivo de historial actual, sólo tiene que anular la selección de la opción **Utilizar el archivo de historial** en la página **Copia de seguridad/Configuración** de las Propiedades.
-
-4D muestra entonces un mensaje de alerta para recordarle que esta acción le impide aprovechar la seguridad que ofrece el archivo de historial:
-
-
-
-Si hace clic en el botón **Parar**, el archivo de historial actual se cierra inmediatamente (la caja de dialogo de las Propiedades no necesita ser validada después).
-
-Si desea cerrar el archivo de historial actual porque es demasiado grande, puede considerar la posibilidad de realizar una copia de seguridad del archivo de datos, lo que hará que el archivo de historial se copie también.
-
-> **4D Server:** el comando `New log file` cierra automáticamente el archivo de historial actual e inicia uno nuevo.
-> Si por alguna razón el archivo de historial no está disponible durante una sesión de trabajo, se genera el error 1274 y 4D Server no permite a los usuarios escribir más datos. Cuando el archivo de historial está disponible de nuevo, es necesario hacer una copia de seguridad.
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/classes.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/classes.md
deleted file mode 100644
index c48a22860b2b81..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/classes.md
+++ /dev/null
@@ -1,859 +0,0 @@
----
-id: classes
-title: Clases
----
-
-## Generalidades
-
-El lenguaje 4D soporta el concepto de **clases**. En un lenguaje de programación, el uso de una clase permite definir el comportamiento de un objeto con propiedades y funciones asociadas.
-
-Una vez definida una clase usuario, puede instanciar los objetos de esta clase en cualquier parte de su código. Una vez definida una clase usuario, puede instanciar los objetos de esta clase en cualquier parte de su código. Una clase puede [`extend`](#class-extends-classname) otra clase, y luego hereda sus [funciones](#function) y propiedades ([declaradas](#property) y [calculadas](#function-get-and-function-set)).
-
-> El modelo de clases en 4D es similar al de las clases en JavaScript, y se basa en una cadena de prototipos.
-
-Por ejemplo, puede crear una clase `Person` con la siguiente definición:
-
-```4d
-//Class: Person.4dm
-Class constructor($firstname : Text; $lastname : Text)
- This.firstName:=$firstname
- This.lastName:=$lastname
-
-Function get fullName() -> $fullName : Text
- $fullName:=This.firstName+" "+This.lastName
-
-Function sayHello() -> $welcome : Text
-
- $welcome:="Hello "+This.fullName
-```
-
-En un método, creando una "Persona":
-
-```4d
-var $person : cs.Person //object of Person class
-var $hello : Text
-$person:=cs.Person.new("John";"Doe")
-// $person:{firstName: "John"; lastName: "Doe"; fullName: "John Doe"}
-$hello:=$person.sayHello() //"Hello John Doe"
-```
-
-## Gestión de clases
-
-### Definición de una clase
-
-Una clase usuario en 4D está definida por un archivo [método ](methods.md) específico (.4dm), almacenado en la carpeta `/Project/Sources/Classes/`. El nombre del archivo es el nombre de la clase.
-
-Al nombrar las clases, debe tener en cuenta las siguientes reglas:
-
-- Un [nombre de clase](identifiers.md#classes) debe cumplir con [reglas de denominación de las propiedades](identifiers.md#object-properties).
-- .
-- No se recomienda dar el mismo nombre a una clase y a una tabla de la base, para evitar conflictos.
-
-Por ejemplo, si quiere definir una clase llamada "Polygon", tiene que crear el siguiente archivo:
-
-```
-Project folder Project Sources Classes Polygon.4dm
-```
-
-### Borrar una clase
-
-Para eliminar una clase existente, puede:
-
-- en su disco, elimine el archivo de clase .4dm de la carpeta "Classes",
-- en el Explorador 4D, seleccione la clase y haga clic  o elija **Mover a la Papelera** en el menú contextual.
-
-### Utilizar la interfaz 4D
-
-Los archivos de clase se almacenan automáticamente en la ubicación adecuada cuando se crean a través de la interfaz de 4D, ya sea a través del menú **Archivo** o del Explorador.
-
-#### Menú Archivo y barra de herramientas
-
-Puede crear un nuevo archivo de clase para el proyecto seleccionando **Nueva > Clase...** en el menú **Archivo** de 4D Developer o en la barra de herramientas.
-
-También puede utilizar el atajo **Ctrl+Mayús+Alt+k**.
-
-#### Explorador
-
-En la página **Métodos** del Explorador, las clases se agrupan en la categoría **Clases**.
-
-Para crear una nueva clase, puede:
-
-- seleccione la categoría **Clases** y haga clic en el botón .
-- seleccione **Nueva clase...** en el menú de acciones de la parte inferior de la ventana del Explorador, o en el menú contextual del grupo Clases.
- 
-- seleccione **Nueva > Clase...** en el menú contextual de la página de inicio del Explorador.
-
-#### Soporte del código de clase
-
-En las diferentes ventanas 4D (editor de código, compilador, depurador, explorador de ejecución), el código de la clase se maneja básicamente como un método proyecto con algunas especificidades:
-
-- En el editor de código:
- - una clase no puede ser ejecutada
- - una función de clase es un bloque de código
- - **Ir a la definición** en un objeto miembro busca las declaraciones de función de clase; por ejemplo, "$o.f()" encontrará "Function f".
- - **Buscar referencias** en la declaración de función de clase busca la función utilizada como miembro de objeto; por ejemplo, "Function f" encontrará "$o.f()".
-- En el explorador de Ejecución y Depurador, las funciones clase se muestran con el formato `` constructor o `.`.
-
-## Class stores
-
-Las clases disponibles son accesibles desde sus class stores. Hay dos class stores disponibles:
-
-- [`cs`](../commands/cs.md) para el almacén de clases de usuario
-- [`4D`](../commands/4d.md) para el almacén de clases integrado
-
-### `cs`
-
-**cs** : Object
-
-
-
-| Parámetros | Tipo | | Descripción | |
-| ---------- | ------ | --------------------------- | ------------------------------------------------- | ---------------- |
-| classStore | Object | ← | Class store usuario para el proyecto o componente | |
-
-El comando `cs` devuelve el almacén de clases de usuario para el proyecto o componente actual. Devuelve todas las clases de usuario [definidas](#class-definition) en el proyecto o componente abierto. Por defecto, sólo las [clases ORDA](ORDA/ordaClasses.md) están disponibles.
-
-#### Ejemplo
-
-Quiere crear una nueva instancia de un objeto de `myClass`:
-
-```4d
-$instance:=cs.myClass.new()
-```
-
-### `4D`
-
-**4D** : Object
-
-
-
-| Parámetros | Tipo | | Descripción | |
-| ---------- | ------ | --------------------------- | -------------- | ---------------- |
-| classStore | Object | ← | Class store 4D | |
-
-El comando `4D` devuelve el almacén de clases para las clases 4D integradas. Ofrece acceso a las APIs específicas como [CryptoKey](API/CryptoKeyClass.md).
-
-#### Ejemplos
-
-Quiere crear una nueva llave en la clase `CryptoKey`:
-
-```4d
-$key:=4D.CryptoKey.new(New object("type";"ECDSA";"curve";"prime256v1"))
-```
-
-Quiere listar las clases integradas en 4D:
-
-```4d
- var $keys : collection
- $keys:=OB Keys(4D)
- ALERT("There are "+String($keys.length)+" built-in classes.")
-```
-
-## El objeto clase
-
-Cuando una clase es [definida](#class-definition) en el proyecto, se carga en el entorno del lenguaje 4D. Una clase es un objeto de la [clase "Class"](API/ClassClass.md). Un objeto clase tiene las siguientes propiedades y funciones:
-
-- cadena [`name`](API/ClassClass.md#name)
-- objeto [`superclass`](API/ClassClass.md#superclass) (null si no hay)
-- función [`new()`](API/ClassClass.md#new), que permite instanciar objetos de clase
-- propiedad [`isShared`](API/ClassClass.md#isshared), true si la clase es [compartida](#clases-compartidas)
-- propiedad [`isSingleton`](API/ClassClass.md#issingleton), verdadero si la clase define una [clase singleton](#singleton-classes).
-- propiedad [`isSectionSingleton`](API/ClassClass.md#issectionsingleton), true si la clase define un [sesión singleton](#singleton-classes).
-- Propiedad [`me`](API/ClassClass.md#me), que permite instanciar y acceder a [singletons](#singleton-classes).
-
-Además, un objeto clase puede hacer referencia a un objeto [`constructor`](#class-constructor) (opcional).
-
-Un objeto de clase en sí mismo es un [objeto compartido](shared.md) y, por tanto, se puede acceder a él desde diferentes procesos de 4D simultáneamente.
-
-### Herencia
-
-Si una clase hereda de otra clase (es decir, se utiliza la palabra clave [Class extends](classes.md#class-extends-classname) en su definición), la clase padre es su [`superclass`](API/ClassClass.md#superclass).
-
-Cuando 4D no encuentra una función o una propiedad en una clase, la busca en su [`superclass`](API/ClassClass.md#superclass); si no la encuentra, 4D sigue buscando en la superclase de la superclase, y así sucesivamente hasta que no haya más superclase (todos los objetos heredan de la superclase "Object").
-
-## Palabras clave de clase
-
-En las definiciones de clase se pueden utilizar palabras claves específicas de 4D:
-
-- `Function ` para definir las funciones de clase de los objetos.
-- `Class constructor` para inicializar nuevos objetos de la clase.
-- `property` para definir propiedades estáticas de los objetos con un tipo.
-- `Function get ` y `Function set ` para definir las propiedades calculadas de los objetos.
-- `Class extends ` para definir la herencia.
-- `This` y `Super` son comandos que tienen funcionalidades especiales dentro de clases.
-
-### `Function`
-
-#### Sintaxis
-
-```4d
-{shared} Function ({$parameterName : type; ...}){->$parameterName : type}
-// code
-```
-
-:::note
-
-No hay palabra clave final para el código de una función. El lenguaje 4D detecta automáticamente el final del código de una función por la siguiente palabra clave `Function` o el final del archivo de clase.
-
-:::
-
-Las funciones de clase son propiedades específicas de la clase. Son objetos de la clase [4D.Function](API/FunctionClass.md). En el archivo de definición de clase, las declaraciones de función utilizan la palabra clave `Function` seguida del nombre de la función.
-
-Si las funciones se declaran en una [clase compartida](#shared-class-constructor), puede utilizar la palabra clave `shared` con ellas para que puedan ser llamadas sin la estructura [`Use...End use`](shared.md#useend-use). Para obtener más información, consulte el párrafo [Funciones compartidas](#shared-functions) a continuación.
-
-El nombre de la función debe ser compatible con las [reglas de nomenclatura de objetos](Concepts/identifiers.md#object-properties).
-
-:::note
-
-Dado que las propiedades y las funciones comparten el mismo espacio de nombres, no está permitido utilizar el mismo nombre para una propiedad y una función de la misma clase (en este caso se produce un error).
-
-:::
-
-:::tip
-
-Comenzar el nombre de la función con un caracter guión bajo ("_") excluirá la función de las funcionalidades de autocompletado en el editor de código 4D. Por ejemplo, si declara `Function _myPrivateFunction` en `MyClass`, no se propondrá en el editor de código cuando digite en `"cs.MyClass. "`.
-
-:::
-
-Inmediatamente después del nombre de la función, los [parámetros](#parameters) de la función se pueden declarar con un nombre y un tipo de datos asignados, incluido el parámetro de retorno (opcional). Por ejemplo:
-
-```4d
-Function computeArea($width : Integer; $height : Integer)->$area : Integer
-```
-
-En una función de clase, el comando `This` se utiliza como instancia del objeto. Por ejemplo:
-
-```4d
-Function setFullname($firstname : Text; $lastname : Text)
- This.firstName:=$firstname
- This.lastName:=$lastname
-
-Function getFullname()->$fullname : Text
- $fullname:=This.firstName+" "+Uppercase(This.lastName)
-```
-
-Para una función clase, el comando `Current method name` devuelve: `.`, por ejemplo "MyClass.myFunction".
-
-En el código de la aplicación, las funciones de clases se llaman como los métodos miembros de las instancias de objetos y pueden recibir [parámetros](#parameters) si los hay. Se soportan las siguientes sintaxis:
-
-- uso del operador `()`. Por ejemplo, `myObject.methodName("hello")`
-- utilización de un método miembro de la clase "4D.Function":
- - [`apply()`](API/FunctionClass.md#apply)
- - [`call()`](API/FunctionClass.md#call)
-
-:::warning Aviso de seguridad del hilo
-
-Si una función de clase no es hilo seguro y es llamada por un método con el atributo "Puede ejecutarse en proceso apropiativo":
-
-- el compilador no genera ningún error (lo que es diferente en comparación con los métodos regulares),
-- un error es lanzado por 4D sólo en tiempo de ejecución.
-
-:::
-
-#### Parámetros
-
-Los parámetros de las funciones se declaran utilizando el nombre del parámetro y su tipo, separados por dos puntos. El nombre del parámetro debe cumplir con las [reglas de nomenclatura de las propiedades](Concepts/identifiers.md#object-properties). Múltiples parámetros (y tipos) están separados por punto y coma (;).
-
-```4d
-Function add($x; $y : Variant; $z : Integer; $xy : Object)
-```
-
-:::note
-
-Si no se declaró el tipo, el parámetro se definirá como `Variant`.
-
-:::
-
-#### Valor devuelto
-
-Se declara el parámetro de retorno (opcional) añadiendo una flecha (`->`) y la definición del parámetro de retorno después de la lista de parámetros de entrada, o dos puntos (`:`) y el tipo de parámetro de retorno únicamente. Por ejemplo:
-
-```4d
-Function add($x : Variant; $y : Integer)->$result : Integer
- $result:=$x+$y
-```
-
-También puedes declarar el parámetro de retorno añadiendo sólo `: type` y utilizar la [`expresión return`](parameters.md#return-expression) (también terminará la ejecución de la función). Por ejemplo:
-
-```4d
-Function add($x : Variant; $y : Integer): Integer
- // algo de código
- return $x+$y
-```
-
-#### Ejemplo 1
-
-```4d
-property name : Text
-property height; width : Integer
-
-// Clase: Rectangle
-Class constructor($width : Integer; $height : Integer)
- This.name:="Rectangle"
- This.height:=$height
- This.width:=$width
-
-// Definición de función
-Function getArea()->$result : Integer
- $result:=(This.height)*(This.width)
-```
-
-```4d
-// En un método proyecto
-
-var $rect : cs.Rectangle
-var $area : Real
-
-$rect:=cs.Rectangle.new(50;100)
-$area:=$rect.getArea() //5000
-```
-
-#### Ejemplo 2
-
-Este ejemplo utiliza la [`expresión return`](parameters.md#return-expression):
-
-```4d
-Function getRectArea($width : Integer; $height : Integer) : Integer
- If ($width > 0 && $height > 0)
- return $width * $height
- Else
- return 0
- End if
-```
-
-### `Class constructor`
-
-#### Sintaxis
-
-```4d
-// Class: MyClass
-{shared} {{session} singleton} Class constructor({$parameterName : type; ...})
-// código
-```
-
-:::note
-
-No hay palabra clave final para el código de función class constructor. El lenguaje 4D detecta automáticamente el final del código de una función por la siguiente palabra clave `Function` o el final del archivo de clase.
-
-:::
-
-Una función constructora de clase acepta [parámetros](#parameters) opcionales y puede ser utilizada para crear e inicializar objetos de la clase del usuario.
-
-Cuando llama a la función [`new()`](API/ClassClass.md#new), el constructor de clase es llamado con los parámetros opcionalmente pasados a la función `new()`.
-
-Sólo puede haber una función constructora en una clase (de lo contrario se devuelve un error). El comando [`Super`](../commands/super.md) permite realizar llamadas a [`superclass`](../API/ClassClass#superclass), es decir, a la clase padre de la función.
-
-Puede crear y escribir propiedades de instancia dentro del constructor (ver ejemplo). Alternativamente, si los valores de las propiedades de instancia no dependen de los parámetros pasados al constructor, puede definirlos utilizando la palabra clave [`property`](#property).
-
-Utilizando la palabra clave `shared` se crea una **clase compartida**, utilizada para instanciar únicamente objetos compartidos. Para obtener más información, consulte el párrafo [Clases compartidas](#shared-classes).
-
-Utilizando la palabra clave `singleton` se crea un **singleton**, utilizado para crear una sola instancia de la sesión. Un `session singleton` crea una sola instancia por sesión. Para obtener más información, consulte el párrafo [Clases singleton](#singleton-classes).
-
-#### Ejemplo
-
-```4d
-// Class: MyClass
-// Class constructor of MyClass
-Class constructor ($name : Text ; $age : Integer)
- This.name:=$name
- This.age:=$age
-```
-
-```4d
-// En un método proyecto
-// Se puede instanciar un objeto
-var $o : cs.MyClass
-$o:=cs.MyClass.new("John";42)
-// $o = {"name":"John";"age":42}
-```
-
-### `propiedad`
-
-#### Sintaxis
-
-`property {; ;...}{ : }`
-
-La palabra clave`property` se puede utilizar para declarar una propiedad dentro de una clase usuario. Una propiedad de clase tiene un nombre y un tipo.
-
-La declaración de propiedades de clase mejora las sugerencias del editor de código, las funciones de tecleo predictivo y la detección de errores.
-
-Las propiedades se declaran para nuevos objetos cuando llama a [`new()`](API/ClassClass.md#new), sin embargo, no se añaden automáticamente a los objetos (sólo se añaden cuando se les asigna un valor).
-
-:::note
-
-Una propiedad se añade automáticamente al objeto cuando se [inicializa en la línea de declaración](#initializing-the-property-in-the-declaration-line).
-
-:::
-
-Los nombres de las propiedades deben cumplir [las normas de denominación de propiedades](Concepts/identifiers.md#object-properties).
-
-:::note
-
-Dado que las propiedades y las funciones comparten el mismo espacio de nombres, no está permitido utilizar el mismo nombre para una propiedad y una función de la misma clase (en este caso se produce un error).
-
-:::
-
-El tipo de propiedad puede ser uno de los siguientes tipos soportados:
-
-| propertyType | Contenido |
-| ---------------------------- | --------------------------------------------------------------------------- |
-| `Text` | Valor texto |
-| `Date` | Valor fecha |
-| `Time` | Valor Hora |
-| `Boolean` | Valor booleano |
-| `Integer` | Valor entero largo |
-| `Real` | Valor real |
-| `Pointer` | Valor puntero |
-| `Picture` | Valor imagen |
-| `Blob` | Valeor Blob escalar |
-| `Collection` | Valor colección |
-| `Variant` | Valor variant |
-| `Object` | Objeto con clase por defecto (4D.object) |
-| `4D.` | Objeto del nombre de la clase 4D |
-| `cs.` | Objeto del nombre de la clase usuario |
-| `cs..` | Objeto del componente `` nombre de la clase |
-
-Si omite el tipo en la línea de declaración, la propiedad se crea como una variante.
-
-:::info
-
-La palabra clave `property` sólo puede utilizarse en métodos clase y fuera de cualquier bloque `Function` o `Class constructor`.
-
-:::
-
-#### Inicialización de la propiedad en la línea de declaración
-
-Al declarar una propiedad, tiene la flexibilidad de especificar su tipo de datos y proporcionar su valor en una sola declaración. La sintaxis soportada es:
-
-`property { : } := `
-
-:::note
-
-Cuando se utiliza esta sintaxis, no se pueden declarar varias propiedades en la línea de declaración.
-
-:::
-
-Puede omitir el tipo en la línea de declaración, en cuyo caso el tipo se deducirá cuando sea posible. Por ejemplo:
-
-```4d
-// Class: MyClass
-
-property name : Text := "Smith"
-property age : Integer := 42
-
-property birthDate := !1988-09-29! //se deduce la fecha
-property fuzzy //variant
-```
-
-Cuando inicializa una propiedad en su línea de declaración, se agrega al objeto de la clase después de su instanciación con la función [`new()`](API/ClassClass.md#new) pero antes de llamar al constructor.
-
-Si una clase [extiende a](#class-extends-classname) otra, las propiedades de la clase padre se instancian antes que las propiedades de la clase hija.
-
-:::note
-
-Si inicializa una propiedad en su línea de declaración con un objeto o una colección en una [clase compartida](#clases-compartidas), el valor se transforma automáticamente en un valor compartido:
-
-```4d
-// en una clase compartida
-property myCollection := ["something"]
-// myCollection será una colección compartida
-// equivalente a:
-myCollection := New shared collection("something")
-```
-
-:::
-
-#### Ejemplo
-
-```4d
-// Clase: MyClass
-
-property name : Text
-property age : Integer
-property color : Text := "Blue"
-```
-
-En un método:
-
-```4d
-var $o : cs.MyClass
-$o:=cs.MyClass.new() //$o:{"color" : "Blue"}
-$o.name:="Juan" //$o:{"color" : "Azul"; "name" : "John"}
-$o.age:="Smith" //error con la sintaxis de verificación
-```
-
-### `Function get` y `Function set`
-
-#### Sintaxis
-
-```4d
-{shared} Function get ()->$result : type
-// código
-```
-
-```4d
-{shared} Function set ($parameterName : type)
-// código
-```
-
-`Function get` y `Function set` son accesos que definen las **propiedades calculadas** en la clase. Una propiedad calculada es una propiedad nombradas con un tipo de datos que enmascara un cálculo. Cuando se accede a un valor de propiedad calculado, 4D sustituye el código del accesor correspondiente:
-
-- cuando se lee la propiedad, `Function get` se ejecuta,
-- cuando se escribe la propiedad, `Function get` se ejecuta.
-
-Si no se accede a la propiedad, el código nunca se ejecuta.
-
-Las propiedades calculadas están diseñadas para manejar datos que no necesitan ser guardados en memoria. Generalmente se basan en propiedades persistentes. Por ejemplo, si un objeto de clase contiene como propiedad persistente el *precio bruto* y el *tipo de IVA*, El *precio neto* podría ser manejado por una propiedad calculada.
-
-En el archivo de definición de la clase, las declaraciones de propiedades calculadas utilizan las palabras claves `Function get` (*getter*) y `Function set` (*setter*) seguido por el nombre de la propiedad. El nombre debe cumplir con las [reglas de nomenclatura de las propiedades](Concepts/identifiers.md#object-properties).
-
-`Función get` devuelve un valor del tipo de la propiedad y `Function set` toma un parámetro del tipo de la propiedad. Ambos argumentos deben cumplir con los [parámetros de función](#parameters) estándar.
-
-Cuando ambas funciones están definidas, la propiedad calculada es **read-write**. Si solo se define una `Function get`, la propiedad calculada es **de solo lectura**. En este caso, se devuelve un error si el código intenta modificar la propiedad. En este caso, se devuelve un error si el código intenta modificar la propiedad.
-
-Si las funciones se declaran en una [clase compartida](#shared-classes), puede utilizar la palabra clave `shared` con ellas para que puedan ser llamadas sin la estructura [`Use...End use`](shared.md#useend-use). Para obtener más información, consulte el párrafo [Funciones compartidas](#shared-functions) a continuación.
-
-El tipo de la propiedad calculada es definido por la declaración de tipo `$return` del \*getter \*. Puede ser de cualquier [tipo de propiedad válido](dt_object.md).
-
-> Asignar *undefined* a una propiedad de objeto limpia su valor mientras se preserva su tipo. Para ello, la `Function get` es llamada primero para recuperar el tipo de valor, luego `Function set` es llamado con un valor vacío de ese tipo.
-
-#### Ejemplo 1
-
-```4d
-//Clase: Person.4dm
-property firstName; lastName : Text
-
-Class constructor($firstname : Text; $lastname : Text)
- This.firstName:=$firstname
- This.lastName:=$lastname
-
-Function get fullName() -> $fullName : Text
- $fullName:=This.firstName+" "+This.lastName
-
-Function set fullName( $fullName : Text )
- $p:=Position(" "; $fullName)
- This.firstName:=Substring($fullName; 1; $p-1)
- This.lastName:=Substring($fullName; $p+1)
-```
-
-```4d
-//en un método proyecto
-$fullName:=$person.fullName // Function get fullName() is called
-$person.fullName:="John Smith" // Function set fullName() is called
-```
-
-#### Ejemplo 2
-
-```4d
-Function get fullAddress()->$result : Object
-
- $result:=New object
-
- $result.fullName:=This.fullName
- $result.address:=This.address
- $result.zipCode:=This.zipCode
- $result.city:=This.city
- $result.state:=This.state
- $result.country:=This.country
-```
-
-### `Class extends `
-
-#### Sintaxis
-
-```4d
-// Class hijo
-Class extends
-```
-
-La palabra clave `Class extends` se utiliza en la declaración de clase para crear una clase usuario que es hijo de otra clase usuario. La clase hijo hereda todas las funciones de la clase padre.
-
-La extensión de clase debe respetar las siguientes reglas:
-
-- Una clase de usuario no puede extender una clase integrada (excepto las 4D.Object y [clases ORDA](../ORDA/ordaClasses.md) que se extienden por defecto para las clases de usuario).
-- Una clase usuario no puede extender una clase usuario de otro proyecto o componente.
-- Una clase usuario no puede extenderse a sí misma.
-- No es posible extender las clases de una manera circular (es decir, "a" extiende "b" que extiende "a").
-- No es posible definir una [clase usuario compartida](#shared-classes) extendida a partir de una clase usuario no compartida.
-
-La ruptura de tal regla no es detectada por el editor de código o el intérprete, solo el compilador y `comprobar sintaxis` arrojará un error en este caso.
-
-Una clase extendida puede llamar al constructor de su clase padre utilizando el comando [`Super`](#super).
-
-#### Ejemplo
-
-Este ejemplo crea una clase llamada `Square` de una clase llamada `Polygon`.
-
-```4d
-//Clase: Square
-
-//ruta: Classes/Square.4dm
-
-Class extends Polygon
-
-Class constructor ($side : Integer)
-
-Llama al constructor de la clase padre con las longitudes
- // suministradas para el ancho y alto del polígono
- Super($side;$side)
- // En las clases derivadas, Super debe ser llamado antes de
- // utilizar 'This'
- This.name:="Square"
-
-
-
- Function getArea() -> $area : Integer
- $area:=This.height*This.width
-```
-
-## Comandos de función clase
-
-Los siguientes comandos tienen características específicas cuando se utilizan dentro de las funciones clase:
-
-### `Super`
-
-El comando [`Super`](../commands/super.md) permite realizar llamadas a [`superclass`](../API/ClassClass#superclass), es decir, a la clase padre de la función. Sólo puede haber una función constructora en una clase (de lo contrario se devuelve un error).
-
-Para más detalles, vea la descripción del comando [`Super`](../commands/super.md).
-
-### `This`
-
-El comando [`This`](../commands/this.md) devuelve una referencia al objeto procesado actualmente. En la mayoría de los casos, el valor de `This` está determinado por cómo se llama una función clase. Normalmente, `This` se refiere al objeto al que la función fue llamada, como si la función estuviera sobre el objeto.
-
-Ejemplo:
-
-```4d
-//Clase: ob
-
-Function f() : Integer
- return This.a+This.b
-```
-
-A continuación, puede escribir en un método:
-
-```4d
-$o:=cs.ob.new()
-$o.a:=5
-$o.b:=3
-$val:=$o.f() //8
-```
-
-Para más detalles, vea la descripción del comando [`This`](../commands/this.md).
-
-## Comandos de clases
-
-Varios comandos del lenguaje 4D permiten manejar las funcionalidades de las clases.
-
-### `OB Class`
-
-#### `OB Class ( object ) -> Object | Null`
-
-`OB Class` devuelve la clase del objeto pasado como parámetro.
-
-### `OB Instance of`
-
-#### `OB Instance of ( object ; class ) -> Boolean`
-
-`OB Instance of` devuelve `true` si `object` pertenece a la `class` o a una de las clases heredadas y `false` de lo contrario.
-
-## Clases compartidas
-
-Puede crear **clases compartidas**. Una clase compartida es una clase usuario que instancia un [objeto compartido](shared.md) cuando se llama a la función [`new()`](../API/ClassClass.md#new) en la clase. Una clase compartida sólo puede crear objetos compartidos.
-
-Las clases compartidas también admiten **funciones compartidas** que pueden llamarse sin estructuras [`Use...End use`](shared.md#useend-use).
-
-La propiedad [`.isShared`](../API/ClassClass.md#isshared) de los objetos de la Clase permite saber si la clase está compartida.
-
-:::info
-
-- Una clase [que hereda](#class-extends-classname) de una clase no compartida no puede definirse como compartida.
-- Las clases compartidas no están soportadas por las [clases basadas en ORDA](../ORDA/ordaClasses.md).
-
-:::
-
-### Creación de una clase compartida
-
-Para crear una clase compartida, añada la palabra clave `shared` antes del [Class constructor](#class-constructor). Por ejemplo:
-
-```4d
- //shared class: Person
-shared Class constructor($firstname : Text; $lastname : Text)
- This.firstName:=$firstname
- This.lastName:=$lastname
-
-```
-
-```4d
-//myMethod
-var $person := cs.Person.new("John"; "Smith")
-OB Is shared($person) // true
-cs.Person.isShared //true
-```
-
-### Funciones compartidas
-
-Si una función definida al interior de una clase compartida modifica objetos de la clase, debería llamar a la estructura [`Use...End use`](shared.md#useend-use) para proteger el acceso a los objetos compartidos. Sin embargo, para simplificar el código, puede definir la función como **compartida**, de modo que active automáticamente un `Use...End use` interno cuando se ejecute.
-
-Para crear una función compartida, añada la palabra clave `shared` antes de la palabra clave [Function](#function) en una clase compartida. Por ejemplo:
-
-```4d
-//clase compartida Foo
-shared Class constructor()
- This.variable:=1
-
-shared Function Bar($value : Integer)
- This.variable:=$value //no es necesario llamar use/end use
-```
-
-:::note
-
-Si se utiliza la palabra clave `shared` en una clase usuario no compartida, se ignora.
-
-:::
-
-## Clases Singleton
-
-Una **clase singleton** es una clase usuario que sólo produce una única instancia. Para más información sobre el concepto de singletons, por favor consulte la [página Wikipedia sobre los singletons](https://en.wikipedia.org/wiki/Singleton_pattern).
-
-### Tipos de Singletons
-
-4D soporta tres tipos de singletons:
-
-- un **singleton proceso** tiene una instancia única para el proceso en el que se instancia,
-- un **singleton compartido** tiene una instancia única para todos los procesos en la máquina.
-- un **singleton de sesión** es un singleton compartido pero con una instancia única para todos los procesos en la [sesión](../API/SessionClass.md). Los singletons de sesión son compartidos dentro de una sesión completa, pero varían entre sesiones. En el contexto de un cliente-servidor o una aplicación web, los singletons de sesión hacen posible crear y utilizar una instancia diferente para cada sesión, y por lo tanto para cada usuario.
-
-Los singletons son útiles para definir los valores que necesitan estar disponibles desde cualquier parte de una aplicación, una sesión o un proceso.
-
-:::info
-
-Las clases Singleton no están soportadas por las [clases ORDA](../ORDA/ordaClasses.md).
-
-:::
-
-La siguiente tabla indica el alcance de una instancia singleton dependiendo de donde se creó:
-
-| Singleton creado en | Alcance del proceso singleton | Alcance del singleton compartido | Alcance del singleton de sesión |
-| ------------------- | --------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------ |
-| **4D monopuesto** | Proceso | Aplicación | Aplicación o sesión Web/REST |
-| **4D Server** | Proceso | Máquina 4D Server | Sesión cliente/servidor o sesión Web/REST o sesión de procedimiento almacenado |
-| **Modo remoto 4D** | Proceso (*nota*: los singletons no están sincronizados en el proceso gemelo) | Máquina remota 4D | Máquina remota 4D o sesión Web/REST |
-
-Una vez instanciado, existe una clase singleton (y su singleton) siempre que exista una referencia a ella en algún lugar de la aplicación que se ejecuta en la máquina.
-
-### Crear y utilizar singletons
-
-Se declaran clases singleton añadiendo la(s) palabra(s) clave(s) apropiada(s) antes del [`Class constructor`](#class-constructor):
-
-- Para declarar una clase singleton (proceso), escriba `singleton Class constructor()`.
-- Para declarar una clase singleton compartida, escribe `shared singleton Class constructor()`.
-- Para declarar una clase singleton de sesión, escriba `session singleton Class constructor()`.
-
-:::note
-
-- Los singletons de sesión son automáticamente singletons compartidos (no hay necesidad de usar la palabra clave `shared` en el constructor de clases).
-- Las funciones compartidas Singleton soportan [palabra clave `onHTTPGet`](../ORDA/ordaClasses.md#onhttpget-keyword).
-
-:::
-
-La clase singleton está instanciada en la primera llamada de la propiedad [`cs..me`](../API/ClassClass.md#me). El singleton instanciado de la clase se devuelve siempre cuando se utiliza la propiedad [`me`](../API/ClassClass.md#me).
-
-Si necesita instanciar un singleton con parámetros, también puede llamar la función [`new()`](../API/ClassClass.md#new). En este caso, se recomienda instanciar el singleton en algún código ejecutado al inicio de la aplicación.
-
-La propiedad [`isSingleton`](../API/ClassClass.md#issingleton) de los objetos Clase permite saber si la clase es un singleton.
-
-La propiedad [`.isSessionSingleton`](../API/ClassClass.md#issessionsingleton) de los objetos Class permite saber si la clase es un singleton de sesión.
-
-### Ejemplos
-
-#### Singleton Proceso
-
-```4d
- //class: ProcessTag
-singleton Class constructor()
- This.tag:=Random
-```
-
-Para utilizar el singleton:
-
-```4d
- //en otro proceso
-var $mySingleton := cs.ProcessTag.me //Primera instanciación
- //$mySingleton.tag = 5425 por ejemplo
-...
-var $myOtherSingleton := cs.ProcessTag.me
- //$myOtherSingleton.tag = 5425
-
-```
-
-```4d
- //en otro proceso
-var $mySingleton := cs.ProcessTag.me //Primera instanciación
- //$mySingleton.tag = 14856 por ejemplo
-...
-var $myOtherSingleton := cs.ProcessTag.me
- //$myOtherSingleton.tag = 14856
-```
-
-#### Singleton compartido
-
-```4d
-//Class VehicleFactory
-
-property vehicleBuilt : Integer
-
-shared singleton Class constructor()
- This.vehicleBuilt := 0 //Número de vehículos construidos por la fábrica
-
-shared Function buildVehicle ($type : Text) -> $vehicle : cs.Vehicle
-
- Case of
- : $type="car"
- $vehicle:=cs.Car.new()
- : $type="truck"
- $vehicle:=cs.Truck.new()
- : $type="sport car"
- $vehicle:=cs.SportCar.new()
- : $type="motorbike"
- $vehicle:=cs.Motorbike.new()
- Else
- $vehicle:=cs.Car.new()
- End case
- This.vehicleBuilt+=1
-```
-
-Luego puede llamar al singleton **cs.VehicleFactory** para obtener un nuevo vehículo desde cualquier lugar de la aplicación en su máquina con una sola línea:
-
-```4d
-$vehicle:=cs.VehicleFactory.me.buildVehicle("truck")
-```
-
-Dado que la función *buildVehicle()* modifica el singleton **cs.VehicleFactory** (incrementando `This.vehicleBuilt`), debe agregar la palabra clave `shared`.
-
-#### Singleton de sesión
-
-En una aplicación de inventario, desea implementar un inventario de artículos utilizando singletons de sesión.
-
-```4d
-//class ItemInventory
-
-property itemList : Collection:=[]
-
-session singleton Class constructor()
-
-shared function addItem($item:object)
- This.itemList.push($item)
-```
-
-Al definir la clase ItemInventory como un singleton de sesión, asegúrese de que cada sesión y por lo tanto cada usuario tiene su propio inventario. Acceder al inventario del usuario es tan simple como:
-
-```4d
-//en una sesión usuario
-$myList := cs.ItemInventory.me.itemList
-//lista de elemento del usuario actual
-
-```
-
-#### Ver también
-
-[Singletons en 4D](https://blog.4d.com/singletons-in-4d) (post del blog) [Singletons de sesión](https://blog.4d.com/introducing-session-singletons) (post del blog).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/components.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/components.md
deleted file mode 100644
index b58f64c736ee2c..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/components.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: components
-title: Componentes
----
-
-Un componente 4D es un conjunto de código y de formularios 4D que representan una o varias funcionalidades que pueden instalarse y utilizarse en sus proyectos. Por ejemplo, el [componente 4D SVG](https://doc.4d.com/4Dv20/4D/20/4D-SVG-Component.100-6342795.en.html) añade comandos avanzados y un motor de renderizado integrado que puede utilizarse para visualizar archivos SVG.
-
-## Instalación de los componentes
-
-Varios componentes están [preinstalados en el entorno de desarrollo 4D](Extensions/overview.md), pero muchos componentes 4D de la comunidad 4D [están disponibles en GitHub](https://github.com/search?q=4d-component&type=Repositories). Adicionalmente, puede [desarrollar sus propios componentes 4D](Extensions/develop-components.md).
-
-La instalación y carga de componentes en sus proyectos 4D se manejan a través del [gestor de dependencias de 4D](../Project/components.md).
-
-## Utilización de los componentes
-
-El código expuesto de los componentes (métodos y funciones) así como los formularios pueden ser utilizados como elementos estándar en su desarrollo 4D.
-
-Cuando un componente instalado contiene métodos, clases y funciones, éstos aparecen en el tema **Métodos componente** de la página Métodos del Explorador:
-
-
-
-:::note
-
-Si el componente está compilado, su [espacio de nombres](../Extensions/develop-components.md#declaring-the-component-namespace) se escribe entre paréntesis después de su nombre. Utilice este espacio de nombres para acceder a las funciones del componente.
-
-:::
-
-Puede seleccionar un [método proyecto](methods.md) o [clase](classes.md) y hacer clic en el botón **Documentación** del Explorador para obtener información sobre el mismo, [si la hay](Project/documentation.md).
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/data-types.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/data-types.md
deleted file mode 100644
index 018287609df24d..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/data-types.md
+++ /dev/null
@@ -1,84 +0,0 @@
----
-id: data-types
-title: Tipos de datos
----
-
-En 4D, los datos se manejan según su tipo en dos lugares: los campos de la base y el lenguaje 4D.
-
-Aunque suelen ser equivalentes, algunos tipos de datos disponibles en la base no están disponibles directamente en el lenguaje y se convierten automáticamente. Por el contrario, algunos tipos de datos sólo pueden manejarse a través del lenguaje. La siguiente tabla lista todos los tipos de datos disponibles y cómo se soportan/declaran:
-
-| Tipos de datos | Soporte para la base (1) | Soporte para el lenguaje | [declaración `var`](variables.md) | [Declaración ARRAY\`](arrays.md) |
-| ------------------------------------------------------- | ------------------------------------------- | -------------------------- | --------------------------------- | -------------------------------- |
-| [Alfanumérico](dt_string.md) | Sí | Convertido en texto | - | - |
-| [Text](Concepts/dt_string.md) | Sí | Sí | `Text` | `ARRAY TEXT` |
-| [Fecha](Concepts/dt_date.md) | Sí | Sí | `Date` | `ARRAY DATE` |
-| [Hora](Concepts/dt_time.md) | Sí | Sí | `Time` | `ARRAY TIME` |
-| [Boolean](Concepts/dt_boolean.md) | Sí | Sí | `Boolean` | `ARRAY BOOLEAN` |
-| [Integer](Concepts/dt_number.md) | Sí | Convertido en entero largo | `Integer` | `ARRAY INTEGER` |
-| [Longint](Concepts/dt_number.md) | Sí | Sí | `Integer` | `ARRAY LONGINT` |
-| [Entero largo 64 bits](Concepts/dt_number.md) | Sí (SQL) | Convertido en real | - | - |
-| [Real](Concepts/dt_number.md) | Sí | Sí | `Real` | `ARRAY REAL` |
-| [Indefinido](Concepts/dt_null_undefined.md) | - | Sí | - | - |
-| [Null](Concepts/dt_null_undefined.md) | - | Sí | - | - |
-| [Pointer](Concepts/dt_pointer.md) | - | Sí | `Pointer` | `ARRAY POINTER` |
-| [Picture](Concepts/dt_picture.md) | Sí | Sí | `Picture` | `ARRAY PICTURE` |
-| [BLOB](Concepts/dt_blob.md) | Sí | Sí | `Blob`, `4D.Blob` | `ARRAY BLOB` |
-| [Object](Concepts/dt_object.md) | Sí | Sí | `Object` | `ARRAY OBJECT` |
-| [Collection](Concepts/dt_collection.md) | - | Sí | `Collection` | |
-| [Variant](Concepts/dt_variant.md)(2) | - | Sí | `Variant` | |
-
-(1) Tenga en cuenta que ORDA maneja los campos de la base a través de objetos (entidades) y por lo tanto, sólo soporta los tipos de datos disponibles para estos objetos. Para más información, consulte la descripción del tipo de datos [Objeto](Concepts/dt_object.md).
-
-(2) Variant no es en realidad un tipo *data* sino un tipo *variable* que puede contener un valor de cualquier otro tipo de datos.
-
-## Comandos
-
-Siempre puede conocer el tipo de un campo o variable usando los siguientes comandos:
-
-- [`Type`](../commands-legacy/type.md) para campos y variables escalares
-- [`Tipo de valor`](../commands-legacy/value-type.md) para expresiones
-
-## Valores por defecto
-
-Cuando las [variables](variables.md) o los [parámetros](parameters.md) se tipifican mediante una [declaración explícita](variables.md#declaring-variables), reciben un valor por defecto, que mantendrán durante la sesión mientras no hayan sido asignados.
-
-El valor por defecto depende del tipo de variable:
-
-| Tipo | Valor por defecto |
-| ---------- | ---------------------------------------- |
-| Booleano | False |
-| Fecha | 00-00-00 |
-| Integer | 0 |
-| Time | 00:00:00 |
-| Picture | picture size=0 |
-| Real | 0 |
-| Puntero | Nil=true |
-| Text | "" |
-| Blob | Tamaño Blob=0 |
-| Object | null |
-| Collection | null |
-| Variant | indefinido |
-
-### Null como valor por defecto
-
-Las variables de tipo Object, Collection, Pointer y Picture tienen **null** como valor por defecto, pero en realidad obtienen un estado intermedio cuando se declaran y no se asignan. Se *comportan como* los valores **null**, pero con algunas diferencias, generando menos errores cuando el código intenta acceder a ellos.
-
-## Convertir los tipos de datos
-
-El lenguaje 4D contiene operadores y comandos para convertir entre tipos de datos, cuando dichas conversiones tienen sentido. El lenguaje 4D aplica la verificación de tipos de datos. Por ejemplo, no se puede escribir: "abc"+0.5+!12/25/96!-?00:30:45?. Esto generará errores de sintaxis.
-
-La siguiente tabla lista los tipos de datos básicos, los tipos de datos a los que se pueden convertir y los comandos utilizados para hacerlo:
-
-| Tipos a convertir | en Cadena | en Número | en Fecha | en Hora | en Booleano |
-| ----------------------------- | --------- | --------- | -------- | ------- | ----------- |
-| String (1) | | `Num` | `Date` | `Time` | `Bool` |
-| Número (2) | `String` | | | | `Bool` |
-| Fecha | `String` | | | | `Bool` |
-| Time | `String` | | | | `Bool` |
-| Boolean | | `Num` | | | |
-
-(1) Las cadenas formateadas en JSON pueden convertirse en datos escalares, objetos o colecciones, utilizando el comando `JSON Parse`.
-
-(2) Los valores de tipo Hora pueden tratarse como números.
-
-**Nota**: además de las conversiones de datos listadas en esta tabla, se pueden obtener conversiones de datos más sofisticadas combinando operadores y otros comandos.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/error-handling.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/error-handling.md
deleted file mode 100644
index 81fb0cb164ed13..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/error-handling.md
+++ /dev/null
@@ -1,286 +0,0 @@
----
-id: error-handling
-title: Gestión de errores
----
-
-El manejo de errores es el proceso de anticipar y responder a los errores que puedan ocurrir en su aplicación. 4D soporta de forma completa la detección y notificación de errores en tiempo de ejecución, así como el análisis de sus condiciones.
-
-La gestión de errores responde a dos necesidades principales:
-
-- descubrir y corregir posibles errores y fallos en el código durante la fase de desarrollo,
-- detectar y recuperar errores inesperados en las aplicaciones desplegadas; en particular, puede sustituir los diálogos de error del sistema (disco lleno, archivo perdido, etc.) por su propia interfaz.
-
-Básicamente, hay dos maneras de manejar los errores en 4D. Puede:
-
-- [instalar un método de gestión de errores](#installing-an-error-handling-method), o
-- utilice una [palabra clave Try()`](#tryexpression) o una [estructura Try/Catch`](#trycatchend-try) antes de piezas de código que llaman a una función, método o expresión que pueden arrojar un error.
-
-:::tip Buenas prácticas
-
-Es muy recomendable instalar un método global de gestión de errores en 4D Server, para todo el código que se ejecute en el servidor. Cuando 4D Server no se ejecuta [headless](../Admin/cli.md) (es decir, se lanza con su [ventana de administración](../ServerWindow/overview.md)), este método evitaría que se mostraran cajas de diálogo inesperadas en la máquina servidor. En modo sin interfaz, los errores se registran en el archivo [4DDebugLog](../Debugging/debugLogFiles.md#4ddebuglogtxt-standard) para su posterior análisis.
-
-:::
-
-## Error o estado
-
-Muchas funciones de clase 4D, como `entity.save()` o `transporter.send()`, devuelven un objeto *status*. Este objeto se utiliza para almacenar errores "predecibles" en el contexto de ejecución, por ejemplo, una contraseña no válida, una entidad bloqueada, etc., que no detienen la ejecución del programa. Esta categoría de errores puede ser manejada por el código habitual.
-
-Otros errores "imprevisibles" son el error de escritura en el disco, el fallo de la red o, en general, cualquier interrupción inesperada. Esta categoría de errores genera excepciones y debe gestionarse mediante un método de gestión de errores o una palabra clave `Try()`.
-
-## Instalación de un método de gestión de errores
-
-En 4D, todos los errores pueden ser detectados y manejados por métodos proyecto específicos, llamados **métodos de gestión de errores** (o **métodos de intercepción de errores**).
-
-Una vez instalados, los manejadores de errores son llamados automáticamente en modo interpretado o compilado en caso de error en la aplicación 4D o en uno de sus componentes. Se puede llamar a un manejador de errores diferente en función del contexto de ejecución (ver abajo).
-
-Para *instalar* un método proyecto de gestión de errores, basta con llamar al comando [`ON ERR CALL`](../commands-legacy/on-err-call.md) con el nombre del método proyecto y (opcionalmente) el alcance como parámetros. Por ejemplo:
-
-```4d
-ON ERR CALL("IO_Errors";ek local) //Instala un método local de gestión de errores
-```
-
-Para dejar de interceptar los errores en un contexto de ejecución y devolver la mano, llame `ON ERR CALL` con una cadena vacía:
-
-```4d
-ON ERR CALL("";ek local) //devuelve el control al proceso local
-```
-
-El comando [`Method called on error`](../commands-legacy/method-called-on-error.md) le permite conocer el nombre del método instalado por `ON ERR CALL` para el proceso actual. Es particularmente útil en el contexto de código genérico porque permite cambiar temporalmente y luego restaurar el método de captura de error:
-
-```4d
- $methCurrent:=Method called on error(ek local)
- ON ERR CALL("NewMethod";ek local)
- //Si no se puede abrir el documento, se genera un error
- $ref:=Open document("MyDocument")
- //Reinstalación del método anterior
- ON ERR CALL($methCurrent;ek local)
-
-```
-
-### Alcance y componentes
-
-Se puede definir un método de gestión de errores para diferentes contextos de ejecución:
-
-- para el **proceso actual**- sólo se llamará a un gestor de errores local para los errores ocurridos en el proceso actual del proyecto actual,
-- para **toda la aplicación**- se llamará a un gestor de errores global para todos los errores que se produzcan en el contexto de ejecución de la aplicación del proyecto actual,
-- desde los **componentes**- este manejador de errores se define en un proyecto local y será llamado para todos los errores que ocurran en los componentes cuando no hayan sido ya interceptados por un manejador de componentes.
-
-Ejemplos:
-
-```4d
-ON ERR CALL("IO_Errors";ek local) //Instala un método de gestión de errores local
-ON ERR CALL("globalHandler";ek global) //Instala un método de gestión de errores global
-ON ERR CALL("componentHandler";ek errors from components) //Instala un método de gestión de errores para los componentes
-```
-
-Puede instalar un gestor de errores global que servirá como "fallback" y gestores de errores locales específicos para determinados procesos. Un gestor de errores global también es útil en el servidor para evitar diálogos de error en el servidor cuando se ejecuta con interfaz.
-
-Se puede definir un único método de captura de errores para toda la aplicación o diferentes métodos por módulo de aplicación. Sin embargo, sólo se puede instalar un método por contexto de ejecución y por proyecto.
-
-Cuando se produce un error, sólo se llama a un método, como se describe en el siguiente diagrama:
-
-
-
-### Manejo de errores e el método
-
-Dentro de un método de gestión de errores personalizado, tiene acceso a varios datos que le ayudarán a identificar el error:
-
-- las variables sistema dedicadas:
-
- - `Error` (entero largo): código de error
- - `Error method`(texto): nombre del método que ha provocado el error
- - `Error line` (entero largo): número de línea del método que ha provocado el error
- - `Error formula` (texto): fórmula del código 4D (texto bruto) que está en el origen del error.
-
-:::info
-
-4D mantiene automáticamente una serie de variables denominadas [**variables sistema**](variables.md#system-variables), que responden a diferentes necesidades.
-:::
-
-- el comando [`Last errors`](../commands-legacy/last-errors.md) que devuelve una colección de la pila actual de errores ocurridos en la aplicación 4D.
-- el comando `Call chain` que devuelve una colección de objetos que describen cada paso de la cadena de llamadas a métodos dentro del proceso actual.
-
-#### Ejemplo
-
-He aquí un sistema de gestión de errores sencillo:
-
-```4d
-//instalar el método de gestión de errores
- ON ERR CALL("errorMethod")
- //... ejecutar el código
- ON ERR CALL("") //giving control back to 4D
-```
-
-```4d
-// método proyecto errorMethod
- If (Error#1006) //este no es una interrupción del usuario
- ALERT("El error "+String(Error)+" ocurrido". El código en cuestión es: \""+Error formula+"\"")
- End if
-```
-
-### Utilizar un método de gestión de errores vacío
-
-Si desea principalmente que la caja de diálogo de error estándar esté oculta, puede instalar un método de gestión de errores vacío. La variable sistema `Error` puede ser probada en cualquier método, es decir, fuera del método de gestión de errores:
-
-```4d
-ON ERR CALL("emptyMethod") //emptyMethod existe pero está vacío
-$doc:=Open document( "myFile.txt")
-If (Error=-43)
- ALERT("Archivo no encontrado.")
-End if
-ON ERR CALL("")
-```
-
-## Try(expression)
-
-La sentencia `Try(expression)` permite probar una expresión de una sola línea en su contexto de ejecución real (incluyendo, en particular, los valores de las variables locales) e interceptar los errores que arroje para que no se muestre el diálogo de erro El uso de `Try(expression)` ofrece una manera fácil de manejar casos de error simples con un número muy bajo de líneas de código, y sin requerir un método de gestión de errores.
-
-:::note
-
-Si desea probar un código más complejo que una expresión de una sola línea, puede considerar la posibilidad de utilizar una estructura [`Try/Catch`](#trycatchend-try).
-
-:::
-
-La sintaxis formal de la declaración `Try(expresión)` es:
-
-```4d
-
-Try (expression) : any | Undefined
-
-```
-
-*expresion* puede ser toda expresión válida.
-
-Si se produce un error durante su ejecución, se intercepta y no se muestra ningún diálogo de error, si un [método de gestión de errores](#installing-an-error-handling-method) fue instalado o no antes de la llamada a `Try()`. Si *expression* devuelve un valor, `Try()` devuelve el último valor evaluado, en caso contrario devuelve `Define`.
-
-Puede manejar los errores utilizando el comando [`Last errors`](../commands-legacy/last-errors.md). Si *expression* arroja un error dentro de una pila de llamadas `Try()`, el flujo de ejecución se detiene y devuelve a la última ejecución `Try()` (la primera encontrada de nuevo en la pila de llamadas).
-
-:::note
-
-Si un [método de gestión de errores](#installing-an-error-handling-method) es instalado por *expression*, es llamado en caso de error.
-
-:::
-
-### Ejemplos
-
-1. Quiere mostrar el contenido de un archivo si el archivo se puede abrir sin errores y si su contenido se puede leer. Puede escribir:
-
-```4d
-var $text : Text
-var $file : 4D.File := File("/RESOURCES/myFile.txt")
-var $fileHandle : 4D.FileHandle := Try($file.open())
-If ($fileHandle # Null)
- $text:=Try($fileHandle.readText()) || "Error al leer el archivo"
-End if
-```
-
-2. Quiere manejar el error de dividir por cero. En este caso, se desea devolver 0 y lanzar un error:
-
-```4d
-function divide( $p1: real; $p2: real)-> $result: real
- if ($p2=0)
- $result:=0 //sólo por claridad (0 es el valor por defecto para reales)
- throw(-12345; "División por cero")
- else
- $result:=$p1/$p2
- end if
-
-function test()
- $result:=Try(divide($p1;$p2))
- If (Last errors # null)
- ALERT("Error")
- End if
-
-```
-
-3. Desea gestionar tanto los errores [previsibles como los no previsibles>](#error-or-status):
-
-```4d
-var $e:=ds.Employee.new()
-$e.name:="Smith"
-$status:=Try($e.save()) //Capturar errores predecibles y no predecibles
-If ($status.success)
- ALERT( "Success")
-Else
- ALERT( "Error: "+JSON Stringify($status.errors))
-End if
-
-```
-
-## Try...Catch...End try
-
-La estructura `Try...Catch...End try` permite probar el código de un bloque en su contexto de ejecución real (incluyendo, en particular, los valores de las variables locales) e interceptar los errores que lanza para que no se muestre el diálogo de error d
-
-A diferencia de la palabra clave `Try(expression)` que evalúa una expresión de una sola línea, la estructura `Try...Catch...End try` permite evaluar cualquier bloque de código, desde el más simple al más complejo, sin necesidad de un método de gestión de Además, el bloque `Catch` puede utilizarse para gestionar el error de forma personalizada.
-
-La sintaxis formal de la estructura `Try...Catch...End try` es:
-
-```4d
-
-Try
- statement(s) // Código a evaluar
-Catch
- statement(s) // Código a ejecutar en caso de error
-End try
-
-```
-
-El código entre las palabras clave `Try` y `Catch` se ejecuta en primer lugar, luego el flujo depende del error o errores encontrados durante esta ejecución.
-
-- Si no se lanza ningún error, la ejecución del código continúa después de la palabra clave correspondiente `End try`. El código situado entre las palabras clave `Catch` y `End try` no se ejecuta.
-- Si la ejecución del bloque de código arroja un error no diferido \*\*, el flujo de ejecución se detiene y ejecuta el bloque de código correspondiente `Catch`.
-- If the code block calls a method that throws a *deferred error*, the execution flow jumps directly to the corresponding `Catch` code block.
-- Si un error diferido es lanzado directamente desde el bloque `Try`, el flujo de ejecución continúa hasta el final del bloque `Try` y no ejecuta el correspondiente bloque `Catch`.
-
-:::note
-
-Si se lanza un error *diferido* fuera del bloque `Try`, la ejecución del código continúa hasta el final del método o función.
-
-:::
-
-:::info
-
-Para más información sobre errores *diferidos* y *no diferidos*, por favor consulte la descripción del comando [`throw`](../commands-legacy/throw.md).
-
-:::
-
-En el bloque de código `Catch`, puede gestionar los errores utilizando los comandos estándar de gestión de errores. La función [`Last errors`](../commands-legacy/last-errors.md) contiene la colección de los últimos errores. En este bloque de código puede declarar [un método de gestión de errores](#installing-an-error-handling-method), en cuyo caso se llama en caso de error (de lo contrario se muestra el diálogo de error de 4D).
-
-:::note
-
-Si se instala un [método de gestión de errores](#installing-an-error-handling-method) en el código colocado entre las palabras clave `Try` y `Catch`, se llama en caso de error.
-
-:::
-
-### Ejemplo
-
-La combinación de transacciones y estructuras `Try...Catch...End try` permite escribir código seguro para funciones críticas.
-
-```4d
-Function createInvoice($customer : cs.customerEntity; $items : Collection; $invoiceRef : Text) : cs.invoiceEntity
- var $newInvoice : cs.invoiceEntity
- var $newInvoiceLine : cs.invoiceLineEntity
- var $item : Object
- ds.startTransaction()
- Try
- $newInvoice:=This.new()
- $newInvoice.customer:=$customer
- $newInvoice.invoiceRef:=$invoiceRef
- For each ($item; $items)
- $newInvoiceLine:=ds.invoiceLine.new()
- $newInvoiceLine.item:=$item.item
- $newInvoiceLine.amount:=$item.amount
- $newInvoiceLine.invoice:=$newInvoice
- //llamar a otras funciones específicas para validar la línea de factura
- $newInvoiceLine.save()
- End for each
- $newInvoice.save()
- ds.validateTransaction()
- Catch
- ds.cancelTransaction()
- ds.logErrors(Last errors)
- $newInvoice:=Null
- End try
- return $newInvoice
-
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/parameters.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/parameters.md
deleted file mode 100644
index 18efef78e18d35..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/parameters.md
+++ /dev/null
@@ -1,525 +0,0 @@
----
-id: parameters
-title: Parámetros
----
-
-A menudo encontrará que necesita pasar datos a sus métodos y funciones. Esto se hace fácilmente con parámetros.
-
-## Generalidades
-
-**Los parámetros** (o **argumentos**) son piezas de datos que un método o una función de clase necesita para realizar su tarea. Los términos *parámetros* y *argumentos* se utilizan indistintamente en este manual. Los parámetros también se pasan a los comandos integrados de 4D. En este ejemplo, la cadena "Hello" es un argumento para el comando integrado `ALERT`:
-
-```4d
-ALERT("Hello")
-```
-
-Los parámetros se pasan de la misma manera a los métodos o las funciones de clase. Por ejemplo, si una función de clase llamada `getArea()` acepta dos parámetros, una llamada a la función de clase podría verse así:
-
-```4d
-$area:=$o.getArea(50;100)
-```
-
-O, si un método proyecto llamado `DO_SOMETHING` acepta tres parámetros, una llamada al método podría verse así:
-
-```4d
-DO_SOMETHING($WithThis;$AndThat;$ThisWay)
-```
-
-Los parámetros de entrada están separados por punto y coma (;).
-
-Los mismos principios se aplican cuando los métodos se ejecutan a través de comandos dedicados, por ejemplo:
-
-```4d
-EXECUTE METHOD IN SUBFORM("Cal2";"SetCalendarDate";*;!05/05/20!)
-//pasar la fecha !05/05/20! como parámetro a SetCalendarDate
-//en el contexto de un subformulario
-```
-
-Los datos también pueden ser **devueltos** desde métodos y funciones de clase. Por ejemplo, la siguiente línea de instrucción utiliza el comando integrado, `Length`, para devolver la longitud de una cadena. La instrucción pone el valor devuelto por `Length` en una variable llamada *MyLength*. Esta es la instrucción:
-
-```4d
-MyLength:=Length("How did I get here?")
-```
-
-Toda subrutina puede devolver un valor. Sólo se puede declarar un único parámetro de salida por método o función de clase.
-
-Los valores de entrada y salida son [evaluados](#values-or-references) en el momento de la llamada y copiados en o desde variables locales dentro de la función o método de la clase llamada. Los parámetros variables deben ser [declarados](#declaring-parameters) en el código llamado.
-
-:::info Compatibilidad
-
-La sintaxis de declaración heredada, donde los parámetros se copian automáticamente en variables locales numeradas secuencialmente $0, $1, etc. y declarado usando directivas de compilador como `C_TEXT($1;$2)`, es **obsoleto** a partir de 4D 20 R7.
-
-:::
-
-## Declaración de parámetros
-
-En los métodos llamados o en las funciones de clase, los valores de los parámetros se asignan a las variables locales. Generalmente se declararan los parámetros utilizando un **nombre de parámetro** con un **tipo de parámetro**, separados por dos puntos.
-
-- Para funciones de clase, los parámetros se declaran junto con el prototipo de función, por ejemplo, cuando se utilizan las palabras clave `Function` o `Class constructor`.
-- Para los métodos (métodos proyecto, métodos objeto formulario, métodos base y triggers), los parámetros se declaran utilizando la palabra clave `#DECLARE` al principio del código del método.
-
-Ejemplos:
-
-```4d
-Function getArea($width : Integer; $height : Integer) -> $area : Integer
-```
-
-```4d
- //myProjectMethod
-#DECLARE ($i : Integer) -> $myResult : Object
-```
-
-Se aplican las siguientes reglas:
-
-- La línea de declaración debe ser la primera línea del código del método o de la función, de lo contrario se mostrará un error (sólo los comentarios o los saltos de línea pueden preceder la declaración).
-- Los nombres de los parámetros deben comenzar con un carácter `$` y cumplir con [reglas de denominación de las propiedades](identifiers.md#object-properties).
-- Múltiples parámetros (y tipos) están separados por punto y coma (;).
-- Las sintaxis multilínea están soportadas (utilizando el carácter "\\").
-
-Por ejemplo, cuando se llama a una función `getArea()` con dos parámetros:
-
-```4d
-$area:=$o.getArea(50;100)
-```
-
-En el código de la función clase, el valor de cada parámetro se copia en el parámetro declarado correspondiente:
-
-```4d
-// Class: Polygon
-Function getArea($width : Integer; $height : Integer)-> $area : Integer
- $area:=$width*$height
-```
-
-> Si no se define el tipo, el parámetro se definirá como [`Variant`](dt_variant.md).
-
-Todos los tipos de métodos de 4D soportan la palabra clave `#DECLARE`, incluidos los métodos base. Por ejemplo, en el método base `On Web Authentication`, puede declarar parámetros temporales:
-
-```4d
-// Método base On Web Authentication
-#DECLARE ($url : Text; $header : Text; \
- $BrowserIP : Text; $ServerIP : Text; \
- $user : Text; $password : Text) \
- -> $RequestAccepted : Boolean
-$entitySelection:=ds.User.query("login=:1"; $user)
-// Verificar la contraseña hash...
-```
-
-### Valor devuelto
-
-El parámetro de retorno de una función se declara añadiendo una flecha (->) y la definición del parámetro después de la lista de parámetros de entrada. Por ejemplo:
-
-```4d
-Function add($x : Variant; $y : Integer) -> $result : Integer
-```
-
-También puede declarar el parámetro de retorno añadiendo sólo `: type`, en cuyo caso puede ser manejado por un [return](#return-expression). Por ejemplo:
-
-```4d
-Function add($x : Variant; $y : Integer): Integer
- return $x+$y
-```
-
-:::warning
-
-Los parámetros, que incluyen el valor devuelto, deben declararse una sola vez. En particular, no se puede declarar el mismo parámetro como entrada y salida, incluso con el mismo tipo. Por ejemplo:
-
-```qs
- //declaración inválida
-Función myTransform ($x : Integer) -> $x : Integer
- //error: $x se declara dos veces
-```
-
-:::
-
-### Tipos de datos soportados
-
-Con los parámetros con nombre, puede utilizar los mismos tipos de datos [soportados por la palabra clave `var`](variables.md), incluidos los objetos de las clases. Por ejemplo:
-
-```4d
-Function saveToFile($entity : cs.ShapesEntity; $file : 4D.File)
-```
-
-:::note
-
-Las expresiones de tablas o arrays sólo pueden pasarse [como referencia utilizando un puntero](dt_pointer.md#pointers-as-parameters-to-methods).
-
-:::
-
-### Inicialización
-
-Cuando se declaran los parámetros, se inicializan con el [**valor por defecto correspondiente a su tipo**](data-types.md#valores-por-defecto), que mantendrán durante la sesión mientras no hayan sido asignados.
-
-## `return {expression}`
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------- |
-| 19 R4 | Añadidos |
-
-
-
-La instrucción `return` finaliza la ejecución de una función o de un método y puede utilizarse para devolver una expresión a quien la llama.
-
-Por ejemplo, la siguiente función devuelve el cuadrado de su argumento, $x, donde $x es un número.
-
-```4d
-Function square($x : Integer) -> $result : Integer
- return $x * $x
-```
-
-:::note
-
-Internamente, `return x` ejecuta `myReturnValue:=x`, y regresa al llamante. Si `return` se utiliza sin una expresión, la función o el método devuelve un valor nulo del tipo de retorno declarado (si lo hay), de lo contrario *undefined*.
-
-:::
-
-La instrucción `return` puede utilizarse junto con la sintaxis estándar para los [valores devueltos](#valor-devuelto) (el valor devuelto debe ser del tipo declarado). Sin embargo, hay que tener en cuenta que termina inmediatamente la ejecución del código. Por ejemplo:
-
-```4d
-Function getValue -> $v : Integer
- $v:=10
- return 20
- // devuelve 20
-
-Function getValue -> $v : Integer
- return 10
- $v:=20 // nunca ejecutado
- // devuelve 10
-```
-
-## Indirección de parámetros (${N})
-
-Los métodos y funciones 4D aceptan un número variable de parámetros. Puede dirigirse a esos parámetros con un bucle `For...End for`, el comando [`Count parameters`](../commands-legacy/count-parameters.md) y la **sintaxis de indirección de parámetros**. Dentro del método, una dirección de indirección tiene el formato `${N}`, donde `N` es una expresión numérica.
-
-### Utilización de parámetros variables
-
-Por ejemplo, considere un método que suma valores y devuelve la suma formateada según un formato que se pasa como parámetro. Cada vez que se llama a este método, el número de valores a sumar puede variar. Debemos pasar los valores como parámetros al método y el formato en forma de cadena de caracteres. El número de valores puede variar de una llamada a otra.
-
-Aquí está el método, llamado `MySum`:
-
-```4d
- #DECLARE($format : Text) -> $result : Text
- $sum:=0
- For($i;2;Count parameters)
- $sum:=$sum+${$i}
- End for
- $result:=String($sum;$format)
-```
-
-Los parámetros del método deben pasarse en el orden correcto, primero el formato y luego un número variable de valores:
-
-```4d
- Result:=MySum("##0.00";125,2;33,5;24) //"182.70"
- Result:=MySum("000";1;2;200) //"203"
-```
-
-Tenga en cuenta que aunque haya declarado 0, 1 o más parámetros, siempre puede pasar el número de parámetros que desee. Los parámetros están todos disponibles dentro del código llamado a través de la sintaxis `${N}` y el tipo de parámetros extra es [Variant](dt_variant.md) por defecto (puede declararlos utilizando la [notación variadic](#declaring-variadic-parameters)). Solo necesita asegurarse de que los parámetros existan, gracias al comando [`Count parameters`](../commands-legacy/count-parameters.md). Por ejemplo:
-
-```4d
-//método foo
-#DECLARE($p1: Text;$p2 : Text; $p3 : Date)
-For($i;1;Count parameters)
- ALERT("param "+String($i)+" = "+String(${$i}))
-End for
-```
-
-Este método se puede llamar:
-
-```4d
-foo("hello";"world";!01/01/2021!;42;?12:00:00?) //se pasan parámetros adicionales
-```
-
-> La indirección de parámetros se gestiona mejor si se respeta la siguiente convención: si sólo algunos de los parámetros se dirigen por indirección, deben pasarse después de los demás.
-
-### Declaración de parámetros variables
-
-No es obligatorio declarar parámetros variables. Los parámetros variables no declarados obtienen automáticamente el tipo [Variant](dt_variant.md).
-
-Sin embargo, para evitar errores de correspondencia de tipos durante la ejecución del código, puede declarar un número variable de parámetros utilizando la notación "..." en los prototipos de sus funciones, constructores de clases y métodos (parámetros variables). Especifique el tipo del parámetro siguiendo la notación "..." con el tipo deseado.
-
-```4d
-#DECLARE ( ... : Text ) // Número indefinido de parámetros 'Text'
-
-```
-
-```4d
-Function myfunction ( ... : Text)
-
-```
-
-Cuando se declaran varios parámetros, debe emplearse la notación variable en la última posición, por ejemplo:
-
-```4d
-#DECLARE ( param: Real ; ... : Text )
-
-```
-
-```4d
-Function myfunction (var1: Integer ; ... : Text)
-```
-
-#### Ejemplo
-
-Aquí tenemos un método llamado `SumNumbers` que devuelve el total calculado para todos los números pasados como parámetros:
-
-```4d
-
-#DECLARE( ... : Real) : Real
-
-
-
-var $number; $total : Real
-
-For each ($number; 1; Count parameters)
- $total+=${$number}
-End for each
-
-return $total
-
-```
-
-Este método puede llamarse con un número variable de parámetros Real. En caso de que el tipo de parámetro sea incorrecto, se devolverá un error antes de que se ejecute el método:
-
-```4d
-
-$total1:=SumNumbers // devuelve 0
-$total2:=SumNumbers(1; 2; 3; 4; 5) // devuelve 15
-$total3:=SumNumbers(1; 2; "hola"; 4; 5) // error
-
-```
-
-:::note Compatibilidad
-
-La sintaxis heredada para declarar parámetros variadicos (`C_TEXT(${4})`) está obsoleta a partir de 4D 20 R7.
-
-:::
-
-## Triggers y On Drag Over
-
-Algunos contextos no soportan la declaración en un método "Compiler_", por lo que se tratan de forma específica:
-
-- Triggers - El parámetro $0 (Entero largo), que es el resultado de un trigger, será digitado por el compilador si el parámetro no ha sido declarado explícitamente. Sin embargo, si quiere declararlo, debe hacerlo en el propio trigger.
-
-## Tipo de parámetro equivocado
-
-Llamar a un parámetro con un tipo incorrecto es un [error](error-handling.md) que impide la correcta ejecución. Por ejemplo, si escribe los siguientes métodos:
-
-```4d
-// method1
-#DECLARE($value : Text)
-```
-
-```4d
-// method2
-method1(42) //tipo incorrecto, texto esperado
-```
-
-Este caso es tratado por 4D en función del contexto:
-
-- en [proyectos compilados](interpreted.md), se genera un error en el paso de compilación siempre que sea posible. En caso contrario, se genera un error cuando se llama al método.
-- en los proyectos interpretados:
- - si el parámetro se declaró utilizando la sintaxis nombrada (`#DECLARE` o `Function`), se genera un error cuando se llama al método.
- - if the parameter was declared using a legacy (`_C_XXX`) syntax, no error is generated, the called method receives an empty value of the expected type.
-
-## Utilización de las propiedades de objeto como parámetros con nombre
-
-La utilización de objetos como parámetros permite manejar **parámetros con nombre**. Este estilo de programación es simple, flexible y fácil de leer.
-
-Por ejemplo, utilizando el método `CreatePerson`:
-
-```4d
- //CreatePerson
- var $person : Object
- $person:=New object("Name";"Smith";"Age";40)
- ChangeAge($person)
- ALERT(String($person.Age))
-```
-
-En el método `ChangeAge` puede escribir:
-
-```4d
- //ChangeAge
- #DECLARE ($para : Object)
- $para.Age:=$para.Age+10
- ALERT($para.Name+" is "+String($para.Age)+" years old.")
-```
-
-Esto ofrece una poderosa manera de definir [parámetros opcionales](#optional-parameters) (ver también abajo). Para manejar los parámetros que faltan, puede:
-
-- verificar si se suministran todos los parámetros esperados comparándolos con el valor `Null`, o
-- predefinir los valores de los parámetros, o
-- utilizarlos como valores vacíos.
-
-En el método `ChangeAge` anterior, las propiedades Age y Name son obligatorias y producirían errores si faltaran. Para evitar este caso, puede escribir simplemente:
-
-```4d
- //ChangeAge
- #DECLARE ($para : Object)
- $para.Age:=Num($para.Age)+10
- ALERT(String($para.Name)+" is "+String($para.Age)+" years old.")
-```
-
-Entonces ambos parámetros son opcionales; si no se llenan, el resultado será " is 10 years old", pero no se generará ningún error.
-
-Por último, con los parámetros con nombre, el mantenimiento o la reproducción de las aplicaciones es muy sencillo y seguro. Imagine que más adelante se da cuenta de que añadir 10 años no siempre es apropiado. Necesita otro parámetro para definir cuántos años hay que añadir. Escriba:
-
-```4d
-$person:=New object("Name";"Smith";"Age";40;"toAdd";10)
-ChangeAge($person)
-
-//ChangeAge
-#DECLARE ($para : Object)
-If ($para.toAdd=Null)
- $para.toAdd:=10
-End if
-$para.Age:=Num($para.Age)+$para.toAdd
-ALERT(String($para.Name)+" is "+String($para.Age)+" years old.")
-```
-
-El poder aquí es que no tendrá que cambiar su código existente. Siempre funcionará como en la versión anterior, pero si es necesario, puede utilizar otro valor que no sea 10 años.
-
-Con las variables con nombre, cualquier parámetro puede ser opcional. En el ejemplo anterior, todos los parámetros son opcionales y se puede dar cualquiera, en cualquier orden.
-
-## Parámetros opcionales
-
-En el manual *Lenguaje de 4D*, los caracteres { } (llaves) indican parámetros opcionales. Por ejemplo, `ALERT (message{; okButtonTitle})` significa que el parámetro *okButtonTitle* puede omitirse al llamar al comando. Se puede llamar de las siguientes maneras:
-
-```4d
-ALERT("Are you sure?";"Yes I am") //2 parámetros
-ALERT("Time is over") //1 parámetro
-```
-
-Los métodos y las funciones 4D también aceptan estos parámetros opcionales. Tenga en cuenta que aunque haya declarado 0, 1 o más parámetros en el método, siempre puede pasar el número de parámetros que desee. Si llama a un método o función con menos parámetros que los declarados, los parámetros que faltan se procesan como valores por defecto en el código llamado, [según su tipo](data-types.md#default-values). Por ejemplo:
-
-```4d
-// función "concate" de myClass
-Function concate ($param1 : Text ; $param2 : Text)->$result : Text
-$result:=$param1+" "+$param2
-```
-
-```4d
- // Método llamante
- $class:=cs.myClass.new()
- $class.concate("Hello") // "Hello "
- $class.concate() // Displays " "
-```
-
-:::note
-
-También puede llamar a un método o función con más parámetros de los declarados. Estarán disponibles en el código llamado a través de la sintaxis [${N}](#parameter-indirection-n).
-
-:::
-
-Utilizando el comando `Count parameters` desde dentro del método llamado, puede detectar el número real de parámetros y realizar diferentes operaciones dependiendo de lo que haya recibido.
-
-El siguiente ejemplo muestra un mensaje de texto y puede insertar el texto en un documento en el disco o en un área de 4D Write Pro:
-
-```4d
-// APPEND TEXT Project Method
-// APPEND TEXT ( Text { ; Text { ; Object } } )
-// APPEND TEXT ( Message { ; Path { ; 4DWPArea } } )
-
- #DECLARE ($message : Text; $path : Text; $wpArea : Object)
-
- ALERT($message)
- If(Count parameters>=3)
- WP SET TEXT($wpArea;$1;wk append)
- Else
- If(Count parameters>=2)
- TEXT TO DOCUMENT($path;$message)
- End if
- End if
-```
-
-Después de añadir este método proyecto a su aplicación, puede escribir:
-
-```4d
-APPEND TEXT(vtSomeText) //Sólo mostrará el mensaje
-APPEND TEXT(vtSomeText;$path) //Muestra el mensaje y el anexo al documento en $path
-APPEND TEXT(vtSomeText;"";$wpArea) //Muestra el mensaje y lo escribe en $wpArea
-```
-
-:::tip
-
-Cuando los parámetros opcionales son necesarios en sus métodos, también puede considerar el uso de [propiedades de objeto como parámetros con nombre](#using-object-properties-as-named-parameters) que ofrecen una forma flexible de manejar un número de parámetros variable.
-
-:::
-
-## Valores o referencias
-
-Cuando pasa un parámetro, 4D siempre evalúa la expresión del parámetro en el contexto del método que llama y define el **valor resultante** en las variables locales en la función de clase o la subrutina. Las variables/parámetros locales no son los campos, variables o expresiones reales pasados por el método que llama; sólo contienen los valores que se han pasado. Las variables/parámetros locales no son los campos, variables o expresiones reales pasados por el método que llama; sólo contienen los valores que se han pasado. Por ejemplo:
-
-```4d
- //Aquí hay un código del método MY_METHOD
-DO_SOMETHING([People]Name) ///Digamos [People]El valor del nombre es "williams"
-ALERT([People]Name)
-
- //Aquí está el código del método DO_SOMETHING
- #DECLARE($param : Text)
- $param:=Uppercase($param)
- ALERT($param)
-```
-
-La caja de alerta mostrada por `DO_SOMETHING` dirá "WILLIAMS" y la caja de alerta mostrada por `MY_METHOD` dirá "williams". El método cambió localmente el valor del parámetro $param, pero esto no afecta al valor del campo `[People]Name` pasado como parámetro por el método `MY_METHOD`.
-
-Hay dos formas de hacer que el método `DO_SOMETHING` cambie el valor del campo:
-
-1. En lugar de pasar el campo al método, se pasa un puntero al mismo, por lo que se escribiría:
-
-```4d
- //Aquí hay un código del método MY_METHOD
-DO_SOMETHING(->[People]Name) ///Digamos [People]El valor del nombre es "williams"
-ALERT([People]Last Name)
-
- //Aquí el código del método DO_SOMETHING
-#DECLARE($param : Text)
-$param->:=Uppercase($param->)
-ALERT($param->)
-```
-
-Aquí el parámetro no es el campo, sino un puntero al mismo. Por lo tanto, dentro del método `DO SOMETHING`, $param ya no es el valor del campo sino un puntero al campo. El objeto **referenciado** por $param ($param-> en el código anterior) es el campo real. Por lo tanto, cambiar el objeto referenciado va más allá del alcance de la subrutina, y el campo real se ve afectado. En este ejemplo, las dos cajas de alerta dirán "WILLIAMS".
-
-2. En lugar de que el método `DO_SOMETHING` "haga algo", puede reescribir el método para que devuelva un valor. Por lo tanto, escribiría:
-
-```4d
- //Aquí hay un código del método MY METHOD
- [People]Name:=DO_SOMETHING([People]Name) ///Digamos [People]El valor del nombre es "williams"
- ALERT([People]Name)
-
- //Aquí el código del método DO SOMETHING
- #DECLARE ($param : Text) -> ($result : Text)
- $result:=Uppercase($param)
- ALERT($result)
-```
-
-Esta segunda técnica de retornar un valor por una subrutina se llama "utilizar una función". Se describe en el párrafo [Valores devueltos](#returned-value).
-
-### Casos particulares: objetos y colecciones
-
-Debe prestar atención al hecho de que los tipos de datos Objeto y Colección sólo pueden manejarse a través de una referencia (es decir, un *puntero* interno).
-
-Consequently, when using such data types as parameters, `$param, $return...` do not contain *values* but *references*. La modificación del valor de los parámetros `$param, $return...` dentro de la subrutina se propagará a cualquier lugar donde se utilice el objeto o colección fuente. Este es el mismo principio que para [los punteros](dt_pointer.md#pointers-as-parameters-to-methods), excepto que los parámetros `$param, $return...` no necesitan ser desreferenciados en la subrutina.
-
-Por ejemplo, considere el método `CreatePerson` que crea un objeto y lo envía como parámetro:
-
-```4d
- //CreatePerson
- var $person : Object
- $person:=New object("Name";"Smith";"Age";40)
- ChangeAge($person)
- ALERT(String($person.Age))
-```
-
-El método `ChangeAge` añade 10 al atributo Age del objeto recibido
-
-```4d
- //ChangeAge
- #DECLARE ($person : Object)
- $person.Age:=$person.Age+10
- ALERT(String($person.Age))
-```
-
-Cuando se ejecuta el método `CreatePerson`, las dos cajas de alerta dirán "50" ya que la misma referencia de objeto es manejada por ambos métodos.
-
-**4D Server:** cuando se pasan parámetros entre métodos que no se ejecutan en la misma máquina (utilizando por ejemplo la opción "Ejecutar en el servidor"), las referencias no son utilizables. En estos casos, se envían copias de los parámetros de objetos y colecciones en lugar de referencias.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/quick-tour.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/quick-tour.md
deleted file mode 100644
index d0ca9c46cc3021..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/quick-tour.md
+++ /dev/null
@@ -1,423 +0,0 @@
----
-id: quick-tour
-title: Un recorrido rápido
-sidebar_label: Un recorrido rápido
----
-
-Utilizando el lenguaje 4D, la impresión del tradicional mensaje "Hello, world!" en pantalla puede hacerse de varias maneras. Lo más sencillo es probablemente escribir la siguiente línea única en un método de proyecto:
-
-```4d
-ALERT("Hello, World!")
-```
-
-Este código mostrará una caja de diálogo de alerta estándar de la plataforma con el mensaje "Hello, World!", que contiene un botón de OK. Para ejecutar el código, basta con hacer clic en el botón de ejecución en el editor de código:
-
-
-
-O bien, podría adjuntar este código a un botón de formulario y ejecutarlo, en cuyo caso al hacer clic en el botón se mostraría la caja de diálogo de alerta. En todo caso, ¡acaba de ejecutar su primera línea de código 4D!
-
-## Asignar los valores
-
-Los datos pueden introducirse y copiarse en variables, campos, elementos de arrays... Poner datos en una variable se llama asignar los datos a la variable y se hace con el operador de asignación (:=). El operador de asignación también se utiliza para asignar datos a campos o elementos de arrays.
-
-```4d
-$MyNumber:=3 //asigna 3 a la variable MyNumber
-[Products]Size:=$MyNumber //asigna la variable MyNumber al campo [Products]Size
-arrDays{2}:="Tuesday" //asigna la cadena "Tuesday" al segundo elemento de arrDays
-MyVar:=Length("Acme") //asigna el resultado de la función (4) a MyVar
-$myDate:=!2018/01/21! //asigna una fecha literal
-$myHour:=?08:12:55? //asigna una hora literal
-```
-
-Debe distinguir el operador de asignación := de los demás operadores. En lugar de combinar expresiones en una nueva expresión, el operador de asignación copia el valor de la expresión a la derecha del operador de asignación en la variable o campo a la izquierda del operador.
-
-**Importante:** no confunda el operador de asignación (:=) con el signo igual (=). Se ha elegido deliberadamente un operador de asignación diferente (y no =) para evitar los problemas y la confusión que suelen producirse con == o === en otros lenguajes de programación. Estos errores son a menudo difíciles de reconocer por el compilador y conducen a una solución de problemas que requiere mucho tiempo.
-
-## Variables
-
-El lenguaje 4D es estricto con los tipos de datos, aunque se permite cierta flexibilidad en muchos casos. Por ejemplo, para crear una variable de tipo fecha, puede escribir: Se crea una variable digitada utilizando la palabra clave var.
-
-```4d
-var MyDate : Date
-```
-
-La palabra clave `var` permite declarar variables objeto de un tipo de clase definido, por ejemplo:
-
-```4d
-var myPerson : cs.Person
-//variable de la clase usuario Person
-```
-
-Aunque no se suele recomendar, se pueden crear variables simplemente utilizándolas; no es necesario definirlas formalmente. Por ejemplo, si desea una variable que contenga la fecha actual más 30 días, puede escribir:
-
-```4d
-MyOtherDate:=Current date+30
-```
-
-La línea de código dice "MyOtherDate obtiene la fecha actual más 30 días" Esta línea declara la variable, la asigna con el tipo de fecha (temporal) y un contenido. Esta línea crea la variable, la asigna con el tipo de fecha (temporal) y un contenido. Una variable creada por asignación se interpreta como sin tipo, es decir, puede ser asignada con otros tipos en otras líneas y cambia el tipo dinámicamente. Esta flexibilidad no se aplica a las variables declaradas con la palabra clave `var` (su tipo no puede cambiar) y en [modo compilado](interpreted.md), donde el tipo nunca puede cambiarse, independientemente de cómo se haya creado la variable.
-
-## Comandos
-
-Los comandos 4D son métodos integrados para realizar una acción. Los comandos se utilizan a menudo con parámetros, que se pasan entre corchetes () y separados por punto y coma (;). Ejemplo:
-
-```4d
-COPY DOCUMENT("folder1\\name1";"folder2\\" ; "new")
-```
-
-Algunos comandos se adjuntan a colecciones u objetos, en cuyo caso son funciones temporales que se utilizan con la notación de puntos. Por ejemplo:
-
-```4d
-$c:=New collection(1;2;3;4;5)
-$nc:=$c.slice(0;3) //$nc=[1,2,3]
-
-$lastEmployee:=$employee.last()
-```
-
-Puede utilizar los plug-ins o los componentes 4D que añaden nuevos comandos a su entorno de desarrollo 4D.
-
-Hay muchos plug-ins propuestos por la comunidad de usuarios de 4D o por desarrolladores terceros. Por ejemplo, utilizando el [4d-plugin-pdf-pages](https://github.com/miyako/4d-plugin-pdf-pages) en macOS:
-
-```4d
-PDF REMOVE PAGE(path;page)
-```
-
-4D SVG es un ejemplo de componente utilitario que aumenta las capacidades de su aplicación:
-
-```4d
-//hacer un dibujo
-svgRef:=SVG_New
-objectRef:=SVG_New_arc(svgRef;100;100;90;90;180)
-```
-
-4D SVG está incluido en 4D.
-
-## Constantes
-
-4D ofrece un conjunto extensivo de constantes predefinidas, cuyos valores son accesibles por nombre. Permiten escribir un código más legible. Por ejemplo, `Read Mode` es una constante (valor 2).
-
-```4d
-vRef:=Open document("PassFile";"TEXT";Read Mode) // abrir el documento en modo de sólo lectura
-```
-
-> Las constantes predefinidas aparecen subrayadas por defecto en el editor de código 4D.
-
-## Métodos
-
-4D ofrece un gran número de métodos (o comandos) integrados, pero también le permite crear sus propios **métodos de proyecto**. Los métodos de proyecto son métodos definidos por el usuario que contienen comandos, operadores y otras partes del lenguaje.
-Los métodos proyecto son métodos genéricos, pero hay otros tipos de métodos: métodos objeto, métodos formulario, métodos tabla (Triggers) y métodos base.
-
-Un método se compone de varias líneas de instrucciones, cada una de las cuales consta de una línea en el método. Una línea de instrucción realiza una acción, y puede ser simple o compleja.
-
-Por ejemplo, la siguiente línea es una sentencia que mostrará una caja de diálogo de confirmación:
-
-```4d
-CONFIRM("¿Realmente quiere cerrar esta cuenta?"; "Sí"; "No")
-```
-
-Un método también contiene pruebas y bucles que controlan el flujo de ejecución. 4D methods support `If...Else...End if` and `Case of... Else...End case` branching structures as well as looping structures: `While...End while`, `Repeat...Until`, `For...End for`, and `For each... End for each`:
-
-El siguiente ejemplo recorre todos los caracteres del texto vtSomeText:
-
-```4d
-For($vlChar;1;Length(vtSomeText))
- //Hacer algo con el carácter si es un TAB
-
-
- If(Character code(vtSomeText[[$vlChar]])=Tab)
- //...
- End if
-End for
-```
-
-Un método proyecto puede llamar a otro método proyecto con o sin parámetros (argumentos). Los parámetros se pasan al método entre paréntesis, a continuación del nombre del método. Cada parámetro está separado del siguiente por un punto y coma (;). Los parámetros están disponibles directamente en el método llamado si se han declarado. Un método puede devolver un único valor en un parámetro, que debe ser declarado. Cuando se llama a un método, sólo hay que escribir su nombre:
-
-```4d
-$myText:="hello"
-$myText:=Hacer_algo($myText) //Llamar al método Do_Something
-ALERT($myText) //"HELLO"
-
- //Aquí el código del método Do_Something
-#DECLARE ($in : Text) -> $out : Text
-$out:=Uppercase($in)
-```
-
-## Tipos de datos
-
-En el lenguaje, los distintos tipos de datos que se pueden manejar se denominan tipos de datos. Existen tipos de datos básicos (cadena, numérico, fecha, hora, booleano, imagen, punteros, arrays), y también tipos de datos compuestos (BLOBs, objetos, colecciones).
-
-Tenga en cuenta que los datos de tipo cadena y numérico pueden asociarse a más de un tipo de campo. Cuando se introducen datos en un campo, el lenguaje convierte automáticamente los datos en el tipo correcto para el campo. Por ejemplo, si se utiliza un campo entero, sus datos se tratan automáticamente como numéricos. En otras palabras, no tiene que preocuparse por mezclar tipos de campos similares al utilizar el lenguaje; éste los gestionará por usted.
-
-Sin embargo, al utilizar el lenguaje es importante no mezclar los diferentes tipos de datos. Del mismo modo que no tiene sentido almacenar "ABC" en un campo de fecha, tampoco tiene sentido poner "ABC" en una variable utilizada para fechas. En la mayoría de los casos, 4D es muy tolerante y tratará de dar sentido a lo que está haciendo. Por ejemplo, si añade un número a una fecha, 4D asumirá que quiere añadir ese número de días a la fecha, pero si intenta añadir una cadena a una fecha, 4D le dirá que la operación no puede funcionar.
-
-Hay casos en los que es necesario almacenar datos como un tipo y utilizarlos como otro. El lenguaje contiene un conjunto completo de comandos que permiten convertir de un tipo de datos a otro. Por ejemplo, es posible que necesite crear un número de pieza que empiece por un número y termine con caracteres como "abc". En este caso, podría escribir:
-
-```4d
-[Products]Part Number:=String(Number)+"abc"
-```
-
-Si *Number* es 17, entonces *[Products]Part Number* obtendrá el valor “17abc”.
-
-Los tipos de datos están completamente definidos en la sección [Tipos de datos](Concepts/data-types.md).
-
-## Objetos y colecciones
-
-Puedes manejar objetos y colecciones del lenguaje 4D utilizando la notación objeto para obtener o definir sus valores. Por ejemplo:
-
-```4d
-employee.name:="Smith"
-```
-
-También puede utilizar una cadena entre corchetes, por ejemplo:
-
-```4d
-$vName:=employee["name"]
-```
-
-Como el valor de una propiedad de objeto puede ser un objeto o una colección, la notación objeto acepta una secuencia de símbolos para acceder a subpropiedades, por ejemplo:
-
-```4d
-$vAge:=employee.children[2].age
-```
-
-Tenga en cuenta que si el valor de la propiedad del objeto es un objeto que encapsula un método (una fórmula), debe añadir paréntesis () al nombre de la propiedad para ejecutar el método:
-
-```4d
-$f:=New object
-$f.message:=Formula(ALERT("Hello world!"))
-$f.message() //muestra "Hello world!"
-```
-
-Para acceder a un elemento de la colección, debe pasar el número del elemento entre corchetes:
-
-```4d
-var myColl : Collection
-myColl:=New collection("A";"B";1;2;Current time)
-myColl[3] //acceso al 4º elemento de la colección
-```
-
-## Clases
-
-El lenguaje 4D soporta las clases de objetos. Añade un archivo `myClass.4dm` en la carpeta Project/Sources/Classes de un proyecto para crear una clase llamada "myClass".
-
-Para instanciar un objeto de la clase en un método, llame la clase usuario desde el *class store* (`cs`) y utilice la función miembro `new()`. Se pueden pasar parámetros.
-
-```4d
-// en un método 4D
-$o:=cs.myClass.new()
-```
-
-En el método clase `myClass`, utilice la instrucción `Function` para definir la función miembro clase *methodName*. Una función miembro de clase puede recibir y devolver parámetros como todo método, y utilizar `This` como instancia del objeto.
-
-```4d
-
-//en el archivo myClass.4dm
-Function hello -> $welcome : Text
- $welcome:="Hello "+This.who
-```
-
-Para ejecutar una función miembro de clase, basta con utilizar el operador `()` en la función miembro de la instancia del objeto.
-
-```4d
-$o:=cs.myClass.new()
-$o.who:="World"
-$message:=$o.myClass.hello()
-//$message: "Hello World"
-```
-
-Opcionalmente, utilice la palabra clave `Class constructor` para declarar las propiedades del objeto.
-
-```4d
-//en el archivo Rectangle.4dm
-Class constructor ($width : Integer; $height : Integer)
-This.height:=$height
-This.width:=$width
-This.name:="Rectangle"
-```
-
-Una clase puede extender otra clase utilizando `Class extends `. Las superclasses se pueden llamar con el comando `Super`. Por ejemplo:
-
-```4d
-//en el archivo Square.4dm
-Class extends rectangle
-
-Class constructor ($length : Integer)
- // Llama al constructor de la clase padre con las longitudes
- // ofrecidas para el ancho y alto del rectángulo
-Super($length;$length)
-
-This.name:="Square"
-```
-
-## Operadores
-
-Cuando se utiliza el lenguaje, es raro que se quiera simplemente un dato. Es más probable que quiera hacer algo con esos datos. Estos cálculos se realizan con operadores. Los operadores, en general, toman dos datos y realizan una operación sobre ellos que da como resultado un nuevo dato. Usted ya conoce a la mayoría de los operadores. You are already familiar with many operators. For example, 1 + 2 uses the addition (or plus sign) operator to add two numbers together, and the result is 3.
-
-| Operador | Operación | Ejemplo |
-| -------- | -------------- | ---------- |
-| + | Adición | 1 + 2 = 3 |
-| – | Resta | 3 - 2 = 1 |
-| \* | Multiplicación | 2 \* 3 = 6 |
-| / | División | 6 / 2 = 3 |
-
-Los operadores numéricos son sólo un tipo de operador disponible. 4D soporta múltiples tipos de datos, como números, texto, fechas e imágenes, por lo que existen operadores que realizan operaciones con estos diferentes tipos de datos.
-
-Los mismos símbolos se utilizan a menudo para diferentes operaciones, dependiendo del tipo de datos. Por ejemplo, el signo más (+) realiza diferentes operaciones con diferentes datos:
-
-| Tipos de datos | Operación | Ejemplo |
-| -------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------- |
-| Number | Adición | 1 + 2 suma los números y da como resultado 3 |
-| Text | Concatenación | "Hola" + "a todos" concatena (une) las cadenas y da como resultado "Hola a todos" |
-| Fecha y Número | Adición de fecha | !1989-01-01! !1989-01-01! + 20 adds 20 days to the date January 1, 1989, and results in the date January 21, 1989 |
-
-## Expresiones
-
-En pocas palabras, las expresiones devuelven un valor. De hecho, al utilizar el lenguaje 4D, se utilizan expresiones todo el tiempo y se tiende a pensar en ellas sólo en términos del valor que representan. Las expresiones también se llaman fórmulas.
-
-Las expresiones se componen de casi todas las demás partes del lenguaje: comandos, operadores, variables, campos, propiedades de objetos y elementos de colección. Se utilizan expresiones para escribir líneas de código, que a su vez se utilizan para construir métodos. El lenguaje utiliza expresiones siempre que necesita un dato.
-
-Las expresiones son rara vez "autónomas." Hay varios lugares en 4D donde una expresión puede ser utilizada por sí misma. Incluye:
-
-- Editor de fórmulas (apply formula, query with formula, order by formula)
-- El comando `EXECUTE FORMULA`
-- La lista de propiedades, donde se puede utilizar una expresión como fuente de datos para la mayoría de los widgets
-- Depurador donde se puede comprobar el valor de las expresiones
-- En el editor de informes rápidos como fórmula para una columna
-
-### Tese de expresiones
-
-Se hace referencia a una expresión por el tipo de datos que devuelve. Hay varios tipos de expresiones. En la siguiente tabla se dan ejemplos de cada tipo de expresión.
-
-| Expression | Tipo | Descripción |
-| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| “Hello” | Text | La palabra Hola es una constante cadena, indicada por las comillas dobles. |
-| “Hello ” + “there” | Text | Dos cadenas, "Hola" y "a todos", se suman (concatenan) con el operador de concatenación de cadenas (+). Se devuelve la cadena "Hola". |
-| “Sr. ” + [People]Name | Text | Se concatenan dos cadenas: la cadena "Sr." y el valor actual del campo Nombre de la tabla Personas. Si el campo contiene "Smith", la expresión devuelve "Mr. Smith". |
-| Uppercase("smith") | Text | Esta expresión utiliza `Uppercase`, un comando del lenguaje, para convertir la cadena "smith" a mayúsculas. Devuelve “SMITH”. |
-| 4 | Number | Se trata de una constante numérica, 4. |
-| 4 \* 2 | Number | Dos números, 4 y 2, se multiplican utilizando el operador de multiplicación (\*). El resultado es el número 8. |
-| myButton | Number | Es una variable asociada a un botón. Devuelve el valor actual del botón: 1 si se ha hecho clic, 0 si no. |
-| !1997-01-25! | Fecha | Esta es una constante fecha para la fecha 1/25/97 (25 de enero de 1997). |
-| Current date+ 30 | Fecha | Esta es una expresión de tipo Fecha que utiliza el comando `Current date` para obtener la fecha de hoy. Añade 30 días a la fecha de hoy y devuelve la nueva fecha. |
-| ?8:05:30? | Time | Es una constante hora que representa 8 horas, 5 minutos y 30 segundos. |
-| ?2:03:04? + ?1:02:03? ?2:03:04? + ?1:02:03? ?2:03:04? + ?1:02:03? ?2:03:04? + ?1:02:03? + ?1:02:03? | Time | Esta expresión suma dos horas y devuelve la hora 3:05:07. |
-| True | Boolean | Este comando devuelve el valor booleano TRUE. |
-| 10 # 20 | Boolean | Se trata de una comparación lógica entre dos números. El símbolo número (#) significa "es diferente de". Como 10 "es diferente de" 20, la expresión devuelve TRUE. |
-| “ABC” = “XYZ” | Boolean | Se trata de una comparación lógica entre dos cadenas. Son diferentes, por lo que la expresión devuelve FALSE. |
-| My Picture + 50 | Picture | Esta expresión toma la imagen en My Picture, la mueve 50 píxeles a la derecha y devuelve la imagen resultante. |
-| ->[People]Name | Puntero | Esta expresión devuelve un puntero al campo llamado [People]Name. |
-| Table (1) | Puntero | Este es un comando que devuelve un puntero a la primera tabla. |
-| JSON Parse (MyString) | Object | Este es un comando que devuelve MyString como un objeto (si el formato es el adecuado) |
-| JSON Parse (MyJSONArray) | Collection | Este es un comando que devuelve MyJSONArray en forma de colección (si el formato es el adecuado) |
-| Form.pageNumber | Propiedad objeto | Una propiedad objeto es una expresión que puede ser de todo tipo soportado |
-| Col[5] | Elementos de colección | Un elemento de colección es una expresión que puede ser de todo tipo soportado |
-| $entitySel[0] | Entity | Un elemento de una selección de entidades ORDA es una expresión de tipo entidad. Este tipo de expresión es **no asignable** |
-
-### Expresiones asignables y no asignables
-
-Una expresión puede ser simplemente una constante literal, como el número 4 o la cadena "Hello", o una variable como `$myButton`. También puede utilizar los operadores. Por ejemplo, 4 + 2 es una expresión que utiliza el operador de adición para sumar dos números y devolver el resultado 6. En todos los casos, estas expresiones son **no asignables**, lo que significa que no se les puede asignar un valor.
-En 4D, las expresiones pueden ser **asignables**. Una expresión es asignable cuando puede utilizarse a la izquierda del operador de asignación. Por ejemplo:
-
-```4d
-//$myVar variable is assignable, you can write:
-$myVar:="Hello" //assign "Hello" to myVar
-//Form.pageNumber is assignable, you can write: Form.pageNumber:=10 //assign 10 to Form.pageNumber
-//Form.pageTotal-Form.pageNumber is not assignable: Form.pageTotal- Form.pageNumber:=10 //error, non-assignable
-```
-
-En general, las expresiones que utilizan un operador no son asignables. Por ejemplo, `[Person]FirstName+" "+[Person]LastName` no es asignable.
-
-## Punteros
-
-El lenguaje 4D ofrece una implementación avanzada de punteros, que permite escribir código poderoso y modular. Puede utilizar punteros para referenciar tablas, campos, variables, arrays y elementos de arrays.
-
-Un puntero a un elemento se crea añadiendo un símbolo "->" antes del nombre del elemento, y se puede desreferenciar añadiendo el símbolo "->" después del nombre del puntero.
-
-```4d
-MyVar:="Hello"
-MyPointer:=->MyVar
-ALERT(MyPointer->)
-```
-
-## Código en varias líneas
-
-Puede escribir una única instrucción en varias líneas terminando cada línea de la instrucción con un caracter barra invertida final `\`. El lenguaje 4D considerará todas las líneas a la vez. Por ejemplo, ambas sentencias son equivalentes:
-
-```4d
-$str:=String("hello world!")
-```
-
-```4d
-$str:=String("hello"+\
-" world"+\
-"!")
-```
-
-## Comentarios
-
-Los comentarios son líneas de instrucciones inactivas. Estas líneas no son interpretadas por el programa 4D y no se ejecutan cuando el código se llama.
-
-Hay dos maneras de crear comentarios:
-
-- `//` para crear una línea de comentario
-- `/*...*/` para los bloques de comentarios en línea o multilínea.
-
-Ambos estilos de comentarios pueden utilizarse simultáneamente.
-
-#### Comentarios de una línea (`//comentario`)
-
-Inserte `//` al principio de una línea o después de una instrucción para añadir una línea de comentario. Ejemplo:
-
-```4d
-//Este es un comentario
-For($vCounter;1;100) //Bucle inicial
- //comentario
- //comentario
- //comentario
-End for
-```
-
-#### Comentarios en línea o multilínea (`/*comment*/`)
-
-Rodea el contenido con los caracteres `/*` ... `*/` para para crear bloques de comentarios en línea o multilíneas. Tanto los bloques de comentarios en línea como los multilínea comienzan con `/*` y terminan con `*/`.
-
-- Las **líneas de comentarios en línea** se pueden insertar en cualquier parte del código. Ejemplo:
-
-```4d
-For /* inline comment */ ($vCounter;1;100)
- ...
-End for
-```
-
-- Los **bloques de comentarios multilíneas** permiten comentar un número ilimitado de líneas. Los bloques de comentarios pueden anidarse (útil desde que el editor de código 4D soporta los bloques contraídos). Ejemplo:
-
-```4d
-For ($vCounter;1;100)
-/*
-comentarios
- /*
- otros comentarios
- */
-*/
-```
-
-## Secuencias de escape
-
-El lenguaje 4D permite utilizar secuencias de escape (también llamadas caracteres de escape). Una secuencia de escape es una secuencia de caracteres que puede utilizarse para sustituir a un caracter "especial".
-
-La secuencia consiste en una barra invertida `\`, seguida de un caracter. Por ejemplo, `\t` es una secuencia de escape para el caracter **Tab**. Las secuencias de escape facilitan la introducción de caracteres especiales: el ejemplo anterior (`\t`) sustituye a la entrada "Caracter(Tab)".
-
-En 4D, se pueden utilizar las siguientes secuencias de escape:
-
-| Secuencias de escape | Carácter reemplazado |
-| -------------------- | ----------------------------------------- |
-| `\n` | LF (Retorno línea) |
-| `\t` | HT (Tabulación) |
-| `\r` | CR (Retorno carro) |
-| `\\` | `\` (Barra invertida) |
-| `\"` | " (Comillas) |
-
-> Es posible utilizar mayúsculas o minúsculas en las secuencias de escape.
-
-En el siguiente ejemplo, el caracter **Retorno de carro** (secuencia de escape `\r`) se inserta en una sentencia para obtener un diálogo:
-
-`ALERT("The operation has been completed successfully.\rYou may now disconnect.")`
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/debugLogFiles.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/debugLogFiles.md
deleted file mode 100644
index aa7908f251bf1f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/debugLogFiles.md
+++ /dev/null
@@ -1,716 +0,0 @@
----
-id: debugLogFiles
-title: Archivo de historial
----
-
-Las aplicaciones 4D pueden generar varios archivos de historial que son útiles para depurar u optimizar su ejecución. Los registros generalmente se inician o detienen utilizando los selectores de los comandos [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md), [WEB SET OPTION](../commands-legacy/web-set-option.md) o [HTTP SET OPTION](../commands-legacy/http-set-option.md) y se almacenan en la [carpeta de registros](../Project/architecture.md#logs) del proyecto.
-
-La información histórica debe ser analizada para detectar y solucionar los problemas. Esta sección ofrece una descripción completa de los siguientes archivos de registro:
-
-- [4DRequestsLog.txt](#4drequestslogtxt)
-- [4DRequestsLog_ProcessInfo.txt](l#4drequestslog_processinfotxt)
-- [HTTPDebugLog.txt](#httpdebuglogtxt)
-- [4DHTTPClientLog.txt](#4dhttpclientlogtxt)
-- 4DDebugLog.txt ([standard](#4ddebuglogtxt-standard) & [tabular](#4ddebuglogtxt-tabular))
-- [4DDiagnosticLog.txt](#4ddiagnosticlogtxt)
-- [4DIMAPLog.txt](#4dsmtplogtxt-4dpop3logtxt-and-4dimaplogtxt)
-- [4DPOP3Log.txt](#4dsmtplogtxt-4dpop3logtxt-and-4dimaplogtxt)
-- [4DSMTPLog.txt](#4dsmtplogtxt-4dpop3logtxt-and-4dimaplogtxt)
-- [ORDA requests log file](#orda-requests)
-- [4DTCPLog.txt](#4dtcplogtxt)
-
-> Cuando un archivo de historial puede generarse tanto en 4D Server como en el cliente remoto, se añade la palabra "Server" al nombre del archivo de historial del lado del servidor, por ejemplo "4DRequestsLogServer.txt"
-
-Los archivos de historial comparten algunos campos para que pueda establecer una cronología y hacer conexiones entre las entradas mientras depura:
-
-- `sequence_number`: este número es único en todos los registros de depuración y se incrementa para cada nueva entrada cualquiera que sea el archivo de historial, para que pueda conocer la secuencia exacta de las operaciones.
-- `connection_uuid`: para cada proceso 4D creado en un cliente 4D que se conecte a un servidor, este UUID de conexión se registra tanto del lado del servidor como del cliente. Permite identificar fácilmente el cliente remoto que lanzó cada proceso.
-
-## 4DRequestsLog.txt
-
-Este archivo de historial registra las solicitudes estándar llevadas a cabo por la máquina 4D Server o la máquina remota 4D que ejecutó el comando (excluyendo las solicitudes web).
-
-Como iniciar este historial:
-
-- en el servidor:
-
-```4d
-SET DATABASE PARAMETER(4D Server log recording;1)
-//del lado del servidor
-```
-
-- en un cliente:
-
-```4d
-SET DATABASE PARAMETER(Client Log Recording;1)
-//del lado remoto
-```
-
-> Esta instrucción también inicia el archivo de historial [4DRequestsLog_ProcessInfo.txt](#4drequestslog_processinfotxt).
-
-#### Encabezados
-
-Este archivo comienza con los siguientes encabezados:
-
-- Log Session Identifier (Identificador de sesión de historial)
-- Nombre del servidor que aloja la aplicación
-- Nombre de usuario: nombre de usuario en el sistema operativo que ejecutó la aplicación 4D en el servidor.
-
-#### Contenido
-
-Para cada petición, se registran los siguientes campos:
-
-| Nombre del campo | Descripción |
-| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| sequence_number | Número de operación único y secuencial en la sesión de historial |
-| time | Fecha y hora utilizando el formato ISO 8601: 'YYYY-MM-DDTHH:MM:SS.mmm' |
-| systemid | ID del sistema |
-| component | Firma del componente (por ejemplo, "4SQLS" o "dbmg") |
-| process\_info\_index | Corresponde al campo "index" en el archivo de historial 4DRequestsLog_ProcessInfo.txt, y permite vincular una petición a un proceso. |
-| request | [ID de petición C/S u ORDA](https://github.com/4d/request-log-definitions/blob/master/RequestIDs.txt) o cadena de mensaje para peticiones SQL o mensajes `LOG EVENT` |
-| bytes_in | Número de bytes recibidos |
-| bytes_out | Número de bytes enviados |
-| server\_duration | exec\_duration | Depende del lugar donde se genere el registro:
_server\*duration* cuando se genera en el cliente --Time tomado en microsegundos para que el servidor procese la solicitud y devuelva una respuesta. B a F en la imagen de abajo, O
_exec\*duration* cuando se genera en el servidor --Tiempo empleado en microsegundos para que el servidor procese la petición. B a E en la imagen de abajo.
|
-| write\_duration | Tiempo tomado en microsegundos para enviar la:
Petición (cuando se ejecuta en el cliente). A a B en la imagen debajo.
Respuesta (cuando se ejecuta en el servidor). E a F en la imagen de abajo.
|
-| task_kind | Apropiativo o cooperativo (respectivamente "p" o "c") |
-| rtt | Tiempo estimado en microsegundos para que el cliente envíe la solicitud y el servidor la acuse de recibo. A a D y E a H en la imagen de abajo.
Solo medido al utilizar la capa de red ServerNet, devuelve 0 cuando se usa con la capa de red antigua.
Para versiones de Windows anteriores a Windows 10 o Windows Server 2016, la llamada retornará 0.
|
-| extra | Información adicional relacionada con el contexto, por ejemplo el nombre de la clase de datos y/o el nombre del atributo en caso de petición ORDA |
-
-Flujo de solicitudes:
-
-
-
-## 4DRequestsLog_ProcessInfo.txt
-
-Este archivo de historial registra la información de cada proceso creado en la máquina 4D Server o en la máquina remota 4D que ejecutó el comando (excluyendo las solicitudes web).
-
-Como iniciar este historial:
-
-- en el servidor:
-
-```4d
-SET DATABASE PARAMETER(4D Server log recording;1) //lado servidor
-```
-
-- en un cliente:
-
-```4d
-SET DATABASE PARAMETER(Client Log Recording;1) //del lado remoto
-```
-
-> Esta instrucción también inicia el archivo de historial [4DRequestsLog.txt](#4drequestslogtxt).
-
-#### Encabezados
-
-Este archivo comienza con los siguientes encabezados:
-
-- Log Session Identifier (Identificador de sesión de historial)
-- Nombre del servidor que aloja la aplicación
-- Nombre de usuario: nombre de usuario en el sistema operativo que ejecutó la aplicación 4D en el servidor.
-
-#### Contenido
-
-Para cada proceso, se registran los siguientes campos:
-
-| Nombre del campo | Descripción |
-| --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| sequence_number | Número de operación único y secuencial en la sesión de historial |
-| time | Fecha y hora utilizando el formato ISO 8601: 'YYYY-MM-DDTHH:MM:SS.mmm" |
-| process\_info\_index | Número de proceso único y secuencial |
-| CDB4DBaseContext | UUID del contexto de base del componente DB4D |
-| systemid | ID del sistema |
-| server\_process\_id | ID del proceso en el servidor |
-| remote\_process\_id | ID del proceso en el cliente |
-| process\_name | Nombre del proceso |
-| cID | Identificador de la conexión 4D |
-| uID | Identificador del cliente 4D |
-| IP Client | Dirección IPv4/IPv6 |
-| host_name | Nombre de host del cliente |
-| user_name | Nombre de conexión usuario en el cliente |
-| connection\_uuid | Identificador UUID de proceso de conexión |
-| server\_process\_unique\_id | ID único del proceso en el servidor |
-
-## HTTPDebugLog.txt
-
-Este archivo de historial registra cada petición HTTP y cada respuesta en modo bruto (raw). Se registran las solicitudes completas, incluidos los encabezados; opcionalmente, también se pueden registrar las partes del cuerpo.
-
-Como iniciar este historial:
-
-```4d
-
-WEB SET OPTION(Web debug log;wdl enable without body)
-//otros valores están disponibles
-```
-
-Los siguientes campos se registran tanto para la solicitud como para la respuesta:
-
-| Nombre del campo | Descripción |
-| ---------------- | ------------------------------------------------------------------------------------- |
-| SocketID | ID del socket utilizado para la comunicación |
-| PeerIP | Dirección IPv4 del host (cliente) |
-| PeerPort | Puerto utilizado por host (cliente) |
-| TimeStamp | Timestamp en milisegundos (desde el inicio del sistema) |
-| ConnectionID | Conexión UUID (UUID del VTCPSocket utilizado para la comunicación) |
-| SequenceNumber | Número de operación único y secuencial en la sesión de historial |
-
-## 4DHTTPClientLog.txt
-
-Este archivo de historial registra el tráfico HTTP que pasa por el cliente HTTP de 4D. Se registran las peticiones y respuestas completas, incluidos los encabezados; opcionalmente, también se pueden registrar las partes del cuerpo.
-
-Como iniciar este historial:
-
-```4d
-
-HTTP SET OPTION(HTTP client log; HTTP enable log with all body parts)
-//hay otros valores disponibles
-```
-
-Los siguientes campos se registran tanto para la solicitud como para la respuesta:
-
-| Nombre del campo | Descripción |
-| ---------------- | ------------------------------------------------------------------------------------------------------------------------- |
-| SequenceID | Número de operación único y secuencial en la sesión de historial |
-| ConnectionID | Identificador UUID de proceso de conexión |
-| LocalIP | Dirección IP del cliente |
-| PeerIP | Dirección IP del servidor |
-| TimeStamp | Marca de tiempo (ms) en el momento en que se envía la solicitud o se recibe completamente la respuesta |
-| ElapsedTimeInMs | (sólo respuesta) Diferencia con la marca de tiempo de la petición |
-
-Dependiendo de las opciones de historial, también se pueden registrar otros campos.
-
-- Para la petición: línea de petición, encabezados, cuerpo de la petición
-- Para respuesta: línea de estado, encabezados, cuerpo de la respuesta (sin comprimir), si lo hay
-
-## 4DDebugLog.txt (estándar)
-
-Este archivo de historial registra cada evento que se produce a nivel de programación 4D. El modo estándar ofrece una visión básica de los eventos.
-
-Como iniciar este historial:
-
-```4d
-SET DATABASE PARAMETER(Debug Log Recording;2)
-//estándar, todos los procesos
-
-SET DATABASE PARAMETER(Current process debug log recording;2)
-//estándar, sólo el proceso actual
-```
-
-Los siguientes campos se registran para cada evento:
-
-| Columna # | Descripción |
-| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 1 | Número de operación único y secuencial en la sesión de historial |
-| 2 | Fecha y hora en el formato ISO 8601: (YYYY-MM-DDThh:mm:ss.mmm) |
-| 3 | ID proceso (p=xx) e ID único proceso (puid=xx) |
-| 4 | Nivel de stack |
-| 5 | Puede ser Nombre del comando/Nombre del método/Mensaje/Información de inicio y parada de la tarea/Nombre, evento o callback plugin / UUID conexión |
-| 6 | Tiempo de la operación de conexión en milisegundos |
-
-## 4DDebugLog.txt (tabular)
-
-Este archivo de historial registra cada evento que se produce a nivel de programación 4D en un formato compacto y con tabulaciones que incluye información adicional (en comparación con el formato estándar).
-
-Como iniciar este historial:
-
-```4d
-SET DATABASE PARAMETER(Debug Log Recording;2+4)
-//formato tabular extendido, todos los procesos
-
-SET DATABASE PARAMETER(Current process debug log recording;2+4)
-//extendido, sólo el proceso actual
-```
-
-Los siguientes campos se registran para cada evento:
-
-| Columna # | Nombre del campo | Descripción |
-| --------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 1 | sequence_number | Número de operación único y secuencial en la sesión de historial |
-| 2 | time | Fecha y hora en el formato ISO 8601: (YYYY-MM-DDThh:mm:ss.mmm) |
-| 3 | ProcessID | ID del Proceso |
-| 4 | unique_processID | ID único del proceso |
-| 5 | stack_level | Nivel de stack |
-| 6 | operation_type | Tipo de operación histórico. Este valor puede ser un valor absoluto:
Comando
Método (método proyecto, método base, etc.)
Mensaje (enviado solo por el comando [LOG EVENT](../commands-legacy/log-event.md))
PluginMessage
PluginEvent
PluginCommand
PluginCallback
Task
Método miembro (método adjunto a una colección o un objeto)
Al cerrar un nivel de pila, las columnas `operation_type`, `operation` y `operation_parameters` tienen el mismo valor que el nivel de pila de apertura registrado en la columna `stack_opening_sequence_number`. Por ejemplo:
Las líneas 1 y 2 abren un nivel de pila, las líneas 3 y 4 cierran un nivel de pila. Los valores de las columnas 6, 7 y 8 se repiten en la línea del nivel de pila de cierre. La columna 10 contiene los números de secuencia de apertura del nivel de pila, es decir, 122 para la tercera línea y 121 para la cuarta. |
-| 7 | operation | Puede representar (dependiendo del tipo de operación):
un ID de Comando de Idioma (cuando el tipo=1)
un Nombre de Método (cuando el tipo=2)
una combinación de pluginIndex;pluginCommand (cuando el tipo=4, 5, 6 o 7). Puede contener algo como '3;2'
un UUID de tarea de conexión (cuando type=8)
|
-| 8 | operation_parameters | Parámetros pasados a comandos, métodos o plugins |
-| 9 | form_event | Evento formulario si lo hay; vacío en otros casos (supongamos que la columna se utiliza cuando se ejecuta el código en un método formulario o en un método objeto) |
-| 10 | stack_opening_sequence_number | Sólo para los niveles de pila de cierre: número de secuencia del nivel de pila de apertura correspondiente |
-| 11 | stack_level_execution_time | Sólo cuando se cierra el nivel de la pila: el tiempo transcurrido en microsegundos de la acción registrada actualmente (ver la décima columna en las líneas 123 y 124 del registro anterior) |
-
-## 4DDiagnosticLog.txt
-
-Este archivo de historial registra muchos eventos relacionados con el funcionamiento interno de la aplicación y es legible para las personas. Puede incluir información personalizada en este archivo utilizando el comando [LOG EVENT](../commands-legacy/log-event.md).
-
-Como iniciar este historial:
-
-```4d
- SET DATABASE PARAMETER(Diagnostic log recording;1) //iniciar registro
-```
-
-Los siguientes campos se registran para cada evento:
-
-| Nombre del campo | Descripción |
-| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
-| sequenceNumber | Número de operación único y secuencial en la sesión de historial |
-| timestamp | Fecha y hora en el formato ISO 8601: (YYYY-MM-DDThh:mm:ss.mmm) |
-| loggerID | Opcional |
-| componentSignature | Opcional - firma del componente interno |
-| messageLevel | Información, avisos, errores |
-| message | Descripción de la entrada del historial |
-
-Dependiendo del evento, se pueden incluir otros campos en el registro, como la tarea, socket, etc.
-
-### Cómo activar el archivo
-
-El archivo *4DDiagnosticLog.txt* puede registrar diferentes niveles de mensajes, desde `ERROR` (más importante) a `TRACE` (menos importante). Por defecto, se define el nivel `INFO`, lo que significa que el archivo registrará sólo los eventos importantes, incluidos los errores y los resultados inesperados (ver más adelante).
-
-Puede seleccionar el nivel de los mensajes utilizando el selector `Diagnostic log level` del comando [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md), en función de sus necesidades. Cuando se selecciona un nivel, los niveles superiores (que son más importantes) también se seleccionan implícitamente. Los siguientes niveles están disponibles:
-
-| Constante | Descripción | Cuando se selecciona, incluye |
-| ----------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
-| `Log error` | Una parte de la aplicación no funciona | `Log error` |
-| `Log warn` | Posible error, uso de una función obsoleta, usos deficientes, situación indeseable o inesperada | `Log error`, `Log warn` |
-| `Log info` | *Nivel por defecto* - Evento de aplicación importante | `Log error`, `Log warn`, `Log info` |
-| `Log debug` | Detalle del flujo de aplicación (para los servicios técnicos 4D) | `Log error`, `Log warn`, `Log info`, `Log debug` |
-| `Log trace` | Otra información interna (para los servicios técnicos de 4D) | `Log error`, `Log warn`, `Log info`, `Log debug`, `Log trace` |
-
-Ejemplo:
-
-```4d
-SET DATABASE PARAMETER (Diagnostic log recording; 1)
-SET DATABASE PARAMETER (Diagnostic log level; Log trace)
-```
-
-## 4DSMTPLog.txt, 4DPOP3Log.txt y 4DIMAPLog.txt
-
-Estos archivos de registro registran cada intercambio entre la aplicación 4D y el servidor de correo (SMTP, POP3, IMAP) que ha sido iniciado por los siguientes comandos:
-
-- SMTP - [SMTP New transporter](../commands/smtp-new-transporter.md)
-- POP3 - [POP3 New transporter](../commands/pop3-new-transporter.md)
-- IMAP - [IMAP New transporter](../commands/imap-new-transporter.md)
-
-Los archivos de historial pueden producirse en dos versiones:
-
-- una versión normal:
- - archivos llamados 4DSMTPLog.txt, 4DPOP3Log.txt, o 4DIMAPLog.txt
- - sin adjuntos
- - utiliza un reciclaje automático de archivos circulares cada 10 MB
- - destinado a la depuración habitual
-
-Para iniciar este historial:
-
-```4d
-SET DATABASE PARAMETER(SMTP Log;1) //inicia SMTP log
-SET DATABASE PARAMETER(POP3 Log;1) //inicia POP3 log
-SET DATABASE PARAMETER(IMAP Log;1) //inicia IMAP log
-```
-
-> 4D Server: clic en el botón **Iniciar los historiales de peticiones y de depuración** en la página [Mantenimiento](ServerWindow/maintenance.md) ode la ventana de administración de 4D Server.
-
-Esta ruta al historial es devuelta por el comando `Get 4D file`.
-
-- una versión extendida:
- - attachment(s) included no automatic recycling
- - nombre personalizado
- - reservado con fines específicos
-
-Para iniciar este historial:
-
- ```4d
- $server:=New object
- ...
- //SMTP
- $server.logFile:="MySMTPAuthLog.txt"
- $transporter:=SMTP New transporter($server)
-
- // POP3
- $server.logFile:="MyPOP3AuthLog.txt"
- $transporter:=POP3 New transporter($server)
-
- //IMAP
- $server.logFile:="MyIMAPAuthLog.txt"
- $transporter:=IMAP New transporter($server)
- ```
-
-#### Contenido
-
-Para cada petición, se registran los siguientes campos:
-
-| Columna # | Descripción |
-| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 1 | Número de operación único y secuencial en la sesión de historial |
-| 2 | Fecha y hora en el formato RFC3339 (yyyy-mm-ddThh:mm:ss.ms) |
-| 3 | ID Proceso 4D |
-| 4 | ID único del proceso |
-| 5 |
Información de inicio de sesión de la sesión SMTP,POP3 o IMAP, incluyendo el nombre del servidor, número de puerto TCP utilizado para conectarse al servidor SMTP,POP3 o IMAP y estado de TLS, o
datos intercambiados entre el servidor y el cliente, empezando por "S <" (datos recibidos del servidor SMTP,POP3 o IMAP) o "C >" (datos enviados por el cliente SMTP,POP3 o IMAP): lista de modos de autenticación enviada por el servidor y modo de autenticación seleccionado, cualquier error notificado por el servidor SMTP,POP3 o IMAP, información del encabezado del correo enviado (sólo versión estándar) y si el correo se guarda en el servidor, o
Información de cierre de sesión SMTP,POP3 o IMAP.
|
-
-## Peticiones ORDA
-
-Los registros de peticiones ORDA pueden registrar cada petición ORDA y la respuesta del servidor. Existen dos registros de peticiones ORDA:
-
-- un registro de peticiones ORDA del lado del cliente, en formato .txt
-- un registro de peticiones ORDA del lado del servidor, en formato .jsonl
-
-### Del lado del cliente
-
-El registro ORDA del lado del cliente registra cada petición ORDA enviada desde una máquina remota. Puede dirigir la información de registro a la memoria o a un archivo .txt en el disco de la máquina remota. El nombre y la ubicación de este archivo de registro son de su elección.
-
-Como iniciar este historial:
-
-```4d
-//en una máquina remota
-SET DATABASE PARAMETER(Client Log Recording;1)
-ds.startRequestLog(File("/PACKAGE/Logs/ordaLog.txt"))
- //también se puede enviar a la memoria
-SET DATABASE PARAMETER(Client Log Recording;0)
-```
-
-:::note
-
-La activación del cliente [4DRequestsLog.txt](#4drequestslogtxt) utilianzdo `SET DATABASE PARAMETER` no es obligatoria. Sin embargo, es necesario si desea registrar el campo `sequenceNumber` único.
-
-:::
-
-Los siguientes campos se registran para cada petición:
-
-| Nombre del campo | Descripción | Ejemplo |
-| ---------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| sequenceNumber | Número de operación único y secuencial en la sesión de historial | 104 |
-| url | Solicitar URL | "rest/Persons(30001)" |
-| startTime | Fecha y hora de inicio en formato ISO 8601 | "2019-05-28T08:25:12.346Z" |
-| endTime | Fecha y hora final en formato ISO 8601 | "2019-05-28T08:25:12.371Z" |
-| duration | Duración del procesamiento del cliente en milisegundos (ms) | 25 |
-| response | Objeto respuesta del servidor | {"status":200,"body":{"__entityModel":"Persons",\[...]}} |
-
-#### Ejemplo
-
-Este es un ejemplo de un registro de archivo de historial ORDA del lado del cliente:
-
-```json
- {
- "sequenceNumber": 7880,
- "url": "rest/Employees/$entityset/F910C2E4A2EE6B43BBEE74A0A4F68E5A/Salary?$compute='sum'&$progress4Dinfo='D0706F1E77D4F24985BE4DDE9FFA1739'",
- "startTime": "2023-05-15T10:43:39.400Z",
- "endTime": "2023-05-15T10:43:39.419Z",
- "duration": 19,
- "response": {
- "status": 200,
- "body": 75651
- }
- }
-```
-
-### Del lado del servidor
-
-El registro ORDA del lado del servidor registra cada petición ORDA procesada por el servidor, así como la respuesta del servidor (opcional). La información de registro se guarda en un archivo .jsonl en el disco de la máquina del servidor (por defecto, *ordaRequests.jsonl*).
-
-Como iniciar este historial:
-
-```4d
-//en el servidor
-SET DATABASE PARAMETER(4D Server log recording;1)
-ds.startRequestLog(File("/PACKAGE/Logs/ordaRequests.jsonl");srl log response without body)
- //srl... el parámetro es opcional
-SET DATABASE PARAMETER(4D Server log recording;0)
-```
-
-:::note
-
-La activación del lado del servidor [4DRequestsLog.txt](#4drequestslogtxt) utilianzdo `SET DATABASE PARAMETER` no es obligatoria. Sin embargo, es necesario si desea registrar los campos exclusivos `sequenceNumber` y `duration`.
-
-:::
-
-Los siguientes campos se registran para cada petición:
-
-| Nombre del campo | Descripción | Ejemplo |
-| ---------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| sequenceNumber | Número de operación único y secuencial en la sesión de historial | 104 |
-| url | Solicitar URL | "rest/Persons(30001)" |
-| startTime | Fecha y hora de inicio en formato ISO 8601 | "2019-05-28T08:25:12.346Z" |
-| duration | Duración del procesamiento del servidor en microsegundos (µ) | 2500 |
-| response | Objeto de respuesta del servidor, se puede configurar en [`.startRequestLog()`](../API/DataStoreClass.md#startrequestlog) | {"status":200,"body":{"__entityModel":"Persons",\[...]}} |
-| ipAddress | Dirección IP del usuario | "192.168.1.5" |
-| userName | Nombre del usuario 4D | "henry" |
-| systemUserName | Nombre de inicio de sesión del usuario en la máquina | "hsmith" |
-| machineName | Nombre de la máquina del usuario | "PC of Henry Smith" |
-
-#### Ejemplo
-
-Este es un ejemplo de un registro ORDA del lado del servidor:
-
-```json
- {
- "url": "rest/Employees/$entityset/F910C2E4A2EE6B43BBEE74A0A4F68E5A/Salary?$compute='sum'&$progress4Dinfo='D0706F1E77D4F24985BE4DDE9FFA1739'",
- "systemUserName": "Admin",
- "userName": "Designer",
- "machineName": "DESKTOP-QSK9738",
- "taskID": 5,
- "taskName": "P_1",
- "startTime": "2023-05-15T11:43:39.401",
- "response": {
- "status": 200,
- "body": 75651
- },
- "sequenceNumber": 7008,
- "duration": 240
- }
-
-```
-
-## 4DTCPLog.txt
-
-Este archivo de registro registra eventos relacionados con conexiones TCP. Los eventos incluyen transmisión de datos, errores e información del ciclo de vida de la conexión. Este registro ayuda a los desarrolladores a monitorear y depurar la actividad de red dentro de sus aplicaciones.
-
-Como iniciar este historial:
-
-- Utilice el comando `SET DATABASE PARAMETER`:
-
- ```4d
- SET DATABASE PARAMETER(TCP log; 1)
- ```
-
-- Cómo activar el archivo
-
- ```json
- {
- "TCPLogs":{
- "state" : 1
- }
- }
- ```
-
-Los siguientes campos se registran para cada evento:
-
-| Nombre del campo | Tipo | Descripción |
-| ---------------- | ---------- | --------------------------------------------------------------------------------------------- |
-| time | Fecha/Hora | Fecha y hora del evento en formato ISO 8601 |
-| localPort | Number | Puerto local usado para la conexión |
-| peerAddress | Text | Dirección IP del peer remoto |
-| peerPort | Number | Puerto del peer remoto |
-| protocol | Text | Indica si el evento está relacionado con `TCP` |
-| evento | Text | El tipo de evento:`open`, `close`, `error`, `send`, `receive`, o `listen` |
-| size | Number | La cantidad de datos enviados o recibidos (en bytes), 0 si no es aplicable |
-| excerpt | Number | Primeros 10 bytes de datos en formato hexadecimal |
-| textExcerpt | Text | Primeros 10 bytes de datos en formato texto |
-| comment | Text | Información adicional sobre el evento, como detalles de error o estado de cifrado |
-
-## Utilización de un archivo de configuración de log
-
-Puede utilizar un **archivo de configuración de log** para gestionar fácilmente el registro de los historiales en un entorno de producción. Este archivo está preconfigurado por el desarrollador. Normalmente, se puede enviar a los clientes para que sólo tengan que seleccionarlo o copiarlo en una carpeta local. Una vez activado, el archivo de configuración de log desencadena el registro de registros específicos.
-
-### Cómo activar el archivo
-
-Hay varias maneras de activar el archivo de configuración de registro, dependiendo de su configuración:
-
-- **4D Server con interfaz**: puede abrir la página de mantenimiento y hacer clic en el botón [Cargar el archivo de configuración de logs](ServerWindow/maintenance.md#load-logs-configuration-file) y luego seleccionar el archivo. En este caso, puede utilizar cualquier nombre para el archivo de configuración. Se activa inmediatamente en el servidor.
-- **un proyecto interpretado o compilado**: el archivo debe llamarse `logConfig.json` y copiarse en la [carpeta de Configuración](../Project/architecture.md#settings-user) del proyecto (situada al mismo nivel que la [carpeta `Proyecto`](../Project/architecture.md#project-folder)). Se activa al iniciar el proyecto (sólo en el servidor en cliente/servidor).
-- **una aplicación construida**: el archivo debe llamarse `logConfig.json` y copiarse en la siguiente carpeta:
- - Windows: `Users\[userName]\AppData\Roaming\[application]`
- - macOS: `/Users/[userName]/Library/ApplicationSupport/[application]`
-- **todos los proyectos con un 4D autónomo o remoto**: el archivo debe llamarse `logConfig.json` y copiarse en la siguiente carpeta:
- - Windows: `Users\[userName]\AppData\Roaming\4D`
- - macOS: `/Users/[userName]/Library/ApplicationSupport/4D`
-- **todos los proyectos con 4D Server**: el archivo debe llamarse `logConfig.json` y copiarse en la siguiente carpeta:
- - Windows: `Users\[userName]\AppData\Roaming\4D Server`
- - macOS: `/Users/[userName]/Library/ApplicationSupport/4D Server`
-
-:::note
-
-Si se instala un archivo `logConfig.json` tanto en la carpeta Settings como en AppData/Library, el archivo de la carpeta Settings tendrá prioridad.
-
-:::
-
-### Descripción del archivo JSON
-
-El archivo de configuración del registro es un archivo `.json` que debe cumplir con el siguiente esquema json:
-
-```json
-{
- "$schema": "http://json-schema.org/draft-07/schema",
- "title": "Logs Configuration File",
- "description": "A file that controls the state of different types of logs in 4D clients and servers",
- "type": "object",
- "properties": {
- "forceConfiguration": {
- "description": "Forcing the logs configuration described in the file ingoring changes coming from code or user interface",
- "type": "boolean",
- "default": true
- },
- "requestLogs": {
- "description": "Configuration for request logs",
- "type": "object",
- "properties": {
- "clientState": {
- "description": "Enable/Disable client request logs (from 0 to N)",
- "type": "integer",
- "minimum": 0
- },
- "serverState": {
- "description": "Enable/Disable server request logs (from 0 to N)",
- "type": "integer",
- "minimum": 0
- }
- }
- },
- "debugLogs": {
- "description": "Configuration for debug logs",
- "type": "object",
- "properties": {
- "commandList": {
- "description": "Commands to log or not log",
- "type": "array",
- "items": {
- "type": "string"
- },
- "minItems": 1,
- "uniqueItems": true
- },
- "state": {
- "description": "integer to specify type of debuglog and options",
-
- "type": "integer",
- "minimum": 0
- }
- }
- },
- "diagnosticLogs":{
- "description": "Configuration for debug logs",
- "type": "object",
- "properties": {
- "state":{
- "description": "Enable/Disable diagnostic logs 0 or 1 (0 = do not record, 1 = record)",
- "type": "integer",
- "minimum": 0
- },
- "level": {
- "description": "Configure diagnostic logs",
- "type": "integer",
- "minimum": 2,
- "maximum": 6
- }
- }
- },
- "httpDebugLogs": {
- "description": "Configuration for http debug logs",
- "type": "object",
- "properties": {
- "level": {
- "description": "Configure http request logs",
- "type": "integer",
- "minimum": 0,
- "maximum": 7
- },
- "state": {
- "description": "Enable/Disable recording of web requests",
- "type": "integer",
- "minimum": 0,
- "maximum": 4
- }
- }
- },
- "HTTPClientLogs": {
- "description": "Configuration for http client logs",
- "type": "object",
- "properties": {
- "state": {
- "description": "Configure http client logs",
- "type": "integer",
- "minimum": 0,
- "maximum": 7
- },
- }
- },
- "POP3Logs": {
- "description": "Configuration for POP3 logs",
- "type": "object",
- "properties": {
- "state": {
- "description": "Enable/Disable POP3 logs (from 0 to N)",
- "type": "integer",
- "minimum": 0
- }
- }
- },
- "SMTPLogs": {
- "description": "Configuration for SMTP logs",
- "type": "object",
- "properties": {
- "state": {
- "description": "Enable/Disable SMTP log recording (from 0 to N)",
- "type": "integer",
- "minimum": 0
- }
- }
- },
- "IMAPLogs": {
- "description": "Configuration for IMAP logs",
- "type": "object",
- "properties": {
- "state": {
- "description": "Enable/Disable IMAP log recording (from 0 to N)",
- "type": "integer"
- }
- }
- },
- "ORDALogs": {
- "description": "Configuration for ORDA logs",
- "type": "object",
- "properties": {
- "state": {
- "description": "Enable/Disable ORDA logs (0 or 1)",
- "type": "integer"
- },
- "filename": {
- "type": "string"
- }
- }
- }
- }
-}
-```
-
-:::note
-
-- The "state" property values are described in the corresponding commands: `[`WEB SET OPTION`](../commands-legacy/web-set-option.md) (`Web log recording`), [`HTTP SET OPTION`](../commands-legacy/http-set-option.md) (`HTTP client log`), [`SET DATABASE PARAMETER`](../commands-legacy/set-database-parameter.md) (`Client Web log recording`, `IMAP Log\\\\\\\`,...).
-- Para httpDebugLogs, la propiedad "level" corresponde a las opciones constantes `wdl` descritas en el comando [`WEB SET OPTION`](../commands-legacy/web-set-option.md).
-- Para diagnosticLogs, la propiedad "level" corresponde a los valores constantes de `Diagnostic log level` descritos en el comando [`SET DATABASE PARAMETER`](../commands-legacy/set-database-parameter.md).
-
-:::
-
-### Ejemplo
-
-Este es un ejemplo de archivo de configuración de log:
-
-```json
-{
- "forceLoggingConfiguration": false,
- "requestLogs": {
- "clientState": 1,
- "serverState": 1
- },
- "debugLogs": {
- "commandList":["322","311","112"],
- "state": 4
- },
- "diagnosticLogs":{
- "state" : 1
- },
- "httpDebugLogs": {
- "level": 5,
- "state" : 1
- },
- "POP3Logs": {
- "state" : 1
- },
- "SMTPLogs": {
- "state" : 1
- },
- "IMAPLogs": {
- "state" : 1
-
- },
- "ORDALogs": {
- "state" : 1,
- "filename": "ORDALog.txt"
- }
-}
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/building.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/building.md
deleted file mode 100644
index a895606cf792b1..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/building.md
+++ /dev/null
@@ -1,787 +0,0 @@
----
-id: building
-title: Generador de aplicaciones
----
-
-4D incluye un generador de aplicaciones para crear un paquete de proyecto (versión final). Este generador simplifica el proceso de finalización y despliegue de las aplicaciones compiladas en 4D. Maneja automáticamente las funcionalidades específicas de los distintos sistemas operativos y facilita el despliegue de aplicaciones cliente-servidor.
-
-El generador de aplicaciones le permite:
-
-- Crear una estructura o componente compilado, sin código interpretado,
-- Generar una aplicación autónoma ejecutable, *es decir*, fusionada con 4D Volume Desktop, el motor de base de datos 4D,
-- Generar diferentes aplicaciones a partir de la misma estructura compilada mediante un proyecto XML,
-- Generar aplicaciones cliente-servidor homogéneas,
-- Generar aplicaciones cliente-servidor con actualización automática de los componentes del cliente y del servidor.
-- Guardar sus parámetros de generación para su uso futuro (botón *Guardar los parámetros*).
-
-> Las aplicaciones compiladas se basan en archivos [.4dz](#build-compiled-structure) que son **de sólo lectura**. Tenga en cuenta que el uso de comandos o funciones que modifican los archivos fuente (como `CREATE INDEX` o `CREATE TABLE` (SQL)) no es posible por defecto en las aplicaciones compiladas. Sin embargo, puede crear aplicaciones específicas que soporten modificaciones locales utilizando la llave XML `PackProject` (ver [doc.4d.com](https://doc.4d.com)).
-
-## Generalidades
-
-Generar un paquete de proyecto puede realizarse utilizando:
-
-- ya sea con el comando [`BUILD APPLICATION`](../commands-legacy/build-application.md),
-- o en la [caja de diálogo Crear aplicación](#build-application-dialog).
-
-:::tip
-
-También puede descargar y utilizar [`Build4D`](https://github.com/4d-depot/Build4D), un componente que ofrece clases para compilar, crear y firmar proyectos 4D, incluso desde una aplicación sin interfaz.
-
-:::
-
-### Diálogo crear aplicación
-
-Para mostrar la caja de diálogo Generar la aplicación, seleccione **Diseño** > **Generar aplicación...** en la barra de menús.
-
-
-
-La caja de diálogo del generador de aplicaciones incluye varias páginas a las que se puede acceder mediante pestañas:
-
-
-
-La generación sólo puede efectuarse una vez compilado el proyecto. Si selecciona este comando sin haber compilado previamente el proyecto, o si el código compilado no se corresponde con el código interpretado, aparece una caja de diálogo de advertencia que indica que el proyecto debe ser (re)compilado.
-
-### buildApp.4DSettings
-
-Cada parámetro de generación de la aplicación se almacena como una llave XML en el archivo de proyecto de la aplicación llamado `buildApp.4DSettings`, ubicado en la carpeta [`Settings` del proyecto](../Project/architecture.md#settings-user).
-
-Los parámetros por defecto se utilizan la primera vez que se utiliza la caja de diálogo del Generador de aplicaciones. El contenido del archivo proyecto se actualiza, si es necesario, al hacer clic en **Construir** o **Guardar los parámetros**. Puede definir varios archivos de parámetros XML para el mismo proyecto y utilizarlos con el comando [`BUILD APPLICATION`](../commands-legacy/build-application.md).
-
-Las llaves XML ofrecen opciones adicionales a las que se muestran en la caja de diálogo del Generador de aplicaciones. La descripción de estas llaves se detalla en el manual [4D XML Keys BuildApplication](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html).
-
-### Archivo de historial
-
-Cuando se crea una aplicación, 4D genera un archivo de registro llamado *BuildApp.log.xml* en la carpeta **Logs** del proyecto. El archivo de historial almacena la siguiente información para cada generación:
-
-- El inicio y el fin de la generación de objetivos,
-- El nombre y la ruta de acceso completa de los archivos generados,
-- La fecha y la hora de la generación,
-- Todos los errores que se han producido,
-- Todo problema de firma (por ejemplo, un plug-in no firmado).
-
-La comprobación de este archivo puede ayudarle a ahorrar tiempo durante los siguientes pasos de despliegue, por ejemplo si tiene intención de [notarizar](#about-notarization) su aplicación en macOS.
-
-> Utilice la sentencia `Get 4D file(Build application log file)` para obtener la ubicación del archivo de registro.
-
-## Nombre de la aplicación y carpeta de destino
-
-
-
-Introduzca el nombre de la aplicación en **Nombre de la aplicación**.
-
-Especifique la carpeta para la aplicación generada en la **Carpeta de destino**. Si la carpeta especificada no existe todavía, 4D creará una carpeta *Build*.
-
-## Página de estructura compilada
-
-Esta pestaña le permite generar un archivo de estructura compilado estándar y/o un componente compilado:
-
-
-
-### Generar una estructura compilada
-
-Genera una aplicación que sólo contiene código compilado.
-
-Esta funcionalidad crea un archivo *.4dz* en una carpeta `Compiled Database/`. Por ejemplo, si ha llamado a su aplicación "MyProject", 4D creará:
-
-`/Compiled Database/MyProject/MyProject.4dz`
-
-Un archivo .4dz es esencialmente una versión comprimida (empaquetada) de la carpeta del proyecto. Un archivo .4dz es esencialmente una versión comprimida (empaquetada) de la carpeta del proyecto. El tamaño compacto y optimizado de los archivos .4dz hace que los paquetes de proyectos sean fáciles de desplegar.
-
-> Al generar archivos .4dz, 4D utiliza por defecto un formato zip **estándar**. La ventaja de este formato es que es fácilmente legible por cualquier herramienta unzip. Si no quiere utilizar este formato estándar, añada la llave XML `UseStandardZipFormat` con valor `False` en su archivo [`buildApp.4DSettings`](#buildapp4dsettings) (para más información, vea el manual [4D XML Keys BuildApplication](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html)).
-
-#### Incluir las carpetas asociadas
-
-Cuando se marca esta opción, todas las carpetas relacionadas con el proyecto se copian en la carpeta Build como carpetas *Components* y *Resources*. Para más información sobre estas carpetas, consulte la [descripción de la arquitectura del proyecto](Project/architecture.md).
-
-### Generar un componente
-
-Genera un componente compilado a partir de la estructura.
-
-Un [componente](../Extensions/develop-components.md) es un proyecto estándar 4D en el que se han desarrollado funcionalidades específicas. Una vez configurado e [instalado en otro proyecto 4D](../Project/components.md) (el proyecto de la aplicación local), sus funcionalidades son accesibles desde el proyecto local.
-
-Si ha llamado a su aplicación *MyComponent*, 4D creará automáticamente una carpeta *Components* con la siguiente estructura:
-
-`/Components/MyComponent.4dbase/Contents/`.
-
-The *MyComponent.4dbase* folder is the [package folder of the compiled component](../Project/components.md#package-folder).
-
-The *Contents* folder contains:
-
-- *MyComponent.4DZ* file - the [compiled structure](#build-compiled-structure).
-- Una carpeta *Resources*: todos los resources asociados se copian automáticamente en esta carpeta. Los otros componentes y/o carpetas de plugins no se copian (un componente no puede utilizar plugins u otros componentes).
-- An *Info.plist* file - this file is required to build [notarizeable and stapleable](#about-notarization) components for macOS (it is ignored on Windows). Si un archivo *Info.plist* ya existe [en la raíz del componente](../Extensions/develop-components.md#infoplist) está fusionado, de lo contrario se crea un archivo por defecto. Las siguientes [llaves de Apple bundle](https://developer.apple.com/documentation/bundleresources/information-property-list) están prellenadas:
- - `CFBundleDisplayName` y `CFBundleName` para el nombre de la aplicación,
- - `NSHumanReadableCopyright`, puede ser [definido usando una llave XML](https://doc.4d.com/4Dv20/4D/20/CommonCopyright.300-6335859.en.html).
- - `CFBundleShortVersionString` y `CFBundleVersion` para la versión de la aplicación (x.x.x, p. ej., 1.0.5), puede ser [definido usando una llave XML](https://doc.4d.com/4Dv20/4D/20/CommonVersion.300-6335858.en.html).
-
-## Página Application
-
-Esta pestaña le permite crear una versión autónoma y monopuesto de su aplicación:
-
-
-
-### Crear una aplicación autónoma
-
-Al marcar la opción **Crear una aplicación autónoma** y hacer clic en **Generar** se creará una aplicación autónoma (con doble clic) directamente desde su proyecto de aplicación. En Windows, esta función crea un archivo ejecutable (.exe). En macOS, se encarga de la creación de paquetes de software.
-
-Las funcionalidades ofrecidas por el archivo 4D Volume Desktop están relacionadas con la oferta de productos a la que se ha suscrito. Las funcionalidades ofrecidas por el archivo 4D Volume Desktop están relacionadas con la oferta de productos a la que se ha suscrito. Para más información sobre este punto, consulte la documentación de ventas y el [4D Store](http://www.4d.com/).
-
-- Puede definir un archivo de datos predeterminado o permitir a los usuarios [crear y utilizar su propio archivo de datos](#management-of-data-files).
-- Puede integrar una licencia de despliegue o dejar que el usuario final introduzca su licencia en el primer inicio de la aplicación (consulte la sección [\*\*Licencias de despliegue \*\*](../Admin/licenses.md#deployment-licenses)).
-
-:::note
-
-Es posible [automatizar la actualización de aplicaciones fusionadas de un solo usuario](#automatic-updating-of-server-or-single-user-applications) mediante una secuencia de comandos de lenguaje.
-
-:::
-
-### Ubicación de 4D Volume Desktop
-
-Para crear una aplicación autónoma, primero debe designar la carpeta que contiene el archivo 4D Volume Desktop:
-
-- *Windows* - la carpeta contiene los archivos 4D Volume Desktop.4DE, 4D Volume Desktop. RSR, así como varios archivos y carpetas necesarios para su funcionamiento. Estos elementos deben colocarse al mismo nivel que la carpeta seleccionada.
-- *macOS* - 4D Volume Desktop se entrega en forma de un paquete de software estructurado que contiene varios archivos y carpetas genéricos.
-
-Para seleccionar la carpeta 4D Volume Desktop, haga clic en el botón **[...]**. Aparece una caja de diálogo que le permite designar la carpeta de 4D Volume Desktop (Windows) o el paquete (macOS).
-
-Una vez seleccionada la carpeta, se muestra su ruta completa y, si realmente contiene 4D Volume Desktop, se activa la opción de generación de una aplicación ejecutable.
-
-> El número de versión de 4D Volume Desktop debe coincidir con el número de versión de 4D Developer Edition. Por ejemplo, si utiliza 4D 20, debe seleccionar un 4D Volume Desktop 20.
-
-### Modo de enlace de datos
-
-Esta opción permite elegir el modo de enlace entre la aplicación fusionada y el archivo de datos local. Hay dos modos de enlazar disponibles:
-
-- **Por nombre de la aplicación** (por defecto) - La aplicación 4D abre automáticamente el archivo de datos abierto más recientemente correspondiente al archivo de estructura. Esto le permite mover el paquete de aplicaciones libremente en el disco. Esta opción debería usarse generalmente para aplicaciones fusionadas, a menos que necesite específicamente duplicar su aplicación.
-
-- **Por ruta de la aplicación** - La aplicación 4D fusionada analizará el archivo *lastDataPath.xml* de la aplicación e intentará abrir el archivo de datos con un atributo "executablePath" que coincida con la ruta completa de la aplicación. Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath"). Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath").
-
-Para más información sobre el modo de vinculación de datos, consulte la sección [Último archivo de datos abierto](#last-data-file-opened).
-
-### Archivos generados
-
-Al hacer clic en el botón **Generar**, 4D crea automáticamente una carpeta **Final Application** en la **carpeta de destino** definida. Dentro de la carpeta Final Application hay una subcarpeta con el nombre de la aplicación especificada.
-
-Si ha especificado "MyProject" como nombre de la aplicación, encontrará los siguientes archivos en esta subcarpeta (MyProject):
-
-- *Windows*
- - MyProject.exe - Su ejecutable y un MyProject.rsr (los recursos de la aplicación)
- - Las carpetas 4D Extensions y Resources, varias librerías (DLL), la carpeta Native Components y SASL Plugins - Archivos necesarios para el funcionamiento de la aplicación
- - Una carpeta Database - Incluye una carpeta Resources y un archivo MyProject.4DZ. Constituyen la estructura compilada del proyecto, así como también la carpeta Resources.
- **Nota**: esta carpeta también contiene la carpeta *Default Data*, si se ha definido (ver [Gestión de archivos de datos en las aplicaciones finales](#management-of-data-files).
- - (Opcional) Carpeta de componentes y/o carpeta Plugins - Contiene todos los componentes y/o archivos de plugins incluidos en el proyecto. Para más información sobre este punto, consulte la sección [Plugins y componentes](#plugins--components-page).
- - (Opcional) Carpeta Licencias - Un archivo XML con los números de licencia integrados en la aplicación, si los hubiera. Para obtener más información sobre este punto, consulte la sección [Licencias y certificados](#licenses--certificate-page).
- - Elementos adicionales añadidos a la carpeta 4D Volume Desktop, si los hay (ver [Personalizar la carpeta 4D Volume Desktop](#customizing-4d-volume-desktop-folder)).
-
-Todos estos elementos deben estar en la misma carpeta para que el ejecutable funcione.
-
-- *macOS*
- - Un paquete de software llamado MyProject.app que contiene su aplicación y todos los elementos necesarios para su funcionamiento, incluyendo los plug-ins, componentes y licencias. Para más información sobre la integración de plug-ins y componentes, consulte la sección [Plugins y componentes](#plugins--components-page). Para obtener más información sobre la integración de licencias, consulte la sección [Licencias y certificados](#licenses--certificate-page). **Nota**: en macOS, el comando [Application file](../commands-legacy/application-file.md) del lenguaje 4D devuelve la ruta del archivo ApplicationName (ubicado en la carpeta Contents:macOS del paquete de software) y no la del archivo .comp (carpeta Contents:Resources del paquete de software).
-
-#### Personalizar la carpeta 4D Volume Desktop
-
-Cuando se construye una aplicación independiente, 4D copia el contenido de la carpeta 4D Volume Desktop en la carpeta Destination > *Final Application*. A continuación, podrá personalizar el contenido de la carpeta 4D Volume Desktop original según sus necesidades. Puede, por ejemplo:
-
-- Instalar una versión de 4D Volume Desktop correspondiente a un lenguaje específico;
-- Añadir una carpeta *Plugins* personalizada;
-- Personalizar el contenido de la carpeta *Resources*.
-
-> En macOS, 4D Volume Desktop se ofrece en forma de paquete de software. Para modificarlo, primero debe visualizar su contenido (**Control+clic** en el icono).
-
-#### Ubicación de los archivos web
-
-Si su aplicación ejecutable se utiliza como servidor web, los archivos y los archivos y carpetas requeridos por el servidor deben instalarse en ubicaciones específicas. Estos elementos son los siguientes:
-
-- archivos *cert.pem* y *key.pem* (opcional): etos archivos se utilizan para las conexiones TLS y por los comandos de encriptación de datos,
-- carpeta raíz web por defecto.
-
-Los elementos deben ser instalados:
-
-- **En Windows**: en la subcarpeta *Final Application\MyProject\Database*.
-- **En macOS**: junto al paquete de software *MyProject.app*.
-
-## Página Cliente/Servidor
-
-En esta pestaña, usted puede construir aplicaciones cliente y servidor personalizadas que son homogénicas, multiplataforma y con una opción de actualización automática.
-
-
-
-### ¿Qué es una aplicación cliente/servidor?
-
-Una aplicación cliente/servidor proviene de la combinación de tres elementos:
-
-- Un proyecto 4D compilado,
-- La aplicación 4D Server,
-- La aplicación 4D Volumen Desktop (macOS y/o Windows).
-
-Una vez generada, una aplicación cliente/servidor se compone de dos partes personalizadas: la parte Servidor (única) y la parte Cliente (a instalar en cada máquina cliente).
-
-> Si desea desplegar una aplicación cliente/servidor en un entorno heterogéneo (aplicaciones cliente ejecutándose en máquinas Intel/AMD y Apple Silicon), se recomienda [compilar el proyecto para todos los procesadores](Project/compiler.md#compilation-target) en una máquina macOS, para que todas las aplicaciones clientes funcionen de forma nativa.
-
-Además, se personaliza la aplicación cliente/servidor y se simplifica su manejo:
-
-- Para lanzar la parte del servidor, el usuario simplemente hace doble clic en la aplicación servidor. No es necesario seleccionar el archivo proyecto.
-- Para lanzar la parte cliente, el usuario simplemente hace doble clic en la aplicación cliente, que se conecta directamente a la aplicación servidor. No es necesario elegir un servidor en una caja de diálogo de conexión. Si desea que la aplicación cliente se conecte al servidor utilizando una dirección específica (distinta del nombre del servidor publicado en la subred), debe utilizar la llave XML `IPAddress` en el archivo buildapp.4DSettings. Si la conexión falla, [se pueden implementar mecanismos alternativos específicos](#management-of-client-connections). Puede "forzar" la visualización de la caja de diálogo de conexión estándar presionando la tecla **Opción** (macOS) o **Alt** (Windows) mientras inicia la aplicación cliente.
- Sólo la parte cliente puede conectarse a la parte del servidor correspondiente. Si un usuario intenta conectarse a la parte servidor utilizando una aplicación estándar 4D, se devuelve un mensaje de error y la conexión es imposible.
-- Una aplicación cliente/servidor puede configurarse para que la parte cliente [se actualice automáticamente a través de la red](#copy-of-client-applications-inside-the-server-application). Sólo es necesario crear y distribuir una versión inicial de la aplicación cliente, las actualizaciones posteriores se gestionan mediante el mecanismo de actualización automática.
-- También es posible automatizar la actualización de la parte del servidor a través del uso de una secuencia de comandos de lenguaje ([SET UPDATE FOLDER](../commands-legacy/set-update-folder.md) y [RESTART 4D](../commands-legacy/restart-4d.md).
-
-:::note
-
-Si quiere que las conexiones cliente/servidor se realicen en [TLS](../Admin/tls.md), solo tiene que marcar la [configuración apropiada](../settings/client-server.md#encrypt-client-server-communications). Si desea utilizar un certificado personalizado, por favor considere usar los [`CertificateAuthoritiesCertificates`](https://doc.4d.com/4Dv20R8/4D/20-R8/CertificateAuthoritiesCertificates.300-7479862.en.html).
-
-:::
-
-### Construir aplicación servidor
-
-Marque esta opción para generar la parte del servidor de su aplicación durante la fase de construcción. Debe designar la ubicación en su disco de la aplicación 4D Server que va a utilizar. Debe designar la ubicación en su disco de la aplicación 4D Server que va a utilizar.
-
-#### Ubicación de 4D Server
-
-Haga clic en el botón **[...]** y utilice la caja de diálogo *Navegar carpeta* para localizar la aplicación 4D Server. En macOS, debe seleccionar directamente el paquete 4D Server.
-
-#### Versión actual
-
-Se utiliza para indicar el número de versión actual de la aplicación generada. A continuación, podrá aceptar o rechazar las conexiones de las aplicaciones cliente en función de su número de versión. El intervalo de compatibilidad para las aplicaciones cliente y servidor se define mediante el uso de [llaves XML](#buildapp4dsettings) específicas).
-
-#### Integrar el proyecto Usuarios y Grupos en la aplicación servidor creada
-
-**Nota preliminar:** en esta sección se utilizan los siguientes términos:
-
-| Nombre | Definición |
-| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| Archivo de directorio del proyecto | archivo [directory.json](../Users/handling_users_groups.md#directoryjson-file) ubicado en la [carpeta Settings](../Project/architecture.md#settings-user) del proyecto |
-| Archivo de directorio de la aplicación | archivo [directory.json](../Users/handling_users_groups.md#directoryjson-file) ubicado en la [carpeta Settings](../Project/architecture.md#settings-user) del servidor 4D creado |
-| Archivo de directorio de datos | archivo [directory.json](../Users/handling_users_groups.md#directoryjson-file) en la carpeta [Data > Settings](../Project/architecture.md#settings-user-data) |
-
-Cuando se marca esta opción, el archivo del directorio del proyecto se copia en el archivo del directorio de la aplicación en el momento de la generación.
-
-Cuando ejecute una aplicación 4D Server generada:
-
-- Si el servidor tiene un archivo de directorio de datos, se carga.
-- Si el servidor no tiene un archivo de directorio de datos, se carga el archivo de directorio de la aplicación.
-
-El archivo de directorio de la aplicación es de sólo lectura. Las modificaciones realizadas a los usuarios, grupos y permisos durante la ejecución del servidor se almacenan en el archivo del directorio de datos. Si ya no existe ningún archivo de directorio de datos, se creará automáticamente. Si el archivo del directorio de la aplicación estaba integrado, se duplica como archivo del directorio de datos.
-
-La incorporación del archivo del directorio del proyecto le permite desplegar una aplicación cliente/servidor con una configuración básica de la seguridad de los usuarios y de los grupos. Las modificaciones posteriores se añaden al archivo del directorio de datos.
-
-#### Autorizar la conexión de los clientes Silicon Mac
-
-Cuando se cree un servidor en Windows, marque esta opción para permitir que los clientes Apple Silicon se conecten a su aplicación servidor. A continuación, puede especificar una ruta de acceso a la estructura compilada para Apple Silicon/Intel.
-
-Para permitir a los clientes Apple Silicon conectarse a una aplicación servidor creada en Windows, primero debe crear una aplicación cliente en macOS, con un proyecto compilado para Apple Silicon e Intel. Esto crea automáticamente una estructura compilada, idéntica a la creada con la opción **[Build compiled structure](#build-compiled-structure)** (sin las carpetas asociadas).
-
-A continuación, puede copiar esa estructura en su máquina Windows y utilizarla para construir la aplicación servidor:
-
-
-
-#### Ubicación de la estructura compilada
-
-Ruta de acceso a la estructura compilada de la aplicación cliente Apple Silicon/Intel utilizada para crear un servidor Windows (ver [Permitir la conexión de clientes Silicon Mac](#allow-connection-of-silicon-mac-clients)).
-
-#### Modo de enlace de datos
-
-Esta opción permite elegir el modo de enlace entre la aplicación fusionada y el archivo de datos local. Hay dos modos de enlazar disponibles:
-
-- **Por nombre de la aplicación** (por defecto) - La aplicación 4D abre automáticamente el archivo de datos abierto más recientemente correspondiente al archivo de estructura. Esto le permite mover el paquete de aplicaciones libremente en el disco. Esta opción debería usarse generalmente para aplicaciones fusionadas, a menos que necesite específicamente duplicar su aplicación.
-
-- **Por ruta de la aplicación** - La aplicación 4D fusionada analizará el archivo *lastDataPath.xml* de la aplicación e intentará abrir el archivo de datos con un atributo "executablePath" que coincida con la ruta completa de la aplicación. Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath"). Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath").
-
-Para más información sobre el modo de vinculación de datos, consulte la sección [Último archivo de datos abierto](#last-data-file-opened).
-
-### Crear aplicación cliente
-
-Marque esta opción para generar la parte cliente de su aplicación durante la fase de construcción.
-
-Puede marcar esta opción:
-
-- junto con la opción [**Crear aplicación servidor**](#build-server-application) para crear las partes servidor y cliente correspondientes para la plataforma actual y (opcionalmente) incluir los archivos de actualización automática,
-- sin seleccionar la opción de [**Crear aplicación servidor**](#build-server-application), generalmente para construir el archivo de actualización que se seleccionará de la plataforma "concurrente" al crear la parte del servidor.
-
-#### Ubicación de 4D Volume Desktop
-
-Designa la ubicación en su disco de la aplicación 4D Volume Desktop que se utilizará para construir la parte cliente de su aplicación.
-
-> El número de versión de 4D Volume Desktop debe coincidir con el número de versión de 4D Developer Edition. Por ejemplo, si utiliza 4D 20, debe seleccionar un 4D Volume Desktop 20.
-
-El 4D Volume Desktop debe corresponder a la plataforma actual (que será también la plataforma de la aplicación cliente). Si desea generar una aplicación cliente para la plataforma "concurrente", debe realizar una operación adicional utilizando una aplicación 4D que se ejecute en dicha plataforma.
-
-Si desea que la aplicación cliente se conecte al servidor utilizando una dirección específica (distinta del nombre del servidor publicado en la subred), debe utilizar la llave XML `IPAddress` en el archivo buildapp.4DSettings. También puede implementar mecanismos específicos en caso de fallo de la conexión. También puede implementar mecanismos específicos en caso de fallo de la conexión. También puede implementar mecanismos específicos en caso de fallo de la conexión.
-
-#### Copia de las aplicaciones clientes en la aplicación servidor
-
-Las opciones de esta área configuran el mecanismo para actualizar la(s) parte(s) cliente de sus aplicaciones cliente/servidor utilizando la red cada vez que se genera una nueva versión de la aplicación. Estas opciones sólo se activan cuando la opción **Crear aplicación cliente** está marcada.
-
-- **Permitir la actualización automática de la aplicación cliente Windows** - Marque esta opción para construir un archivo `.4darchive` que puede ser enviado a sus aplicaciones cliente en la plataforma Windows en caso de actualización.
-- **Permitir la actualización automática de la aplicación cliente Macintosh** - Marque esta opción para construir un archivo `.4darchive` que puede ser enviado a sus aplicaciones cliente en la plataforma Macintosh en caso de actualización.
-
-El archivo `.4darchive` se copia en la siguiente ubicación:
-
-```
-_Build/Client Server executable/Upgrade4DClient/
-```
-
-#### Seleccionar el archivo cliente para la plataforma concurrente
-
-Puede marcar la opción **Permitir la actualización automática...** para las aplicaciones clientes ejecutadas en la plataforma concurrente. Esta opción sólo se activa si:
-
-- la opción **Crear aplicación servidor** está marcada,
-- la opción **Permitir la actualización automática...** para las aplicaciones clientes ejecutadas en la plataforma actual está marcada.
-
-Esta funcionalidad requiere que haga clic en el botón **[...]** y designe la ubicación en su disco del archivo que se utilizará para la actualización. El archivo a seleccionar depende de la plataforma actual del servidor:
-
-| Plataforma del servidor actual | Archivo requerido | Detalles |
-| ------------------------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| macOS | Windows 4D Volume Desktop *o* Windows client update archive | Por defecto, se selecciona la aplicación `4D Volume Desktop` para Windows. Para seleccionar un archivo `.4darchive` previamente construido en Windows, presione **Shift** mientras hace clic en [...] |
-| Windows | macOS client update archive | Seleccione un archivo `.4darchive` firmado previamente creado en macOS |
-
-Puede crear un archivo `.4darchive` específico en la plataforma concurrente seleccionando únicamente la opción [**Crear aplicación cliente**](#build-client-application) y la opción apropiada [**Permitir actualización automática...**](#copy-of-client-applications-inside-the-server-application).
-
-#### Visualización de la notificación de actualización
-
-La notificación de actualización de la aplicación cliente se realiza automáticamente tras la actualización de la aplicación servidor.
-
-Funciona de la siguiente manera: cuando se genera una nueva versión de la aplicación cliente/servidor utilizando el generador de aplicaciones, la nueva parte cliente se copia como un archivo comprimido en la subcarpeta **Upgrade4DClient** de la carpeta **ApplicationName** Server (en macOS, estas carpetas se incluyen en el paquete servidor). Si ha seguido el proceso de generación de una aplicación cliente multiplataforma, un archivo de actualización .*4darchive* está disponible para cada plataforma:
-
-Para activar las notificaciones de actualización de la aplicación cliente, basta con sustituir la versión antigua de la aplicación servidor por la nueva y ejecutarla. El resto del proceso es automático.
-
-Del lado del cliente, cuando la aplicación cliente "antigua" intenta conectarse a la aplicación servidor actualizada, se muestra una caja de diálogo en la máquina cliente, indicando que hay nueva versión disponible. El usuario puede actualizar su versión o cancelar la caja de diálogo.
-
-- Si el usuario hace clic en **OK**, la nueva versión se descarga en el equipo cliente a través de la red. Una vez finalizada la descarga, se cierra la aplicación cliente antigua y se lanza la nueva versión, que se conecta al servidor. Una vez finalizada la descarga, se cierra la aplicación cliente antigua y se lanza la nueva versión, que se conecta al servidor.
-- Si el usuario hace clic en **Cancelar**, la actualización se cancela; si la versión antigua de la aplicación cliente no está en el rango de versiones aceptadas por el servidor (consulte el siguiente párrafo), la aplicación se cierra y la conexión es impos En caso contrario (por defecto), se establece la conexión. En caso contrario (por defecto), se establece la conexión.
-
-#### Forzar las actualizaciones automáticas
-
-En algunos casos, es posible que desee evitar que las aplicaciones cliente puedan cancelar la descarga de la actualización. Por ejemplo, si ha utilizado una nueva versión de la aplicación fuente de 4D Server, la nueva versión de la aplicación cliente debe estar instalada en cada máquina cliente.
-
-Para forzar la actualización, basta con excluir el número de versión actual de las aplicaciones cliente (X-1 y anteriores) en el rango de número de versión compatible con la aplicación servidor. En este caso, el mecanismo de actualización no permitirá que las aplicaciones cliente no actualizadas se conecten. En este caso, el mecanismo de actualización no permitirá que las aplicaciones cliente no actualizadas se conecten.
-
-El [número de versión actual](#current-version) se define en la página Cliente/Servidor del generador de la aplicación. Los intervalos de los números autorizados se definen en el proyecto de la aplicación vía las [llaves XML](#buildapp4dsettings) específicas.
-
-#### En caso de error
-
-Si 4D no puede llevar a cabo la actualización de la aplicación cliente, la máquina cliente muestra el siguiente mensaje de error: La aplicación va a cerrar ahora."
-
-Hay muchas causas posibles para este error. Cuando reciba este mensaje, es aconsejable que compruebe primero los siguientes parámetros:
-
-- **Nombres de ruta**: compruebe la validez de los nombres de ruta definidos en el proyecto de la aplicación a través del diálogo del Generador de aplicaciones o mediante las llaves XML (por ejemplo, *ClientMacFolderToWin*). Más concretamente, compruebe los nombres de ruta de las versiones de 4D Volume Desktop.
-- **Privilegios lectura/escritura**: en la máquina cliente, compruebe que el usuario actual tiene derechos de acceso de escritura para la actualización de la aplicación cliente.
-
-### Archivos generados
-
-Una vez creada la aplicación cliente/servidor, encontrará una nueva carpeta en la carpeta de destino llamada **Client Server executable**. Esta carpeta contiene dos subcarpetas, `Client` y `Server`.
-
-> Estas carpetas no se generan si ocurre un error. En este caso, abra el [archivo de historial](#log-file) para conocer la causa del error.
-
-La carpeta `Client` contiene la parte cliente de la aplicación correspondiente a la plataforma de ejecución del generador de aplicaciones. Esta carpeta debe instalarse en cada máquina cliente. La carpeta `Server` contiene la parte del servidor de la aplicación.
-
-El contenido de estas carpetas varía en función de la plataforma actual:
-
-- *Windows* - Cada carpeta contiene el archivo ejecutable de la aplicación, denominado `Client.exe` para la parte cliente y `Server.exe` para la parte servidor, así como los archivos .rsr correspondientes. Las carpetas también contienen varios archivos y carpetas necesarios para que las aplicaciones funcionen y elementos personalizados que pueden estar en las carpetas originales de 4D Volume Desktop y 4D Server.
-- *macOS* - Cada carpeta contiene únicamente el paquete de la aplicación, denominado `Client` para la parte cliente y `Server` para la parte servidor. Cada paquete contiene todos los elementos necesarios para que la aplicación funcione. En macOS, un paquete se lanza haciendo doble clic en él.
-
-> Los paquetes macOS generados contienen los mismos elementos que las subcarpetas Windows. Puede visualizar su contenido (**Control+clic** en el icono) para poder modificarlo.
-
-Si ha marcado la opción "Permitir la actualización automática de la aplicación cliente", se añade una subcarpeta adicional llamada *Upgrade4DClient* en la carpeta/paquete `Server`. Esta subcarpeta contiene la aplicación cliente en formato macOS y/o Windows como archivo comprimido. Esta subcarpeta contiene la aplicación cliente en formato macOS y/o Windows como archivo comprimido.
-
-#### Ubicación de los archivos web
-
-Si la parte servidor y/o la del cliente de su aplicación ejecutable se utiliza como servidor web, los archivos y carpetas requeridos por el servidor deben instalarse en ubicaciones específicas. Estos elementos son los siguientes:
-
-- archivos *cert.pem* y *key.pem* (opcional): etos archivos se utilizan para las conexiones TLS y por los comandos de encriptación de datos,
-- Carpeta raíz web por defecto (WebFolder).
-
-Los elementos deben ser instalados:
-
-- **en Windows**
- - **Aplicación del servidor** - en la subcarpeta `Client Server executable/Server/Server Database`.
- - **Aplicación cliente** - en la subcarpeta `Client Server executable/Client`.
-
-- **en macOS**
- - **Aplicación del servidor** - junto al paquete de software `Server`.
- - **Aplicación cliente** - junto al paquete de software `Cliente`.
-
-### Integrar una aplicación cliente monopuesto
-
-4D permite integrar una estructura compilada en la aplicación Cliente. Esta funcionalidad puede utilizarse, por ejemplo, para ofrecer a los usuarios una aplicación "portal", que da acceso a diferentes aplicaciones del servidor gracias al comando `OPEN DATABASE` que ejecuta un archivo `.4dlink`.
-
-Para activar esta funcionalidad, añada las llaves `DatabaseToEmbedInClientWinFolder` y/o `DatabaseToEmbedInClientMacFolder` en el archivo de configuración *buildApp*. Cuando una de estas llaves está presente, el proceso de generación de la aplicación cliente genera una aplicación monopuesto: la estructura compilada, en lugar del archivo *EnginedServer.4Dlink*, se coloca en la carpeta "Database".
-
-- Si existe una carpeta de datos por defecto en la aplicación monopuesto, se integra una licencia.
-- Si no existe una carpeta de datos por defecto en la aplicación monopuesto, ésta se ejecutará sin archivo de datos y sin licencia.
-
-El escenario básico es:
-
-1. En la caja de diálogo del Generador de aplicaciones, seleccione la opción "Generar una estructura compilada" para producir un .4DZ o un .4DC para utilizar la aplicación en modo monopuesto.
-2. En el archivo *buildApp.4DSettings* de la aplicación cliente-servidor, utilice la(s) siguiente(s) llave(s) xml para indicar la ruta de la carpeta que contiene la aplicación compilada monopuesto:
-
-- `DatabaseToEmbedInClientWinFolder`
-- `DatabaseToEmbedInClientMacFolder`
-
-3. Genere la aplicación cliente-servidor. Esto tendrá los siguientes efectos:
-
-- la carpeta de la aplicación monopuesto se copia completa dentro de la carpeta "Database" del cliente fusionado
-- el archivo *EnginedServer.4Dlink* de la carpeta "Database" no se genera
-- los archivos .4DC, .4DZ, .4DIndy de la copia de la aplicación monopuesto se renombran utilizando el nombre del cliente fusionado
-- la llave `PublishName` no se copia en el *info.plist* del cliente fusionado
-- si la aplicación monopuesto no tiene una carpeta "Data" por defecto, el cliente fusionado se ejecutará sin datos.
-
-Actualización automática de funciones del servidor 4D número de ([versión actual](#current-version), comando [`SET UPDATE FOLDER`](../commands-legacy/set-update-folder.md)...) trabaja con una aplicación de un solo usuario como con una aplicación remota estándar. Al conectarse, la aplicación monopuesto compara su llave `CurrentVers` con el rango de versión 4D Server. Si está fuera del rango, la aplicación cliente actualizada se descarga del servidor y el Updater lanza el proceso de actualización local.
-
-### Personalizar nombres de carpeta de caché cliente y/o servidor
-
-Las carpetas de caché cliente y servidor se utilizan para almacenar elementos compartidos, como recursos o componentes. Son necesarios para gestionar los intercambios entre el servidor y los clientes remotos. Las aplicaciones cliente/servidor utilizan las rutas de acceso por defecto para las carpetas de caché sistema del cliente y servidor.
-
-En algunos casos específicos, puede ser necesario personalizar los nombres de estas carpetas para implementar arquitecturas específicas (ver abajo). 4D le ofrece las llaves `ClientServerSystemFolderName` y `ServerStructureFolderName` a definir en el archivo de parámetros *buildApp*.
-
-#### Carpeta de caché cliente
-
-La personalización del nombre de la carpeta de caché del lado del cliente puede ser útil cuando su aplicación cliente se utiliza para conectarse a varios servidores fusionados que son similares pero utilizan diferentes conjuntos de datos. En este caso, para ahorrar múltiples descargas innecesarias de recursos locales idénticos, puede utilizar la misma carpeta de caché local personalizada.
-
-- Configuración por defecto (*para cada conexión a un servidor, una carpeta caché específica se descarga/actualiza*):
-
-
-
-- Utilizando la llave `ClientServerSystemFolderName` (*se utiliza una única carpeta de caché para todos los servidores*):
-
-
-
-#### Carpeta de caché del servidor
-
-La personalización del nombre de la carpeta de caché del lado del servidor es útil cuando se ejecutan varias aplicaciones servidor idénticas creadas con diferentes versiones de 4D en el mismo ordenador. Si quiere que cada servidor utilice su propio conjunto de recursos, debe personalizar la carpeta de caché del servidor.
-
-- Configuración por defecto (*las mismas aplicaciones servidor comparten la misma carpeta de caché*):
-
-
-
-- Utilizando la llave `ServerStructureFolderName` (*se utiliza una carpeta de caché dedicada para cada aplicación servidor*):
-
-
-
-## Página Plugins y componentes
-
-En esta pestaña, configurara cada [**plug-in**](Concepts/plug-ins.md), [**componente**](../Project/components.md) y [**módulo**](#deseleccionar-modulos) que utilizará en su aplicación independiente o cliente/servidor.
-
-La página lista los elementos cargados por la aplicación 4D actual:
-
-
-
-- La columna **Activa** indica los elementos que se integrarán en la aplicación generada. Todos los elementos están marcados por defecto. Para excluir un plug-in, un componente o un módulo, desmarque la casilla de selección situada junto a él.
-
-- columna **Plugins y componentes** - Muestra el nombre del plug-in/componente/módulo.
-
-- Columna **ID** - Muestra el número de identificación del elemento (si lo hay).
-
-- Columna **Tipo** - Indica el tipo de elemento: Plug-in, Componente o Módulo.
-
-### Añadiendo plug-ins o componentes
-
-Si desea integrar otros plug-ins o componentes en la aplicación ejecutable, sólo tiene que colocarlos en una carpeta **Plugins** o **Components** junto a la aplicación 4D Volume Desktop o junto a la aplicación 4D Server. El mecanismo para copiar el contenido de la carpeta de la aplicación fuente (ver [Personalizar la carpeta 4D Volume Desktop](#customizing-4d-volume-desktop-folder)) puede utilizarse para integrar todo tipo de archivo en la aplicación ejecutable.
-
-Si hay un conflicto entre dos versiones diferentes del mismo plug-in (una cargada por 4D y la otra ubicada en la carpeta de la aplicación fuente), la prioridad la tiene el plug-in instalado en la carpeta de 4D Volume Desktop/4D Server. Sin embargo, si hay dos instancias de un mismo componente, la aplicación no se abrirá.
-
-> El uso de plug-ins y/o componentes en una versión de despliegue puede requerir números de licencia.
-
-### Desmarcar módulos
-
-Un módulo es una librería de código integrada que 4D utiliza para controlar funcionalidades específicas. Si sabe que su aplicación generada no utiliza ninguna de las funcionalidades cubiertas por un módulo, puede desmarcarlo en la lista para reducir el tamaño de los archivos de su aplicación.
-
-> **Atención:** deseleccionar un módulo podría impedir que su aplicación generada funcione como se espera. Si no está 100% seguro de que un módulo nunca será llamado por su aplicación, se recomienda mantenerlo seleccionado.
-
-Los siguientes módulos opcionales pueden ser deseleccionados:
-
-- **CEF**: Librería integrada Chromium. Es necesario ejecutar [áreas Web](../FormObjects/webArea_overview.md) que utilizan el motor de renderizado integrado y [áreas 4D View Pro](../FormObjects/viewProArea_overview.md). La llamada a estas áreas cuando el CEF está deseleccionado mostrará áreas en blanco y/o generará errores.
-- **MeCab**: librería utilizada para la indexación de textos en lengua japonesa (ver este [párrafo de propiedades](../settings/database.md#support-of-mecab-japanese-version)). Si se deselecciona este módulo, los índices de texto se reconstruirán en japonés.
-
-> Si deselecciona MeCab para una aplicación en lenguaje japonés utilizada en plataformas heterogéneas, asegúrese de deseleccionarlo tanto en la compilación cliente/servidor como en la [compilación de la aplicación cliente](#build-client-application) (para la plataforma concurrente), de lo contrario se producirán fallos importantes en la aplicación.
-
-- **SpellChecker**: se utiliza para las funciones integradas de [corrección ortográfica](../FormObjects/properties_Entry.md#auto-spellcheck) y los comandos disponibles para las áreas de entrada y las áreas 4D Write Pro.
-- **4D Updater**: controla la [actualización automática](#what-is-a-clientserver-application) de las partes del cliente y es utilizado por el comando `SET UPDATE FOLDER` para [actualizaciones automáticas del servidor](#automatic-updating-of-server-or-single-user-applications).
-
-## Página licencias y certificados
-
-La página de Licencias y certificados puede utilizarse para:
-
-- designa las [licencias de despliegue](../Admin/licenses.md#deployment-licenses) que quiere integrar en su aplicación [monopuesto](#application-page) o [cliente-servidor](#clientserver-page)
-- firmar la aplicación mediante un certificado en macOS.
-
-
-
-### Licencias
-
-Esta pestaña muestra la opción [Construir una aplicación de evaluación](#build-an-evaluation-application) y la lista de [licencias de despliegue que puede insertar](../Admin/licenses.md#deployment-licenses) en su aplicación (independiente o cliente-servidor). Por defecto, la lista está vacía.
-
-Puede utilizar esta pestaña para crear:
-
-- una aplicación de evaluación,
-- una aplicación licenciada sin licencia integrada (el usuario tiene que tener una licencia por usuario),
-- una aplicación licenciada con licencias anidadas.
-
-#### Crear una aplicación de evaluación
-
-Marque esta opción para crear una versión de evaluación de su aplicación.
-
-Una aplicación de evaluación permite al usuario final ejecutar una versión completa de su aplicación autónoma o de servidor en su máquina durante un periodo de tiempo limitado, a partir del primer lanzamiento. Al final del periodo de evaluación, la aplicación ya no podrá utilizarse durante un determinado periodo de tiempo en la misma máquina.
-
-:::info
-
-Se requiere una conexión a Internet en la máquina del usuario en el primer lanzamiento de la aplicación de evaluación.
-
-:::
-
-En cuanto se activa la opción "Crear una aplicación de evaluación", se ignoran las licencias de despliegue.
-
-:::note Notas
-
-- El comando [`License info`](../commands/license-info.md) permite conocer el tipo de licencia de la aplicación (colección *.attributes*) y su fecha de caducidad (objeto *.expirationDate*).
-- La llave xml BuildApplication [`EvaluationMode`](https://doc.4d.com/4Dv20R8/4D/20-R8/EvaluationMode.300-7542468.en.html) permite gestionar las versiones de evaluación.
-- El comando [`CHANGE LICENCES`](../commands-legacy/change-licenses.md) no hace nada cuando se llama desde una versión de evaluación.
-
-:::
-
-#### Crear una aplicación con licencia sin licencia(s) integrada(s)
-
-Para crear una aplicación sin licencia de despliegue incorporada, simplemente mantenga la lista de licencias vacía y asegúrese de que la opción "Crear una aplicación de evaluación" está **desmarcada**.
-
-En este caso, el usuario final tendrá que comprar e introducir una licencia *4D Desktop* o *4D Server* por usuario la primera vez que inicie la aplicación (cuando integra una licencia de despliegue, el usuario no tiene que introducir ni utilizar su propio número de licencia). Para más información, consulte la sección [**Licencias de despliegue**](../Admin/licenses.md#deployment-licenses).
-
-#### Construir una aplicación con licencia(s) integrada(s)
-
-Esta opción le permite crear una aplicación lista para usar, en la que ya están integradas las licencias necesarias.
-
-Debe designar los archivos que contienen sus [licencias de despliegue](../Admin/licenses.md#deployment-licenses). Estos archivos se generaron o actualizaron al adquirir la licencia *4D Developer Professional* y las licencias de despliegue. Su licencia actual *4D Developer Professional* se asocia automáticamente a cada licencia de despliegue que se vaya a utilizar en la aplicación creada. Puede añadir otro número 4D Developer Professional y sus licencias asociadas.
-
-Para eliminar o añadir una licencia, utilice los botones **[+]** y **[-]** de la parte inferior de la ventana. Al hacer clic en el botón \N-[+], aparece una caja de diálogo para abrir archivos que muestra por defecto el contenido de la carpeta *Licencias* de su máquina. Para obtener más información sobre la ubicación de esta carpeta, consulte el comando [Get 4D folder](../commands-legacy/get-4d-folder.md).
-
-Una vez seleccionado un archivo, la lista indicará las características de la licencia que contiene.
-
-- **Licencia #** - número de licencia del producto
-- **Licencia** - Nombre del producto
-- **Fecha de vencimiento**: fecha de vencimiento de la licencia (si la hay)
-- **Ruta de acceso** - Ubicación en el disco
-
-Si una licencia no es válida, un mensaje le avisará.
-
-Puede designar tantos archivos válidos como desee. Al generar una aplicación ejecutable, 4D utilizará la licencia más apropiada disponible.
-
-> Se necesitan licencias "R" dedicadas para generar aplicaciones basadas en las versiones "R-release" (los números de licencia de los productos "R" empiezan por "R-4DDP").
-
-Una vez creada una aplicación licenciada, se incluye automáticamente un nuevo archivo de licencia de despliegue en la carpeta Licencias junto a la aplicación ejecutable (Windows) o en el paquete (macOS).
-
-### certificado de firma macOS
-
-El generador de aplicaciones puede firmar aplicaciones 4D fusionadas bajo macOS (aplicaciones monopuesto, componentes, 4D Server y partes cliente bajo macOS). La firma de una aplicación autoriza su ejecución por la funcionalidad Gatekeeper de macOS cuando se selecciona la opción "Mac App Store y desarrolladores identificados" (ver "Acerca de Gatekeeper" más adelante).
-
-- Marque la opción **Firmar la aplicación** para incluir la certificación en el procedimiento de generación de aplicaciones para macOS. 4D comprobará la disponibilidad de los elementos necesarios para la certificación cuando se produzca la generación:
-
-
-
-Esta opción aparece tanto en Windows como en macOS, pero sólo se tiene en cuenta en las versiones de macOS.
-
-- **Nombre del certificado**: introduzca en esta área el nombre de su certificado desarrollador validado por Apple. El nombre del certificado suele ser el nombre del certificado en el utilitario Keychain Access (la parte en rojo en el siguiente ejemplo):
-
-
-
-Para obtener un certificado de desarrollador de Apple, Inc., puede utilizar los comandos del menú de acceso al llavero o ir aquí: [http://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html](http://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html).
-
-> Este certificado requiere la presencia del utilitario codesign de Apple, que se ofrece por defecto y suele estar ubicado en la carpeta "/usr/bin/". Si se produce un error, asegúrese de que este utilitario esté presente en su disco.
-
-- **Generar un certificado autofirmado** - ejecuta el "Asistente de Certificados" que permite generar un certificado autofirmado. Si no tiene un certificado de desarrollador Apple, debe suministrar un certificado autofirmado. Con este certificado, no se muestra ningún mensaje de alerta si la aplicación se despliega internamente. Si la aplicación se despliega externamente (es decir, a través de http o correo electrónico), al iniciarse macOS muestra un mensaje de alerta que indica que el desarrollador de la aplicación no está identificado. El usuario puede "forzar" la apertura de la aplicación. En el "Asistente de Certificados", asegúrese de seleccionar las opciones apropiadas:
- 
- 
-
-> 4D recomienda suscribirse al Programa Apple Developer Program para tener acceso a los Certificados de Desarrollador que son necesarios para notarizar las aplicaciones (ver más abajo).
-
-#### Sobre Gatekeeper
-
-Gatekeeper es una función de seguridad macOS que controla la ejecución de las aplicaciones descargadas de Internet. Si una aplicación descargada no procede del Apple Store o no está firmada, se rechaza y no se puede ser lanzada.
-
-> En las máquinas Apple Silicon, los [componentes](../Project/components.md)4D deben ser firmados. Un componente sin firmar generará un error al iniciar la aplicación ("lib4d-arm64.dylib no se puede abrir...").
-
-La opción **Firmar la aplicación** del Generador de aplicaciones de 4D le permite generar aplicaciones y componentes compatibles con esta opción por defecto.
-
-#### Sobre la notarización
-
-La notarización de las aplicaciones es muy recomendada por Apple a partir de macOS 10.14.5 (Mojave) y 10.15 (Catalina), ya que las aplicaciones no notarizadas que se despliegan a través de internet se bloquean por defecto.
-
-La notarización en sí debe ser realizada por el desarrollador y es independiente de 4D (tenga en cuenta también que requiere la instalación de Xcode). La notarización en sí debe ser realizada por el desarrollador y es independiente de 4D (tenga en cuenta también que requiere la instalación de Xcode). The 4D [built-in signing features](#macos-signing-certificate) have been adapted to meet all of Apple's requirements to allow using the Apple notary service.
-
-Para más información sobre el concepto de notarización, consulte [esta página en el sitio web para desarrolladores de Apple](https://developer.apple.com/documentation/xcode/notarizing_your_app_before_distribution/customizing_the_notarization_workflow).
-
-Para más información sobre el concepto de grapado, lea [este mensaje del foro de Apple](https://forums.developer.apple.com/forums/thread/720093).
-
-## Personalizar los iconos de una aplicación
-
-4D asocia un icono por defecto a las aplicaciones ejecutables (monopuestos y cliente-servidor). Sin embargo puede personalizar el icono para cada aplicación.
-
-- **macOs** - cuando se crea una aplicación con doble clic, 4D se encarga de la personalización del icono. Para ello, debe crear un archivo de iconos (tipo icns), antes de crear el archivo de la aplicación, y colocarlo junto a la carpeta del proyecto.
-
-> Apple, Inc. ofrece una herramienta específica para crear archivos de iconos *icns* (para obtener más información, consulte la [documentación de Apple](https://developer.apple.com/library/archive/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40012302-CH7-SW2)).
-
-Su archivo de iconos debe tener el mismo nombre que el archivo del proyecto e incluir la extensión *.icns*. 4D tiene en cuenta automáticamente este archivo cuando genera la aplicación de doble clic (el archivo *.icns* es renombrado *NomApplication.icns* y copiado en la carpeta Resources; la entrada *CFBundleFileIcon* del archivo *info.plist* es actualizada).
-
-- **Windows** - Cuando se crea una aplicación con doble clic, 4D se encarga de la personalización de su icono. Para ello, debe crear un archivo de iconos (extensión *.ico*), antes de crear el archivo de la aplicación, y colocarlo junto a la carpeta del proyecto.
-
-Su archivo de iconos debe tener el mismo nombre que el archivo del proyecto e incluir la extensión *.ico*. 4D tiene en cuenta automáticamente este archivo cuando genera la aplicación de doble clic.
-
-También puede definir las [llaves XML](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html) específicas en el archivo buildApp.4DSettings para designar cada icono a utilizar. Están disponibles las siguientes llaves:
-
-- RuntimeVLIconWinPath
-- RuntimeVLIconMacPath
-- ServerIconWinPath
-- ServerIconMacPath
-- ClientMacIconForMacPath
-- ClientWinIconForMacPath
-- ClientMacIconForWinPath
-- ClientWinIconForWinPath
-
-## Gestión de archivos de datos
-
-### Apertura del archivo de datos
-
-Cuando un usuario lanza una aplicación fusionada o una actualización (aplicaciones monopuesto o cliente/servidor), 4D intenta seleccionar un archivo de datos válido. Varias ubicaciones son examinadas sucesivamente por la aplicación.
-
-La secuencia de lanzamiento de una aplicación fusionada es:
-
-1. 4D intenta abrir el último archivo de datos abierto, [como se describe a continuación](#last-data-file-opened) (no aplicable durante el lanzamiento inicial).
-2. Si no se encuentra, 4D intenta abrir el archivo de datos en una carpeta de datos por defecto junto al archivo .4DZ en modo de sólo lectura.
-3. Si no se encuentra, 4D intenta abrir el archivo de datos estándar por defecto (mismo nombre y misma ubicación que el archivo .4DZ).
-4. Si no se encuentra, 4D muestra una caja de diálogo estándar "Abrir archivo de datos".
-
-### Último archivo de datos abierto
-
-#### Ruta del último archivo de datos
-
-Toda aplicación autónoma o servidor generada con 4D almacena la ruta de acceso del último archivo de datos abierto en la carpeta de preferencias del usuario de la aplicación.
-
-La ubicación de la carpeta de preferencias del usuario de la aplicación corresponde a la ruta devuelta por la instrucción siguiente:
-
-```4d
-userPrefs:=Get 4D folder(Carpeta 4D activa)
-```
-
-La ruta del archivo de datos se almacena en un archivo dedicado, llamado *lastDataPath.xml*.
-
-Gracias a esta arquitectura, cuando usted ofrece una actualización de su aplicación, el archivo de datos del usuario local (último archivo de datos utilizado) se abre automáticamente en el primer lanzamiento.
-
-Este mecanismo suele ser adecuado para los despliegues estándar. Sin embargo, para necesidades específicas, por ejemplo, si duplica sus aplicaciones fusionadas, es posible que desee cambiar la forma en que el archivo de datos está vinculado a la aplicación (se describe a continuación).
-
-#### Configurar el modo de enlace de los datos
-
-Con sus aplicaciones compiladas, 4D utiliza automáticamente el último archivo de datos abierto. Por defecto, la ruta del archivo de datos se almacena en la carpeta de preferencias del usuario de la aplicación y está vinculada al **nombre de la aplicación**.
-
-Esto puede ser inadecuado si se quiere duplicar una aplicación fusionada destinada a utilizar diferentes archivos de datos. Las aplicaciones duplicadas en realidad comparten la carpeta de preferencias del usuario de la aplicación y, por lo tanto, siempre utilizan el mismo archivo de datos - incluso si el archivo de datos se cambia de nombre, porque se abre el último archivo utilizado para la aplicación.
-
-Por lo tanto, 4D le permite vincular la ruta del archivo de datos a la ruta de la aplicación. En este caso, el archivo de datos se relacionará con una ruta específica y no será simplemente el último archivo abierto. Por lo tanto, 4D le permite vincular la ruta del archivo de datos a la ruta de la aplicación.
-
-Este modo le permite duplicar sus aplicaciones fusionadas sin romper el vínculo con el archivo de datos. Sin embargo, con esta opción, si el paquete de la aplicación se mueve en el disco, se pedirá al usuario un archivo de datos, ya que la ruta de la aplicación ya no coincidirá con el atributo "executablePath" (después de que el usuario haya seleccionado un archivo de datos, el archivo *lastDataPath.xml* se actualiza en consecuencia).
-
-*Duplicación cuando los datos están vinculados por nombre de la aplicación:*
-
-
-*Duplicación cuando los datos están vinculados por ruta de la aplicación:*
-
-
-Puede seleccionar el modo de vinculación de datos durante el proceso de generación de la aplicación. Puede:
-
-- Utilice la [página Aplicación](#application-page) o la [Página cliente/servidor](#clientserver-page) de la caja de diálogo del Generador de aplicaciones.
-- Utilice la llave XML **LastDataPathLookup** (aplicación monopuesto o aplicación servidor).
-
-### Definir una carpeta de datos por defecto
-
-4D le permite definir un archivo de datos por defecto en la fase de construcción de la aplicación. Cuando la aplicación se lanza por primera vez, si no se encuentra ningún archivo de datos local (ver \[secuencia de lanzamiento descrita anteriormente\](#opening-the-data-file)), el archivo de datos por defecto se abre automáticamente y de forma silenciosa en modo de sólo lectura por 4D. Cuando la aplicación se lanza por primera vez, si no se encuentra ningún archivo de datos local (ver \[secuencia de lanzamiento descrita anteriormente\](#opening-the-data-file)), el archivo de datos por defecto se abre automáticamente y de forma silenciosa en modo de sólo lectura por 4D.
-
-Más específicamente, se cubren los siguientes casos:
-
-- Evitar la visualización de la caja de diálogo "Abrir archivo de datos" de 4D al lanzar una nueva aplicación fusionada o actualizada. Puede detectar, por ejemplo al inicio, que se ha abierto el archivo de datos por defecto y así ejecutar su propio código y/o diálogos para crear o seleccionar un archivo de datos local.
-- Permitir la distribución de aplicaciones fusionadas con datos de sólo lectura (para aplicaciones de demostración, por ejemplo).
-
-Para definir y utilizar un archivo de datos por defecto:
-
-- Debe suministrar un archivo de datos por defecto (llamado "Default.4DD") y almacenarlo en una carpeta específica por defecto (llamada "Default Data") dentro de la carpeta del proyecto de la aplicación. Este archivo debe suministrarse junto con todos los demás archivos necesarios, dependiendo de la configuración del proyecto: índice (.4DIndx), blobs externos, journal, etc. Es su responsabilidad proveer un archivo de datos válido por defecto. Es su responsabilidad proveer un archivo de datos válido por defecto.
-- Cuando se genera la aplicación, la carpeta de datos por defecto se integra en la aplicación fusionada. Todos los archivos dentro de esta carpeta por defecto también están anidados.
-
-El siguiente gráfico ilustra esta funcionalidad:
-
-
-
-Cuando se detecta el archivo de datos por defecto en el primer lanzamiento, se abre silenciosamente en modo de sólo lectura, lo que le permite ejecutar toda operación personalizada que no modifique el archivo de datos en sí.
-
-## Gestión de la conexión(es) de las aplicaciones clientes
-
-La gestión de las conexiones de las aplicaciones clientes abarca los mecanismos por los que una aplicación cliente fusionada se conecta al servidor objetivo, una vez que está en su entorno de producción.
-
-### Escenario de conexión
-
-El procedimiento de conexión para las aplicaciones cliente fusionadas admite los casos en los que el servidor dedicado no está disponible. El escenario de inicio de una aplicación cliente 4D es el siguiente:
-
-1. Si la información de conexión válida se encuentra almacenada en el archivo "EnginedServer.4DLink" dentro de la aplicación cliente, la aplicación cliente se conecta a la dirección del servidor especificada.\
- O\
- La aplicación cliente intenta conectarse al servidor utilizando el servicio de descubrimiento (basado en el nombre del servidor, transmitido en la misma subred).\
- O\
- La aplicación cliente intenta conectarse al servidor utilizando el servicio de descubrimiento (basado en el nombre del servidor, transmitido en la misma subred).
- O
- La aplicación cliente intenta conectarse al servidor utilizando el servicio de descubrimiento (basado en el nombre del servidor, transmitido en la misma subred).
-
-2. Si esto falla, la aplicación cliente intenta conectarse al servidor utilizando la información almacenada en la carpeta de preferencias del usuario de la aplicación (archivo "lastServer.xml", ver último paso).
-
-3. Si esto falla, la aplicación cliente muestra una caja de diálogo de error de conexión.
-
-- Si el usuario hace clic en el botón **Seleccionar...** (cuando lo permite el desarrollador 4D al momento de la generación, ver más abajo), se muestra la caja de diálogo estándar "Conexión al servidor".
-- Si el usuario hace clic en el botón **Salir**, la aplicación cliente se cierra.
-
-4. Si la conexión tiene éxito, la aplicación cliente guarda esta información de conexión en la carpeta de preferencias usuario de la aplicación para su uso futuro.
-
-Todo el procedimiento se describe en el siguiente diagrama:
-
-
-
-### Almacenando la última ruta del servidor
-
-La última ruta servidor utilizada y validada se guarda automáticamente en un archivo llamado "lastServer.xml" en la carpeta de preferencias usuario de la aplicación. Esta carpeta se guarda en la siguiente ubicación:
-
-```4d
-userPrefs:=Get 4D folder(Carpeta 4D activa)
-```
-
-Este mecanismo aborda el caso en el que el servidor objetivo primario esté disponible temporalmente por alguna razón (modo mantenimiento, por ejemplo). Cuando se produce este caso por primera vez, se muestra la caja de diálogo de selección de servidor (si está permitido, ver más adelante) y el usuario puede seleccionar manualmente un servidor alternativo, cuya ruta se guarda si la conexión tiene éxito. Toda indisponibilidad posterior se gestionaría automáticamente a través de la información de la ruta "lastServer.xml".
-
-> - Cuando las aplicaciones cliente no pueden beneficiarse permanentemente del servicio de descubrimiento, por ejemplo debido a la configuración de la red, se recomienda que el desarrollador indique un nombre de host en el momento de la generación utilizando la llave [IPAddress](https://doc.4d.com/4Dv20/4D/20/IPAddress.300-6335763.en.html) en el archivo "BuildApp.4DSettings". El mecanismo aborda los casos de indisponibilidad temporal.
-> - Presionar la tecla **Alt/Opción** al inicio para mostrar la caja de diálogo de selección del servidor sigue siendo soportado en todos los casos.
-
-### Disponibilidad de la caja de diálogo de selección del servidor en caso de error
-
-Puede elegir si mostrar o no la caja de diálogo estándar de selección de servidor en las aplicaciones cliente fusionadas cuando no se puede acceder al servidor. La configuración depende del valor de la [ServerSelectionAllowed](https://doc.4d.com/4Dv20/4D/20/ServerSelectionAllowed.300-6335767.en.html) La llave XML en la máquina donde se generó la aplicación:
-
-- **Visualización de un mensaje de error sin poder acceder a la caja de diálogo de selección del servidor**. Funcionamiento por defecto. La aplicación solo puede cerrarse.
- `ServerSelectionAllowed`: **False** o llave omitida
- 
-
-- **Visualización de un mensaje de error con acceso posible a la caja de diálogo de selección del servidor**. El usuario puede acceder a la ventana de selección del servidor haciendo clic en el botón **Seleccionar...**.
- `ServerSelectionAllowed`: **True**
- 
- 
-
-## Actualización automática de aplicaciones servidor o monopuesto
-
-En principio, la actualización de las aplicaciones servidor o de las aplicaciones monopuesto fusionadas requiere la intervención del usuario (o la programación de rutinas de sistema personalizadas): cada vez que esté disponible una nueva versión de la aplicación fusionada, hay que salir de la aplicación en producción y sustituir manualmente los archivos antiguos por los nuevos; a continuación, reiniciar la aplicación y seleccionar el archivo de datos actual.
-
-Puede automatizar este procedimiento en gran medida utilizando los siguientes comandos del lenguaje: [`SET UPDATE FOLDER`](../commands-legacy/set-update-folder.md), [`RESTART 4D`](../commands-legacy/restart-4d.md), y también [`Last update log path`](../commands-legacy/last-update-log-path.md) para operaciones de monitoreo. La idea es implementar una función en su aplicación 4D que active la secuencia de actualización automática descrita a continuación. Puede ser un comando de menú o un proceso que se ejecuta en segundo plano y comprueba a intervalos regulares la presencia de un archivo en un servidor.
-
-> También dispone de llaves XML para elevar los privilegios de instalación y poder utilizar archivos protegidos en Windows (consulte el manual [4D XML Keys BuildApplication](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html)).
-
-Este es el escenario para actualizar un servidor o una aplicación unipersonal fusionada:
-
-1. Se transfiere, por ejemplo utilizando un servidor HTTP, la nueva versión de la aplicación servidor o la aplicación monopuesto fusionada a la máquina en producción.
-2. En la aplicación en producción, se llama al comando `SET UPDATE FOLDER`: este comando designa la ubicación de la carpeta donde se encuentra la actualización "pendiente" de la aplicación actual. Opcionalmente, puede copiar en esta carpeta los elementos personalizados de la versión en producción (archivos usuario).
-3. En la aplicación en producción, llame al comando `RESTART 4D`: este comando desencadena automáticamente la ejecución de un programa utilitario llamado "updater" que sale de la aplicación actual, la reemplaza utilizando la actualización "pendiente" si se especifica una y reinicia la aplicación con el archivo de datos actual. La versión anterior ha sido renombrada.
-
-> Esta secuencia es compatible con las aplicaciones servidor de Windows que se ejecutan como servicio.
-
-### Historial de actualización
-
-El procedimiento de instalación genera un archivo de registro en el que se detallan las operaciones de actualización de las aplicaciones fusionadas (cliente, servidor o monopuesto) en los equipos de destino. Este archivo es útil para analizar cualquier error que se produzca durante el proceso de instalación.
-
-El historial de actualización se denomina `YYYY-MM-DD_HH-MM-SS_log_X.txt`, por ejemplo, `2021-08-25_14-23-00_log_1.txt` para un archivo creado el 25 de agosto de 2021 a las 14:23.
-
-Este archivo se crea en la carpeta de la aplicación "Updater", dentro de la carpeta de usuario del sistema. Puede encontrar la ubicación de este archivo en cualquier momento utilizando el comando [`Last update log path`](../commands-legacy/last-update-log-path.md).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/clientServer.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/clientServer.md
deleted file mode 100644
index cd3931491d7495..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/clientServer.md
+++ /dev/null
@@ -1,116 +0,0 @@
----
-id: clientServer
-title: Gestión Cliente/Servidor
----
-
-Las aplicaciones 4D Desktop pueden utilizarse en una configuración Cliente/Servidor, ya sea como aplicaciones combinadas cliente/servidor o como proyectos remotos.
-
-- Las **aplicaciones cliente/servidor fusionadas** son generadas por el [gestor de creación de aplicaciones](building.md#clientserver-page). Se utilizan para el despliegue de aplicaciones.
-
-- Los **proyectos remotos** son archivos [.4DProject](Project/architecture.md) abiertos por 4D Server y a los que se accede con 4D en modo remoto. El servidor envía una versión .4dz del proyecto ([formato comprimido](building.md#build-compiled-structure)) al 4D remoto, por lo que los archivos de estructura son de sólo lectura. Esta configuración se suele utilizar para probar la aplicación.
-
-
-
-> La conexión a un proyecto remoto desde **la misma máquina que 4D Server** permite modificar los archivos del proyecto. Esta [funcionalidad específica](#using-4d-and-4d-server-on-the-same-machine) permite desarrollar una aplicación cliente/servidor en el mismo contexto del despliegue.
-
-## Abrir una aplicación cliente/servidor fusionada
-
-Una aplicación cliente/servidor fusionada se personaliza y su puesta en marcha se simplifica:
-
-- Para lanzar la parte del servidor, el usuario simplemente hace doble clic en la aplicación servidor. No es necesario seleccionar el archivo proyecto.
-- Para lanzar la parte cliente, el usuario simplemente hace doble clic en la aplicación cliente, que se conecta directamente a la aplicación servidor.
-
-Estos principios se detallan en la página [Creación de aplicaciones](building.md#what-is-a-clientserver-application).
-
-## Abrir un proyecto remoto
-
-La primera vez que se conecte a un proyecto 4D Server a través de un 4D remoto, normalmente utilizará la caja de diálogo de conexión estándar. Luego, podrá conectarse directamente utilizando el menú **Abrir proyectos recientes** o un archivo de acceso directo 4DLink.
-
-Para conectarse remotamente a un proyecto 4D Server:
-
-1. Haga una de las siguientes cosas:
- - Seleccione **Conectar a 4D Server** en la caja de diálogo del asistente de bienvenida
- - Seleccione **Abrir/Proyecto remoto...** desde el menú **Archivo** o del botón**Abrir** de la barra de herramientas.
-
-Aparece el diálogo de conexión de 4D Server. Este diálogo tiene tres pestañas: **Reciente**, **Disponible** y **Personalizado**.
-
-Si 4D Server está conectado a la misma subred que el 4D remoto, seleccione **Disponible**. 4D Server incluye un sistema de difusión integrado que, por defecto, publica el nombre de los proyectos 4D Server disponibles en la red. La lista se ordena por orden de aparición y se actualiza dinámicamente.
-
-
-
-Para conectarse a un servidor de la lista, haga doble clic en su nombre o selecciónelo y presione el botón **Aceptar**.
-
-Si el proyecto publicado no aparece en la lista **Disponible**, seleccione **Personalizado**. La página Personalizada le permite conectarse a un servidor publicado en la red utilizando su dirección de red y asignándole un nombre personalizado.
-
-
-
-- **Nombre del proyecto**: define el nombre local del proyecto 4D Server. Este nombre se utilizará en la página **Reciente** cuando se haga referencia al proyecto.
-- **Dirección red**: la dirección IP de la máquina donde se lanzó el 4D Server.
- - Si dos servidores se ejecutan simultáneamente en la misma máquina, la dirección IP debe ir seguida de dos puntos y del número de puerto, por ejemplo: `192.168.92.104:19814`.
- - Por defecto, el puerto de publicación de un 4D Server es el 19813. Este número puede modificarse en los parámetros del proyecto.
-
-> La opción **Activar modo desarrollo** abre la conexión remota en un modo especial de lectura/escritura y requiere acceder a la carpeta del proyecto desde el 4D remoto (opción de compatibilidad).
-
-Una vez que esta página asigna un servidor, al hacer clic en el botón **Aceptar** podrá conectarse al servidor.
-
-Una vez establecida la conexión con el servidor, el proyecto remoto aparecerá en la pestaña **Recientes**.
-
-### Actualización de los archivos del proyecto en el servidor
-
-4D Server crea y envía automáticamente a las máquinas remotas una versión [.4dz](building.md#build-compiled-structure) del archivo proyecto *.4DProject* (no comprimido) en modo interpretado.
-
-- Una versión .4dz actualizada del proyecto se produce automáticamente cuando es necesario, \*es decir, \*cuando el proyecto ha sido modificado y recargado por 4D Server. El proyecto se recarga:
- - automáticamente, cuando la ventana de la aplicación 4D Server pasa al frente del sistema operativo o cuando la aplicación 4D en la misma máquina guarda una modificación (ver abajo).
- - cuando se ejecuta el comando `RELOAD PROJECT`. Llamar a este comando es necesario cuando, por ejemplo, se ha sacado una nueva versión del proyecto desde la plataforma de control de fuentes.
-
-### Actualización de los archivos de proyecto en las máquinas remotas
-
-Cuando se ha producido una versión .4dz actualizada del proyecto en 4D Server, las máquinas 4D remotas conectadas deben cerrar la sesión y volver a conectarse a 4D Server para poder beneficiarse de la versión actualizada.
-
-## Utilizar 4D y 4D Server en la misma máquina
-
-Cuando 4D se conecta a un 4D Server en la misma máquina, la aplicación se comporta como 4D en modo monopuesto y el entorno de diseño le permite editar los archivos del proyecto. Esta funcionalidad le permite desarrollar una aplicación cliente/servidor en el mismo contexto de despliegue.
-
-> When 4D connects to a 4D Server on the same machine, the **development mode** is automatically activated, whatever the [Activate development mode](#opening-a-remote-project) option status.
-
-Cada vez que 4D realiza una acción **Guardar todo** desde el entorno de diseño (explícitamente desde el menú **Archivo** o implícitamente al cambiar al modo aplicación, por ejemplo), 4D Server recarga sincronizadamente los archivos del proyecto. 4D espera a que 4D Server termine de recargar los archivos del proyecto antes de continuar.
-
-Sin embargo, debe prestar atención a las siguientes diferencias de comportamiento en comparación con [la arquitectura proyecto estándar](Project/architecture.md):
-
-- la carpeta userPreferences.\{username\} utilizada por 4D no es la misma carpeta utilizada por 4D Server en la carpeta proyecto. En su lugar, es una carpeta dedicada, llamada "userPreferences", almacenada en la carpeta sistema del proyecto (es decir, la misma ubicación que al abrir un proyecto .4dz).
-- la carpeta utilizada por 4D para los datos derivados no es la carpeta llamada "DerivedData" en la carpeta proyecto. En su lugar, se trata de una carpeta dedicada llamada "DerivedDataRemote" situada en la carpeta del sistema del proyecto.
-- el archivo catalog.4DCatalog no es editado por 4D sino por 4D Server. La información del catálogo se sincroniza mediante peticiones cliente/servidor
-- el archivo directory.json no es editado por 4D sino por 4D Server. La información del directorio se sincroniza mediante peticiones cliente/servidor
-- 4D utiliza sus propios componentes internos y plug-ins en lugar de los de 4D Server.
-
-> No se recomienda instalar plug-ins o componentes a nivel de la aplicación 4D o 4D Server.
-
-## Sesiones de usuarios remotos
-
-En el servidor, el comando [`Session`](../commands/session.md) devuelve un objeto `session` que describe la sesión de usuario actual. Este objeto se maneja a través de las funciones y propiedades de la [clase `Session`](../API/SessionClass.md).
-
-### Utilización
-
-El objeto `session` permite obtener información sobre la sesión del usuario remoto. Puede compartir datos entre todos los procesos de la sesión del usuario utilizando el objeto compartido [`session.storage`](../API/SessionClass.md#storage).
-
-Por ejemplo, puede iniciar un procedimiento de autenticación y verificación de usuario cuando un cliente se conecta al servidor, que involucra ingresar un código enviado por correo electrónico o SMS en la aplicación. A continuación, añada la información de usuario al almacenamiento de sesión, permitiendo al servidor identificar al usuario. De este modo, el servidor 4D puede acceder a la información del usuario para todos los procesos del cliente, lo que permite escribir código personalizado según el rol del usuario.
-
-### Disponibilidad
-
-El objeto `session` del usuario remoto está disponible en:
-
-- Métodos proyecto que tienen el atributo [Ejecutar en el Servidor](../Project/code-overview.md#execute-on-server) (se ejecutan en el proceso "twinned" del proceso cliente),
-- Triggers,
-- ORDA [funciones del modelo de datos](../ORDA/ordaClasses.md) (excepto las declaradas con la palabra clave [`local`](../ORDA/ordaClasses.md#local-functions),
-- Los métodos base `On Server Open Connection` y `On Server Shutdown Connection` de la base de datos.
-
-:::info
-
-Todos los procedimientos almacenados en el servidor comparten la misma sesión de usuario virtual. Para más información, consulte [esta página en doc.4d.com](https://doc.4d.com/4Dv20/4D/20/Stored-Procedures.300-6330553.en.html).
-
-:::
-
-### Ver también (entrada de blog)
-
-[Objeto sesión remota 4D con conexión cliente/servidor y procedimiento almacenado](https://blog.4d.com/new-4D-remote-session-object-with-client-server-connection-and-stored-procedure).
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/labels.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/labels.md
deleted file mode 100644
index 45de20b2ad2c1e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/labels.md
+++ /dev/null
@@ -1,247 +0,0 @@
----
-id: labels
-title: Etiquetas
----
-
-El editor de etiquetas de 4D ofrece una forma práctica de imprimir una amplia variedad de etiquetas. Con ella, puede hacer lo siguiente:
-
-- Diseñe etiquetas para envíos postales, carpetas y fichas de archivo, y para muchas otras necesidades,
-- crear e insertar elementos decorativos en un modelo de etiquetas,
-- definir la fuente, el tamaño y el estilo de la fuente a utilizar para las etiquetas,
-- determinar el número de etiquetas a lo largo y a lo ancho de cada página,
-- Especifique cuántas etiquetas imprimir por registro,
-- Especifique los márgenes de la página de etiquetas,
-- designar un método a ejecutar al imprimir cada etiqueta o registro,
-- Crea una vista previa e imprime las etiquetas.
-
-:::note
-
-Las etiquetas también se pueden crear usando el [Editor de formularios](../FormEditor/formEditor.md). Utilice el editor de formularios para diseñar etiquetas especializadas que incluyan variables o aproveche las herramientas de dibujo disponibles en el editor de formularios e imprímalas utilizando el editor de etiquetas o el comando [`PRINT LABEL`](../commands-legacy/print-label.md).
-
-:::
-
-El editor de etiquetas permite crear, formatear e imprimir las etiquetas. El editor de etiquetas contiene los parámetros para diseñar etiquetas y colocarlas en el papel de etiquetas. Por ejemplo, al producir etiquetas de correo, es posible que desee un diseño de etiqueta que incluya el nombre y apellidos de la persona en la primera línea, la dirección postal en la segunda línea, etc. Como parte del diseño, el editor de etiquetas le permite especificar el número de etiquetas de la página y los márgenes del papel de etiquetas para que el texto de las etiquetas quede centrado dentro de las mismas.
-Cuando crea un diseño de etiqueta satisfactorio, puede guardarlo en disco para poder reutilizarlo.
-
-Para abrir el editor de etiquetas:
-
-- En el entorno Diseño, elija **Etiquetas...** en el menú **Herramientas** o en el menú asociado al botón "Herramientas" en la barra de herramientas de 4D.
- O
-- En una aplicación, llame al comando [`PRINT LABEL`](../commands-legacy/print-label.md).
-
-
-
-Utilice la página Etiqueta para especificar el contenido de la etiqueta y la página Diseño para definir el tamaño y la posición de las etiquetas en la página.
-
-
-
-## Página Etiqueta
-
-La página Etiqueta contiene varias áreas con opciones para diseñar y dar formato a las etiquetas.
-
-### Lista de campos
-
-Muestra los nombres de los campos de la tabla actual en una lista jerárquica. Si esta tabla está relacionada con otras tablas, los campos de clave externa tienen un signo más (en Windows) o una flecha (en macOS). Puede visualizar los campos de la tabla relacionada expandiendo los campos relacionados. Los campos de la tabla relacionada están indentados. Para utilizar un campo de esta lista en la plantilla de etiquetas, basta con arrastrarlo a la zona de vista previa de etiquetas situada a la derecha de la lista.
-
-:::note Notas
-
-- Sólo las tablas y los campos visibles aparecen en el editor de etiquetas.
-- Los campos de [tipo Objeto](../Concepts/dt_object.md) no son compatibles con el editor de etiquetas.
-
-:::
-
-El área de búsqueda le permite limitar la lista de campos mostrados a aquellos que contengan la cadena de caracteres introducida:
-
-
-
-### Vista previa de etiqueta
-
-Utilice esta área para diseñar su zona de etiquetas colocando y posicionando todos los elementos que desee incluir en su etiqueta. El rectángulo blanco representa una sola etiqueta (su tamaño se configura en la página [Diseño](#layout-page)).
-
-- Puede arrastrar los campos a la etiqueta.
-- También puede concatenar dos campos soltando el segundo campo sobre el primero. Se separan automáticamente con un espacio.
- 
- Si mantiene presionada la tecla **Mayús**, se separan con un retorno de carro. Esto le permite crear, por ejemplo, etiquetas de direcciones utilizando varios campos superpuestos (Dirección1, Dirección2, etc.), sin producir una línea vacía cuando una dirección sólo requiere un campo.
-- Puede añadir una fórmula a la etiqueta seleccionando la herramienta **Fórmula**  (o eligiendo **Herramienta>Fórmula** en el menú contextual) y dibujando un área. The **Formula editor** is then displayed:
- 
- For example, you can apply a format to a field using the [`String`](../commands-legacy/string.md) command:
-
-
-
-:::note
-
-Tenga en cuenta que sólo puede introducir métodos "permitidos" para la base de datos en el Editor de fórmulas. Los métodos permitidos dependen de los [parámetros del proyecto](../settings/security.md#options) y del comando [`SET ALLOWED METHODS`](../commands/set-allowed-methods.md).
-
-:::
-
-- Puedes arrastrar y soltar archivos imagen, así como archivos de etiquetas (archivos ".4lbp") desde el escritorio del sistema operativo.
-
-- Para modificar el área, haga doble clic en el contenido para pasar al modo edición. Al hacer doble clic en campos o fórmulas, aparece el **Editor de fórmulas**, que permite eliminar o modificar elementos:
- 
-
-### Formulario a utilizar
-
-Esta lista desplegable permite definir un formulario tabla como modelo de etiqueta. El formulario elegido debe estar especialmente adaptado a la creación de etiquetas.
-En este caso, el editor de etiquetas está parcialmente deshabilitado: sólo las funciones de la [página de diseño](#layout-page) pueden ser usadas — para permitirte configurar la página basada en el formulario. La imagen del formulario seleccionado se muestra en el área de previsualización de etiquetas.
-Cuando se utiliza un formulario, 4D ejecuta cualquier método de formulario u objeto asociado a él. Al usar esta opción, también puede designar un método proyecto para ejecutar para cada registro o etiqueta y luego asignar variables (ver [este ejemplo](#printing-labels-using-forms-and-methods-example) más abajo). Si desea crear sus etiquetas utilizando el propio editor, deberá elegir la opción **Sin formulario**.
-
-:::note Notas
-
-- Puede restringir los formularios listados que aparecen en este menú mediante un [archivo JSON específico](#controlling-available-forms-and-methods).
-- Si la base no contiene ningún formulario tabla, este menú no se muestra.
-
-:::
-
-### Comandos del área gráfica
-
-El área gráfica del editor incluye tanto una barra de herramientas como un menú contextual que puede utilizar para diseñar su plantilla de etiquetas.
-
-La parte izquierda de la barra de herramientas incluye comandos para seleccionar e insertar objetos. También puede acceder a estas herramientas mediante el comando **Herramienta>** del menú contextual del área.
-
-| Icono | Nombre de la herramienta | Descripción |
-| ----------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-|  | Selección | Haga clic en un solo objeto o dibuje un cuadro de selección alrededor de varios objetos. Para una selección de objetos no adyacentes, mantenga presionada **Mayús** y haga clic en cada objeto que desee seleccionar. |
-|  | Creación de línea | |
-|  | Creación rectangular | Para creación de rectángulo o rectángulo redondeado. |
-|  | Creación de círculo | |
-|  | Inserción de texto | Dibuja un rectángulo e introduce texto en su interior. Puede editar toda área de texto, incluidas las que contienen referencias a campos, haciendo doble clic en ellas. |
-|  | Inserción de fórmula | Dibuje un rectángulo para mostrar el **Editor de fórmulas**, donde puede definir el contenido dinámico de las etiquetas (campos y fórmulas). |
-
-Hay atajos disponibles para mover o redimensionar objetos con mayor precisión utilizando las teclas de flecha del teclado:
-
-- Las teclas de flecha del teclado mueven la selección de objetos de 1 píxel a la vez.
-- **Mayús** + teclas de flecha mueven la selección de objetos 10 píxeles a la vez.
-- **Ctrl** + teclas de flecha agrandan o reducen la selección de objetos en 1 píxel.
-- **Ctrl** + **Maj** + teclas de flecha amplían o reducen la selección de objetos en 10 píxeles.
-
-El lado derecho de la barra de herramientas contiene comandos utilizados para modificar elementos de la plantilla de etiqueta:
-
-| Icono | Nombre de la herramienta | Descripción |
-| ------------------------------------------ | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-|  | Color de relleno | todos los iconos de color muestran el color seleccionado |
-|  | Color de línea | |
-|  | Peso lineal | |
-|  | Menú Fuente | Define la fuente y su tamaño, así como el estilo, el color y la alineación del texto para los bloques de texto seleccionados. |
-|  | Alineación y distribución | Deben seleccionarse dos o más objetos para que las opciones de alineación estén disponibles. "Repartir" objetos significa definir automáticamente los intervalos horizontales o verticales entre al menos tres objetos, de modo que sean idénticos. El intervalo resultante es una media de todos los existentes en la selección. |
-|  | Nivel de los objetos | Mueve los objetos a la parte frontal o atrás, o mueve uno o más objetos hacia arriba o hacia abajo de un nivel. |
-
-## Página Diseño
-
-The Layout page contains controls for printing labels based on the requirements of your current print settings.
-
-
-
-- **Labels Order**: Specifies whether labels should be printed in the direction of the rows or the columns.
-- **Rows** and **Columns**: Set the number of labels to be printed by "row" and by "column" on each sheet. These settings determine the label size when the "Automatic resizing" option is enabled.
-- **Labels per record**: Sets the number of copies to print for each label (copies are printed consecutively).
-- **Print Setup...**: Sets the format of the page on which the sheet of labels will be printed. When you click this button, the setup dialog box for the printer selected in your system appears. By default, the sheet of labels is generated based on an A4 page in portrait mode.
- **Note:** The sheet created by the editor is based on the logical page of the printer, i.e. the physical page (for instance, an A4 page) less the margins that cannot be used on each side of the sheet. The physical margins of the page are shown by blue lines in the preview area.
-- **Unit**: Changes the units in which you specify your label and label page measurements. Puede utilizar puntos, milímetros, centímetros o pulgadas.
-- **Automatic resizing**: Means that 4D automatically calculates the size of the labels (i.e. the Width and Height parameters) according to the values set in all the other parameters. When this option is checked, the label size is adjusted each time you modify a page parameter. Los parámetros Ancho y Alto ya no pueden ajustarse manualmente.
-- **Width** and **Height**: Sets the height and width of each label manually. They cannot be edited when the **Automatic resizing** option is checked.
-- **Márgenes** (Superior, Derecho, Izquierdo, Inferior): define los márgenes de su hoja. These margins are symbolized by blue lines in the preview area. Clicking on **Use printer margins** replicates, in the preview area, the margin information provided by the selected printer (these values can be modified).
-- **Gaps**: Set the amount of vertical and/or horizontal space between label rows and columns.
-- **Method**: Lets you trigger a specific method that will be run at print time. For example, you can execute a method that posts the date and time that each label was printed. This feature is also useful when you print labels using a dedicated table form, in which case you can fill variables from a method.
- To be eligible for label processing, a project method must comply with the following settings:
- - debe ser "permitido" para la base de datos (los métodos permitidos dependen de los [parámetros del proyecto](../settings/security.md#options) y el comando [`SET ALLOWED METHODS`](../commands/set-allowed-methods.md), de lo contrario no se mostrará en el menú **Aplicación**.
- - debe tener la opción [Compartido por componentes y base de datos local](../Project/code-overview.md#shared-by-components-and-host-database).
- Ver también [este ejemplo](#printing-labels-using-forms-and-methods-example) a continuación.
-
-:::note
-
-Para necesidades avanzadas, puede restringir la lista de métodos disponibles utilizando un [archivo json específico](#controlling-available-forms-and-methods).
-The **For each: Record or Label** options are used to specify whether to run the method once per label or once per record. This control has meaning only if you are printing more than one copy of each label and you are also executing a method at print time.
-
-:::
-
-- **Layout preview**: Provides a reduced view of how an entire page of labels will look, based on the dimensions you enter in the Label editor. The page preview also reflects the paper size selected in the Print Setup dialog box. También puede utilizar esta zona para designar la primera etiqueta de la página que se va a imprimir (esta opción sólo afecta a la primera hoja en caso de impresión multipágina). This can be useful, for example, when you want to print on a sheet of adhesive labels, part of which has already been used. You can also select the first label on the page to be printed by clicking on it:
-
-
-
-## Impresión de etiquetas mediante formularios y métodos (ejemplo)
-
-You can use dedicated table forms and project methods to print labels with calculated variables. This simple example shows how to configure the different elements.
-
-1. En un formulario tabla dedicado, añada su(s) campo(s) de etiqueta y su(s) variable(s).
- Here, in a table form named "label", we added the *myVar* variable:
- 
-
-2. Create a `setMyVar` project method with the following code:
-
-```4d
- var myVar+=1
-```
-
-3. Defina el método proyecto como ["Compartido por los componentes y la base de datos local"](../Project/code-overview.md#shared-by-components-and-host-database).
-
-4. Before displaying the Label editor, make sure the project method is allowed by executing this code:
-
-```4d
- ARRAY TEXT($methods;1)
- $methods{1}:="setMyVar"
- SET ALLOWED METHODS($methods)
-```
-
-5. Open the Label editor and use your form:
- 
-
-6. In the Layout page, select the method:
- 
-
-Then you can print your labels:
-
-
-## Control de los formularios y métodos disponibles
-
-The Label editor includes an advanced feature allowing you to restrict which project forms and methods (within "allowed" methods) can be selected in the dialog box:
-
-- en el menú **Formulario a utilizar** de la página "Etiqueta" y/o
-- en el menú **Aplicar (método)** de la página "Diseño".
-
-1. Crea un archivo JSON llamado **labels.json** y ponlo en la [carpeta de recursos](../Project/architecture.md#resources) del proyecto.
-2. En este archivo, añada los nombres de los formularios y/o métodos proyecto que desea poder seleccionar en los menús del editor de etiquetas.
-
-El contenido del archivo **labels.json** debe ser similar a:
-
-```json
-[
- {"tableId":2,"forms":[],"methods":["myMethod1","myMethod2"]},
- {"tableId":1,"forms":["Sample Label 1","Sample Label 2"],"methods":[]}
-]
-```
-
-Si no se ha definido ningún archivo **labels.json** entonces no se aplica ningún filtro.
-
-## Gestión de archivos de etiquetas
-
-4D le permite guardar cada modelo de etiquetas en un archivo que podrá abrir posteriormente desde el asistente. Si guarda sus diseños de etiquetas, podrá crear una biblioteca de etiquetas adaptada a sus necesidades específicas. Cada diseño de etiqueta almacena los ajustes definidos en las páginas Etiqueta y Diseño.
-
-Puede arrastrar y soltar archivos de etiquetas desde el escritorio al área de diseño de etiquetas.
-
-Los diseños de etiquetas se gestionan mediante los botones **Cargar** y **Guardar** de la barra de herramientas.
-
-- Para cargar un diseño de etiqueta, haga clic en el botón **Cargar** y designe el diseño que desea cargar mediante el cuadro de diálogo Abrir archivo (si ya existe un diseño de etiqueta en el asistente, 4D lo sustituye por el que ha cargado).
-- Para guardar un diseño de etiqueta, haga clic en el botón **Guardar** e indique el nombre y la ubicación del diseño que desea crear.
-
-### Formato del archivo
-
-La extensión de archivo de las etiquetas 4D guardadas por el asistente es ".4lbp". Tenga en cuenta que este formato es abierto, ya que está escrito internamente en XML.
-
-### Precargando archivos de etiqueta
-
-El editor de etiquetas le permite almacenar archivos de etiquetas dentro de su aplicación, de forma que los diseños de etiquetas puedan ser seleccionados y abiertos por el usuario directamente mediante el botón **Cargar**.
-
-Para ello, basta con crear una carpeta llamada `Labels` en la [carpeta Resources](../Project/architecture.md#resources) del proyecto y copiar en ella los archivos de etiquetas:
-
-
-
-:::note
-
-Se admiten tanto los archivos ".4lbp" estándar como los generados por el asistente anterior (".4lb").
-
-:::
-
-Cuando se inicia el Asistente de etiquetas, si se detecta esta carpeta y contiene archivos de etiquetas válidos, se añade un icono emergente al botón **Cargar**. Los modelos de etiquetas pueden seleccionarse a través de una línea de menú:
-
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Events/onAfterEdit.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Events/onAfterEdit.md
deleted file mode 100644
index 36a92919469a8b..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Events/onAfterEdit.md
+++ /dev/null
@@ -1,114 +0,0 @@
----
-id: onAfterEdit
-title: On After Edit
----
-
-| Code | Puede ser llamado por | Definición |
-| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
-| 45 | [Área 4D View Pro](../FormObjects/viewProArea_overview.md) - [Área 4D Write Pro](../FormObjects/writeProArea_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - Formulario - [Entrada](FormObjects/input_overview.md) - [Lista Jerárquica](FormObjects/list_overview.md) - [Lista de selección](FormObjects/listbox_overview.md) - [Columna de lista de selección](FormObjects/listbox_overview.md#list-box-columns) | El contenido del objeto introducible que tiene el foco acaba de ser modificado |
-
-## Descripción
-
-### Caso general
-
-Este evento se puede utilizar para filtrar la entrada de datos en los objetos editables por teclado en el nivel más bajo.
-
-Cuando se utiliza, este evento se genera después de cada cambio realizado en el contenido de un objeto editable, independientemente de la acción que haya provocado la modificación, *es decir*:
-
-- Acciones de edición estándar que modifican el contenido como pegar, cortar, borrar o cancelar;
-- Soltar un valor (acción similar a pegar);
-- Toda entrada de teclado realizada por el usuario; en este caso, el evento `On After Edit` se genera después de los eventos [`On Before Keystroke`](onBeforeKeystroke. d) y [`On After Keystroke`](onAfterKeystroke.md), si se utilizan.
-- Cualquier modificación realizada mediante un comando del lenguaje que simule una acción del usuario (es decir, `POST KEY`).
-
-Dentro del evento `On After Edit`, los datos de texto que se ingresan son devueltos por el comando [`Get edited text`](../commands-legacy/get-edited-text.md).
-
-### 4D View Pro
-
-El objeto devuelto por el comando `FORM Event` contiene:
-
-| Propiedad | Tipo | Descripción |
-| ----------- | ------------ | --------------------------------------------------------------------------------------------------- |
-| code | entero largo | On After Edit |
-| description | text | "On After Edit" |
-| objectName | text | Nombre del área 4D View Pro |
-| sheetName | text | Nombre de la hoja del evento |
-| action | text | "editChange", "valueChanged", "DragDropBlock", "DragFillBlock", "formulaChanged", "clipboardPasted" |
-
-En función del valor de la propiedad `action`, el [objeto evento](overview.md#event-object) contendrá propiedades adicionales.
-
-#### action = editChange
-
-| Propiedad | Tipo | Descripción |
-| ----------- | ------- | -------------------------------------- |
-| range | object | Rango de celdas |
-| editingText | variant | El valor proveniente del editor actual |
-
-#### action = valueChanged
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------- | ------------------------------------------ |
-| range | object | Rango de celdas |
-| oldValue | variant | Valor de la celda antes de la modificación |
-| newValue | variant | Valor de la celda luego de la modificación |
-
-#### action = DragDropBlock
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------- | --------------------------------------------------------------------- |
-| fromRange | object | Rango de celdas fuente (que se arrastra) |
-| toRange | object | Rango de la celda de destino (ubicación de soltar) |
-| copy | boolean | Indica si el rango fuente se copia o no |
-| insert | boolean | Indica si el rango fuente se inserta o no |
-
-#### action = DragFillBlock
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| fillRange | object | Gama utilizada para el relleno |
-| autoFillType | entero largo | Valor utilizado para el llenado.
0: las celdas se llenan con todos los datos (valores, formato y fórmulas)
1: las celdas se llenan con datos secuenciales automáticamente
2: las celdas se llenan solo con formato
3: las celdas se llenan con valores pero no con formato
4: los valores se eliminan de las celdas
5: las celdas se llenan automáticamente
|
-| fillDirection | entero largo | Dirección del llenado.
0: se llenan las celdas a la izquierda
1: se llenan las celdas a la derecha
2: se llenan las celdas de arriba
3: se llenan las celdas de abajo
|
-
-#### action = formulaChanged
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------ | ---------------------- |
-| range | object | Rango de celdas |
-| formula | text | La fórmula introducida |
-
-#### action = clipboardPasted
-
-| Propiedad | Tipo | Descripción |
-| ----------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| range | object | Rango de celdas |
-| pasteOption | entero largo | Especifica lo que se pega en el portapapeles:
0: todo es pegado (valores, formato y fórmulas)
1: solo los valores se pegan
2: solo el formato se pega
3: solo las fórmulas se pegan
4: los valores y el formato se pegan (no las fórmulas)
5: las fórmulas y el formato se pegan (no los valores)
|
-| pasteData | object | Los datos del portapapeles a pegar
.**Nota**: cuando se selecciona un objeto de tipo Texto o Cuadro de Grupo, presionando la tecla **Enter** se pasa al modo edición.
|
-|  | [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. |
-|  | [Mover](#mover-objetos) | 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. |
-|  | [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. |
-|  | [Alineación](#alineación-objetos) | Este botón está asociado a un menú que permite alinear los objetos en el formulario. Está activado (o no) dependiendo de los objetos seleccionados. Desactivado si la posición de un objeto seleccionado está bloqueada por una propiedad CSS |
-|  | [Distribución](#distribución-objetos) | Este botón está asociado a un menú que permite repartir los objetos en el formulario. Está activado (o no) dependiendo de los objetos seleccionados. Desactivado si la posición de un objeto seleccionado está bloqueada por una propiedad CSS |
-|  | [Nivel](#layering-objects) | Este botón está asociado a un menú que permite cambiar el nivel de los objetos en el formulario. Se activa (o no) en función de los objetos seleccionados. |
-|  | [Agrupar/Desagrupar](#grouping-objects) | Este botón está asociado a un menú que permite agrupar y desagrupar la selección de objetos del formulario. Se activa (o no) en función de los objetos seleccionados. |
-|  | [Visualización y gestión de páginas](forms.html#form-pages) | Esta área permite pasar de una página de formulario a otra y añadir páginas. Para navegar entre las páginas del formulario, haga clic en los botones de flecha o en el área central y elija la página que desea visualizar en el menú que aparece. Si pulsa el botón flecha derecha mientras se muestra la última página del formulario, 4D le permite añadir una página. |
-|  | [Vista previa CSS](#css-preview) | Este botón se utiliza para seleccionar el modo CSS a utilizar. |
-|  | [Gestión de vistas](#vistas) | Este botón muestra u oculta la paleta de vistas. Esta función se detalla en la sección Utilizar las vistas de objeto. |
-|  | [Visualización de escudos](#shields) | Cada clic en este botón provoca la visualización sucesiva de todos los tipos de escudos de formulario. El botón también está vinculado a un menú que permite seleccionar directamente el tipo de escudo a mostrar. |
-|  | [Biblioteca de objetos preconfigurada](objectLibrary.html) | Este botón muestra la librería de objetos preconfigurada que ofrece numerosos objetos con ciertas propiedades que han sido predefinidas. |
-|  | [Generador de list box](#list-box-builder) | Este botón crea nuevos list box de tipo selección de entidades. |
-|  | [Insertar campos](#insertar-campos) | Este botón inserta en el formulario todos los campos (excepto los de tipo objeto y blob) de la tabla del formulario, junto con sus etiquetas y respetando las normas de la interfaz. |
-
-### Barra de objetos
-
-La barra de objetos contiene todos los objetos activos e inactivos que se pueden utilizar en los formularios 4D. Algunos objetos se agrupan por temas. Cada tema incluye varias alternativas entre las que puede elegir. Cuando la barra de objetos tiene el foco, puede seleccionar los botones utilizando las teclas del teclado. La siguiente tabla describe los grupos de objetos disponibles y su tecla de acceso directo asociada.
-
-| Botón | Agrupar | Llave |
-| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---: |
-|  | [Text](FormObjects/text.md) / [Group Box](FormObjects/groupBox.md) | T |
-|  | [Entrada](FormObjects/input_overview.md) | F |
-|  | [Lista jerárquica](FormObjects/list_overview.md) / [List Box](FormObjects/listbox_overview.md) | L |
-|  | [Combo Box](FormObjects/comboBox_overview.md) / [Lista desplegable](FormObjects/dropdownList_Overview.md) / [Menú emergente de imágenes](FormObjects/picturePopupMenu_overview.md) | P |
-|  | [Botón](FormObjects/button_overview.md) / [Botón imagen](FormObjects/pictureButton_overview.md) / [Rejilla de botones](FormObjects/buttonGrid_overview.md) | B |
-|  | [Botón de radio](FormObjects/radio_overview.md) | R |
-|  | [Casilla de verificación](FormObjects/checkbox_overview.md) | C |
-|  | [Indicador de progreso](FormObjects/progressIndicator.md) / [Regla](FormObjects/ruler.md) / [Stepper](FormObjects/stepper.md) / [Spinner](FormObjects/spinner.md) | I |
-|  | [Rectángulo](FormObjects/shapes_overview.md#rectangle) / [Línea](FormObjects/shapes_overview.md#line) / [Óvalo](FormObjects/shapes_overview.md#oval) | S |
-|  | [Splitter](FormObjects/splitters.md) / [Control de pestañas](FormObjects/tabControl.md) | D |
-|  | [Área de plug-in ](FormObjects/pluginArea_overview.md) / [Subformulario](FormObjects/subform_overview.md) / [Área Web](FormObjects/webArea_overview.md) / [4D Write Pro](FormObjects/writeProArea_overview.md) / [4D View Pro](FormObjects/viewProArea_overview | X |
-
-Para dibujar un tipo de objeto, seleccione el botón correspondiente y luego trace el objeto en el formulario. Después de crear un objeto, puede modificar su tipo utilizando la lista de propiedades. Para dibujar un tipo de objeto, seleccione el botón correspondiente y luego trace el objeto en el formulario. Las líneas se limitan a horizontales, 45° o verticales, los rectángulos se limitan a cuadrados y los óvalos se limitan a círculos.
-
-La variante actual del tema es el objeto que se insertará en el formulario. Al hacer clic en la parte derecha de un botón, se accede al menú de variantes:
-
-
-
-Puede presionar dos veces el botón para que permanezca seleccionado incluso después de haber trazado un objeto en el formulario (selección continua). Esta función facilita la creación de varios objetos sucesivos del mismo tipo. Para cancelar una selección continua, haga clic en otro objeto o herramienta.
-
-### Lista de propiedades
-
-
-
-Tanto los formularios como los objetos de formulario tienen propiedades que controlan el acceso al formulario, la apariencia del mismo y el comportamiento del formulario cuando se utiliza. Las propiedades del formulario incluyen, por ejemplo, el nombre del formulario, su barra de menú y su tamaño. Las propiedades de los objetos incluyen, por ejemplo, su nombre, sus dimensiones, su color de fondo y su fuente.
-
-Puede visualizar y modificar las propiedades de los objetos y formularios utilizando la lista de propiedades. Muestra las propiedades del formulario o de los objetos en función de lo que se seleccione en la ventana del editor.
-
-Para mostrar/ocultar la lista de propiedades, seleccione **Lista de propiedades** en el menú **Formulario** o en el menú contextual del editor de formularios. También puede mostrarlo haciendo doble clic en una área vacía del formulario.
-
-#### Atajos
-
-Puede utilizar los siguientes atajos en la Lista de propiedades:
-
-- **Tecla de flecha**s ↑ ↓: se utiliza para pasar de una celda a otra.
-- **Teclas flechas** ← →: se utiliza para expandir/contraer los temas o entrar en el modo de edición.
-- **PgUp** y **PgDn**: selecciona la primera o la última celda visible de la lista mostrada.
-- **Inicio** y **Fin**: selecciona la primera o la última celda de la lista.
-- **Ctrl+clic** (Windows) o **Comando+clic** (macOS) sobre un evento: utilizado para seleccionar/deseleccionar cada evento de la lista, según el estado inicial del evento sobre el que se ha hecho clic.
-- **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en la etiqueta de un tema: Permite contraer/expandir todos los temas de la lista.
-- **Ctrl+clic** (Windows) o **Comando+clic** (macOS) sobre un valor de propiedad mostrado en **negrita**: restablece la propiedad a su valor por defecto.
-
-## Manipulación de objetos formulario
-
-### Añadir objetos
-
-Puede añadir objetos en los formularios de varias maneras:
-
-- Dibujando el objeto directamente en el formulario después de seleccionar su tipo en la barra de objetos (ver [Utilizando la barra de objetos](#object-bar))
-- Arrastrando y soltando el objeto desde la barra de objetos
-- Mediante operaciones de arrastrar y soltar o copiar y pegar sobre un objeto seleccionado de la [librería de objetos](objectLibrary.md) preconfigurada,
-- Arrastrando y soltando un objeto desde otro formulario,
-- Arrastrando y soltando un objeto desde el Explorador (campos) o desde otros editores del modo Diseño (listas, imágenes, etc.)
-
-Una vez insertado el objeto en el formulario, puede modificar sus características utilizando el editor de formularios.
-
-Puede trabajar con dos tipos de objetos en sus formularios:
-
-- **Objetos estáticos** (líneas, marcos, imágenes de fondo, etc.): estos objetos se utilizan generalmente para definir la apariencia del formulario y sus etiquetas, así como para la interfaz gráfica. Están disponibles en la barra de objetos del editor de formularios. Están disponibles en la barra de objetos del editor de formularios. Están disponibles en la barra de objetos del editor de formularios. Los objetos estáticos no tienen variables asociadas como los objetos activos. Sin embargo, se pueden insertar objetos dinámicos en objetos estáticos.
-
-- **Objetos activos**: estos objetos realizan tareas o funciones en la interfaz y pueden adoptar muchas formas: campos, botones, listas desplazables, etc. Cada objeto activo está asociado a un campo o a una variable.
-
-### Seleccionar los objetos
-
-Antes de poder realizar cualquier operación en un objeto (como cambiar el ancho de la línea o la fuente), debe seleccionar el objeto que desea modificar.
-
-Para seleccionar un objeto utilizando la barra de herramientas:
-
-1. Haz clic en la herramienta Flecha en la barra de herramientas.

-
-
Cuando se mueve el puntero en el área del formulario, se convierte en un puntero estándar con forma de flecha
.
-
-2. Haga clic en el objeto que desea seleccionar. Las asas de redimensionamiento identifican el objeto seleccionado.

-
-Para seleccionar un objeto utilizando la Lista de propiedades:
-
-1. Seleccione el nombre del objeto en la lista desplegable de objetos situada en la parte superior de la lista de propiedades. Con estos dos métodos, puede seleccionar un objeto que esté oculto por otros objetos o que se encuentre fuera del área visible de la ventana actual.
- Para deseleccionar un objeto, haga clic fuera del límite del objeto o **Mayúsculas+clic** en el objeto.
-
-> También es posible seleccionar objetos haciendo doble clic en la ventana de resultados de la operación "Buscar en diseño".
-
-### Selección de múltiples objetos
-
-Es posible que desee realizar la misma operación en más de un objeto de un formulario, por ejemplo, para mover los objetos, alinearlos o cambiar su apariencia. 4D le permite seleccionar varios objetos al mismo tiempo. Hay varias formas de seleccionar varios objetos:
-
-- Seleccione **Seleccionar todo** en el menú Edición para seleccionar todos los objetos.
-- Haga clic con el botón derecho en el objeto y elija el comando **Seleccionar objetos del mismo tipo** en el menú contextual.
-- Mantenga presionada la tecla **Mayús** y haga clic en los objetos que desee seleccionar.
-- Comience en una ubicación fuera del grupo de objetos que desea seleccionar y arrastre un marco (a veces llamado rectángulo de selección) alrededor de los objetos. Al soltar el botón del ratón, si alguna parte de un objeto se encuentra dentro o toca los límites del rectángulo de selección, ese objeto queda seleccionado.
-- Mantenga presionada la tecla **Alt** (Windows) o la tecla **Opción** (macOS) y dibuje un rectángulo de selección. Se selecciona todo objeto que esté completamente encerrado por el marco.
-
-La imagen siguiente muestra el dibujo de un rectángulo para seleccionar dos objetos:
-
-
-
-Para deseleccionar un objeto que forma parte de un grupo de objetos seleccionados, mantenga presionada la tecla **Mayús** y haga clic en el objeto. Los demás objetos permanecen seleccionados. Para deseleccionar todos los objetos seleccionados, haga clic fuera de los límites de todos los objetos.
-
-### Duplicar los objetos
-
-Puede duplicar todo objeto de formulario, incluidos los objetos activos. Las copias de los objetos activos conservan todas las propiedades del objeto original, incluidos el nombre, el tipo, la acción estándar, el formato de visualización y el método objeto.
-
-Puede duplicar un objeto directamente con la herramienta Duplicar de la paleta Herramientas o utilizar la caja de diálogo Duplicar varios para duplicar un objeto más de una vez. Además, a través de esta caja de diálogo, se puede definir la distancia entre dos copias.
-
-Para duplicar uno o más objetos:
-
-1. Seleccione el objeto u objetos que desea duplicar.
-2. Elija **Duplicar** en el menú **Edición**. 4D crea una copia de cada objeto seleccionado y coloca la copia delante y justo al lado del original.
-3. Mueva la copia (o las copias) a la ubicación deseada.
- Si vuelve a elegir el elemento de menú Duplicar, 4D crea otra copia de cada objeto y la mueve exactamente a la misma distancia y dirección de la primera copia. Si necesita distribuir copias del objeto a lo largo de una línea, debe utilizar el siguiente procedimiento. Duplique el objeto original, mueva la copia a otro lugar del formulario y luego duplique la copia. La segunda copia se coloca automáticamente en la misma posición que la primera copia tenía en relación con el objeto original. Las copias posteriores también se sitúan en la misma relación con sus originales. La siguiente figura explica el funcionamiento de la ubicación relativa de las copias:
-
-
-
-#### Duplicar muchos
-
-La caja de diálogo "Duplicar muchos" aparece cuando se selecciona uno o más objetos y se elige el comando **Duplicar muchos...** del menú **Objeto**.
-
-
-
-- En el área superior, introduzca el número de columnas y líneas de objetos que desea obtener. Por ejemplo, si desea tres columnas y dos líneas de objetos, introduzca 3 en el área Columna(s) y 2 en el área Línea(s). En el área superior, introduzca el número de columnas y líneas de objetos que desea obtener.
-
-- Para las líneas y columnas, defina el desplazamiento que desea aplicar a cada copia. El valor debe expresarse en puntos. It will be applied to each copy, or copies, in relation to the original object. For example, if you want to leave a vertical offset of 20 points between each object and the height of the source object is 50 points, enter 70 in the column’s “Offset” area.
-
-- Si desea crear una matriz de variables, seleccione la opción **Numerar las variables** y seleccione la dirección en la que se van a numerar las variables, ya sea por línea(s) o por columna(s).
- Esta opción sólo se activa cuando el objeto seleccionado es una variable. Para más información sobre esta opción, consulte **Duplicar en una matriz** en el *Manual de diseño*.
-
-### Mover objetos
-
-Puede mover todo gráfico u objeto activo del formulario, incluidos los campos y los objetos creados con una plantilla. Al mover un objeto, tiene las siguientes opciones:
-
-- Mover el objeto arrastrándolo,
-- Mover el objeto un píxel a la vez utilizando las teclas de flecha,
-- Mover el objeto por pasos utilizando las teclas de flecha (pasos de 20 píxeles por defecto),
-
-Al comenzar a arrastrar el objeto seleccionado, sus controles desaparecen. 4D muestra marcadores que indican la ubicación de los límites del objeto en las reglas para que pueda colocar el objeto exactamente donde lo quiere. Tenga cuidado de no arrastrar un mango. Al arrastrar un mango se cambia el tamaño del objeto. Puede presionar la tecla **Mayúsculas** para realizar el movimiento con una restricción.
-
-Cuando la [rejilla magnética](#using-the-magnetic-grid) está activada, los objetos se mueven por etapas indicando ubicaciones perceptibles.
-
-Para mover un objeto un píxel por píxel:
-
-- Seleccione el objeto u objetos y utilice las teclas de flecha del teclado para mover el objeto. Cada vez que se presiona una tecla flecha, el objeto se mueve un píxel en la dirección de la flecha.
-
-Mover un objeto por pasos:
-
-- Selecciona el objeto u objetos que quiera mover y mantenga presionada la tecla **Mayúsculas** y utilice las teclas de dirección para mover el objeto por pasos. Por defecto, los pasos son de 20 píxeles cada vez. Puede cambiar este valor en la página Formularios de las Preferencias.
-
-### Agrupar objetos
-
-4D le permite agrupar objetos para que pueda seleccionar, mover y modificar el grupo como un solo objeto. Los objetos agrupados conservan su posición en relación con los demás. Lo normal es agrupar un campo y su etiqueta, un botón invisible y su icono, etc.
-
-Cuando se redimensiona un grupo, todos los objetos del grupo se redimensionan proporcionalmente (excepto las áreas de texto, que se redimensionan por pasos según el tamaño de sus fuentes).
-
-Puede desagrupar un grupo de objetos para tratarlos de nuevo como objetos individuales.
-
-Un objeto activo que ha sido agrupado debe ser desagrupado antes de poder acceder a sus propiedades o métodos. Sin embargo, es posible seleccionar un objeto perteneciente a un grupo sin reagrupar el conjunto: para ello, **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en el objeto (el grupo debe estar seleccionado previamente).
-
-La agrupación sólo afecta a los objetos en el editor de formularios. Cuando se ejecuta el formulario, todos los objetos agrupados actúan como si estuvieran desagrupados.
-
-> La rejilla magnética también influye en el redimensionamiento manual de los objetos.
-
-Para agrupar los objetos:
-
-1. Seleccione los objetos que desea agrupar.
-2. Elija **Agrupar** en el menú Objetos. O
- Haga clic en el botón Agrupar en la barra de herramientas del editor de formularios:

- 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. Seleccione **Desagrupar** en el menú **Objeto**.
O
Haga clic en el botón **Desagrupar** (variante del botón **Agrupar**) en la barra de herramientas del editor de formularios.
Si **Desagrupar** está atenuado, esto significa que el objeto seleccionado ya está separado en su forma más sencilla.
4D marca los límites de los objetos individuales con manijas.
-
-### Alinear objetos
-
-Puede alinear los objetos entre sí o mediante una rejilla invisible en el formulario.
-
-- Cuando se alinea un objeto con otro, se puede alinear con la parte superior, inferior, lateral o con el centro horizontal o vertical del otro objeto. Puede alinear directamente una selección de objetos utilizando las herramientas de alineación o aplicar ajustes de alineación más avanzados utilizando el Asistente de Alineación. Esta última opción permite, por ejemplo, definir el objeto que se utilizará como referencia de posición y previsualizar la alineación en el formulario antes de aplicarla.
-- Cuando se utiliza la rejilla invisible, cada objeto puede alinearse manualmente con otros basándose en posiciones "perceptibles" que se representan con líneas de puntos que aparecen cuando el objeto que se mueve se acerca a otros objetos.
-
-#### Utilizar las herramientas de alineación directa
-
-Las herramientas de alineación de la barra de herramientas y del submenú Alinear del menú Objeto permiten alinear rápidamente los objetos seleccionados.
-
-
-
-Cuando 4D alinea los objetos, deja un objeto seleccionado en su lugar y alinea el resto de los objetos a ese. Este objeto es el "ancla." Utiliza el objeto que está más lejos en la dirección de la alineación como ancla y alinea los otros objetos a ese objeto. Por ejemplo, si quiere realizar una alineación a la derecha en un conjunto de objetos, el objeto más a la derecha se utilizará como ancla.
-La figura siguiente muestra objetos sin alineación, "alineados a la izquierda", "alineados horizontalmente por centros" y "alineados a la derecha":
-
-
-
-#### Utilizar el asistente de alineación
-
-El Asistente de Alineación permite realizar cualquier tipo de alineación y/o distribución de objetos.
-
-
-
-Para mostrar esta caja de diálogo, seleccione los objetos que desee alinear y, a continuación, elija el comando **Alineación** del submenú **Alinear** del menú **Objeto** o del menú contextual del editor.
-
-- En las áreas "Alineación izquierda/derecha" y/o "Alineación superior/inferior", haga clic en el icono que corresponda a la alineación que desee realizar.
El área de ejemplo muestra los resultados de su selección.
-
-- Para realizar una alineación que utilice el esquema de anclaje estándar, haga clic en **Ver** o **Aplicar**. En este caso, 4D utiliza el objeto que está más lejos en la dirección de la alineación como ancla y alinea los otros objetos a ese objeto. Por ejemplo, si quiere realizar una alineación a la derecha en un conjunto de objetos, el objeto más a la derecha se utilizará como ancla. O:
para alinear los objetos a un objeto específico, seleccione la opción **Alinear en** y seleccione el objeto al que desea que se alineen los demás objetos de la lista de objetos. En este caso, la posición del objeto de referencia no se alterará.
-
-Puede previsualizar los resultados de la alineación haciendo clic en el botón **Previsualización**. Los objetos se alinean entonces en el editor de formularios, pero como la caja de diálogo permanece en el primer plano, aún puede cancelar o aplicar la alineación.
-
-> Esta caja de diálogo le permite alinear y distribuir objetos en una sola operación. Para más información sobre cómo distribuir objetos, consulte [Repartir objetos](#distributing-objects).
-
-#### Utilizar la rejilla magnética
-
-El editor de formularios dispone de una rejilla magnética virtual que puede ayudarle a colocar y alinear objetos en un formulario. La alineación magnética de los objetos se basa en su posición con respecto a los demás. La rejilla magnética sólo puede utilizarse cuando hay al menos dos objetos en el formulario.
-
-Esto funciona de la siguiente manera: cuando mueve un objeto en el formulario, 4D indica las posibles ubicaciones de este objeto basándose en alineaciones notables con otros objetos formulario. Una alineación evidente se establece cada vez que:
-
-- Horizontalmente, los bordes o centros de dos objetos coinciden,
-- Verticalmente, los bordes de dos objetos coinciden.
-
-Cuando esto ocurre, 4D coloca el objeto en el lugar y muestra una línea roja que indica la alineación notable que se ha tenido en cuenta:
-
-
-
-En cuanto a la distribución de los objetos, 4D ofrece una distancia basada en los estándares de interfaz. Al igual que en el caso de la alineación magnética, las líneas rojas indican las diferencias notables una vez alcanzadas.
-
-
-
-Este funcionamiento se aplica a todos los tipos de objetos de los formularios. La rejilla magnética puede activarse o desactivarse en cualquier momento utilizando el comando **Activar la rejilla magnética** del menú **Formulario** o del menú contextual del editor. También es posible definir la activación de esta función por defecto en la página **Preferencias** > **Formularios** (opción **Activar la alineación automática por defecto**). Puede activar o desactivar manualmente la rejilla magnética cuando se selecciona un objeto presionando la tecla **Ctrl** (Windows) o **Control** (macOS) .
-
-> La rejilla magnética también influye en el redimensionamiento manual de los objetos.
-
-### Distribuir los objetos
-
-Puede repartir los objetos de manera que queden dispuestos con el mismo espacio entre ellos. Para ello, puede distribuir los objetos utilizando las herramientas de distribución de la paleta Herramientas o el Asistente de alineación. Este último le permite alinear y distribuir objetos en una sola operación.
-
-> Puede cambiar el orden de entrada en tiempo de ejecución utilizando los comandos `FORM SET ENTRY ORDER` y `FORM GET ENTRY ORDER`.
-
-Para repartir los objetos con igual espacio:
-
-1. Seleccione tres o más objetos y haga clic en la herramienta Distribuir correspondiente.
-
-2. En la barra de herramientas, haga clic en la herramienta de distribución correspondiente a la distribución que desea aplicar.

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 en consecuencia. 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:
-
-1. Seleccione los objetos que desea 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:
-
-3. En las áreas Alineación izquierda/derecha y/o Alineación superior/inferior, haga clic en el icono de distribución estándar: 
(Icono de distribución horizontal estándar)
El área de ejemplo muestra los resultados de su selección.
-
-4. Para realizar una distribución que utiliza el esquema estándar, haga clic en **Vista previa** o *Aplicar*.
En este caso, 4D realizará una distribución estándar para que los objetos estén espaciados de manera equitativa entre ellos.
O bien:
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 izquierdos, centros (hor.) y los lados derechos de los objetos seleccionados.
-- Verticalmente, los iconos corresponden a las siguientes distribuciones: uniformemente con respecto a los bordes superiores, centros (vert.) y los bordes inferiores de los objetos seleccionados.
-
-Puede previsualizar el resultado real de sus parámetros haciendo clic en el botón **Previsualización**: la operación se lleva a cabo en el editor de formularios, pero la caja de diálogo permanece en primer plano. Puede entoces **Cancelar** o **Aplicar** las modificaciones.
-
-> Esta caja de diálogo permite combinar la alineación y la distribución de objetos. Para más información sobre la alineación, consulte [Alinear objetos](#aligning-objects).
-
-### Gestionar los planos de los objetos
-
-A veces tendrá que reorganizar los objetos que obstruyen la vista de otros objetos del formulario. Por ejemplo, puede tener un gráfico que desee que aparezca detrás de los campos en un formulario. A veces tendrá que reorganizar los objetos que obstruyen la vista de otros objetos del formulario. Estas capas también determinan el orden de entrada por defecto (ver Modificación del orden de entrada de datos). La figura siguiente muestra objetos delante y detrás de otros objetos:
-
-
-
-Para mover un objeto a otro plano, selecciónelo y elija:
-
-- Uno de los comandos **Mover hacia atrás**, **Mover hacia delante**, **Subir un nivel** y **Bajar un nivel** en el menú Objeto,
-- Uno de los comandos del submenú **Plano>** del menú contextual del editor,
-- Uno de los comandos asociados al botón de gestión de los planos de la barra de herramientas.
-
-
-
-> Cuando se superponen varios objetos, se puede utilizar el atajo **Ctrl+Mayús+clic** / **Comando+Mayús+clic** para seleccionar cada objeto sucesivamente bajando un plano con cada clic.
-
-Al ordenar los diferentes niveles, 4D siempre va del fondo al primer plano. Como resultado, el nivel anterior desplaza la selección de objetos de un plano hacia el fondo del formulario. El siguiente nivel mueve la selección un plano hacia el primer plano del formulario.
-
-### Orden de entrada de los datos
-
-El orden de entrada de datos es el orden en el que se seleccionan los campos, subformularios y otros objetos activos al presionar la tecla **Tab** o la tecla **Retorno de carro** en un formulario de entrada. Es posible desplazarse por el formulario en sentido contrario (invertir el orden de entrada de datos) presionando las teclas **Mayúsc+Tab** o **Mayúsc+Retorno de carro** de retorno.
-
-> Puede cambiar el orden de entrada en tiempo de ejecución utilizando los comandos `FORM SET ENTRY ORDER` y `FORM GET ENTRY ORDER`.
-
-Todos los objetos que soportan la propiedad enfocable se incluyen por defecto en el orden de entrada de datos.
-
-Definir el orden de entrada para un formulario JSON se hace con la propiedad [`entryOrder`](properties_JSONref.md).
-
-Si no especifica un orden de entrada personalizado, 4D utiliza por defecto el plano de los objetos para determinar el orden de entrada en el sentido "fondo hacia primer plano." El orden de entrada estándar corresponde, por tanto, al orden de creación de los objetos en el formulario.
-
-En algunos formularios, se necesita definir un orden de entrada de datos personalizado. A continuación, por ejemplo, se han añadido campos adicionales relacionados con la dirección después de la creación del formulario. El orden de entrada estándar resultante se vuelve ilógico y obliga al usuario a introducir la información de forma extraña:
-
-
-
-En casos como éste, un orden de entrada de datos personalizado le permite introducir la información en un orden más lógico:
-
-
-
-#### Visualizar y modificar el orden de entrada de datos
-
-Puede ver el orden de entrada actual utilizando marcas "Orden de entrada" o utilizando el modo "Orden de entrada". Sin embargo, sólo puede modificar el orden de entrada utilizando el modo "Orden de entrada".
-
-Este párrafo describe la visualización y la modificación del orden de entrada en modo "Orden de entrada". Para más información sobre la visualización del orden de entrada utilizando marcas, consulte [Using shields](#using-shields).
-
-Para ver o cambiar el orden de entrada:
-
-1. Seleccione **Orden de entrada** en el menú **Formulario** o haga clic en el botón Orden de entrada en la barra de herramientas de la ventana:

-
- 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. 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..

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.
-
-4. Cuando esté satisfecho con el orden de entrada de datos, haga clic en cualquier herramienta no seleccionada de la barra de herramientas o elija **Orden de entrada** en el menú **Formulario**. 4D vuelve al modo de funcionamiento normal del editor de formularios.
-
-> Sólo se muestra el orden de entrada de la página actual del formulario. Si el formulario contiene objetos editables en la página 0 o procedentes de un formulario heredado, el orden de entrada por defecto es el siguiente: objetos de la página 0 del formulario heredado > Objetos de la página 1 del formulario heredado > Objetos de la página 0 del formulario abierto > Objetos de la página actual del formulario abierto.
-
-#### Utilizar un grupo de entrada
-
-Cuando se cambia el orden de entrada, se puede seleccionar un grupo de objetos en el formulario para que el orden de entrada estándar se aplique a los objetos del grupo. Esto le permite definir fácilmente el orden de entrada para los formularios en los que los campos están separados en grupos o columnas.
-
-Para crear un grupo de entrada:
-
-1. Seleccione **Orden de entrada** en el menú *Formulario* o haga clic en el botón de la barra de herramientas.
-2. Dibuje un rectángulo de selección alrededor de los objetos que desee agrupar para la entrada de datos.
-
-Al soltar el botón del ratón, los objetos encerrados o tocados por el rectángulo siguen el orden de entrada por defecto. El orden de entrada de los otros objetos restantes se ajusta según sea necesario.
-
-#### Excluir un objeto del orden de entrada
-
-Por defecto, todos los objetos que soportan la propiedad enfocable se incluyen en el orden de entrada. Para excluir un objeto del orden de entrada:
-
-1. Seleccione el modo de orden de entrada, y luego
-
-2. **Mayúsculas-clic** en el objeto
-
-3. **haga clic derecho** en el objeto y seleccione la opción **Eliminar del orden de entrada** del menú contextual
-
-## Vista previa del CSS
-
-El editor de formularios le permite ver sus formularios con o sin valores CSS aplicados.
-
-Cuando se han definido [hojas de estilo](createStylesheet.md), los formularios (incluidos los formularios y subformularios heredados) se abren por defecto en el modo de vista previa CSS para su sistema operativo.
-
-### Seleccionando el modo de vista previa CSS
-
-La barra de herramientas del editor de formularios ofrece un botón CSS para ver los objetos con estilo:
-
-
-
-Seleccione uno de los siguientes modos de vista previa en el menú:
-
-| Icono barra de herramientas | Modo de vista previa CSS | Descripción |
-| --------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-|  | Ninguno | No se aplican valores CSS en el formulario y no se muestran valores o iconos CSS en la lista de propiedades. |
-|  | Windows | Los valores CSS para la plataforma Windows se aplican en el formulario. Los valores e iconos CSS que se muestran en la lista de propiedades. |
-|  | macOS | Los valores CSS para la plataforma macOS se aplican en el formulario. Los valores e iconos CSS que se muestran en la lista de propiedades. |
-
-> Si se define un tamaño de fuente demasiado grande para un objeto en una hoja de estilo o JSON, el objeto se renderizará automáticamente para acomodar la fuente, sin embargo el tamaño del objeto no se modificará.
-
-El modo de vista previa CSS refleja el orden de prioridad aplicado a las hojas de estilo frente a los atributos JSON, tal y como se define en la sección [JSON vs Hoja de estilo](stylesheets.html#json-vs-style-sheet).
-
-Una vez seleccionado el modo de vista previa CSS, los objetos se muestran automáticamente con los estilos definidos en una hoja de estilo (si la hay).
-
-> Al copiar o duplicar objetos, sólo se copian las referencias CSS (si las hay) y los valores JSON.
-
-### Soporte CSS en la Lista de Propiedades
-
-En el modo Vista Previa CSS, si el valor de un atributo ha sido definido en una hoja de estilo, el nombre del atributo aparecerá con un icono CSS junto a él en la Lista de Propiedades. Por ejemplo, los valores de los atributos definidos en esta hoja de estilo:
-
-```4d
-.myButton {
-font-family: comic sans;
-font-size: 14;
-stroke: #800080;
-}
-```
-
-se muestran con un icono CSS en la lista de propiedades:
-
-
-
-Un valor de atributo definido en una hoja de estilo puede ser anulado en la descripción del formulario JSON (excepto si el CSS incluye la declaración `!important`, ver más abajo). En este caso, la lista de propiedades muestra el valor del formulario JSON en **negrita**. Puede restablecer el valor a su definición de hoja de estilo con los atajos **Ctrl + clic** (Windows) o **Comando + clic** (macOs).
-
-> Si un atributo ha sido definido con la declaración `!important` para un grupo, un objeto dentro de un grupo, o cualquier objeto dentro de una selección de múltiples objetos, el valor de ese atributo está bloqueado y no puede ser cambiado en la Lista de Pr
-
-#### Lista de propiedades de iconos CSS
-
-| Icono | Descripción |
-| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-|  | Indica que un valor de atributo ha sido definido en una hoja de estilo |
-|  | Indica que un valor de atributo ha sido definido en una hoja de estilo con la declaración `!important` |
-|  | Se muestra cuando un valor de atributo definido en una hoja de estilo para al menos un elemento de un grupo o una selección de varios objetos es diferente de los demás objetos |
-
-## Creación de list box
-
-Puede crear rápidamente nuevos list box de tipo selección de entidades con el **-Generador de list box**. El nuevo list box puede ser utilizado inmediatamente o puede ser editado a través del Editor de formularios.
-
-El generador de list box le permite crear y llenar los list box de tipo selección de entidades en unas pocas y sencillas operaciones.
-
-### Utilización del generador de list box
-
-1. En la barra de herramientas del Editor de formularios, haga clic en el icono del generador de list box:
-
-
-
-Se muestra el generador de list box:
-
-
-
-2. Seleccione una tabla de la lista desplegable **Tabla**:
-
-
-
-3. Seleccione los campos del list box en el área **Campos**:
-
-
-
-Por defecto, se seleccionan todos los campos. Puede seleccionar o deseleccionar los campos individualmente o utilizar **Ctrl+clic** (Windows) o **Cmd+clic** (macOS) para seleccionarlos o deseleccionarlos todos a la vez.
-
-Puede cambiar el orden de los campos arrastrándolos y soltándolos.
-
-4. La expresión para llenar las líneas del list box a partir de la selección de la entidad se llena previamente:
-
-
-
-Esta expresión puede modificarse si es necesario.
-
-5. Al hacer clic en el botón **Copiar** se copiará la expresión para cargar todos los registros en la memoria:
-
-
-
-6. Haga clic en el botón **Crear un widget** para crear el list box.
-
-
-
-El list box final:
-
-
-
-## Insertar campos
-
-El botón **Insertar campos** inserta en el formulario todos los campos (excepto los de tipo objeto y blob) de la tabla del formulario, junto con sus etiquetas y respetando las normas de la interfaz. Este asistente es un atajo para diseñar formularios de entrada básicos o formularios listados.
-
-El botón **Insertar campos** sólo está disponible con formularios tabla.
-
-El diseño del formulario resultante depende del tipo de formulario:
-
-- **Formulario detallado**: al hacer clic en el botón **Insertar campos** se genera un formulario con un diseño de página:
-
-
-
-- **Formulario listado**: al hacer clic en el botón **Insertar campos** se genera un diseño de formulario listado con campos organizados en una sola línea y marcadores de área:
-
-
-
-## Atajos
-
-El editor de formularios 4D utiliza marcas para facilitar la visualización de las propiedades de los objetos. Puede encontrarlos en la barra de herramientas del formulario:
-
-
-
-El principio de esta función es el siguiente: cada escudo está asociado a una propiedad (por ejemplo, **Vistas**, que significa que el objeto "está en la vista actual"). Al activar una marca, 4D muestra un pequeño icono (marca) en la parte superior izquierda de cada objeto del formulario donde se aplica la propiedad.
-
-
-
-### Utilizar marcas
-
-Para activar una marca, haga clic en el icono *Marca* de la barra de herramientas hasta seleccionar la marca deseada. También puede hacer clic en la parte derecha del botón y seleccionar el tipo de marca que desea mostrar directamente en el menú asociado:
-
-Si no quiere mostrar marcas, seleccione **Sin marcas** en el menú de selección.
-
-> La vista actual no se puede ocultar.
-
-### Descripciones de marcas
-
-A continuación se describe cada tipo de escudo:
-
-| Icono | Nombre | Se muestra... |
-| ----------------------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-|  | Método objeto | Para los objetos con un método objeto asociado |
-|  | Acción estándar | Para los objetos con una acción estándar asociada |
-|  | Redimensionamiento | Para los objetos con al menos una propiedad de redimensionamiento, indica la combinación de propiedades actuales |
-|  | Orden de entrada | En el caso de los objetos editables, indica el número de orden de entrada |
-|  | Vista actual | Para todos los objetos de la vista actual |
-|  | [Hojas de estilo](stylesheets.html) | Para objetos con uno o más valores de atributos reemplazados por una hoja de estilo. |
-|  | Filtro | Para los objetos introducibles con un filtro de entrada asociado |
-|  | Mensaje de ayuda | Para los objetos con un mensaje de ayuda asociado |
-|  | Localizado | Para los objetos cuya etiqueta proviene de una referencia (etiqueta que empieza por ":"). La referencia puede ser de tipo recurso (STR#) o XLIFF |
-|  | Sin marcas | No aparecen marcas |
-
-## Vistas
-
-El editor de formularios de 4D le permite crear formularios complejos distribuyendo los objetos formulario entre distintas vistas que pueden ocultarse o mostrarse según sea necesario.
-
-Por ejemplo, puede distribuir los objetos según su tipo (campos, variables, objetos estáticos, etc.). Todo tipo de objeto formulario, incluidos los subformularios y las áreas de plug-in, puede incluirse en las vistas.
-
-No hay límite en el número de vistas por formulario. Puedes crear tantas vistas diferentes como necesite. Además, cada vista puede mostrarse, ocultarse y/o bloquearse.
-
-La gestión de las vistas se realiza a través de la paleta de vistas.
-
-
-
-### Acceder a la paleta de vistas
-
-Hay tres formas de acceder a la paleta de vistas:
-
-- **Barra de herramientas**: haga clic en el icono Vistas de la barra de herramientas del Editor de formularios. (Este icono aparece en gris cuando al menos un objeto pertenece a una vista distinta de la vista por defecto.)
-
-| Sólo vista por defecto | Con vistas adicionales |
-| :-----------------------------------------------------: | :---------------------------------------------------: |
-|  |  |
-
-- **Menú contextual** (formulario u objeto): haga clic derecho en cualquier lugar del editor de formularios o de un objeto, y seleccione **Vista actual**
-
-
-
-La vista actual se indica con una marca de verificación (por ejemplo, "Dirección de trabajo" en la imagen superior)
-
-- **Menú Formulario**: haga clic en el menú **Formulario** y seleccione **Mostrar la lista**
-
-
-
-### Antes de comenzar
-
-Aquí hay algunas cosas importantes que hay que saber antes de empezar a trabajar con vistas:
-
-- **Contexto de uso**: las vistas son una herramienta puramente gráfica que sólo se puede utilizar en el Editor de formularios; no se puede acceder a las vistas por programación ni en el modo Aplicación.
-
-- **Vistas y páginas**: Los objetos de una misma vista pueden pertenecer a diferentes páginas del formulario; sólo se pueden mostrar los objetos de la página actual (y de la página 0 si es visible), independientemente de la configuración de las vistas.
-
-- **Vistas y niveles**: las vistas son independientes de los niveles de los objetos; no existe una jerarquía de visualización entre las diferentes vistas.
-
-- **Vistas y grupos**: sólo se pueden agrupar los objetos que pertenecen a la vista actual.
-
-- **Vistas actuales y por defecto**: la vista por defecto es la primera vista de un formulario y no se puede eliminar; la vista actual es la que se está editando y el nombre se muestra en negrita.
-
-### Gestión de vistas
-
-#### Crear vistas
-
-Todo objeto creado en un formulario se coloca en la primera vista ("Vista 1") del formulario. La primera vista es **siempre** la vista por defecto, indicada por (por defecto) después del nombre. El nombre de la vista puede cambiarse (ver [Renombrar vistas](#renaming-views)), sin embargo sigue siendo la vista por defecto.
-
-
-
-Hay dos maneras de añadir vistas adicionales:
-
-- Haga clic en el botón **Añadir una nueva vista** en la parte inferior de la paleta Vista:
-
-
-
-- Haga clic con el botón derecho en una vista existente y seleccione **Insertar vista**:
-
-
-
-No hay límite en el número de vistas.
-
-#### Renombrar vistas
-
-Por defecto las vistas se nombran como "Vista" + el número de la vista, sin embargo puede cambiar estos nombres para mejorar la legibilidad y adaptarse mejor a sus necesidades.
-
-Para cambiar el nombre de una vista, puede utilizar:
-
-- Hacer doble clic directamente en el nombre de la vista (la vista seleccionada en este caso). El nombre se convierte entonces en editable:
-
-
-
-- Haga clic derecho en el nombre de la vista. El nombre se convierte entonces en editable:
-
-
-
-#### Reordenar las vistas
-
-Puede cambiar el orden de visualización de las vistas haciendo arrastrar y soltar dentro de la paleta de vistas.
-
-Tenga en cuenta que la vista por defecto no cambia:
-
-
-
-#### Eliminar vistas
-
-Para cambiar el nombre de una vista, puede utilizar:
-
-- Haga clic en el botón **Eliminar la vista seleccionada** en la parte inferior de la paleta Vista:
-
-
-
-- Haga clic derecho en el nombre de la vista y seleccione **Eliminar la vista**:
-
-
-
-> La vista actual no se puede bloquear.
-
-### Utilización de las vistas
-
-Una vez creadas las vistas, puede utilizar la paleta de vistas para:
-
-- Añadir un objeto a las vistas,
-- Mover los objetos de una vista a otra,
-- Seleccionar todos los objetos de la misma vista con un solo clic,
-- Mostrar u ocultar objetos para cada vista,
-- Bloquear los objetos de una vista.
-
-#### Añadir los objetos a las vistas
-
-Un objeto sólo puede pertenecer a una única vista.
-
-Para crear un objeto en otra vista, basta con seleccionar la vista en la paleta de vistas (antes de crear el objeto) haciendo clic en su nombre (se muestra un icono de edición para la [Vista actual](#before-you-begin) y el nombre aparece en negrita):
-
-
-
-#### Mover objetos entre vistas
-
-También es posible mover uno o más objetos de una vista a otra. En el formulario, seleccione el o los objetos cuya vista desea modificar. La lista de vistas indica, utilizando un símbolo, la vista a la que pertenece la selección:
-
-
-
-> La selección puede contener varios objetos pertenecientes a diferentes vistas.
-
-Simplemente seleccione la vista de destino, haga clic derecho y seleccione **Mover a**:
-
-
-
-O
-
-Seleccione la vista de destino de la selección y haga clic en el botón **Mover a** de la parte inferior de la paleta de vistas:
-
-
-
-La selección se coloca entonces en la nueva vista:
-
-
-
-También puede mover un objeto a otra vista a través del menú contextual del objeto. Haga clic derecho en el objeto, seleccione **Mover a la vista** y seleccione una vista en la lista de vistas disponibles:
-
-
-
-> La [vista actual](#before-you-begin) se muestra en negrita.
-
-#### Seleccionar todos los objetos de una vista
-
-Puede seleccionar todos los objetos que pertenecen a la misma vista en la página actual del formulario. Esta función es útil para aplicar cambios globales a un conjunto de objetos.
-
-Para ello, haga clic derecho en la vista en la que desea seleccionar todos los objetos, haga clic en **Seleccionar todo**:
-
-
-
-También puede utilizar el botón situado en la parte inferior de la paleta de vistas:
-
-
-
-#### Mostrar u ocultar los objetos de una vista
-
-Puede mostrar u ocultar objetos pertenecientes a una vista en cualquier momento en la página actual del formulario. De este modo, podrá centrarse en determinados objetos al editar el formulario, por ejemplo.
-
-Por defecto, se muestran todas las vistas, como indica el icono *Mostrar/Ocultar*:
-
-
-
-Para ocultar una vista, haga clic en el icono *Mostrar/Ocultar*. Entonces se atenúa y los objetos de la vista correspondiente dejan de mostrarse en el formulario:
-
-
-
-> La [vista actual](#before-you-begin) no se puede ocultar.
-
-Para mostrar una vista que está oculta, simplemente selecciónela o haga clic en el icono *Mostrar/Ocultar* de esa vista.
-
-#### Bloquear los objetos de una vista
-
-Puede bloquear los objetos de una vista. Esto impide que se seleccionen, modifiquen o eliminen del formulario. Una vez bloqueado, un objeto no puede seleccionarse mediante un clic, un rectángulo o el comando **Seleccionar objetos similares** del menú contextual. Esta función es útil para evitar errores de manipulación.
-
-Por defecto, todas las vistas están desbloqueadas, como lo indica el icono *Bloquear/Desbloquear* que aparece junto a cada vista:
-
-
-
-Para bloquear los objetos de una vista, haga clic en el icono *Bloquear/Desbloquear*. El candado está cerrado, lo que significa que la vista está bloqueada:
-
-
-
-> La [vista actual](#before-you-begin) no se puede bloquear.
-
-Para desbloquear una vista que está bloqueada, basta con seleccionarla o hacer clic en el icono *Bloquear/Desbloquear* de esa vista.
-
-## Zoom
-
-Puede hacer zoom en el formulario actual. Pase al modo "Zoom" haciendo clic en el icono de la lupa o haciendo clic directamente en la barra de porcentaje deseada (50%, 100%, 200%, 400% y 800%):
-
-
-
-- Al hacer clic en la lupa, el cursor se convierte en una lupa. A continuación, puede hacer clic en el formulario para aumentar la visualización o mantener presionada la tecla Mayús y hacer clic para reducir el porcentaje de visualización.
-- Al hacer clic en una barra de porcentaje, la visualización se modifica inmediatamente.
-
-En el modo Zoom, todas las funciones del editor de formularios siguen estando disponibles(\*).
-
-(\*) Por razones técnicas, no es posible seleccionar los elementos del list box (encabezados, columnas, pies de página) cuando el editor de formularios está en modo Zoom.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/forms.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/forms.md
deleted file mode 100644
index f780ef9be2a24d..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/forms.md
+++ /dev/null
@@ -1,130 +0,0 @@
----
-id: forms
-title: Formularios
----
-
-Los formularios ofrecen la interfaz a través de la cual se introduce, modifica e imprime la información en una aplicación de escritorio. Los usuarios interactúan con los datos de una base de datos mediante formularios e imprimen informes utilizando formularios. Los formularios pueden utilizarse para crear cajas de diálogo personalizadas, paletas o toda ventana personalizada.
-
-
-
-Los formularios también pueden contener otros formularios a través de las siguientes funcionalidades:
-
-- [objetos de subformulario](FormObjects/subform_overview.md)
-- [formularios heredados](./properties_FormProperties.md#inherited-form-name)
-
-## Creación de formularios
-
-Puede añadir o modificar formularios 4D utilizando los siguientes elementos:
-
-- **La interfaz 4D Developer:** cree nuevos formularios desde el menú **Archivo** o la ventana del **Explorador**.
-- **El editor de formularios**: modifique sus formularios utilizando el **[editor de formularios](FormEditor/formEditor.md)**.
-- **El código JSON:** cree y diseñe sus formularios utilizando JSON y guarde los archivos de los formularios en la [ubicación adecuada](Project/architecture#sources). Ejemplo:
-
-```
-{
- "windowTitle": "Hello World",
- "windowMinWidth": 220,
- "windowMinHeight": 80,
- "method": "HWexample",
- "pages": [
- null,
- {
- "objects": {
- "text": {
- "type": "text",
- "text": "Hello World!",
- "textAlign": "center",
- "left": 50,
- "top": 120,
- "width": 120,
- "height": 80
- },
- "image": {
- "type": "picture",
- "pictureFormat": "scaled",
- "picture": "/RESOURCES/Images/HW.png",
- "alignment":"center",
- "left": 70,
- "top": 20,
- "width":75,
- "height":75
- },
- "button": {
- "type": "button",
- "text": "OK",
- "action": "Cancel",
- "left": 60,
- "top": 160,
-
-
- "width": 100,
- "height": 20
- }
- }
- }
- ]
-}
-```
-
-## Formulario proyecto y formulario tabla
-
-Hay dos categorías de formularios:
-
-- **Los formularios de proyecto** - Formularios independientes que no están unidos a ninguna tabla. Están pensados, sobre todo, para crear cajas de diálogo de interfaz, al igual que componentes. Los formularios proyecto pueden utilizarse para crear interfaces que cumplan fácilmente con los estándares del sistema operativo.
-
-- **Los formularios tablas** - Se adjuntan a tablas específicas y, por tanto, se benefician de funciones automáticas útiles para el desarrollo de aplicaciones basadas en bases de datos. Normalmente, una tabla tiene formularios de entrada y salida separados.
-
-Normalmente, se selecciona la categoría del formulario al crearlo, pero se puede cambiar después.
-
-## Páginas formulario
-
-Cada formulario consta de al menos dos páginas:
-
-- una página 1: una página principal, mostrada por defecto
-- una página 0: una página de fondo, cuyo contenido se muestra en todas las demás páginas.
-
-Puede crear varias páginas para un formulario de entrada. Si tiene más campos o variables de los que caben en una pantalla, puede crear páginas adicionales para mostrarlos. Las páginas múltiples le permiten hacer lo siguiente:
-
-- Coloque la información más importante en la primera página y la menos importante en otras.
-- Organice cada tema en su propia página.
-- Reducir o eliminar el desplazamiento durante la entrada de datos definiendo el [orden de entrada](formEditor.md#data-entry-order).
-- Deje espacio alrededor de los elementos del formulario para lograr un diseño de pantalla atractivo.
-
-Las páginas múltiples son útiles sólo para los formularios de entrada. No son para imprimir. Cuando se imprime un formulario de varias páginas, sólo se imprime la primera.
-
-No hay restricciones en el número de páginas que puede tener un formulario. El mismo campo puede aparecer un número ilimitado de veces en un formulario y en todas las páginas que desee. Sin embargo, cuantas más páginas tenga un formulario, más tiempo tardará en mostrarse.
-
-Un formulario multipáginas tiene una página de fondo y varias páginas de visualización. Los objetos que se colocan en la página de fondo pueden ser visibles en todas las páginas de visualización, pero sólo se pueden seleccionar y editar en la página de fondo. En los formularios multipágina, debe colocar su paleta de botones en la página de fondo. También es necesario incluir uno o más objetos en la página de fondo que ofrezcan las herramientas de navegación para el usuario.
-
-## Formularios heredados
-
-Los formularios 4D pueden utilizar y ser utilizados como "formularios heredados", lo que significa que todos los objetos de *Formulario A* pueden ser utilizados en *Formulario B*. En este caso, *Formulario B* "hereda" los objetos de *Formulario A*.
-
-Las referencias a un formulario heredado están siempre activas: si se modifica un elemento de un formulario heredado (estilos de botón, por ejemplo), se modificarán automáticamente todos los formularios que utilicen este elemento.
-
-Todos los formularios (formularios tabla y formularios proyecto) pueden ser designados como un formulario heredado. Sin embargo, los elementos que contienen deben ser compatibles con el uso en diferentes tablas de la base de datos.
-
-Cuando se ejecuta un formulario, los objetos se cargan y combinan en el siguiente orden:
-
-1. Página cero del formulario heredado
-2. Página 1 del formulario heredado
-3. Página cero del formulario abierto
-4. Página actual del formulario abierto.
-
-Este orden determina el [orden de entrada](formEditor.md#data-entry-order) de los objetos en el formulario.
-
-> Sólo las páginas 0 y 1 del formulario heredado pueden aparecer en otros formularios.
-
-Las propiedades y el método de un formulario no se tienen en cuenta cuando ese formulario se utiliza como formulario heredado. Por otro lado, se llaman los métodos de los objetos que contiene.
-
-Para definir un formulario heredado, el [nombre del formulario heredado](properties_FormProperties.md#inherited-form-name) y la [Tabla de formularios heredada](properties_FormProperties.md#inherited-form-table) (para el formulario tabla) las propiedades deben definirse en la forma que heredará algo de otro formulario.
-
-Un formulario puede heredar de un formulario proyecto, definiendo la propiedad [Inherited Form Table](properties_FormProperties.md#inherited-form-table) en `\` en la Lista de propiedades (o " " en JSON).
-
-Para dejar de heredar un formulario, seleccione `\` en la lista de propiedades (o " " en JSON) para la propiedad [Inherited Form Name](properties_FormProperties.md#inherited-form-name).
-
-> Es posible definir un formulario heredado en un formulario que eventualmente se utilizará como formulario heredado para un tercer formulario. La combinación de objetos se realiza de forma recursiva. 4D detecta los bucles recursivos (por ejemplo, si el formulario [table1]form1 se define como el formulario heredado de [table1]form1, es decir, él mismo) e interrumpe la cadena de formularios.
-
-## Propiedades soportadas
-
-[Barra de menú asociada](properties_Menu.md#associated-menu-bar) - [Altura fija](properties_WindowSize.md#fixed-height) - [Ancho fijo](properties_WindowSize.md#fixed-width) - [Divisor de formulario](properties_Markers.md#form-break) - [Detalle de formulario](properties_Markers.md#form-detail) - [Pie de formulario](properties_Markers.md#form-footer) - [Encabezado de formulario](properties_Markers.md#form-header) - [Nombre de formulario](properties_FormProperties.md#form-name) - [Tipo de formulario](properties_FormProperties.md#form-type) - [Nombre de formulario heredado](properties_FormProperties.md#inherited-form-name) - [Tabla de formulario heredado](properties_FormProperties.md#inherited-form-table) - [Altura máxima](properties_WindowSize.md#maximum-height-minimum-height) - [Ancho máximo](properties_WindowSize.md#maximum-width-minimum-width) - [Método](properties_Action.md#method) - [Altura mínima](properties_WindowSize.md#maximum-height-minimum-height) - [Ancho mínimo](properties_WindowSize.md#maximum-width-minimum-width) - [Páginas](properties_FormProperties.md#pages) - [Configuración de impresión](properties_Print.md#settings) - [Publicado como subformulario](properties_FormProperties.md#published-as-subform) - [Guardar geometría](properties_FormProperties.md#save-geometry) - [Título de ventana](properties_FormProperties.md#window-title)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/pictures.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/pictures.md
deleted file mode 100644
index 3a4324f0b77b30..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/pictures.md
+++ /dev/null
@@ -1,86 +0,0 @@
----
-id: pictures
-title: Imágenes
----
-
-4D soporta específicamente las imágenes utilizadas en sus formularios.
-
-## Formatos nativos soportados
-
-4D integra la gestión nativa de los formatos de imagen. Esto significa que las imágenes se mostrarán y almacenarán en su formato original, sin ninguna interpretación en 4D. Las características específicas de los diferentes formatos (sombreado, áreas transparentes, etc.) se mantendrán al ser copiados y pegados, y se mostrarán sin alteración. Este soporte nativo es válido para todas las imágenes almacenadas en los formularios de 4D: [imágenes estáticas](FormObjects/staticPicture.md) pegadas en el modo Diseño, imágenes pegadas en [objetos de entrada](FormObjects/input_overview.md) en ejecución,
-
-Los formatos de imagen más comunes son soportados en ambas plataformas: .jpeg, .gif, .png, .tiff, .bmp, etc. En macOS, el formato .pdf también está disponible para su codificación y descodificación.
-
-> La lista completa de formatos soportados varía según el sistema operativo y los códecs personalizados que estén instalados en las máquinas. Para saber qué códecs están disponibles, debe utilizar el comando `PICTURE CODEC LIST` (ver también la descripción de [tipo de datos imagen](Concepts/dt_picture.md)).
-
-### Formato de imagen no disponible
-
-Se muestra un icono específico para las imágenes guardadas en un formato que no está disponible en la máquina. La extensión del formato que falta se muestra en la parte inferior del icono:
-
-
-
-El icono se utiliza automáticamente en todos los lugares en los que se pretende visualizar la imagen:
-
-
-
-Este icono indica que la imagen no puede ser visualizada o manipulada localmente, pero puede ser guardada sin alteraciones para que pueda ser visualizada en otras máquinas. Este es el caso, por ejemplo, para las imágenes PDF en Windows, o las imágenes en formato PICT.
-
-## Imágenes de alta resolución
-
-4D soporta imágenes de alta resolución tanto en plataformas macOS como Windows. Las imágenes de alta resolución pueden definirse por el factor de escala o dpi.
-
-### Factor de escala
-
-Las pantallas de alta resolución tienen una mayor densidad de píxeles que las pantallas estándar tradicionales. Para que las imágenes se muestren correctamente en pantallas de alta resolución, el número de píxeles de la imagen debe multiplicarse por el *factor de escala* (*es decir*, dos veces más grande, tres veces más grande, etc.).
-
-Cuando se utilizan imágenes de alta resolución, se puede especificar el factor de escala añadiendo "@nx" en el nombre de la imagen (donde *n* designa el factor de escala). En la tabla siguiente, puede ver que el factor de escala se indica en los nombres de las imágenes de alta resolución, *circle@2x.png* y *circle@3x.png*.
-
-| Tipo de visualización | Factor de escala | Ejemplo |
-| --------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Resolución estándar | densidad de pixel 1:1. | **1x**  *circle.png* |
-| Alta resolución | La densidad de píxeles se ha multiplicado por 2 o 3. |
|
-
-Las imágenes de alta resolución con la convención @nx pueden utilizarse en los siguientes objetos:
-
-- [Imágenes estáticas](FormObjects/staticPicture.md)
-- [Botones](FormObjects/button_overview.md)/[radio](FormObjects/radio_overview.md)/[casillas de selección](FormObjects/checkbox_overview.md)
-- [Botones imagen](FormObjects/pictureButton_overview.md)/[imagen Pop-up](FormObjects/picturePopupMenu_overview.md)
-- [Controles de pestaña](FormObjects/tabControl.md)
-- [Encabezados de list box](FormObjects/listbox_overview.md#list-box-headers)
-- [Iconos de menú](Menus/properties.md#item-icon)
-
-4D prioriza automáticamente las imágenes con mayor resolución. 4D prioriza automáticamente las imágenes con mayor resolución. Incluso si un comando o propiedad especifica *circle.png*, se utilizará *circle@3x.png* (si existe).
-
-> Tenga en cuenta que la priorización de la resolución sólo se produce para la visualización de imágenes en pantalla, no se realiza una priorización automática al imprimir.
-
-### DPI
-
-Aunque 4D prioriza automáticamente la resolución más alta, existen, sin embargo, algunas diferencias de comportamiento en función de los ppp de la pantalla y de la imagen\*(\*)\*, y del formato de la imagen:
-
-| Operación | Comportamiento |
-| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Soltar o pegar | Si la imagen tiene:
**72dpi o 96dpi** - La imagen es "[Center](FormObjects/properties_Picture.md#center--truncated-non-centered)" formateado y el objeto que contiene la imagen tiene el mismo número de píxeles.
**Otro dpi** - La imagen es "[Escalada para encajar](FormObjects/properties_Picture.md#scaled-to-fit)" formateado y el objeto que contiene la imagen es igual a (número de píxeles \* screen dpi) / (imagen dpi)
**Sin dpi** - La imagen es "[Escalada para ajustar](FormObjects/properties_Picture.md#scaled-to-fit)" formateado.
|
-| [Tamaño automático](https://doc.4d.com/4Dv20/4D/20.2/Setting-object-display-properties.300-6750143.en.html#148057) (menú contextual del editor de formularios) | Si el formato de visualización de la imagen es:
**[Escalado](FormObjects/properties_Picture.md#scaled-to-fit)** - El objeto que contiene la imagen se redimensiona según (número de píxeles de la imagen \* dpi de la pantalla) / (dpi de la imagen)
**No escalado** - El objeto que contiene la imagen tiene la misma cantidad de píxeles que la imagen.
|
-
-*(\*) Generalmente, macOS = 72 dpi, Windows = 96 dpi*
-
-## Imágenes en modo oscuro (sólo en macOS)
-
-Puede definir imágenes e iconos específicos que se utilizarán en lugar de las imágenes estándar cuando [los formularios utilicen el esquema oscuro](properties_FormProperties.md#color-scheme).
-
-Una imagen en modo oscuro se define de la siguiente manera:
-
-- la imagen en modo oscuro tiene el mismo nombre que la versión estándar (modo claro) con el sufijo "`_dark`"
-- la imagen en modo oscuro se almacena junto a la versión estándar.
-
-En tiempo de ejecución, 4D cargará automáticamente la imagen clara u oscura según el [modo de colores de formulario actual](../FormEditor/properties_FormProperties.md#color-scheme).
-
-
-
-## Coordenadas del ratón en una imagen
-
-4D le permite recuperar las coordenadas locales del ratón en un [objeto de entrada](FormObjects/input_overview.md) asociado con una [expresión de imagen](FormObjects/properties_Object.md#expression-type), en caso de un clic o un desplazamiento, incluso si se ha aplicado un desplazamiento o zoom a la imagen. Este mecanismo, similar al de un mapa de imágenes, puede utilizarse, por ejemplo, para manejar barras de botones desplazables o la interfaz de un software de cartografía.
-
-Las coordenadas se devuelven en las *MouseX* and *MouseY* [Variables Sistema](../Concepts/variables.md#system-variables). Las coordenadas se expresan en píxeles con respecto a la esquina superior izquierda de la imagen (0,0). Si el ratón está fuera del sistema de coordenadas de la imagen, se devuelve -1 en *MouseX* y *MouseY*.
-
-Puede obtener el valor de estas variables como parte de los eventos de formulario [`On Clicked`](Events/onClicked.md), [`On Double Clicked`](Events/onDoubleClicked.md), [`On Mouse up`](Events/onMouseUp.md), [`On Mouse Enter`](Events/onMouseEnter.md) o [`On Mouse Move`](Events/onMouseMove.md).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Markers.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Markers.md
deleted file mode 100644
index 87cb3fcedfe0c1..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Markers.md
+++ /dev/null
@@ -1,112 +0,0 @@
----
-id: markers
-title: Marcadores
----
-
-Estas propiedades permiten especificar la ubicación precisa de los marcadores en la regla vertical de un **formulario tabla**. Los marcadores se utilizan principalmente en los formularios de salida. Controlan la información que se lista y definen las áreas de encabezado, saltos, detalles y pie de página del formulario. Todo objeto que se coloque en estas áreas se mostrará o imprimirá en el lugar correspondiente.
-
-Siempre que se utilice cualquier formulario para la salida, ya sea para la visualización en pantalla o para la impresión, las líneas de marcador de salida tienen efecto y las áreas se muestran o imprimen en los lugares designados. Los marcadores también tienen efecto cuando un formulario se utiliza como formulario lista en un área de subformulario. Sin embargo, no tienen ningún efecto cuando se utiliza un formulario para introducir datos.
-
-Los métodos asociados a los objetos de estas áreas se ejecutan cuando las áreas se imprimen o se muestran siempre que se hayan activado los eventos correspondientes. Por ejemplo, un método objeto colocado en el área Encabezado se ejecuta cuando se produce el evento `On Header`.
-
----
-
-## Ruptura de formulario
-
-Las áreas de Ruptura del formulario se muestran una vez al final de la lista de registros y se imprimen una vez después de imprimir los registros en un informe.
-
-El área Ruptura se define como el área comprendida entre la línea de control Detalle y la línea de control Ruptura. Puede haber [varias áreas de ruptura](#additional-areas) en su informe.
-
-Puede hacer que las áreas Ruptura sean más pequeñas o más grandes. Puede utilizar un área de pausa para mostrar información que no forme parte de los registros (instrucciones, fecha actual, hora actual, etc.), o para mostrar una línea u otro elemento gráfico que concluya la visualización de la pantalla. En un informe impreso, puede utilizar un área de Ruptura para calcular e imprimir subtotales y otros cálculos de resumen.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
-| markerBreak | integer | integer collection | Posición del marcador de ruptura o colección de posiciones del marcador de ruptura en píxeles. Valor mínimo: 0 |
-
----
-
-## Formulario detallado
-
-El área Detalle del formulario se muestra en la pantalla y se imprime una vez por cada registro de un informe. El área Detalle se define como el área comprendida entre la línea de control Encabezado y la línea de control Detalle.
-
-Puede hacer el área Detalle más pequeña o más grande. Lo que coloque en el área Detalle se muestra o imprime una vez por cada registro. Lo más habitual es colocar campos o variables en el área Detalle para que se muestre o imprima la información de cada registro, pero también se pueden colocar otros elementos en el área Detalle.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | --------------------------------------------------------------------------- |
-| markerBody | integer | Posición del marcador de detalle. Mínimo: 0 |
-
----
-
-## Pie del formulario
-
-El área de pie de página del formulario se muestra en pantalla bajo la lista de registros. Siempre se imprime al final de cada página de un informe. El área de pie de página se define como el área comprendida entre la línea de control de salto y la línea de control de pie de página.
-
-Puede hacer que el área del pie de página sea más pequeña o más grande.
-
-Puede utilizar el área de pie de página para imprimir gráficos, números de página, la fecha actual o cualquier texto que desee en la parte inferior de cada página de un informe. En los formularios de salida diseñados para su uso en pantalla, el área de pie de página suele contener botones que ofrecen al usuario opciones como realizar una búsqueda u ordenación, imprimir registros o guardar el informe actual. Se aceptan los objetos activos.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ------------------------- |
-| markerFooter | integer | mínimo: 0 |
-
----
-
-## Encabezado del formulario
-
-El área de encabezado del formulario se muestra en la parte superior de cada pantalla y se imprime en la parte superior de cada página de un informe. El área de encabezado se define como el área por encima de la línea de control del encabezado.
-
-Puede hacer el área Encabezado más pequeña o más grande. Puede utilizar el área Encabezado para los nombres de las columnas, para instrucciones, información adicional o incluso un gráfico como el logotipo de una empresa o un patrón decorativo.
-
-También puede colocar y utilizar objetos activos en el área de encabezado de los formularios de salida mostrados como subformularios, en la ventana de visualización de registros o utilizando los comandos `DISPLAY SELECTION` y `MODIFY SELECTION`. Se pueden insertar los siguientes objetos activos:
-
-- Botones, botones imagen,
-- Combo boxes, listas desplegables, menús emergentes de imágenes,
-- listas jerárquicas, list boxes
-- Botones de radio, casillas de selección, casillas de selección 3D,
-- Indicadores de progreso, reglas, steppers, spinners.
-
-A los botones insertados se les pueden asignar acciones estándar como `Add Subrecord`, `Cancel` (listas visualizadas utilizando `DISPLAY SELECTION` y `MODIFY SELECTION`) o `Automatic splitter`. Los siguientes eventos se aplican a los objetos activos que inserte en el área Encabezado: `On Load`, `On Clicked`, `On Header`, `On Printing Footer`, `On Double Clicked`, `On Drop`, `On Drag Over`, `On Unload`. Tenga en cuenta que el método formulario se llama con el evento `On Header` después de llamar a los métodos del objeto del área.
-
-El formulario puede contener [áreas de encabezado adicionales](#additional-areas) que se asociarán a rupturas adicionales. Se imprime un Encabezado nivel 1 justo antes de imprimir los registros agrupados por el primer campo ordenado.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| markerHeader | integer | integer collection | Posición del marcador de encabezado o colección de posiciones del marcador de encabezado en píxeles. Valor mínimo: 0 |
-
-## Áreas adicionales
-
-Puede crear áreas de Ruptura y Encabezados adicionales para un informe. Estas áreas adicionales permiten imprimir subtotales y otros cálculos en un informe y mostrar otra información de forma eficaz.
-
-Las áreas adicionales se definen cuando se utiliza una colección de posiciones en las propiedades [Ruptura](#form-break) y [Encabezado](#form-header).
-
-> En el editor de formularios 4D, puede crear líneas de control adicionales manteniendo presionada la tecla **Alt** mientras hace clic en el marcador de control apropiado.
-
-Un formulario comienza siempre con las áreas de Encabezado, Detalle, Nivel 0 y Pie de página.
-
-La Ruptura en el nivel 0 cero toma todos los registros; se produce después de imprimir todos los registros. Se pueden añadir áreas de ruptura adicionales, es decir, un nivel de ruptura 1, un nivel de ruptura 2, etc.
-
-Un nivel de Ruptura 1 se produce después de imprimir los registros agrupados por el primer campo ordenado.
-
-| Etiqueta | Descripción | Imprime después de grupos creados por |
-| -------- | ------------------ | ------------------------------------- |
-| B1 | Nivel de ruptura 1 | Primer campo ordenado |
-| B2 | Nivel de ruptura 2 | Segundo campo ordenado |
-| B3 | Nivel de ruptura 3 | Tercer campo ordenado |
-
-Las áreas adicionales del encabezado están asociadas a las interrupciones. Se imprime un Encabezado nivel 1 justo antes de imprimir los registros agrupados por el primer campo ordenado.
-
-| Etiqueta | Descripción | Imprime después de grupos creados por |
-| -------- | ------------------------ | ------------------------------------- |
-| H1 | Encabezado en el nivel 1 | Primer campo ordenado |
-| H2 | Encabezado en el nivel 2 | Segundo campo ordenado |
-| H3 | Encabezado en el nivel 3 | Tercer campo ordenado |
-
-Si utiliza la función `Subtotal` para iniciar el procesamiento de Rupturas, deberá crear un área de Pausa para cada nivel de Ruptura que generará el orden de clasificación, menos uno. Si no necesita imprimir nada en una de las áreas de Ruptura, puede reducir su tamaño a nada colocando su marcador sobre otra línea de control. Si tiene más niveles de clasificación que áreas de pausa, la última área de pausa se repetirá durante la impresión.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/input_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/input_overview.md
deleted file mode 100644
index faa4c83bdfbc27..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/input_overview.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-id: inputOverview
-title: Entrada
----
-
-Las entradas permiten añadir expresiones editables o no editables, como campos de base de datos y [variables](Concepts/variables.md) a sus formularios. Las entradas pueden manejar datos basados en caracteres (texto, fechas, números...) o imágenes:
-
-
-
-Las entradas pueden contener [expresiones asignables o no asignables](Concepts/quick-tour.md#assignable-vs-non-assignable-expressions).
-
-Además, las entradas pueden ser [editables o no editables](properties_Entry.md#enterable). Una entrada introducible acepta los datos. Puede definir los controles de entrada de datos para el objeto. Una entrada no editable sólo puede mostrar valores, pero no puede ser editada por el usuario.
-
-Puede gestionar los datos con los [métodos](Concepts/methods.md) objeto o formulario.
-
-### Ejemplo JSON:
-
-```4d
- "myText": {
- "type": "input", //definir el tipo de objeto
- "spellcheck": true, //activar la verificación ortográfica
- "left": 60, //posición izquierda en el formulario
- "top": 160, //posición superior en el formulario
- "width": 100, //ancho del objeto
- "height": 20 //altura del objeto
- }
-```
-
-## Propiedades soportadas
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ---------------------------------------- |
-| 19 R7 | Soporte de la propiedad Radio de esquina |
-
-
-
-[Permitir selector de fuente/color](properties_Text.md#allow-fontcolor-picker) - [Formato alfa](properties_Display.md#alpha-format) - [Corrección ortográfica automática](properties_Entry.md#auto-spellcheck) - [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) - [Negrita](properties_Text.md#bold) - [Formato booleano](properties_Display.md#text-when-falsetext-when-true) - [Estilo de línea de borde](properties_BackgroundAndBorder.md#border-line-style) - [Inferior](properties_CoordinatesAndSizing.md#bottom) - [Lista de opciones](properties_DataSource.md#choice-list) - [Clase](properties_Object.md#css-class) - [Menú contextual](properties_Entry.md#context-menu) - [Radio de esquina](properties_CoordinatesAndSizing.md#corner-radius) - [Formato Fecha](properties_Display.md#date-format) - [Valor por defecto](properties_RangeOfValues.md#default-value) - [Arrastrable](properties_Action.md#draggable) - [Soltable](properties_Action.md#droppable) - [Enterable](properties_Entry.md#enterable) - [Filtro de entrada](properties_Entry.md#entry-filter) - [Lista excluida](properties_RangeOfValues.md#excluded-list) - [Tipo de expresión](properties_Object.md#expression-type) - [Color de relleno](properties_BackgroundAndBorder.md#background-color--fill-color) - [Fuente](properties_Text.md#font) - [Color de fuente](properties_Text.md#font-color) - [Tamaño de fuente](properties_Text.md#font-size) - [Alto](properties_CoordinatesAndSizing.md#height) - [Hide focus rectangle](properties_Appearance.md#hide-focus-rectangle) - [Alineación horizontal](properties_Text.md#horizontal-alignment) - [Barra de desplazamiento horizontal](properties_Appearance.md#horizontal-scroll-bar) - [Tamaño horizontal](properties_ResizingOptions.md#horizontal-sizing) - [Cursiva](properties_Text.md#italic) - [Izquierda](properties_CoordinatesAndSizing.md#left) - [Multilínea](properties_Entry.md#multiline) - [Multiestilo](properties_Text.md#multi-style) - [Formato numérico](properties_Display.md#formato-numérico) - [Nombre de objeto](properties_Object.md#nombre-de-objeto) - [Orientación](properties_Text.md#orientación) - [Formato de imagen](properties_Display.md#formato-de-imagen) - [Marcador de posición](properties_Entry.md#placeholder) - [Marco de impresión](properties_Print.md#print-frame) - [Lista obligatoria](properties_RangeOfValues.md#required-list) - [Derecha](properties_CoordinatesAndSizing.md#right) - [Selección siempre visible](properties_Entry.md#selection-always-visible) - [Almacenar con etiquetas de estilo predeterminadas](properties_Text.md#store-with-default-style-tags) - [Texto cuando False/Texto cuando True](properties_Display.md#text-when-falsetext-when-true) - [Formato de tiempo](properties_Display.md#formato-de-tiempo) - [Arriba](properties_CoordinatesAndSizing.md#top) - [Tipo](properties_Object.md#type) - [Subrayado](properties_Text.md#underline) - [Variable o expresión](properties_Object.md#variable-or-expression) - [Barra de desplazamiento vertical](properties_Appearance.md#barra-de-desplazamiento-vertical) - [Tamaño vertical](properties_ResizingOptions.md#tamaño-vertical) - [Visibilidad](properties_Display.md#visibilidad) - [Ancho](properties_CoordinatesAndSizing.md#ancho) - [Ajuste de palabras](properties_Display.md#wordwrap)
-
----
-
-## Alternativas
-
-También puede representar expresiones de campos y de variables en sus formularios utilizando objetos alternativos, más concretamente:
-
-- Puede mostrar e introducir datos de los campos de la base directamente en las columnas [de tipo List box](listbox_overview.md).
-- Puede representar un campo de lista o una variable directamente en un formulario utilizando los objetos [Menús desplegables/Listas desplegables](dropdownList_Overview.md) y [Combo Box](comboBox_overview.md).
-- Puede representar una expresión booleana como una [casilla de selección](checkbox_overview.md) o como un objeto [botón radio](radio_overview.md).
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/listbox_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/listbox_overview.md
deleted file mode 100644
index 3984401a925b16..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/listbox_overview.md
+++ /dev/null
@@ -1,1227 +0,0 @@
----
-id: listboxOverview
-title: List Box
----
-
-Los list boxes son objetos activos complejos que permiten mostrar e introducir datos en forma de columnas sincronizadas. Pueden vincularse a contenidos de la base de datos, como selecciones de entidades y secciones de registros, o a cualquier contenido del lenguaje, como colecciones y arrays. Incluyen funciones avanzadas relativas a la entrada de datos, la ordenación de columnas, la gestión de eventos, el aspecto personalizado, el desplazamiento de columnas, etc.
-
-
-
-Un list box contiene una o varias columnas cuyo contenido se sincroniza automáticamente. El número de columnas es, en teoría, ilimitado (depende de los recursos de la máquina).
-
-## Generalidades
-
-### Principios de utilización básicos
-
-Durante la ejecución, los list box permiten visualizar e introducir datos en forma de listas. Para hacer que una celda sea editable ([si se permite la entrada para la columna](#managing-entry)), basta con pulsar dos veces sobre el valor que contiene:
-
-
-
-Los usuarios pueden introducir y mostrar el texto en varias líneas dentro de una celda de list box. Para añadir un salto de línea, presione **Ctrl+Retorno de carro** en Windows o **Opción+Retorno de carro** en macOS.
-
-En las celdas se pueden mostrar booleanos e imágenes, así como fechas, horas o números. Es posible ordenar los valores de las columnas haciendo clic en un encabezado ([ordenación estándar](#managing-sorts)). Todas las columnas se sincronizan automáticamente.
-
-También es posible cambiar el tamaño de cada columna, y el usuario puede modificar el orden de las [columnas](properties_ListBox.md#locked-columns-and-static-columns) y [líneas](properties_Action.md#movable-rows) moviéndolas con el ratón, si esta acción e Tenga en cuenta que los list box se pueden utilizar en [modo jerárquico](#hierarchical-list-boxes). Tenga en cuenta que los list box se pueden utilizar en [modo jerárquico](#hierarchical-list-boxes).
-
-El usuario puede seleccionar una o varias líneas utilizando los atajos estándar: **Mayúsculas+clic** para una selección adyacente y **Ctrl+clic** (Windows) o **Comando+clic** (macOS) para una selección no adyacente.
-
-### Partes de list box
-
-Un list box se compone de cuatro partes distintas:
-
-- el objeto list box en su totalidad,
-- las columnas,
-- los encabezados de las columnas, y
-- los pies de las columnas.
-
-
-
-Cada parte tiene su propio nombre y propiedades específicas. Por ejemplo, el número de columnas o el color alternativo de cada línea se define en las propiedades del objeto list box, el ancho de cada columna se define en las propiedades de las columnas y el tipo de fuente del encabezado se define en las propiedades de los encabezados.
-
-Es posible añadir un método objeto al objeto list box y/o a cada columna del list box. Los métodos objeto se llaman en el siguiente orden:
-
-1. Método objeto de cada columna
-2. Método objeto del list box
-
-El método objeto de columna obtiene los eventos que se producen en su [encabezado](#list-box-headers) y [pie](#list-box-footers).
-
-### Tipos de list box
-
-Hay varios tipos de list box, con sus propios comportamientos y propiedades específicas. Hay varios tipos de list box, con sus propios comportamientos y propiedades específicas.
-
-- **Arrays**: cada columna está ligada a un array 4D. Los list boxes basados en arrays pueden mostrarse como [list boxes jerárquicos](listbox_overview.md#hierarchical-list-boxes).
-- **Selección** (**Selección actual** o **Selección con nombre**): cada columna está vinculada a una expresión (por ejemplo, un campo) que se evalúa para cada registro de la selección.
-- **Collection o Entity selection**: cada columna está ligada a una expresión que se evalúa para cada elemento de la colección o cada entidad de la selección de entidades.
-
-> > > No es posible combinar diferentes tipos de list box en el mismo objeto list box. La fuente de datos se define cuando se crea el list box. Entonces ya no es posible modificarlo por programación.
-
-### Gestión de list boxes
-
-Se puede configurar completamente un objeto list box a través de sus propiedades, y también se puede gestionar dinámicamente por programación.
-
-El lenguaje 4D incluye un tema "List Box" dedicado a los comandos de list box, pero los comandos de otros temas, tales como "Propiedades de los objetos" o los comandos `EDIT ITEM` y `Displayed line number` también pueden ser utilizados. Para mayor información consulte la página [List Box Commands Summary](https://doc.4d.com/4Dv20/4D/20.6/List-Box-Commands-Summary.300-7487600.en.html) del manual *Lenguaje 4D*.
-
-## Objetos tipo List box
-
-### List box de tipo array
-
-En un list box de tipo array, cada columna debe estar asociada a un array unidimensional 4D; se pueden utilizar todos los tipos de array, a excepción de los arrays de punteros. El número de líneas se basa en el número de elementos del array.
-
-Por defecto, 4D asigna el nombre "ColumnX" a cada columna. Puede cambiarlo, así como las otras propiedades de la columna, en las [propiedades de las columnas](listbox_overview.md#column-specific-properties). El formato de visualización de cada columna también puede definirse mediante el comando `OBJECT SET FORMAT`.
-
-> Los list boxes de tipo array pueden mostrarse en [modo jerárquico](listbox_overview.md#hierarchical-list-boxes), con mecanismos específicos.
-
-Con los list box de tipo array, los valores introducidos o mostrados se gestionan utilizando el lenguaje 4D. También puede asociar una [lista de opciones](properties_DataSource.md#choice-list) con una columna para controlar la entrada de datos.
-Los valores de las columnas se gestionan mediante comandos de alto nivel de List box (como [`LISTBOX INSERT ROWS`](../commands/listbox-insert-rows) o `LISTBOX DELETE ROWS`), así como comandos de manipulación de arrays. Por ejemplo, para inicializar el contenido de una columna, puede utilizar la siguiente instrucción:
-
-```4d
-ARRAY TEXT(varCol;size)
-```
-
-También puede utilizar una lista:
-
-```4d
-LIST TO ARRAY("ListName";varCol)
-```
-
-> **Atención**: cuando un objeto List box contiene varias columnas de diferentes tamaños, sólo se mostrará el número de elementos del array (columna) más pequeño. Debe asegurarse de que cada array tenga el mismo número de elementos que los demás. Además, si una columna del list box está vacía (esto ocurre cuando el array asociado no fue declarado o dimensionado correctamente con el lenguaje), el list box no muestra nada.
-
-### List box de tipo selección
-
-En este tipo de list box, cada columna puede estar asociada a un campo (por ejemplo `[Employees]LastName)` o a una expresión. La expresión puede basarse en uno o más campos (por ejemplo, `[Employees]FirstName+" "[Employees]LastName`) o puede ser simplemente una fórmula (por ejemplo `String(Milliseconds)`). La expresión también puede ser un método proyecto, una variable o un elemento de array. La expresión también puede ser un método proyecto, una variable o un elemento de array.
-
-A continuación, el contenido de cada línea se evalúa en función de una selección de registros: la **selección actual** de una tabla o una **selección temporal**.
-
-En el caso de un list box basado en la selección actual de una tabla, cualquier modificación realizada desde la base de datos se refleja automáticamente en el list box, y viceversa. Por lo tanto, la selección actual es siempre la misma en ambos lugares.
-
-### List box colección o entity selection
-
-En este tipo de list box, cada columna debe estar asociada a una expresión. El contenido de cada línea se evalúa entonces por elemento de la colección o por entidad de la selección de entidades.
-
-Cada elemento de la colección o cada entidad está disponible como un objeto al que se puede acceder a través de la palabra clave [This](../Concepts/classes.md#this). Una expresión de columna puede ser una ruta de propiedad, un método de proyecto, una variable o cualquier fórmula, accediendo a cada entidad u objeto elemento de colección a través de `This`, por ejemplo `This.` (o `This.value` en el caso de Puede utilizar los comandos `LISTBOX SET COLUMN FORMULA` y `LISTBOX INSERT COLUMN FORMULA` para modificar las columnas por programación. La expresión también puede ser un método proyecto, una variable o un elemento de array.
-
-Cuando la fuente de datos es una entity selection, cualquier modificación realizada del lado del list box se guarda automáticamente en la base de datos. Por otro lado, las modificaciones realizadas en la base de datos son visibles en el list box después de que se hayan recargado las entidades modificadas.
-
-:::note
-
-Cuando se eliminan entidades, sus referencias permanecen en la selección de entidades con un valor *undefined*, por lo que aparecen filas en blanco en el list box. En este caso, puede llamar a la función [`.clean()`](API/EntitySelectionClass.md#clean) para obtener una nueva selección de entidades pero sin las referencias de entidades eliminadas.
-
-:::
-
-Cuando la fuente de datos es una colección, toda modificación realizada en los valores del list box se refleja en la colección. Cuando la fuente de datos es una colección, toda modificación realizada en los valores del list box se refleja en la colección. Por ejemplo:
-
-```4d
-myCol:=myCol.push("new value") //mostrar el nuevo valor en el list box
-```
-
-### Propiedades soportadas
-
-Las propiedades soportadas dependen del tipo de list box.
-
-| Propiedad | List box array | List box selección | List box colección o entity selection |
-| ------------------------------------------------------------------------------------------------- | -------------- | ------------------ | ------------------------------------- |
-| [Color de fondo alterno](properties_BackgroundAndBorder.md#alternate-background-color) | X | X | X |
-| [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) | X | X | X |
-| [Negrita](properties_Text.md#bold) | X | X | X |
-| [Expresión del color de fondo](properties_BackgroundAndBorder.md#background-color-expression) | | X | X |
-| [Estilo de línea de borde](properties_BackgroundAndBorder.md#border-line-style) | X | X | X |
-| [Inferior](properties_CoordinatesAndSizing.md#bottom) | X | X | X |
-| [Clase](properties_Object.md#css-class) | X | X | X |
-| [Colección o entity selection](properties_Object.md#collection-or-entity-selection) | | X | X |
-| [Redimensionamiento automático de columnas](properties_ResizingOptions.md#column-auto-resizing) | X | X | X |
-| [Elemento actual](properties_DataSource.md#current-item) | | | X |
-| [Posición actual del elemento](properties_DataSource.md#current-item-position) | | | X |
-| [Fuente de datos](properties_Object.md#data-source) | X | X | X |
-| [Nombre del formulario detallado](properties_ListBox.md#detail-form-name) | | X | |
-| [Mostrar encabezados](properties_Headers.md#display-headers) | X | X | X |
-| [Mostrar pies de página](properties_Footers.md#display-footers) | X | X | X |
-| [Doble clic en la fila](properties_ListBox.md#double-click-on-row) | | X | |
-| [Arrastrable](properties_Action.md#droppable) | X | X | X |
-| [Soltable](properties_Action.md#droppable) | X | X | X |
-| [Enfocable](properties_Entry.md#focusable) | X | X | X |
-| [Fuente](properties_Text.md#fuente) | X | X | X |
-| [Color de fuente](properties_Text.md#font-color) | X | X | X |
-| [Expresión de color de fuente](properties_Text.md#font-color-expression) | | X | X |
-| [Tamaño de fuente](properties_Text.md#font-size) | X | X | X |
-| [Altura (list box)](properties_CoordinatesAndSizing.md#height) | X | X | X |
-| [Altura (encabezados)](properties_Headers.md#height) | X | X | X |
-| [Altura (pies de página)](properties_Footers.md#height) | X | X | X |
-| [Ocultar líneas en blanco adicionales](properties_BackgroundAndBorder.md#hide-extra-blank-rows) | X | X | X |
-| [Ocultar rectángulo de enfoque](properties_Appearance.md#hide-focus-rectangle) | X | X | X |
-| [Ocultar resaltado de selección](properties_Appearance.md#hide-selection-highlight) | X | X | X |
-| [List Box jerárquico](properties_Object.md#array-list-box) | X | | |
-| [Conjunto de resaltado](properties_ListBox.md#highlight-set) | | X | |
-| [Alineación horizontal](properties_Text.md#alineación-horizontal) | X | X | X |
-| [Color de línea horizontal](properties_Gridlines.md#horizontal-line-color) | X | X | X |
-| [Relleno horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) | X | X | X |
-| [Barra de desplazamiento horizontal](properties_Appearance.md#horizontal-scroll-bar) | X | X | X |
-| [Tamaño horizontal](properties_ResizingOptions.md#horizontal-sizing) | X | X | X |
-| [Itálica](properties_Text.md#italic) | X | X | X |
-| [Izquierda](properties_CoordinatesAndSizing.md#izquierda) | X | X | X |
-| [Tabla maestra](properties_DataSource.md#master-table) | | X | |
-| [Expresión info Meta](properties_Text.md#meta-info-expression) | | | X |
-| [Método](properties_Action.md#method) | X | X | X |
-| [Líneas móviles](properties_Action.md#movable-rows) | X | | |
-| [Selección temporal](properties_DataSource.md#selection-name) | | X | |
-| [Número de columnas](properties_ListBox.md#number-of-columns) | X | X | X |
-| [Número de columnas bloqueadas](properties_ListBox.md#number-of-locked-columns) | X | X | X |
-| [Número de columnas estáticas](properties_ListBox.md#number-of-static-columns) | X | X | X |
-| [Nombre del objeto](properties_Object.md#object-name) | X | X | X |
-| [Derecha](properties_CoordinatesAndSizing.md#right) | X | X | X |
-| [Array de colores de fondo de fila](properties_BackgroundAndBorder.md#row-background-color-array) | X | | |
-| [Array de control de filas](properties_ListBox.md#row-control-array) | X | | |
-| [Array color de fuente de fila](properties_Text.md#row-font-color-array) | X | | |
-| [Altura de línea](properties_CoordinatesAndSizing.md#row-height) | X | | |
-| [Array altura de línea](properties_CoordinatesAndSizing.md#row-height-array) | X | | |
-| [Array de estilo de línea](properties_Text.md#row-style-array) | X | | |
-| [Elementos seleccionados](properties_DataSource.md#selected-items) | | | X |
-| [Modo de selección](properties_ListBox.md#selection-mode) | X | X | X |
-| [Edición con un solo clic](properties_Entry.md#single-click-edit) | X | X | X |
-| [Ordenable](properties_Action.md#sortable) | X | X | X |
-| [Acción estándar](properties_Action.md#standard-action) | X | | |
-| [Expresión de estilo](properties_Text.md#style-expression) | | X | X |
-| [Superior](properties_CoordinatesAndSizing.md#top) | X | X | X |
-| [Transparente](properties_BackgroundAndBorder.md#transparent) | X | X | X |
-| [Tipo](properties_Object.md#type) | X | X | X |
-| [Subrayado](properties_Text.md#underline) | X | X | X |
-| [Variable o Expresión](properties_Object.md#variable-or-expression) | X | X | |
-| [Alineación vertical](properties_Text.md#vertical-alignment) | X | X | X |
-| [Color de línea vertical](properties_Gridlines.md#vertical-line-color) | X | X | X |
-| [Relleno vertical](properties_CoordinatesAndSizing.md#vertical-padding) | X | X | X |
-| [Barra de desplazamiento vertical](properties_Appearance.md#vertical-scroll-bar) | X | X | X |
-| [Tamaño vertical](properties_ResizingOptions.md#vertical-sizing) | X | X | X |
-| [Visibilidad](properties_Display.md#visibility) | X | X | X |
-| [Ancho](properties_CoordinatesAndSizing.md#width) | X | X | X |
-
-> Las columnas, los encabezados y los pies de list box soportan propiedades específicas.
-
-### Eventos de formulario soportados {#supported-form-events}
-
-| Evento formulario | Propiedades adicionales devueltas (ver [Evento formulario](../commands/form-event.md) para las propiedades principales) | Comentarios |
-| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| On After Edit |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On After Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On After Sort |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| *Las fórmulas compuestas no se pueden ordenar. (por ejemplo, This.firstName + This.lastName)* |
-| On Alternative Click |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *List box array únicamente* |
-| On Before Data Entry |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Before Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Begin Drag Over |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Clicked |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Close Detail |
[row](#propiedades adicionales)
| *List box Selección actual y Selección temporal únicamente* |
-| On Collapse |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *List box jerárquicos únicamente* |
-| On Column Moved |
| *List box arrays, selección actual y selección temporal únicamente* |
-| On Getting Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo al editar una celda* |
-| On Header Click |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| |
-| On Load | | |
-| On Losing Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo cuando la modificación de una celda se completa* |
-| On Mouse Enter |
[area](#additional-properties)
[areaName](#additional-properties)
[column](#additional-properties)
[columnName](#additional-properties)
[row](#additional-properties)
| |
-| On Mouse Leave | | |
-| On Mouse Move |
[area](#additional-properties)
[areaName](#additional-properties)
[column](#additional-properties)
[columnName](#additional-properties)
[row](#additional-properties)
| |
-| On Open Detail |
[row](#propiedades adicionales)
| *List box Selección actual y Selección temporal únicamente* |
-| On Row Moved |
[newPosition](#additional-properties)
[oldPosition](#additional-properties)
| *List box array únicamente* |
-| On Selection Change | | |
-| On Scroll |
[horizontalScroll](#additional-properties)
[verticalScroll](#additional-properties)
| |
-| On Unload | | |
-
-#### Propiedades adicionales {additional-properties}
-
-Los eventos formulario de los objetos list box o columnas de list box pueden devolver las siguientes propiedades adicionales:
-
-| Propiedad | Tipo | Descripción |
-| ---------------- | ------------ | ------------------------------------------------------------------------------------ |
-| area | text | Área de objeto list box ("header", "footer", "cell") |
-| areaName | text | Nombre del área |
-| column | entero largo | Número de columna |
-| columnName | text | Nombre de la columna |
-| footerName | text | Nombre del pie |
-| headerName | text | Nombre del encabezado |
-| horizontalScroll | entero largo | Positivo si el desplazamiento es hacia la derecha, negativo si es hacia la izquierda |
-| isRowSelected | boolean | True si la línea está seleccionada, de lo contrario False |
-| newPosition | entero largo | Nueva posición de la columna o línea |
-| newSize | entero largo | Nuevo tamaño (en píxeles) de la columna o línea |
-| oldPosition | entero largo | Posición anterior de la columna o línea |
-| oldSize | entero largo | Tamaño anterior (en píxeles) de la columna o línea |
-| row | entero largo | Número de línea |
-| verticalScroll | entero largo | Positivo si el desplazamiento es hacia abajo, negativo si es hacia arriba |
-
-> Si un evento se produce en una columna o línea "fake" que no existe, se suele devolver una cadena vacía.
-
-## Columnas list box {#list-box-columns}
-
-Un list box está formado por uno o varios objetos columna que tienen propiedades específicas. Puede seleccionar una columna de list box en el editor de formularios haciendo clic en ella cuando el objeto list box está seleccionado:
-
-
-
-Puede definir propiedades estándar (texto, color de fondo, etc.) para cada columna del list box; estas propiedades tienen prioridad sobre las del objeto list box.
-
-> Puede definir el [tipo de expresión](properties_Object.md#expression-type) para las columnas de list box de tipo array (cadena, texto, número, fecha, hora, imagen, booleano u objeto).
-
-### Propiedades específicas de columna {#column-specific-properties}
-
-[Formato Alfa](properties_Display.md#alpha-format) - [Color de fondo alternativo](properties_BackgroundAndBorder.md#alternate-background-color) - [Altura de línea automática](properties_CoordinatesAndSizing.md#automatic-row-height) - [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) - [Expresión de color de fondo](properties_BackgroundAndBorder.md#background-color-expression) - [Negrita](properties_Text.md#bold) - [Lista de selección](properties_DataSource.md#choice-list) - [Clase](properties_Object.md#css-class) - [Tipo de datos (selección y columna de list box colección)](properties_DataSource.md#data-type-list) - [Formato Fecha](properties_Display.md#date-format) - [Valores por defecto](properties_DataSource.md#default-list-of-values) - [Tipo de visualización](properties_Display.md#display-type) - [Editable](properties_Entry.md#enterable) - [Filtro de entrada](properties_Entry.md#entry-filter) - [Lista excluída](properties_RangeOfValues.md#excluded-list) - [Expresión](properties_DataSource.md#expression) - [Tipo de expresión (column de list box array)](properties_Object.md#expression-type) - [Fuente](properties_Text.md#font) - [Color de fuente](properties_Text.md#font-color) - [Alineación Horizontal](properties_Text.md#horizontal-alignment) - [Relleno Horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) - [Itálica](properties_Text.md#italic) - [Invisible](properties_Display.md#visibility) - [Ancho máximo](properties_CoordinatesAndSizing.md#maximum-width) - [Método](properties_Action.md#method) - [Ancho mínimo](properties_CoordinatesAndSizing.md#minimum-width) - [Multiestilo](properties_Text.md#multi-style) - [Formato número](properties_Display.md#number-format) - [Nombre de objeto](properties_Object.md#object-name) - [Formato Imagen](properties_Display.md#picture-format) - [Redimensionable](properties_ResizingOptions.md#resizable) - [Lista requerida](properties_RangeOfValues.md#required-list) - [Array de color de fondo de línea](properties_BackgroundAndBorder.md#row-background-color-array) - [Array de color de fuente de línea](properties_Text.md#row-font-color-) - [Array de estilo de línea](properties_Text.md#row-style-array) - [Guardar como](properties_DataSource.md#save-as) - [Expresión de estilo](properties_Text.md#style-expression) - [Texto cuando False/Texto cuando True](properties_Display.md#text-when-falsetext-when-true) - [Formato Hora](properties_Display.md#time-format) - [Truncar con elipsis](properties_Display.md#truncate-with-ellipsis) - [Subrayar](properties_Text.md#underline) - [Variable o Expresión](properties_Object.md#variable-or-expression) - Alineación
-Vertical - [Relleno vertical](properties_CoordinatesAndSizing.md#vertical-padding) - [Ancho](properties_CoordinatesAndSizing.md#width) - [Ajuste de palabras](properties_Display.md#wordwrap)
-
-### Eventos de formulario soportados {#supported-form-events-1}
-
-| Evento formulario | Propiedades adicionales devueltas (ver [Evento formulario](../commands/form-event.md) para las propiedades principales) | Comentarios |
-| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| On After Edit |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On After Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On After Sort |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| *Las fórmulas compuestas no se pueden ordenar. (por ejemplo, This.firstName + This.lastName)* |
-| On Alternative Click |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *List box array únicamente* |
-| On Before Data Entry |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Before Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Begin Drag Over |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Clicked |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Column Moved |
[columnName](#additional-properties)
[newPosition](#additional-properties)
[oldPosition](#additional-properties)
| |
-| On Column Resize |
[column](#additional-properties)
[columnName](#additional-properties)
[newSize](#additional-properties)
[oldSize](#additional-properties)
| |
-| On Data Change |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Double Clicked |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Drag Over |
[area](#additional-properties)
[areaName](#additional-properties)
[column](#additional-properties)
[columnName](#additional-properties)
[row](#additional-properties)
| |
-| On Drop |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
-| On Footer Click |
[column](#additional-properties)
[columnName](#additional-properties)
[footerName](#additional-properties)
| *List box arrays, selección actual y selección temporal únicamente* |
-| On Getting Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo al editar una celda* |
-| On Header Click |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| |
-| On Load | | |
-| On Losing Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo cuando la modificación de una celda se completa* |
-| On Row Moved |
[newPosition](#additional-properties)
[oldPosition](#additional-properties)
| *List box array únicamente* |
-| On Scroll |
[horizontalScroll](#additional-properties)
[verticalScroll](#additional-properties)
| |
-| On Unload | | |
-
-## Encabezados de list box
-
-> Para poder acceder a las propiedades de los pies de un list box, debe activar la opción [Mostrar pies](properties_Footers.md#display-footers).
-
-Cuando se muestran los encabezados, puede seleccionar un encabezado en el editor de formularios haciendo clic en él cuando el objeto List box esté seleccionado:
-
-
-
-Puede definir propiedades de texto estándar para cada encabezado de columna de List box; en este caso, estas propiedades tienen prioridad sobre las de la columna o del propio List box.
-
-Además, tiene acceso a las propiedades específicas de los encabezados. En particular, se puede mostrar un icono en el encabezado junto al título de la columna o en su lugar, por ejemplo, cuando se realizan [ordenaciones personalizadas](#managing-sorts).
-
-
-
-Al momento de la ejecución, los eventos que se producen en un encabezado se generan en el método objeto de la columna de list box.
-
-Cuando el comando [`OBJECT SET VISIBLE`](../commands/object-set-visible) es usado con un encabezado, se aplica a todos los encabezados, independientemente del elemento individual definido por el comando. Por ejemplo, `OBJECT SET VISIBLE(*; "header3";False)` ocultará todos los encabezados del objeto list box al que pertenece *header3* y no simplemente este encabezado.
-
-### Propiedades específicas de los encabezados
-
-[Negrita](properties_Text.md#bold) - [Clase](properties_Object.md#css-class) - [Fuente](properties_Text.md#font) - [Color de Fuente](properties_Text.md#font-color) - [Mensaje de ayuda](properties_Help.md#help-tip) - [Alineación Horizontal](properties_Text.md#horizontal-alignment) - [Relleno Horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) - [Ubicación del Ícono](properties_TextAndPicture.md#icon-location) - [Cursiva](properties_Text.md#italic) - [Nombre del objeto](properties_Object.md#object-name) - [Ruta](properties_TextAndPicture.md#picture-pathname) - [Título](properties_Object.md#title) - [Subrayado](properties_Text.md#underline) - [Variable o Expresión](properties_Object.md#variable-or-expression) - [Alineación Vertical](properties_Text.md#vertical-alignment) - [Relleno Vertical](properties_CoordinatesAndSizing.md#vertical-padding) - [Ancho](properties_CoordinatesAndSizing.md#width)
-
-## Pies de list box
-
-> Para poder acceder a las propiedades de los encabezados de un list box, debe activar la opción [Mostrar encabezados](properties_Headers.md#display-headers) del list box.
-
-Los List box pueden contener "pies de página" no editables, que muestren información adicional. En el caso de los datos mostrados en forma de tabla, los pies de página suelen utilizarse para mostrar cálculos como los totales o los promedios.
-
-Cuando se muestran los pies, puede hacer clic para seleccionar un pie de list box en el editor de formularios haciendo clic en el objeto:
-
-
-
-Para cada pie de columna de list box, puede definir propiedades de texto estándar: en este caso, estas propiedades tienen prioridad sobre las de la columna o del list box. También puede acceder a propiedades específicas para los pies de página. En particular, puede insertar un [cálculo personalizado o automático](properties_Object.md#variable-calculation).
-
-Al momento de la ejecución, los eventos que se producen en un pie de página se generan en el método objeto de la columna de list box.
-
-Cuando se utiliza el comando [`OBJECT SET VISIBLE`](../commands/object-set-visible) con un pie de página, se aplica a todos los pies de página, independientemente del elemento individual definido por el comando. Por ejemplo, `OBJECT SET VISIBLE(*; "footer3";False)` ocultará todos los pies de página del objeto list box al que pertenece *footer3* y no simplemente este pie de página.
-
-### Propiedades específicas de los pies
-
-[Formato Alfa](properties_Display.md#alpha-format) - [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) - [Negrita](properties_Text.md#bold) - [Clase](properties_Object.md#css-class) - [Formato fecha](properties_Display.md#date-format) - [Tipo de expresión](properties_Object.md#expression-type) - [Fuente](properties_Text.md#font) - [Color de fuente](properties_Text.md#font-color) - [Consejo de ayuda](properties_Help.md#help-tip) - [Alineación horizontal](properties_Text.md#horizontal-alignment) - [Relleno horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) - [Itálica](properties_Text.md#italic) - [Formato número](properties_Display.md#number-format) - [Nombre del objeto](properties_Object.md#object-name) - [Formato imagen](properties_Display.md#picture-format) - [Formato hora](properties_Display.md#time-format) - [Truncar con puntos suspensivos](properties_Display.md#truncate-with-ellipsis) - [Subrayado](properties_Text.md#underline) - [Cálculo de variable](properties_Object.md#variable-calculation) - [Variable o expresión](properties_Object.md#variable-or-expression) - [Alineación vertical](properties_Text.md#vertical-alignment) - [Relleno vertical](properties_CoordinatesAndSizing.md#vertical-padding) - [Ancho](properties_CoordinatesAndSizing.md#width) - [Ajuste de línea](properties_Display.md#wordwrap)
-
-## Gestión de entrada
-
-Para que una celda de list box sea editable, deben cumplirse las dos condiciones siguientes:
-
-- La columna de la celda debe haberse definido como [Enterable](properties_Entry.md#enterable) (de lo contrario, las celdas de la columna nunca podrán ser editables).
-- En el evento `On Before Data Entry`, $0 no devuelve -1. Cuando el cursor llega a la celda, se genera el evento `On Before Data Entry` en el método de la columna. Si, en el contexto de este evento, $0 se define como -1, la celda se considera como no editable. Si el evento se generó después de presionar **Tab** o **Mayús+Tab**, el foco pasa a la siguiente celda o a la anterior, respectivamente. Si $0 no es -1 (por defecto $0 es 0), la celda se puede introducir y pasa al modo de edición.
-
-Consideremos el ejemplo de un list box que contiene dos arrays, uno fecha y otro texto. El array de la fecha no se puede introducir, pero el array del texto sí se puede introducir si la fecha no ha pasado.
-
-
-
-Aquí está el método de la columna *arrText*:
-
-```4d
- Case of
- :(FORM event.code=On Before Data Entry) // una celda obtiene el foco
- LISTBOX GET CELL POSITION(*;"lb";$col;$row)
- // identification of cell
- If(arrDate{$row} La entrada de datos en los list box de tipo colección/selección de entidades tiene una limitación cuando la expresión se evalúa como nula. En este caso, no es posible editar o eliminar el valor nulo en la celda.
-
-## Gestión de selecciones
-
-La gestión de selecciones es diferente dependiendo de si el list box se basa en un array, en una selección de registros o en una selección de colecciones/entidades:
-
-- **Lista box de tipo selección**: las selecciones se gestionan mediante un conjunto llamado por defecto `$ListboxSetX` (donde X empieza en 0 y se incrementa en función del número de list box en el formulario), que puede modificar si es necesario. Este conjunto se [define en las propiedades](properties_ListBox.md#highlight-set) del list box. Es mantenido automáticamente por 4D: si el usuario selecciona una o más líneas en el list box, el conjunto se actualiza inmediatamente. Por otra parte, también es posible utilizar los comandos del tema "Conjuntos" para modificar por programación la selección en el list box.
-
-- **List box de tipo colección/selección de entidades**: las selecciones se gestionan a través de las propiedades del list box dedicado:
- - [Elemento actual](properties_DataSource.md#current-item) es un objeto que recibirá el elemento/la entidad seleccionado(a)
- - [Elementos seleccionados](properties_DataSource.md#selected-items) es un objeto colección/selección de entidades de elementos seleccionados
- - [Posición del elemento actual](properties_DataSource.md#current-item-position) devuelve la posición del elemento o de la entidad seleccionada.
-
-- **List box de tipo array**: el comando `LISTBOX SELECT ROW` puede utilizarse para seleccionar una o más líneas del list box por programación.
- La [variable asociada al objeto List box](propiedades_Objeto.md#variable-o-expresión) se utiliza para obtener, definir o almacenar las selecciones de líneas en el objeto. Esta variable corresponde a un array de booleanos que es creado y mantenido automáticamente por 4D. El tamaño de este array viene determinado por el tamaño del list box: contiene el mismo número de elementos que el array más pequeño asociado a las columnas.
- Cada elemento de este array contiene `True` si se selecciona la línea correspondiente y `False` en caso contrario. 4D actualiza el contenido de este array en función de las acciones del usuario. Por el contrario, puede cambiar el valor de los elementos del array para cambiar la selección en el list box.
- Por otra parte, no se pueden insertar ni borrar líneas en este array; tampoco se pueden reescribir las líneas. El comando `Count in array` puede utilizarse para averiguar el número de líneas seleccionadas.
- Por ejemplo, este método permite invertir la selección de la primera línea del list box (tipo array):
-
-```4d
- ARRAY BOOLEAN(tBListBox;10)
- //tBListBox es el nombre de la variable asociada al list box en el formulario
- If(tBListBox{1}=True)
- tBListBox{1}:=False
- Else
- tBListBox{1}:=True
- End if
-```
-
-> El comando [`OBJECT SET SCROLL POSITION`](../commands/object-set-scroll-position) desplaza las líneas del list box de modo que se muestre la primera línea seleccionada o una línea especificada.
-
-### Personalizar la apariencia de las líneas seleccionadas
-
-Cuando la opción [Ocultar el resaltado de la selección](properties_Appearance.md#hide-selection-highlight) está seleccionada, debe gestionar la representación visual de las selecciones en el list box utilizando las opciones de interfaz disponibles. Dado que las selecciones siguen siendo gestionadas en su totalidad por 4D, esto significa:
-
-- En el caso de los list box de tipo array, debe analizar la variable array booleana asociada al list box para determinar qué líneas están seleccionadas o no.
-- Para los list box de tipo selección, hay que comprobar si el registro actual (línea) pertenece al conjunto especificado en la propiedad [Conjunto resaltado](properties_ListBox.md#highlight-set) del list box.
-
-A continuación, puede definir por programación los colores de fondo, los colores y/o estilos de fuentes específicas para personalizar la apariencia de las líneas seleccionadas. Esto puede hacerse utilizando arrays o expresiones, en función del tipo de list box mostrado (ver las siguientes secciones).
-
-> Puede utilizar la constante `lk inherited` para aplicar la apariencia actual del list box (por ejemplo, el color de la fuente, el color de fondo, el estilo de la fuente, etc.).
-
-#### List box de tipo selección
-
-Para determinar qué líneas están seleccionadas, hay que comprobar si están incluidas en el conjunto indicado en la propiedad [Conjunto resaltado](properties_ListBox.md#highlight-set) del list box. A continuación, puede definir la apariencia de las líneas seleccionadas utilizando una o varias de las [propiedades de expresión de color o estilo](#using-arrays-and-expressions) relevantes.
-
-Tenga en cuenta que las expresiones se reevalúan automáticamente cada vez que:
-
-- la selección de list box cambia.
-- list box obtiene o pierde el foco.
-- la ventana formulario que contiene el list box se convierte, o deja de ser, la ventana del primer plano.
-
-#### List box de tipo array
-
-Tiene que analizar el array booleano [Variable o expresión](properties_Object.md#variable-or-expression) asociado al list box para determinar si las líneas están seleccionadas o no.
-
-A continuación, puede definir la apariencia de las líneas seleccionadas utilizando una o varias de las [propiedades de array de color o de estilo](#using-arrays-and-expressions) relevantes.
-
-Tenga en cuenta que los arrays de list box utilizados para definir la apariencia de las líneas seleccionadas deben recalcularse en el evento formulario `On Selection Change`; sin embargo, también puede modificar estos arrays basándose en los siguientes ev
-
-- `On Getting Focus` (propiedad list box)
-- `On Losing Focus` (propiedad list box)
-- `On Activate` (propiedad list box)
-- `On Deactivate` (form property) ...depending on whether and how you want to visually represent changes of focus in selections.
-
-##### Ejemplo
-
-Ha elegido ocultar el resaltado sistema y desea mostrar las selecciones en el list box con un color de fondo verde, como se muestra aquí:
-
-
-
-Para un list box de tipo array, es necesario actualizar el [Array colores de fondo](properties_BackgroundAndBorder.md#row-background-color-array) por programación. En el formulario JSON, ha definido el Array colores de fondo de línea para el list box:
-
-```
- "rowFillSource": "_ListboxBackground",
-```
-
-En el método objeto del list box, puede escribir:
-
-```4d
- Case of
- :(FORM event.code=On Selection Change)
- $n:=Size of array(LB_Arrays)
- ARRAY LONGINT(_ListboxBackground;$n) // colores de fondo de la línea
- For($i;1;$n)
- If(LB_Arrays{$i}=True) // selected
- _ListboxBackground{$i}:=0x0080C080 // fondo verde
- Else // not selected
- _ListboxBackground{$i}:=lk inherited
- End if
- End for
- End case
-```
-
-Para un list box de tipo selección, para producir el mismo efecto puede utilizar un método para actualizar la [expresión de color de fondo](properties_BackgroundAndBorder.md#background-color-expression) basado en el conjunto especificado en la propiedad [Conjunto de resaltado](properties_ListBox.md#highlight-set).
-
-Por ejemplo, en el formulario JSON, ha definido el conjunto resaltado y la expresión de color de fondo siguientes para el list box:
-
-```
- "highlightSet": "$SampleSet",
- "rowFillSource": "UI_SetColor",
-```
-
-Puede escribir en el método *UI_SetColor*:
-
-```4d
- If(Is in set("$SampleSet"))
- $color:=0x0080C080 // fondo verde
- Else
- $color:=lk inherited
- End if
-
- $0:=$color
-```
-
-> En los list box jerárquicos, las líneas de ruptura no pueden resaltarse cuando la opción [Ocultar resaltado selección](properties_Appearance.md#hide-selection-highlight) está seleccionada. Como no es posible tener colores distintos para los encabezados del mismo nivel, no hay manera de destacar una línea de ruptura específica por programación.
-
-## Gestión de ordenaciones
-
-Un orden en un list box puede ser estándar o personalizado. Cuando se ordena una columna de un list box, todas las demás columnas se sincronizan siempre automáticamente.
-
-### Ordenación estándar
-
-Por defecto, un list box ofrece una ordenación de columnas estándar cuando se hace clic en el encabezado. Una ordenación estándar es una ordenación alfanumérica de los valores de las columnas evaluadas, alternativamente ascendiendo/descendiendo con cada clic sucesivo.
-
-Puede activar o desactivar la ordenación usuario estándar desactivando la propiedad [Ordenable](properties_Action.md#sortable) del list box (activada por defecto).
-
-El soporte de ordenación estándar depende del tipo de list box:
-
-| Tipo de list box | Soporte de ordenación estándar | Comentarios |
-| ------------------------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| Colección de objetos | Sí |
Las columnas "This.a" o "This.a.b" son ordenables.
La [propiedad fuente del list box](properties_Object.md#variable-or-expression) debe ser una [expresión asignable](../Concepts/quick-tour.md#assignable-vs-non-assignable-expressions).
|
-| Colección de valores escalares | No | Utilice la ordenación personalizada con la función [`orderBy()`](../API/CollectionClass.md#orderby) |
-| Entity selection | Sí |
La [propiedad fuente del list box](properties_Object.md#variable-or-expression) debe ser una [expresión asignable](../Concepts/quick-tour.md#assignable-vs-non-assignable-expressions).
Soportado: ordenaciones en propiedades de atributos de objeto (p. ej. "This.data.city")
No soportado: ordenaciones en propiedades de atributos de objeto a través de atributos relacionados (p. ej. "This.company.data.city"). Para ello, debe utilizar la ordenación personalizada con la función [`orderByFormula()`](../API/EntitySelectionClass.md#orderbyformula) (ver el siguiente ejemplo)
|
-| Selección actual | Sí | Sólo se pueden ordenar las expresiones simples (por ejemplo, `[Table_1]Campo_2`) |
-| Selección temporal | No | |
-| Arrays | Sí | Las columnas vinculadas a arrays de imágenes y punteros no se pueden ordenar |
-
-### Ordenación personalizada
-
-El desarrollador puede configurar ordenaciones personalizadas, por ejemplo utilizando el comando [`LISTBOX SORT COLUMNS`](../commands-legacy/listbox-sort-columns.md) y/o combinando los eventos de formulario [`On Header Click`](../Events/onHeaderClick) y [`On After Sort`](../Events/onAfterSort) y los comandos 4D relevantes.
-
-Los ordenamientos personalizados le permiten:
-
-- realizar ordenaciones multinivel en varias columnas, gracias al comando [`LISTBOX SORT COLUMNS`](../commands-legacy/listbox-sort-columns.md),
-- utilizar funciones como [`collection.orderByMethod()`](../API/CollectionClass.md#orderbymethod) o [`entitySelection.orderByFormula()`](../API/EntitySelectionClass.md#orderbyformula) para ordenar columnas según criterios complejos.
-
-#### Ejemplo
-
-Desea ordenar un list box utilizando los valores de una propiedad almacenada en un atributo de objeto relacionado. Tiene la siguiente estructura:
-
-
-
-Se diseña un list box de tipo entity selection, vinculado a la expresión `Form.child`. En el evento formulario `On Load`, se ejecuta `Form.child:=ds.Child.all()`.
-
-Se muestran dos columnas:
-
-| Nombre del hijo | Apodo del padre |
-| --------------- | ---------------------------- |
-| `This.name` | `This.parent.extra.nickname` |
-
-Si quiere ordenar el list box utilizando los valores de la segunda columna, debe escribir:
-
-```4d
-If (Form event code=On Header Click)
- Form.child:=Form.child.orderByFormula("This.parent.extra.nickname"; dk ascending)
-End if
-```
-
-### Variable de encabezado de columna
-
-El valor de la [variable asociada al encabezado de una columna](properties_Object.md#variable-or-expression) permite gestionar una información adicional: la ordenación actual de la columna (lectura) y la visualización de la flecha de ordenación.
-
-- Si la variable se define en 0, la columna no se ordena y la flecha de ordenación no se muestra.
- 
-
-- Si la variable está en 1, la columna se ordena en orden ascendente y se muestra la flecha de ordenación.
- 
-
-- Si la variable se establece en 2, la columna se clasifica en orden descendente y se muestra la flecha de clasificación.
- 
-
-> Sólo las [variables](Concepts/variables.md) declaradas o dinámicas pueden utilizarse como variables de encabezado de columna. Otros tipos de [expresiones](Concepts/quick-tour.md#expressions) como `Form.sortValue` no son soportadas.
-
-Puede definir el valor de la variable (por ejemplo, Header2:=2) para "forzar" la visualización de la flecha de ordenación. En este caso no se modifica la ordenación por columnas en sí, sino que es el desarrollador quien debe encargarse de ello.
-
-> El comando [`OBJECT SET FORMAT`](../commands-legacy/object-set-format.md) ofrece soporte específico para iconos en los encabezados de los list box, lo que puede ser útil cuando se desea trabajar con un icono de ordenación personalizado.
-
-## Gestión de los colores, estilos y visualización de las líneas
-
-Hay varias formas de definir los colores de fondo, los colores de fuente y los estilos de fuente en los list box:
-
-- al nivel de las [propiedades del objeto list box](#list-box-objects),
-- a nivel de las [propiedades de la columna](#list-box-columns),
-- utilizando los [arrays o expresiones](#using-arrays-and-expressions) para el list box y/o para cada columna,
-- a nivel del texto de cada celda (si [texto multi-estilo](properties_Text.md#multi-style)).
-
-### Prioridad y herencia
-
-Los principios de prioridad y de herencia se observan cuando la misma propiedad se define en más de un nivel.
-
-| Nivel de prioridad | Ubicación del parámetro |
-| ------------------ | ----------------------------------------------------------------------------------------------------------- |
-| alta prioridad | Celda (si texto multiestilo) |
-| | Arrays de columnas/métodos |
-| | Arrays/métodos de Listbox |
-| | Propiedades de la columna |
-| | Propiedades de list box |
-| baja prioridad | Expresiones de metainformación (para colecciones o list boxes de selección de entidades) |
-
-Por ejemplo, si define un estilo de fuente en las propiedades del list box y otro mediante un array de estilos para la columna, se tendrá en cuenta este último.
-
-Para cada atributo (estilo, color y color de fondo), se implementa una **herencia** cuando se utiliza el valor por defecto:
-
-- para los atributos de las celdas: valores de atributos de las líneas
-- para los atributos líneas: valores de atributos de columnas
-- para los atributos de la columna: valores de los atributos del list box
-
-De esta forma, si desea que un objeto herede el valor de atributo de un nivel superior, puede utilizar pasar la constante `lk inherited` (valor por defecto) al comando de definición o directamente en el elemento del array de estilo/color correspondiente. Por ejemplo, dado un list box array contiene un estilo de fuente estándar con colores alternos:
-
-
-Realiza las siguientes modificaciones:
-
-- cambiar el fondo de la línea 2 a rojo utilizando la propiedad [Row Background Color Array](properties_BackgroundAndBorder.md#row-background-color-array) del objeto list box,
-- cambia el estilo de la línea 4 a cursiva utilizando la propiedad [Row Style Array](properties_Text.md#row-style-array) del objeto list box,
-- dos elementos de la columna 5 se cambian a negrita utilizando la propiedad [Row Style Array](properties_Text.md#row-style-array) del objeto columna 5,
-- los 2 elementos de la columna 1 y 2 se cambian a azul oscuro utilizando la propiedad [Row Background Color Array](properties_BackgroundAndBorder.md#row-background-color-array) para los objetos de la columna 1 y 2:
-
-
-
-Para restaurar la apariencia original de la caja del list box, puede:
-
-- pasar la constante `lk inherited` en el elemento 2 de los arrays de color de fondo de las columnas 1 y 2: entonces heredan el color de fondo rojo de la línea.
-- pasar la constante `lk inherited` en los elementos 3 y 4 del array de estilo de la columna 5: entonces heredan el estilo estándar, excepto el elemento 4, que cambia a itálica según lo especificado en el array de estilo del list box.
-- pasar la constante `lk inherited` en el elemento 4 del array de estilos para el list box con el fin de eliminar el estilo itálica.
-- pasar la constante `lk inherited` en el elemento 2 del array de colores de fondo para el list box con el fin de restaurar el color alternativo original del list box.
-
-### Uso de arrays y expresiones
-
-Según el tipo de list box, puede utilizar diferentes propiedades para personalizar los colores, estilos y visualización de las líneas:
-
-| Propiedad | List box array | List box selección | List box colección o entity selection |
-| ---------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Color de fondo | [Array de colores de fondo de fila](properties_BackgroundAndBorder.md#row-background-color-array) | [Expresión del color de fondo](properties_BackgroundAndBorder.md#background-color-expression) | [Expresión color de fondo](properties_BackgroundAndBorder.md#background-color-expression) o [Meta info expresión](properties_Text.md#meta-info-expression) |
-| Color de fuente | [Array color de fuente de fila](properties_Text.md#row-font-color-array) | [Expresión de color de fuente](properties_Text.md#font-color-expression) | [Expresión color de fuente](properties_Text.md#font-color-expression) o [Meta info expression](properties_Text.md#meta-info-expression) |
-| Estilo de fuente | [Array de estilo de línea](properties_Text.md#row-style-array) | [Expresión de estilo](properties_Text.md#style-expression) | [Expresión de estilo](properties_Text.md#style-expression) o [Expresión meta info](properties_Text.md#meta-info-expression) |
-| Visualización | [Array de control de filas](properties_ListBox.md#row-control-array) | - | - |
-
-## Imprimir list boxes
-
-Hay dos modos de impresión disponibles: **modo vista previa** - que se puede utilizar para imprimir un list box como un objeto de formulario y el **modo avanzado**, que le permite controlar la impresión del propio objeto list box en el formulario. Tenga en cuenta que la apariencia "Impresión" está disponible para los list boxes en el editor de formularios.
-
-### Modo de vista previa
-
-La impresión de un list box en modo vista previa consiste en imprimir directamente el list box y el formulario que lo contiene utilizando los comandos de impresión estándar o el comando de menú **Imprimir**. El list box se imprime tal como está en el formulario. Este modo no permite controlar con precisión la impresión del objeto; en particular, no permite imprimir todas las líneas de un list box que contenga más líneas de las que puede mostrar.
-
-### Modo avanzado
-
-En este modo, la impresión de los list box se realiza por programación, a través del comando `Print object` (se soportan los formularios proyecto y los formularios tabla). The [`LISTBOX GET PRINT INFORMATION`](../commands/listbox-get-print-information) command is used to control the printing of the object.
-
-En este modo:
-
-- La altura del objeto list box se reduce automáticamente cuando el número de líneas a imprimir es inferior a la altura original del objeto (no se imprimen líneas "vacías"). Por el contrario, la altura no aumenta automáticamente en función del contenido del objeto. The size of the object actually printed can be obtained via the [`LISTBOX GET PRINT INFORMATION`](../commands/listbox-get-print-information) command.
-- El objeto list box se imprime "tal cual", es decir, teniendo en cuenta sus parámetros de visualización actuales: visibilidad de los encabezados y de las rejillas, líneas ocultas y mostradas, etc.
- These parameters also include the first row to be printed: if you call the [`OBJECT SET SCROLL POSITION`](../commands/object-set-scroll-position) command before launching the printing, the first row printed in the list box will be the one designated by the command.
-- Un mecanismo automático facilita la impresión de los list box que contienen más líneas de las que es posible mostrar: se pueden realizar llamadas sucesivas a `Print object` para imprimir cada vez un nuevo conjunto de líneas. The [`LISTBOX GET PRINT INFORMATION`](../commands/listbox-get-print-information) command can be used to check the status of the printing while it is underway.
-
-## List box jerárquicos
-
-Un list box jerárquico es un list box en el que el contenido de la primera columna aparece en forma jerárquica. Este tipo de representación se adapta a la presentación de información que incluye valores repetidos y/o que dependen jerárquicamente (país/región/ciudad, etc.).
-
-> Sólo los [list box de tipo array](#array-list-boxes) pueden ser jerárquicos.
-
-Los list box jerárquicos son una forma particular de representar los datos, pero no modifican la estructura de datos (arrays). Los list box jerárquicos se gestionan exactamente igual que los list box clásicos.
-
-### Definir una jerarquía
-
-Para definir un list box jerárquico, existen varias posibilidades:
-
-- Configurar manualmente los elementos jerárquicos utilizando la lista de propiedades del editor de formularios (o editar el formulario JSON).
-- Generar visualmente la jerarquía utilizando el menú emergente de gestión de list box, en el editor de formularios.
-- Use the [`LISTBOX SET HIERARCHY`](../commands-legacy/listbox-set-hierarchy.md) and [`LISTBOX GET HIERARCHY`](../commands-legacy/listbox-get-hierarchy.md) commands.
-
-#### Propiedades del List Box jerárquico
-
-Esta propiedad especifica que el list box debe mostrarse en forma jerárquica. En el formulario JSON, esta función se activa [cuando el valor de la propiedad *dataSource* de la columna es un array](properties_Object.md#array-list-box), es decir, una colección.
-
-Las opciones adicionales (**Variable 1...10**) están disponibles cuando se selecciona la opción *List box jerárquico*, correspondiente a cada elemento del array *dataSource* a utilizar como columna de ruptura. Cada vez que se introduce un valor en un campo, se añade una nueva línea. Se pueden especificar hasta 10 variables. Estas variables definen los niveles jerárquicos a mostrar en la primera columna.
-
-La primera variable corresponde siempre al nombre de la variable de la primera columna del list box (los dos valores se vinculan automáticamente). Esta primera variable está siempre visible y se puede editar. Por ejemplo: country.
-La segunda variable también es siempre visible y editable; define el segundo nivel jerárquico. Por ejemplo: regions.
-A partir del tercer campo, cada variable depende de la anterior. Por ejemplo: counties, cities, etc. Se puede especificar un máximo de diez niveles jerárquicos. Si se elimina un valor, toda la jerarquía sube de nivel.
-
-La última variable nunca es jerárquica aunque existan varios valores idénticos en este nivel. Por ejemplo, refiriéndonos a la configuración ilustrada anteriormente, imagine que arr1 contiene los valores A A B B B, arr2 tiene los valores 1 1 1 2 2 2 y arr3 los valores X X Y Y Z. En este caso, A, B, 1 y 2 podrían aparecer de forma contraída, pero no X e Y:
-
-
-
-Este principio no se aplica cuando sólo se especifica una variable en la jerarquía: en este caso, pueden agruparse valores idénticos.
-
-> Si especifica una jerarquía basada en las primeras columnas de un list box existente, deberá eliminar u ocultar estas columnas (excepto la primera), ya que de lo contrario aparecerán duplicadas en el list box. Si especifica la jerarquía mediante el menú emergente del editor (ver abajo), las columnas innecesarias se eliminan automáticamente del list box.
-
-#### Crear una jerarquía utilizando el menú contextual
-
-Cuando selecciona al menos una columna además de la primera en un objeto list box (de tipo array) en el editor de formularios, el comando **Crear jerarquía** está disponible en el menú contextual:
-
-
-
-Este comando es un acceso directo para definir una jerarquía. Cuando se selecciona, se llevan a cabo las siguientes acciones:
-
-- La opción **List box jerárquico** está marcada para el objeto en la Lista de propiedades.
-- Las variables de las columnas se utilizan para definir la jerarquía. Reemplazan las variables ya definidas.
-- Las columnas seleccionadas ya no aparecen en el list box (excepto el título de la primera).
-
-Ejemplo: dado un list box cuyas primeras columnas contienen País, Región, Ciudad y Población. Cuando se seleccionan País, Región y Ciudad, si se elige **Crear jerarquía** en el menú contextual, se crea una jerarquía de tres niveles en la primera columna, se eliminan las columnas 2 y 3 y la columna Población pasa a ser la segunda:
-
-
-
-##### Cancelar jerarquía
-
-Cuando la primera columna está seleccionada y ya se ha definido como jerárquica, puede utilizar el comando **Cancelar jerarquía**. Cuando elige este comando, se llevan a cabo las siguientes acciones:
-
-- La opción **List box jerárquico** está deseleccionada para el objeto,
-- Los niveles jerárquicos 2 a X se eliminan y se transforman en columnas añadidas al list box.
-
-### Principios de funcionamiento
-
-Cuando se abre por primera vez un formulario que contiene un list box jerárquico, por defecto se despliegan todas las líneas.
-
-Cuando los valores se repiten en los arrays, se añade automáticamente una línea de ruptura y un "nodo" jerárquico en el list box. Por ejemplo, imagine un list box que contenga cuatro arrays que indiquen las ciudades, cada una de ellas caracterizada por su país, su región, su nombre y su número de habitantes:
-
-
-
-Si este list box se muestra en forma jerárquica (los tres primeros arrays están incluidos en la jerarquía), se obtiene:
-
-
-
-Los arrays no se ordenan antes de construir la jerarquía. Si, por ejemplo, un array contiene los datos AAABBAACC, la jerarquía obtenida es:
-\> A
-\> B
-\> A
-\> C
-
-Para desplegar o contraer un "nodo" jerárquico, basta con hacer clic en él. Si hace **Alt+clic** (Windows) o **Opción+clic** (macOS) en el nodo, todos sus subelementos se desplegarán o contraerán también. Estas operaciones también pueden realizarse por programación utilizando los comandos `LISTBOX EXPAND` y `LISTBOX COLLAPSE`.
-
-Cuando se incluyen valores del tipo fecha u hora en un list box jerárquico, se muestran en el formato del sistema corto.
-
-#### Ordenación en list box jerárquicos
-
-Cuando se incluyen valores del tipo fecha u hora en un list box jerárquico, se muestran en el formato del sistema corto.
-
-- En primer lugar, todos los niveles de la columna jerárquica (primera columna) se clasifican automáticamente por orden ascendente.
-- La ordenación se realiza por orden ascendente o descendente (según la acción del usuario) sobre los valores de la columna en la que se ha hecho clic.
-- Todas las columnas son sincronizadas.
-- En las siguientes ordenaciones realizadas en columnas no jerárquicas del list box, sólo se ordena el último nivel de la primera columna. Es posible modificar la ordenación de esta columna haciendo clic en su encabezado.
-
-Cuando se incluyen valores del tipo fecha u hora en un list box jerárquico, se muestran en el formato del sistema corto.
-
-
-
-Si hace clic en el encabezado "Population" para ordenar las poblaciones por orden ascendente (o alternativamente descendente), los datos aparecen de la siguiente manera:
-
-
-
-Como para todos los list box, puede [desactivar el mecanismo de ordenación estándar](properties_Action.md#sortable) y gestionar las ordenaciones por programación.
-
-#### Selecciones y posiciones en list box jerárquicos
-
-Un list box jerárquico muestra un número variable de líneas en la pantalla según el estado desplegado/contraído de los nodos jerárquicos. Sin embargo, esto no significa que el número de líneas de los arrays varíe. Sólo se modifica la visualización, no los datos. Es importante entender este principio porque la gestión programada de los list box jerárquicos se basa siempre en los datos de los arrays, no en los datos mostrados. En particular, las filas de ruptura añadidas automáticamente no se tienen en cuenta en los arrays de opciones de visualización (ver más adelante).
-
-Veamos, por ejemplo, los siguientes arrays:
-
-
-
-Si estos arrays se representan jerárquicamente, la línea "Quimper" no se mostrará en la segunda línea, sino en la cuarta, debido a las dos líneas de ruptura que se añaden:
-
-
-
-Independientemente de cómo se muestren los datos en el list box (de forma jerárquica o no), si quiere cambiar la línea que contiene "Quimper" a negrita, debe utilizar la instrucción Style{2} = bold. Sólo se tiene en cuenta la posición de la línea en los arrays.
-
-Este principio se aplica a los arrays internos que se pueden utilizar para gestionar:
-
-- colores
-
-- colores de fondo
-
-- estilos
-
-- líneas ocultas
-
-- selecciones
-
-Este principio se aplica a los arrays internos que se pueden utilizar para gestionar:
-
-```4d
- ->MyListbox{3}:=True
-```
-
-Representación no jerárquica:
-
-Representación jerárquica:
-
-
-> Si una o más líneas están ocultas porque sus padres están contraídos, ya no se seleccionan. Sólo se pueden seleccionar las líneas visibles (directamente o por desplazamiento). En otras palabras, las líneas no pueden estar ocultas y seleccionadas a la vez.
-
-As with selections, the [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command will return the same values for a hierarchical list box and a non-hierarchical list box. This means that in both of the examples below, [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) will return the same position: (3;2).
-
-*Representación no jerárquica:*
-
-
-*Representación jerárquica:*
-
-
-Cuando se ocultan todas las líneas de una subjerarquía, la línea de ruptura se oculta automáticamente. En el ejemplo anterior, si las líneas 1 a 3 están ocultas, la línea de ruptura "Bretaña" no aparecerá.
-
-#### Líneas de quiebre
-
-If the user selects a break row, [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) returns the first occurrence of the row in the corresponding array. En el caso siguiente:
-
-
-
-... [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) returns (2;4). To select a break row by programming, you will need to use the [`LISTBOX SELECT BREAK`](../commands/listbox-select-break) command.
-
-Las líneas de rotura no se tienen en cuenta en los arrays internos utilizados para gestionar el aspecto gráfico de los list box (estilos y colores). No obstante, es posible modificar estas características para las líneas de ruptura mediante los comandos de gestión gráfica de los objetos. Basta con ejecutar los comandos adecuados en los arrays que constituyen la jerarquía.
-
-El siguiente list box fue diseñado utilizando un array de objetos:
-
-*Representación no jerárquica:*
-
-
-*Representación jerárquica:*
-
-
-En modo jerárquico, los niveles de ruptura no son tenidos en cuenta por los arrays de modificación de estilo denominados `tStyle` y `tColors`. Para modificar el color o el estilo de los niveles de ruptura, debe ejecutar las siguientes instrucciones:
-
-```4d
- OBJECT SET RGB COLORS(T1;0x0000FF;0xB0B0B0)
- OBJECT SET FONT STYLE(T2;Bold)
-```
-
-> En este contexto, sólo la sintaxis que utiliza la variable array puede funcionar con los comandos de la propiedad del objeto porque los arrays no tienen ningún objeto asociado.
-
-Resultado:
-
-
-
-#### Gestión optimizada de desplegar/contraer
-
-Puede optimizar la visualización y gestión de los list box jerárquicos utilizando los eventos formulario `On Expand` y `On Collapse`.
-
-Un list box jerárquico se construye a partir del contenido de sus arrays, por lo que sólo puede mostrarse cuando todos estos arrays están cargados en memoria. This makes it difficult to build large hierarchical list boxes based on arrays generated from data (through the [`SELECTION TO ARRAY`](../commands/selection-to-array) command), not only because of the display speed but also the memory used.
-
-El uso de los eventos de formulario `On Expand` y `On Collapse` puede superar estas limitaciones: por ejemplo, puede mostrar sólo una parte de la jerarquía y cargar/descargar los arrays sobre la marcha, basándose en las acciones del usuario. In the context of these events, the [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command returns the cell where the user clicked in order to expand or collapse a row.
-
-En este caso, debe llenar y vaciar los arrays por código. Los principios que deben aplicarse son:
-
-- Cuando se muestra el list box, sólo se debe llenar el primer array. Sin embargo, debe crear un segundo array con valores vacíos para que el list box muestre los botones desplegar/contraer:
- 
-
-- Cuando un usuario hace clic en un botón de expandir, puede procesar el evento `On Expand`. The [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command returns the cell concerned and lets you build the appropriate hierarchy: you fill the first array with the repeated values and the second with the values sent from the [`SELECTION TO ARRAY`](../commands/selection-to-array) command and you insert as many rows as needed in the list box using the [`LISTBOX INSERT ROWS`](../commands/listbox-insert-rows) command.
- 
-
-- Cuando un usuario hace clic en un botón de contracción, puede procesar el evento `On Collapse`. The [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command returns the cell concerned: you remove as many rows as needed from the list box using the [`LISTBOX DELETE ROWS`](../commands/listbox-delete-rows) command.
-
-## Arrays de objetos en columnas
-
-Las columnas de list box pueden manejar arrays de objetos. Como los arrays de objetos pueden contener diferentes tipos de datos, esta nueva y poderosa funcionalidad permite mezclar diferentes tipos de entrada en las líneas de una misma columna, y mostrar también varios widgets. Por ejemplo, puede insertar una entrada de texto en la primera línea, una casilla de selección en la segunda y una lista desplegable en la tercera. Los arrays de objetos también dan acceso a nuevos tipos de widgets, como botones o selectores de color.
-
-El siguiente list box fue diseñado utilizando un array de objetos:
-
-
-
-### Configurar una columna array de objetos
-
-Para asignar un array de objetos a una columna list box, basta con definir el nombre del array de objetos en la lista de propiedades (campo "Nombre de variable"), o utilizando el comando [LISTBOX INSERT COLUMN](../commands-legacy/listbox-insert-column.md), como para toda columna basada en arrays. En la lista de propiedades, ahora puede seleccionar Objeto como "Tipo de expresión" para la columna:
-
-
-
-Las propiedades estándar relacionadas con las coordenadas, el tamaño y el estilo están disponibles para las columnas de tipo objeto. Puede definirlos utilizando la lista de Propiedades, o programando el estilo, el color de fuente, el color de fondo y la visibilidad para cada línea de una columna objeto del list box. Estos tipos de columnas también se pueden ocultar.
-
-Sin embargo, el tema Fuente de datos no está disponible para las columnas objeto del list box. De hecho, el contenido de cada celda de la columna se basa en los atributos presentes en el elemento correspondiente del array de objetos. Cada elemento de array puede definir:
-
-the value type (mandatory): text, color, event, etc. the value itself (optional): used for input/output.
-the cell content display (optional): button, list, etc. additional settings (optional): depend on the value type To define these properties, you need to set the appropriate attributes in the object (available attributes are listed below). Por ejemplo, puede escribir "¡Hola Mundo!" en una columna objeto utilizando este sencillo código:
-
-```4d
-ARRAY OBJECT(obColumn;0) //array de columnas
- C_OBJECT($ob) //primer elemento
- OB SET($ob; "valueType"; "text") //define el tipo de valor (obligatorio)
- OB SET($ob; "value"; "Hello World!") //define el valor
- APPEND TO ARRAY(obColumn;$ob)
-```
-
-
-
-> El formato de visualización y los filtros de entrada no pueden definirse para una columna de objetos. Dependen automáticamente del tipo de valor.
-
-#### valueType y visualización de datos
-
-Cuando una columna de list box está asociada a un array de objetos, la forma en que se muestra, introduce o edita una celda se basa en el atributo valueType del elemento del array. Los valores valueType soportados son:
-
-- "text": para un valor de texto
-- "real": para un valor numérico que puede incluir separadores como un `\`, `<.>`, o `<,>`
-- "integer": para un valor entero
-- "boolean": para un valor True/False
-- "color": para definir un color de fondo
-- "event": para mostrar un botón con una etiqueta.
-
-4D utiliza widgets por defecto en función del valor "valueType" (es decir, un "text" se muestra como un widget de entrada de texto, un "boolean" como una casilla de selección), pero también están disponibles visualizaciones alternativas a través de opciones (*por ejemplo*, un real también se puede representar como un menú desplegable). La siguiente tabla muestra la visualización por defecto, así como las alternativas para cada tipo de valor:
-
-| valueType | Widget por defecto | Widget(s) alternativo(s) |
-| --------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
-| text | entrada de texto | menú desplegable (lista obligatoria) o combo box (lista de selección) |
-| real | entrada de texto controlada (números y separadores) | menú desplegable (lista obligatoria) o combo box (lista de selección) |
-| integer | entrada de texto controlada (números únicamente) | menú desplegable (lista obligatoria) o combo box (lista de opciones) o casilla de verificación de tres estados |
-| boolean | casilla de selección | menú desplegable (lista requerida) |
-| color | color de fondo | text |
-| evento | botón con etiqueta | |
-| | | Todos los widgets pueden tener un botón adicional de alternancia de unidades o un botón de elipsis asociado a la celda. |
-
-Usted define la visualización de la celda y las opciones utilizando atributos específicos en cada objeto (ver abajo).
-
-#### Formatos de visualización y filtros de entrada
-
-No se pueden definir formatos de visualización ni filtros de entrada para las columnas objeto de los list box. Se definen automáticamente en función del tipo de valor. Estos están listados en la siguiente tabla:
-
-| Tipo de valor | Formato por defecto | Control de entrada |
-| ------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------- |
-| text | lo mismo que se define en el objeto | cualquiera (sin control) |
-| real | lo mismo que se define en el objeto (utilizando el separador decimal del sistema) | "0-9" y "." y "-" |
-| | | "0-9" y "." si min>=0 |
-| integer | lo mismo que se define en el objeto | "0-9" y "-" |
-| | | "0-9" si min>=0 |
-| Boolean | casilla de selección | N/A |
-| color | N/A | N/A |
-| evento | N/A | N/A |
-
-### Atributos
-
-Cada elemento del array de objetos es un objeto que puede contener uno o más atributos que definirán el contenido de la celda y la visualización de los datos (ver el ejemplo anterior).
-
-El único atributo obligatorio es "valueType" y sus valores soportados son "text", "real", "integer", "boolean", "color" y "event". La siguiente tabla lista todos los atributos soportados en los arrays de objetos de los list box, en función del valor "valueType" (cualquier otro atributo se ignora). A continuación se detallan los formatos de visualización y se ofrecen ejemplos.
-
-| | valueType | text | real | integer | boolean | color | evento |
-| --------------------- | ------------------------------------------------------- | ---- | ---- | ------- | ------- | ----- | ------ |
-| *Atributos* | *Description* | | | | | | |
-| value | valor de la celda (entrada o salida) | x | x | x | | | |
-| min | valor mínimo | | x | x | | | |
-| max | valor máximo | | x | x | | | |
-| behavior | Valor "tres Estados" | | | x | | | |
-| requiredList | lista desplegable definida en objeto | x | x | x | | | |
-| choiceList | combo box definido en objeto | x | x | x | | | |
-| requiredListReference | RefList 4D, depende del valor de "saveAs" | x | x | x | | | |
-| requiredListName | Nombre de la lista 4D, depende del valor "saveAs" | x | x | x | | | |
-| saveAs | "reference" o "value" | x | x | x | | | |
-| choiceListReference | RefList 4D, muestra un combo box | x | x | x | | | |
-| choiceListName | Nombre de la lista 4D, mostrar combo box | x | x | x | | | |
-| unitList | array de X elementos | x | x | x | | | |
-| unitReference | índice del elemento seleccionado | x | x | x | | | |
-| unitsListReference | Ver lista de unidades 4D | x | x | x | | | |
-| unitsListName | 4D lista nombre de la unidad | x | x | x | | | |
-| alternateButton | añadir un botón alternativo | x | x | x | x | x | |
-
-#### value
-
-Los valores de las celdas se almacenan en el atributo "value". Este atributo se utiliza tanto para la entrada como para la salida. También puede utilizarse para definir valores por defecto cuando se utilizan listas (ver a continuación).
-
-```4d
- ARRAY OBJECT(obColumn;0) //array columna
- C_OBJECT($ob1)
- $entry:="Hello world!"
- OB SET($ob1;"valueType";"text")
- OB SET($ob1;"value";$entry) // si el usuario introduce un nuevo valor, $entry contendrá el valor editado
- C_OBJECT($ob2)
- OB SET($ob2;"valueType";"real")
- OB SET($ob2;"value";2/3)
- C_OBJECT($ob3)
- OB SET($ob3;"valueType";"boolean")
- OB SET($ob3;"value";True)
-
- APPEND TO ARRAY(obColumn;$ob1)
- APPEND TO ARRAY(obColumn;$ob2)
- APPEND TO ARRAY(obColumn;$ob3)
-```
-
-
-
-> Los valores null se soportan y dan como resultado una celda vacía.
-
-#### min y max
-
-Cuando el "valueType" es "real" o "integer", el objeto también acepta atributos min y max con valores apropiados (los valores deben ser del mismo tipo que el valueType).
-
-Estos atributos pueden utilizarse para controlar el rango de valores de entrada. Cuando se valida una celda (cuando pierde el foco), si el valor de entrada es menor que el valor mínimo o mayor que el valor máximo, entonces se rechaza. En este caso, se mantiene el valor anterior y un consejo muestra una explicación.
-
-```4d
- C_OBJECT($ob3)
- $entry3:=2015
- OB SET($ob3;"valueType";"integer")
- OB SET($ob3;"value";$entry3)
- OB SET($ob3;"min";2000)
- OB SET($ob3;"max";3000)
-```
-
-
-
-#### behavior
-
-El atributo behavior ofrece variaciones a la representación estándar de los valores. En 4D v15, se ofrece una única variación:
-
-| Atributo | Valor(es) disponible(s) | valueType(s) | Descripción |
-| -------- | ------------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| behavior | threeStates | integer | Representa un valor numérico como una casilla de verificación de tres estados. 2=semi-checked, 1=checked, 0=unchecked, -1=invisible, -2=unchecked disabled, -3=checked disabled, -4=semi-checked disabled |
-
-```4d
- C_OBJECT($ob3)
- OB SET($ob3;"valueType";"integer")
-
- OB SET($ob3;"value";-3)
- C_OBJECT($ob4)
- OB SET($ob4;"valueType";"integer")
- OB SET($ob4;"value";-3)
- OB SET($ob4;"behavior";"threeStates")
-```
-
-
-
-#### requiredList y choiceList
-
-Cuando un atributo "choiceList" o "requiredList" está presente dentro del objeto, la entrada de texto se sustituye por una lista desplegable o un combo box, dependiendo del atributo:
-
-- Si el atributo es "choiceList", la celda se muestra como un combo box. Esto significa que el usuario puede seleccionar o escribir un valor.
-- Si el atributo es "requiredList", la celda se muestra como una lista desplegable y el usuario sólo puede seleccionar uno de los valores de la lista.
-
-En ambos casos, se puede utilizar un atributo "valor" para preseleccionar un valor en el widget.
-
-> Los valores del widget se definen a través de un array. Si quiere asociar el widget a una lista 4D existente, debe utilizar los atributos "requiredListReference", "requiredListName", "choiceListReference" o "choiceListName".
-
-Ejemplos:
-
-- Quiere mostrar una lista desplegable con sólo dos opciones: "Open" o "Closed". "Closed" debe estar preseleccionado:
-
-```4d
- ARRAY TEXT($RequiredList;0)
- APPEND TO ARRAY($RequiredList;"Open")
- APPEND TO ARRAY($RequiredList;"Closed")
- C_OBJECT($ob)
- OB SET($ob;"valueType";"text")
- OB SET($ob;"value";"Closed")
- OB SET ARRAY($ob;"requiredList";$RequiredList)
-```
-
-
-
-- Quiere aceptar todo valor entero, pero mostrar un combo box para sugerir los valores más comunes:
-
-```4d
- ARRAY LONGINT($ChoiceList;0)
- APPEND TO ARRAY($ChoiceList;5)
- APPEND TO ARRAY($ChoiceList;10)
- APPEND TO ARRAY($ChoiceList;20)
- APPEND TO ARRAY($ChoiceList;50)
- APPEND TO ARRAY($ChoiceList;100)
- C_OBJECT($ob)
- OB SET($ob;"valueType";"integer")
- OB SET($ob;"value";10) //10 como valor por defecto
- OB SET ARRAY($ob;"choiceList";$ChoiceList)
-```
-
-
-
-#### requiredListName y requiredListReference
-
-Los atributos "requiredListName" y "requiredListReference" permiten utilizar, en una celda de list box, una lista definida en 4D, ya sea en modo Diseño (en el editor de Listas de la Caja de Herramientas) o por programación (utilizando el comando New list). La celda se mostrará entonces como una lista desplegable. Esto significa que el usuario sólo puede seleccionar uno de los valores proporcionados en la lista.
-
-Utilice "requiredListName" o "requiredListReference" en función del origen de la lista: si la lista procede de la caja de herramientas, pase un nombre; en caso contrario, si la lista se ha definido por programación, pase una referencia. En ambos casos, se puede utilizar un atributo "valor" para preseleccionar un valor en el widget.
-
-> - Si desea definir estos valores a través de un simple array, debe utilizar el atributo "requiredList".
-> - Si la lista contiene elementos de texto que representan valores reales, el separador decimal debe ser un punto ("."), independientemente de la configuración local, por ejemplo "17.6" "1234.456".
-
-Ejemplos:
-
-- Desea mostrar una lista desplegable basada en una lista de "colores" definida en la caja de herramientas (que contiene los valores "azul", "amarillo" y "verde"), guardarla como valor y mostrar "azul" por defecto:
-
-
-
-```4d
- C_OBJECT($ob)
- OB SET($ob;"valueType";"text")
- OB SET($ob;"saveAs";"value")
- OB SET($ob;"value";"blue")
- OB SET($ob;"requiredListName";"colors")
-```
-
-
-
-- Quiere mostrar una lista desplegable basada en una lista definida por programación y guardarla como referencia:
-
-```4d
- <>List:=New list
- APPEND TO LIST(<>List;"Paris";1)
- APPEND TO LIST(<>List;"London";2)
- APPEND TO LIST(<>List;"Berlin";3)
- APPEND TO LIST(<>List;"Madrid";4)
- C_OBJECT($ob)
- OB SET($ob;"valueType";"integer")
- OB SET($ob;"saveAs";"reference")
- OB SET($ob;"value";2) //muestra London por defecto
- OB SET($ob;"requiredListReference";<>List)
-```
-
- ```
- 
- ```
-
-#### choiceListName y choiceListReference
-
-Los atributos "choiceListName" and "choiceListReference" permiten utilizar, en una celda de list box, una lista definida en 4D, ya sea en modo Diseño (en el editor de Listas de la Caja de Herramientas) o por programación (utilizando el comando New list). La celda se muestra entonces como un combo box, lo que significa que el usuario puede seleccionar o escribir un valor.
-
-Utilice "choiceListName" o "choiceListReference" en función del origen de la lista: si la lista procede de la caja de herramientas, pase un nombre; en caso contrario, si la lista se ha definido por programación, pase una referencia. En ambos casos, se puede utilizar un atributo "valor" para preseleccionar un valor en el widget.
-
-> - Si desea definir estos valores a través de un simple array, debe utilizar el atributo "choiceList".
-> - Si la lista contiene elementos de texto que representan valores reales, el separador decimal debe ser un punto ("."), independientemente de la configuración local, por ejemplo "17.6" "1234.456".
-
-Ejemplo:
-
-Ejemplo:
-
-
-
-```4d
- C_OBJECT($ob)
- OB SET($ob;"valueType";"text")
-
- OB SET($ob;"value";"blue")
- OB SET($ob;"choiceListName";"colors")
-```
-
-
-
-#### unitsList, unitsListName, unitsListReference y unitReference
-
-Puede utilizar atributos específicos para añadir unidades asociadas a los valores de las celdas (\*por ejemplo, \*: "10 cm", "20 píxeles", etc.). Para definir la lista de unidades, puede utilizar uno de los siguientes atributos:
-
-- "unitsList": un array que contiene los elementos x utilizados para definir las unidades disponibles (por ejemplo: "cm", "pulgadas", "km", "millas", etc.). Utilice este atributo para definir las unidades dentro del objeto.
-- "unitsListReference": una referencia a una lista 4D que contiene las unidades disponibles. Utilice este atributo para definir unidades con una lista 4D creada con el comando [`New list`](../commands-legacy/new-list.md).
-- "unitsListName": un nombre de una lista 4D basada en el diseño que contiene unidades disponibles. Utilice este atributo para definir las unidades con una lista 4D creada en la caja de herramientas.
-
-Independientemente de la forma en que se defina la lista de unidades, puede asociarse con el siguiente atributo:
-
-- "unitReference": un único valor que contiene el índice (de 1 a x) del elemento seleccionado en la lista de valores "unitList", "unitsListReference" o "unitsListName".
-
-Independientemente de la forma en que se defina la lista de unidades, puede asociarse con el siguiente atributo:
-
-Ejemplo:
-
-Queremos definir una entrada numérica seguida de dos posibles unidades: " líneas " o " píxeles ". El valor actual es "2" + "líneas". Utilizamos valores definidos directamente en el objeto (atributo "unitsList"):
-
-```4d
-ARRAY TEXT($_units;0)
-APPEND TO ARRAY($_units;"lines")
-APPEND TO ARRAY($_units;"pixels")
-C_OBJECT($ob)
-OB SET($ob;"valueType";"integer")
-OB SET($ob;"value";2) // 2 "units"
-OB SET($ob;"unitReference";1) //"lines"
-OB SET ARRAY($ob;"unitsList";$_units)
-```
-
-
-
-#### alternateButton
-
-Si desea añadir un botón de elipsis [...] a una celda, basta con pasar el "alternateButton" con el valor True en el objeto. El botón se mostrará en la celda automáticamente.
-
-Cuando este botón es presionado por un usuario, se generará un evento `On Alternate Click`, y usted podrá manejarlo como quiera (vea el párrafo "Manejo de eventos" para más información).
-
-Ejemplo:
-
-```4d
-C_OBJECT($ob1)
-$entry:="Hello world!"
-OB SET($ob;"valueType";"text")
-OB SET($ob;"alternateButton";True)
-OB SET($ob;"value";$entry)
-```
-
-
-
-#### valueType color
-
-El atributo valueType de valor "color" permite mostrar un color o un texto.
-
-- Si el valor es un número, se dibuja un rectángulo de color dentro de la celda. Ejemplo:
-
- ```4d
- C_OBJECT($ob4)
- OB SET($ob4;"valueType";"color")
- OB SET($ob4;"value";0x00FF0000)
- ```
-
-
-
-- Si el valor es un texto, entonces se muestra el texto (*por ejemplo*: "valor"; "Automatic").
-
-#### event valueType
-
-El "event" valueType muestra un botón que genera un evento `On Clicked` al ser presionado. No se puede pasar ni devolver ningún dato o valor.
-
-Opcionalmente, se puede pasar un atributo "label".
-
-Ejemplo:
-
-```4d
-C_OBJECT($ob)
-OB SET($ob;"valueType";"event")
-OB SET($ob;"label";"Edit...")
-```
-
-
-
-### Gestión de eventos
-
-Se pueden manejar varios eventos mientras se utiliza un array list box de objetos:
-
-- **On Data Change**: un evento `On Data Change` se dispara cuando se ha modificado algún valor:
- - en un área de entrada de texto
- - en una lista desplegable
- - en un área combo box
- - en un botón de unidad (cambiar del valor x al valor x+1)
- - en una casilla de selección (cambia entre marcado/desmarcado)
-- **On Clicked**: cuando el usuario haga clic en un botón instalado con el "event" atributo *valueType*, se generará un evento `On Clicked`. Este evento es gestionado por el programador.
-- **On Alternative Click**: cuando el usuario haga clic en un botón de elipsis (atributo "alternateButton"), se generará un evento `On Alternative Click`. Este evento es gestionado por el programador.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Action.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Action.md
deleted file mode 100644
index c0fb2e9c02dd51..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Action.md
+++ /dev/null
@@ -1,186 +0,0 @@
----
-id: propertiesAction
-title: Acción
----
-
----
-
-## Arrastrable
-
-Controle si el usuario puede arrastrar el objeto y cómo. Por defecto, no se permite ninguna operación de arrastre.
-
-Hay dos modos de arrastrar disponibles:
-
-- **Personalizado**: en este modo, toda operación de arrastrar realizada en el objeto dispara el evento formulario `On Begin Drag` en el contexto del objeto. A continuación, gestiona la acción arrastrar utilizando un método.
- En el modo personalizado, básicamente toda la operación de arrastrar y soltar es realizada por el programador. Este modo le permite implementar cualquier interfaz basada en la función de arrastrar y soltar, incluidas las interfaces que no necesariamente transportan datos, sino que pueden realizar cualquier acción como abrir archivos o activar un cálculo. Este modo se basa en una combinación de propiedades, eventos y comandos específicos del tema `Portapapeles`.
-- **Automático**: en este modo, 4D **copia** el texto o las imágenes directamente desde el objeto formulario. Puede utilizarse en la misma área 4D, entre dos áreas 4D o entre 4D y otra aplicación. Por ejemplo, arrastrar (y soltar) automáticamente le permite copiar un valor entre dos campos sin usar programación:\
- \
- 
- En este modo, NO se genera el evento del formulario `On Begin Drag`. Si quiere "forzar" el uso del arrastre personalizado mientras está activado el arrastre automático, mantenga presionada la tecla **Alt** (Windows) o **Opción** (macOS) durante la acción. Esta opción no está disponible para las imágenes.
-
-Para más información, consulte [Arrastrar y soltar](https://doc.4d.com/4Dv20/4D/20.6/Drag-and-Drop.300-7487471.en.html) en el manual *Lenguaje 4D*.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ------------------------------------------------------------------------------------------------------- |
-| dragging | text | "none" (por defecto), "custom", "automatic" (excluyendo list box) |
-
-#### Objetos soportados
-
-[Áreas 4D Write Pro](writeProArea_overview.md) - [Combo Box](comboBox_overview.md) - [Entrada](input_overview.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Área de Plug-in](pluginArea_overview.md)
-
-#### Ver también
-
-[Droppable](#droppable)
-
----
-
-## Soltable
-
-Controla si el objeto puede ser el destino de una operación de arrastrar y soltar y cómo hacerlo.
-
-Hay dos modos de soltar disponibles:
-
-- **Personalizado**: en este modo, cualquier operación de soltar realizada en el objeto activa los eventos formulario `On Drag Over` y `On Drop` en el contexto del objeto. A continuación, gestiona la acción soltar utilizando un método.
- En el modo personalizado, básicamente toda la operación de arrastrar y soltar es realizada por el programador. Este modo le permite implementar cualquier interfaz basada en la función de arrastrar y soltar, incluidas las interfaces que no necesariamente transportan datos, sino que pueden realizar cualquier acción como abrir archivos o activar un cálculo. Este modo se basa en una combinación de propiedades, eventos y comandos específicos del tema `Portapapeles`.
-- **Automático**: en este modo, 4D gestiona automáticamente, si es posible, la inserción de los datos arrastrados de tipo texto o imagen que se sueltan sobre el objeto (los datos se pegan en el objeto). Los eventos `On Drag Over` y `On Drop` NO se generan. Por otra parte, se generan los eventos `On After Edit` (durante el soltar) y `On Data Change` (cuando el objeto pierde el foco).
-
-Para más información, consulte [Arrastrar y soltar](https://doc.4d.com/4Dv20/4D/20.6/Drag-and-Drop.300-7487471.en.html) en el manual *Lenguaje 4D*.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ------------------------------------------------------------------------------------------------------- |
-| dropping | text | "none" (por defecto), "custom", "automatic" (excluyendo list box) |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Combo Box](comboBox_overview.md) - [Entrada](input_overview.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Área Plug-in](pluginArea_overview.md)
-
-#### Ver también
-
-[Draggable](#draggable)
-
----
-
-## Ejecutar método objeto
-
-Cuando esta opción está activada, el método objeto se ejecuta con el evento `On Data Change` *en el mismo momento* en que el usuario cambia el valor del indicador. Cuando la opción está desactivada, el método se ejecuta *tras* la modificación.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------- | -------------- | ---------------- |
-| continuousExecution | boolean | true, false |
-
-#### Objetos soportados
-
-[Indicador de progreso](progressIndicator.md) - [Regla](ruler.md) - [Stepper](stepper.md)
-
----
-
-## Método
-
-Referencia de un método adjunto al objeto. Los métodos de objeto generalmente "gestionan" el objeto mientras el formulario se muestra o se imprime. No llame a un método objeto, 4D lo llama automáticamente cuando un evento implica el objeto al que el método objeto está asociado.
-
-Se soportan varios tipos de referencias de métodos:
-
-- una ruta de archivo de método objeto estándar, es decir, que utilice el siguiente patrón:\
- `ObjectMethods/objectName.4dm`\
- ... donde `objectName` es el [nombre del objeto](properties_Object.md#object-name). Este tipo de referencia indica que el archivo del método se encuentra en la ubicación por defecto ("sources/forms/*formName*/ObjectMethods/"). En este caso, 4D maneja automáticamente el método objeto cuando se ejecutan operaciones en el objeto formulario (renombrar, duplicar, copiar/pegar...)
-
-- a project method name: name of an existing project method without file extension, i.e.: `myMethod` In this case, 4D does not provide automatic support for object operations.
-
-- una ruta de archivo de métodos personalizados que incluya la extensión .4dm, por ejemplo:
- `../../CustomMethods/myMethod.4dm`
- También puede utilizar un sistema de archivos:\
- `/RESOURCES/Buttons/bOK.4dm`
- En este caso, 4D no ofrece soporte automático para operaciones con objetos.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | --------------------------------------------------------------------------------------- |
-| method | text | Ruta de archivo estándar o personalizada del método objeto o nombre del método proyecto |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Formularios](FormEditor/forms.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
-
----
-
-## Líneas desplazables
-
-`List boxes de tipo array`
-
-Autoriza el desplazamiento de líneas durante la ejecución. Esta opción está seleccionada por defecto. No está disponible para los [list box de tipo selección](listbox_overview.md#selection-list-boxes) ni para los [list box en modo jerárquico](properties_Hierarchy.md#hierarchical-list-box).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ---------------- |
-| movableRows | boolean | true, false |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Multi-seleccionable
-
-Permite la selección de múltiples registros/opciones en una [lista jerárquica](list_overview.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------------------- |
-| selectionMode | text | "multiple", "single", "none" |
-
-#### Objetos soportados
-
-[Lista jerárquica](list_overview.md)
-
----
-
-## Ordenable
-
-Permite ordenar los datos de las columnas haciendo clic en un encabezado [listbox](listbox_overview.md). Esta opción está seleccionada por defecto. Los arrays de tipo imagen (columnas) no pueden ordenarse utilizando esta función.
-
-En los list box basados en una selección de registros, sólo está disponible la función de ordenación estándar:
-
-- Cuando la fuente de datos es *Selección actual*,
-- Con columnas asociadas a campos (de tipo Alfa, Número, Fecha, Hora o Booleano).
-
-En otros casos (list box basados en selecciones temporales, columnas asociadas a expresiones), la función de ordenación estándar no está disponible. Una ordenación estándar del list box cambia el orden de la selección actual en la base de datos. Sin embargo, los registros resaltados y el registro actual no se modifican. Una ordenación estándar sincroniza todas las columnas del list box, incluidas las columnas calculadas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ---------------- |
-| sortable | boolean | true, false |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Acción estándar
-
-Actividades típicas que deben realizar los objetos activos (\*por ejemplo, permitir al usuario aceptar, cancelar o eliminar registros, desplazarse entre registros o de una página a otra en un formulario multipágina, etc.) han sido predefinidas por 4D como acciones estándar. Se describen con detalle en la sección [Acciones estándar](https://doc.4d.com/4Dv20/4D/20.2/Standard-actions.300-6750239.en.html) de la *manual de Diseño*.
-
-Puede asignar al mismo tiempo una acción estándar y un método proyecto de un objeto. En este caso, la acción estándar suele ejecutarse después del método y 4D utiliza esta acción para activar/desactivar el objeto según el contexto actual. Cuando se desactiva un objeto, no se puede ejecutar el método proyecto asociado.
-
-También puede definir esta propiedad utilizando el comando `OBJECT SET ACTION`.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | --------------------------------------------------------------------------------------------------------------------------------- |
-| action | string | El nombre de una [acción estándar válida](https://doc.4d.com/4Dv20/4D/20.2/Standard-actions.300-6750239.en.html). |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de selección](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Menú emergente imagen](picturePopupMenu_overview.md) - [Control de pestañas](tabControl.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Animation.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Animation.md
deleted file mode 100644
index 9093ae2127e985..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Animation.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-id: propertiesAnimation
-title: Animación
----
-
-## Vuelve a la primera secuencia
-
-Las imágenes se muestran en un bucle continuo. Cuando el usuario llega a la última imagen y vuelve a hacer clic, aparece la primera imagen, y así sucesivamente.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------------- | -------------- | ---------------- |
-| loopBackToFirstFrame | boolean | true, false |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md)
-
----
-
-## Retorna cuando se libera
-
-Muestra la primera imagen todo el tiempo, excepto cuando el usuario hace clic en el botón. Muestra la segunda imagen hasta que se suelta el botón del ratón. Este modo le permite crear un botón de acción con una imagen diferente para cada estado (inactivo y pulsado). Puede utilizar este modo para crear un efecto 3D o mostrar cualquier imagen que represente la acción del botón.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------------------- | -------------- | ---------------- |
-| switchBackWhenReleased | boolean | true, false |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md)
-
----
-
-## Desplazamiento continuo en clics
-
-Permite al usuario mantener pulsado el botón del ratón para mostrar las imágenes de forma continua (es decir, como una animación). Cuando el usuario llega a la última imagen, el objeto no vuelve a la primera imagen.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------ | -------------- | ---------------- |
-| switchContinuously | boolean | true, false |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md)
-
----
-
-## Cambiar cada x ticks
-
-Permite recorrer el contenido del botón de imagen a la velocidad especificada (en ticks). En este modo, se ignoran todas las demás opciones.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ------------------------- |
-| frameDelay | integer | mínimo: 0 |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md)
-
----
-
-## Cambiar cuando se pasa por encima el cursor
-
-Modifica el contenido del botón de la imagen cuando el cursor del ratón pasa por encima. La imagen inicial se muestra cuando el cursor sale del área del botón.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------ | -------------- | ---------------- |
-| switchWhenRollover | boolean | true, false |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md)
-
----
-
-## Utilizar el Último cuadro como Desactivado
-
-Permite definir la última miniatura como la que se mostrará cuando el botón esté desactivado. La imagen en miniatura utilizada cuando el botón está desactivado es procesada por separado por 4D: cuando se combina esta opción con "Cambiar continuamente" y "Retroceder en bucle a la primera imagen", la última imagen se excluye de la secuencia asociada al botón y sólo aparece cuando está desactivado.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :--------------------- | -------------- | ---------------- |
-| useLastFrameAsDisabled | boolean | true, false |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Appearance.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Appearance.md
deleted file mode 100644
index 67e50fe8076392..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Appearance.md
+++ /dev/null
@@ -1,394 +0,0 @@
----
-id: propertiesAppearance
-title: Apariencia
----
-
-## Botón por defecto
-
-La propiedad del botón por defecto designa el botón que obtiene el foco inicial en ejecución cuando ningún botón del formulario tiene la propiedad [Focusable](properties_Entry.md#focusable).
-
-Sólo puede haber un botón por defecto por página de formulario.
-
-Además, en macOS, la propiedad del botón por defecto modifica la apariencia del botón para indicar una "opción recomendada" al usuario y se vincula automáticamente a la tecla **Intro**, aunque no tenga el foco. El botón por defecto puede ser diferente del botón enfocado. Los botones por defecto tienen un aspecto azul específico en macOS:
-
-
-
-> El botón debe tener una altura estándar para obtener la apariencia de botón por defecto.
-
-En Windows, el concepto de "opción recomendada" no está soportado: sólo el botón enfocado tiene una apariencia diferente en tiempo de ejecución y la tecla **Intro** está vinculada al botón enfocado. Sin embargo, en el editor de formularios de 4D, el botón por defecto se representa con un contorno azul:
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------- |
-| defaultButton | boolean | true, false |
-
-#### Objetos soportados
-
-[Botón regular ](button_overview.md#regular) - [Botón plano](button_overview.md#regular)
-
----
-
-## Ocultar rectángulo de enfoque
-
-Durante la ejecución, un campo o toda área introducible es delimitada por un rectángulo de selección cuando tiene el foco (a través de la tecla Tab o un simple clic). Puede ocultar este rectángulo activando esta propiedad. Ocultar el rectángulo de enfoque puede ser útil en el caso de interfaces específicas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------- |
-| hideFocusRing | boolean | true, false |
-
-#### Objetos soportados
-
-[Áreas 4D Write Pro](writeProArea_overview.md) - [Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [List Box](listbox_overview.md) - [Sub formulario](subform_overview.md)
-
----
-
-## Ocultar resaltado selección
-
-`List boxes de tipo selección`
-
-Esta propiedad se utiliza para desactivar el resaltado de la selección en los list box.
-
-Cuando esta opción está activada, el resaltado de la selección ya no es visible para las selecciones realizadas en los list box. Las selecciones en sí siguen siendo válidas y funcionan exactamente igual que antes; sin embargo, ya no se representan gráficamente en pantalla, y tendrá que [definir su apariencia por programación](listbox_overview.md#customizing-appearance-of-selected-rows).
-
-Por defecto, esta opción no está activa.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------- | -------------- | ---------------- |
-| hideSystemHighlight | boolean | true, false |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Barra de desplazamiento horizontal
-
-Una herramienta de interfaz que permite al usuario desplazar el área de visualización hacia la izquierda o la derecha.
-
-Valores disponibles:
-
-| Lista de propiedades | Valor JSON | Descripción |
-| -------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Sí | "visible" | La barra de desplazamiento está siempre visible, incluso cuando no es necesaria (es decir, cuando el tamaño del contenido del objeto es menor que el del marco). |
-| No | "hidden" | La barra de desplazamiento nunca es visible |
-| Automático | "automatic" | La barra de desplazamiento aparece automáticamente cuando es necesario y el usuario puede introducir un texto mayor que el ancho del objeto |
-
-> Los objetos imagen pueden tener las barras de desplazamiento cuando el formato de visualización de la imagen está definido como "Truncado (no centrado)."
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------- | -------------- | -------------------------------- |
-| scrollbarHorizontal | text | "visible", "hidden", "automatic" |
-
-#### Objetos soportados
-
-[Lista jerárquica](list_overview.md) - [Sub formulario](subform_overview.md) - [List Box](listbox_overview.md) - [Área de entrada](input_overview.md) - [Área 4D Write Pro](writeProArea_overview.md)
-
-#### Ver también
-
-[Barra de desplazamiento vertical](#vertical-scroll-bar)
-
----
-
-## Resolution
-
-Define la resolución de la pantalla para el contenido del área 4D Write Pro. Por defecto, se define a 72 ppp (macOS), que es la resolución estándar para los formularios 4D en todas las plataformas. Si se define esta propiedad en 96 ppp, se establecerá un renderizado Windows/Web tanto en plataformas macOS como Windows. Si se define esta propiedad como **automática** significa que la representación del documento diferirá entre las plataformas macOS y Windows.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------- |
-| dpi | number | 0=automatic, 72, 96 |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar el fondo
-
-Muestra/oculta tanto las imágenes de fondo como el color de fondo.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | -------------------------------------------- |
-| showBackground | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar los pies de página
-
-Muestra/oculta los pies de página cuando el [modo visualización de la página ](#view-mode) está definido como "Página".
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | -------------------------------------------- |
-| showFooters | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar la barra de fórmula
-
-Cuando está activada, la barra de fórmulas es visible debajo de la interfaz de la barra de herramientas en el área 4D View Pro. Si no se selecciona, la barra de fórmulas se oculta.
-
-> Esta propiedad sólo está disponible para la interfaz de la [Barra de herramientas](#user-interface).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | -------------------------------------------- |
-| withFormulaBar | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md)
-
----
-
-## Mostrar los encabezados
-
-Muestra/oculta los encabezados cuando el [modo visualización de la página ](#view-mode) está definido como "Página".
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | -------------------------------------------- |
-| showHeaders | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar los caracteres ocultos
-
-Muestra/oculta los caracteres invisibles
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | -------------------------------------------- |
-| showHiddenChars | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar la regla horizontal
-
-Muestra/oculta la regla horizontal cuando la vista del documento está en modo [Página](#modo-de-vista).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------- | -------------- | -------------------------------------------- |
-| showHorizontalRuler | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar HTML WYSIWYG
-
-Activa/desactiva la vista HTML WYSIWYG, en la que se eliminan los atributos avanzados de 4D Write Pro que no son compatibles con todos los navegadores.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | -------------------------------------------- |
-| showHTMLWysiwyg | boolean | true, false (por defecto) |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar el marco de la página
-
-Muestra/oculta el marco de la página cuando [modo visualización de página ](#view-mode) está definido como "Página".
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | ---------------- |
-| showPageFrames | boolean | true, false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar las referencias
-
-Muestra todas las expresiones 4D insertadas en el documento de 4D Write Pro como *referencias*. Cuando esta opción está desactivada, las expresiones 4D se muestran como *valores*. Por defecto, cuando se inserta un campo o expresión 4D, 4D Write Pro calcula y muestra su valor actual. Seleccione esta propiedad si desea saber qué campo o expresión se muestra. Las referencias de campo o de expresión aparecen entonces en su documento, con un fondo gris.
-
-Por ejemplo, ha insertado la fecha actual junto con un formato, la fecha se muestra:
-
-
-
-Con la propiedad Mostrar referencias activada, se muestra la referencia:
-
-
-
-> Las expresiones 4D se pueden insertar con el comando `ST INSERT EXPRESSION`.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | -------------------------------------------- |
-| showReferences | boolean | true, false (por defecto) |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Mostrar regla vertical
-
-Muestra/oculta la regla vertical cuando la vista del documento está en modo [Página](#view-mode).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------- | -------------- | -------------------------------------------- |
-| showVerticalRuler | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Pestañas
-
-Puede definir la dirección de las pestañas en sus formularios. Esta propiedad está disponible en todas las plataformas, pero sólo puede mostrarse en macOS. Puede elegir colocar los controles de las pestañas en la parte superior (estándar) o en la parte inferior.
-
-Cuando los controles de pestañas con una dirección personalizada se muestran en Windows, vuelven automáticamente a la dirección estándar (superior).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ---------------- |
-| labelsPlacement | boolean | "top", "bottom" |
-
-#### Objetos soportados
-
-[Control de pestañas](tabControl.md)
-
----
-
-## Interfaz de usuario
-
-Puede añadir una interfaz a las áreas 4D View Pro para permitir a los usuarios finales realizar modificaciones básicas y manipulaciones de datos. 4D View Pro ofrece dos interfaces opcionales a elegir, **Cinta** y **Barra de herramientas**.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ------------------------------------------------------------ |
-| userInterface | text | "none" (por defecto), "ribbon", "toolbar" |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md)
-
-#### Ver también
-
-[Guía de referencia de 4D View Pro](../ViewPro/getting-started.md)
-
----
-
-## Barra de desplazamiento vertical
-
-Una herramienta de interfaz que permite al usuario mover el área de visualización hacia arriba y hacia abajo.
-
-Valores disponibles:
-
-| Lista de propiedades | Valor JSON | Descripción |
-| -------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Sí | "visible" | La barra de desplazamiento está siempre visible, incluso cuando no es necesaria (es decir, cuando el tamaño del contenido del objeto es menor que el del marco). |
-| No | "hidden" | La barra de desplazamiento nunca es visible |
-| Automático | "automatic" | La barra de desplazamiento aparece automáticamente cuando es necesario (es decir, cuando el tamaño del contenido del objeto es mayor que el del marco) |
-
-> Los objetos imagen pueden tener las barras de desplazamiento cuando el formato de visualización de la imagen está definido como "Truncado (no centrado)."
-
-> Si un objeto de entrada de texto no tiene una barra de desplazamiento, el usuario puede desplazarse por la información utilizando las teclas de flecha.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------- | -------------- | -------------------------------- |
-| scrollbarVertical | text | "visible", "hidden", "automatic" |
-
-#### Objetos soportados
-
-[Lista jerárquica](list_overview.md) - [Sub formulario](subform_overview.md) - [List Box](listbox_overview.md) - [Área de entrada](input_overview.md) - [Área 4D Write Pro](writeProArea_overview.md)
-
-#### Ver también
-
-[Barra de desplazamiento horizontal](#horizontal-scroll-bar)
-
----
-
-## Modo de visualización
-
-Establece el modo de visualización del documento de 4D Write Pro en el área del formulario. Hay tres valores disponibles:
-
-- **Página**: el modo de vista más completo, que incluye contornos de página, orientación, márgenes, saltos de página, encabezados y pies de página, etc.
-- **Borrador**: modo borrador con propiedades básicas del documento
-- **Embedded**: modo de vista adecuado para zonas integradas; no muestra márgenes, pies de página, encabezados, marcos de página, etc. Este modo también se puede utilizar para producir una salida de vista similar a la de la web (si también selecciona la [resolución de 96 dpi ](#resolution) y las propiedades [Mostrar HTML WYSIWYG](#show-html-wysiwyg)).
-
-> La propiedad Modo vista sólo se utiliza para la renderización en pantalla. En cuanto a la configuración de la impresión, se utilizan automáticamente reglas de renderización específicas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | --------------------------- |
-| layoutMode | text | "page", "draft", "embedded" |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Zoom
-
-Define el porcentaje de zoom para mostrar el contenido del área 4D Write Pro.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------- |
-| zoom | number | mínimo = 0 |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_BackgroundAndBorder.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_BackgroundAndBorder.md
deleted file mode 100644
index 9a2c8f99966503..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_BackgroundAndBorder.md
+++ /dev/null
@@ -1,223 +0,0 @@
----
-id: propertiesBackgroundAndBorder
-title: Fondo y borde
----
-
-## Color de fondo alternado
-
-Permite definir un color de fondo diferente para las líneas o columnas impares de un list box. Permite definir un color de fondo diferente para las líneas o columnas impares de un list box.
-
-También puede definir esta propiedad utilizando el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ----------------------------------------------------------------------- |
-| alternateFill | string | todos los valores css; "transparent"; "automatic"; "automaticAlternate" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Color de fondo / Color de relleno
-
-Define el color de fondo de un objeto.
-
-En el caso de un list box, por defecto se selecciona *Automático*: la columna utiliza el color de fondo definido al nivel del list box.
-
-También puede definir esta propiedad utilizando el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------------------------------- |
-| fill | string | un valor css; "transparent"; "automatic" |
-
-#### Objetos soportados
-
-[Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers) - [Óvalo](shapes_overview.md#oval) - [Rectángulo](shapes_overview.md#rectangle) - [Área de texto](text.md)
-
-#### Ver también
-
-[Transparente](#transparente)
-
----
-
-## Background Color Expression {#background-color-expression}
-
-`List box de tipo colección y de tipo selección de entidades`
-
-Una expresión o una variable (no se pueden utilizar variables array) para aplicar un color de fondo personalizado a cada línea del list box. La expresión o la variable se evaluará para cada línea mostrada y debe devolver un valor de color RGB. Para más información, consulte la descripción del comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md) en el *Manual de Referencia del Lenguaje 4D*.
-
-También puede establecer esta propiedad utilizando el comando [`LISTBOX SET PROPERTY`](../commands-legacy/listbox-set-property.md) con la constante `lk background color expression`.
-
-> Con los list box de tipo colección o selección de entidades, esta propiedad también puede definirse utilizando una [Meta Info Expression](properties_Text.md#meta-info-expression).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ------------------------------------------------ |
-| rowFillSource | string | Una expresión que devuelve un valor de color RGB |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Estilo de línea de borde {#border-line-style}
-
-Permite definir un estilo estándar para el borde del objeto.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ----------------------------------------------------------------- |
-| borderStyle | text | "system", "none", "solid", "dotted", "raised", "sunken", "double" |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Áreas 4D Write Pro](writeProArea_overview.md) - [Botones](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Regla](ruler.md) - [Spinner](spinner.md) - [Stepper](stepper.md) - [Subformulario](subform_overview.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Tipo de línea punteada {#dotted-line-type}
-
-Describe el tipo de línea punteada como una secuencia de puntos blancos y negros.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
-| strokeDashArray | arrays numéricos o cadenas | Ej. "6 1" o \[6,1\] para una secuencia de 6 puntos negros y 1 punto blanco |
-
-#### Objetos soportados
-
-[Rectángulo](shapes_overview.md#rectangle) - [Óvalo](shapes_overview.md#oval) - [Línea](shapes_overview.md#line)
-
----
-
-## Ocultar líneas vacías finales
-
-Controla la visualización de las líneas vacías adicionales añadidas en la parte inferior de un objeto list box. Por defecto, 4D añade esas líneas adicionales para llenar el área vacía:
-
-
-
-Puede eliminar estas líneas vacías seleccionando esta opción. La parte inferior del objeto del list box se deja vacía:
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------ | -------------- | ---------------- |
-| hideExtraBlankRows | boolean | true, false |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Color de línea
-
-Designa el color de las líneas del objeto.
-El color puede ser especificado por:
-
-- un nombre de color - como "red"
-- un valor HEX - como "# ff0000"
-- un valor RVB - como "rgb (255,0,0)"
-
-También puede definir esta propiedad utilizando el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------------------------------- |
-| stroke | string | un valor css, "transparent", "automatic" |
-
-> Esta propiedad también está disponible para los objetos basados en texto, en cuyo caso designa tanto el color de la fuente como las líneas del objeto, ver [Color de la fuente](properties_Text.md#font-color).
-
-#### Objetos soportados
-
-[Línea](shapes_overview.md#line) - [Óvalo](shapes_overview.md#oval) - [Rectángulo](shapes_overview.md#rectangle)
-
----
-
-## Ancho de línea
-
-Designa el grosor de una línea.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | --------------------------------------------------------------------------------------------------------------- |
-| strokeWidth | number | 0 para el ancho más pequeño en un formulario impreso, o cualquier valor de entero < 20 |
-
-#### Objetos soportados
-
-[Línea](shapes_overview.md#line) - [Óvalo](shapes_overview.md#oval) - [Rectángulo](shapes_overview.md#rectangle)
-
----
-
-## Row Background Color Array {#row-background-color-array}
-
-`List boxes de tipo array`
-
-El nombre de un array para aplicar un color de fondo personalizado a cada línea o columna del list box.
-
-Debe introducirse el nombre de un array Entero largo. Cada elemento de este array corresponde a una línea del list box (si se aplica al list box) o a una celda de la columna (si se aplica a una columna), por lo que el array debe tener el mismo tamaño que el array asociado a la columna. Puede utilizar las constantes descritas en el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md). Si desea que la celda herede el color de fondo definido en el nivel superior, pase el valor -255 al elemento del array correspondiente.
-
-Por ejemplo, dado un list box en el que las líneas tienen un color gris/gris claro alternado, definido en las propiedades del list box. También se ha definido para el list box un array de color de fondo con el fin de cambiar a naranja claro el color de las líneas en las que al menos un valor es negativo:
-
-```4d
- <>_BgndColors{$i}:=0x00FFD0B0 // naranja
- <>_BgndColors{$i}:=-255 // valor por defecto
-```
-
-
-
-A continuación, quiere colorear las celdas con valores negativos en naranja oscuro. A continuación, quiere colorear las celdas con valores negativos en naranja oscuro. Los valores de estos arrays tienen prioridad sobre los definidos en las propiedades del list box, así como los del array de color de fondo general:
-
-```4d
- <>_BgndColorsCol_3{2}:=0x00FF8000 // naranja oscuro
- <>_BgndColorsCol_2{5}:=0x00FF8000
- <>_BgndColorsCol_1{9}:=0x00FF8000
- <>_BgndColorsCol_1{16}:=0x00FF8000
-```
-
-
-
-Puede obtener el mismo resultado utilizando los comandos [`LISTBOX SET ROW FONT STYLE`](../commands-legacy/listbox-set-row-font-style.md) y [`LISTBOX SET ROW COLOR`](../commands-legacy/listbox-set-row-color.md). Tienen la ventaja de permitirle omitir el tener que predefinir arrays de estilo/color para las columnas: en su lugar son creadas dinámicamente por los comandos.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | --------------------------------------------------- |
-| rowFillSource | string | El nombre de un array entero largo. |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Transparente
-
-Define el fondo del list box como "Transparent". Cuando se define, se ignora cualquier [color de fondo alternativo](#alternate-background-color) o [color de fondo](#background-color--fill-color) definido para la columna.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------- |
-| fill | text | "transparent" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
-#### Ver también
-
-[Color de fondo / Color de relleno](#background-color--fill-color)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_CoordinatesAndSizing.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_CoordinatesAndSizing.md
deleted file mode 100644
index b74a2f69a25f38..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_CoordinatesAndSizing.md
+++ /dev/null
@@ -1,323 +0,0 @@
----
-id: propertiesCoordinatesAndSizing
-title: Coordenadas y dimensiones
----
-
-## Altura de línea automática
-
-Esta propiedad sólo está disponible para los list boxes con las siguientes [fuentes de datos](properties_Object.md#data-source):
-
-- collection o entity selection,
-- array (no jerárquico).
-
-Esta propiedad no está seleccionada por defecto. Cuando se utiliza para al menos una columna, la altura de cada línea de la columna será calculada automáticamente por 4D, y se tendrá en cuenta el contenido de la columna. Tenga en cuenta que sólo se tendrán en cuenta las columnas con la opción seleccionada para calcular el alto de línea.
-
-:::note
-
-Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal](properties_ResizingOptions.md#horizontal-sizing) "Agrandar" fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
-
-:::
-
-Cuando esta propiedad está activada, la altura de cada línea se calcula automáticamente para que el contenido de la celda quepa por completo sin ser truncado (a menos que la opción [Wordwrap](properties_Display.md#wordwrap) esté desactivada.
-
-- El cálculo de la altura de línea tiene en cuenta:
- - todo tipo de contenido (texto, números, fechas, horas, imágenes (el cálculo depende del formato de la imagen), objetos),
- - todo tipo de control (entradas, casillas de selección, listas, listas desplegables),
- - fuentes, estilos y tamaños de letra,
- - la opción [Wordwrap](properties_Display.md#wordwrap): si está desactivada, la altura se basa en el número de párrafos (las líneas se truncan); si está activada, la altura se basa en el número de líneas (no se trunca).
-
-- El cálculo de la altura de línea no tiene en cuenta:
- - contenido de columna oculta
- - Para los list box de tipo array, esta propiedad sólo está disponible si la opción [Altura de línea automática](#automatic-row-height) no está seleccionada.
-
-:::caution
-
-> Since it requires additional calculations at runtime, the automatic row height option could affect the scrolling fluidity of your list box, in particular when it contains a large number of rows.
-
-:::
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------- |
-| rowHeightAuto | boolean | true, false |
-
-#### Objetos soportados
-
-[Columna de list box](listbox_overview.md#list-box-columns)
-
----
-
-## Abajo
-
-Coordenadas inferiores del objeto en el formulario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------- |
-| bottom | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Izquierda
-
-Coordenadas de izquierda del objeto en el formulario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------- |
-| left | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Derecha
-
-Coordenadas de derecha del objeto en el formulario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------- |
-| right | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Arriba
-
-Coordenadas superiores del objeto en el formulario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------- |
-| top | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Radio de redondeo
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------------- |
-| 19 R7 | Soporte para entradas y áreas de texto |
-
-
-
-Define la redondez de las esquinas (en píxeles) del objeto. Por defecto, el valor del radio es de 0 píxeles. Puede cambiar esta propiedad para dibujar objetos redondeados con formas personalizadas:
-
-
-
-El valor mínimo es 0, en este caso se dibuja un objeto estándar no redondeado.
-El valor máximo depende del tamaño del rectángulo (no puede superar la mitad del tamaño del lado más corto del rectángulo) y se calcula dinámicamente.
-
-:::note
-
-Con [áreas de texto](text.md) y [entradas](input_overview.md):
-
-- la propiedad de radio de la esquina sólo está disponible con los [estilos de línea de borde](properties_BackgroundAndBorder.md#border-line-style) "ninguno", "sólido" o "punteado",
-- la redondez de la esquina se dibuja fuera del área del objeto (el objeto aparece más grande en el formulario pero su [ancho](properties_CoordinatesAndSizing.md#width) y [alto](properties_CoordinatesAndSizing.md#height) no se amplían).
-
-
-
-:::
-
-You can also set this property using the [OBJECT Get corner radius](../commands-legacy/object-get-corner-radius.md) and [OBJECT SET CORNER RADIUS](../commands-legacy/object-set-corner-radius.md) commands.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ------------------------- |
-| borderRadius | integer | mínimo: 0 |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md) - [Rectángulo](shapes_overview.md#rectangle) - [Área de texto](text.md)
-
----
-
-## Altura
-
-Esta propiedad designa el tamaño vertical de un objeto.
-
-> Algunos objetos pueden tener una altura predefinida que no se puede modificar.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------- |
-| height | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Ancho
-
-Esta propiedad designa el tamaño horizontal de un objeto.
-
-> - Algunos objetos pueden tener una altura predefinida que no se puede modificar.
-> - Si la propiedad [Redimensionable](properties_ResizingOptions.md#resizable) se utiliza para una [columna de list box](listbox_overview.md#list-box-columns), el usuario también puede cambiar manualmente el tamaño de la columna.
-> - Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal "Agrandar"](properties_ResizingOptions.md#horizontal-sizing) fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------- |
-| ancho | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md#) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Línea](shapes_overview.md#line) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Rectángulo](shapes_overview.md#rectangle) - [Regla](ruler.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Ancho máximo
-
-El ancho máximo de la columna (en píxeles). El ancho de la columna no puede aumentarse más allá de este valor al redimensionar la columna o el formulario.
-
-> Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal "Agrandar"](properties_ResizingOptions.md#horizontal-sizing) fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ------------------------- |
-| maxWidth | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Columna de list box](listbox_overview.md#list-box-columns)
-
----
-
-## Ancho mínimo
-
-El ancho mínimo de la columna (en píxeles). El ancho de la columna no puede reducirse más allá de este valor al redimensionar la columna o el formulario.
-
-> Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal "Agrandar"](properties_ResizingOptions.md#horizontal-sizing) fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ------------------------- |
-| minWidth | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Columna de list box](listbox_overview.md#list-box-columns)
-
----
-
-## Altura de las líneas
-
-Define la altura de las líneas del list box (excluyendo los encabezados y pies de página). Por defecto, la altura de la línea se define según la plataforma y el tamaño de la fuente.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | ------------------------------------------------------------------- |
-| rowHeight | string | valor css en la unidad "em" o "px" (por defecto) |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
-#### Ver también
-
-[Array altura de línea](#row-height-array)
-
----
-
-## Array altura de las líneas
-
-Esta propiedad se utiliza para indicar el nombre de un array de altura de línea que se quiere asociar al list box. Un array de altura de línea debe ser de tipo numérico (entero largo por defecto).
-
-Cuando se define un array de altura de línea, cada uno de sus elementos cuyo valor es diferente de 0 (cero) se tiene en cuenta para determinar la altura de la línea correspondiente en el list box, basándose en la unidad de altura de línea actual.
-
-Por ejemplo, puede escribir:
-
-```4d
-ARRAY LONGINT(RowHeights;20)
-RowHeights{5}:=3
-```
-
-Asumiendo que la unidad de las líneas es "líneas", entonces la quinta línea del list box tendrá una altura de tres líneas, mientras que todas las demás líneas mantendrán su altura por defecto.
-
-> - Para los list box de tipo array, esta propiedad sólo está disponible si la opción Altura de línea automática no está seleccionada.
-> - Para los array y list boxes colecciones/selección de entidades, esta propiedad sólo está disponible si la opción [Alto de línea automático](#automatic-row-height) no está seleccionada.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ------------------------------------------------ |
-| rowHeightSource | string | Nombre de una variable array 4D. |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
-#### Ver también
-
-[Altura de fila](#altura-fila)
-
----
-
-## Relleno horizontal
-
-Establece un relleno horizontal para las celdas. El valor se establece en píxeles (por defecto = 0).
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------- | -------------- | --------------------------------------------------- |
-| horizontalPadding | number | Número de píxeles (debe ser >=0) |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pies de página](properties_Footers.md) - [Encabezados](properties_Headers.md)
-
-#### Ver también
-
-[Relleno vertical](#vertical-padding)
-
----
-
-## Relleno vertical
-
-Establece un relleno vertical para las celdas. El valor se establece en píxeles (por defecto = 0).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | --------------------------------------------------- |
-| verticalPadding | number | Número de píxeles (debe ser >=0) |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pies de página](properties_Footers.md) - [Encabezados](properties_Headers.md)
-
-#### Ver también
-
-[Relleno horizontal](#horizontal-padding)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Crop.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Crop.md
deleted file mode 100644
index bae2634da41817..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Crop.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-id: propertiesCrop
-title: Corte
----
-
-## Columnas
-
-Define el número de columnas de una tabla de miniaturas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :---------- | :------------: | ------------------------- |
-| columnCount | integer | mínimo: 1 |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Menú desplegable imagen](picturePopupMenu_overview.md)
-
----
-
-## Rows
-
-Define el número de líneas de una tabla de miniaturas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :------- | :------------: | ------------------------- |
-| rowCount | integer | mínimo: 1 |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Menú desplegable imagen](picturePopupMenu_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_DataSource.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_DataSource.md
deleted file mode 100644
index fa869bd607a9c5..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_DataSource.md
+++ /dev/null
@@ -1,330 +0,0 @@
----
-id: propertiesDataSource
-title: Fuente de datos
----
-
-## Inserción automática
-
-Cuando se selecciona esta opción, si un usuario introduce un valor que no se encuentra en la lista asociada al objeto, este valor se añade automáticamente a la lista almacenada en memoria.
-
-Cuando la opción **inserción automática** no está definida (por defecto), el valor introducido se almacena en el objeto formulario pero no en la lista en memoria.
-
-Esta propiedad es soportada por:
-
-- objetos formulario [Combo box](comboBox_overview.md) y [columna list box](listbox_overview.md#list-box-columns) asociadoa a una lista de selección.
-- objetos de formulario [Combo box](comboBox_overview.md) cuya lista asociada se llena mediante su array o fuente de datos de objetos.
-
-Por ejemplo, dada una lista de selección que contiene "Francia, Alemania, Italia" que está asociada a un combo box "Países": si la propiedad **inserción automática** está activada y un usuario introduce "España", entonces el valor "España" se añade automáticamente a la lista en memoria:
-
-
-
-> Si la lista de selección se creó a partir de una lista definida en el modo Diseño, la lista original no se modifica.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------ | -------------- | ---------------- |
-| automaticInsertion | boolean | true, false |
-
-#### Objetos soportados
-
-[Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Lista de selección
-
-Asocia una lista de selección a un objeto. Puede ser un nombre de lista de elección (una referencia de lista) o una colección de valores por defecto.
-
-También se pueden asociar listas de selección a objetos utilizando los comandos [OBJECT SET LIST BY NAME](../commands-legacy/object-set-list-by-name.md) o [OBJECT SET LIST BY REFERENCE](../commands-legacy/object-set-list-by-reference.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | ---------------- | -------------------------------------------------------------------------------- |
-| choiceList | list, collection | Una lista de valores posibles |
-| lista | list, collection | Una lista de valores posibles (listas jerárquicas únicamente) |
-
-#### Objetos soportados
-
-[Lista desplegable](dropdownList_Overview.md) -
-[Combo box](comboBox_overview.md) - [Lista Jerárquica](list_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Lista de selección (lista estática)
-
-Lista de valores estáticos a utilizar como etiquetas para el objeto de control de pestañas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | ---------------- | ------------------------------------------------------- |
-| labels | list, collection | Una lista de valores para llenar el control de pestañas |
-
-#### Objetos soportados
-
-[Control de pestañas](tabControl.md)
-
----
-
-## Elemento actual {#current-item}
-
-`List box colección o entity selection`
-
-Especifica una variable o expresión a la que se asignará el elemento/entidad de la colección seleccionado por el usuario. Debe utilizar una variable objeto o una expresión asignable que acepte objetos. Si el usuario no selecciona nada o si ha utilizado una colección de valores escalares, se asigna el valor Null.
-
-> Esta propiedad es de "sólo lectura", se actualiza automáticamente según las acciones del usuario en el list box. No se puede editar su valor para modificar el estado de selección del list box.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------- | -------------- | -------------------- |
-| currentItemSource | string | Expresión del objeto |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Posición actual del elemento {#current-item-position}
-
-`List box colección o entity selection`
-
-Indica una variable o expresión a la que se le asignará un entero largo que indica la posición del elemento/entidad de colección seleccionado por el usuario.
-
-- si no se selecciona ningún elemento/entidad, la variable o expresión recibe cero,
-- si se selecciona un solo elemento/entidad, la variable o expresión recibe su ubicación,
-- si se seleccionan varios elementos/entidades, la variable o expresión recibe la posición del elemento/entidad que se seleccionó de última.
-
-> Esta propiedad es de "sólo lectura", se actualiza automáticamente según las acciones del usuario en el list box. No se puede editar su valor para modificar el estado de selección del list box.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------------- | -------------- | ------------------ |
-| currentItemPositionSource | string | Expresión numérica |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Tipo de datos (tipo de expresión)
-
-Define el tipo de datos para la expresión mostrada. Esta propiedad se utiliza con:
-
-- [Columnas del List box](listbox_overview.md#list-box-columns) de los tipos de selección y colección.
-- [Listas desplegables](dropdownList_Overview.md) asociadas a objetos o arrays.
-
-Ver también la sección [**Tipo de Expresión**](properties_Object.md#expression-type).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| dataSourceTypeHint | string |
|
-
-#### Objetos soportados
-
-[Listas desplegables](dropdownList_Overview.md) asociadas a objetos o arrays - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Tipo de datos (lista)
-
-Define el tipo de datos a guardar en el campo o variable asociado a la [lista desplegable](dropdownList_Overview.md). Esta propiedad se utiliza con:
-
-- Listas desplegables [asociadas a una lista de opciones](dropdownList_Overview.md#using-a-choice-list).
-- Listas desplegables [asociadas a una lista de selección jerárquica](dropdownList_Overview.md#using-a-hierarchical-choice-list).
-
-Hay tres opciones disponibles:
-
-- **Referencia de lista**: declara que la lista desplegable es jerárquica. Significa que la lista desplegable puede mostrar hasta dos niveles jerárquicos y su contenido puede gestionarse mediante los comandos del lenguaje 4D del tema **Listas jerárquicas**.
-- **Valor del elemento seleccionado** (por defecto): la lista desplegable no es jerárquica y el valor del elemento elegido en la lista por el usuario se guarda directamente. Por ejemplo, si el usuario elige el valor "Azul", este valor se guarda en el campo.
-- **Referencia del elemento seleccionado**: la lista desplegable no es jerárquica y la referencia del elemento de la lista de selección se guarda en el objeto. Esta referencia es el valor numérico asociado a cada elemento, ya sea a través del parámetro *itemRef* de los comandos [`APPEND TO LIST`](../commands-legacy/append-to-list.md) o [`SET LIST ITEM`](../commands-legacy/set-list-item.md), o en el editor de listas. Esta opción permite optimizar el uso de la memoria: almacenar valores numéricos en los campos ocupa menos espacio que almacenar cadenas. También facilita la traducción de aplicaciones: basta con crear varias listas en distintos idiomas pero con las mismas referencias de elementos y, a continuación, cargar la lista en función del idioma de la aplicación.
-
-La utilización de la opción **Referencia del elemento seleccionado** requiere el cumplimiento de los siguientes principios:
-
-- Para poder almacenar la referencia, el campo o fuente de datos variable debe ser de tipo Número (independientemente del tipo de valor que aparezca en la lista). La propiedad [expresión ](properties_Object.md#expression-type) se define automáticamente.
-- Las referencias válidas y únicas deben estar asociadas a los elementos de la lista.
-- La lista desplegable debe estar asociada a un campo o a una variable.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | -------------------- |
-| saveAs | string | "value", "reference" |
-
-> Definir sólo `"dataSourceTypeHint" : "integer"` con un `"type": "dropdown"` objeto de formulario declarará una lista desplegable jerárquica.
-
-#### Objetos soportados
-
-[Listas desplegables](dropdownList_Overview.md) asociadas a listas
-
----
-
-## Valores por defecto (lista de)
-
-Lista de valores que se utilizarán como valores por defecto para la columna del list box (sólo de tipo array). Lista de valores que se utilizarán como valores por defecto para la columna del list box (sólo de tipo array). Utilizando el lenguaje, se puede gestionar el objeto haciendo referencia a este array.
-
-> No confunda esta propiedad con la propiedad "[valor por defecto](properties_RangeOfValues.md#default-value)" que permite definir un valor de campo en los nuevos registros.
-
-Debe introducir una lista de valores. En el editor de formularios, un diálogo específico permite introducir valores separados por retornos de carro:
-
-
-
-> También puede definir una [lista de selección](properties_DataSource.md#choice-list) con la columna list box. Sin embargo, se utilizará una lista de selección como lista de valores seleccionables para cada línea de columna, mientras que la lista por defecto rellena todas las líneas de columna.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------------------------------------------------------------------------------------------------ |
-| values | collection | Una colección de valores por defecto (cadenas), por ejemplo: "a", "b", "c", "d" |
-
-#### Objetos soportados
-
-[Columna List Box (sólo tipo array)](listbox_overview.md#list-box-columns)
-
----
-
-## Expression
-
-This description is specific to [selection](listbox_overview.md#selection-list-boxes) and [collection](listbox_overview.md#collection-or-entity-selection-list-boxes) type list box columns. Ver también la sección **[Variable o Expresión](properties_Object.md#variable-or-expression)**.
-
-Una expresión 4D que se asociará a una columna. Puede introducir:
-
-- Una **variable simple** (en este caso, debe ser declarada explícitamente para la compilación). Se puede utilizar cualquier tipo de variable excepto BLOBs y arrays. El valor de la variable se calculará generalmente en el evento `On Display Detail`.
-
-- Un **campo** que utiliza la sintaxis estándar [Tabla]Campo (solo [list box tipo selección](listbox_overview.md#selection-list-boxes)), por ejemplo: `[Employees]LastName`. Se pueden utilizar los siguientes tipos de campos:
- - String
- - Numeric
- - Fecha
- - Time
- - Picture
- - Boolean\
- Puede utilizar campos de la tabla maestra o de otras tablas.
-
-- Una **expresión 4D** (expresión simple, fórmula o método 4D). La expresión debe devolver un valor. La expresión debe devolver un valor. El resultado de la expresión se mostrará automáticamente cuando cambie al modo Aplicación. La expresión se evaluará para cada registro de la selección (actual o temporal) de la tabla maestra (para list boxes de tipo selección), cada elemento de la colección (para list boxes de tipo colección) o cada entidad de la selección (para list boxes selección de entidades). Si está vacía, la columna no mostrará ningún resultado.
- Se soportan los siguientes tipos de expresiones:
- - String
- - Numeric
- - Fecha
- - Picture
- - Boolean
-
-Para los list boxes colección/entity selection, Null o tipos no soportados se muestran como cadenas vacías.\
-Cuando utilice colecciones o selecciones de entidades, normalmente declarará la propiedad del elemento o el atributo de entidad asociado a una columna dentro de una expresión que contenga [This](https://doc.4d.com/4Dv17R6/4D/17-R6/This.301-4310806.en.html).\
-Cuando utilice colecciones o selecciones de entidades, normalmente declarará la propiedad del elemento o el atributo de entidad asociado a una columna dentro de una expresión que contenga [This](https://doc.4d.com/4Dv17R6/4D/17-R6/This.301-4310806.en.html).
-Cuando utilice colecciones o selecciones de entidades, normalmente declarará la propiedad del elemento o el atributo de entidad asociado a una columna dentro de una expresión que contenga [This](../commands/this.md). `This` es un comando 4D dedicado que devuelve una referencia al elemento actualmente procesado. Por ejemplo, puede utilizar `This.\` donde `\` es la ruta de una propiedad en la colección o una ruta de atributo de entidad para acceder al valor actual de cada elemento/entidad.
-Si utiliza una colección de valores escalares, 4D creará un objeto para cada elemento de la colección con una única propiedad (llamada "valor"), llenada con el valor del elemento. En este caso, utilizará `This.value` como expresión.
-
-Si se utiliza una expresión no asignable (por ejemplo, `[Person]FirstName+" "+[Person]LastName`), la columna nunca se podrá introducir aunque la propiedad [Editable](properties_Entry.md#enterable) esté activada.
-
-Si se utiliza un campo, una variable o una expresión asignable (*por ejemplo Person.lastName*), la columna puede ser editable o no dependiendo de la propiedad [Editable](properties_Entry.md#enterable).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ----------------------------------------------------------------------------------------------------- |
-| dataSource | string | Una variable 4D, un nombre de campo o una expresión del lenguaje compleja arbitraria. |
-
-#### Objetos soportados
-
-[Columna de list box](listbox_overview.md#list-box-columns)
-
----
-
-## Tabla principal
-
-`Current selection list boxes`
-
-Especifica la tabla cuya selección actual se utilizará. Esta tabla y su selección actual constituirán la referencia de los campos asociados a las columnas del list box (referencias de campo o expresiones que contienen campos). Aunque algunas columnas contengan campos de otras tablas, el número de líneas mostradas será definido por la tabla maestra.
-
-Se pueden utilizar todas las tablas de la base de datos, independientemente de si el formulario está relacionado con una tabla (formulario tabla) o no (formulario proyecto).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------- |
-| tabla | number | Número de tabla |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Guardar como
-
-Esta propiedad está disponible en las siguientes condiciones:
-
-- una [lista de selección](#choice-list) está asociada al objeto
-- para [entradas](input_overview.md) y [columnas list box](listbox_overview.md#columnas-de-list-box), también se define una [lista requerida](properties_RangeOfValues.md#lista-requerida) para el objeto (ambas opciones deben usar normalmente la misma lista), de modo que solo se puedan ingresar valores de la lista por parte del usuario.
-
-Esta propiedad especifica, en el contexto de un campo o variable asociado a una lista de valores, el tipo de contenido a guardar:
-
-- **Guardar como valor** (opción por defecto): el valor del elemento elegido en la lista por el usuario se guarda directamente. Por ejemplo, si el usuario elige el valor "Azul", este valor se guarda en el campo.
-- **Guardar como referencia**: la referencia del elemento de la lista de opciones se guarda en el objeto. Esta referencia es el valor numérico asociado a cada elemento, ya sea a través del parámetro *itemRef* de los comandos [`APPEND TO LIST`](../commands-legacy/append-to-list.md) o [`SET LIST ITEM`](../commands-legacy/set-list-item.md), o en el editor de listas.
-
-Esta opción permite optimizar el uso de la memoria: almacenar valores numéricos en los campos ocupa menos espacio que almacenar cadenas. También facilita la traducción de aplicaciones: basta con crear varias listas en distintos idiomas pero con las mismas referencias de elementos y, a continuación, cargar la lista en función del idioma de la aplicación.
-
-El uso de esta propiedad requiere el cumplimiento de los siguientes principios:
-
-- Para poder almacenar la referencia, el campo o fuente de datos variable debe ser de tipo Número (independientemente del tipo de valor que aparezca en la lista). La propiedad [expresión ](properties_Object.md#expression-type) se define automáticamente.
-- Las referencias válidas y únicas deben estar asociadas a los elementos de la lista.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | -------------------- |
-| saveAs | string | "value", "reference" |
-
-#### Objetos soportados
-
-[Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Elementos seleccionados {#selected-items}
-
-`List box colección o entity selection`
-
-Especifica una variable o expresión a la que se asignarán los elementos o entidades seleccionados por el usuario.
-
-- para un list box colección, debe utilizar una variable colección o una expresión asignable que acepte colecciones,
-- para un list box selección de entidades, se crea un objeto de selección de entidades. Debe utilizar una variable objeto o una expresión asignable que acepte objetos.
-
-> Esta propiedad es de "sólo lectura", se actualiza automáticamente según las acciones del usuario en el list box. No se puede editar su valor para modificar el estado de selección del list box.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------- | -------------- | ----------------------------------------- |
-| selectedItemsSource | string | Colección asignable o expresión de objeto |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Selección temporal
-
-`List boxes de tipo selección nombrada`
-
-Especifica la selección temporal a utilizar. Debe introducir el nombre de una selección temporal válida. Puede ser una selección temporal proceso o interproceso. El contenido del list box se basará en esta selección. La selección elegida debe existir y ser válida en el momento en que se muestre el list box; de lo contrario, el list box se mostrará en blanco.
-
-> Las selecciones temporales son listas ordenadas de registros. Se utilizan para mantener en memoria el orden y el registro actual de una selección. Para más información, consulte la sección **Selecciones temporales** del manual *Lenguaje 4D*.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | ---------------------- |
-| namedSelection | string | Nombre de la selección |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Display.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Display.md
deleted file mode 100644
index ca733dcfcb0442..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Display.md
+++ /dev/null
@@ -1,621 +0,0 @@
----
-id: propertiesDisplay
-title: Visualización
----
-
----
-
-## Formato Alfa
-
-Los formatos alfabéticos controlan la forma en que aparecen los campos alfanuméricos y las variables cuando se visualizan o imprimen. Aquí hay una lista de formatos suministrados para los campos alfanuméricos:
-
-
-
-Puede elegir un formato de esta lista o utilizar cualquier formato personalizado. La lista por defecto contiene formatos para algunos de los campos alfa más comunes que requieren formatos: Números de teléfono de EE. UU. (locales y de larga distancia), números de la Seguridad Social y códigos postales. También puede introducir un nombre de formato personalizado definido en el editor Filtros y formatos de la caja de herramientas. En este caso, el formato no se puede modificar en las propiedades del objeto.
-Los formatos o filtros personalizados que haya creado estarán disponibles automáticamente, precedidos de una barra vertical (|).
-
-El signo número (#) es el marcador de posición para un formato de visualización alfanumérico. Puede incluir los guiones, rayas, espacios y cualquier otro signo de puntuación que desee mostrar. Utilice los signos de puntuación que desee y el signo número para cada caracter que desee mostrar.
-
-Por ejemplo, considere un número de parte con un formato como "RB-1762-1".
-
-El formato alfa sería:
-
-\##-####-#
-
-Cuando el usuario introduce "RB17621," el campo muestra:
-
-RB-1762-1
-
-El campo contiene realmente "RB17621".
-
-Si el usuario introduce más caracteres de los que permite el formato, 4D muestra los últimos caracteres. Por ejemplo, si el formato es:
-
-(#######)
-
-y el usuario introduce "proporción", el campo muestra:
-
-(portion)
-
-El campo contiene realmente "proportion". 4D acepta y almacena la entrada completa sin importar el formato de visualización. No se pierde ninguna información.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------------------------------------------------------------------------------------------------------- |
-| textFormat | string | "### ####", "(###) ### ####", "### ### ####", "### ## ####", "00000", formatos personalizados |
-
-#### Objetos soportados
-
-[Lista desplegable](dropdownList_Overview.md) - [Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
-
----
-
-## Formato Fecha
-
-Los formatos de fecha controlan la forma en que aparecen las fechas cuando se muestran o imprimen. Para la entrada de datos, las fechas se introducen en el formato MM/DD/AAAA, independientemente del formato de visualización que haya elegido.
-
-Se pueden definir formatos de visualización para las fechas:
-
-- utilizando un formato integrado en 4D,
-- utilizando un modelo personalizado.
-
-### Formatos integrados
-
-La siguiente tabla muestra las opciones disponibles:
-
-| Nombre del formato | Cadena JSON | Ejemplo (sistema USA) |
-| ------------------------------------------------ | -------------------------------------------- | ------------------------------------------------------------- |
-| System date short | systemShort (por defecto) | 03/25/20 |
-| System date abbreviated *(1)* | systemMedium | Wed, Mar 25, 2020 |
-| System date long | systemLong | Wednesday, March 25, 2020 |
-| RFC 822 | rfc822 | Tue, 25 Mar 2020 22:00:00 GMT |
-| Short Century | shortCentury | 03/25/20 pero 04/25/2032 *(2)* |
-| Internal date long | largo | March 25, 2020 |
-| Fecha interna abreviada *(1)* | abbreviated | Mar 25, 2020 |
-| Internal date short | short | 03/25/2020 |
-| ISO Date Time *(3)* | iso8601 | 2020-03-25T00:00:00 |
-
-*(1)* Para evitar ambigüedades y de acuerdo con la práctica actual, los formatos de fecha abreviados muestran "jun" para junio y "jul" para julio. Esta particularidad sólo se aplica a las versiones francesas de 4D.
-
-*(2)* El año se muestra con dos dígitos cuando pertenece al intervalo (1930;2029), de lo contrario se mostrará con cuatro dígitos. Esto es por defecto, pero puede modificarse utilizando el comando [SET DEFAULT CENTURY](../commands-legacy/set-default-century.md).
-
-*(3)* El formato `ISO Date Time` corresponde a la norma XML de representación de fecha y hora (ISO8601). Está pensado principalmente para ser utilizado al importar/exportar datos en formato XML y en Servicios Web.
-
-> Independientemente del formato de visualización, si el año se introduce con dos dígitos, 4D asume que el siglo es el 21 si el año pertenece al intervalo (00;29) y el 20 si pertenece al intervalo (30;99). Esta es la configuración por defecto, pero puede modificarse utilizando el comando [SET DEFAULT CENTURY](../commands-legacy/set-default-century.md).
-
-### Formatos personalizados
-
-Se pueden crear formatos de fecha personalizados utilizando varios patrones descritos en la página [**Formatos de fecha y hora**](../Project/date-time-formats.md). Por ejemplo:
-
-| Modelo | Ejemplo (sistema USA) |
-| -------------------- | ---------------------------------------- |
-| "eeee, dd" | Wednesday, 29 |
-| "'Día' #D 'del año'" | Día 333 del año |
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| dateFormat | string |
Formatos personalizados: todo formato creado utilizando un [patrón soportado](../Project/date-time-formats.md) + " blankIfNull"
|
-
-:::note blankIfNull
-
-- Por defecto, una fecha null se muestra con ceros, por ejemplo 00/00/00. Con la opción "blankIfNull", una fecha null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado.
-- Las [columnas list box](listbox_overview.md#list-box-columns) y los [pies List box](listbox_overview.md#list-box-footers) de tipo fecha utilizan siempre el comportamiento "blank if null" (no se puede desactivar).
-
-:::
-
-#### Objetos soportados
-
-[Combo Box](comboBox_overview.md) - [Drop-down List](dropdownList_Overview.md) - [Input](input_overview.md) - [List Box Column](listbox_overview.md#list-box-columns) - [List Box Footer](listbox_overview.md#list-box-footers)
-
----
-
-## Formato de número
-
-> Los campos numéricos incluyen los tipos Integer, Long integer, Integer 64 bits, Real y Float.
-
-Los formatos numéricos controlan la forma en que aparecen los números cuando se muestran o imprimen. Para la entrada de datos, sólo se introducen los números (incluido el punto decimal o el signo menos si es necesario), independientemente del formato de visualización que se haya elegido.
-
-4D ofrece varios formatos de números por defecto.
-
-### Marcadores
-
-En cada uno de los formatos de visualización de números, el signo número (#), el cero (0), el signo de intercalación (^) y el asterisco (\*) se utilizan como marcadores de posición. Puede crear sus propios formatos numéricos utilizando un marcador de posición para cada dígito que desee mostrar.
-
-| Marcador | Efecto para cero inicial o posterior |
-| -------- | ----------------------------------------- |
-| # | No muestra nada |
-| 0 | Muestra 0 |
-| ^ | Muestra un espacio (1) |
-| \* | Muestra un asterisco |
-
-(1) El signo de intercalación (^) genera un caracter de espacio que ocupa el mismo ancho que un dígito en la mayoría de los tipos de fuente.
-
-Por ejemplo, si desea mostrar números de tres digitos, puede utilizar el formato ###. Si el usuario introduce más caracteres de los que permite el formato, 4D muestra los últimos caracteres.
-
-Si el usuario introduce un número negativo, el caracter situado más a la izquierda se muestra como un signo menos (a menos que se haya especificado un formato de visualización negativo). Si ##0 es el formato, menos 26 se muestra como -26 y menos 260 se muestra como <<< porque el signo menos ocupa un marcador de posición y sólo hay tres marcadores de posición.
-
-> Sea cual sea el formato de visualización, 4D acepta y almacena el número introducido en el campo. No se pierde ninguna información.
-
-Cada caracter de marcador de posición tiene un efecto diferente en la visualización de ceros a la izquierda o a la derecha. Un cero inicial es un cero que comienza un número antes del punto decimal; un cero final es un cero que termina un número después del punto decimal.
-
-Supongamos que usa el formato ##0 para mostrar tres dígitos. Si el usuario no introduce nada en el campo, el campo muestra 0. Si el usuario introduce 26, el campo muestra 26.
-
-### Caracteres separadores
-
-Los formatos numéricos de visualización (excepto las notaciones científicas) se basan automáticamente en los parámetros regionales del sistema. 4D sustituye los caracteres "." y "," por, respectivamente, el separador decimal y el separador de miles definidos en el sistema operativo. Así, el punto y la coma se consideran caracteres comodín, siguiendo el ejemplo de 0 o #.
-
-> En Windows, cuando se utiliza la tecla separadora decimal del teclado numérico, 4D hace una distinción según el tipo de campo donde se encuentre el cursor:
->
-> - en un campo de tipo Real, al utilizar esta tecla se insertará el separador decimal definido en el sistema,
-> - en cualquier otro tipo de campo, esta llave inserta el carácter asociado a la clave, normalmente un punto (.) o coma (,).
-
-### Puntos decimales y otros caracteres de visualización
-
-Puede utilizar un punto decimal en un formato de visualización de números. Si desea que el decimal se muestre independientemente de si el usuario lo teclea o no, debe colocarlo entre ceros.
-
-Puede utilizar cualquier otro caracter en el formato. Cuando se utilizan solos, o se colocan antes o después de marcadores de posición, los caracteres siempre aparecen. Por ejemplo, si utiliza el siguiente formato:
-
-$##0
-
-siempre aparece un signo de dólar porque se coloca antes de los marcadores de posición.
-
-Si se colocan caracteres entre los marcadores de posición, sólo aparecerán si se muestran dígitos a ambos lados. Por ejemplo, si define el formato:
-
-\###.##0
-
-el punto aparece sólo si el usuario introduce al menos cuatro dígitos.
-
-Los espacios se tratan como caracteres en los formatos de visualización de números.
-
-### Formatos para positivo, negativo y cero
-
-Un formato de visualización de números puede tener hasta tres partes, lo que permite especificar formatos de visualización para valores positivos, negativos y cero. Especifique las tres partes separándolas con punto y coma, como se muestra a continuación:
-
-Positivo;Negativo;Cero
-
-No es necesario especificar las tres partes del formato. Si utiliza sólo una parte, 4D la utiliza para todos los números, colocando un signo menos delante de los números negativos.
-
-Si utiliza dos partes, 4D utiliza la primera parte para los números positivos y el cero y la segunda parte para los números negativos. Si utiliza tres partes, la primera es para los números positivos, la segunda para los negativos y la tercera para el cero.
-
-> La tercera parte (cero) no se interpreta y no acepta caracteres de sustitución. Si introduce `###;###;#`, el valor cero se mostrará "#". En otras palabras, lo que realmente introduzca es lo que se mostrará para el valor cero.
-
-A continuación se muestra un ejemplo de formato de visualización de números que muestra signos de dólar y comas, coloca los valores negativos entre paréntesis y no muestra ceros:
-
-¥###,##0.00;(¥###,##0.00);
-
-Observe que la presencia del segundo punto y coma indica a 4D que utilice nada para mostrar el cero. El siguiente formato es similar excepto que la ausencia del segundo punto y coma indica a 4D que utilice el formato de número positivo para el cero:
-
-¥###,##0.00;(¥###,##0.00)
-
-En este caso, la visualización del cero sería $0.00.
-
-### Notación científica
-
-Si desea mostrar números en notación científica, utilice el **ampersand** (&) seguido de un número para especificar el número de dígitos que desea mostrar. Por ejemplo, el formato:
-
-&3
-
-mostrará 759.62 como:
-
-7.60e+2
-
-El formato de notación científica es el único que redondea automáticamente el número mostrado. Observe en el ejemplo anterior que el número se redondea a 7,60e+2 en lugar de truncarse en 7,59e+2.
-
-### Formatos hexadecimales
-
-Puede visualizar un número en hexadecimal utilizando los siguientes formatos de visualización:
-
-- `&x`: este formato muestra números hexadecimales utilizando el formato “0xFFFF”.
-- `&$`: este formato muestra números hexadecimales utilizando el formato "$FFFF".
-
-### Notación XML
-
-El formato `&xml` hará que un número cumpla las normas estándar XML. En particular, el caracter separador decimal será un punto "." en todos los casos, independientemente de la configuración del sistema.
-
-### Mostrar un número como una hora
-
-Puede visualizar un número como una hora (con un formato de hora) utilizando `&/` seguido de un dígito. La hora se determina calculando el número de segundos desde medianoche que representa el valor. El dígito en el formato corresponde al orden en que aparece el formato de hora en el menú desplegable Formato.
-
-Por ejemplo, el formato:
-
-&/5
-
-corresponde al 5º formato horario del menú desplegable, concretamente a la hora AM/PM. Un campo numérico con este formato mostraría 25000 como:
-
-6:56 AM
-
-### Ejemplos
-
-La siguiente tabla muestra cómo afectan los distintos formatos a la visualización de los números. Las tres columnas, Positiva, Negativa y Cero, muestran cada una cómo se mostrarían 1.234,50, -1.234,50 y 0.
-
-| Formato introducido | Positivo | Negativo | Cero |
-| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------ |
-| ### | <<< | <<< | |
-| #### | 1234 | <<<< | |
-| ####### | 1234 | -1234 | |
-| #####.## | 1234.5 | -1234.5 | |
-| ####0.00 | 1234.50 | -1234.50 | 0.00 |
-| #####0 | 1234 | -1234 | 0 |
-| +#####0;–#####0;0 | +1234 | -1234 | 0 |
-| #####0DB;#####0CR;0 | 1234DB | 1234CR | 0 |
-| #####0;(#####0) | 1234 | (1234) | 0 |
-| ###,##0 | 1,234 | -1,234 | 0 |
-| ##,##0.00 | 1,234.50 | -1,234.50 | 0.00 |
-| \^\^\^\^\^\^\^ | 1234 | -1234 | |
-| \^\^\^\^\^\^0 | 1234 | -1234 | 0 |
-| \^\^\^,\^\^0 | 1,234 | -1,234 | 0 |
-| \^\^,\^\^0.00 | 1,234.50 | -1,234.50 | 0.00 |
-| \*\*\*\*\*\*\* | \*\*\*1234 | \*\*-1234 | \*\*\*\*\*\*\* |
-| \*\*\*\*\*\*0 | \*\*\*1234 | \*\*-1234 | \*\*\*\*\*\*0 |
-| \*\*\*,\*\*0 | \*\*1,234 | \*-1,234 | \*\*\*\*\*\*0 |
-| \*\*,\*\*0.00 | \*1,234.50 | -1,234.50 | \*\*\*\*\*0.00 |
-| $\*,\*\*0.00;–$\*,\*\*0.00 | $1,234.50 | -$1,234.50 | $\*\*\*\*0.00 |
-| $\^\^\^\^0 | $ 1234 | $–1234 | $ 0 |
-| $\^\^\^0;–$\^\^\^0 | $1234 | –$1234 | $ 0 |
-| $\^\^\^0 ;($\^\^\^0) | $1234 | ($1234) | $ 0 |
-| $\^,\^\^0.00 ;($\^,\^\^0.00) | $1,234.50 | ($1,234.50) | $ 0.00 |
-| &2 | 1.2e+3 | -1.2e+3 | 0.0e+0 |
-| &5 | 1.23450e+3 | -1.23450e+3 | 0.00000 |
-| &xml | 1234.5 | -1234.5 | 0 |
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ----------------------------------------------------------------------------------------- |
-| numberFormat | string | Números (incluyendo un punto decimal o un signo menos si es necesario) |
-
-#### Objetos soportados
-
-[Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Indicadores de progreso](progressIndicator.md)
-
----
-
-## Formato imagen
-
-Los formatos Imagen controlan la apariencia de las imágenes cuando se muestran o se imprimen. Para la entrada de datos, el usuario siempre introduce las imágenes pegándolas desde el Portapapeles o arrastrándolas y soltándolas, independientemente del formato de visualización.
-
-Las opciones de truncamiento y escalado no afectan a la imagen en sí. El contenido de un campo Imagen siempre se guarda. El formato de visualización de la imagen sólo afecta a la visualización en el formulario en cuestión.
-
-### A escala para ajustarse
-
-`Gramática JSON: "scaled"`
-
-El formato **A escala para ajustarse** hace que 4D redimensione la imagen para ajustarla a las dimensiones del área.
-
-
-
-### Truncado (centrado y no centrado)
-
-`Gramática JSON: "truncatedCenter" / "truncatedTopLeft"`
-
-El formato **Truncado (centrado)** hace que 4D centre la imagen en el área y recorte cualquier parte que no quepa dentro del área. 4D recorta por igual desde cada borde y desde la parte superior e inferior.
-
-El formato **Truncado (no centrado)** hace que 4D coloque la esquina superior izquierda de la imagen en la esquina superior izquierda del área y recorte cualquier parte que no quepa dentro del área. 4D corta desde la derecha y desde abajo.
-
-> Cuando el formato de la imagen es **Truncado (no centrado)**, es posible añadir barras de desplazamiento al área de entrada.
-
-
-
-### Escala de ajuste (proporcional) y Escala de ajuste centrada (proporcional)
-
-`Gramática JSON: "proportionalTopLeft" / "proportionalCenter"`
-
-Si utiliza **Escala de ajuste (proporcional)**, la imagen se reduce proporcionalmente en todos sus lados para ajustarse al área creada para la imagen. La opción **Escalado para ajustar centrado (proporcional)** hace lo mismo, pero centra la imagen en el área imagen.
-
-Si la imagen es más pequeña que el área definida en el formulario, no se modificará. Si la imagen es mayor que el área definida en el formulario, se reduce proporcionalmente. Como se reduce proporcionalmente, la imagen no aparecerá distorsionada.
-
-Si ha aplicado el formato **Escalado para ajustar centrado (proporcional)**, la imagen también se centra en el área:
-
-
-
-### Replicado
-
-`Gramática JSON: "tiled"`
-
-Cuando se amplía el área que contiene una imagen con el formato **Replicada**, la imagen no se deforma sino que se replica tantas veces como sea necesario para llenar el área por completo.
-
-
-
-Si el campo se reduce a un tamaño menor que el de la imagen original, la imagen queda truncada (no centrada).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
-| pictureFormat | string | "truncatedTopLeft", "scaled", "truncatedCenter", "tiled", "proportionalTopLeft", "proportionalCenter" |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
-
----
-
-## Formato Hora
-
-Los formatos de hora controlan la forma en que aparecen las horas cuando se muestran o imprimen. For data entry, you enter times in the 24-hour HH: MM:SS format or the 12-hour HH: MM:SS AM/PM format, regardless of the display format you have chosen.
-
-Se pueden definir los formatos de visualización de las horas:
-
-- utilizando un formato integrado en 4D,
-- utilizando un modelo personalizado.
-
-### Formatos integrados
-
-La siguiente tabla muestra los formatos de visualización de los campos de hora y da ejemplos:
-
-| Nombre del formato | Cadena JSON | Comentarios | Ejemplo para 04:30:25 |
-| ---------------------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
-| HH:MM:SS | hh_mm_ss | | 04:30:25 |
-| HH:MM | hh_mm | | 04:30 |
-| Hour Min Sec | HH_MM_SS | | 4 horas 30 minutos 25 segundos |
-| Hour Min | HH_MM | | 4 horas 30 minutos |
-| HH:MM AM/PM | hh_mm_am | | 4:30 a.m. |
-| MM SS | mm_ss | Hora expresada como duración a partir de las 00:00:00 | 270:25 |
-| Min Sec | MM_SS | Hora expresada como duración a partir de las 00:00:00 | 270 Minutos 25 Segundos |
-| ISO Date Time | iso8601 | Corresponde al estándar XML para representar datos relacionados con la hora. Está pensado principalmente para ser utilizado cuando se importan/exportan datos en formato XML | 0000-00-00T04:30:25 |
-| System time short | - (por defecto) | Formato de hora estándar definido en el sistema | 04:30:25 |
-| System time long abbreviated | systemMedium | sólo macOS: formato de tiempo abreviado definido en el sistema. Windows: este formato es el mismo que el formato corto de la hora del sistema | 4•30•25 AM |
-| System time long | systemLong | macOS únicamente: formato de tiempo largo definido en el sistema. Windows: este formato es el mismo que el formato corto de la hora del sistema | 4:30:25 AM HNEC |
-
-### Formatos personalizados
-
-Se pueden crear formatos de hora personalizados utilizando varios patrones descritos en la página [**Formatos de fecha y hora**](../Project/date-time-formats.md). Por ejemplo:
-
-| Modelo | Ejemplo (sistema USA) |
-| --------------------------------------- | ---------------------------------------- |
-| "HH 'horas' mm 'minutos' ss 'segundos'" | 13 horas 25 minutos 12 segundos |
-| "hh:mm aa" | 01:25 PM |
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| timeFormat | string |
|
-
-:::note blankIfNull
-
-Por defecto, una hora null se muestra con ceros, por ejemplo "00:00:00". Con la opción "blankIfNull", una hora null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. Ej: "MM_SS blankIfNull" o "hh:mm aa blankIfNull"
-
-:::
-
-#### Objetos soportados
-
-[Combo Box](comboBox_overview.md) - [Drop-down List](dropdownList_Overview.md) - [Input](input_overview.md) - [List Box Column](listbox_overview.md#list-box-columns) - [List Box Footer](listbox_overview.md#list-box-footers)
-
----
-
-## Texto cuando False/Texto cuando True
-
-Cuando una [expresión booleana](properties_Object.md#expression-type) se muestra como:
-
-- un texto en un [objeto de entrada](input_overview.md)
-- un "popup" [](properties_Display.md#display-type) en una [columna del list box](listbox_overview.md#list-box-columns),
-
-... puede seleccionar el texto que se mostrará para cada valor:
-
-- **Text cuando True** - el texto que se mostrará cuando el valor sea "true"
-- **Text cuando False** - el texto que se mostrará cuando el valor sea "false"
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------- |
-| booleanFormat | string | "\<*textWhenTrue*\>;\<*textWhenFalse*\>", por ejemplo "Assigned;Unassigned" |
-
-#### Objetos soportados
-
-[Columna List Box](listbox_overview.md#list-box-columns) - [Entrada](input_overview.md)
-
----
-
-## Tipo de visualización
-
-Utilizado para asociar un formato de visualización con los datos de la columna. Los formatos suministrados dependen del tipo de variable (list box de tipo array) o del tipo dato/campo (list boxes de tipo selección y colección).
-
-Las columnas booleanas y numéricas (números o enteros) pueden mostrarse como casillas de verificación. En este caso, se puede definir la propiedad [Título](#title).
-
-Las columnas booleanas también pueden mostrarse como menús emergentes. En este caso, deben definirse las propiedades [Text cuando False y Text cuando True](#text-when-falsetext-when-true).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| controlType | string |
**columnas numéricas**: "automatic" (por defecto) o "checkbox"
**columnas booleanas**: "checkbox" (por defecto) o "popup"
|
-
-#### Objetos soportados
-
-[Columna de list box](listbox_overview.md#list-box-columns)
-
----
-
-## No renderizado
-
-Cuando esta propiedad está activada, el objeto no se dibuja en el formulario, sin embargo aún puede activarse.
-
-En particular, esta propiedad permite implementar botones "invisibles". Los botones no renderizados pueden colocarse sobre los objetos gráficos. Permanecen invisibles y no se resaltan al hacer clic sobre ellos, pero su acción se activa a al pulsarlos.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------- | -------------- | ---------------- |
-| display | boolean | true, false |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Lista desplegable](dropdownList_Overview.md)
-
----
-
-## Tres estados
-
-Permite que un objeto casilla de selección acepte un tercer estado. La variable asociada a la casilla de selección devuelve el valor 2 cuando la casilla está en el tercer estado.
-
-#### Casillas de verificación de tres estados en columnas list box
-
-Las columnas de list box con un [tipo de datos](properties_Object.md#expression-type) numérico pueden mostrarse como casillas de verificación de tres estados. Si se elige, se muestran los siguientes valores:
-
-- 0 = casilla no seleccionada,
-- 1 = casilla seleccionada,
-- 2 (o cualquier valor >0) = caja semi-marcada (tercer estado). Para la entrada de datos, este estado devuelve el valor 2.
-- -1 = casilla de verificación invisible,
-- -2 = casilla desmarcada, no editable,
-- -3 = casilla marcada, no editable,
-- -4 = casilla semi-marcada, no editable
-
-También en este caso, la propiedad [Título](#title) está disponible para que se pueda introducir el título de la casilla de verificación.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------- |
-| threeState | boolean | true, false |
-
-#### Objetos soportados
-
-[Casilla de selección](checkbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Título
-
-Esta propiedad está disponible para una columna de list box si:
-
-- el [tipo de columna](properties_Object.md#expression-type) es **boolean** y su [tipo de visualización](properties_Display.md#display-type) es "Casilla de selección"
-- el [tipo de columna](properties_Object.md#expression-type) es **número** (numérico o entero) y su [tipo de visualización](properties_Display.md#display-type) es "Casilla de verificación de tres estados".
-
-En ese caso, el título de la casilla de verificación puede introducirse utilizando esta propiedad.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | -------------------------------------------------------- |
-| controlTitle | string | Toda etiqueta personalizada para la casilla de selección |
-
-#### Objetos soportados
-
-[Columna de list box](listbox_overview.md#list-box-columns)
-
----
-
-## Truncar con puntos suspensivos
-
-Controla la visualización de los valores cuando las columnas del list box son demasiado estrechas para mostrar todo su contenido.
-
-Esta opción está disponible para columnas con cualquier tipo de contenido, excepto imágenes y objetos.
-
-- Cuando la propiedad está activada (por defecto), si el contenido de una celda del list box excede el ancho de la columna, se trunca y se muestra una elipsis:
-
-
-
-> La posición de la elipsis depende del sistema operativo. En el ejemplo anterior (Windows), se añade a la derecha del texto. En macOS, la elipsis se añade en medio del texto.
-
-- Cuando la propiedad está desactivada, si el contenido de una celda excede el ancho de la columna, simplemente se recorta sin añadir elipsis:
-
-
-
-La opción Truncar con elipsis está activada por defecto y puede especificarse con list boxes de tipo Array, Selección o Colección.
-
-> Cuando se aplica a columnas de tipo Texto, la opción Truncar con elipsis sólo está disponible si la opción [Ajustar texto](#wordwrap) no está seleccionada. Cuando se selecciona la propiedad Ajuste de palabras, el contenido adicional de las celdas se gestiona mediante las funciones de ajuste de palabras, por lo que la propiedad Truncar con elipsis no está disponible.
-
-La propiedad Truncar con elipsis puede aplicarse a columnas de tipo booleano; sin embargo, el resultado difiere en función del [formato de celda](#display-type):
-
-- En los formatos booleanos de tipo emergente, las etiquetas se truncan con una elipsis,
-- Para los formatos booleanos de tipo casilla de verificación, las etiquetas siempre se recortan.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ---------------------- |
-| truncateMode | string | "withEllipsis", "none" |
-
-#### Objetos soportados
-
-[Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
-
----
-
-## Visibilidad
-
-Esta propiedad permite ocultar el objeto en el entorno Aplicación.
-
-Puede manejar la propiedad Visibilidad para la mayoría de los objetos del formulario. Esta propiedad se utiliza principalmente para simplificar el desarrollo de interfaces dinámicas. En este contexto, a menudo es necesario ocultar objetos por programación durante el evento `On load` del formulario y luego mostrar determinados objetos. In this context, it is often necessary to hide objects programatically during the On load event of the form then to display certain objects afterwards. El desarrollador puede entonces programar su pantalla utilizando el comando [`OBJECT SET VISIBLE`](../commands-legacy/object-set-visible.md) cuando lo necesite.
-
-#### Visibilidad automática en los formularios lista
-
-En el contexto de los [formularios "lista"](FormEditor/properties_FormProperties.md#form-type), la propiedad Visibilidad soporta dos valores específicos:
-
-- **Si registro seleccionado** (nombre JSON: "selectedRows")
-- **Si el registro no está seleccionado** (nombre JSON: "unselectedRows")
-
-Esta propiedad sólo se utiliza cuando se dibujan objetos situados en el cuerpo de un formulario listado. Indica a 4D si debe o no dibujar el objeto dependiendo de si el registro que se está procesando está seleccionado/no seleccionado. Permite representar una selección de registros utilizando atributos visuales distintos de los colores de resaltado:
-
-
-
-4D no tiene en cuenta esta propiedad si el objeto se ocultó utilizando el comando [`OBJECT SET VISIBLE`](../commands-legacy/object-set-visible.md); en este caso, el objeto permanece invisible independientemente de si el registro está seleccionado o no.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| visibility | string | "visible", "hidden", "selectedRows" (formulario listado únicamente), "unselectedRows" (formulario listado únicamente) |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Spinner](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Ajuste de texto
-
-> Para los objetos [entrada](input_overview.md), disponibles cuando la propiedad [Multilínea](properties_Entry.md#multiline) está definida como "yes".
-
-Gestiona la visualización del contenido cuando supera el ancho del objeto.
-
-#### Marcada para list box/Sí para entrada
-
-`Gramática JSON: "normal"`
-
-Cuando esta opción está seleccionada, el texto pasa automáticamente a la línea siguiente siempre que su ancho supere el de la columna/área, si la altura de la columna/área lo permite.
-
-- En las columnas/áreas de una sola línea, sólo se muestra la última palabra que puede mostrarse entera. 4D inserta retornos de línea; es posible desplazarse por el contenido del área presionando la tecla de flecha abajo.
-
-- En las columnas/áreas multilínea, 4D realiza retornos de línea automáticos.
-
-
-
-#### Sin marcar para el list box/No para entrada
-
-`Gramática JSON: "none"`
-
-Cuando se selecciona esta opción, 4D no realiza ningún retorno de línea automático y la última palabra que se puede mostrar puede quedar truncada. En las áreas de tipo de texto, se soportan los retornos de carro:
-
-
-
-En los list boxes, el texto demasiado largo se trunca y se muestra con una elipse (...). En el siguiente ejemplo, la opción Wordwrap está **marcada para la columna izquierda** y **desmarcada para la columna derecha**:
-
-
-
-Tenga en cuenta que, independientemente del valor de la opción Ajuste de texto, la altura de la línea no se modifica. Si el texto con saltos de línea no puede visualizarse por completo en la columna, se trunca (sin elipse). En el caso de los list boxes que muestran una sola línea, sólo se muestra la primera línea de texto:
-
-
-
-#### Automático para entrada (opción por defecto)
-
-`Gramática JSON: "automatic"`
-
-- En las áreas de una sola línea, las palabras situadas al final de las líneas se truncan y no hay retornos de línea.
-- En áreas multilíneas, 4D realiza retornos de línea automáticos.
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ---------------------------------------------------------------------- |
-| wordwrap | string | "automatic" (excluyendo list box), "normal", "none" |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Entry.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Entry.md
deleted file mode 100644
index 8256860e796084..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Entry.md
+++ /dev/null
@@ -1,301 +0,0 @@
----
-id: propertiesEntry
-title: Entrada
----
-
-## Corrección ortográfica automática
-
-4D incluye funcionalidades de corrección ortográfica integradas y personalizables. Se pueden verificar las [entradas](input_overview.md) de tipo texto, así como también los documentos [4D Write Pro](writeProArea_overview.md).
-
-La propiedad de corrección ortográfica automática activa la corrección ortográfica de cada objeto. Cuando se utiliza, se realiza automáticamente una corrección ortográfica durante la entrada de datos. También puede ejecutar el comando de lenguaje 4D `SPELL CHECKING` para cada objeto a verificar.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------- |
-| spellcheck | boolean | true, false |
-
-#### Objetos soportados
-
-[Área 4D Write Pro](writeProArea_overview.md) - [Área de entrada](input_overview.md)
-
----
-
-## Menú contextual
-
-Permite al usuario acceder a un menú contextual estándar en el objeto cuando se ejecuta el formulario.
-
-Para una imagen de tipo [entrada](input_overview.md), además de los comandos de edición estándar (Cortar, Copiar, Pegar y Borrar), el menú contiene el comando **Importar...**, que puede utilizarse para importar una imagen almacenada en un archivo, así como el comando **Guardar como...**, que puede utilizarse para guardar la imagen en el disco. El menú también permite modificar el formato de visualización de la imagen: se ofrecen las opciones **Truncado no centrado**, **Escalado para ajustar** y **Escalado para ajustar centrado prop.**. La modificación del [formato de visualización](properties_Display.md#picture-format) utilizando este menú es temporal; no se guarda con el registro.
-
-Para un tipo de texto [multiestilo](properties_Text.md#multi-style) [input](input_overview.md), además de los comandos de edición estándar, el menú contextual ofrece los siguientes comandos:
-
-- **Fuentes...**: muestra el diálogo del sistema de fuentes
-- **Fuentes recientes**: muestra los nombres de las fuentes recientes seleccionadas durante la sesión. La lista puede almacenar hasta 10 fuentes (más allá, la última fuente utilizada sustituye a la más antigua). Por defecto, esta lista está vacía y la opción no se muestra. Puede gestionar esta lista utilizando los comandos `SET RECENT FONTS` y `FONT LIST`.
-- comandos para las modificaciones de estilo soportados: fuente, tamaño, estilo, color y color de fondo.
- Cuando el usuario modifica un atributo de estilo a través de este menú emergente, 4D genera el evento de formulario `On After Edit`.
-
-Para un [Área Web](webArea_overview.md), el contenido del menú depende del motor de renderizado de la plataforma. Es posible controlar el acceso al menú contextual mediante el comando [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ------------------------------------------------------------ |
-| contextMenu | string | "automatic" (se utiliza si falta), "none" |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md) - [Área Web](webArea_overview.md) - [Áreas 4D Write Pro](writeProArea_overview.md)
-
----
-
-## Editable
-
-El atributo Editable indica si los usuarios pueden introducir valores en el objeto.
-
-Los objetos son editables por defecto. Si desea hacer que un campo o un objeto no se pueda introducir en ese formulario, puede desactivar la propiedad Editable del objeto. Un objeto no editable sólo muestra datos. Los datos se controlan mediante métodos que utilizan el nombre del campo o de la variable. Puede seguir utilizando los eventos de formulario `On Clicked`, `On Double Clicked`, `On Drag Over`, `On Drop`, `On Getting Focus` y `On Losing Focus` con objetos no editables. Esto facilita la gestión de menús contextuales personalizados y permite diseñar interfaces en las que es posible arrastrar y soltar y seleccionar variables no introducibles.
-
-Cuando esta propiedad está desactivada, se desactiva todo menú emergente asociado a una columna list box a través de una lista.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ---------------- |
-| editable | boolean | true, false |
-
-#### Objetos soportados
-
-[Áreas 4D Write Pro](writeProArea_overview.md) - [Casilla de selección](checkbox_overview.md) - [Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Barra de progreso](progressIndicator.md) - [Regla](ruler.md) - [Contador](stepper.md)
-
----
-
-## Filtro de entrada
-
-Un filtro de entrada controla exactamente lo que el usuario puede escribir durante la entrada de datos. Un filtro de entrada controla exactamente lo que el usuario puede escribir durante la entrada de datos. Por ejemplo, si un número de componente siempre tiene dos letras seguidas de tres dígitos, puede utilizar un filtro de entrada para restringir al usuario a respetar ese patrón. Incluso puede controlar las letras y números en particular.
-
-Un filtro de entrada sólo funciona durante la entrada de datos. No tiene efecto en la visualización de los datos después de que el usuario deseleccione el objeto. En general, se utilizan conjuntamente los filtros de entrada con los [formatos de visualización](properties_Display.md). El filtro restringe la entrada de datos y el formato asegura la correcta visualización del valor tras la entrada de datos.
-
-Durante la entrada de datos, un filtro de entrada evalúa cada caracter a medida que se escribe. Si el usuario intenta escribir un caracter no válido (un número en lugar de una letra, por ejemplo), 4D simplemente no lo acepta. El caracter null permanece sin cambios hasta que el usuario escribe un caracter válido.
-
-Los filtros de entrada también pueden utilizarse para mostrar los caracteres de formato necesarios para que el usuario no tenga que introducirlos. Por ejemplo, un número de teléfono estadounidense tiene un código de área de tres dígitos, seguido de un número de siete dígitos que se divide en dos grupos de tres y cuatro dígitos, respectivamente. Se puede utilizar un formato de visualización para encerrar el código de área entre paréntesis y para mostrar un guión después del tercer dígito del número de teléfono. Cuando se utiliza este formato, el usuario no necesita introducir los paréntesis ni los guiones.
-
-### Definir un filtro de entrada
-
-La mayoría de las veces, puede utilizar uno de los [filtros integrados](#default-entry-filters) de 4D para lo que necesite; sin embargo, también puede crear y utilizar filtros personalizados:
-
-- puede introducir directamente una cadena de definición de filtro
-- o puede introducir el nombre de un filtro de entrada creado en el editor de filtros de la caja de herramientas. Los nombres de los filtros personalizados que se crean comienzan con una barra vertical (|).
-
-### Filtros de entrada por defecto
-
-A continuación se presenta una tabla que explica cada una de las opciones de filtro de entrada en la lista desplegable Filtro de entrada:
-
-| Filtro de entrada | Descripción |
-| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| ~A | Permite la entrada de todas las letras, pero las conviete a mayúsculas. |
-| &9 | Permitir sólo números. |
-| &A | Permitir sólo letras mayúsculas. |
-| &a | Permitir sólo letras (mayúsculas y minúsculas). |
-| &@ | Permitir sólo caracteres alfanuméricos. No hay caracteres especiales. |
-| ~a## | Abreviatura del nombre del estado (por ej., CA). Permite la entrada de dos letras, pero las convierte en mayúsculas. |
-| !0&9##/##/## | Formato de entrada de fechas estándar. Mostrar ceros en los espacios de entrada. Permitir cualquier número. |
-| !0&9 Día: ## Mes: ## Año: ## | Time entry format. Mostrar ceros en los espacios de entrada. Permitir cualquier número. Limited to hours and minutes. |
-| !0&9##:## | Formato de entrada de hora. Limitado a horas y minutos. Mostrar ceros en los espacios de entrada. Permitir cuatro números, separados por dos puntos. |
-| !0&9## Horas ## Minutos ## Segundos | Formato de entrada de hora. Mostrar ceros en los espacios de entrada. Permitir dos números antes de cada palabra. |
-| !0&9Horas: ## Minutas: ## Segundos: ## | Formato de entrada de hora. Mostrar ceros en los espacios de entrada. Permitir dos números después de cada palabra. |
-| !0&9##-##-##-## | Formato de número de teléfono local. Mostrar ceros en los espacios de entrada. Permitir cualquier número. Tres entradas, guión, cuatro entradas. |
-| !_&9(###)!0###-#### | Número de teléfono de larga distancia. Mostrar guiones bajos en los tres primeros espacios de entrada, ceros en el resto. |
-| !0&9###-###-### | Número de teléfono de larga distancia. Mostrar ceros en los espacios de entrada. Permitir cualquier número. Tres entradas, guión, tres entradas, guión, cuatro entradas. |
-| !0&9###-##-### | Número de la Seguridad Social. Mostrar ceros en los espacios de entrada. Permitir cualquier número. |
-| ~"A-Z;0-9; ;,;.;-" | Letras mayúsculas y puntuación. Permita sólo letras mayúsculas, números, espacios, comas, puntos y guiones. |
-| &"a-z;0-9; ;,;.;-" | Letras mayúsculas y minúsculas y puntuación. Permite letras minúsculas, números, espacios, comas, puntos y guiones. |
-| &"0-9;.;-" | Números. Sólo se permiten números, puntos decimales y guiones (signo menos). |
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------- |
-| entryFilter | string |
Código de filtro de entrada
o
Nombre de filtro de entrada (los nombres de filtro empiezan por | )
|
-
-#### Objetos soportados
-
-[Check Box](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [ Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Focusable
-
-Cuando la propiedad **Enfocable** está activada para un objeto, el objeto puede tener el foco (y por lo tanto puede ser activado por el teclado por ejemplo). Cuando está seleccionado, aparece delimitado por una línea de puntos gris, excepto si también se ha seleccionado la opción [Ocultar rectángulo de enfoque](properties_Appearance.md#hide-focus-rectangle).
-
-> Un [objeto de entrada](input_overview.md) es siempre enfocable si tiene la propiedad [Editable](#enterable).
-
--  Check box shows focus when selected
-
--  Check box is selected but cannot show focus|
-
-Cuando se selecciona la propiedad **Enfocable** para un objeto no editable, el usuario puede seleccionar, copiar o incluso arrastrar y soltar el contenido del área.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | ---------------- |
-| focusable | boolean | true, false |
-
-#### Objetos soportados
-
-[Áreas 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Casilla de selección](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [List Box](listbox_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Botón de opción](radio_overview.md) - [Subformulario](subform_overview.md)
-
----
-
-## Disposición del teclado
-
-Esta propiedad asocia una distribución de teclado específica a un [objeto de entrada](input_overview.md). Por ejemplo, en una aplicación internacional, si un formulario contiene un campo cuyo contenido debe introducirse en caracteres griegos, puede asociar a este campo la disposición de teclado "griego". De este modo, durante la entrada de datos, la configuración del teclado cambia automáticamente cuando este campo tiene el foco.
-
-Por defecto, el objeto utiliza la disposición actual del teclado.
-
-> También puede configurar y obtener el teclado dinámicamente utilizando los comandos `OBJECT SET KEYBOARD LAYOUT` y `OBJECT Get keyboard layout`.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ---------------------------------------------------------------------------------------------- |
-| keyboardDialect | text | Código del lenguaje, por ejemplo "ar-ma" o "cs". Ver RFC3066, ISO639 e ISO3166 |
-
-#### Objetos soportados
-
-[Áreas 4D Write Pro](writeProArea_overview.md) - [Área de entrada](input_overview.md)
-
----
-
-## Multilínea
-
-Esta propiedad está disponible para [objetos de entrada](input_overview.md) que contienen expresiones de tipo Texto y campos de tipo Alfa y Texto. Puede tener tres valores diferentes: Sí, No, Automático (por defecto).
-
-#### Automático
-
-- En las entradas de una línea, las palabras situadas al final de las líneas se truncan y no hay retornos de línea.
-- En las entradas multilínea, 4D realiza retornos de línea automáticos:\
- 
-
-#### No
-
-- En las entradas de una línea, las palabras situadas al final de las líneas se truncan y no hay retornos de línea.
-- Nunca hay retornos de línea: el texto siempre se muestra en una sola línea. Si el campo o variable Alfa o Texto contiene retornos de carro, el texto situado después del primer retorno de carro se elimina en cuanto se modifica el área:\
- 
-
-#### Sí
-
-Cuando se selecciona este valor, la propiedad es gestionada por la opción [Retorno de línea](properties_Display.md#wordwrap).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ------------------------------------------------------------------------- |
-| multilínea | text | "yes", "no", "automatic" (por defecto si no se define) |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md)
-
----
-
-## Marcador
-
-4D puede mostrar texto con marcador de posición en los campos de sus formularios.
-
-El texto del marcador de posición aparece como texto de marca de agua en un campo, suministrando un mensaje de ayuda, una indicación o un ejemplo de los datos que deben introducirse. Este texto desaparece tan pronto como el usuario ingrese un caracter en el área:
-
-
-
-El texto del marcador de posición vuelve a aparecer si se borra el contenido del campo.
-
-Se puede mostrar un marcador de posición para los siguientes tipos de datos:
-
-- cadena (text o alpha)
-- fecha y hora en que se activa la propiedad **Blank if null**.
-
-Puede utilizar una referencia XLIFF en la forma ":xliff:resname" como marcador de posición, por ejemplo:
-
-:xliff:PH_Lastname
-
-Sólo se pasa la referencia en el campo "Marcador de posición"; no es posible combinar una referencia con texto estático.
-
-> También puedes definir y obtener el texto del marcador de posición por programación utilizando los comandos [`OBJECT SET PLACEHOLDER`](../commands-legacy/object-set-placeholder.md) y [`OBJECT Get placeholder`](../commands-legacy/object-get-placeholder.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | -------------------------------------------------------------------------------------- |
-| placeholder | string | Texto a mostrar (en gris) cuando el objeto no contiene ningún valor |
-
-#### Objetos soportados
-
-[Combo Box](comboBox_overview.md) - [Área de entrada](input_overview.md)
-
-#### Ver también
-
-[Mensaje de ayuda](properties_Help.md)
-
----
-
-## Selección siempre visible
-
-Esta propiedad mantiene la selección visible dentro del objeto después de haber perdido el foco. Esto facilita la implementación de interfaces que permiten modificar el estilo del texto (ver [Multi estilo](properties_Text.md#multi-style)).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------- |
-| showSelection | boolean | true, false |
-
-#### Objetos soportados
-
-[Áreas 4D Write Pro](writeProArea_overview.md) - [Área de entrada](input_overview.md)
-
----
-
-## Atajo
-
-Esta propiedad permite definir teclas de significado especial (atajos de teclado) para los [botones](button_overview.md), los [botones radio](radio_overview.md) y las [casillas de selección](checkbox_overview.md). Permiten al usuario utilizar el control utilizando el teclado en lugar de tener que utilizar el ratón.
-
-Puede configurar esta opción haciendo clic en [...] en la propiedad Accesos directos de la Lista de propiedades.
-
-
-
-> También puede asignar un acceso directo a un comando de menú personalizado. Si hay un conflicto entre dos accesos directos, el objeto activo tiene prioridad. Para más información sobre cómo asociar accesos directos a los menús, consulte [Configuración de las propiedades de los menús](../Menus/properties.md).
-
-Para ver una lista de todos los métodos abreviados utilizados en el entorno Diseño de 4D, consulte la [página Atajos](../Preferences/shortcuts.md) en la caja de diálogo Preferencias.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| shortcutAccel | boolean | true, false (Windows: Ctrl/macOS: Command) |
-| shortcutAlt | boolean | true, false |
-| shortcutControl | boolean | true, false (macOS: Control) |
-| shortcutShift | boolean | true, false |
-| | | |
-| shortcutKey | string |
|
-
-#### Objetos soportados
-
-[Button](button_overview.md) - [Check Box](checkbox_overview.md) - [Picture Button](pictureButton_overview.md) - [Radio Button](radio_overview.md)
-
----
-
-## Edición con un solo clic
-
-Permite el paso directo al modo de edición en list boxes.
-
-Cuando esta opción está activada, las celdas del list box cambian al modo de edición tras un solo clic del usuario, independientemente de si esta área del list box estaba seleccionada de antemano o no. Cuando esta opción está activada, las celdas del list box cambian al modo de edición tras un solo clic del usuario, independientemente de si esta área del list box estaba seleccionada de antemano o no.
-
-Cuando esta opción no está activa, los usuarios deben seleccionar primero la línea de celdas y luego, hacer clic en una celda para editar su contenido.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ---------------- |
-| singleClickEdit | boolean | true, false |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Footers.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Footers.md
deleted file mode 100644
index b5af1b14212e31..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Footers.md
+++ /dev/null
@@ -1,65 +0,0 @@
----
-id: propertiesFooters
-title: Pies
----
-
-## Mostrar pies
-
-Esta propiedad se utiliza para mostrar u ocultar [los pies de columna listbox](listbox_overview.md#list-box-footers). Hay un pie de página por columna; cada pie de página se configura por separado.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ---------------- |
-| showFooters | boolean | true, false |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Altura
-
-Esta propiedad se utiliza para definir la altura de línea de un pie de list box en **píxeles** o **líneas de texto** (cuando se muestra). Ambos tipos de unidades pueden utilizarse en el mismo list box:
-
-- *Píxel* - el valor de la altura se aplica directamente a la línea en cuestión, independientemente del tamaño de la fuente contenida en las columnas. Si una fuente es demasiado grande, el texto se trunca. Además, las imágenes se truncan o cambian de tamaño según su formato.
-
-- *Línea* - la altura se calcula teniendo en cuenta el tamaño de la fuente de la línea en cuestión.
- - Si se define más de un tamaño, 4D utiliza el mayor. Por ejemplo, si una línea contiene "Verdana 18", "Geneva 12" y "Arial 9", 4D utiliza "Verdana 18" para determinar la altura de la línea (por ejemplo, 25 píxeles). Esta altura se multiplica por el número de líneas definidas.
- - Este cálculo no tiene en cuenta el tamaño de las imágenes ni los estilos aplicados a las fuentes.
- - En macOS, la altura de línea puede ser incorrecta si el usuario introduce caracteres que no están disponibles en la fuente seleccionada. Cuando esto ocurre, se utiliza un tipo de letra sustituto, lo que puede provocar variaciones en el tamaño.
-
-> Esta propiedad también puede definirse dinámicamente mediante el comando [LISTBOX SET FOOTERS HEIGHT](../commands-legacy/listbox-set-footers-height.md).
-
-Conversión de unidades: cuando se pasa de una unidad a otra, 4D las convierte automáticamente y muestra el resultado en la Lista de propiedades. Por ejemplo, si la fuente utilizada es "Lucida grande 24", una altura de "1 línea" se convierte en "30 píxeles" y una altura de "60 píxeles" se convierte en "2 líneas".
-
-Tenga en cuenta que la conversión de ida y vuelta puede conducir a un resultado final diferente del valor inicial debido a los cálculos automáticos realizados por 4D. Esto se ilustra en las siguientes secuencias:
-
-*(fuente Arial 18)*: 52 píxeles -> 2 líneas -> 40 píxeles
-*(font Arial 12)*: 3 píxeles -> 0,4 línea redondeada a 1 línea -> 19 píxeles
-
-#### Ejemplo JSON
-
-```
- "List Box": {
- "type": "listbox",
- "showFooters": true,
- "footerHeight": "44px",
- ...
- }
-```
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ----------------------------------------------------- |
-| footerHeight | string | decimales positivos +px | em |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
-#### Ver también
-
-[Encabezados](properties_Headers.md) - [Pies List box](listbox_overview.md#list-box-footers)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Gridlines.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Gridlines.md
deleted file mode 100644
index 8f77300a86d0da..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Gridlines.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-id: propertiesGridlines
-title: Rejillas
----
-
-## Color líneas horizontales
-
-Define el color de las líneas horizontales de un list box (gris por defecto).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------------- | -------------- | ------------------------------------------ |
-| horizontalLineStroke | color | Todo valor CSS, "transparent", "automatic" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Color líneas verticales
-
-Define el color de las líneas verticales de un list box (gris por defecto).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------ | -------------- | ------------------------------------------ |
-| verticalLineStroke | color | Todo valor CSS, "transparent", "automatic" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Headers.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Headers.md
deleted file mode 100644
index cc319099855ebf..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Headers.md
+++ /dev/null
@@ -1,65 +0,0 @@
----
-id: propertiesHeaders
-title: Encabezados
----
-
-## Mostrar encabezados
-
-Esta propiedad se utiliza para mostrar u ocultar [los encabezados de columna listbox](listbox_overview.md#list-box-headers). Hay un encabezado por columna; cada encabezado se configura por separado.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ---------------- |
-| showHeaders | boolean | true, false |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Altura
-
-Esta propiedad se utiliza para definir la altura de línea de un encabezado de list box en **píxeles** o **líneas de texto** (cuando se muestra). Ambos tipos de unidades pueden utilizarse en el mismo list box:
-
-- *Píxel* - el valor de la altura se aplica directamente a la línea en cuestión, independientemente del tamaño de la fuente contenida en las columnas. Si una fuente es demasiado grande, el texto se trunca. Además, las imágenes se truncan o cambian de tamaño según su formato.
-
-- *Línea* - la altura se calcula teniendo en cuenta el tamaño de la fuente de la línea en cuestión.
- - Si se define más de un tamaño, 4D utiliza el mayor. Por ejemplo, si una línea contiene "Verdana 18", "Geneva 12" y "Arial 9", 4D utiliza "Verdana 18" para determinar la altura de la línea (por ejemplo, 25 píxeles). Esta altura se multiplica por el número de líneas definidas.
- - Este cálculo no tiene en cuenta el tamaño de las imágenes ni los estilos aplicados a las fuentes.
- - En macOS, la altura de línea puede ser incorrecta si el usuario introduce caracteres que no están disponibles en la fuente seleccionada. Cuando esto ocurre, se utiliza un tipo de letra sustituto, lo que puede provocar variaciones en el tamaño.
-
-> > This property can also be set dynamically using the [LISTBOX SET HEADERS HEIGHT](../commands-legacy/listbox-set-headers-height.md) command.
-
-Conversión de unidades: cuando se pasa de una unidad a otra, 4D las convierte automáticamente y muestra el resultado en la Lista de propiedades. Por ejemplo, si la fuente utilizada es "Lucida grande 24", una altura de "1 línea" se convierte en "30 píxeles" y una altura de "60 píxeles" se convierte en "2 líneas".
-
-Tenga en cuenta que la conversión de ida y vuelta puede conducir a un resultado final diferente del valor inicial debido a los cálculos automáticos realizados por 4D. Esto se ilustra en las siguientes secuencias:
-
-- (fuente Arial 18)\*: 52 píxeles -> 2 líneas -> 40 píxeles
-- (fuente Arial 12)\*: 3 píxeles -> 0,4 línea redondeada a 1 línea -> 19 píxeles
-
-#### Ejemplo JSON
-
-```
- "List Box": {
- "type": "listbox",
- "showHeaders": true,
- "headerHeight": "22px",
- ...
- }
-```
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ----------------------------------------------------- |
-| headerHeight | string | decimales positivos +px | em |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
-#### Ver también
-
-[Pies](properties_Footers.md) - [Encabezados List box](listbox_overview.md#list-box-headers)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Help.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Help.md
deleted file mode 100644
index 35aa82bc712a64..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Help.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: propertiesHelp
-title: Ayuda
----
-
-## Mensaje de ayuda
-
-Esta propiedad permite asociar los mensajes de ayuda a los objetos activos de sus formularios. Se pueden mostrar en ejecución:
-
-
-
-> - El retardo de la visualización y la duración máxima de los mensajes de ayuda pueden controlarse utilizando los selectores `Tips delay` y `Tips duration` del comando **[SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md)**.
-> - Los mensajes de ayuda se pueden deshabilitar o habilitar globalmente para la aplicación utilizando el selector del comando [**SET DATABASE PARAMETER**](../commands-legacy/set-database-parameter.md).
-
-Puede:
-
-- designar un mensajes de ayuda existente, previamente especificado en el editor de [mensajes de ayuda](https://doc.4d.com/4Dv20/4D/20.2/Help-tips.200-6750100.en.html) de 4D.
-- o introducir el mensaje de ayuda directamente como una cadena. Esto le permite aprovechar la arquitectura XLIFF. Aquí puede introducir una referencia XLIFF para mostrar un mensaje en el lenguaje de la aplicación (para más información sobre XLIFF, consulte el [Apéndice B: Arquitectura XLIFF](https://doc.4d.com/4Dv20/4D/20.2/Appendix-B-XLIFF-architecture.300-6750166.en.html). También puede utilizar referencias 4D ([ver Uso de referencias en texto estático](https://doc.4d.com/4Dv20/4D/20.2/Using-references-in-static-text.300-6750154.en.html)).
-
-> > In macOS, displaying help tips is not supported in pop-up type windows.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :-----: | :------------: | -------------------------------------------- |
-| tooltip | text | información adicional para ayudar al usuario |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Combo Box](comboBox_overview.md) - [Lista jerárquica](list_overview.md) - [Encabezado de lista de List Box](listbox_overview.md#list-box-headers) - [Pie de lista de List Box](listbox_overview.md#list-box-footers) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Botón de opción](radio_overview.md)
-
-#### Otras funcionalidades de ayuda
-
-También puede asociar los mensajes de ayuda a los objetos formulario de otras dos maneras:
-
-- a nivel de la estructura de la base de datos (sólo campos). En este caso, la ayuda del campo se muestra en todos los formularios en los que aparece. Para más información, consulte "Consejos de ayuda" en [Propiedades de los campos](https://doc.4d.com/4Dv20/4D/20.2/Field-properties.300-6750280.en.html#3367486).
-- utilizando el comando **[OBJECT SET HELP TIP](../commands-legacy/object-set-help-tip.md)**, para el proceso actual.
-
-Cuando se asocian consejos diferentes a un mismo objeto en varias ubicaciones, se aplica el siguiente orden de prioridad:
-
-1. nivel de estructura (prioridad más baja)
-2. editor de formulario
-3. Comando **[OBJECT SET HELP TIP](../commands-legacy/object-set-help-tip.md)** (alta prioridad)
-
-#### Ver también
-
-[Marcador de posición](properties_Entry.md#placeholder)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Hierarchy.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Hierarchy.md
deleted file mode 100644
index f76dbcfe526727..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Hierarchy.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-id: propertiesHierarchy
-title: Jerarquía
----
-
-## List box jerárquico
-
-`List boxes de tipo array`
-
-Esta propiedad especifica que el list box debe mostrarse en forma jerárquica. En el formulario JSON, esta función se activa [cuando el valor de la propiedad *dataSource* es un array](properties_Object.md#array-list-box), es decir, una colección.
-
-Las opciones adicionales (**Variable 1...10**) están disponibles cuando se selecciona la opción *List box jerárquico*, correspondiente a cada elemento del array *dataSource* a utilizar como columna de ruptura. Cada vez que se introduce un valor en un campo, se añade una nueva línea. Se pueden especificar hasta 10 variables. Estas variables definen los niveles jerárquicos a mostrar en la primera columna.
-
-Ver [List box jerárquicos](listbox_overview.md#hierarchical-list-boxes)
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ------------------------------------------------------- |
-| datasource | array cadena | Colección de nombres de arrays que definen la jerarquía |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_ListBox.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_ListBox.md
deleted file mode 100644
index 96bedf4e5a266e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_ListBox.md
+++ /dev/null
@@ -1,241 +0,0 @@
----
-id: propertiesListBox
-title: List Box
----
-
----
-
-## Columnas
-
-Colección de columnas del list box.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------- | ---------------------------- | ---------------------------------------------------- |
-| columns | colección de objetos columna | Contiene las propiedades de las columnas de list box |
-
-Para ver una lista de las propiedades que soportan los objetos columna, consulte la sección [Propiedades específicas de la columna](listbox_overview.md#column-specific-properties).
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Nombre formulario detallado
-
-`List box del tipo selección`
-
-Especifica el formulario que se utilizará para modificar o mostrar los registros individuales del list box.
-
-Se muestra el formulario especificado:
-
-- cuando se utilizan las acciones estándar `Add Subrecord` y `Edit Subrecord` aplicadas al list box (ver [Utilización de las acciones estándar](https://doc.4d.com/4Dv20/4D/20.2/Standard-actions.300-6750239.en.html)),
-- cuando se hace doble clic en una línea y la propiedad [Doble clic en la línea ](#double-click-on-row)está definida en "Editar registro" o "Mostrar registro".
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| detailForm | string |
Nombre (cadena) de la tabla o formulario proyecto
Ruta POSIX (cadena) a un archivo .json que describe el formulario
Objeto que describe el formulario
|
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Doble clic en línea
-
-`List box del tipo selección`
-
-Define la acción a realizar cuando un usuario haga doble clic en una línea en el list box. Las opciones disponibles son:
-
-- **No hacer nada** (por defecto): hacer doble clic en una línea no desencadena ninguna acción automática.
-- **Editar registro**: al hacer doble clic en una línea se muestra el registro correspondiente en el formulario detallado definido [ para el list box](#detail-form-name). El registro se abre en modo de lectura-escritura para que pueda ser modificado.
-- **Mostrar registro**: idéntica a la acción anterior, salvo que el registro se abre en modo de sólo lectura para que no pueda ser modificado.
-
-> > Double-clicking an empty row is ignored in list boxes.
-
-Independientemente de la acción seleccionada/elegida, se genera el evento de formulario `On Double clicked`.
-
-Para las dos últimas acciones, también se genera el evento de formulario `On Open Detail`. `On Close Detail` se genera cuando un registro mostrado en el formulario detallado asociado al list box está a punto de cerrarse (independientemente de que el registro se haya modificado o no).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------------------- | -------------- | ----------------------------------- |
-| doubleClickInRowAction | string | "editSubrecord", "displaySubrecord" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Highlight Set {#highlight-set}
-
-`List box del tipo selección`
-
-Esta propiedad se utiliza para especificar el conjunto a utilizar para gestionar los registros resaltados en el list box (cuando se selecciona la fuente de datos **Arrays**, se utiliza un conjunto booleano con el mismo nombre que el list box).
-
-4D crea un conjunto por defecto llamado *ListBoxSetN* donde *N* empieza en 0 y se incrementa según el número de list boxes en el formulario. Si es necesario, puede modificar el conjunto por defecto. Puede ser un conjunto local, proceso o interproceso (recomendamos utilizar un conjunto local, por ejemplo *$LBSet*, para limitar el tráfico de red). A continuación, 4D lo mantiene automáticamente. Si el usuario selecciona una o varias líneas en el list box, el conjunto se actualiza inmediatamente. Si desea seleccionar una o varias líneas por programación, puede aplicar a este conjunto los comandos del tema "Conjuntos".
-
-> - El estado de resaltado de las líneas del list box y el estado de resaltado de los registros de la tabla son completamente independientes.
-> - Si la propiedad "Conjunto resaltado" no contiene un nombre, no será posible realizar selecciones en el list box.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ------------------- |
-| highlightSet | string | Nombre del conjunto |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Columnas bloqueadas y columnas estáticas
-
-Las columnas bloqueadas y las columnas estáticas son dos funcionalidades distintas e independientes en los list boxes:
-
-- Las columnas bloqueadas siempre se muestran a la izquierda del list box; no se desplazan horizontalmente.
-- Las columnas estáticas no pueden moverse arrastrándolas y soltándolas dentro del list box.
-
-> Puede definir columnas estáticas y bloqueadas por programación, consulte la sección "List Box" en el manual *de Lenguaje 4D*.
-
-Estas propiedades interactúan de la siguiente manera:
-
-- Si define columnas que sólo son estáticas, no se pueden mover.
-
-- Si define columnas bloqueadas pero no estáticas, puede seguir cambiando su posición libremente dentro del área bloqueada. Sin embargo, una columna bloqueada no puede moverse fuera de esta área bloqueada.
-
-
-
-- Si define todas las columnas del área bloqueada como estáticas, no podrá mover estas columnas dentro del área bloqueada.
-
-
-
-- Puede definir una combinación de columnas bloqueadas y estáticas según sus necesidades. Por ejemplo, si define tres columnas bloqueadas y una columna estática, el usuario puede intercambiar las dos columnas situadas más a la derecha dentro del área bloqueada (ya que sólo la primera columna es estática).
-
-### Número de columnas bloqueadas
-
-Número de columnas que deben permanecer visualizadas permanentemente en la parte izquierda del list box, incluso cuando el usuario se desplaza horizontalmente por las columnas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------- | -------------- | ------------------------- |
-| lockedColumnCount | integer | mínimo: 0 |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
-### Número de columnas estáticas
-
-Número de columnas que no se pueden mover durante la ejecución.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------- | -------------- | ------------------------- |
-| staticColumnCount | integer | mínimo: 0 |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Número de columnas
-
-Define el número de columnas del list box.
-
-> Puede añadir o eliminar columnas dinámicamente por programación, utilizando comandos como [`LISTBOX INSERT COLUMN`](../commands-legacy/listbox-insert-column.md) o [`LISTBOX DELETE COLUMN`](../commands-legacy/listbox-delete-column.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ------------------------- |
-| columnCount | integer | mínimo: 1 |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Row Control Array {#row-control-array}
-
-`List box de tipo array`
-
-Un array 4D que controla la visualización de las líneas del list box.
-
-Puede definir las propiedades de interfaz "oculta", "desactivada" y "seleccionable" para cada línea de un list box basado en arrays utilizando este array. También puede ser designado utilizando el comando `LISTBOX SET ARRAY`.
-
-El array de control de líneas debe ser de tipo Longint e incluir el mismo número de líneas que el list box. Cada elemento del *Array de control de líneas* define el estado de la interfaz de su línea correspondiente en el list box. Hay tres propiedades de interfaz disponibles utilizando constantes en el tema de constantes "List Box":
-
-| Constante | Valor | Comentario |
-| ------------------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| lk row is disabled | 2 | La línea correspondiente está desactivada. El texto y los controles, como las casillas de selección, aparecen atenuados o en gris. Las áreas de entrada de texto introducibles ya no lo son. Valor por defecto: Activado |
-| lk row is hidden | 1 | La línea correspondiente está oculta. Ocultar las líneas sólo afecta a la visualización del list box. Las líneas ocultas siguen presentes en los arrays y pueden gestionarse por programación. Los comandos de lenguaje, más concretamente `LISTBOX Get number of rows` o `LISTBOX GET CELL POSITION`, no tienen en cuenta el estado mostrado/oculto de las líneas. Por ejemplo, en un list box con 10 líneas en el que las 9 primeras líneas están ocultas, `LISTBOX Get number of rows` devuelve 10. Desde el punto de vista del usuario, la presencia de líneas ocultas en un list box no es visiblemente perceptible. Sólo pueden seleccionarse las líneas visibles (por ejemplo, utiliznado el comando Seleccionar todo). Valor por defecto: Visible |
-| lk row is not selectable | 4 | La línea correspondiente no es seleccionable (no es posible resaltarla). Las áreas de entrada de texto ya no se pueden modificar a menos que esté activada la opción [Single-Click Edit](properties_Entry.md#single-click-edit). Sin embargo, los controles como las casillas de verificación y las listas siguen siendo funcionales. Esta configuración se ignora si el modo de selección del list box es "Ninguno". Valor por defecto: Seleccionable |
-
-Para cambiar el estado de una línea, basta con definir la(s) constante(s) adecuada(s) en el elemento array correspondiente. Por ejemplo, si no quiere que la línea #10 sea seleccionable, puede escribir:
-
-```4d
- aLControlArr{10}:=lk row is not selectable
-```
-
-
-
-Puede definir varias propiedades de la interfaz a la vez:
-
-```4d
- aLControlArr{8}:=lk row is not selectable + lk row is disabled
-```
-
-
-
-Tenga en cuenta que la configuración de las propiedades de un elemento anula cualquier otro valor de este elemento (si no se restablece). Por ejemplo:
-
-```4d
- aLControlArr{6}:=lk row is disabled + lk row is not selectable
- //define la línea 6 como desactivada Y no seleccionable
- aLControlArr{6}:=lk row is disabled
- //define la línea 6 como desactivada pero seleccionable nuevamente
-```
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------------- | -------------- | ------------------------------------- |
-| rowControlSource | string | Nombre del array de control de líneas |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Modo de selección
-
-Designa la opción para permitir a los usuarios seleccionar líneas:
-
-- **Ninguna**: las líneas no se pueden seleccionar si se elige este modo. Hacer clic en la lista no tendrá ningún efecto a menos que la opción [Edición con un solo clic](properties_Entry.md#single-click-edit) esté activada. Las teclas de navegación sólo hacen que la lista se desplace; no se genera el evento de formulario `On Selection Change`.
-- **Simple**: en este modo se puede seleccionar una línea a la vez. Si hace clic en una línea, la seleccionará. Un **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en una fila cambia su estado (entre seleccionado o no).
- Las teclas de flecha arriba y abajo seleccionan el registro anterior/siguiente en la lista. Las otras teclas de navegación se desplazan por la lista. El evento de formulario `On Selection Change` se genera cada vez que se cambia la línea actual.
-- **Múltiple**: en este modo se pueden seleccionar varias líneas simultáneamente.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------------------- |
-| selectionMode | string | "multiple", "single", "none" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Object.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Object.md
deleted file mode 100644
index ef4a80765f771e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Object.md
+++ /dev/null
@@ -1,337 +0,0 @@
----
-id: propertiesObject
-title: Objetos
----
-
----
-
-## Tipo
-
-`PARÁMETRO OBLIGATORIO`
-
-Esta propiedad designa el tipo del [objeto formulario activo o inactivo](formObjects_overview.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| type | string | "button", "buttonGrid", "checkbox", "combo", "dropdown", "groupBox", "input", "line", "list", "listbox", "oval", "picture", "pictureButton", "picturePopup", "plugin", "progress", "radio", "rectangle", "ruler", "spinner", "splitter", "stepper", "subform", "tab", "text", "view", "webArea", "write" |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Spinner](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Nombre del objeto
-
-Cada objeto de formulario activo está asociado a un nombre de objeto. Cada nombre de objeto debe ser único.
-
-> Los nombres de objetos están limitados a un tamaño de 255 bytes.
-
-Al utilizar el lenguaje de 4D, puede referirse a un objeto formulario activo por su nombre de objeto (ver los comandos [Object (Forms)](../category/object-forms)).
-
-Para más información sobre las reglas de denominación de los objetos de formulario, consulte la sección [Identificadores](Concepts/identifiers.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------------------------------------------------------- |
-| name | string | Todo nombre permitido que no pertenezca a un objeto ya existente |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md#overview) - [List Box](listbox_overview.md#overview) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Botón con imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md#overview) - [Indicador de progreso](progressIndicator.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Botón de opción](radio_overview.md) - [Subformulario](subform_overview.md#overview) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Guardar valor
-
-Esta propiedad está disponible cuando la opción [Guardar geometría](FormEditor/properties_FormProperties.md#save-geometry) está marcada para el formulario.
-
-Esta funcionalidad sólo es soportada con los objetos que contribuyen a la geometría general del formulario. Por ejemplo, esta opción está disponible para las casillas de verificación porque su valor puede utilizarse para ocultar o mostrar áreas adicionales en la ventana.
-
-Esta es la lista de objetos cuyo valor se puede guardar:
-
-| Object | Valor guardado |
-| ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
-| [Casilla de verificación](checkbox_overview.md) | Valor de la variable asociada (0, 1, 2) |
-| [Lista desplegable](dropdownList_Overview.md) | Número de línea seleccionada |
-| [Botón de radio](radio_overview.md) | Valor de la variable asociada (1, 0, True o False para los botones de acuerdo a su tipo) |
-| [Control de pestañas](tabControl.md) | Número de pestaña seleccionada |
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------- |
-| memorizeValue | boolean | true, false |
-
-#### Objetos soportados
-
-[Casilla de selección](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Botón de radio](radio_overview.md) - [Control de pestañas](tabControl.md)
-
----
-
-## Variable o expresión
-
-> Ver también **[Expression](properties_DataSource.md#expression)** para las columnas de list box de tipo selección y colección.
-
-Esta propiedad especifica la fuente de los datos. Cada objeto de formulario activo está asociado a un nombre de objeto y a un nombre de variable. El nombre de la variable puede ser diferente del nombre del objeto. En el mismo formulario, puede utilizar la misma variable varias veces, mientras que cada [nombre de objeto](#object-name) debe ser único.
-
-> El tamaño del nombre de la variable está limitado a 31 bytes. Consulte la sección [Identificadores](Concepts/identifiers.md) para obtener más información sobre las reglas de asignación de nombres.
-
-Las variables de los objetos del formulario permiten controlar y supervisar los objetos. Por ejemplo, cuando se presiona un botón, su variable se pone en 1; el resto del tiempo, en 0. La expresión asociada a un indicador de progreso permite leer y modificar el parámetro actual.
-
-Las variables o expresiones se pueden introducir o no y pueden recibir datos de tipo Texto, Entero, Numérico, Fecha, Hora, Imagen, Booleano u Objeto.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| dataSource | cadena o array de cadenas |
Variable 4D, nombre de campo o cualquier expresión.
Cadena vacía para [variables dinámicas](#dynamic-variables).
Array de cadenas (colección de nombres de arrays) para una columna de [listbox jerárquico](listbox_overview.md#hierarchical-list-boxes)
|
-
-### Expresiones
-
-Puede utilizar una [expresión](Concepts/quick-tour.md#expressions) como fuente de datos para un objeto. Se permite toda expresión 4D válida: expresión simple, propiedad de objeto, fórmula, función 4D, nombre de método proyecto o campo que utilice la sintaxis estándar `[Table]Field`. La expresión se evalúa cuando se ejecuta el formulario y se reevalúa para cada evento del formulario. Tenga en cuenta que las expresiones pueden ser [asignables o no asignables](Concepts/quick-tour.md#expressions).
-
-> Si el valor introducido corresponde a la vez a un nombre de variable y a un nombre de método, 4D considera que está indicando el método.
-
-### Variables dinámicas
-
-Puede dejarle a 4D crear variables asociadas con los objetos de su formulario (botones, variables editables, casillas de verificación, etc.) dinámicamente y de acuerdo a sus necesidades. Para ello, basta con dejar en blanco la propiedad "Variable o expresión" (o el campo JSON de `dataSource`).
-
-Cuando una variable no tiene nombre, al cargar el formulario, 4D crea una nueva variable para el objeto, con un nombre calculado que es único en el espacio de las variables de proceso del intérprete (lo que significa que este mecanismo puede utilizarse incluso en modo compilado). Esta variable temporal se destruirá cuando se cierre el formulario.
-Para que este principio funcione en modo compilado, es imprescindible que las variables dinámicas estén explícitamente declaradas. Hay dos maneras de hacer esto:
-
-- Puede definir el tipo utilizando la propiedad [tipo de expresión](#expression-type).
-- Puede utilizar un código de inicialización específico cuando se carga el formulario que utilice, por ejemplo, el comando `VARIABLE TO VARIABLE`:
-
-```4d
- If(Form event code=On Load)
- var $init : Text
- $Ptr_object:=OBJECT Get pointer(Object named;"comments")
- $init:=""
- VARIABLE TO VARIABLE(Current process;$Ptr_object->;$init)
- End if
-```
-
-En el código 4D, se puede acceder a las variables dinámicas utilizando un puntero obtenido con el comando `OBJECT Get pointer`. Por ejemplo:
-
-```4d
- // asigna la hora 12:00:00 a la variable para el objeto "tstart"
- $p :=OBJECT Get pointer(Object named;"tstart")
- $p->:=?12:00:00?
-```
-
-Este mecanismo tiene dos ventajas:
-
-- Por un lado, permite desarrollar componentes de tipo "subformulario" que pueden utilizarse varias veces en el mismo formulario local. Tomemos como ejemplo el caso de un subformulario datepicker que se inserta dos veces en un formulario anfitrión para definir una fecha de inicio y una fecha de fin. Este subformulario utilizará objetos para elegir la fecha del mes y del año. Será necesario que estos objetos trabajen con variables diferentes para la fecha de inicio y la fecha final. Dejar que 4D cree su variable con un nombre único es una forma de resolver esta dificultad.
-- Por otra parte, puede utilizarse para limitar el uso de la memoria. De hecho, los objetos formulario sólo funcionan con variables proceso o interproceso. Sin embargo, en el modo compilado, se crea una instancia de cada variable de proceso en todos los procesos, incluidos los procesos del servidor. Esta instancia ocupa memoria, incluso cuando el formulario no se utiliza durante la sesión. Por lo tanto, dejar que 4D cree variables dinámicamente al cargar los formularios puede ahorrar memoria.
-
-### List box array
-
-Para un list box array, la propiedad **Variable o Expresión** normalmente contiene el nombre de la variable array definida para el list box y para cada columna. Sin embargo, puede utilizar un array de cadenas (que contenga nombres de arrays) como *dataSource* valor de una columna list box para definir un [list box jerárquico](listbox_overview.md#hierarchical-list-boxes).
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
-
----
-
-## Tipo de expresión
-
-> Esta propiedad se denomina [**Tipo de datos**](properties_DataSource.md#data-type-expression-type) en la Lista de propiedades para [selección](listbox_overview.md#selection-list-boxes) y [colección](listbox_overview.md#collection-or-entity-selection-list-boxes) y para [Listas desplegables](dropdownList_Overview.md) asociadas a un [objeto](FormObjects/dropdownList_Overview.md#using-an-object) o un [array](FormObjects/dropdownList_Overview.md#using-an-array).
-
-Especifique el tipo de datos para la expresión o variable asociada al objeto. Tenga en cuenta que el objetivo principal de este ajuste es configurar las opciones (como los formatos de visualización) disponibles para el tipo de datos. En realidad, no escribe la variable en sí. De cara a la compilación del proyecto, debe [declarar la variable](Concepts/variables.md#declaring-variables).
-
-Sin embargo, esta propiedad tiene una función tipográfica en los siguientes casos específicos:
-
-- **[Variables dinámicas](#dynamic-variables)**: puede utilizar esta propiedad para declarar el tipo de variables dinámicas.
-- **[Columnas List Box ](listbox_overview.md#list-box-columns)**: esta propiedad se utiliza para asociar un formato de visualización a los datos de la columna. Los formatos suministrados dependerán del tipo de variable (list box de tipo array) o del tipo dato/campo (list boxes de tipo selección y colección). Los formatos 4D estándar que pueden utilizarse son: Alfa, Numérico, Fecha, Hora, Imagen y Booleano. El tipo Texto no tiene formatos de visualización específicos. Todos los formatos personalizados existentes también están disponibles.
-- **[Variables imagen](input_overview.md)**: puede utilizar este menú para declarar las variables antes de cargar el formulario en modo interpretado. Mecanismos nativos específicos rigen la visualización de variables de imagen en los formularios. Estos mecanismos exigen una mayor precisión a la hora de configurar las variables: a partir de ahora, deberán haber sido declaradas antes de cargar el formulario -es decir, incluso antes del evento de formulario `On Load` - a diferencia de otros tipos de Estos mecanismos exigen una mayor precisión a la hora de configurar las variables: a partir de ahora, deberán haber sido declaradas antes de cargar el formulario -es decir, incluso antes del evento de formulario `On Load` - a diferencia de otros tipos de Estos mecanismos exigen una mayor precisión a la hora de configurar las variables: a partir de ahora, deberán haber sido declaradas antes de cargar el formulario -es decir, incluso antes del evento de formulario `On Load` - a diferencia de otros tipos de To do this, you need either for the statement `var varName : Picture` to have been executed before loading the form (typically, in the method calling the `DIALOG` command), or for the variable to have been typed at the form level using the expression type property.
- De lo contrario, la variable imagen no se mostrará correctamente (sólo en modo interpretado).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------ | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| dataSourceTypeHint | string | **
**columnas de lista:** "boolean", "number", "picture", "text", date", "time". *Sólo para Array/selección list box*: "integer", "object"
|
-
-#### Objetos soportados
-
-[Casilla de verificación](checkbox_overview.md) - [Cuadro combinado](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Selector](spinner.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestaña](tabControl.md)
-
----
-
-## Clase CSS
-
-Lista de palabras separadas por espacios que se utilizan como selectores de clase en los [archivos css](FormEditor/createStylesheet.md#style-sheet-files).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------------------------------------------------------- |
-| class | string | Una cadena con los nombres de los CSS separados por caracteres de espacio |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Botón de opción](radio_overview.md) - [Imagen estática](staticPicture.md) - [Subformulario](subform_overview.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
-
----
-
-## Collection o entity selection
-
-Para utilizar elementos de colección o entidades para definir el contenido de las líneas del list box.
-
-Introduzca una expresión que devuelva una colección o una selección de entidades. Normalmente, introducirá el nombre de una variable, un elemento de una colección o una propiedad que contenga una colección o una selección de entidades.
-
-La colección o la selección de entidades debe estar disponible para el formulario cuando se carga. Cada elemento de la colección o cada entidad de la selección de entidades se asociará a una fila del list box y estará disponible como objeto a través de la palabra clave [`This`](../Concepts/classes.md#this):
-
-- si ha utilizado una colección de objetos, puede llamar a **This** en la expresión de la fuente de datos para acceder a cada valor de propiedad, por ejemplo `This.`.
-- si ha utilizado una selección de entidades, puede llamar a **This** en la expresión de la fuente de datos para acceder a cada valor de atributo, por ejemplo `This.`.
-
-> Si ha utilizado una colección de valores escalares (y no objetos), 4D le permite mostrar cada valor llamando a **This.value** en la expresión datasource. Sin embargo, en este caso no podrá modificar valores ni acceder al objeto actual (ver más adelante).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------------------------------------------------------------------------- |
-| dataSource | string | Expresión que devuelve una colección o una selección de entidades. |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Fuente de datos
-
-Especifique el tipo de list box.
-
-
-
-- **Arrays**(por defecto): utiliza elementos de array como líneas del list box.
-- **Selección actual**: utiliza expresiones, campos o métodos cuyos valores se evaluarán para cada registro de la selección actual de una tabla.
-- **Selección temporal**: utiliza expresiones, campos o métodos cuyos valores se evaluarán para cada registro de una selección temporal.
-- **Colección o Selección de entidades**: utilice elementos de colección o entidades para definir el contenido de las líneas del list box. Tenga en cuenta que con este tipo de list box, debe definir la propiedad [Colección o Selección de entidades](properties_Object.md#collection-or-entity-selection).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------- | -------------- | ----------------------------------------------------------- |
-| listboxType | string | "array", "currentSelection", "namedSelection", "collection" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Tipo de plug-in
-
-Nombre del [área externa del plug-in](pluginArea_overview.md) asociada al objeto. Los nombres de las áreas externas del plug-in.se publican en el archivo manifest.json del plug-in.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | ----------------------------------------------------------------------------------- |
-| pluginAreaKind | string | Nombre del área externa del plug-in (comienza con un carácter %) |
-
-#### Objetos soportados
-
-[Área de plugin](pluginArea_overview.md)
-
----
-
-## Grupo radio
-
-Permite utilizar los botones de radio en conjuntos coordinados: sólo se puede seleccionar un botón a la vez en el conjunto.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------------- |
-| radioGroup | string | Nombre del grupo radio |
-
-#### Objetos soportados
-
-[Botón de radio](radio_overview.md)
-
----
-
-## Título
-
-Permite insertar una etiqueta en un objeto. Se puede especificar la fuente y el estilo de esta etiqueta.
-
-Puede forzar un retorno de carro en la etiqueta utilizando el caracter \ (barra invertida).
-
-
-
-Para insertar un \ en la etiqueta, ingrese "\\".
-
-Por defecto, la etiqueta se coloca en el centro del objeto. Cuando el objeto también contiene un icono, puede modificar la ubicación relativa de estos dos elementos utilizando la propiedad [Posición Título/imagen](properties_TextAndPicture.md#titlepicture-position).
-
-Para la traducción de la aplicación, puede introducir una referencia XLIFF en el área del título de un botón (ver [Apéndice B: arquitectura XLIFF](https://doc.4d.com/4Dv20/4D/20.2/Appendix-B-XLIFF-architecture.300-6750166.en.html)).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------- |
-| text | string | todo texto |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de selección](checkbox_overview.md) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Botón radio](radio_overview.md) - [ÁreaTexto](text.md)
-
----
-
-## Cálculo de variables
-
-Esta propiedad define el tipo de cálculo que se realizará en un área [pie de columna](listbox_overview.md#list-box-footers).
-
-> El cálculo de los pies de página también puede establecerse utilizando el comando 4D [`LISTBOX SET FOOTER CALCULATION`](../commands-legacy/listbox-set-footer-calculation.md).
-
-Hay varios tipos de cálculos disponibles. La tabla siguiente muestra los cálculos que se pueden utilizar según el tipo de datos que se encuentran en cada columna e indica el tipo afectado automáticamente por 4D a la variable de pie de página (si no está escrita por el código):
-
-| Cálculo | Num | Text | Fecha | Time | Bool | Imágenes | tipos de variables de pie de página |
-| ------------------------------------------ | --- | ---- | ----- | ---- | ---- | -------- | ----------------------------------- |
-| Mínimo | X | X | X | X | X | | Igual que el tipo de columna |
-| Máximo | X | X | X | X | X | | Igual que el tipo de columna |
-| Suma | X | | | X | X | | Igual que el tipo de columna |
-| Conteo | X | X | X | X | X | X | Integer |
-| Promedio | X | | | X | | | Real |
-| Desviación estándar(\*) | X | | | X | | | Real |
-| Varianza(\*) | X | | | X | | | Real |
-| Suma de cuadrados(\*) | X | | | X | | | Real |
-| Personalizado ("None ") | X | X | X | X | X | X | Cualquiera |
-
-(\*) Sólo para list boxes de tipo array.
-
-> Sólo las [variables](Concepts/variables.md) declaradas o dinámicas pueden utilizarse para mostrar los cálculos de pie de página. No se soportan otros tipos de [expresiones](Concepts/quick-tour.md#expressions) como `Form.value`.
-
-Los cálculos automáticos ignoran el estado mostrado/oculto de las líneas list box. Si desea restringir un cálculo sólo a las líneas visibles, debe utilizar un cálculo personalizado.
-
-*Null* no se tienen en cuenta para ningún cálculo.
-
-Si la columna contiene distintos tipos de valores (columna basada en colecciones, por ejemplo):
-
-- Promedio y Suma sólo tienen en cuenta elementos numéricos (se ignoran otros tipos de elementos).
-- Mínimo y Máximo devuelven un resultado según el orden habitual de las listas de tipos, tal como se define en la función [collection.sort()](API/CollectionClass.md#sort).
-
-El uso de cálculos automáticos en pies de columnas basados en expresiones tiene las siguientes limitaciones:
-
-- es **soportado** con todos los tipos de list boxes cuando la expresión es "simple" (como `[table]field` o `this.attribute`),
-- se **soporta pero no se recomienda** por razones de rendimiento con list boxes colección/selección de entidades cuando la expresión es "compleja" (distinta de `this.attribute`) y el list box contiene un gran número de líneas,
-- **no se soporta** con list boxes selección actual/selección temporal cuando la expresión es "compleja". Es necesario utilizar cálculos personalizados.
-
-Cuando está configurado **Personalizado** ("none" en JSON), 4D no realiza cálculos automáticos y debe asignar el valor de la variable en esta área por programación.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
-| variableCalculation | string | "none", "minimum", "maximum", "sum", "count", "average", "standardDeviation", "variance", "sumSquare" |
-
-#### Objetos soportados
-
-[Pie de List Box](listbox_overview.md#list-box-footers)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Picture.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Picture.md
deleted file mode 100644
index 6c012ef5737613..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Picture.md
+++ /dev/null
@@ -1,68 +0,0 @@
----
-id: propertiesPicture
-title: Picture
----
-
-## Ruta de acceso
-
-Ruta de una imagen source estática para un [botón imagen](pictureButton_overview.md), [menú emergente de imagen](picturePopupMenu_overview.md), o [imagen estática](staticPicture.md). Debe utilizar la sintaxis POSIX.
-
-Las siguientes ubicaciones pueden utilizarse para las imágenes estáticas:
-
-- en la carpeta **Resources** del proyecto. Apropiado cuando se desea compartir imágenes estáticas entre varios formularios en el proyecto. En este caso, el nombre de la ruta es "/RESOURCES/".
-- en una carpeta de imágenes (por ejemplo, llamada **Images**) dentro de la carpeta del formulario. Apropiado cuando las imágenes estáticas se utilizan sólo en el formulario y/o se quiere poder mover o duplicar todo el formulario dentro del proyecto o de diferentes proyectos. En este caso, el nombre de la ruta es "" y se resuelve desde la raíz de la carpeta del formulario.
-- en una variable imagen 4D. La imagen debe cargarse en la memoria cuando se ejecuta el formulario. En este caso, el nombre de la ruta es "var:".
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :-----: | :------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| picture | text | Ruta relativa o del sistema de archivos en sintaxis POSIX, o "var:" para una variable tipo imagen |
-
-#### Objetos soportados
-
-[Botón imagen](pictureButton_overview.md) - [Menú emergente imagen](picturePopupMenu_overview.md) - [Imagen estática](staticPicture.md)
-
----
-
-## Visualización
-
-### A escala para ajustarse
-
-`Gramática JSON: "scaled"`
-
-El formato **A escala para ajustarse** hace que 4D redimensione la imagen para ajustarla a las dimensiones del área.
-
-
-
-### Replicado
-
-`Gramática JSON: "tiled"`
-
-Cuando se amplía el área que contiene una imagen con el formato **Replicada**, la imagen no se deforma sino que se replica tantas veces como sea necesario para llenar el área por completo.
-
-
-
-Si el campo se reduce a un tamaño menor que el de la imagen original, la imagen queda truncada (no centrada).
-
-### Centrado / Truncado (no centrado)
-
-`Gramática JSON: "truncatedCenter" / "truncatedTopLeft"`
-
-El formato **Centro** hace que 4D centre la imagen en el área y recorte cualquier parte que no quepa dentro del área. 4D recorta por igual desde cada borde y desde la parte superior e inferior.
-
-El formato **Truncado (no centrado)** hace que 4D coloque la esquina superior izquierda de la imagen en la esquina superior izquierda del área y recorte cualquier parte que no quepa dentro del área. 4D corta desde la derecha y desde abajo.
-
-> Cuando el formato de la imagen es **Truncado (no centrado)**, es posible añadir barras de desplazamiento al área de entrada.
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | -------------------------------------------------------- |
-| pictureFormat | string | "scaled", "tiled", "truncatedCenter", "truncatedTopLeft" |
-
-#### Objetos soportados
-
-[Imagen estática](staticPicture.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Print.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Print.md
deleted file mode 100644
index 5741299f925851..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Print.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-id: propertiesPrint
-title: Imprimir
----
-
-## Impresión marco
-
-Esta propiedad gestiona el modo de impresión de los objetos cuyo tamaño puede variar de un registro a otro en función de su contenido. Estos objetos pueden configurarse para imprimirse con un marco fijo o variable. Los objetos de marco fijo se imprimen dentro de los límites del objeto tal y como fue creado en el formulario. Los objetos de marco variable se expanden durante la impresión para incluir todo el contenido del objeto. Tenga en cuenta que el ancho de los objetos impresos como tamaño variable no se ve afectado por esta propiedad; sólo la altura varía automáticamente en función del contenido del objeto.
-
-No se puede colocar más de un objeto de marco variable uno al lado del otro en un formulario. Puede colocar objetos de marco no variable a ambos lados de un objeto que se imprimirá con un tamaño variable siempre que el objeto de marco variable sea al menos una línea más largo que el objeto de al lado y que todos los objetos estén alineados en la parte superior. Si no se respeta esta condición, el contenido de los otros campos se repetirá para cada corte horizontal del objeto marco variable.
-
-> Los comandos `objeto Print` y `Print form` no soportan esta propiedad.
-
-Las opciones de impresión son:
-
-- La opción **Variable** / **Imprimir marco variable** marcada: 4D amplía o reduce el área del objeto del formulario para imprimir todos los subregistros.
-
-- **Opción fija (truncamiento)** / **Imprimir marco variable** no seleccionada: 4D sólo imprime el contenido que aparece en el área del objeto. El formulario sólo se imprime una vez y el contenido no impreso se ignora.
-
-- **Fijo (Múltiples Registros)** (sólo subformularios): se mantiene el tamaño inicial del área del subformulario pero 4D imprime el formulario varias veces para imprimir todos los registros.
-
-> Esta propiedad puede definirse por programación utilizando el comando `OBJECT SET PRINT VARIABLE FRAME`.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :--------: | :------------: | ---------------------------------------------------------------------------------- |
-| printFrame | string | "fixed", "variable", (subformulario únicamente) "fixedMultiple" |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md) - [Subformularios](subform_overview.md) (sólo subformularios lista) - [Áreas 4D Write Pro](writeProArea_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_RangeOfValues.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_RangeOfValues.md
deleted file mode 100644
index 4379dc951d0db6..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_RangeOfValues.md
+++ /dev/null
@@ -1,77 +0,0 @@
----
-id: propertiesRangeOfValues
-title: Rango de valores
----
-
-## Valor por defecto
-
-Puede asignar un valor por defecto para ser introducido en un objeto de entrada. Esta propiedad es útil, por ejemplo, cuando la entrada [fuente de datos](properties_Object.md#variable-or-expression) es un campo: el valor por defecto se introduce cuando se muestra un nuevo registro por primera vez. Puede cambiar el valor a menos que el área de entrada se haya definido como [no editable](properties_Entry.md#enterable).
-
-El valor por defecto sólo puede utilizarse si el [tipo de fuente de datos](properties_Object.md#expression-type) es:
-
-- texto/cadena
-- number/integer
-- date
-- time
-- boolean
-
-4D ofrece sellos para generar valores por defecto para la fecha, la hora y el número de secuencia. La fecha y la hora se toman de la fecha y la hora del sistema. 4D genera automáticamente los números de secuencia necesarios. La siguiente tabla muestra el sello a utilizar para generar valores por defecto de forma automática:
-
-| Stamp | Significado |
-| ----- | ------------------- |
-| #D | Fecha actual |
-| #H | Hora actual |
-| #N | Número de secuencia |
-
-Puede utilizar un número de secuencia para crear un número único para cada registro de la tabla para el archivo de datos actual. Un número de secuencia es un longint que se genera para cada nuevo registro. Los números comienzan en uno (1) y van aumentando de uno en uno. Un número de secuencia no se repite nunca, incluso si el registro al que se asigna se elimina de la tabla. Cada tabla tiene su propio contador interno de números de secuencia. Para más información, consulte el párrafo [Autoincremento](https://doc.4d.com/4Dv20/4D/20.2/Field-properties.300-6750280.en.html#976029).
-
-> No hay que confundir esta propiedad con la propiedad "valores por defecto" que permite llenar una columna list box con valores estáticos.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | ----------------------------------- | --------------------------------------------------------- |
-| defaultValue | string, number, date, time, boolean | Todo valor y/o un sello: "#D", "#H", "#N" |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md)
-
----
-
-## Lista de excluidos
-
-Permite definir una lista cuyos valores no pueden introducirse en el objeto. Si se introduce un valor excluido, no se acepta y se muestra un mensaje de error.
-
-> Si una lista especificada es jerárquica, sólo se tienen en cuenta los elementos del primer nivel.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ----------------------------------------------- |
-| excludedList | lista | Una lista de valores a excluir. |
-
-#### Objetos soportados
-
-[Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Entrada](input_overview.md)
-
----
-
-## Lista requerida
-
-Restringe las entradas válidas a los elementos de la lista. Por ejemplo, es posible que desee utilizar una lista obligatoria para los títulos de los puestos de trabajo, de modo que las entradas válidas se limiten a los títulos que han sido aprobados por la dirección.
-
-La creación de una lista obligatoria no muestra automáticamente la lista cuando se selecciona el campo. Si desea mostrar la lista requerida, asigne la misma lista a la propiedad [Lista de opciones](properties_DataSource.md#choice-list).
-Sin embargo, a diferencia de la propiedad [Lista de selección](properties_DataSource.md#choice-list), cuando se define una lista requerida, ya no es posible la introducción mediante el teclado, sólo se permite la selección de un valor de la lista mediante Si se definen diferentes listas utilizando las propiedades [Lista de selección](properties_DataSource.md#choice-list) y Lista requerida, la propiedad Lista requerida tiene prioridad.
-
-> Si una lista especificada es jerárquica, sólo se tienen en cuenta los elementos del primer nivel.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | -------------------------------------------------- |
-| requiredList | lista | Una lista de valores obligatorios. |
-
-#### Objetos soportados
-
-[Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Entrada](input_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_ResizingOptions.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_ResizingOptions.md
deleted file mode 100644
index 101c994e2213a7..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_ResizingOptions.md
+++ /dev/null
@@ -1,133 +0,0 @@
----
-id: propertiesResizingOptions
-title: Opciones de redimensionamiento
----
-
-## Redimensionamiento columnas auto
-
-Cuando esta propiedad está activada (valor `rightToLeft` en JSON), las columnas del list box se redimensionan automáticamente junto con el list box, dentro de los límites de los anchos [mínimo](properties_CoordinatesAndSizing.md#minimum-width) y [máximo](properties_CoordinatesAndSizing.md#maximum-width) definidos.
-
-Cuando esta propiedad está desactivada (valor `legacy` en JSON), sólo se redimensiona la columna más a la derecha del listbox, aunque su ancho supere el valor máximo definido.
-
-### Cómo funciona el redimensionamiento automático de las columnas
-
-- A medida que el ancho del list box aumenta, sus columnas se amplían, una a una, empezando de derecha a izquierda, hasta que cada una alcanza su [ancho máximo](properties_CoordinatesAndSizing.md#maximum-width). Sólo se redimensionan las columnas con la propiedad [Resizable](#resizable) seleccionada.
-
-- El mismo procedimiento se aplica cuando el ancho del list box disminuye, pero en orden inverso (*es decir,*, las columnas se redimensionan empezando de izquierda a derecha). Cuando cada columna ha alcanzado su [ancho mínimo](properties_CoordinatesAndSizing.md#minimum-width), la barra de desplazamiento horizontal vuelve a activarse.
-
-- Las columnas se redimensionan sólo cuando la barra de desplazamiento horizontal no está "activa"; *es decir,*, todas las columnas son totalmente visibles en el list box en su tamaño actual. **Nota**: si la barra de desplazamiento horizontal está oculta, esto no altera su estado: una barra de desplazamiento puede seguir estando activa, aunque no sea visible.
-
-- Una vez que todas las columnas alcanzan su tamaño máximo, dejan de ampliarse y en su lugar se añade una columna en blanco (falsa) a la derecha para rellenar el espacio extra. Si hay una columna falsa (en blanco), cuando el ancho del list box disminuye, ésta es la primera área que se reduce.
-
-
-
-#### Sobre la columna falsa (en blanco)
-
-La apariencia de la columna falsa coincide con la de las columnas existentes; tendrá un encabezado y/o un pie de página falsos si estos elementos están presentes en las columnas del list box existentes y tendrá aplicados los mismos colores de fondo.
-
-Se puede hacer clic en el encabezado y/o en el pie de página falsos, pero esto no tiene ningún efecto sobre las otras columnas (por ejemplo: no se realiza ninguna ordenación); no obstante, los eventos se generan en consecuencia `On Clicked`, \\\`On Header Cl
-
-Si se hace clic en una celda de la columna falsa, el comando [LISTBOX GET CELL POSITION](../commands-legacy/listbox-get-cell-position.md) devuelve "X+1" para su número de columna (donde X es el número de columnas existent
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ----------------------- |
-| resizingMode | string | "rightToLeft", "legacy" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Dimensionamiento horizontal
-
-Esta propiedad especifica si un objeto debe moverse o redimensionarse horizontalmente cuando un usuario redimensiona el formulario. También puede definirse dinámicamente por el comando del lenguaje `OBJECT SET RESIZING OPTIONS`.
-
-Hay tres opciones disponibles:
-
-| Option | Valor JSON | Resultado |
-| -------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Agrandar | "grow" | El mismo porcentaje se aplica al ancho del objeto cuando el usuario redimensiona el ancho de la ventana, |
-| Mover | "move" | El objeto se desplaza la misma cantidad a la izquierda o a la derecha que el aumento del ancho cuando el usuario redimensiona el ancho de la ventana, |
-| Ninguno | "fixed" | El objeto permanece inmóvil cuando se cambia el tamaño del formulario |
-
-> Esta propiedad funciona junto con la propiedad [Dimensionamiento vertical](#tamaño-vertical).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------- | -------------- | ----------------------- |
-| sizingX | string | "grow", "move", "fixed" |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
-
----
-
-## Dimensionamiento vertical
-
-Esta propiedad especifica si un objeto debe ser movido verticalmente o redimensionado cuando un usuario redimensiona el formulario.También puede definirse dinámicamente por el comando de lenguaje `OBJECT SET RESIZING OPTIONS`.
-
-Hay tres opciones disponibles:
-
-| Option | Valor JSON | Resultado |
-| -------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Agrandar | "grow" | El mismo porcentaje se aplica a la altura del objeto cuando el usuario redimensiona el ancho de la ventana, |
-| Mover | "move" | El objeto se desplaza la misma cantidad hacia arriba o hacia abajo que el aumento de la altura cuando el usuario redimensiona el ancho de la ventana, |
-| Ninguno | "fixed" | El objeto permanece inmóvil cuando se cambia el tamaño del formulario |
-
-> Esta propiedad funciona junto con la propiedad [Dimensionamiento horizontal](#horizontal-sizing).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------- | -------------- | ----------------------- |
-| sizingY | string | "grow", "move", "fixed" |
-
-#### Objetos soportados
-
-[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
-
----
-
-## Pulsador
-
-Cuando un objeto splitter tiene esta propiedad, los otros objetos a su derecha (splitter vertical) o debajo de él (separador horizontal) son empujados al mismo tiempo que el splitter, sin parar.
-
-Este es el resultado de un separador "pusher" que se mueve:
-
-
-
-
-Cuando esta propiedad no se aplica al splitter, el resultado es el siguiente:
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :----------- | :------------: | :------------------------------------------------------------------------: |
-| splitterMode | string | "move" (pusher), "resize" (standard) |
-
-#### Objetos soportados
-
-[Separadores](splitters.md)
-
----
-
-## Redimensionable
-
-Designa si el tamaño de la columna puede ser modificado por el usuario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :-------------- | :------------: | :--------------: |
-| redimensionable | boolean | "true", "false" |
-
-#### Objetos soportados
-
-[Columna de list box](listbox_overview.md#list-box-columns)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Scale.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Scale.md
deleted file mode 100644
index e5aa3dd05719a2..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Scale.md
+++ /dev/null
@@ -1,121 +0,0 @@
----
-id: propertiesScale
-title: Escala
----
-
-## Barber shop
-
-Activa la variante "barber shop" para el termómetro.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :------------: | :------------: | --------------------------------------------------------------------------------- |
-| [max](#máximo) | number | NO pasado = activado; pasado = desactivado (termómetro básico) |
-
-#### Objetos soportados
-
-[Barbería](progressIndicator.md#barber-shop)
-
----
-
-## Mostrar graduación
-
-Muestra/Oculta las graduaciones junto a las etiquetas.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :-------------: | :------------: | ---------------- |
-| showGraduations | boolean | "true", "false" |
-
-#### Objetos soportados
-
-[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md)
-
----
-
-## Paso en la graduación
-
-Medición de la visualización de la escala.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :------------: | :------------: | ------------------------- |
-| graduationStep | integer | mínimo: 0 |
-
-#### Objetos soportados
-
-[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md)
-
----
-
-## Posición de la etiqueta
-
-Especifica la ubicación del texto mostrado de un objeto.
-
-- Ninguno - no se muestra ninguna etiqueta
-- Arriba - Muestra las etiquetas a la izquierda o sobre el indicador
-- Abajo - Muestra las etiquetas a la derecha o debajo de un indicador
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :-------------: | :------------: | ---------------------------------------- |
-| labelsPlacement | string | "none", "top", "bottom", "left", "right" |
-
-#### Objetos soportados
-
-[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md)
-
----
-
-## Máximo
-
-Valor máximo de un indicador.
-
-- Para los steppers numéricos, esta propiedad representa los segundos cuando el objeto está asociado a un valor de tipo hora y se ignoran cuando están asociados a un valor de tipo fecha.
-- Para activar los [termómetros del Barber Shop](progressIndicator.md#barber-shop), esta propiedad debe omitirse.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :----: | :------------: | ---------------- |
-| max | number | Cualquier número |
-
-#### Objetos soportados
-
-[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md) - [Stepper](stepper.md)
-
----
-
-## Mínimo
-
-Valor mínimo de un indicador. Para los steppers numéricos, esta propiedad representa los segundos cuando el objeto está asociado a un valor de tipo hora y se ignoran cuando están asociados a un valor de tipo fecha.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :----: | :------------: | ---------------- |
-| min | number | Cualquier número |
-
-#### Objetos soportados
-
-[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md) - [Stepper](stepper.md)
-
----
-
-## Step
-
-Intervalo mínimo aceptado entre los valores durante el uso. Para los steppers numéricos, esta propiedad representa los segundos cuando el objeto está asociado a un valor de tipo hora y los días cuando está asociado a un valor de tipo fecha.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :----: | :------------: | ------------------------- |
-| step | integer | mínimo: 1 |
-
-#### Objetos soportados
-
-[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md) - [Stepper](stepper.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Subform.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Subform.md
deleted file mode 100644
index 6da59e6c97d55e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Subform.md
+++ /dev/null
@@ -1,172 +0,0 @@
----
-id: propertiesSubform
-title: Subformulario
----
-
----
-
-## Autorizar la eliminación
-
-Especifica si el usuario puede eliminar subregistros en un subformulario listado.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ------------------------------------------------------------------ |
-| deletableInList | boolean | true, false (por defecto: true) |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
-
----
-
-## Formulario detallado
-
-Esta propiedad se utiliza para declarar el formulario detallado que se utilizará en el subformulario. Puede ser:
-
-- un widget, es decir, un subformulario de tipo página dotado de funciones específicas. En este caso, las propiedades [list subform](#list-form) y [Source](#source) deben estar vacías o no estar presentes.
- Puede seleccionar un nombre de formulario de componente cuando se publica en el componente.
-
-> Para ello, basta con hacer dos clics en el campo a modificar para que pase al modo edición (asegúrese de dejar suficiente tiempo entre los dos clics para no generar un doble clic).
-
-- el formulario detallado a asociar al [subformulario listado](#formulario-de-lista). El formulario detallado puede utilizarse para introducir o ver los subregistros. Generalmente contiene más información que el subformulario lista. Naturalmente, el formulario detallado debe pertenecer a la misma tabla que el subformulario. Normalmente se utiliza un formulario de salida como formulario lista y un formulario de entrada como formulario detallado. Si no especifica el formulario a utilizar para la entrada de la página completa, 4D utiliza automáticamente el formato de entrada por defecto de la tabla.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| detailForm | string | Nombre (cadena) de la tabla o formulario proyecto, una ruta POSIX (cadena) a un archivo .json que describa el formulario, o un objeto que describa el formulario |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
-
----
-
-## Doble clic en línea vacía
-
-Acción a realizar en caso de doble clic en una línea vacía de un subformulario listado. Las siguientes opciones están disponibles:
-
-- No hacer nada (por defecto): hacer doble clic en una línea no desencadena ninguna acción automática.
-- Añadir registro: crea un nuevo registro en el subformulario y cambia al modo edición. El registro se creará directamente en la lista si la propiedad [Editable en la lista](#enterable-in-list) está activada. En caso contrario, se creará en modo página, en el [formulario detallado](#detail-form) asociado al subformulario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------------------------- | -------------- | --------------------------------- |
-| doubleClickInEmptyAreaAction | string | "addSubrecord" o "" to do nothing |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
-
-#### Ver también
-
-[Doble clic en la línea](#double-click-on-row)
-
----
-
-## Doble clic en línea
-
-`Sub-formularios lista`
-
-Define la acción a realizar cuando un usuario haga doble clic en una línea en un subformulario lista. Las opciones disponibles son:
-
-- **No hacer nada** (por defecto): hacer doble clic en una línea no desencadena ninguna acción automática.
-- **Editar registro**: al hacer doble clic en una línea se muestra el registro correspondiente en el [formulario detallado](#detail-form) definido para el subformulario lista. El registro se abre en modo de lectura-escritura para que pueda ser modificado.
-- **Mostrar registro**: idéntica a la acción anterior, salvo que el registro se abre en modo de sólo lectura para que no pueda ser modificado.
-
-Independientemente de la acción seleccionada/elegida, se genera el evento de formulario `On Double clicked`.
-
-Para las dos últimas acciones, también se genera el evento de formulario `On Open Detail`. `On Close Detail` se genera cuando un registro mostrado en el formulario detallado asociado al list box está a punto de cerrarse (independientemente de que el registro se haya modificado o no).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------------------- | -------------- | ----------------------------------- |
-| doubleClickInRowAction | string | "editSubrecord", "displaySubrecord" |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
-
-#### Ver también
-
-[Doble clic en la fila vacía](#double-click-on-empty-row)
-
----
-
-## Editable en lista
-
-Cuando un subformulario lista tiene esta propiedad activada, el usuario puede modificar los datos del registro directamente en la lista, sin tener que utilizar el [formulario detallado asociado](#detail-form).
-
-> Para ello, basta con hacer dos clics en el campo a modificar para que pase al modo edición (asegúrese de dejar suficiente tiempo entre los dos clics para no generar un doble clic).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ---------------- |
-| enterableInList | boolean | true, false |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
-
----
-
-## Formulario listado
-
-Esta propiedad se utiliza para declarar el formulario listado que se utilizará en el subformulario. Un subformulario lista le permite introducir, ver y modificar datos en otras tablas.
-
-Los subformularios de lista pueden utilizarse para la entrada de datos de dos maneras: el usuario puede introducir los datos directamente en el subformulario, o introducirlos en un [formulario de entrada](#detail-form). En esta configuración, el formulario utilizado como subformulario se denomina formulario Lista. El formulario de entrada se denomina formulario detallado.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| listForm | string | Nombre (cadena) de la tabla o formulario proyecto, una ruta POSIX (cadena) a un archivo .json que describa el formulario, o un objeto que describa el formulario |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
-
----
-
-## Source
-
-Especifica la tabla a la que pertenece el subformulario Lista (si la hay).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------------------------------------------ |
-| tabla | string | Nombre de la tabla 4D, o "" si no hay tabla. |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
-
----
-
-## Modo de selección
-
-Designa la opción para permitir a los usuarios seleccionar líneas:
-
-- **Ninguna**: las líneas no se pueden seleccionar si se elige este modo. Hacer clic en la lista no tendrá ningún efecto a menos que la opción [Editable en lista](#enterable-in-list) esté activada. Las teclas de navegación sólo hacen que la lista se desplace; no se genera el evento de formulario `On Selection Change`.
-- **Simple**: en este modo se puede seleccionar una línea a la vez. Si hace clic en una línea, la seleccionará. Un **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en una fila cambia su estado (entre seleccionado o no).
- Las teclas de flecha arriba y abajo seleccionan el registro anterior/siguiente en la lista. Las otras teclas de navegación se desplazan por la lista. El evento de formulario `On Selection Change` se genera cada vez que se cambia la línea actual.
-- **Múltiple**: en este modo se pueden seleccionar varias líneas simultáneamente.
- - Los subregistros seleccionados son devueltos por el comando `GET HIGHLIGHTED RECORDS`.
- - Al hacer clic en el registro se selecciona, pero no se modifica el registro actual.
- - Un **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en un registro cambia su estado (entre seleccionado o no). Las teclas de flecha arriba y abajo seleccionan el registro anterior/siguiente en la lista. Las otras teclas de navegación se desplazan por la lista. El evento de formulario `On Selection Change` se genera cada vez que el registro seleccionado se modifica.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------------------- |
-| selectionMode | string | "multiple", "single", "none" |
-
-#### Objetos soportados
-
-[Subformulario](subform_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Text.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Text.md
deleted file mode 100644
index a678d2bae6c7d0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Text.md
+++ /dev/null
@@ -1,485 +0,0 @@
----
-id: propertiesText
-title: Text
----
-
----
-
-## Autorizar selector fuente/color
-
-Cuando esta propiedad está activada, los comandos [OPEN FONT PICKER](../commands-legacy/open-font-picker.md) y [OPEN COLOR PICKER](../commands-legacy/open-color-picker.md) pueden ser invocados para mostrar las ventanas de selección de fuente y color del sistema. A través de estas ventanas, los usuarios pueden cambiar la fuente o el color de un objeto formulario que tenga el foco directamente haciendo clic. Cuando esta propiedad está desactivada (por defecto), los comandos del selector abierto no tienen efecto.
-
-#### Gramática JSON
-
-| Propiedad | Tipos de datos | Valores posibles |
-| -------------------- | -------------- | -------------------------------------------- |
-| allowFontColorPicker | boolean | false (por defecto), true |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md)
-
----
-
-## Negrita
-
-Ajusta el texto seleccionado para que aparezca más oscuro y pesado.
-
-Puede definir esta propiedad utilizando el comando [**OBJECT SET FONT STYLE**](../commands-legacy/object-set-font-style.md).
-
-> Este es un texto normal.
-> **Esto es texto en negrita.**
-
-#### Gramática JSON
-
-| Propiedad | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------- |
-| fontWeight | text | "normal", "bold" |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
-
----
-
-## Itálica
-
-Hace que el texto seleccionado se incline ligeramente hacia la derecha.
-
-También puede definir esta propiedad por medio del comando [**OBJECT SET FONT STYLE**](../commands-legacy/object-set-font-style.md).
-
-> Este es un texto normal.
-> *Este texto está en cursiva.*
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | ------------------ |
-| fontStyle | string | "normal", "italic" |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
-
----
-
-## Subrayado
-
-Hace que el texto tenga una línea por debajo.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | --------------------- |
-| textDecoration | string | "normal", "underline" |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
-
----
-
-## Fuente
-
-Esta propiedad permite indicar el **tema de la fuente** o la **familia de fuente** utilizada en el objeto.
-
-> Las propiedades **Tema de la fuente** y de la **familia de la fuente** son mutuamente excluyentes. Un tema de fuente se encarga de los atributos de fuente, incluido el tamaño. Una familia de fuentes permite definir el nombre, el tamaño y el color de la fuente.
-
-### Tema de fuente
-
-La propiedad de tema de fuente designa un nombre de estilo automático. Los estilos automáticos determinan de forma dinámica la familia de fuentes, el tamaño y el color de la fuente que se utilizará para el objeto, según los parámetros sistema. Estos parámetros dependen de:
-
-- la plataforma,
-- el lenguaje del sistema,
-- y el tipo de objeto de formulario.
-
-Con el tema de fuente, se garantiza que los títulos se muestren siempre de acuerdo con los estándares actuales de la interfaz del sistema. Sin embargo, su tamaño puede variar de una máquina a otra.
-
-Hay tres temas de fuentes disponibles:
-
-- **normal**: estilo automático, aplicado por defecto a todo nuevo objeto creado en el editor de formularios.
-- Los temas de fuentes **principales** y **suplementarios** solo son soportados por las [áreas de texto](text.md) y las [áreas de entrada](input_overview.md). Estos temas están pensados principalmente para diseñar cajas de diálogo. Se refieren a los estilos de fuente utilizados, respectivamente, para el texto principal y la información adicional en las ventanas de su interfaz. A continuación se muestran las cajas de diálogo típicas (macOS y Windows) que utilizan estos temas de fuentes:
-
-
-
-> Los temas de fuentes gestionan la fuente, así como su tamaño y color. Puede aplicar propiedades de estilo personalizadas (Negrita, Cursiva o Subrayado) sin alterar su funcionamiento.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | ------------------------------ |
-| fontTheme | string | "normal", "main", "additional" |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
-
-### Familia de fuentes
-
-Hay dos tipos de nombres de familias de fuentes:
-
-- *family-name:* El nombre de una familia de fuentes, como "times", "courier", "arial", etc.
-- *generic-family:* El nombre de una familia genérica, como "serif", "sans-serif", "cursive", "fantasy", "monospace".
-
-Puede configurarlo utilizando el comando [`OBJECT SET FONT`](../commands-legacy/object-set-font.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ----------------------------------- |
-| fontFamily | string | Nombre de la familia de fuentes CSS |
-
-> 4D recomienda utilizar sólo fuentes [seguras para la web](https://www.w3schools.com/cssref/css_websafe_fonts.asp).
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
-
----
-
-## Tamaño fuente
-
-Permite definir el tamaño de la fuente del objeto en puntos.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------- | -------------- | -------------------------------------------------------------------------- |
-| fontSize | integer | Tamaño de letra en puntos. Valor mínimo: 0 |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
-
----
-
-## Color de fuente
-
-Designa el color de la fuente.
-
-> Esta propiedad también define el color del borde del objeto (si existe) cuando se utiliza el estilo "plano" o "punteado".
-
-El color puede ser especificado por:
-
-- un nombre de color - como "red"
-- un valor HEX - como "# ff0000"
-- un valor RVB - como "rgb (255,0,0)"
-
-También puede definir esta propiedad utilizando el comando [**OBJECT SET RGB COLORS**](../commands-legacy/object-set-rgb-colors.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ---------------------------------------- |
-| stroke | string | un valor css, "transparent", "automatic" |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Indicadores de progreso](progressIndicator.md) - [Regla](ruler.md) - [Botón radio](radio_overview.md) - [Área de texto](text.md)
-
----
-
-## Expresión color fuente
-
-`List box de tipo colección/selección de entidades`
-
-Se utiliza para aplicar un color de fuente personalizado a cada línea del list box. Debe utilizar valores de color RGB. Para más información al respecto, consulte la descripción del comando [OBJECT SET RGB COLORS](../commands-legacy/object-set-rgb-colors.md) en el manual Lenguaje de 4D.
-
-Debe introducir una expresión o una variable (no se pueden utilizar variables de tipo array). La expresión o variable se evaluará para cada línea mostrada. Puede utilizar las constantes descritas en el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
-
-También puede definir esta propiedad utilizando el comando `LISTBOX SET PROPERTY` con la constante `lk font color expression`.
-
-> Esta propiedad también puede definirse mediante una [Expresión Meta Info](properties_Text.md#meta-info-expression).
-
-El siguiente ejemplo utiliza un nombre de variable: introduzca *CompanyColor* para la **Expresión color fuente** y, en el método formulario, escriba el siguiente código:
-
-```4d
-CompanyColor:=Choose([Companies]ID;Background color;Light shadow color;
-Foreground color;Dark shadow color)
-```
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ---------------------- |
-| rowStrokeSource | string | Expresión color fuente |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Style Expression {#style-expression}
-
-`List box de tipo colección/selección de entidades`
-
-Utilizado para aplicar un estilo de fuente personalizado a cada línea de list box o de cada celda de la columna.
-
-Debe introducir una expresión o una variable (no se pueden utilizar variables de tipo array). La expresión o variable se evaluará para cada línea mostrada (si se aplica al list box) o cada celda mostrada (si se aplica a una columna). Puede usar las constantes listadas en el comando [`LISTBOX SET ROW FONT STYLE`](../commands-legacy/listbox-set-row-font-style.md).
-
-Ejemplo:
-
-```4d
-Choose([Companies]ID;Bold;Plain;Italic;Underline)
-```
-
-También puede definir esta propiedad utilizando el comando `LISTBOX SET PROPERTY` con la constante `lk font style expression`.
-
-> Esta propiedad también puede definirse mediante una [Expresión Meta Info](properties_Text.md#meta-info-expression).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | -------------------------------------------------------------------- |
-| rowStyleSource | string | Expresión de estilo a evaluar para cada línea/celda. |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Alineación horizontal
-
-Ubicación horizontal del texto dentro del área que lo contiene.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | ------------------------------------------------- |
-| textAlign | string | "right", "center", "left", "automatic", "justify" |
-
-:::note
-
-- "automatic" no es compatible con [casillas de selección](checkbox_overview.md) y [botones radio](radio_overview.md)
-- "justify" sólo es compatible con las [entradas ](input_overview.md) y [áreas de texto](text.md)
-
-:::
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) (todos los estilos excepto Regular y Plano) - [Combo Box](comboBox_overview.md) - [Lista desplegables](dropdownList_Overview.md) - [Caja de grupo](groupBox.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Pie List Box](listbox_overview.md#list-box-footers) - [Botón de opción](radio_overview.md) (todos los estilos excepto Regular y Plano) - [Área de texto](text.md)
-
----
-
-## Alineamiento vertical
-
-Ubicación vertical del texto dentro del área que lo contiene.
-
-La opción **Predeterminado** (`automático` valor JSON) define la alineación según el tipo de datos que se encuentran en cada columna:
-
-- `abajo` para todos los datos (excepto las imágenes) y
-- `arriba` para los datos del tipo imagen.
-
-Esta propiedad también puede ser manejada por los comandos [OBJECT Get vertical alignment](../commands-legacy/object-get-vertical-alignment.md) y [OBJECT SET VERTICAL ALIGNMENT](../commands-legacy/object-set-vertical-alignment.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | -------------------------------------- |
-| verticalAlign | string | "automatic", "top", "middle", "bottom" |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado List Box](listbox_overview.md#list-box-headers)
-
----
-
-## Meta Info expression
-
-`List boxes de tipo Collection o entity selection`
-
-Indica una expresión o una variable que se evaluará para cada línea mostrada. Permite definir todo un conjunto de atributos texto de las líneas. Debe pasar una **variable objeto** o una **expresión que devuelva un objeto**. Se soportan las siguientes propiedades:
-
-| Nombre de propiedad | Tipo | Descripción |
-| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| stroke | string | Color de la fuente. Todo color CSS (por ejemplo: "#FF00FF"), "automatic", "transparent" |
-| fill | string | Color de fondo. Todo color CSS (por ejemplo: "#F00FFF"), "automatic", "transparent" |
-| fontStyle | string | "normal","italic" |
-| fontWeight | string | "normal","bold" |
-| textDecoration | string | "normal","underline" |
-| unselectable | boolean | Designa la línea correspondiente como no seleccionable (\* es decir, \*, no es posible el resaltado). Las áreas que se pueden introducir ya no se pueden introducir si esta opción está activada, a menos que la opción "Edición con un solo clic" también esté activada. Los controles como las casillas de selección y las listas siguen siendo funcionales. Esta configuración se ignora si el modo de selección del list box es "Ninguno". Valores por defecto: False. |
-| disabled | boolean | Desactiva la línea correspondiente. Las áreas editables ya no son accesibles si esta opción está activada. Texto y controles (casillas de verificación, listas, etc.) aparecen atenuados o desactivados. Valores por defecto: False. |
-
-La propiedad especial "cell" permite aplicar un conjunto de propiedades a una sola columna:
-
-| Nombre de propiedad | | | Tipo | Descripción |
-| ------------------- | ------------ | -------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| cell | | | object | Propiedades aplicables a una o varias columnas |
-| | *columnName* | | object | *columnName* es el nombre del objeto de la columna del list box |
-| | | *propertyName* | string | las propiedades "stroke", "fill", "fontStyle", "fontWeight" o "textDecoration" (ver arriba). **Nota**: las propiedades "no seleccionable" y "desactivada" sólo pueden definirse a nivel de la línea. Se ignoran si se pasan en el objeto "celda" |
-
-> Los ajustes de estilo hechos con esta propiedad son ignorados si otros ajustes de estilo ya están definidos a través de expresiones (\*por ejemplo, [Expresión de estilo](#style-expression), [Expresión de color de fuente](#font-color-expression), [Expresión de color de fondo](./properties_BackgroundAndBorder.md#background-color-expression)).
-
-**Ejemplos**
-
-En un método proyecto *Color*, escriba el siguiente código:
-
-```4d
-//Método Color
-//Define el color de la fuente para ciertas líneas y el color de fondo para las columnas Col2 y Col3
-Form.meta:=New object
-If(This.ID<5) //ID es un atributo de los objetos/entidades de la colección
- Form.meta.stroke:="purple"
- Form.meta.cell:=New object("Col2";New object("fill";"black");\
- "Col3";New object("fill";"red"))
-Else
- Form.meta.stroke:="orange"
-End if
-```
-
-**Buenas prácticas:** por razones de optimización, normalmente se recomienda crear el objeto `meta.cell` una vez en el método del formulario:
-
-```4d
- //método formulario
- Case of
- :(Form event code=On Load)
- Form.colStyle:=New object("Col2";New object("fill";"black");\
- "Col3";New object("fill";"red"))
- // también puede definir otros conjuntos de estilos
- Form.colStyle2:=New object("Col2";New object("fill";"green");\
- "Col3";New object("fontWeight";"bold"))
- End case
-```
-
-Entonces, el método *Color* contendría:
-
-```4d
- //Método Color
- ...
- If(This.ID>5)
- Form.meta.stroke:="purple"
- Form.meta.cell:=Form.colStyle //reuse el mismo objeto para un mejor rendimiento
- Else
- Form.meta.stroke:="orange"
- Form.meta.cell:=Form.colStyle2
- End if
- ...
-```
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | -------------------------------------------------------------------- |
-| metaSource | string | Expresión de objeto a evaluar para cada línea/celda. |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md)
-
----
-
-## Multistyle
-
-Esta propiedad permite la posibilidad de usar [estilos específicos](https://doc.4d.com/4Dv20/4D/20.6/Supported-tags.300-7488021.en.html) en el área seleccionada. Cuando esta opción está marcada, 4D interpreta todas las etiquetas ` HTML` presentes en el área.
-
-Por defecto, esta opción no está activa.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ---------------- |
-| styledText | boolean | true, false |
-
-#### Objetos soportados
-
-[Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Orientación
-
-Modifica la orientación (rotación) de un área de texto. Las áreas de texto pueden girarse en incrementos de 90°. Cada valor de orientación se aplica manteniendo el mismo punto de partida inferior izquierdo para el objeto:
-
-| Valor de orientación | Resultado |
-| ---------------------------------- | ---------------------------------------------- |
-| 0 (por defecto) |  |
-| 90 |  |
-| 180 |  |
-| 270 |  |
-
-Además de [áreas de texto estáticas](text.md), los objetos de texto de las [áreas de entrada](input_overview.md) pueden girar cuando no son[editables](properties_Entry.md#enterable). Cuando se aplica una propiedad de rotación a un objeto de entrada, se elimina la propiedad editable (si la hay). Este objeto se excluye entonces del orden de entrada.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | ---------------- |
-| textAngle | number | 0, 90, 180, 270 |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md) (no editable) - [Área de texto](text.md)
-
----
-
-## Row Font Color Array {#row-font-color-array}
-
-`List boxes de tipo array`
-
-Permite definir un color de fuente personalizado para cada línea del list box o celda de la columna.
-
-Se debe utilizar el nombre de un array Entero largo. Cada elemento de este array corresponde a una línea del list box (si se aplica al list box) o a una celda de la columna (si se aplica a una columna), por lo que el array debe tener el mismo tamaño que el array asociado a la columna. Puede utilizar las constantes descritas en el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md). Si desea que la celda herede el color de fondo definido en el nivel superior, pase el valor -255 al elemento del array correspondiente.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------------- | -------------- | ---------------------------------- |
-| rowStrokeSource | string | El nombre de un array entero largo |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Row Style Array {#row-style-array)
-
-`List boxes de tipo array`
-
-Permite definir un estilo de fuente personalizado para cada línea del list box o cada celda de la columna.
-
-Se debe utilizar el nombre de un array Entero largo. Cada elemento de este array corresponde a una línea del list box (si se aplica al list box) o a una celda de la columna (si se aplica a una columna), por lo que el array debe tener el mismo tamaño que el array asociado a la columna. Para llenar la matriz (utilizando un método), utilice las constantes enumeradas en el comando [`LISTBOX SET ROW FONT STYLE`](../commands-legacy/listbox-set-row-font-style.md). Se pueden añadir constantes para combinar estilos. Si desea que la celda herede el estilo definido en el nivel superior, pase el valor -255 al elemento del array correspondiente.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | --------------------------------------------------- |
-| rowStyleSource | string | El nombre de un array entero largo. |
-
-#### Objetos soportados
-
-[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
-
----
-
-## Almacenar con etiquetas de estilo por defecto
-
-Esta propiedad sólo está disponible para un área de entrada [Multi-estilo](#multi-estilo).
-Cuando esta propiedad está activada, el área almacenará las etiquetas de estilo con el texto, incluso si no se ha realizado ninguna modificación. En este caso, las etiquetas corresponden al estilo por defecto. Cuando esta propiedad está desactivada, sólo se almacenan las etiquetas de estilo modificadas.
-
-Por ejemplo, este es un texto que incluye una modificación de estilo:
-
-
-
-Cuando la propiedad está desactivada, el área sólo almacena la modificación. Por lo tanto, los contenidos almacenados son:
-
-```
-¡Qué hermoso día!
-```
-
-Cuando la propiedad está activa, el área almacena toda la información de formato. La primera etiqueta genérica describe el estilo por defecto y luego cada variación es objeto de un par de etiquetas anidadas. Por lo tanto, los contenidos almacenados en el área son:
-
-```
-¡Qué hermoso día!
-```
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------- | -------------- | ------------------------------------------------------------- |
-| storeDefaultStyle | boolean | true, false (por defecto). |
-
-#### Objetos soportados
-
-[Entrada](input_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_TextAndPicture.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_TextAndPicture.md
deleted file mode 100644
index 687074ab3aa6ba..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_TextAndPicture.md
+++ /dev/null
@@ -1,263 +0,0 @@
----
-id: propertiesTextAndPicture
-title: Texto e Imagen
----
-
-## Ruta de acceso fondo
-
-Define la ruta de la imagen que se dibujará en el fondo del objeto. Si el objeto utiliza un [icono](#picture-pathname) con [diferentes estados](#number-of-states), la imagen de fondo soportará automáticamente el mismo número de estados.
-
-El nombre de la ruta a introducir es similar al de [la propiedad Ruta de acceso para las imágenes estáticas](properties_Picture.md#pathname).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ----------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| customBackgroundPicture | string | Ruta relativa en sintaxis POSIX. Debe utilizarse junto con la opción "Personalizado" de la propiedad "Style". |
-
-#### Objetos soportados
-
-[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
-
----
-
-## Estilos de botón
-
-Aspecto general del botón. El estilo del botón también influye en la disponibilidad de ciertas opciones.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :----: | :------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| style | text | "regular", "flat", "toolbar", "bevel", "roundedBevel", "gradientBevel", "texturedBevel", "office", "help", "circular", "disclosure", "roundedDisclosure", "custom" |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) - [Botón radio](radio_overview.md) - [Casilla de selección](checkbox_overview.md) - [Botón Radio](radio_overview.md)
-
----
-
-## Margen horizontal
-
-Esta propiedad permite definir el tamaño (en píxeles) de los márgenes horizontales del botón. Este margen delimita el área que el icono del botón y el título no deben sobrepasar.
-
-Este parámetro es útil, por ejemplo, cuando la imagen de fondo contiene bordes:
-
-| Con / Sin | Ejemplo |
-| ------------------------ | ------------------------------------------------------------ |
-| Sin margen |  |
-| Con un margen 13 píxeles |  |
-
-> Esta propiedad funciona junto con la propiedad [Margen vertical](#vertical-margin).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------------------------------------------------------------------------- |
-| customBorderX | number | Para usar con el estilo "personalizado". Mínimo: 0 |
-
-#### Objetos soportados
-
-[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
-
----
-
-## Ubicación del icono
-
-Designa la ubicación de un icono en relación con el objeto formulario.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ----------------------- |
-| iconPlacement | string | "none", "left", "right" |
-
-#### Objetos soportados
-
-[Encabezado de List Box](listbox_overview.md#list-box-headers)
-
----
-
-## Desplazamiento icono
-
-Define un valor de desplazamiento personalizado en píxeles, que se utilizará cuando se haga clic en el botón
-
-El título del botón se desplazará hacia la derecha y hacia la parte inferior por el número de píxeles introducidos. Esto permite aplicar un efecto 3D personalizado cuando se presiona el botón.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------ | -------------- | ------------------------- |
-| customOffset | number | mínimo: 0 |
-
-#### Objetos soportados
-
-[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
-
----
-
-## Número de estados
-
-Esta propiedad define el número exacto de estados presentes en la imagen utilizada como icono para un [botón con icono](button_overview.md), una [casilla de selección](checkbox_overview.md) o un [botón radio](radio_overview.md) personalizado.
-
-La imagen puede contener de 2 a 6 estados.
-
-- 2 estados: false, true
-- 3 estados: false, true, rollover,
-- 4 estados: false, true, rollover, desactivado,
-- 5 estados (sólo para casillas de verificación y botones radio): false, true, rollover false, rollover true, desactivado
-- 6 estados (sólo para casillas de verificación y botones radio): false, true, false rollover, true rollover, false desactivado, true desactivado.
-
-:::note
-
-- "false" significa botón no presionado/no seleccionado o casilla desmarcada (valor de la variable=0)
-- "true" significa botón presionado/seleccionado o casilla marcada (valor de la variable=1)
-
-:::
-
-Cada estado está representado por una imagen diferente. En la imagen fuente, los estados deben apilarse verticalmente:
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ---------- | -------------- | ----------------------------------------------------------------------------------- |
-| iconFrames | number | Número de estados en la imagen del icono. Mínimo: 1 |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) (todos los estilos excepto [Ayuda](button_overview.md#help)) - [Casilla de selección](checkbox_overview.md) - [Botón radio](radio_overview.md)
-
----
-
-## Ruta de acceso de la imagen
-
-Define la ruta de la imagen que se utilizará como icono del objeto.
-
-El nombre de la ruta a introducir es similar al de [la propiedad Ruta de acceso para las imágenes estáticas](properties_Picture.md#pathname).
-
-> Cuando se utiliza como icono de objetos activos, la imagen debe estar diseñada para soportar un [número de estados](#number-of-states) variable.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------ | -------------- | ------------------------------------------------------------- |
-| icon | picture | Ruta relativa o filesystem en sintaxis POSIX. |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) (todos los estilos excepto [Ayuda](button_overview.md#help)) - [Casilla de selección](checkbox_overview.md) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Botón radio](radio_overview.md)
-
----
-
-## Posición título/imagen
-
-Esta propiedad permite modificar la ubicación relativa del título del botón en relación con el icono asociado. Esta propiedad no tiene efecto cuando el botón sólo contiene un título (sin imagen asociada) o una imagen (sin título). Por defecto, cuando un botón contiene un título y una imagen, el texto se coloca debajo de la imagen.
-
-Aquí están los resultados utilizando las distintas opciones para esta propiedad:
-
-| Option | Descripción | Ejemplo |
-| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
-| **Izquierda** | El texto se coloca a la izquierda del icono. El contenido del botón se alinea a la derecha. |  |
-| **Arriba** | El texto se coloca debajo del icono. El contenido del botón está centrado. |  |
-| **Derecha** | El texto se coloca a la derecha del icono. El contenido del botón se alinea a la izquierda. |  |
-| **Abajo** | El texto se coloca sobre el icono. El contenido del botón está centrado. |  |
-| **Centrado** | El texto del icono está centrado vertical y horizontalmente en el botón. Este parámetro es útil, por ejemplo, para el texto incluido en un icono. |  |
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ------------------------------------------ |
-| textPlacement | string | "left", "top", "right", "bottom", "center" |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) (todos los estilos excepto [Ayuda](button_overview.md#help)) - [Casilla de selección](checkbox_overview.md) - [Botón radio](radio_overview.md)
-
----
-
-## Posición título imagen
-
-Esta propiedad permite definir si el título y la imagen del botón deben estar visualmente contiguos o separados, según las propiedades [Posición del título/imagen](#titlepicture-position) y [Alineación horizontal](properties_Text.md#horizontal-alignment).
-
-Esta propiedad no tiene efecto cuando el botón sólo contiene un título (sin imagen asociada) o una imagen (sin título).
-
-Por defecto, cuando un botón contiene un título y una imagen, los elementos se unen. El siguiente gráfico muestra el efecto de la propiedad `imageHugsTitle` (true cuando la propiedad está activada) con diferentes alineaciones de los botones:
-
-
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | -------------------------------------------- |
-| imageHugsTitle | boolean | true (por defecto), false |
-
-#### Objetos soportados
-
-[Botón](button_overview.md) (todos los estilos excepto Ayuda) - [Casilla de verificación](checkbox_overview.md) (todos los estilos excepto Normal, Plano, Revelar y Contraer/Expandir) - [Botón de radio](radio_overview.md) (todos los estilos excepto Normal, Plano, Revelar y Contraer/Expandir).
-
----
-
-## Margen vertical
-
-Esta propiedad permite definir el tamaño (en píxeles) de los márgenes verticales del botón. Este margen delimita el área que el icono del botón y el título no deben sobrepasar.
-
-Este parámetro es útil, por ejemplo, cuando la imagen de fondo contiene bordes.
-
-> Esta propiedad funciona junto con la propiedad [Margen horizontal](#horizontal-margin).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| ------------- | -------------- | ---------------------------------------------------------------------------------- |
-| customBorderY | number | Para usar con el estilo "personalizado". Mínimo: 0 |
-
-#### Objetos soportados
-
-[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
-
----
-
-## Con menú pop-up
-
-Esta propiedad permite mostrar un símbolo que aparece como un triángulo en el botón para indicar la presencia de un menú emergente adjunto:
-
-
-
-La apariencia y ubicación de este símbolo depende del estilo del botón y de la plataforma actual.
-
-### Vinculados y separados
-
-Para asociar un símbolo de menú emergente a un botón, hay dos opciones de visualización disponibles:
-
-| Enlazado | Separado |
-| :-----------------------------------------------------: | :--------------------------------------------------------: |
-|  |  |
-
-> La disponibilidad efectiva de un modo "separado" depende del estilo del botón y de la plataforma.
-
-Cada opción precisa la relación entre el botón y el menú emergente asociado:
-
-- Cuando el menú emergente está **separado**, al hacer clic en la parte izquierda del botón se ejecuta directamente la acción actual del botón; esta acción puede modificarse mediante el menú emergente accesible en la parte derecha del botón.
-- Cuando el menú emergente está **vinculado**, un simple clic en el botón sólo muestra el menú emergente. Sólo la selección de la acción en el menú emergente provoca su ejecución.
-
-:::info
-
-Consulte la descripción del evento [`On Alternative Click`](../Events/onAlternativeClick.md) para más información sobre la gestión de eventos en este caso.
-
-:::
-
-### Gestión del menú emergente
-
-Es importante señalar que la propiedad "Con menú emergente" sólo gestiona el aspecto gráfico del botón. La visualización del menú emergente y sus valores deben ser manejados enteramente por el desarrollador, más particularmente utilizando los comandos`form events` y [`Dynamic pop up menu`](../commands-legacy/dynamic-pop-up-menu.md) y [`Pop up menu`](../commands-legacy/pop-up-menu.md).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| :------------- | -------------- | ---------------------------------------------------- |
-| popupPlacement | string |
"none"
"linked"
"separated"
|
-
-#### Objetos soportados
-
-[Botón de barra de herramientas](button_overview.md#toolbar) - [Botón biselado](button_overview.md#bevel) - [Botón biselado redondeado](button_overview.md#rounded-bevel) - [Botón de degradado OS X](button_overview.md#os-x-gradient) - [Botón con textura OS X](button_overview.md#os-x-textured) - [Botón Office XP](button_overview.md#office-xp) - [Botón circular](button_overview.md#circle) - [Personalizado](button_overview.md#custom)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_WebArea.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_WebArea.md
deleted file mode 100644
index c57f5c718774f4..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_WebArea.md
+++ /dev/null
@@ -1,105 +0,0 @@
----
-id: propertiesWebArea
-title: Área Web
----
-
----
-
-## Acceder a los métodos 4D
-
-Puede llamar a métodos 4D y funciones de clase desde el código JavaScript ejecutado en un área Web y obtener valores a cambio. Para poder llamar a los métodos 4D desde un área Web, debe activar la propiedad de accesibilidad de los métodos 4D ("todos").
-
-> Esta propiedad sólo está disponible si el área web [utiliza el motor de renderizado web integrado](properties_WebArea.md#use-embedded-web-rendering-engine).
-
-Cuando esta propiedad está activada, se instancia un objeto JavaScript especial llamado `$4d`en el área web, que puede [utilizar para gestionar las llamadas a los métodos proyecto y funciones 4D](webArea_overview.md#4d-object).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------------- | -------------- | ---------------------------------------------- |
-| methodsAccessibility | string | "none" (por defecto), "all" |
-
-#### Objetos soportados
-
-[Área web](webArea_overview.md)
-
----
-
-## Variable Progression
-
-Nombre de una variable de tipo Longint. Esta variable recibirá un valor entre 0 y 100, que representa el porcentaje de finalización de la carga de la página en el área web. Actualizado automáticamente por 4D, no puede ser modificado manualmente.
-
-> A partir de 4D v19 R5, esta variable solo se actualiza en Windows si el área Web [utiliza el motor de renderizado Web anidado](properties_WebArea.md#use-embedded-web-rendering-engine).
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| -------------- | -------------- | ------------------------------ |
-| progressSource | string | Nombre de una variable Longint |
-
-#### Objetos soportados
-
-[Área web](webArea_overview.md)
-
----
-
-## URL
-
-La variable URL es de tipo cadena. Contiene la URL cargada o que está siendo cargada por el área web asociada. La asociación entre la variable y el área web funciona en ambas direcciones:
-
-- Si el usuario asigna una nueva URL a la variable, esta URL es cargada automáticamente por el área web.
-- Toda la navegación que se realice dentro del área web actualizará automáticamente el contenido de la variable.
-
-Esquemáticamente, esta variable funciona como el área de direcciones de un navegador web. Puede representarlo a través de un área de texto sobre el área Web.
-
-### Variable URL y comando WA OPEN URL
-
-La variable URL produce los mismos efectos que el comando [WA OPEN URL](../commands-legacy/wa-open-url.md). No obstante, hay que señalar las siguientes diferencias:
-
-- Para el acceso a los documentos, esta variable sólo acepta URLs que cumplan con el RFC ("file://c:/My%20Doc") y no los nombres de ruta del sistema ("c:\MyDoc"). El comando [WA OPEN URL](../commands-legacy/wa-open-url.md) acepta ambas notaciones.
-- Si la variable URL contiene una cadena vacía, el área web no intenta cargar la URL. El comando [WA OPEN URL](../commands-legacy/wa-open-url.md) genera un error en este caso.
-- Si la variable URL no contiene un protocolo (http, correo, archivo, etc.), el área web añade "http://", lo cual no es el caso del comando [WA OPEN URL](../commands-legacy/wa-open-url.md).
-- Cuando el área Web no se muestra en el formulario (cuando se encuentra en otra página del formulario), la ejecución del comando [WA OPEN URL](../commands-legacy/wa-open-url.md) no tiene ningún efecto, mientras que la asignación de un valor a la variable URL puede utilizarse para actualizar la URL actual.
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | ------------------------ |
-| urlSource | string | Una URL. |
-
-#### Objetos soportados
-
-[Área web](webArea_overview.md)
-
----
-
-## Utilizar el motor de renderizado web integrado
-
-Esta opción permite elegir entre dos motores de renderizado para el área web, dependiendo de las particularidades de su aplicación:
-
-- **no marcado** - `valor JSON: sistema` (por defecto): en este caso, 4D utiliza el "mejor" motor correspondiente al sistema. Esto significa que usted se beneficia automáticamente de los últimos avances en la renderización web, a través de HTML5 o JavaScript. Sin embargo, es posible que note algunas diferencias de renderizado entre plataformas. En Windows, 4D utiliza Microsoft Edge WebView2. En macOS, 4D utiliza la versión actual de WebKit (Safari).
-
-> En Windows, si Microsoft Edge WebView2 no está instalado, 4D utiliza el motor integrado como motor de renderizado del sistema. Para saber si está instalado en su sistema, busque "Microsoft Edge WebView2 Runtime" en su panel de aplicaciones.
-
-- **marcado** - `valor JSON: anidado`: en este caso, 4D utiliza Chromium Embedded Framework (CEF). La utilización del motor web integrado significa que la representación de las áreas web y su funcionamiento en su aplicación son idénticos independientemente de la plataforma utilizada para ejecutar 4D (no obstante, pueden observarse ligeras variaciones de píxeles o diferencias relacionadas con la implementación de la red). La utilización del motor web integrado significa que la representación de las áreas web y su funcionamiento en su aplicación son idénticos independientemente de la plataforma utilizada para ejecutar 4D (no obstante, pueden observarse ligeras variaciones de píxeles o diferencias relacionadas con la implementación de la red).
-
-El motor CEF tiene las siguientes limitaciones:
-
-- [WA SET PAGE CONTENT](../commands-legacy/wa-set-page-content.md): el uso de este comando requiere que al menos una página ya esté cargada en el área (mediante una llamada a [`WA OPEN URL`](../commands-legacy/wa-open-url.md) o una asignación a la variable URL asociada al área).
-- Cuando se habilita soltar URL mediante el selector `WA enable URL drop` del comando [WA SET PREFERENCE](../commands-legacy/wa-set-preference.md), la primera caída debe ir precedida de al menos una llamada a [WA OPEN URL](../commands-legacy/wa-open-url.md) o una asignación a la variable URL asociada al área.
-
-:::note
-
-Puede personalizar los parámetros del área de CEF creando un [archivo de configuración 4DCEFParameters.json] local (webArea_overview.md#4dcefparametersjson).
-
-:::
-
-#### Gramática JSON
-
-| Nombre | Tipos de datos | Valores posibles |
-| --------- | -------------- | -------------------- |
-| webEngine | string | "embedded", "system" |
-
-#### Objetos soportados
-
-[Área web](webArea_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/webArea_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/webArea_overview.md
deleted file mode 100644
index 1b6be15a37a604..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/webArea_overview.md
+++ /dev/null
@@ -1,341 +0,0 @@
----
-id: webAreaOverview
-title: Área Web
----
-
-Las áreas web pueden mostrar varios tipos de contenido web dentro de sus formularios: páginas HTML con contenidos estáticos o dinámicos, archivos, imágenes, JavaScript, etc. El motor de renderizado del área web depende de la plataforma de ejecución de la aplicación y de la [opción motor de renderizado](properties_WebArea.md#use-embedded-web-rendering-engine) seleccionada.
-
-Es posible crear varias áreas web en el mismo formulario. Tenga en cuenta, sin embargo, que el uso de las áreas web debe seguir [varias reglas](#web-area-rules).
-
-Varias [acciones estándar](#standard-actions) dedicadas, numerosos [comandos de lenguaje](../category/web-area) así como [eventos de formulario](#form-events) genéricos y específicos permiten al desarrollador controlar el funcionamiento de las áreas web. Se pueden utilizar variables específicas para intercambiar información entre el área y el entorno 4D.
-
-## Propiedades específicas
-
-### Variables asociadas
-
-Se pueden asociar dos variables específicas a cada área web:
-
-- [`URL`](properties_WebArea.md#url) --para controlar la URL mostrada por el área web
-- [`Progression`](properties_WebArea.md#progression) -- para controlar el porcentaje de carga de la página mostrada en el área web.
-
-> A partir de 4D v19 R5, la variable Progression ya no se actualiza en las Áreas Web que utilizan el [motor de renderizado del sistema Windows](./webArea_overview.md#web-rendering-engine).
-
-### Motor de renderización web
-
-Puede elegir entre [dos motores de renderizado](properties_WebArea.md#use-embedded-web-rendering-engine) para el área web, dependiendo de las especificaciones de su aplicación.
-
-Seleccionar el motor de renderizado web anidado permite llamar a los métodos de 4D desde el área web y asegurarse de que las funcionalidades en macOS y Windows sean similares. Se recomienda seleccionar el motor de renderizado del sistema cuando el área web está conectada a Internet porque siempre se beneficia de las últimas actualizaciones de seguridad.
-
-### Acceder a los métodos 4D
-
-Cuando la propiedad [Acceso a los métodos 4D](properties_WebArea.md#access-4d-methods) está seleccionada, puede llamar a métodos 4D desde un área web.
-
-:::note Notas
-
-- Esta propiedad sólo está disponible si el área web [utiliza el motor de renderizado web integrado](properties_WebArea.md#use-embedded-web-rendering-engine).
-- Por razones de seguridad, ya que permite ejecutar código 4D, esta opción solo debe habilitarse para páginas de confianza, como las páginas generadas por la aplicación.
-
-:::
-
-## Objeto $4d
-
-The [`4D embedded web rendering engine`](properties_WebArea.md#use-embedded-web-rendering-engine) provides a **JavaScript object named `$4d`** in the web area. Por defecto, `$4d` permite acceder a todos los métodos proyecto 4D utilizando la notación de puntos.
-
-Por ejemplo, llamando al método `HelloWorld` en 4D:
-
-```js
-$4d.HelloWorld();
-```
-
-> **Note:** JavaScript is **case-sensitive**, so the object is named **`$4d`** (with a lowercase "d").
-
-### Controlar el acceso a $4d
-
-Con [`WA SET CONTEXT`](../commands/wa-set-context.md), los desarrolladores pueden controlar lo que puede estar disponible a través de `$4d` desde un área Web. Using this command you define a **context object** that declares for example 4D methods through formulas and class instances.
-
-Para verificar el contexto definido actualmente, utilice [`WA Get context`](../commands/wa-get-context.md).
-
-Para más información, consulte [`WA SET CONTEXT`](../commands/wa-set-context.md).
-
-### Llamada a métodos 4D desde JavaScript
-
-La sintaxis de las llamadas a los métodos 4D es la siguiente:
-
-```js
-$4d.4DMethodName(param1,paramN,function(result){})
-```
-
-- `param1...paramN`: puede pasar tantos parámetros como necesite al método 4D.
- Estos parámetros pueden ser de cualquier tipo soportado por JavaScript (cadena, número, array, objeto).
-
-- `function(result)`: función a pasar como último argumento. Esta función "callback" se llama de forma sincrónica una vez que el método 4D termina de ejecutarse. Recibe el parámetro `result`.
-
-- `result`: resultado de la ejecución del método 4D. Este resultado puede ser de cualquier tipo soportado por JavaScript (cadena, número, array, objeto).
-
-> Por defecto, 4D trabaja en UTF-8. Cuando devuelva un texto que contenga caracteres extendidos, por ejemplo, caracteres con acentos, asegúrese de que la codificación de la página mostrada en el área web esté declarada como UTF-8, ya que de lo contrario los caracteres podrían representarse incorrectamente. En este caso, añada la siguiente línea en la página HTML para declarar la codificación:
-> ``
-
-#### Ejemplo 1
-
-Dado un método proyecto 4D llamado `today`que no recibe parámetros y devuelve la fecha actual como una cadena.
-
-Código 4D del método `today`:
-
-```4d
-#DECLARE -> $result : Text
-$result := String(Current date;System date long)
-```
-
-En el área web, el método 4D puede ser llamado con la siguiente sintaxis:
-
-```js
-$4d.today()
-```
-
-El método 4D no recibe ningún parámetro pero devuelve el resultado a la función de retrollamada por 4D después de la ejecución del método. Queremos mostrar la fecha en la página HTML que es cargada por el área web.
-
-Aquí está el código de la página HTML:
-
-```html
-
-
-
-
-
-Today is:
-
-
-```
-
-#### Ejemplo 2
-
-En lugar de utilizar un método independiente, también podemos definir una **clase** que se encargue del cálculo.
-
-Define the Class with 4D project method `calcSum` which receives parameters and returns their sum:
-
-```4d
-// SumCalculator user class
-
-Function calcSum(... : Real) -> $sum : Real
- // receives n Real type parameters
- // and returns a Real
- var $i; $n : Integer
- $n := Count parameters
-
- For ($i; 1; $n)
- $sum += ${$i}
- End for
-```
-
-En otro método, creamos una instancia y la asignamos a $4d
-
-```4d
-var $myCalculator := cs.SumCalculator.new()
-WA SET CONTEXT OBJECT(*; "myWebArea"; $myCalculator)
-```
-
-El código JavaScript que se ejecuta en el área web es el siguiente:
-
-```js
-$4d.calcSum(33, 45, 75, 102.5, 7, function(theSum)
- {
- var result = theSum // el resultado es 262.5
-});
-```
-
-## Acciones estándar
-
-Existen cuatro acciones estándar específicas para gestionar automáticamente las áreas web: `Open Back URL`, `Open Forward URL`, `Refresh Current URL` y `Stop Loading URL`. Estas acciones pueden asociarse a botones o comandos de menú y permiten una rápida implementación de interfaces web básicas. Estas acciones pueden asociarse a botones o comandos de menú y permiten una rápida implementación de interfaces web básicas.
-
-## Eventos formulario
-
-Los eventos formulario específicos están destinados a la gestión programada de las áreas de la web, más concretamente a la activación de los enlaces:
-
-- [`On Begin URL Loading`](Events/onBeginUrlLoading.md)
-- [`On URL Resource Loading`](Events/onUrlResourceLoading.md)
-- [`On End URL Loading`](Events/onEndUrlLoading.md)
-- [`On URL Loading Error`](Events/onUrlLoadingError.md)
-- [`On URL Filtering`](Events/onUrlFiltering.md)
-- [`On Open External Link`](Events/onOpenExternalLink.md)
-- [`On Window Opening Denied`](Events/onWindowOpeningDenied.md)
-
-Además, las áreas web soportan los siguientes eventos de formulario genéricos:
-
-- [`On Load`](Events/onLoad.md)
-- [`On Unload`](Events/onUnload.md)
-- [`On Getting Focus`](Events/onGettingFocus.md)
-- [`On Losing Focus`](Events/onLosingFocus.md)
-
-## Reglas de las áreas web
-
-### Interfaz de usuario
-
-Cuando se ejecuta el formulario, las funciones estándar de la interfaz del navegador están disponibles para el usuario en el área web, lo que permite la interacción con otras áreas del formulario:
-
-- **Comandos menú Edición**: cuando el área web tiene el foco, los comandos del menú **Edición** pueden utilizarse para realizar acciones como copiar, pegar, seleccionar todo, etc., según la selección.
-- **Menú contextual**: es posible utilizar el [menú contextual] estándar (properties_Entry.md#context-menu) del sistema con el área web. La visualización del menú contextual puede controlarse utilizando el comando [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md).
-- **Arrastrar y soltar**: el usuario puede arrastrar y soltar texto, imágenes y documentos dentro del área web o entre un área web y los objetos de los formularios 4D, según las propiedades de los objetos 4D.
- Por razones de seguridad, no se permite por defecto cambiar el contenido de un área web mediante la acción de arrastrar y soltar un archivo o una URL. En este caso, el cursor muestra un icono de "prohibido" . Tiene que usar la instrucción `WA SET PREFERENCE(*; "warea";WA enable URL drop;True)` para mostrar un icono "drop" y generar el evento [`On Window Opening Denied`](Events/onWindowOpeningDenied.md). En este evento, puede llamar al comando [`WA OPEN URL`](../commands-legacy/wa-open-url.md) o definir la [variable URL](properties_WebArea.md#url) en respuesta a un soltar del usuario.
-
-> Las funciones de arrastrar y soltar descritas anteriormente no son compatibles con las áreas web que utilizan el [motor de renderizado del sistema macOS](properties_WebArea.md#use-embedded-web-rendering-engine).
-
-### Subformularios
-
-Por razones relacionadas con los mecanismos de redibujado de ventanas, la inserción de un área web en un subformulario está sujeta a las siguientes restricciones:
-
-- El subformulario no debe poder desplazarse
-- Los límites del área web no deben superar el tamaño del subformulario
-
-> No se soporta la superposición de un área web sobre o debajo de otros objetos formulario.
-
-### Conflicto entre el área web y el servidor web (Windows)
-
-En Windows, no se recomienda acceder, a través de un área web, al servidor web de la aplicación 4D que contiene el área, ya que esta configuración podría provocar un conflicto que paralice la aplicación. Por supuesto, un 4D remoto puede acceder al servidor web de 4D Server, pero no a su propio servidor web.
-
-### Inserción del protocolo (macOS)
-
-Las URLs manejadas por programación en áreas web bajo macOS deben comenzar con el protocolo. Por ejemplo, debe pasar la cadena "http://www.mysite.com" y no sólo "www.mysite.com".
-
-## Acceso al inspector web
-
-Puede visualizar y utilizar un inspector web dentro de las áreas web de sus formularios o en las áreas web fuera de la pantalla. El inspector web es un depurador que permite analizar el código y el flujo de información de las páginas web.
-
-Para mostrar el inspector Web, puede ejecutar el comando `WA OPEN WEB INSPECTOR` o utilizar el menú contextual del área web.
-
-- **Execute the `WA OPEN WEB INSPECTOR` command**
- This command can be used directly with onscreen (form object) and offscreen web areas.
-
-- **Use the web area context menu**
- This feature can only be used with onscreen web areas and requires that the following conditions are met:
- - el [menú contextual](properties_Entry.md#context-menu) del área web está activado
- - el uso del inspector está expresamente autorizado en el área mediante la siguiente declaración:
- ```4d
- WA SET PREFERENCE(*;"WA";WA enable Web inspector;True)
- ```
-
-> Con el [motor de renderizado del sistema de Windows](properties_WebArea.md#use-embedded-web-rendering-engine), un cambio en esta preferencia requiere que se tenga en cuenta una acción de navegación en el área (por ejemplo, una actualización de la página).
-
-Para más información, consulte la descripción del comando [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md).
-
-Cuando haya realizado los ajustes como se ha descrito anteriormente, entonces tendrá nuevas opciones como **Inspeccionar el elemento** en el menú contextual del área. Al seleccionar esta opción, se muestra la ventana del inspector web.
-
-> Para una descripción detallada de las funcionalidades de este depurador, consulte la documentación que ofrece el motor de renderizado web.
-
-## Propiedades soportadas
-
-[Estilo de línea de borde](properties_BackgroundAndBorder.md#border-line-style) - [Fondo](properties_CoordinatesAndSizing.md#bottom) - [Clase](properties_Object.md#css-class) - [Menú contextual](properties_Entry.md#context-menu) - [Altura](properties_CoordinatesAndSizing.md#height) - [Tamaño horizontal](properties_ResizingOptions.md#horizontal-sizing) - [Izquierda](properties_CoordinatesAndSizing.md#left) - [Método](properties_Action.md#method) - [Nombre del objeto](properties_Object.md#nombre-del-objeto) - [Progresión](properties_WebArea.md#progression) - [Derecha](properties_CoordinatesAndSizing.md#right) - [Arriba](properties_CoordinatesAndSizing.md#top) - [Tipo](properties_Object.md#type) - [URL](properties_WebArea.md#url) - [Usar motor de renderizado web incrustado](properties_WebArea.md#use-embedded-web-rendering-engine) - [Variable o expresión](properties_Object.md#variable-or-expression) - [Tamaño vertical](properties_ResizingOptions.md#vertical-sizing) - [Visibilidad](properties_Display.md#visibility) - [Ancho](properties_CoordinatesAndSizing.md#width)
-
-## 4DCEFParameters.json
-
-El 4DCEFParameters.json es un archivo de configuración que permite la personalización de los parámetros CEF para gestionar el comportamiento de las áreas web dentro de las aplicaciones 4D.
-
-Se suministran [interruptores predeterminados](#default-file), pero puede reemplazarlos utilizando un archivo 4DCEFParameters.json personalizado.
-
-En la fase de desarrollo (utilizando la aplicación 4D), cree un archivo 4DCEFParameters.json en la siguiente ubicación:
-
-- Windows: `Users\[userName]\AppData\Roaming\4D\4DCEFParameters.json`
-- macOS: `$HOME/Library/Application Support/4D/4DCEFParameters.json`
-
-Antes de generar la aplicación final, añada el archivo personalizado 4DCEFParameters.json a la carpeta Resources del proyecto.
-
-:::warning
-
-Añadir un archivo 4DCEFParameters.json personalizado puede afectar fundamentalmente a todas las áreas web integradas de 4D, incluyendo las [áreas 4D View Pro](../ViewPro/configuring.md#form-area-properties). Es responsabilidad del desarrollador asegurarse de que los interruptores personalizados no desestabilizan la aplicación 4D.
-
-:::
-
-El formato del archivo 4DCEFParameters.json es el siguiente:
-
-```json
-
-{
- "switches":{
- "key":value
- },
- "macOS":{
- "switches": {
- "key":value
- }
- },
- "windows": {
- "switches": {
- "key":value
- }
- }
-}
-```
-
-La estructura del archivo 4DCEFParameters.json contiene:
-
-- **switches**: una lista de switches CEF y sus correspondientes valores aplicados tanto para macOS como para Windows.
-- **macOS.switches**: conmutadores CEF específicos de macOS.
-- **windows.switches**: interruptores CEF específicos para Windows.
-
-Los interruptores del archivo personalizado tienen prioridad. En caso de duplicación de interruptores dentro del mismo archivo, los interruptores definidos en la subsección específica de la plataforma ("macOS.switches" o "windows.switches") tienen prioridad y son usadas para la configuración.
-
-:::note
-
-La lista de conmutadores compatibles evoluciona constantemente y está gestionada por el equipo de desarrollo de CEF. Para obtener información sobre los conmutadores disponibles, debe consultar la comunidad de desarrolladores de CEF.
-
-:::
-
-### Ejemplos
-
-#### Archivo por defecto
-
-El archivo 4DCEFParameters.json por defecto contiene los siguientes cambios:
-
-```json
-{
- "switches":{
- "enable-media-stream":true,
- "enable-print-preview":true
- },
- "macOS":{
- "switches": {
- "use-mock-keychain": true
- }
- },
- "windows": {
- "switches": {
- "disable-features": "WinUseBrowserSpellChecker"
- }
- }
-}
-
-```
-
-#### Ejemplo de desactivación del interruptor por defecto
-
-```json
-{
- "switches": {
- "disable-javascript": true,
- "disable-web-security": true
- }
-}
-```
-
-#### Ejemplo para Autoplay
-
-```json
-{
- "switches":{
- "autoplay-policy": "no-user-gesture-required"
- }
-}
-```
-
-### Ver también
-
-[Especifique sus propios parámetros para inicializar el área web integrada (entrada de blog)](https://blog.4d.com/specify-your-own-parameters-to-initialize-the-embedded-web-area)
-
-
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/GettingStarted/Installation.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/GettingStarted/Installation.md
deleted file mode 100644
index 4874a392b436fa..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/GettingStarted/Installation.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-id: installation
-title: Instalación
----
-
-¡Bienvenido a 4D! ¡Bienvenido a 4D! A continuación encontrará toda la información necesaria sobre cómo instalar y registrar su aplicación 4D. Welcome to 4D! On this page, you will find all of the necessary information about installing and launching your 4D product.
-
-## Configuración requerida
-
-La página [Descarga de productos](https://us.4d.com/product-download) del sitio web de 4D ofrece información sobre los requisitos mínimos del sistema macOS / Windows para su serie 4D.
-
-Encontrará más detalles técnicos en la [página Recursos](https://us.4d.com/resources/feature-release) del sitio web de 4D.
-
-## Instalación en disco
-
-Los productos 4D se instalan desde el sitio web de 4D:
-
-1. Conéctese al sitio web de 4D y vaya a la página de [Descargas](https://us.4d.com/product-download).
-
-2. Haga clic en el enlace de descarga de su producto 4D y siga las instrucciones en pantalla.
-
-## Conexión
-
-Una vez que haya completado la instalación, puede iniciar 4D e iniciar la sesión. Para ello, haga doble clic en el icono del producto 4D.
-
-
-
-A continuación, aparece el Asistente de bienvenida:
-
-
-
-- Si desea descubrir y explorar 4D, haga clic en el enlace **prueba gratuita**. Sólo se le pedirá que se registre o que cree una cuenta 4D.
-
-- Si ya tiene una cuenta en 4D, haga clic en el enlace **Iniciar sesión** en la parte superior derecha del diálogo del Asistente de Bienvenida e introduzca los datos de su cuenta. Toda licencia 4D ya registrada se actualiza automáticamente (o se cargan paquetes de expansión adicionales) en su máquina.
-
-Despliegue el área **Abrir o crear un proyecto aplicación** y seleccione la acción que desea realizar:
-
-- **Conéctese a 4D Server** - utilice 4D como cliente remoto y conéctese a una aplicación ya cargada por 4D Server.
-
-- **Abra un proyecto de aplicación local**: cargue un proyecto de aplicación existente almacenado en su disco.
-
-- **Cree un nuevo proyecto de aplicación**: cree un nuevo proyecto de aplicación vacío en su disco.
-
-¡Disfrute de su experiencia 4D!
-
-:::info
-
-¿Necesita activar licencias específicas? Visite la página [Gestión de licencias 4D](../Admin/licenses.md).
-
-:::
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/GettingStarted/creating.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/GettingStarted/creating.md
deleted file mode 100644
index 3f0829728d2f20..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/GettingStarted/creating.md
+++ /dev/null
@@ -1,107 +0,0 @@
----
-id: creating
-title: Crear o abrir un proyecto
----
-
-Los proyectos 4D se crean y desarrollan utilizando la aplicación **4D**, que ofrece un completo Entorno de Desarrollo Integrado (IDE). **4D Server** también puede crear nuevos proyectos vacíos.
-
-## Crear un proyecto
-
-Se pueden crear nuevos proyectos de aplicaciones 4D desde **4D** o **4D Server**. En cualquier caso, los archivos del proyecto se almacenan en la máquina local.
-
-Para crear un nuevo proyecto:
-
-1. Lance 4D o 4D Server.
-
-2. Haga una de las siguientes cosas:
- - Selecciona **Nuevo > Proyecto...** en el menú **Archivo**: 
- - (solo 4D) Seleccione **Proyecto...** desde el **Nuevo** botón de la barra de herramientas:

Aparece un diálogo **Guardar** estándar para que pueda elegir el nombre y la ubicación de la carpeta principal del proyecto 4D.
-
-3. Introduzca el nombre de su carpeta de proyecto y haga clic en **Guardar**. Este nombre se utilizará:
-
- - como nombre de la carpeta del proyecto,
- - como nombre del archivo .4DProject en el primer nivel de la [carpeta "Project"](../Project/architecture.md#project-folder).
-
-Puedes elegir cualquier nombre permitido por su sistema operativo. Sin embargo, si su proyecto está destinado a funcionar en otros sistemas o a ser guardado a través de una herramienta de control de fuente, debe tener en cuenta sus recomendaciones de denominación específicas.
-
-Al validar el diálogo **Guardar**, 4D cierra el proyecto actual (si lo hay), crea una carpeta de proyecto en la ubicación indicada y coloca en ella todos los archivos necesarios para el proyecto. Para más información, consulte [Arquitectura de un proyecto 4D](Project/architecture.md).
-
-A continuación, puede empezar a desarrollar su proyecto.
-
-## Abrir un proyecto
-
-Para abrir un proyecto existente desde 4D:
-
-1. Haga una de las siguientes cosas:
-
- - Seleccione **Abrir/Proyecto local...** desde el menú **Archivo** o del botón**Abrir** de la barra de herramientas.
- - Seleccione **Abrir un proyecto de aplicación local** en el diálogo del Asistente de Bienvenida
-
-Aparece la caja de diálogo estándar de apertura de archivos.
-
-2. Seleccione el archivo `.4dproject` del proyecto (situado dentro de la carpeta ["Project" del proyecto](../Project/architecture.md#project-folder)) y haga clic en **Abrir**.
-
- Por defecto, el proyecto se abre con su archivo de datos actual. Se sugieren otros tipos de archivos:
-
- - *Archivos de proyectos empaquetados*: extensión `.4dz` - proyectos de despliegue
- - *Archivos de acceso directo*: extensión `.4DLink` - almacenan los parámetros adicionales necesarios para abrir proyectos o aplicaciones (direcciones, identificadores, etc.)
- - *Archivos binarios*: extensión `.4db` o `.4dc` - formatos de base de datos 4D heredados
-
-### Opciones
-
-Además de las opciones sistema estándar, la caja de diálogo *Abrir* de 4D ofrece dos menús con opciones específicas disponibles utilizando el botón **Abrir** y el menú **Archivo de datos**.
-
-- **Abrir** - modo de apertura del proyecto:
- - **Interpretado** o **Compilado**: estas opciones están disponibles cuando el proyecto seleccionado contiene [código interpretado y compilado](Concepts/interpreted.md).
- - **[Centro de seguridad y de mantenimiento](MSC/overview.md)**: apertura en modo seguro que permite el acceso a los proyectos dañados para realizar las reparaciones necesarias.
-
-- **Archivo de datos** - especifica el archivo de datos a utilizar con el proyecto. Por defecto, está seleccionada la opción **Archivo de datos actual**.
-
-## Atajos de apertura de los proyectos
-
-4D ofrece varias formas de abrir proyectos directamente y evitar el diálogo de apertura:
-
-- mediante las opciones de menú:
- - *Barra de menús* - **Archivo** > **Abrir proyectos recientes / {project name}**
- - *Barra de herramientas 4D* - Seleccione el proyecto en el menú asociado al botón **Abrir**
-
-- vía las preferencias:
- - Fije la preferencia general **Al inicio** en **Abrir el último proyecto utilizado**.
-
-- utilizando un archivo `.4DLink`.
-
-### Abrir un proyecto con un archivo 4DLink
-
-Puede utilizar un archivo [`.4DLink`](#about-4dlink-files) para lanzar la aplicación 4D y abrir el proyecto 4D objetivo. Hay dos maneras de hacer esto:
-
-- haga doble clic o arrastre y suelte el archivo `.4DLink` en la aplicación 4D
-- vaya a **Archivo** > **Abrir los proyectos recientes** y seleccione un proyecto
-
-
-
-Un archivo .4DLink de tipo "proyecto remoto" puede copiarse y utilizarse en varias máquinas.
-
-> También es posible seleccionar un archivo 4DLink en la caja de diálogo de apertura de 4D y 4D Server (abriendo sólo el proyecto local).
-
-## Sobre 4DLink Files
-
-Los archivos con la extensión `.4DLink` son archivos XML que contienen parámetros destinados a automatizar y a simplificar la apertura de proyectos 4D locales o remotos.
-
-Los archivos `.4DLink` pueden guardar la dirección de un proyecto 4D, así como sus identificadores de conexión y el modo de apertura, lo que permite ahorrar tiempo al abrir los proyectos.
-
-4D genera automáticamente un archivo `.4DLink` cuando se abre un proyecto local por primera vez o cuando se conecta a un servidor por primera vez. El archivo se almacena en la carpeta de preferencias locales en la siguiente ubicación:
-
-- Windows: C:\Users\UserName\AppData\Roaming\4D\Favorites vXX\
-- macOS: Users/UserName/Library/Application Support/4D/Favorites vXX/
-
-XX representa el número de versión de la aplicación. Por ejemplo, "Favoritos v19" para 4D v19.
-
-Esa carpeta está dividida en dos subcarpetas:
-
-- la carpeta **Local** contiene los archivos `.4DLink` que pueden utilizarse para abrir proyectos locales
-- la carpeta **Remote** contiene los archivos `.4DLink` de proyectos remotos recientes
-
-Los archivos `.4DLink` también pueden crearse con un editor XML.
-
-4D ofrece un DTD que describe las llaves XML que pueden utilizarse para crear un archivo `.4DLink`. Este DTD se llama database_link.dtd y se encuentra en la subcarpeta `\Resources\DTD\` de la aplicación 4D.
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Notes/updates.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Notes/updates.md
deleted file mode 100644
index 2f15fcde6f1959..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Notes/updates.md
+++ /dev/null
@@ -1,226 +0,0 @@
----
-id: updates
-title: Notas del lanzamiento
----
-
-## 4D 20 R9
-
-Lea [**Novedades en 4D 20 R9**](https://blog.4d.com/en-whats-new-in-4d-20-R9/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R9.
-
-#### Lo más destacado
-
-- Soporte de [token de sesión](../WebServer/sessions.md#session-token-otp) manejado con las nuevas funciones [`Session.createOTP()`](../API/SessionClass.md#createotp) y [`Session.restore()`](../API/SessionClass.md#restore).
-- El asistente de etiqueta ahora utiliza el editor de Fórmula para añadir o editar fórmulas en el [área de diseño de etiquetas](../Desktop/labels.md#label-preview).
-- New [`TCPListener`](../API/TCPListenerClass.md) class to create TCP server connections; new properties in related classes: `address`, `listener` and `port` in [`TCPConnection`](../API/TCPConnectionClass.md) class, `address` and `port` in [`TCPEvent`](../API/TCPEventClass.md) class.
-- Los comandos y constantes obsoletos ahora generan warnings específicos en el [Live Checker y el compilador](../code-editor/write-class-method.md#warnings-and-errors). Puede saber si un comando está obsoleto utilizando el comando [`Command name`](../commands/command-name.md).
-- Nuevos comandos [WA SET CONTEXT](../commands/wa-set-context.md) y [WA Get context](../commands/wa-get-context.md) para controlar los contenidos [$4d](../FormObjects/webArea_overview.md#4d-object) en áreas web.
-- Nuevo [parámetro de base de datos `RDP optimization`](../commands-legacy/set-database-parameter.md#rdp-optimization-133) para optimizar por ejemplo el portapapeles compartidos cuando se usa el protocolo de escritorio remoto con 4D.
-- Los componentes interpretados pueden ahora [editarse desde el proyecto local](../Extensions/develop-components.md#editing-components-from-the-host).
-- [Licencias](../Admin/licenses.md) ahora se actualizan automáticamente al iniciar.
-- Nuevo [componente AIKit 4D](../aikit/overview.md) que permite la interacción con las API IA de terceros.
-- Los siguientes retrollamadas del comando VP ahora esperan que todas las funciones personalizadas de 4D completen sus cálculos: [VP IMPORT DOCUMENT](../ViewPro/commands/vp-import-document.md), [VP IMPORT FORM BLOB](../ViewPro/commands/vp-import-from-blob.md), [VP IMPORT FROM OBJECT](../ViewPro/commands/vp-import-from-object.md), y [VP FLUSH COMMANDS](../ViewPro/commands/vp-flush-commands.md).
-- Nuevas funcionalidades [4D Netkit](https://developer.4d.com/4D-NetKit/) para administrar los calendarios Google y Microsoft 365; capacidad para usar el servidor web local para autenticación OAuth 2.0.
-- La [*biblioteca MeCab*](../settings/database.md#support-of-mecab-japanese-version) (utilizada para ordenar/buscar en idioma japonés) ahora está obsoleta y su soporte se eliminará en la próxima versión.
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R9): lista de todos los bugs que se han corregido en 4D 20 R9.
-
-## 4D 20 R8
-
-Lea [**Novedades en 4D 20 R8**](https://blog.4d.com/en-whats-new-in-4d-20-R8/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R8.
-
-#### Lo más destacado
-
-- Implemente sus propios [**HTTP request handlers**](../WebServer/http-request-handler.md) utilizando la nueva clase [`4D.IncomingMessage`](../API/IncomingMessageClass.md).
-- Las expresiones utilizadas en [propiedades de objetos de formulario](../FormObjects/properties_Reference.md) ahora se benefician de la comprobación de sintaxis en la [Lista de propiedades](../FormEditor/formEditor.md#property-list) y en el [Compilador](../Project/compiler.md#check-syntax).
-- Puede [asociar una clase a un formulario](../FormEditor/properties_FormProperties.md#form-class) para habilitar la anticipación del tipo de código y la instanciación automática de los datos del formulario cuando utilice el comando [`Form`](../commands/form.md).
-- Soporte de [sesiones autónomas](../API/SessionClass.md) para simplificar la codificación local de aplicaciones cliente/servidor.
-- [Depurador 4D](../Debugging/debugger.md): nuevo diseño y autoguardado, funciones de modo de visualización.
-- [Nueva arquitectura de los componentes generados](../Desktop/building.md#build-component) para un mejor cumplimiento de las directrices de notarización de Apple.
-- Ahora puede [crear fácilmente aplicaciones de evaluación](../Desktop/building.md#build-an-evaluation-application) en el cuadro de diálogo de Build App.
-- Dependencias: use el administrador de Dependencias para [buscar nuevas versiones](../Project/components.md#checking-for-new-versions) y [actualizar](../Project/components.md#updating-dependencies) componentes GitHub.
-- Nuevas clases [`TCPConnection`](../API/TCPConnectionClass.md) y [`TCPEvent`](../API/TCPEventClass.md) para gestionar conexiones cliente TCP, manejar eventos y mejorar el control sobre la transmisión de datos. Añadido [`4DTCPLog.txt`](../Debugging/debugLogFiles.md#4dtcplogtxt) para un registro detallado de eventos TCP.
-- Nuevas opciones en [VP EXPORT DOCUMENT](../ViewPro/commands/vp-export-document.md) y [VP IMPORT DOCUMENT](../ViewPro/commands/vp-import-document.md) para controlar estilos, fórmulas, integridad de datos y protección por contraseña.
-- 4D Write Pro:
- - Los siguientes comandos permiten ahora parámetros como objetos o colecciones: [WP SET ATTRIBUTES](../WritePro/commands/wp-set-attributes.md), [WP Get attributes](../WritePro/commands/wp-get-attributes.md), [WP RESET ATTRIBUTES](../WritePro/commands/wp-reset-attributes.md), [WP Table append row](../WritePro/commands/wp-table-append-row.md), [WP Import document](../WritePro/commands/wp-import-document.md), [WP EXPORT DOCUMENT](../WritePro/commands/wp-export-document.md), [WP Add picture](../WritePro/commands/wp-add-picture.md), y [WP Insert picture](../WritePro/commands/wp-insert-picture.md).
- - [WP Insert formula](../WritePro/commands/wp-insert-formula.md), [WP Insert document body](../WritePro/commands/wp-insert-document-body.md), y [WP Insert break](../WritePro/commands/wp-insert-break.md), son ahora funciones que devuelven rangos.
- - New expressions related to document attributes: [This.sectionIndex](../WritePro/managing-formulas.md), [his.sectionName](../WritePro/managing-formulas.md) and [This.pageIndex](../WritePro/managing-formulas.md).
-- Lenguaje 4D:
- - Comandos modificados: [`FORM EDIT`](../commands/form-edit.md)
- - Las funciones [`.sign()`](../API/CryptoKeyClass.md#sign) y [`.verify()`](../API/CryptoKeyClass.md#verify) de la clase [4D.CryptoKey](../API/CryptoKeyClass.md) soportan Blob en el parámetro *message*.
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R8): lista de todos los bugs que se han corregido en 4D 20 R8.
-
-#### Cambios de comportamiento
-
-- Después de una modificación del archivo de registro usando [`SELECT LOG FILE`](../commands/select-log-file.md) o la [Configuración de copia de seguridad](../Backup/settings.md#log-management), el comando [`New log file`](../commands/new-log-file.md) ahora valida el cambio, sin esperar una copia de seguridad. Ya no se produce el error -4447 (copia de seguridad necesaria).
-- Debido a su [nueva arquitectura](../Desktop/building.md#build-component), los componentes creados con 4D 20 R8 y superiores no pueden ser instalados en versiones anteriores 4D.
-
-## 4D 20 R7
-
-Lea [**Novedades en 4D 20 R7**](https://blog.4d.com/en-whats-new-in-4d-20-R7/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R7.
-
-#### Lo más destacado
-
-- Las columnas de los list box y de los encabezados de tipo hora ahora soportan la opción ["blankIfNull"](../FormObjects/properties_Display.md#time-format).
-- Nuevas propiedades en [`.getBoxInfo()`](../API/IMAPTransporterClass.md#getboxinfo) y [`.getBoxList()`](../API/IMAPTransporterClass.md#getboxlist).
-- Ahora puede [añadir y eliminar componentes utilizando la interfaz del gestor de componentes](../Project/components.md#monitoring-project-dependencies).
-- Nuevo [**modo de tipado directo**](../Project/compiler.md#enabling-direct-typing) en el que declara todas las variables y parámetros en su código usando las palabras clave `var` y `#DECLARE`/`Function` (sólo modo soportado en nuevos proyectos). [La función de verificación de sintaxis](../Project/compiler.md#check-syntax) se ha mejorado en consecuencia.
-- Soporte de [singletones de sesión](../Concepts/classes.md#singleton-classes) y nueva propiedad de clase [`.isSessionSingleton`](../API/ClassClass.md#issessionsingleton).
-- Nueva [palabra clave función `onHttpGet`](../ORDA/ordaClasses.md#onhttpget-keyword) para definir funciones singleton u ORDA que pueden ser llamadas a través de [peticiones HTTP REST GET](../REST/ClassFunctions.md#function-calls).
-- Nueva clase [`4D.OutgoingMessage`](../API/OutgoingMessageClass.md) para que el servidor REST devuelva cualquier contenido web.
-- Qodly Studio: ahora puede [adjuntar el depurador Qodly a 4D Server](../WebServer/qodly-studio.md#using-qodly-debugger-on-4d-server).
-- Nuevas llaves Build Application para que las aplicaciones 4D remotas validen las [signatures](https://doc.4d.com/4Dv20R7/4D/20-R7/CertificateAuthoritiesCertificates.300-7425900.en.html) y/o los [dominios](https://doc.4d.com/4Dv20R7/4D/20-R7/CertificateDomainName.300-7425906.en.html).
-- Posibilidad de [crear aplicaciones autónomas sin licencias integradas](../Desktop/building.md#licenses).
-- Lenguaje 4D:
- - Nuevos comandos: [Process info](../commands/process-info.md), [Session info](../commands/session-info.md), [SET WINDOW DOCUMENT ICON](../commands/set-window-document-icon.md)
- - Comandos modificados: [Process activity](../commands/process-activity.md), [Process number](../commands/process-number.md)
- - Deprecated commands (replacement): `GET LAST ERROR STACK` ([Last errors](../commands-legacy/last-errors.md)), `GET SERIAL INFORMATION` ([License info](../commands/license-info.md)), `PROCESS PROPERTIES` ([Process info](../commands/process-info.md)), `SET SCREEN DEPTH`, `C_XXX` commands ([var](../Concepts/variables.md#declaring-variables) and [#DECLARE/Function](../Concepts/parameters.md#declaring-parameters) declarations). Deprecated commands are prefixed with "\*O\*".
-- 4D Write Pro:
- - Nuevo comando: [WP DELETE SECTION](../WritePro/commands/wp-delete-section.md)
- - Comandos modificados: [WP DELETE SUBSECTION](../WritePro/commands/wp-delete-subsection.md) y [WP RESET ATTRIBUTES](../WritePro/commands/wp-reset-attributes.md)
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R7): lista de todos los bugs que se han corregido en 4D 20 R7.
-
-#### Cambios de comportamiento
-
-- La documentación del [Lenguaje 4D](../commands/command-index.md) y del [Lenguaje 4D Write Pro](../WritePro/commands/command-index.md) ya está disponible en developer.4d.com. Descubra todas las novedades y cambios relativos a estas documentaciones en esta nota de la versión.
-- El comando [`File`](../commands/file.md) (así como [`4D.File.new()`](../API/FileClass.md#4dfilenew)) es más estricto a la hora de comprobar la sintaxis de *path* suministrada como parámetro.
-- La acción de [permission](../ORDA/privileges.md#permission-actions) ha sido eliminada de las acciones disponibles. El acceso a las urls [`/rest/$catalog`](../REST/$catalog.md) ya no está controlado. Session *describe* privileges are now ignored.
-
-## 4D 20 R6
-
-Lea [**Novedades en 4D 20 R6**](https://blog.4d.com/en-whats-new-in-4d-20-R6/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R6.
-
-#### Lo más destacado
-
-- Soporte de operadores de comparación en las [referencias de objeto](../Concepts/dt_object.md#object-operators) y las [referencias de colección](../Concepts/dt_collection.md#collection-operators). [`collection.query()`](../API/CollectionClass.md#query) ahora soporta las [referencias de objeto y de colección como valores de consulta](../API/CollectionClass.md#object-or-collection-reference-as-value).
-- Cuando un componente tiene un [espacio de nombres declarado](../Extensions/develop-components.md#declarar-el-espacio-de-nombres-del-componente), sus clases ahora se comparten automáticamente entre todos los componentes cargados en el proyecto del host por [`cs.`](../Concepts/classes.md#cs).
-- Gestión de componentes: soporte de [componentes almacenados en GitHub](../Project/components.md#components-stored-on-github).
-- Nueva función [`entitySelection.clean()`](../API/EntitySelectionClass.md#clean) y API REST [`$clean`](../REST/$clean.md) para obtener una nueva entity selection basada en la entity selection original pero sin sus entidades eliminadas.
-- Nueva función [`session.getPrivileges()`](../API/SessionClass.md#getprivileges) y API REST [`$info/privileges`](../REST/$info.md) para inspeccionar los privilegios de sesión más fácilmente durante la depuración.
-- Nuevo archivo [4DCEFParameters.json](../FormObjects/webArea_overview.md#4dcefparametersjson) para personalizar las áreas web anidadas de 4D.
-- Nueva clase [HTTPAgent](../API/HTTPAgentClass.md) y nueva propiedad [`agent`](../API/HTTPRequestClass.md#options-parameter) para la clase HTTPRequest.
-- Nuevas funciones [`enableState()`](../API/WebFormClass.md) y [`disableState()`](../API/WebFormClass.md) para controlar los estados de las páginas Qodly desde el servidor.
-- Nueva [\`API$singleton](../REST/$singleton.md) para llamar las funciones singleton expuestas desde REST y nuevos [privilegios asociados](../ORDA/privileges.md).
-- Un [nuevo botón de parámetros](../settings/web.md#activate-rest-authentication-through-dsauthentify-function) le ayuda a actualizar su proyecto para utilizar el modo REST "conexión forzada" (el método base `On REST Authentication` es ahora obsoleto).
-- Una [nueva pestaña de parámetros](../Project/compiler.md#warnings) permite definir la generación de advertencias de forma global.
-- Varios comandos, principalmente del tema "entorno 4D", son ahora hilo seguro, así como algunos selectores de los comandos [`SET DATABASE PARAMETER`](../commands-legacy/set-database-parameter.md)/[`Get database parameter`](../commands-legacy/get-database-parameter.md).
-- Nuevo [componente 4D-QPDF](https://github.com/4d/4D-QPDF) que ofrece el comando `PDF Get attachments` para extraer los archivos adjuntos de un documento PDF/A3.
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R6): lista de todos los bugs que se han corregido en 4D 20 R6.
-
-#### Cambios de comportamiento
-
-- Soporte de encadenamiento de desplazamiento en los formularios: los subformularios principales ahora se desplazan automáticamente cuando los objetos integrados deslizables ([verticalmente](../FormObjects/properties_Appearance.md#vertical-scroll-bar) u [horizontalmente](../FormObjects/properties_Appearance.md#horizontal-scroll-bar)) han llegado a sus límites y el usuario sigue desplazándose utilizando el ratón o el trackpad (desplazamiento excesivo).
-- La API REST [`$catalog`](../REST/$catalog.md) ahora devuelve singletons (si los hay).
-
-## 4D 20 R5
-
-Lea [**Las novedades en 4D 20 R5**](https://blog.4d.com/en-whats-new-in-4d-20-R5/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R5.
-
-#### Lo más destacado
-
-- Nuevo [Gestor de componentes](../Project/components.md) para gestionar componentes a través de un archivo `dependencies.json`.
-- Soporte de estructuras de gestión de errores [`Try...Catch...End try`](../Concepts/error-handling.md#trycatchend-try).
-- La capa de red QUIC ahora soporta [broadcasting](../Desktop/clientServer.md#opening-a-remote-project), [SSO](https://doc.4d.com/4Dv20R5/4D/20-R5/Single-Sign-On-SSO-on-Windows.300-6932709.en.html), e [IPv6](https://doc.4d.com/4Dv20R5/4D/20-R5/IP-Settings.300-6932707.en.html).
-- Soporte de [selecciones de entidades restringidas](../ORDA/entities.md#restricting-entity-selections).
-- Soporte de [clases compartidas](../Concepts/classes.md#shared-classes) y de [clases singleton](../Concepts/classes.md#singleton-classes). Nuevas propiedades de clase: [`isShared`](../API/ClassClass.md#isshared), [`isSingleton`](../API/ClassClass.md#issingleton), [`me`](../API/ClassClass.md#me).
-- Soporte para [inicializar una propiedad de clase en su línea de declaración](../Concepts/classes.md#initializing-the-property-in-the-declaration-line).
-- Nuevo modo [forzar login para peticiones REST](../REST/authUsers.md#force-login-mode) con un [soporte específico en Qodly Studio for 4D](../WebServer/qodly-studio.md#force-login).
-- Nuevo parámetro REST [$format](../REST/$format.md).
-- El objeto [`Session`](../commands/session.md) está ahora disponible en sesiones de usuario remotas y en sesiones de procedimientos almacenados.
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R5): lista de todos los bugs que se han corregido en 4D 20 R5.
-
-#### Cambios de comportamiento
-
-- Los plug-ins *4D Internet Commands* y *4D for OCI* ya no se incluyen en los instaladores de 4D. Para obtener estos plug-ins, necesita conectarse al [**portal de descarga de productos 4D**](https://product-download.4d.com/).
-- Los cambios realizados en el editor de estructura en relación con el aspecto gráfico de las tablas y de los campos (color, posición, orden...) ahora se guardan en un archivo separado llamado `catalog_editor.json` almacenado en la carpeta [`Sources`](../Project/architecture.md#sources) del proyecto.
-
-## 4D 20 R4
-
-Lea [**Novedades en 4D 20 R4**](https://blog.4d.com/en-whats-new-in-4d-v20-R4/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R4.
-
-#### Lo más destacado
-
-- Soporte de [formato de cifrado ECDSA\`](../Admin/tls.md#encryption) para certificados TLS.
-- Las conexiones TLS cliente/servidor y servidor SQL ahora se [configuran dinámicamente](../Admin/tls.md#enabling-tls-with-the-other-servers) (no se requieren archivos de certificado).
-- Formato HTML directo para [exportaciones de definición de estructura](https://doc.4d.com/4Dv20R4/4D/20-R4/Exporting-and-importing-structure-definitions.300-6654851.en.html).
-- Nuevo [Code Live Checker](../code-editor/write-class-method.md#warnings-and-errors) que mejora el control del código durante los pasos de declaración, comprobación de sintaxis y compilación para evitar errores de ejecución.
-- Los parámetros de métodos declarados en prototipos `#DECLARE` [ya no son necesarios en métodos "Compiler_"](../Concepts/parameters.md).
-- Soporte de [formatos personalizados de fecha y hora](../Project/date-time-formats.md)
-- Nueva [palabra clave `Try(expression)`](../Concepts/error-handling.md#tryexpression) para tratar casos de error simples.
-- Nuevo comando [`HTTP Parse message`](../commands/http-parse-message.md).
-- Nueva opción de compatibilidad [Impresión no bloqueante](../settings/compatibility.md).
-- Nuevo [modo de edición](../Admin/dataExplorer.md#editing-data) en el Explorador de datos.
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R4): lista de todos los bugs que se han corregido en 4D 20 R4.
-
-#### Cambios de comportamiento
-
-- El uso de una sintaxis heredada para declarar parámetros (por ejemplo, `C_TEXT($1)` o `var $1 : Text`) es obsoleto y genera advertencias en los pasos de escritura de código, verificación de sintaxis y compilación.
-- La coherencia de las selecciones ahora se mantiene después de que se hayan eliminado algunos registros y se hayan creado otros (ver [esta entrada de blog](https://blog.4d.com/4d-keeps-your-selections-of-records-consistent-regarding-deletion-of-records/)).
-- En la actualización de [la librería OpenSSL](#library-table), el nivel de seguridad SSL/TLS por defecto se ha cambiado de 1 a 2. Las llaves RSA, DSA y DH de 1024 bits o más y menos de 2048 bits, así como las llaves ECC de 160 bits o más y menos de 224 bits, ya no están permitidas. Por defecto, la compresión TLS ya estaba desactivada en versiones anteriores de OpenSSL. En el nivel de seguridad 2 no se puede activar.
-- Asegúrese de que su método base "On REST authentication" puede manejar contraseñas en claro (el tercer parámetro es entonces **False**) y que `Open datastore` encripta su conexión pasando la opción "tls" a **True** en *connectionInfo*. Asegúrese de que su método base "On REST authentication" puede manejar contraseñas en claro (el tercer parámetro es entonces **False**) y que `Open datastore` encripta su conexión pasando la opción "tls" a **True** en *connectionInfo*. En casos concretos, también se puede utilizar una nueva opción "passwordAlgorithm" por compatibilidad (ver el comando [`Open datastore`](../commands/open-datastore.md)).
-
-## 4D 20 R3
-
-Lea [**Novedades en 4D 20 R3**](https://blog.4d.com/en-whats-new-in-4d-20-vR3/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R3.
-
-#### Lo más destacado
-
-- Nueva función [`collection.multiSort`](../API/CollectionClass.md#multisort).
-- Soporte del parámetro *context* en [`Formula from string`](../commands/formula-from-string.md).
-- Soporte de la propiedad `headers` en el parámetro *connectionHandler* de [4D.WebSocket.new](../API/WebSocketClass.md#4dwebsocketnew).
-- [Sello de modificación global](../ORDA/global-stamp.md) para ayudar a implementar módulos de sincronización de datos. Nuevas funciones: [`ds.getGlobalStamp`](../API/DataStoreClass.md#getglobalstamp) y [`ds.setGlobalStamp`](../API/DataStoreClass.md#setglobalstamp).
-- La asignación de referencias de archivo a atributos imagen/blob está [soportada en ORDA](../ORDA/entities.md#assigning-files-to-picture-or-blob-attributes).
-- Soporte para [inicializar el valor de la variable y el tipo de datos en la línea de declaración](../Concepts/variables/#initializing-variables-in-the-declaration-line).
-- Los parámetros del archivo de registro se guardan ahora [con el archivo de datos actual](../Backup/settings.md#log-management)
-- Nueva sintaxis para [declarar parámetros variádicos](../Concepts/parameters.md#declaring-variadic-parameters)
-- 4D View Pro: soporte de la [importación](../ViewPro/commands/vp-import-from-blob) y de la [exportación](../ViewPro/commands/vp-export-to-blob) de documentos 4D View Pro al formato Blob.
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R3): lista de todos los bugs que se han corregido en 4D 20 R3.
-
-#### Cambios de comportamiento
-
-- Algunos errores eran detectables por su [método de gestión de errores](../Concepts/error-handling.md) solo en modo interpretado. Se ha realizado una corrección para que los siguientes errores se detecten también en modo compilado: *Indice fuera de rango*, *Tipo incompatible* y *Derreferenciación de un puntero Null*. Sin embargo, para tales errores en los procesadores Intel, el procedimiento se sigue interrumpiendo como antes, mientras que en los procesadores Apple Silicon el procedimiento solo se interrumpe si se llama al comando [`ABORT`](../commands-legacy/abort.md).
-- 4D ya no incluye un intérprete PHP interno. Necesita [configurar y ejecutar su propio intérprete PHP](https://blog.4d.com/deprecation-of-php-commands-and-removal-of-4d-built-in-php-interpreter) para utilizar comandos PHP.
-
-## 4D 20 R2
-
-Lea [**Novedades en 4D 20 R2**](https://blog.4d.com/en-whats-new-in-4d-v20-R2/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R2.
-
-:::warning Nota de seguridad
-
-Si sus aplicaciones 4D utilizan conexiones TLS, se recomienda actualizar a 4D 20 R2 HF1 build 100440 o superior. Para más información, consulte este [Boletín de seguridad](https://blog.4d.com/security-bulletin-two-cves-and-how-to-stay-secure/).
-
-:::
-
-#### Lo más destacado
-
-- Nueva [clase WebSocket](../API/WebSocketClass.md) para crear y gestionar conexiones WebSocket cliente desde 4D.
-- Nueva capa de red QUIC [configuración de interfaz](../settings/client-server.md#network-layer).
-- 4D View Pro: soporte del formato de archivo **.sjs** para [la importación](../ViewPro/commands/vp-import-document) y la [exportación](../ViewPro/commands/vp-export-document) de documentos.
-- Comandos del lenguaje 4D: [Página Novedades](https://doc.4d.com/4Dv20R2/4D/20-R2/What-s-new.901-6398284.en.html) en doc.4d.com.
-- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R2): lista de todos los bugs que se han corregido en 4D 20 R2.
-
-#### Cambios de comportamiento
-
-- **Atención**: el valor inicial [`offset`](../API/FileHandleClass.md#offset) de los objetos [4D.FileHandle](../API/FileHandleClass.md) estaba incorrectamente definido en 1 en lugar de 0. Se ha hecho una corrección en 4D a partir de las versiones **20.1 HF1** y **20 R2** y el valor ahora es 0.
-
-## 4D 20.x LTS
-
-Consulte [**Notas de la versión 4D 20.x LTS**](../../version-20/Notes/updates.md).
-
-## Tabla de la librería
-
-| Librería | Versión actual | Actualizado en 4D | Comentario |
-| --------- | -------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| BoringSSL | 0aa300b | 20 R6 | Utilizado para QUIC |
-| CEF | 131 | 20 R8 | Chromium 6778 |
-| Hunspell | 1.7.2 | 20 | Utilizado para la corrección ortográfica en formularios 4D y 4D Write Pro |
-| ICU | 73.2 | 20 | Esta importante actualización obliga a reconstruir automáticamente los índices alfanuméricos, texto y objeto. |
-| libldap | 2.6.7 | 20 R6 | |
-| libsasl | 2.1.28 | 20 | |
-| Libuv | 1.48 | 20 R6 | Utilizado para QUIC |
-| libZip | 1.9.2 | 20 | Utilizado por los componentes zip class, 4D Write Pro, svg y serverNet |
-| LZMA | 5.4.1 | 20 | |
-| OpenSSL | 3.3.2 | 20 R7 | Se ha actualizado el nivel de seguridad TLS/SSL por defecto. Ver [Cambios de comportamiento](#cambios-de-comportamiento) para la versión 20 R4 |
-| PDFWriter | 4.5.11 | 20 R3 | |
-| PHP | 8.2.4 | 20 | |
-| SpreadJS | 17.1.0 | 20 R7 | Consulte [esta entrada de blog](https://blog.4d.com/4d-view-pro-whats-new-in-4d-20-r7/) para obtener una visión general de las nuevas funciones |
-| webKit | WKWebView | 19 | |
-| Zlib | 1.2.13 | 20 | |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/dsMapping.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/dsMapping.md
deleted file mode 100644
index 5e49e580f0a354..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/dsMapping.md
+++ /dev/null
@@ -1,254 +0,0 @@
----
-id: dsmapping
-title: Objeto del modelo de datos
----
-
-La tecnología ORDA se basa en un mapeo automático de una [estructura de base de datos] subyacente(https://doc.4d.com/4Dv20/4D/20.2/Creating-a-database-structure.200-6750097.en.html). También ofrece acceso a los datos a través de los objetos selección de entidades (entity selection) y entidad (entity). Como resultado, ORDA expone toda la base de datos como un conjunto de objetos del modelo de datos.
-
-## Mapeo de la estructura
-
-Cuando llama a un datastore usando los comandos [`ds`](commands/ds.md) u [`Open datastore`](commands/open-datastore.md), 4D hace referencia automáticamente a tablas y campos de la estructura 4D correspondiente como propiedades del objeto devuelto [datastore](#datastore):
-
-- Las tablas correspondientes a las dataclasses.
-- Los campos corresponden a los atributos de almacenamiento.
-- Las relaciones se mapean a los atributos de relación: los nombres de relación, definidos en el editor de estructura, se utilizan como nombres de atributo de relación.
-
-
-
-### Reglas generales
-
-Se aplican las siguientes reglas para todas las conversiones:
-
-- Los nombres de tabla, campo y relación se mapean a los nombres de propiedad de objeto. Asegúrese de que dichos nombres cumplen con las reglas generales de denominación de objetos, como se explica en la sección [Convenciones de denominación de objetos](Concepts/identifiers.md).
-- Un datastore sólo hace referencia a las tablas con una sola llave primaria. Las siguientes tablas no están referenciadas:
- - Tablas sin llave primaria
- - Tablas con llaves primarias compuestas.
-- Los campos BLOB están disponibles automáticamente como atributos del tipo [objeto Blob](Concepts/dt_blob.md#blob-types).
-
-> El mapeo ORDA no tiene en cuenta:
->
-> - la opción "Invisible" para las tablas o los campos,
-> - the virtual structure defined through [`SET TABLE TITLES`](../commands-legacy/set-table-titles.md) or [`SET FIELD TITLES`](../commands-legacy/set-field-titles.md),
-> - la propiedad "Manual" o "Automática" de las relaciones.
-
-### Normas de control de acceso remoto
-
-Cuando se accede a un datastore remoto a través del comando `Abrir datastore` o [peticiones REST](REST/gettingStarted.md), sólo las tablas y los campos con la propiedad **Exponer como recurso REST** están disponibles de forma remota.
-
-Esta opción debe seleccionarse al nivel de la estructura 4D para cada tabla y cada campo que desee exponer como dataclass y atributo en el datastore:
-
-
-
-### Actualización del modelo de datos
-
-Toda modificación aplicada a la estructura de la base invalida la capa actual del modelo ORDA. Estas modificaciones incluyen:
-
-- la adición o la eliminación de una tabla, de un campo, o de una relación
-- el cambio de nombre de una tabla, de un campo o de una relación
-- la modificación de una propiedad principal de un campo (tipo, único, índice, autoincremento, valor null)
-
-Cuando la capa actual del modelo ORDA ha sido invalidada, es automáticamente recargada y actualizada en llamadas posteriores del datastore local `ds` en 4D y 4D Server. Tenga en cuenta que las referencias existentes a objetos ORDA, tales como entidades o selecciones de entidades, seguirán utilizando el modelo a partir del cual se han creado, hasta que se regeneren.
-
-Sin embargo, la capa actualizada del modelo ORDA no está disponible automáticamente en los siguientes contextos:
-
-- una aplicación 4D remota conectada a 4D Server -- la aplicación remota debe reconectarse al servidor.
-- un datastore remoto abierto mediante `Open datastore` o a través de [llamadas REST](REST/gettingStarted.md) -- debe abrirse una nueva sesión.
-
-## Definiciones de los objetos
-
-### Datastore
-
-El datastore es el objeto de interfaz de una base de datos. Crea una representación de toda la base como objeto. Un datastore está formado por un **modelo** y **datos**:
-
-- El modelo contiene y describe todas las dataclasses que componen el datastore. Es independiente de la propia base de datos subyacente.
-- Los datos se refieren a la información que se va a utilizar y almacenar en este modelo. Por ejemplo, los nombres, direcciones y fechas de nacimiento de los empleados son datos con los que se puede trabajar en un datastore.
-
-Un objeto datastore se maneja a través de funciones y propiedades de la clase [**DataStore**](../API/DataStoreClass.md).
-
-Cuando se maneja a través del código, el datastore es un objeto cuyas propiedades son todas las [dataclasses](#dataclass) que se han expuesto específicamente.
-
-4D le permite gestionar los siguientes datastores:
-
-- el datastore local, basado en la base 4D actual, devuelta por el comando `ds` (el datastore principal).
-- uno o más datastores remotos expuestos como recursos REST en las bases 4D remotas, devueltos por el comando `Open datastore`.
-
-Un datastore hace referencia sólo a una base de datos local o remota.
-
-El objeto datastore en sí no puede ser copiado como un objeto:
-
-```4d
-$mydatastore:=OB Copy(ds) //devuelve null
-```
-
-Las propiedades del datastore son sin embargo enumerables:
-
-```4d
- ARRAY TEXT($prop;0)
- OB GET PROPERTY NAMES(ds;$prop)
- //$prop contiene los nombres de todas las dataclasses
-```
-
-El datastore principal (por defecto) siempre está disponible a través del comando `ds`, pero el comando `Open datastore` permite hacer referencia a todo datastore remoto.
-
-### Dataclass
-
-Una dataclass es el equivalente de una tabla. Se utiliza como modelo de objetos y hace referencia a todos los campos como atributos, incluidos los atributos relacionales (atributos construidos a partir de relaciones entre las dataclasses). Los atributos relacionales pueden utilizarse en las peticiones como cualquier otro atributo.
-
-Un objeto dataclass se maneja a través de funciones y propiedades de la clase [**DataClass**](../API/DataClassClass.md).
-
-Todas las dataclasses de un proyecto 4D están disponibles como propiedad del datastore `ds`. Para los datastores remotos a los que se accede a través de `Open datastore` o [peticiones REST](REST/gettingStarted.md), se debe seleccionar la opción **Exponer como recurso REST** al nivel de la estructura 4D para cada tabla expuesta que se desee exponer como dataclass en el datastore.
-
-Por ejemplo, considere la siguiente tabla en la estructura 4D:
-
-
-
-La tabla `Company` está disponible automáticamente como dataclass en el datastore `ds`. Puede escribir:
-
-```4d
-var $compClass : cs.Empresa //declara una variable objeto $compClass de la clase Company
-$compClass:=ds.Company //asigna la referencia de la dataclass Company a $compClass
-```
-
-Un objeto dataclass puede contener:
-
-- attributes
-- atributos relacionales
-
-La dataclass ofrece una abstracción de la base de datos física y permite manejar un modelo de datos conceptual. El dataclass es el único medio para consultar al datastore. Una consulta se hace desde una única dataclass. Las consultas se crean en torno a los atributos y a los nombres de atributos relacionales de las dataclasses. Así pues, los atributos relacionales son el medio para implicar varias tablas vinculadas en una consulta.
-
-El objeto dataclass mismo no puede copiarse como un objeto:
-
-```4d
-$mydataclass:=OB Copy(ds.Employee) //devuelve null
-```
-
-Las propiedades de la dataclass son sin embargo enumerables:
-
-```code4d
-ARRAY TEXT($prop;0)
-OB GET PROPERTY NAMES(ds.Employee;$prop)
-//$prop contiene los nombres de todos los atributos de dataclass
-```
-
-### Atributo
-
-Las propiedades de dataclass son objetos atributo que describen los campos o relaciones subyacentes. Por ejemplo:
-
-```4d
- $nameAttribute:=ds.Company.name ///referencia a un atributo de clase
- $revenuesAttribute:=ds.Company["revenues"] //forma alternativa
-```
-
-Este código asigna a `$nameAttribute` y `$revenuesAttribute` las referencias a los atributos name y revenues de la clase `Company`. Esta sintaxis NO devuelve valores contenidos dentro del atributo, sino que devuelve referencias a los propios atributos [con sus **propiedades de atributo**](../API/DataClassClass.md#attributename).
-Para manejar los valores, es necesario pasar por [Entidades](#entity).
-
-Todos los campos elegibles de una tabla están disponibles como atributos de su [dataclass](#dataclass) padre. Para los datastores remotos a los que se accede a través de `Open datastore` o [peticiones REST](REST/gettingStarted.md), se debe seleccionar la opción **Exponer como recurso REST** al nivel de la estructura 4D para cada campo que se desee exponer como at
-
-#### Atributos de almacenamiento y relacionales
-
-Los atributos de la Dataclass son de varios tipos: almacenamiento, relatedEntity y relatedEntities. Los atributos escalares (*es decir*, ofrecen un único valor) soportan todos los tipos de datos estándar 4D (entero, texto, objeto, etc.).
-
-- Un **atributo de almacenamiento** equivale a un campo en la base de datos 4D y puede indexarse. Los valores asignados a un atributo de almacenamiento se almacenan como parte de la entidad cuando se guarda. Cuando se accede a un atributo de almacenamiento, su valor procede directamente del datastore. Los atributos de almacenamiento son el bloque de construcción más básico de una entidad y se definen por nombre y tipo de datos.
-- Un **atributo relacional** ofrece acceso a otras entidades. Los atributos relacionales pueden dar como resultado una entidad única (o ninguna entidad), o una selección de entidades (de 0 a N entidades). Los atributos relacionales se basan en las relaciones "clásicas" en la estructura relacional para ofrecer acceso directo a una entidad o a entidades relacionadas. Los atributos relacionales están disponibles directamente en ORDA utilizando sus nombres.
-
-Por ejemplo, considere la siguiente estructura de base de datos parcial y las propiedades relacionales:
-
-
-
-Todos los atributos de almacenamiento estarán disponibles automáticamente:
-
-- en la dataclass Project: "ID", "name", y "companyID"
-- en la dataclasss Company: "ID", "name" y "discount"
-
-Además, los siguientes atributos relacionales también estarán disponibles automáticamente:
-
-- en la dataclass Project: el atributo **theClient**, del tipo "relatedEntity"; hay como máximo una Empresa para cada Proyecto (el cliente)
-- en la dataclass Company: el atributo **companyProjects**, del tipo "relatedEntities"; para cada empresa existe un cierto número de proyectos relacionados.
-
-> La propiedad Manual o Automática de una relación de base de datos no tiene efecto en ORDA.
-
-Todos los atributos de la dataclass se exponen como propiedades de la dataclass:
-
-
-
-Tenga en cuenta que estos objetos describen los atributos, pero no dan acceso a los datos. La lectura o escritura de los datos se realiza a través de los [objetos entidad](entities.md#using-entity-attributes).
-
-#### Atributos calculados y alias
-
-Los [atributos calculados](ordaClasses.md#computed-attributes) y [alias](ordaClasses.md#alias-attributes) son atributos "virtuales". Su valor no se guarda, sino que se evalúa cada vez que se accede a ellos. No pertenecen a la estructura subyacente de la base, sino que se construyen sobre ella y pueden utilizarse como cualquier atributo del modelo de datos.
-
-### Entity
-
-Una entidad es el equivalente a un registro. En realidad es un objeto que hace referencia a un registro de la base de datos. Puede verse como una instancia de una [dataclass](#dataclass), como un registro de la tabla correspondiente a la dataclass. Sin embargo, una entidad también contiene datos correlacionados a la base de datos relacionados con el datastore.
-
-La finalidad de la entidad es gestionar los datos (crear, actualizar, eliminar). Cuando se obtiene una referencia de entidad mediante una selección de entidad, también conserva información sobre la selección de entidad que permite la iteración a través de la selección.
-
-Un objeto de entidad es manejado a través de funciones y propiedades de la clase [**Entity**](../API/EntityClass.md).
-
-El objeto entidad en sí no puede ser copiado como un objeto:
-
-```4d
- $myentity:=OB Copy(ds.Employee.get(1)) //devuelve null
-```
-
-Sin embargo, las propiedades de la entidad son enumerables:
-
-```4d
- ARRAY TEXT($prop;0)
- OB GET PROPERTY NAMES(ds.Employee.get(1);$prop)
- //$prop contiene los nombres de todos los atributos de la entidad
-```
-
-### Entity selection
-
-Una selección de entidades es un objeto que contiene una o varias referencias a entidades pertenecientes a la misma dataclass. Suele crearse como resultado de una consulta o devolverse a partir de un atributo relacional. Una entity selection puede contener 0, 1 o X entidades de la dataclass -- donde X puede representar el número total de entidades contenidas en la dataclass.
-
-Un objeto de selección de entidades se maneja a través de funciones y propiedades de la clase [**EntitySelection**](../API/EntitySelectionClass.md).
-
-Ejemplo:
-
-```4d
-var $e : cs.EmployeeSelection //declara una variable objeto $e del tipo de clase EmployeeSelection
-$e:=ds.Employee.all() //asigna la referencia de la selección de entidad resultante a la variable $e
-```
-
-Las entity selections pueden estar "ordenadas" o "sin ordenar" ([ver abajo](#ordered-or-unordered-entity-selection)).
-
-> Las entity selections también pueden ser "compartibles" o "no compartibles", dependiendo de [cómo se hayan creado](entities.md#shareable-or-alterable-entity-selections).
-
-El objeto selección de entidades en sí no puede ser copiado como un objeto:
-
-```4d
- $myentitysel:=OB Copy(ds.Employee.all()) //devuelve null
-```
-
-Las propiedades de las selecciones de entidades son sin embargo enumerables:
-
-```4d
- ARRAY TEXT($prop;0)
- OB GET PROPERTY NAMES(ds.Employee.all();$prop)
- //$prop contiene los nombres de las propiedades de la selección de entidades
- //("length", 00", "01"...)
-```
-
-#### Entity selections ordenadas o no ordenadas
-
-Por razones de optimización, por defecto, 4D ORDA normalmente crea selecciones de entidades no ordenadas, excepto cuando utiliza el método `orderBy( )` o utiliza opciones específicas. En esta documentación, a menos que se especifique, "selección de entidades" suele referirse a una "selección de entidades no ordenada".
-
-Las selecciones de entidades ordenadas sólo se crean cuando es necesario o cuando se solicitan específicamente mediante opciones, es decir, en los siguientes casos:
-
-- resultado de un `orderBy()` sobre una selección (de cualquier tipo) o de un `orderBy()` sobre una dataclass
-- resultado del método `newSelection()` con la opción `dk keep ordered`
-
-Las selecciones de entidades desordenadas se crean en los siguientes casos:
-
-- resultado de un `query()` estándar sobre una selección (de cualquier tipo) o de un `query()` sobre una dataclass,
-- resultado del método `newSelection()` sin opción,
-- resultado de uno de los métodos de comparación, sean cuales sean los tipos de selección de entrada: `or()`, `and()`, `minus()`.
-
-> Las siguientes selecciones de entidades son siempre **ordenadas**:
->
-> - selecciones de entidades devueltas por 4D Server a un cliente remoto
-> - selecciones de entidades basadas en datastores remotos.
-
-Tenga en cuenta que cuando una selección de entidades ordenada se convierte en una selección de entidades no ordenada, se elimina toda referencia de entidad repetida.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/entities.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/entities.md
deleted file mode 100644
index b47b115b8356fd..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/entities.md
+++ /dev/null
@@ -1,612 +0,0 @@
----
-id: entities
-title: Trabajar con los datos
----
-
-En ORDA, se accede a los datos a través de [entidades](dsMapping.md#entity) y [selecciones de entidades](dsMapping.md#entity-selection). Estos objetos permiten crear, actualizar, buscar u ordenar los datos del datastore.
-
-## Crear una entidad
-
-Hay dos maneras de crear una nueva entidad en una dataclass:
-
-- Como las entidades son referencias a registros de la base de datos, se pueden crear entidades creando registros utilizando el lenguaje 4D y luego referenciarlos con funciones ORDA como [`entity.next()`](../API/EntityClass.md#next) o [`entitySelection.first()`](../API/EntitySelectionClass.md#first).
-- También puede crear una entidad utilizando la función [`dataClass.new()`](../API/DataClassClass.md#new).
-
-Tenga en cuenta que la entidad sólo se crea en la memoria. Si desea añadirla al datastore, debe llamar a la función [`entity.save()`](../API/EntityClass.md#save).
-
-Los atributos de la entidad están disponibles directamente como propiedades del objeto entidad. Para más información, consulte [Uso de los atributos de entidad](#using-entity-attributes).
-
-Por ejemplo, queremos crear una nueva entidad en la dataclass "Employee" en el datastore actual con "John" y "Dupont" asignados a los atributos firstname y name:
-
-```4d
-var $myEntity : cs.EmployeeEntity
-$myEntity:=ds.Employee.new() //Crear un nuevo objeto de tipo entidad
-$myEntity.name:="Dupont" //asignar 'Dupont' al atributo 'name'
-$myEntity.firstname:="John" //asignar 'John' al atributo 'firstname'
-$myEntity.save() //guardar la entidad
-```
-
-> Una entidad se define sólo en el proceso en el que fue creada. No se puede, por ejemplo, almacenar una referencia a una entidad en una variable interproceso y utilizarla en otro proceso.
-
-## Entidades y referencias
-
-Una entidad contiene una referencia a un registro 4D. Diferentes entidades pueden referenciar el mismo registro 4D. Además, como una entidad puede almacenarse en una variable objeto 4D, diferentes variables pueden contener una referencia a la misma entidad.
-
-Si ejecuta el siguiente código:
-
-```4d
- var $e1; $e2 : cs.EmployeeEntity
- $e1:=ds.Employee.get(1) //accede al empleado con ID 1
- $e2:=$e1
- $e1.name:="Hammer"
- //ambas variables $e1 y $e2 comparten la referencia a la misma entidad
- //$e2.name contiene "Hammer"
- If($e1=$e2) //True
-```
-
-Esto es ilustrado por el siguiente gráfico:
-
-
-
-Ahora, si se ejecuta:
-
-```4d
- var $e1; $e2 : cs.EmployeeEntity
- $e1:=ds.Employee.get(1)
- $e2:=ds.Employee.get(1)
- $e1.name:="Hammer"
- //variable $e1 contiene una referencia a una entidad
- //variable $e2 contiene otra referencia a otra entidad
- //$e2.name contiene "smith"
- If($e1=$e2) //False
-```
-
-Esto es ilustrado por el siguiente gráfico:
-
-
-
-Sin embargo, hay que tener en cuenta que las entidades se refieren al mismo registro. En todos los casos, si se llama al método `entity.save( )`, el registro se actualizará (excepto en caso de conflicto, ver [Entity locking](#entity-locking)).
-
-De hecho, `$e1` y `$e2` no son la entidad misma, sino referencias a la entidad. Significa que puede pasarlos directamente a cualquier función o método, y actuará como un puntero, y más rápido que un puntero 4D. Por ejemplo:
-
-```4d
- For each($entity;$selection)
- do_Capitalize($entity)
- End for each
-```
-
-Y el método es:
-
-```4d
- $entity:=$1
- $name:=$entity.lastname
- If(Not($name=Null))
- $name:=Uppercase(Substring($name;1;1))+Lowercase(Substring($name;2))
- End if
- $entity.lastname:=$name
-```
-
-Puede manejar las entidades como cualquier otro objeto en 4D y pasar sus referencias directamente como [parámetros](Concepts/parameters.md).
-
-:::info
-
-Con las entidades, no existe el concepto de "registro actual" como en el lenguaje 4D. Puede utilizar tantas entidades como necesite al mismo tiempo. Tampoco existe un bloqueo automático de una entidad (ver [Bloqueo de una entidad](#entity-locking)). Cuando se carga una entidad, se utiliza el mecanismo de [lazy loading](glossary.md#lazy-loading), lo que significa que sólo se carga la información necesaria. No obstante, en cliente/servidor, la entidad puede cargarse directamente de forma automática si es necesario.
-
-:::
-
-## Uso de los atributos de entidades
-
-Los atributos de entidad almacenan los datos y mapean los campos correspondientes en la tabla correspondiente.
-
-- los atributos de tipo **storage** pueden definirse u obtenerse como propiedades simples del objeto de la entidad,
-- los atributos del tipo **RelatedEntity** devolverán una entidad,
-- los atributos de tipo **relatedEntities** devolverán una selección de entidad,
-- los atributos de tipo **computed** y **alias** pueden devolver todo tipo de datos, dependiendo de cómo estén configurados.
-
-:::info
-
-Para más información sobre el tipo de atributo, consulte el párrafo [Atributos de almacenamiento y de relación](dsMapping.md#storage-and-relation-attributes).
-
-:::
-
-Por ejemplo, para obtener y definir un valor de atributo de almacenamiento de tipo cadena:
-
-```4d
- $entity:=ds.Employee.get(1) //obtener el atributo de Employee con ID 1
- $name:=$entity.lastname //obtener el nombre del empleado, por ejemplo "Smith"
-$entity.lastname:="Jones" //definir el nombr del empleado
-$entity.save() //guardar los cambios
-```
-
-> Los campos Blob de las bases de datos ([blobs escalares](Concepts/dt_blob.md) se convierten automáticamente a y desde atributos de objetos blob ([`4D.Blob`](Concepts/dt_blob.md)) cuando se manejan a través de ORDA. Cuando guarde un atributo de objeto blob, tenga en cuenta que, a diferencia del tamaño del objeto blob, que sólo está limitado por la memoria disponible, el tamaño del campo blob está limitado a 2 GB.
-
-El acceso a un atributo relacionado depende del tipo de atributo. Por ejemplo, con la siguiente estructura:
-
-
-
-Puede acceder a los datos a través del objeto(s) relacionado(s):
-
-```4d
- $entity:=ds.Project.all().first().theClient //obtener la entidad Company asociada al proyecto
- $EntitySel:=ds.Company.all().first().companyProjects //obtener la selección de proyectos de la empresa
-```
-
-Observe que tanto *theClient* como *companyProjects* en el ejemplo anterior son atributos de relación primaria y representan una relación directa entre las dos dataclasses. Sin embargo, los atributos de relación también pueden crearse a partir de rutas vía las relaciones de varios niveles, incluidas las referencias circulares. Por ejemplo, consideremos la siguiente estructura:
-
-
-
-Cada empleado puede ser gerente y puede tener un gerente. Para obtener el gerente del gerente de un empleado, puede simplemente escribir:
-
-```4d
- $myEmp:=ds.Employee.get(50)
- $manLev2:=$myEmp.manager.manager.lastname
-```
-
-### Asignación de archivos a atributos imagen o blob
-
-Puede almacenar imágenes en atributos imagen; de forma similar, puede almacenar cualquier dato binario en atributos blob.
-
-ORDA permite asignar al atributo los datos en sí, es decir, una imagen o un objeto blob, o una **referencia a un archivo** que contenga los datos. Sólo se guarda la ruta del archivo dentro de la entidad.
-
-Gracias a esta funcionalidad, puede reutilizar la misma imagen en varias entidades sin duplicarla, organizar los archivos como desee o utilizarlos fuera de 4D. Además, puede controlar el tamaño del archivo de datos.
-
-La referencia del archivo puede ser:
-
-- un objeto 4D.File
-- una ruta en formato POSIX
-
-Ejemplo:
-
-```4d
-Function createCompany($name : Texto; $logo : 4D.Fichero)
-
- var $company : cs.CompanyEntity
- $company:=ds.Company.new()
-
- $company.name:=$name
- //asignación utilizando un objeto file
- $company.logo:=$logo
- //asignación utilizando una ruta
- $company.datablob:="/RESOURCES/"+$name+"/data.bin"
- $company.save()
-```
-
-Independientemente de cómo se asigne el atributo (datos propiamente dichos o referencia a un archivo), el acceso de lectura al atributo es transparente desde el punto de vista del usuario.
-
-El archivo no tiene que existir en el disco en el momento de la asignación (no se devuelve ningún error en este caso). Si el archivo de referencia no se encuentra cuando se lee el atributo, se devuelve un valor null.
-
-:::tip
-
-4D carga imágenes y datos en una caché local. Si el archivo referenciado es modificado después de haber sido cargado, debe reasignar el archivo para que la modificación se tenga en cuenta en la aplicación.
-
-:::
-
-:::note
-
-La asignación de referencia de archivos solo se admite en modo local (4D Server o 4D mono usuario). Se genera un error si la asignación se realiza de forma remota o a través de una petición REST.
-
-:::
-
-### Asignar los valores a los atributos de relación
-
-En la arquitectura ORDA, los atributos de relación contienen directamente los datos relacionados con las entidades:
-
-- Un atributo de relación de tipo N->1 (**relatedEntity** kind) contiene una entidad
-- Un atributo de relación de tipo 1->N (**relatedEntities** kind) contiene una selección de entidades
-
-Veamos la siguiente estructura (simplificada):
-
-
-
-En este ejemplo, una entidad de la dataclass "Employee" contiene un objeto de tipo Entity en el atributo "employer" (o un valor nulo). Una entidad de la dataclass "Company" contiene un objeto de tipo EntitySelection en el atributo "staff" (o un valor nulo).
-
-> En ORDA, la propiedad Automática o Manual de las relaciones no tiene ningún efecto.
-
-Para asignar un valor directamente al atributo "employer", debe pasar una entidad existente de la dataclass "Company". Por ejemplo:
-
-```4d
- $emp:=ds.Employee.new() //crear un empleado
- $emp.lastname:="Smith" //asignar un valor a un atributo
- $emp.employer:=ds.Company.query("name =:1"; "4D")[0] //asignar una entidad de empresa
- $emp.save()
-```
-
-También puede obtener directamente la entidad relacionada "uno" a través de su valor de llave primaria (Number o Text). Por ejemplo:
-
-```4d
- $emp:=ds.Employee.new()
- $emp.lastname:="Wesson"
- $emp.employer:=ds.Company.get(2)
- //obtiene la entidad Company con valor de llave primaria 2
- //se la asigna al empleado
- $emp.save()
-```
-
-Esto resulta especialmente útil cuando se importan grandes cantidades de datos de una base de datos relacional. Este tipo de importación suele contener una columna "ID", que hace referencia a una llave primaria que puede asignarse directamente a un atributo de relación.
-
-Puede asignar o modificar el valor de un atributo de entidad asociado "1" a partir de la dataclass "N" directamente vía el atributo relacionado. Por ejemplo, si desea modificar el atributo de nombre de una entidad Company asociada de una entidad Employee, puede escribir:
-
-```code4d
- $emp:=ds.Employee.get(2) //cargar la entidad Employee con la llave primaria 2
- $emp.employer.name:="4D, Inc." //modificar el atributo name de la empresa relacionada
- $emp.employer.save() //guardar el atributo relacionado
- //se actualiza la entidad relacionada
-```
-
-## Crear una entity selection
-
-Puede crear un objeto de tipo [entity selection](dsMapping.md#entity-selection) de la siguiente manera:
-
-- Lance una búsqueda en las entidades [en una dataclass](API/DataClassClass.md#query) o en una [selección de entidades existente](API/EntitySelectionClass.md#query);
-- Uso de la función dataclass [`.all()`](API/DataClassClass.md#all) para seleccionar todas las entidades de una dataclass;
-- Usando el comando [`Create entity selection`](../commands/create-entity-selection.md) o la función [`.newSelection()`](API/DataClassClass.md#newselection) de la dataclass para crear una selección de entidades en blanco;
-- Utilizando la función [`.copy()`](API/EntitySelectionClass.md#copy) para duplicar una entity selection existente;
-- Utilizando una de las diversas funciones de la [clase Entity selection](API/EntitySelectionClass.md) que devuelve una nueva selección de entidades, como [`.or()`](API/EntitySelectionClass.md#or);
-- Utilizando un atributo de relación de tipo "related entities" (ver abajo).
-
-:::note
-
-Puede filtrar qué entidades deben incluirse en las selecciones de entidades para una clase de datos en función de toda regla de negocio, gracias a la funcionalidad [selección de entidad restringida](#restricting-entity-selections).
-
-:::
-
-Puede crear y utilizar simultáneamente tantas selecciones de entidades diferentes como desee para una dataclass. Tenga en cuenta que una selección de entidades sólo contiene referencias a entidades. Diferentes selecciones de entidades pueden contener las referencias a las mismas entidades.
-
-:::note
-
-Cuando se eliminan entidades, sus referencias permanecen en la selección de entidades con un valor *undefined*. En este caso, puede llamar a la función [`.clean()`](API/EntitySelectionClass.md#clean) para obtener una nueva selección de entidades pero sin las referencias de entidades eliminadas.
-
-:::
-
-### Entity selections compartibles o modificables
-
-Una entity selection puede ser **compartible** (legible por múltiples procesos, pero no alterable tras su creación) o **modificable** (soporta la función [`.add()`](API/EntitySelectionClass.md#add), pero sólo utilizable por el proceso actual).
-
-#### Propiedades
-
-Una entity selection **compartible** tiene las siguientes características:
-
-- puede almacenarse en un objeto compartido o en una colección compartida, y puede pasarse como parámetro entre varios procesos o workers;
-- puede almacenarse en varios objetos o colecciones compartidos, o en un objeto o colección compartido que ya pertenezca a un grupo;
-- no permite la adición de nuevas entidades. Al intentar añadir una entidad a una entity selection compartibles se producirá un error (1637 - Esta entity selection no puede modificarse). Para añadir una entidad a unaentity selection compartible, primero debe transformarla en una entity selection no compartible utilizando la función [`.copy()`](API/EntitySelectionClass.md#copy), antes de llamar a [`.add()`](API/EntitySelectionClass.md#add).
-
-> La mayoría de las funciones de selección de entidades (como [`.slice()`](API/EntitySelectionClass.md#slice), [`.and()`](API/EntitySelectionClass.md#and)...) soportar selecciones de entidades compartibles ya que no es necesario modificar la selección de entidades original (devuelven una nueva).
-
-Una entity selection **modificable** tiene las siguientes características:
-
-- no puede compartirse entre los procesos, ni almacenarse en un objeto o colección compartido. Si se intenta almacenar una entity selection no compartible en un objeto o colección compartido, se producirá un error (-10721 - Tipo de valor no soportado en un objeto o colección compartido);
-- acepta la adición de nuevas entidades, es decir, soporta la función [`.add()`](API/EntitySelectionClass.md#add).
-
-#### ¿Cómo se definen?
-
-La naturaleza **compartible** o **modificable** de una entity selection se define cuando se crea (no puede modificarse posteriormente). Puede conocer la naturaleza de una entity selection utilizando la función [.isAlterable()](API/EntitySelectionClass.md#isalterable) o el comando `OB Is shared`.
-
-Una nueva entity selection es **compartible** en los siguientes casos:
-
-- la nueva entity selection resulta de una función de clase ORDA aplicada a una dataClass: [dataClass.all()](API/DataClassClass.md#all), [dataClass.fromCollection()](API/DataClassClass.md#fromcollection), [dataClass.query()](API/DataClassClass.md#query),
-- la nueva entity selection se basa en una relación [entity.*attributeName*](API/EntityClass.md#attributename) (por ejemplo, "company.employees") cuando *attributeName* es un atributo relacionado uno a muchos pero la entidad no pertenece a una entity selection.
-- la nueva entity selection se copia explícitamente como compartible con [entitySelection.copy()](API/EntitySelectionClass.md#copy) o `OB Copy` (es decir, con la opción `ck shared`).
-
-Ejemplo:
-
-```4d
-var $myComp : cs.CompanyEntity
-var $employees : cs.EmployeeSelection
-$myComp:=ds.Company.get(2) //$myComp no pertenece a una selección de entidades
-$employees:=$myComp.employees //$employees es compartible
-```
-
-Una nueva entity selection es **compartible** en los siguientes casos:
-
-- la nueva entity selection creada en un espacio vacío utilizando la función [dataClass.newSelection()](API/DataClassClass.md#newselection) o el comando `Create entity selection`,
-- la nueva entity selection se copia explícitamente como modificable con [entitySelection.copy()](API/EntitySelectionClass.md#copy) o `OB Copy` (es decir, sin la opción `ck shared`).
-
-Ejemplo:
-
-```4d
-var $toModify : cs.CompanySelection
-$toModify:=ds.Company.all().copy() //$toModify es alterable
-```
-
-Una nueva entity selection **hereda** de la naturaleza de la entity selection original en los siguientes casos:
-
-- la nueva entity selection resulta de una de las varias funciones de clase ORDA aplicadas a una entity selection existente ([.query()](API/EntitySelectionClass.md#query), [.slice()](API/EntitySelectionClass.md#slice), etc.) .
-- la nueva entity selection se basa en una relación:
- - [entity.*attributeName*](API/EntityClass.md#attributename) (por ejemplo, "company.employees") cuando *attributeName* es un atributo relacionado uno a muchos y la entidad pertenece a una entity selection (misma naturaleza que [.getSelection()](API/EntityClass.md#getselection)),
- - [entitySelection.*attributeName*](API/EntitySelectionClass.md#attributename) (por ejemplo, "employees.employer") cuando *attributeName* es un atributo relacionado (misma naturaleza que la entity selection),
- - [.extract()](API/EntitySelectionClass.md#extract) cuando la colección resultante contiene selecciones de entidades (de la misma naturaleza que la entity selection).
-
-Ejemplos:
-
-```4d
-var $highSal; $lowSal : cs.EmployeeSelection
-var $comp; $comp2 : cs.Company
-
-$highSal:=ds.Employee.query("salary >= :1"; 1000000)
-
- //$highSal es compartible debido a la consulta a la dataClass
-$comp:=$highSal.employer //$comp es compartible porque $highSal es compartible
-
-$lowSal:=ds.Employee.query("salary <= :1"; 10000).copy()
- //$lowSal es alterable debido a copy()
-$comp2:=$lowSal.employer //$comp2 es alterable porque $lowSal es alterable
-```
-
-:::note Entity selections devueltas por el servidor
-
-En la arquitectura cliente/servidor, las entity selections devueltas por el servidor son siempre compartibles en el cliente, incluso si [`copy()`](API/EntitySelectionClass.md#copy) fue llamada en el servidor. Para que dicha selección de entidades sea modificable en el cliente, es necesario ejecutar [`copy()`](API/EntitySelectionClass.md#copy) del lado del cliente. Ejemplo:
-
-```4d
-/una función se ejecuta siempre en el servidor
-exposed Function getSome() : cs.MembersSelection
- devuelve This.query("ID >= :1"; 15).orderBy("ID ASC")
-
- //en un método, se ejecuta en el lado remoto
-var $result : cs.MembersSelection
-var $alterable : Boolean
-$result:=ds.Members.getSome() //$result es compartible
-$alterable:=$result.isAlterable() //False
-
-$result:=ds.Members.getSome().copy() // $result es ahora alterable
-$alterable:=$result.isAlterable() // True
-```
-
-:::
-
-#### Compartir una selección de entidades entre procesos (ejemplo)
-
-Se trabaja con dos selecciones de entidades que se quieren pasar a un proceso worker para que envíe correos a las personas adecuadas:
-
-```4d
-
-var $paid; $unpaid : cs.InvoicesSelection
-//Obtenemos selecciones de entidades para facturas pagadas y no pagadas
-$paid:=ds.Invoices.query("status=:1"; "Paid")
-$unpaid:=ds.Invoices.query("status=:1"; "Unpaid")
-
-//Pasamos referencias de selección de entidades como parámetros al worker
-CALL WORKER("mailing"; "sendMails"; $paid; $unpaid)
-
-```
-
-El método `sendMails`:
-
-```4d
-
-#DECLARE ($paid : cs.InvoicesSelection; $unpaid : cs.InvoicesSelection)
- var $invoice : cs.InvoicesEntity
-
- var $server; $transporter; $email; $status : Object
-
- //Preparar emails
- $server:=New object()
- $server.host:="exchange.company.com"
- $server.user:="myName@company.com"
- $server.password:="my!!password"
- $transporter:=SMTP New transporter($server)
- $email:=New object()
- $email.from:="myName@company.com"
-
- //Bucles en selecciones de entidades
- For each($invoice;$paid)
- $email.to:=$invoice.customer.address // dirección de correo electrónico del cliente
- $email.subject:="Payment OK for invoice # "+String($invoice.number)
- $status:=$transporter.send($email)
- End for each
-
- For each($invoice;$unpaid)
- $email.to:=$invoice.customer.address // dirección de correo electrónico del cliente
- $email.subject:="Please pay invoice # "+String($invoice.number)
- $status:=$transporter.send($email)
- End for each
-```
-
-### Selecciones de entidades y atributos de almacenamiento
-
-Todos los atributos de almacenamiento (texto, número, booleano, fecha) están disponibles como propiedades de las selecciones de entidades, así como de las entidades. Cuando se utiliza junto con una selección de entidad, un atributo escalar devuelve una colección de valores escalares. Por ejemplo:
-
-```4d
-var $locals : cs.PersonSelection
-var $localEmails : Collection
-$locals:=ds.Person.query("city = :1"; "San Jose") //selección de entidades de personas
-$localEmails:=$locals.emailAddress //colección de direcciones de correo electrónico (cadenas)
-```
-
-Este código devuelve en *$localEmails* una colección de direcciones de correo electrónico como cadenas.
-
-### Selecciones de entidades y atributos de relación
-
-Además de la variedad de formas en que puede consultar, también puede utilizar los atributos de relación como propiedades de selecciones de entidades para devolver nuevas selecciones de entidades. Por ejemplo, consideremos la siguiente estructura:
-
-
-
-```4d
-var $myParts : cs.PartSelection
-var $myInvoices : cs.InvoiceSelection
-$myParts:=ds.Part.query("ID < 100") //Retorna las piezas con ID inferior a 100
-$myInvoices:=$myParts.invoiceItems.invoice
- //Todas las facturas con al menos una partida relacionada con una pieza en $myParts
-```
-
-La última línea devolverá en *$myInvoices* una selección de entidades de todas las facturas que tengan al menos una partida de factura relacionada con una parte en la selección de entidades myParts. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades, el resultado es siempre otra selección de entidades, aunque sólo se devuelva una entidad. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades y no se devuelve ninguna entidad, el resultado es una selección de entidades vacía, no nula.
-
-## Restringir la selección de entidades
-
-En ORDA, puede crear filtros para restringir el acceso a entidades de cualquiera de sus clases de datos. Una vez implementado, se aplica automáticamente un filtro siempre que se accede a las entidades de la dataclass, ya sea mediante **funciones de clase ORDA** como [`all()`](../API/DataClassClass.md#all) o [`query()`](../API/EntitySelectionClass.md#query), o por la [**API REST**](../category/api-dataclass) (que implica el [Explorador de datos](../Admin/dataExplorer.md) y [remote datastores](remoteDatastores.md)).
-
-Un filtro crea una vista restringida de los datos, basada en cualquier regla de negocio, como el usuario de la sesión actual. Por ejemplo, en una aplicación utilizada por vendedores para hacer tratos con sus clientes, puede restringir los clientes leídos a los gestionados por el vendedor autenticado.
-
-:::info
-
-Los filtros se aplican a las **entidades**. Si desea restringir el acceso a una **clase de datos** o a uno o varios de sus **atributos**, puede utilizar los [privilegios de sesión](privileges.md), que son más apropiados en este caso.
-
-:::
-
-### Cómo definir un filtro de restricción
-
-Se crea un filtro para una dataclass definiendo una función `event restrict` en la [**clase dataclass**](dsMapping.md#dataclass) de la dataclass. El filtro se activa automáticamente.
-
-### `Function event restrict`
-
-#### Sintaxis
-
-```4d
-Function event restrict() -> $result : cs.*DataClassName*Selection
-// código
-```
-
-Esta función se llama cada vez que se solicita una selección de entidades o una entidad de la dataclass. El filtro se ejecuta una vez, cuando se crea la selección de entidades.
-
-El filtro debe devolver una selección de entidades de la clase de datos. Puede ser una selección de entidades creada a partir de una consulta, almacenada en el [`Storage`], etc.
-
-:::note
-
-Por razones de rendimiento, recomendamos utilizar **atributos indexados** en la definición del filtro.
-
-:::
-
-La función debe devolver una selección de entidades válida de la dataclass. No se aplica ningún filtro (se devuelven todas las entidades correspondientes de la solicitud inicial) si:
-
-- la función devuelve **null**,
-- la función devuelve **indefinido**,
-- la función no devuelve una selección de entidades válida.
-
-#### Ejemplo
-
-Cuando se accede desde una petición web o REST, queremos que la clase de datos Customers sólo exponga los clientes que pertenecen a la persona de ventas identificada. Durante la fase de autenticación, el vendedor se almacena en el objeto `Session`. También se gestionan otros tipos de solicitudes.
-
-```4d
-Class extends DataClass
-
-
-Function event restrict() : cs.CustomersSelection
-
-
- //Trabajamos en un contexto web o REST
- If (Session#Null)
-
- Case of
- // Sólo devuelve los clientes del vendedor autenticado almacenado en la sesión
- : (Session.storage.salesInfo#Null)
- return This.query("sales.internalId = :1"; Session.storage.salesInfo.internalId)
-
- //Explorador de datos - No se aplica ningún filtro
- : (Session.hasPrivilege("WebAdmin"))
- return Null
- Else
- //No se pueden leer clientes
- return This.newSelection()
-
- End case
-
- Else // Trabajamos en cliente servidor
- return This.query("sales.userName = :1"; Current user)
- End if
-```
-
-### Detalles de activación del filtro
-
-Los filtros se aplican a todas las peticiones ORDA o REST ejecutadas en sus proyectos 4D (arquitecturas autónomas y cliente/servidor). Un filtro se activa en cuanto se abre el proyecto, es decir, puede activarse en el método de base de datos `On Startup`.
-
-:::info
-
-Los filtros no se aplican a las selecciones heredadas de registros manejadas a través de la interfaz 4D o el lenguaje 4D (por ejemplo cuando se llama a `ALL RECORDS`).
-
-:::
-
-| Funciones | Comentario |
-| -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [dataclass.get()](../API/DataClassClass.md#get) | Si la entidad no coincide con el filtro, se devuelve `null` |
-| [entity.reload()](../API/EntityClass.md#reload) | Sólo en almacenes de datos cliente/servidor y remotos |
-| [dataclass.all()](../API/DataClassClass.md#all) | |
-| [dataclass.fromCollection()](../API/DataClassClass.md#fromcollection) |
En caso de actualización, sólo pueden actualizarse las entidades que coincidan con el filtro. Si la colección hace referencia a entidades que no coinciden con el filtro, se crean como nuevas entidades (si no hay error de llave primaria duplicada)
En caso de creación, las entidades que no coinciden con el filtro se crean pero no se leerán después de la creación
|
-| [entitySelection.and()](../API/EntitySelectionClass.md#and) | Sólo se devuelven las entidades que coinciden con el filtro |
-| [entitySelection.or()](../API/EntitySelectionClass.md#or) | Sólo se devuelven las entidades que coinciden con el filtro |
-| [entitySelection.minus()](../API/EntitySelectionClass.md#minus) | Sólo se devuelven las entidades que coinciden con el filtro |
-| [dataclass.query()](../API/DataClassClass.md#query) | |
-| [entitySelection.query()](../API/EntitySelectionClass.md#query) | |
-| [entitySelection.attributeName](../API/EntitySelectionClass.md#attributename) | Filtro aplicado si *attributeName* es una entidad relacionada o entidades relacionadas de una clase de datos filtrada (incluyendo alias o atributo calculado) |
-| [entity.attributeName](../API/EntityClass.md#attributename) | Filtro aplicado si *attributeName* corresponde a entidades relacionadas de una clase de datos filtrada (incluyendo alias o atributo calculado) |
-| [Create entity selection](../commands/create-entity-selection.md) | |
-
-Otras funciones ORDA que acceden a los datos no activan directamente el filtro, pero sin embargo se benefician de él. Por ejemplo, la función [`entity.next()`](../API/EntityClass.md#next) devolverá la siguiente entidad de la selección de entidades ya filtrada. Por otro lado, si la selección de entidades no está filtrada, [`entity.next()`](../API/EntityClass.md#next) funcionará en entidades no filtradas.
-
-:::note
-
-Si hay un error en el filtro en tiempo de ejecución, se lanza como si el error viniera de la propia función ORDA.
-
-:::
-
-## Bloqueo de una entidad
-
-A menudo es necesario gestionar los posibles conflictos que pueden surgir cuando varios usuarios o procesos cargan e intentan modificar las mismas entidades al mismo tiempo. El bloqueo de registros es una metodología utilizada en las bases de datos relacionales para evitar actualizaciones incoherentes de los datos. El concepto consiste en bloquear un registro al leerlo para que ningún otro proceso pueda actualizarlo o, alternativamente, comprobar al guardar un registro que ningún otro proceso lo ha modificado desde que se leyó. El primero se denomina **bloqueo de registro pesimista** y garantiza que un registro modificado pueda escribirse a expensas de bloquear los registros a otros usuarios. Este último se conoce como **bloqueo de registro optimista** y cambia la garantía de los privilegios de escritura en el registro por la flexibilidad de decidir privilegios de escritura sólo si el registro necesita ser actualizado. En el bloqueo de registros pesimista, el registro se bloquea aunque no haya necesidad de actualizarlo. En el bloqueo optimista de registros, la validez de la modificación de un registro se decide en el momento de la actualización.
-
-ORDA le ofrece dos modos de bloqueo de entidad:
-
-- un modo automático "optimista", adecuado para la mayoría de las aplicaciones,
-- un modo "pesimista" que permite bloquear las entidades antes de su acceso.
-
-### Bloqueo optimista automático
-
-Este mecanismo automático se basa en el concepto de "bloqueo optimista", especialmente adaptado a los problemas de las aplicaciones web. Este concepto se caracteriza por los siguientes principios de funcionamiento:
-
-- Todas las entidades pueden cargarse siempre en lectura-escritura; no existe el "bloqueo" *a priori* de las entidades.
-- Cada entidad tiene un sello de bloqueo interno que se incrementa cada vez que se guarda.
-- Cuando un usuario o proceso intenta guardar una entidad utilizando el método `entity.save( )`, 4D compara el valor del marcador de la entidad a guardar con el de la entidad encontrada en los datos (en el caso de modificación):
- - Cuando los valores coinciden, se guarda la entidad y se incrementa el valor del marcador interno.
-
- - Cuando los valores no coinciden, significa que otro usuario ha modificado esta entidad mientras tanto. No se guarda y se devuelve un error.
-
-El siguiente diagrama ilustra el bloqueo optimista:
-
-1. Dos procesos cargan la misma entidad.

-
-2. El primer proceso modifica la entidad y valida el cambio. Se llama al método `entity.save( )`. El motor 4D compara automáticamente el valor del marcador interno de la entidad modificada con el de la entidad almacenada en los datos. Dado que coinciden, la entidad se guarda y su valor de marcador se incrementa.

-
-3. El segundo proceso también modifica la entidad cargada y valida sus cambios. Se llama al método `entity.save( )`. Dado que el valor del sello de la entidad modificada no coincide con el de la entidad almacenada en los datos, no se realiza el guardado y se devuelve un error.

-
-Esto también puede ilustrarse con el siguiente código:
-
-```4d
- $person1:=ds.Person.get(1) //Referencia a la entidad
- $person2:=ds.Person.get(1) //Otra referencia a la misma entidad
- $person1.name:="Bill"
- $result:=$person1.save() //$result.success=true, cambio guardado
- $person2.name:="William"
- $result:=$person2.save() //$result.success=false, cambio no guardado
-```
-
-En este ejemplo, asignamos a $person1 una referencia a la entidad person con una llave de 1. A continuación, asignamos otra referencia de la misma entidad a la variable $person2. Con $person1, cambiamos el nombre de la persona y guardamos la entidad. Cuando intentamos hacer lo mismo con $person2, 4D verifica que la entidad en el disco es la misma que cuando se asignó por primera vez la referencia en $person1. Como no es lo mismo, devuelve false en la propiedad success y no guarda la segunda modificación.
-
-Cuando se produce esta situación, puede, por ejemplo, volver a cargar la entidad desde el disco utilizando el método `entity.reload()` para poder intentar realizar de nuevo la modificación. El método `entity.save()` también propone una opción "automerge" para guardar la entidad en caso de que los procesos modificaran atributos que no fueran los mismos.
-
-> Los mardadores de registro no se utilizan en las de **transacciones** porque en este contexto sólo existe una única copia de un registro. Sea cual sea el número de entidades que hacen referencia a un registro, se modifica la misma copia, por lo que las operaciones `entity.save()` nunca generarán errores de marcador.
-
-### Bloqueo pesimista
-
-Puede bloquear y desbloquear las entidades bajo pedido cuando acceda a los datos. Cuando una entidad es bloqueada por un proceso, es cargada en lectura/escritura en este proceso pero es bloqueada para todos los otros procesos. La entidad sólo puede cargarse en modo de sólo lectura en estos procesos; sus valores no pueden editarse ni guardarse.
-
-Esta funcionalidad se basa en dos funciones de la clase `Entity`:
-
-- [`entity.lock()`](../API/EntityClass.md#lock)
-- [`entity.unlock()`](../API/EntityClass.md#unlock)
-
-Para más información, consulte las descripciones de estas funciones.
-
-> Los bloqueos pesimistas también pueden gestionarse a través de la [REST API](../REST/$lock.md).
-
-### Utilización simultánea de los bloqueos clásicos 4D y de los bloqueos pesimistas ORDA
-
-El uso de comandos clásicos y ORDA para bloquear registros se basa en los siguientes principios:
-
-- Un bloqueo definido con un comando 4D clásico en un registro impide a ORDA bloquear la entidad correspondiente al registro.
-- Un bloqueo definido con ORDA en una entidad impide que los comandos 4D clásicos bloqueen el registro que coincide a la entidad.
-
-Estos principios se muestran en el siguiente diagrama:
-
-
-
-Los **bloqueos de transacciones** también se aplican tanto a los comandos clásicos como a los comandos ORDA. En una aplicación multiproceso o multiusuario, un bloqueo definido en una transacción en un registro por un comando clásico tendrá como resultado impedir que cualquier otro proceso bloquee las entidades relacionadas con este registro (o a la inversa), hasta que la transacción sea validada o cancelada.
-
-- Ejemplo con un bloqueo definido por un comando clásico:

-- Ejemplo con un bloqueo definido por una función ORDA:

diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/ordaClasses.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/ordaClasses.md
deleted file mode 100644
index 24b109434de3ad..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/ordaClasses.md
+++ /dev/null
@@ -1,1025 +0,0 @@
----
-id: ordaClasses
-title: Clases del modelo de datos
----
-
-ORDA permite crear funciones de clase de alto nivel sobre el [modelo de datos](https://doc.4d.com/4Dv20/4D/20.2/Creating-a-database-structure.200-6750097.en.html). Esto le permite escribir código orientado al negocio y "publicarlo" como una API. Los almacenes de datos, las clases de datos, las selecciones de entidades y las entidades están disponibles como objetos de clase que pueden contener funciones.
-
-Por ejemplo, podría crear una función `getNextWithHigherSalary()` en la clase `EmployeeEntity` para devolver los empleados con un salario superior al seleccionado. Sería tan sencillo como llamar:
-
-```4d
-$nextHigh:=ds.Employee.get(1).getNextWithHigherSalary()
-```
-
-Los desarrolladores no sólo pueden utilizar estas funciones en almacenes de datos locales, sino también en arquitecturas cliente/servidor y remotas:
-
-```4d
- //$cityManager es la referencia de un datastore remoto
-Form.comp.city:=$cityManager.City.getCityName(Form.comp.zipcode)
-```
-
-Gracias a esta funcionalidad, toda la lógica de negocio de su aplicación 4D puede ser almacenada como una capa independiente para que pueda ser fácilmente mantenida y reutilizada con un alto nivel de seguridad:
-
-- Puede "ocultar" la complejidad global de la estructura física subyacente y exponer únicamente funciones comprensibles y listas para usar.
-
-- Si la estructura física evoluciona, basta con adaptar el código de las funciones y las aplicaciones cliente seguirán llamándolas de forma transparente.
-
-- Los atributos alias de ORDA por defecto son **no expuestos**. Debe añadir la palabra clave [`exposed`](#exposed-vs-non-exposed-functions) antes de la palabra clave `Alias` si desea que el alias esté disponible para peticiones remotas.
-
-
-
-Además, 4D [precrea automáticamente](#creating-classes) las clases para cada objeto del modelo de datos disponible.
-
-## Arquitectura
-
-ORDA ofrece **clases genéricas** expuestas a través del [class store](Concepts/classes.md#class-stores) **`4D`**, así como **clases usuario** (que extienden las clases genéricas) expuestas en el [class store](Concepts/classes.md#class-stores) **`cs`**:
-
-
-
-Todas las clases de modelo de datos ORDA se exponen como propiedades del class store **`cs`**. Las clases ORDA siguientes están disponibles:
-
-| Class | Nombre del ejemplo | Instanciado por |
-| ------------------------------------------------------------------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| cs.DataStore | cs.DataStore | Comando [`ds`](comandos/ds.md) |
-| cs.*DataClassName* | cs.Employee | [`dataStore.DataClassName`](API/DataStoreClass.md#dataclassname), `dataStore["DataClassName"]` |
-| cs._DataClassName_Entity | cs.EmployeeEntity | [`dataClass.get()`](API/DataClassClass.md#get), [`dataClass.new()`](API/DataClassClass.md#new), [`entitySelection.first()`](API/EntitySelectionClass.md#first), [`entitySelection.last()`](API/EntitySelectionClass.md#last), [`entity.previous()`](API/EntityClass.md#previous), [`entity.next()`](API/EntityClass.md#next), [`entity.first()`](API/EntityClass.md#first), [`entity.last()`](API/EntityClass.md#last), [`entity.clone()`](API/EntityClass.md#clone) |
-| cs._DataClassName_Selection | cs.EmployeeSelection | [`dataClass.query()`](API/DataClassClass.md#query), [`entitySelection.query()`](API/EntitySelectionClass.md#query), [`dataClass.all()`](API/DataClassClass.md#all), [`dataClass.fromCollection()`](API/DataClassClass.md#fromcollection), [`dataClass.newSelection()`](API/DataClassClass.md#newselection), [`entitySelection.drop()`](API/EntitySelectionClass.md#drop), [`entity.getSelection()`](API/EntityClass.md#getselection), [`entitySelection.and()`](API/EntitySelectionClass.md#and), [`entitySelection.minus()`](API/EntitySelectionClass.md#minus), [`entitySelection.or()`](API/EntitySelectionClass.md#or), [`entitySelection.orderBy()`](API/EntitySelectionClass.md#or), [`entitySelection.orderByFormula()`](API/EntitySelectionClass.md#orderbyformula), [`entitySelection.slice()`](API/EntitySelectionClass.md#slice), `Create entity selection` |
-
-> Las clases usuario ORDA se almacenan como archivos de clase estándar (.4dm) en la subcarpeta Classes del proyecto [(ver más abajo)](#class-files).
-
-Además, las instancias de objeto de clases usuario de los modelos de datos ORDA se benefician de las propiedades y funciones de sus padres:
-
-- un objeto de clase Datastore puede llamar las funciones de la [clase genérica ORDA Datastore](API/DataStoreClass.md).
-- un objeto de clase Dataclass puede llamar las funciones de la [clase genérica ORDA Dataclass](API/DataClassClass.md).
-- un objeto de clase Entity selection puede llamar las funciones de la [clase genérica ORDA Entity selection](API/EntitySelectionClass.md).
-- un objeto de clase Entity puede llamar las funciones de la [clase genérica ORDA Entity](API/EntityClass.md).
-
-## Descripción de la clase
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 19 R4 | Atributos alias en la Entity Class |
-| 19 R3 | Atributos calculados en la Entity Class |
-| 18 R5 | Las funciones de clase de modelo de datos no están expuestas a REST por defecto. Nuevas palabras clave `exposed` y `local`. |
-
-
-
-### Clase DataStore
-
-Una base de datos 4D expone su propia clase DataStore en el class store `cs`.
-
-- **Extends**: 4D.DataStoreImplementation
-- **Nombre de clase**: cs.DataStore
-
-Puede crear funciones en la clase DataStore que estarán disponibles a través del objeto `ds`.
-
-#### Ejemplo
-
-```4d
-// cs.DataStore class
-
-Class extends DataStoreImplementation
-
-Function getDesc
- $0:="Database exposing employees and their companies"
-```
-
-Esta función puede ser llamada:
-
-```4d
-$desc:=ds.getDesc() //"Database exposing..."
-```
-
-### Clase DataClass
-
-Cada tabla expuesta con ORDA ofrece una clase DataClass en el class store `cs`.
-
-- **Extends**: 4D.DataClass
-- **Nombre de clase**: cs.*DataClassName* (donde *DataClassName* es el nombre de la tabla)
-- **Ejemplo**: cs.Employee
-
-#### Ejemplo
-
-```4D
-// cs.Company class
-
-
-Class extends DataClass
-
-// Devuelve las empresas cuyos ingresos están por encima de la media
-// Devuelve una selección de entidades relacionadas con la clase de datos Company
-
-Function GetBestOnes()
-$sel:=This.query("revenues >= :1";This.all().average("revenues"));
- $0:=$sel
-```
-
-A continuación, puede obtener una selección de entidades de las "mejores" empresas ejecutando:
-
-```4d
- var $best : cs.CompanySelection
- $best:=ds.Company.GetBestOnes()
-```
-
-:::info
-
-[Los atributos calculados](#computed-attributes) se definen en [la clase Entity](#entity-class).
-
-:::
-
-#### Ejemplo con un datastore remoto
-
-El catálogo *City* siguiente está expuesto en un datastore remoto (vista parcial):
-
-
-
-La clase `City` ofrece una API:
-
-```4d
-// cs.City class
-
-Class extends DataClass
-
-Function getCityName($zipcode : Integer) -> $cityName : Text
- var $zip : 4D.Entity
-
- $zip:=ds.ZipCode.get($zipcode)
- $cityName:=""
-
- If ($zip#Null)
- $cityName:=$zip.city.name
- End if
-```
-
-La aplicación cliente abre una sesión en el datastore remoto:
-
-```4d
-$cityManager:=Open datastore(New object("hostname";"127.0.0.1:8111");"CityManager")
-```
-
-A continuación, una aplicación cliente puede utilizar la API para obtener la ciudad correspondiente al código postal (por ejemplo) a partir de un formulario:
-
-```4d
-Form.comp.city:=$cityManager.City.getCityName(Form.comp.zipcode)
-
-```
-
-### Clase EntitySelection
-
-Cada tabla expuesta con ORDA ofrece una clase EntitySelection en el class store `cs`.
-
-- **Extends**: 4D.EntitySelection
-- **Nombre de clase**: _DataClassName_Selection (donde *DataClassName* es el nombre de la tabla)
-- **Ejemplo**: cs.EmployeeSelection
-
-#### Ejemplo
-
-```4d
-// cs.EmployeeSelection class
-
-
-Class extends EntitySelection
-
-//Extraer los empleados con un salario superior a la media de esta selección de entidades
-
-Function withSalaryGreaterThanAverage() : cs.EmployeeSelection
- return This.query("salary > :1";This.average("salary")).orderBy("salary")
-
-```
-
-A continuación, puede obtener los empleados con un salario superior a la media en cualquier selección de entidades mediante la ejecución:
-
-```4d
-$moreThanAvg:=ds.Company.all().employees.withSalaryGreaterThanAverage()
-```
-
-:::info
-
-[Los filtros de selección de entidades restringidas](entities.md#restricting-entity-selections) se definen en la clase de datos .
-
-:::
-
-### Entity Class
-
-Cada tabla expuesta con ORDA ofrece una clase Entity en el class store `cs`.
-
-- **Extends**: 4D.Entity
-- **Nombre de clase**: _DataClassName_Entity (donde *DataClassName* es el nombre de la tabla)
-- **Ejemplo**: cs.CityEntity
-
-#### Atributos calculados
-
-Las clases Entity permiten definir **atributos calculados** utilizando palabras clave específicas:
-
-- `Función get` *attributeName*
-- `Función set` *attributeName*
-- `Function query` *attributeName*
-- `Función orderBy` *attributeName*
-
-Para más información, consulte la sección [Atributos calculados](#computed-attributes-1).
-
-#### Atributos de tipo alias
-
-Las clases Entity permiten definir **atributos alias**, normalmente sobre atributos relacionados, utilizando la palabra clave `Alias`:
-
-`Alias` *attributeName* *targetPath*
-
-Para más información, consulte la sección [Atributos alias](#alias-attributes-1).
-
-#### Ejemplo
-
-```4d
-// cs.CityEntity class
-
-Class extends Entity
-
-Function getPopulation() : Integer
- return This.zips.sum("población")
-
-
-Function isBigCity(): Boolean
-// La función getPopulation() es utilizable dentro de la clase
- devuelve This.getPopulation()>50000
-```
-
-Luego puede llamar este código:
-
-```4d
-var $cityManager; $city : Object
-
-$cityManager:=Open datastore(New object("hostname";"127.0.0.1:8111");"CityManager")
-$city:=$cityManager.City.getCity("Caguas")
-
-If ($city.isBigCity())
- ALERT($city.name + " is a big city")
-End if
-```
-
-### Reglas específicas
-
-Al crear o editar clases de modelos de datos, debe prestar atención a las siguientes reglas:
-
-- Dado que se utilizan para definir nombres de clase DataClass automáticos en el [class store](Concepts/classes.md#class-stores) **cs**, las tablas 4D deben nombrarse para evitar todo conflicto en el espacio de nombres **cs**. En particular:
- - No dé el mismo nombre a una tabla 4D y a una [clase de usuarios](../Concepts/classes.md#class-definition). En tal caso, el constructor de la clase usuario queda inutilizado (el compilador devuelve una advertencia).
- - No utilice un nombre reservado para una tabla 4D (por ejemplo, "DataClass").
-
-- Al definir una clase, asegúrese de que la instrucción [`Class extends`](../Concepts/classes.md#class-extends-classname) coincida exactamente con el nombre de la clase padre (recuerde que son sensibles a mayúsculas y minúsculas). Por ejemplo, `Class extends EntitySelection` para una clase de selección de entidades.
-
-- No se puede instanciar un objeto de clase de modelo de datos con la palabra clave `new()` (se devuelve un error). Debe utilizar un método regular como se muestra en la [columna `Instantiated by` de la tabla de clases ORDA](#architecture).
-
-- No puede sobrescribir una función de clase ORDA nativa del [class store](Concepts/classes.md#class-stores) **`4D`** con una función de clase usuario de modelo de datos.
-
-### Ejecución apropiativa
-
-Cuando se compilan, las funciones de clase del modelo de datos se ejecutan:
-
-- en **procesos apropiativos o cooperativos** (dependiendo del proceso de llamada) en aplicaciones monopuesto,
-- en **procesos apropiativos** en las aplicaciones cliente/servidor (excepto si se utiliza la palabra clave [`local`](#local-functions), en cuyo caso depende del proceso llamante como en monopuesto).
-
-Si su proyecto está diseñado para ejecutarse en cliente/servidor, asegúrese de que el código de la función de clase del modelo de datos es hilo seguro. Si se llama un código thread-unsafe, se lanzará un error en tiempo de ejecución (no se lanzará ningún error al momento de la compilación ya que la ejecución cooperativa está soportada en las aplicaciones monopuesto).
-
-## Atributos calculados
-
-### Generalidades
-
-Un atributo calculado es un atributo de clase de datos con un tipo de datos que enmascara un cálculo. [Clases 4D estándar](Concepts/classes.md) implementa el concepto de propiedades calculadas con `get` (*getter*) y `set` (*setter*) [accessor functions](Concepts/classes.md#function-get-and-function-set). Los atributos de las clases de datos ORDA se benefician de esta funcionalidad y la extienden con dos funcionalidades adicionales: `query` y `orderBy`.
-
-Como mínimo, un atributo calculado requiere una función `get` que describa cómo se calculará su valor. Cuando se suministra una función *getter* para un atributo, 4D no crea el espacio de almacenamiento subyacente en el datastore sino que sustituye el código de la función cada vez que se accede al atributo. Si no se accede al atributo, el código nunca se ejecuta.
-
-Un atributo calculado también puede implementar una función `set`, que se ejecuta cada vez que se asigna un valor al atributo. La función *setter* describe qué hacer con el valor asignado, normalmente redirigiéndolo a uno o más atributos de almacenamiento o en algunos casos a otras entidades.
-
-Al igual que los atributos de almacenamiento, los atributos calculados pueden incluirse en **búsquedas**. Por defecto, cuando se utiliza un atributo calculado en una búsqueda ORDA, el atributo se calcula una vez por entidad examinada. En algunos casos esto es suficiente. Sin embargo, para un mejor rendimiento, especialmente en cliente/servidor, los atributos calculados pueden implementar una función `query` que se basa en los atributos reales de la clase de datos y se beneficia de sus índices.
-
-Del mismo modo, los atributos calculados pueden incluirse en **ordenaciones**. Cuando se utiliza un atributo calculado en una ordenación ORDA, el atributo se calcula una vez por entidad examinada. Cuando se utiliza un atributo calculado en una ordenación ORDA, el atributo se calcula una vez por entidad examinada.
-
-### Cómo definir los atributos calculados
-
-Se crea un atributo calculado definiendo un accesor `get` en la [**clase entity**](#entity-class) de la dataclass. El atributo calculado estará disponible automáticamente en los atributos de la dataclass y en los atributos de la entidad.
-
-También pueden definirse en la clase entity otras funciones de atributos calculados (`set`, `query` y `orderBy`). Son opcionales.
-
-Dentro de las funciones de atributos calculados, [`This`](Concepts/classes.md#this) designa la entidad. Los atributos calculados pueden utilizarse y manejarse como cualquier atributo de dataclass, es decir, serán procesados por las funciones de [clase entity](API/EntityClass.md) o [clase entity selection](API/EntitySelectionClass.md).
-
-> Los atributos calculados ORDA no están [**expuestos**](#exposed-vs-non-exposed-functions) por defecto. Para exponer un atributo calculado, añada la palabra clave `exposed` a la definición de la función \*\*get \*\*.
-
-> **Las funciones get y set** pueden tener la propiedad [**local**](#local-functions) para optimizar el procesamiento cliente/servidor.
-
-### `Function get `
-
-#### Sintaxis
-
-```4d
-{local} {exposed} Function get ({$event : Object}) -> $result : type
-// code
-```
-
-La función *getter* es obligatoria para declarar el atributo calculado *attributeName*. Cada vez que se accede al atributo *attributeName*, 4D evalúa el código `Function get` y devuelve el valor *$result*.
-
-> Un atributo calculado puede utilizar el valor de otro(s) atributo(s) calculado(s). Las llamadas recursivas generan errores.
-
-La función *getter* define el tipo de datos del atributo calculado gracias al parámetro *$result*. Se permiten los siguientes tipos resultantes:
-
-- Scalar (text, boolean, date, time, number)
-- Object
-- Imagen
-- BLOB
-- Entity (por ejemplo, cs.EmployeeEntity)
-- Entity selection (p.e. cs.EmployeeeSelection)
-
-El parámetro *$event* contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
-| attributeName | Text | Nombre de atributo calculado |
-| dataClassName | Text | Nombre de la clase de datos |
-| kind | Text | "get" |
-| resultado | Variant | Opcional. Añada esta propiedad con valor Null si desea que un atributo escalar devuelva Null |
-
-#### Ejemplos
-
-- El campo calculado *fullName*:
-
-```4d
-Function get fullName($event : Object)-> $fullName : Text
-
- Case of
- : (This.firstName=Null) & (This.lastName=Null)
- $event.result:=Null //use result to return Null
- : (This.firstName=Null)
- $fullName:=This.lastName
- : (This.lastName=Null)
- $fullName:=This.firstName
- Else
- $fullName:=This.firstName+" "+This.lastName
- End case
-```
-
-- Un atributo calculado puede basarse en un atributo relativo a una entidad:
-
-```4d
-Function get bigBoss($event : Object)-> $result: cs.EmployeeEntity
- $result:=This.manager.manager
-
-```
-
-- Un atributo calculado puede basarse en un atributo relacionado con una entity selection:
-
-```4d
-Function get coWorkers($event : Object)-> $result: cs.EmployeeSelection
- If (This.manager.manager=Null)
- $result:=ds.Employee.newSelection()
- Else
- $result:=This.manager.directReports.minus(this)
- End if
-```
-
-### `Function set `
-
-#### Sintaxis
-
-```4d
-
-{local} Function set ($value : type {; $event : Object})
-// code
-```
-
-La función *setter* se ejecuta cada vez que se asigna un valor al atributo. Esta función suele procesar los valores de entrada y el resultado se envía entre uno o varios atributos.
-
-El parámetro *$value* recibe el valor asignado al atributo.
-
-El parámetro *$event* contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ------- | ---------------------------------------- |
-| attributeName | Text | Nombre de atributo calculado |
-| dataClassName | Text | Nombre de la clase de datos |
-| kind | Text | "set" |
-| value | Variant | Valor a tratar por el atributo calculado |
-
-#### Ejemplo
-
-```4d
-Function set fullName($value : Text; $event : Object)
- var $p : Integer
- $p:=Position(" "; $value)
- This.firstname:=Substring($value; 1; $p-1) // "" if $p<0
- This.lastname:=Substring($value; $p+1)
-```
-
-### `Function query `
-
-#### Sintaxis
-
-```4d
-Function query ($event : Object)
-Function query ($event : Object) -> $result : Text
-Function query ($event : Object) -> $result : Object
-// code
-```
-
-Esta función soporta tres sintaxis:
-
-- Con la primera sintaxis, se maneja toda la consulta a través de la propiedad del objeto `$event.result`.
-- Con la segunda y tercera sintaxis, la función devuelve un valor en *$result*:
-
- - Si *$result* es un texto, debe ser una cadena de consulta válida
- - Si *$result* es un Objeto, debe contener dos propiedades:
-
- | Propiedad | Tipo | Descripción |
- | ---------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------- |
- | $result.query | Text | Cadena de búsqueda válida con marcadores de posición (:1, :2, etc.) |
- | $result.parameters | Collection | valores para marcadores |
-
-La función `query` se ejecuta cada vez que se lanza una consulta que utiliza el atributo calculado. Resulta útil personalizar y optimizar las consultas basándose en los atributos indexados. Cuando la función `query` no está implementada para un atributo calculado, la búsqueda es siempre secuencial (basada en la evaluación de todos los valores utilizando la función `get `).
-
-> No se soportan las siguientes funcionalidades:
->
-> - llamar a una función `query` en los atributos calculados de tipo Entity o Entity selection,
-> - utilizando la palabra clave `order by` en la cadena de consulta resultante.
-
-El parámetro *$event* contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| attributeName | Text | Nombre de atributo calculado |
-| dataClassName | Text | Nombre de la clase de datos |
-| kind | Text | "query" |
-| value | Variant | Valor a tratar por el atributo calculado |
-| operator | Text | Operador de búsqueda (ver también la [función de clase `query`](API/DataClassClass.md#query)). Valores posibles:
== (igual a, @ es un comodín)
=== (igual a, @ no es un comodín)
!= (no igual a, @ es un comodín)
!== (no igual a, @ no es un comodín)
< (menor que)
<= (menor que o igual a)
> (mayor que)
>= (mayor que o igual a)
IN (incluido en)
% (contiene la palabra clave)
|
-| resultado | Variant | Valor a tratar por el atributo calculado. Pase `Null` en esta propiedad si desea que 4D ejecute la consulta por defecto (siempre secuencialmente para los atributos calculados). |
-
-> Si la función devuelve un valor en *$result* y se asigna otro valor a la propiedad `$event.result`, se da prioridad a `$event.result`.
-
-#### Ejemplos
-
-- Búsqueda en el atributo calculado *fullName*.
-
-```4d
-Function query fullName($event : Object)->$result : Object
-
- var $fullname; $firstname; $lastname; $query : Text
- var $operator : Text
- var $p : Integer
- var $parameters : Collection
-
- $operator:=$event.operator
- $fullname:=$event.value
-
- $p:=Position(" "; $fullname)
- If ($p>0)
- $firstname:=Substring($fullname; 1; $p-1)+"@"
- $lastname:=Substring($fullname; $p+1)+"@"
- $parameters:=New collection($firstname; $lastname) // two items collection
- Else
- $fullname:=$fullname+"@"
- $parameters:=New collection($fullname) // single item collection
- End if
-
- Case of
- : ($operator="==") | ($operator="===")
- If ($p>0)
- $query:="(firstName = :1 and lastName = :2) or (firstName = :2 and lastName = :1)"
- Else
- $query:="firstName = :1 or lastName = :1"
- End if
- : ($operator="!=")
- If ($p>0)
- $query:="firstName != :1 and lastName != :2 and firstName != :2 and lastName != :1"
- Else
- $query:="firstName != :1 and lastName != :1"
- End if
- End case
-
- $result:=New object("query"; $query; "parameters"; $parameters)
-```
-
-> Ten en cuenta que el uso de marcadores de posición en consultas basadas en la entrada de texto del usuario es recomendado por razones de seguridad (ver la [descripción de `query()`](API/DataClassClass.md#query)).
-
-Código de llamada, por ejemplo:
-
-```4d
-$emps:=ds.Employee.query("fullName = :1"; "Flora Pionsin")
-```
-
-- Esta función gestiona las consultas sobre el atributo calculado *age* y devuelve un objeto con parámetros:
-
-```4d
-Function query age($event : Object)->$result : Object
-
- var $operator : Text
- var $age : Integer
- var $_ages : Collection
-
- $operator:=$event.operator
-
- $age:=Num($event.value) // integer
- $d1:=Add to date(Current date; -$age-1; 0; 0)
- $d2:=Add to date($d1; 1; 0; 0)
- $parameters:=New collection($d1; $d2)
-
- Case of
-
- : ($operator="==")
- $query:="birthday > :1 and birthday <= :2" // after d1 and before or egal d2
-
- : ($operator="===")
-
- $query:="birthday = :2" // d2 = second calculated date (= birthday date)
-
- : ($operator=">=")
- $query:="birthday <= :2"
-
- //... other operators
-
-
- End case
-
-
- If (Undefined($event.result))
- $result:=New object
- $result.query:=$query
- $result.parameters:=$parameters
- End if
-
-```
-
-Código de llamada, por ejemplo:
-
-```4d
-// personas de entre 20 y 21 años (-1 día)
-$twenty:=people.query("age = 20") // llama al case "=="
-
-// personas de 20 años hoy
-$twentyToday:=people.query("age === 20") // equivalente a people.query("age is 20")
-
-```
-
-### `Function orderBy `
-
-#### Sintaxis
-
-```4d
-Function orderBy ($event : Object)
-Function orderBy ($event : Object)-> $result : Text
-
-// code
-```
-
-La función `orderBy` se ejecuta siempre que sea necesario ordenar el atributo calculado. Permite ordenar el atributo calculado. Por ejemplo, puede ordenar *fullName* en función de los nombres y luego de los apellidos, o a la inversa.
-Cuando la función `orderBy` no está implementada para un atributo calculado, la ordenación es siempre secuencial (basada en la evaluación de todos los valores utilizando la función `get `).
-
-> **No se soporta** la llamada a una función `orderBy` sobre atributos calculados de tipo Entity class o Entity selection class.
-
-El parámetro *$event* contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
-| attributeName | Text | Nombre de atributo calculado |
-| dataClassName | Text | Nombre de la clase de datos |
-| kind | Text | "orderBy" |
-| value | Variant | Valor a tratar por el atributo calculado |
-| operator | Text | "desc" o "asc" (por defecto) |
-| descending | Boolean | `true` para orden descendente, `false` para orden ascendente |
-| resultado | Variant | Valor a tratar por el atributo calculado. Pase `Null` si desea que 4D ejecute la ordenación por defecto. |
-
-> Puede utilizar el `operator` o la propiedad `descending`. Es esencialmente una cuestión de estilo de programación (ver ejemplos).
-
-Puede devolver la cadena `orderBy` en la propiedad del objeto `$event.result` o en el resultado de la función *$result*. Si la función devuelve un valor en *$result* y se asigna otro valor a la propiedad `$event.result`, se da prioridad a `$event.result`.
-
-#### Ejemplo
-
-Puede escribir código condicional:
-
-```4d
-Function orderBy fullName($event : Object)-> $result : Text
- If ($event.descending=True)
- $result:="firstName desc, lastName desc"
- Else
- $result:="firstName, lastName"
- End if
-```
-
-También puede escribir un código compacto:
-
-```4d
-Function orderBy fullName($event : Object)-> $result : Text
- $result:="firstName "+$event.operator+", "lastName "+$event.operator
-
-```
-
-El código condicional es necesario en algunos casos:
-
-```4d
-Function orderBy age($event : Object)-> $result : Text
-
- If ($event.descending=True)
- $result:="birthday asc"
- Else
- $result:="birthday desc"
- End if
-
-```
-
-## Atributos de tipo alias
-
-### Generalidades
-
-Un atributo **alias** se crea sobre otro atributo del modelo de datos, denominado **atributo de destino**. El atributo de destino puede pertenecer a una clase de datos relacionada (disponible a través de todo número de niveles de relación) o a la misma clase de datos. Un atributo alias no almacena ningún dato, sino la ruta a su atributo de destino. Puede definir tantos atributos de alias como desee en una clase de datos.
-
-Los atributos del alias son particularmente útiles para manejar las relaciones N a N. Aportan más legibilidad y simplicidad en el código y en las consultas al permitir basarse en conceptos de negocio en lugar de en detalles de implementación.
-
-### Cómo definir los atributos alias
-
-Se crea un atributo alias en una dataclass utilizando la palabra clave `Alias` en la [**clase Entity**](#entity-class) de la dataclass.
-
-### `Alias `
-
-#### Sintaxis
-
-```
-{exposed} Alias
-```
-
-*attributeName* debe cumplir las [reglas estándar para nombres de propiedades](../Concepts/identifiers.md#object-properties).
-
-*targetPath* es una ruta atributo que contiene uno o más niveles, como "employee.company.name". Si el atributo de destino pertenece a la misma clase de datos, *targetPath* es el nombre del atributo.
-
-Un alias puede ser utilizado como parte de una ruta de otro alias.
-
-Un [atributo calculado](#computed-attributes-1) puede utilizarse en una ruta alias, pero sólo como último nivel de la ruta; de lo contrario, se devuelve un error. Por ejemplo, si "fullName" es un atributo calculado, un alias con ruta "employee.fullName" es válido.
-
-> Los atributos alias de ORDA por defecto son **no expuestos**. Debe añadir la palabra clave [`exposed`](#exposed-vs-non-exposed-functions) antes de la palabra clave `Alias` si desea que el alias esté disponible para peticiones remotas.
-
-### Uso de los atributos alias
-
-Los atributos alias son de sólo lectura (excepto cuando se basan en un atributo escalar de la misma clase de datos, ver el último ejemplo a continuación). Pueden utilizarse en lugar de la ruta de su atributo de destino en funciones de clase como:
-
-| Function |
-| ---------------------------------------------- |
-| `dataClass.query()`, `entitySelection.query()` |
-| `entity.toObject()` |
-| `entitySelection.toCollection()` |
-| `entitySelection.extract()` |
-| `entitySelection.orderBy()` |
-| `entitySelection.orderByFormula()` |
-| `entitySelection.average()` |
-| `entitySelection.count()` |
-| `entitySelection.distinct()` |
-| `entitySelection.sum()` |
-| `entitySelection.min()` |
-| `entitySelection.max()` |
-| `entity.diff()` |
-| `entity.touchedAttributes()` |
-
-> Tenga en cuenta que los atributos alias se calculan en el servidor. En las configuraciones remotas, la actualización de los atributos alias en las entidades requiere que éstas se vuelvan a cargar desde el servidor.
-
-### Propiedades del alias
-
-El atributo alias [`kind`](../API/DataClassClass.md#attributename) es "alias".
-
-Un atributo alias hereda su propiedad de [`type`](../API/DataClassClass.md#attributename) del atributo objetivo:
-
-- si el [`kind`](../API/DataClassClass.md#attributename) del atributo objetivo es "storage", el tipo de datos del alias es del mismo tipo,
-- si el [`kind`](../API/DataClassClass.md#attributename) del atributo objetivo es "relatedEntity" o "relatedEntities", el tipo de datos del alias es de tipo `4D.Entity` o `4D.EntitySelection` ("_classname_Entity" o "_classname_Selection").
-
-Los atributos alias basados en relaciones tienen una propiedad específica [`path`](../API/DataClassClass.md#attributename), que contiene la ruta de sus atributos objetivos. Los atributos de alias basados en atributos de la misma clase de datos tienen las mismas propiedades que sus atributos de destino (y ninguna propiedad `path`).
-
-### Ejemplos
-
-Considerando el siguiente modelo:
-
-
-
-En la clase de datos Teacher, un atributo alias devuelve todos los alumnos de un profesor:
-
-```4d
-// cs.TeacherEntity class
-
-Class extends Entity
-
-Alias students courses.student //relatedEntities
-```
-
-En la clase Student, un atributo alias devuelve todos los profesores de un alumno:
-
-```4d
-// cs.StudentEntity class
-
-Class extends Entity
-
-Alias teachers courses.teacher //relatedEntities
-```
-
-En la dataclass Course:
-
-- un atributo alias devuelve otra etiqueta para el atributo "name"
-- un atributo alias devuelve el nombre del profesor
-- un atributo alias devuelve el nombre del estudiante
-
-```4d
-// cs.CourseEntity class
-
-Class extends Entity
-
-Exposed Alias courseName name //scalar
-Exposed Alias teacherName teacher.name //valor escalar
-Exposed Alias studentName student.name //valor escalar
-
-```
-
-Luego puede ejecutar las siguientes consultas:
-
-```4d
-// Encontrar curso llamado "Arqueología"
-ds.Course.query("courseName = :1"; "Arqueología")
-
-// Encontrar cursos impartidos por el profesor Smith
-ds.Course.query("teacherName = :1"; "Smith")
-
-// Encontrar cursos donde asista el Alumno "Martin"
-ds.Course.query("studentName = :1"; "Martin")
-
-// Encontrar alumnos que tengan a M. Smith como profesor
-ds.Student.query("teachers.name = :1"; "Smith")
-
-// Encontrar profesores que tienen a M. Martin como alumno
-ds.Teacher.query("students.name = :1"; "Martin")
-// Observe que esta cadena de consulta tan simple procesa una consulta compleja
-// que incluye un doble join, como puede ver en el queryPlan:
-// "Join on Table : Course : Teacher.ID = Course.teacherID,
-// subquery:[ Join on Table : Student : Course.studentID = Student.ID,
-// subquery:[ Student.name === Martin]]"
-```
-
-También puede editar el valor del alias *courseName*:
-
-```4d
-// Renombrar un curso utilizando su atributo alias
-$arch:=ds.Course.query("courseName = :1"; "Archaeology")
-$arch.courseName:="Archaeology II"
-$arch.save() //courseName y name son "Archaeology II"
-```
-
-## Funciones expuestas y no expuestas
-
-Por razones de seguridad, todas sus funciones de clase de modelo de datos y atributos de alias son **no expuestas** (es decir, privadas) por defecto a peticiones remotas.
-
-Las peticiones remotas incluyen:
-
-- Las peticiones enviadas por las aplicaciones 4D remotas conectadas a través de `Open datastore`
-- Peticiones REST
-
-> Las peticiones cliente/servidor 4D estándar no se ven afectadas. Las funciones de clase del modelo de datos están siempre disponibles en esta arquitectura.
-
-Una función que no está expuesta no está disponible en aplicaciones remotas y no se puede llamar a ninguna instancia de objeto desde una petición REST. Si una aplicación remota intenta acceder a una función no expuesta, se devuelve el error "-10729 - Método miembro desconocido".
-
-Para permitir que una función de clase de modelo de datos sea llamada por una petición remota, debe declararla explícitamente utilizando la palabra clave `exposed`. La sintaxis formal es:
-
-```4d
-// declarar una función expuesta
-exposed Function
-```
-
-> La palabra clave `exposed` sólo puede utilizarse con las funciones de clase del modelo de datos. Si se utiliza con una función de [ clase usuario estándar](Concepts/classes.md), se ignora y el compilador devuelve un error.
-
-### Ejemplo
-
-Desea que una función expuesta utilice una función privada de una clase dataclass:
-
-```4d
-Class extends DataClass
-
-//Función pública
-exposed Function registerNewStudent($student : Object) -> $status : Object
-
-var $entity : cs.StudentsEntity
-
-$entity:=ds.Students.new()
-$entity.fromObject($student)
-$entity.school:=This.query("name=:1"; $student.schoolName).first()
-$entity.serialNumber:=This.computeSerialNumber()
-$status:=$entity.save()
-
-//función (privada) no expuesta
-Function computeIDNumber() -> $id : Integer
-//calcular un nuevo número de ID
-$id:=...
-
-```
-
-Cuando se llama al código:
-
-```4d
-var $remoteDS; $student; $status : Object
-var $id : Integer
-
-$remoteDS:=Open datastore(New object("hostname"; "127.0.0.1:8044"); "students")
-$student:=New object("firstname"; "Mary"; "lastname"; "Smith"; "schoolName"; "Math school")
-
-$status:=$remoteDS.Schools.registerNewStudent($student) // OK
-$id:=$remoteDS.Schools.computeIDNumber() // Error "Unknown member method"
-```
-
-## Palabra clave onHTTPGet
-
-Utilice la palabra clave `onHTTPGet` para declarar funciones que pueden ser llamadas a través de peticiones HTTP utilizando el verbo `GET`. Estas funciones pueden devolver cualquier contenido web, por ejemplo utilizando la clase [`4D.OutgoingMessage`](../API/OutgoingMessageClass.md).
-
-La palabra clave `onHTTPGet` está disponible con:
-
-- Funciones de las clases del modelo de datos ORDA
-- [Funciones de la clase Singletons](../Concepts/classes.md#singleton-classes)
-
-La sintaxis formal es:
-
-```4d
-// declarar una función onHTTPGet
-exposed onHTTPGet Function (params) : result
-```
-
-:::info
-
-En este caso también debe añadirse la palabra clave `exposed`, de lo contrario se generará un error.
-
-:::
-
-:::caution
-
-Como este tipo de llamada es una acción que se ofrece fácilmente, el desarrollador debe asegurarse de que no se realiza ninguna acción sensible en dichas funciones.
-
-:::
-
-### params
-
-Una función con la palabra clave `onHTTPGet` acepta [parámetros](../Concepts/parameters.md).
-
-En la petición HTTP GET, los parámetros deben pasarse directamente en la URL y declararse utilizando la palabra clave `$params` (deben estar encerrados en una colección).
-
-```
-IP:port/rest//functionName?$params='[]'
-```
-
-Consulte la sección [Parámetros](../REST/classFunctions#parameters) en la documentación del servidor REST.
-
-### resultado
-
-Una función con la palabra clave `onHTTPGet` puede devolver cualquier valor de un tipo soportado (igual que para [parámetros](../REST/classFunctions#parameters) REST).
-
-:::info
-
-Puede devolver un valor del tipo de clase [`4D.OutgoingMessage`](../API/OutgoingMessageClass.md) para beneficiarse de las propiedades y funciones para definir el encabezado, el cuerpo y el estado de la respuesta.
-
-:::
-
-### Ejemplo
-
-Ha definido la siguiente función:
-
-```4d
-Class extends DataClass
-
-exposed onHTTPGet Function getThumbnail($name : Text; $width : Integer; $height : Integer) : 4D.OutgoingMessage
-
- var $file := File("/RESOURCES/Images/"+$name+".jpg")
- var $image; $thumbnail : Picture
- var $response := 4D.OutgoingMessage.new()
-
- READ PICTURE FILE($file.platformPath; $image)
- CREATE THUMBNAIL($image; $thumbnail; $width; $height; Scaled to fit)
- $response.setBody($thumbnail)
- $response.setHeader("Content-Type"; "image/jpeg")
- return $response
-```
-
-Se puede llamar mediante la siguiente petición HTTP GET:
-
-```
-IP:port/rest/Products/getThumbnail?$params='["Yellow Pack",200,200]'
-```
-
-## Funciones locales
-
-Por defecto en la arquitectura cliente/servidor, las funciones de modelo de datos ORDA se ejecutan **en el servidor**. Suele ofrecer el mejor rendimiento, ya que sólo se envían por la red la petición de función y el resultado.
-
-Sin embargo, puede ocurrir que una función sea totalmente ejecutable del lado del cliente (por ejemplo, cuando procesa los datos que ya están en la caché local). En este caso, puede ahorrar peticiones al servidor y, de este modo, mejorar el rendimiento de la aplicación insertando la palabra clave `local`. La sintaxis formal es:
-
-```4d
-// declarar una función a ejecutar localmente en cliente/servidor
-local Function
-```
-
-Con esta palabra clave, la función se ejecutará siempre del lado del cliente.
-
-> La palabra clave `local` sólo puede utilizarse con las funciones de clase del modelo de datos. Si se utiliza con una función de [ clase usuario estándar](Concepts/classes.md), se ignora y el compilador devuelve un error.
-
-Tenga en cuenta que la función funcionará incluso si eventualmente requiere acceder al servidor (por ejemplo si la caché ORDA está vencida). Sin embargo, es muy recomendable asegurarse de que la función local no accede a los datos del servidor, ya que de lo contrario la ejecución local no podría aportar ninguna ventaja en cuanto al rendimiento. Una función local que genera numerosas peticiones al servidor es menos eficiente que una función ejecutada en el servidor que sólo devolvería los valores resultantes. Por ejemplo, considere la siguiente función en la entidad Schools:
-
-```4d
-// Obtener los estudiantes más jóvenes
-// Utilización inapropiada de la palabra clave local
-local Function getYoungest
- var $0 : Object
- $0:=This.students.query("birthDate >= :1"; !2000-01-01!).orderBy("birthDate desc").slice(0; 5)
-```
-
-- **sin** la palabra clave `local`, el resultado se da utilizando una única petición
-- **con** la palabra clave `local`, son necesarias 4 peticiones: una para obtener la entidad Schools, una para la `query()`, una para la `orderBy()`, y una para la `slice()`. En este ejemplo, el uso de la palabra clave `local` es inapropiado.
-
-### Ejemplos
-
-#### Cálculo de la edad
-
-Dada una entidad con un atributo *birthDate*, queremos definir una función `age()` que sería llamada en un list box. Esta función puede ejecutarse en el cliente, lo que evita lanzar una petición al servidor para cada línea del list box.
-
-En la classe *StudentsEntity*:
-
-```4d
-Class extends Entity
-
-local Function age() -> $age: Variant
-
-If (This.birthDate#!00-00-00!)
- $age:=Year of(Current date)-Year of(This.birthDate)
-Else
- $age:=Null
-End if
-```
-
-#### Verificación de los atributos
-
-Queremos comprobar la consistencia de los atributos de una entidad cargada en el cliente y actualizada por el usuario antes de solicitar al servidor que los guarde.
-
-En la clase *StudentsEntity*, la función local `checkData()` verifica la edad del estudiante:
-
-```4d
-Class extends Entity
-
-local Function checkData() -> $status : Object
-
-$status:=New object("success"; True)
-Case of
- : (This.age()=Null)
- $status.success:=False
- $status.statusText:="The birthdate is missing"
-
- :((This.age() <15) | (This.age()>30) )
- $status.success:=False
- $status.statusText:="The student must be between 15 and 30 - This one is "+String(This.age())
-End case
-```
-
-Código de llamada:
-
-```4d
-var $status : Object
-
-//Form.student es cargado con todos sus atributos y actualizado en un Formulario
-$status:=Form.student.checkData()
-If ($status.success)
- $status:=Form.student.save() // llamada al servidor
-End if
-```
-
-## Soporte en IDE 4D
-
-### Archivos de clase (class files)
-
-Una clase de usuario modelo de datos ORDA se define agregando, en la [misma ubicación que los archivos de clase normales](../Concepts/classes.md#class-definition) (*es decir* en la carpeta `/Sources/Classes` de la carpeta del proyecto), un archivo .4dm con el nombre de la clase. Por ejemplo, una clase de entidad para la dataclass `Utilities` se definirá a través de un archivo `UtilitiesEntity.4dm`.
-
-### Crear las clases
-
-4D crea previa y automáticamente las clases vacías en memoria para cada objeto del modelo de datos disponible.
-
-
-
-> Por defecto, las clases ORDA vacías no se muestran en el Explorador. Para mostrarlas, debe seleccionar **Mostrar todas las clases de datos** en el menú de opciones del Explorador:
-> 
-
-Las clases de usuarios ORDA tienen un icono diferente de las otras clases. Las clases vacías se atenúan:
-
-
-
-Para crear un archivo de clase ORDA, basta con hacer doble clic en la clase predefinida correspondiente en el Explorador. Para crear un archivo de clase ORDA, basta con hacer doble clic en la clase predefinida correspondiente en el Explorador. Por ejemplo, para una clase Entity:
-
-```
-Class extends Entity
-```
-
-Una vez definida una clase, su nombre ya no aparece atenuado en el Explorador.
-
-### Editar las clases
-
-Para abrir una clase ORDA definida en el editor de código 4D, seleccione o haga doble clic en el nombre de una clase ORDA y utilice **Editar...** en el menú contextual/menú de opciones de la ventana del Explorador:
-
-
-
-Para las clases ORDA basadas en el datastore local (`ds`), puede acceder directamente al código de la clase desde la ventana de estructura 4D:
-
-
-
-### Editor de código
-
-En el editor de código de 4D, las variables escritas como una clase ORDA se benefician automáticamente de las funcionalidades de autocompletado. Ejemplo con una variable de clase Entity:
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/overview.md
deleted file mode 100644
index b7d8fa93ef58e0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/overview.md
+++ /dev/null
@@ -1,33 +0,0 @@
----
-id: overview
-title: ORDA
----
-
-ORDA significa **Object Relational Data Access**. Se trata de una tecnología avanzada que permite acceder tanto al modelo como a los datos de una base a través de objetos.
-
-Las relaciones se incluyen de forma transparente en el concepto, en combinación con el principio del [lazy loading](glossary.md#lazy-loading), para eliminar todas las molestias típicas de la selección o la transferencia de datos del desarrollador.
-
-Con ORDA, se accede a los datos a través de una capa de abstracción, el [datastore](dsMapping.md#datastore). Un datastore es un objeto que ofrece una interfaz al modelo de base de datos y a los datos a través de objetos y de clases. Por ejemplo, una tabla corresponde a un objeto [dataclass](dsMapping.md#dataclass), un campo es un [atributo](dsMapping.md#attribute) de una dataclass, y se accede a los registros a través de [entidades](dsMapping.md#entity) y [entity selections](dsMapping.md#entity-selection).
-
-## ¿Por qué utilizar ORDA?
-
-En lugar de representar la información como tablas, registros y campos, ORDA utiliza un enfoque alternativo que asigna con mayor precisión los datos a conceptos concretos.
-
-Imagine la posibilidad de desnormalizar una estructura relacional sin que afectar la eficacia. Imagine que describe todo lo relativo a los objetos de su aplicación de tal forma que el uso de los datos se convierte en algo sencillo y directo y elimina la necesidad de comprender por completo la estructura relacional.
-
-En el modelo de datos ORDA, una única clase de datos puede incorporar todos los elementos que componen una tabla de base de datos relacional tradicional, pero también puede incluir valores de entidades padres relacionadas y las referencias directas a las entidades y a las selecciones de entidades relacionadas.
-
-Una petición devuelve una lista de entidades denominada selección de entidades, que cumple la función de un conjunto de líneas de una petición SQL. La diferencia es que cada entidad "sabe" cuál es su lugar en el modelo de datos y "comprende" su relación con las demás entidades. Esto significa que un desarrollador no necesita explicar en una petición cómo relacionar las distintas piezas de información, ni en una actualización cómo volver a escribir los valores modificados en la estructura relacional.
-
-Además, los objetos ORDA, como las selecciones de entidades o las entidades, pueden vincularse fácilmente a los objetos de interfaz de usuario, como los list box o las variables. Combinadas con las funcionalidades poderosas tales como los comandos `This` y `Form`, permiten construir interfaces modernas y modulares basadas en objetos y colecciones.
-
-## ¿Cómo utilizar ORDA?
-
-Fundamentalmente, ORDA gestiona objetos. En ORDA, todos los conceptos principales, incluido el propio datastore, están disponibles a través de objetos. En 4D, el datastore es automáticamente [mapeado sobre la estructura 4D](dsMapping.md).
-
-Los objetos en ORDA pueden manejarse como los objetos estándar 4D, pero se benefician automáticamente de propiedades y de métodos específicos.
-
-Los objetos ORDA son creados e instanciados cuando es necesario por los métodos 4D (no necesitas crearlos). Sin embargo, los objetos del modelo de datos ORDA están asociados a las [clases en las que se pueden añadir funciones personalizadas](ordaClasses.md).
-
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/privileges.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/privileges.md
deleted file mode 100644
index a238b264f6f19c..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/privileges.md
+++ /dev/null
@@ -1,353 +0,0 @@
----
-id: privileges
-title: Privilegios
----
-
-Proteger los datos a la vez que se permite un acceso rápido y sencillo a los usuarios autorizados es un reto importante para las aplicaciones web. La arquitectura de seguridad ORDA se implementa en el corazón de su almacén de datos y le permite definir privilegios específicos a todas las sesiones usuario REST o web para los distintos recursos de su proyecto (datastore, dataclasses, funciones, etc.).
-
-## Generalidades
-
-La arquitectura de seguridad ORDA se basa en los conceptos de privilegios, acciones de permiso (read, create, etc.) y recursos.
-
-Cuando los usuarios web o REST se registran, su sesión se carga automáticamente con los privilegios asociados. Los privilegios se asignan a la sesión mediante la función [`session.setPrivileges()`](../API/SessionClass.md#setprivileges).
-
-Cada solicitud de usuario enviada dentro de la sesión se evalúa en función de los privilegios definidos en el archivo `roles.json` del proyecto.
-
-Si un usuario intenta ejecutar una acción y no tiene los derechos de acceso adecuados, se genera un error de privilegio o, en el caso de que falte el permiso de Lectura en los atributos, no se envían.
-
-
-
-### Ver también
-
-Para una descripción detallada de toda la arquitectura de permisos, por favor lea el blog [**Filtrar acceso a sus datos con un sistema completo de permisos**](https://blog.4d.com/filter-access-to-your-data-with-a-complete-system-of-permissions/).
-
-## Resources
-
-Puede asignar acciones de permiso específicas a los siguientes recursos en su proyecto:
-
-- el almacén de datos
-- una clase de datos
-- un atributo (incluidos los calculados y los alias)
-- una función de clase de modelo de datos
-- una función [singleton](../REST/$singleton.md)
-
-Cada vez que se accede a un recurso dentro de una sesión (sin importar la forma en que se acceda), 4D verifica que la sesión tenga los permisos apropiados y rechaza el acceso si no está autorizado.
-
-Una acción de permiso definida en un nivel determinado se hereda por defecto en los niveles inferiores, pero se pueden establecer varios permisos:
-
-- Una acción de permiso definida a nivel de almacén de datos se asigna automáticamente a todas las clases de datos. La acción de permiso *execute* definida en el nivel del datastore se aplica a todas las funciones del proyecto, incluyendo todas las funciones [singleton](../REST/$singleton.md).
-- Una acción de permiso definida a nivel de clase de datos anula la configuración del almacén de datos (si existe). Por defecto, todos los atributos de la clase de datos heredan de los permisos de la clase de datos.
-- A diferencia de los permisos de clase de datos, una acción de permiso definida a nivel de atributo no anula los permisos de clase de datos padre, sino que se añade a ellos. Por ejemplo, si asignó el privilegio "general" a una clase de datos y el privilegio "detail" a un atributo de la clase de datos, tanto el privilegio "general" como el privilegio "detail" deben definirse en la sesión para acceder al atributo.
-
-:::info
-
-Los permisos controlan el acceso a los objetos o funciones del almacén de datos. Si desea filtrar los datos leídos según algún criterio, puede considerar [restringir las selecciones de entidades](entities.md#restricting-entity-selections) que puede ser más apropiado en este caso.
-
-:::
-
-## Acciones de autorización
-
-Las acciones disponibles están relacionadas con el recurso de destino.
-
-| Acciones | Almacén de datos | dataclass | atributo | función del modelo de datos o función singleton |
-| ----------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **create** | Crear entidad en cualquier clase de datos | Crear entidad en esta clase de datos | Crea una entidad con un valor diferente del valor por defecto permitido para este atributo (ignorado para atributos alias). | n/a |
-| **read** | Leer atributos en cualquier dataclass | Leer atributos en esta clase de datos | Lea el contenido de este atributo | n/a |
-| **update** | Actualizar atributos en cualquier clase de datos. | Actualiza los atributos de esta clase de datos. | Actualiza el contenido de este atributo (ignorado para atributos alias). | n/a |
-| **drop** | Borrar datos en cualquier clase de datos. | Borrar los datos de esta clase de datos. | Eliminar un valor no nulo para este atributo (excepto para alias y atributo calculado). | n/a |
-| **execute** | Ejecutar toda función en el proyecto (almacén de datos, clase de datos, selección de entidades, entidad, singleton) | Ejecuta cualquier función en la clase de datos. Las funciones dataclass, las funciones entidad y las funciones selección de entidades se tratan como funciones dataclass | n/a | Ejecutar esta función |
-| **promote** | n/a | n/a | n/a | Asocia un privilegio determinado durante la ejecución de la función. El privilegio se añade temporalmente a la sesión y se elimina al final de la ejecución de la función. Por seguridad, sólo se añade el privilegio al proceso que ejecuta la función, no a toda la sesión. |
-
-**Notas:**
-
-- Un alias puede leerse tan pronto como los privilegios de sesión permitan el acceso al propio alias, aunque los privilegios de sesión no permitan el acceso a los atributos que resuelven el alias.
-- Se puede acceder a un atributo calculado aunque no haya permisos en los atributos sobre los que se crea.
-- Puede asignar una acción de permiso a una clase singleton (tipo `singleton`), en cuyo caso se aplicará a todas sus funciones expuestas, o a una función singleton (tipo `singletonMethod`).
-- Valores por defecto: en la implementación actual, solo *Null* está disponible como valor por defecto.
-- En modo REST [force login](../REST/authUsers.md#force-login-mode), la función [`authentify()`](../REST/authUsers.md#function-authentify) es siempre ejecutable por usuarios invitados, cualquiera que sea la configuración de permisos.
-
-Los parámetros de permisos requieren ser consistentes, en particular los permisos **update** y **drop** también necesitan el permiso **read** (pero **create** no lo necesita).
-
-## Privilegios y roles
-
-Un \*\*privilegio \*\* es la capacidad técnica de ejecutar \*\*acciones \*\* en \*\*recursos \*\*, mientras que un **rol** es un privilegio publicado para ser utilizado por un administrador. Básicamente, un rol reúne varios privilegios para definir un perfil de usuario empresarial. Por ejemplo, "manageInvoices" podría ser un privilegio mientras que "secretary" podría ser un rol (que incluye "manageInvoices" y otros privilegios).
-
-Un privilegio o un rol pueden asociarse a varias combinaciones "acción + recurso". Se pueden asociar varios privilegios a una acción. Un privilegio puede incluir otros privilegios.
-
-- Usted **crea** privilegios y/o roles en el archivo `roles.json` (ver abajo). **Configura** su alcance asignándolos a acción(es) de permiso aplicadas a recurso(s).
-
-- Usted **autoriza** los privilegios y/o roles para cada sesión usuario usando la función [`.setPrivileges()`](../API/SessionClass.md#setprivileges) de la clase `Session`.
-
-### Ejemplo
-
-Para permitir un rol en una sesión:
-
-```4d
-
-exposed Function authenticate($identifier : Text; $password : Text)->$result : Text
-
- var $user : cs.UsersEntity
-
- Session.clearPrivileges()
-
- $result:="Está autentificado como Invitado"
-
- $user:=ds.Users.query("identifier = :1"; $identifier).first()
-
- If ($user#Null)
- If (Verify password hash($password; $user.password))
- Session.setPrivileges(New object("roles"; $user.role))
- $result:="Está autentificado como "+$user.role
- End if
- End if
-
-
-```
-
-## archivo `roles.json`
-
-El archivo `roles.json` describe todos los parámetros de seguridad del proyecto.
-
-### Archivo por defecto
-
-Al crear un proyecto, se crea un archivo `roles.json` por defecto en la siguiente ubicación: `/Project/Sources/` (ver la sección [Architecture](../Project/architecture.md#sources)).
-
-El archivo por defecto tiene el siguiente contenido:
-
-```json title="/Project/Sources/roles.json"
-
-{
- "privileges": [
- {
- "privilege": "none",
- "includes": []
- }
- ],
-
- "roles": [],
-
- "permissions": {
- "allowed": [
- {
- "applyTo": "ds",
- "type": "datastore",
- "read": ["none"],
- "create": ["none"],
- "update": ["none"],
- "drop": ["none"],
- "execute": ["none"],
- "promote": ["none"]
- }
- ]
- },
-
- "forceLogin": true
-
-}
-
-```
-
-Para un nivel de seguridad más alto, el privilegio "none" se asigna a todos los permisos en el datastore, por lo tanto el acceso de datos en todo el objeto `ds` está deshabilitado por defecto. Se recomienda no modificar ni utilizar este privilegio de bloqueo, sino agregar permisos específicos a cada recurso que desee poner a disposición desde solicitudes web o REST ([ver ejemplo a continuación](#example-of-privilege-configuration)).
-
-:::caution
-
-Cuando no se definen parámetros específicos en el archivo `roles.json`, los accesos no son limitados. Esta configuración le permite desarrollar la aplicación sin tener que preocuparse por los accesos, pero no se recomienda en entornos de producción.
-
-:::
-
-:::note Compatibilidad
-
-En versiones anteriores, el archivo `roles.json` no fue creado por defecto. A partir de 4D 20 R6, al abrir un proyecto existente que no contiene un archivo `roles.json` o los parámetros `"forceLogin": true`, el botón **Activar la autenticación REST mediante la función ds.authentify()** está disponible en la página [**Funcionalidades web** de la caja de diálogo Parámetros](../settings/web.md#access). Este botón actualiza automáticamente su configuración de seguridad (es posible que tenga que modificar su código, [ver esta publicación del blog](https://blog.4d.com/force-login-becomes-default-for-all-rest-auth/)).
-:::
-
-:::note Qodly Studio
-
-En Qodly Studio for 4D, el modo se puede definir utilizando la opción [**Forzar inicio de sesión**](../WebServer/qodly-studio.md#force-login) en el panel de Privilegios.
-
-:::
-
-### Sintaxis
-
-La sintaxis del archivo `roles.json` es la siguiente:
-
-| Nombre de propiedad | | | Tipo | Obligatorio | Descripción |
-| ------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | --------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------ |
-| privileges | | | Colección de objetos `privilege` | X | Lista de privilegios definidos |
-| | \[].privilege | | Text | | Nombre del privilegio |
-| | \[].includes | | Colección de cadenas | | Lista de nombres de privilegios incluidos |
-| roles | | | Colección de objetos `role` | | Lista de roles definidos |
-| | \[].role | | Text | | Nombre del rol |
-| | \[].privileges | | Colección de cadenas | | Lista de nombres de privilegios incluidos |
-| permissions | | | Object | X | Lista de acciones permitidas |
-| | allowed | | Colección de objetos `permission` | | Lista de permisos permitidos |
-| | | \[].applyTo | Text | X | Targeted [resource](#resources) name |
-| | | \[].type | Text | X | Tipo de [recurso](#resources): "datastore", "dataclass", "attribute", "method", "singletonMethod", "singleton" |
-| | | \[].read | Colección de cadenas | | Lista de privilegios |
-| | | \[].create | Colección de cadenas | | Lista de privilegios |
-| | | \[].update | Colección de cadenas | | Lista de privilegios |
-| | | \[].drop | Colección de cadenas | | Lista de privilegios |
-| | | \[].execute | Colección de cadenas | | Lista de privilegios |
-| | | \[].promote | Colección de cadenas | | Lista de privilegios |
-| forceLogin | | | Boolean | | True para habilitar el [modo "forceLogin"](../REST/authUsers.md#force-login-mode) |
-
-:::caution Recordatorio
-
-- El nombre de privilegio "WebAdmin" está reservado a la aplicación. No se recomienda utilizar este nombre para los privilegios personalizados.
-- los nombres de `privileges` y `roles` son insensibles a mayúsculas y minúsculas.
-
-:::
-
-#### Asignación de permisos a las funciones de la clase ORDA
-
-Al configurar los permisos, las funciones de clase ORDA se declaran en el elemento `applyTo` usando la siguiente sintaxis:
-
-```json
-.
-```
-
-Por ejemplo, si desea aplicar un permiso a la siguiente función:
-
-```4d
-// cs.CityEntity class
-Class extends Entity
- Function getPopulation() : Integer
- ...
-```
-
-... tiene que escribir:
-
-```json
-"applyTo":"City.getPopulation"
-```
-
-Significa que no puede utilizar los mismos nombres de función en las distintas clases ORDA (entidad, selección de entidad, dataclass) si desea que se les asignen privilegios. En este caso, debe utilizar nombres de función distintos. Por ejemplo, si has creado una función "drop" en ambas clases `cs.CityEntity` y `cs.CitySelection`, necesita darles nombres diferentes como `dropEntity()` y `dropSelection()`. A continuación, puede escribir en el archivo "roles.json":
-
-```json
- "permissions": {
- "allowed": [
- {
- "applyTo": "City.dropEntity",
- "type": "method",
- "promote": [
- "name"
- ]
- },
- {
- "applyTo": "City.dropSelection",
- "type": "method",
- "promote": [
- "name"
- ]
- }
- ]
-```
-
-### Archivo `Roles_Errors.json`
-
-El archivo `roles.json` es analizado por 4D al inicio. Debe reiniciar la aplicación si desea que se tengan en cuenta las modificaciones en este archivo.
-
-En caso de error(es) al analizar el archivo `roles.json`, 4D carga el proyecto pero desactiva la protección de acceso global - esto permite al desarrollador acceder a los archivos y solucionar el error. Se genera un archivo de error llamado `Roles_Errors.json` en la [`carpeta Logs del proyecto`](../Project/architecture.md#logs) y describe la(s) línea(s) de error. Este archivo se elimina automáticamente cuando el archivo `roles.json` deja de contener errores.
-
-Se recomienda comprobar al inicio si existe un archivo `Roles_Errors.json` en la carpeta [Logs](../Project/architecture.md#logs), lo que significa que se ha producido un error de análisis y que los accesos no estarán limitados. Puede escribir, por ejemplo:
-
-```4d title="/Sources/DatabaseMethods/onStartup.4dm"
-If (Not(File("/LOGS/"+"Roles_Errors.json").exists))
-…
-Else // puede evitar que el proyecto abra
- ALERT("The roles.json file is malformed or contains inconsistencies, the application will quit.")
- QUIT 4D
-End if
-```
-
-## Ejemplo de configuración de privilegios
-
-La buena práctica es mantener todos los datos bloqueados por defecto gracias al privilegio "none" y configurar el archivo `roles.json` para abrir sólo las partes controladas a las sesiones autorizadas. Por ejemplo, para permitir algunos accesos a sesiones invitadas:
-
-```json title="/Project/Sources/roles.json"
-
-{
- "privileges": [
- {
- "privilege": "none",
- "includes": []
- }
- ],
- "roles": [],
- "permissions": {
- "allowed": [
- {
- "applyTo": "ds",
- "type": "datastore",
- "read": [
- "none"
- ],
- "create": [
- "none"
- ],
- "update": [
- "none"
- ],
- "drop": [
- "none"
- ],
- "execute": [
- "none"
- ],
- "promote": [
- "none"
- ]
- },
- {
- "applyTo": "ds.loginAs",
- "type": "method",
- "execute": [
- "guest"
- ]
- },
- {
- "applyTo": "ds.hasPrivilege",
- "type": "method",
- "execute": [
- "guest"
- ]
- },
- {
- "applyTo": "ds.clearPrivileges",
- "type": "method",
- "execute": [
- "guest"
- ]
- },
- {
- "applyTo": "ds.isGuest",
- "type": "method",
- "execute": [
- "guest"
- ]
- },
- {
- "applyTo": "ds.getPrivileges",
- "type": "method",
- "execute": [
- "guest"
- ]
- },
- {
- "applyTo": "ds.setAllPrivileges",
- "type": "method",
- "execute": [
- "guest"
- ]
- },
- {
- "applyTo": "mySingletonClass.createID",
- "type": "singletonMethod",
- "execute": [
- "guest"
- ]
- }
- ]
- },
- "forceLogin": true
-}
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/architecture.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/architecture.md
deleted file mode 100644
index 890ab48425b8a3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/architecture.md
+++ /dev/null
@@ -1,241 +0,0 @@
----
-id: architecture
-title: Arquitectura de un proyecto
----
-
-Un proyecto 4D se compone de varias carpetas y archivos, almacenados dentro de una carpeta raíz del proyecto (carpeta paquete). Por ejemplo:
-
-- MyPackage (*carpeta raíz del proyecto*)
- - `Componentes`
- - `Data`
- - `Logs`
- - `Settings`
- - `Documentation`
- - `Plugins`
- - `Project`
- - `DerivedData`
- - `Sources`
- - `Trash`
- - `Resources`
- - `Settings`
- - `userPreferences.jSmith`
- - `WebFolder`
-
-> Si su proyecto se ha convertido desde una base binaria, puede haber carpetas adicionales. Ver "Conversión de bases en proyectos" en [doc.4d.com](https://doc.4d.com).
-
-## Carpeta `Project`
-
-La carpeta Project suele contener la siguiente jerarquía:
-
-- archivo `.4DProject`
-- `Sources`
- - `Clases`
- - `DatabaseMethods`
- - `Métodos`
- - `Formularios`
- - `TableForms`
- - `Triggers`
-- `DerivedData`
-- `Trash` (si hay)
-
-### archivo `.4DProject`
-
-El archivo de desarrollo de proyecto, utilizado para designar y lanzar el proyecto. Este archivo puede ser abierto por:
-
-- 4D
-- 4D Server (sólo lectura, ver [Abrir un proyecto remoto](Desktop/clientServer.md#opening-a-remote-project))
-
-> En los proyectos 4D, el desarrollo se realiza con 4D y el desarrollo multiusuarios se gestiona a través de las herramientas de control de versión. 4D Server puede abrir archivos .4DProject para realizar pruebas.
-
-Este archivo de texto también puede contener llaves de configuración, en particular [`"tokenizedText": false`](../Preferences/general.md#excluding-tokens-in-existing-projects).
-
-### `Sources`
-
-| Contenido | Descripción | Formato |
-| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| catalog.4DCatalog | Definiciones de tablas y campos | XML |
-| catalog_editor.json | Posiciones y colores personalizados de tablas, campos y enlaces en el editor de estructura. Depende de un [parámetro de compatibilidad](../settings/compatibility.md) en los proyectos convertidos | JSON |
-| folders.json | Definiciones de carpetas del Explorador | JSON |
-| 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](../Desktop/user-settings.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](../Desktop/user-settings.md#enabling-user-settings) y utilizar *parámetros usuario* o *parámetros usuario para datos* para definir parámetros personalizados. | XML |
-| tips.json | Mensajes de ayuda definidos | JSON |
-| lists.json | Listas definidas | JSON |
-| filters.json | Filtros definidos | JSON |
-| dependencies.json | Nombres de [componentes a cargar](components.md) en el proyecto | JSON |
-| HTTPHandlers.json | Personalizado [HTTP request handlers](../WebServer/http-request-handler.md) definido para el servidor web | JSON |
-| styleSheets.css | Hojas de estilo CSS | CSS |
-| styleSheets_mac.css | Hojas de estilo css de Mac (a partir de una base binaria convertida) | CSS |
-| styleSheets_windows.css | Hojas de estilo css en Windows (a partir de una base binaria convertida) | CSS |
-
-#### `DatabaseMethods`
-
-| Contenido | Descripción | Formato |
-| ---------------------------------------- | --------------------------------------------------------------------------------- | ------- |
-| *databaseMethodName*.4dm | Métodos base definidos en el proyecto. Un archivo por método base | text |
-
-#### `Métodos`
-
-| Contenido | Descripción | Formato |
-| -------------------------------- | -------------------------------------------------------------------------------- | ------- |
-| *methodName*.4dm | Métodos proyecto definidos en el proyecto. Un archivo por método | text |
-
-#### `Clases`
-
-| Contenido | Descripción | Formato |
-| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
-| *className*.4dm | Método de definición de clases usuario, que permite instanciar objetos específicos. Un archivo por clase, el nombre del archivo es el nombre de la clase | text |
-
-#### `Formularios`
-
-| Contenido | Descripción | Formato |
-| --------------------------------------------------------- | ------------------------------------------------------------ | ------- |
-| *formName*/form.4DForm | Descripción del formulario proyecto | json |
-| *formName*/method.4dm | Método formulario proyecto | text |
-| *formName*/Images/*pictureName* | Imagen estática del formulario proyecto | picture |
-| *formName*/ObjectMethods/*objectName*.4dm | Métodos objeto. Un archivo por método objeto | text |
-
-#### `TableForms`
-
-| Contenido | Descripción | Formato |
-| -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ------- |
-| *n*/Input/*formName*/form.4DForm | Descripción del formulario de entrada de la tabla (n es el número de tabla) | json |
-| *n*/Input/*formName*/Images/*pictureName* | Imágenes estáticas del formulario de entrada de la tabla | picture |
-| *n*/Input/*formName*/method.4dm | Método del formulario de entrada de la tabla | text |
-| *n*/Input/*formName*/ObjectMethods/*objectName*.4dm | Métodos objeto del formulario de entrada. Un archivo por método objeto | text |
-| *n*/Output/*formName*/form.4DForm | Descripción del formulario de salida de la tabla (n es el número de tabla) | json |
-| *n*/Output/*formName*/Images/*pictureName* | Imágenes estáticas del formulario de salida de la tabla | picture |
-| *n*/Output/*formName*/method.4dm | Método del formulario de salida de la tabla | text |
-| *n*/Output/*formName*/ObjectMethods/*objectName*.4dm | Métodos objeto del formulario de salida. Un archivo por método objeto | text |
-
-#### `Triggers`
-
-| Contenido | Descripción | Formato |
-| -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| table__n_.4dm | Métodos trigger definidos en el proyecto. Un archivo de activación por tabla (n es el número de tabla) | text |
-
-**Note:** The .4dm file extension is a text-based file format, containing the code of a 4D method. Es compatible con las herramientas de control de versión.
-
-### `Trash`
-
-La carpeta Trash contiene los métodos y formularios que se han eliminado del proyecto (si los hay). Puede contener las siguientes carpetas:
-
-- `Métodos`
-- `Formularios`
-- `TableForms`
-
-Dentro de estas carpetas, los nombres de los elementos eliminados van entre paréntesis, por ejemplo "(myMethod).4dm". La organización de las carpetas es idéntica a la carpeta [Sources](#sources).
-
-### `DerivedData`
-
-La carpeta DerivedData contiene datos en caché utilizados internamente por 4D para optimizar el procesamiento. Se crea o recrea automáticamente cuando es necesario. Puede ignorar esta carpeta.
-
-## `Libraries`
-
-> Esta carpeta se utiliza sólo en macOS.
-
-La carpeta Librairies contiene el archivo resultante de una compilación con el [compilador Silicon](compiler.md#silicon-compiler) en macOS.
-
-## `Resources`
-
-La carpeta Resources contiene todos los archivos y carpetas de recursos personalizados del proyecto. En esta carpeta puede colocar todos los archivos necesarios para la traducción o personalización de la interfaz de la aplicación (archivos imagen, archivos texto, archivos XLIFF, etc.). 4D utiliza mecanismos automáticos para trabajar con el contenido de esta carpeta, en particular para el manejo de archivos XLIFF e imágenes estáticas. Para su uso en modo remoto, la carpeta Resources permite compartir archivos entre el equipo servidor y todos los equipos cliente. Ver el *manual 4D Server*.
-
-| Contenido | Descripción | Formato |
-| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| *elemento* | Archivos y carpetas de recursos del proyecto | varios |
-| Images/Library/*item* | Imágenes de la librería de imágenes como archivos separados(\*). Los nombres de estos elementos se convierten en nombres de archivos. Si existe un duplicado, se añade un número al nombre. | picture |
-
-(\*) sólo si el proyecto fue exportado desde una base binaria .4db.
-
-## `Data`
-
-La carpeta Data contiene el archivo de datos y todos los archivos y carpetas relacionados con los datos.
-
-| Contenido | Descripción | Formato |
-| ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| data.4dd(\*) | Archivo de datos que contiene los datos introducidos en los registros y todos los datos pertenecientes a los registros. Al abrir un proyecto 4D, la aplicación abre por defecto el archivo de datos actual. Si cambia el nombre o la ubicación de este archivo, aparecerá la caja de diálogo *Abrir un archivo de datos* para que pueda seleccionar el archivo de datos a utilizar o crear uno nuevo | binary |
-| data.journal | Se crea sólo cuando la base de datos utiliza un archivo de registro. El archivo de registro se utiliza para garantizar la seguridad de los datos entre las copias de seguridad. Todas las operaciones realizadas sobre los datos se registran secuencialmente en este archivo. Por lo tanto, cada operación sobre los datos provoca dos acciones simultáneas: la primera sobre los datos (la instrucción se ejecuta normalmente) y la segunda en el archivo de registro (se registra una descripción de la operación). El archivo de registro se construye de forma independiente, sin perturbar ni ralentizar el trabajo del usuario. Una base de datos sólo puede trabajar con un único archivo de registro a la vez. El archivo de historial registra operaciones como adiciones, modificaciones o eliminaciones de registros, transacciones, etc. Se genera por defecto cuando se crea una base de datos. | binary |
-| data.match | (interno) UUID correspondiente al número de la tabla | XML |
-
-(\*) Cuando el proyecto se crea a partir de una base de datos binaria .4db, el archivo de datos se deja intacto. Por lo tanto, se puede nombrar de otra manera y colocar en otro lugar.
-
-### `Settings` (datos del usuario)
-
-Esta carpeta contiene [**parámetros usuario para datos**](../Desktop/user-settings.md#user-settings-for-data-file) utilizada para la administración de aplicaciones.
-
-> Estos parámetros tienen prioridad sobre los [parámetros de usuario](#settings-user) y los [parámetros de estructura](#sources). Ver también [Prioridad de los parámetros](../Desktop/user-settings.md#priority-of-settings).
-
-| Contenido | Descripción | Formato |
-| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| 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 |
-
-### `Logs`
-
-La carpeta Logs contiene todos los archivos de registro utilizados por el proyecto. Los archivos de registro incluyen, en particular:
-
-- conversión de base de datos,
-- peticiones del servidor web,
-- registro de actividades de backup/restitución (*Backup Journal\[xxx].txt*, ver [Historial de backup](Backup/backup.md#backup-journal))
-- depuración de comandos,
-- Peticiones 4D Server (generadas en en los equipos cliente y en el servidor).
-
-> Una carpeta Logs adicional está disponible en la carpeta de preferencias del usuario del sistema (carpeta 4D activa, ver el comando [Get 4D folder](../commands-legacy/get-4d-folder.md)) para los archivos de registro de mantenimiento y e
-
-## `Settings` (usuario)
-
-Esta carpeta contiene [**parámetros de usuario**](../Desktop/user-settings.md#user-settings) utilizada para la administración de aplicaciones.
-
-> Estos parámetros tienen prioridad sobre el archivo de [parámetros de estructura](#sources). Sin embargo, si existen [parámetros de usuario para los datos](#settings-user-data), tienen prioridad sobre los parámetros de usuario. Ver también [Prioridad de los parámetros](../Desktop/user-settings.md#priority-of-settings).
-
-| Contenido | Descripción | Formato |
-| ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
-| directory.json | Descripción de los grupos y usuarios de 4D para la aplicacion, así como sus derechos de acceso | 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 se lanza cada copia de seguridad. Este archivo también puede utilizarse para leer o definir opciones adicionales, como la cantidad de información almacenada en el *diario de backup*. Las llaves relativas a la configuración de la copia de seguridad se describen en el manual *Backup de las llaves XML 4D*. | XML |
-| 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 |
-
-## `userPreferences.`
-
-Esta carpeta contiene archivos que memorizan las configuraciones del usuario, por ejemplo, el punto de ruptura o las posiciones de las ventanas. Puede simplemente ignorar esta carpeta. Contiene, por ejemplo:
-
-| Contenido | Descripción | Formato |
-| ------------------------------------------ | ------------------------------------------------------------------------- | ------- |
-| methodPreferences.json | Preferencias del editor de código del usuario actual | JSON |
-| methodWindowPositions.json | Posición de la ventana de usuario actual para los métodos | JSON |
-| formWindowPositions.json | Posición de la ventana de usuario actual para los formularios | JSON |
-| workspace.json | Lista de ventanas abiertas; en macOS, orden de las ventanas de la pestaña | JSON |
-| debuggerCatches.json | Llamadas a los comandos | JSON |
-| recentTables.json | Lista ordenada de tablas | JSON |
-| preferences.4DPreferences | Ruta de datos actual y posiciones de la ventana principal | XML |
-| CompilerIntermediateFiles | Archivos intermedios resultantes de la compilación Apple Silicon | Folder |
-
-## `Componentes`
-
-Carpeta que contiene los componentes anidados en el proyecto (debe almacenarse en el mismo nivel que la carpeta Project). Estos componentes tienen prioridad sobre cualquier otra ubicación.
-
-:::info
-
-También puede usar los archivos [**dependencies.json** y (opcionalmente) **environment4d.json**](components.md) para declarar componentes.
-
-:::
-
-## `Plugins`
-
-Esta carpeta contiene los plug-ins que deben estar disponibles en el proyecto aplicación. Debe almacenarse en el mismo nivel que la carpeta Project.
-
-## `Documentation`
-
-Esta carpeta contiene todos los archivos de documentación (.md) creados para los elementos del proyecto como clases, métodos o formularios. Los archivos de documentación se gestionan y se muestran en el Explorador 4D.
-
-Para más información, consulte [Documentar un proyecto](Project/documentation.md).
-
-## `WebFolder`
-
-Define la carpeta raíz por defecto del servidor web 4D para las páginas, las imágenes, etc. Se crea automáticamente cuando se lanza el servidor web por primera vez.
-
-## Archivo `.gitignore` (opcional)
-
-Archivo que especifica los archivos que serán ignorados por git. Archivo que especifica los archivos que serán ignorados por git. Puede incluir un archivo gitignore en sus proyectos utilizando la opción **Crear un archivo .gitignore** en la página **General** de las preferencias.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/code-overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/code-overview.md
deleted file mode 100644
index 6fb7f4fb75f8fc..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/code-overview.md
+++ /dev/null
@@ -1,182 +0,0 @@
----
-id: code-overview
-title: Métodos y clases
----
-
-El código 4D utilizado en todo el proyecto está escrito en [métodos](../Concepts/methods.md) y [clases](../Concepts/classes.md).
-
-El IDE de 4D le ofrece varias funcionalidades para crear, editar, exportar o eliminar su código. Por lo general, utilizará el [editor integrado de código](../code-editor/write-class-method.md) de 4D para trabajar con su código. También puede utilizar otros editores como **VS Code**, para el que está disponible la [extensión 4D-Analyzer](https://github.com/4d/4D-Analyzer-VSCode).
-
-## Creación de métodos
-
-Un método en 4D se almacena en un archivo **.4dm** ubicado en la carpeta apropiada de la carpeta [`/Project/Sources/`](../Project/architecture.md#sources).
-
-Puede crear [varios tipos de métodos](../Concepts/methods.md):
-
-- Todos los tipos de métodos pueden crearse o abrirse desde la ventana del **Explorador** (excepto los métodos Objeto que se gestionan desde el [editor de formularios](../FormEditor/formEditor.md)).
-- Los métodos proyecto también pueden crearse o abrirse desde el menú **Archivo** o desde la barra de herramientas (**Nuevo/Método...** o **Abrir/Método...**) o utilizando los accesos directos de la ventana del [editor de código](../code-editor/write-class-method.md#shortcuts).
-- Los triggers también pueden crearse o abrirse desde el editor de Estructura.
-- Los métodos formulario también pueden crearse o abrirse desde el [editor de formularios](../FormEditor/formEditor.md).
-
-## Crear las clases
-
-Una clase usuario en 4D está definida por un archivo de método específico (**.4dm**), almacenado en la carpeta [`/Project/Sources/Classes/`](../Project/architecture.md#sources). El nombre del archivo es el nombre de la clase.
-
-Puede crear un archivo de clase desde el menú **Archivo** o la barra de herramientas (**Nuevo/Clase...**) o en la página **Métodos** de la ventana **Explorador**.
-
-Para más información, consulte la sección [Clases](../Concepts/classes.md).
-
-## Eliminar los métodos o las clases
-
-Para eliminar un método o clase existente, puede:
-
-- en su disco, elimine el archivo *.4dm* de la carpeta "Sources",
-- en el Explorador 4D, seleccione el método y haga clic  o elija **Mover a la Papelera** en el menú contextual.
-
-> Para eliminar un método objeto, seleccione **Borrar el método de objeto** en el [editor de formularios](../FormEditor/formEditor.md) (menú **Objeto** o menú contextual).
-
-## Importar y exportar el código
-
-Puede importar y exportar un método o un código de una clase en forma de archivo. Estos comandos se encuentran en el menú **Método** del editor de código [](../code-editor/write-class-method.md).
-
-- Cuando se selecciona el comando **Exportar el método...**, aparece una caja de diálogo estándar para guardar archivos, que permite elegir el nombre, la ubicación y el formato del archivo de exportación (ver abajo). Al igual que con la impresión, la exportación no tiene en cuenta el estado contraído de las estructuras de código y se exporta todo el código.
-- Cuando se selecciona el comando **Importar el método...**, aparece una caja de diálogo estándar de apertura de archivos que permite designar el archivo a importar. La importación sustituye el texto seleccionado en el método. Para reemplazar un método existente por un método importado, seleccione todo el contenido del método antes de realizar la importación.
-
-La función de importación/exportación es multiplataforma: un método exportado en Mac OS puede ser importado en Windows y viceversa; 4D se encarga de la conversión de caracteres cuando es necesario.
-
-4D puede exportar e importar métodos en dos formatos:
-
-- Método 4D (extensión *.c4d*): en este formato, los métodos se exportan codificados. Los nombres de los objetos están tokenizados (se transforman en referencias). Este formato se utiliza especialmente para el intercambio de métodos entre las aplicaciones 4D y los plug-ins en diferentes idiomas. Por el contrario, no es posible visualizarlos en un editor de texto.
-- Texto (extensión *.txt*): en este formato, los métodos se exportan en forma de texto. En este caso, los métodos se pueden leer con un editor de texto estándar o con una herramienta de control de código fuente.
-
-## Propiedades del método proyecto
-
-Después de crear un método proyecto, puede cambiar su nombre y modificar sus propiedades. Las propiedades de los métodos proyecto se refieren principalmente a sus condiciones de acceso y de seguridad (acceso de usuarios, servidores integrados o servicios), así como a su modo de ejecución.
-
-Los otros tipos de métodos no tienen propiedades específicas. Sus propiedades están relacionadas con las de los objetos a los que están unidos.
-
-Para mostrar la caja de diálogo **Propiedades del método** para un método proyecto, puede:
-
-- en el [editor de código](../code-editor/write-class-method.md), seleccione el comando **Propiedades del método...** en el menú **Método**,
-- o en la página **Métodos** del Explorador, **haga clic derecho** en el método proyecto y seleccione **Propiedades del método...** en el menú contextual o en el menú de opciones.
-
-> Una función de parámetrización global permite modificar una propiedad para todos o parte de los métodos proyecto de la base en una sola operación (ver [Modificar atributos de los métodos globalmente](#batch-setting-for-method-attributes)).
-
-### Nombre
-
-Puede cambiar el nombre de un método proyecto en el área **Nombre** de la ventana **Propiedades del método** o en el Explorador.
-
-El nuevo nombre debe cumplir con las reglas de denominación de 4D (ver [Identificadores](../Concepts/identifiers.md)). Si ya existe un método con el mismo nombre, 4D muestra un mensaje diciendo que el nombre del método ya ha sido utilizado. Si es necesario, 4D ordena de nuevo la lista de métodos.
-
-:::caution
-
-Cambiar el nombre de un método ya utilizado en la base de datos puede invalidar cualquier método o fórmula que utilice el antiguo nombre de método y corre el riesgo de interrumpir el funcionamiento de la aplicación. Puede cambiar el nombre del método manualmente, pero se recomienda utilizar la función de cambio de nombre de los métodos proyecto, descrita en [Renombrar](https://doc.4d.com/4Dv20/4D/20.2/Renaming.300-6750165.en.html). Con esta función, puede actualizar automáticamente el nombre siempre que se llame al método en todo el entorno Diseño.
-
-Con 4D Server, el nombre del método se cambia en el servidor cuando se termina de editar. Si más de un usuario está modificando el nombre del método al mismo tiempo, el nombre final del método será el especificado por el último usuario en terminar de editarlo. Es posible que desee designar un propietario del método para que sólo ciertos usuarios puedan cambiar su nombre
-
-:::
-
-:::info
-
-Los métodos base no pueden ser renombrados. Lo mismo ocurre con los triggers, los métodos formulario y los métodos objeto, que están vinculados a los objetos y toman sus nombre del objeto en cuestión.
-
-:::
-
-### Atributos
-
-Puede controlar cómo se utilizan y/o llaman los métodos proyecto en diferentes contextos utilizando atributos. Tenga en cuenta que puede definir los atributos globalmente para una selección de métodos proyecto utilizando el Explorador (ver la sección siguiente).
-
-#### Invisible
-
-Si no quiere que los usuarios puedan ejecutar un método proyecto utilizando el comando **Método...** del menú **Ejecución**, puede hacerlo Invisible marcando esta opción. Un método invisible no aparece en la caja de diálogo de ejecución del método.
-
-Cuando se hace invisible un método proyecto, sigue estando disponible para los desarrolladores de la base. Permanece en la lista de métodos del Explorador y del Editor de código.
-
-#### Compartido por los componentes y la base local
-
-Este atributo se utiliza en el marco de los componentes. Cuando está marcada, indica que el método estará disponible para los componentes cuando la aplicación se utilice como base local. Por otro lado, cuando la aplicación se utiliza como un componente, el método estará disponible para las bases locales.
-
-Para más información sobre los componentes, consulte el capítulo [Desarrollo e instalación de componentes 4D](../Extensions/develop-components.md).
-
-#### Ejecutar en el servidor
-
-Este atributo sólo se tiene en cuenta para una aplicación 4D en modo cliente-servidor. Cuando esta opción está marcada, el método del proyecto se ejecuta siempre en el servidor, independientemente de cómo se llame.
-
-Para más información sobre esta opción, consulte [Atributo Ejecutar en el servidor](https://doc.4d.com/4Dv20/4D/20/Execute-on-Server-attribute.300-6330555.en.html).
-
-### Modo Ejecución
-
-Esta opción permite declarar el método elegible para la ejecución en modo apropiativo. Se describe en la [sección Procesos apropiativos](../Develop/preemptive.md).
-
-### Disponibilidad
-
-Los atributos de disponibilidad especifican los servicios externos que pueden llamar explícitamente al método.
-
-#### Web Services
-
-Este atributo le permite publicar el método actual como servicio web accesible a través de peticiones SOAP. Para más información, consulte el capítulo [Publicación y uso de los servicios web](https://doc.4d.com/4Dv20/4D/20.2/Publication-and-use-of-Web-Services.200-6750103.en.html). Cuando esta opción está marcada, se activa la opción **Publicado en WSDL**.
-
-En el explorador, los métodos proyecto que se ofrecen como Servicio web reciben un icono específico.
-
-**Nota:** no es posible publicar un método como servicio web si su nombre incluye caracteres que no cumplen con la nomenclatura XML (por ejemplo espacios). Si el nombre del método no cumple con esto, 4D no asigna la propiedad.
-
-#### Publicado en WSDL
-
-Este atributo sólo está disponible si el atributo "Servicio Web" está marcado. Permite incluir el método actual en el WSDL de la aplicación 4D. Para obtener más información al respecto, consulte [Generación del WSDL](https://doc.4d.com/4Dv20/4D/20.2/Publishing-a-Web-Service-with-4D.300-6750334.en.html#502689).
-
-En el Explorador, los métodos proyecto que se ofrecen como servicio web y se publican en WSDL reciben un icono específico.
-
-#### Etiquetas 4D y URLs (4DACTION...)
-
-Esta opción se utiliza para reforzar la seguridad del servidor web 4D: cuando no está marcada, el método proyecto no puede ejecutarse a través de una petición HTTP que contenga la URL especial [4DACTION](../WebServer/httpRequests.md#4daction) utilizada para llamar a los métodos 4D, ni las etiquetas especiales [4DSCRIPT, 4DTEXT y 4DHTML](../Tags/transformation-tags.md).
-
-En el Explorador, los métodos proyecto con este atributo reciben un icono específico.
-
-Por razones de seguridad, esta opción está desmarcada por defecto. Cada método que pueda ejecutarse utilizando las URLs y las etiquetas especiales debe indicarse individualmente.
-
-#### SQL
-
-Cuando está marcada, esta opción permite que el método proyecto sea ejecutado por el motor SQL de 4D. Por defecto, no está seleccionado, lo que significa que, a menos que se autorice explícitamente, los métodos proyecto de 4D están protegidos y no pueden ser llamados por el motor SQL de 4D.
-
-Esta propiedad se aplica a todas las consultas SQL internas y externas, ejecutadas a través del controlador ODBC, código SQL insertado entre las etiquetas [Begin SQL](../commands-legacy/begin-sql.md)/[End SQL](../commands-legacy/end-sql.md) o el comando [QUERY BY SQL](../commands-legacy/query-by-sql.md).
-
-**Notas:**
-
-- Aunque un método tenga el atributo "SQL", los derechos de acceso definidos a nivel de las propiedades de la base y de las propiedades del método se tienen en cuenta para la ejecución del método.
-- La función ODBC **SQLProcedure** sólo devuelve los métodos proyecto con el atributo "SQL".
-
-Para más información, consulte [Implementación del motor SQL de 4D](https://doc.4d.com/4Dv20/4D/20/4D-SQL-engine-implementation.300-6342089.en.html) en el manual SQL de 4D.
-
-#### Servidor REST
-
-*Esta opción es obsoleta. La llamada a código a través de llamadas REST sólo es compatible con las [funciones de clase del modelo de datos ORDA](../REST/ClassFunctions.md).*
-
-#### Modificar de atributos globalmente
-
-Mediante el cuadro de diálogo "Atributos de los métodos", puede modificar un atributo (Invisible, Ofrecido como servicio web, etc.) para todos o parte de los métodos proyecto base en una sola operación. Esta funcionalidad es especialmente útil para modificar los atributos de un gran número de métodos proyecto. También puede utilizarse durante el desarrollo para aplicar rápidamente los atributos comunes a grupos de métodos similares.
-
-Para la configuración global de los atributos del método:
-
-1. En la página [Métodos](https://doc.4d.com/4Dv20/4D/20.2/Methods-Page.300-6750119.en.html) del Explorador 4D, despliegue el menú de opciones y elija el comando **Modificar atributos globalmente...**. Aparece la caja de diálogo **Atributos de los métodos**.
-
-2. En el área "Nombre del método coincidente:", introduzca una cadena que le permita designar los métodos que desea modificar globalmente.
- La cadena de caracteres se utiliza como criterio de búsqueda para los nombres de los métodos.
-
-Utilice el caracter comodín @ para ayudar a definir los grupos de métodos:
-
-- Para designar métodos cuyos nombres empiezan por..., escriba @ al final de la cadena. Por ejemplo: `web@`
-- Para designar los métodos cuyos nombres contengan..., escriba @ en medio de la cadena. Por ejemplo: `web@write`
-- Para designar los métodos cuyos nombres terminan en..., escriba @ al inicio de la cadena. Por ejemplo: `@write`
-- Para designar todos los métodos, basta con escribir @ en el área.
-
-**Notas:**
-
-- La búsqueda no tiene en cuenta las mayúsculas/minúsculas.
-- Puede introducir varios caracteres @ en la cadena, por ejemplo `dtro_@web@pro.@`
-
-3. En el área "Atributo a modificar", elija un atributo de la lista desplegable y, a continuación, haga clic en el botón radio **True** o **False** correspondiente al valor que debe aplicarse.
-
-**Nota:** si el atributo "Publicado en WSDL" se establece como True, sólo se aplicará a los métodos proyecto que ya contengan el atributo "Ofrecido como servicio web".
-
-4. Haga clic en **Aplicar**. La modificación se aplica instantáneamente a todos los métodos proyecto designados por la cadena de caracteres introducida.
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/components.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/components.md
deleted file mode 100644
index 2b2cc1137845e5..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/components.md
+++ /dev/null
@@ -1,584 +0,0 @@
----
-id: components
-title: Componentes
----
-
-Un componente 4D es un conjunto de código y/o de formularios 4D que representan una o varias funcionalidades que pueden añadirse y utilizarse en sus proyectos. Por ejemplo, el componente [4D SVG](https://github.com/4d/4D-SVG) añade comandos avanzados y un motor de renderizado integrado que puede utilizarse para visualizar archivos SVG.
-
-Puede [desarrollar](../Extensions/develop-components.md) y [crear](../Desktop/building.md) sus propios componentes 4D, o descargar componentes públicos compartidos por la comunidad 4D que [se pueden encontrar en GitHub](https://github.com/search?q=4d-component\\\\\\\\\\&type=Repositories).
-
-Al desarrollar en 4D, los archivos de los componentes pueden almacenarse de forma transparente en su ordenador o en un repositorio Github.
-
-## Componentes interpretados y compilados
-
-Los componentes pueden ser interpretados o [compilados](../Desktop/building.md).
-
-- Un proyecto 4D que se ejecuta en modo interpretado puede utilizar componentes interpretados o compilados.
-- Un proyecto 4D que se ejecuta en modo compilado no puede utilizar componentes interpretados. En este caso, sólo se pueden utilizar componentes compilados.
-
-### Carpeta Package
-
-La carpeta del paquete de un componente puede contener:
-
-- para **componentes interpretados**: una [Carpeta Project](../Project/architecture.md) estándar. El nombre de la carpeta del paquete debe llevar el sufijo **.4dbase** si desea instalarlo en la carpeta [**Componentes** de su proyecto](architecture.md#components).
-- para **componentes compilados**:
- - una carpeta "Contents" que contenga un archivo .4DZ, una carpeta *Resources*, un archivo *Info.plist* (arquitectura recomendada)
- - o directamente un archivo .4DZ con otras carpetas como *Resources*.
-
-:::note
-
-La arquitectura de carpetas "Contents" se recomienda para los componentes si desea [notarizar](../Desktop/building.md#about-notarization) sus aplicaciones en macOS.
-
-:::
-
-## Cargando componentes
-
-:::note
-
-Esta página describe cómo trabajar con componentes en los entornos **4D** y **4D Server**. En otros entornos, los componentes se gestionan de manera diferente:
-
-- en [4D en modo remoto](../Desktop/clientServer.md), los componentes son cargados por el servidor y enviados a la aplicación remota.
-- en las aplicaciones fusionadas, los componentes se [incluyen en el paso de compilación](../Desktop/building.md#plugins--components-page).
-
-:::
-
-### Generalidades
-
-Para cargar un componente en su proyecto 4D, usted puede:
-
-- copie los archivos de componentes en la carpeta [**Components** de su proyecto](architecture.md#components) (las carpetas de paquetes de componentes interpretados deben llevar el sufijo ".4dbase", ver arriba),
-- o bien, declare el componente en el archivo **dependencies.json** de su proyecto; esto se hace automáticamente para los archivos locales cuando [**añade una dependencia utilizando la interfaz del gestor de dependencias**](#adding-a-github-dependency).
-
-Los componentes declarados en el archivo **dependencies.json** pueden almacenarse en diferentes ubicaciones:
-
-- al mismo nivel que la carpeta de paquetes de su proyecto 4D: esta es la ubicación predeterminada,
-- en cualquier lugar de su máquina: la ruta del componente debe declararse en el archivo **environment4d.json**
-- en un repositorio GitHub: la ruta del componente puede declararse en el archivo **dependencies.json** o en el archivo **environment4d.json**, o en ambos archivos.
-
-Si se instala el mismo componente en distintos lugares, se aplica un [orden de prioridad](#priority).
-
-### dependencies.json y environment4d.json
-
-#### dependencies.json
-
-El archivo **dependencies.json** hace referencia a todos los componentes requeridos en su proyecto 4D. Este archivo debe encontrarse en la carpeta **Sources** de la carpeta del proyecto 4D, por ejemplo.:
-
-```
- /MyProjectRoot/Project/Sources/dependencies.json
-```
-
-Puede contener:
-
-- nombres de componentes [almacenados localmente](#local-components) (ruta por defecto o ruta definida en un archivo **environment4d.json**),
-- nombres de componentes [almacenados en repositorios de GitHub](#components-stored-on-github) (su ruta puede definirse en este archivo o en un archivo **environment4d.json**).
-
-#### environment4d.json
-
-El archivo **environment4d.json** es opcional. Permite definir **rutas personalizadas** para algunos o todos los componentes declarados en el archivo **dependencies.json**. Este archivo puede almacenarse en la carpeta del paquete del proyecto o en una de sus carpetas padre, en cualquier nivel (hasta la raíz).
-
-Los principales beneficios de esta arquitectura son los siguientes:
-
-- puede almacenar el archivo **environment4d.json** en una carpeta padre de sus proyectos y decidir no confirmarlo, permitiéndote tener su organización local de componentes.
-- si quiere utilizar el mismo repositorio GitHub para varios de sus proyectos, puede referenciarlo en el archivo **environment4d.json** y declararlo en el archivo **dependencies.json**.
-
-### Prioridad
-
-Dado que los componentes pueden instalarse de distintas formas, se aplica un orden de prioridad cuando se hace referencia al mismo componente en varias ubicaciones:
-
-**Máxima prioridad**
-
-1. Componentes almacenados en la carpeta [**Components** del proyecto](architecture.md#components).
-2. Componentes declarados en el archivo **dependencies.json** (la ruta declarada **environment4d.json** anula la ruta **dependencies.json** para configurar un entorno local).
-3. Componentes 4D internos del usuario (por ejemplo, 4D NetKit, 4D SVG...)
-
-**Prioridad más baja**
-
-```mermaid
-flowchart TB
- id1("1 Components from project's Components folder")
- ~~~
- id2("2 Components listed in dependencies.json")
- ~~~
- id2 -- environment4d.json gives path --> id4("Load component based on path declared in environment4d.json")
- ~~~
- id3("3 User 4D components")
- id2 -- environment4d.json doesn't give path --> id5("Load component next to package folder")
- ~~~
- id3("3 User 4D components")
-```
-
-Cuando un componente no puede cargarse debido a otra instancia del mismo componente situada en un nivel de prioridad superior, ambos obtienen un [estado] específico (#dependency-status): el componente no cargado recibe el estado *Overloaded*, mientras que el componente cargado tiene el estado *Overloading*.
-
-### Componentes locales
-
-Declara un componente local en el archivo [**dependencies.json**](#dependenciesjson) de la siguiente manera:
-
-```json
-{
- "dependencies": {
- "myComponent1" : {},
- "myComponent2" : {}
- }
-}
-```
-
-... donde "myComponent1" y "myComponent2" son el nombre de los componentes a cargar.
-
-De forma predeterminada, si "myComponent1" y "myComponent2" no están declarados en un archivo [**environment4d.json**](#environment4djson), 4D buscará la carpeta del paquete del componente (*es decir*, la carpeta raíz del proyecto del componente) al mismo nivel que la carpeta del paquete de su proyecto de 4D, por ejemplo:
-
-```
- /MyProjectRoot/
- /MyProjectComponentRoot/
-```
-
-Gracias a esta arquitectura, puede simplemente copiar todos sus componentes al mismo nivel que sus proyectos y referenciarlos en sus archivos **dependencies.json**.
-
-:::note
-
-Si no desea utilizar la arquitectura **dependencies.json**, puede instalar componentes locales copiando sus archivos en la carpeta [**Components** de su proyecto](architecture.md#components).
-
-:::
-
-#### Personalizar rutas de componentes
-
-Si la ruta de un componente declarado en el archivo **environment4d.json** no se encuentra cuando se inicia el proyecto, el componente no se carga y obtiene el estado *No encontrado* [status](dependency-status), incluso si existe una versión del componente junto a la carpeta de paquetes del proyecto.
-
-Puede utilizar rutas **relativas** o **absolutas** (ver abajo).
-
-Ejemplos:
-
-```json
-{
- "dependencies": {
- "myComponent1" : "MyComponent1",
- "myComponent2" : "../MyComponent2",
- "myComponent3" : "file:///Users/jean/MyComponent3"
- }
-}
-```
-
-:::note
-
-Si la ruta de un componente declarado en el archivo **environment4d.json** no se encuentra cuando se inicia el proyecto, el componente no se carga y obtiene el [estado](#dependency-status) *Not found*, incluso si existe una versión del componente junto a la carpeta de paquetes del proyecto.
-
-:::
-
-#### Rutas relativas frente a rutas absolutas
-
-Las rutas se expresan en sintaxis POSIX como se describe en [este párrafo](../Concepts/paths#posix-syntax).
-
-Las rutas relativas son relativas al archivo [`environment4d.json`](#environment4djson). Las rutas absolutas están vinculadas a la máquina del usuario.
-
-Utilizar rutas relativas es **recomendable** en la mayoría de los casos, ya que ofrecen flexibilidad y portabilidad de la arquitectura de componentes, especialmente si el proyecto está alojado en una herramienta de control de código fuente.
-
-Las rutas absolutas sólo deben utilizarse para componentes específicos de una máquina y un usuario.
-
-### Configuración del repositorio GitHub
-
-Los componentes 4D disponibles como lanzamientos GitHub pueden ser referenciados y automáticamente cargados y actualizados en sus proyectos 4D.
-
-:::note
-
-En cuanto a los componentes almacenados en GitHub, tanto los archivos [**dependencies.json**](#dependenciesjson) como [**environment4d.json**](#environment4djson) admiten los mismos contenidos.
-
-:::
-
-#### Componentes almacenados en GitHub
-
-Los componentes 4D disponibles en GitHub pueden ser referenciados y cargados automáticamente en sus proyectos 4D.
-
-- Comprima los archivos componentes en formato ZIP.
-- Nombre este archivo con el mismo nombre que el repositorio GitHub.
-- Integre el archivo en una [versión GitHub](https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository) del repositorio.
-
-Estos pasos pueden automatizarse fácilmente, con código 4D o utilizando GitHub Actions, por ejemplo.
-
-#### Declarando rutas
-
-Declare un componente almacenado en GitHub en el archivo [**dependencies.json**](#dependenciesjson) de la siguiente manera:
-
-```json
-{
- "dependencies": {
- "myGitHubComponent1": {
- "github" : "JohnSmith/myGitHubComponent1"
- },
- "myGitHubComponent2": {}
- }
-}
-```
-
-... donde "myGitHubComponent1" está referenciado y declarado para el proyecto, aunque "myGitHubComponent2" sólo está referenciado. Necesita declararlo en el archivo [**environment4d.json**](#environment4djson):
-
-```json
-{
- "dependencies": {
- "myGitHubComponent2": {
- "github" : "JohnSmith/myGitHubComponent2"
- }
- }
-}
-```
-
-"myGitHubComponent2" puede ser utilizado por varios proyectos.
-
-#### Etiquetas y versiones
-
-Cuando se crea una versión en GitHub, se le asocia una **etiqueta** y una **versión**. El gestor de dependencias utiliza esta información para gestionar la disponibilidad automática de los componentes.
-
-:::note
-
-Si seleccionas la regla de dependencia [**Seguir la versión 4D**](#defining-a-github-dependency-version-range), necesita usar una [convención de nomenclatura específica para las etiquetas](#naming-conventions-for-4d-version-tags).
-
-:::
-
-- **Etiquetas** son textos que hacen referencia única a una versión. En los archivos [**dependencies.json**](#dependenciesjson) y [**environment4d.json**](#environment4djson), puede indicar la etiqueta de versión que desea utilizar en su proyecto. Por ejemplo:
-
-```json
-{
- "dependencies": {
- "myFirstGitHubComponent": {
- "github": "JohnSmith/myFirstGitHubComponent",
- "tag": "beta2"
- }
- }
-}
-```
-
-- Una versión también se identifica por una **versión**. The versioning system used is based on the [*Semantic Versioning*](https://regex101.com/r/Ly7O1x/3/) concept, which is the most commonly used. Cada número de versión se identifica de la siguiente manera: `majorNumber.minorNumber.pathNumber`. Del mismo modo que para las etiquetas, puede indicar la versión del componente que desea utilizar en su proyecto, como en este ejemplo:
-
-```json
-{
- "dependencies": {
- "myFirstGitHubComponent": {
- "github": "JohnSmith/myFirstGitHubComponent",
- "version": "2.1.3"
- }
- }
-}
-```
-
-Un rango se define mediante dos versiones semánticas, un mínimo y un máximo, con los operadores '\< | > | >= | <= | ='. El `*` se puede utilizar como un marcador de posición para todas las versiones. Los prefijos ~ y ^ definen versiones a partir de un número, y hasta respectivamente la siguiente versión mayor y menor.
-
-Estos son algunos ejemplos:
-
-- "latest": la versión que tiene el distintivo "latest" en las versiones de GitHub.
-- "\*": la última versión lanzada.
-- "1.\*": todas las versiones de la versión principal 1.
-- "1.2.\*": todos los parches de la versión menor 1.2.
-- ">=1.2.3": la última versión, a partir de la versión 1.2.3.
-- ">1.2.3": la última versión, empezando por la versión inmediatamente posterior a la 1.2.3.
-- "^1.2.3": la última versión 1, a partir de la versión 1.2.3 y estrictamente inferior a la versión 2.
-- "~1.2.3": la última versión 1.2, a partir de la versión 1.2.3 y estrictamente inferior a la versión 1.3.
-- "<=1.2.3": la última versión hasta la 1.2.3.
-- "1.0.0 – 1.2.3" o ">=1.0.0 <=1.2.3": versión entre 1.0.0 y 1.2.3.
-- "`<1.2.3 || >=2`": versión que no está entre 1.2.3 y 2.0.0.
-
-Si no especifica una etiqueta o una versión, 4D recupera automáticamente la "última" versión.
-
-El gestor de dependencias comprueba periódicamente si hay actualizaciones de componentes disponibles en Github. Si hay una nueva versión disponible para un componente, se muestra un indicador de actualización para el componente en la lista de dependencias, [dependiendo de su configuración](#defining-a-github-dependency-version-range).
-
-#### Convenciones de nomenclatura para las etiquetas de versión 4D
-
-Si quiere usar la regla de dependencia [**Seguir la versión 4D**](#defining-a-github-dependency-version-range), las etiquetas para las versiones de componentes en el repositorio de Github deben cumplir con convenciones específicas.
-
-- **Versiones LTS**: modelo `x.y.p`, donde `x.y` corresponde a la versión principal de 4D a seguir y `p` (opcional) puede utilizarse para versiones correctivas o actualizaciones adicionales. Cuando un proyecto especifica que sigue la versión 4D para la versión LTS *x.y*, el Gestor de dependencias lo resolverá como "la última versión x.\*" si está disponible o "versión inferior a x". Si no existe tal versión, se notificará al usuario. Por ejemplo, "20.4" será resuelto por el gestor de dependencias como "la última versión del componente 20.\* o la versión inferior a 20".
-
-- **Versiones R-Release**: modelo `xRy.p`, donde `x` y `y` corresponden a la versión principal de 4D R-release a seguir y `p` (opcional) puede usarse para versiones correctivas o las actualizaciones adicionales. Cuando un proyecto especifica que sigue la versión 4D para la versión *xRy*, el Gestor de dependencias lo resolverá a la "última versión por debajo de xR(y+1)" si está disponible. Si no existe tal versión, se notificará al usuario. Por ejemplo, "20R9" será resuelto por el gestor de dependencias como "la última versión del componente por debajo de 20R10".
-
-:::note
-
-El desarrollador del componente puede definir una versión mínima de 4D en el archivo [`info.plist`](../Extensions/develop-components.md#infoplist).
-
-:::
-
-#### Repositorios privados
-
-Si quiere integrar un componente ubicado en un repositorio privado, necesita decirle a 4D que utilice un token de conexión para acceder a él.
-
-Para ello, en su cuenta GitHub, cree un token **classic** con derechos de acceso a **repo**.
-
-:::note
-
-Para más información, consulte la [Interfaz de tokens GitHub](https://github.com/settings/tokens).
-
-:::
-
-A continuación, deberá [suministrar su token de conexión](#providing-your-github-access-token) al gestor de dependencias.
-
-#### Caché local para dependencias
-
-Los componentes GitHub a los que se hace referencia se descargan en una carpeta de caché local y, a continuación, se cargan en su entorno. La carpeta de caché local se guarda en la siguiente ubicación:
-
-- en macOs: `$HOME/Library/Caches//Dependencies`
-- en Windows: `C:\Users\\AppData\Local\\Dependencies`
-
-...donde `` puede ser "4D", "4D Server" o "tool4D".
-
-### dependency-lock.json
-
-Se crea un archivo `dependency-lock.json` en la carpeta [`userPreferences`](architecture.md#userpreferencesusername) de su proyecto.
-
-Este archivo registra información como el estado de las dependencias, rutas, urls, errores de carga, así como otra información. Podría ser útil para la gestión de la carga de componentes o la resolución de problemas.
-
-## Monitoreo de dependencias del proyecto
-
-En un proyecto abierto, puede añadir, eliminar, actualizar y obtener información sobre las dependencias y su estado de carga actual en el panel **Dependencias**.
-
-Para mostrar el panel Dependencias:
-
-- con 4D, seleccione el ítem de menú **Diseño/Dependencias del Proyecto** (entorno de desarrollo),
- 
-
-- con el servidor 4D, seleccione el elemento de menú **Ventana/Dependencias del proyecto**.
- 
-
-A continuación, se muestra el panel Dependencias. Las dependencias se ordenan por nombre en orden alfabético:
-
-
-
-La interfaz del panel Dependencias le permite gestionar las dependencias (en 4D monousuario y 4D Server).
-
-### Filtrado de dependencias
-
-Por defecto, se listan todas las dependencias identificadas por el gestor de dependencias, sea cual sea su [estado](#dependency-status). Puede filtrar las dependencias mostradas según su estado seleccionando la pestaña correspondiente en la parte superior del panel Dependencias:
-
-
-
-- **Activo**: dependencias que están cargadas y pueden ser utilizadas en el proyecto. Incluye dependencias *overloading*, las cuales son realmente cargadas. Las dependencias *Overloaded* se enumeran en el panel **Conflicts** junto con todas las dependencias en conflicto.
-- **Inactivo**: dependencias que no están cargadas en el proyecto y no están disponibles. Hay muchas razones posibles para este estado: archivos que faltan, incompatibilidad de versiones...
-- **Conflicto**: dependencias que se cargan pero que sobrecargan al menos otra dependencia de menor [nivel de prioridad](#prioridad). También se muestran las dependencias sobrecargadas para que pueda comprobar el origen del conflicto y tomar las medidas oportunas.
-
-### Estado de dependencias
-
-Las dependencias que requieren la atención del desarrollador se indican mediante una **etiqueta de estado** a la derecha de la línea y un color de fondo específico:
-
-
-
-Las siguientes etiquetas de estado están disponibles:
-
-- **Overloaded**: la dependencia no se carga porque está sobrecargada por otra dependencia con el mismo nombre en un [nivel de prioridad] superior(#prioridad).
-- **Overloading**: la dependencia está cargada y está sobrecargando una o más dependencias con el mismo nombre en un [nivel de prioridad] inferior(#prioridad).
-- **Not found**: la dependencia se declara en el archivo dependencies.json pero no se encuentra.
-- **Inactive**: la dependencia no se carga porque no es compatible con el proyecto (por ejemplo, el componente no está compilado para la plataforma actual).
-- **Duplicated**: la dependencia no se carga porque existe otra dependencia con el mismo nombre en la misma ubicación (y está cargada).
-- **Disponible después del reinicio**: la referencia a dependencias acaba de ser añadida o actualizada [usando la interfaz](#monitoring-project-dependencies), se cargará una vez que la aplicación se reinicie.
-- **Descargado después de reiniciar**: la referencia de dependencias acaba de ser removida [utilizando la interfaz](#removing-a-dependency), se descargará una vez que la aplicación se reinicie.
-- **Actualización disponible**: se ha detectado una nueva versión de la dependencia GitHub que coincide con su [configuración de la versión del componente](#defining-a-github-dependency-version-range).
-- **Reiniciado tras reinicio**: la [configuración de la versión del componente](#defining-a-github-dependency-version-range) de la dependencia de GitHub se ha modificado, se ajustará el próximo inicio.
-- **Actualización reciente**: se ha cargado una nueva versión de la dependencia de GitHub al inicio.
-
-Al pasar el ratón por encima de la línea de dependencia, se muestra un mensaje que ofrece información adicional sobre el estado:
-
-
-
-### Origen de la dependencia
-
-El panel Dependencias enumera todas las dependencias del proyecto, sea cual sea su origen, es decir, de dónde procedan. El origen de la dependencia lo suministra la etiqueta bajo su nombre:
-
-
-
-Las siguientes opciones de origen son posibles:
-
-| Etiqueta de origen | Descripción |
-| --------------------------------- | ---------------------------------------------------------------------------------- |
-| Componente 4D | Componente 4D integrado, almacenado en la carpeta `Components` de la aplicación 4D |
-| dependencies.json | Componente declarado en el archivo [`dependencies.json`](#dependenciesjson) |
-| Entorno | Componente declarado en el archivo [`environnement4d.json`](#environment4djson) |
-| Componente del proyecto | Componente ubicado en la carpeta [`Components`](architecture.md#components) |
-
-**Clic derecho** en una línea de dependencia y selecciona **Mostrar en el disco** para revelar la ubicación de una dependencia:
-
-
-
-:::note
-
-Este elemento no se muestra si la relación está inactiva porque no se encuentran sus archivos.
-
-:::
-
-El icono del componente y el logotipo de ubicación ofrecen información adicional:
-
-- El logotipo del componente indica si es suministrado por 4D o por un desarrollador externo.
-- Los componentes locales se pueden diferenciar de los componentes GitHub por un pequeño icono.
-
-
-
-### Añadir una dependencia local
-
-Para añadir una dependencia local, haga clic en el botón **+** en el área de pie de página del panel. Se muestra la siguiente caja de diálogo:
-
-
-
-Asegúrese de que la pestaña **Local** esté seleccionada y haga clic en el botón **...**. Aparece una caja de diálogo estándar Abrir archivo, que le permite seleccionar el componente que desea añadir. Puede seleccionar un [**.4DZ**](../Desktop/building.md#build-component) o un archivo [**.4DProject**](architecture.md#applicationname4dproject-file).
-
-Si el elemento seleccionado es válido, su nombre y ubicación se muestran en la caja de diálogo.
-
-
-
-Si el elemento seleccionado no es válido, se mostrará un mensaje de error.
-
-Haga clic en **Añadir** para añadir la dependencia al proyecto.
-
-- Si selecciona un componente situado junto a la carpeta del paquete del proyecto (ubicación predeterminada), se declara en el archivo [**dependencies.json**](#dependenciesjson).
-- Si selecciona un componente que no se encuentra junto a la carpeta del paquete del proyecto, se declara en el archivo [**dependencies.json**](#dependenciesjson) y su ruta se declara en el archivo [**environment4d.json**](#environment4djson) (ver nota). El panel Dependencias le pregunta si desea guardar una [ruta relativa o absoluta](#relative-paths-vs-absolute-paths).
-
-:::note
-
-Si en este paso no se ha definido aún ningún archivo [**environment4d.json**](#environment4djson) para el proyecto, se creará automáticamente en la carpeta del paquete del proyecto (ubicación por defecto).
-
-:::
-
-La dependencia se añade a la [lista de dependencias inactivas](#dependency-status) con el estado **Disponible después de reiniciar**. Se cargará cuando se reinicie la aplicación.
-
-### Añadir una dependencia GitHub
-
-Para añadir una [dependencia GitHub](#components-stored-on-github), haga clic en el botón **+** en el área de pie de página del panel y seleccione la pestaña **GitHub**.
-
-
-
-Introduzca la ruta del repositorio GitHub de la dependencia. Podría ser una **URL del repositorio** o una **cadena de nombres de repositorio github/account/repository**, por ejemplo:
-
-
-
-Una vez establecida la conexión, se muestra el icono de GitHub en el lado derecho del área de entrada. Puede hacer clic en este icono para abrir el repositorio en su navegador predeterminado.
-
-:::note
-
-Si el componente se almacena en un [repositorio privado de GitHub](#private-repositories) y falta su token personal, se muestra un mensaje de error y se muestra un botón **Añadir un token de acceso personal...** (ver [Suministrar su token de acceso GitHub](#providing-your-github-access-token)).
-
-:::
-
-Definir el [rango de versiones de dependencia](#tags-and-versions) a utilizar para este proyecto. Por defecto, se selecciona "Última", lo que significa que se utilizará automáticamente la última versión.
-
-Haga clic en el botón **Añadir** para añadir la dependencia al proyecto.
-
-La dependencia de GitHub es declarada en el archivo [**dependencies.json**](#dependenciesjson) y añadida a la [lista de dependencias inactivas](#dependency-status) con el estado **Disponible al reiniciar**. Se cargará cuando se reinicie la aplicación.
-
-#### Definición de un intervalo de versiones de dependencia de GitHub
-
-Puede definir la opción [etiqueta o versión](#tags-and-versions) para una dependencia:
-
-
-
-- **Último**: seleccionado por defecto y permite descargar la versión etiquetada como la última versión (estable).
-- **Hasta la próxima versión mayor**: define un [rango de versiones semánticas](#tags-and-versions) para restringir las actualizaciones a la próxima versión principal.
-- **Hasta la siguiente versión menor**: del mismo modo, restringir las actualizaciones a la siguiente versión menor.
-- **Versión exacta (Etiqueta)**: selecciona o introduce manualmente una [etiqueta específica](#tags-and-versions) de la lista disponible.
-- **Siga la versión 4D**: descargue la última versión del componente compatible con la versión 4D en ejecución. Puede usar esta regla de dependencia sólo si las etiquetas de release de los componentes siguen la [convención de nombres](#naming-conventions-for-4d-version-tags) apropiada.
-
-La versión actual de la dependencia de GitHub se muestra a la derecha del elemento de la dependencia:
-
-
-
-#### Modificación del intervalo de versiones de las dependencias GitHub
-
-Puede modificar la [configuración de versión](#defining-a-github-dependency-version-range) para una dependencia de GitHub listada: selecciona la dependencia a modificar y selecciona **Modificar la dependencia...** desde el menú contextual. En el cuadro de diálogo "Modificar la dependencia", edite el menú Regla de dependencia y haga clic en **Aplicar**.
-
-Modificar el rango de versiones es útil, por ejemplo, si utiliza la función de actualización automática y desea bloquear una dependencia a un número de versión específico.
-
-### Actualización de las dependencias GitHub
-
-El gestor de dependencias ofrece una gestión integrada de las actualizaciones en GitHub. Se soportan las siguientes funcionalidades:
-
-- Verificación automática y manual de las versiones disponibles
-- Actualización automática y manual de los componentes
-
-Las operaciones manuales pueden realizarse **por dependencia** o **para todas las dependencias**.
-
-#### Comprobación de nuevas versiones
-
-Las actualizaciones de las dependencias se comprueban periódicamente en GitHub. Esta verificación se realiza de forma transparente en segundo plano.
-
-:::note
-
-Si suministra un [token de acceso](#providing-your-github-access-token), las verificiones se realizan con mayor frecuencia, ya que GitHub permite entonces una mayor frecuencia de solicitudes a los repositorios.
-
-:::
-
-Además, puede buscar actualizaciones en cualquier momento, para una sola dependencia o para todas las dependencias:
-
-- Para verificar las actualizaciones de una única dependencia, haga clic con el botón derecho del ratón en la dependencia y seleccione **Verificar actualizaciones** en el menú contextual.
-
-
-
-- Para verificar si hay actualizaciones de todas las dependencias, haga clic en el menú **opciones** de la parte inferior de la ventana del gestor de dependencias y seleccione **Verificar actualizaciones**.
-
-
-
-Si se detecta en GitHub una nueva versión del componente que coincide con su [configuración de versiones del componente](#defining-a-github-dependency-version-range), se muestra un estado de dependencia específico:
-
-
-
-Puede decidir [actualizar el componente](#updating-dependencies) o no.
-
-Si no desea utilizar una actualización de componentes (por ejemplo, desea permanecer con una versión específica), simplemente deje el estado actual (asegúrese de que la función [**Actualización automática**](#automatic-update) no está marcada).
-
-#### Actualización de dependencias
-
-**Actualizar una dependencia** significa descargar una nueva versión de la dependencia desde GitHub y mantenerla lista para ser cargada la próxima vez que se inicie el proyecto.
-
-Puede actualizar las dependencias en cualquier momento, para una sola dependencia o para todas las dependencias:
-
-- Para actualizar una sola dependencia, haga clic con el botón derecho del ratón en la dependencia y seleccione **Actualizar en el próximo inicio** en el menú contextual o en el menú **opciones** de la parte inferior de la ventana del gestor de dependencias:
-
-
-
-- Para actualizar todas las dependencias a la vez, haga clic en el menú **opciones** de la parte inferior de la ventana del gestor de dependencias y seleccione **Actualizar todas las dependencias remotas en el próximo inicio**:
-
-
-
-En cualquier caso, sea cual sea el estado actual de la dependencia, se realiza una verificación automática en GitHub antes de actualizar la dependencia, para asegurarse de que se recupera la versión más reciente, [según la configuración de versionado de su componente](#defining-a-github-dependency-version-range).
-
-Al seleccionar un comando de actualización:
-
-- se muestra un cuadro de diálogo que propone **reiniciar el proyecto**, para que las dependencias actualizadas estén disponibles de inmediato. Normalmente se recomienda reiniciar el proyecto para evaluar las dependencias actualizadas.
-- si hace clic en Más tarde, el comando de actualización ya no estará disponible en el menú, lo que significa que la acción se ha planificado para el siguiente inicio.
-
-#### Actualización automática
-
-La opción **Actualización automática** está disponible en el menú **opciones** de la parte inferior de la ventana del gestor de dependencias.
-
-Cuando esta opción está marcada (por defecto), las nuevas versiones de componentes de GitHub que coincidan con su [configuración de versiones de componentes](#defining-a-github-dependency-version-range) se actualizan automáticamente para el siguiente inicio del proyecto. Esta opción facilita la gestión diaria de las actualizaciones de dependencias, al eliminar la necesidad de seleccionar manualmente las actualizaciones.
-
-Cuando esta opción no está marcada, una nueva versión del componente que coincida con su [configuración de versiones del componente](#defining-a-github-dependency-version-range) sólo se indicará como disponible y requerirá una [actualización manual](#updating-dependencies). Desmarque la opción **Actualización automática** si desea controlar con precisión las actualizaciones de las dependencias.
-
-### Suministrando su token de acceso de GitHub
-
-Registrar su token de acceso personal en el gestor de dependencias es:
-
-- obligatorio si el componente se almacena en un [repositorio privado de GitHub](#private-repositories),
-- recomendado para una [verificación de actualizaciones de dependencias](#updating-github-dependencies) más frecuente.
-
-Para proporcionar su token de acceso a GitHub, también puede:
-
-- haga clic en el botón \*\*Agregar un token de acceso personal... \* que se muestra en el cuadro de diálogo "Añadir una dependencia" después de introducir una ruta privada del repositorio de GitHub.
-- o, seleccione **Agregar un token de acceso personal de GitHub...** en el menú Administrador de Dependencias en cualquier momento.
-
-
-
-Luego puede introducir su token de acceso personal:
-
-
-
-Solo puede introducir un token de acceso personal. Una vez se ha sido introducido un token, puede editarlo.
-
-El token proporcionado se almacena en un archivo **github.json** en la [carpeta activa de 4D](../commands-legacy/get-4d-folder.md#active-4d-folder).
-
-### Eliminando una dependencia
-
-Para eliminar una dependencia desde el panel de dependencias, seleccione la dependencia que desea eliminar y haga clic en el botón **-** del panel o seleccione **Eliminar la dependencia...** en el menú contextual. Puede seleccionar varias relaciones, en cuyo caso la acción se aplica a todas las relaciones seleccionadas.
-
-:::note
-
-Sólo las dependencias declaradas en el archivo [**dependencies.json**](#dependenciesjson) pueden eliminarse mediante el panel Dependencias. Si no se puede eliminar una dependencia seleccionada, se desactiva el botón **-** y se oculta la opción de menú **Eliminar la dependencia...**.
-
-:::
-
-Aparece una caja de diálogo de confirmación. Si la dependencia se declaró en el archivo **environment4d.json**, una opción permite eliminarla:
-
-
-
-Si confirma la caja de diálogo, la dependencia eliminada [estado](#estado-dependencia) se marca automáticamente como "Descargar tras reinicio". Se descargará cuando se reinicie la aplicación.
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/date-time-formats.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/date-time-formats.md
deleted file mode 100644
index 79031da5a4075f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/date-time-formats.md
+++ /dev/null
@@ -1,166 +0,0 @@
----
-id: date-time-formats
-title: Formatos fecha y hora
----
-
-A lo largo de sus proyectos 4D, es posible que necesite dar formato a los valores de fecha y/u hora en función de las especificidades de la aplicación, la plataforma o la interfaz.
-
-4D incluye una lista completa de patrones que puede utilizar para crear y aplicar formatos personalizados de fecha y hora en sus aplicaciones, además de los formatos por defecto. Los patrones de formato personalizados son compatibles con las siguientes funciones:
-
-- el comando [`String`](../commands-legacy/string.md),
-- los comandos [`OBJECT SET FORMAT`](../commands-legacy/object-set-format.md) y [`OBJECT Get format`](../commands-legacy/object-get-format.md),
-- el formato de fecha y hora de las propiedades del objeto de formulario, disponibles en la lista de propiedades o en las propiedades JSON [`dateFormat`](../FormObjects/properties_Display.md/#date-format) y [`timeFormat`](../FormObjects/properties_Display.md/#time-format).
-
-## Lista de patrones
-
-La siguiente tabla muestra todos los patrones soportados para formatos de fecha y hora.
-
-| Símbolo | Significado | Modelo | Ejemplo de salida |
-| ------- | ------------------------------------------------------------------------------- | ------------ | -------------------------------------------------------------------------- |
-| G | designador de era | G, GG o GGG | AD |
-| | | GGGG | Anno Domini |
-| | | GGGGG | A |
-| y | año | yy | 96 |
-| | | y o yyyy | 1996 |
-| Y | año de "Semana del año" | Y | 1997 |
-| u | año prolongado | u | 4601 |
-| Q | trimestre | Q | 2 |
-| | | QQ | 02 |
-| | | QQQ | Q2 |
-| | | QQQQ | 2do trimestre |
-| | | QQQQQ | 2 |
-| q | trimestre independiente | q | 2 |
-| | | qq | 02 |
-| | | qqq | Q2 |
-| | | qqqq | 2do trimestre |
-| | | qqqqq | 2 |
-| M | mes en año | M | 9 |
-| | | MM | 09 |
-| | | MMM | Sept |
-| | | MMMM | Septiembre |
-| | | MMMMM | S |
-| L | mes independiente en año | L | 9 |
-| | | LL | 09 |
-| | | LLL | Sept |
-| | | LLLL | Septiembre |
-| | | LLLLL | S |
-| w | semana del año | w | 27 |
-| | | ww | 27 |
-| d | día del mes | d | 2 |
-| | | dd | 2 |
-| D | día del año | D | 189 |
-| E | día de la semana | E, EE o EEE | Tue |
-| | | EEEE | Tuesday |
-| | | EEEEE | T |
-| | | EEEEEE | Mar |
-| e | día de la semana local | e | 2 |
-| | | ee | 02 |
-| | | eee | Tue |
-| | | eeee | Tuesday |
-| | | eeeee | T |
-| | | eeeeee | Mar |
-| c | día de la semana local independiente | c o cc | 2 |
-| | | ccc | Tue |
-| | | cccc | Tuesday |
-| | | ccccc | T |
-| | | cccccc | Mar |
-| a | AM o PM | a, aa, o aaa | PM [abbrev] |
-| | | aaaa | PM [completo] |
-| | | aaaaa | p |
-| b | AM, PM, mediodía, medianoche | b, bb o bbb | mid. |
-| | | bbbb | medianoche |
-| | | bbbbb | md |
-| B | períodos de días flexibles | B, BB o BBB | de noche [abreviatura] |
-| | | BBBB | de noche [completo] |
-| | | BBBBB | de noche [abreviado] |
-| h | hora en am/pm (1~12) | h | 7 |
-| | | hh | 07 |
-| H | hora en día (0~23) | H | 0 |
-| | | HH | 00 |
-| K | hora en am/pm (0~11) | K | 0 |
-| | | KK | 00 |
-| k | hora en día (1~24) | k | 24 |
-| | | kk | 24 |
-| m | minuto en hora | m | 4 |
-| | | mm | 04 |
-| s | segundo en minuto | s | 5 |
-| | | ss | 05 |
-| X | Time Zone: ISO8601 basic hm?, con Z para 0 | X | -08, +0530, Z |
-| | Zona horaria: ISO8601 hm básico, con Z | XX | -0800, Z |
-| | Zona horaria: ISO8601 extendido hm, con Z | XXX | -08:00, Z |
-| | Zona horaria: ISO8601 hms básico, con Z | XXXX | -0800, -075258, Z |
-| | Zona horaria: ISO8601 hms extendido, con Z | XXXXX | -08:00, -07:52:58, Z |
-| x | Zona horaria: ISO8601 hm básico, sin Z para 0 | x | -08, +0530 |
-| | Zona horaria: ISO8601 hm básico, sin Z | xx | -0800, +0000 |
-| | Zona horaria: ISO8601 hm extendido, sin Z | xxx | -08:00 |
-| | Zona horaria: ISO8601 hms básico, sin Z | xxxx | -0800, -075258 |
-| | Time Zone: ISO8601 extended hms?, sin Z | xxxxx | -08:00, -07:52:58 |
-| O | Zona horaria: GMT localizada abreviada | O | GMT-8 |
-| | Zona horaria: localización larga GMT (=ZZZZ) | OOOO | GMT-08:00 |
-| z | Zona horaria: no específica | z, zz, o zzz | -0800 |
-| | | zzzz | GMT-08:00 |
-| | | zzzzz | -08:00, -07:52:58, Z |
-| | | | |
-| ' | escape para texto | ' | ' |
-| ' ' | dos comillas simples producen una | ' ' | ' ' |
-
-## Explorar modelos
-
-### `y` vs `Y`
-
-`y` es el año calendario, mientras que `Y` es el año basado en el número de semana. Por ejemplo, si los primeros días de enero de 2010 no son la semana #1, entonces y = 2010 pero Y = 2009 (hasta la fecha en la que comienza la primera semana de 2010).
-
-### `L` (monopuesto) vs `M`
-
-En algunos idiomas (ruso, eslovaco), el mes utilizado por sí solo es diferente al mes en una fecha. In "January 10, 2010", "January" is not spelled the same as in "*rendez-vous* in January".
-
-### `e` vs `c`
-
-La misma observación que para `L` y `M`: `c` es para un día utilizado solo "todos los martes") y `e` es para un día en una fecha ("martes 15 de enero de 1951").
-
-### `E` vs `e`
-
-`e` se basa en la configuración del sistema: si la semana está definida en el sistema como que comienza un miércoles, entonces el miércoles tendrá el valor numérico "1" (o cero) mientras que "E" siempre devuelve el mismo valor (de 1 a 7 o de 0 a 6).
-
-### Ceros a la izquierda
-
-En general, cuando el número de letras de la cadena de formato es superior al esperado, se añaden ceros a la izquierda. Ej: "yyyyy" daría "001996".
-
-### Partes localizadas
-
-Algunas partes de las salidas, como "medianoche" o "martes" están localizadas, según la configuración regional.
-
-Por ejemplo, para la hora `13:25:34`, "B" aparecerá *in the afternoon* en un sistema estadounidense, y *après-midi* en un sistema francés.
-
-### Letras adicionales
-
-Las cadenas de formato pueden contener caracteres que no deben interpretarse como caracteres de formato: si están entre "a" y "z" o "A" y "Z", deben ir entre comillas simples.
-
-Por ejemplo:
-
-"15:30:00" con el modelo "HH 'hours and' mm 'minutes'" produce "15 hours and 30 minutes".
-
-### Espacios iniciales y finales
-
-Los espacios iniciales y finales de los modelos se recortan automáticamente en las salidas. Si desea añadir espacios antes o después de la cadena resultante, debe encerrarlos entre comillas simples.
-
-Por ejemplo:
-
-" HH : mm : ss " ---> "09 : 10 : 25"
-"' 'HH : mm : ss' '" ---> " 09 : 10 : 25 "
-
-## Ejemplos
-
-| Fecha u hora | Modelo | Resultado | Comentarios |
-| ---------------------------------------- | ---------------------------- | -------------------------------- | ------------------ |
-| 15/06/2000 | "QQQQ" | "2do trimestre" | localizado |
-| 17/03/2001 | "D" | "76" | 76º día del año |
-| 17/03/1954 | "w" | "11" | 11ª semana del año |
-| 17/03/1954 | "eeee" | "Miércoles" | localizado |
-| 15:00:00 | "a" | "PM" | |
-| 18:00:00 | "a K" | "6 PM" | |
-| 13:30:15 | "hh:mm aa O" | "01:30 PM GMT+1" | |
-
-## Ver también
-
-Ver [este blogpost](https://blog.4d.com/tailored-customization-for-dates-and-times) para más información sobre los formatos personalizados de fecha y hora.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/overview.md
deleted file mode 100644
index 86a04c7c95252b..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Project/overview.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: overview
-title: Generalidades
----
-
-Un proyecto 4D contiene todo el código fuente de una aplicación 4D, sin importar su tipo de despliegue (web, móvil o escritorio), de la estructura de la base de datos hasta la interfaz de usuario, incluyendo el código, los formularios, los menús, los parámetros usuario o cualquier recurso necesario. Un proyecto 4D se compone principalmente de archivos texto.
-
-## Archivos del proyecto
-
-Los archivos de proyecto 4D se abren y editan con las aplicaciones estándar de la plataforma 4D (4D o 4D Server). Con 4D, dispone de editores completos para gestionar archivos, incluyendo un editor de estructura, un [Editor de código](../code-editor/write-class-method.md), un [editor de formularios](../FormEditor/formEditor.md), un editor de menús...
-
-Como los proyectos se encuentran en archivos legibles, en texto plano (JSON, XML, etc.), pueden ser leídos o editados manualmente por los desarrolladores, utilizando cualquier editor de código.
-
-Además, los archivos de proyecto 4D facilitan la programación genérica, la creación de plantillas de aplicaciones y el compartir código. Los archivos del proyecto pueden ser [compilados](compiler.md) y fácilmente desplegados.
-
-## Desarrollo
-
-Los proyectos 4D se desarrollan con la aplicación **4D**. Ofrece un entorno de desarrollo integrado (IDE) para los proyectos 4D, así como un servidor web, un generador de proyectos para móviles y un tiempo de ejecución de aplicaciones, lo que permite desarrollar, probar y depurar todo tipo de proyecto.
-
-El desarrollo multiusuario se gestiona a través de herramientas estándar del repositorio de **control de fuentes** (Perforce, Git, SVN, etc.), que permiten a los desarrolladores trabajar en diferentes ramas y comparar, fusionar o revertir las modificacion
-
-## Aplicación final
-
-Los archivos del proyecto pueden ser [compilados](compiler.md) y fácilmente desplegados. 4D le permite crear tres tipos de aplicaciones a partir de sus proyectos:
-
-- las aplicaciones [web](WebServer/webServer.md),
-- las aplicaciones [móviles](https://developer.4d.com/go-mobile/),
-- las aplicaciones [de escritorio](Desktop/building.md) (cliente/servidor o monopuesto).
-
-Las aplicaciones de back-end pueden desplegarse utilizando 4D Server, 4D, o [fusionadas con 4D Volume Desktop](../Desktop/building.md).
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$compute.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$compute.md
deleted file mode 100644
index 67b4ff5e934eef..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$compute.md
+++ /dev/null
@@ -1,81 +0,0 @@
----
-id: compute
-title: $compute
----
-
-Cálculo de atributos específicos (*e.*, `Employee/salary/?$compute=sum)` o en el caso de un atributo Objeto (*por ejemplo*, Employee/objectAtt.property1/?$compute=sum)
-
-## Descripción
-
-Este parámetro le permite realizar cálculos sobre sus datos.
-
-Si desea realizar un cálculo sobre un atributo, escriba lo siguiente:
-
-`GET /rest/Employee/salary/?$compute=$all`
-
-Si desea pasar un atributo Objeto, debe pasar una de sus propiedades. Por ejemplo:
-
-`GET /rest/Employee/objectAtt.property1/?$compute=$all`
-
-Puede utilizar cualquiera de las siguientes palabras claves:
-
-| Palabras clave | Descripción |
-| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| $all | Un objeto JSON que define todas las funciones del atributo (promedio, recuento, mínimo, máximo y suma para los atributos de tipo Number y count, mínimo y máximo para los atributos de tipo String |
-| average | Obtener la media de un atributo numérico |
-| count | Obtener el número total en la colección o en la clase de datos (en ambos casos hay que especificar un atributo) |
-| min | Obtener el valor mínimo de un atributo numérico o el valor más bajo en un atributo de tipo String |
-| max | Obtener el valor máximo de un atributo numérico o el valor más alto en un atributo de tipo String |
-| sum | Obtener la suma de un atributo numérico |
-
-## Ejemplo
-
-Si desea obtener todos los cálculos de un atributo de tipo Número, puede escribir:
-
-`GET /rest/Employee/salary/?$compute=$all`
-
-**Response**:
-
-```js
-{
- "salary": {
- "count": 4,
- "sum": 335000,
- "average": 83750,
- "min": 70000,
- "max": 99000
- }
-}
-```
-
-Si desea obtener todos los cálculos de un atributo de tipo String, puede escribir:
-
-`GET /rest/Employee/firstName/?$compute=$all`
-
-**Response**:
-
-```js
-{
- "firstName": {
- "count": 4,
- "min": Anne,
- "max": Victor
- }
-}
-```
-
-Si desea obtener un cálculo con un atributo, escriba lo siguiente:
-
-`GET /rest/Employee/salary/?$compute=sum`
-
-**Response**:
-
-`335000`
-
-Si desea realizar un cálculo con un atributo Objeto, escriba lo siguiente:
-
-`GET /rest/Employee/objectAttribute.property1/?$compute=sum`
-
-Respuesta:
-
-`45`
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$filter.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$filter.md
deleted file mode 100644
index e194ee4d6174f3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$filter.md
+++ /dev/null
@@ -1,100 +0,0 @@
----
-id: filter
-title: $filter
----
-
-Permite consultar los datos de una clase de datos o de un método *(p. ej.*, `$filter="firstName!='' AND salary>30000"`)
-
-## Descripción
-
-Este parámetro le permite definir el filtro para su clase de datos o método.
-
-### Utilizar un filtro simple
-
-Un filtro se compone de los siguientes elementos:
-
-**\{attribute\} {comparator} {value}**
-
-Por ejemplo: `$filter="firstName=john"` donde `firstName` es el **atributo**, `=` es el **comparador** y `john` es el **valor**.
-
-### Utilizar un filtro complejo
-
-Un filtro más complejo se compone de los siguientes elementos, que unen dos consultas:
-
-**\{attribute\} {comparator} {value} {AND/OR/EXCEPT} \{attribute\} {comparator} {value}**
-
-Por ejemplo: `$filter="firstName=john AND salary>20000"` donde `firstName` y `salary` son atributos de la clase de datos Employee.
-
-### Utilizar la propiedad params
-
-También puede utilizar la propiedad params de 4D.
-
-**\{attribute\} {comparator} {placeholder} {AND/OR/EXCEPT} \{attribute\} {comparator} {placeholder}&$params='["{value1}","{value2}"]"'**
-
-Por ejemplo: `$filter="firstName=:1 AND salary>:2"&$params='["john",20000]'` donde firstName y salary son los atributos de la clase de datos Employee.
-
-Para más información sobre cómo consultar datos en 4D, consulte la documentación de [dataClass.query()](../API/DataClassClass.md#query).
-
-> Al insertar comillas (') o comillas dobles ("), debe escaparlas utilizando su código de caracteres:
->
->
Comillas ('): \u0027
->
Comillas dobles ("): \u0022
->
-> Por ejemplo, puede escribir lo siguiente al pasar un valor con comillas cuando utilice la propiedad \*params
-> `http://127.0.0.1:8081/rest/Person/?$filter="lastName=:1"&$params='["O\u0027Reilly"]'`
->
-> Si pasa el valor directamente, puede escribir lo siguiente:
-> `http://127.0.0.1:8081/rest/Person/?$filter="lastName=O'Reilly"`
-
-## Atributo
-
-Si el atributo está en la misma clase de datos, puede pasarlo directamente (*p. ej.*, `firstName`). Sin embargo, si quiere consultar otra clase de datos, debe incluir el nombre del atributo relacional y el nombre del atributo, es decir, la ruta de acceso (*por ejemplo*, nombre.empleador). El nombre del atributo distingue entre mayúsculas y minúsculas (`firstName` no es igual a `FirstName`).
-
-También puede consultar los atributos de tipo Object utilizando la anotación de puntos. Por ejemplo, si tiene un atributo cuyo nombre es "objAttributo" con la siguiente estructura:
-
-```
-{
- prop1: "this is my first property",
- prop2: 9181,
- prop3: ["abc","def","ghi"]
-}
-```
-
-Puede buscar en el objeto escribiendo lo siguiente:
-
-` GET /rest/Person/?filter="objAttribute.prop2 == 9181"`
-
-## Comparador
-
-El comparador debe ser uno de los siguientes valores:
-
-| Comparador | Descripción |
-| --------------------------- | ----------------- |
-| = | igual a |
-| != | diferente de |
-| > | mayor que |
-| > = | mayor o igual que |
-| < | menor que |
-| <= | menor o igual que |
-| begin | comienza con |
-
-## Ejemplos
-
-En el siguiente ejemplo, buscamos a todos los empleados cuyo apellido empieza por "j":
-
-```
- GET /rest/Employee?$filter="lastName begin j"
-```
-
-En este ejemplo, buscamos en la clase de datos Empleado todos los empleados cuyo salario sea superior a 20.000 y que no trabajen para una empresa llamada Acme:
-
-```
- GET /rest/Employee?$filter="salary>20000 AND
- employer.name!=acme"&$orderby="lastName,firstName"
-```
-
-En este ejemplo, buscamos en la clase de datos Person todas las personas cuya propiedad número en el atributo anotherobj de tipo Object es mayor que 50:
-
-```
- GET /rest/Person/?filter="anotherobj.mynum > 50"
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$method.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$method.md
deleted file mode 100644
index 706279be3d9811..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/REST/$method.md
+++ /dev/null
@@ -1,323 +0,0 @@
----
-id: method
-title: $method
----
-
-Este parámetro permite definir la operación a ejecutar con la entidad o selección de entidades devuelta.
-
-## Sintaxis disponible
-
-| Sintaxis | Ejemplo | Descripción |
-| ----------------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
-| [**$method=delete**](#methoddelete) | `POST /Employee?$filter="ID=11"& $method=delete` | Elimina la entidad actual, la colección de entidades o la selección de entidades |
-| [**$method=entityset**](#methodentityset) | `GET /People/?$filter="ID>320"& $method=entityset& $timeout=600` | Crea un conjunto de entidades en la caché de 4D Server basado en la colección de entidades definidas en la solicitud REST |
-| [**$method=release**](#methodrelease) | `GET /Employee/$entityset/?$method=release` | Libera un conjunto de entidades existente almacenado en la caché de 4D Server |
-| [**$method=subentityset**](#methodsubentityset) | `GET /Company(1)/staff?$expand=staff& $method=subentityset& $subOrderby=lastName ASC` | Crea un conjunto de entidades basado en la colección de entidades relativas definidas en la petición REST |
-| [**$method=update**](#methodupdate) | `POST /Person/?$method=update` | Actualiza y/o crea una o varias entidades |
-
-## $method=delete
-
-Elimina la entidad actual, la colección de entidades o la selección de entidad actual (creada vía REST)
-
-### Descripción
-
-Con `$method=delete`, puede eliminar una entidad o una colección de entidades entera. Puede definir la colección de entidades utilizando, por ejemplo, [`$filter`]($filter.md) o especificando una directamente utilizando [`{dataClass\}(\{key\})`](dataClass.md#dataclasskey) *(p.ej.*, /Employee(22)).
-
-También puede eliminar las entidades en un conjunto de entidades, llamando a [`$entityset/\{entitySetID\}`]($entityset.md#entitysetentitysetid).
-
-### Ejemplo
-
-A continuación, puede escribir la siguiente petición REST para eliminar la entidad cuya llave es 22:
-
-`POST /rest/Employee(22)/?$method=delete`
-
-También se puede hacer una petición de información utilizando $filter:
-
-`POST /rest/Employee?$filter="ID=11"&$method=delete`
-
-También puede eliminar un conjunto de entidades utilizando $entityset/\{entitySetID\}:
-
-`POST /rest/Employee/$entityset/73F46BE3A0734EAA9A33CA8B14433570?$method=delete`
-
-Respuesta:
-
-```json
-{
- "ok": true
-}
-```
-
-## $method=entityset
-
-Crea un conjunto de entidades en la caché de 4D Server basado en la colección de entidades definidas en la solicitud REST
-
-### Descripción
-
-Cuando se crea una colección de entidades en REST, también se puede crear un conjunto de entidades que se guardará en la caché de 4D Server. El conjunto de entidades tendrá un número de referencia que puede pasar a `$entityset/\{entitySetID\}` para acceder a él. Por defecto, es válido durante dos horas; sin embargo, puede modificar esa cantidad de tiempo pasando un valor (en segundos) a $timeout.
-
-Si ha utilizado `$savedfilter` y/o `$savedorderby` (junto con `$filter` y/o `$orderby`) cuando creó su conjunto de entidades, puede volver a crearlo con el mismo ID de referencia aunque se haya eliminado de la caché de 4D Server.
-
-### Ejemplo
-
-Para crear un conjunto de entidades, que se guardará en la caché de 4D Server durante dos horas, añada `$method=entityset` al final de su petición REST:
-
-`GET /rest/People/?$filter="ID>320"&$method=entityset`
-
-Puede crear un conjunto de entidades que se almacenará en la caché de 4D Server durante sólo diez minutos pasando un nuevo tiempo de espera a `$timeout`:
-
-`GET /rest/People/?$filter="ID>320"&$method=entityset&$timeout=600`
-
-También puede guardar el filtro y ordenar por, pasando true a `$savedfilter` y `$savedorderby`.
-
-> `$skip` y `$top/$limit` no se tienen en cuenta al guardar un conjunto de entidades.
-
-Después de crear un conjunto de entidades, el primer elemento, `__ENTITYSET`, se añade al objeto devuelto e indica la URI a utilizar para acceder al conjunto de entidades:
-
-```json
-__ENTITYSET: "http://127.0.0.1:8081/rest/Employee/$entityset/9718A30BF61343C796345F3BE5B01CE7"`
-```
-
-## $method=release
-
-Libera un conjunto de entidades existente almacenado en la caché de 4D Server.
-
-### Descripción
-
-Puede liberar un entity set, que creó utilizando [`$method=entityset`](#methodentityset), de la caché del servidor 4D.
-
-### Ejemplo
-
-Muestra un conjunto de entidades existente:
-
-`GET /rest/Employee/$entityset/4C51204DD8184B65AC7D79F09A077F24?$method=release`
-
-#### Respuesta:
-
-Si la petición fue exitosa, se devuelve la siguiente respuesta:
-
-```json
-{
- "ok": true
-}
-Si no se encuentra el conjunto de entidades, se devuelve un error:
-
-{
- "__ERROR": [
- {
- "message": "Error code: 1802\nEntitySet \"4C51204DD8184B65AC7D79F09A077F24\" cannot be found\ncomponent: 'dbmg'\ntask 22, name: 'HTTP connection handler'\n",
- "componentSignature": "dbmg",
- "errCode": 1802
- }
- ]
-}
-```
-
-## $method=subentityset
-
-Crea un conjunto de entidades en la caché de 4D Server basado en la colección de entidades relativas definidas en la petición REST
-
-### Descripción
-
-`$method=subentityset` permite ordenar los datos devueltos por el atributo relacional definido en la petición REST.
-
-Para ordenar los datos, se utiliza la propiedad `$subOrderby`. Para cada atributo, se define el orden como ASC (o asc) para el orden ascendente y DESC (desc) para el orden descendente. Por defecto, los datos se clasifican en orden ascendente.
-
-Si desea especificar varios atributos, puede delimitarlos con una coma, µ, `$subOrderby="lastName desc, firstName asc"`.
-
-### Ejemplo
-
-Si quiere recuperar sólo las entidades relacionadas para una entidad específica, puede hacer la siguiente petición REST donde personal es el atributo de relación en la clase de datos Company vinculada a la clase de datos Employee:
-
-` GET /rest/Company(1)/staff?$expand=staff&$method=subentityset&$subOrderby=lastName ASC`
-
-#### Respuesta:
-
-```json
-{
-
- "__ENTITYSET": "/rest/Employee/$entityset/FF625844008E430B9862E5FD41C741AB",
- "__entityModel": "Employee",
- "__COUNT": 2,
- "__SENT": 2,
- "__FIRST": 0,
- "__ENTITIES": [
- {
- "__KEY": "4",
- "__STAMP": 1,
- "ID": 4,
- "firstName": "Linda",
- "lastName": "Jones",
- "birthday": "1970-10-05T14:23:00Z",
- "employer": {
- "__deferred": {
- "uri": "/rest/Company(1)",
- "__KEY": "1"
- }
- }
- },
- {
- "__KEY": "1",
- "__STAMP": 3,
- "ID": 1,
- "firstName": "John",
- "lastName": "Smith",
- "birthday": "1985-11-01T15:23:00Z",
- "employer": {
- "__deferred": {
- "uri": "/rest/Company(1)",
- "__KEY": "1"
- }
- }
- }
- ]
-
-}
-```
-
-## $method=update
-
-Actualiza y/o crea una o varias entidades
-
-### Descripción
-
-`$method=update` le permite actualizar y/o crear una o más entidades en un solo **POST**. Si se actualiza y/o crea una entidad, se efectúa en un objeto con, para cada propiedad, un atributo y su valor, *por ejemplo* `{ lastName: "Smith" }`. Si actualiza y/o crea varias entidades, debe crear una colección de objetos.
-
-En cualquier caso, debe definir los **POST** datos en el **body** de la petición.
-
-Para actualizar una entidad, debes pasar los parámetros `__KEY` y `__STAMP` en el objeto junto con todos los atributos modificados. Si faltan ambos parámetros, se añadirá una entidad con los valores del objeto que envíe en el cuerpo de su **POST**.
-
-Los triggers se ejecutan inmediatamente al guardar la entidad en el servidor. La respuesta contiene todos los datos tal y como existen en el servidor.
-
-También puede poner estas solicitudes para crear o actualizar entidades en una transacción llamando a `$atomic/$atOnce`. Si se produce algún error durante la validación de los datos, no se guarda ninguna de las entidades. También puede utilizar `$method=validate` para validar las entidades antes de crearlas o actualizarlas.
-
-Si surge un problema al añadir o modificar una entidad, se le devolverá un error con esa información.
-
-:::note
-
-- **Las fechas** deben expresarse en formato JS: YYYY-MM-DDTHH:MM:SSZ (por ejemplo, "2010-10-05T23:00:00Z"). Si ha seleccionado la propiedad Fecha únicamente para su atributo Fecha, se eliminará la zona horaria y la hora (hora, minutos y segundos). En este caso, también puede enviar la fecha en el formato que se le devuelve dd!mm!aaaa (por ejemplo, 05!10!2013).
-- **Booleanos** son true o false.
-- Uploaded files using `$upload` can be applied to an attribute of type Image or BLOB by passing the object returned in the following format `{ "ID": "D507BC03E613487E9B4C2F6A0512FE50"}`
- :::
-
-### Ejemplo
-
-Para actualizar una entidad específica, se utiliza la siguiente URL:
-
-`POST /rest/Person/?$method=update`
-
-**POST data:**
-
-```json
-{
- __KEY: "340",
- __STAMP: 2,
- firstName: "Pete",
- lastName: "Miller"
-}
-```
-
-Los atributos firstName y lastName de la entidad indicada anteriormente se modificarán dejando todos los demás atributos (excepto los calculados basados en estos atributos) sin cambios.
-
-Si quiere crear una entidad, puede enviar, vía POST los atributos utilizando esta URL:
-
-`POST /rest/Person/?$method=update`
-
-**POST data:**
-
-```json
-{
- firstName: "John",
- lastName: "Smith"
-}
-```
-
-También puede crear y actualizar múltiples entidades al mismo tiempo utilizando la misma URL anterior pasando múltiples objetos en un array al POST:
-
-`POST /rest/Person/?$method=update`
-
-**POST data:**
-
-```json
-[{
- "__KEY": "309",
- "__STAMP": 5,
- "ID": "309",
- "firstName": "Penelope",
- "lastName": "Miller"
-}, {
- "firstName": "Ann",
- "lastName": "Jones"
-}]
-```
-
-**Response:**
-
-Cuando añade o modifica una entidad, se devuelve con los atributos modificados. Por ejemplo, si se crea el nuevo empleado anterior, se devolverá lo siguiente:
-
-```json
-{
- "__KEY": "622",
- "__STAMP": 1,
- "uri": "http://127.0.0.1:8081/rest/Employee(622)",
- "__TIMESTAMP": "!!2020-04-03!!",
- "ID": 622,
- "firstName": "John",
- "firstName": "Smith"
-}
-```
-
-Si, por ejemplo, el sello no es correcto, se devuelve el siguiente error:
-
-```json
-{
- "__STATUS": {
- "status": 2,
- "statusText": "Stamp has changed",
- "success": false
- },
- "__KEY": "1",
- "__STAMP": 12,
- "__TIMESTAMP": "!!2020-03-31!!",
- "ID": 1,
- "firstname": "Denise",
- "lastname": "O'Peters",
- "isWoman": true,
- "numberOfKids": 1,
- "addressID": 1,
- "gender": true,
- "imageAtt": {
- "__deferred": {
- "uri": "/rest/Persons(1)/imageAtt?$imageformat=best&$version=12&$expand=imageAtt",
- "image": true
- }
- },
- "extra": {
- "num": 1,
- "alpha": "I am 1"
- },
- "address": {
- "__deferred": {
- "uri": "/rest/Address(1)",
- "__KEY": "1"
- }
- },
- "__ERROR": [
- {
- "message": "Given stamp does not match current one for record# 0 of table Persons",
- "componentSignature": "dbmg",
- "errCode": 1263
- },
- {
- "message": "Cannot save record 0 in table Persons of database remote_dataStore",
- "componentSignature": "dbmg",
- "errCode": 1046
- },
- {
- "message": "The entity# 1 in the \"Persons\" dataclass cannot be saved",
- "componentSignature": "dbmg",
- "errCode": 1517
- }
- ]
-}{}
-
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Users/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Users/overview.md
deleted file mode 100644
index e4be7309079c9a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Users/overview.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-id: overview
-title: Presentación del control de acceso
----
-
-Si diferentes personas utilizan una aplicación, lo que suele ocurrir en la arquitectura cliente-servidor o de interfaces web, es necesario controlar el acceso u ofrecer diferentes funcionalidades según de los usuarios conectados. También es esencial ofrecer la seguridad de los datos sensibles, incluso en las aplicaciones monopuesto.
-
-La estrategia de control de acceso 4D depende de la configuración de su despliegue:
-
-- en las aplicaciones multiusuario, puede confiar en los usuarios y grupos 4D,
-- en aplicaciones monousuario, el acceso de los usuarios se controla a través de la sesión del sistema, utilizando comandos como [`Current system user`](../commands-legacy/current-system-user.md).
-
-> Consulte la documentación [Guía de seguridad de 4D](https://blog.4d.com/4d-security-guide/) para una visión de conjunto de las funciones de seguridad de 4D.
-
-## Control de acceso en las aplicaciones multiusuario
-
-Las aplicaciones multiusuario se despliegan con 4D Server. Incluyen aplicaciones cliente-servidor, web o REST.
-
-En las aplicaciones multiusuario, el control de acceso se realiza a través de [usuarios y grupos 4D](handling_users_groups.md). Puede crear usuarios, asignar contraseñas, crear grupos de acceso con diferentes niveles de privilegios en la aplicación.
-
-Inicie el sistema de control de acceso por contraseña 4D con 4D Server, [ asignando una contraseña al usuario Diseñador](handling_users_groups.md#designer-and-administrator). Cuando se asigna una contraseña al Diseñador, todos los privilegios de acceso entran en vigor. Para conectarse a la aplicación o a un [servidor con acceso protegido](handling_users_groups.md#assigning-group-access), los usuarios remotos deben introducir un nombre de usuario/contraseña. Se puede abrir cualquier parte de la aplicación.
-
-Cuando se asigna una contraseña al Diseñador, todos los privilegios de acceso entran en vigor. Inicie el sistema de control de acceso por contraseña 4D con 4D Server, [ asignando una contraseña al usuario Diseñador](handling_users_groups.md#designer-and-administrator).
-
-Para desactivar el sistema de acceso por contraseña, basta con eliminar la contraseña del Diseñador.
-
-## Control de acceso en las aplicaciones monopuesto
-
-Las aplicaciones monopuesto son aplicaciones de escritorio, desplegadas con 4D o fusionadas con 4D Volume Desktop. En las aplicaciones monopuesto todos los usuarios que abren la aplicación son los [Diseñadores](handling_users_groups.md#designer-and-administrator), tienen todos los privilegios y su nombre es "Diseñador". El control de acceso no se basa en los usuarios y los grupos de 4D, sino en las **sesiones usuario**.
-
-### Identificación del usuario
-
-Para identificar el usuario actual en una aplicación 4D monousuario, puede confiar en el comando [`Current system user`](../commands-legacy/current-system-user.md), que devuelve el usuario que abrió la sesión del sistema. Por lo tanto, la autenticación de los usuarios se delega al sistema operativo.
-
-A continuación, puede permitir o denegar el acceso dentro de su aplicación utilizando un código como:
-
-```4d
-If(Current system user = $user) //puede almacenar los usuarios en una tabla base
- // dar acceso a algunas funcionalidades
-End if
-```
-
-Si desea utilizar el nombre de usuario del sistema en 4D en lugar de "Designer" (por ejemplo, en los archivos de registro), puede llamar al comando [`SET USER ALIAS`](../commands-legacy/set-user-alias.md), por ejemplo:
-
-```4d
-SET USER ALIAS(Current system user)
-```
-
-### Protección del acceso
-
-#### Privilegios
-
-En una máquina compartida por varios usuarios, puede instalar la aplicación 4D en una carpeta y dar privilegios de acceso usuario apropiados a la carpeta a nivel del sistema operativo.
-
-#### Cifrado de datos
-
-Si desea proteger el acceso a los datos de la aplicación, se recomienda [encriptar los datos](MSC/encrypt.md) y proveer la clave de encriptación al usuario o usuarios autorizados.
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/commands/vp-export-to-blob.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/commands/vp-export-to-blob.md
deleted file mode 100644
index 19cd648eadc591..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/commands/vp-export-to-blob.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-id: vp-export-to-blob
-title: VP EXPORT TO BLOB
----
-
-
-
-**VP EXPORT TO BLOB** ( *vpAreaName* : Text ; *paramObj* : Object )
-
-
-
-| Parámetros | Tipo | | Descripción | |
-| ---------- | ------ | -- | -------------------------------------------- | ---------------- |
-| vpAreaName | Text | -> | Nombre de objeto formulario área 4D View Pro | |
-| paramObj | Object | -> | Opciones de exportación | |
-
-## Descripción
-
-El comando `VP EXPORT TO BLOB` exporta el documento *vpAreaName* 4D View Pro en un 4D.Blob de acuerdo a las opciones *paramObj*. El blob exportado está disponible a través de la retrollamada de exportación. Exportar e importar áreas de 4D View Pro como blogs es rápido y eficiente en memoria.
-
-En *paramObj*, puede pasar varias propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ----------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| formula | 4D.Function | (obligatorio) Método de retrollamada que se lanzará cuando la exportación haya finalizado. Ver [Pasar un método de retrollamada (fórmula)](vp-export-document.md#passing-a-callback-method-formula). |
-| includeAutoMergedCells | Boolean | Si se incluyen las celdas combinadas automáticamente al guardar, por defecto=false. |
-| includeBindingSource | Boolean | Si incluir la fuente de vinculación al guardar, por defecto=true. |
-| includeCalcModelCache | Boolean | Si desea incluir los datos adicionales de cálculo. Puede afectar a la velocidad de apertura del archivo, por defecto=false. |
-| includeEmptyRegionCells | Boolean | Si se incluyen celdas vacías (celdas sin datos o sólo con estilo) fuera del rango de datos utilizado, por defecto=true |
-| includeFormulas | Boolean | Si se incluye la fórmula al guardar, por defecto=true. |
-| includeStyles | Boolean | Si se incluye el estilo al guardar, por defecto=true. |
-| includeUnusedNames | Boolean | Si se incluye el nombre personalizado no utilizado al guardar, por defecto=true. |
-| saveAsView | Boolean | Si aplicar la cadena de formato al valor exportado al guardar, por defecto=false. |
-
-Los siguientes parámetros se pueden utilizar en el método de retrollamada:
-
-| Parámetros | | Tipo | Descripción |
-| :--------- | :---------------------------- | :---------------------- | :---------------------------------------------------------------- |
-| param1 | | text | El nombre del objeto 4D View Pro |
-| param2 | | 4D.Blob | El blob exportado |
-| param3 | | object | Referencia al parámetro *paramObj* del comando |
-| param4 | | object | Un objeto devuelto por el método con un mensaje de estado |
-| | .success | boolean | True si exporta con éxito, de lo contrario False. |
-| | .errorCode | integer | Código de error. |
-| | .errorMessage | text | Mensaje de error. |
-
-## Ejemplo
-
-El comando `VP EXPORT TO BLOB` es asíncrono. Debe crear un método de retrollamada (llamado *VPBlobCallback* en nuestro ejemplo) para utilizar los resultados de la exportación.
-
-```4d
-//Exportar el documento VP
-VP EXPORT TO BLOB("ViewProArea"; {formula: Formula(VPBlobCallback)})
-```
-
-```4d
-//Método VPBlobCallback
-#DECLARE($area : Text; $data : 4D.Blob; $parameters : Object; $status : Object)
-var $myEntity : cs.myTableEntity
-
-If ($status.success)
- // Save the document in a table
- $myEntity:=ds.myTable.new()
- $myEntity.blob:=$data
- $myEntity.save()
-End if
-
-```
-
-## Ver también
-
-[VP IMPORT FROM BLOB](vp-import-from-blob.md)
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/configuring.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/configuring.md
deleted file mode 100644
index 2efb39cfb2dba6..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/configuring.md
+++ /dev/null
@@ -1,515 +0,0 @@
----
-id: configuring
-title: Configuración de las áreas de 4D View Pro
----
-
-Las propiedades del área 4D View Pro pueden configurarse utilizando la lista de propiedades. Las propiedades de las hojas de cálculo están disponibles a través del lenguaje.
-
-## Propiedades del área de formulario
-
-Utilizando la lista de propiedades del área, puede configurar las propiedades del objeto [4D View Pro](FormObjects/viewProArea_overview.md#supported-properties) como **Nombre del objeto**, [**Variable o expresión**](#4d-view-pro-form-object-variable), **Apariencia**, **Acción** y **Eventos**.
-
-
-
-### Selección de una interfaz usuario
-
-Puede seleccionar la interfaz a utilizar con sus áreas de formulario 4D View Pro en la **Lista de propiedades**, en **Apariencia**:
-
-
-
-> También puede utilizar las propiedades JSON [`userInterface`](FormObjects/properties_Appearance.md#user-interface) y [`withFormulaBar`](FormObjects/properties_Appearance.md#show-formula-bar)(sólo con la interfaz "barra de herramientas").
-
-Las interfaces permiten realizar modificaciones básicas y manipular los datos. Las modificaciones definidas por el usuario se guardan en el objeto 4D View Pro cuando el usuario guarda el documento.
-
-#### Cinta
-
-
-
-#### Toolbar (Barra de herramientas)
-
-Al habilitar la interfaz de la barra de herramientas se muestra la opción [**Mostrar barra de fórmulas**](FormObjects/properties_Appearance.md#show-formula-bar). Cuando se selecciona, la barra de fórmulas es visible debajo de la interfaz Barra de herramientas.
-
-Con barra de fórmula visible:
-
-
-
-#### Funcionalidades
-
-Tanto la interfaz de la cinta de opciones como la de la barra de herramientas agrupan funciones relacionadas en pestañas:
-
-| Pestaña | Acciones | Interfaz Cinta | Interfaz Barra de herramientas |
-| ----------- | ------------------------------- | :------------: | :----------------------------: |
-| File | Gestión de archivos | X | |
-| Inicio | Apariencia del texto | X | X |
-| Insertar | Añadir elementos | X | X |
-| Fórmulas | Cálculos de fórmulas y librería | X | X |
-| Datos | Gestión de los datos | X | X |
-| Mostrar | Presentación visual | X | X |
-| Propiedades | Presentación de la hoja | X | |
-
-## Eventos formulario
-
-Los siguientes eventos formulario están disponibles en la Lista de propiedades de las áreas 4D View Pro.
-
-Algunos de los eventos son eventos formulario estándar (disponibles para todos los objetos activos) y otros son eventos formulario específicos de 4D View Pro. Algunos eventos de formulario estándar ofrecen información ampliada en el objeto devuelto por el comando [`FORM Event`](../commands/form-event.md) cuando se generan para áreas 4D View Pro. La siguiente tabla indica los eventos estándar y los eventos específicos o los que ofrecen información adicional a las áreas 4D View Pro:
-
-| Evento 4D estándar | Eventos 4D View Pro específicos y extendidos |
-| ----------------------------------------------- | ----------------------------------------------------- |
-| [On Load](../Events/onLoad.md) | [On VP Ready](../Events/onVpReady.md) |
-| [On Getting Focus](../Events/onGettingFocus.md) | [On Clicked](../Events/onClicked.md) |
-| [On Losing Focus](../Events/onLosingFocus.md) | [On Double Clicked](../Events/onDoubleClicked.md) |
-| [On Unload](../Events/onUnload.md) | [On Header Click](../Events/onHeaderClick.md) |
-| | [On After Edit](../Events/onAfterEdit.md) |
-| | [On Selection Change](../Events/onSelectionChange.md) |
-| | [On Column Resize](../Events/onColumnResize.md) |
-| | [On Row Resize](../Events/onRowResize.md) |
-| | [On VP Range Changed](../Events/onVpRangeChanged.md) |
-
-## Opciones hoja
-
-El objeto opciones hoja 4D View Pro le permite controlar varias opciones de sus áreas 4D View Pro. Este objeto es manejado por los siguientes comandos:
-
-- [VP SET SHEET OPTIONS](commands/vp-set-sheet-options.md)
-- [VP Get sheet options](commands/vp-get-sheet-options.md)
-
-### Apariencia de la hoja
-
-| Propiedad | | Tipo | Descripción |
-| -------------------- | ---------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| allowCellOverflow | | boolean | Especifica si los datos pueden desbordarse hacia las celdas vacías adyacentes. |
-| sheetTabColor | | string | Una cadena color utilizada para representar el color de la pestaña de la hoja, como "red", "#FFFF00", "rgb(255,0,0)", "Accent 5", etc. |
-| frozenlineColor | | string | Una cadena color utilizada para representar el color de la línea congelada, como "red", "#FFFF00", "rgb(255,0,0)", "Accent 5", "Acento 5", etc. |
-| clipBoardOptions | | entero largo | La opción portapapeles. Valores disponibles: `vk clipboard paste options all`, `vk clipboard paste options formatting`, `vk clipboard paste options formulas`, `vk clipboard paste options formulas and formatting`, `vk clipboard paste options values`, `vk clipboard paste options values and formatting` |
-| rejilla | | object | Las opciones de la línea de rejilla. |
-| | color | string | Una cadena color utilizada para representar el color de la línea de la cuadrícula, como "red", "#FFFF00", "rgb(255,0,0)", "Accent 5", etc. |
-| | showVerticalGridline | boolean | Especifica si se debe mostrar la línea de la cuadrícula vertical. |
-| | showHorizontalGridline | boolean | Especifica si mostrar o no la línea de rejilla horizontal. |
-| rowHeaderVisible | | boolean | Especifica si el encabezado de la línea es visible. |
-| colHeaderVisible | | boolean | Especifica si el encabezado de la columna es visible. |
-| rowHeaderAutoText | | entero largo | Especifica si el encabezado de la linea muestra letras o números o está en blanco. Valores disponibles: `vk header auto text blank`, `vk header auto text letters`, `vk header auto text numbers` |
-| colHeaderAutoText | | entero largo | Especifica si el encabezado de la columna muestra letras o números o está en blanco. Valores disponibles: `vk header auto text blank`, `vk header auto text letters`, `vk header auto text numbers` |
-| selectionBackColor | | string | El color de fondo de la selección para la hoja. (formato RGBA preferido) |
-| selectionBorderColor | | string | El color del borde de la selección para la hoja. |
-| sheetAreaOffset | | object | Las opciones de sheetAreaOffset. |
-| | left | entero largo | El desplazamiento a la izquierda de la hoja desde la local. |
-| | top | entero largo | El desplazamiento superior de la hoja desde el local. |
-
-> Todas las propiedades son opcionales.
-
-### Protección de la hoja
-
-Para bloquear toda la hoja, basta con poner la propiedad *isProtected* en **true**. A continuación, puede desbloquear las celdas individualmente colocando la propiedad de estilo de celda [bloqueada](#layout).
-
-| Propiedad | | Tipo | Descripción |
-| ----------------- | ------------------------ | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| isProtected | | boolean | Especifica si las celdas de esta hoja que están marcadas como protegidas no se pueden editar. |
-| protectionOptions | | object | Valor que indica los elementos que desea que los usuarios puedan modificar. Si null : el parámetro protectionOptions se reinicia. |
-| | allowSelectLockedCells | boolean | Especifica si el usuario puede seleccionar celdas bloqueadas, opcional. True por defecto. |
-| | allowSelectUnlockedCells | boolean | Indica si el usuario puede seleccionar las celdas no bloqueadas, opcional. True por defecto. |
-| | allowSort | boolean | Especifica si el usuario puede ordenar rangos, opcional. Falso por defecto. |
-| | allowFilter | boolean | Especifica si el usuario puede filtrar rangos, opcional. Falso por defecto. |
-| | allowEditObjects | boolean | Indica si el usuario puede editar los objetos flotantes, opcional. Falso por defecto. |
-| | allowResizeRows | boolean | Indica si el usuario puede redimensionar las líneas, opcional. Falso por defecto. |
-| | allowResizeColumns | boolean | Indica si el usuario puede redimensionar las columnas, opcional. Falso por defecto. |
-| | allowDragInsertRows | boolean | Especifica si el usuario puede realizar la operación de arrastre para insertar líneas, opcional. Falso por defecto. |
-| | allowDragInsertColumns | boolean | Especifica si el usuario puede realizar la operación de arrastre para insertar columnas, opcional. Falso por defecto. |
-| | allowInsertRows | boolean | Indica si el usuario puede insertar las líneas, opcional. Falso por defecto. |
-| | allowInsertColumns | boolean | Indica si el usuario puede insertar las columnas, opcional. Falso por defecto. |
-| | allowDeleteRows | boolean | Indica si el usuario puede eliminar las líneas, opcional. Falso por defecto. |
-| | allowDeleteColumns | boolean | Indica si el usuario puede eliminar las columnas, opcional. Falso por defecto. |
-
-> Todas las propiedades son opcionales.
-
-## Formato de las celdas
-
-La definición de un modelo de formato garantiza que el contenido de sus documentos 4D View Pro se muestre de la forma que usted desea. Los formatos se pueden configurar utilizando la [interfaz](#selecting-a-user-interface) seleccionada de 4D View Pro, o utilizando los comandos [VP SET VALUE](commands/vp-set-value.md) o [VP SET NUM VALUE](commands/vp-set-num-value.md).
-
-4D View Pro tiene formatos integrados para números, fechas, horas y texto, pero también puede crear sus propios modelos para dar formato al contenido de las celdas utilizando caracteres y códigos especiales.
-
-Por ejemplo, al usar los comandos [VP SET VALUE](commands/vp-set-value.md) o [VP SET NUM VALUE](commands/vp-set-num-value.md) para introducir cantidades en una factura, puede que desee utilizar los símbolos de moneda ($, €, ¥, etc.) alinearse independientemente del espacio requerido por el número (es decir, si el importe es de 5,00 $ o de 5.000,00 $). Podría utilizar caracteres de formato y espectificar el patrón *($\* #,##0.00*) que mostraría los importes como se muestra:
-
-
-
-Tenga en cuenta que al crear sus propios formatos, sólo se modifica la visualización de los datos. El valor de los datos permanece sin cambios.
-
-### Formatos numérico y texto
-
-Los formatos numéricos se aplican a todos los tipos de números (por ejemplo, positivos, negativos y ceros).
-
-| Caracter | Descripción | Ejemplo |
-| ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| 0 | Marcador de posición que muestra ceros. | #.00 mostrará 1.1 como 1.10 |
-| . | Muestra un punto decimal | 0.00 mostrará 1999 como 1999.00 |
-| , | Muestra el separador de miles en un número. Los miles se separan por comas si el formato contiene una coma encerrada por signos de número "#" o por ceros. Una coma a continuación de un marcador de posición de dígitos escala el número por 1.000. | #,0 mostrará 12200000 como 12,200,000 |
-| \_ | Salta el ancho del siguiente caracter. | Suele utilizarse en combinación con paréntesis para añadir sangrías a izquierda y derecha, \_( y _) respectivamente. |
-| @ | Formateador de texto. Aplica el formato a todo el texto de la celda | "\[Red]@" aplica el color de fuente rojo para los valores de texto. |
-| \* | Repite el siguiente caracter para llenar el ancho de la columna. | 0\*- incluirá suficientes guiones después de un número para llenar la celda, mientras que \*0 antes de cualquier formato incluirá ceros a la izquierda. |
-| " " | Muestra el texto entre comillas sin interpretarlo. | "8%" será mostrado como: 8% |
-| % | Muestra los números como un porcentaje de 100. | 8% se mostrará como 0,08 |
-| \# | Marcador de posición de dígitos que no muestra ceros adicionales. Si un número tiene más dígitos a la derecha del decimal que marcadores de posición, el número se redondea. | #.# mostrará 1.54 como 1.5 |
-| ? | Marcador de posición de dígitos que deja espacio para ceros adicionales, pero no los muestra. Normalmente se utiliza para alinear números por punto decimal. | $?? $?? $?? displays a maximum of 2 decimals and causes dollar signs to line up for varying amounts. |
-| \ | Muestra el caracter que lo sigue. | #.00\? #.00\? #.00\? will display 123 as 123.00? |
-| / | Cuando se utiliza con números, los muestra como fracciones. Cuando se utiliza con códigos de texto, fecha u hora, se muestra "tal cual". | #/# mostrará .75 como 3/4 |
-| \[ ] | Crea formatos condicionales. | \[>100]\[GREEN]#,##0;\[`<=-100`]\[YELLOW]#,##0;\[BLUE]#,##0 |
-| E | Formato notación científica. | #E+# - mostrará 2E+6 en lugar de 1,500,500 |
-| \[color] | Formatea el texto o el número en el color especificado | \[Green]###.##\[Red]-###.### |
-
-#### Ejemplo
-
-```4d
-//Definir el valor de la celda como $125,571.35
-VP SET VALUE(VP Cell("ViewProArea";3;2);New object("value";125571.35;"format";"_($* #,##0.00_)")
-```
-
-### Formatos fecha y hora
-
-4D View Pro ofrece las siguientes constantes para los modelos de fecha y hora ISO 8601:
-
-| Constante | Valor | Comentario |
-| ----------------------------------------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `vk pattern full date time` | "*fullDateTimePattern*" | ISO 8601 format for the full date and time in current localization. USA default pattern: "dddd, dd MMMM yyyy HH:mm:ss" |
-| `vk pattern long date` | "*longDatePattern*" | ISO 8601 format for the full date in current localization. USA default pattern: "dddd, dd MMMM yyyy" |
-| `vk pattern long time` | "*longTimePattern*" | ISO 8601 format for the time in current localization. USA default pattern: "HH:mm:ss" |
-| `vk pattern month day` | "*monthDayPattern*" | ISO 8601 format for the month and day in current localization. USA default pattern: "MMMM dd" |
-| `vk pattern short date` | "*shortDatePattern*" | Abbreviated ISO 8601 format for the date in current localization. USA default pattern: "MM/dd/yyyy" |
-| `vk pattern short time` | "*shortTimePattern*" | Abbreviated ISO 8601 format for the time in current localization. USA default pattern: "HH:mm" |
-| `vk pattern sortable date time` | "*sortableDateTimePattern*" | ISO 8601 format for the date and time in current localization which can be sorted. USA default pattern: "yyyy\'-\'MM\'-\'dd\'T\'HH\':\'mm\':\'ss" |
-| `vk pattern universal sortable date time` | "*universalSortableDateTimePattern*" | ISO 8601 format for the date and time in current localization using UTC which can be sorted. USA default pattern: "yyyy\'-\'MM\'-\'dd HH\':\'mm\':\'ss\'Z\'" |
-| `vk pattern year month` | "*yearMonthPattern*" | ISO 8601 format for the month and year in current localization. USA default pattern: "yyyy MMMM" |
-
-#### Ejemplo
-
-```4d
-//Definir el valor de la celda como fecha y hora específicas
-VP SET VALUE(VP Cell("ViewProArea";3;9);New object("value";!2024-12-18!);"time";?14:30:10?;"format";vk pattern full date time))
-```
-
-### Formato fecha y hora personalizados
-
-Para crear sus propios patrones de fecha y hora, en su localización actual, puede utilizar combinaciones de los siguientes códigos:
-
-| | Code (no distingue entre mayúsculas y minúsculas) | Descripción | Ejemplo |
-| ----- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |
-| Fecha | | | (January 1, 2019) |
-| | m | Número de mes sin cero inicial | 1 |
-| | mm | Número de mes con cero precedente | 01 |
-| | mmm | Nombre del mes, corto | Jan |
-| | mmmm | Nombre del mes, long | January |
-| | d | Número del día sin el cero inicial | 1 |
-| | dd | Número de días con cero precedente | 01 |
-| | ddd | Día de la semana, corto | Tue |
-| | dddd | Día de la semana, largo | Tuesday |
-| | yy | Año, formato corto | 19 |
-| | yyyy | Año, formato largo | 2019 |
-| Time | | | (2:03:05 PM) |
-| | h | Hora sin cero precedente. 0-23 | 2 |
-| | hh | Hora con cero precedente. 00-23 | 02 |
-| | m | Minutos sin cero inicial. 0-59 | 3 |
-| | mm | Minutos con cero precedente. 00-59 | 03 |
-| | s | Segundos sin cero a la izquierda. 0-59 | 5 |
-| | ss | Segundo con cero precedente. 00-59 | 05 |
-| | \[h] | Tiempo transcurrido en horas | 14 (puede superar 24) |
-| | \[mm] | Tiempo transcurrido en minutos | 843 |
-| | \[ss] | Tiempo transcurrido en segundos | 50585 |
-| | AM/PM | Periodos del día. Se utiliza el fomato de 24 horas si se omite. | PM |
-
-> El código "m" se interpreta en función de su posición en el patrón. Si está inmediatamente después de 'h' o 'hh' o inmediatamente antes de 's' o 'ss', se interpretará como minutos, de lo contrario se interpretará como meses.
-
-### Símbolos adicionales
-
-Además de los caracteres y códigos especiales descritos en las secciones anteriores, existen caracteres y símbolos adicionales que pueden utilizarse en sus patrones de formato. Estos caracteres y símbolos adicionales no requieren un \ o "" y no afectan a la interpretación del patrón de formato. Aparecen "tal cual" dentro del patrón.
-
-| Caracter | Descripción | Ejemplo |
-| ---------------------- | --------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
-| + y - | Signos más y menos | ### + ### = ###,##\# |
-| ( ) | Paréntesis izquierdo y derecho | (-###.##) |
-| : | Dos puntos | hh:mm:ss |
-| ^ | Circunflejo | #\^# |
-| ' | Apostrofe | '###### |
-| { } | Paréntesis curvos | {###,###,###} |
-| `< >` | Signos menor que y mayor que | `## >##` |
-| = | Signo igual | #+#=## |
-| / | Barra inclinada hacia adelante. Cuando se utiliza con números, los muestra como fracciones. | mm/dd/yyyy |
-| ! | Signo de exclamación | $###.00! |
-| & | Ampersand | "Hello" & "Welcome" |
-| ~ | Tilde | ~## |
-| | Caracter de espacio | |
-| € | Euro | €###.00 |
-| £ | Libra esterlina | £###.00 |
-| ¥ | Yen japonés | ¥###.00 |
-| $ | Signo dólar | $###.00 |
-| ¢ | Signo de centavo | .00¢ |
-
-## Atributos de impresión
-
-Los atributos de impresión de 4D View Pro le permiten controlar todos los aspectos de la impresión de las áreas de 4D View Pro. Estos atributos son manejados por los siguientes comandos:
-
-- [VP SET PRINT INFO](commands/vp-set-print-info.md)
-- [VP Get print info](commands/vp-get-print-info.md)
-
-### Columnas / Líneas
-
-Los atributos de columna y línea se utilizan para especificar el inicio, el final y la repetición de columnas y líneas.
-
-| Propiedad | Tipo | Descripción |
-| ----------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| columnEnd | entero largo | The last row to print in a cell range. Default value = -1 (all rows) |
-| columnStart | entero largo | The first row to print in a cell range. Default value = -1 (all rows) |
-| repeatColumnEnd | entero largo | La última columna de un rango de columnas a imprimir a la izquierda de cada página. Default value = -1 (all rows) |
-| repeatColumnStart | entero largo | La primera columna de un rango de columnas a imprimir a la izquierda de cada página. Default value = -1 (all rows) |
-| repeatRowEnd | entero largo | La última línea de un rango de líneas a imprimir en la parte superior de cada página. Valor por defecto = -1 (todas las líneas) |
-| repeatRowStart | entero largo | La primera línea de un rango de líneas a imprimir en la parte superior de cada página. Valor por defecto = -1 (todas las líneas) |
-| rowEnd | entero largo | The last column to print in a cell range. Valor por defecto = -1 (todas las líneas) |
-| rowStart | entero largo | La primera línea a imprimir en un rango de celdas. Valor por defecto = -1 (todas las líneas) |
-
-### Encabezados / Pies de página
-
-Los atributos de encabezado y pie de página se utilizan para especificar texto o imágenes en las secciones de encabezado/pie de página izquierda, derecha y central.
-
-| Propiedad | Tipo | Descripción |
-| ----------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------ |
-| footerCenter | text | El texto y el formato del pie de página central en las páginas impresas. |
-| footerCenterImage | picture | text\* | La imagen para la sección central del pie de página. |
-| footerLeft | text | El texto y el formato del pie de página izquierdo en las páginas impresas. |
-| footerLeftImage | picture | text\* | La imagen de la parte izquierda del pie de página. |
-| footerRight | text | El texto y el formato del pie de página derecho en las páginas impresas. |
-| footerRightImage | picture | text\* | La imagen de la parte derecha del pie de página. |
-| headerCenter | text | El texto y el formato del encabezado central en las páginas impresas. |
-| headerCenterImage | picture | text\* | La imagen para la sección central del encabezado. |
-| headerLeft | text | El texto y el formato del encabezado izquierdo en las páginas impresas. |
-| headerLeftImage | picture | text\* | La imagen de la sección izquierda del encabezado. |
-| headerRight | text | El texto y el formato del encabezado derecho en las páginas impresas. |
-| headerRightImage | picture | text\* | La imagen de la sección derecha del encabezado. |
-
-\* Si utiliza el tipo texto, pase la ruta de archivo (absoluta o relativa) de la imagen. Si pasa una ruta relativa, el archivo debe estar situado junto al archivo de estructura de la base de datos. En Windows, la extensión del archivo debe ser indicada. No importa el tipo utilizado para establecer una imagen, la imagen en sí (no una referencia) se almacena en el área de 4D View Pro y es devuelta por [VP Get print info](commands/vp-get-print-info.md).
-
-### Caracteres especiales
-
-Los siguientes caracteres especiales permiten añadir o dar formato automáticamente a la información del encabezado y pie de página cuando se imprime el área de 4D View Pro.
-
-| Caracter | Descripción | Ejemplo | Resultado | |
-| --------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | - |
-| & | Caracter de escape | (ver ejemplos más abajo) | | |
-| P | Página actual | printInfo.headerLeft:="Esta es la página &P." | Esta es la página 5. | |
-| N | Conteo de páginas | printInfo.headerLeft:="Hay &N páginas." | Hay 10 páginas. | |
-| D | Fecha actual (formato yyyy/mm/dd) | printInfo.headerLeft:="Es &D." | Es 2015/6/19. | |
-| T | Hora actual | printInfo.headerLeft:="Es &T." | Es 16:30:36. | |
-| G | Imagen | printInfo.headerLeftImage:=smiley printInfo.headerLeft:="&G" |  | |
-| S | Disposición | printInfo.headerLeft:="&SEsto es texto." | ~~Esto es texto.~~ | |
-| U | Subrayado | printInfo.headerLeft:="&UEsto es texto." | Esto es texto. (Subrayado) | |
-| B | Negrita | printInfo.headerLeft:="&BEsto es texto." | **Esto es texto.** | |
-| I | Itálica | printInfo.headerLeft:="&IEsto es texto." | *Esto es texto.* | |
-| " | Prefijo fuente | printInfo.headerLeft:="&\"Lucida Console\"&14This is text." |  | |
-| K | Prefijo de color de texto | printInfo.headerLeft:="&KFF0000Esto es texto." | Esto es texto (en rojo). | |
-| F | Nombre del libro | printInfo.headerLeft:="&F" | 2019 Monthly Revenue Forecasts | |
-| A | Nombre de la hoja de cálculo | printInfo.headerLeft:="&A" | June 2019 revenue forecast | |
-
-### Márgenes
-
-Los atributos margen se utilizan para especificar los márgenes del área 4D View Pro para la impresión. Expresado en centésimas de pulgada.
-
-| Propiedad | | Tipo | Descripción |
-| --------- | ------ | ------------ | -------------------------------------------------------------------------------------------- |
-| margin | | object | Los márgenes de impresión |
-| | top | entero largo | Margen superior, en centésimas de pulgada. Por defecto = 75 |
-| | bottom | entero largo | El margen inferior, en centésimas del pulgada. Por defecto = 75 |
-| | left | entero largo | Margen derecho, en centésimas de pulgada. Por defecto = 70 |
-| | right | entero largo | Margen derecho, en centésimas de pulgada. Por defecto = 70 |
-| | header | entero largo | Desplazamiento del encabezado, en centésimas de pulgada. Por defecto = 30 |
-| | footer | entero largo | Desplazamiento del pie de página, en centésimas de pulgada. Por defecto = 30 |
-
-### Orientación
-
-Los atributos de orientación se utilizan para especificar la dirección del diseño de la página impresa.
-
-> Este atributo define sólo la información de renderizado.
-
-| Propiedad | Tipo | Descripción |
-| ----------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| orientation | entero largo | Orientación de la página. Valores disponibles: `vk print page orientation landscape`, `vk print page orientation portrait` (por defecto) |
-
-### Página
-
-Los atributos página se utilizan para especificar la configuración general de impresión del documento.
-
-| Propiedad | Tipo | Descripción |
-| --------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| blackAndWhite | boolean | Impresión sólo en blanco y negro.
Valor por defecto = false
**Nota**: este atributo no afecta a los archivos PDF. Se mantienen los colores en los PDF.
|
-| centering | entero largo | Como se centran los contenidos en la página impresa. Valores disponibles: `vk print centering both`, `vk print centering horizontal`, `vk print centering none` (por defecto), `vk print centering vertical` |
-| firstPageNumber | entero largo | El número de página a imprimir en la primera página. Valor por defecto = 1 |
-| pageOrder | entero largo | Las páginas del pedido se imprimen. Valores disponibles: `vk print page order auto` (por defecto), `vk print page order down then over`, `vk print page order over then down`. |
-| pageRange | text | El rango de páginas a imprimir |
-| qualityFactor | entero largo | El factor de calidad para la impresión (1 - 8). Cuanto mayor sea el factor de calidad, mejor será la calidad de impresión, sin embargo, el rendimiento de impresión puede verse afectado.
Valor por defecto = 2
|
-| useMax | boolean | Sólo se imprimen columnas y líneas con datos.
Valor predeterminado = true
|
-| zoomFactor | real | La cantidad para ampliar o reducir la página impresa.
Valor predeterminado = 1
|
-
-### Tamaño del papel
-
-Los atributos de tamaño de papel se utilizan para especificar las dimensiones o el modelo de papel que se utilizará para la impresión. Hay dos maneras de definir el tamaño del papel:
-
-- Tamaño personalizado - atributos de alto y ancho
-- Tamaño estándar - atributo kind
-
-| Propiedad | | Tipo | Descripción |
-| --------- | ------ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| paperSize | | object | Dimensiones del papel (alto, ancho) o formato específico (tipo) para la impresión. |
-| | height | entero largo | La altura del papel, en centésimas del pulgada. |
-| | ancho | entero largo | Ancho del papel, en centésimas de pulgada. |
-| | kind | text | Nombre del tamaño de papel estándar (por ejemplo, A2, A4, oficio, etc.) devuelto por `Get Print Option`. Valor por defecto: "letter" |
-
-- Si el tamaño del papel se especifica utilizando las propiedades `height` y `width`, [`VP Get print info`](./commands/vp-get-print-info.md) devuelve un tamaño de papel con `custom` como valor para `kind`.
-
-- Si establece el tamaño del papel mediante la propiedad `kind`, puede utilizar cualquiera de los dos:
- - uno de los formatos de la [lista de formatos SpreadJS](https://developer.mescius.com/spreadjs/api/enums/GC.Spread.Sheets.Print.PaperKind)
- - uno de los formatos devueltos por el comando [`PRINT OPTION VALUES`](../commands-legacy/print-option-values.md).
- En ese caso, [`VP Get print info`](./commands/vp-get-print-info.md) devuelve el formato correspondiente con la altura y el ancho.
-
-### Escala
-
-El atributo de escala se utiliza para la optimización y el ajuste de la impresión.
-
-| Propiedad | Tipo | Descripción |
-| -------------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| bestFitColumns | boolean | El ancho de la columna se ajusta para adaptarse al ancho del texto más grande para la impresión. Valor por defecto: "false" |
-| bestFitRows | boolean | La altura de la línea se ajusta a la altura del texto más alto para la impresión. Valor por defecto: "false" |
-| fitPagesTall | entero largo | El número de páginas horizontales (orientación horizontal) a comprobar cuando se optimiza la impresión. Por defecto = -1 |
-| fitPagesWide | entero largo | El número de páginas verticales (orientación vertical) que hay que comprobar al optimizar la impresión. Por defecto = -1 |
-
-### Mostrar / Ocultar
-
-Los atributos Mostrar / Ocultar se utilizan para especificar la visibilidad (impresión) de los elementos de área 4D View Pro.
-
-| Propiedad | Tipo | Descripción |
-| ---------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| showBorder | boolean | Imprime las líneas de la cuadrícula. Valor por defecto: "false" |
-| showColumnHeader | entero largo | Parámetros de impresión del encabezado de la columna. Valores disponibles: `vk print visibility hide`, `vk print visibility inherit` (por defecto), `vk print visibility show`, `vk print visibility show once` |
-| showGridLine | boolean | Prints the outline border. Valor por defecto: "false" |
-| showRowHeader | entero largo | Parámetros de impresión de los encabezados de línea. Valores disponibles: `vk print visibility hide`, `vk print visibility inherit` (por defecto), `vk print visibility show`, `vk print visibility show once` |
-
-### Marca de agua
-
-Los atributos de marca de agua se utilizan para superponer texto o una imagen en el área de 4D View Pro.
-
-| Propiedad | | Tipo | Descripción |
-| ------------- | ---------------------------------------------------------------------------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| marca de agua | | collection | Colección de parámetros de marcas de agua. Valor por defecto: indefinido |
-| | \[ ].height | entero largo | La altura del texto/imagen de la marca de agua. |
-| | \[ ].imageSrc | picture | text\* | El texto/imagen de la marca de agua. |
-| | \[ ].page | text | La(s) página(s) donde se imprime la marca de agua. Para todas las páginas: "all". Para páginas específicas: números de página o rangos de páginas separados por comas. Ej.: "1,3,5-12" |
-| | \[ ].width | entero largo | El ancho del texto/imagen marca de agua. |
-| | \[ ].x | entero largo | La coordenada horizontal del punto superior izquierdo del texto / imagen de la marca de agua. |
-| | \[ ].y | entero largo | La coordenada vertical del punto superior izquierdo del texto/imagen de la marca de agua. |
-
-\* Si utiliza el tipo texto, pase la ruta de archivo (absoluta o relativa) de la imagen. Si pasa una ruta relativa, el archivo debe estar situado junto al archivo de estructura de la base de datos. En Windows, la extensión del archivo debe ser indicada. No importa el tipo utilizado para establecer una imagen, la imagen en sí (no una referencia) se almacena en el área de 4D View Pro y es devuelta por [VP Get print info](commands/vp-get-print-info.md).
-
-## Style Objects {#style-objects}
-
-Los objetos de estilo y las hojas de estilo de 4D View Pro le permiten controlar los aspectos gráficos y el aspecto de sus documentos 4D View Pro.
-
-### Objetos de estilo & Hojas de estilo
-
-Los objetos Estilo contienen parámetros de estilo. Se pueden utilizar en una hoja de estilo o por su cuenta. Los objetos Estilo también pueden utilizarse además de una hoja de estilo, de modo que puedan definirse diferentes parámetros para rangos de celdas individuales sin que ello afecte al resto del documento. Puede utilizar objetos de estilo directamente con los comandos [VP SET CELL STYLE](comandos/vp-set-cell-style.md) y [VP SET DEFAULT STYLE](comandos/vp-set-default-style.md). También puede utilizar objetos de estilo al definir temas personalizados de tabla usando los comandos [VP SET TABLE THEME](commands/vp-set-table-theme.md) o [VP CREATE TABLE](commands/vp-create-table.md).
-
-Una **hoja de estilo** agrupa una combinación de propiedades en un objeto estilo para especificar el aspecto de todas las celdas de sus documentos 4D View Pro. Las hojas de estilo guardadas con el documento pueden utilizarse para definir las propiedades de una sola hoja, de varias hojas o de todo un libro de trabajo. Cuando se crea, una hoja de estilo 4D View Pro recibe un nombre que se guarda dentro de la hoja de estilo en la propiedad "name". Esto permite utilizar fácilmente una hoja de estilo y si se selecciona cuidadosamente, puede facilitar su identificación y finalidad (por ejemplo, Membrete_interno, Membrete_externo).
-
-Las hojas de estilo se crean con el comando [VP ADD STYLESHEET](commands/vp-add-stylesheet.md) y se aplican con los comandos [VP SET DEFAULT STYLE](commands/vp-set-default-style.md) o [VP SET CELL STYLE](commands/vp-set-cell-style.md). Puede eliminar una hoja de estilo con el comando [VP REMOVE STYLESHEET](commands/vp-remove-stylesheet.md).
-
-El comando [VP Get stylesheet](commands/vp-get-stylesheet.md) se puede utilizar para devolver el objeto de estilo de una única hoja de estilo o se puede utilizar el comando [VP Get stylesheets](commands/vp-get-stylesheets.md) para recuperar una colección de objetos de estilo de múltiples hojas de estilo.
-
-### Propiedades del objeto de estilo
-
-Ejemplo:
-
-```4d
- $style:=New object
- $style.hAlign:=vk horizontal align left
- $style.font:="12pt papyrus"
- $style.backColor:="#E6E6FA" //color morado claro
-
- VP SET DEFAULT STYLE("myDoc";$style)
-```
-
-#### Fondo & Primer plano
-
-| Propiedad | Tipo | Descripción | Valores posibles |
-| --------------------- | ------------- | --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| backColor | text | Define el color del fondo. | Sintaxis de color CSS "#rrggbb" (sintaxis preferida), sintaxis de color CSS "rgb(r,g,b)" (sintaxis alternativa), nombre de color CSS (sintaxis alternativa) |
-| backgroundImage | picture, text | Especifica una imagen de fondo. | Puede especificarse directamente o a través de la ruta de la imagen (sólo ruta completa o nombre de archivo). Si sólo se utiliza el nombre del archivo, éste debe estar situado junto al archivo de estructura de la base. Independientemente de la configuración (imagen o texto), la imagen se guarda con el documento. Esto podría afectar al tamaño de un documento si la imagen es grande. Nota para Windows: la extensión del archivo incluirse. |
-| backgroundImageLayout | entero largo | Define el diseño para la imagen de fondo. | `vk image layout center`, `vk image layout none`, `vk image layout stretch`, `vk image layout zoom` |
-| foreColor | text | Define el color del primer plano. | Sintaxis de color CSS "#rrggbb" (sintaxis preferida), sintaxis de color CSS "rgb(r,g,b)" (sintaxis alternativa), nombre de color CSS (sintaxis alternativa) |
-
-#### Bordes
-
-| Propiedad | | Tipo | Descripción | Valores posibles |
-| -------------------------------------------------------------------------- | ----- | ------------ | -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| borderBottom, borderLeft, borderRight, borderTop, diagonalDown, diagonalUp | | object | Define la línea de borde correspondiente | |
-| | color | text | Define el color del borde. Por defecto = black. | Sintaxis de color CSS "#rrggbb" (sintaxis preferida), sintaxis de color CSS "rgb(r,g,b)" (sintaxis alternativa), nombre de color CSS (sintaxis alternativa) |
-| | style | entero largo | Define el estilo del borde. Por defecto = empty. No puede ser null o indefinido. | `vk line style dash dot`, `vk line style dash dot dot`, `vk line style dashed`, `vk line style dotted`, `vk line style double`, `vk line style empty`, `vk line style hair`, `vk line style medium`, `vk line style medium dash dot`, `vk line style medium dash dot dot`,`vk line style medium dashed`, `vk line style slanted dash dot`, `vk line style thick` |
-
-#### Fuentes y texto
-
-| Propiedad | | Tipo | Descripción | Valores posibles |
-| --------------- | ---------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| font | | text | Especifica las características de la fuente en la abreviatura de fuentes CSS ("font-style font-variant font-weight font-size/line-height font-family"). Ejemplo: "14pt Century Gothic". Los valores font-size y font-family son obligatorios. Si falta alguno de los otros valores, se utilizan sus valores por defecto. Nota: si un nombre de fuente contiene un espacio, el nombre debe ir entre comillas. | Una abreviatura de fuente CSS. 4D ofrece comandos utilitarios para manejar características de fuentes como objetos: [`VP Font to object`](commands/vp-font-to-object.md) y [`VP Object to font`](commands/vp-object-to-font.md) |
-| formatter | | text | Patrón de propiedad valor/tiempo. | Formatos número/texto/fecha/hora, caracteres especiales. Ver [Formato de celda](#cell-format). |
-| isVerticalText | | boolean | Especifica la dirección del texto. | True = texto vertical, False = texto horizontal. |
-| labelOptions | | object | Define las opciones de etiqueta de celda (opciones de marca de agua). | |
-| | alignement | entero largo | Especifica la posición de la etiqueta de la celda. Propiedad opcional. | `vk label alignment top left`, `vk label alignment bottom left`, `vk label alignment top center`, `vk label alignment bottom center`, `vk label alignment top right`, `vk label alignment bottom right` |
-| | visibility | entero largo | Especifica la visibilidad de la etiqueta de la celda. Propiedad opcional. | `vk label visibility auto`, `vk label visibility hidden`, `vk label visibility visible` |
-| | foreColor | text | Define el color del primer plano. Propiedad opcional. | Sintaxis de color CSS "#rrggbb" (sintaxis preferida), sintaxis de color CSS "rgb(r,g,b)" (sintaxis alternativa), nombre de color CSS (sintaxis alternativa) |
-| | font | text | Especifica las características de la fuente con la abreviatura de fuentes CSS ("font-style font-variant font-weight font-size/line-height font-family"). Los valores font-size y font-family son obligatorios. | |
-| textDecoration | | entero largo | Especifica la decoración añadida al texto. | `vk text decoration double underline`, `vk text decoration line through`, `vk text decoration none`, `vk text decoration overline`, `vk text decoration underline` |
-| textIndent | | entero largo | Define la unidad de indentación del texto. 1 = 8 píxeles | |
-| textOrientation | | entero largo | Define el ángulo de rotación del texto en una celda. Número entre -90 y 90 | |
-| marca de agua | | text | Define el contenido de la marca de agua (etiqueta de la celda) | |
-| wordWrap | | boolean | Especifica si el texto debe ser ajustado. | True = texto ajustado, False = texto no ajustado |
-
-#### Disposición
-
-| Propiedad | Tipo | Descripción | Valores posibles |
-| ----------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
-| cellPadding | text | Define el relleno de la celda | |
-| hAlign | entero largo | Define la alineación horizontal del contenido de la celda. | `vk horizontal align center`, `vk horizontal align general`, `vk horizontal align left`, `vk horizontal align right` |
-| locked | boolean | Especifica el estado de protección de la celda. Nota, sólo está disponible si está activada la [protección de hojas](#sheet-protection). | True = bloqueado, False = desbloqueado. |
-| shrinkToFit | boolean | Especifica si el contenido de la celda debe ser reducido. | True = contenido reducido, False = sin reducción. |
-| tabStop | boolean | Especifica si el foco de la celda se puede ajustar utilizando la tecla Tab. | True = La tecla Tab define el foco, False = La tecla Tab no define el foco. |
-| vAlign | entero largo | Especifica la alineación vertical del contenido de la celda. | `vk vertical align bottom`, `vk vertical align center`, `vk vertical align top` |
-
-#### Información de estilo
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| name | text | Define el nombre del estilo |
-| parentName | text | Especifica el estilo en el que se basa el estilo actual. Se aplicarán los valores del estilo padre y, a continuación, se aplicarán los valores del estilo actual. Los cambios realizados en el estilo actual no se reflejarán en el estilo principal. Sólo está disponible cuando se utiliza una hoja de estilo. |
-
-## Objeto 4D View Pro
-
-El [objeto](Concepts/dt_object.md) 4D View Pro almacena todo el contenido de la hoja de cálculo. Es manejado automáticamente por 4D View Pro. Puede definir u obtener este objeto utilizando los comandos [VP IMPORT FROM OBJECT](comandos/vp-import-from-object.md) o [VP Export to object](comandos/vp-export-to-object.md).
-
-Contiene las siguientes propiedades:
-
-| Propiedad | Tipo de valor | Descripción |
-| ------------ | ------------- | ------------------------------------------------------ |
-| version | Integer | Versión del componente interno |
-| dateCreation | Timestamp | Fecha de creación |
-| dateModified | Timestamp | Fecha última modificación |
-| meta | Object | Contenido gratuito, reservado para el desarrollador 4D |
-| spreadJS | Object | Reservado para el componente 4D View Pro |
-
-## Variable de objeto de formulario 4D View Pro
-
-La variable del objeto del formulario 4D View Pro es la variable del objeto asociada al área del formulario 4D View Pro. Gestiona la información utilizada por el objeto 4D View Pro.
-
-> La variable objeto del formulario 4D View Pro sólo tiene fines informativos (es decir, de depuración). Bajo ninguna circunstancia debe modificarse.
-
-Contiene las siguientes propiedades:
-
-| Propiedad | Tipo de valor | Descripción |
-| -------------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| ViewPro.area | Text | Nombre del área 4D View Pro |
-| ViewPro.callbacks | Object | Almacena la información temporal necesaria para los comandos que requieren retrollamadas, como la importación y la exportación. |
-| ViewPro.commandBuffers | Collection | Almacena secuencialmente los comandos llamados por el método y los ejecuta como un lote (en lugar de individualmente) al salir del método, cuando un comando devuelve un valor, o cuando se llama a [VP FLUSH COMMANDS](commands/vp-flush-commands.md). Este mecanismo aumenta el rendimiento al reducir el número de peticiones enviadas. |
-| ViewPro.events | Object | Lista de [eventos](#form-events). |
-| ViewPro.formulaBar | Boolean | Indica si se muestra o no la barra de fórmulas. Disponible sólo para la interfaz de la "barra de herramientas". |
-| ViewPro.inited | Boolean | Indica si el área 4D View Pro ha sido inicializada o no (ver evento[On VP Ready](Events/onVpReady.md)). |
-| ViewPro.interface | Text | Especifica el tipo de interfaz de usuario: "cinta", "barra de herramientas", "ninguna". |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/getting-started.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/getting-started.md
deleted file mode 100644
index 41a1b586494a9d..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ViewPro/getting-started.md
+++ /dev/null
@@ -1,155 +0,0 @@
----
-id: getting-started
-title: Comencemos
----
-
-4D View Pro es un [componente 4D](Concepts/components.md) que incluye un [área de formulario 4D](FormObjects/viewProArea_overview.md) y [comandos](commands.md) específicos. Le permite integrar las funcionalidades avanzadas de hoja de cálculo en sus proyectos.
-
-
-
-Una hoja de cálculo es una aplicación que contiene una cuadrícula de celdas en las que se puede introducir información, ejecutar cálculos o mostrar imágenes. 4D View Pro es alimentado por la [solución de hoja de cálculo SpreadJS](https://developer.mescius.com/spreadjs) integrada en 4D.
-
-La integración de áreas de 4D View Pro en sus formularios le permite importar y exportar documentos de hojas de cálculo utilizando los comandos 4D View Pro.
-
-## Instalación y activación
-
-Las funcionalidades de 4D View Pro se incluyen directamente en 4D, lo que facilita su despliegue y gestión. No se requiere ninguna instalación adicional.
-
-Sin embargo, 4D View Pro requiere una licencia. Es necesario activar esta licencia en su aplicación para poder utilizar sus funcionalidades. Cuando se utiliza este componente sin licencia, el contenido de un objeto que requiere una función de 4D View Pro no se muestra en tiempo de ejecución, sino que se muestra un mensaje de error:
-
-
-
-## Inserción de un área 4D View Pro
-
-Los documentos de 4D View Pro se muestran y editan manualmente en un [objeto de formulario 4D](FormObjects/viewProArea_overview.md) llamado 4D View Pro. Para seleccionar este objeto, haga clic en la última herramienta de la barra de objetos:
-
-
-
-También puede seleccionar un área 4D View Pro preconfigurada en la [librería de objetos](FormEditor/objectLibrary.md).
-
-> Las áreas 4D View Pro también pueden ser [creadas y utilizadas fuera de la pantalla](commands/vp-run-offscreen-area.md).
-
-Puede [configurar el área](configuring.md) utilizando los comandos de la Lista de Propiedades y 4D View Pro.
-
-## Fundamentos de la selección, la entrada y de la navegación
-
-Las hojas de cálculo se componen de líneas y columnas. A cada línea se le asocia un número. A cada columna se le asocia una letra (o grupo de letras una vez que el número de columnas supera el número de letras del alfabeto). La intersección de una línea y de una columna constituye una celda. Las celdas pueden ser seleccionadas y sus contenidos editados.
-
-### Selección de celdas, columnas y líneas
-
-- Para seleccionar una celda, basta con hacer clic en ella o utilizar las flechas de dirección del teclado. Su contenido (o fórmula) se muestra dentro de la celda.
-
-- Para seleccionar varias celdas continuas, arrastre el ratón de un extremo a otro de la selección. También puede hacer clic en los dos extremos de la selección mientras mantiene presionada la tecla Mayús.
-
-- Para seleccionar todas las celdas de la hoja de cálculo, haga clic en la celda situada en la parte superior izquierda del área:
- 
-
-- Para seleccionar una columna, haga clic en la letra (o conjunto de letras) correspondiente.
-
-- Para seleccionar una línea, haga clic en el número correspondiente.
-
-- Para seleccionar un grupo de celdas que no sean continuas, mantenga presionada la tecla **Ctrl** (Windows) o la tecla **Comando** (Mac) y haga clic en cada celda que desee seleccionar.
-
-- Para deseleccionar las celdas, basta con hacer clic en cualquier lugar de la hoja de cálculo.
-
-### Entrada de datos
-
-Hacer doble clic en una celda permite pasar al modo de entrada en la celda correspondiente. Si la celda no está vacía, el cursor de inserción se coloca después del contenido de la celda.
-
-
-
-Los datos pueden introducirse directamente una vez seleccionada una celda, incluso si el cursor de inserción no está visible. La entrada entonces reemplaza el contenido de la celda.
-
-La tecla **Tab** valida la entrada de la celda y selecciona la celda a su derecha. Combinando las teclas **Mayús + Tab** se valida la entrada de la celda y se selecciona la celda a su izquierda.
-
-La tecla **Retorno de carro** valida la entrada de la celda y selecciona la celda de abajo. Combinando las teclas **Mayús + Retorno de carro** se valida la entrada de la celda y se selecciona la celda superior.
-
-Las teclas de dirección (flechas) permiten mover una celda en la dirección indicada por la flecha.
-
-### Utilización del menú contextual
-
-Las áreas 4D View Pro se benefician de un menú contextual automático que ofrece funciones de edición estándar como copiar y pegar, pero también funciones básicas de hoja de cálculo:
-
-
-
-> Las funciones Copiar/Cortar y Pegar del menú contextual sólo funcionan dentro del área de la hoja de cálculo, no tienen acceso al portapapeles del sistema. Sin embargo, los atajos del sistema como **Ctrl+c/Ctrl+v** funcionan y pueden utilizarse para intercambiar datos entre el área y otras aplicaciones.
-
-Dependiendo del área seleccionada, también están disponibles las siguientes opciones:
-
-- haga clic en el encabezado de una columna o línea: **Insertar**, **Borrar**, **Ocultar**, o **Mostrar** el contenido
-- haga clic en una celda o en un rango de celdas:
- - **Filtrar**: permite ocultar la línea mediante filtros (ver "Filtrar las líneas" en la [documentación de SpreadJS](https://developer.mescius.com/spreadjs/docs/)).
- - **Ordenar**: ordena el contenido de la columna.
- - **Insertar comentario**: permite al usuario introducir un comentario para un área. Cuando se ha introducido un comentario para un área, la celda superior izquierda del área muestra un pequeño triángulo rojo:
- 
-
-## Utilizando los comandos de 4D View Pro
-
-Los comandos 4D View Pro se pueden utilizar en el editor de código 4D, al igual que los comandos de lenguaje 4D.
-
-Como 4D View Pro es un componente 4D intregado, puede acceder a su lista de comandos desde el Explorador, en la sección **Métodos componentes**:
-
-
-
-Para obtener una lista detallada, consulte [Comandos](commands.md).
-
-### Abordando un área 4D View Pro
-
-Un área 4D View Pro maneja varios objetos y elementos.
-
-
-
-La mayoría de los comandos de 4D View Pro requieren un parámetro *vpAreaName*, que es el [**nombre del área de formulario 4D View Pro**](FormObjects/viewProArea_overview.md) (objeto de formulario 4D). Este nombre es la propiedad del [nombre del objeto](FormObjects/properties_Object.md#object-name).
-
-Por ejemplo, si quiere definir el número total de columnas de un área llamada "myVpArea", escriba:
-
-```4d
-VP SET COLUMN COUNT("myVpArea";5)
-```
-
-> Cuando se carga un objeto 4D View Pro en un área de formulario, 4D genera el evento formulario [On VP Ready](../Events/onVpReady.md) una vez que se carga toda el área. Debe ejecutar todo código 4D View Pro que maneje el área en este evento, de lo contrario se devuelve un error.
-
-### Utilización de objetos de rango
-
-Algunos comandos 4D View Pro requieren un parámetro *rangeObj*. En 4D View Pro, un rango es un objeto que hace referencia a un área en una hoja de cálculo. Esta área puede estar compuesta de una o varias celdas. Utilizando los comandos 4D View Pro, puede crear rangos y pasarlos a otros comandos para leer o escribir en lugares específicos de su documento.
-
-Por ejemplo, para crear un objeto rango para las siguientes celdas:
-
-
-
-Puede utilizar el método [VP Cell](commands/vp-cells.md):
-
-```4d
-var $myRange : Object
-$myRange:=VP Cells("ViewProArea";2;4;2;3) // C5 a D7
-```
-
-Luego, puede pasar `$myRange` a otro método 4D View Pro para modificar estas celdas (por ejemplo añadir un borde al conjunto de celdas con [VP SET BORDER](commands/vp-set-border.md)).
-
-Los objetos rango 4D View Pro se componen de varias propiedades:
-
-- area - El nombre del área 4D View Pro
-- rangos - Una colección de objeto(s) rango. Las propiedades disponibles en cada objeto de rango dependen del tipo de objeto rango. Por ejemplo, un objeto rango de tipo columna sólo incluirá las propiedades *.column* y *.sheet*.
-
-| Propiedad | | Tipo | Descripción | Disponible para |
-| --------- | ------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- |
-| area | | text | Nombre de objeto formulario área 4D View Pro | siempre disponible |
-| ranges | | collection | Colección de rangos | siempre disponible |
-| | \[ ].name | text | Nombre de rango | name |
-| | \[ ].sheet | number | Índice de la hoja (por defecto, índice de la hoja actual) (el conteo comienza en 0) | celda, celdas, línea, líneas, columna, columnas, todos, nombre |
-| | \[ ].row | number | Índice de la línea (el conteo comienza en 0) | celda, celdas, línea, líneas |
-| | \[ ].rowCount | number | Número de líneas | celdas, líneas |
-| | \[ ].column | number | Índice de la columna (el conteo comienza en 0) | celda, celdas, columna, columnas |
-| | \[ ].columnCount | number | Conteo de columnas | celdas, columnas |
-
-## Importar y exportar documentos
-
-4D View Pro soporta la importación y exportación de varios formatos de documentos:
-
-- .4vp
-- .xlsx
-- .txt y .csv
-- .sjs
-- .pdf (sólo para exportación)
-
-Para más detalles, consulte la descripción de [VP IMPORT DOCUMENT](commands/vp-import-document.md) y [VP EXPORT DOCUMENT](commands/vp-export-document.md).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/authentication.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/authentication.md
deleted file mode 100644
index 526b9eeb780278..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/authentication.md
+++ /dev/null
@@ -1,195 +0,0 @@
----
-id: authentication
-title: Autenticación
----
-
-La autentificación de los usuarios es necesaria cuando se desea ofrecer derechos de acceso específicos a los usuarios Web. La autenticación designa el modo en que se recoge y procesa la información relativa a las credenciales del usuario (normalmente nombre y contraseña).
-
-## Modos de autenticación
-
-El servidor web 4D ofrece tres modos de autenticación, que puede seleccionar en la página **Web**/**Opciones (I)** de la ventana Propiedades:
-
-
-
-> Se recomienda utilizar una autenticación **personalizada**.
-
-### Generalidades
-
-El funcionamiento del sistema de acceso del servidor web 4D se resume en el siguiente diagrama:
-
-
-
-> Las peticiones que comienzan por `rest/` son gestionadas directamente por el [servidor REST](REST/configuration.md).
-
-### Personalizado (por defecto)
-
-Básicamente, en este modo, depende del desarrollador definir cómo autenticar a los usuarios. 4D sólo evalúa las peticiones HTTP [que requieren una autenticación](#database-method-calls).
-
-Este modo de autenticación es el más flexible porque permite:
-
-- o bien, delegar la autenticación del usuario a una aplicación de terceros (por ejemplo, una red social, SSO);
-- o bien, ofrecer una interfaz al usuario (por ejemplo, un formulario web) para que pueda crear su cuenta en su base de datos clientes; luego, puede autenticar a los usuarios con cualquier algoritmo personalizado (ver [este ejemplo](sessions.md#example) del Lo importante es que nunca guarde la contraseña en claro, utilizando ese código: Lo importante es que nunca guarde la contraseña en claro, utilizando ese código: Lo importante es que nunca guarde la contraseña en claro, utilizando ese código: Lo importante es que nunca guarde la contraseña en claro, utilizando ese código: Lo importante es que nunca guarde la contraseña en claro, utilizando ese código: Lo importante es que nunca guarde la contraseña en claro, utilizando ese código:
-
-```4d
-//... creación de cuenta de usuario
-ds.webUser.password:=Generate password hash($password)
-ds.webUser.save()
-```
-
-Ver también [este ejemplo](gettingStarted.md#authenticating-users) del capítulo "Cómo comenzar".
-
-Si no se proporciona autenticación personalizada, 4D llama al método base [`On Web Authentication`](#on-web-authentication) (si existe). Además de $url y $content, solo se proporcionan las direcciones IP del navegador y del servidor ($IPClient y $IPServer), el nombre de usuario y la contraseña ($user y $password) están vacíos. El método debe devolver **True** en $0 si el usuario se autentifica con éxito, entonces se sirve el recurso solicitado, o **False** en $0 si la autenticación falló.
-
-> **Atención**: si el método de base de datos `On Web Authentication` no existe, las conexiones se aceptan automáticamente (modo de prueba).
-
-### Protocolo Basic
-
-Cuando un usuario se conecta al servidor, aparece una caja de diálogo estándar en su navegador para que introduzca su nombre de usuario y contraseña.
-
-> El nombre y la contraseña introducidos por el usuario se envían sin cifrar en el encabezado de la petición HTTP. Este modo suele requerir HTTPS para ofrecer confidencialidad.
-
-A continuación, se evalúan los valores introducidos:
-
-- Si la opción **Incluir contraseñas de 4D** está marcada, las credenciales de los usuarios se evaluarán primero contra la [tabla interna de usuarios 4D](Users/overview.md).
- - Si el nombre de usuario enviado por el navegador existe en la tabla de usuarios 4D y la contraseña es correcta, se acepta la conexión. Si la contraseña es incorrecta, se rechaza la conexión.
- - Si el nombre de usuario no existe en la tabla de usuarios 4D, se llama al método base [`On Web Authentication`](#on-web-authentication). Si el método base `On Web Authentication` no existe, se rechazan las conexiones.
-- Si la opción **Incluir contraseñas 4D** no está marcada, las credenciales de usuario se envían al método base [`On Web Authentication`](#on-web-authentication) junto con el resto de parámetros de conexión (dirección IP y puerto, URL...) para que pueda procesarlos. Si el método base `On Web Authentication` no existe, se rechazan las conexiones.
-
-> Con el servidor Web del cliente 4D, tenga en cuenta que todos los sitios publicados por las máquinas 4D Client compartirán la misma tabla de usuarios. La validación de los usuarios/contraseñas la realiza la aplicación 4D Server.
-
-### Protocolo DIGEST
-
-Este modo ofrece un mayor nivel de seguridad, ya que la información de autenticación se procesa mediante un proceso unidireccional llamado hashing que hace que su contenido sea imposible de descifrar.
-
-Al igual que en el modo BASIC, los usuarios deben introducir su nombre y contraseña al conectarse. A continuación, se llama al método base [`On Web Authentication`](#on-web-authentication). Cuando se activa el modo DIGEST, el parámetro $password (contraseña) se devuelve siempre vacío. De hecho, cuando se utiliza este modo, esta información no pasa por la red como texto claro (sin encriptar). Por lo tanto, en este caso es imprescindible evaluar las solicitudes de conexión mediante el comando `WEB Validate digest`.
-
-> Debe reiniciar el servidor web para que se tengan en cuenta los cambios realizados en estos parámetros.
-
-## On Web Authentication
-
-El método de base de datos `On Web Authentication` se encarga de gestionar el acceso al motor del servidor web. Es llamado por 4D o 4D Server cuando se recibe una petición HTTP dinámica.
-
-### Llamadas a métodos base
-
-El método base `On Web Authentication` se llama automáticamente cuando una solicitud o procesamiento requiere la ejecución de algún código 4D (excepto para las llamadas REST). También se llama cuando el servidor web recibe una URL estática no válida (por ejemplo, si la página estática solicitada no existe).
-
-Por tanto, se llama al método base `On Web Authentication`:
-
-- cuando el servidor web recibe una URL que solicita un recurso que no existe
-- cuando el servidor web recibe una URL que empieza por `4DACTION/`, `4DCGI/`...
-- cuando el servidor web recibe una URL de acceso raíz y no se ha definido ninguna página de inicio en los Parámetros o mediante el comando [`WEB SET HOME PAGE`](../commands-legacy/web-set-home-page.md)
-- cuando el servidor web procesa una etiqueta que ejecuta código (por ejemplo, `4DSCRIPT`) en una página semidinámica.
-
-Por tanto, NO se llama al método base `On Web Authentication`:
-
-- cuando el servidor web recibe una URL que solicita una página estática válida.
-- when the web server receives a URL beginning with `rest/` and the REST server is launched (in this case, the authentication is handled through the [`ds.authentify` function](../REST/authUsers#force-login-mode) or (deprecated) the `On REST Authentication` database method or Structure settings.
-- cuando el servidor web recibe una URL con un patrón que desencadena un [gestor de peticiones HTTP personalizadas](http-request-handler.md).
-
-### Sintaxis
-
-**On Web Authentication**( *$url* : Text ; *$content* : Text ; *$IPClient* : Text ; *$IPServer* : Text ; *$user* : Text ; *$password* : Text ) -> $accept : Boolean
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | :-------------------------: | ---------------------------------------------------------------------------- |
-| $url | Text | <- | URL |
-| $content | Text | <- | Encabezados HTTP + cuerpo HTTP (hasta un límite de 32 kb) |
-| $IPClient | Text | <- | Dirección IP del cliente web (navegador) |
-| $IPServer | Text | <- | Dirección IP del servidor |
-| $user | Text | <- | Nombre de usuario |
-| $password | Text | <- | Contraseña |
-| $accept | Boolean | -> | True = solicitud aceptada, False = solicitud rechazada |
-
-Debe declarar estos parámetros de la siguiente manera:
-
-```4d
-// Método base On Web Authentication
-#DECLARE ($url : Text; $content : Text; \
- $IPClient : Text; $IPServer : Text; \
- $user : Text; $password : Text) \
- -> $accept : Boolean
-
-//Código del método
-
-```
-
-:::note
-
-Todos los parámetros del método base `On Web Authentication` no están necesariamente rellenados. The information received by the database method depends on the selected [authentication mode](#authentication-modes).
-
-:::
-
-#### $url - URL
-
-El primer parámetro (`$url`) es la URL recibida por el servidor, de la que se ha eliminado la dirección del host.
-
-Tomemos el ejemplo de una conexión a la Intranet. Supongamos que la dirección IP de su máquina 4D Web Server es 123.45.67.89. La siguiente tabla muestra los valores de $url en función de la URL introducida en el navegador web:
-
-| URL introducida en el navegador web | Valor del parámetro $url |
-| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
-| 123.45.67.89 | / |
-| http://123.45.67.89 | / |
-| 123.45.67.89/Customers | /Customers |
-| http://123.45.67.89/Customers/Add | /Customers/Add |
-| 123.45.67.89/Do_This/If_OK/Do_That | /Do_This/If_OK/Do_That |
-
-#### $content - Encabezado y Cuerpo de la petición HTTP
-
-El segundo parámetro (`$content`) es el encabezado y el cuerpo de la petición HTTP enviada por el navegador web. Tenga en cuenta que esta información se pasa a su método base `On Web Authentication` tal cual. Su contenido variará en función de la naturaleza del navegador web que intenta la conexión.
-
-Si su aplicación utiliza esta información, deberá analizar el encabezado y el cuerpo. Puede utilizar los comandos `WEB GET HTTP HEADER` y `WEB GET HTTP BODY`.
-
-> Por razones de rendimiento, el tamaño de los datos que pasan por el parámetro $content no debe superar los 32 KB. Más allá de este tamaño, son truncados por el servidor HTTP de 4D.
-
-#### $IPClient - Dirección IP del cliente web
-
-El parámetro `$IPClient` recibe la dirección IP de la máquina del navegador. Esta información puede permitirle distinguir entre las conexiones a la intranet y a Internet.
-
-> 4D devuelve las direcciones IPv4 en un formato híbrido IPv6/IPv4 escrito con un prefijo de 96 bits, por ejemplo ::ffff:192.168.2.34 para la dirección IPv4 192.168.2.34. Para más información, consulte la sección [Soporte IPv6](webServerConfig.md#about-ipv6-support).
-
-#### $IPServer - Dirección IP del servidor
-
-El parámetro `$IPServer` recibe la dirección IP utilizada para llamar al servidor web. 4D permite el multi-homing, que permite explotar máquinas con más de una dirección IP. Para más información, consulte la [página Configuración](webServerConfig.md#ip-address-to-listen).
-
-#### $user y $password - Nombre de usuario y contraseña
-
-Generalidades Generalidades Generalidades Generalidades Generalidades Generalidades Generalidades Generalidades Esta caja de diálogo aparece para cada conexión, si se selecciona la autenticación [basic](#basic-protocol) o [digest](#digest-protocol).
-
-> Si el nombre de usuario enviado por el navegador existe en 4D, el parámetro $password (la contraseña del usuario) no se devuelve por razones de seguridad.
-
-#### $accept - Retorno de función
-
-El método base `On Web Authentication` devuelve un booleano:
-
-- Si es True, la conexión es aceptada.
-
-- Si es False, la conexión es rechazada.
-
-El método base `On Web Connection` sólo se ejecuta si la conexión ha sido aceptada por `On Web Authentication`.
-
-:::warning
-
-- Si no se devuelve ningún valor, la conexión se considera **aceptada** y se ejecuta el método base de datos `On Web Connection`.
-- No llame a ningún elemento de la interfaz en el método base `On Web Authentication` (`ALERT`, `DIALOG`, etc.) porque de lo contrario su ejecución será interrumpida y la conexión será rechazada. Lo mismo ocurrirá si se produce un error durante su procesamiento.
-
-:::
-
-### Ejemplo
-
-Ejemplo del método base `On Web Authentication` en [Modo DIGEST](#digest-protocol):
-
-```4d
- // Método base On Web Authentication
- #DECLARE ($url : Text; $header : Text; $ipB : Text; $ipS : Text; \
- $user : Text; $pw : Text) -> $valid : Boolean
-
- var $found : cs.WebUserSelection
- $valid:=False
-
- $found:=ds.WebUser.query("User === :1";$user)
- If($found.length=1) // El usuario se encuentra
- $valid:=WEB Validate digest($user;[WebUser]password)
- Else
- $valid:=False // El usuario no existe
- End if
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/gettingStarted.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/gettingStarted.md
deleted file mode 100644
index 666a14a5e8f1fe..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/gettingStarted.md
+++ /dev/null
@@ -1,277 +0,0 @@
----
-id: gettingStarted
-title: Desarrollo web
----
-
-Esta sección de "Primeros pasos" está orientada a los usuarios principiantes que desean una visión general sobre cómo pasar de cero a un sitio web 4D que maneja datos de la base. ¡Empecemos!
-
-## Ejemplo Hello World
-
-Empecemos por hacer que el servidor web envíe "Hello World" al navegador. La forma más sencilla de hacerlo es crear un proyecto, iniciar el servidor web y escribir un pequeño código que devuelva un texto en el método base `On Web Connection`.
-
-### Inicio del servidor web
-
-Para iniciar el servidor Web 4D:
-
-1. Inicie su aplicación 4D y cree un nuevo proyecto 4D vacío.
-2. En el menú **Ejecutar**, seleccione **Arrancar el servidor web**.
-
-¡Eso es todo! El servidor web se inicia (verá que el elemento del menú cambia a **Detener el servidor web**). Ahora está listo para atender las peticiones. Para comprobarlo, mostraremos la página de inicio por defecto.
-
-### Mostrar la página de inicio por defecto
-
-El servidor web 4D crea automáticamente una página `index.html` por defecto en la carpeta raíz por defecto `WebFolder`, creada al mismo nivel que la carpeta Project.
-
-1. Inicie un navegador web y conéctese a la dirección IP del servidor web (el puerto http por defecto del servidor web de 4D es el 80). Si el servidor web y el navegador están en la misma máquina, puede seleccionar **Probar servidor web** en el menú **Ejecutar**.
-
-Se muestra la página de inicio por defecto:
-
-
-
-### Mostrar Hello World
-
-1. Abra el Explorador, muestre la lista de Métodos base y haga doble clic en `On Web Connection`.
-
-2. Introduzca el siguiente código:
-
-```4d
-Case of
- : ($1="/hello")
- WEB SEND TEXT("Hello World!")
- Else
- // Error 404 por ejemplo
-End case
-```
-
-El método base [`On Web Connection`](httpRequests.md#on-web-connection) se ejecuta para las solicitudes entrantes y recibe la URL de destino en el parámetro `$1`. Este código tan sencillo sólo envía el texto al navegador.
-
-3. En su navegador, introduzca la siguiente URL:
-
-```
-http://localhost/hello
-```
-
-El servidor web gestiona la solicitud y la devuelve:
-
-
-
-## Obtener datos de la base de datos
-
-Ahora veremos lo sencillo que es obtener datos de la base. En primer lugar, crearemos una tabla y la llenaremos con algunos datos.
-
-Cree una base de datos básica con, por ejemplo, una sola tabla que contenga algunos registros:
-
-
-
-
-### Mostrar datos en una página
-
-La solución más sencilla para mostrar los datos es llamar a una [página de plantillas](templates.md) que contenga etiquetas.
-
-1. Utilizando cualquier editor de texto, cree un archivo que contenga las siguientes líneas:
-
-```html
-
-
-
-
-
-
-
-
-```
-
-2. Nombre el archivo "friends.shtml" y guárdelo en la **WebFolder** de su proyecto.
-3. En su navegador, introduzca la siguiente URL:
-
-```
-http://localhost/friends.shtml
-```
-
-Las páginas `.shtml` son procesadas automáticamente por el servidor web. Se devuelve la página llena de datos:
-
-
-
-### Petición REST
-
-Si no sólo queremos *visualizar* datos, sino *utilizarlos*, podemos utilizar ORDA y el servidor REST. Gracias al [concepto ORDA](ORDA/overview.md), la tabla `Friends` se asigna automáticamente a una clase de datos y está disponible a través de [REST](REST/gettingStarted.md).
-
-1. Utilizaremos el servidor REST para acceder a los datos: vaya a la caja de diálogo **Parámetros**, seleccione **Web** > **Funcionalidades Web** y marque la opción **Exponer como servidor REST**.
-
-
-
-2. En su navegador, introduzca la siguiente URL:
-
-```
-http://localhost/rest/$catalog
-```
-
-El servidor web devuelve los resultados en JSON:
-
-```json
-{
- "__UNIQID": "3F1B6ACFFE12B64493629AD76011922D",
- "dataClasses": [
- {
- "name": "Friends",
- "uri": "/rest/$catalog/Friends",
- "dataURI": "/rest/Friends"
- }
- ]
-}
-```
-
-Se obtiene el catálogo, es decir, la lista de clases de datos y atributos expuestos en el almacén de datos.
-
-También puede obtener cualquier dato.
-
-3. Introduzca el siguiente URL:
-
-```
-http://localhost/rest/Friends
-```
-
-El servidor devuelve las entidades, es decir, los datos, de la clase de datos Friends:
-
-```json
-{
- "__DATACLASS": "Friends",
- "__entityModel": "Friends",
- "__GlobalStamp": 0,
- "__COUNT": 4,
- "__FIRST": 0,
- "__ENTITIES": [
- {
- "__KEY": "1",
- "__TIMESTAMP": "2020-10-27T14:29:01.914Z",
- "__STAMP": 1,
- "ID": 1,
- "lastName": "Smith",
- "firstName": "John"
- },
- {
- "__KEY": "2",
- "__TIMESTAMP": "2020-10-27T14:29:16.035Z",
- "__STAMP": 1,
- "ID": 2,
- "lastName": "Brown",
- "firstName": "Danny"
- },
- {
- "__KEY": "3",
- "__TIMESTAMP": "2020-10-27T14:29:43.945Z",
- "__STAMP": 1,
- "ID": 3,
- "lastName": "Purple",
- "firstName": "Mark"
- },
- {
- "__KEY": "4",
- "__TIMESTAMP": "2020-10-27T14:34:58.457Z",
- "__STAMP": 1,
- "ID": 4,
- "lastName": "Dupont",
- "firstName": "Jenny"
- }
- ],
- "__SENT": 4
-}
-```
-
-Este ejemplo muy sencillo muestra cómo el servidor web interactúa de forma transparente con el servidor [REST](REST/gettingStarted.md) para devolver cualquier dato solicitado, siempre que esté expuesto. En sus interfaces web, puede vincular fácilmente el código javascript o html con los datos devueltos. Vea el [Explorador de datos web](Admin/dataExplorer.md) integrado para tener un ejemplo de interfaz web sofisticada vinculada a las clases de datos.
-
-## Inicio de sesión y sesión
-
-En las secciones anteriores, obtenemos acceso libre a la aplicación desde las peticiones web. Sin embargo, en el mundo de las aplicaciones web, la seguridad del acceso a los datos es la principal prioridad. Al conectarse al servidor web de 4D, los usuarios deben ser autentificados y su navegación controlada.
-
-### Crear una tabla de usuarios
-
-La forma más sencilla y segura de registrar un usuario en el servidor web de 4D se basa en el siguiente escenario:
-
-- Los usuarios se almacenan en una tabla dedicada y no expuesta (llamada *WebUsers* por ejemplo)
-- La tabla *WebUsers* podría estar [encriptada](MSC/encrypt.md) y almacena el login del usuario y un hash de su contraseña.
-
-1. Cree una tabla con algunos campos, por ejemplo:
-
-
-
-2. Escriba y ejecute el siguiente código para crear un usuario:
-
-```4d
-var $webUser : cs.WebUsersEntity
-
-$webUser:=ds.WebUsers.new()
-$webUser.firstName:="John"
-$webUser.lastName:="Doe"
-// la contraseña sería introducida por el usuario
-$webUser.password:=Generate password hash("123")
-$webUser.userId:="john@4d.com"
-$webUser.save()
-```
-
-### Autenticación de los usuarios
-
-> Para que sea segura de extremo a extremo, es necesario que toda la conexión se establezca mediante [https](webServerConfig.md#enable-https).
-
-1. Abra el Explorador y cree un método de proyecto llamado "login".
-
-2. Escriba el siguiente código:
-
-```4d
-var $indexUserId; $indexPassword : Integer
-var $userId; $password : Text
-var $user; $info : Object
-ARRAY TEXT($anames; 0)
-ARRAY TEXT($avalues; 0)
-
-// obtener los valores enviados en el encabezado de la petición
-WEB GET VARIABLES($anames; $avalues)
-
-// busca los campos de inicio de sesión del encabezado
-$indexUserId:=Find in array($anames; "userId")
-$userId:=$avalues{$indexUserId}
-$indexPassword:=Find in array($anames; "password")
-$password:=$avalues{$indexPassword}
-
-//buscar un usuario con el nombre introducido en la tabla de usuarios
-$user:=ds.WebUsers.query("userId = :1"; $userId).first()
-
-If ($user#Null) //se encontró un usuario
- //comprobar la contraseña
- If (Verify password hash($password; $user.password))
- //password ok, llenar la sesión
- $info:=New object()
- $info.userName:=$user.firstName+" "+$user.lastName
- Session.setPrivileges($info)
- //Puede utilizar la sesión de usuario para almacenar cualquier información
- WEB SEND TEXT("Welcome "+Session.userName)
- Else
- WEB SEND TEXT("Wrong user name or password.")
- End if
-Else
- WEB SEND TEXT("Wrong user name or password.")
-End if
-```
-
-3. Despliegue las propiedades del método haciendo clic en el botón **[i]** del editor de código, marque la opción `etiquetas 4D y URLs (4DACTION...)` y haga clic en **Aceptar**.
-
-
-
-4. En su navegador, introduzca la siguiente URL:
-
-```
-http://localhost/4DACTION/login/?userID=john@4d.com&password=123
-```
-
-> No se recomienda el uso de este tipo de URLs, sólo se presenta aquí para mantener el ejemplo simple. Una solicitud de inicio de sesión más realista debe ser manejada a través de un formulario web y una petición POST. Consulte [esta página](sessions.md#example) para ver un ejemplo de formulario POST.
-
-Entonces se registrará para la sesión:
-
-
-
-Las credenciales incorrectas serían rechazadas:
-
-
-
-Una vez que un usuario se registra, puede manejar la sesión asociada utilizando el método `WEB Get current session ID`. Ver la página [Sesiones de usuario](sessions.md).
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/http-request-handler.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/http-request-handler.md
deleted file mode 100644
index 3c97eba7683dee..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/http-request-handler.md
+++ /dev/null
@@ -1,328 +0,0 @@
----
-id: http-request-handler
-title: HTTP Request handler
----
-
-Por defecto, las peticiones HTTP recibidas por el servidor web 4D se gestionan a través de [funciones de procesamiento integradas](httpRequests.md) o del [servidor REST](../REST/REST_requests.md).
-
-In addition, 4D supports the implementation of **custom HTTP Request handlers**, allowing you to intercept specific incoming HTTP requests and process them using your own code.
-
-Cuando un manejador de peticiones HTTP personalizado intercepta una solicitud, se procesa directamente y no hay otras funcionalidades de procesamiento (por ejemplo, son llamados métodos base [On Web authentication](./authentication.md#on-web-authentication) o [On Web connection](./httpRequests.md#on-web-connection).
-
-Custom HTTP request handlers meet various needs, including:
-
-- using a given URL as a resource provider or a file-uploading box (to download or upload various files),
-- redirecting on specific pages according to a context (user authenticated, privileges granted...),
-- gestionar una autenticación a través de oAuth 2.0.
-
-## Requisitos
-
-Se soportan gestores de solicitudes HTTP personalizados:
-
-- cuando las [sesiones escalables](./sessions.md#enabling-web-sessions) están habilitadas,
-- with the main Web Server only (HTTP Request handlers that may have been defined in [Web Servers of components](../WebServer/webServerObject.md) are ignored).
-
-:::warning
-
-[Por defecto](../ORDA/privileges.md#default-file) por razones de seguridad, el acceso externo al datastore no está permitido en 4D. You need to configure the [ORDA privileges](../ORDA/privileges.md) to allow HTTP requests.
-
-:::
-
-## Archivo HTTPHandlers.json
-
-Define sus manejadores de petición HTTP personalizados en un archivo de configuración llamado **HTTPHandlers.json** almacenado en la carpeta [`Project/Sources`](../Project/architecture.md#sources).
-
-This file contains all listened URL patterns, the handled verbs, and the code to be called. Los administradores se proporcionan en forma de colección en formato JSON.
-
-At runtime, the first pattern matching the URL is executed, the others are ignored.
-
-Este es un ejemplo del contenido de un archivo *HTTPHandlers.json*:
-
-```json
-
-[
- {
- "class": "GeneralHandling",
- "method": "gettingStarted",
- "pattern": "start",
- "verbs": "get, post"
- }
-]
-```
-
-This handler declaration can be read as: when any request starting by `/start/` with a `GET` or `POST` verb is received by the server, the `gettingStarted` function of the `GeneralHandling` singleton is executed.
-
-:::note
-
-You must restart the Web server so that modifications made in this file are taken into account.
-
-:::
-
-## Definición del gestor
-
-A handler is defined by:
-
-- a listened URL pattern
-- a function and its class where the code is implemented to handle the listened URL pattern
-- the verbs with which the URL can be called to trigger the handler
-
-The handler identifier is the couple [pattern + a verb among the verbs list].
-
-### Patrones de la URL
-
-URL patterns can be given as **prefixes** or using **regular expressions**.
-
-- To declare a prefix pattern, use the "pattern" property name in the HTTPHandlers.json file. Prefixes are considered as regular expressions already containing starting and ending `/`.
- Ej: `"pattern": "docs"` o `"pattern": "docs/invoices"`
-
-- To declare a regular expression pattern, use the "regexPattern" property name in the HTTPHandlers.json file. Los modelos de expresiones regulares se manejan directamente.
- Ej: `"regexPattern" : "/docs/.+/index\.html"`
-
-"Pattern" and "regexPattern" properties cannot be used in the same handler definition (in this case, only the "regexPattern" property is taken into account).
-
-#### Concordancia de modelos
-
-Los modelos de URL se activan en el orden indicado:
-
-- se ejecuta el primer modelo coincidente
-- los siguientes patrones no se ejecutan aunque coincidan con la URL
-
-As a consequence, you need to apply a accurate strategy when writing your handlers: the most detailed patterns must be written before the more general patterns.
-
-```json
-[
- {
- "class": "InvoiceslHandling",
- "method": "handleTheInvoice",
- "regexPattern": "/docs/invoices/details/theInvoice",
- "verbs": "GET"
- },
- {
- "class": "InvoiceslHandling",
- "method": "handleUnauthorizedVerbs",
- "regexPattern": "/docs/invoices/details/theInvoice",
- "comment": "This handler is triggered for all verbs except GET (handled above)"
- },
- {
- "class": "DocsHandling",
- "method": "handleDocs",
- "regexPattern": "/docs",
- "comment": "This handler is triggered for all the verbs"
- }
-]
-
-```
-
-#### Patrones prohibidos
-
-URL patterns matching 4D built-in HTTP processing features are not allowed in custom HTTP handlers. Por ejemplo, los siguientes modelos no pueden ser manejados:
-
-- `/4DACTION`
-- `/rest`
-- `/$lib/renderer`
-- `/$shared`
-
-### Clase y método
-
-You declare the code to be executed when a defined URL pattern is intercepted using the "class" and "method" properties.
-
-- "class": class name without `cs.`, e.g. "UsersHandling" for the `cs.UsersHandling` user class. Debe ser una clase [**compartida**](../Concepts/classes.md#shared-singleton) y [**singleton**](../Concepts/classes.md#singleton-classes).
-- "method": función de clase perteneciente a la clase.
-
-[Ver abajo](#request-handler-code) para obtener información sobre el código del gestor de peticiones.
-
-### Verbs
-
-You can use the "verbs" property in the handler definition to declare HTTP verbs that are supported in incoming requests for this handler. A request that uses a verb that is not explicitely allowed is automatically rejected by the server.
-
-You can declare several verbs, separated by a comma. Verb names are not case sensitive.
-
-Ej: `"verbs" : "PUT, POST"`
-
-:::note
-
-No control is done on verb names. Se pueden utilizar todos los nombres.
-
-:::
-
-By default, if the "verbs" property is not used for a handler, **all** HTTP verbs are supported in incoming requests for this handler (except those possibly used beforehand in a more detailed pattern, as shown in the example above).
-
-:::note
-
-El verbo HTTP también puede ser evaluado [utilizando la propiedad `.verb` dentro del código del manejador de peticiones](../API/IncomingMessageClass.md#verb) para ser aceptado o rechazado.
-
-:::
-
-## Ejemplo
-
-He aquí un ejemplo detallado de un archivo HTTPHandlers.json:
-
-```json
-
-[
- {
- "clase": "GeneralHandling",
- "method": "handle",
- "pattern": "info", //prefijo URL
- "verbs": "GET"
- },
- {
- "class": "UsersHandling",
- "method": "manageAccount",
- "pattern": "userAccount/update", //prefijo URL
- "verbs": "PUT,POST"
- },
- {
- "class": "FinancialHandling",
- "method": "handleInvoices",
- "regexPattern": "/docs/invoices/(past|today)", //prefijo de URL dado como regex
- "verbs": "GET"
- },
- {
- "class": "DocsHandling",
- "method": "handleDocs",
- "regexPattern": "/docs/myPage.html", //prefijo de URL dado como regex
- "verbs": "GET"
- },
- {
- "class": "InvoicesHandling",
- "method": "handleTheInvoice",
- "pattern": "docs/invoices/details/theInvoice", // La URL más específica primero
- "verbs": "GET,POST"
- },
- {
- "class": "InvoicesHandling",
- "method": "handleDetails",
- "pattern": "docs/invoices/details", // Las URL generales después de
- "verbs": "GET"
- },
- {
- "class": "InvoicesHandling",
- "method": "handleInvoices", // Las URL generales después de
- "pattern": "docs/invoices",
- "verbs": "GET"
- }
-]
-
-```
-
-En este ejemplo, debe implementar las siguientes funciones:
-
-- *funciónhandle* en la clase \*GeneralHandling
-- *manageAccount* en la clase *UsersHandling*
-- *handleInvoices* en la clase *FinancialHandling*
-- *handleDocs* en la clase *DocsHandling*
-- *handleTheInvoice* / *handleDetails* / *handleInvoices* en la clase *InvoicesHandling*
-
-Examples of URLs triggering the handlers:
-
-`IP:port/info/` con un verbo GET
-`IP:port/info/general` con un verbo GET
-
-`IP:port/userAccount/update/` con un verbo POST
-`IP:port/userAccount/update/profile` con un verbo POST
-
-`IP:port/docs/invoices/past` con un verbo GET
-`IP:port/docs/invoices/today/latest` con un verbo GET
-
-`IP:port//docs/myPage.html` con un verbo GET
-
-`IP:port//docs/invoices/` con un verbo GET, llama a la función *handleInvoices* (clase *InvoicesHandling*)
-`IP:port//docs/invoices/details/` con un verbo GET, llama a la función *handleDetails* (clase *InvoicesHandling*)
-`IP:port//docs/invoices/details/theInvoice/xxxxxx` con un verbo GET, llama a la función *handleTheInvoice* (clase *InvoiceslHandling*)
-
-## Código del gestor de peticiones
-
-### Configuración de funciones
-
-The HTTP Request handler code must be implemented in a function of a [**Shared**](../Concepts/classes.md#shared-singleton) [**singleton class**](../Concepts/classes.md#singleton-classes).
-
-If the singleton is missing or not shared, an error "Cannot find singleton" is returned by the server. If the class or the function [defined as handler](#handler-definition) in the HTTPHandlers.json file is not found, an error "Cannot find singleton function" is returned by the server.
-
-Request handler functions are not necessarily shared, unless some request handler properties are updated by the functions. En este caso, necesita declarar sus funciones con la [palabra clave 'shared'](../Concepts/classes.md#shared-functions).
-
-:::note
-
-**no es recomendado** exponer las funciones del gestor de solicitudes a llamadas REST externas usando las palabras claves [`exposed`](../ORDA/ordaClasses.md#exposed-vs-non-exposed-functions) o [`onHTTPGet`](../ORDA/ordaClasses.md#onhttpget-keyword).
-
-:::
-
-### Entrada: una instancia de la clase 4D.IncomingMessage
-
-Cuando una solicitud ha sido interceptada por el manejador, se recibe en el servidor como una instancia de la [clase 4D.IncomingMessage](../API/IncomingMessageClass.md).
-
-All necessary information about the request are available in this object, including the request url, verb, headers, and, if any, parameters (put in the URL) and body.
-
-Then, the request handler can use this information to trigger appropriate business logic.
-
-### Output: an instance of the 4D.OutgoingMessage class
-
-The request handler can return an object instance of the [4D.OutGoingMessage class](../API/OutgoingMessageClass.md), i.e. some full web content ready for a browser to handle, such as a file content.
-
-### Ejemplo
-
-La [clase 4D.IncomingMessage](../API/IncomingMessageClass.md) ofrece funciones para obtener los [encabezados](../API/IncomingMessageClass.md#headers) y el [cuerpo](../API/IncomingMessageClass.md#gettext) de la solicitud.
-
-He aquí un ejemplo sencillo para cargar un archivo en el servidor.
-
-El archivo **HTTPHandlers.json**:
-
-```json
-[
- {
- "class": "UploadFile",
- "method": "uploadFile",
- "regexPattern": "/putFile",
- "verbs": "POST"
- }
-]
-```
-
-La URL llamada es: http://127.0.0.1:8044/putFile?fileName=testFile
-
-The binary content of the file is put in the body of the request and a POST verb is used. El nombre del archivo se da como parámetro (*fileName*) en la URL. Se recibe en el objeto [`urlQuery`](../API/IncomingMessageClass.md#urlquery) en la petición.
-
-```4d
- //UploadFile class
-
-shared singleton Class constructor()
-
-
-Function uploadFile($request : 4D.IncomingMessage) : 4D.OutgoingMessage
-
- var $response:=4D.OutgoingMessage.new()
-
- var $body:="Not supported file"
- var $fileName; $fileType : Text
- var $file : 4D.File
- var $picture : Picture
- var $created : Boolean
-
- $fileName:=$request.urlQuery.fileName
- $fileType:=$request.getHeader("Content-Type")
-
- Case of
- : ($fileType="application/pdf")
- $file:=File("/PACKAGE/Files/"+$fileName+".pdf")
- $created:=$file.create()
- $file.setContent($request.getBlob())
- $body:="Upload OK - File size: "+String($file.size)
-
- : ($fileType="image/jpeg")
- $file:=File("/PACKAGE/Files/"+$fileName+".jpg")
- $picture:=$request.getPicture()
- WRITE PICTURE FILE($file.platformPath; $picture)
- $body:="Upload OK - Image size: "+String($file.size)
-
- End case
-
- $response.setBody($body)
- $response.setHeader("Content-Type"; "text/plain")
-
- return $response
-
-```
-
-## Ver también
-
-[Perfect mastery of your back end business logic thanks to HTTP requests handlers](https://blog.4d.com/master-http-requests-with-4d-request-handlers/) (blog post)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/preemptiveWeb.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/preemptiveWeb.md
deleted file mode 100644
index b7275944048a9f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/preemptiveWeb.md
+++ /dev/null
@@ -1,92 +0,0 @@
----
-id: preemptiveWeb
-title: Uso de procesos web apropiativos
----
-
-El servidor web de 4D le permite aprovechar al máximo los ordenadores multinúcleo utilizando procesos web apropiativos en sus aplicaciones. Puede configurar su código relacionado con la web, incluyendo las etiquetas 4D, los métodos base Web o las funciones de clase REST de ORDA para que se ejecuten simultáneamente en tantos núcleos como sea posible.
-
-Para obtener información detallada sobre el proceso apropiativo en 4D, por favor consulte la sección [Procesos apropiativos](../Develop/preemptive.md).
-
-## Disponibilidad del modo apropiativo para los procesos web
-
-La siguiente tabla indica si el modo apropiativo se utiliza o está disponible, dependiendo del contexto de ejecución:
-
-| 4D Server | Interpretado ([asociado al depurador](../Debugging/debugging-remote.md)) | Interpretado (no asociado al depurador) | Compilado |
-| --------------------- | ------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | ------------------- |
-| Servidor REST | cooperativo | apropiativo | apropiativo |
-| Servidor Web | cooperativo | cooperativo | *configuración web* |
-| Servidor Web Services | cooperativo | cooperativo | *configuración web* |
-
-| 4D remoto/monopuesto | Interpretado | Compilado |
-| --------------------- | ------------ | ------------------- |
-| Servidor REST | cooperativo | apropiativo |
-| Servidor Web | cooperativo | *configuración web* |
-| Servidor Web Services | cooperativo | *configuración web* |
-
-- Servidor REST: gestiona las [funciones de clase del modelo de datos ORDA](../REST/ClassFunctions.md)
-- Servidor web: maneja las [plantillas web](templates.md), [4DACTION y los métodos base](httpRequests.md)
-- Servidor de servicios web: gestiona las peticiones SOAP
-- ***web setting*** significa que el modo apropiativo depende de un valor de configuración:
- - cuando se selecciona la opción de [**sesiones escalables**](sessions.md#enabling-web-sessions), el modo apropiativo se utiliza automáticamente para los procesos web.
- - en caso contrario, se tendrá en cuenta la opción [**Utilizar procesos apropiativos**](webServerConfig.md#use-preemptive-processes).
- - en lo que respecta a los procesos de servicios web (servidor o cliente), se soporta el modo apropiativo a nivel del método. Sólo tiene que seleccionar la propiedad "Puede ejecutarse en procesos apropiativos" para los métodos del servidor SOAP publicados (ver [Publicación de un servicio web con 4D](https://doc.4d.com/4Dv20/4D/20.2/Publishing-a-Web-Service-with-4D.300-6750334.en.html)) o los métodos del cliente proxy (ver [Suscripción a un servicio web en 4D](https://doc.4d.com/4Dv20/4D/20.2/Subscribing-to-a-Web-Service-in-4D.300-6750336.en.html)) y asegurarse de que el compilador confirme que son hilo seguro.
-
-## Escribir código servidor web hilo seguro
-
-Todo el código 4D ejecutado por el servidor web debe ser hilo seguro si quiere que sus procesos web se ejecuten en modo apropiativo. Cuando el [modo apropiativo está activo](#availability-of-preemptive-mode-for-web-processes), las siguientes partes de la aplicación serán evaluadas automáticamente por el compilador 4D:
-
-- Todos los métodos base relacionados con la web:
- - [`On Web Authentication`](authentication.md#on-web-authentication)
- - [`On Web Connection`](httpRequests.md#on-web-connection)
- - `On REST Authentication`
- - [`On Mobile App Authentication`](https://developer.4d.com/go-mobile/docs/4d/on-mobile-app-authentication) and [`On Mobile App Action`](https://developer.4d.com/go-mobile/docs/4d/on-mobile-app-action)
-
-- El método proyecto `compilador_web` (independientemente de su propiedad real "Modo de ejecución");
-
-- Básicamente cualquier código procesado por el comando [`PROCESS 4D TAGS`](../commands-legacy/process-4d-tags.md) en el contexto web, por ejemplo a través de páginas .shtml
-
-- Todo método proyecto con el atributo "Disponible a través de etiquetas 4D y URLs (`4DACTION`, etc.)
-
-- Triggers para tablas con el atributo "Exponer como recurso REST"
-
-- [funciones de clase del modelo de datos ORDA](../REST/ClassFunctions.md) llamadas vía REST
-
-Para cada uno de estos métodos y partes de código, el compilador comprobará si se respetan las reglas de seguridad de hilos, y devolverá errores en caso de que haya problemas. Para más información sobre las reglas hilo seguro, consulte el párrafo *Escribir un método hilo seguro* en el capítulo *Procesos* del manual de [Lenguaje 4D](https://doc.4d.com).
-
-## Código web 4D hilo seguro
-
-La mayoría de los comandos y funciones 4D relacionados con la web, los métodos base y las URL son hilo seguro y pueden utilizarse en modo apropiativo.
-
-### Comandos 4D y métodos base
-
-Todos los comandos 4D relativos a la web son hilo seguro, *es decir*:
-
-- todos los comandos del tema *Servidor Web*,
-- todos los comandos del tema *Cliente HTTP*.
-
-Los métodos base relacionados con la web son hilo seguro y pueden utilizarse en modo apropiativo (ver arriba): `On Web Authentication`, `On Web Connection`, `On REST Authentication`...).
-
-Por supuesto, el código ejecutado por estos métodos también debe ser hilo seguro.
-
-### URLs del servidor web
-
-Las siguientes URLs 4D Web Server son hilo seguro y pueden ser utilizadas en modo apropiativo:
-
-- *4daction/* (el método proyecto llamado también debe ser hilo seguro)
-- *4dcgi/* (los métodos base llamados también deben ser hilo seguro)
-- *4dwebtest/*
-- *4dblank/*
-- *4dstats/*
-- *4dhtmlstats/*
-- *4dcacheclear/*
-- *rest/*
-- *4dimgfield/* (generado por `PROCESS 4D TAGS` para peticiones web en campos imagen)
-- *4dimg/* (generado por `PROCESS 4D TAGS` para la petición web en las variables imagen)
-
-### Icono de proceso web apropiativo
-
-Tanto el Explorador de ejecución como la ventana de administración de 4D Server muestran un icono específico para los procesos web apropiativos:
-
-| Tipo de proceso | Icono |
-| --------------------------------------------------- | ------------------------------------------- |
-| Método Web (proceso apropiativo) |  |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/qodly-studio.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/qodly-studio.md
deleted file mode 100644
index 5988064c941307..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/qodly-studio.md
+++ /dev/null
@@ -1,370 +0,0 @@
----
-id: qodly-studio
-title: Qodly Studio for 4D
----
-
-**Qodly Studio** es un creador de interfaces para aplicaciones web. Ofrece a los desarrolladores un editor gráfico de páginas para diseñar aplicaciones que se ejecutan en navegadores web o smartphones. Soporta de forma nativa los [objetos ORDA](../ORDA/overview.md).
-
-Puede utilizar Qodly Studio directamente desde su **entorno 4D** para crear interfaces modernas y sofisticadas que puede integrar fácilmente a sus proyectos 4D existentes y desplegar **in situ**.
-
-Qodly Studio también puede utilizarse en la [**plataforma Qodly Cloud**](https://qodly.com), dedicada al desarrollo de aplicaciones profesionales web.
-
-Qodly Studio propone una interfaz web completa, que le permite:
-
-- create Qodly pages by placing components on a canvas
-- mapear componentes a Qodly Sources
-- activar código 4D configurando eventos
-- y mucho más.
-
-## Configuración
-
-### Requisitos
-
-#### Navegador
-
-Qodly Studio soporta los siguientes navegadores web:
-
-- Chrome
-- Edge
-- FireFox
-
-La resolución recomendada es 1920x1080.
-
-#### Aplicación 4D
-
-- Desarrollo: 4D v20 R2 o superior
-- Despliegue: 4D Server v20 R2 o superior
-- Qodly Studio solo funciona con proyectos 4D (no soporta bases de datos binarias).
-- Las sesiones web (*igualmente llamadas sesiones escalables*) deben [estar activadas](sessions.md#enabling-web-sessions).
-- El código 4D llamado por los formularios Qodly debe ser [hilo seguro](preemptiveWeb.md).
-
-### Acceso a Qodly Studio
-
-Por defecto, no se permite el acceso a Qodly Studio.
-
-Qodly Studio es servido por el [servidor web WebAdmin](../Admin/webAdmin.md) y muestra datos de proyectos 4D manejados por el [servidor web 4D](webServer.md).
-
-Para permitir el acceso a Qodly Studio, debe permitirlo explícitamente en dos niveles:
-
-- a nivel de la aplicación 4D
-- a nivel del proyecto
-
-Si uno de los dos niveles (o ambos) no están habilitados, se niega el acceso a Qodly Studio (se devuelve una página 403).
-
-#### En nivel 4D
-
-Como primer nivel de seguridad, necesita [permitir el acceso a Qodly Studio en el servidor web WebAdmin](../Admin/webAdmin.md#enable-access-to-qodly-studio). Esta configuración se aplica a la aplicación 4D (4D o 4D Server) en la máquina local. Todos los proyectos abiertos con esa aplicación 4D tienen en cuenta esta configuración.
-
-Mantenga esta opción desmarcada si desea asegurarse de que no se permite el acceso a Qodly Studio en la aplicación. Marque esta opción para poder acceder a Qodly Studio. Sin embargo, sigue siendo necesario activarla en cada nivel del proyecto.
-
-Además, puede [configurar el puerto HTTP/HTTPS del servidor web WebAdmin utilizado](../Admin/webAdmin.md#accept-http-connections-on-localhost).
-
-:::note
-
-Después de cualquier cambio en esta configuración, debe [reiniciar el servidor web WebAdmin](../Admin/webAdmin.md#start-and-stop) para que la nueva configuración sea efectiva.
-
-:::
-
-#### A nivel del proyecto
-
-Después de haber habilitado el acceso a Qodly Studio en el nivel 4D, es necesario designar explícitamente cada proyecto al que se puede acceder. La opción **Activar el acceso a Qodly Studio** debe estar habilitada en la [página de funcionalidades web de los parámetros de la aplicación 4D](../settings/web.md#enable-access-to-qodly-studio).
-
-Tenga en cuenta que los [parámetros usuario](../settings/overview.md) pueden definirse en varios niveles, y que se aplican prioridades.
-
-### Activando la autenticación
-
-La autenticación en el servidor web WebAdmin se realiza utilizando una llave de acceso. Para más información, consulte [Llave de acceso](../Admin/webAdmin.md#access-key).
-
-### Desarrollo y despliegue
-
-De acuerdo con la gestión de proyectos 4D, sólo se admiten los siguientes usos:
-
-- el desarrollo con Qodly Studio debe realizarse a través de **4D** (monousuario).
-- deployment of 4D applications powered with Qodly pages must be done using **4D Server**.
-
-:::warning
-
-Puede abrir Qodly Studio, [debug](#using-qodly-debugger-on-4d-server) y editar páginas Qodly directamente en una máquina 4D Server cuando un proyecto se está ejecutando en modo interpretado. This feature is only provided for testing and debugging purposes, for example to evaluate the application flow with actual data, or in multi-user environment. NO debe considerarse como una forma habitual de desarrollar aplicaciones, ya que no ofrece ningún control sobre los accesos concurrentes.
-
-:::
-
-## Abrir Qodly Studio
-
-La página Qodly Studio está disponible cuando el [servidor web WebAdmin está en ejecución](../Admin/webAdmin.md#start-and-stop) y la autenticación está activada (ver más arriba).
-
-Hay dos formas de acceder a Qodly Studio:
-
-- by selecting the **Qodly Studio...** menu command from the **Design** menu (4D single-user) or the **Window** menu (4D Server).
- Si el servidor web WebAdmin ya está en funcionamiento, dependiendo de su configuración, su navegador por defecto se abre en `IPaddress:HTTPPort/studio` o `IPaddress:HTTPSPort/studio`. De lo contrario, se le preguntará si desea iniciar primero el servidor web WebAdmin.
-
-- on a browser, with the WebAdmin web server running (launched from 4D or 4D Server), enter the following address:
- `IPaddress:HTTPPort/studio`
-
- o:
-
- `IPaddress:HTTPSPort/studio`
-
- Por ejemplo, después de iniciar un servidor web local en el puerto 7080, escriba esta dirección en su navegador:
-
- `localhost:7080/studio`
-
- A continuación, se le pedirá que introduzca la [llave de acceso](../Admin/webAdmin.md#access-key) para acceder a Qodly Studio.
-
-## Desarrollar con Qodly Studio
-
-### Documentation
-
-The Qodly Studio documentation is available on the [Qodly documentation website](https://developer.qodly.com/docs/studio/overview).
-
-You can rely on this documentation and its associated resources for developing web applications powered by Qodly pages. Sin embargo, dependiendo de la etapa de implementación, los desarrolladores 4D utilizarán Qodly Studio o 4D IDE (ver [Comparación de funcionalidades](#comparación-de-funcionalidades)).
-
-Se ofrecen ejemplos de código en [QodlyScript](https://developer.qodly.com/docs/category/qodlyscript), pero como QodlyScript hereda del Lenguaje 4D, no se sentirá perdido. Se ofrecen ejemplos de código en [QodlyScript](https://developer.qodly.com/docs/category/qodlyscript), pero como QodlyScript hereda del Lenguaje 4D, no se sentirá perdido.
-
-:::info
-
-No existe compatibilidad directa entre las aplicaciones implementadas con 4D y las implementadas con Qodly.
-
-:::
-
-### Comparación de funcionalidades
-
-| | Qodly Studio en 4D | Qodly Studio en la plataforma Qodly Cloud |
-| -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
-| Ver y editar tablas (clases de datos), atributos y relaciones | Editor de estructura 4D(1) | Qodly Studio Model Editor |
-| Páginas Qodly | Qodly Studio Page Editor | Qodly Studio Page Editor |
-| Formularios de escritorio | 4D IDE | *not supported* |
-| Lenguaje de programación | Lenguaje 4D con ORDA | [QodlyScript](https://developer.qodly.com/docs/category/qodlyscript) con ORDA |
-| IDE de código | 4D IDE code editor *or* VS Code with [4D-Analyzer extension](https://github.com/4d/4D-Analyzer-VSCode) *4D Server únicamente*: Qodly Studio code editor (see (2)) | Editor de código Qodly Studio |
-| Depurador | 4D IDE debugger *4D Server only*: Qodly Studio debugger (see [this paragraph](#using-qodly-debugger-on-4d-server)) | Qodly Studio debugger |
-| Roles y privilegios REST/Web | Edición directa de roles.json/Editor de roles y permisos Qodly Studio | Editor de roles y privilegios de Qodly Studio |
-
-(1) El elemento **Modelo** está desactivado en Qodly Studio.
-(2) En el servidor 4D, la apertura del código 4D con el editor de código Qodly Studio es soportada **para pruebas y depuración** (ver [este párrafo](#development-and-deployment)). (1) The **Model** item is disabled in Qodly Studio.
-(2) In 4D Server, opening 4D code with the Qodly Studio code editor is supported **for testing and debugging purposes** (see [this paragraph](#development-and-deployment)).
-
-### Lenguaje
-
-Los siguientes comandos y clases están dedicados a la gestión del lado del servidor de las páginas Qodly:
-
-- Comando [`Web Form`](../API/WebFormClass.md#web-form): devuelve la página Qodly como un objeto.
-- Comando [`Web Event`](../API/WebFormClass.md#web-event): devuelve los eventos desencadenados dentro de los componentes de página ´gQodly.
-- Clase [`WebForm`](../API/WebFormClass.md): funciones y propiedades para gestionar la página Qodly renderizada.
-- clase [`WebFormItem`](../API/WebFormItemClass.md): funciones y propiedades para administrar componentes de página Qodly.
-
-### Uso métodos proyecto
-
-Recomendamos utilizar funciones clase en lugar de métodos proyecto. Sólo las funciones de clase pueden ser llamadas desde los componentes. Sin embargo, puede seguir utilizando sus métodos de proyecto en Qodly Studio de dos maneras:
-
-- Puede llamar a sus métodos desde funciones clase.
-- Puede [ejecutar sus métodos](https://developer.qodly.com/docs/studio/coding#methods-and-classes) directamente desde el Explorador Qodly.
-
-### Uso sin conexión
-
-Puede desarrollar con Qodly Studio mientras su ordenador no esté conectado a Internet. En este caso, sin embargo, las siguientes funciones no están disponibles:
-
-- [Plantillas](https://developer.qodly.com/docs/studio/pageLoaders/templates): la librería de plantillas está vacía
-- Consejos de interfaz de usuario: no se muestran al hacer clic en los iconos .
-
-## Despliegue
-
-### Activación del renderizado
-
-Qodly Studio encapsula las páginas Qodly, incluyendo el diseño, las conexiones de datos y la lógica basada en eventos, en un archivo JSON estructurado. Este archivo JSON es procesado sobre la marcha por el renderizador **Qodly** para servir una página web completamente funcional.
-
-:::info
-
-Mira [esta página](https://developer.qodly.com/docs/studio/rendering) para obtener información detallada sobre cómo renderizar págins Qodly en Qodly.
-
-:::
-
-Para habilitar el renderizado de las páginas Qodly, se deben configurar las siguientes opciones.
-
-- La opción **Configuración** > **Web** > **Funcionalidades web** > [**Exponer como servidor REST**](../configuración/web.md#expose-as-rest-server) del proyecto 4D debe estar activada.
-- El [servidor web 4D](webServer.md) debe estar ejecutándose.
-
-:::note
-
-[Los botones de renderización](https://developer.qodly.com/docs/studio/rendering#how-to-render-a-webform) no están disponibles si las opciones de configuración no están activas.
-
-:::
-
-### Alcance de los formularios Qodly
-
-Al renderizar formularios Qodly en el Qodly Studio, el renderizador se conectará al servidor web 4D a través de HTTP o HTTPS, dependiendo de la configuración, siguiendo el mismo patrón de conexión HTTP/HTTPS que para el [servidor web WebAdmin 4D](../Admin/webAdmin.md#accept-http-connections-on-localhost). Ver también [este párrafo](#about-license-usage-for-rendering) sobre los esquemas de URL y el uso de licencias.
-
-Tenga en cuenta que Qodly Studio se ejecuta a través del servidor web 4D WebAdmin. Cuando utiliza Qodly Studio como desarrollador, incluso cuando previsualiza una página Qodly en el estudio, está utilizando el servidor web 4D WebAdmin. Esto le permite ver, por ejemplo, clases de datos, funciones y atributos que no están expuestos como recursos REST (aparecen en gris).
-
-Sin embargo, el renderizado de la página ocurre fuera de Qodly Studio, y es servido por el servidor web estándar de 4D. En esta situación, su aplicación web no puede acceder a activos que no estén expuestos como recursos REST. Ver [Funciones expuestas vs no expuestas](../ORDA/ordaClasses.md#exposed-vs-non-exposed-functions) y [Exponer tablas](../REST/configuration.md#exposing-tables) para más información sobre cómo exponer activos.
-
-### Acceder a páginas Qodly
-
-Para el despliegue, el servidor WebAdmin no es necesario. El acceso del usuario final a su aplicación web realizada con Qodly Studio se basa en el protocolo 4D REST, y como tal, funciona como a través de una aplicación remota 4D convencional.
-
-Sus páginas Qodly están disponibles a través de la siguiente url:
-
-```
-IP:port/$lib/renderer/?w=QodlyPageName
-```
-
-...donde *IP:port* representa la dirección del servidor web y *QodlyPageName* es el nombre de la página Qodly.
-
-Por ejemplo:
-
-```
-https://www.myWebSite.com/$lib/renderer/?w=welcome
-```
-
-### Vista previa de la aplicación Qodly
-
-You can preview your Qodly application at any moment by selecting the **Preview Qodly Application...** command in the **Windows** menu (4D Server) or in the **Design** menu (4D single-user).
-
-Este comando lanza el renderizador de Qodly en una dirección local en su navegador por defecto y muestra la **página de inicio** [definida en la Configuración de la aplicación](https://developer.qodly.com/docs/studio/settings#start-page) de Qodly Studio.
-
-### Uso del depurador Qodly en 4D Server
-
-When using Qodly pages in a deployed 4D Server application (interpreted mode), you might encounter some cases where you need to debug your pages on the server, for example when a specific user configuration is required. In this case, you can attach the [Qodly Studio debugger](https://developer.qodly.com/docs/studio/debugging) to the 4D Server and then, benefit from its features when executing your Qodly pages.
-
-Tenga en cuenta que en este caso, el depurador Qodly Studio mostrará todo el código ejecutado en el servidor, de acuerdo con la [regla del depurador adjunta en el servidor 4D](. /Debugging/debugging-remote.md#attached-debugger).
-
-Para adjuntar el depurador Qodly Studio a su aplicación 4D Server en ejecución:
-
-1. [Abrir Qodly Studio](#opening-qodly-studio) desde 4D Server.
-
-:::note
-
-El proyecto debe ejecutarse en modo interpretado para que el elemento de menú **Qodly Studio** esté disponible.
-
-:::
-
-2. En la barra de herramientas de Qodly Studio, haga clic en el botón **Debug**.
- 
-
-Si la sesión de depuración se inicia correctamente, aparecerá una viñeta verde en la etiqueta del botón  y podrá utilizar el depurador de Qodly Studio.
-
-Si el depurador ya está conectado a otra máquina o a otra página de Qodly Studio, aparecerá un error. Hay que separarlo de antemano de la otra ubicación.
-
-Para separar el depurador Qodly Studio de su aplicación 4D Server en ejecución:
-
-1. Haga clic en el botón **Debug** de la barra de herramientas de Qodly Studio mientras esté activa una sesión de depuración.
- Una caja de diálogo de advertencia le pedirá que confirme si desea desconectar el depurador.
-2. Seleccione **Keep in progress** para continuar evaluando el código hasta el final del método o función actual antes de desconectar el depurador, o **Stop** para desconectar el depurador inmediatamente.
-
-## Forzar inicio de sesión
-
-Con Qodly Studio for 4D, el modo ["forzar login"](../REST/authUsers.md#force-login-mode) le permite controlar el número de sesiones web abiertas que requieren licencias 4D Client. También puede [cerrar la sesión](#logout) del usuario en cualquier momento para disminuir el número de licencias retenidas.
-
-### Configuración
-
-Asegúrese de que el [modo "force login"](../REST/authUsers.md#force-login-mode) esté habilitado para su aplicación 4D en la [página Roles y privilegios](https://developer.qodly.com/docs/studio/roles/rolesPrivilegesOverview), usando la opción **Force login**:
-
-
-
-También puede definir esta opción directamente en el archivo [**roles.json**](../ORDA/privileges.md#rolesjson-file).
-
-Entonces basta con implementar la función [`authentify()`](../REST/authUsers.md#function-authentify) en la clase datastore y llamarla desde la página Qodly. Una licencia se consumirá solo cuando el usuario esté realmente conectado.
-
-:::note Compatibilidad
-
-When the legacy login mode ([deprecated as of 4D 20 R6](https://blog.4d.com/force-login-becomes-default-for-all-rest-auth)) is enabled, any REST request, including the rendering of an authentication Qodly page, creates a web session on the server and gets a 4D Client license, whatever the actual result of the authentication. Para más información, consulte [esta entrada de blog](https://blog.4d.com/improved-4d-client-licenses-usage-with-qodly-studio-for-4d) que cuenta la historia completa.
-
-:::
-
-#### Ejemplo
-
-En una página simple de Qodly con entradas para login/contraseña, un botón "Enviar" llama a la siguiente función `authentify()` que hemos implementado en la clase DataStore:
-
-```4d
-
-exposed Function authentify($credentials : Object) : Text
-
-var $salesPersons : cs.SalesPersonsSelection
-var $sp : cs.SalesPersonsEntity
-
-$salesPersons:=ds.SalesPersons.query("identifier = :1"; $credentials.identifier)
-$sp:=$salesPersons.first()
-
-If ($sp#Null)
- If (Verify password hash($credentials.password; $sp.password))
-
- Session.clearPrivileges()
- Session.setPrivileges("") //sesión invitado
-
- return "Autenticación exitosa"
- Else
- return "Contraseña incorrecta"
- End if
-Else
- return "Usuario incorrecto"
-End if
-```
-
-Esta llamada es aceptada y mientras la autenticación no tenga éxito, `Session.setPrivileges()` no es llamada, por lo que no se consume ninguna licencia. Una vez que se llama a `Session.setPrivileges()`, se utiliza una licencia de cliente de 4D y luego se acepta cualquier solicitud REST.
-
-### Cerrar sesión
-
-Cuando el modo ["forzar inicio de sesión" está activado](#force-login), Qodly Studio for 4D le permite implementar una función de cierre de sesión en su aplicación.
-
-Para cerrar la sesión del usuario, solo necesita ejecutar la acción estándar **Logout** desde la página Qodly. En Qodly Studio, puede asociar esta acción estándar a un botón por ejemplo:
-
-
-
-Al desencadenar la acción de cierre de sesión de una sesión de usuario web, se producen los siguientes efectos:
-
-- la sesión de usuario web actual pierde sus privilegios, sólo se permiten [peticiones REST descriptivas](../REST/authUsers.md#descriptive-rest-requests),
-- se libera la licencia asociada de 4D,
-- el tiempo de espera de 'Session.storage' se mantiene hasta que se alcanza el tiempo de inactividad de la sesión web (al menos una hora). Durante este periodo tras un cierre de sesión, si el usuario vuelve a iniciar sesión, se utiliza la misma sesión y el objeto compartido `Session.storage` está disponible con su contenido actual.
-
-## Acerca del uso de licencias para renderización
-
-En modo predeterminado, cuando se renderiza cualquier página, o en el modo "force login" cuando se renderiza una página que maneja datos o llama a una función, debe tener una licencia disponible, ya que la renderización de los formularios Qodly apunta al servidor web principal de la base de datos del proyecto.
-
-### Esquemas URL
-
-La configuración del esquema URL de Qodly Studio (HTTP y HTTPS) determina cuántas licencias se retienen al renderizar los formularios Qodly. Con la configuración adecuada, puede evitar retener licencias innecesarias.
-
-Como se explica en la sección [configuración](#configuration), el servidor web WebAdmin ofrece un acceso web seguro a Qodly Studio. Por otro lado, el [renderizador](#enabling-rendering) se comunica con el servidor web 4D de la base de datos mediante peticiones REST. Como tal, se comporta como un Cliente 4D convencional.
-
-Si ejecuta el renderizador desde Qodly Studio y no se accede a estos dos servidores web a través del mismo esquema de URL (HTTP o HTTPS), es posible que el conteo de licencias sea incorrecto.
-
-:::info
-
-El uso de diferentes esquemas también puede llevar a problemas de [sesión](sessions.md), como perder [privilegios](../ORDA/privileges.md) después de actualizar la página.
-
-:::
-
-#### Ejemplo
-
-1. Ejecuta Qodly Studio en un esquema URL HTTPS (por ejemplo, `https://127.0.0.1:7443/studio/`)
-
-2. El servidor web de su base de datos se inicia sólo en un puerto HTTP.
-
-
-
-3. In Qodly Studio, you click on the **Preview** icon. Se le advierte que los dos servidores web se están iniciando en esquemas diferentes, pero a pesar de esto, usted hace clic en el botón **Confirm**.
-
-
-
-Como resultado, se conservan dos licencias.
-
-:::note
-
-Puede activar/desactivar la visualización de la ventana emergente del renderizador utilizando los parámetros de usuario de Qodly Studio.
-
-:::
-
-### Atributo SameSite
-
-El comportamiento descrito anteriormente se debe a la cookie de sesión del servidor web 4D. Esta cookie de sesión tiene un atributo `SameSite` que determina si la cookie de sesión se envía al servidor web.
-
-Si el valor del atributo `SameSite` es `Strict` (por defecto), la cookie de sesión no se envía al servidor web, por lo que se abre una nueva sesión cada vez que se renderiza o actualiza una página.
-
-Para más información sobre el atributo `SameSite`, consulte [esta entrada de blog](https://blog.4d.com/get-ready-for-the-new-SameSite-and-secure-attributes-for-cookies/).
-
-### Recomendaciones
-
-Para evitar utilizar más licencias de las necesarias, recomendamos hacer una de las siguientes cosas:
-
-- Ejecute el renderizador en otra pestaña del navegador (introduciendo la URL renderizada de su página Qodly: `IP:port/$lib/renderer/?w=QodlyPageName`).
-- Asegúrese de que Qodly Studio y su base de datos se alcanzan en el mismo esquema URL.
-- Utilice el valor `Lax` para la [cookie de sesión](webServerConfig.md#session-cookie-samesite) del servidor web de la base de datos de su proyecto.
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/sessions.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/sessions.md
deleted file mode 100644
index deda7906c409da..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/sessions.md
+++ /dev/null
@@ -1,478 +0,0 @@
----
-id: sessions
-title: Sesiones web
----
-
-El servidor web de 4D ofrece funciones integradas para la gestión de **sesiones web**. La creación y el mantenimiento de sesiones web le permiten controlar y mejorar la experiencia del usuario en su aplicación web. Cuando se activan las sesiones web, los clientes web pueden reutilizar el mismo contexto de servidor de una solicitud a otra.
-
-Las sesiones web permiten:
-
-- manejar múltiples peticiones simultáneamente desde el mismo cliente web a través de un número ilimitado de procesos apropiativos (las sesiones web son **escalables**),
-- gestionar la sesión a través de un objeto `Session` y la [Session API](API/SessionClass.md),
-- almacenar y compartir datos entre procesos de un cliente web utilizando el [.storage](../API/SessionClass.md#storage) de la sesión,
-- asociar privilegios al usuario que ejecuta la sesión.
-
-## Usos
-
-Las sesiones web se utilizan para:
-
-- [Aplicaciones web](gettingStarted.md) que envían peticiones http,
-- llamadas a la [REST API](../REST/authUsers.md), que utilizan [datastores remotos](../ORDA/remoteDatastores.md) y [formularios Qodly](qodly-studio.md).
-
-## Habilitando sesiones web
-
-La funcionalidad de gestión de sesiones puede ser activada y desactivada en su servidor web 4D. Hay diferentes maneras de habilitar la gestión de la sesión:
-
-- Utilizando la opción de **sesiones escalables** en la página "Web/Opciones (I)" de la Configuración (configuración permanente):
- 
-
-Esta opción está seleccionada por defecto en los nuevos proyectos. Sin embargo, se puede desactivar seleccionando la opción **Sin sesiones**, en cuyo caso las funcionalidades de la sesión web se desactivan (no hay ningún objeto `Session` disponible).
-
-- Usando la propiedad [`.scalableSession`](API/WebServerClass.md#scalablesession) del objeto Servidor Web (para pasar el parámetro *settings* de la función [`.start()`](API/WebServerClass.md#start)). En este caso, esta configuración anula la opción definida en la caja de diálogo Configuración del objeto Servidor Web (no se almacena en el disco).
-
-> El comando [`WEB SET OPTION`](../commands-legacy/web-set-option.md) también puede definir el modo de sesión para el servidor Web principal.
-
-En cualquier caso, la configuración es local para la máquina; por lo que puede ser diferente en el servidor web de 4D Server y en los servidores web de las máquinas 4D remotas.
-
-> **Compatibilidad**: una opción **Sesiones legacy** está disponible en proyectos creados con una versión de 4D anterior a 4D v18 R6 (para más información, consulte el sitio web [doc.4d.com](https://doc.4d.com)).
-
-## Implementación de la sesión
-
-When [sessions are enabled](#enabling-web-sessions), automatic mechanisms are implemented, based upon a private cookie set by 4D itself: "4DSID__AppName_", where *AppName* is the name of the application project. Esta cookie hace referencia a la sesión web actual de la aplicación.
-
-:::info
-
-El nombre de la cookie se puede obtener utilizando la propiedad [`.sessionCookieName`](API/WebServerClass.md#sessioncookiename).
-
-:::
-
-1. En cada petición del cliente web, el servidor web comprueba la presencia y el valor de la cookie privada "4DSID__AppName_".
-
-2. Si la cookie tiene un valor, 4D busca la sesión que creó esta cookie entre las sesiones existentes; si se encuentra esta sesión, se reutiliza para la llamada.
-
-3. Si la solicitud del cliente no corresponde a una sesión ya abierta:
-
-- se crea una nueva sesión con una cookie privada "4DSID__AppName_" en el servidor web
-- se crea un nuevo objeto Guest `Session` dedicado a la sesión web escalable.
-
-:::note
-
-La creación de una sesión web para una petición REST puede requerir que una licencia esté disponible, consulte [esta página](../REST/authUsers.md).
-
-:::
-
-Se puede acceder al objeto `Session` de la sesión actual a través del comando [`Session`](commands/session.md) en el código de todo proceso web.
-
-
-
-:::info
-
-Los procesos web no suelen terminar, sino que se reciclan en un fondo común para ser más eficientes. Cuando un proceso termina de ejecutar una petición, se devuelve al pool y queda disponible para la siguiente petición. Dado que un proceso web puede ser reutilizado por cualquier sesión, las [variables proceso](Concepts/variables.md#process-variables) deben ser borradas por su código al final de su ejecución (utilizando [`CLEAR VARIABLE`](../commands-legacy/clear-variable.md) por ejemplo). Esta limpieza es necesaria para cualquier información relacionada con el proceso, como una referencia a un archivo abierto. Esta es la razón por la que **se recomienda** utilizar el objeto [Sesión](API/SessionClass.md) cuando se quiera guardar información relacionada con la sesión.
-
-:::
-
-## Almacenar y compartir información de sesión
-
-Cada objeto `Session` proporciona una propiedad [`.storage`](API/SessionClass.md#storage) que es un [objeto compartido](Concepts/shared.md). Esta propiedad permite compartir información entre todos los procesos manejados por la sesión.
-
-## Fecha de caducidad de la sesión
-
-Una sesión web escalable se cierra cuando:
-
-- el servidor web está detenido,
-- se ha alcanzado el tiempo de espera de la cookie de sesión.
-
-La vida útil de una cookie inactiva es de 60 minutos por defecto, lo que significa que el servidor web cerrará automáticamente las sesiones inactivas después de 60 minutos.
-
-Este tiempo de espera puede establecerse utilizando la propiedad [`.idleTimeout`](API/SessionClass.md#idletimeout) del objeto `Session` (el tiempo de espera no puede ser inferior a 60 minutos) o el parámetro *connectionInfo* del comando [`Open datastore`](../commands/open-datastore.md).
-
-Cuando se cierra una sesión web, si después se llama al comando [`Session`](commands/session.md):
-
-- el objeto `Session` no contiene privilegios (es una sesión de invitado)
-- la propiedad [`.storage`](API/SessionClass.md#storage) está vacía
-- se asocia una nueva cookie de sesión a la sesión
-
-:::info
-
-Puede cerrar una sesión desde un formulario Qodly utilizando la función [**logout**](qodly-studio.md#logout).
-
-:::
-
-## Privilegios
-
-Fecha de caducidad de la sesión En el servidor web, puede proporcionar un acceso o unas funcionalidades específicas en función de los privilegios de la sesión.
-
-Puedes asignar privilegios utilizando la función [`.setPrivileges()`](API/SessionClass.md#setprivileges). En su código, puede comprobar los privilegios de la sesión para permitir o denegar el acceso utilizando la función [`.hasPrivilege()`](API/SessionClass.md#hasprivilege). Por defecto, las sesiones nuevas no tienen ningún privilegio: son sesiones **Invitadas** (la función [`.isGuest()`](API/SessionClass.md#isguest) devuelve true).
-
-Ejemplo:
-
-```4d
-If (Session.hasPrivilege("WebAdmin"))
- //Acceso concedido, no hacer nada
-Else
- //Mostrar una página de autenticación
-End if
-```
-
-:::info
-
-Los privilegios se implementan en el corazón de la arquitectura ORDA para proporcionar a los desarrolladores una tecnología poderosa para controlar el acceso al almacén de datos y a las funciones de la clase de datos. Para más información, consulte la página [**Privilegios**](../ORDA/privileges.md) del capítulo ORDA.
-
-:::
-
-## Ejemplo
-
-En una aplicación CRM, cada vendedor gestiona su propia cartera de clientes. El almacén de datos contiene al menos dos clases de datos vinculadas: Customers y SalesPersons (un vendedor tiene varios clientes).
-
-
-
-Queremos que un vendedor se autentique, abra una sesión en el servidor web y que se carguen los 3 primeros clientes en la sesión.
-
-1. Ejecutamos esta URL para abrir una sesión:
-
-```
-http://localhost:8044/authenticate.shtml
-```
-
-> En un entorno de producción, es necesario utilizar una conexión [HTTPS](API/WebServerClass.md#httpsenabled) para evitar que cualquier información no cifrada circule por la red.
-
-2. La página `authenticate.shtml` es un formulario que contiene los campos de entrada *userId* y *password* y envía una acción 4DACTION POST:
-
-```html
-
-
-
-
-
-
-```
-
-
-
-3. El método authenticate project busca la persona *userID* y valida la contraseña contra el valor hash ya almacenado en la tabla *SalesPersons*:
-
-```4d
-var $indexUserId; $indexPassword; $userId : Integer
-var $password : Text
-var $userTop3; $sales; $info : Object
-
-
-ARRAY TEXT($anames; 0)
-ARRAY TEXT($avalues; 0)
-
-WEB GET VARIABLES($anames; $avalues)
-
-$indexUserId:=Find in array($anames; "userId")
-$userId:=Num($avalues{$indexUserId})
-
-$indexPassword:=Find in array($anames; "password")
-$password:=$avalues{$indexPassword}
-
-$sales:=ds.SalesPersons.query("userId = :1"; $userId).first()
-
-If ($sales#Null)
- If (Verify password hash($password; $sales.password))
- $info:=New object()
- $info.userName:=$sales.firstname+" "+$sales.lastname
- Session.setPrivileges($info)
- Use (Session.storage)
- If (Session.storage.myTop3=Null)
- $userTop3:=$sales.customers.orderBy("totalPurchase desc").slice(0; 3)
-
- Session.storage.myTop3:=$userTop3
- End if
- End use
- WEB SEND HTTP REDIRECT("/authenticationOK.shtml")
- Else
- WEB SEND TEXT("This password is wrong")
- End if
-Else
- WEB SEND TEXT("This userId is unknown")
-End if
-```
-
-:::note
-
-Para más ejemplos, por favor consulte la publicación de blog [Sesiones escalables para aplicaciones web avanzadas](https://blog.4d.com/scalable-sessions-for-advanced-web-applications/).
-
-:::
-
-## Token de sesión (OTP)
-
-El servidor web 4D le permite generar, compartir y utilizar tokens de sesión OTP (One-Time Passcode). Los tokens de sesión OTP se utilizan para asegurar comunicaciones con aplicaciones de terceros o sitios web. For information on OTP, please refer to the [One-time password page](https://en.wikipedia.org/wiki/One-time_password) on Wikipedia.
-
-In 4D, OTP session tokens are useful when calling external URLs and being called back in another browser or device (mobile/computer). Typically, a third-party application sends a confirmation email containing a callback link on which the user has to click. The callback link includes the OTP token, so that the session which triggered the callback is loaded along with its data and privileges. This principle allows you to share the same session on multiple devices. Gracias a esta arquitectura, la [cookie de sesión](#session-implementation) no está expuesta en la red, lo que elimina el riesgo de un ataque de hombre en el medio.
-
-### Generalidades
-
-La secuencia básica de uso de un testigo de sesión OTP en una aplicación web 4D es la siguiente:
-
-1. El usuario web inicia una acción que requiere una conexión segura de terceros, por ejemplo una validación, desde una sesión específica.
-2. En su código 4D, crea un nuevo OTP para la sesión utilizando la función [`Session.createOTP()`](../API/SessionClass.md#createotp).
-3. Usted envía una solicitud a la aplicación de terceros con el token de sesión incluido en la retrollamda Uri. Tenga en cuenta que la forma de proporcionar la retrollamada Uri a una aplicación de terceros depende de su API (ver más adelante).
-4. La aplicación de terceros devuelve una petición a 4D con el patrón que usted proporcionó en la retrollamada Uri.
-5. La retrollamada de la petición se procesa en su aplicación.
-
-Por definición, un token OTP sólo puede utilizarse una vez. En este escenario, si se recibe una petición web con un testigo de sesión como parámetro que ya ha sido utilizado, no se restaura la sesión inicial.
-
-### Procesando el OTP en la retrollamada
-
-Las retrollamadas de aplicaciones de terceros que incluyen el token OTP pueden ser procesadas de diferentes maneras en su aplicación 4D. dependiendo de su desarrollo y de la API de terceros. Básicamente, tienes dos posibilidades para manejar el token: a través del parámetro **`$4DSID`** para un procesamiento automático, o a través de un parámetro personalizado que necesite procesar.
-
-#### Uso de `$4DSID` en la URL
-
-Utilizar el parámetro `$4DSID` es la forma más sencilla de procesar una retrollamada desde la aplicación de terceros:
-
-- El token OTP se ofrece como parámetro directamente en la url de retrollamada utilizando la sintaxis estándar `?$4DSID=XXXX123`.
-- In 4D, you implement a dedicated [HTTP Request handler](http-request-handler.md) in your 4D application using [`IncomingMessage`](../API/IncomingMessageClass.md) and [`OutgoingMessage`](../API/OutgoingMessageClass.md) classes.
-- If the `$4DSID` token is valid, the related web user session is **automatically restored** in any web process with its storage and privileges.
-
-:::note
-
-Una url [`4DACCIÓN`](./httpRequests.md#4daction) también puede ser usada en el lado 4D.
-
-:::
-
-#### Utilizar un parámetro personalizado
-
-The OTP token can also be provided as a custom parameter that you need to process specifically to restore the session. Debe utilizar esta solución si:
-
-- la aplicación de terceros no permite insertar parámetros como un `$4DSID` directamente en la Uri de redirección, y proporciona una API dedicada (la implementación depende de la aplicación de terceros),
-- o, quiere llamar a una función ORDA a través de REST para procesar la retrollamada, en cuyo caso es necesario pasar el OTP con la [sintaxis de parámetro REST](../REST/ClassFunctions.md#parameters) (por ejemplo, `?$params='["XXX123"]'`).
-
-En ambos casos, necesita extraer el token del parámetro personalizado y llamar a la función [`Session.restore()`](../API/SessionClass.md#restore) con el token como parámetro.
-
-#### Procesando un OTP inválido
-
-El token OTP se considera inválido si:
-
-- el token de sesión ya ha sido utilizado,
-- el token de sesión ha caducado,
-- el token de sesión no existe,
-- la propia sesión original ha caducado.
-
-In this case, no web user session is restored and the current session (if any) is left unchanged. Usually, you can decide to display a login page or to open a guest session.
-
-Verifying if the received OTP token is valid depends on how it was handled:
-
-- Si utilizó un `$4DSID`, puede almacenar una propiedad de estado personalizada en el [almacenamiento de sesión](../API/SessionClass.md#storage) en el momento de la creación de tokens, y compruebe este estado una vez que el token OTP fue recibido para ver si es el mismo valor (ver ejemplo).
-- Si uso la función [`Session.restore()`](../API/SessionClass.md#restore), devuelve true si la sesión se restauró correctamente.
-
-### Escenario con $4DSID
-
-The scenario using the `$4DSID` key is illustrated in the following diagram:
-
-```mermaid
-sequenceDiagram
- Actor User as User
- participant FrontEnd as Front end
- participant 4DServer as 4D Server
- participant ExternalPlatform as External platform
-
- User ->>+ FrontEnd: Validate
-
- FrontEnd ->>+ 4DServer: ValidateOperation()
-
- 4DServer ->> 4DServer: Generate OTP with session.createOTP()
-Note over 4DServer: e.g. OTP is 2E5D0D5xxx
-
- 4DServer ->>+ ExternalPlatform: Call the external platform, give a callback URL containing a $4DSID parameter (depends on the platform API)
-
- Note right of 4DServer: e.g. callback URL: "https://acme.com/my4DApp/completeOperation?$4DSID=2E5D0D5xxx"
-
- ExternalPlatform ->>+ ExternalPlatform: Process request
-ExternalPlatform ->>+ 4DServer: External platform calls back 4D Server if validation OK
-Note right of 4DServer: e.g. https://acme.com/my4DApp/completeOperation?$4DSID=2E5D0D57751D471DB29FD110D2DCE253
- 4DServer ->> 4DServer: An HTTP request handler processes the URL pattern "/my4DApp/completeOperation" (e.g. handleOperation() function of the OperationsHandler singleton, see code below)
-
- Note over 4DServer: The original session is retrieved thanks to the OTP given in the $4DSID parameter.
- Note over 4DServer: Session object refers to the session which generated the OTP
- 4DServer ->>+ FrontEnd: Restore session
-
-```
-
-La definición del gestor de peticiones HTTP de 4D:
-
-```json
-[
- {
- "class": "OperationsHandler",
- "method": "handleOperation",
- "regexPattern": "/my4DApp/completeOperation",
- "verbs": "get"
- }
-]
-```
-
-La clase singleton:
-
-```4d
-//Class OperationsHandler
-shared singleton Class constructor()
- function handleOperation($request : 4D.IncomingMessage)
- $session:=Session
-```
-
-### Escenario con función `restore`
-
-El escenario usando un parámetro personalizado se ilustra en el siguiente diagrama:
-
-```mermaid
-sequenceDiagram
- Actor User as User
- participant FrontEnd as Front end
- participant 4DServer as 4D Server
- participant ExternalPlatform as External platform
-
- User ->>+ FrontEnd: Validate
- FrontEnd ->>+ 4DServer: Validate()
-
-
- 4DServer ->> 4DServer: Generate OTP with session.createOTP()
- Note over 4DServer: e.g. OTP is 2E5D0D5xxx
-
- 4DServer ->> ExternalPlatform: Call the external platform giving the OTP, for example as a state parameter (depends on the platform)
- Note right of 4DServer: e.g. https://thirdPartSystem.com/validate?state=2E5D0D5xxx&redirect_uri=https://acme.com/my4DApp/completeOperation
- Note right of 4DServer: The callback URL will be like: https://acme.com/my4DApp/completeOperation?state=2E5D0D5xxx
- ExternalPlatform ->> ExternalPlatform: Process request
- ExternalPlatform ->> 4DServer: The state parameter is sent back by the third party system in the callback
- Note right of 4DServer: e.g. https://acme.com/my4DApp/completeOperation?state=2E5D0D5xxx
- 4DServer ->> 4DServer: An HTTP request handler processes the URL pattern "/my4DApp/completeOperation" (e.g. handleOperation() function of the OperationHandler singleton, see code below)
-
-4DServer ->> 4DServer: Session.restore()
-
-
- Note over 4DServer:The state parameter is got from the received request ($req.urlQuery.state)
- Note over 4DServer:The original session is retrieved by calling the restore() function
- Note over 4DServer:Session object refers to the session which generated the OTP
- 4DServer ->>+ FrontEnd: Restore session
-
-
-```
-
-La definición del gestor de peticiones HTTP de 4D:
-
-```json
-[
- {
- "class": "OperationsHandler",
- "method": "handleOperation",
- "regexPattern": "/my4DApp/completeOperation",
- "verbs": "get"
- }
-]
-```
-
-La clase singleton:
-
-```4d
-//Class OperationsHandler
-shared singleton Class constructor()
- Function handleOperation($req : 4D.IncomingMessage) : 4D.OutgoingMessage
- Session.restore($req.urlQuery.state)
-```
-
-### Ejemplo de validación de correo electrónico con $4DSID
-
-1. A user account is created in a *Users* dataclass. A *$info* object is received with the email and password. Se genera un OTP correspondiente a la sesión actual. A continuación, se devuelve una URL con esta OTP dada en el parámetro $4DSID.
-
-```4d
-//cs.Users class
-
-Function create($info : Object) : Text
-
-var $user : cs.UsersEntity
-var $status : Object
-var $token : Text
-
-$user:=This.new() //create a new user
-$user.fromObject($info)
-$status:=$user.save()
-
-//Store information in the session
-//including user creation status
-Use (Session.storage)
- Session.storage.status:=New shared object("step"; "Waiting for validation email"; /
- "email"; $user.email; "ID"; $user.ID)
-End use
-
-//Generate an OTP corresponding to the session
-$token:=Session.createOTP()
-
-// Return an URL with a $4DSID parameter
-return "https://my.server.com/tools/validateEmail?$4DSID="+$token`
-
-```
-
-2. Se envía al usuario esta URL como enlace en un correo electrónico. El prefijo URL `/validateEmail` es manejado por un [gestor de solicitudes HTTP personalizadas](./http-request-handler.md):
-
-```json
-[
- {
- "class": "RequestHandler",
- "method": "validateEmail",
- "regexPattern": "/validateEmail",
- "verbs": "get"
- }
-]
-```
-
-The *validateEmail()* function of the RequestHandler singleton:
-
-```4d
-//validateEmail class
-
-shared singleton Class constructor()
-
-Function validateEmail() : 4D.OutgoingMessage
-
- var $result:=4D.OutgoingMessage.new()
- //The session which generated the OTP is retrieved
- //thanks to the $4DSID parameter given in the URL
- If (Session.storage.status.step="Waiting for validation email")
-
- $user:=ds.Users.get(Session.storage.status.ID)
- $user.emailValidated() //set to true
-
- $result.setBody("Congratulations "\
- +"Your email "+Session.storage.status.email+" has been validated")
-
- $result.setHeader("Content-Type"; "text/html"
- Use (Session.storage.status)
- Session.storage.status.step:="Email validated"
- End use
- Else
- $result.setBody("Invalid token")
-
- End if
-
- return $result
-
-```
-
-Dado que el parámetro `$4DSID` contiene una OTP válida correspondiente a la sesión original, el objeto `Session` hace referencia a la sesión que creó la OTP.
-
-Se crea un nuevo usuario y se almacena cierta información en la sesión, especialmente el paso actual del proceso de creación de la cuenta de usuario (Esperando correo electrónico de validación) y el ID de usuario.
-
-### Contextos soportados
-
-- Se admiten esquemas HTTP y HTTPS.
-- Sólo [sesiones escalables](#enabling-web-sessions) pueden ser reutilizados con tokens.
-- Sólo se pueden reutilizar las sesiones de la base de datos local (las sesiones creadas en servidores web de componentes no se pueden restaurar).
-- Los tokens no son compatibles con las sesiones cliente/servidor ni con las sesiones monousuario.
-
-### Lifespan
-
-Un testigo de sesión tiene una vida útil, y la propia sesión tiene una vida útil. El tiempo de vida útil del token de sesión puede definirse [en la creación de tokens](../API/SessionClass.md#createotp). Por defecto, el tiempo de vida del token es el mismo valor que el valor de [`.idleTimeout`](../API/SessionClass.md#idletimeout).
-
-Una sesión solo se restaura mediante un token si tanto la vida útil del token de sesión como la vida útil de la sesión no han expirado. En otros casos (el testigo de sesión ha caducado y/o la propia sesión ha caducado), se crea una sesión de invitado cuando se recibe una petición web con un testigo de sesión.
-
-:::note
-
-Para obtener más información, consulte la entrada de blog [Conecte sus aplicaciones web a sistemas de terceros](https://blog.4d.com/connect-your-web-apps-to-third-party-systems/).
-
-:::
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServer.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServer.md
deleted file mode 100644
index 0362e2ccc6fca2..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServer.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-id: webServer
-slug: overview
-title: Servidor Web
----
-
-4D en modo local y remoto y 4D Server incluyen un motor de servidor web (también conocido como servidor http) que le permite diseñar y publicar poderosas aplicaciones web que pueden aprovechar al máximo sus bases de datos 4D.
-
-## Fácil de supervisar
-
-Puede iniciar o detener la publicación de la aplicación web en cualquier momento. Para ello, basta con seleccionar un comando del menú o ejecutar una sola línea de código.
-
-Supervisar el servidor web 4D es fácil y se puede hacer utilizando la ventana de administración de 4D Server o a través de [ URLs especiales](webServerAdmin.md#administration-urls).
-
-## Listo para usar
-
-El servidor web 4D crea automáticamente una carpeta raíz y una página de inicio por defecto, disponibles inmediatamente.
-
-## Seguridad
-
-La seguridad de los datos está presente en todas las etapas de las implementaciones del servidor web 4D. Los niveles de seguridad son escalables y la configuración por defecto suele seleccionar las opciones más seguras. La seguridad del servidor web 4D se basa en los elementos siguientes:
-
-- Soporte extendido del [**Protocolo TLS (HTTPS)**](../Admin/tls.md),
-
-- **Autenticación**: flexible y personalizable [funcionalidades de autenticación](authentication.md) basado en configuraciones creadas así como en métodos base de reserva ([`On Web Authentication`](authentication.md#on-web-authentication) para el servidor web y `On REST Authentication` para el servidor REST),
-
-- **Control de los contenidos expuestos**: sólo los elementos que exponga explícitamente pueden estar disponibles desde peticiones web directaso peticiones REST. Debe declarar:
- - [Los métodos proyecto](templates.md#accessing-4d-methods-via-the-web) expuestos a través de peticiones HTTP
- - [Las funciones ORDA](../ORDA/ordaClasses.md#exposed-vs-non-exposed-functions) expuestas a través de peticiones REST
- - [Tablas y campos](REST/configuration.md#exposing-tables-and-fields) que no quiere que estén disponibles para las peticiones REST.
-
-- **Sandboxing** mediante la definición de una [carpeta HTML raíz](webServerConfig.md#root-folder) por defecto,
-
-- **Control del uso de los recursos del servidor** (por ejemplo, vía la opción [máximo de procesos web concurrentes](webServerConfig.md#maximum-concurrent-web-processes)).
-
-> Para una visión general de las funciones de seguridad de 4D, consulte la [Guía de seguridad de 4D](https://blog.4d.com/4d-security-guide/).
-
-## Sesiones usuario
-
-El servidor web 4D incluye completas funcionalidades automáticas para gestionar fácilmente las [sesiones web](sessions.md) (sesiones de usuario) basadas en cookies.
-
-## Punto de acceso para las peticiones REST
-
-El servidor web 4D permite acceder a los datos almacenados en sus aplicaciones 4D a través de peticiones REST. Las peticiones REST ofrecen acceso directo a cualquier operación de la base de datos, como añadir, leer, editar, ordenar o buscar datos.
-
-Las peticiones REST se detallan en la sección [Servidor REST](REST/gettingStarted.md).
-
-## Extensión de los parámetros
-
-La configuración del servidor web 4D se define a través de un amplio conjunto de ajustes a nivel de aplicación que también pueden personalizarse para la sesión utilizando las propiedades del objeto `webServer` o el comando `WEB SET OPTION`.
-
-## Plantillas y URLs
-
-El servidor web 4D soporta el acceso a los datos almacenados en sus aplicaciones 4D a través de páginas de plantillas y URLs específicas.
-
-- Las páginas de plantillas contienen [etiquetas especiales](templates.md) que inician el procesamiento del servidor web en el momento en que se envían a los navegadores.
-
-- [Las URLs específicas](httpRequests.md) permiten llamar a 4D para ejecutar cualquier acción; estas URLs también pueden utilizarse como acciones de formulario para activar el procesamiento cuando el usuario publica formularios HTML.
-
-## Métodos base dedicados
-
-`On Web Authentication`, `On Web Connection`, así como también los métodos base`On REST Authentication` son los puntos de entrada de las peticiones en el servidor web; se pueden utilizar para evaluar y enrutar todo tipo de petición.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServerConfig.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServerConfig.md
deleted file mode 100644
index 53a74bd7541a51..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServerConfig.md
+++ /dev/null
@@ -1,631 +0,0 @@
----
-id: webServerConfig
-title: Configuración
----
-
-Los parámetros del servidor web 4D incluye parámetros de seguridad, puertos de escucha, rutas por defecto y varias opciones que cubren todas las funcionalidades del servidor. 4D ofrece valores por defecto para todos los parámetros.
-
-## ¿Dónde configurar los parámetros?
-
-Hay diferentes maneras de configurar los parámetros del servidor web 4D, en función del alcance y del servidor que se quiera configurar:
-
-| Ubicación del parámetro | Alcance | Servidor web a utilizar |
-| ------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------- | --------------------------------------------------------------------- |
-| [objeto webServer](webServerObject.md) | Temporal (sesión actual) | Todos los servidores web, incluidos los servidores web de componentes |
-| `WEB SET OPTION` o comando `WEB XXX` | Temporal (sesión actual) | Servidor principal |
-| Caja de diálogo [**Propiedades**](../settings/web.md) (**Páginas web**) | Permanente (todas las sesiones, almacenadas en el disco) | Servidor principal |
-
-> Algunos parámetros no están disponibles desde todos los lugares.
-
-## Caché
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ---------------------------------------------------------------------------------------------------------------- | ----------- |
-| Caja de diálogo de parámetros | [Página Opciones (I)/Utilizar la caché 4D Web](../settings/web.md#use-the-4d-web-cache) | |
-| Caja de diálogo de parámetros | [Página Opciones (I) /Tamaño de la caché de las páginas](../settings/web.md#pages-cache-size) | |
-
-Activa y configura la caché de las páginas web.
-
-El servidor web 4D dispone de una caché que permite cargar las páginas estáticas, las imágenes GIF, las imágenes JPEG (<512 kb) y las hojas de estilo (archivos.css) en memoria, a medida que se solicitan. El uso de la caché permite aumentar considerablemente el rendimiento del servidor web cuando se envían páginas estáticas. El caché se comparte entre todos los procesos web. Cuando la caché está activada, el servidor web de 4D busca primero en la caché toda página estática solicitada por el navegador. Si encuentra la página, la envía inmediatamente. Si no, 4D carga la página desde el disco y la coloca en la caché.
-
-Puede modificar el tamaño de la caché en el área **Tamaño de la caché de las páginas**. El valor a definir depende del número y del tamaño de las páginas estáticas de su sitio web, así como de los recursos de que dispongan las máquinas locales.
-
-> Mientras utiliza su base de datos web, puede verificar el rendimiento de la caché utilizando el comando `WEB GET STATISTICS`. Si, por ejemplo, observa que la tasa de uso de la caché se acerca al 100%, puede considerar aumentar el tamaño que se le ha asignado. Los URL [/4DSTATS] y [/4DHTMLSTATS] también permiten obtener información sobre el estado de la caché.
-
-## Carpeta de certificados
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| objeto webServer | `certificateFolder` | Propiedad texto pero puede ser un objeto [`4D.Folder`](API/FolderClass.md) cuando se usa con el parámetro *settings* de la función `start()`. |
-
-Carpeta donde se encuentran los archivos del certificado TLS para el servidor web.
-
-Por defecto con 4D o 4D Server, estos archivos deben colocarse junto a la [carpeta Project](Project/architecture.md#project-folder).
-
-Con 4D en modo remoto, estos archivos deben estar ubicados en la carpeta de recursos locales de la base de datos en la máquina remota (ver `Carpeta base 4D Client` del comando `Get 4D folder`). Debe copiar estos archivos manualmente en la máquina remota.
-
-> Los archivos de certificados TLS son *key.pem* (documento que contiene la llave de cifrado privada) y *cert.pem* (documento que contiene el certificado).
-
-## Conjunto de caracteres
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------- |
-| objeto webServer | `characterSet` | Entero MIBEnum o cadena Name |
-| `WEB SET OPTION` | `Web character set` | Entero MIBEnum o cadena Name |
-| Caja de diálogo de parámetros | [Página Opciones (II)/Conjunto estándar](../settings/web.md#standard-set) | Menú popup |
-
-Define el conjunto de caracteres que utilizará el servidor web de 4D. El valor por defecto depende del lenguaje del sistema operativo.
-
-> Esta configuración también se utiliza para generar informes rápidos en formato HTML.
-
-## Lista de cifrado
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------- | ----------- |
-| objeto webServer | [`cipherSuite`](API/WebServerClass.md#ciphersuite) | Text |
-
-Lista de cifrado utilizada para el protocolo seguro; establece la prioridad de los algoritmos de cifrado implementados por el servidor web. 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.
-
-> La lista de cifrado por defecto utilizada por 4D puede ser modificada para la sesión utilizando el comando `SET DATABASE PARAMETER`, en cuyo caso la modificación se aplica a toda la aplicación 4D, incluyendo el servidor web, el servidor SQL, las conexiones cliente/servidor, así como el cliente HTTP y todos los comandos de 4D que hacen uso del protocolo seguro.
-
-## Parámetros CORS
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| objeto webServer | [`CORSSettings`](API/WebServerClass.md#corssettings) | Colección de objetos (Lista de hosts y métodos permitidos para el servicio CORS) |
-| `WEB SET OPTION` | `Web CORS settings` | Colección de objetos (Lista de hosts y métodos permitidos para el servicio CORS) |
-| Caja de diálogo de parámetros | [Página Opciones (II)/Nombres de dominio y métodos HTTP autorizados](../settings/web.md#domain-nameshttp-methods-allowed) | Haga clic en el botón [+] para añadir un nombre de dominio permitido y su(s) método(s) |
-
-Lista de hosts y métodos permitidos para el servicio CORS.
-
-#### Nombres de dominio (propiedad local)
-
-Nombre de dominio o dirección IP desde donde las páginas externas pueden enviar solicitudes de datos al Servidor a través de CORS. Se pueden añadir múltiples atributos de dominio para crear una lista blanca. Se soportan varias sintaxis:
-
-- 192.168.5.17:8081
-- 192.168.5.17
-- 192.168.\*
-- 192.168.\*:8081
-- http://192.168.5.17:8081
-- http://\*.myDomain.com
-- http://myProject.myDomain.com
-- \*.myDomain.com
-- myProject.myDomain.com
-- \*
-
-#### Métodos HTTP autorizados (propiedad methods)
-
-Métodos HTTP aceptados para el host CORS correspondiente. Se soportan los siguientes métodos HTTP:
-
-- GET
-- HEAD
-- POST
-- PUT
-- DELETE
-- OPTIONS
-- TRACE
-- PATCH
-
-Separe cada método con un ";" (por ejemplo: "post;get"). Si methods está vacío, null o indefinido, todos los métodos están activos.
-
-#### Ver también
-
-[Activar el servicio CORS](#enable-cors-service)
-
-## Debug log
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | --------------- | ----------- |
-| objeto webServer | `debugLog` | number |
-| `WEB SET OPTION` | `Web debug log` | number |
-
-Estado del archivo de registro de peticiones HTTP del servidor web ([*HTTPDebugLog_nn.txt*](../Debugging/debugLogFiles.md#httpdebuglogtxt), almacenado en la carpeta "Logs" de la aplicación -- nn es el número de archivo). Es útil para depurar problemas relacionados con el servidor web. Registra cada solicitud y cada respuesta en modo bruto. Se registran las solicitudes completas, incluidos los encabezados; opcionalmente, también se pueden registrar las partes del cuerpo.
-
-| Valor | Constante | Descripción |
-| ----- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------- |
-| 0 | wdl disable | Los debug logs Web HTTP son desactivados |
-| 1 | wdl enable without body | Web HTTP debug log activado sin partes del cuerpo (en este caso se suministra el tamaño del cuerpo) |
-| 3 | wdl enable with response body | Web HTTP debug log activado con la partes del cuerpo únicamente |
-| 5 | wdl enable with request body | Web HTTP debug log activado con la partes del cuerpo en la petición únicamente |
-| 7 | wdl enable with all body parts | Web HTTP debug log activado con las partes del cuerpo en respuesta y petición |
-
-## Página de inicio por defecto
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------- |
-| objeto webServer | [`defaultHomepage`](API/WebServerClass.md#defaulthomepage) | Text |
-| `WEB SET HOME PAGE` | | Puede ser diferente para cada proceso web |
-| Caja de diálogo de parámetros | [Página Configuración/Página de inicio por defecto](../settings/web.md#default-home-page) | |
-
-Designa una página de inicio por defecto para el servidor web. Esta página puede ser estática o [semi-dynamic].
-
-Por defecto, cuando el servidor web se lanza por primera vez, 4D crea una página de inicio llamada "index.html" y la coloca en la carpeta raíz HTML. Si no modifica esta configuración, todo navegador que se conecte al servidor web obtendrá la siguiente página:
-
-
-
-Puede designar otra página de inicio por defecto introduciendo su nombre de ruta.
-
-- La ruta es relativa a la [carpeta HTML raíz ](#root-folder),.
-- La ruta se expresa con la sintaxis POSIX (las carpetas se separan con una barra ("/"))
-- La ruta no debe comenzar ni terminar con una barra.
-
-Por ejemplo, si quiere que la página de inicio por defecto sea "MyHome.htm", y se encuentra en la carpeta "Web" (situada a su vez en la carpeta raíz HTML por defecto), utilice "Web/MyHome.htm".
-
-Si no se especifica ninguna página de inicio por defecto, se llama al método base `On Web Connection`. Le corresponde a usted gestionar la petición de manera procesal.
-
-## Activar CORS
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
-| objeto webServer | [`CORSEnabled`](API/WebServerClass.md#corsenabled) | Booleano, true para activar CORS (False por defecto) |
-| `WEB SET OPTION` | `Web CORS enabled` | 0 (desactivado, por defecto) o 1 (activado) |
-| Caja de diálogo de parámetros | [Página Opciones (II) /Activar CORS](../settings/web.md#enable-cors) | Sin marcar por defecto |
-
-El servidor web 4D implementa el cross-origin resource sharing (CORS) para permitir que páginas web específicas servidas desde otro dominio accedan a los recursos de la aplicación web actual a través de llamadas XHR, por ejemplo, utilizando REST. Por razones de seguridad, las peticiones "cross-domain" están prohibidas por defecto a nivel del navegador. Cuando está habilitado, 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 Parámetros CORS más adelante). En este caso, si un dominio o un método no autorizado envía una petición cross-site, se rechaza con una respuesta de error "403 - prohibido".
-
-Cuando se desactiva (por defecto), se ignoran todas las peticiones cruzadas enviadas con CORS.
-
-Para más información sobre CORS, consulte la página [Cross-origin resource sharing page](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) en Wikipedia.
-
-#### Ver también
-
-[Configuración CORS](#cors-settings)
-
-## Activar HTTP
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ------------------------------------------------------------------- | ----------- |
-| objeto webServer | [`HTTPEnabled`](API/WebServerClass.md#httpenabled) | boolean |
-| `WEB SET OPTION` | `Web HTTP enabled` | |
-| Caja de diálogo de parámetros | [Página Configuración/Activar HTTP](../settings/web.md#enable-http) | |
-
-Indica si el servidor web acepta o no conexiones no seguras.
-
-## Activar HTTPS
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ---------------------------------------------------- | ----------- |
-| objeto webServer | [`HTTPSEnabled`](API/WebServerClass.md#httpsenabled) | boolean |
-| `WEB SET OPTION` | `Web HTTPS enabled` | |
-| Caja de diálogo de parámetros | Página configuración/Activar HTTPS | |
-
-Estado de la comunicación a través de HTTPS. Esta opción se describe en [esta sección](Admin/tls.md).
-
-## Activar HSTS
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------- |
-| objeto webServer | [`HSTSEnabled`](API/WebServerClass.md#hstsenabled) | Booleano, true para activar HSTS (por defecto es false) |
-| `WEB SET OPTION` | `Web HSTS enabled` | 0 (desactivado, por defecto) o 1 (activado) |
-
-Estado de HTTP Strict Transport Security (HSTS).
-
-Cuando [HTTPS está activado](#enable-https), recuerde que si [HTTP está también activado](#enable-http), el navegador puede cambiar entre HTTPS y HTTP (por ejemplo, en la zona de la URL del navegador, el usuario puede sustituir "https" por "http"). Para prohibir las redirecciones http, puede [desactivar el HTTP](#enable-http), sin embargo en este caso se muestra un mensaje de error a las peticiones HTTP del cliente.
-
-HSTS permite al servidor web 4D declarar que los navegadores sólo deben interactuar con él a través de conexiones HTTPS seguras. Una vez activado, el servidor web 4D añadirá automáticamente información relacionada con HSTS a todos los encabezadoss de las respuestas. Los navegadores registrarán la información HSTS la primera vez que reciban una respuesta del servidor web 4D, 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 el parámetro web **HSTS max age**.
-
-> HSTS requiere que [HTTPS esté activado](#enable-https) en el servidor. [El HTTP](#enable-http) también debe estar activado para permitir las conexiones iniciales del cliente.
-
-> Puede obtener el modo de conexión actual utilizando el comando `WEB Is secured connection`.
-
-## HSTS Max Age
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ------------------------------------------------ | ------------------ |
-| objeto webServer | [`HSTSMaxAge`](API/WebServerClass.md#hstsmaxage) | número en segundos |
-| `WEB SET OPTION` | `Web HSTS max age` | número en segundos |
-
-Especifica el tiempo máximo (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.
-El valor por defecto es 63072000 (2 años)
-
-> **Atención:** una vez activado HSTS, las conexiones de los clientes seguirán utilizando este mecanismo durante el tiempo especificado. Cuando esté probando sus aplicaciones, se recomienda definir una duración corta para poder cambiar entre los modos de conexión segura y no segura si es necesario.
-
-## Nivel de compresión
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------------------------- | ------------------------------------ |
-| objeto webServer | [`HTTPCompressionLevel`](API/WebServerClass.md#httpcompressionlevel) | |
-| `WEB SET OPTION` | `Web HTTP compression level` | Se aplica a la Web y al servicio Web |
-
-Nivel de compresión para todos los intercambios HTTP comprimidos para el servidor web 4D (peticiones clientes o respuestas servidor). Esta opción permite optimizar los intercambios privilegiando la velocidad de ejecución (menos compresión) o la cantidad de compresión (menos velocidad). La elección de un valor depende del tamaño y del tipo de datos intercambiados.
-
-Pase un valor de 1 a 9 donde 1 es la compresión más rápida y 9 la más alta. También puede pasar -1 para un compromiso entre velocidad y tasa de compresión. Por defecto, el nivel de compresión es 1 (compresión más rápida).
-
-## Umbral de compresión HTTP
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ---------------------------------------------------------------------------- | ----------- |
-| objeto webServer | [`HTTPCompressionThreshold`](API/WebServerClass.md#httpcompressionthreshold) | |
-| `WEB SET OPTION` | `Web HTTP compression threshold` | |
-
-En el contexto de los intercambios HTTP optimizados, un umbral de tamaño de peticiones por debajo del cual los intercambios no deben comprimirse. Este parámetro es útil para evitar la pérdida de tiempo de la máquina al comprimir los intercambios pequeños.
-
-Pasa el tamaño expresado en bytes como valor. Por defecto, el umbral de compresión está en 1024 bytes.
-
-## Puerto HTTP
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ---------------------------------------------------------------- | ----------- |
-| objeto webServer | [`HTTPPort`](API/WebServerClass.md#httpport) | number |
-| `WEB SET OPTION` | `Web port ID` | |
-| Caja de diálogo de parámetros | [Página Configuración/Puerto HTTP](../settings/web.md#http-port) | |
-
-Número de puerto IP (TCP) de escucha para HTTP. Por defecto, 4D publica una aplicación web en el puerto web HTTP normal (puerto TCP), que es el puerto 80. Si ese puerto ya es utilizado por otro servicio web, debe cambiar el puerto HTTP utilizado por 4D para esta base de datos.
-
-> En macOS, la modificación del puerto HTTP permite iniciar el servidor web 4D sin ser el usuario raíz de la máquina (ver macOS HelperTool).
-
-Desde un navegador web, es necesario incluir el número de puerto HTTP no predeterminado en la dirección que se introduce para conectarse a la aplicación web. La dirección debe tener un sufijo formado por dos puntos seguido del número de puerto. Por ejemplo, si está utilizando el puerto HTTP número 8080, especificará "123.4.567.89:8080".
-
-> **Atención**: si utiliza números de puerto TCP distintos a los predeterminados (80 para HTTP estándar y 443 para HTTPS), tenga cuidado de no utilizar números de puerto que sean predeterminados para otros servicios que pueda querer utilizar simultáneamente Por ejemplo, si también tiene previsto utilizar el protocolo FTP en su equipo servidor web, no utilice los puertos TCP 20 y 21, que son los puertos por defecto para ese protocolo. Los números de puertos inferiores a 256 están reservados para servicios conocidos y los números de puertos de 256 a 1024 están reservados para servicios específicos originados en las plataformas UNIX. Para obtener la máxima seguridad, especifique un número de puerto más allá de estos intervalos (por ejemplo, en los 2000 o 3000).
-
-Si especifica 0, 4D utilizará el número de puerto HTTP 80 por defecto.
-
-## HTTP Trace
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ---------------------------------------------- | ------------------------------------------------------- |
-| objeto webServer | [`HTTPTrace`](API/WebServerClass.md#httptrace) | Booleano, falso por defecto |
-| `WEB SET OPTION` | `Web HTTP TRACE` | Integer, 0 por defecto (desactivado) |
-
-Activación del método HTTP TRACE en el servidor web 4D. Por razones de seguridad, por defecto el servidor web 4D rechaza las peticiones HTTP TRACE con un error 405. Si es necesario, puede activar el método HTTP TRACE, en cuyo caso el servidor web 4D responde a las peticiones HTTP TRACE con la línea de petición, el encabezado y el cuerpo.
-
-## Puerto HTTPS
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ----------------------------------------------------------------- | ----------- |
-| objeto webServer | [`HTTPSPort`](API/WebServerClass.md#httpsport) | number |
-| `WEB SET OPTION` | `Web HTTPS port ID` | |
-| Caja de diálogo de parámetros | [Página Configuración/Puerto HTTP](../settings/web.md#https-port) | |
-
-Número de puerto IP de escucha para las conexiones HTTPS vía TLS. Por defecto, el valor es 443 (valor estándar). Ver también [HTTP Port](#http-port) para obtener información sobre los números de puerto.
-
-## Tiempo de espera del proceso inactivo
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ----------- |
-| objeto webServer | [`inactiveProcessTimeout`](API/WebServerClass.md#inactiveprocesstimeout) | |
-| `WEB SET OPTION` | `Web inactive process timeout` | |
-| Caja de diálogo de parámetros | [Página Opciones (I)/Tiempo de espera de proceso inactivo](../settings/web.md#inactive-process-timeout) | Cursor |
-
-Duración de vida (en minutos) de los procesos inactivos asociados con sesiones heredadas. Al final del tiempo de espera, el proceso se mata en el servidor, se llama al método base `On Web Legacy Close Session`, luego se destruye el contexto de sesión.
-
-Por defecto: 480 minutos (pase 0 para restaurar el valor por defecto)
-
-## Tiempo de espera de las sesiones inactivas
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ------------------------------------------------------------------------ | ----------- |
-| objeto webServer | [`inactiveSessionTimeout`](API/WebServerClass.md#inactivesessiontimeout) | |
-| `WEB SET OPTION` | `Web inactive session timeout` | |
-
-Duración de vida (en minutos) de las sesiones 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 (pase 0 para restaurar el valor por defecto)
-
-## Dirección IP de escucha
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ------------------------------------------------------------------ | ----------- |
-| objeto webServer | [`IPAddressToListen`](API/WebServerClass.md#ipaddresstolisten) | |
-| `WEB SET OPTION` | `Web IP address to listen` | |
-| Caja de diálogo de parámetros | [Página Configuración/Dirección IP](../settings/web.md#ip-address) | Menú popup |
-
-Dirección IP (cadenas) en la que el servidor web 4D recibirá las peticiones HTTP (4D local y 4D Server).
-
-Por defecto, no se define ninguna dirección específica (**valor ninguno** en la caja de diálogo Parámetros), lo que significa que el servidor responde a todas las direcciones IP. Cuando designa una dirección específica, el servidor sólo responde a las solicitudes enviadas a esta dirección. Esta función está diseñada para servidores web 4D ubicados en máquinas con múltiples direcciones TCP/IP. Es por ejemplo, el caso frecuente de la mayoría de los proveedores de hosting.
-
-Valores posibles: cadena de direcciones IP. Los formatos IPv6 (por ejemplo "2001:0db8:0000:0000:0000:ff00:0042:8329") y IPv4 (e.g. "123.45.67.89") son soportados.
-
-#### Acerca de la compatibilidad con IPv6
-
-- **No warning when TCP port is occupied** When the server is set to respond on "Any" IP addresses, if the TCP port is being used by another application, this is not indicated when the server is started. De hecho, el servidor 4D no detecta ningún error en este caso porque el puerto permanece libre en la dirección IPv6. Sin embargo, no es posible acceder a ella utilizando la dirección IPv4 de la máquina, ni mediante la dirección local 127.0.0.1.
-
-Si su servidor 4D no parece responder en el puerto definido, puede probar la dirección [::1] en la máquina del servidor (equivalente a 127.0.0.1 para IPv6, añada [:portNum] para probar otro número de puerto). Si 4D responde, es probable que otra aplicación esté utilizando el puerto en IPv4.
-
-- **IPv4-mapped IPv6 addresses** To standardize processing, 4D provides a standard hybrid representation of IPv4 addresses in IPv6. Estas direcciones se escriben con un prefijo de 96 bits en formato IPv6, seguido de 32 bits escritos en la notación decimal punto de IPv4. Por ejemplo, ::ffff:192.168.2.34 representa la dirección IPv4 192.168.2.34.
-
-- **Indication of port numbers** Since IPv6 notation uses colons (:), adding port numbers may lead to some confusion, for example:
-
-```code4d
- 2001:0DB8::85a3:0:ac1f:8001 // Dirección IPv6
- 2001:0DB8::85a3:0:ac1f:8001:8081 // Dirección IPv6 con puerto 8081
-```
-
-Para evitar esta confusión, se recomienda utilizar la notación [ ] siempre que se combine una dirección IPv6 con un número de puerto, por ejemplo:
-
-```code4d
-[2001:0DB8::85a3:0:ac1f:8001]:8081 //Dirección IPv6 con puerto 8081
-```
-
-## Keep Session
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------- |
-| objeto webServer | [`keepSession`](API/WebServerClass.md#keepsession) | |
-| `WEB SET OPTION` | `Web keep session` | |
-| Caja de diálogo de parámetros | [Página Opciones (I)/Sesiones heredadas (sesiones de un solo proceso)](../settings/web.md#legacy-sessions-single-process-sessions) | sólo en los proyectos convertidos |
-
-Estado de activación de la gestión de sesiones heredada para el servidor web 4D (obsoleto).
-
-> Cuando esta opción está marcada, la opción "Reutilización de los contextos temporales" se marca automáticamente (y se bloquea).
-
-## Registro de los logs
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | -------------------------------------------------------------------------- | ----------- |
-| objeto webServer | [`logRecording`](API/WebServerClass.md#logrecording) | |
-| `WEB SET OPTION` | `Web log recording` | |
-| Caja de diálogo de parámetros | [Página Historial(tipo)](../settings/web.md#log-format) | Menú popup |
-
-Inicia o detiene el registro de las peticiones recibidas por el servidor web 4D en el archivo *logweb.txt* y define su formato. Por defecto, las peticiones no se registran (0/Sin archivo de registro). Cuando se activa, el archivo *logweb.txt* se coloca automáticamente en la carpeta Logs.
-
-Este parámetro permite seleccionar el formato de este archivo. Valores disponibles:
-
-| Valor | Nombre del formato | Descripción |
-| ----- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 0 | No hay archivo de historial | Por defecto |
-| 1 | Registro en formato CLF | Formato de historial común - Cada línea del archivo representa una petición, como:`host rfc931 user [DD/MMM/YYYY:HH:MM:SS] "request" state length` - Cada campo está separado por un espacio y cada línea termina con la secuencia CR/LF. |
-| 2 | Registro en formato DLF | Combined Log Format - Similar al formato CLF, pero añade dos campos HTTP adicionales al final de cada solicitud: Referer y User-agent. |
-| 3 | Registro en formato ELF | Extended Log Format - A personalizar en la caja de diálogo de las Propiedades |
-| 4 | Registro en formato WLF | WebStar Log Format - A personalizar en la caja de diálogo de las Propiedades |
-
-> Los formatos 3 y 4 son formatos personalizados cuyo contenido debe establecerse previamente en la [caja de diálogo Parámetros](../settings/web.md#log-format). Si utiliza uno de estos formatos sin haber seleccionado ninguno de sus campos en esta página, el archivo de registro no se generará.
-
-## Procesos Web simultáneos maximos
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----------- |
-| objeto webServer | [`maxConcurrentProcesses`](API/WebServerClass.md#maxconcurrentprocesses) | |
-| `WEB SET OPTION` | `Web max concurrent processes` | |
-| Caja de diálogo de parámetros | Página [Opciones (I)/Máximo de procesos web simultáneos](../settings/web.md#maximum-concurrent-web-processes) | |
-
-Strictly high limit of concurrent web processes that can be simultaneously open on the server when **no sessions** or **legacy sessions** are used (**scalable sessions** support an [unlimited number](sessions.md) of preemptive processes). Este parámetro permite evitar la saturación del servidor como resultado de un número masivo de peticiones. Cuando se alcanza el número máximo de procesos web concurrentes (menos uno), 4D deja de crear nuevos procesos y envía el estado HTTP `503 - Servicio no disponible` a todas las nuevas peticiones.
-
-Por defecto, el valor es 100. Puede definir el número entre 10 y 32000.
-
-## Tamaño máximo de la petición
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------------- | ----------- |
-| objeto webServer | [`maxRequestSize`](API/WebServerClass.md#maxrequestsize) | |
-| `WEB SET OPTION` | `Web maximum requests size` | |
-
-Tamaño máximo (en bytes) de las peticiones HTTP entrantes (POST) que el servidor web está autorizado a procesar. Por defecto, el valor es de 2 000 000, es decir, algo menos de 2 MB. Pasar el valor máximo (2 147 483 648) significa que, en la práctica, no se define ningún límite.
-
-Este límite se utiliza para evitar la saturación del servidor web debido a peticiones entrantes demasiado grandes. Cuando una petición alcanza este límite, el servidor web 4D la rechaza.
-
-Valores posibles: 500 000 a 2 147 483 648.
-
-## Número máximo de sesiones
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------- | ----------- |
-| objeto webServer | [`maxSessions`](API/WebServerClass.md#maxsessions) | |
-| `WEB SET OPTION` | `Web max sessions` | |
-
-Número máximo de sesiones heredadas simultáneas. Cuando alcanza el límite establecido, la sesión antigua se cierra (y se llama al método base `On Web Legacy Close Session`) si el servidor web necesita crear una nueva. El número de sesiones heredadas simultáneas no puede superar el [número máximo de procesos web](#maximum-concurrent-web-processes) (100 por defecto).
-
-Valor por defecto: 100 (pase 0 para restaurar el valor por defecto).
-
-## Versión TLS mínima
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ------------------------------------------------------ | ----------- |
-| objeto webServer | [`minTLSVersion`](API/WebServerClass.md#mintlsversion) | number |
-
-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:
-
-- 1 = TLSv1_0
-- 2 = TLSv1_1
-- 3 = TLSv1_2 (por defecto)
-- 4 = TLSv1_3
-
-Valores posibles:
-
-> La versión TLS mínima utilizada por 4D puede ser modificada para la sesión utilizando el comando `SET DATABASE PARAMETER`, en cuyo caso la modificación se aplica a toda la aplicación 4D, incluyendo el servidor web, el servidor SQL y las conexiones cliente
-
-## Nombre
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ------------------------------------ | ----------- |
-| objeto webServer | [`name`](API/WebServerClass.md#name) | |
-
-Nombre de la aplicación del servidor web. Útil cuando se inician los servidores web de los componentes.
-
-## Versión OpenSSL
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------------- | ------------ |
-| objeto webServer | [`openSSLVersion`](API/WebServerClass.md#opensslversion) | Sólo lectura |
-
-Versión de la librería OpenSSL utilizada.
-
-## Perfect Forward Secrecy
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ---------------------------------------------------------------------- | ------------------------- |
-| objeto webServer | [`perfectForwardSecrecy`](API/WebServerClass.md#perfectforwardsecrecy) | Booleano, de sólo lectura |
-
-Verdadero si PFS está disponible en el servidor web (ver la sección [TLS](Admin/tls.md#perfect-forward-secrecy-pfs)).
-
-## Reutilizar los contextos temporales (en modo remoto)
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | --------------------------------------------------------------------------------------------------------------------- | ----------- |
-| Caja de diálogo de parámetros | [Página Opciones (I)/Reutilizar contextos temporales](../settings/web.md#reuse-temporary-contexts) | |
-
-> Esta opción sólo está disponible cuando la opción **Sin sesiones** está marcada.
-
-Permite optimizar el funcionamiento del Servidor Web 4D en modo remoto reutilizando los procesos web creados para procesar peticiones web anteriores. De hecho, el servidor web de 4D necesita un proceso web específico para el procesamiento de cada petición web; en modo remoto, cuando es necesario, este proceso se conecta a la máquina de 4D Server para acceder al motor de datos y de la base de datos. Así, genera un contexto temporal utilizando sus propias variables, selecciones, etc. Una vez atendida la petición, este proceso se cierra.
-
-Cuando la opción **Reutilizar los contextos temporales** está seleccionada, en modo remoto, 4D mantiene los procesos web específicos y los reutiliza para las siguientes peticiones. Al eliminar la etapa de creación del proceso, se mejora el rendimiento del servidor web.
-
-A cambio, debe asegurarse en este caso de inicializar sistemáticamente las variables utilizadas en los métodos 4D para evitar obtener resultados incorrectos. Del mismo modo, es necesario borrar las selecciones actuales o los registros definidos durante la petición anterior.
-
-> Esta opción sólo tiene efecto con un servidor web 4D en modo remoto. Con un 4D en modo local, todos los procesos web (que no sean procesos de sesión) son eliminados después de su uso.
-
-## Robots.txt
-
-Ciertos robots (motores de búsqueda, arañas...) desplazarse a través de servidores web y páginas estáticas. Si no quiere que los robots puedan acceder a todo su sitio, puede definir las URLs a las que no pueden acceder.
-
-Para ello, ponga el archivo ROBOTS. TXT en la raíz del servidor. Este archivo debe estar estructurado de la siguiente manera:
-
-```4d
- User-Agent:
- Disallow: o
-```
-
-Por ejemplo:
-
-```4d
- User-Agent: *
- Disallow: /4D
- Disallow: /%23%23
- Disallow: /GIFS/
-```
-
-- “User-Agent: \*” - todos los robots son afectados.
-- “Disallow: /4D” - Los robots no están autorizados a acceder a los URLs comenzando por/4D.
-- “Disallow: /%23%23” - Los robots no están autorizados a acceder a los URLs comenzando por/%23%23.
-- “Disallow: /GIFS/’ - Los robots no pueden acceder a la carpeta /GIFS/ ni a sus subcarpetas.
-
-Otro ejemplo:
-
-```code4d
- User-Agent: *
- Disallow: /
-```
-
-En este caso, los robots no pueden acceder a todo el sitio.
-
-## Carpeta raíz
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
-| objeto webServer | [`rootFolder`](API/WebServerClass.md#rootfolder) | Propiedad texto pero puede ser un objeto [`4D.Folder`](API/FolderClass.md) cuando se usa con el parámetro *settings* de la función `start()` |
-| `WEB SET ROOT FOLDER` | | |
-| Caja de diálogo de parámetros | [Página Configuración/Raíz HTML por defecto](../settings/web.md#default-html-root) | |
-
-Ruta de la carpeta raíz del servidor web, es decir, la carpeta en la que 4D buscará las páginas HTML estáticas y semidinámicas, imágenes, etc., para enviarlas a los navegadores. La ruta de acceso está en formato POSIX (ruta completa). Será necesario reiniciar el servidor web para que se tenga en cuenta la nueva carpeta raíz.
-
-Además, la carpeta raíz HTML define, en el disco duro del servidor web, el nivel jerárquico por encima del cual los archivos no serán accesibles. Si una URL solicitada o un comando 4D intenta acceder a un archivo situado por encima de la carpeta raíz de HTML, se devuelve un error indicando que el archivo no se ha encontrado.
-
-Por defecto, 4D define una carpeta raíz HTML llamada **WebFolder**. Si no existe, la carpeta raíz HTML se crea físicamente en el disco en el momento en que se lanza el servidor web por primera vez. Se crea la carpeta raíz:
-
-- con 4D (local) y 4D Server, en el mismo nivel de la [carpeta del proyecto](Project/architecture.md#project-folder).
-- con 4D en modo remoto, en la carpeta de recursos locales.
-
-Puede designar otra página carpeta HTML raíz por defecto introduciendo su ruta de acceso.
-
-- La ruta es relativa a la [carpeta del proyecto](Project/architecture.md#project-folder) (4D local y 4D Server) o a la carpeta que contiene la aplicación 4D o el paquete de software (4D en modo remoto).
-- La ruta se expresa con la sintaxis POSIX (las carpetas se separan con una barra ("/"))
-- Para "subir" un nivel en la jerarquía de las carpetas, introduzca "." (dos puntos) antes del nombre de la carpeta
-- La ruta no debe comenzar con una barra (excepto si quiere que la carpeta raíz HTML sea la carpeta remota del proyecto o de 4D, pero que el acceso a las carpetas anteriores esté prohibido, en cuyo caso puede pasar "/" como carpeta raíz).
-
-Por ejemplo, si quiere que la carpeta raíz HTML sea la subcarpeta "Web" de la carpeta "MyWebApp", introduzca "MyWebApp/Web".
-
-> Cuando se modifica la carpeta raíz HTML, la caché se borra para no almacenar archivos cuyo acceso está restringido.
-
-## Sesiones escalables
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
-| objeto webServer | [`scalableSession`](API/WebServerClass.md#scalablesession) | |
-| `WEB SET OPTION` | `Sesión escalable web` | |
-| Caja de diálogo de parámetros | [Página Opciones (I)/Sesiones extensible (sesiones multi-proceso)](../settings/web.md#scalable-sessions-multi-process-sessions) | |
-
-Estado de activación de la gestión de sesiones escalable para el servidor web 4D. Las sesiones del servidor web se detallan en la página [Sesiones Web](sessions.md).
-
-## Dominio de la cookie de sesión
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ------------------------------------------------------------------ | ----------- |
-| objeto webServer | [`sessionCookieDomain`](API/WebServerClass.md#sessioncookiedomain) | |
-| `WEB SET OPTION` | `Web session cookie domain` | |
-
-Campo "path" de la cookie de sesión. Utilizado 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.
-
-## Nombre de la cookie de sesión
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------------------- | ----------- |
-| objeto webServer | [`sessionCookieName`](API/WebServerClass.md#sessioncookiename) | |
-| `WEB SET OPTION` | `Web session cookie name` | |
-
-Nombre de la cookie utilizada para guardar el ID de sesión. Por defecto = "4DSID".
-
-## Ruta de la cookie de sesión
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | -------------------------------------------------------------- | ----------- |
-| objeto webServer | [`sessionCookiePath`](API/WebServerClass.md#sessioncookiepath) | |
-| `WEB SET OPTION` | `Web session cookie path` | |
-
-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.
-
-## Session Cookie SameSite
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ------------------- | ---------------------------------------------------------------------- | ----------- |
-| objeto webServer | [`sessionCookieSameSite`](API/WebServerClass.md#sessioncookiesamesite) | |
-
-Valor del atributo `SameSite` de la cookie de sesión. Este atributo le permite declarar si su cookie debe estar restringida a un contexto de primera parte o del mismo sitio, como una protección contra ciertos ataques CSRF ([cross-site request forgery](https://developer.mozilla.org/en-US/docs/Glossary/CSRF)).
-
-> Para una descripción detallada del atributo `SameSite`, consulte la [documentación de Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite) o [esta página web.dev](https://web.dev/samesite-cookies-explained/).
-
-Hay tres valores disponibles:
-
-- "Estricto" (valor predeterminado del atributo `SameSite` para las cookies de sesión de 4D): las cookies sólo se enviarán en el contexto de primera parte, es decir, el contexto correspondiente al dominio del sitio y nunca a sitios web de terceros.
-- "Lax": las cookies no se envían en las subpeticiones de sitios cruzados (por ejemplo, para cargar imágenes o marcos en un sitio de terceros), sino que se envían cuando un usuario está navegando hacia el sitio de origen (es decir, sigue un enlace).
-- "Ninguna": las cookies se envían en todos los contextos, es decir, en las respuestas a las solicitudes de primera parte y de origen cruzado. Cuando se utiliza el valor "None", el atributo cookie `Secure` también debe ser definido (o la cookie será bloqueada).
-
-El valor del atributo `Secure` de la cookie de sesión se define automáticamente en "True" si la conexión es HTTPS (sea cual sea el valor del atributo `SameSite`).
-
-> No se recomienda definir `SameSite=None` en un servidor HTTP ya que faltará el atributo `Secure` (utilizado sólo en HTTPS) y se bloquearán las cookies.
-
-## Utilizar procesos apropiativos
-
-| Puede ajustarse con | Nombre | Comentarios |
-| ----------------------------- | ---------------------------------------------------------------------------------------------------------------- | ----------- |
-| Caja de diálogo de parámetros | [Página Opciones (I)/Usar procesos apropiativos](../settings/web.md#use-preemptive-processes) | |
-
-Esta opción activa el modo apropiativo para el código del servidor web de su aplicación cuando se selecciona la opción **Sin sesiones** (el modo apropiativo siempre está activado con **sesiones escalables**). Cuando esta opción está marcada en este contexto, el compilador 4D evaluará automáticamente la propiedad hilo seguro de cada pieza de [código relacionado con la web](preemptiveWeb.md#thread-safety-of-4d-web-code) y devolverá errores en caso de incompatibi
-
-## Parámetros obsoletos
-
-Los parámetros siguientes siguen siendo compatibles, pero se basan en funcionalidades o tecnologías obsoletas. Generalmente se recomienda mantener los valores por defecto.
-
-#### Autorizar el acceso a la base de datos a través de las URL 4DSYNC
-
-Esta opción controla el soporte de las peticiones de sincronización HTTP que contienen las URLs obsoletas */4DSYNC*.
-
-#### Validación de la dirección IP de la sesión
-
-> Esta opción no está disponible en [modo sesiones evolutivas](WebServer/sessions.md) (no hay validación).
-
-Estado de validación de la dirección IP para las cookies de sesión. Por razones de seguridad, por defecto el servidor web 4D verifica 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 4G/5G, su dirección IP cambiará. En este caso, debe pasar 0 en esta opción para permitir que los clientes puedan seguir utilizando sus sesiones web aunque las direcciones IP cambien. Tenga en cuenta que este parámetro reduce el nivel de seguridad de su aplicación. Cuando se modifica, esta configuración es efectiva inmediatamente (no es necesario reiniciar el servidor HTTP).
-
-#### Enviar directamente los caracteres extendidos
-
-Cuando esta opción está marcada, el servidor web envía los caracteres extendidos "tal cual" en las páginas semidinámicas, sin convertirlos en entidades HTML. Esta opción ha demostrado un aumento de la velocidad en la mayoría de los sistemas operativos extranjeros (especialmente el sistema japonés).
-
-#### Conexiones Keep-Alive
-
-El servidor web 4D puede utilizar conexiones persistentes. La opción keep-alive permite mantener una única conexión TCP abierta para el conjunto de intercambios entre el navegador y el servidor para ahorrar recursos del sistema y optimizar las transferencias.
-
-La opción **Utilizar las conexiones persistentes** activa o desactiva las conexiones TCP persistentes para el servidor web. Esta opción está activada por defecto. En la mayoría de los casos, es aconsejable mantener esta opción marcada ya que acelera los intercambios. Si el navegador web no soporta el mantenimiento de la conexión, el servidor web 4D cambia automáticamente a HTTP/1.0.
-
-La función de conexiones persistentes del servidor web 4D afecta a todas las conexiones TCP/IP (HTTP, HTTPS). Tenga en cuenta, sin embargo, que las conexiones keep-alive no siempre se utilizan para todos los procesos web de 4D.
-
-En algunos casos, se pueden invocar otras funciones internas optimizadas. Las conexiones persistentes son útiles principalmente para las páginas estáticas.
-
-Dos opciones le permiten definir cómo funcionan las conexiones persistentes:
-
-- **Número de peticiones por conexión**: permite definir el número máximo de peticiones y de respuestas capaces de viajar por una conexión persistente. Limiting the number of requests per connection allows you to prevent server flooding due to a large number of incoming requests (a technique used by hackers).
- The default value (100) can be increased or decreased depending on the resources of the machine hosting the 4D Web Server.
-
-- **Tiempo de espera antes de desconexión**: este valor define el periodo máximo de espera (en segundos) durante el cual el servidor web mantiene una conexión TCP abierta sin recibir ninguna petición del navegador web. Una vez finalizado este periodo, el servidor cierra la conexión.
- Si el navegador web envía una solicitud después de cerrar la conexión, se crea automáticamente una nueva conexión TCP. Esta operación no es visible para el usuario.
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServerObject.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServerObject.md
deleted file mode 100644
index 2215d57311fd1f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WebServer/webServerObject.md
+++ /dev/null
@@ -1,134 +0,0 @@
----
-id: webServerObject
-title: Objeto servidor web
----
-
-Un proyecto 4D puede iniciar y monitorear un servidor web para la aplicación principal (host) así como para cada componente alojado.
-
-Por ejemplo, si ha instalado dos componentes en su aplicación principal, puede iniciar y supervisar hasta tres servidores web independientes desde su aplicación:
-
-- un servidor web para la aplicación local,
-- un servidor web para el componente #1,
-- un servidor web para el componente #2.
-
-Aparte de la memoria, no hay límite en el número de componentes y por lo tanto, de servidores web, que se pueden adjuntar a un solo proyecto de aplicación 4D.
-
-Cada servidor web 4D, incluido el servidor web de la aplicación principal, se expone como un **objeto** de la clase `4D.WebServer`. Una vez instanciado, un objeto servidor web puede ser manejado desde la aplicación actual o desde cualquier componente utilizando un [gran número de propiedades y funciones](API/WebServerClass.md).
-
-> Los [comandos WEB](../commands/theme/Web_Server.md) heredados del lenguaje 4D son soportados, pero no se puede seleccionar el servidor web al que se aplican (ver más abajo).
-
-Cada servidor web (aplicación local o componente) puede ser utilizado en su propio contexto independiente, incluyendo:
-
-- las llamadas a los métodos base `On Web Authentication` y `On Web Connection`
-- el procesamiento de las etiquetas 4D y las llamadas de métodos,
-- sesiones web y gestión del protocolo TLS.
-
-Esto le permite desarrollar componentes independientes y funcionalidades que vienen con sus propias interfaces web.
-
-## Instanciar un objeto servidor web
-
-El objeto servidor web de la aplicación local (servidor web por defecto) es cargado automáticamente por 4D en al inicio. Por lo tanto, si escribe en un proyecto recién creado:
-
-```4d
-$nbSrv:=WEB Server list.length
-//el valor de $nbSrv es 1
-```
-
-Para instanciar un objeto servidor web, llame al comando [`WEB Server`](commands/web-server.md):
-
-```4d
-//crear una variable objeto de la clase 4D.WebServer
-var webServer : 4D.WebServer
- //llamar al servidor web desde el contexto actual
-webServer:=WEB Server
-
- //equivalente a
-webServer:=WEB Server(Web server database)
-```
-
-Si la aplicación utiliza componentes y quiere llamar a:
-
-- el servidor web de la aplicación local a partir de un componente o
-- el servidor que ha recibido la solicitud (sin importar el servidor),
-
-también se puede utilizar:
-
-```4d
-var webServer : 4D.WebServer
- //llamar al servidor web local desde un componente
-webServer:=WEB Server(Web server host database)
- //llamar al servidor web objetivo
-webServer:=WEB Server(Web server receiving request)
-```
-
-## Funciones del servidor web
-
-Un [objeto de clase Web srver](API/WebServerClass.md../commands/web-server.md-object) contiene las siguientes funciones:
-
-| Funciones | Parámetros | Valor devuelto | Descripción |
-| ---------------------------------------- | ----------------------------------- | ---------------------------------- | ----------------------- |
-| [`start()`](API/WebServerClass.md#start) | settings (objet) | status (objeto) | Iniciar el servidor web |
-| [`stop()`](API/WebServerClass.md#start) | - | - | Detener el servidor Web |
-
-Para iniciar y detener un servidor web, basta con llamar a las funciones [`start()`](API/WebServerClass.md#start) y [`stop()`](API/WebServerClass.md#stop) del objeto servidor web:
-
-```4d
-var $status : Object
- //para iniciar un servidor web con los parámetros por defecto
-$status:=webServer.start()
- //para iniciar el servidor web con los parámetros personalizados
- //$settings object contains web server properties
-webServer.start($settings)
-
- //para detener el servidor web
-$status:=webServer.stop()
-```
-
-## Propiedades del servidor web
-
-Un objeto servidor web contiene [varias propiedades](API/WebServerClass.md../commands/web-server.md-object) que configuran el servidor web.
-
-Estas propiedades son definidas:
-
-1. utilizando el parámetro `settings` de la función [`.start()`](API/WebServerClass.md#start) (excepto para las propiedades de sólo lectura, ver más abajo),
-2. si no se utiliza, utilizando el comando `WEB SET OPTION` (sólo aplicaciones locales),
-3. si no se utiliza, en los parámetros de la aplicación local o del componente.
-
-- Si el servidor web no se inicia, las propiedades contienen los valores que se utilizarán en el próximo inicio del servidor web.
-- Si se inicia el servidor web, las propiedades contienen los valores reales utilizados por el servidor web (la configuración predeterminada podría haber sido anulada por el parámetro `settings` de la función [`.start()`](API/WebServerClass.md#start).
-
-> *isRunning*, *name*, *openSSLVersion*, y *perfectForwardSecrecy* son propiedades de sólo lectura que no pueden predefinirse en el parámetro del objeto `settings` para la función [`start()`](API/WebServerClass.md#start).
-
-## Alcance de los comandos 4D Web
-
-El lenguaje 4D contiene [varios comandos](../commands/theme/Web_Server.md) permitiendo controlar el servido Web. Sin embargo, estos comandos están diseñados para trabajar con un único servidor web (por defecto). Cuando utilice estos comandos en el contexto de los objetos servidor web, asegúrese de que su alcance es el adecuado.
-
-| Comando | Alcance |
-| ------------------------------- | ---------------------------------------- |
-| `SET DATABASE PARAMETER` | Aplicación local del servidor web |
-| `WEB CLOSE SESSION` | Servidor web que ha recibido la petición |
-| `WEB GET BODY PART` | Servidor web que ha recibido la petición |
-| `WEB Get body part count` | Servidor web que ha recibido la petición |
-| `WEB Get current session ID` | Servidor web que ha recibido la petición |
-| `WEB GET HTTP BODY` | Servidor web que ha recibido la petición |
-| `WEB GET HTTP HEADER` | Servidor web que ha recibido la petición |
-| `WEB GET OPTION` | Aplicación local del servidor web |
-| `WEB Get server info` | Aplicación local del servidor web |
-| `WEB GET SESSION EXPIRATION` | Servidor web que ha recibido la petición |
-| `WEB Get session process count` | Servidor web que ha recibido la petición |
-| `WEB GET STATISTICS` | Aplicación local del servidor web |
-| `WEB GET VARIABLES` | Servidor web que ha recibido la petición |
-| `WEB Is secured connection` | Servidor web que ha recibido la petición |
-| `WEB Is server running` | Aplicación local del servidor web |
-| `WEB SEND BLOB` | Servidor web que ha recibido la petición |
-| `WEB SEND FILE` | Servidor web que ha recibido la petición |
-| `WEB SEND HTTP REDIRECT` | Servidor web que ha recibido la petición |
-| `WEB SEND RAW DATA` | Servidor web que ha recibido la petición |
-| `WEB SEND TEXT` | Servidor web que ha recibido la petición |
-| `WEB SET HOME PAGE` | Aplicación local del servidor web |
-| `WEB SET HTTP HEADER` | Servidor web que ha recibido la petición |
-| `WEB SET OPTION` | Aplicación local del servidor web |
-| `WEB SET ROOT FOLDER` | Aplicación local del servidor web |
-| `WEB START SERVER` | Aplicación local del servidor web |
-| `WEB STOP SERVER` | Aplicación local del servidor web |
-| `WEB Validate digest` | Servidor web que ha recibido la petición |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-export-document.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-export-document.md
deleted file mode 100644
index 1358609f91a2c5..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-export-document.md
+++ /dev/null
@@ -1,275 +0,0 @@
----
-id: wp-export-document
-title: WP EXPORT DOCUMENT
-displayed_sidebar: docs
----
-
-**WP EXPORT DOCUMENT** ( *wpDoc* ; *filePath* {; *format* {; *option*}} ) **WP EXPORT DOCUMENT** ( *wpDoc* ; *fileObj* {; *format* {; *option*}} )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ----------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
-| wpDoc | Object | → | Variable 4D Write Pro |
-| filePath | Text | → | Ruta del archivo exportado |
-| fileObj | 4D.File | → | Objeto del archivo a exportar |
-| format | Integer | → | Formato de salida del documento (por ejemplo, .docx, .pdf, etc.) |
-| option | Object, Integer | → | Opciones de exportación, que pueden variar en función del formato elegido. |
-
-
-
-## Descripción
-
-El comando **WP EXPORT DOCUMENT** exporta el objeto *wpDoc* 4D Write Pro a un documento en disco de acuerdo con el parámetro *filePath* o *fileObj*, así como cualquier parámetro opcional.
-
-En *wpDoc*, pase el objeto 4D Write Pro que desea exportar.
-
-Puede pasar un *filePath* o *fileObj*:
-
-- En *filePath*, pase la ruta de destino y el nombre del documento a exportar. Si sólo pasa el nombre del documento, se guardará al mismo nivel que el archivo de estructura 4D.
-
-- En el parámetro *fileObj*, pase un objeto 4D.File que representa el archivo a exportar.
-
-Puede omitir el parámetro *format*, en cuyo caso deberá especificar la extensión en *filePath*. También puede pasar una constante del tema *4D Write Pro Constants* en el parámetro *format*. En este caso, 4D añade la extensión apropiada al nombre del archivo si es necesario. Se soportan los siguientes formatos:
-
-| Constante | Valor | Comentario |
-| -------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| wk 4wp | 4 | El documento 4D Write Pro se guarda en un formato de archivo nativo (HTML comprimido e imágenes guardadas en una carpeta separada). Se incluyen las etiquetas específicas 4D y no se calculan las expresiones 4D. Este formato es especialmente adecuado para guardar y archivar documentos 4D Write Pro en disco sin pérdida alguna. |
-| wk docx | 7 | Extensión .docx. El documento 4D Write Pro se guarda en formato Microsoft Word. Compatibilidad certificada con Microsoft Word 2010 y versiones posteriores.
Las partes del documento exportadas son: Cuerpo / encabezados / pies de página / seccionesPágina / configuración de impresión (márgenes, color de fondo / imagen, bordes, relleno, tamaño de papel / orientación)Imágenes - en línea, ancladas, y patrón de imagen de fondo (definido con wk background image)Variables y expresiones compatibles (número de página, número de páginas, fecha, hora, metadatos). Las variables y expresiones no compatibles serán evaluadas y congeladas antes de export.Links - BookkmarksURLsNote que algunos ajustes de 4D Write Pro pueden no estar disponibles o comportarse de forma diferente en Microsoft Word. |
-| wk mime html | 1 | El documento 4D Write Pro se guarda como HTML MIME estándar con documentos HTML e imágenes anidadas como partes MIME (codificadas en base64). Se calculan las expresiones y se eliminan las etiquetas específicas de 4D y los enlaces de métodos. Sólo se exportan los cuadros de texto anclados a la vista incrustada (como divs). Este formato es especialmente adecuado para enviar correos electrónicos HTML con el comando. |
-| wk pdf | 5 | Extensión .pdf. El documento 4D Write Pro se guarda en formato PDF, según el modo vista Página. Los siguientes metadatos se exportan en un documento PDF: Título Autor Asunto Creador del contenido **Notas**: Las expresiones se congelan automáticamente al exportar el documento Los enlaces a métodos NO se exportan |
-| wk svg | 8 | La página del documento 4D Write Pro se guarda en formato SVG, según el modo vista Página. **Nota:** al exportar a SVG, sólo puede exportar una página cada vez. Utilice el wk page index para especificar qué página exportar. |
-| wk web page complete | 2 | Extensión .htm o .html. El documento se guarda como HTML estándar y sus recursos se guardan por separado. Se eliminan las etiquetas 4D y los enlaces a métodos 4D y se calculan las expresiones. Sólo se exportan los cuadros de texto anclados a la vista incrustada (como divs). Only text boxes anchored to embedded view are exported (as divs). |
-
-**Notas:**
-
-- "Etiquetas específicas 4D" significa XHTML 4D con un espacio de nombres 4D y estilos CSS 4D.
-- Para más información sobre el formato de documento 4D Write Pro, consulte el [formato del documento .4wp](https://doc.4d.com/4Dv20/4D/20/Using-a-4D-Write-Pro-area.200-6229460.en.html#2895813).
-- Para ver una lista de las diferencias o incompatibilidades conocidas al utilizar el formato .docx, consulte [Importación y exportación en formato .docx](https://doc.4d.com/4Dv20/4D/20/Importing-and-Exporting-in-docx-format.200-6229466.en.html).
-- Para obtener más información sobre la exportación a formato SVG, consulte [Exportar a formato SVG](https://doc.4d.com/4Dv20/4D/20/Exporting-to-SVG-format.200-6229468.en.html).
-
-### Parámetro option
-
-Pase un [objeto](# "Datos estructurados como un objeto nativo 4D") en *option* conteniendo los valores para definir las propiedades del documento exportado. Las siguientes propiedades están disponibles:
-
-| Constante | Valor | Comentario |
-| ------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| wk CID host domain name | cidHostDomain | Nombre de dominio de host CID: dominio de host que se añadirá a las URL CID generadas incluyendo una "@" como separador. Disponible sólo cuando se utiliza el formato `wk mime html`. |
-| wk embedded pictures | embeddedPictures | Sólo para exportación SVG. Establece si las imágenes se incrustan en el archivo .svg exportado cuando se llama a [WP EXPORT DOCUMENT](wp-export-document.md). Valores disponibles:
true (por defecto): las imágenes están incrustadas en el archivo .svg exportado
false: las imágenes se exportan en una carpeta llamada "filename\_images" en el nivel del archivo .svg exportado, "filename" siendo el nombre pasado al comando para el archivo, sin la extensión. Las imágenes no se integran, sino que se hace referencia a ellas en el archivo .svg.
Nota: si la carpeta ya existe, se vacía antes de exportar el archivo. Si no hay ninguna imagen en la página exportada, se elimina la carpeta |
-| wk factur x | facturX | Sólo para exportación en PDF. Valor: objeto que configura una exportación PDF "Factur-X (ZUGFeRD)" (ver [wk factur x object](#wk-factur-x-object)). |
-| wk files | Histórico | Sólo para exportación en PDF. Valor: colección de objetos, cada uno de los cuales describe un archivo que se integrará en el documento final (ver [wk files collection](#wk-files-collection)). Esta funcionalidad sólo se admite en documentos PDF/A-3: cuando se utiliza el atributo `wk files`, se establece automáticamente la versión "PDF/A-3" (se ignora el atributo `wk pdfa version`). En caso de una exportación de Factur-X PDF (ver abajo), el primer objeto de la colección debe contener el archivo Factur-X xml. |
-| wk google fonts tag | googleFontsTag | Sólo para exportación SVG. Define la regla de importación para fuentes google en el SVG exportado. Valores posibles:
false (por defecto): no se añade ninguna regla de importación de google fonts.
true: añade la regla @import al archivo exportado. Useful if you want to use fonts that are not available by default on Windows or macOS.
**Note:** This property is set to false by default because when enabled, Google fonts override native fonts, and native fonts are generally better rendered in the browser. |
-| wk HTML pretty print | htmlPrettyPrint | El código HTML está formateado para facilitar su lectura. |
-| wk max picture DPI | maxPictureDPI | Se utiliza para reducir imágenes a la resolución preferida. Para imágenes SVG en Windows, utilizado para la rasterización. Valores por defecto: 300 (for wk optimized for \= wk print) 192 (for wk optimized for \= wk screen) Valor máximo posible: 1440 |
-| wk optimized for | optimizedFor | Define cómo se optimiza un documento exportado en función de su soporte. Valores posibles:
`wk print` (valor por defecto para `wk pdf` y `wk svg`) Las imágenes de mapa de bits pueden reducirse utilizando los PPP definidos por `wk max picture DPI` o 300 (valor por defecto) y pueden convertirse a PNG si el códec no es compatible con el tipo de exportación. Las imágenes vectoriales se convierten a PNG utilizando los PPP definidos por `wk max picture DPI` o 300 (sólo Windows). Si una imagen contiene más de un formato, se utiliza el mejor formato para la impresión (*por ejemplo*, .tiff en lugar de .jpg)
`wk screen` (valor por defecto para `wk web page complete` y `wk mime html`). Las imágenes de mapa de bits pueden reducirse utilizando los PPP definidos por `wk max picture DPI` o 192 (valor por defecto) y pueden convertirse a JPEG (imágenes opacas) o PNG (imágenes transparentes) si el códec no es compatible con el tipo de exportación. Las imágenes vectoriales se convierten a PNG utilizando los PPP definidos por `wk max picture DPI` o 192 (sólo Windows). If a picture contains more than one format, the format for screen rendering is used.
**Nota:** los documentos exportados en formato `wk docx` siempre se optimizan para la impresión wk (la opción wk optimized for se ignora). |
-| wk page index | pageIndex | Sólo para exportación SVG. Índice de la página a exportar a formato svg (por defecto es 1). El índice de páginas comienza en 1 para la primera página del documento. **Nota:** el índice de páginas es independiente de la numeración de páginas. |
-| wk pdfa version | pdfaVersion | Exporta PDF conforme a una versión PDF/A. Para más información sobre las propiedades y versiones de PDF/A, consulte la [página PDF/A en Wikipedia](https://en.wikipedia.org/wiki/PDF/A). Valores posibles:
`wk pdfa2`: exporta a la versión "PDF/A-2"
`wk pdfa3`: exporta a la versión "PDF/A-3"
**Nota:** en macOS, `wk pdfa2` puede exportar a PDF/A-2 o PDF/A-3 o superior, dependiendo de la implementación de la plataforma. Además, `wk pdfa3` significa "exporta a *al menos* PDF/A-3". En Windows, el archivo PDF de salida siempre será igual a la conformidad deseada. |
-| wk recompute formulas | recomputeFormulas | Define si las fórmulas deben volver a calcularse cuando se exportan. Valores posibles:
true - Valor por defecto. Se vuelven a calcular todas las fórmulas
false - No se vuelven a calcular las fórmulas
|
-| wk visible background and anchored elements | visibleBackground | Muestra o exporta imágenes/color de fondo, imágenes ancladas y cuadros de texto (para mostrar, efecto visible sólo en modo de vista Página o Anidado). Valores posibles: True/False |
-| wk visible empty images | visibleEmptyImages | Muestra o exporta un rectángulo negro por defecto para las imágenes que no se pueden cargar o calcular (imágenes vacías o imágenes en un formato no compatible). Valores posibles: True/False. Valor por defecto: True Si el valor es False, los elementos de imagen que falten no se mostrarán en absoluto aunque tengan bordes, ancho, alto o fondo; esto puede afectar al diseño de la página para imágenes en línea. |
-| wk visible footers | visibleFooters | Muestra o exporta los pies de página (para la visualización, efecto visible sólo en el modo vista Página). Valores posibles: True/False |
-| wk visible headers | visibleHeaders | Muestra o exporta los encabezados (para la visualización, efecto visible sólo en el modo vista Página). Valores posibles: True/False |
-| wk visible references | visibleReferences | Muestra o exporta todas las expresiones 4D insertadas en el documento como referencias. Valores posibles: True/False |
-| wk whitespace | whitespace | Define el valor css "white-space" para los formatos de exportación `wk mime html` y `wk web page complete`. El estilo [white-space css](https://developer.mozilla.org/en-US/docs/Web/CSS/white-space) se aplica a los párrafos. Valores posibles: "normal", "nowrap", "pre", "pre-wrap" (por defecto), "pre-line", "break-spaces". |
-
-The following table indicates the *option* available per export *format*:
-
-| | **wk 4wp** | **wk docx** | **wk mime html** | **wk pdf** | **wk web page complete** | **wk svg** |
-| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
-| wk CID host domain name | \- | \- |  | \- | \- | \- |
-| wk embedded pictures | \- | \- | \- | \- | \- |  (por defecto: true) |
-| wk factur x | \- | \- | \- |  | \- | \- |
-| wk files | \- | \- | \- |  | \- | \- |
-| wk google fonts tag | \- | \- | \- | \- | \- |  (por defecto: false) |
-| wk HTML pretty print |  (por defecto: false) | \- |  (por defecto: False) |  (por defecto: False) |  (por defecto: False) |  (por defecto: false) |
-| wk max picture DPI | \- | siempre 300 |  |  (por defecto: 300) | \- |  (por defecto: 300) |
-| wk optimized for | \- | always wk print |  (por defecto: wk screen) | always wk print | \- |  (por defecto: wk print) |
-| wk page index | \- | \- | \- | \- | \- |  (por defecto: 1) |
-| wk pdfa version | \- | \- | \- |  | \- | \- |
-| wk recompute formulas | \- |  (por defecto: true) |  (por defecto: true) |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible background and anchored elements | \- |  (por defecto: true) | siempre true |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible empty images | \- |  (por defecto: true) |  (por defecto: true) |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible footers | \- | siempre true | siempre false |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible headers | \- | siempre true | siempre false |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible references | \- | \- | \- |  (por defecto: false) | \- |  (por defecto: false) |
-| wk whitespace | \- | \- |  (por defecto: "pre-wrap") | \- |  (por defecto: "pre-wrap") | \- |
-
-**Nota de compatibilidad:** pasar un valor *largo* en *longint* es compatible por razones de compatibilidad, pero se recomienda usar un parámetro [objeto](# "Datos estructurados como un objeto nativo 4D").
-
-### colección wk files
-
-La propiedad wk files permite [exportar un PDF con archivos adjuntos](https://blog.4d.com/4d-write-pro-export-to-pdf-with-enclosures). Esta propiedad debe contener una colección de objetos que describan los archivos que se integrarán en el documento final. Cada objeto de la colección puede contener las siguientes propiedades:
-
-| **Propiedad** | **Tipo** | **Description** |
-| ------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| name | Text | Nombre de archivo. Opcional si se utiliza la propiedad *file*, en cuyo caso el nombre se infiere por defecto a partir del nombre del archivo. Obligatorio si se utiliza la propiedad *data* (excepto para el primer archivo de una exportación Factur-X, en cuyo caso el nombre del archivo es automáticamente "factur-x.xml", ver abajo) |
-| description | Text | Opcional. Si se omite, el valor por defecto para el primer archivo de exportación a Factur-X es "Factur-X/ZUGFeRD Invoice", en caso contrario vacío. |
-| mimeType | Text | Opcional. Si se omite, el valor predeterminado puede adivinarse normalmente a partir de la extensión del archivo; de lo contrario, se utiliza "application/octet-stream". Si se pasa, asegúrese de utilizar un tipo mime ISO, de lo contrario el archivo exportado podría no ser válido. |
-| data | Texto o BLOB | Obligatorio si falta la propiedad *file* |
-| file | Objeto 4D.File | Obligatorio si falta la propiedad *data*, ignorado en caso contrario. |
-| relationship | Text | Opcional. Si se omite, el valor por defecto es "Data". Valores posibles para el primer archivo Factur-X:para los perfiles BASIC, EN 16931 o EXTENDED: "Alternative", "Source" o "Data" ("Alternative" sólo para factura alemana)para perfiles MINIMUM y BASIC WL: Sólo "Data": "Alternative", "Source" o "Data" (con restricciones quizás dependiendo del país: ver la especificación del perfil para más información sobre otros perfiles - por ejemplo para el perfil RECHNUNG sólo se permite "Alternative") para otros archivos (excepto archivo Factur-X invoice): "Alternative", "Source", "Data", "Supplement" o "Unspecified" cualquier otro valor genera un error. |
-
-Si el parámetro *option* también contiene una propiedad wk factur x, entonces el primer elemento de la colección wk files debe ser el fichero xml de la factura Factur-X (ZUGFeRD) (ver más abajo).
-
-:::note
-
-Los archivos PDF adjuntos solo son compatibles con la versión PDF/A-3. Cuando pasas la propiedad wk files, la versión "PDF/A-3" se utiliza automáticamente.
-
-:::
-
-### Objeto wk factur x
-
-La propiedad wk factur x es un objeto que puede contener hasta dos propiedades:
-
-| **Propiedad** | **Tipo** | **Description** |
-| ------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| profile | Text | Opcional. Si se omite, *profile* se determina a partir del archivo xml o texto suministrado (que debe utilizar un perfil estándar). Si se pasa, puede ser un nombre de perfil no estándar (para utilizar otros perfiles, por ejemplo RECHNUNG). **Nota:* los nombres estándar de los perfiles son: MINIMUM, BASIC WL, BASIC, EN 16931 (también conocido como COMFORT, que es un alias), EXTENDED.* |
-| version | Text | Opcional. El valor por defecto es "1.0" |
-
-### Acerca de los documentos PDF de Factur-X / ZUGFeRD
-
-*Factur-X / ZUGFeRD* es una norma europea para las facturas electrónicas híbridas (PDF para usuarios y datos XML para la automatización de procesos). Para más información, lea [esta entrada del blog](https://blog.4d.com/4d-write-pro-electronic-invoice-generation).
-
-Para activar una exportación PDF "Factur-X", pase las propiedades wk factur x y wk files en el parámetro *option* (ver el ejemplo 5). En este caso:
-
-- se genera un Factur-X (ZUGFeRD) PDF,
-- el primer elemento de la colección wk files se utiliza como archivo xml Factur-X,
-- si la propiedad wk files falta o contiene una colección vacía, o si su primer elemento no es un archivo xml, se genera un error.
-
-:::note
-
-Para ver un ejemplo detallado de la implementación de la exportación Factur-X / ZUGFeRD, puede descargar [este proyecto HDI 4D](https://github.com/4d-depot/HDI%5F4DWP%5FGenerateFacturX).
-
-:::
-
-## Ejemplo 1
-
-Quiere exportar el contenido del objeto 4D Write Pro *myArea* a los formatos HTML y PDF:
-
-```4d
- // exportar HTML
- var $option : Object
- $option:=New object
-
- $option[wk recompute formulas]:=False
- $option[wk HTML pretty print]:=False
- $option[wk optimized for]:=wk print
- $option[wk max picture DPI]:=600 //reemplazar el valor por defecto para imprimir (300 DPI)
-
- WP EXPORT DOCUMENT(myArea;$path;wk web page complete;$option)
-
- //export PDF
- var $option : Object
- $option:=New object
-
- $option[wk visible headers]:=True
- $option[wk visible footers]:=True
- $option[wk visible background]:=True
- $option[wk max picture DPI]:=96 //reemplazar el valor por defecto para la pantalla (192 DPI) para limitar el tamaño del documento
- $option[wk optimized for]:=wk screen
- $option[wk recompute formulas]:=True
-
- WP EXPORT DOCUMENT(myArea;$path;wk pdf;$option)
-```
-
-## Ejemplo 2
-
-Quiere exportar el contenido del objeto 4D Write Pro *myArea* al formato .4wp:
-
-```4d
- var $path : Text
-
- Case of
- :(Form event code=On Clicked)
-
- $path:=Get 4D folder(Database folder)+"Export"+Folder separator
- $path:=Select document($path;".4wp";" title";File name entry)
-
- If($path#"")
- WP EXPORT DOCUMENT(myArea;document;wk 4wp)
- End if
- End case
-```
-
-## Ejemplo 3
-
-Para exportar la segunda página del documento como SVG y exportar las imágenes desde el documento:
-
-```4d
- var $options : Object
-
- $options:=New object
- $options[wk embedded pictures]:=False
- $options[wk page index]:=2
-
- WP EXPORT DOCUMENT(WPArea;"my exported document";wk svg;$options)
-```
-
-## Ejemplo 4
-
-Exportación de un documento PDF conforme a PDF/A-2:
-
-```4d
- var $options: Object:={}
- $options[wk visible empty images] :=False
- $options[wk pdfa version]:=wk pdfa2 // conformidad "PDF/A-2"
- WP EXPORT DOCUMENT(wpDoc;"invoice.pdf";wk pdf;$options)
-```
-
-## Ejemplo 5
-
-Ejemplos de exportación PDF de Factur-X:
-
-```4d
- //BASIC (perfil estándar)
- var $options;$fileInfo : Object
- $options:={}
- $options[wk factur x]:={}
- $options[wk factur x].profile:="BASIC"
- $options[wk factur x].version:="1.0"
-
- $fileInfo:={}
- $fileInfo.file:=$file //$file is a 4D.File with an .xml file as target
- $options[wk files]:=[$fileInfo]
-
- WP EXPORT DOCUMENT(wpDoc;"facturX_basic.pdf";wk pdf;$options)
-
- //Perfil RECHNUNG (perfil personalizado)
- $options:={}
- $options[wk factur x]:={}
- $options[wk factur x].profile:="RECHNUNG"
- $options[wk factur x].version:="2.1" //última versión para RECHNUNG
-
- $fileInfo:={}
- $fileInfo.file:=$file //$file es un 4D.File con un archivo .xml como objetivo
- $fileInfo.name:="rechnung.xml" //nombre de archivo obligatorio en PDF para RECHNUNG
- $fileInfo.relationship:="Alternative" //obligatorio para Alemania
- $fileInfo.description:="ZUGFeRD Rechnung"
- $options[wk files]:=[$fileInfo]
-
- WP EXPORT DOCUMENT(wpDoc;"facturX_rechnung.pdf";wk pdf;$options)
-```
-
-## Ejemplo 6
-
-Exportación de un documento docx mediante un objeto File:
-
-```4d
-var $file : 4D.File
-
-$file:=File("/DATA/test-export")
-
-$options:=New object(wk visible background and anchored elements; False)
-
-WP EXPORT DOCUMENT(WParea; $file; wk docx; $options)
-
-```
-
-## Ver también
-
-[4D QPDF (Component) - PDF Get attachments](https://github.com/4d/4D-QPDF)
-[Exporting to HTML and MIME HTML formats](https://doc.4d.com/4Dv20/4D/20/Exporting-to-HTML-and-MIME-HTML-formats.200-6229467.en.html)
-[Importing and Exporting in .docx format](https://doc.4d.com/4Dv20/4D/20/Importing-and-Exporting-in-docx-format.200-6229466.en.html)
-[Blog post - 4D Write Pro: Electronic invoice generation](https://blog.4d.com/4d-write-pro-electronic-invoice-generation)
-[Blog post - 4D Write Pro: Export to PDF with enclosures](https://blog.4d.com/4d-write-pro-export-to-pdf-with-enclosures)
-[WP EXPORT VARIABLE](wp-export-variable.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-export-variable.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-export-variable.md
deleted file mode 100644
index e320eeceb543ae..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-export-variable.md
+++ /dev/null
@@ -1,164 +0,0 @@
----
-id: wp-export-variable
-title: WP EXPORT VARIABLE
-slug: /WritePro/commands/wp-export-variable
-displayed_sidebar: docs
----
-
-**WP EXPORT VARIABLE** ( *wpDoc* ; *destination* ; *format* {; *option*} )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | --------------- | --------------------------- | ----------------------------------------------- |
-| wpDoc | Object | → | Variable 4D Write Pro |
-| destination | Text, Blob | → | Variable para recibir los contenidos exportados |
-| format | Integer | → | Formato de salida variable |
-| option | Object, Integer | → | Opciones de exportación |
-
-
-
-## Descripción
-
-El comando **WP EXPORT VARIABLE** exporta el objeto *wpDoc* 4D Write Pro a la variable *destination* 4D en el *format* especificado.
-
-En *wpDoc*, pase el objeto 4D Write Pro que desea exportar.
-
-En *destination*, pase la variable que quiere llenar con el objeto exportado de 4D Write Pro. El tipo de esta variable depende del formato de exportación especificado en el parámetro *format*:
-
-- Si pasa el formato .4wp nativo o el formato .docx, la variable será de tipo Blob,
-- Si pasa un formato HTML o SVG, la variable será de tipo Text.
-
-En el parámetro *format*, pase una constante del tema *4D Write Pro Constants* para definir el formato de exportación que desea utilizar. Cada formato está relacionado con un uso específico. Se soportan los siguientes formatos:
-
-| Constante | Tipo | Valor | Comentario |
-| ------------------- | ------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| wk 4wp | Integer | 4 | El documento 4D Write Pro se guarda en un formato de archivo nativo (HTML comprimido e imágenes guardadas en una carpeta separada). Se incluyen las etiquetas específicas 4D y no se calculan las expresiones 4D. Este formato es especialmente adecuado para guardar y archivar documentos 4D Write Pro en disco sin pérdida alguna. |
-| wk docx | Integer | 7 | Extensión .docx. El documento 4D Write Pro se guarda en formato Microsoft Word. Compatibilidad certificada con Microsoft Word 2010 y versiones posteriores.
Las partes del documento exportadas son: Cuerpo / encabezados / pies de página / seccionesPágina / configuración de impresión (márgenes, color de fondo / imagen, bordes, relleno, tamaño de papel / orientación)Imágenes - en línea, ancladas, y patrón de imagen de fondo (definido con wk background image)Variables y expresiones compatibles (número de página, número de páginas, fecha, hora, metadatos). Las variables y expresiones no compatibles serán evaluadas y congeladas antes de export.Links - BookkmarksURLsNote que algunos ajustes de 4D Write Pro pueden no estar disponibles o comportarse de forma diferente en Microsoft Word. |
-| wk mime html | Integer | 1 | El documento 4D Write Pro se guarda como HTML MIME estándar con documentos HTML e imágenes anidadas como partes MIME (codificadas en base64). Se calculan las expresiones y se eliminan las etiquetas específicas de 4D y los enlaces de métodos. Sólo se exportan los cuadros de texto anclados a la vista incrustada (como divs). Este formato es especialmente adecuado para enviar correos electrónicos HTML con el comando. |
-| wk pdf | Integer | 5 | Extensión .pdf. El documento 4D Write Pro se guarda en formato PDF, según el modo vista Página. Los siguientes metadatos se exportan en un documento PDF: Título Autor Asunto Creador del contenido **Notas**: Las expresiones se congelan automáticamente al exportar el documento Los enlaces a métodos NO se exportan |
-| wk svg | Integer | 8 | La página del documento 4D Write Pro se guarda en formato SVG, según el modo vista Página. **Nota:** al exportar a SVG, sólo puede exportar una página cada vez. Utilice el wk page index para especificar qué página exportar. |
-| wk web page html 4D | Integer | 3 | El documento 4D Write Pro se guarda como HTML e incluye etiquetas específicas 4D; cada expresión se inserta como un espacio inseparable. Como este formato no tiene pérdidas, es apropiado para almacenar propósitos en un campo de texto. |
-
-**Notas:**
-
-- "Etiquetas específicas 4D" significa XHTML 4D con un espacio de nombres 4D y estilos CSS 4D.
-- Para más información sobre el formato de documento 4D Write Pro, consulte el [formato del documento .4wp](https://doc.4d.com/4Dv20/4D/20/Using-a-4D-Write-Pro-area.200-6229460.en.html#2895813).
-- Para ver una lista de las diferencias o incompatibilidades conocidas al utilizar el formato .docx, consulte [Importación y exportación en formato .docx](https://doc.4d.com/4Dv20/4D/20/Importing-and-Exporting-in-docx-format.200-6229466.en.html).
-- Cuando se exporta al formato SVG con este comando, las imágenes se integran en formato base64.
-- Para obtener más información sobre la exportación a formato SVG, consulte [Exportar a formato SVG](https://doc.4d.com/4Dv20/4D/20/Exporting-to-SVG-format.200-6229468.en.html).
-
-### Parámetro option
-
-Pase un [objeto](# "Datos estructurados como un objeto nativo 4D") en *option* conteniendo los valores para definir las propiedades del documento exportado. Las siguientes propiedades están disponibles:
-
-| Constante | Valor | Comentario |
-| ------------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| wk CID host domain name | cidHostDomain | Nombre de dominio de host CID: dominio de host que se añadirá a las URL CID generadas incluyendo una "@" como separador. Disponible sólo cuando se utiliza el formato `wk mime html`. |
-| wk embedded pictures | embeddedPictures | Sólo para exportación SVG. Establece si las imágenes se incrustan en el archivo .svg exportado cuando se llama a [WP EXPORT DOCUMENT](wp-export-document.md). Valores disponibles:
true (por defecto): las imágenes están incrustadas en el archivo .svg exportado
false: las imágenes se exportan en una carpeta llamada "filename\_images" en el nivel del archivo .svg exportado, "filename" siendo el nombre pasado al comando para el archivo, sin la extensión. Las imágenes no se integran, sino que se hace referencia a ellas en el archivo .svg.
Nota: si la carpeta ya existe, se vacía antes de exportar el archivo. Si no hay ninguna imagen en la página exportada, se elimina la carpeta |
-| wk factur x | facturX | Sólo para exportación en PDF. Valor: objeto que configura una exportación PDF "Factur-X (ZUGFeRD)" (ver [wk factur x object](./wp-export-document.md#wk-factur-x-object)). |
-| wk files | Histórico | Sólo para exportación en PDF. Valor: colección de objetos, cada uno de los cuales describe un archivo que se integrará en el documento final (ver [wk files collection](./wp-export-document.md#wk-files-collection)). Esta funcionalidad sólo se admite en documentos PDF/A-3: cuando se utiliza el atributo `wk files`, se establece automáticamente la versión "PDF/A-3" (se ignora el atributo `wk pdfa version`). En caso de una exportación de Factur-X PDF (ver abajo), el primer objeto de la colección debe contener el archivo Factur-X xml. |
-| wk google fonts tag | googleFontsTag | Sólo para exportación SVG. Define la regla de importación para fuentes google en el SVG exportado. Valores posibles:
false (por defecto): no se añade ninguna regla de importación de google fonts.
true: añade la regla @import al archivo exportado. Useful if you want to use fonts that are not available by default on Windows or macOS.
**Note:** This property is set to false by default because when enabled, Google fonts override native fonts, and native fonts are generally better rendered in the browser. |
-| wk HTML pretty print | htmlPrettyPrint | El código HTML está formateado para facilitar su lectura. |
-| wk max picture DPI | maxPictureDPI | Se utiliza para reducir imágenes a la resolución preferida. Para imágenes SVG en Windows, utilizado para la rasterización. Valores por defecto: 300 (for wk optimized for \= wk print) 192 (for wk optimized for \= wk screen) Valor máximo posible: 1440 |
-| wk optimized for | optimizedFor | Define cómo se optimiza un documento exportado en función de su soporte. Valores posibles:
`wk print` (valor por defecto para `wk pdf` y `wk svg`) Las imágenes de mapa de bits pueden reducirse utilizando los PPP definidos por `wk max picture DPI` o 300 (valor por defecto) y pueden convertirse a PNG si el códec no es compatible con el tipo de exportación. Las imágenes vectoriales se convierten a PNG utilizando los PPP definidos por `wk max picture DPI` o 300 (sólo Windows). Si una imagen contiene más de un formato, se utiliza el mejor formato para la impresión (*por ejemplo*, .tiff en lugar de .jpg)
`wk screen` (valor por defecto para `wk web page complete` y `wk mime html`). Las imágenes de mapa de bits pueden reducirse utilizando los PPP definidos por `wk max picture DPI` o 192 (valor por defecto) y pueden convertirse a JPEG (imágenes opacas) o PNG (imágenes transparentes) si el códec no es compatible con el tipo de exportación. Las imágenes vectoriales se convierten a PNG utilizando los PPP definidos por `wk max picture DPI` o 192 (sólo Windows). If a picture contains more than one format, the format for screen rendering is used.
**Nota:** los documentos exportados en formato `wk docx` siempre se optimizan para la impresión wk (la opción wk optimized for se ignora). |
-| wk page index | pageIndex | Sólo para exportación SVG. Índice de la página a exportar a formato svg (por defecto es 1). El índice de páginas comienza en 1 para la primera página del documento. **Nota:** el índice de páginas es independiente de la numeración de páginas. |
-| wk pdfa version | pdfaVersion | Exporta PDF conforme a una versión PDF/A. Para más información sobre las propiedades y versiones de PDF/A, consulte la [página PDF/A en Wikipedia](https://en.wikipedia.org/wiki/PDF/A). Valores posibles:
`wk pdfa2`: exporta a la versión "PDF/A-2"
`wk pdfa3`: exporta a la versión "PDF/A-3"
**Nota:** en macOS, `wk pdfa2` puede exportar a PDF/A-2 o PDF/A-3 o superior, dependiendo de la implementación de la plataforma. Además, `wk pdfa3` significa "exporta a *al menos* PDF/A-3". En Windows, el archivo PDF de salida siempre será igual a la conformidad deseada. |
-| wk recompute formulas | recomputeFormulas | Define si las fórmulas deben volver a calcularse cuando se exportan. Valores posibles:
true - Valor por defecto. Se vuelven a calcular todas las fórmulas
false - No se vuelven a calcular las fórmulas
|
-| wk visible background and anchored elements | visibleBackground | Muestra o exporta imágenes/color de fondo, imágenes ancladas y cuadros de texto (para mostrar, efecto visible sólo en modo de vista Página o Anidado). Valores posibles: True/False |
-| wk visible empty images | visibleEmptyImages | Muestra o exporta un rectángulo negro por defecto para las imágenes que no se pueden cargar o calcular (imágenes vacías o imágenes en un formato no compatible). Valores posibles: True/False. Valor por defecto: True Si el valor es False, los elementos de imagen que falten no se mostrarán en absoluto aunque tengan bordes, ancho, alto o fondo; esto puede afectar al diseño de la página para imágenes en línea. |
-| wk visible footers | visibleFooters | Muestra o exporta los pies de página (para la visualización, efecto visible sólo en el modo vista Página). Valores posibles: True/False |
-| wk visible headers | visibleHeaders | Muestra o exporta los encabezados (para la visualización, efecto visible sólo en el modo vista Página). Valores posibles: True/False |
-| wk visible references | visibleReferences | Muestra o exporta todas las expresiones 4D insertadas en el documento como referencias. Valores posibles: True/False |
-| wk whitespace | whitespace | Define el valor css "white-space" para el formato de exportación `wk mime html`. El estilo [white-space css](https://developer.mozilla.org/en-US/docs/Web/CSS/white-space) se aplica a los párrafos. Valores posibles: "normal", "nowrap", "pre", "pre-wrap" (por defecto), "pre-line", "break-spaces". |
-
-The following table indicates the *option* available per export *format*:
-
-| | **wk 4wp** | **wk docx** | **wk mime html** | **wk pdf** | **wk web page html 4d** | **wk svg** |
-| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
-| wk CID host domain name | \- | \- |  | \- | \- | \- |
-| wk embedded pictures | \- | \- | \- | \- | \- |  (por defecto: true) |
-| wk factur x | \- | \- | \- |  | \- | \- |
-| wk files | \- | \- | \- |  | \- | \- |
-| wk google fonts tag | \- | \- | \- | \- | \- |  (por defecto: false) |
-| wk HTML pretty print |  (por defecto: false) | \- |  (por defecto: False) |  (por defecto: False) |  (por defecto: False) |  (por defecto: false) |
-| wk max picture DPI | \- | siempre 300 |  |  (por defecto: 300) | \- |  (por defecto: 300) |
-| wk optimized for | \- | always wk print |  (por defecto: wk screen) | always wk print | \- |  (por defecto: wk print) |
-| wk page index | \- | \- | \- | \- | \- |  (por defecto: 1) |
-| wk pdfa version | \- | \- | \- |  | \- | \- |
-| wk recompute formulas | \- |  (por defecto: true) |  (por defecto: true) |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible background and anchored elements | \- |  (por defecto: true) | siempre true |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible empty images | \- |  (por defecto: true) |  (por defecto: true) |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible footers | \- | siempre true | siempre false |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible headers | \- | siempre true | siempre false |  (por defecto: true) | \- |  (por defecto: true) |
-| wk visible references | \- | \- | \- |  (por defecto: false) | \- |  (por defecto: false) |
-| wk whitespace | \- | \- |  (por defecto: "pre-wrap") | \- | \- | \- |
-
-**Nota de compatibilidad:** pasar un valor *largo* en *longint* es compatible por razones de compatibilidad, pero se recomienda usar un parámetro [objeto](# "Datos estructurados como un objeto nativo 4D").
-
-## Ejemplo 1
-
-Quiere exportar el contenido del objeto *myArea* 4D Write Pro en formato MIME y añadir "gmail.com" como dominio host:
-
-```4d
- var $option;$export : Object
-
- $option[wk CID host domain name]:="gmail.com"
-
- WP EXPORT VARIABLE(myArea;$export;wk mime html;$option)
-```
-
-## Ejemplo 2
-
-Desea enviar un correo electrónico que contenga texto con estilo, referencias 4D e imágenes. Puede utilizar una zona 4D Write Pro exportada en formato MIME y enviada mediante SMTP:
-
-```4d
- // crea el transportador
- $server:=New object
- $server.host:="smtp.gmail. om"
- $server.port:=465
- $server.user:="4D@gmail.com"
- $server. assword:="XXX"
-
- $transporter:=SMTP New transporter($server)
-
- WP EXPORT VARIABLE(WParea;$mime;wk mime html)
-
- $mailTmp:=MAIL Convert from MIME($mime)
-
- // añadir imágenes (si las hay)
- If($mailTmp.attachments#Null)
- $email.attachments:=$mailTmp.attachments
- End if
-
- $email.bodyStructure:=$mailTmp.bodyStructure
- $email.bodyValues:=$mailTmp.bodyValues
-
- $status:=$transporter.send($email)
- If(Not($status.success))
- ALERT("An error occurred: "+$status.statusText)
- End if
-```
-
-## Ejemplo 3
-
-Para exportar la primera página de un 4D Write Pro como SVG en una variable Text y ocultar los encabezados:
-
-```4d
- var $options : Object
- var $destination : Text
-
- $options:=New object
- $options[wk optimized for]:=wk screen
- $options[wk visible headers]:=False
- WP EXPORT VARIABLE(WPArea;$destination;wk svg;$options)
-```
-
-## Ver también
-
-[4D QPDF (Component) - PDF Get attachments](https://github.com/4d/4D-QPDF)
-[Blog post - 4D Write Pro: Electronic invoice generation](https://blog.4d.com/4d-write-pro-electronic-invoice-generation)
-[Blog post - 4D Write Pro: Export to PDF with enclosures](https://blog.4d.com/4d-write-pro-export-to-pdf-with-enclosures)
-[Exporting to HTML and MIME HTML formats](https://doc.4d.com/4Dv20/4D/20/Exporting-to-HTML-and-MIME-HTML-formats.200-6229467.en.html)
-[Importing and Exporting in .docx format](https://doc.4d.com/4Dv20/4D/20/Importing-and-Exporting-in-docx-format.200-6229466.en.html)
-[WP EXPORT DOCUMENT](../commands/wp-export-document.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-get-attributes.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-get-attributes.md
deleted file mode 100644
index fa6360bcb95c9e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-get-attributes.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-id: wp-get-attributes
-title: WP Get attributes
-displayed_sidebar: docs
----
-
-**WP Get attributes** ( *targetObj* ; *...attribName* ; *...attribValue* ) : Object **WP Get attributes** ( *targetObj* ; *attribColl* ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ---------------------------------------------- | --------------------------- | ------------------------------------------- |
-| targetObj | Object | → | Rango o elemento o documento 4D Write Pro |
-| attribName | Text | → | Nombre del atributo a obtener |
-| attribValue | Text, Number, Array, Collection, Picture, Date | ← | Valor actual del atributo para el objetivo |
-| attribColl | Collection | → | Colección de nombres de atributos a obtener |
-| Resultado | Object | ← | Nombres y valores de los atributos |
-
-
-
-## Descripción
-
-El comando **WP Get attributes** devuelve el valor de todo atributo en un rango 4D Write Pro, encabezado, cuerpo, pie de página, tabla o documento. This command gives you access to any kind of 4D Write Pro internal attributes: character, paragraph, document, table, or image.
-
-En *targetObj*, puede pasar:
-
-- un rango, o
-- un elemento (encabezado / pie de página / cuerpo / tabla / párrafo / imagen anclada / sección / subsección / hoja de estilo), o
-- un documento 4D Write Pro
-
-En *attribName*, pase el nombre del atributo a recuperar.
-
-También puede pasar una colección de nombres de atributos en *attribColl*, en cuyo caso el comando devolverá un objeto que contiene los nombres de atributos pasados en *attribColl* junto con sus valores correspondientes.
-
-Para obtener una lista completa de los atributos a pasar, así como su alcance y valores, consulte la sección [Atributos 4D Write Pro](../4d-write-pro-attributes).
-
-Si hay diferentes valores para el mismo atributo en el elemento pasado como parámetro, el comando regresa:
-
-- para valores numéricos, wk mixed
-- para los arrays, se devuelve un array vacío (tabulación, color si *attribValue* se definió como un array), con una excepción para wk text shadow offset para el que el valor del array siempre contendrá 2 entradas que pueden definirse por separado a wk mixed si se mezclan el desplazamiento horizontal o el desplazamiento vertical (o ambos).
-- para valores cadena, una cadena vacía
-- para valores imagen, una imagen vacía.
-
-**Nota**: si *targetObj* contiene una hoja de estilo de párrafo y otra de caracter, se devuelve el nombre de la hoja de estilo de párrafo.
-
-## Ejemplo 1
-
-Desea obtener el color de fondo del área seleccionada:
-
-```4d
- $range:=WP Selection range(*;"WParea")
- WP Get attributes($range;wk background color;$bcol)
-```
-
-## Ejemplo 2
-
-Desea obtener el tamaño de la fuente, el color de fondo y el estilo del borde del área seleccionada utilizando una colección:
-
-```4d
- $range:=WP Selection range(*;"WParea")
- $collection:=New collection(wk font size; wk background color; wk border style)
- $attributes:=WP Get attributes($range; $collection)
-
-```
-
-## Ver también
-
-[4D Write Pro Attributes](../4d-write-pro-attributes)
-[WP RESET ATTRIBUTES](../commands/wp-reset-attributes.md)
-[WP SET ATTRIBUTES](wp-set-attributes.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-insert-formula.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-insert-formula.md
deleted file mode 100644
index aabd860a7a9bec..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-insert-formula.md
+++ /dev/null
@@ -1,140 +0,0 @@
----
-id: wp-insert-formula
-title: WP Insert formula
-displayed_sidebar: docs
----
-
-**WP Insert formula** ( *targetObj* ; *formula* ; *mode* {; *rangeUpdate*} ): Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ------ | --------------------------- | ------------------------------------------------------------------ |
-| targetObj | Object | → | Rango o elemento o documento 4D Write Pro |
-| formula | Object | → | Objeto de fórmula U Objeto con propiedades de fórmula y de nombre |
-| mode | Number | → | Modo de inserción |
-| rangeUpdate | Number | → | Incluye o excluye el contenido insertado dentro del intervalo |
-| Resultado | Object | ← | Objeto de rango de texto que representa el resultado de la fórmula |
-
-
-
-## Descripción
-
-El comando **WP Insert formula** inserta una *formula* en *targetObj* de acuerdo con el *mode* de inserción especificado y devuelve el rango de texto resultante.
-
-En el parámetro *targetObj*, puede pasar:
-
-- un rango, o
-- un elemento (tabla / línea / celda(s) / párrafo / cuerpo / encabezado / pie / sección / subsección / imagen en línea), o bien
-- un documento 4D Write Pro.
-
-En el parámetro *formula*, pase la fórmula 4D a evaluar. Puede pasar:
-
-- o un [objeto de la fórmula](../../commands/formula.md-objects) creado por el comando [**Formula**](../../commands/formula.md) o [**Formula from string**](../../commands/formula.md-from-string),
-- o un objeto que contiene dos propiedades:
-
-| **Propiedad** | **Tipo** | **Description** |
-| ------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| name | Text | Nombre que se mostrará para la fórmula en el documento |
-| formula | Object | El [objeto de la fórmula](../../commands/formula.md-objects) creado por el comando [**Formula**](../../commands/formula.md) o [**Formula from string**](../../commands/formula.md-from-string), |
-
-Cuando se utiliza un objeto con una fórmula *name*, este nombre se muestra en el documento en lugar de la referencia de fórmula cuando las fórmulas se muestran como referencia, y en el consejo de fórmula cuando se muestran como valor o símbolos. Si la propiedad *name* contiene una cadena vacía o se omite, se elimina del objeto y la fórmula se muestra por defecto. Para más información, vea la página [Gestión de formulas](../managing-formulas.md).
-
-En el parámetro *mode*, pase una de las siguientes constantes para indicar el modo de inserción que se va a utilizar:
-
-| Constante | Tipo | Valor | Comentario |
-| ---------- | ------- | ----- | ----------------------------------------------- |
-| wk append | Integer | 2 | Insertar el contenido al final del objetivo |
-| wk prepend | Integer | 1 | Insertar el contenido al principio del objetivo |
-| wk replace | Integer | 0 | Sustituir contenido de destino |
-
-- Si *targetObj* es un rango, puede utilizar el parámetro opcional *rangeUpdate* para pasar una de las siguientes constantes para especificar si la *formula* insertada se incluye o no en el rango resultante:
-
-| Constante | Tipo | Valor | Comentario |
-| --------------------- | ------- | ----- | ------------------------------------------------------------------------------------- |
-| wk exclude from range | Integer | 1 | Contenido insertado no incluido en el rango actualizado |
-| wk include in range | Integer | 0 | Contenido insertado incluido en el rango actualizado (por defecto) |
-
-Si no pasa un parámetro *rangeUpdate*, por defecto la *formula* insertada se incluye en el rango resultante.
-
-- Si *targetObj* no es un rango, *rangeUpdate* se ignora.
-
-:::note
-
-Tenga en cuenta que, cuando se llama, el objeto fórmula se evalúa dentro del contexto de la base de datos o del componente que lo creó.
-
-:::
-
-## Ejemplo 1
-
-Para reemplazar todas las fórmulas de fecha actuales con cadenas formateadas:
-
-```4d
- var $_formulas : Collection
- var $find;$newFormula : Object
-
- // definir la fórmula a buscar
- $find:=Formula(Current date)
-
- // definir la fórmula de sustitución
- $newFormula:=Formula(String(Current date;System date long))
-
- // encontrar todas las fórmulas en el documento
- $_formulas:=WP Get formulas(WriteProArea)
-
- // consultar la colección desde WP Get formulas
- $_formulas:=$_formulas.query("formula.source =:1";$find.source)
-
- // luego reemplazar cada fórmula
- For each($formula;$_formulas)
- WP Insert formula($formula.range;$newFormula;wk replace)
- End for each
-```
-
-## Ejemplo 2
-
-Desea utilizar un nombre de fórmula para el nombre del cliente:
-
-```4d
- //añade algunos datos
- $data:=New object("customer";New object("lastname";"Smith";"firstname";"John"))
- WP SET DATA CONTEXT(WPArea;$data)
-
- //crea un objeto fórmula con un nombre
- $o:=New object
- $o.formula:=Formula(This.data.customer.firstname+" "+This.data.customer.lastname)
- $o.name:="Customer name"
-
- //inserta como texto
- $range:=WP Text range(WPArea;wk start text;wk end text)
- WP SET TEXT($range;"Dear ";wk append)
- WP Insert formula($range;$o;wk append)
-```
-
-Resultado:
-
-
-
-## Ejemplo 3
-
-Desea resaltar una fórmula en amarillo:
-
-```4d
-WParea:=WP New
-WP SET TEXT(WParea; "The project was completed on: "; wk append)
-$range1:=WP Insert formula(WParea; Formula(Current date); wk append)
-
-WP SET ATTRIBUTES($range1; wk background color; "yellow")
-
-```
-
-Resultado:
-
-
-
-## Ver también
-
-*Managing formulas*\
-[WP COMPUTE FORMULAS](../commands-legacy/wp-compute-formulas.md)
-[WP FREEZE FORMULAS](../commands-legacy/wp-freeze-formulas.md)
-[WP Get formulas](../commands-legacy/wp-get-formulas.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-reset-attributes.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-reset-attributes.md
deleted file mode 100644
index e3c95cabba2413..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-reset-attributes.md
+++ /dev/null
@@ -1,89 +0,0 @@
----
-id: wp-reset-attributes
-title: WP RESET ATTRIBUTES
-displayed_sidebar: docs
----
-
-**WP RESET ATTRIBUTES** ( *targetObj* ; *...attribName* ) **WP RESET ATTRIBUTES** ( *sectionOrSubsection* {; *...attribName* }) **WP RESET ATTRIBUTES** ( *targetObj* ; *attribColl* ) **WP RESET ATTRIBUTES** ( *sectionOrSubsection* {; *attribColl*})
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ------------------- | ---------- | --------------------------- | --------------------------------------------------- |
-| targetObj | Object | → | Rango o elemento o documento 4D Write Pro |
-| sectionOrSubsection | Object | → | Sección o subsección de un documento 4D Write Pro |
-| attribName | Text | → | Nombre de atributo(s) a eliminar |
-| attribColl | Collection | → | Colección de atributos a eliminar |
-
-
-
-## Descripción
-
-El comando **WP RESET ATTRIBUTES** le permite restablecer el valor de uno o más atributos en el rango, elemento o documento pasado como parámetro. This command can remove any kind of 4D Write Pro internal attribute: character, paragraph, document, table, or image. Puede pasar el nombre del atributo a restablecer en *attribName* o puede pasar una colección de atributos en *attribColl* para restablecer varios atributos a la vez.
-
-> En el caso de una sección o subsección, el objeto *sectionOrSubsection* puede pasarse solo y todos los atributos se restablecen a la vez.
-
-En el parámetro *targetObj*, puede pasar cualquiera de los dos:
-
-- un rango, o
-- un elemento (encabezado / pie de página / cuerpo / tabla / párrafo / imagen anclada / sección / subsección / hoja de estilo), o
-- un documento 4D Write Pro
-
-Cuando se elimina un valor de atributo mediante el comando **WP RESET ATTRIBUTES**, se aplica el valor por defecto a *targetObj* o *sectionOrSubsection*. Los valores por defecto aparecen en la sección [4D Write Pro Attributes](../4d-write-pro-attributes).
-
-:::note Notas
-
-- Cuando se aplica **WP RESET ATTRIBUTES** a un objeto sección/subsección, los atributos se heredan de la sección o documento padre.
-- Cuando se aplica **WP RESET ATTRIBUTES** a un objeto de hoja de estilo, los atributos se eliminan de la hoja de estilo a menos que sea la hoja de estilo por defecto ("Normal"). En este caso, se aplica al atributo el valor por defecto (la hoja de estilo "Normal" define todos los atributos de la hoja de estilo).
-- Cuando *sectionOrSubsection* no es una sección ni una subsección y no se proporciona ningún atributo, se produce un error.
-
-:::
-
-Si el atributo a restablecer no estaba definido en el elemento pasado como parámetro, el comando no hace nada.
-
-## Ejemplo 1
-
-Desea eliminar varios atributos de la siguiente selección:
-
-
-
-Puede ejecutar:
-
-```4d
- $range:=WP Get selection(*;"WParea")
- WP RESET ATTRIBUTES($range;wk padding)
- WP RESET ATTRIBUTES($range;wk background color)
- WP RESET ATTRIBUTES($range;wk text underline style)
- WP RESET ATTRIBUTES($range;wk margin)
- WP RESET ATTRIBUTES($range;wk border style)
-```
-
-El documento resultante es:
-
-
-
-## Ejemplo 2
-
-Desea eliminar varios atributos utilizando una colección:
-
-```4d
-$myRange:=WP Get selection(*;"WParea")
-$myCollection:=New collection(wk font size; wk background color; wk border style)
-WP RESET ATTRIBUTES($myRange; $myCollection)
-
-```
-
-## Ejemplo 3
-
-```4d
-$section:=WP Get section($document; 3)
-WP RESET ATTRIBUTES($section) // Se eliminan todos los atributos de la sección
-$subSection:=WP Get subsection(WP Get section($document; 3); wk left page)
-WP RESET ATTRIBUTES($subSection) // Se eliminan todos los atributos de la subsección
-```
-
-## Ver también
-
-[4D Write Pro Attributes](../4d-write-pro-attributes)
-[WP GET ATTRIBUTES](wp-get-attributes.md)
-[WP SET ATTRIBUTES](wp-set-attributes.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-set-attributes.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-set-attributes.md
deleted file mode 100644
index 997c3cd500b662..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/commands/wp-set-attributes.md
+++ /dev/null
@@ -1,153 +0,0 @@
----
-id: wp-set-attributes
-title: WP SET ATTRIBUTES
-displayed_sidebar: docs
----
-
-**WP SET ATTRIBUTES** ( *targetObj* ; *...attribName* ; *...attribValue* ) **WP SET ATTRIBUTES** ( *targetObj* ; *attribObj* )
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ----------------------------------------------- | --------------------------- | ----------------------------------------------------------------------------------------- |
-| targetObj | Object | → | Rango o elemento o documento 4D Write Pro |
-| attribName | Text | → | Nombre del atributo a definir |
-| attribValue | Text, Number, Object, Collection, Picture, Date | → | Nuevo valor de atributo |
-| attribObj | Object | → | Objeto que contiene los nombres de los atributos y sus correspondientes valores a definir |
-
-
-
-## Descripción
-
-El comando **WP SET ATTRIBUTES** le permite definir el valor de cualquier atributo en un rango, elemento, documento. This command gives you access to any kind of 4D Write Pro internal attribute: character, paragraph, document, table, or image.
-
-En *targetObj*, puede pasar:
-
-- un rango, o
-- un elemento (encabezado / pie de página / cuerpo / tabla / línea / párrafo / imagen anclada / sección / subsección / hoja de estilo), o
-- un documento 4D Write Pro
-
-Puede especificar atributos a definir para *targetObj* de una de dos maneras:
-
-- Utilice los parámetros *attribName* y *attribValue*. En *attribName*, pase el nombre del atributo a definir para el objetivo y en *attribValue*, pase el nuevo valor a definir. Puede pasar tantos pares *attribName*/*attribValue* como desee en una sola llamada.
-
-- Utilice el parámetro *attribObj* para pasar un único objeto que contenga nombres de atributos y sus valores correspondientes como propiedades del objeto.
-
-Para obtener una lista completa de los atributos a pasar, así como su alcance y valores respectivos, consulte la sección [Atributos 4D Write Pro](../4d-write-pro-attributes).
-
-## Ejemplo 1
-
-En esta área 4D Write Pro, ha seleccionado una palabra:
-
-
-
-Si ejecuta el siguiente código:
-
-```4d
- $range:=WP Get selection(*;"WParea") //obtener el rango seleccionado
-
- // definir el shadow offset en pt para el texto seleccionado
- WP SET ATTRIBUTES($range;wk text shadow offset;1)
- //establecer el relleno del párrafo
- WP SET ATTRIBUTES($range;wk padding;1)
- //define un borde de 10 pt
- WP SET ATTRIBUTES($range;wk border style;wk solid;wk border width;10)
- //define los colores del borde
- WP SET ATTRIBUTES($range;wk border color;"blue";wk border color bottom;"#00FA9A";wk border color right;"#00FA9A")
-```
-
-Obtiene el siguiente resultado:
-
-
-
-## Ejemplo 2
-
-Este ejemplo ilustra el uso de las constantes wk inside y wk outside:
-
-```4d
- $wpRange:=WP Get selection(writeProdoc)
- WP SET ATTRIBUTES($wpRange;wk border style+wk inside;wk dotted)
- WP SET ATTRIBUTES($wpRange;wk border style+wk outside;wk solid)
- WP SET ATTRIBUTES($wpRange;wk border color+wk outside;"#00FA9A")
-```
-
-Suponiendo que se hayan seleccionado todos los contenidos, el resultado es:
-
-
-
-## Ejemplo 3
-
-Desea definir una imagen de fondo para el documento:
-
-```4d
- var WParea : Object
- WParea:=WP New
-
- READ PICTURE FILE("C:\\Pictures\\boats.jpg";$picture)
-
- WP SET ATTRIBUTES(WParea;wk background image;$picture)
-```
-
-El resultado es:
-
-
-
-Desea definir una imagen de fondo que cubra toda el área imprimible. Todos los atributos se pasan utilizando un único objeto:
-
-```4d
- var WParea : Object
- WParea:=WP New
-
- READ PICTURE FILE("C:\\Pictures\\boats.jpg";$picture)
-
- $myAttributes:=New object()
- $myAttributes[wk background image]:=$picture
- $myAttributes[wk background clip]:=wk paper box
- $myAttributes[wk background origin]:=wk paper box
-
- WP SET ATTRIBUTES(WParea;$myAttributes)
-```
-
-El resultado es:
-
-
-
-:::note
-
-El valor paper box sólo es aplicable a documentos y secciones.
-
-:::
-
-## Ejemplo 4
-
-Desea definir tabulaciones a intervalos variables y designar un caracter como caracter principal de la última tabulación:
-
-```4d
- $tab1:=New object()
- $tab1[wk type]:=wk left
- $tab1[wk offset]:="3cm"
- $tab1[wk leading]:=""
-
- $tab2:=New object()
- $tab2[wk type]:=wk center
- $tab2[wk offset]:="8cm"
- $tab2[wk leading]:=""
-
- $tab3:=New object()
- $tab3[wk type]:=wk right
- $tab3[wk offset]:="12cm"
- $tab3[wk leading]:="."
-
- $_tabs:=New collection($tab1;$tab2;$tab3)
- WP SET ATTRIBUTES(wpArea;wk tabs;$_tabs)
-```
-
-El resultado es:
-
-
-
-## Ver también
-
-[4D Write Pro Attributes](../4d-write-pro-attributes)
-[WP GET ATTRIBUTES](../commands/wp-get-attributes.md)
-[WP RESET ATTRIBUTES](../commands/wp-reset-attributes.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/managing-formulas.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/managing-formulas.md
deleted file mode 100644
index 6cc3eaf65d0257..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/managing-formulas.md
+++ /dev/null
@@ -1,229 +0,0 @@
----
-id: managing-formulas
-title: Gestión de fórmulas
----
-
-## Generalidades
-
-Los documentos 4D Write Pro pueden contener referencias a fórmulas 4D como variables, campos, expresiones, métodos proyecto o comandos 4D. Información específica como el número de página también puede ser referenciada a través de fórmulas (ver [Inserción de documentos y expresiones de página](#inserting-date-and-time-formulas) más abajo).
-
-La inserción de fórmulas en las áreas de 4D Write Pro se realiza con el comando [**WP INSERT FORMULA**](commands/wp-insert-formula.md) y puede leerse utilizando el comando [**WP Get formulas**](commands-legacy/wp-get-formulas.md). También los devuelve el comando [**WP Get text**](commands-legacy/wp-get-text.md).
-
-Las fórmulas son evaluadas:
-
-- cuando se insertan en un objeto de formulario que muestra valores calculados
-- cuando el objeto 4D Write Pro se carga en un objeto de formulario que muestra valores calculados
-- cuando se llama al comando [**WP COMPUTE FORMULAS**](commands-legacy/wp-compute-formulas.md)
-- cuando estén "congelados" usando el comando [**WP FREEZE FORMULAS**](commands-legacy/wp-freeze-formulas.md) (si aún no se ha calculado)
-- antes de imprimir (si no se ha calculado ya)
-- antes de exportar a .docx (si la fórmula no se puede asignar con fórmulas MS Word)
-- cuando se llaman las acciones estándar para congelar, imprimir, exportar o calcular fórmulas. Ver *Acciones estándar*
-
-Las fórmulas no son evaluadas cuando un documento es cargado (usando [**WP New**](commands-legacy/wp-new.md), [**WP Insert document body**](commands/wp-insert-document-body.md), o `wpArea:=[table]field`):
-
-- si el documento sólo está fuera de la pantalla,
-- si el documento se muestra en pantalla pero el objeto formulario sólo muestra referencias.
-
-Las fórmulas se convierten en valores estáticos si se llama al comando [**WP FREEZE FORMULAS**](commands-legacy/wp-freeze-formulas.md) (excepto para el número de página y el recuento de páginas, ver más abajo).
-
-**Nota de compatibilidad**: *el manejo de expresiones utilizando los comandos [**ST INSERT EXPRESSION**](../commands-legacy/st-insert-expression.md), [**ST Get expression**](../commands-legacy/st-get-expression.md), [**ST COMPUTE EXPRESSIONS**](../commands-legacy/st-compute-expressions.md), y [**ST FREEZE EXPRESSIONS**](../commands-legacy/st-freeze-expressions.md) es obsoleto, sin embargo, sigue siendo soportado en 4D Write Pro por compatibilidad*.
-
-### Ejemplo
-
-Desea sustituir la selección en un área de 4D Write Pro por el contenido de una variable:
-
-```4d
- var fullName: Text
- var $sel: Object
- fullName:="John Smith"
- $sel:=WP Selection range(4DWPArea)
- Case of
- :(Form event code=On Clicked)
- WP INSERT FORMULA($sel;Formula(fullName);wk replace)
- End case
-```
-
-## Objeto de contexto de fórmula
-
-Puede insertar expresiones especiales relacionadas con los atributos del documento en cualquier área del documento (cuerpo, encabezado, pie de página) utilizando el comando [WP Insertar fórmula](commands/wp-insert-formula.md). Dentro de una fórmula, un objeto contextual de la fórmula se expone automáticamente. Puede utilizar las propiedades de este objeto a través de [**This**](../commands/this.md):
-
-| Propiedades | Tipo | Descripción |
-| ------------------------------------------------------------------------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| [This](../commands/this.md).title | Text | Título definido en el atributo wk title |
-| [This](../commands/this.md).author | Text | Autor definido en el atributo wk author |
-| [This](../commands/this.md).subject | Text | Asunto definido en el atributo wk subject |
-| [This](../commands/this.md).company | Text | Empresa definida en el atributo wk company |
-| [This](../commands/this.md).notes | Text | Notas definidas en el atributo wk notes |
-| [This](../commands/this.md).dateCreation | Fecha | Fecha de creación definida en el atributo wk date creation |
-| [This](../commands/this.md).dateModified | Fecha | Fecha de modificación definida en el atributo wk date modified |
-| [This](../commands/this.md).pageNumber (\*) | Number | Page number as it is defined:
- From the document start (default) or
- From the section page start if it is defined by section page start.
Esta fórmula siempre es dinámica; no se ve afectada por el comando [**FORMULAS WP FREEZE**](commands-legacy/wp-freeze-formulas.md). |
-| [This](../commands/this.md).pageCount (\*) | Number | Número de páginas: número total de páginas. Esta fórmula siempre es dinámica; no se ve afectada por el comando [**FORMULAS WP FREEZE**](commands-legacy/wp-freeze-formulas.md). |
-| [This](../commands/this.md).document | Object | Documento 4D Write Pro |
-| [This](../commands/this.md).data | Object | Contexto de datos del documento 4D Write Pro definido por [**WP SET DATA CONTEXT**](commands-legacy/wp-set-data-context.md) |
-| [This](../commands/this.md).sectionIndex | Number | El índice de la sección en el documento 4D Write Pro a partir de 1 |
-| [This](../commands/this.md).pageIndex | Number | El número de página real en el documento 4D Write Pro a partir de 1 (independientemente de los números de página de la sección) |
-| [This](../commands/this.md).sectionName | String | El nombre que el usuario da a la sección |
-
-:::note
-
-Existen propiedades de contexto adicionales cuando se trabaja con tablas. Vea *Gestión de tablas* para más información.
-
-:::
-
-(\*) **Importante**: **This.pageNumber**, **This.pageIndex** y **This.pageCount** sólo deben utilizarse directamente en una fórmula 4D Write Pro (deben estar presentes en la cadena *formula.source*). Devolverán valores incorrectos si son utilizados por el lenguaje 4D dentro de un método llamado por la fórmula. Sin embargo, pueden pasarse como parámetros a un método llamado directamente por la fórmula:
-
-- Esto funcionará: " *formatNumber(This.pageNumber)* "
-- Esto NO funcionará: « *formatNumber* » con el método *formatNumber* de procesamiento *This.pageNumber*.
-
-Por ejemplo, para insertar el número de página en el pie de página:
-
-```4d
- $footer:=WP Get footer(4DWP;1)
- WP INSERT FORMULA($footer;Formula(This.pageNumber);wk append)
- //Usando Formula(myMethod) con myMethod procesando This.pageNumber
- //no funcionaría correctamente
-```
-
-## Inserción de fórmulas de fecha y hora
-
-**Date**
-
-Cuando se inserta en una fórmula el comando [**Current date**](../commands-legacy/current-date.md), una variable de fecha o un método que devuelve una fecha, ésta se transformará automáticamente en texto utilizando el formato abreviado de fecha del sistema.
-
-**Time**
-
-When the [**Current time**](../commands-legacy/current-time.md) command, a time variable, or a method returning a time is inserted in a formula, it must be enclosed within a [**String**](../commands-legacy/string.md) command because time type is not supported in JSON. Considera los siguientes ejemplos de fórmulas:
-
-```4d
- // Este código es la mejor práctica
- $formula1:=Formula(String(Current time)) //OK
-
- // Este código funcionará pero normalmente no se recomienda, excepto después de "Edit formula"
- $formula2:=Formula from string("String(Current time)") //OK
-
- // Código incorrecto porque los valores de tiempo se mostrarían como un longint para los segundos (o milisegundos), no como un tiempo
- $formula3:=Formula from string("Current time") //NO válido
- $formula4:=Formula(Current time) //NO válido
-
-```
-
-## Soporte de estructura virtual
-
-Las expresiones de tablas y campos insertadas en los documentos 4D Write Pro soportan la definición de la estructura virtual de la base de datos. La estructura virtual expuesta a las fórmulas se define mediante los comandos [**SET FIELD TITLES**](../commands-legacy/set-field-titles.md)(...;\*) y [**SET TABLE TITLES**](../commands-legacy/set-table-titles.md)(...;\*).
-
-Cuando se define una estructura virtual:
-
-- las referencias a expresiones que contienen campos muestran nombres virtuales cuando el documento 4D Write Pro muestra referencias y no valores.
-- [**WP Get text**](commands-legacy/wp-get-text.md) devuelve nombres de estructura virtual si la opción `wk expressions as source` está establecida en el parámetro de expresiones.
-- [WP Insert formula](commands/wp-insert-formula.md) ignora la estructura virtual y siempre espera nombres de tablas/campos reales
-
-:::note
-
-Cuando un documento se visualiza en modo "expresiones de visualización", las referencias a tablas o campos que no pertenecen a la estructura virtual se muestran con caracteres "`?`", por ejemplo `[VirtualTableName]?` cuando el campo no está definido en la estructura virtual.
-
-:::
-
-## Mostrar fórmulas
-
-Puede controlar cómo se muestran las fórmulas en sus documentos:
-
-- como *valores* o como \*referencias
-- cuando se muestran como referencias, muestran el texto, símbolo o nombre de la fuente.
-
-### Referencias o valores
-
-Por defecto, las fórmulas 4D se muestran como valores. Al insertar una fórmula 4D, 4D Write Pro calcula y muestra su valor actual. Si desea saber qué fórmula se utiliza o cuál es su nombre, debe mostrarla como referencia.
-
-Para mostrar fórmulas como referencias, puede:
-
-- check the **Show references** option in the Property list (see *Configuring View properties*), or
-- utilizar la acción estándar visibleReferences (ver *Expresiones dinámicas*), o bien
-- usa el comando [**WP SET VIEW PROPERTIES**](commands-legacy/wp-set-view-properties.md) con el selector `wk visible references` en **True**.
-
-Las referencias a fórmulas pueden mostrarse como:
-
-- textos fuente (por defecto)
-- symbols
-- names
-
-### Referencias como textos fuente (por defecto)
-
-Cuando las fórmulas se muestran como referencias, por defecto el texto fuente de la fórmula aparece en su documento, con un fondo gris por defecto (puede personalizarse usando el selector `wk formula highlight`).
-
-Por ejemplo, ha insertado la fecha actual junto con un formato, la fecha se muestra:
-
-
-
-Cuando se muestran fórmulas como referencias, se muestra la **fuente** de la fórmula:
-
-
-
-### Referencias como símbolos
-
-Cuando los textos fuente de las fórmulas se muestran en un documento, el diseño puede resultar confuso si se trabaja con plantillas sofisticadas que utilizan tablas, por ejemplo, y cuando las fórmulas son complejas:
-
-
-
-En este caso, puede mostrar las referencias a fórmulas como símbolos , para que el documento sea más compacto:
-
-
-
-Para mostrar las referencias a fórmulas como símbolos, puede:
-
-- check the **Display formula source as symbol option** in the Property list (see *Configuring View properties*), or
-- utilizar la acción estándar displayFormulaAsSymbol (ver *Uso de las acciones estándar de 4D Write Pro*), o bien
-- usa el comando [**WP SET VIEW PROPERTIES**](commands-legacy/wp-set-view-properties.md) con el selector `wk display formula as symbol` en **True**.
-
-### Referencias como nombres
-
-Puede asignar nombres a las fórmulas, haciendo que los documentos de plantilla de 4D Write Pro sean más fáciles de leer y entender para los usuarios finales. Cuando las fórmulas se muestran como referencias (y no como símbolos) y se ha definido un nombre para una fórmula, se muestra el nombre de la fórmula.
-
-Por ejemplo, las siguientes referencias a fórmulas se muestran como texto fuente por defecto:
-
-
-
-Si asigna nombres a las fórmulas, se mostrarán en lugar de los textos:
-
-
-
-Para asignar un nombre a una fórmula, debe utilizar el comando [WP Insert formula](commands/wp-insert-formula.md) con un parámetro objeto. Por ejemplo:
-
-```4d
- //inserta el día anterior en el documento
- $o:=New object("formula";Formula(Current date-1); "name"; "Yesterday")
- $range:=WP Text range(WPArea;wk start text;wk end text)
- WP INSERT FORMULA($range;$o;wk append)
-
-```
-
-
-
-:::note
-
-Sólo las fórmulas en línea pueden tener un nombre (las fórmulas para imágenes ancladas, romper filas y las fórmulas de fuentes de datos de tablas no pueden tener nombres).
-
-:::
-
-### Consejos sobre fórmulas
-
-Sea cual sea el modo de visualización de las fórmulas, puede obtener información adicional sobre las fórmulas a través de **tips** que se muestran al pasar el ratón sobre las fórmulas.
-
-- Cuando las fórmulas no tienen nombre, los consejos proporcionan el texto fuente de las fórmulas:
-
- 
-
-- Cuando las fórmulas tienen nombre pero se muestran como valores o como símbolos, el consejo ofrece el nombre de las fórmulas:
-
- 
-
-En este contexto, puede visualizar el texto fuente de la fórmula pulsando **Ctrl** (Windows) o **Cmd** (macOS) mientras pasa el ratón sobre la fórmula.
-
-- Cuando las fórmulas tienen nombres y se muestran como nombres, no se muestra ningún consejo por defecto.
- Puede mostrar el texto original de la fórmula presionando **Ctrl** (Windows) o **Cmd** (macOS) mientras pasa el cursor sobre la fórmula:
-
- !
-
-#### Ver también
-
-[Descargar base de datos HDI](http://download.4d.com/Demos/4D_v16/HDI_4DWP_Filter4DExpressions.zip)
-*Usar comandos del tema Texto con estilo*
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/writeprointerface.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/writeprointerface.md
deleted file mode 100644
index 4cfbbf7bbc09ce..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/WritePro/writeprointerface.md
+++ /dev/null
@@ -1,410 +0,0 @@
----
-id: writeprointerface
-title: Interfaz 4D Write Pro
----
-
-4D WritePro Interface ofrece un conjunto de paletas, que permiten a los usuarios finales personalizar fácilmente un documento 4D Write Pro.
-
-Un desarrollador 4D puede implementar fácilmente estas paletas en su aplicación. Así, los usuarios finales pueden gestionar todas las propiedades de 4D Write Pro, como las fuentes, la alineación del texto, los marcadores, la disposición de las tablas y los marcos.
-
-La documentación principal de [la interfaz de 4D Write Pro](https://doc.4d.com/4Dv20/4D/20/Entry-areas.300-6263967.en.html) se encuentra en el manual *Diseño 4D*.
-
-Encontrará a continuación:
-
-- la documentación de configuración del Asistente para tablas,
-- la I.A. integrada. documentation.
-
-## Asistente de tablas
-
-El asistente de tablas está aquí para simplificar aún más la creación de tablas basadas en datos de bases d utilizando contextos, fuentes de datos y fórmulas.
-
-El asistente de tablas, accesible a los usuarios finales, carga plantillas suministradas y configuradas por los desarrolladores de 4D. Esto permite a los desarrolladores personalizar la plantilla según los casos de uso específicos y los requisitos empresariales de los usuarios.
-
-El Asistente de tablas viene con plantillas y temas predeterminados, que los desarrolladores pueden configurar para adaptar su contenido a los requisitos específicos de la aplicación.
-
-Para implementar el Asistente de tablas en su aplicación, los desarrolladores pueden crear y configurar archivos de plantilla.
-
-### Interfaz del Asistente de tablas WP
-
-El usuario abre el diálogo Asistente para tablas desde el elemento de menú "Insertar tabla" de la barra de herramientas y la barra lateral de la interfaz de 4D Write Pro.
-
-
-
-Desde esta interfaz, el usuario puede seleccionar una plantilla o una tabla en la primera lista desplegable y un tema en la segunda.
-
-##### En Columnas:
-
-
-
-Dependiendo de si el usuario selecciona un modelo o una tabla, puede ver la lista de campos almacenados en el modelo (los tipos Blob y objeto se excluyen automáticamente). A continuación, pueden seleccionar las columnas que se mostrarán en la tabla marcando la casilla situada delante del nombre del campo y ordenarlas moviendo y arrastrando la lista de campos.
-
-##### En líneas:
-
-
-
-En el Asistente para tablas, el usuario también puede definir el número de filas de encabezado y filas adicionales (de 0 a 5 cada una), definir [filas de interrupción](https://doc.4d.com/4Dv20/4D/20/Handling-tables.200-6229469.en.html#6233076) (filas de resumen) encima o debajo de la fila de datos, y elegir mostrar/ocultar [filas de arrastre](https://doc.4d.com/4Dv20/4D/20/Handling-tables.200-6229469.en.html#6236686).
-
-Además, el usuario tiene la posibilidad de elegir el comportamiento de la tabla cuando su fuente de datos está vacía con las siguientes opciones: Mostrar fila de datos, Ocultar fila de fecha, Ocultar tabla, Mostrar fila de marcador de posición.
-
-##### En pantalla:
-
-
-
-El usuario ajusta el nivel de zoom según sus preferencias seleccionando la opción deseada de una lista desplegable, utiliza botones de opción para mostrar fórmulas o datos para una presentación clara y elige mostrar una regla horizontal utilizando una casilla de verificación.
-
-Tras finalizar la creación y personalización de la tabla, el usuario puede hacer clic en el botón **Insertar** para añadir la tabla a su documento WP.
-
-Una vez integrada la tabla en el documento, el usuario puede personalizar su estilo. Las herramientas de formato de la barra de herramientas y la barra lateral siguen estando disponibles.
-
-### Configuración de la plantilla WP Table Wizard
-
-La configuración de las plantillas incluye:
-
-- Definición de tablas y campos, así como preparación de fórmulas adaptadas a la aplicación desde el [archivo de plantilla](#template-files).
-- Traducción de nombres de tablas, campos y fórmulas del [archivo de traducción](#translation-files).
-- Diseño de estilos gráficos y temas personalizados a partir del [ archivo de temas](#theme-files).
-
-Estos tres tipos de archivos contribuyen a la configuración del Asistente para tablas y, aunque cada uno de ellos tiene una finalidad distinta, ninguno de ellos se considera un componente esencial.
-
-#### Archivos de plantillas
-
-El archivo de plantilla permite definir lo siguiente:
-
-- la fórmula que devuelve una selección de entidades utilizada como fuente de datos de la tabla,
-- las fórmulas de ruptura (si se puede insertar una línea de ruptura)
-- los atributos de la clase de datos que pueden utilizarse como columnas de la tabla,
-- las fórmulas disponibles como menús contextuales dentro de las filas de interrupción, fila de arrastre, fila de marcador de posición o filas adicionales.
-
-El archivo de plantillas debe ser almacenado en una carpeta "[`Resources`](../Project/architecture.md#resources)/4DWP_Wizard/Templates" dentro de su proyecto.
-
-El archivo de plantilla en formato JSON contiene los siguientes atributos:
-
-| Atributo | Tipo | Obligatorio | Descripción |
-| :----------------------------------- | :--------- | :---------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| tableDataSource | Text | x | Fórmula de la fuente de datos de la tabla |
-| columns | Collection | x | Colección de columnas de tabla |
-| columns.check | Text | x | True cuando la columna ya está marcada en el editor de plantillas. False cuando la columna está desmarcada en el editor de plantillas. |
-| columns.header | Text | x | Etiqueta mostrada al usuario |
-| columns.source | Text | x | Formula |
-| breaks | Collection | | Colección de objetos de ruptura. El orden de las interrupciones es importante. Corresponde al orden en el documento cuando las rupturas están sobre las líneas de datos. |
-| breaks.label | Text | x | Etiqueta mostrada al usuario |
-| breaks.source | Text | x | Formula |
-| breakFormulas | Collection | | Colección de objetos de fórmula aplicables a las líneas de ruptura |
-| breakFormulas.label | Text | x | Etiqueta mostrada al usuario |
-| breakFormulas.source | Text | x | Formula |
-| bcorFormulas | Collection | | Colección de objetos de fórmula aplicables a las filas de transferencia inferiores |
-| bcorFormulas.label | Text | x | Etiqueta mostrada al usuario |
-| bcorFormulas.source | Text | x | Formula |
-| extraFormulas | Collection | | Colección de objetos de fórmula aplicables a líneas adicionales |
-| extraFormulas.label | Text | x | Etiqueta mostrada al usuario |
-| extraFormulas.source | Text | x | Formula |
-| placeholderFormulas | Collection | | Colección de objetos de fórmula que se insertan en la fila del marcador de posición |
-
-:::note Francés
-
-Si es probable que su aplicación se ejecute en un 4D con el idioma configurado en francés, asegúrese de utilizar [tokens](https://doc.4d.com/4Dv20/4D/20/Using-tokens-in-formulas.300-6237731.en.html) en sus fórmulas para que se interpreten correctamente independientemente de la configuración de idioma del usuario.
-
-:::
-
-##### Ejemplo
-
-He aquí un breve ejemplo del aspecto que podría tener su archivo JSON:
-
-```json
-{
- "tableDataSource": "ds.People.all().orderBy(\"toCompany.name asc, continent asc, country asc, city asc\")",
- "columns": [{
- "check": true,
- "header": "Firstname",
- "source": "This.item.firstname"
- }, {
- "check": true,
- "header": "Lastname",
- "source": "This.item.lastname"
- }, {
- "check": true,
- "header": "Salary",
- "source": "String(This.item.salary;\"###,###.00\")"
- }
- ],
- "breaks": [{
- "label": "Company",
- "source": "This.item.toCompany.name"
- }
- ],
- "breakFormulas": [{
- "label": "Company",
- "source": "This.item.toCompany.name"
- }, {
- "label": "Sum of salaries",
- "source": "String(This.breakItems.sum(\"salary\"); \"###,###.00\")"
- }
- ],
- "bcorFormulas": [{
- "label": "Sum of salaries",
- "source": "String(This.tableData.sum(\"salary\"); \"###,###.00\")"
- }
- ],
- "extraFormulas": [{
- "label": "Sum of salaries",
- "source": "String(This.tableData.sum(\"salary\"); \"###,###.00\")"
- }
- ]
-}
-
-```
-
-#### Archivos de traducción
-
-Los archivos de traducción traducen los nombres de plantillas, temas, tablas, campos y fórmulas. Estos archivos se añaden a la carpeta "[`Resources`](../Project/architecture.md#resources)/4DWP_Wizard/Translations" de su proyecto.
-
-Cada archivo de traducción debe nombrarse con el código de idioma correspondiente (por ejemplo, "en" para inglés o "fr" para francés).
-
-El archivo de traducción en formato JSON contiene los siguientes atributos:
-
-| Atributo | Tipo | Obligatorio | Descripción |
-| :-------- | :--------- | :---------- | :----------------------------------------------------------------------------------------------------------- |
-| tablas | Collection | | Colección de objetos de tabla traducidos |
-| fields | Collection | | Colección de objetos de campo traducidos |
-| formulas | Collection | | Colección de objetos fórmula traducidos |
-| fileNames | Collection | | Colección de objetos fileName traducidos (aplicables al tema y al nombre de la plantilla) |
-
-En cada uno de estos atributos, el objeto de traducción incluye los atributos siguientes:
-
-| Atributo | Tipo | Obligatorio | Descripción |
-| :---------- | :--- | :---------- | :------------------------------------ |
-| original | Text | x | Texto original destinado a traducción |
-| translation | Text | x | Versión traducida del texto original |
-
-La definición de estos atributos dentro del objeto de traducción garantiza una organización y alineación adecuadas entre el contenido original y el traducido.
-
-Si el nombre de la plantilla o la fórmula (ruptura, línea de arrastre o extra) existe en el archivo traducido, su traducción se aplica en el Asistente de tablas. Además, solo se visualiza y traduce la tabla definida en el archivo de traducción.
-
-El archivo de traducción cumple una función adicional cuando un usuario selecciona una tabla en la interfaz. Puede filtrar las tablas y los campos propuestos al usuario. Por ejemplo, para ocultar los ID de tabla, este comportamiento es similar a los comandos `SET TABLE TITLES` y `SET FIELD TITLES`.
-
-##### Ejemplo
-
-```json
-{
- "tables": [{
- "original": "People",
- "translation": "Personne"
- }
- ],
- "fields": [{
- "original": "lastname",
- "translation": "Nom"
- }, {
- "original": "firstname",
- "translation": "Prénom"
- }, {
- "original": "salary",
- "translation": "Salaire"
- }, {
- "original": "company",
- "translation": "Société"
- }
- ],
- "formulas": [{
- "original": "Sum of salary",
- "translation": "Somme des salaires"
- }
- ]
-}
-
-```
-
-#### Archivos de temas
-
-El componente 4D Write Pro Interface proporciona por defecto una lista de temas, como "Arial", "CourierNew" y "YuGothic", disponibles en múltiples variaciones como "Blue" y "Green". Sin embargo, puede crear su propio tema colocándolo en la carpeta "[`Resources`](../Project/architecture.md#resources)/4DWP_Wizard/Themes" dentro de su proyecto.
-
-El archivo del tema en formato JSON contiene los siguientes atributos:
-
-| Atributo | Tipo | Obligatorio | Descripción |
-| :---------- | :----- | :---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| default | Object | | Objeto que contiene el estilo por defecto aplicable a todas las líneas. |
-| tabla | Object | | Objeto que contiene la definición de estilo aplicable a la tabla. |
-| rows | Object | | Objeto que contiene la definición de estilo aplicable a todas las líneas. |
-| cells | Object | | Objeto que contiene la definición de estilo aplicable a todas las celdas. |
-| header1 | Object | | Objeto que contiene la definición de estilo aplicable a la primera línea del encabezado. |
-| header2 | Object | | Objeto que contiene la definición de estilo aplicable a la segunda línea del encabezado. |
-| header3 | Object | | Objeto que contiene la definición de estilo aplicable a la tercera línea del encabezado. |
-| header4 | Object | | Objeto que contiene la definición de estilo aplicable a la cuarta línea del encabezado. |
-| header5 | Object | | Objeto que contiene la definición de estilo aplicable a la quinta línea del encabezado. |
-| headers | Object | | Objeto que contiene la definición de estilo aplicable a las líneas de encabezado, si un encabezado específico (como header1, header2...) no está definido. |
-| data | Object | | Objeto que contiene la definición de estilo aplicable a la línea de datos repetida. |
-| break1 | Object | | Objeto que contiene la definición de estilo aplicable a la primera línea de ruptura. |
-| break2 | Object | | Objeto que contiene la definición de estilo aplicable a la segunda línea de ruptura. |
-| break3 | Object | | Objeto que contiene la definición de estilo aplicable a la tercera línea de ruptura. |
-| break4 | Object | | Objeto que contiene la definición de estilo aplicable a la cuarta línea de ruptura. |
-| break5 | Object | | Objeto que contiene la definición de estilo aplicable a la quinta línea de ruptura. |
-| breaks | Object | | Objeto que contiene la definición de estilo aplicable a las líneas de ruptura, si una ruptura específica (como break1, break2...) no está definido. |
-| bcor | Object | | Objeto que contiene la definición de estilo aplicable a la línea de arrastre inferior. |
-| placeholder | Object | | Objeto que contiene el estilo por defecto aplicable a la fila del marcador de posición. |
-
-Por cada atributo usado en su archivo JSON (encabezado, datos, arrastre, resumen y líneas adicionales), puede definir los siguientes atributos WP, mencionados con su [constante WP correspondiente](https://doc.4d.com/4Dv20/4D/20/4D-Write-Pro-Attributes.300-6229528.en.html):
-
-| Atributos WP | Constante WP correspondiente |
-| :-------------- | :--------------------------- |
-| textAlign | wk text align |
-| backgroundColor | wk background color |
-| borderColor | wk border color |
-| borderStyle | wk border style |
-| borderWidth | wk border width |
-| font | wk font |
-| color | wk font color |
-| fontFamily | wk font family |
-| fontSize | wk font size |
-| padding | wk padding |
-
-##### Ejemplo
-
-```json
-{
- "default": {
- "backgroundColor": "#F0F0F0",
- "borderColor": "#101010",
- "borderStyle": 1,
- "borderWidth": "0.5pt",
- "font": "Times New Roman",
- "color": "#101010",
- "fontFamily": "Times New Roman",
- "fontSize": "7pt",
- "padding": "2pt"
- },
- "table": {
- "backgroundColor": "#E1EAF3"
- },
- "header1": {
- "textAlign": 2,
- "borderColor": "#41548F",
- "borderWidth": "1.5pt",
- "backgroundColor": "#979BA9",
- "color": "#F4F4FF",
- "font": "Times New Roman Bold"
- },
- "data": {
- "fontSize": "13pt",
- "textAlign": 0
- },
- "break1": {
- "textAlign": 2,
- "fontSize": "15pt"
- }
-}
-
-```
-
-#### Ver también
-
-[4D Write Pro - Asistente para tablas (vídeo tutorial)](https://www.youtube.com/watch?v=2ChlTju-mtM)
-
-## IA Integrada
-
-Puede utilizar una IA integrada en la interfaz de 4D Write Pro para poder traducir o mejorar fácilmente sus documentos sin tener que utilizar una aplicación de IA externa.
-
-Una vez activada la función AI, puede mostrar un cuadro de chat sobre su documento 4D Write Pro e interactuar con *chatGPT* para modificar el texto de la selección o del propio documento.
-
-:::note
-
-La interfaz de 4D Write Pro utiliza OpenAI, para lo cual necesita suministrar su propia clave (ver abajo).
-
-:::
-
-### Limitaciones (Developer Preview)
-
-En la aplicación actual, la función tiene las siguientes limitaciones:
-
-- uso de un proveedor de IA predefinido y necesidad de pasar su clave OpenAI
-- funcionalidades básicas de chat
-- sin gestión de imágenes
-- comandos de acción predefinidos no configurables
-- traducciones predefinidas sólo inglés/francés y francés/inglés
-
-### Activando la función de IA
-
-El cuadro de diálogo AI está disponible haciendo clic en un botón de la interfaz de 4D Write Pro. Este botón está **oculto por defecto**, debe activarlo explícitamente.
-
-Para mostrar el botón del diálogo AI, es necesario:
-
-1. Obtener una clave API del [sitio web OpenAI](https://openai.com/api/).
-2. Ejecutar el siguiente código 4D:
-
-```4d
-
-WP SetAIKey ("") //
-
-```
-
-:::note
-
-No se comprueba la validez de la llave OpenAI. Si no es válida, la casilla *chatGPT* permanecerá vacía.
-
-:::
-
-A continuación, aparece el botón **I.A**:
-
-
-
-- en la barra de herramientas de 4D Write Pro, en la pestaña **Importar Exportar**,
-- en el widget 4D Write Pro, en la pestaña **Estilo de fuente**.
-
-Haga clic en el botón para mostrar el cuadro de diálogo IA.
-
-### Diálogo IA
-
-El cuadro de diálogo 4D Write Pro AI permite una interacción directa entre el área de chat y el documento 4D Write Pro.
-
-#### Área Prompt
-
-En la parte inferior de la ventana, el **área de preguntas** le permite introducir cualquier pregunta para enviar a la IA.
-
-Para enviar su pregunta a la IA, pulse el botón Enviar:
-
-
-
-El icono del botón cambia cuando se vuelve a enviar la misma petición:
-
-
-
-En la parte izquierda de esta área, un menú emergente ofrece ejemplos de acciones comunes que pueden delegarse normalmente a la IA.
-
-Al seleccionar una acción, se escribe la pregunta correspondiente. Si es necesario, puede modificar la pregunta y, a continuación, hacer clic en el botón Enviar para enviarla realmente:
-
-
-
-:::note
-
-Las acciones de traducción por defecto se basan en la configuración actual por defecto de 4D y dependen de los idiomas disponibles.
-
-:::
-
-#### Botones de copia
-
-Estos botones proponen interacciones básicas entre el área de chat, el documento subyacente de 4D Write Pro y el portapapeles:
-
-
-
-- **Devolver texto sin formato**/**Devolver texto con estilo**: copia la última respuesta o la respuesta seleccionada de la IA al documento 4D Write Pro en el punto de inserción actual, sustituyendo el texto seleccionado si lo hubiera.
-- **Copiar texto sin formato**/**Copiar texto con estilo**: copia la última respuesta o la respuesta seleccionada de la IA en el portapapeles.
-
-En ambos casos, si la respuesta se proporcionó con estilos, puede decidir copiar el texto con o sin estilos.
-
-:::note
-
-El cuadro de chat utiliza el lenguaje Markdown para dar formato al texto. Se admiten estilos básicos como negrita, cursiva, subrayado y títulos. Al pegar texto con estilo desde la IA en el área de 4D Write Pro, puede perder alguna información de formato.
-
-:::
-
-#### Área de chat
-
-El área de chat muestra toda la interacción entre usted y la IA. Puede desplazarse y seleccionar la parte que desee.
-
-Para vaciar esta área, puede hacer clic en el botón Borrar del área Historial (reinicia la ventana y todas las interacciones).
-
-#### Histórico
-
-El área Historial enumera todos los avisos enviados a la IA. Puede ocultar/mostrar esta área utilizando el botón situado en la esquina superior derecha del área de Chat.
-
-El botón Borrar permite reiniciar toda la ventana y borrar todas las interacciones. Es equivalente a cerrar/reabrir el cuadro de diálogo de IA.
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAI.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAI.md
deleted file mode 100644
index a54860be90e40c..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAI.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-id: openai
-title: OpenAI
----
-
-# OpenAI
-
-The `OpenAI` class provides a client for accessing various OpenAI API resources. It includes properties for managing API configurations and methods for performing HTTP requests to the OpenAI endpoints.
-
-## Propiedades de configuración
-
-| Nombre de la propiedad | Tipo | Descripción | Opcional |
-| ---------------------- | ---- | ---------------------------------------------------------------------------- | -------------- |
-| `apiKey` | Text | Su [llave OpenAI API](https://platform.openai.com/api-keys). | No para OpenAI |
-| `baseURL` | Text | URL base para las peticiones de la API OpenAI. | Sí |
-| `organization` | Text | Su ID de organización OpenAI. | Sí |
-| `project` | Text | Su ID de proyecto OpenAI. | Sí |
-
-### Propiedades HTTP adicionales
-
-| Nombre de la propiedad | Tipo | Descripción |
-| ---------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
-| `timeout` | Real | Tiempo en segundos antes de que se agote el tiempo de espera. |
-| `maxRetries` | Real | Maximum number of retry attempts in case of failure. |
-| `httpAgent` | [4D.HTTPAgent](https://developer.4d.com/docs/API/HTTPAgentClass) | Agente HTTP utilizado para realizar peticiones. |
-| `customHeaders` | Real | Custom headers to be included in the HTTP requests. |
-
-### Class constructor
-
-Crear una instancia de la clase cliente OpenAI.
-
-| Nombre del argumento | Tipo | Descripción |
-| -------------------- | -------------- | ----------------------------------------------------------------------------------------------- |
-| *apiKey* | Texto u objeto | apiKey if Text as first argument and the second can be an Object of parameters. |
-
-#### Llave API
-
-```4d
-// as text
-var $client:=cs.AIKit.OpenAI.new("your api key")
-// as object
-var $client:=cs.AIKit.OpenAI.new({apiKey: "your api key"})
-```
-
-#### URL del servidor
-
-For a [compatible provider](../compatible-openai.md) API, you can configure the server URL.
-
-```4d
-var $client:=cs.AIKit.OpenAI.new({apiKey: "your api key"; baseURL: "https://server.ai"})
-```
-
-o después de crear una instancia
-
-```4d
-$client.baseURL:="https://server.ai"
-```
-
-## Recursos API
-
-The API provides access to multiple resources that allow seamless interaction with OpenAI's services. Each resource is encapsulated within a dedicated API class, offering a structured and intuitive way to interact with different functionalities.
-
-| Nombre de la propiedad | Tipo | Descripción |
-| ---------------------- | ----------------------------------------------- | ------------------------------------------------ |
-| `models` | [OpenAIModelsAPI](OpenAIModelsAPI.md) | Acceso a la API Models. |
-| `chat` | [OpenAIChatAPI](OpenAIChatAPI.md) | Acceso a la API Chat. |
-| `images` | [OpenAIImagesAPI](OpenAIImagesAPI.md) | Acceso a la API Images. |
-| `moderations` | [OpenAIModerationsAPI](OpenAIModerationsAPI.md) | Acceso a la API de moderaciones. |
-
-### Ejemplo de Uso
-
-```4d
-$client.chat.completions.create(...)
-$client.images.generate(...)
-$client.model.lists(...)
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatAPI.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatAPI.md
deleted file mode 100644
index 350ba5fe6bce14..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatAPI.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-id: openaichatapi
-title: OpenAIChatAPI
----
-
-# OpenAIChatAPI
-
-The `OpenAIChatAPI` class provides an interface to interact with OpenAI's chat based functionality, leveraging completion and vision capabilities.
-
-## Propiedades
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
-| `completions` | [OpenAIChatCompletionsAPI](OpenAIChatCompletionsAPI.md) | An instance that handles chat completions requests. |
-| `vision` | [OpenAIVision](OpenAIVision.md) | Una instancia de ayuda que gestiona las peticiones relacionadas con la visión. |
-
-## Function
-
-### create()
-
-**create**(*systemPrompt* : Text) : OpenAIChatHelper
-
-| Parámetros | Tipo | Descripción |
-| -------------- | --------------------------------------- | -------------------------------------------------------------------------------- |
-| *systemPrompt* | Text | El sistema solicita inicializar el chat. |
-| Resultado | [OpenAIChatHelper](OpenAIChatHelper.md) | Una instancia de ayuda para gestionar las interacciones de chat. |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatCompletionsAPI.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatCompletionsAPI.md
deleted file mode 100644
index 03b5bd86b87e19..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatCompletionsAPI.md
+++ /dev/null
@@ -1,107 +0,0 @@
----
-id: openaichatcompletionsapi
-title: OpenAIChatCompletionsAPI
----
-
-# OpenAIChatCompletionsAPI
-
-The `OpenAIChatCompletionsAPI` class is designed for managing chat completions with OpenAI's API. It provides methods to create, retrieve, update, delete, and list chat completions.
-
-https://platform.openai.com/docs/api-reference/chat
-
-## Funciones
-
-### create()
-
-**create**(*messages* : Collection of [OpenAIMessage](OpenAIMessage.md) ; *parameters* : [OpenAIChatCompletionsParameters](OpenAIChatCompletionsParameters.md)) : Object
-
-| Parámetros | Tipo | Descripción |
-| ------------ | --------------------------------------------------------------------- | -------------------------------------------------------------------------- |
-| *messages* | Colección de [OpenAIMessage](OpenAIMessage.md) | Los mensajes de chat que se incluirán en la solicitud. |
-| *parámetros* | [OpenAIChatCompletionsParameters](OpenAIChatCompletionsParameters.md) | Los parámetros para la solicitud de finalización del chat. |
-| Resultado | Object | The result of the chat completion request. |
-
-Creates a model response for the given chat conversation.
-
-https://platform.openai.com/docs/api-reference/chat/create
-
-#### Ejemplo de Uso
-
-Ofrece la lista completa de mensajes
-
-```4d
-var $messages:=[]
-$messages.push({role: "system"; content: "You are a helpful assistant."})
-$messages.push({"role":"user"; "content": "Hello, how are you?"})
-// ...
-
-var $result:=$client.chat.completions.create($messages; {model: "gpt-4o-mini" })
-```
-
-Obtener la respuesta como texto
-
-```4d
-var $text:=$result.choice.text
-```
-
-Anexar la respuesta del asistente para la siguiente solicitud de finalización
-
-```
-$messages.push($result.choice.message) // {"role":"assistant"; "content": "xxx" }
-```
-
-### retrieve()
-
-**retrieve**(*completionID* : Text; *parameters* : OpenAIParameters): Object
-
-| Parámetros | Tipo | Descripción |
-| -------------- | --------------------------------------- | ------------------------------------------------------------- |
-| *completionID* | Text | The ID of the chat completion to retrieve. |
-| *parámetros* | [OpenAIParameters](OpenAIParameters.md) | Parámetros adicionales para la petición. |
-| Resultado | Object | El objeto de finalización de chat recuperado. |
-
-Obtener una finalización de chat almacenada.
-
-https://platform.openai.com/docs/api-reference/chat/get
-
-### update()
-
-**update**(*completionID* : Text; *metadata* : Object, *parameters* : OpenAIParameters) : Object
-
-| Parámetros | Tipo | Descripción |
-| -------------- | --------------------------------------- | ----------------------------------------------------------------------- |
-| *completionID* | Text | ID de la finalización del chat que se desea actualizar. |
-| *metadata* | Object | Metadatos con los que actualizar la finalización. |
-| *parámetros* | [OpenAIParameters](OpenAIParameters.md) | Parámetros adicionales para la petición. |
-| Resultado | Object | El objeto de finalización del chat actualizado. |
-
-Modificar una finalización de chat almacenada.
-
-https://platform.openai.com/docs/api-reference/chat/update
-
-### delete()
-
-**delete**(*completionID* : Text; *parameters* : OpenAIParameters) : Object
-
-| Parámetros | Tipo | Descripción |
-| -------------- | --------------------------------------- | ---------------------------------------------------------------- |
-| *completionID* | Text | El ID de la finalización de chat a eliminar. |
-| *parámetros* | [OpenAIParameters](OpenAIParameters.md) | Parámetros adicionales para la petición. |
-| Resultado | Boolean | Si la eliminación se ha realizado correctamente. |
-
-Borrar una conversación almacenada.
-
-https://platform.openai.com/docs/api-reference/chat/delete
-
-### lista()
-
-**list**(*parameters* : OpenAIChatCompletionsListParameters) : Collection
-
-| Parámetros | Tipo | Descripción |
-| ------------ | ----------------------------------------------------------------------------- | -------------------------------------------------------------------- |
-| *parámetros* | [OpenAIChatCompletionsListParameters](OpenAIChatCompletionsListParameters.md) | Parámetros para listar los chats completados. |
-| Resultado | Collection | Una colección de finalizaciones de chat almacenadas. |
-
-Lista almacenada de finalizaciones de chat.
-
-https://platform.openai.com/docs/api-reference/chat/list
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatCompletionsParameters.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatCompletionsParameters.md
deleted file mode 100644
index c99b8df824bc22..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatCompletionsParameters.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-id: openaichatcompletionsparameters
-title: OpenAIChatCompletionParameters
----
-
-# OpenAIChatCompletionParameters
-
-The `OpenAIChatCompletionParameters` class is designed to handle the parameters required for chat completions using the OpenAI API.
-
-## Hereda
-
-- [OpenAIParameters](OpenAIParameters.md)
-
-## 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. |
-| `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` | Qué temperatura de muestreo utilizar, entre 0 y 2. Higher values make the output more random, while lower values make it more focused and deterministic. |
-| `store` | Boolean | `False` | Whether or not to store the output of this chat completion request. |
-
-## Ver también
-
-- [OpenAIChatCompletionsAPI](OpenAIChatCompletionsAPI.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatHelper.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatHelper.md
deleted file mode 100644
index dcb5c5824fe70f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIChatHelper.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-id: openaichathelper
-title: OpenAIChatHelper
----
-
-# OpenAIChatHelper
-
-El asistente de chat permite conservar una lista de mensajes en memoria y efectuar avisos consecutivos.
-
-## Propiedades
-
-| Nombre de la propiedad | Tipo | Valor por defecto | Descripción |
-| ---------------------- | --------------------------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------- |
-| `chat` | [OpenAIChatAPI](OpenAIChatAPI.md) | - | La instancia API de chat utilizada para la comunicación con OpenAI. |
-| `systemPrompt` | [OpenAIMessage](OpenAIMessage.md) | - | El mensaje del sistema que guía las respuestas del asistente de chat. |
-| `numberOfMessages` | Integer | 5 | El número máximo de mensajes a conservar en el historial de chat. |
-| `parámetros` | [OpenAIChatCompletionsParameters](OpenAIChatCompletionsParameters.md) | - | Los parámetros para la solicitud de terminación del chat OpenAI. |
-| `messages` | Colección de [OpenAIMessage](OpenAIMessage.md) | [] | La colección de mensajes intercambiados en la sesión de chat. |
-
-## Funciones
-
-### prompt()
-
-**prompt**(*prompt* : Text) : OpenAIChatCompletionsResult
-
-| Parámetros | Tipo | Descripción |
-| ---------- | ------------------------------------------------------------- | ------------------------------------------------------------------ |
-| *prompt* | Text | Texto a enviar al chat de OpenAI. |
-| Resultado | [OpenAIChatCompletionsResult](OpenAIChatCompletionsResult.md) | El resultado de finalización devuelto por el chat. |
-
-Envía una consulta de usuario al chat y devuelve el resultado de finalización correspondiente.
-
-#### Ejemplo de Uso
-
-```4D
-var $chatHelper:=$client.chat.create("You are a helpful assistant.")
-
-var $result:=$chatHelper.prompt("Hello, how can I help you today?")
-$result:=$chatHelper.prompt("Why 42?")
-```
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIImagesAPI.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIImagesAPI.md
deleted file mode 100644
index cba3d60fdc6f22..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIImagesAPI.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-id: openaiimagesapi
-title: OpenAIImagesAPI
----
-
-# OpenAIImagesAPI
-
-The `OpenAIImagesAPI` provides functionalities to generate images using OpenAI's API.
-
-https://platform.openai.com/docs/api-reference/images
-
-## Funciones
-
-### generate()
-
-**generate**(*prompt* : Text; *parameters* : OpenAIImageParameters) : OpenAIImagesResult
-
-| Parámetros | Tipo | Descripción |
-| ------------ | ------------------------------------------------- | --------------------------------------------------------------------- |
-| *prompt* | Text | El indicador que se utilizará para generar la imagen. |
-| *parámetros* | [OpenAIImageParameters](OpenAIImageParameters.md) | Parámetros para la generación de imágenes. |
-| Resultado | [OpenAIImagesResult](OpenAIImagesResult.md) | El resultado que contiene las imágenes generadas. |
-
-Crea una imagen a partir de una instrucción.
-
-https://platform.openai.com/docs/api-reference/images/create
-
-## Ejemplo
-
-```4d
-var $result:=$client.image.generate("A futuristic city skyline at sunset"; {size: "1024x1024"})
-
-var $image:=$result.image
-If($image#Null)
- $image.saveToDisk(Folder(fk desktop folder).file("skylinecity.png"))
-End if
-```
-
-Si se genera más de una imagen
-
-```4d
-var $image: cs.AIKit.OpenAIImage
-For each($image; $resule.images || [])
- // asBlob, asPicture, saveToDisk
-End for each
-```
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIMessage.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIMessage.md
deleted file mode 100644
index 796c6be5dd98fb..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIMessage.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-id: openaimessage
-title: OpenAIMessage
----
-
-# OpenAIMessage
-
-The `OpenAIMessage` class represents a structured message containing a role, content, and an optional user. This class provides methods to manipulate and retrieve the text and other content of the message.
-
-## Propiedades
-
-| Propiedad | Tipo | Descripción |
-| ----------- | ------- | ------------------------------------------------------------------------------------------- |
-| `rol` | Text | El rol del mensaje (por ejemplo, "user", "assistant"). |
-| `contenido` | Variant | The content of the message, which can be a text or a collection of objects. |
-| `user` | Text | An optional property representing the user associated with the message. |
-
-## Propiedades calculadas
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---- | ----------------------------------------------------------------- |
-| `text` | Text | Una propiedad que representa el mensaje de texto. |
-
-## Funciones
-
-### addImageURL()
-
-**addImageURL**(*imageURL* : Text; *detail* : Text)
-
-| Parámetros | Tipo | Descripción |
-| ---------- | ---- | -------------------------------------------------------- |
-| *imageURL* | Text | La URL de la imagen a añadir al mensaje. |
-| *detail* | Text | Detalles adicionales sobre la imagen. |
-
-Añade una URL de imagen al contenido del mensaje.
-
-## Ejemplo de Uso
-
-```4d
-// Create an instance of OpenAIMessage
-var $message:=OpenAIMessage({role: "user"; content: "Hello!"})
-
-// Add an image URL with details
-$message.addImageURL("http://example.com/image.jpg"; "high")
-```
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIParameters.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIParameters.md
deleted file mode 100644
index b8b2bbdd465aac..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIParameters.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-id: openaiparameters
-title: OpenAIParameters
----
-
-# OpenAIParameters
-
-The `OpenAIParameters` class is designed to handle execution and request parameters for interacting with the OpenAI API.
-
-## Propiedades
-
-### Propiedades de la programación asíncrona
-
-| Propiedad | Tipo | Descripción |
-| ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `formula` u `onTerminate` | Function | Una función que se llamará de forma asíncrona cuando termine. Asegúrese de que el proceso actual no termina. |
-| `onResponse` | Function | A function to be called asynchronously when the request finishes successfully. Asegúrese de que el proceso actual no termina. |
-| `onError` | Function | A function to be called asynchronously when the request finishes with errors. Asegúrese de que el proceso actual no termina. |
-| `throw` | Boolean | Si es true, lanza un error si se produce uno. Sólo si no se ha definido ninguna retrollamada de fórmula. |
-
-Ver la [documentación sobre código asíncrono](../asynchronous-call.md)
-
-### Propiedades de la red
-
-| Propiedad | Tipo | Descripción |
-| -------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `timeout` | Real | Overrides the client-level default timeout for the request, in seconds. Por defecto es 0. |
-| `httpAgent` | HTTPAgent | Anula el agente HTTP predeterminado a nivel de cliente para la petición. |
-| `maxRetries` | Integer | El número máximo de reintentos para la petición. (Sólo si el código no es asíncrono, es decir, no se proporciona ninguna función) |
-| `extraHeaders` | Object | Encabezados adicionales para enviar con la petición. |
-
-### Propiedades OpenAPI
-
-| Propiedad | Tipo | Descripción |
-| --------- | ---- | ----------------------------------------------------------------------------------------------------------- |
-| `user` | Text | A unique identifier representing the end-user, which helps OpenAI monitor and detect abuse. |
-
-## Clases heredadas
-
-Several classes inherit from `OpenAIParameters` to extend its functionality for specific use cases. A continuación se muestran algunas de las clases que extienden `OpenAIParameters`:
-
-- [OpenAIChatCompletionsParameters](OpenAIChatCompletionsParameters.md)
-- [OpenAIChatCompletionsMessagesParameters](OpenAIChatCompletionsMessagesParameters.md)
-- [OpenAIImageParameters](OpenAIImageParameters.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIResult.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIResult.md
deleted file mode 100644
index 17425d3f39ed97..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/OpenAIResult.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-id: openairesult
-title: OpenAIResult
----
-
-# OpenAIResult
-
-The `OpenAIResult` class is designed to handle the response from HTTP requests and provides functions to evaluate the success of the request, retrieve body content, and collect any errors that may have occurred during processing.
-
-## Propiedades
-
-| Propiedad | Tipo | Descripción |
-| --------- | ------------------------------------------------------------------------------------ | ---------------- |
-| `request` | [4D.HTTPRequest](https://developer.4d.com/docs/API/HTTPRequestClass) | La petición HTTP |
-
-## Propiedades calculadas
-
-| Propiedad | Tipo | Descripción |
-| ------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------ |
-| `success` | Boolean | Booleano que indica si la petición HTTP se ha realizado correctamente. |
-| `errors` | Collection | Devuelve una colección de errores. These could be network errors or errors returned by OpenAI. |
-| `terminated` | Boolean | Un booleano que indica si la petición HTTP fue terminada. |
-| `headers` | Object | Devuelve los encabezados de respuesta como un objeto. |
-| `rateLimit` | Object | Returns rate limit information from the response headers. |
-| `utilización` | Object | Devuelve la información de uso del cuerpo de la respuesta, si existe. |
-
-### rateLimit
-
-The `rateLimit` property returns an object containing rate limit information from the response headers.
-This information includes the limits, remaining requests, and reset times for both requests and tokens.
-
-For more details on rate limits and the specific headers used, refer to [the OpenAI Rate Limits Documentation](https://platform.openai.com/docs/guides/rate-limits#rate-limits-in-headers).
-
-La estructura del objeto `rateLimit` es la siguiente:
-
-| Campo | Tipo | Descripción |
-| ------------------- | ------- | ------------------------------------------------------------------------ |
-| `limit.request` | Integer | Número de solicitudes permitidas. |
-| `limit.tokens` | Integer | Número de tokens permitidos. |
-| `remaining.request` | Integer | Número de peticiones restantes. |
-| `remaining.tokens` | Integer | Número de tokens restantes. |
-| `reset.request` | String | Tiempo hasta que se restablece el límite de solicitudes. |
-| `reset.tokens` | String | Tiempo hasta que se restablece el límite de fichas. |
-
-## Funciones
-
-### `throw()`
-
-Lanza el primer error de la colección `errors`. This function is useful for propagating errors up the call stack.
-
-## Clases heredadas
-
-Several classes inherit from `OpenAIResult` to extend its functionality for specific use cases. Below are some of the classes that extend `OpenAIResult`:
-
-- [OpenAIChatCompletionsResult](OpenAIChatCompletionsResult.md)
-- [OpenAIChatCompletionsStreamResult](OpenAIChatCompletionsStreamResult.md)
-- [OpenAIImagesResult](OpenAIImagesResult.md)
-- [OpenAIModelResult](OpenAIModelResult.md)
-- [OpenAIModelListResult](OpenAIModelListResult.md)
-- [OpenAIModerationResult](OpenAIModerationResult.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/_ImageUtils.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/_ImageUtils.md
deleted file mode 100644
index f0582c631bbaa0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/_ImageUtils.md
+++ /dev/null
@@ -1,94 +0,0 @@
----
-id: _imageutils
-title: _ImageUtils
----
-
-# _ImageUtils
-
-The `_ImageUtils` internal class provides utility functions for handling images, including converting images to blobs, encoding images to base64, and creating inline PNG representations.
-
-## Funciones
-
-### httpURLToBlob
-
-Converts a URL to a Blob object by making an HTTP request.
-
-| Argumento | Tipo | Descripción |
-| --------- | ---- | ------------------------------------------------ |
-| $url | Text | La URL de la imagen a convertir. |
-
-**Devuelve**: Blob o Null si la solicitud falla.
-
-```4d
-var $blob:=cs._ImageUtils.me.httpURLToBlob("http://example.com/image.png")
-```
-
-### base64ToBlob
-
-Convierte una cadena codificada en base64 en un objeto Blob.
-
-| Argumento | Tipo | Descripción |
-| --------- | ---- | ------------------------------------------------------ |
-| $base64 | Text | La cadena de imagen codificada base64. |
-
-**Devuelve**: Blob que representa la imagen decodificada.
-
-```4d
-var $blob:=cs._ImageUtils.me.base64ToBlob("iVBORw0KGgoAAAANSUhEUgAAAAUA...")
-```
-
-### toBlob
-
-Converts various types of image representations to a Blob object.
-
-| Argumento | Tipo | Descripción |
-| ---------- | ------- | ----------------------------------------------------------------------------------------------- |
-| $imageInfo | Variant | The image information, which can be a picture, a file object, a URL, or a text. |
-
-**Devuelve**: Blob o Null si la entrada no es válida.
-
-```4d
-var $blob:=cs._ImageUtils.me.toBlob($image)
-```
-
-### toBase64
-
-Convierte una imagen en una cadena codificada en base64.
-
-| Argumento | Tipo | Descripción |
-| ---------- | ------- | ----------------------------------------------------------------- |
-| $imageInfo | Variant | La información de la imagen a convertir a base64. |
-
-**Returns**: Base64 encoded Text or an empty string if conversion fails.
-
-```4d
-var $base64:=cs._ImageUtils.me.toBase64($image)
-```
-
-### toInlinedPng
-
-Generates an inline PNG data URI from the given image information.
-
-| Argumento | Tipo | Descripción |
-| ---------- | ------- | -------------------------------------------------------- |
-| $imageInfo | Variant | La información de la imagen a convertir. |
-
-**Returns**: Text containing the inline PNG data URI or an empty string if conversion fails.
-
-```4d
-var $dataUri:=cs._ImageUtils.me.toInlinedPng($image)
-```
-
-### toFormData
-
-Converts an image to a text format suitable for form data submission.
-
-| Argumento | Tipo | Descripción |
-| ---------- | ------- | -------------------------------------------------------- |
-| $imageInfo | Variant | La información de la imagen a convertir. |
-
-**Returns**: Text representing the form data or an empty string if conversion fails.
-
-```4d
-var $formData:=cs._ImageUtils.me.toFormData($image)
-```
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/_OpenAIAsyncOptions.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/_OpenAIAsyncOptions.md
deleted file mode 100644
index f89e9054e62c0d..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/Classes/_OpenAIAsyncOptions.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-id: _openaiasyncoptions
-title: _OpenAIAsyncOptions
----
-
-# _OpenAIAsyncOptions
-
-The `_OpenAIAsyncOptions` internal class provides function to handle asynchronously HTTP response and pass it to user configured formula.
-
-## Propiedades
-
-### Propiedades HTTP
-
-| Propiedad | Tipo |
-| ---------- | ------- |
-| `method` | Text |
-| `headers` | Object |
-| `dataType` | Text |
-| `body` | Variant |
-| \`timeout | Integer |
-
-### Propiedades de instancias de clase
-
-| Propiedad | Tipo |
-| ------------ | --------------------------------------------------------------------- |
-| `client` | [OpenAI](OpenAI.md) |
-| `parámetros` | [OpenAIChatCompletionsParameters](OpenAIChatCompletionsParameters.md) |
-| `resultado` | [OpenAIResult](OpenAIResult.md) |
-
-## Funciones
-
-### onTerminate()
-
-On terminate envía [OpenAIResult](OpenAIResult.md) a la retrollamada "formula".
-
-### onData()
-
-On data receive send [OpenAIChatCompletionsStreamResult](OpenAIChatCompletionsStreamResult.md) to the callback "formula".
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/asynchronous-call.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/asynchronous-call.md
deleted file mode 100644
index 04a95326fa5a54..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/asynchronous-call.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-id: asynchronous-call
-title: Asynchronous Call
----
-
-# Asynchronous Call
-
-If you do not want to wait for the OpenAPI response when making a request to its API, you need to use asynchronous code.
-
-Debe proporcionar un `4D.Formula` para recibir el resultado. Ver [OpenAIParameters](Classes/OpenAIParameters.md) para una lista de ellos.
-
-The asynchronous method is based on [4D.HTTPRequest](https://developer.4d.com/docs/API/HTTPRequestClass), so the response will be received within the current process.
-
-> ⚠️ If your process ends at the conclusion of the current method (e.g., using New process, or playing in the method editor), the callback formula might not be called asynchronously. In such cases, consider using `CALL WORKER` or `CALL FORM`.
-
-## Ejemplos de uso
-
-### Lista de modelos
-
-```4d
-$client.models.list({formula: Formula(MyReceiveMethod($1))})
-```
-
-`$1` will be an instance of [OpenAIModelListResult](Classes/OpenAIModelListResult.md), so `MyReceiveMethod` method could be:
-
-```4d
-#DECLARE($result: cs.AIKit.OpenAIModelListResult)
-
-If($result.success)
-
- Form.models:=$result.models
-
-Else
-
- Alert($result.errors.formula(Formula(JSON Stringify($1))).join("\n"))
-
-End if
-```
-
-### finalización del chat
-
-```4d
-var $messages:=[{role: "system"; content: "You are a helpful assistant."}]
-$messages.push({role: "user"; content: "Could you explain me why 42 is a special number"})
-
-$client.chat.completions.create($messages; { onResponse: Formula(MyChatCompletionsReceiveMethod($1))})
-```
-
-`$1` será una instancia de [OpenAIChatCompletionsResult](Classes/OpenAIChatCompletionsResult.md), así que el método `MyChatCompletionsReceiveMethod` podría ser:
-
-```4d
-#DECLARE($result: cs.AIKit.OpenAIChatCompletionsResult)
-
-ASSERT($result.success) // We use onResponse here, callback receive only if success
-Form.assistantMessage:=$result.choices[0].text
-```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/compatible-openai.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/compatible-openai.md
deleted file mode 100644
index 083386b322ac41..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/aikit/compatible-openai.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-id: compatible-openai
-title: Proveedores
----
-
-# Proveedores
-
-Many AI providers propose an OpenAI-like API, so you can use this project to connect to them.
-
-To do so you just have to change the original `baseURL` by the service one and use their api key if needed.
-
-## Remoto
-
-| Proveedor | Url base |
-| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
-| https://mistral.ai/ | https://api.mistral.ai/v1 |
-| https://www.deepseek.com/ | https://api.deepseek.com |
-| https://www.anthropic.com/ (claude) | https://api.anthropic.com/v1 |
-| https://docs.api.nvidia.com/ | https://integrate.api.nvidia.com/v1 |
-| https://gemini.google.com/ | https://generativelanguage.googleapis.com/v1beta/openai |
-| https://groq.com/ | https://api.groq.com/openai/v1 |
-| https://ai.azure.com/ | https://YOUR_RESOURCE_NAME.openai.azure.com |
-| [https://www.alibabacloud.com/](https://www.alibabacloud.com/help/en/model-studio/developer-reference/use-qwen-by-calling-api) (qwen) | https://dashscope-intl.aliyuncs.com/compatible-mode/v1 |
-| https://www.perplexity.ai/ | https://api.perplexity.ai |
-
-## Local
-
-| Proveedor | Url base por defecto | Doc |
-| ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
-| https://ollama.com/ | http://127.0.0.1:11434/v1 | https://ollama.com/blog/openai-compatibility |
-| https://lmstudio.ai/ | http://localhost:1234/v1 | https://lmstudio.ai/docs/api/endpoints/openai |
-| https://localai.io/ | http://127.0.0.1:8080 | |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/assets/en/getStart/logo4d.png b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/assets/en/getStart/logo4d.png
deleted file mode 100644
index ada7b5c538af02..00000000000000
Binary files a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/assets/en/getStart/logo4d.png and /dev/null differ
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/assets/en/getStart/welcome2.png b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/assets/en/getStart/welcome2.png
deleted file mode 100644
index 035256650d6c86..00000000000000
Binary files a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/assets/en/getStart/welcome2.png and /dev/null differ
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/code-editor/write-class-method.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/code-editor/write-class-method.md
deleted file mode 100644
index 69b345fc80c662..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/code-editor/write-class-method.md
+++ /dev/null
@@ -1,850 +0,0 @@
----
-id: write-class-method
-title: Editor de código
----
-
-4D tiene un poderoso editor de código integrado que ofrece un amplio conjunto de funcionalidades para la edición de código altamente productivo, como la finalización inteligente de código, la navegación de código, la depuración, la búsqueda y más.
-
-
-
-El editor de código funciona como un editor de texto. Escribir un método o una clase suele ser una combinación de escribir texto, seleccionar componentes y arrastrar elementos desde el Explorador u otras ventanas. También se pueden utilizar varias funciones de tecleo predictivo para crear métodos más rápidamente.
-
-Puede desplazarse por el contenido de métodos, clases y funciones, que pueden incluir hasta 32.000 líneas de código o 2 GB de texto.
-
-El Editor de Código 4D ofrece una comprobación básica de errores de sintaxis. Cuando se ejecuta el código se realiza una comprobación adicional de errores. Para más información sobre cómo gestionar los errores, consulte [Depuración](../Debugging/basics.md).
-
-:::note
-
-If you are used to coding with **VS Code**, you can also use this editor with 4D code after installing the [4D-Analyzer](https://github.com/4d/4D-Analyzer-VSCode) extension.
-
-:::
-
-## Interface
-
-### Toolbar (Barra de herramientas)
-
-Cada ventana del Editor de Código tiene una barra de herramientas que ofrece acceso instantáneo a las funciones básicas relacionadas con la ejecución y edición de código.
-
-| Elemento | Icono | Descripción |
-| ------------------------------------ | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **Ejecución del método** |  | Cuando se trabaja con métodos, cada ventana del Editor de Código tiene un botón que puede utilizarse para ejecutar el método actual. Utilizando el menú asociado a este botón, puede elegir el tipo de ejecución:
**Ejecutar nuevo proceso**: Crea un proceso y ejecuta el método en modo estándar en este proceso.
**Ejecutar y depurar nuevo proceso**: Crea un nuevo proceso y muestra el método en la ventana Depurador para su ejecución paso a paso en este proceso.
**Ejecutar en proceso Aplicación**: Ejecuta el método en modo estándar en el contexto del proceso Aplicación (es decir, en la ventana de visualización del registro).
**Ejecutar y depurar en el proceso Aplicación**: Muestra el método en la ventana del Depurador para su ejecución paso a paso en el contexto del proceso Aplicación (en otras palabras, la ventana de visualización de registros).
Para más información sobre la ejecución de métodos, ver [Llamada a métodos proyecto](../Concepts/methods.md#calling-project-methods). |
-| **Buscar en el método** |  | Muestra el [*Área de búsqueda*](#find-and-replace). |
-| **Macros** |  | Inserta una macro en la selección. Haga clic en la flecha desplegable para mostrar una lista de macros disponibles. Para obtener más información sobre como crear e instanciar macros, consulte [Macros](#macros). |
-| **Expandir todo/Contraer todo** |  | Estos botones permiten expandir o contraer todas las estructuras de flujo de control del código. |
-| **Información del método** |  | Muestra el diálogo [Propiedades del método](../Project/code-overview.md#project-method-properties) (sólo métodos proyecto). |
-| **Últimos valores del portapapeles** |  | Muestra los últimos valores almacenados en el portapapeles. |
-| **Portapapeles** |  | Nueve portapapeles disponibles en el editor de código. Puede [utilizar estos portapapeles](#clipboards) haciendo clic directamente en ellos o utilizando los atajos de teclado. Puede utilizar la opción [Preferencias](Preferences/methods.md#options-1) para ocultarlas. |
-| **Menú desplegable de navegación** |  | Le permite navegar dentro de métodos y clases con contenido etiquetado automáticamente o marcadores declarados manualmente. Ver abajo |
-
-### Área de edición
-
-Aquí es donde se escribe y edita el código. El editor aplica automáticamente sangrías al texto del código y colorea los distintos elementos sintácticos para que la estructura del código sea clara.
-
-Puede personalizar la visualización del área de edición. Toda personalización se transmite automáticamente a todas las ventanas del editor de código:
-
-| Option | Descripción | Definido en... |
-| ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **fuente** y **tamaño de fuente** | Define la fuente y el tamaño de los caracteres que se utilizarán en el área de edición | **Preferencias** > [**Métodos**](../Preferences/methods.md) o **Método > Ver** > **Fuente más grande** o **Fuente más pequeña** |
-| **estilo y color de los elementos de sintaxis** | Asignar un color y/o estilo específico a cada tipo de elemento del lenguaje 4D. También puede cambiar los distintos colores utilizados en la interfaz del área de edición (resaltado, fondo, etc.). | Haga clic derecho en un elemento lingüístico (variable, palabra clave, etc.) > Submenú **Estilo**. O **Preferencias** > [**Métodos**](../Preferences/methods.md) |
-| **espacios** | Puede visualizar los espacios entre palabras mediante puntos (.) en lugar de espacios en blanco. Esta opción se aplica a todos los elementos del código (nombres de comandos, variables, comentarios, etc.). | **Método > Ver > Espacios en blanco** |
-| **temas** | Puedes seleccionar el tema Dark o Light, o definir uno personalizado | **Preferencias** > [**Métodos**](../Preferences/methods.md) |
-| **ancho de indentaciones de código** | Define el ancho de las sangrías de código | **Preferencias** > [**Métodos**](../Preferences/methods.md) |
-
-#### Barras de cambio
-
-Las barras de colores muestran al instante dónde se han modificado las líneas de código desde que se abrió el método:
-
-
-
-Las barras de modificación cambian de color para indicar si las modificaciones se han guardado o no:
-
-- amarillo: se ha modificado la línea y aún no se ha guardado el método.
-- verde: se ha modificado la línea y se ha guardado el método.
-
-### Área listas
-
-El área listas permite visualizar una o varias listas de elementos necesarios para escribir métodos y clases (comandos, constantes, formularios, etc.). Puede elegir el número y el contenido de las listas que aparecen en la ventana.
-
-Por defecto, el editor de código muestra cuatro listas. Puede ocultar o mostrar todas las listas haciendo clic en el icono situado en la parte inferior derecha de la ventana. 
-
-Puede ampliar o reducir el ancho relativo de cada área lista arrastrando una de sus particiones. También es posible ajustar el tamaño del área lista en relación con el del área de edición arrastrando la línea divisoria entre ambas.
-
-- Al hacer doble clic en un elemento de una lista, éste se inserta en el área de edición, en la posición del cursor.
-- Para **modificar el contenido** de una lista, haga clic en el área del título de la lista en cuestión: aparecerá un menú emergente que le permitirá elegir el tipo de elemento que desea visualizar.
-
-
-
-- Para añadir o eliminar una lista, haga clic en el área del título de una de las listas y elija el comando correspondiente en el menú emergente.
- El comando **Eliminar esta lista** se desactiva al hacer clic en la última lista. Si desea ocultar todas las listas, debe hacer clic en el botón **mostrar u ocultar listas** situado en la parte inferior derecha de la ventana u ocultarlas por defecto en las **Preferencias**.
-
-- Puede ocultar las listas en todas las ventanas de las siguientes maneras:
- - Seleccione la opción **Ver > Listas** en el menú **Método** (una marca de verificación indica si se muestran las listas)
- - Desmarque la opción **Preferencias** > **Métodos** > **Opciones** > **Mostrar listas**. Para que se tengan en cuenta las modificaciones realizadas en la ventana de diálogo de **Preferencias**, primero es necesario cerrar y luego volver a abrir cualquier método, clase o función que esté abierto.
-
-#### Listas de elementos disponibles
-
-Puede mostrar las siguientes listas de elementos en el área de listas de la ventana del Editor de código:
-
-- **Todas las tablas y campos**: nombres de tablas y campos de la base de datos en forma de lista jerárquica. Cuando inserta un nombre de campo en el método haciendo doble clic sobre su nombre, 4D lo inserta respetando la sintaxis y añade el nombre de la tabla o subtabla según el caso.
-- **Tabla** (submenú): nombres de los campos de la tabla seleccionada utilizando el submenú.
-- **Tabla actual**: nombres de campo de la tabla actual (disponibles en triggers, métodos de formulario y métodos de objeto).
-- **Formularios proyecto**: nombres de formularios proyectos de bases de datos. Cuando hace doble clic en el nombre de un formulario de proyecto, 4D lo inserta respetando la sintaxis: el nombre del formulario se inserta entre comillas.
-- **Formularios tabla**: nombres de tablas y formularios de la base de datos en forma de lista jerárquica. Cuando inserta un nombre de formulario en un método haciendo doble clic en su nombre, 4D lo inserta respetando la sintaxis: el nombre del formulario se inserta entre comillas y va precedido del nombre de la tabla y de un punto y coma. Por ejemplo: [Table];"Form".
-- **Métodos**: nombres de los métodos proyecto de la base de datos.
-- **Todas las carpetas**: nombres de carpetas y subcarpetas de objetos definidos en la base de datos mostrados en forma de lista jerárquica. Las carpetas pueden utilizarse para organizar los objetos de forma personalizada. Se gestionan desde la página de inicio del Explorador.
-- **Carpetas** (submenú): contenido de la carpeta seleccionada utilizando el submenú.
-- **Macros**: nombres de macros definidos para la base de datos (ver [Creación y utilización de macros](#macros)).
-- **Comandos**: vomandos del lenguaje 4D por orden alfabético.
-- **Comandos por temas**: comandos del lenguaje 4D clasificados por temas en forma de lista jerárquica.
-- **Barras de menú**: nombres y números de las barras de menú [creadas con el editor de barras de menú 4D](../Menus/creating.md).
-- **Constantes**: constantes 4D y de los posibles plug-ins, clasificadas por temas en forma de lista jerárquica.
-- **Listas**: nombres de las listas.
-- **Todos los comandos de los plug-ins**: comandos para todos los plug-ins instalados en la base de datos (si los hay), clasificados por temas en forma de lista jerárquica.
-- **Palabras clave SQL**: conjunto de palabras clave reconocidas por el analizador sintáctico de 4D SQL. Esta lista incluye comandos (por ejemplo, SELECT), cláusulas (por ejemplo, WHERE) y funciones (ABS).
-- **Funciones SQL**: Funciones SQL 4D.
-
-**Nota:** excepto para el elemento Macros, todas las listas están en orden alfabético.
-
-#### Guardar como plantilla
-
-Puede guardar las listas definidas en la ventana del Editor de código en forma de plantilla. Una vez guardada la plantilla, los parámetros establecidos en ella se utilizarán para cada nueva ventana del Editor de código que se abra.
-
-Los siguientes parámetros se almacenan en la plantilla:
-
-- Tamaño relativo de las áreas de edición y de la lista
-- Número de listas
-- Ubicación y contenido de cada lista
-- Ancho relativo de cada lista
-
-Para guardar una ventana del Editor de código como plantilla, seleccione **Método** > **Guardar como plantilla**. La plantilla se guarda inmediatamente (no aparece ningún diálogo). La plantilla se guarda inmediatamente (no aparece ningún diálogo). Si ya existe una plantilla anterior, se sustituye.
-
-### Área de puntos de ruptura
-
-Esta áreaa, situada a la izquierda del área de edición, le permite visualizar los números de línea e insertar puntos de interrupción directamente junto a instrucciones específicas. Los puntos de interrupción son útiles durante la fase de depuración de su programación. Detienen la ejecución de su código en lugares específicos y muestran el depurador.
-
-Para obtener más información sobre los puntos de interrupción, consulte la sección [Depurador](../Debugging/breakpoints.md#breakpoints).
-
-Puede mostrar u ocultar los números de línea en el área de puntos de interrupción para cada ventana del Editor de código.
-
-- Para activar o desactivar la visualización de los números de línea por defecto, seleccione **Preferencias** > **Métodos** > **Mostrar números de línea**.
-- Para modificar esta visualización por separado para cada ventana del Editor de Código, elija **Método** > **Ver** > **Números de línea**.
-
-La visualización de los números de línea facilita la orientación en la ventana. \*\*Método \*\* > **Ir al número de línea...** también le permite aprovechar esta visualización.
-
-Este tipo de búsqueda es útil cuando se utiliza junto con el [compilador](../Project/compiler.md), que señala los errores de ejecución por el número de línea en el que se producen.
-
-### Barra de estado
-
-La barra de estado situada en la parte inferior derecha de la ventana del editor muestra la posición del cursor en todo momento:
-
-
-
-- **Ln**: número de línea
-- **Col**: número de columna, es decir, el nivel en la jerarquía de las estructuras de programación. El primer nivel es 0. El número de columna es útil para la depuración, ya que esta información puede ser proporcionada por el intérprete en caso de error en el código.
-- **Ch**: ubicación del caracter en la línea.
-- : ocultar/mostrar listas.
-
-Al situar el cursor en un comando, función o parámetro(s), la barra de estado muestra la sintaxis del comando. Si escribe o selecciona un parámetro, el área muestra el parámetro actual en **negrita**:
-
-
-### Despliegue de navegación
-
-La lista desplegable de navegación le ayuda a organizar su código y a navegar más fácilmente dentro de sus clases y métodos:
-
-
-
-Algunas etiquetas se añaden automáticamente y puede complementar la lista desplegable utilizando los [marcadores ](#manual-tagging).
-
-#### Navegación en el código
-
-Haga clic en un elemento de la lista desplegable para acceder a su primera línea en el código. También puede navegar con las teclas de flecha y presionar **Intro**.
-
-#### Etiquetado automático
-
-Los constructores, las declaraciones de métodos, las funciones y los atributos calculados se etiquetan automáticamente y se añaden a la lista desplegable.
-
-Cuando no hay ninguna etiqueta en la clase/método, la herramienta muestra "Sin etiqueta".
-
-Los siguientes elementos se añaden automáticamente:
-
-| Icono | Elemento |
-| --------------------------------------------------------------------------- | ----------------------------------------------------------------- |
-|  | Sin etiqueta |
-|  | Class constructor o declaración de método |
-|  | Atributo calculado (get, set, orderBy y query) |
-|  | Nombre de la función de clase |
-
-#### Etiquetado manual
-
-Añadiendo marcadores en su código, puede añadir las siguientes etiquetas a la lista desplegable:
-
-| Icono | Elemento |
-| ------------------------------------------------------- | ------------------------------ |
-|  | MARK: etiqueta |
-|  | TODO: etiqueta |
-|  | FIXME: tag |
-
-Se declaran añadiendo comentarios como:
-
-```4d
-// FIXME: Corrige los siguientes elementos
-```
-
-Las declaraciones no distinguen entre mayúsculas y minúsculas; escribir `fixme:` tiene el mismo efecto.
-
-Añadir un guión después de la etiqueta `MARK:` dibuja una línea de separación en el editor de código y en el menú desplegable. Así que escribiendo esto:
-
-
-
-Esto es lo que resulta:
-
-
-
-Todos los marcadores situados dentro de las funciones tienen sangría en la lista desplegable, excepto las etiquetas `MARK:` situadas al final de las funciones y no seguidas de instrucciones. Estos aparecerán en el primer nivel.
-
-#### Orden de visualización
-
-Las etiquetas se muestran en su orden de aparición dentro del método/clase.
-
-Para mostrar las etiquetas de un método o de una clase en orden alfabético, realice una de las siguientes acciones:
-
-- **haga clic derecho** en la herramienta desplegable
-- mantenga **Cmd** en macOS o **Alt** en Windows, y haga clic en la herramienta de lista desplegable
-
-> Las etiquetas dentro de las funciones se mueven con sus elementos padres.
-
-### Atajos
-
-Múltiples funcionalidades del editor de código de 4D están disponibles a través de atajos de teclado por defecto.
-
-:::info macOS
-
-En macOS, utilice la tecla **Command** en lugar de la tecla **Ctrl** mencionada (Windows).
-
-:::
-
-| **Atajo** | **Acción** |
-| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| **Selección y navegación** | |
-| Doble clic | Seleccionar un nombre de elemento del lenguaje |
-| [Alt]+doble clic | Seleccionar un nombre de elemento del lenguaje que contenga espacios (constante, método, etc.) |
-| [Shift]+[flecha derecha] | Crear y ampliar la selección, caracter por caracter, hacia la derecha, o Reducir la selección, caracter por caracter, desde la izquierda |
-| [Shift]+[flecha izquierda] | Reducir la selección, caracter por caracter, desde la derecha o Crear y ampliar la selección, caracter por caracter, hacia la izquierda |
-| [Shift]+[flecha abajo] | Crear y ampliar una selección, línea por línea, de arriba abajo |
-| [Shift]+[flecha arriba] | Crear y ampliar una selección, línea por línea, desde abajo hacia arriba |
-| [Ctrl]+[Shift]+[flecha derecha] | Crear y ampliar la selección, palabra por palabra, desde la derecha |
-| [Ctrl]+[Shift]+[flecha izquierda] | Reducir la selección, palabra por palabra, desde la derecha, o crear y ampliar la selección, palabra por palabra, desde la izquierda |
-| [Ctrl]+[flecha derecha] | Mover el punto de inserción, palabra por palabra, de izquierda a derecha |
-| [Ctrl]+[flecha izquierda] | Mover el punto de inserción, palabra por palabra, de derecha a izquierda |
-| [Alt]+[flecha abajo] | Mover la(s) línea(s) donde está el cursor hacia abajo |
-| [Alt]+[flecha arriba] | Mover la(s) línea(s) donde está el cursor a la parte superior |
-| [Home] | Colocar el punto de inserción al comienzo de la línea |
-| [End] | Coloca el punto de inserción al final de la línea |
-| [Ctrl]+[Home] | Colocar el punto de inserción al comienzo del método |
-| [Ctrl]+[End] | Coloca el punto de inserción al final del método |
-| [Shift]+[Home] | Seleccionar todos los caracteres de la línea situados a la izquierda del cursor |
-| [Shift]+[End] | Selecciona todos los caracteres de la línea que están a la derecha del cursor |
-| [PgUp] | Desplazar el contenido del método, página a página, de abajo a arriba (no modifica el punto de inserción) |
-| [PgDn] | Desplazar el contenido del método, página a página, de arriba abajo (no modifica el punto de inserción) |
-| [**Introspección**](#goto-definition) | |
-| [Ctrl]+K o [Alt]+doble clic | Igual que el comando [**Goto definition**](#goto-definition) |
-| [Ctrl] (Windows) o [Alt] (macOS)+pasar sobre un token | Subraye el token (elemento lingüístico identificado). Haz clic en el token subrayado = igual que el comando [**Goto definition**](#goto-definition) |
-| [**Buscar y reemplazar**](#buscar y reemplazar) | |
-| [Ctrl]+F | Buscar |
-| [Ctrl]+G | Buscar siguiente |
-| [Ctrl]+[Shift]+G | Buscar anterior |
-| [Ctrl]+E | Buscar el siguiente |
-| [Ctrl]+[Shift]+E | Buscar el mismo anterior |
-| [Ctrl]+[Alt]+F | Reemplazar |
-| [Ctrl]+[Alt]+G | Reemplazar siguiente |
-| [Ctrl]+[Alt]+[Shift]+G | Reemplazar anterior |
-| [**Portapapeles**](#portapapeles) | |
-| [Shift]+clic o [Alt]+clic en el icono del portapapeles | Copiar el texto seleccionado en el portapapeles |
-| [Ctrl]+[Shift]+tecla numérica | Copiar el texto seleccionado en el portapapeles numérico |
-| [Ctrl]+clic en el icono del portapapeles | Pegar el contenido de un portapapeles en la posición del cursor |
-| [Ctrl]+tecla numérica | Pegar el contenido del portapapeles numérico en la posición del cursor |
-
-:::tip
-
-La mayoría de estos atajos pueden personalizarse en la caja de diálogo [Preferencias 4D](../Preferences/shortcuts.md).
-
-:::
-
-## Edición de código
-
-4D utiliza técnicas estándar de edición de texto para digitar y editar en el Editor de código.
-
-El editor de código utiliza convenciones de visualización (estilo, color) para los elementos de sintaxis. Puede [personalizar estas convenciones](#editing-area). A medida que digita, cuando valida su entrada, 4D evalúa el texto de la línea y aplica el formato de visualización adecuado. 4D también indenta cada línea a su nivel adecuado en relación con la línea precedente cuando utiliza estructuras de programación (If, End if...).
-
-Puede utilizar las teclas de flecha para moverse rápidamente de línea a línea. Utilizar las teclas de flecha para desplazarse por varias líneas es más rápido que hacer clic porque el editor tarda en evaluar la línea en busca de errores.
-
-En Windows, el editor de código incluye un editor de código de entrada (IME) para facilitar la edición de código en sistemas japoneses o chinos.
-
-El Editor de código incluye numerosos [atajos de navegación](#shortcuts).
-
-#### Uso de la barra invertida
-
-El carácter barra invertida (`\`) tiene un soporte específico en el lenguaje 4D:
-
-- insertado al final de las líneas, permite escribir una única instrucción en [varias líneas](../Concepts/quick-tour.md#code-on-several-lines).
-- permite definir [secuencias de escape](../Concepts/quick-tour.md#escape-sequences).
-
-:::caution
-
-El caracter de barra invertida (`\`) se utiliza como separador en [los nombres de ruta en Windows](../Concepts/paths.md#windows). En general, 4D interpretará correctamente los nombres de ruta de Windows introducidos en el Editor de código sustituyendo la barra invertida simple por una barra invertida doble. Por ejemplo, `C:\MyDocuments` se convertirá en `C:\\MyDocuments`. Sin embargo, si escribe `"C:\MyDocuments\New"`, 4D mostrará `"C:\\MyDocuments\New"`. En este caso, la segunda barra invertida se interpreta incorrectamente como `\N` (una [secuencia de escape](../Concepts/quick-tour.md#escape-sequences) existente). Por lo tanto, debe introducir una barra invertida doble cuando quiera insertar una barra invertida antes de un caracter que se utiliza en una de las secuencias de escape reconocidas por 4D.
-
-:::
-
-### Arrastrar y soltar
-
-Desde el Explorador, puede arrastrar y soltar tablas, campos, formularios, métodos proyecto, constantes o comandos 4D. Cuando arrastra y suelta un elemento, 4D siempre utiliza la sintaxis correcta. Por ejemplo, si arrastra el nombre del campo First Name `[People]`, aparecerá en el Editor de código como `[People]First Name`. Del mismo modo, si arrastra el nombre del formulario Entrada desde la tabla People, aparecerá en el Editor de Código como `[People];"Input"`.
-
-Cuando inserta un comando arrastrándolo desde la página **Comandos** del Explorador, aparece con su sintaxis (que consiste en todos sus parámetros) en el Editor de Código. Esta funcionalidad simplemente le recuerda los parámetros que espera el comando. A continuación, puede utilizar una sintaxis que se adapte mejor a su uso.
-
-También puede arrastrar y soltar dentro de un método, clase, función o entre dos diferentes. En el Editor de código, el mecanismo de arrastrar y soltar se activa en cuanto se selecciona una parte del texto.
-Por defecto, el mecanismo de arrastrar y soltar **mueve** el texto seleccionado. Para **copiarlo**, mantenga presionada la tecla **Ctrl** (Windows) o la tecla **Opción** (macOS) durante la operación.
-
-### Alternancia entre mayúsculas y minúsculas
-
-Puede modificar automáticamente las mayúsculas y minúsculas de los caracteres seleccionados utilizando los comandos en **Métodos** > **Mayúsculas y minúsculas** o el menú contextual del editor:
-
-- **Mayúsculas** / **Minúsculas**: cambia los caracteres seleccionados a mayúsculas o minúsculas.
-- **cameyúsculas** / **cameyúsculas**: cambia los caracteres seleccionados a "cameyúsculas". Consiste en cambiar cada primera letra de un grupo de palabras adjuntas a mayúsculas. Este tipo de notación se utiliza a menudo para las nomenclaturas variables. hireDate y PurchaseDate son ejemplos de dos variantes de la notación cameyúsculas.
-
-Cuando aplica uno de estos comandos a una selección de texto, se eliminan los espacios y los caracteres "_" y la primera letra de cada palabra pasa a ser mayúscula.
-
-### Intercambiar expresión
-
-La función **cameyúsculas** puede utilizarse para invertir los argumentos de una expresión que asigna un valor. Por ejemplo,
-
-`variable1:=variable2`
-
-se convierte en
-
-`variable2:=variable1`
-
-Esta función es extremadamente útil para invertir un conjunto de asignaciones utilizadas para obtener o definir propiedades, o para corregir errores de entrada. Para utilizar esta función, seleccione la(s) línea(s) que desea modificar y, a continuación, elija **Método** > **Intercambiar expresión** o utilice el menú contextual del área. To use this function, select the line(s) to be modified, then choose Method > Swap Expression or use the context menu of the area.
-
-### Portapapeles
-
-Además de la operación estándar de copiar y pegar, 4D ofrece dos funciones adicionales que le permiten trabajar con el contenido de diferentes portapapeles:
-
-- El programa almacena en memoria las 10 últimas acciones de "copiar" o "cortar" realizadas en el Editor de código durante la sesión actual. Cada uno de los diferentes contenidos guardados de esta manera puede ser reutilizado en cualquier momento. Para ello, utilice el comando **Historial del Portapapeles** del menú contextual del Editor de Código o el botón "Últimos valores del Portapapeles" de la barra de herramientas:
-
- 
-
- Se muestran las primeras palabras de los elementos copiados o cortados. Seleccione un elemento para insertarlo en la ubicación actual del cursor.
-
-- Dispone de nueve portapapeles numerados adicionales que pueden emplearse directamente mediante los botones de la barra de herramientas del Editor de código o [utilizando atajos de teclado](#shortcuts):
-
-
-
-### Líneas móviles
-
-Puede mover la línea donde está el cursor directamente sin seleccionarla primero utilizando los comandos **Mover líneas hacia arriba** y **Mover líneas hacia abajo** del menú **Método**. También puede hacerlo utilizando el atajo de teclado **Alt/Opción** + **Flecha arriba** o **Flecha abajo** .
-
-### Funciones de autocompletar
-
-El editor de código ofrece funciones de autocompletado. 4D muestra automáticamente sugerencias basadas en los primeros caracteres tecleados.
-
-En el ejemplo siguiente, al teclear la cadena "poli" aparece un triángulo azul que indica que hay varias sugerencias disponibles:
-
-
-
-Cuando los caracteres que ingresa corresponden a una única posibilidad, este valor sugerido aparece en gris (y se inserta si presiona la tecla **Tab**):
- ---> 
-
-> Si marcó la opción **Insertar () y cerrar } ) ] "** en la página **Métodos** de las **Preferencias**, 4D añadirá automáticamente **()** después de un comando 4D, palabra clave o método de proyecto que requiere uno o más argumentos obligatorios (después de aceptar una sugerencia o finalización):
-> ! ](. /assets/en/code-editor/insert-and-closing-1.png) -> 
-
-El autocompletado también funciona con estructuras de código (por ejemplo, If..End if, For each...End for each): cuando introduzca la primera parte de la estructura, el Editor de código le sugerirá automáticamente la parte de cierre:
-
-
-Si hay varias sugerencias disponibles, 4D las muestra en una lista emergente al presionar la tecla **Tab**:
-
-
-
-La lista está en orden alfabético. Elija el valor haciendo doble clic en él o desplácese por la lista utilizando las teclas de flecha del teclado y, a continuación, presione **Intro**, **Retorno de carro** o **Tab** para insertar el valor seleccionado.
-
-Por defecto, también puede insertar un valor sugerido presionando uno de los siguientes delimitadores `( ; : = < [ {` teclas después de seleccionar un valor: el valor insertado va seguido del delimitador, listo para la entrada de datos.
-
- + **(** key --> 
-
-> Puede desactivar el uso de delimitadores para insertar valores sugeridos en **Preferencias** > **Métodos** > **Opciones**.
-
-Puede presionar la tecla **Esc** para cerrar la lista emergente o puede seguir escribiendo mientras está abierta. Los valores sugeridos en la lista emergente se actualizan a medida que se introducen los caracteres adicionales.
-
-Si los caracteres tecleados corresponden a distintos tipos de objetos, la lista los muestra en su estilo actual. Se pueden mostrar los siguientes tipos de objetos:
-
-- Comandos 4D
-- Comandos SQL
-- Métodos Usuario
-- Nombres de las tablas
-- Nombres de los campos
-- Constantes
-- Variables declaradas en el método
-- Nombres de propiedad objeto
-- Comandos del Plug-in
-- Palabras claves 4D
-- Palabras clave SQL
-- Macros (mostradas entre < >)
-
-> Por razones prácticas, puede desactivar la visualización automática de la lista de sugerencias para **constantes**, **variables (locales o interprocesos) y atributos de objeto**, **tablas** y/o **prototipos**. Estas opciones se encuentran en **Preferencias** > **Métodos** > **Opciones**
-
-#### Nombres de propiedad objeto
-
-4D muestra automáticamente sugerencias que distinguen mayúsculas y minúsculas de todos los nombres de propiedades de objetos válidos en el código 4D cuando:
-
-- escribe un punto "." después de un objeto o
-- utilizar la tecla Tab después de un puntero objeto desreferenciado "->".
-
-
-
-> La propiedad `length` se incluye siempre para su uso con colecciones.
-
-Una vez creados, los nombres de las propiedades se almacenan en una lista global interna y están disponibles cada vez que un método/clase/función se abre, se cierra o cambia de foco.
-
-
-
-La lista de sugerencias se actualiza dinámicamente mientras se edita el código. Al cambiar de una ventana a otra, los nombres de las propiedades nuevas/editadas se añaden siempre a la lista global. La lista también se actualiza cuando se previsualiza un método, clase o función en el Explorador.
-
-Cuando se reinicia la base de datos, la lista se reinicia.
-
-> Puede desactivar la visualización automática de las propiedades de los objetos en **Preferencias** > **Métodos** > **sugerencias**.
-
-## Buscar y reemplazar
-
-El editor de código dispone de poderosas funcionalidades de **buscar y reemplazar** que se aplican a la ventana actual.
-
-En la barra de herramientas de toda ventana de método se puede mostrar un área de buscar y reemplazar:
-
-
-
-Para mostrar esta área, haga clic en el icono **Buscar en método** de la [barra de herramientas](#barra de herramientas) o seleccione una función de búsqueda o sustitución a través de un [**método abreviado**](#métodos abreviados) o un comando del submenú **Edición > Buscar**. Puede cerrar esta área en cualquier momento presionando el botón **x** situado en el extremo derecho de la barra de herramientas.
-
-:::tip
-
-La función **Buscar en diseño** de la barra de herramientas de 4D o del menú **Editar** no es específico del editor de código, pero puede utilizarse para buscar un valor entre todos los métodos y clases.
-
-:::
-
-### Buscar
-
-Seleccione **Buscar > Buscar...** en el menú **Editar** o escriba **Ctrl+F** (Windows)/**Cmd+F** (macOS) para mostrar/activar el área *Buscar*.
-
-La búsqueda definida en esta área se realizará en el código situado en la ventana.
-
-El área de entrada **buscar** permite introducir la cadena a buscar. Esta área es un combo box que almacena las últimas 10 cadenas que se han buscado o reemplazado durante la sesión. Esta área es un combo box que almacena las últimas 10 cadenas que se han buscado o reemplazado durante la sesión. Entonces puede utilizar este texto o reemplazarlo por otro.
-
-Una vez introducida o seleccionada una cadena, se resaltan todas las ocurrencias encontradas en la ventana abierta y en la parte derecha del área se muestra el número total de aciertos encontrados. También indica la posición actual del cursor entre todos los aciertos.
-
-Presione la tecla **Intror** para seleccionar la ocurrencia más cercana al cursor. También puede hacer clic en los botones **Siguiente / Anterior**  para seleccionar todas las ocurrencias secuencialmente hacia el principio o el final del método actual, comenzando desde la posición inicial del cursor, o utilizar los comandos **Buscar siguiente** y **Buscar anterior** del [menú **Edición**](#shortcuts).
-
-#### Opciones
-
-- **Sensible a mayúsculas y minúsculas** : tenga en cuenta las mayúsculas y minúsculas tal como se ingresaron en el área de búsqueda. Esta opción también tiene en cuenta los caracteres diacríticos. Por ejemplo, una búsqueda de "MyVar" no encontrará "myVar"; una búsqueda de "dej" no encontrará "déjà".
-- **Toda la palabra** : limita la búsqueda a las ocurrencias exactas de la palabra buscada. Cuando esta opción está marcada, por ejemplo, una búsqueda de "cliente" no encontrará ni "clientes" ni "micliente" Por defecto, esta opción no está marcada; por lo tanto, una búsqueda de "var" encontrará "Myvar", "variation", etc.
-
-### Reemplazar
-
-Haga clic en el botón de alternancia **v** situado a la izquierda del área *Buscar* para mostrar/ocultar el área *Reemplazar*. También puede seleccionar **Buscar > Reemplazar...** en el menú **Editar** o escribir **Ctrl+Alt+F** (Windows)/**Cmd+Alt+F** (macOS).
-
-El área de entrada *Reemplazar* se utiliza para definir la cadena de caracteres que sustituirá a la definida anteriormente.
-
-Haga clic en el botón **Reemplazar** para iniciar la búsqueda con todas las opciones definidas y reemplazar la primera ocurrencia encontrada. 4D inicia la búsqueda a partir del punto de inserción del texto actual y continúa hasta el final del método. Luego es posible continuar encontrando/reemplazando utilizando los comandos **Reemplazar siguiente** y **Reemplazar anterior** del [menú Editar](#shortcuts).
-
-Haga clic en el botón **Reemplazar todo** para reemplazar todas las ocurrencias correspondientes a los criterios de búsqueda directamente en el método abierto.
-
-### Buscar lo mismo
-
-El comando **Buscar el mismo** se utiliza para buscar cadenas de caracteres idénticas a la seleccionada. Este comando sólo está activo si ha seleccionado al menos un caracter en el Editor de código.
-
-La búsqueda realizada es del tipo "Buscar siguiente" en la ventana actual del editor de código.
-
-Los comandos **Find Same Next** y **Find Same Previous** se utilizan para encontrar cadenas de caracteres *estrictamente* idénticas a las seleccionadas. Por ejemplo, las mayúsculas y minúsculas deben coincidir.
-
-### Marcar todo
-
-El comando **Editar > Marcar todo** se activa cuando ya se ha especificado una búsqueda en la caja de diálogo buscar o reemplazar. Cuando selecciona este comando, 4D pone un marcador en cada línea que contiene un elemento correspondiente al criterio de búsqueda "actual". Esto facilita la localización de todos los resultados de la búsqueda. Para más información sobre marcadores, consulte [Marcadores](#bookmarks).
-
-## Advertencias y errores
-
-Gracias al Verificador en vivo de código 4D, la sintaxis, la consistencia y la estructura del código introducido se comprueban automáticamente para evitar errores de ejecución. Por ejemplo, el Verificador en vivo de código puede detectar que falta un paréntesis derecho o que utilizo un atributo dataclass desconocido.
-
-El Verificador en vivo de código se activa en tres niveles:
-
-- cuando escriba código en el editor de código,
-- cuando [verifique la sintaxis](../Project/compiler.md#check-syntax) en el compilador,
-- cuando [compile](../Project/compiler.md) el proyecto.
-
-4D comprueba automáticamente la sintaxis del código para ver si es correcta. Si introduce texto o selecciona un componente que no es correcto, 4D muestra un símbolo para indicar la expresión incorrecta.
-
-Se muestran dos tipos de símbolos:
-
-- **[warnings](../Project/compiler.md#warnings)** : los warnings están destinados a llamar su atención sobre declaraciones que podrían llevar a errores de ejecución. No impiden la compilación.
-- **errores**: los errores son anomalías que impiden que el código se ejecute correctamente. Deben ser corregidos, de lo contrario el proyecto no se compilará.
-
-Al pasar el ratón por encima del símbolo, un mensaje de ayuda muestra la causa del error:
-
-
-
-El Verificador en vivo de código se activa mientras ingresa el código. Cuando una línea de un método, clase o función esté marcada como de sintaxis incorrecta, compruebe y corrija la entrada. Si la línea es correcta, 4D elimina el símbolo de error. Al guardar o cerrar la ventana, se valida todo el método.
-
-Puede formatear la línea actual (sin avanzar a la línea siguiente) presionando la tecla **Intro** del teclado numérico. 4D evalúa la línea, le da formato, marca cualquier error y coloca el punto de inserción al final de la línea.
-
-El Verificador en vivo de código verifica lo siguiente:
-
-- errores de sintaxis básicos (operadores equivocados, errores ortográficos y similares)
-- la estructura de las instrucciones (`If`, `End if` y así sucesivamente)
-- coincidencia de caracteres en el código, tales como paréntesis o corchetes (ver el consejo más abajo)
-- las llamadas de atributos y funciones según su modelo (ORDA) y las definiciones de clase de usuario. Por ejemplo, el Verificador de código en vivo genera un error cuando una llamada a un atributo calculado de base de datos no es compatible con el tipo de atributo calculado declarado.
-
-:::tip
-
-Cuando escribe un caracter de encierro, 4D indica la coincidencia enmarcando los caracteres de inicio/fin con rectángulos grises por defecto:
-
-
-
-Puede modificar la forma en que 4D indica los caracteres de cierre coincidentes o desactivar esta función en las [**Preferencias**](../Preferences/methods.md#options-1).
-
-:::
-
-El Verificador en vivo de código no puede detectar algunos errores que solo ocurren durante la ejecución. Los errores de ejecución son detectados por 4D cuando se ejecuta el código. Sin embargo, tenga en cuenta que el compilador también proporciona una ayuda indispensable para detectar errores.
-
-## Mensajes de ayuda
-
-El Editor de código ofrece diversa información contextual utilizando consejos de ayuda. Aparecen al pasar el ratón sobre un objeto.
-
-:::tip
-
-La [barra de estado](#status-bar) también ofrece información contextual.
-
-:::
-
-- **Errores**: al pasar el ratón sobre el símbolo que indica un error a la izquierda del área de edición, aparece un consejo de ayuda que muestra la causa del error (ver [Errores de sintaxis](#warnings-and-errors)).
-
-- **Documentación de comandos 4D**: al pasar el ratón sobre un comando o función 4D, un mensaje de ayuda ofrece su sintaxis junto con una breve descripción de su funcionamiento.
- 
-
-- **Tipo de variable y descripción**: al pasar el ratón sobre una variable, un mensaje de ayuda muestra su tipo (si se ha definido explícitamente en el método) y el comentario asociado, si existe.
- 
-
-- **Métodos o funciones proyecto**: al pasar el ratón sobre un método proyecto o función clase, aparece un mensaje de ayuda:
-
- - o los comentarios especificados en el Explorador.
- - o las primeras líneas del método o función de clase si incluye comentarios (líneas que empiezan por // o /*...*/ bloque de comentarios). Es práctica habitual insertar la documentación del método, así como sus parámetros, en forma de comentarios al principio del método. Puede obtener esta información directamente en el mensaje de ayuda, sólo asegúrese de eliminar primero todo comentario que se encuentre en el Explorador.
- Comentarios al inicio de un método:
- 
- Consejo de ayuda en otro método:
- 
-
-- También puede crear un **archivo de documentación dedicado** llamado `.md` en la carpeta `/documentation`. Ver [Visualización de la documentación en el editor de código](../Project/documentation.md#viewing-documentation-in-the-code-editor)
-
-## Comentar / Descomentar
-
-El lenguaje 4D soporta los [comentarios](../Concepts/quick-tour.md#comments), que son líneas de código inactivas. El editor de código no aplica ningún estilo particular dentro de los comentarios. La longitud de los comentarios está limitada al tamaño máximo de 32.000 caracteres por línea.
-
-Existen dos tipos de comentarios: `//comment` (comentario de una línea) y `/*comment*/`(comentarios en línea o bloques de comentarios multilínea).
-
-Se pueden crear comentarios digitando los caracteres `/`. O, el comando **Comentar/Descomentar**, que se encuentra en el menú **Método** así como en el menú contextual del Editor de Código se utiliza para marcar un grupo de líneas de código seleccionadas como comentarios de una sola línea o, por el contrario, para eliminar los caracteres de comentario de una sola línea de una selección. Para utilizar este comando, seleccione el código que desea marcar como comentado y, a continuación, seleccione el comando **Comentar/Descomentar**:
-
- --> 
-
-Cuando la selección sólo contiene código activo, se aplica el comando **Comentario**. Cuando la selección incluye tanto código activo como líneas comentadas, se añade a estas últimas un par adicional de caracteres de comentario ( // ); de este modo, conservarán su estado inicial de comentadas si la línea se "descomenta" posteriormente Cuando la selección contiene sólo líneas comentadas, se aplica el comando **Descomentar**.
-
-> El comando **Comentar/Descomentar** sólo funciona con líneas completas --- no puede utilizarse para comentar sólo parte de una línea.
-
-## Expandir / Contraer
-
-El código 4D situado dentro de bucles y condiciones puede ahora contraerse o expandirse, para facilitar la lectura de los métodos:
-
-- Código expandido:
- 
-
-- Código contraído:
- 
-
-Si sitúa el ratón sobre el botón de expansión [...], aparece un mensaje de ayuda que muestra las primeras líneas del código oculto.
-
-Se puede seleccionar, copiar, pegar o eliminar una porción de código contraída. Todas las líneas incluidas en él se copiarán, pegarán o borrarán respectivamente. Cuando se pega una parte del código, se expande automáticamente.
-
-Hay varias formas de expandir y contraer código:
-
-- Haga clic en los iconos de expandir/contraer ([+] y [-] en Windows) o en el botón de abrir [...]
-- Utilice los comandos del submenú **Método > Contraer/Expandir**:
-
- - **Contraer selección** / **Expandir selección**: contrae o expande todas las estructuras de código que se encuentran en la selección de texto.
- - **Contraer nivel actual** / **Expandir nivel actual**: contrae o expande la estructura del código en el nivel en el que se encuentra el cursor. Estos comandos también están disponibles en el **menú contextual** del editor.
- - **Contraer todo** / **Expandir todo**: contrae o expande todos los bucles y condiciones de un método. Estos comandos también están disponibles en la barra de herramientas del editor.
-
-## Bloques
-
-Los bloques pueden definirse por:
-
-- Comillas
-- Paréntesis
-- Una estructura lógica (If/Else/End if, While/End while, Repeat/Until Case of/End case)
-- Paréntesis
-
-### Seleccionar bloque envolvente
-
-La función **Seleccionar bloque envolvente** se utiliza para seleccionar el "bloque envolvente" del código que contiene el punto de inserción.
-
-Si ya se ha seleccionado un bloque de texto, la función selecciona el bloque adyacente del nivel inmediatamente superior, y así sucesivamente, hasta seleccionar todo el método.
-
-Si presiona **Ctrl+Mayús+B** (Windows) o **Comando+Mayús+B** (macOS), podrá invertir esta operación y anular la selección del último bloque delimitador seleccionado.
-
-**Nota:** si el punto de inserción se sitúa en una estructura de tipo `If` o `Else`, el bloque que lo encierra será el que contenga, respectivamente, la sentencia `If` o `Else`.
-
-### Inicio del bloque o fin del bloque
-
-Dos comandos facilitan el desplazamiento dentro de estructuras de código (por ejemplo, `If...Else...End if`):
-
-- **Inicio de bloque**: sitúa el cursor al final de la estructura actual, justo después de la palabra clave inicial.
-- **Fin de bloque**: sitúa el cursor al final de la estructura actual, justo después de la palabra clave final.
-
-Estos comandos se encuentran en el menú **Método**, así como en el menú contextual del editor. También puede utilizar los siguientes atajos:
-
-- Windows: **Ctrl + flecha arriba** o **Ctrl** + **flecha abajo**'
-- macOS: **Comando** + **flecha arriba** o **Comando** +**flecha abajo**.
-
-## Marcadores
-
-4D le permite asociar marcadores con ciertas líneas en sus métodos. A continuación, puede navegar rápidamente por el código pasando de un marcador a otro utilizando comandos específicos.
-
-
-
-Un marcador se desplaza junto con su línea original si se insertan líneas adicionales en el método. Los marcadores se guardan con los métodos.
-
-Los marcadores se gestionan utilizando el submenú **Marcadores** del menú **Método**:
-
-- **Alternar**: asocia un marcador a la línea actual (donde se encuentra el cursor) si no tiene ya uno o elimina el marcador existente si lo tiene. Esta función también está disponible utilizando el comando **Alternar marcador** del menú contextual del editor o utilizando el atajo de teclado **Ctrl+F3** (Windows) o **Comando+F3** (macOS).
-- **Eliminar todo**: elimina todos los marcadores de la ventana en primer plano.
-- **Ir al siguiente** / **Ir al anterior**: permite navegar entre los marcadores de la ventana. Al seleccionar uno de estos comandos, el cursor se sitúa en el primer caracter de la línea asociada al marcador en cuestión. También puede utilizar los atajos de teclado **F3** (ir a la siguiente) o **Mayús+F3** (ir a la anterior).
-
-:::info
-
-Puede utilizar marcadores como señalizadores de líneas que contengan un elemento [encontrado mediante una búsqueda](#find). En este caso, 4D añade automáticamente los marcadores. Para más información, consulte [Marcar todos](#bookmark-all).
-
-:::
-
-## Revelar en el Explorador
-
-El comando **Revelar en el Explorador...** abre una ventana del Explorador con el elemento de destino seleccionado. Para ello, coloque el cursor dentro del nombre del elemento o selecciónelo y, a continuación, elija **Método** > **Revelar en el Explorador...**.
-
-## Buscar los llamantes
-
-El comando **Buscar los llamantes** del menú **Método** solo está habilitado para métodos proyecto. Busca todos los objetos (otros métodos o menús) que hacen referencia al método proyecto.
-
-**Nota:** el comando **Buscar llamantes...** también está disponible en **Explorador** > **Métodos**
-
-Este comando muestra sus resultados en una nueva ventana.
-
-## Ir a definición
-
-El comando **Ir a definición** abre la definición de un elemento referenciado en el Editor de Código. Para ello, coloque el cursor dentro del nombre del objeto o selecciónelo, y elija **Método** > **Ir a Definición...** o utilice el menú contextual del editor.
-
-:::tip
-
-Esta función también está disponible a través del atajo de teclado **Ctrl+K** (Windows) / **Comando+K** (macOS) o **Alt+doble clic**.
-
-:::
-
-El efecto del comando **Ir a definición...** varía en función del elemento de destino:
-
-- con un método proyecto, muestra el contenido del método en una nueva ventana del Editor de código
-- con un nombre clase o una función clase, abre la clase en el Editor de código
-- con un comando o función 4D integrado, tiene el mismo efecto que el comando [**Mostrar documentación**](#show-documentation).
-
-## Mostrar la documentación
-
-El comando **Mostrar documentación...** abre la documentación del elemento de destino. Para ello, coloque el cursor dentro del nombre del elemento o selecciónelo y, a continuación, elija **Método** > **Mostrar documentación...** o utilice el menú contextual. El efecto varía en función del elemento objetivo. Por ejemplo:
-
-- Seleccionar un método proyecto o una clase usuario y elegir **Mostrar documentación...** selecciona el método en el Explorador y cambia a la pestaña de documentación
-- Al seleccionar un comando, función o nombre de clase 4D y elegir **Mostrar documentación...** se muestra la documentación en línea.
-- Si no se selecciona ningún elemento, el comando abre la documentación del método actualmente abierto en el Editor de Código, [si existe](../Project/documentation.md).
-
-:::tip
-
-Para mostrar la documentación de un comando del lenguaje "clásico" 4D, seleccione el nombre del comando o simplemente sitúe el cursor en el nombre y presione **F1**. La documentación del comando se muestra en una nueva ventana de su navegador predeterminado. La documentación del comando se muestra en una nueva ventana de su navegador predeterminado.
-
-:::
-
-## Buscar referencias
-
-El comando **Buscar Referencias...** que se encuentra en el menú **Método** o en el menú contextual del Editor de Código encuentra todos los objetos (métodos y formularios) del proyecto en los que el elemento actual del método está referenciado (utilizado
-
-El elemento actual es el seleccionado o aquel en el que se encuentra el cursor. Puede ser un nombre de campo, un nombre de variable, un comando, una cadena, etc. Por ejemplo, la siguiente acción busca todas las ocurrencias de la variable *vlNbCmd* en la base de datos:
-
-
-
-Este comando muestra sus resultados en una nueva ventana.
-
-## Macros
-
-Puede utilizar macrocomandos en sus métodos. El uso de macrocomandos permite ahorrar mucho tiempo durante la entrada de código.
-
-Un macro-comando es una parte de código 4D accesible permanentemente y que puede insertarse en cualquier parte de sus métodos, sea cual sea el tipo de la base abierta. Las macros pueden contener todo tipo de texto, comandos y constantes 4D, así como también etiquetas especiales, que se sustituyen en el momento de la inserción de la macro por valores derivados del contexto del método. Por ejemplo, una macro puede contener la etiqueta `;` en el momento de la inserción de la macro, esta etiqueta será sustituida por el nombre del método proyecto actual.
-
-Las macros se almacenan en uno o varios archivos en formato XML (texto). Pueden colocarse en una lista del editor de código; también pueden llamarse utilizando el menú contextual del editor o utilizando la función de entrada predictiva.
-
-Las macros 4D están escritas en formato XML. Puede utilizar el archivo de macros por defecto de 4D tal como está o modificarlo.
-
-### Ubicación de las macros
-
-4D carga las macros desde una carpeta llamada **Macros v2**. Las macros deben estar en forma de uno o varios archivos XML ubicados en esta carpeta.
-
-La carpeta "Macros v2" puede ser ubicada:
-
-- En la carpeta 4D activa de la máquina. Las macros son compartidas para todas las bases.
- **Nota:** la ubicación de la carpeta 4D activa varía según el sistema operativo utilizado. Para más información, consulta la descripción del comando [Get 4D folder](../commands-legacy/get-4d-folder.md) en el manual *Lenguaje* 4D.
-- Junto al archivo de estructura de la base. Las macros sólo se cargan para esta estructura.
-- Para los componentes: en la carpeta **Components** de la base. Las macros sólo se cargan si el componente está instalado.
-
-Estas tres ubicaciones pueden utilizarse simultáneamente: es posible instalar una carpeta "Macros v2" en cada una de ellas. Las macros se cargarán en el siguiente orden: carpeta 4D, archivo de estructura, componente 1... componente X.
-
-### Macros por defecto
-
-4D ofrece un conjunto de macros por defecto que contienen, por ejemplo, palabras clave de flujo de control. Estas macros se incluyen en el archivo por defecto "*Macros.xml*", ubicado en la carpeta "Macros v2" que se crea en la carpeta 4D activa de la máquina durante el arranque inicial de 4D.
-
-Posteriormente, puede modificar este archivo o el contenido de la carpeta como desee (ver el párrafo siguiente). En caso de problemas con esta carpeta, se puede borrar y 4D la volverá a crear en el siguiente inicio.
-
-### Añadir macros personalizadas
-
-Puede añadir macros personalizadas en el archivo "Macros.xml" utilizando un editor de texto estándar o por programación. También puede añadir archivos XML de macros personalizados en esta carpeta.
-
-En modo local, el archivo de macros puede abrirse mientras se utiliza 4D. La lista de macros disponibles se actualiza en cada evento de activación de 4D. Por ejemplo, es posible traer el editor de texto al primer plano, modificar el archivo de macros y, a continuación, volver al método: la nueva macro estará entonces disponible en el Editor de código.
-
-No se muestran macros vacías o erróneas.
-
-#### Comprobación de la sintaxis de las macros personalizadas
-
-Los archivos de macrocomandos de 4D deben ser conformes al estándar XML. Los archivos de macrocomandos de 4D deben ser conformes al estándar XML. Se soportan los diferentes tipos de codificación XML. No obstante, se recomienda utilizar una codificación compatible con Mac/PC (UTF-8). 4D ofrece un DTD que puede utilizarse para validar los archivos de macros. Este archivo se encuentra en la siguiente ubicación:
-
-- Windows: \Resources\DTD\macros.dtd
-- Mac OS: :Contents:Resources:DTD:macros.dtd
-
-Si un archivo de macros no contiene las declaraciones o no puede validarse, no se carga.
-
-#### Síntaxis de macros 4D
-
-Las macros 4D se crean utilizando etiquetas XML personalizadas llamadas "elementos"
-
-Algunas etiquetas indican el inicio y el final de la definición (etiquetas dobles del tipo ``), otras se sustituyen por valores de contexto de inserción (``).
-
-De conformidad con las especificaciones XML, algunas etiquetas de elementos pueden incluir atributos. A menos que se indique lo contrario, estos atributos son opcionales y se utiliza un valor por defecto cuando se omiten. La sintaxis de los elementos con atributos es la siguiente:
-
-- Etiquetas dobles: ` `
-- Etiquetas individuales: ``
-
-Si el elemento acepta varios atributos, puede agruparlos en la misma línea de comando, separados por un espacio:
-`\`
-
-Aquí está la lista de etiquetas y su modo de uso:
-
-| **Etiquetas de elementos** | **Description** |
-| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `` | Inicio y fin del archivo macro (etiqueta obligatoria). |
-| `` | Inicio y fin de la definición de una macro y sus atributos. |
-| | *Atributos*: |
-| | - name: Nombre\*\*de la macro tal y como aparece en los menús y en las listas del Editor de código (atributo obligatorio). |
-| | - type_ahead_text: Cadena de caracteres\*\* que debe introducirse para llamar a la macro utilizando la función type-ahead (también conocida como autocompletar)\*. |
-| | - in_menu: booleano que indica si la macro se puede llamar utilizando el menú contextual\*. Valores = "true" (por defecto) o "false" |
-| | - type_ahead: Booleano que indica si la macro puede llamarse utilizando la función de tecleo predictivo (o autocompletar)\*. Valores = "true" (por defecto) o "false" |
-| | - method_event: se utiliza para activar la llamada automática de la macro en función de la fase actualde manejo de cada método (creación, cierre, etc.). - method_event: se utiliza para activar la llamada automática de la macro en función de la fase actualde manejo de cada método (creación, cierre, etc.). |
-| | "on_save" y "on_close" pueden utilizarse conjuntamente --- en otras palabras, ambos eventos se generan cuando se cierra un método modificado. Por otro lado, "on_create" y "on_load" nunca se generan de forma consecutiva. Este atributo puede utilizarse, por ejemplo, para preformatear los métodos cuando se crean (comentarios en el área de encabezado) o para registrar información como la fecha y la hora en que se cierran. |
-| | - version: utilizada para activar el nuevo modo de soportar selecciones de texto para la macro (ver más adelante la sección "Acerca de la etiqueta ``"). Para activar este nuevo modo, pase el valor "2". Si omite este atributo o pasa la version="1", se conserva el modo anterior. |
-| | - in_toolbar: booleano que indica si la macro debe estar presente en el menú del botón Macro de la barra de herramientas. Valores= "true" (por defecto) o "false". |
-| `` | Etiqueta reemplazada por el texto seleccionado cuando la macro se inserta. La selección puede estar vacía. |
-| `` | Inicio y fin del código que debe insertarse en el método. Se añadirá un retorno de carro antes y después del código. |
-| `` | Inicio y fin del nombre del método proyecto y de su parámetro (opcional). El método se ejecuta cuando se llama a la macro. Puede pasar un parámetro de la forma ("param1;param2;..."). Este parámetro se recibirá en el método utilizando las variables $1, $2, etc. Para más información sobre esta etiqueta, consulte la sección "Acerca de la etiqueta ``". |
-| `` | Ubicación del punto de inserción en el código una vez insertada la macro. |
-| `` | Etiqueta reemplazada por el nombre del usuario 4D actual. |
-| `` | Etiqueta reemplazada por el nombre de usuario actual del sistema. |
-| `` | Etiqueta reemplazada por el nombre del método actual. |
-| `` | Etiqueta reemplazada por sintaxis de ruta (como se devuelve por [`METHOD Get path`](../commands-legacy/method-get-path.md) del método actual. |
-| `` | Etiqueta reemplazada por la fecha actual. |
-| | *Atributo*: |
-| | - format: formato 4D utilizado para mostrar la fecha. Si no se define ningún formato, se utilizará el formato predeterminado. Valores = número de formato 4D (0 a 8). |
-| `` | Etiqueta reemplazada por la hora actual. |
-| | *Atributo*: |
-| | - format: formato 4D utilizado para mostrar la hora. Si no se define ningún formato, se utilizará el formato predeterminado. Valores = número de formato 4D (0 a 6). |
-| `` | Etiqueta reemplazada por el contenido del portapapeles. |
-| | *Atributo*: |
-| | - index: portapapeles a pegar. Valores = número del portapapeles (0 a 9). |
-
-- Macros can be called using the context menu of the Code Editor or using the type-ahead function (see the following section).
- \*\* If you want to conform to XML language specifications, you must not use extended characters (accented characters, quotation marks, etc.).
-
-- Si desea ajustarse a las especificaciones del lenguaje XML, no debe utilizar caracteres extendidos (caracteres acentuados, comillas, etc.).
-
-Este es un ejemplo de definición de una macro:
-
-| **Contenido de la macro** | **Comments** |
-| ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `` | Declaración XML |
-| `` | Declaración del documento |
-| `` | Inicio del archivo XML de macros |
-| `` | Inicio de la definición y del nombre de la macro |
-| `` | Inicio del código de la macro |
-| For($i;1;Records in selection(``)) | La etiqueta `` será reemplazada por el código seleccionado en el método 4D al momento de la inserción de la macro (por ejemplo, un nombre de tabla) |
-| SAVE RECORD(``) | |
-| NEXT RECORD(``) | |
-| End for | |
-| `` | Fin del código macro |
-| `` | Fin de la definición de macro |
-| `` | Fin del archivo XML de macros |
-
-#### Acerca de la etiqueta ``
-
-La etiqueta `` permite generar y utilizar macrocomandos que ejecutan métodos proyecto 4D. Esto permite a los desarrolladores crear funciones sofisticadas que pueden distribuirse mediante macrocomandos asociados a los componentes. Por ejemplo, la siguiente macro hará que el método *MyMethod* se ejecute con el nombre del método actual como parámetro:
-
-`MyMethod("")`
-
-El código de un método llamado se ejecuta en un nuevo proceso. Este proceso se cierra una vez se ejecuta el método.
-
-> Note: The structure process remains frozen until the called method execution is completed. Debe asegurarse de que la ejecución es rápida y de que no hay riesgo de que bloquee la aplicación. If this occurs, use the **Ctrl+F8** (Windows) or **Command+F8** (macOS) command to "kill" the process.
-
-### Llamando macros
-
-Por defecto, las macros pueden llamarse mediante el menú contextual o la barra de herramientas del editor de código, de la función de autocompletar o de una lista específica en la parte inferior de la ventana del editor de código.
-
-Tenga en cuenta que para cada macro es posible restringir la posibilidad de llamarla utilizando el menú contextual y/o la función de autocompletar.
-
-#### Menú contextual y barra de herramientas
-
-Por defecto, todas las macros pueden ser llamadas a través del menú contextual del Editor de Código (utilizando el comando jerárquico **Insert macro**) o el botón **Macros** de la barra de herramientas.
-
-El atributo *in_menu* de la etiqueta `` se utiliza para definir si la macro aparece o no en este menú.
-
-En el menú contextual, las macros se muestran en el orden del archivo "Macros.xml" y de cualquier archivo XML adicional. Por lo tanto, es posible cambiar el orden modificando estos archivos.
-
-#### Autocompletar
-
-Por defecto, todos los macros son accesibles utilizando la función de autocompletar (también conocida como escritura anticipada) (ver [Escribir un método](./write-class-method.md)). El atributo *type_ahead* de la etiqueta `` se puede utilizar para excluir una macro de este tipo de operación.
-
-**Nota:** si la macro contiene la etiqueta ``, no aparecerá en la ventana emergente de autocompletar.
-
-#### Lista del editor de código
-
-Puede mostrar sus macros en una lista del Editor de Código (ver [Escribir un método](./write-class-method.md)). Basta con hacer doble clic en el nombre de una macro de la lista para llamarla. No es posible excluir una macro específica de esta lista.
-
-### Notas de compatibilidad
-
-El soporte de macros puede cambiar de una versión de 4D a otra. Con el fin de mantener la compatibilidad entre las diferentes versiones y conservar sus personalizaciones, 4D no elimina ninguna versión anterior. Si desea utilizar las últimas funciones disponibles, debe adaptar su versión en consecuencia.
-
-#### Variables de selección de texto para métodos
-
-Se recomienda gestionar las selecciones de texto utilizando los comandos [GET MACRO PARAMETER](../commands-legacy/get-macro-parameter.md) y [SET MACRO PARAMETER](../commands-legacy/set-macro-parameter.md). Estos comandos pueden utilizarse para superar la partición de los espacios de ejecución del proyecto local/componente y permitir así la creación de componentes dedicados a la gestión de macros. Para activar este modo para una macro, debe declarar el atributo Version con el valor 2 en el elemento Macro. En este caso, 4D ya no gestiona las variables predefinidas _textSel,_textReplace, etc. y se utilizan los comandos [GET MACRO PARAMETER](../commands-legacy/get-macro-parameter.md) y [SET MACRO PARAMETER](../commands-legacy/set-macro-parameter.md). Este atributo debe declararse así:
-
-`` `--- Text of the macro ---` ``
-
-Si no se pasa este atributo, el modo anterior se mantiene.
-
-#### Incompatibilidades relacionadas con el estándar XML
-
-Para que los archivos de macros respeten la norma XML, deben observarse reglas sintácticas estrictas. Esto puede provocar incompatibilidades con el código de las macros creadas con versiones anteriores e impedir la carga de archivos XML. Las siguientes son las principales fuentes de mal funcionamiento:
-
-- Los comentarios del tipo "// mi comentario", permitidos dentro de los elementos `` en versiones anteriores de 4D, no son compatibles con la sintaxis XML. Las líneas de comentarios deben respetar la forma estándar `""`.
-- Los símbolos `<>` utilizados más particularmente para los nombres de objetos interprocesos deben codificarse. Por ejemplo, la variable `<>params` debe escribirse `<>params`.
-- La etiqueta de declaración inicial `` podía omitirse en versiones anteriores de 4D. Ahora es obligatorio; de lo contrario, el archivo no se cargará.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/bool.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/bool.md
deleted file mode 100644
index b904e37817ded4..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/bool.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-id: bool
-title: Bool
-slug: /commands/bool
-displayed_sidebar: docs
----
-
-**Bool** ( *expresion* ) : Boolean
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| expresion | Expression | → | Expresión para la cual devolver la forma booleana |
-| Resultado | Boolean | ← | Forma booleana de la expresión |
-
-
-
-## Descripción
-
-El comando **Bool** devuelve la forma booleana de la expresión que se pasó en *expresion*.
-
-El comando puede devolver los siguientes valores, dependiendo del tipo de resultado de la *expresion*:
-
-| **Tipo de la expresión** | **Retorno del comando Bool** |
-| ------------------------ | ------------------------------------ |
-| Indefinido | False |
-| Nulo | False |
-| Booleano | False si falso, de lo contrario True |
-| Número | False si 0, otro True |
-| Otros tipos | False |
-
-Este comando es útil cuando se espera que el resultado de una expresión sea un booleano, cualquiera que sea el resultado real de su evaluación (por ejemplo, si se evalúa como **nulo** o **indefinido**).
-
-## Ejemplo
-
-Selecciona un valor dependiendo del contenido de un atributo de campo de objeto, anticipando el caso en el que falta el atributo:
-
-```4d
- var $married : Text
- $married:=Choose(Bool([Person]data.married);"Married";"Single")
- //"Single" si el atributo "married" no se encuentra en el campo
- ALERT("This person is "+$married)
-```
-
-## Ver también
-
-[Date](../commands/date)
-[Num](num.md)
-[String](string.md)
-[Time](time.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1537 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/change-string.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/change-string.md
deleted file mode 100644
index a87c6f4f777a36..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/change-string.md
+++ /dev/null
@@ -1,49 +0,0 @@
----
-id: change-string
-title: Change string
-slug: /commands/change-string
-displayed_sidebar: docs
----
-
-**Change string** ( *fuente* ; *nuevo* ; *posicion* ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| fuente | Text | → | Cadena original |
-| nuevo | Text | → | Nuevos caracteres |
-| posicion | Integer | → | Posición donde comenzar los cambios |
-| Resultado | Text | ← | Cadena resultante |
-
-
-
-## Descripción
-
-Change string devuelve una cadena resultante de cambiar los caracteres, en la cadena *fuente*, a partir de *posicion* con los caracteres en *nuevo*.
-
-Si *nuevo* es una cadena vacía (""), Change string devuelve *fuente* sin cambios. Change string siempre devuelve una cadena de la misma longitud que *fuente*. Si *posicion* es inferior o superior a la longitud de *fuente*, Change string devuelve *fuente*.
-
-Change string se diferencia de [Insert string](insert-string.md "Insert string") en que reemplaza los caracteres en lugar de insertarlos.
-
-## Ejemplo
-
-El siguiente ejemplo ilustra el uso de Change string. Los resultados se asignan a la variable *vtResult*.
-
-```4d
- vtResult:=Change string("Acme";"CME";2) // vtResult es igual a "ACME"
- vtResult:=Change string("noviembre";"dic";1) // vtResult es igual a "diciembre"
-```
-
-## Ver también
-
-[Delete string](delete-string.md)
-[Insert string](insert-string.md)
-[Replace string](replace-string.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 234 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/create-deployment-license.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/create-deployment-license.md
deleted file mode 100644
index 923acaf5438f71..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/create-deployment-license.md
+++ /dev/null
@@ -1,65 +0,0 @@
----
-id: create-deployment-license
-title: Create deployment license
-slug: /commands/create-deployment-license
-displayed_sidebar: docs
----
-
-**Create deployment license** ( *mergedApp* ; *buildLicense* {; *oemLicense*} ) : Object
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| mergedApp | 4D.Folder | → | Carpeta que contiene la aplicación fusionada |
-| buildLicense | 4D.File | → | Licencia necesaria para generar la licencia anidada |
-| oemLicense | 4D.File | → | Licencia 4D OEM XML Key si se trata de una licencia servidor |
-| Resultado | Object | ← | Estado |
-
-
-
-## Descripción
-
-El comando **Create deployment license** crea un archivo de licencia anidado en la carpeta Licenses de la aplicación creada *mergedApp*. Si la carpeta Licenses no existe en *mergedApp*, el comando la creará.
-
-En *mergedApp*, pase un objeto [4D.Folder](../API/FolderClass.md) que contenga una referencia a la carpeta que contiene la aplicación creada en la que desea anidar una licencia.
-
-En *license*, pase un objeto [4D.File](../API/FileClass.md) que contenga una referencia al archivo de licencia utilizado para generar la licencia anidada.
-
-Si la compilación requiere una licencia OEM específica (*4D OEM XML Keys*) y si dicha licencia no está ya instalada en la carpeta Licenses de la máquina de compilación, necesita pasarla utilizando el parámetro *oemLicense* parameter. TEste parámetro es útil si dedica una máquina a crear sus aplicaciones.
-
-| **Propiedad** | **Tipo** | **Descripción** |
-| ------------- | ------------------------------------------------------ | --------------------------------------------- |
-| success | Booleano | True si se ha generado el archivo de licencia |
-| file | [4D.File](../API/FileClass.md) | El archivo de licencia generado |
-| statusText | Texto | Descripción del error si lo hay |
-| errors | Collection | Colección de objetos de error |
-| \[\].message | Texto | Mensaje de error |
-| \[\].errCode | Number | Número de error |
-
-**Notas:**
-
-* La licencia generada debe utilizarse únicamente con la aplicación a la que hace referencia *mergedApp*.
-* Es necesario regenerar la licencia cada vez que se reconstruya la aplicación.
-
-## Ejemplo
-
-```4d
- var $status : Object
- var $application : 4D.File
- var $license : 4D.File
- $license:=Folder(fk licenses folder).file("4UUD200-xxx.license4D")
- $application:=Folder(fk desktop folder).folder("myApp.app")
- $status:=Create deployment license($application;$license)
-```
-
-## Ver también
-
-
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1811 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/current-time.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/current-time.md
deleted file mode 100644
index 25c84085ed4ff4..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/current-time.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-id: current-time
-title: Current time
-slug: /commands/current-time
-displayed_sidebar: docs
----
-
-**Current time** {( * )} : Time
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| * | Operador | → | Devuelve la hora actual del servidor |
-| Resultado | Time | ← | Hora actual |
-
-
-
-## Descripción
-
-El comando Current time devuelve la hora actual del reloj de sistema.
-
-La hora actual siempre está entre *00:00:00* y *23:59:59*. Utilice [String](string.md "String") o [Time string](time-string.md "Time string") para convertir en cadena la expresión de tipo hora devuelta por Current time.
-
-**4D Server:** si utiliza el parámetro (\*) cuando ejecuta esta función en un equipo 4D Client, la función devuelve la hora actual del servidor.
-
-## Ejemplo 1
-
-El siguiente ejemplo le muestra cómo medir la duración de una operación. Acá, LongOperation es un método que necesita ser cronometrado:
-
-```4d
- $vhStartTime:=((Current date-!1980-01-01!)*86400)+Current time //Guardar la hora de inicio, segundos después de 1.1.1980
- LongOperation //Realizar la operación
- $vhEndTime:=((Current date-!1980-01-01!)*86400)+Current time
- ALERT("The operation took "+String($vhEndTime-$vhStartTime)+" seconds.") //Mostrar la duración de la operación
-```
-
-## Ejemplo 2
-
-El siguiente ejemplo extrae las horas, minutos y segundos de la hora actual:
-
-```4d
- $vhAhora:=Current time
- ALERT("La hora actual es: "+String($vhAhora\3600))
- ALERT("El minuto actual es: "+String(($vhAhora\60)%60))
- ALERT("El segundo actual es: "+String($vhAhora%60))
-```
-
-## Ver también
-
-[Milliseconds](milliseconds.md)
-[String](string.md)
-[Tickcount](tickcount.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 178 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/date.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/date.md
deleted file mode 100644
index 7bf99b26cc1ec3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/date.md
+++ /dev/null
@@ -1,105 +0,0 @@
----
-id: date
-title: Date
-slug: /commands/date
-displayed_sidebar: docs
----
-
-**Date** ( *expresion* ) : Date
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| expresion | Text, Date | → | Cadena que contiene la fecha a devolver |
-| Resultado | Date | ← | Fecha |
-
-
-
-## Descripción
-
-El comando Date evalúa *expresion* y devuelve una fecha.
-
-El parámetro *expresion* debe respetar el formato fecha ISO o los parámetros regionales del sistema.
-
-**Formato fecha ISO**
-La cadena debe estar en el formato: "AAAA-MM-DD**T**HH:MM:SS", por ejemplo "2013-11-20T10:20:00". En este caso, **Date** evalúa el parámetro *expresion* correctamente, sin importar la configuración de lenguaje actual. Los decimales de segundos, precedidos por un punto, se soportan (ejemplo: "2013-11-20T10:20:00.9854").
-Si el formato *expresion* no respeta este esquema ISO, luego la fecha se evalúa como un formato fecha corto basado en los parámetros regionales del sistema.
-
-**Nota:** a partir de 4D v14, se recomienda utilizar el formato "YYYY-MM-DDTHH:MM:SS**Z**", conforme a la norma ISO y permitiéndole expresar la zona horaria.
-
-**Parámetros regionales**
-Si *expresion* no corresponde al formato ISO, los parámetros regionales definidos en el sistema operativo para una fecha corta son utilizados para la evaluación. Por ejemplo, en la versión en español de 4D, por defecto la fecha debe estar en el orden MM/DD/AA (mes, día, año). El mes y el día pueden tener uno o dos dígitos. El año puede ser de dos o cuatro dígitos. Si el año es de dos dígitos, entonces Date considera si la fecha pertenece al siglo 20 o 21 en función del valor introducido. Por defecto el valor pivote es 30:
-
-* si el valor introducido es superior o igual a 30, 4D considera que la fecha pertenece al siglo 20 y añade 19 delante del valor.
-* si el valor introducido es inferior a 30, 4D considera que la fecha pertenece al siglo 21 y añade 20 delante del valor.
-
-Este mecanismo puede configurarse utilizando el comando [SET DEFAULT CENTURY](set-default-century.md).
-Los siguientes caracteres son separadores de fecha válidos: barra oblicua (/), espacio, punto (.), coma (,) y guión (-).
-
-* Si se pasa una fecha invalida (tal como "13/35/94" o "aa/12/94") en *expresion*, **Date** devolverá una fecha vacía (!00/00/00!). Es su responsabilidad verificar que *expresion* sea una fecha válida.
-* Si la expresión *expresion* se evalúa como indefinida, **Date** devuelve una fecha vacía (!00/00/00!). Esto es útil cuando se espera que el resultado de una expresión (por ejemplo, un atributo objeto) sea una fecha, incluso si puede ser indefinido (por ejemplo un atributo objeto).
-
-**Nota**: a partir de 4D v16 R6, las fechas pueden almacenarse en atributos objeto como valores de tipo de fecha. En versiones anteriores, solo podían almacenarse como cadenas (para más información sobre esta opción, consulte la sección *Página Compatibilidad*, "Utilizar el tipo fecha en lugar del formato fecha ISO en los objetos"). Para saber si un atributo contiene una fecha almacenada como una cadena o como una fecha, debe usar el comando [Value type](value-type.md) (ver el último ejemplo).
-
-**Expresión tipo fecha**
-Si la *expresion* es del tipo de fecha, **Date** devuelve la fecha pasada en el parámetro 'tal como está'. Esto es particularmente útil en el contexto de la programación genérica utilizando punteros o atributos de objeto.
-
-## Ejemplo 1
-
-El siguiente ejemplo utiliza una caja para que el usuario introduzca una fecha. La cadena introducida por el usuario se convierte en una fecha y se guarda en la variable *reqFecha*:
-
-```4d
- vdReqFecha:=Date(Request("Por favor introduzca una fecha:";String(Current date)))
- If(OK=1)
- // Hacer algo con la fecha guardada en vdReqFecha
- End if
-```
-
-## Ejemplo 2
-
-Los siguientes ejemplos muestran varios casos:
-
-```4d
- vdDate:=Date("12/25/94") //12/25/94 on a US system
- vdDate2:=Date("40/40/94") //00/00/00
- vdDate3:=Date("It was the 6/30/2016") //06/30/16
- var $vobj : Object
- $vobj:=New object("expDate";"2020-11-17T00:00:00.0000")
- vdDate4:=Date($vobj.expDate) //11/17/20
- vdDate5:=Date($vobj.creationDate) //00/00/00
-```
-
-## Ejemplo 3
-
-Fecha de evaluación basada en una fecha en formato ISO:
-
-```4d
- $vtDateISO:="2013-06-05T20:00:00"
- $vDate:=Date($vtDateISO)
- //$vDate representa el 5 de junio de 2013 sin importar el lenguaje del sistema
-```
-
-## Ejemplo 4
-
-Usted desea obtener una fecha de un atributo objeto, sea cual sea la opción de almacenamiento de fecha del atributo actual:
-
-```4d
- If(Value type($myObj.myDate)=Is date) //se almacena como fecha, no hay necesidad de convertir
- $vDate:=$myObj.myDate
- Else //es almacenado como cadena
- $vDate:=Date($myObj.myDate)
- End if
-```
-
-## Ver también
-
-[Bool](../commands/bool)
-[String](string.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 102 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/delete-string.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/delete-string.md
deleted file mode 100644
index eb2358b96f4f28..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/delete-string.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-id: delete-string
-title: Delete string
-slug: /commands/delete-string
-displayed_sidebar: docs
----
-
-**Delete string** ( *fuente* ; *posicion* ; *numCaracteres* ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| fuente | Text | → | Cadena de la cual borrar caracteres |
-| posicion | Integer | → | Primer caracter a borrar |
-| numCaracteres | Integer | → | Número de caracteres a borrar |
-| Resultado | Text | ← | Cadena resultante |
-
-
-
-## Descripción
-
-Delete string borra *numCaracteres* de *fuente*, a partir de *posicion*, y devuelve la cadena resultante.
-
-Delete string devuelve la misma cadena que *fuente* cuando:
-
-* *fuente* es una cadena vacía
-* *posicion* es superior a la longitud de *fuente*
-* *numCaracteres* es igual a cero (0)
-
-Si *posicion* es inferior a uno, los caracteres son borrados a partir del inicio de la cadena.
-
-Si *posicion* más *numCaracteres* es igual o mayor a la longitud de *fuente*, los caracteres se borran a partir de *posicion* hasta el final de *fuente*.
-
-## Ejemplo
-
-El siguiente ejemplo ilustra el uso de Delete string. Los resultados se asignan a la variable *vtResult*.
-
-```4d
- vtResult:=Delete string("Lamborghini";6;6) // vtResult obtiene "Lambo"
- vtResult:=Delete string("Indentation";6;2) // vtResult obtiene "Indention"
- vtResult:=Delete string(var;3;32000) // vtResult es igual a los dos primeros caracteres de var
-```
-
-## Ver también
-
-[Change string](change-string.md)
-[Insert string](insert-string.md)
-[Replace string](replace-string.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 232 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/generate-password-hash.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/generate-password-hash.md
deleted file mode 100644
index 25f55791dfdae6..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/generate-password-hash.md
+++ /dev/null
@@ -1,78 +0,0 @@
----
-id: generate-password-hash
-title: Generate password hash
-slug: /commands/generate-password-hash
-displayed_sidebar: docs
----
-
-**Generate password hash** ( *contrasena* {; *opciones*} ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| contrasena | Text | → | La contraseña del usuario. Sólo se utilizan los primeros 72 caracteres. |
-| opciones | Object | → | Un objeto que contiene opciones. |
-| Resultado | Text | ← | Devuelve la contraseña hash. |
-
-
-
-## Descripción
-
-La función **Generate password hash** devuelve un hash de *contrasena* seguro generado por un algoritmo de hash criptográfico.
-
-Pase un valor de cadena en el parámetro *contrasena*. **Generate password hash** devuelve una cadena de hash para la contraseña. Múltiples pases de la misma contraseña darán lugar a cadenas hash diferentes.
-
-En el objeto *opciones*, pase las propiedades que se utilizarán al generar el hash de la contraseña. Los valores disponibles se muestran en la siguiente tabla:
-
-| **Propiedad** | **Tipo de valor** | **Descripción** | **Valor por defecto** |
-| ------------- | ----------------- | ----------------------------------------------------------------------------------------------------- | --------------------- |
-| algorithm | cadena | algoritmo que se utilizará. Actualmente sólo se admite "bcrypt" (sensible a mayúsculas y minúsculas). | bcrypt |
-| cost | numérico | velocidad que se utilizará. Los valores admitidos para bcrypt están entre 4 y 31. | 10 |
-
-**Nota**: si un valor en el objeto de *opciones* no es válido, se devolverá un mensaje de error y una cadena vacía.
-
-### Gestión de errores
-
-Se pueden devolver los siguientes errores. Puede revisar un error con los comandos [Last errors](last-errors.md) y [ON ERR CALL](on-err-call.md).
-
-| **Número** | **Mensaje** |
-| ---------- | ----------------------------------------------------------------------------------- |
-| 850 | Password-hash: Algoritmo no soportado. |
-| 852 | Password-hash: No disponible bcrypt costo parámetro, ofrece un valor entre 4 y 31\. |
-
-### Sobre bcrypt
-
-bcrypt es una función de hashing de contraseñas basada en el cifrado Blowfish. Además de incorporar una sal para proteger contra los ataques tabla arco iris, es una función adaptativa en la que el recuento de la iteración puede aumentarse para hacerla más lenta, por lo que sigue siendo resistente a los ataques de fuerza bruta incluso con el aumento del poder computacional, porque toma demasiado tiempo y es costoso.
-
-## Ejemplo
-
-Este ejemplo genera un hash de contraseña utilizando bcrypt con un factor de costo 4.
-
-```4d
- var $password : Text
- var $hash : Text
- var $options : Object
-
- $options:=New object("algorithm";"bcrypt";"cost";4)
- $password:=Request("Please enter your password")
-
- $hash:=Generate password hash($password;$options)
- [Users]hash:=$hash
- SAVE RECORD([Users])
-```
-
-**Nota**: múltiples pasadas de la misma contraseña darán lugar a cadenas hash diferentes. Este es un comportamiento estándar para algoritmos como bcrypt, ya que la mejor práctica es crear una nueva sal aleatoria para cada hash. Consulte la descripción [Verify password hash ](verify-password-hash.md) para ver un ejemplo de cómo comprobar las contraseñas.
-
-## Ver también
-
-
-[Generate digest](generate-digest.md)
-[Verify password hash ](verify-password-hash.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1533 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/generate-uuid.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/generate-uuid.md
deleted file mode 100644
index c59f75c6ec3504..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/generate-uuid.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-id: generate-uuid
-title: Generate UUID
-slug: /commands/generate-uuid
-displayed_sidebar: docs
----
-
-**Generate UUID** : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| Resultado | Text | ← | Nuevo UUID en forma de texto no canónico (32 caracteres) |
-
-
-
-## Descripción
-
-Generate UUID devuelve un nuevo identificador UUID de 32 caracteres en forma no canónica.
-
-Un UUID es un número de 16 bytes (128 bits). Contiene 32 caracteres hexadecimales. Puede expresarse en forma no canónica (series de 32 letras \[A-F, a-f\] y/o números \[0-9\], por ejemplo 550e8400e29b41d4a716446655440000) o en forma canónica (grupos de 8,4,4,4,12, por ejemplo 550e8400-e29b-41d4-a716-446655440000).
-
-En 4D, los números UUID pueden guardarse en campos. Para mayor información, consulte la sección *Formato UUID* en el manual de *Diseño*.
-
-## Ejemplo
-
-Generación de un UUID en una variable:
-
-```4d
- var MyUUID : Text
- MyUUID:=Generate UUID
-```
-
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1066 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-database-parameter.md
deleted file mode 100644
index 2c262c04c94815..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-database-parameter.md
+++ /dev/null
@@ -1,1036 +0,0 @@
----
-id: get-database-parameter
-title: Get database parameter
-slug: /commands/get-database-parameter
-displayed_sidebar: docs
----
-
-**Get database parameter** ( {*tabla* ;} *selector* {; *valor*} ) : Real
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| tabla | Table | → | Tabla del parámetro o Tabla por defecto si se omite este parámetro |
-| selector | Integer | → | Código del parámetro de la base |
-| valor | Text | ← | Valor alfa del parámetro |
-| Resultado | Real | ← | Valor actual del parámetro |
-
-
-
-## Descripción
-
-El comando **Get database parameter** permite obtener el valor actual de un parámetro de la base 4D. Cuando el valor del parámetro es una cadena de caracteres, se devuelve en el parámetro *valorAlfa*.
-
-El parámetro *selector* designa el parámetro a obtener. 4D ofrece las siguientes constantes predefinidas, en el tema “*Parámetros de la base*”:
-
-### 4D Server timeout (13)
-
-**Alcance**: aplicación 4D si *valor* positivo
-
-Se conserva entre dos **sesiones**: sí si *valor* positivo
-
-**Valores posibles**: 0 -> 32 767
-
-**Descripción**: valor del tiempo de espera antes de desconexión (timeout) de 4D Server a los equipos clientes. Por defecto, este valor se define en la página "Cliente-Servidor/Configuración" de la caja de diálogo Preferencias en el equipo servidor.
-
-El timeout del servidor define el periodo máximo de no respuesta del cliente "autorizado", por ejemplo si realiza una operación de bloqueo. Al terminar esta periodo, 4D Server desconecta al cliente. El selector 4D Server Timeout le permite asignar en el parámetro *valor*un nuevo timeout, expresado en minutos. Esta funcionalidad es particularmente útil para aumentar el valor del timeout antes de la ejecución en el equipo cliente de una operación de larga duración, tal como la impresión de un gran número de páginas, la cual puede causar un timeout inesperado.
-
-
-
-Tiene dos opciones:
-
-Si pasa un valor **positivo** en el parámetro *valor*, define un timeout global y permanente: el nuevo valor se aplica a todos los procesos y se almacena en las Preferencias de la aplicación 4D (equivalente a cambiar en el diálogo Preferencias).Si pasa un valor **negativo** en el parámetro *valor*, define un timeout lobal y temporal: el nuevo valor se aplica únicamente a los procesos llamantes (los otros procesos conservan los valores por defecto) y se restaura al valor por defecto tan pronto como el servidor recibe una señal de actividad del cliente, por ejemplo, cuando la operación termina. Esta opción es muy útil para administrar operaciones largas iniciadas por plug-ins 4D. Para definir una conexión "Sin timeout", pase 0 en *valor*. Ver el ejemplo 1.
-
-
-
-### 4D Remote mode timeout (14)
-
-**Alcance** (antigua capa de red únicamente): aplicación 4D si valor positivo
-
-**Se conserva entre dos sesiones**: sí si *valor* positivo
-
-**Descripción**: a utilizar en casos muy específicos. Valor del timeout otorgado por el equipo 4D remoto a la máquina 4D Server. Por defecto, este valor se define en la página "Cliente-Servidor/Configuración" de la caja de diálogo de Preferencias en el equipo remoto.
-
-El selector Timeout 4D mode distant no se tiene en cuenta si utiliza la antigua capa de red. Con la capa 4D *ServerNet* activada, se ignora: esta configuración es administrada por el selector Timeout 4D Server (13).
-
-
-
-### Port ID (15)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: no
-
-**Descripción**: Command SET DATABASE Número de puerto TCP utilizado por el servidor web 4D con 4D en modo local y 4D Server. Por defecto, el valor es 80.
-
-El número de puerto TCP está definido en la página "Web/Configuración" de la caja de diálogo de las Propiedades de la base. Puede utilizar las constantes del tema para el parámetro *valor*.
-
-El selector Port ID se utiliza en el marco de servidores web 4D compilados y fusionados con 4D Desktop (sin acceso al modo Diseño). Para mayor información sobre el número de puerto TCP, consulte la sección *Parámetros del servidor web*
-
-
-
-
-
-### Character set (17)
-
-**Alcance:** 4D local, 4D Server**
-
-Se conserva entre dos sesiones:** sí**
-
-Descripción:** constante obsoleta (se conserva por compatibilidad únicamente). Ahora recomendamos utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-
-
-### Max concurrent Web processes (18)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: sí
-
-**Valores**: todo valor entre 10 y 32 000\. El valor por defecto es 100.
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### Client port ID (22)
-
-**Alcance**: todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: ver selector 15
-
-**Descripción**: permite especificar este parámetro para todos los equipos 4D remotos utilizados como servidores web. Los valores definidos utilizando estos selectores se aplican a todos los equipos remotos utilizados como servidores web. Si quiere definir valores sólo para ciertos equipos remotos, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-### Client character set (24)
-
-**Alcance**: todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: ver selector 17
-
-**Descripción**: permite especificar este parámetro para todos los equipos 4D remotos utilizados como servidores web. Los valores definidos utilizando estos selectores se aplican a todos los equipos remotos utilizados como servidores web. Si quiere definir los valores sólo para algunos equipos remotos, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-### Client max concurrent Web proc (25)
-
-**Alcance**: todos los equipos 4D remotos
-
-Se conserva entre dos **sesiones**: sí
-
-Valores posibles: ver selector 18
-
-**Descripción**: permite especificar esta parámetro para las máquinas 4D remotas utilizadas como servidores web. Los valores definidos utilizando estos selectores se aplican a todos los equipos remotos utilizados como servidores web. Si quiere definir este valor sólo para ciertos equipos remotos, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-
-
-### Maximum Web requests size (27)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: sí
-
-**Valores posibles**: 500 000 a 2 147 483 648.
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### 4D Server log recording (28)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D Server, 4D remoto*
-
-* Se conserva entre dos **sesiones**: no
-
- **Valores** **posibles**: 0 ó de 1 a X (0 = no grabar, 1 a X = número secuencial, añadido al nombre del archivo).
-
-**Descripción**: inicia o detiene la grabación de las peticiones estándar recibidas por 4D Server (excluyendo las peticiones web). Por defecto, el valor es 0 (no se graban las peticiones).
-
-4D Server le permite grabar cada petición recibida por el equipo servidor en un archivo de historial. Cuando este mecanismo está activo, el archivo de historial se crea junto al archivo de estructura de la base. Su nombre es "4DRequestsLog\_X," donde X es el número secuencial del historial. Una vez el archivo alcanza un tamaño de 10 MB, se cierra y se genera un nuevo archivo, con un número secuencial incrementado. Si existe un archivo con el mismo nombre, se reemplaza directamente. Puede definir el número de inicio de la secuencia utilizando el parámetro *valor*.
-
-Este archivo texto almacena en formato tabulado simple diferente información sobre cada petición: hora, número de proceso, usuario, tamaño de la petición, duración del proceso, etc. Esta información puede ser útil particularmente durante la fase de afinamiento de la aplicación o con fines estadísticos. Por ejemplo puede importarse, en un software de hoja de cálculo para procesarse.
-
-
-
-### Client Web log recording (30)
-
-**Alcance**: todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: 0 = No grabar (por defecto), 1 = Registrar en formato CLF, 2 = Registrar en formato DLF, 3 = Registrar en formato ELF, 4 = Registrar en formato WLF.
-
-**Descripción**: inicia o detiene la grabación de las peticiones web recibidas por los servidores web de todos los equipos cliente. Por defecto, el valor es 0 (no se graban las peticiones).
-
-El funcionamiento de este selector es idéntico al del selector 29; sin embargo, aplica a todos los equipos 4D remotos utilizados como servidores web. El archivo "logweb.txt", en este caso, automáticamente ubicado en la subcarpeta Logs de la base 4D remota (carpeta de caché). Si quiere definir los valores únicamente para ciertos equipos cliente, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-### Table sequence number (31)
-
-**Alcance**: *a*plicación 4D
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: todo valor de tipo entero largo.
-
-**Descripción**: este selector se utiliza para modificar o modificar u obtener el número único actual de los registros de la tabla pasada en parámetro. "Número actual" significa "último número utilizado": si modifica este valor utilizando [SET DATABASE PARAMETER](set-database-parameter.md "SET DATABASE PARAMETER"), el siguiente registro será el valor pasado + 1\. Este nuevo número es el número devuelto por el comando Sequence number [](http://doc.tmp.4d.fr/Database-Parameters/4Dv11.4/ConstantTheme/4870/CMU00244.HTM) como también en todo campo de la tabla a la cual se asigna la propiedad "Autoincrementar" en el editor de estructura o vía SQL.
-
-Por defecto, este número único es definido por 4D y corresponde al orden de creación de los registros. Para información adicional, por favor consulte la documentación del comando [Sequence number](sequence-number.md "Sequence number").
-
-
-
-
-
-
-
-### Debug log recording (34)
-
-**Thread-safe** : Yes
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Descripción**: inicia o detiene la grabación secuencial de los eventos a nivel de programación de 4D en el archivo 4DDebugLog, que se ubica automáticamente en la subcarpeta Logs de la base de datos, junto al archivo de estructura. Un nuevo formato texto tabulado, más compacto se utiliza en el archivo de registro de eventos "4DDebugLog \[\_n\].txt" a partir de 4D v14 (donde \_n es el número de segmento del archivo).
-
-**Valores posibles**: Entero largo contiene un campo de bits: valor = bit1(1)+bit2(2)+bit3(4)+bit4(8)+…).
-
-- Bit 0 (valor 1) permite activar el archivo (note que cualquier otro valor no nulo también lo activará)
-
-- Bit 1 (valor 2) permite solicitar los parámetros de llamada a los métodos y comandos.
-
-- Bit 2 (valor 4) permite activar el nuevo formato tabulado.
-
-- Bit 3 (valor 8) permite desactivar la escritura inmediata de cada operación en el disco (activado por defecto). La escritura inmediata es menor rápida y más eficaz por ejemplo para buscar las causas de un fallo.Si desactiva este modo, el contenido del archivo será generado más rápidamente.
-
-- Bit 4 (valor 16) desactiva el registro de llamadas de plug-ins (activado por defecto).
-
-- Bit 5 (valor 32) desactiva el registro de las funciones miembros.
-
-Ejemplos:
-
-SET DATABASE PARAMETER (34;1) // activa el modo estándar sin los parámetros, con las duraciones
-
-SET DATABASE PARAMETER (34;2) // activa el modo estándar con los parámetros y las duraciones
-
-SET DATABASE PARAMETER (34;2+4) // activa el modo tabulado con los parámetros y las duraciones
-
-SET DATABASE PARAMETER (34;0) // desactiva el archivo Para todo tipo de aplicación 4D interpretada o compilada (4D todos los modos, 4D Server, 4D Volume Desktop), puede evitar que un archivo registre demasiada información:
-
-- restringiendo los comandos 4D que se examinan utilizando Log command list (selector 80), o
-
-- restringiéndolo sólo al proceso actual con Current process debug log recording (selector 111). Esto añadirá la letra "p" y el número de proceso al nombre del archivo: *4DDebugLog\[\_pn\_n\].txt* o *4DDebugLogServer\[\_pn\_n\].txt*
-
-Para más información sobre este formato y sobre el uso del archivo *4DDebugLog*, consulte la sección *Descripción de archivos de historial*. **Nota:** este selector se ofrece únicamente con fines de depuración y debe utilizarse con cuidado, ya que puede afectar al rendimiento de la aplicación.
-
-
-
-### Client Server port ID (35)
-
-**Alcance**: base de datos
-
-Se conserva entre dos **sesiones**: sí**
-
-Valores posibles**: 0 a 65535
-
-**Descripción**: número de puerto TCP donde el servidor 4D publica la base de datos (para conexión remota 4D). Por defecto, el valor es 19813\.
-
-La personalización de este valor permite utilizar varias aplicaciones 4D cliente-servidor en la misma máquina con el protocolo TCP; en este caso, debe indicar un número de puerto diferente para cada aplicación.
-
-El valor se guarda en el archivo de estructura de la base. Puede definirse con 4D en modo local pero sólo se tiene en cuenta en configuración cliente servidor.
-
-Cuando modifica este valor, es necesario reiniciar el equipo servidor para que el nuevo valor sea tenido en cuenta.
-
-
-
-### HTTPS Port ID (39)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: sí
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### Client HTTPS port ID (40)
-
-**Alcance**:todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: 0 a 65535
-
-**Descripción**: número de puerto TCP utilizado por los servidores web de los equipos clientes para conexiones seguras vía SSL (protocolo HTTPS). Por defecto, el valor es 443 (valor estándar).
-
-Este selector puede utilizarse para modificar por programación el puerto TCP utilizado por los servidores web de los equipos clientes para las conexiones seguras vía SSL (protocolo HTTPS). Por defecto, el valor es 443 (valor estándar).
-
-Este selector funciona exactamente igual que el selector 39; sin embargo, aplica a todos los equipos 4D remotos utilizados como servidores web. Si quiere modificar el valor de ciertos equipos clientes únicamente, utilice la caja de diálogo de Preferencias de 4D remoto.
-
-
-
-
-
-### SQL Autocommit (43)
-
-**Alcance**:base de datos
-
- Se conserva entre dos **sesiones**: sí
-
- **Posibles valores**: 0 (desactivación) o 1 (activación)
-
-**Descripción**: activación o desactivación del modo SQL auto-commit. Por defecto, el valor es 0 (modo desactivado)
-
- El modo auto-commit permite reforzar la integridad referencial de la base. Cuando este modo está activo, las peticiones *SELECT*, INSERT, UPDATE y *DELETE* (SIUD) se incluyen automáticamente en las transacciones cuando no se han ejecutado dentro de una transacción. Este modo igualmente puede definirse en las Preferencias de la base.
-
-
-
-### SQL Engine case sensitivity (44)
-
-**Alcance**:base de datos
-
- Se conserva entre dos sesiones: sí
-
- **Valores posibles**: 0 (no se tienen en cuenta las mayúsculas y minúsculas) ó 1 (sensible a las mayúsculas y minúsculas)
-
-**Descripción**: activación o desactivación de la sensibilidad a mayúsculas y minúsculas para comparaciones de cadenas efectuadas por el motor SQL.
-
-Por defecto, el valor es 1 (sensible a las mayúsculas y minúsculas): el motor SQL diferencia entre mayúsculas y minúsculas y entre caracteres acentuados al comparar cadenas (ordenaciones y búsquedas). Por ejemplo “ABC”= “ABC” pero “ABC” # “Abc.” En algunos casos, por ejemplo para alinear el funcionamiento del motor SQL con el del motor 4D, podría querer que las comparaciones de cadenas no tengan en cuenta las mayúsculas y minúsculas (“ABC”=“Abc”).
-
-Esta opción también puede definirse en la [CALL SUBFORM CONTAINER](call-subform-container.md) de las Preferencias de la base.
-
-
-
-### Client log recording (45)
-
-**Alcance**:equipo 4D remoto
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 ó de 1 a X (0 = no grabar, 1 a X = número secuencial, asociado al nombre del archivo).
-
-**Descripción**: inicia o detiene la grabación de peticiones estándar efectuadas por el equipo cliente 4D que ejecutó el comando (excluyendo las peticiones web). Por defecto, el valor es 0 (no se graban las peticiones).
-
-4D le permite registrar el historial de peticiones realizadas por el equipo cliente. Cuando este mecanismo se activa, se crean dos archivos en el equipo cliente, en la subcarpeta Logs de la carpeta local de la base. Son llamados 4DRequestsLog\_X y 4DRequestsLog\_ProcessInfo\_X, donde X es el número secuencial del historial. Una vez el archivo 4DRequestsLog alcanza un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se reemplaza directamente. Puede definir el número de inicio para la secuencia utilizando el parámetro *valor*.
-
-Estos archivos texto almacenan en formato tabulado simple diferente información relacionada con cada petición: hora, número de proceso, tamaño de la petición, duración del proceso, etc. Esta información es particularmente útil durante la fase de desarrollo de la aplicación o con fines estadísticos.
-
-
-
-### Query by formula on server (46)
-
-**Alcance**: tabla y procesos actuales
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 (utilizar la configuración de la base), 1 (ejecutar en cliente) o 2 (ejecutar en servidor)
-
-**Descripción**: ubicación de la ejecución de los comandos [QUERY BY FORMULA](query-by-formula.md "QUERY BY FORMULA") y [QUERY SELECTION BY FORMULA](query-selection-by-formula.md "QUERY SELECTION BY FORMULA") para la *tabla* pasada en parámetro.
-
-Cuando se utiliza una base en modo cliente-servidor, los comandos de búsqueda "por fórmula" pueden ejecutarse en el servidor o en el equipo cliente:
-
-en bases creadas con 4D v11 SQL, estos comandos se ejecutan en el servidor.en bases convertidas, estos comandos se ejecutan en el equipo cliente, como en las versiones anteriores de 4D.en las bases convertidas, una preferencia específica permite modificar globalmente la ubicación de ejecución de estos comandos.Esta diferencia en ubicación de ejecución influye no sólo en el rendimiento de la aplicación (la ejecución en el servidor es generalmente más rápida) sino también en la programación. En efecto, el valor de los componentes de la fórmula (en particular las variables llamadas vía un método) varía de acuerdo al contexto de ejecución. Puede utilizar este selector para adaptar puntualmente el funcionamiento de su aplicación.
-
-Si pasa 0 en el parámetro *valor*, la ubicación de ejecución de los comandos de búsqueda "por fórmula" dependerá de la configuración de la base: en bases creadas con 4D v11 SQL, estos comandos se ejecutarán en el servidor. En bases convertidas, se ejecutarán en el equipo cliente o en el servidor en función de las preferencias de la base. Pase 1 ó 2 en *valor* para "forzar" la ejecución de estos comandos respectivamente en el equipo cliente o en el servidor. Consulte el ejemplo 2.
-
- si quiere activar las uniones "tipo SQL" (consulte el selector QUERY BY FORMULA Joins selector), siempre debe ejecutar las fórmulas en el servidor de manera que tengan acceso a los registros. Atención, en este contexto, la fórmula no debe contener llamadas a un método, de lo contrario pasará automáticamente al equipo remoto.
-
-
-
-### Order by formula on server (47)
-
-**Alcance**: tabla y procesos actuales
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 (utilizar la configuración de la base), 1 (ejecutar en el cliente) o 2 (ejecutar en el servidor)
-
-**Descripción**: ubicación de la ejecución del comando [ORDER BY FORMULA](order-by-formula.md "ORDER BY FORMULA") para la tabla pasada en parámetro.
-
-Al utilizar una base en modo cliente-servidor, el comando [ORDER BY FORMULA](order-by-formula.md "ORDER BY FORMULA") puede ejecutarse bien sea en el equipo servidor o en el cliente. Este selector puede utilizarse para especificar la ubicación de la ejecución de este comando (servidor o cliente). Este modo también puede definirse en las preferencias de la base. Para mayor información, consulte la descripción del selector 46, Query By Formula On Server.
-
-
-
- si quiere activar las uniones "tipo SQL" (consulte el selector QUERY BY FORMULA Joins selector), siempre debe ejecutar las fórmulas en el servidor de manera que tengan acceso a los registros. Atención, en este contexto, la fórmula no debe contener llamadas a un método, de lo contrario pasará automáticamente al equipo remoto.
-
-
-
-### Auto synchro resources folder (48)
-
-**Alcance**:equipo 4D remoto
-
- Se conserva entre dos **sesiones**: no
-
- **Valores p** **osibles**: 0 (sin sincronización), 1 (auto sincronización) ó 2 (preguntar).
-
-**Descripción**: modo de sincronización dinámico de la carpeta *Resources* del equipo cliente 4D que ejecuta el comando con el servidor.
-
-Cuando el contenido de la carpeta *Resources* en el servidor se ha modificado o un usuario ha solicitado la sincronización (por ejemplo vía el explorador de recursos o siguiendo la ejecución del comando [NOTIFY RESOURCES FOLDER MODIFICATION](notify-resources-folder-modification.md "NOTIFY RESOURCES FOLDER MODIFICATION")), el servidor notifica a los equipos cliente conectados.
-
-Tres modos de sincronización son posibles del lado del cliente. El selector Auto Synchro Resources Folder se utiliza para especificar el modo a utilizar por el equipo cliente para la sesión actual:
-
-0 (valor por defecto): sin sincronización dinámica (la petición de sincronización se ignora) 1: sincronización dinámica automática2: visualización de una caja de diálogo en los equipos clientes, con la posibilidad de efectuar o rechazar la sincronización.El modo de sincronización también puede definirse globalmente en las Preferencias de la aplicación.
-
-
-
-### Query by formula joins (49)
-
-**Alcance**:Proceso actual
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 (utilizar configuración de la base), 1 (siempre utilizar relaciones automáticas) o 2 (utilizar las uniones SQL si es posible).
-
-**Descripción**: modo de funcionamiento de los comandos [QUERY BY FORMULA](query-by-formula.md "QUERY BY FORMULA") y [QUERY SELECTION BY FORMULA](query-selection-by-formula.md "QUERY SELECTION BY FORMULA") relativos al uso de "uniones SQL."
-
-En las bases de datos creadas a partir de la versión 11.2 de 4D v11 SQL, estos comandos efectúan uniones basados en el modelo de uniones SQL. Este mecanismo permite modificar la selección de una tabla en función de una búsqueda efectuada en otra tabla sin que las tablas estén conectadas por una relación automática (condición necesaria en las versiones anteriores de 4D).
-
-El selector QUERY BY FORMULA Joins permite definir el modo de funcionamiento de los comandos de búsqueda por fórmula para el proceso actual:
-
-0: Utilizar los parámetros actuales de la base (valor por defecto). En bases creadas a partir de la versión 11.2 de 4D v11 SQL, las "uniones SQL" siempre se activan para las búsquedas por fórmula. En bases de datos convertidas, este mecanismo no se activa por defecto por razones de compatibilidad pero puede implementarse vía una preferencia.1: Siempre utilizar relaciones automáticas (= funcionamiento de versiones anteriores de 4D). En este modo, una relación es necesaria para definir la selección de una tabla en función de búsquedas efectuadas en otra tabla. 4D no efectúa más "uniones SQL."2: Utilizar las uniones SQL si es posible (= funcionamiento o defecto de las bases creadas en versión 11.2 y superiores de 4D v11 SQL). En este modo, 4D establece "uniones SQL" para las búsquedas por fórmula cuando la fórmula se ajusta para ello (con dos excepciones, ver la descripción del comando [QUERY BY FORMULA](query-by-formula.md "QUERY BY FORMULA") o [QUERY SELECTION BY FORMULA](query-selection-by-formula.md "QUERY SELECTION BY FORMULA")).**Nota:** si quiere activar las uniones "tipo SQL" (consulte el selector QUERY BY FORMULA Joins selector), siempre debe ejecutar las fórmulas en el servidor de manera que tengan acceso a los registros. Atención, en este contexto, la fórmula no debe contener llamadas a un método, de lo contrario pasará automáticamente al equipo remoto.
-
-
-
-### HTTP compression level (50)
-
-**Alcance**: aplicación 4D
-
-Se conserva entre dos **sesiones**: no
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### HTTP compression threshold (51)
-
-**Alcance**: aplicación 4D
-
-Se conserva entre dos **sesiones**: no
-
-Valores posibles: todo valor de tipo entero largo
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### Server base process stack size (53)
-
-**Alcance**: 4D Server
-
- Se conserva entre dos sesiones: no
-
- **Valores posibles**: entero largo positivo.
-
-**Descripción**: tamaño de la pila asignada a cada proceso del sistema preferente en el servidor, expresado en bytes. El tamaño por defecto es determinado por el sistema.
-
-Los procesos sistema preferente (procesos de tipo Proceso base 4D client) se cargan para controlar los procesos cliente 4D principales. El tamaño asignado por defecto a la pila de cada proceso preferente da facilidad de ejecución pero puede resultar consecuente cuando se crea un gran número de procesos (varios cientos).
-
-Por razones de optimización, este tamaño puede reducirse considerablemente si las operaciones efectuadas por la base lo permiten (por ejemplo si la base no efectúa ordenaciones de grandes cantidades de registros). Son posibles valores de 512 o incluso 256 KB. Sea cuidadoso, subdimensionar la pila es critico y puede afectar la operación de 4D Server. La definición de este parámetro debe hacerse con precaución y tener en cuenta las condiciones de uso de la base (número de registros, tipo de operaciones, etc.).
-
-Para que sea tenido en cuenta, este parámetro debe ejecutarse en el equipo servidor (por ejemplo en el *Método base On Server Startup*).
-
-
-
-
-
-### Idle connections timeout (54)
-
-**Alcance**: aplicación 4D a menos que valor sea negativo
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles:** valor entero que expresa una duración en segundos. El valor puede ser positivo (nuevas conexiones) o negativo (conexiones existentes). Por defecto, el valor es 20.
-
-**Descripción**: máximo periodo de inactividad (timeout) para conexiones al motor de la base 4D y al motor SQL, así como también en modo *ServerNet* (nueva capa de red), al servidor de la aplicación 4D. Cuando una conexión inactiva alcanza este límite, se pone en espera automáticamente, lo cual congela la sesión cliente/servidor y cierra el socket de red. En la ventana de administración del servidor, el estado del proceso del usuario se indica como "Postponed". Este funcionamiento es totalmente transparente para el usuario: tan pronto como hay una nueva actividad en la conexión que está en espera, el socket se reabre automáticamente y la sesión cliente/servidor se restaura.
-
-Este parámetro permite, por una parte, economizar los recursos en el servidor: las conexiones en espera cierran el socket y liberan un proceso en el servidor. Por otra parte, esto le permite evitar pérdida de conexiones por el cierre de sockets por parte del firewall. Por esta razón, el valor del timeout para conexiones inactivas deber ser menor que el del firewall en este caso.
-
-Si pasa un valor positivo en *valor*, se aplicará a todas las nuevas conexiones en todos los procesos. Si pasa un valor negativo, se aplicará a las conexiones que se abran en el proceso actual. Si pasa 0, las conexiones inactivas no serán sometidas a un timeout.
-
-Este parámetro puede definirse del lado del cliente. Por lo general, no necesita cambiar este valor.
-
-
-
-### PHP interpreter IP address (55)
-
-**Alcance**: Aplicación 4D
-
-Se conserva entre dos **sesiones**: no
-
-**Valores**: cadena formateada del tipo "nnn.nnn.nnn.nnn" (por ejemplo "127.0.0.1").
-
-**Descripción**: dirección IP utilizada localmente por 4D para comunicarse con el intérprete PHP vía FastCGI. Por defecto, el valor es "127.0.0.1". Esta dirección debe corresponder a la máquina donde en encuentra 4D. Este parámetro también puede definirse globalmente para todas las máquinas vía las Propiedades de la base.
-
-Para mayor información sobre el intérprete PHP, por favor consulte el manual de *Diseño*.
-
-
-
-### PHP interpreter port (56)
-
-**Alcance**:Aplicación 4D
-
- **Se conserva entre dos sesiones**: No
-
-**Valores**: valor de tipo entero largo positivo. Por defecto, el valor es 8002\.
-
-**Descripción**: número de puerto TCP utilizado o por el intérprete PHP de 4D. Este parámetro también puede modificarse globalmente para todos los equipos vía las Propiedades de la base. Para mayor información sobre el intérprete PHP, consulte el manual de *Diseño*.
-
-
-
-### SSL cipher list (64)
-
-**Alcance**: Aplicación 4D
-
-Se conserva entre dos sesiones: No
-
-**Valores posibles**: secuencia de cadenas separadas por dos puntos.
-
-**Description:** **Descripción:** lista de cifrado (*cipher list*) utilizada por 4D para el protocolo seguro. Esta lista modifica la prioridad de los algoritmos de cifrado implementados por 4D. Por ejemplo, puede pasar la siguiente cadena en el parámetro *valor*: "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128:!RSA:!DH:!RC4".
-
-Para una descripción completa de la sintaxis para la lista cifrada, consulte la *página de cifrado del sitio OpenSSL*.
-
-Esta configuración se aplica al servidor web principal (excluyendo los objetos del servidor web), al servidor SQL, a las conexiones cliente/servidor, así como al cliente HTTP y a todos los comandos 4D que hacen uso del protocolo seguro. Es temporal (no se mantiene entre sesiones).
-
-Cuando la lista de cifrado se modifica, debe reiniciar el servidor correspondiente para que los nuevos parámetros sean tenidos en cuenta.
-
-Para reinicializar la lista de cifrado a su valor por defecto (guardado permanentemente en el archivo SLI), llame al comando [SET DATABASE PARAMETER](set-database-parameter.md) y pase una cadena vacía ("") en el parámetro *valor*.
-
-**Nota:** con el comando [Get database parameter](get-database-parameter.md), la lista de cifrado se devuelve en el parámetro opcional *valorAlfa* y el parámetro de retorno es siempre 0.
-
-
-
-### Cache unload minimum size (66)
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: Entero largo positivo > 1.
-
-**Descripción**: tamaño mínimo de memoria a liberar del caché de la base de datos cuando el motor necesita hacer espacio para ubicar un objeto (valor en bytes).
-
-El propósito de este selector es reducir el número de liberaciones de datos de la caché con el fin de obtener un mejor rendimiento. Puede hacer variar este parámetro en función del tamaño de la caché y del de los bloques de datos manipulados en su base.
-
-Por defecto, si este selector no se utiliza, 4D descarga mínimo 10% de la caché en caso de que se necesite espacio.Alcance: Aplicación 4D
-
-Se conserva entre dos sesiones: No
-
-Valores posibles: Entero largo positivo > 1.
-
-Descripción: tamaño mínimo de memoria a liberar del caché de la base de datos cuando el motor necesita hacer espacio para ubicar un objeto (valor en bytes).
-
-El propósito de este selector es reducir el número de liberaciones de datos de la caché con el fin de obtener un mejor rendimiento. Puede hacer variar este parámetro en función del tamaño de la caché y del de los bloques de datos manipulados en su base.
-
-Por defecto, si este selector no se utiliza, 4D descarga mínimo 10% de la caché en caso de que se necesite espacio.
-
-
-
-### Direct2D status (69)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Descripción**: modo de activación de Direct2D bajo Windows.
-
-**Valores posibles**: una de las siguientes constantes (modo 3 por defecto):
-
-Direct2D Disabled (0): el modo Direct2D no está habilitado y la base de datos funciona en el modo anterior (GDI/GDIPlus).
-
-Direct2D Hardware (1): utilice Direct2D como contexto de hardware de gráficos para toda la aplicación 4D. Si este contexto no está disponible, use el contexto del software de gráficos Direct2D.
-
-Direct2D Software (3) (modo predeterminado): a partir de Windows 7, utilice el contexto del software de gráficos Direct2D para toda la aplicación 4D.
-
-***Advertencia* : este selector se proporciona solo para fines de depuración. Dado que varias funciones 4D se basan en Direct2D, no se debe desactivar en las aplicaciones implementadas. Solo el modo predeterminado (Direct2D Software)* **está aprobado para las aplicaciones desplegadas.*
-
-
-
-### Direct2D get active status (74)
-
-**Nota**: sólo puede utilizar este selector con el comando Get database parameter y su valor no puede definirse.
-
-**Descripción**: devuelve la implementación activa de Direct2D bajo Windows.
-
-**Valores posibles**: 0, 1, 2, 3, 4 o 5 (ver los valores del selector 69). El valor devuelto depende de la disponibilidad de Direct2D, del hardware y de la calidad Direct2D soportado por el sistema operativo.
-
-Por ejemplo, si ejecuta:
-
- SET DATABASE PARAMETER(Direct2D status;Direct2D Hardware) $mode:=Get database parameter(Direct2D get active status)
-
-- En Windows 7 y superiores, $mode vale 1 cuando el sistema detecta un hardware compatible con Direct2D; de lo contrario, $mode valdrá 3 (contexto software).
-
-- En Windows Vista, $mode valdrá 1 si el sistema detecta un hardware compatible con Direct2D; de lo contrario, $mode toma el valor 0 (desactivando Direct2D).
-
-- En Windows XP, $mode siempre valdrá 0 (no compatible con Direct2D).
-
-
-
-### Diagnostic log recording (79)
-
-**Thread-safe** : Yes
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: 0 ó 1 (0 = no guardar,1 = guardar)
-
-**Descripción**: inicio o detención del registro del archivo de diagnóstico de 4D. Por defecto, el valor es 0 (no guarda).
-
-4D permite guardar de manera continua en un archivo de diagnóstico un conjunto de eventos relativos al funcionamiento interno de la aplicación. La información contenida en este archivo está destinada a la actualización de las aplicaciones 4D y puede ser analizada con ayuda de los servicios técnicos de 4D. Cuando pasa 1 en este selector, el archivo de diagnóstico, llamado *NomBase.txt*, se crea automáticamente (o abre) en la carpeta **Logs** de la base. Una vez el archivo alcance un tamaño de 10 MB, se cierra y se genera un nuevo archivo *NomBase\_N.txt*, con un número secuencial N incrementado.
-
-Note que es posible incluir la información personalizada en este archivo con ayuda del comando [LOG EVENT](log-event.md).
-
-
-
-### Log command list (80)
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: cadena que contiene la lista de números de los comandos 4D a guardar (separados por dos puntos), "all" para guardar todos los comandos o "" (cadena vacía) para no guardar ninguno.
-
-**Descripción**: la lista de comandos 4D a guardar en el archivo de depuración (ver el selector 34, Debug Log Recording). Por defecto, se guardan todos los comandos 4D.
-
-Este selector permite guardar la cantidad de información almacenada en el archivo de depuración limitando los comandos 4D donde quiera guardar la ejecución.
-
-
-
-### Spellchecker (81)
-
-**Alcance**: Aplicación 4D
-
- **Se conserva entre dos sesiones**: No
-
- **Valores posibles**: 0 (por defecto) = corrector macOS nativo (Hunspell desactivado), 1 = corrector Hunspell activo.
-
-**Descripción**: permite activar el corrector ortográfico Hunspell bajo macOS. Por defecto, en esta plataforma el corrector nativo está activo. Puede preferir utilizar el corrector Hunspell, por ejemplo, para unificar la interfaz de sus aplicaciones multiplataformas (bajo Windows, sólo el corrector Hunspell está disponible). Para mayor información, consulte *Corrección ortográfica*.
-
-
-
-### Dates inside objects (85)
-
-**Alcance**: Proceso actual
-
- **Se conserva entre dos sesiones:** No**
-
- Valores posibles**: String type without time zone (0), String type with time zone (1), Date type (2) (por defecto)
-
-**Descripción**: define la forma en que se almacenan las fechas dentro de los objetos, así como también cómo se importan / exportan en JSON.
-
-Cuando el valor del selector es Date type (valor predeterminado para las bases creadas con 4D v17 y superior), las fechas 4D se almacenan con el tipo de fecha dentro de los objetos, con respecto a la configuración de fecha local. Cuando se convierte a formato JSON, los atributos de fecha se convertirán en cadenas que no incluyen un tiempo. (**Nota:** esta configuración se puede definir mediante la opción "Utilizar tipo de fecha en lugar del formato de fecha ISO en objetos" que se encuentra en *Página Compatibilidad* de la configuración de la base).
-
-Si pasa String type with time zone en este selector, convertirá las fechas 4D en cadenas ISO y tendrá en cuenta la zona horaria local. Por ejemplo, la conversión de la fecha 23/08/2013 le da "2013-08-22T22: 00: 000Z" en formato JSON cuando la operación se realiza en Francia durante el horario de verano (GMT+ 2). Este principio se ajusta al funcionamiento estándar de JavaScript. Esto puede ser una fuente de errores cuando desea enviar valores de fecha JSON a alguien en un huso horario diferente. Por ejemplo, cuando exporta una tabla usando [Selection to JSON](selection-to-json.md) en Francia que se debe reimportar en los EE. UU. utilizando [JSON TO SELECTION](json-to-selection.md). Dado que las fechas se vuelven a interpretar en cada zona horaria, los valores almacenados en la base de datos serán diferentes. En este caso, puede modificar el modo de conversión de las fechas para que no tengan en cuenta la zona horaria pasando String type without time zone en este selector. La conversión de la fecha 23/08/2013 le dará "2013-08-23T00: 00: 00Z" en todos los casos.
-
-
-
-
-
-### Diagnostic log level (86)
-
-**Thread-safe** : Yes
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Descripción**: nivel(es) de los mensajes que se incluirán en el registro de diagnóstico cuando esté habilitado (ver selector Diagnostic log recording). Cada nivel designa una categoría de mensajes de diagnóstico e incluye automáticamente las categorías más importantes. Para una descripción de las categorías, consulte la sección *Niveles de registro de diagnóstico* en *developer.4d.com*.
-
-**Valores posibles**: una de las siguientes constantes (Log info por defecto): Log trace: activa ERROR, WARN, INFO, DEBUG, TRACE (nivel más detallado) Log debug: activa ERROR, WARN, INFO, DEBUG Log info: activa ERROR, WARN, INFO (por defecto) Log warn: activa ERROR, WARN Log error: activa ERROR (nivel menos detallado)
-
-
-
-### Use legacy network layer (87)
-
-**Alcance:** 4D en modo local, 4D Server**
-
-Se conserva entre dos sesiones:** sí**
-
-** **Descripción:** fija u obtiene el estado actual de la capa de red antigua para las conexiones cliente/servidor.
-
-La capa de red antigua es obsoleta a partir de 4D v14 R5 y debe ser reemplazada progresivamente en sus aplicaciones por la capa de red *ServerNet*. *ServerNet* será requerida en próximas versiones 4D con el fin de beneficiarse de las futuras evoluciones de la red. Por razones de compatibilidad, la capa de red antigua aún se soporta para permitir una transición sin problemas para las aplicaciones existentes; (se usa por defecto en aplicaciones convertidas de una versión anterior a v14 R5). Pase 1 en este parámetro para utilizar la capa de red antigua (y desactivar *ServerNet*) para las conexiones cliente/servidor, y pase 0 para deshabilitar la red antigua (y utilizar *ServerNet*).
-
-Esta propiedad también se puede definir mediante la opción "Usar capa de red antigua " que se encuentran en *Página Compatibilidad* de las Propiedades de la base (ver *Opciones red y cliente-servidor*). En esta sección, también puede encontrar una discusión sobre la estrategia de migración. Le recomendamos que active *ServerNet* tan pronto como sea posible.
-
-Deberá reiniciar la aplicación para que este parámetro sea tenido en cuenta. No está disponible en 4D Server v14 R5 64-bit versión para macOS, que sólo soporta el *ServetNet*; (siempre devuelve 0).
-
-**Valores posibles:** 0 o 1 (0 = no utilizan capa de red antigua, 1 = uso capa de red antigua)
-
-**Valor por defecto:** 0 en bases de datos creadas con 4D v14 R5 o superior, 1 en bases de datos convertidas de 4D v14 R4 o anteriores.
-
-
-
-### SQL Server Port ID (88)
-
-**Alcance**: 4D modo local y 4D Server.
-
-: Sí
-
-**Descripción**: permite leer o definir el número del puerto TCP utilizado por el servidor SQL integrado de 4D en modo local o 4D Server. Por defecto, el valor es 19812\. Cuando se define este selector, la configuración de la base se actualiza. También puede definir el número del puerto TCP en la página "SQL" de la caja de diálogo de Propiedades de la base.
-
-**Valores posibles:** 0 a 65535.
-
-**Valor por defecto:** 19812
-
-
-
-### Circular log limitation (90)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D local, 4D Server.
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles**: todo valor entero, 0 = conservar todos los registros
-
-**Descripción**: número máximo de archivos a conservar en rotación para cada tipo de registro. Por defecto, todos los archivos se conservan. Si pasa un valor *X*, solo los *X* archivos más recientes se conservan, el más antiguo se borra automáticamente cuando se crea uno nuevo. Esta parametrización se aplica a cada uno de los siguientes archivos de registro: registros de peticiones (selectores 28 y 45), registro de depuración (selector 34), registro de eventos (selector 79), así como el historial de peticiones web (selectores 29 y 84 del comando [WEB SET OPTION](web-set-option.md)), etc.
-
-
-
-### Number of formulas in cache (92)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles**: enteros largos positivos
-
-**Valor por defecto**: 0 (sin caché)
-
-**Descripción**: establece u obtiene el número máximo de fórmulas a conservar en la memoria caché de fórmulas, que es utilizado por el comando [EXECUTE FORMULA](execute-formula.md). Este límite se aplica a todos los procesos, pero cada proceso tiene su propia caché de fórmulas. Ubicar las fórmulas en la caché acelera la ejecución del comando [EXECUTE FORMULA](execute-formula.md) en modo compilado, ya que cada fórmula en caché se tokeniza sólo una vez en este caso.Cuando se cambia el valor de la memoria caché, el contenido existente se restablecen incluso si el nuevo tamaño es más grande que el anterior. Una vez se alcanza el número máximo de fórmulas en la memoria caché, una nueva fórmula ejecutada borrará a la más antigua de la memoria caché (modo FIFO). Este parámetro sólo se tiene en cuenta en las bases o componentes compilados.
-
-
-
-### OpenSSL version (94)
-
-**Alcance**: todas las máquinas 4D
-
-**Se conserva entre dos sesiones**: no
-
-**Descripción**: devuelve el número de versión de la librería OpenSSL que se utiliza en la máquina. (Solo lectura)
-
-
-
-### Cache flush periodicity (95)
-
-**Thread-safe** : Yes
-
-
-**Alcance**: 4D local, 4D Server
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles:** entero largo > 1 (segundos)
-
-**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en [XML DECODE](xml-decode.md) de la configuración de la base para la sesión (que no se almacena en las Propiedades de la base).
-
-
-
-### Remote connection sleep timeout (98)
-
-**Alcance**: aplicación 4D Server
-
-**Se mantiene entre dos sesiones**: no
-
-**Valores posibles**: entero largo positivo
-
-**Descripción**: tiempo de espera actual de la conexión remota en segundos. Por defecto, el valor es 172800 (48 horas).
-
-El tiempo de espera de la conexión remota se aplica después de que una máquina que ejecuta una aplicación remota 4D haya pasado al modo de reposo. En este caso, su sesión es mantenida por 4D Server (ver la descripción de la funcionalidad ). 4D Server verifica cada 5 minutos si algún 4D remoto en reposo ha superado el tiempo de espera de reposo, en cuyo caso se abandona. Por lo tanto, el máximo tiempo de espera permitido es *el tiempo de espera actual* \+ 300\. En algunos casos, es posible que desee modificar el tiempo de espera, por ejemplo para liberar los registros/licencias bloqueados más rápidamente.
-
-
-
-
-
-### Tips enabled (101)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: 0 = consejos desactivados, 1 = consejos activados (predeterminado)
-
-**Descripción**: define u obtiene el estado de visualización actual de los consejos para la aplicación 4D. De forma predeterminada, las sugerencias están activadas.
-
-Tenga en cuenta que este parámetro define todos los consejos 4D, es decir, los mensajes de ayuda de formulario y las sugerencias del editor de modo Diseño.
-
-
-
-### Tips delay (102)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: entero largo >= 0 (tics)
-
-**Descripción**: retraso antes de que se muestren las sugerencias una vez que el cursor del ratón se haya detenido en objetos con mensajes de ayuda adjuntos. El valor se expresa en tics (1/60 de segundo). El valor predeterminado es 45 tics (0.75 segundos).
-
-
-
-### Tips duration (103)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: entero largo >= 60 (tics)
-
-**Descripción**: duración máxima de visualización de una sugerencia. El valor se expresa en tics (1/60 de segundo). El valor predeterminado es 720 tics (12 segundos).
-
-
-
-### Min TLS version (105)
-
-**Alcance**: 4D Server, 4D Web Server y 4D SQL Server
-
-**Conservar entre dos sesiones**: No
-
-**Descripción**: se utiliza para especificar el nivel TLS (Transport Layer Security), que ofrece cifrado y autenticación de datos entre aplicaciones y servidores. Se rechazarán los intentos de conexión de clientes que sólo soporten versiones inferiores a la mínima. La configuración se aplica globalmente a la capa de red. Una vez modificado, el servidor debe reiniciarse para utilizar el nuevo valor.
-
-**Valor por defecto**: TLSv1\_3
-
-**Valores posibles**: TLSv1\_2 (TLS 1.2, introducido en 2008) TLSv1\_3 (TLS 1.3, introducido en 2018) **NOTAS**:
-
-- El plugin 4D Internet Commands utiliza una capa de red diferente, por lo que este selector no tendrá ningún impacto en su versión TLS.
-
-- Se ignorarán los intentos de aplicar TLS a la capa de red heredada.
-
-
-
-
-
-
-
-### User param value (108)
-
-**Alcance**: 4D local, 4D Server
-
-**Se conserva entre dos sesiones**: no
-
-**Valores posibles**: toda cadena personalizada
-
-**Descripción:** cadena personalizada pasada de una sesión a la siguiente cuando se reinicia la aplicación 4D. Este selector es útil en el contexto de pruebas unitarias automatizadas que requieren que las aplicaciones se reinicien con diferentes parámetros.
-
-Cuando se utiliza con [SET DATABASE PARAMETER](set-database-parameter.md), define un nuevo valor que estará disponible en la próxima base de datos abierta después de que 4D se reinicie manualmente o utilizando los comandos [OPEN DATABASE](open-database.md)(\*), [OPEN DATA FILE](open-data-file.md), o [RESTART 4D](restart-4d.md). Cuando se utiliza con [Get database parameter](get-database-parameter.md), obtiene el valor del parámetro de usuario actualmente disponible, definido mediante una línea de comando (ver *Interfaz de línea de comando*), el archivo .4DLink (ver *Usar un archivo 4DLink*), o una llamada a [SET DATABASE PARAMETER](set-database-parameter.md) durante la sesión anterior. (\*) Si [SET DATABASE PARAMETER](set-database-parameter.md) define un User param value antes de una llamada a [OPEN DATABASE](open-database.md) con un archivo .4DLink que también contiene un atributo xml user-param, 4D 4D tiene en cuenta solo el parámetro ofrecido por [SET DATABASE PARAMETER](set-database-parameter.md).
-
-
-
-### Times inside objects (109)
-
-Alcance: 4D local, 4D Server (todos los procesos)
-
- Se conserva entre dos sesiones: No
-
- **Valores posibles**: Times in seconds (0) (predeterminado), Times in milliseconds (1)
-
-**Descripción**: define la forma en que los valores de tipo hora se convierten y almacenan dentro de las propiedades de los objetos y los elementos de la colección, así como la forma en que se importan/exportan en JSON y en las áreas web. Por defecto, a partir de 4D v17, las horas se convierten y almacenan en número de segundos en los objetos.
-
-En versiones anteriores, los valores de tiempo se convertían y almacenaban como cantidad de milisegundos en esos contextos. Usar este selector puede ayudarlo a migrar sus aplicaciones volviendo a la configuración anterior si es necesario.
-
-**Nota**: los métodos ORDA y el motor SQL ignoran esta configuración, siempre suponen que los valores de tiempo son números de segundos.
-
-
-
-### SMTP Log (110)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D local, 4D Server*
-
-* **Se conserva entre dos sesiones**: No
-
- **Valores posibles**: 0 o de 1 a X (0 = no grabar, 1 a X = número secuencial, agregado al nombre del archivo). De forma predeterminada, el valor es 0 (intercambios SMTP no registrados).
-
-**Descripción**: inicia o detiene la grabación de intercambios entre 4D y el servidor SMTP, cuando un objeto *transportador* se procesa a través de *transporter.send( )* o *SMTP\_transporter.checkConnection( )*. Por defecto, el valor es 0 (intercambios no registrados). Cuando este mecanismo está habilitado, se crea un archivo de registro en la carpeta Logs de la base. Se llama 4DSMTPLog\_X.txt, donde X es el número secuencial del registro. Una vez que el archivo 4DSMTPLog ha alcanzado un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se reemplaza directamente. Puede definir el número de inicio de la secuencia utilizando el parámetro *valor*. De forma predeterminada, todos los archivos se conservan, pero puede controlar la cantidad de archivos a seguir utilizando el parámetro Circular log limitation.
-
-Para obtener más información sobre los archivos 4DSMTPLog\_X.txt, consulte la sección *Descripción de archivos de historial*.
-
-
-
-### Current process debug log recording (111)
-
-**Alcance:** Aplicación 4D
-
-**Se conserva entre dos sesiones:** No
-
-**Descripción**: inicia o detiene el registro secuencial de eventos de programación **del proceso actual** en un archivo de historial separado. Este historial es similar al Debug log recording (selector 34) pero se enfoca solo en el proceso actual. El nombre del archivo de historial incluye la letra "p" y el número del proceso: 4DDebugLog\[\_p*N*_*n*].txt, donde N es el ID único del proceso. Para más información sobre este formato y sobre el uso del archivo *4DDebugLog*, consulte *Descripción de archivos de historial* en el Modo Diseño. **Notas:** Este selector se proporciona únicamente con el fin de depurar y debe utilizarse con cuidado. En particular, no debe ponerse en producción, ya que puede tener un impacto en el rendimiento de la aplicación. Puede utilizarar ambos selectores Debug log recording y Current process debug log recording simultáneamente, en cuyo caso las acciones del proceso actual no se registrarán en el archivo de historial principal.
-
-
-
-### Is current database a project (112)
-
-**Nota:** solo puede utilizar este selector con el comando [Get database parameter](get-database-parameter.md) y su valor no se puede definir.
-
-**Alcance**: aplicación 4D
-
-**Descripción**: devuelve 1 si la arquitectura de la base actual es un proyecto y 0 en caso contrario. Para más información, consulte la sección *Base proyecto vs base binaria*.
-
-
-
-### Is host database a project (113)
-
-**Nota:** solo puede utilizar este selector con el comando [Get database parameter](get-database-parameter.md) y su valor no se puede definir.
-
-**Alcance**: aplicación 4D
-
-**Descripción**: devuelve 1 si la arquitectura de la base local es un proyecto y 0 en caso contrario. Para más información, consulte la sección *Base proyecto vs base binaria*.
-
-
-
-### Libldap version (114)
-
-**Alcance**: máquina 4D actual
-
-**Se conserva entre dos sesiones**: no
-
-**Descripción**: devuelve el número de versión de la librería LDAP en la aplicación 4D en la máquina actual. (Solo lectura)
-
-
-
-### Libsasl version (115)
-
-**Alcance**: máquina 4D actual
-
-**Se conserva entre dos sesiones**: no
-
-**Descripción**: devuelve el número de versión de la librería SASL en la aplicación 4D en la máquina actual. (Solo lectura)
-
-
-
-### POP3 Log (116)
-
-**Thread-safe** : Yes
-
-**Alcance:** 4D local, 4D Server
-
-**Se conserva entre dos sesiones**: no
-
-**Valores posibles:** 0 o de 1 a X (0 = no registrar, 1 a X = número secuencial, agregado al nombre del archivo). Por defecto, el valor es 0 (intercambios POP3 no registrados).
-
-: iInicia o detiene la grabación de intercambios entre 4D y el servidor POP3, cuando un objeto transportador se procesa a través de *POP3\_transporter.getMail( )* o *POP3\_transporter.checkConnection( )*. Por defecto, el valor es 0 (intercambios no registrados). Cuando este mecanismo está habilitado, se crea un archivo de registro en la carpeta Logs de la base. Se llama 4DPOP3Log\_X.txt, donde X es el número secuencial del registro. Una vez que el archivo 4DPOP3Log ha alcanzado un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se reemplaza directamente. Puede establecer el número inicial de la secuencia utilizando el parámetro valor. De manera predeterminada, todos los archivos se mantienen, pero puede controlar la cantidad de archivos que se deben seguir utilizando el parámetro Circular log limitation.
-
-Para más información sobre los archivos 4DPOP3Log\_X.txt, consulte la sección *Descripción de archivos de historial*.
-
-
-
-### Is host database writable (117)
-
-**Nota**: solo puede utilizar este selector con el comando [Get database parameter](get-database-parameter.md) y su valor no se puede definir.
-
-**Alcance**: aplicación 4D
-
-**Descripción**: devuelve 1 si el archivo estructura/archivo proyecto local es editable y 0 si es de solo lectura.
-
-
-
-### IMAP Log (119)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D local, 4D Server
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: 0 o de 1 a X (0 = no grabar, 1 a X = número secuencial, añadido al nombre del archivo). Por defecto, el valor es 0 (los intercambios IMAP no se registran).
-
-**Descripción**: inicia o detiene la grabación de los intercambios entre 4D y el servidor IMAP, cuando se procesa un objeto transportador a través de *IMAP\_transporter.getMail( )* o *IMAP\_transporter.checkConnection( )*. Por defecto, el valor es 0 (intercambios no registrados). Cuando se activa este mecanismo, se crea un archivo de registro en la carpeta Logs de la base. Se llama 4DIMAPLog\_X.txt, donde X es el número secuencial del registro. Una vez que el archivo 4DIMAPLog ha alcanzado un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se sustituye directamente. Se puede definir el número inicial de la secuencia mediante el parámetro valor. Por defecto, se conservan todos los archivos, pero puede controlar el número de archivos a conservar utilizando el parámetro Circular log limitation.
-
-Para más información sobre los archivos 4DIMAPLog\_X.txt, consulte la sección *Descripción de archivos de historial*.
-
-
-
-### Libzip version (120)
-
-**Alcance**: máquina 4D actual
-
-**Se conserva entre dos sesiones**: n/a
-
-**Descripción**: devuelve el número de versión de la librería libzip en la aplicación 4D en la máquina actual. (Sólo lectura)
-
-
-
-### Pause logging (121)
-
-**Thread-safe** : Yes
-
-**Alcance**: aplicación 4D
-
-**Se mantiene entre dos sesiones**: no
-
-**Valores posibles**: 0 (reanudar historial), 1 (pausar historial)
-
-Este selector permite suspender/reanudar todas las operaciones de registro iniciadas en la aplicación (excepto los registros ORDA). Esta función puede ser útil para aligerar temporalmente las tareas de la aplicación 4D o programar las operaciones de registro.
-
-
-
-
-
-## Selectores hilo seguro
-
-El comando **Get database parameter** puede utilizarse en procesos apropiativos al llamar a los siguientes selectores:
-
-* [4D Server log recording](#4d-server-log-recording-28)
-* [Debug log recording](#debug-log-recording-34)
-* [Diagnostic log recording](#diagnostic-log-recording-79)
-* [Diagnostic log level](#diagnostic-log-level-86)
-* [Circular log limitation](#circular-log-limitation-90)
-* [Cache flush periodicity](#cache-flush-periodicity-95)
-* [SMTP Log](#smtp-log-110)
-* [POP3 Log](#pop3-log-116)
-* [IMAP Log](#imap-log-119)
-* [Pause logging](#pause-logging-121)
-
-
-## Ejemplo
-
-Desea que su aplicación se reinicie después de un primer lanzamiento. La aplicación se inicia con, por ejemplo, una línea de comando en Windows:
-
-```RAW
-%HOMEPATH%\Desktop\4D\4D.exe %HOMEPATH%\Documents\myDB.4dbase\myDB.4db --user-param "First launch"
-```
-
-En el [Método base On Startup](metodo-base-on-startup.md), usted escribe:
-
-```4d
- var $realVal : Real
- var $welcome : Text
- $realVal:=Get database parameter(User param value;$welcome)
- If($welcome#"")
- ALERT($welcome)
- If($welcome="First launch") //es el primer lanzamiento
- //... hacer algunas operaciones
- SET DATABASE PARAMETER(User param value;"Database has restarted!") //para el siguiente lanzamiento
- RESTART 4D
- End if
- End if
-```
-
-## Ver también
-
-[DISTINCT VALUES](distinct-values.md)
-[Application info](application-info.md)
-[QUERY SELECTION](query-selection.md)
-[SET DATABASE PARAMETER](set-database-parameter.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 643 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-string-resource.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-string-resource.md
deleted file mode 100644
index 84f03835f3ed8a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-string-resource.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-id: get-string-resource
-title: Get string resource
-slug: /commands/get-string-resource
-displayed_sidebar: docs
----
-
-**Get string resource** ( *resNum* {; *resArchivo*} ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| resNum | Integer | → | Número del recurso |
-| resArchivo | Time | → | Número de referencia del archivo de recursos o Todos los archivos de recursos abiertos, si se omite |
-| Resultado | Text | ← | Contenido del recurso STR |
-
-
-
-## Descripción
-
-El comando Get string resource devuelve la cadena almacenada en el recurso cadena (“STR ”) cuyo número de referencia se pasa en *resNum*.
-
-Si el recurso no se encuentra, se devuelve una cadena vacía y la variable OK toma el valor 0 (cero).
-
-Si pasa un número de referencia de archivo de recursos válido en *resArchivo*, el recurso se busca en ese archivo únicamente. Si no pasa *resArchivo*, se devuelve la primera ocurrencia del recurso encontrada en la cadena de archivos de recursos.
-
-**Nota:** un recurso cadena puede contener hasta 255 caracteres.
-
-## Ejemplo
-
-El siguiente ejemplo muestra los contenidos del recurso cadena de ID=20911, que debe encontrar en al menos uno de los archivos de recursos abiertos:
-
-```4d
- ALERT(Get string resource(20911))
-```
-
-## Variables y conjuntos del sistema
-
-La variable sistema OK toma el valor 1 si se encuentra el recurso, de lo contrario toma el valor 0 (cero).
-
-## Ver también
-
-[Get indexed string](get-indexed-string.md)
-[Get text resource](get-text-resource.md)
-[STRING LIST TO ARRAY](string-list-to-array.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 506 |
-| Hilo seguro | ✗ |
-| Modifica variables | OK |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-text-resource.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-text-resource.md
deleted file mode 100644
index f5b77a361dfcf2..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/get-text-resource.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-id: get-text-resource
-title: Get text resource
-slug: /commands/get-text-resource
-displayed_sidebar: docs
----
-
-**Get text resource** ( *resNum* {; *resArchivo*} ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| resNum | Integer | → | Número de recurso |
-| resArchivo | Time | → | Número de referencia del archivo de recursos o todos los archivos de recursos abiertos, si se omite |
-| Resultado | Text | ← | Contenido del recurso TEXT |
-
-
-
-## Descripción
-
-El comando Get text resource devuelve el texto guardado en el recurso texto (“TEXT”) cuyo número de identificación se pasa en *resNum*.
-
-Si no se encuentra el recurso, se devuelve un texto vacío y la variable sistema OK toma el valor 0 (cero).
-
-Si pasa un número de referencia de archivo de recursos válido en *resArchivo*, el recurso se busca en ese archivo únicamente. Si no pasa *resArchivo*, será devuelta la primera ocurrencia del recurso encontrado en la cadena de archivos de recursos.
-
-**Nota:** un recurso texto puede contener hasta 32 000 caracteres.
-
-## Ejemplo
-
-El siguiente ejemplo muestra el contenido del recurso texto de ID=20800, que debe estar ubicado en al menos uno de los archivos de recursos abiertos:
-
-```4d
- ALERT(Get text resource(20800))
-```
-
-## Variables y conjuntos del sistema
-
-Si se encuentra el recurso, OK toma el valor 1\. De lo contrario, toma el valor 0 (cero).
-
-## Ver también
-
-[Get indexed string](get-indexed-string.md)
-[Get string resource](get-string-resource.md)
-[STRING LIST TO ARRAY](string-list-to-array.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 504 |
-| Hilo seguro | ✗ |
-| Modifica variables | OK |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/highlight-text.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/highlight-text.md
deleted file mode 100644
index e5494d30845113..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/highlight-text.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-id: highlight-text
-title: HIGHLIGHT TEXT
-slug: /commands/highlight-text
-displayed_sidebar: docs
----
-
-**HIGHLIGHT TEXT** ( {* ;} *objeto* ; *inicioSel* ; *finSel* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| * | Operador | → | Si se especifica, objeto es un nombre de objeto (cadena)Si se omite, objeto es un campo o una variable |
-| objeto | Field, Variable, any | → | Nombre del objeto (si se especifica *) o Campo o variable (si se omite *) |
-| inicioSel | Integer | → | Nueva posición de inicio de selección de texto |
-| finSel | Integer | → | Nueva posición de fin de selección de texto |
-
-
-
-## Descripción
-
-El comando HIGHLIGHT TEXT selecciona una parte de texto en *objeto*.
-
-Si pasa el parámetro opcional *\**, indica que el parámetro *objeto* es un nombre de un objeto (una cadena) Si no pasa el parámetro \*, indica que el parámetro *objeto* es un campo o una variable. En este caso, pase la referencia del campo o de la variable (campos o variables de formulario únicamente) en lugar de una cadena.
-
-Si *objeto* no es el objeto que está siendo modificado, esta área recupera el foco.
-
-**Nota:** este comando no puede utilizarse con campos en un subformulario.
-
-El parámetro *inicioSel* representa la posición del primer carácter a seleccionar, y el parámetro *finSel* representa la posición del último carácter a seleccionar más uno. Si *inicioSel* y *finSel* son iguales, el punto de inserción está ubicado antes del carácter especificado por *inicioSel*, y ningún carácter está seleccionado.
-
-Si *finSel* es superior al número de caracteres en *objeto*, todos los caracteres entre *inicioSel* y el final del texto son seleccionados.
-
-## Ejemplo 1
-
-El siguiente ejemplo selecciona todos los caracteres en el campo editable *\[Productos\]Notas*:
-
-```4d
- HIGHLIGHT TEXT([Productos]Notas;1;Length([Productos]Notas)+1)
-```
-
-## Ejemplo 2
-
-El siguiente ejemplo mueve el punto de inserción al principio del campo editable *\[Productos\]Notas*:
-
-```4d
- HIGHLIGHT TEXT([Productos]Notas;1;1)
-```
-
-## Ejemplo 3
-
-El siguiente ejemplo mueve el punto de inserción al final del campo editable *\[Productos\]Notas*:
-
-```4d
- $vLen:=Length([Productos]Notas)+1HIGHLIGHT TEXT([Productos]Notas;$vLen;$vLen)
-```
-
-## Ejemplo 4
-
-Ver el ejemplo del comando [FILTER KEYSTROKE](filter-keystroke.md "FILTER KEYSTROKE").
-
-## Ver también
-
-[GET HIGHLIGHT](get-highlight.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 210 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/insert-string.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/insert-string.md
deleted file mode 100644
index 311c636df62d5b..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/insert-string.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-id: insert-string
-title: Insert string
-slug: /commands/insert-string
-displayed_sidebar: docs
----
-
-**Insert string** ( *fuente* ; *ainsertar* ; *posicion* ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| fuente | Text | → | Cadena en la cual insertar otra cadena |
-| ainsertar | Text | → | Cadena a insertar |
-| posicion | Integer | → | Posición de la inserción |
-| Resultado | Text | ← | Cadena resultante |
-
-
-
-## Descripción
-
-Insert string inserta la cadena de caracteres alfanuméricos *ainsertar* en la cadena *fuente* a partir de *posicion* y devuelve la cadena de caracteres resultante. La cadena *ainsertar* se coloca antes del carácter designado por *posicion*.
-
-Si *ainsertar* es una cadena vacía (""), Insert string devuelve *fuente* sin cambios.
-
-Si *posicion* es mayor a la longitud de *fuente*, *ainsertar* se añade al final de *fuente*. Si *posicion* es inferior a uno (1), *ainsertar* se inserta antes de *fuente*.
-
-Insert string es diferente de [Change string](change-string.md "Change string") en que esta función inserta caracteres en lugar de reemplazarlos.
-
-## Ejemplo
-
-El siguiente ejemplo ilustra el uso de Insert string. Los resultados se asignan a la variable *vtResult*.
-
-```4d
- vtResult:=Insert string("El verde";"árbol ";4) // vtResult obtiene "El árbol verde"
- vtResult:=Insert string("Tala";"b";3) // vtResult es igual a "Tabla"
- vtResult:=Insert string("Indenficación";"ti";6) // vtResult es igual a "Indentación"
-```
-
-## Ver también
-
-[Change string](change-string.md)
-[Delete string](delete-string.md)
-[Replace string](replace-string.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 231 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/last-errors.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/last-errors.md
deleted file mode 100644
index a0e18e25cb00c7..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/last-errors.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-id: last-errors
-title: Last errors
-slug: /commands/last-errors
-displayed_sidebar: docs
----
-
-**Last errors** : Collection
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| Resultado | Collection | ← | Colección de objetos de error |
-
-
-
-## Descripción
-
-El comando **Last errors** devuelve la pila actual de errores de la aplicación 4D como una colección de objetos de error, o **null** si no se ha producido ningún error. La pila de errores incluye los objetos enviados por el comando [throw](throw.md), si los hay.
-
-Cada objeto de error contiene los siguientes atributos:
-
-| **Propiedad** | **Tipo** | **Descripción** |
-| ------------------ | -------- | -------------------------------------------------- |
-| errCode | number | Código de error |
-| message | text | Descripción del error |
-| componentSignature | text | Firma del componente interno que devolvió el error |
-
-
-:::nota
-
-Para una descripción de las firmas de los componentes, consulte la sección [Códigos de error](../Concepts/error-handling.md#error-codes).
-
-:::
-
-Este comando debe ser llamado desde un método de llamada de error instalado por el comando [ON ERR CALL](on-err-call.md).
-
-
-## Ver también
-
-[ON ERR CALL](on-err-call.md)
-[throw](throw.md)
-[Error handling](../Concepts/error-handling.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1799 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-get-arrays.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-get-arrays.md
deleted file mode 100644
index e79700f0a3cfc5..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-get-arrays.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-id: listbox-get-arrays
-title: LISTBOX GET ARRAYS
-slug: /commands/listbox-get-arrays
-displayed_sidebar: docs
----
-
-**LISTBOX GET ARRAYS** ( {* ;} *objeto* ; *arrNomsCols* ; *arrNomsEncabezados* ; *arrVarCols* ; *arrVarEncabezados* ; *arrColsVisibles* ; *arrEstilos* {; *arrNomsPies* ; *arrVarsPies*} )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| * | Operador | → | Si se especifica, objeto es un nombre de objeto (cadena) Si se omite, objeto es una variable |
-| objeto | any | → | Nombre de objeto (si se especifica *) o Variable (si se omite *) |
-| arrNomsCols | Text array | ← | Nombres de objeto de las columnas |
-| arrNomsEncabezados | Text array | ← | Nombres de objeto de los títulos |
-| arrVarCols | Pointer array | ← | Punteros hacia las variables de las columnas |
-| arrVarEncabezados | Pointer array | ← | Punteros hacia campos o Nil |
-| arrColsVisibles | Boolean array | ← | Visibilidad de cada columna |
-| arrEstilos | Pointer array | ← | Punteros a los arrays o a las variables de estilos de colores y de visibilidad o Nil |
-| arrNomsPies | Text array | ← | Nombres de los objetos de pies de columna |
-| arrVarsPies | Pointer array | ← | Punteros a las variables de pies de columna |
-
-
-
-## Descripción
-
-El comando **LISTBOX GET ARRAYS** devuelve un conjunto de arrays sincronizados ofreciendo información sobre cada columna (visible o invisible) del list box designado por los parámetros *objeto* y *\**.
-
-Si pasa el parámetro opcional \*, indica que el parámetro *objeto* es un nombre de objeto (cadena). Si omite este parámetro, indica que el parámetro *objeto* es una variable. En ese caso, no pasa una cadena, sino una referencia de variable. Para mayor información sobre nombres de objetos, consulte la sección *Propiedades de los objetos*.
-
-Una vez se ejecuta el comando:
-
-* El array *arrNomsCols* contiene la lista de los nombres de los objetos para cada columna del list box.
-* El array *arrNomsEncabezados* contiene la lista de los nombres de los objetos para cada título de columna del list box.
-* El array *arrVarCol*s contiene los punteros hacia las variables (arrays) asociadas a cada columna del list box. Para un listbox de tipo selección, *arrVarCols* contiene:
- * Para una columna asociada a un campo, un puntero al campo asociado,
- * Para una columna asociada a una variable, un puntero a la variable,
- * Para una columna asociada a una expresión, un puntero Nil.
-* El array *arrVarEncabezados* contiene punteros hacia las variables asociadas a cada título de columna del list box.
-* El array *arrColsVisibles* contiene un valor Booleano para cada columna, indicando si la columna es visible ([True](true.md "True")) o oculta ([False](false.md "False")) en el list box.
-* El array *arrEstilos* contiene, para un list box de tipo array, cuatro hacia cuatro arrays que permiten aplicar individualmente un estilo, un color de fuente, un color de fondo y un control de visualización personalizado a cada fila del list box. Estos arrays son asociados al list box en la Lista de propiedades del modo Diseño o vía el comando [LISTBOX SET ARRAY](listbox-set-array.md). Si un array no es especificado para el list box, el elemento correspondiente en *arrEstilos* contendrá un puntero Nil.
-El cuarto del puntero corresponde ya sea a un array booleano (array de líneas ocultas), o a un array entero largo (array utilizado para definir las líneas ocultas, desactivadas y no seleccionables), en función de la implementación utilizada para el array de control de líneas (ver *Propiedades específicas de los list box*).
-Para un list box de tipo selección, colección o selección de entidades, *arrEstilos* contiene:
-* * Por cada configuración definida vía una variable, un puntero a la variable,
- * Por cada configuración definida vía una expresión, un puntero Nil.
-
-## Ver también
-
-[LISTBOX Get array](listbox-get-array.md)
-[LISTBOX Get property](listbox-get-property.md)
-[LISTBOX SET ARRAY](listbox-set-array.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 832 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-get-property.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-get-property.md
deleted file mode 100644
index d366e011d9f962..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-get-property.md
+++ /dev/null
@@ -1,110 +0,0 @@
----
-id: listbox-get-property
-title: LISTBOX Get property
-slug: /commands/listbox-get-property
-displayed_sidebar: docs
----
-
-**LISTBOX Get property** ( {* ;} *objeto* ; *propiedad* ) : any
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| * | Operador | → | Si se especifica, objeto es un nombre de objeto (cadena) Si se omite, objeto es una variable |
-| objeto | any | → | Nombre de objeto (si se especifica *) o Variable (si se omite *) |
-| propiedad | Integer | → | Información a obtener |
-| Resultado | Text, Integer | ← | Valor actual |
-
-
-
-## Descripción
-
-El comando **LISTBOX Get property** devuelve el valor de la *propiedad* del list box o columna especificado utilizando los parámetros *objeto* y *\*.*
-
-Si pasa el parámetro opcional *\**, indica que el parámetro *objeto* es un nombre de objeto (cadena). Si omite este parámetro, indica que el parámetro *objeto* es una variable. En ese caso, usted pasa una referencia de variable en lugar de una cadena. Para mayor información sobre nombres de objetos, consulte la sección *Propiedades de los objetos*.
-
-**Nota:** si el list box o columna especificado utilizando los parámetros *objeto* y *\** no existe, el comando **LISTBOX Get property** devuelve -1 para los propiedades numéricas o una cadena vacía.
-
-En el parámetro *propiedad*, pase una constante indicando la propiedad cuyo valor quiere obtener. Puede utilizar un valor o una de las siguientes constantes del tema *Listbox*:
-
-| Constante | Valor | Comentario |
-| ------------------------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| lk allow wordwrap | 14 | Propiedad **Retorno de línea** Aplica a: Columna\* Valores posibles: lk no (0)lk yes (1) |
-| lk auto row height | 31 | Propiedad **Altura de fila automática**. Aplica a: List box o columna Valores posibles:lk yes lk no**4D View Pro únicamente:** esta funcionalidad requiere una licencia 4D View Pro. Para más información, consulte *4D View Pro*. |
-| lk background color expression | 22 | Propiedad **Expresión** **color de fondo** para list box de tipo selección, colección o entity selection. Aplica a: List box o columna |
-| lk cell horizontal padding | 36 | Relleno horizontal de la celda en píxeles (mismo valor para el relleno izquierdo y derecho) Se aplica a: list box, columna, encabezado, pie de página |
-| lk cell vertical padding | 37 | Relleno vertical de la celda en píxeles (mismo valor para el relleno superior e inferior) Se aplica a: list box, columna, encabezado, pie de página |
-| lk column max width | 26 | Propiedad **Ancho Máximo** Aplica a: Columna\* |
-| lk column min width | 25 | Propiedad **Ancho mínimo** Aplica a: Columna\* |
-| lk column resizable | 15 | Propiedad **Redimensionable** Aplica a: Columna\* Valores posibles: lk no (0)lk yes (1) |
-| lk detail form name | 19 | Propiedad **Nombre formulario detallado** para la selección de tipo list box Aplica a: List box |
-| lk display footer | 8 | 0=oculto, 1=se muestra |
-| lk display header | 0 | 0=oculto, 1=se muestra |
-| lk display type | 21 | Propiedad **Tipo de visualización** para columnas numéricas Aplica a: Columna\* Valores posibles:** **lk numeric format (0): muestra valores en formato numéricolk three states checkbox (1): muestra valores como casillas de selección de tres estados |
-| lk double click on row | 18 | Propiedad **Doble clic en la línea** para los list box de tipo selección Aplica a: List box Valores posibles:lk do nothing (0): no desencadena ninguna acción automáticalk edit record (1): muestra el registro correspondiente en modo lectura-escrituralk display record (2): muestra el registro correspondiente en modo de solo lectura |
-| lk extra rows | 13 | Propiedad **Ocultar líneas vacías finales** Aplica a: List box Valores posibles:** **lk display (0)lk hide (1) |
-| lk font color expression | 23 | Propiedad **Expresión color fuente**para list box de tipo selección, colección o entity selection. Aplica a: List box o columna |
-| lk font style expression | 24 | Propiedad **Expresión estilo** para list boxes de tipo selección, colección o entity selection. Aplica a: List box o columna |
-| lk hide selection highlight | 16 | Propiedad **Ocultar resaltado de selección** Aplica a: List box Valores posibles:** **lk no (0)lk yes (1) |
-| lk highlight set | 27 | Propiedad **Conjunto resaltado** para el list box de tipo selección** **Aplica a: List box |
-| lk hor scrollbar height | 3 | Altura en píxeles |
-| lk movable rows | 35 | La propiedad **Líneas móviles** para list box de tipo array Se aplica a: List box (excluyendo el modo jerárquico) Valores posibles: lk no (0): las líneas no se pueden mover en tiempo de ejecución lk yes (1): las líneas se pueden mover en tiempo de ejecución (predeterminado) |
-| lk multi style | 30 | Propiedad **Multiestilo** Aplica a: Columna\* Valores posibles: lk no (0)\[#/note\]lk yes (1) \[#/note\] |
-| lk named selection | 28 | Propiedad **Selección temporal** para list box de tipo selección Aplica a: List box |
-| lk resizing mode | 11 | Propiedad **Autoredimensionamiento de columnas** Aplica a: List box Valores posibles: lk manual (0)lk automatic (2) |
-| lk row height unit | 17 | Unidad de la propiedad **Alto de línea** Aplica a: List box Valores posibles:** **lk lines (1) lk pixels (0) |
-| lk selection mode | 10 | Propiedad **Modo de s** **elección** Aplica a: List box Valores posibles: ** **lk none (0) lk single (1) lk multiple (2) |
-| lk single click edit | 29 | Propiedad **Editar en clic único** Aplica a: List box Posible valores: lk no (0)lk yes (1) |
-| lk sortable | 20 | Propiedad **Ordenable** Aplica a: List box Valores posibles:** **lk no (0)lk yes (1) |
-| lk truncate | 12 | Propiedad **Truncar con elipse** Aplica a: List box o columna Valores posibles:** **lk without ellipsis (0)lk with ellipsis (1) |
-| lk ver scrollbar width | 5 | Ancho en píxeles |
-
-\*Estas propiedades sólo se aplican a las columnas list box; si pasa un list box como parámetro con una de estas propiedades, **LISTBOX Get property** devuelve -1, o una cadena vacía, dependiendo de la *propiedad* pasada.
-
-En general, para indicar un resultado no válido **LISTBOX Get property** devuelve -1 al recuperar las propiedades que tienen valores numéricos, o una cadena vacía; Sin embargo, no se generan errores. Más específicamente, esto ocurre en los siguientes casos:
-
-* Si pasa una *propiedad* que no existe
-* Si pasa una *propiedad* que no está disponible para el list box o columna especificada, por ejemplo, usted pasa la propiedad lk font color expression con un list box de tipo array
-* Si pasa una columna como parámetro con una *propiedad* que se aplica a un list box, y viceversa, si pasa un list box como parámetro con una *propiedad* que se aplica a una columna (ver arriba \*)
-
-Además, no es posible devolver valores de más de una columna a la vez; si utiliza el símbolo "@" como parte del nombre de una columna para indicar varias columnas múltiples con nombres similares, **LISTBOX Get property** devuelve el primer valor coincidente que encuentre; como resultado, el valor devuelto no tiene verdadera importancia.
-
-**Notas:**
-
-* Las constantes lk display footer y lk display header son útiles para calcular el tamaño de un área de list box mostrada en el formulario.
-* Cuando utilice las constantes lk hor scrollbar position o lk ver scrollbar position, el comando **LISTBOX Get property** devuelve la posición del cursor de desplazamiento en relación con su posición original, es decir el tamaño de la parte oculta de la ventana, expresado en píxeles. Por defecto, esta posición corresponde a 0\. Combinando, por ejemplo, con información relativa a la altura de la línea, este valor le permite encontrar el contenido mostrado en el listbox. Sin embargo, estas constantes son obsoletas y pueden remplazarse por el comando [OBJECT GET SCROLL POSITION](object-get-scroll-position.md).
-* La instrucción **LISTBOX Get property**(vLB;\_o\_lk footer height) devuelve el mismo valor que el comando [LISTBOX Get footers height](listbox-get-footers-height.md) cuando los pies se muestran. Sin embargo, si los pies no se muestran, **LISTBOX Get property** devuelve 0 mientras [LISTBOX Get footers height](listbox-get-footers-height.md) devuelve la altura, en este caso teórica, de los pies.
-
-## Ejemplo 1
-
-Dado un listbox"MyListbox", si ejecuta la siguiente instrucción:
-
-```4d
- $Value:=LISTBOX Get property(*;"MyListbox";lk selection mode) // el valor devuelto indica el modo de selección
-```
-
-En este caso, el resultado devuelto indica si varias líneas pueden ser seleccionadas.
-
-## Ejemplo 2
-
-Dado un list box "MyListbox", si ejecuta la siguiente instrucción:
-
-```4d
- $resizable:=LISTBOX Get property(*;"MyListbox";lk column resizable)
-```
-
-**LISTBOX Get property** devuelve -1 porque la propiedad lk column resizable aplica a columnas y un list box se pasó como parámetro.
-
-## Ver también
-
-[LISTBOX SET GRID](listbox-set-grid.md)
-[LISTBOX SET PROPERTY](listbox-set-property.md)
-[OBJECT SET SCROLLBAR](object-set-scrollbar.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 917 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-set-grid.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-set-grid.md
deleted file mode 100644
index 66867f7dd0672c..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-set-grid.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-id: listbox-set-grid
-title: LISTBOX SET GRID
-slug: /commands/listbox-set-grid
-displayed_sidebar: docs
----
-
-**LISTBOX SET GRID** ( {* ;} *objeto* ; *horizontal* ; *vertical* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| * | Operador | → | Si se especifica, objeto es un nombre de objeto (cadena) Si se omite, objeto es una variable |
-| objeto | any | → | Nombre de objeto (si se especifica *) o Variable (si se omite *) |
-| horizontal | Boolean | → | True = mostrar, False = ocultar |
-| vertical | Boolean | → | True = mostrar, False = ocultar |
-
-
-
-## Descripción
-
-El comando LISTBOX SET GRID permite mostrar u ocultar las líneas horizontales y/o verticales que componen la matriz del objeto list box designado por los parámetros *objeto* y *\**.
-
-Si pasa el parámetro opcional \*, indica que el parámetro *objeto* es un nombre de objeto (cadena). Si omite este parámetro, indica que el parámetro *objeto* es una variable. En ese caso, no pasa una cadena, sino una referencia de variable. Para mayor información sobre nombres de objetos, consulte la sección indica que el parámetro *objeto* es un nombre de objeto (cadena). Si omite este parámetro, indica que el parámetro *objeto* es una variable. En ese caso, no pasa una cadena, sino una referencia de variable. Para mayor información sobre nombres de objetos, consulte la sección *Propiedades de los objetos*.
-
-Pase en los parámetros *horizontal* y *vertical* los valores booleanos que indican si la líneas de la matriz deben mostrarse ([True](true.md "True")) u ocultarse ([False](false.md "False")). La matriz se muestra por defecto.
-
-## Ver también
-
-[LISTBOX GET GRID](listbox-get-grid.md)
-[LISTBOX Get property](listbox-get-property.md)
-[LISTBOX SET GRID COLOR](listbox-set-grid-color.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 841 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-set-property.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-set-property.md
deleted file mode 100644
index 0d720917d7cdf4..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/listbox-set-property.md
+++ /dev/null
@@ -1,95 +0,0 @@
----
-id: listbox-set-property
-title: LISTBOX SET PROPERTY
-slug: /commands/listbox-set-property
-displayed_sidebar: docs
----
-
-**LISTBOX SET PROPERTY** ( {* ;} *objeto* ; *propiedad* ; *valor* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| * | Operador | → | Si se especifica, objeto es un nombre de objeto (cadena). Si se omite, objeto es una variable. |
-| objeto | any | → | Nombre del objeto (si se especifica *) o Variable (si se omite *) |
-| propiedad | Integer | → | Propiedad de list box o de columna |
-| valor | Integer, Text | → | Valor de la propiedad |
-
-
-
-## Descripción
-
-El comando **LISTBOX SET PROPERTY** define el valor de la propiedad de la columna list box o list box especificada utilizando los parámetros objeto y \*.
-
-Si pasa el parámetro opcional *\**, indica que el parámetro *objeto* es un nombre de objeto (cadena). Si no pasa este parámetro, indica que el parámetro *objeto* es una variable. En este caso, se pasa una referencia variable en lugar de una cadena.
-
-**Nota:** si el list box o la columna list box especificada utilizando los parámetros objeto y \* no existe, el comando no hace nada y no se dispara ningún error.
-
-En los parámetros *propiedad* y *valor*, se indica, respectivamente la propiedad a definir utilizando su nuevo valor. Puede utilizar las siguientes constantes del tema *Listbox*:
-
-| Constante | Valor | Comentario |
-| ------------------------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| lk allow wordwrap | 14 | Propiedad **Retorno de línea** Aplica a: Columna\* Valores posibles: lk no (0)lk yes (1) |
-| lk auto row height | 31 | Propiedad **Altura de fila automática**. Aplica a: List box o columna Valores posibles:lk yes lk no**4D View Pro únicamente:** esta funcionalidad requiere una licencia 4D View Pro. Para más información, consulte *4D View Pro*. |
-| lk background color expression | 22 | Propiedad **Expresión** **color de fondo** para list box de tipo selección, colección o entity selection. Aplica a: List box o columna |
-| lk cell horizontal padding | 36 | Relleno horizontal de la celda en píxeles (mismo valor para el relleno izquierdo y derecho) Se aplica a: list box, columna, encabezado, pie de página |
-| lk cell vertical padding | 37 | Relleno vertical de la celda en píxeles (mismo valor para el relleno superior e inferior) Se aplica a: list box, columna, encabezado, pie de página |
-| lk column max width | 26 | Propiedad **Ancho Máximo** Aplica a: Columna\* |
-| lk column min width | 25 | Propiedad **Ancho mínimo** Aplica a: Columna\* |
-| lk column resizable | 15 | Propiedad **Redimensionable** Aplica a: Columna\* Valores posibles: lk no (0)lk yes (1) |
-| lk detail form name | 19 | Propiedad **Nombre formulario detallado** para la selección de tipo list box Aplica a: List box |
-| lk display footer | 8 | 0=oculto, 1=se muestra |
-| lk display header | 0 | 0=oculto, 1=se muestra |
-| lk display type | 21 | Propiedad **Tipo de visualización** para columnas numéricas Aplica a: Columna\* Valores posibles:** **lk numeric format (0): muestra valores en formato numéricolk three states checkbox (1): muestra valores como casillas de selección de tres estados |
-| lk double click on row | 18 | Propiedad **Doble clic en la línea** para los list box de tipo selección Aplica a: List box Valores posibles:lk do nothing (0): no desencadena ninguna acción automáticalk edit record (1): muestra el registro correspondiente en modo lectura-escrituralk display record (2): muestra el registro correspondiente en modo de solo lectura |
-| lk extra rows | 13 | Propiedad **Ocultar líneas vacías finales** Aplica a: List box Valores posibles:** **lk display (0)lk hide (1) |
-| lk font color expression | 23 | Propiedad **Expresión color fuente**para list box de tipo selección, colección o entity selection. Aplica a: List box o columna |
-| lk font style expression | 24 | Propiedad **Expresión estilo** para list boxes de tipo selección, colección o entity selection. Aplica a: List box o columna |
-| lk hide selection highlight | 16 | Propiedad **Ocultar resaltado de selección** Aplica a: List box Valores posibles:** **lk no (0)lk yes (1) |
-| lk highlight set | 27 | Propiedad **Conjunto resaltado** para el list box de tipo selección** **Aplica a: List box |
-| lk hor scrollbar height | 3 | Altura en píxeles |
-| lk meta expression | 34 | Propiedad **Expression** **Meta Info** de los list box de tipo colección o selección de entidades. Aplica a: List box |
-| lk movable rows | 35 | La propiedad **Líneas móviles** para list box de tipo array Se aplica a: List box (excluyendo el modo jerárquico) Valores posibles: lk no (0): las líneas no se pueden mover en tiempo de ejecución lk yes (1): las líneas se pueden mover en tiempo de ejecución (predeterminado) |
-| lk multi style | 30 | Propiedad **Multiestilo** Aplica a: Columna\* Valores posibles: lk no (0)\[#/note\]lk yes (1) \[#/note\] |
-| lk named selection | 28 | Propiedad **Selección temporal** para list box de tipo selección Aplica a: List box |
-| lk resizing mode | 11 | Propiedad **Autoredimensionamiento de columnas** Aplica a: List box Valores posibles: lk manual (0)lk automatic (2) |
-| lk row height unit | 17 | Unidad de la propiedad **Alto de línea** Aplica a: List box Valores posibles:** **lk lines (1) lk pixels (0) |
-| lk selection mode | 10 | Propiedad **Modo de s** **elección** Aplica a: List box Valores posibles: ** **lk none (0) lk single (1) lk multiple (2) |
-| lk single click edit | 29 | Propiedad **Editar en clic único** Aplica a: List box Posible valores: lk no (0)lk yes (1) |
-| lk sortable | 20 | Propiedad **Ordenable** Aplica a: List box Valores posibles:** **lk no (0)lk yes (1) |
-| lk truncate | 12 | Propiedad **Truncar con elipse** Aplica a: List box o columna Valores posibles:** **lk without ellipsis (0)lk with ellipsis (1) |
-| lk ver scrollbar width | 5 | Ancho en píxeles |
-
-\*Estas propiedades sólo se pueden aplicar a columnas list box; Sin embargo, si pasa un list box como parámetro, **LISTBOX SET PROPERTY** aplica la *propiedad* a cada columna del list box.
-
-**Nota:** si pasa una *propiedad* que no existe, o que no está disponible para el list box o columna especificado, por ejemplo lk font style expression en el caso de un list box de tipo array, el comando no hace nada y no se dispara ningún error.
-
-## Ejemplo 1
-
-Usted quiere asegurarse de que todas las columnas del list box "MyListbox" sean redimensionables:
-
-```4d
- LISTBOX SET PROPERTY(*;"MyListbox";lk column resizable;lk yes) //Todas las columnas del list box "MyListbox" se definen como redimensionables
-```
-
-## Ejemplo 2
-
-Usted desea definir el ancho máximo de la columna "ProductNumber":
-
-```4d
- LISTBOX SET PROPERTY(*;"ProductNumber";lk column max width;200) //Esta columna tendrá un ancho máximo de 200
-```
-
-## Ver también
-
-
-*Listbox*
-[LISTBOX Get property](listbox-get-property.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1440 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/method-get-code.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/method-get-code.md
deleted file mode 100644
index c0c0f2d522bab7..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/method-get-code.md
+++ /dev/null
@@ -1,132 +0,0 @@
----
-id: method-get-code
-title: METHOD GET CODE
-slug: /commands/method-get-code
-displayed_sidebar: docs
----
-
-**METHOD GET CODE** ( *ruta* ; *codigo* {; *opcion*} {; *} )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| ruta | Text, Text array | → | Texto o array de texto que contiene una o varias rutas de método |
-| codigo | Text, Text array | ← | Código de los métodos designados |
-| opcion | Integer | → | 0 o si se omite = exportación simple (sin tokens), 1 = exportación con tokens |
-| * | Operador | → | Si se pasa = comando se aplica a la base de datos de host cuando se ejecuta desde un componente (parámetro ignorado fuera de este contexto) |
-
-
-
-## Descripción
-
-El comando **METHOD GET CODE** devuelve en el parámetro *codigo*, el contenido de los métodos designados por el parámetro *ruta*. Este comando puede devolver el código de todos los tipos de métodos: métodos base, definiciones de clases, triggers, métodos proyecto, métodos formulario y métodos objeto.
-
-Puede utilizar dos tipos de sintaxis, basadas en arrays texto o variables texto:
-
-```4d
- var tVpath : Text // variables texto
- var tVcode : Text
- METHOD GET CODE(tVpath;tVcode) // código de un solo método
-```
-
-
-```4d
- ARRAY TEXT(arrPaths;0) // arrays texto
- ARRAY TEXT(arrCodes;0)
- METHOD GET CODE(arrPaths;arrCodes) // códigos de varios métodos
-```
-
-
-No se pueden combinar las dos sintaxis.
-
-Si pasa una ruta de acceso no válida, el parámetro *codigo* se deja vacío y se genera un error.
-
-En el texto del *codigo* generado por este comando:
-* Los nombres de los comandos se escriben en inglés, excepto si utiliza una versión francesa de 4D y si tiene seleccionada la preferencia "Utilizar lenguaje francés y parámetros regionales sistema" (ver [Is a list](is-a-list.md)). Cuando se utiliza el parámetro *opcion*, el código puede contener tokens del lenguaje con el fin de que sea independiente del lenguaje de programación 4D y de la versión (ver más adelante).
-* Para aumentar la legibilidad del código, el texto es indentado con los caracteres de tabulación en función de las estructuras de programación, al igual que en el editor de métodos.
-* Una línea se añade en el encabezado del código generado que contiene los metadatos utilizados para la importación del código, por ejemplo:
-```4d
- // %attributes = {"lang":"fr","invisible":true,"folder":"Web3"}
-```
-
-
-Durante una importación, esta línea no se importa, se utiliza para definir los atributos correspondientes (los atributos no especificados se reinicializan a su valor por defecto). El atributo "lang" define el lenguaje de exportación e impide una importación en una aplicación en lenguaje diferente (en este caso, se genera un error). El atributo "folder" contiene el nombre de la carpeta padre del método; no se muestra cuando el método no tiene una carpeta padre.
-Pueden definirse atributos adicionales. Para mayor información, consulte la descripción del comando [METHOD SET ATTRIBUTES](method-set-attributes.md).
-
-El parámetro *opcion* le permite seleccionar el modo de exportación del código con respecto a los elementos del lenguaje tokenizados de los métodos:
-
-* Si pasa 0 u omite el parámetro *opcion*, el código del método se exporta sin tokens, es decir, al igual que se muestra en el editor de métodos.
-* Si pasa 1 o la constante Code with tokens, el código del método se exporta con tokens, es decir, los elementos tokenizados son seguidos por su referencia interna en el contenido del *código* exportado. Por ejemplo, la expresión "[String](string.md)(a)" se exporta "[String](string.md):C10(a)", donde "C10" es la referencia interna del comando [String](string.md).
-
-Los elementos tokenizados del lenguaje incluyen:
-
-* los comandos y constantes 4D,
-* los nombres de tablas y campos,
-* los comandos de plug-ins 4D.
-
-El código exportado con sus tokens es independiente de todo cambio de nombre posterior de los elementos del lenguaje. Gracias a los tokens, el código suministrado en forma de texto siempre será interpretado correctamente por 4D, por ejemplo utilizando el comando [METHOD SET CODE](method-set-code.md) o copiar/pegar. Para más información sobre la sintaxis tokens 4D, consulte la sección *Utilizar tokens en fórmulas*.
-
-Si el comando se ejecuta desde un componente, se aplica por defecto a los métodos del componente. Si pasa el parámetro *\**, accede a los métodos de la base local.
-
-
-## Ejemplo 1
-
-Consulte el ejemplo del comando [METHOD SET CODE](method-set-code.md).
-
-## Ejemplo 2
-
-Este ejemplo ilustra el efecto del parámetro *opcion*.
-
-Usted desea exportar el siguiente método "simple\_init":
-
-```4d
- Case of
- :(Form event code=On Load)
- ALL RECORDS([Customer])
- End case
-```
-
-Si se ejecuta el siguiente código:
-
-```4d
- var $path : Text
- var $contents : Text
- $path:=METHOD Get path(Path project method;"simple_init")
- METHOD GET CODE($path;$contents;0) //sin tokens
- TEXT TO DOCUMENT("simple_init.txt";$contents)
-```
-
-El documento resultante contendrá:
-
-```RAW
- //%attributes = {"lang":"en"} comentario añadido y reservado por 4DCase of : (Form event code=On Load) ALL RECORDS([Customer])End case
-```
-
-Si se ejecuta el siguiente código:
-
-```4d
- var $path : Text
- var $contents : Text
- $path:=METHOD Get path(Path project method;"simple_init")
- METHOD GET CODE($path;$contents;Code with tokens) //usa tokens
- TEXT TO DOCUMENT("simple_init.txt";$contents)
-```
-
-El documento resultante contendrá:
-
-```RAW
- //%attributes = {"lang":"en"} comentario añadido y reservado por 4DCase of : (Form event code:C388=On Load:K2:1) ALL RECORDS:C47([Customer:1])End case
-```
-
-## Ver también
-
-[METHOD SET CODE](method-set-code.md)
-*Utilizar tokens en fórmulas*
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1190 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/mobile-app-refresh-sessions.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/mobile-app-refresh-sessions.md
deleted file mode 100644
index 01b1a7a7809214..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/mobile-app-refresh-sessions.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-id: mobile-app-refresh-sessions
-title: MOBILE APP REFRESH SESSIONS
-slug: /commands/mobile-app-refresh-sessions
-displayed_sidebar: docs
----
-
-**MOBILE APP REFRESH SESSIONS**
-
-| Este comando no requiere parámetros | |
-| --- | --- |
-
-
-
-## Descripción
-
-El comando **MOBILE APP REFRESH SESSIONS** comprueba todos los archivos de sesión de la aplicación móvil ubicados en la carpeta MobileApps del servidor y actualiza el contenido de sesión existente en la memoria para todo archivo editado.
-
-Este comando está diseñado para ser utilizado por los desarrolladores de 4D for iOS y de 4D for Android para "forzar" la recarga de la información de la sesión del usuario después de que se hayan editado sus archivos locales. Por ejemplo, si una sesión necesita reiniciarse, puede eliminar el archivo de sesión y luego llamar a **MOBILE APP REFRESH SESSIONS**. Para más información sobre las sesiones de aplicaciones móviles, consulte la [documentación Go Mobile](https://developer.4d.com/go-mobile).
-
-El comando verifica el cumplimiento de cada archivo de sesión en la carpeta MobileApps (sintaxis json, esquema json, datos de sesión). Si el archivo es compatible y se ha modificado, la sesión correspondiente se actualiza en la memoria (si ya existe) con los contenidos editados.
-
-Si un archivo de sesión no es válido o ha sido eliminado, la sesión correspondiente se elimina de la memoria.
-
-El comando puede devolver uno de los siguientes errores, que se puede manejar a través de los comandos [ON ERR CALL](on-err-call.md) y [Last errors](last-errors.md) :
-
-| **Nombre del componente** | **Código de error** | **Descripción** |
-| ------------------------- | ------------------- | ---------------------------------------------------------- |
-| mobi | 1 | La ubicación del archivo json no coincide con su contenido |
-| mobi | 2 | El archivo json no está formado correctamente |
-| mobi | 3 | El archivo json no valida el esquema json |
-| mobi | 4 | El token de conexión no cumple con la información actual |
-
-## Ejemplo
-
-Usted desea restablecer todas las sesiones actuales para todas las aplicaciones móviles:
-
-```4d
- var $sessionsPath : Text
- $sessionsPath:=Get 4D folder(MobileApps folder)
- DELETE FOLDER(sessionsPath;Delete with contents)
- MOBILE APP REFRESH SESSIONS
-```
-
-## Ver también
-
-[Método base On Mobile App Authentication](metodo-base-on-mobile-app-authentication.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1596 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/num.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/num.md
deleted file mode 100644
index 0b6773282ff07a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/num.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-id: num
-title: Num
-slug: /commands/num
-displayed_sidebar: docs
----
-
-**Num** ( *expresion* {; *separador*} ) : Real
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| expresion | Text, Boolean, Integer | → | Cadena a convertir en numérico o Booleano a convertir en 0 ó 1, o Expresión numérica |
-| separador | Text | → | Separador decimal |
-| Resultado | Real | ← | Valor numérico del parámetro expresión |
-
-
-
-## Descripción
-
-El comando Num devuelve en forma numérica la expresión de tipo cadena, booleano, o numérica que pasó en *expresion*. El parámetro opcional *separador* puede utilizarse para designar un separador decimal para la evaluación de las expresiones de tipo cadena.
-
-Expresiones de tipo cadena
-
-Si *expresion* consiste únicamente uno o más caracteres alfabéticos, Num devuelve cero. Si *expresion* incluye caracteres alfabéticos y caracteres numéricos, Num ignora los caracteres alfabéticos. De esta forma, Num transforma la cadena "a1b2c3" en el número 123\.
-
-Hay tres caracteres reservados que Num trata de manera particular: el separador decimal definido en el sistema (si el parámetro *separador* no se pasa), el guión “*\-*”, y “*e*” *o* “E”. Estos caracteres son interpretados como caracteres de formato numérico.
-
-* El separador decimal se interpreta como un lugar decimal y debe aparecer en una cadena numérica. Por defecto, el comando utiliza el separador decimal definido en el sistema operativo. Puede modificar este carácter utilizando el parámetro *separador* (ver a continuación).
-* El guión define un número o exponente negativo. El guión debe aparecer antes de los caracteres numéricos negativos o después de la “e” para un exponente. Excepto por el carácter “e”, si un guión está en una cadena numérica, la porción de la cadena después del guión se ignora. Por ejemplo, **Num**("123-456") devuelve 123, pero **Num**("-9") devuelve -9.
-* La e o E hace que todos los caracteres numéricos a la derecha se interpreten como la potencia de un exponente. La “e” debe estar en una cadena numérica. De esta forma, **Num**("123e–2") devuelve 1,23.
-
-Note que en el caso de que una cadena tenga más de un carácter "e", la conversión podrá dar resultados diferentes bajo Mac OS y bajo Windows.
-
-El parámetro *separador* puede utilizarse para designar un separador decimal personalizado para la evaluación de *expresion*. Cuando la cadena a evaluar se expresa con un separador decimal diferente del separador del sistema, el comando devuelve un resultado incorrecto. El parámetro *separador* puede utilizarse en este caso para obtener una evaluación correcta. Cuando se pasa este parámetro, el comando no tiene en cuenta el separador decimal del sistema. Puede pasar uno o más caracteres.
-
-**Nota:** el comando [GET SYSTEM FORMAT](get-system-format.md) puede utilizarse para buscar el separador decimal actual como también otros parámetros sistema regionales.
-
-Expresiones de tipo Booleano
-
-Si pasa una expresión booleana en el parámetro expresión, Num devuelve 1 si la expresión es True; de lo contrario devuelve *0* (cero).
-
-Expresiones numéricas
-
-Si pasa una expresión numérica en el parámetro *expresion*, Num devuelve tal cual el valor pasado en *expresion*. Esto puede ser útil especialmente en el caso de programación genérica utilizando punteros.
-
-**Expresiones indefinidas**
-Si la *expresion* se evalúa como indefinida, el comando devuelve 0 (cero). Esto es útil cuando se espera que el resultado de una expresión (por ejemplo, un atributo objeto) sea un número, incluso si puede ser indefinido.
-
-## Ejemplo 1
-
-El siguiente ejemplo ilustra cómo funciona Num cuando se pasa un argumento de tipo cadena. Cada línea asigna un número a la variable *vResult*. Los comentarios describen los resultados:
-
-```4d
- vResult:=Num("ABCD") // vResult vale 0
- vResult:=Num("A1B2C3") // vResult vale 123
- vResult:=Num("123") // vResult vale 123
- vResult:=Num("123,4") // vResult vale 123,4
- vResult:=Num("-123") // vResult vale -123
- vResult:=Num("-123e2") // vResult vale -12300
-```
-
-## Ejemplo 2
-
-En este ejemplo, *\[Cliente\]Deuda* se compara con el valor *$1000*. El comando Num aplicado a esta comparación devuelve 1 o 0\. La multiplicación de una cadena por 1 ó 0 devuelve la cadena o la cadena vacía. Como resultado, *\[Cliente\]Riesgo* recibe el valor “Aceptable” o “Inaceptable”:
-
-```4d
- // Si el cliente tiene deudas menores a 1000, el riesgo es aceptable.
- // Si el cliente tiene deudas superiores a 1000, el riesgo es inaceptable.
- [Cliente]Riesgo:=("Aceptable"*Num([Cliente]Deuda<1000))+("Inaceptable"*Num([Cliente]Deuda>=1000))
-```
-
-## Ejemplo 3
-
-Este ejemplo compara los resultados obtenidos dependiendo del separador “actual”:
-
-```4d
- $lacadena:="33,333.33"
- $elnum:=Num($lacadena)
- // by default, $elnum es igual a 33,33333 en un sistema francés
- $elnum:=Num($lacadena;".")
- // $elnum se evaluará correctamente sin importar el sistema;
- // por ejemplo, 33 333,33 en un sistema francés
-```
-
-## Ver también
-
-[Bool](../commands/bool)
-[GET SYSTEM FORMAT](get-system-format.md)
-[String](string.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 11 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/object-set-scrollbar.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/object-set-scrollbar.md
deleted file mode 100644
index a3e9552d0e08aa..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/object-set-scrollbar.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-id: object-set-scrollbar
-title: OBJECT SET SCROLLBAR
-slug: /commands/object-set-scrollbar
-displayed_sidebar: docs
----
-
-**OBJECT SET SCROLLBAR** ( {* ;} *objeto* ; *horizontal* ; *vertical* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| * | Operador | → | Si se especifica, objeto es un nombre de objeto (cadena) Si se omite, objeto es una variable |
-| objeto | any | → | Nombre de objeto (si se especifica *), o Variable (si se omite *) |
-| horizontal | Boolean, Integer | → | True = mostrar, False = ocultar |
-| vertical | Boolean, Integer | → | True = mostrar, False = ocultar |
-
-
-
-## Descripción
-
-El comando OBJECT SET SCROLLBAR le permite mostrar u ocultar las barras de desplazamiento horizontal o vertical en el objeto designado por los parámetros *objeto* y *\**.
-
-Si pasa el parámetro opcional *\**, indica que el parámetro *objeto* es un nombre de objeto (una cadena). Si no pasa el parámetro opcional \*, indica que el parámetro *objeto* es una variable. En este caso, no se pasa una cadena sino una referencia de una variable. Para mayor información sobre nombres de objetos, consulte la sección *Propiedades de los objetos*.
-
-Pase en los parámetros *horizontal* y *vertical* los valores indicando si las barras de desplazamiento correspondientes deben ser mostrarse. Puede pasar valores booleanos (True=mostrado, False=oculto), o valores numéricos (0=oculto, 1=mostrado, 2=modo automático). El uso de valores numéricos le da acceso al modo automático, donde sólo se muestran las barras de desplazamiento cuando sea necesario.
-
-.
-
-| **Objetos con barras de desplazamiento** | **Ocultar barra de desplazamiento** | **Mostrar barra de desplazamiento** | **Modo automático** |
-| ---------------------------------------- | ----------------------------------- | ----------------------------------- | ------------------- |
-| Text object fields and variables | False o 0 | True o 1 | *no disponible* |
-| Campos y variable objeto texto | False o 0 | True o 1 | 2 |
-| List boxes | False o 0 | True o 1 | 2 |
-| Listas jerárquicas | False o 0 | True o 1 | 2 |
-| Subformularios | False o 0 | True o 1 | *no disponible* |
-
- Por defecto, se muestran las barras de desplazamiento.
-
-**Nota:** para obtener más información sobre el modo automático, consulte *Barras de desplazamiento*.
-
-## Ver también
-
-[LISTBOX Get property](listbox-get-property.md)
-[LISTBOX SET GRID](listbox-set-grid.md)
-[OBJECT GET SCROLLBAR](object-get-scrollbar.md)
-[OBJECT SET VISIBLE](object-set-visible.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 843 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/on-err-call.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/on-err-call.md
deleted file mode 100644
index a05b60327ab5c4..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/on-err-call.md
+++ /dev/null
@@ -1,195 +0,0 @@
----
-id: on-err-call
-title: ON ERR CALL
-slug: /commands/on-err-call
-displayed_sidebar: docs
----
-
-**ON ERR CALL** ( *metodoError* {; *alcance*} )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| metodoError | Text | → | Método de gestión de errores a llamar o cadena vacía para desinstalar el método |
-| alcance | Integer | → | Alcance del método de gestión de errores |
-
-
-
-## Descripción
-
-El comando **ON ERR CALL** instala el método proyecto, cuyo nombre se pasa en *metodoError*, como método de intercepción de errores para el contexto de ejecución definido en el proyecto actual. Este método se denomina **método de gestión de errores** o **método de detección de errores.**
-
-Los métodos de gestión de errores se instalan por proyecto: los componentes y los proyectos anfitriones pueden definir sus propios métodos de tratamiento de errores, sólo se llamará al método del proyecto en el que se produjo el error.
-
-Una vez que se instala un proyecto de control de errores, 4D llama al método cada vez que se produce un error durante la ejecución de un comando de lenguaje 4D en el contexto de ejecución definido.
-
-El *alcance* de este comando designa el contexto de ejecución desde donde un error dispará la llamada de *metodoError*. Por defecto, si se omite el parámetro *alcance*, el alcance del comando es el contexto de ejecución local, es decir, el proceso actual. Puede pasar una de las siguientes constantes en el parámetro *alcance*:
-
-| Constante | Valor | Comentario |
-| ------------------------- | ----- | ---------------------------------------------------------------------------------------------------- |
-| ek errors from components | 2 | Errores ocurridos en los componentes |
-| ek global | 1 | Errores ocurridos en el contexto de ejecución global del proyecto |
-| ek local | 0 | Errores ocurridos en el contexto de ejecución local (por defecto si se omite el parámetro *alcance*) |
-
-* si *alcance* \= ek local (o si se omite *alcance*), sólo los errores producidos en el proceso actual llamarán a *metodoError*. Puede tener un método de gestión de errores por proceso a la vez, pero puede tener diferentes métodos de gestión de errores para varios procesos.
-* si *alcance* \= ek global, todos los errores ocurridos en la aplicación, sea cual sea el proceso (excepto los componentes), llamarán a *metodoError*. Tenga en cuenta que, si también se define un gestor de errores ek local para un proceso, no se llamará al gestor de errores ek global . Este principio permite definir un método genérico que interceptará todos los errores, mientras que los métodos locales de gestión de errores pueden ser definidos para algunos procesos específicos.
-Tenga en cuenta también que un método global de gestión de errores es útil en el servidor, donde se puede manejar los errores en las funciones del lado del servidor.
-* si *alcance* \= ek errors from components, sólo los errores generados por los componentes instalados en la aplicación llamarán a *metodoError*. Tenga en cuenta que, si se define un método de gestión de errores en un componente, se le llama en caso de error en el componente, y no se llama al gestor de errores ek errors from components definido en la aplicación local.
-
-**Nota:** si **ON ERR CALL** se llama desde un proceso para el cual usted ha solicitado ejecución apropiativa (en modo compilado), el compilador verifica si *metodoError* es hilo seguro y devuelve los errores si no es compatible con el modo apropiativo. Para más información, consulte la sección *Procesos 4D apropiativos*.
-
-Para desinstalar un método de gestión de errores, llame a **ON ERR CALL** de nuevo con el parámetro *alcance* deseado (si lo hay) y pase la cadena vacía en *metodoError*.
-
-Puede identificar errores leyendo la variable sistema Error, la cual contiene el número de código del error. Los códigos de errores se listan en el tema *Códigos de error*. Por ejemplo, puede ver la sección *Errores de sintaxis*. El valor de la variable Error es significativo sólo en el método de gestión de errores; si necesita el código del error en el método que provocó el error, copie la variable Error en su propia variable proceso. También puede acceder a las variables sistema Error method, Error line y Error formula las cuales contienen respectivamente, el nombre del método, el número de línea y el texto de la fórmula donde ocurrió el error (ver [Gestión de errores dentro del método](../Concepts/error-handling.md#handling-errors-within-the-method)).
-
-Puede utilizar el comando [Last errors](last-errors.md) o [Last errors](last-errors.md) para obtener la secuencia de errores (la "pila" de errores) en el origen de la interrupción.
-
-El método de gestión de errores debe tratar los errores de manera apropiada o mostrar un mensaje de error al usuario. Los errores pueden ser generados durante los procesos efectuados por:
-
-* El motor de base de datos de 4D; por ejemplo, cuando guarda un registro provoca la violación de una regla de trigger.
-* El entorno de 4D; por ejemplo, cuando no tienen suficiente memoria parar llenar un array.
-* El sistema operativo en el cual se ejecuta la base; por ejemplo, disco lleno o errores de entrada/salida.
-
-El comando [ABORT](abort.md) puede utilizarse para terminar el proceso. Si no llama [ABORT](abort.md) en el método de gestión de errores, 4D devuelve el método interrumpido y continúa la ejecución del método. Utilice el comando [ABORT](abort.md) cuando un error no puede recuperarse.
-
-Si ocurre un error en el método de gestión de errores, 4D retoma el control de la gestión de errores. Por lo tanto, debe asegurarse de que el método de gestión de errores no pueda generar un error. Igualmente, no puede utilizar ON ERR CALL dentro del método de gestión de errores.
-
-## Ejemplo 1
-
-Desea definir un gestor de errores global, por ejemplo en el método base On Open:
-
-```4d
- ON ERR CALL("myGlobalErrorHandler";ek global)
-```
-
-## Ejemplo 2
-
-El siguiente método de proyecto trata de crear un documento cuyo nombre se recibe como parámetro. Si no se puede crear el documento, el método de proyecto devuelve 0 (cero) o el código de error:
-
-```4d
- // Método de proyecto Crear doc
- // Crear doc ( String ; Pointer ) -> Entero largo
- // Crear doc ( DocName ; ->DocRef ) -> Código de error resultante
-
- gError:=0
- ON ERR CALL("IO MANEJADOR DE ERRORES")
- $2->:=Create document($1)
- ON ERR CALL("")
- $0:=gError
-```
-
-El método de proyecto IO\_GESTION\_ERRORES es el siguiente:
-
-```4d
- // Método de proyecto IO_GESTION_ERRORES
-```
-
-```4d
- gError:=Error // Simplemente copie el código del error en la variable de proceso gError
-```
-
-Note la utilización de la variable proceso gError para obtener el código del error en el método de ejecución actual. Una vez estos métodos estén presentes en su base de datos, puede escribir:
-
-```4d
- // ...
- var vhDocRef : Time
- $vlErrCode:=Crear doc($vsDocumentNombre;->vhDocRef)
- If($vlErrCode=0)
- //...
- CLOSE DOCUMENT($vlErrCode)
- Else
- ALERT("El documento no pudo ser creado, error de E/S "+String($vlErrCode))
- End if
-```
-
-## Ejemplo 3
-
-Mientras implementa un conjunto de operaciones complejas, puede terminar con varias subrutinas que necesiten diferentes métodos de gestión de errores. Sólo puede tener un método de gestión de errores por proceso, de manera que tiene dos opciones:
- \- Mantener contacto con el actual cada vez que llama a ON ERR CALL, o
-\- Utiliza la variable array proceso (en este caso, *asMetodoError*) para “apilar” los métodos de gestión de errores y un método de proyecto (en este caso, ON ERROR CALL) para instalar y desinstalar los métodos de gestión de errores.
-Debe inicializar el array al comienzo de la ejecución del proceso:
-
-```4d
- // NO olvide inicializar el array al inicio
- // del método de proceso (el método de proyecto que ejecuta el proceso)
- ARRAY STRING(63;asMetodoError;0)
-```
-
-Este es el método personalizado ON ERROR CALL:
-
-```4d
- // Método de proyecto ON ERROR CALL
- // ON ERROR CALL { ( Cadena) }
- // ON ERROR CALL { ( Nombre del método ) }
-
- C_STRING(63;$1;$MetodoError)
- var $vlElem : Integer
-
- If(Count parameters>0)
- $MetodoError:=$1
- Else
- $MetodoError:=""
- End if
-
- If($MetodoError#"")
- var gError : Integer
- gError:=0
- $vlElem:=1+Size of array(asMetodoError)
- INSERT IN ARRAY(asMetodoError;$vlElem)
- asMetodoError{$vlElem}:=$1
- ON ERR CALL($1)
- Else
- ON ERR CALL("")
- $vlElem:=Size of array(asMetodoError)
- If($vlElem>0)
- DELETE FROM ARRAY(asMetodoError;$vlElem)
- If($vlElem>1)
- ON ERR CALL(asMetodoError{$vlElem-1})
- End if
- End if
- End if
-```
-
-Luego, puede llamarlo de esta manera:
-
-```4d
- gError:=0
- ON ERROR CALL("IO ERRORS") // Instale el método de gestión de errores IO ERRORS
- // ...
- ON ERROR CALL("ALL ERRORS") // Instale el método de gestión de errores ALL ERRORS
- // ...
- ON ERROR CALL // Desinstale el método de gestión de errores ALL ERRORS y reinstale IO ERRORS
- // ...
- ON ERROR CALL // Desinstale el método de gestión de errores IO ERRORS
- // ...
-```
-
-## Ejemplo 4
-
-El siguiente método de gestión de errores ignora las interrupciones del usuario y muestra el texto del error:
-
-```4d
- //Método de proyecto Show_errors_only
- If(Error#1006) //esta no es una interrupción del usuario
- ALERT("The error "+String(Error)+" occurred. The code in question is: \""+Error formula+"\"")
- End if
-```
-
-
-
-## Ver también
-
-[ABORT](abort.md)
-*Gestión de errores*
-[Last errors](last-errors.md)
-[Last errors](last-errors.md)
-[Method called on error](method-called-on-error.md)
-*Variables sistema*
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 155 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/php-execute.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/php-execute.md
deleted file mode 100644
index 76f4f6246ed90d..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/php-execute.md
+++ /dev/null
@@ -1,290 +0,0 @@
----
-id: php-execute
-title: PHP Execute
-slug: /commands/php-execute
-displayed_sidebar: docs
----
-
-
-
-**PHP Execute** ( *rutaScript* {; *nomFuncion* {; *resultPHP* {; *param*} {; *param2* ; ... ; *paramN*}}} ) : Boolean
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| rutaScript | Text | → | Ruta de acceso al script PHP o "" para ejecutar una función PHP |
-| nomFuncion | Text | → | Función PHP a ejecutar |
-| resultPHP | *, Variable, Field | ← | Resultado de ejecución de la función PHP o * para no recibir el resultado |
-| param | Text, Boolean, Real, Integer, Date, Time | → | Parámetros de la función PHP |
-| Resultado | Boolean | ← | True = ejecución correcta, False = error de ejecución |
-
-
-
-:::info Compatibilidad
-
-**PHP es obsoleto en 4D**. Se recomienda utilizar la clase [`4D.SystemWorker class`](../API/SystemWorkerClass.md).
-
-:::
-
-## Descripción
-
-El comando **PHP Execute** permite ejecutar un script o una función PHP.
-
-Pase en el parámetro *rutaScrip*t la ruta de acceso del archivo de script PHP a ejecutar. Puede ser una ruta de acceso relativa si el archivo está ubicado junto a la estructura de la base o de una ruta absoluta. La ruta de acceso puede expresarse en sintaxis sistema o POSIX.
-Si quiere ejecutar directamente una función PHP estándar, pase una cadena vacía ("") en *rutaScript*. El nombre de la función debe pasarse en el segundo parámetro.
-
-Pase en el parámetro *nomFuncion* un nombre de función PHP si quiere ejecutar una función específica en el script *rutaScript*. Si pasa una cadena vacía u omite el parámetro *nomFuncion*, el script se ejecuta completamente.
-
-**Nota:** PHP tiene en cuenta las mayúsculas y minúsculas de los caracteres en el nombre de la función. No utilice paréntesis, introduzca únicamente el nombre de la función.
-
-El parámetro *resultPHP* recibe el resultado de la ejecución de la función PHP. Puede pasar:
-
-* una variable, un array o un campo para recibir el resultado,
-* el carácter *\** si la función no devuelve ningún resultado o si no quiere recuperar el resultado.
-
-El parámetro *resultPHP* puede ser de tipo texto, entero largo, real, booleano o fecha así como también (excepto para arrays) BLOB u hora. 4D efectuará la conversión de los datos y los ajustes necesarios siguiendo los principios descritos en la sección a continuación.
-
-* si pasa un nombre de función en el parámetro *nomFuncion*, *resultPHP* recibirá lo que el desarrollador PHP devuelve con el comando return del cuerpo de la función.
-* Si utiliza el comando sin pasar un nombre de función en el parámetro *nomFuncion*, *r* *esultPHP* recibirá lo que el desarrollador PHP devolvió con el comando echo ( o un comando similar).
-
- Si llama a una función PHP que espera argumentos, utilice los parámetros *param1...N* para pasar uno o varios valores. Los valores deben estar separados por punto y coma. Puede pasar valores de tipo alfa, texto, booleano, real, entero, entero largo, fecha u hora. Las imágenes y los BLOBs y objetos no se aceptan. Puede enviar un array; en este caso debe pasar un puntero en el array al comando **PHP Execute**, de lo contrario el índice actual del array se enviará como un entero (ver el ejemplo). El comando acepta todos los tipos de arrays excepto los arrays puntero, los arrays imagen y los arrays 2D.
-
-**Nota:** por razones técnicas, el tamaño de los parámetros pasados vía el protocolo FastCGI no debe pasar los 64 KB. Debe tener en cuenta esta limitación si utiliza parámetros de tipo Texto.
-
-El comando devuelve True si la ejecución se ha efectuado correctamente del lado de 4D, en otras palabras, si el lanzamiento del entorno de ejecución, la apertura del script y el establecimiento de la comunicación con el intérprete PHP fueron exitosos. De lo contrario, se genera un error, que puede interceptar con el comando [ON ERR CALL](on-err-call.md "ON ERR CALL") y analizar con [Last errors](last-errors.md).
-Además, el script mismo puede generar errores PHP. En este caso, debe utilizar el comando [PHP GET FULL RESPONSE](php-get-full-response.md "PHP GET FULL RESPONSE") para analizar la fuente del error (ver ejemplo 4).
-
-**Nota:** PHP permite configurar la gestión de errores. Para mayor información, consulte por ejemplo la página: .
-
-### Conversión de los datos devueltos
-
-La siguiente tabla especifica cómo 4D interpreta y convierte los datos devueltos en función del tipo del parámetro *resultPHP*.
-
-| **Tipo del parámetro *resultPHP*** | **Proceso 4D** | **Ejemplo** |
-| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- |
-| BLOB | 4D recupera los datos recibidos sin ninguna modificación(\*). | |
-| Texto | 4D espera los datos codificados en UTF-8 (\*). El desarrollador PHP puede necesitar utilizar el comando PHP **utf8\_encode**. | Ejemplo de script PHP: echo utf8\_encode(miTexto) |
-| Fecha | 4D espera una fecha enviada como una cadena en formato RFC 3339 (también llamado DATE\_ATOM en PHP). Este formato es de tipo "AAAA-MM-DDTHH:MM:SS", por ejemplo: 2005-08-15T15:52:01+00:00\. 4D ignora la parte hora y devuelve la fecha en UTC. | |
-| Hora | 4D espera una hora enviada en forma de cadena en formato RFC 3339 (ver el tipo Fecha). 4D ignora la parte fecha y devuelve el número de segundos transcurridos desde la media noche considerando la fecha en la zona horaria local. | Ejemplo de script PHP para enviar 2h30'45": echo date( DATE\_ATOM, mktime( 2,30,45)) |
-| Entero o Real | 4D interpreta el valor numérico expresado con números, signo + o - y/o el exponente con el prefijo 'e'. Todo carácter '.' o ',' se interpreta como un separador decimal. | Ejemplo de script PHP: echo -1.4e-16; |
-| Booleano | 4D devuelve True si recibe la cadena "true" desde PHP o si la evaluación numérica da un valor no nulo. | Ejemplo de script PHP: echo (a==b); |
-| Array | 4D considera que el array PHP fue devuelto en el formato JSON. | Ejemplo de script PHP para devolver un array de dos textos: echo json\_encode( array( "hola", "mundo")); |
-
-(\*) Por defecto, no se devuelven los encabezados HTTP:
-\- Si utiliza [PHP Execute](php-execute.md) al pasar una función en el parámetro *nomFuncion*, los encabezados HTTP nunca se devuelven en *resultPHP*. Sólo están disponibles por medio del comando [PHP GET FULL RESPONSE](php-get-full-response.md).
-\- Si utiliza [PHP Execute](php-execute.md) sin un nombre de función (el parámetro *nomFuncion* se omite o contiene una cadena vacía), puede devolver los encabezados HTTP fijando la opción PHP Raw result en True utilizando el comando [PHP SET OPTION](php-set-option.md).
-
-**Nota:** si debe recuperar grandes volúmenes de datos utilizando PHP, es más eficiente pasar por el canal del buffer *stdOut* (comando **echo** o similar) que por el retorno de función. Para mayor información, consulte la descripción del comando [PHP GET FULL RESPONSE](php-get-full-response.md).
-
-### Using environment variables
-
-Puede utilizar el comando [SET ENVIRONMENT VARIABLE](set-environment-variable.md "SET ENVIRONMENT VARIABLE") para definir las variables de entorno utilizadas por el script. Atención: después de llamar [LAUNCH EXTERNAL PROCESS](launch-external-process.md "LAUNCH EXTERNAL PROCESS") o PHP Execute, el conjunto de las variables entorno se borra.
-
-### Special functions
-
-4D ofrece las siguientes funciones especiales:
-
-* **quit\_4d\_php**: permite salir del intérprete PHP y de todos sus procesos hijos. Si al menos uno de los procesos hijo está ejecutando un script, el intérprete no sale y el comando PHP Execute devuelve False.
-* **relaunch\_4d\_php**: permite relanzar el intérprete PHP.
-
-Note que el intérprete se relanza automáticamente cuando la primera petición se envía por PHP Execute.
-
-## Ejemplo 1
-
-Llamada del script "myPhpFile.php" sin función. Este es el contenido del script:
-
-```PHP
-
-```
-
-El siguiente código 4D:
-
-```4d
- var $result : Text
- var $isOK : Boolean
- $isOK:=PHP Execute("C:\php\myPhpFile.php";"";$result)
- ALERT($Result)
-```
-
-...mostrará la versión PHP actual.
-
-## Ejemplo 2
-
-Llamada de la función *myPhpFunction* en el script "myNewScript.php" con parámetros. Este es el contenido del script:
-
-```PHP
-
-```
-
-Llamada con función:
-
-```4d
- var $result : Text
- var $param1 : Text
- var $param2 : Text
- var $isOk : Boolean
- $param1 :="¡Hola"
- $param2 :="mundo 4D!"
- $isOk:=PHP Execute("C:\MyFolder\myNewScript.php";"myPhpFunction";$result;$param1;$param2)
- ALERT($result) // Muestra "¡Hola mundo 4D!"
-```
-
-## Ejemplo 3
-
-Salir del intérprete PHP:
-
-```4d
- $ifOk:=PHP Execute("";"quit_4d_php")
-```
-
-## Ejemplo 4
-
-Gestión de errores:
-
-```4d
- // Instalación del método de gestión de errores
- phpCommError:="" // Modificado por PHPErrorHandler
- $T_saveErrorHandler :=Method called on error
- ON ERR CALL("PHPErrorHandler")
-
- // Ejecución del script
- var $T_result : Text
- If(PHP Execute("C:\MyScripts\MiscInfos.php";"";$T_result))
- // Ningún error, $T_Result contiene el resultado
- Else
- // Se ha detectado un error, administrado por PHPErrorHandler
- If(phpCommError="")
- ... // error PHP, utilice PHP GET FULL RESPONSE
- Else
- ALERT(phpCommError)
- End if
- End if
-
- // Desinstalación del método
- ON ERR CALL($T_saveErrorHandler)
-
-
-```
-
-El método PHP\_errHandler es el siguiente:
-
-```4d
- phpCommError:=""
- GET LAST ERROR STACK(arrCodes;arrComps;arrLabels)
- For($i;1;Size of array(arrCodes))
- phpCommError:=phpCommError+String(arrCodes{$i})+" "+arrComps{$i}+" "+
- arrLabels{$i}+Char(Carriage return)
- End for
-```
-
-## Ejemplo 5
-
-Creación dinámica por 4D de un script antes de su ejecución:
-
-```4d
- DOCUMENT TO BLOB("C:\Scripts\MyScript.php";$blobDoc)
- If(OK=1)
- $strDoc:=BLOB to text($blobDoc;UTF8 text without length)
-
- $strPosition:=Position("function2Rename";$strDoc)
-
- $strDoc:=Insert string($strDoc;"_v2";Length("function2Rename")+$strPosition)
-
- TEXT TO BLOB($strDoc;$blobDoc;UTF8 text without length)
- BLOB TO DOCUMENT("C:\Scripts\MyScript.php";$blobDoc)
- If(OK#1)
- ALERT("Error on script creation")
- End if
- End if
-```
-
-Se ejecuta el script:
-
-```4d
- $err:=PHP Execute("C:\Scripts\MyScript.php";"function2Rename_v2";*)
-```
-
-## Ejemplo 6
-
-Recuperación directa de un valor de tipo fecha y hora. Este es el contenido del script:
-
-```PHP
-
-```
-
-Recepción de la fecha del lado 4D:
-
-```4d
- var $phpResult_date : Date
- $result :=PHP Execute("C:\php_scripts\ReturnDate.php";"";$phpResult_date)
- //$phpResult_date is !05/04/2009 !
-
- var $phpResult_time : Time
- $result :=PHP Execute("C:\php_scripts\ReturnDate.php";"";$phpResult_time)
- //$phpResult_time is ?01 :02 :03 ?
-```
-
-## Ejemplo 7
-
-Distribución de datos en arrays:
-
-```4d
- ARRAY TEXT($arText ;0)
- ARRAY LONGINT($arLong ;0)
- $p1 :=","
- $p2 :="11,22,33,44,55"
- $phpok :=PHP Execute("";"explode";$arText;$p1;$p2)
- $phpok :=PHP Execute("";"explode";$arLong;$p1;$p2)
-
- // $arText contiene los valores Alfa "11", "22", "33", etc.
- // $arLong contiene los números, 11, 22, 33, etc.
-```
-
-## Ejemplo 8
-
-Inicialización de un array:
-
-```4d
- ARRAY TEXT($arText ;0)
- $phpok :=PHP Execute("";"array_pad";$arText;->$arText;50;"indefinido")
- // Ejecute en PHP: $arrTest = array_pad($arrTest, 50, ’indefinido’);
- // Llene el array $arText con 50 elementos "indefinido"
-```
-
-## Ejemplo 9
-
-Paso de parámetros vía un array:
-
-```4d
- ARRAY INTEGER($arInt;0)
- $phpok :=PHP Execute("";"json_decode";$arInt;"[13,51,69,42,7]")
- // Ejecute en PHP: $arInt = json_decode(’[13,51,69,42,7]’);
- // Llene el array con los valores iniciales
-```
-
-## Ejemplo 10
-
-Este es un ejemplo de la utilización básica de la función trim, para eliminar espacios adicionales y/o caracteres invisibles de principio a fin de una cadena:
-
-```4d
- var $T_String : Text
- $T_String:=" Hello "
- var $B : Boolean
- $B:=PHP Execute("";"trim";$T_String;$T_String)
-```
-
-Para obtener más información acerca de la función trim, por favor, consulte la documentación de PHP.
-
-## Ver también
-
-*Ejecutar scripts PHP en 4D*
-[PHP GET FULL RESPONSE](php-get-full-response.md)
-[PHP SET OPTION](php-set-option.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1058 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/picture-library-list.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/picture-library-list.md
deleted file mode 100644
index bdfde8550d0e52..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/picture-library-list.md
+++ /dev/null
@@ -1,109 +0,0 @@
----
-id: picture-library-list
-title: PICTURE LIBRARY LIST
-slug: /commands/picture-library-list
-displayed_sidebar: docs
----
-
-**PICTURE LIBRARY LIST** ( *refsImag* ; *nomsImag* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| refsImag | Integer array | ← | Números de referencia de las imágenes de la librería de imágenes |
-| nomsImag | Text array | ← | Nombres de las imágenes de la librería de imágenes |
-
-
-
-## Descripción
-
-:::warning
-
-Este comando no puede utilizarse en proyectos porque la librería de imágenes sólo está disponible en bases de datos binarias.
-
-:::
-
-El comando PICTURE LIBRARY LIST devuelve los números de referencia y los nombres de las imágenes almacenadas en la librería de imágenes de la base de datos.
-
-Después de llamarlo, usted recupera los números de referencia en el array *refsImag* y los nombres en el array *nomsImag*. Los dos arrays están sincronizados: el elemento n de *refsImag* es el número de referencia de la imagen de la librería cuyo nombre es devuelto en el elemento n de *nomsImagenes*.
-
-Si es necesario, el comando crea y dimensiona automáticamente los arrays *refsImagenes* y *nomsImagenes.*
-
-La longitud máxima del nombre de una imagen de la librería es de 255 caracteres.
-
-Si la librería de imágenes está vacía, los dos arrays devueltos estarán vacíos.
-
-Para obtener el número de imágenes almacenadas actualmente en la librería de imágenes, utilice el comando [Size of Array](size-of-array.md "Size of Array") para obtener el tamaño de uno de los dos arrays.
-
-## Ejemplo 1
-
-El siguiente código devuelve el catálogo de la librería de imágenes en los arrays *alRefImag* y *asNomImag*:
-
-```4d
- PICTURE LIBRARY LIST(alRefImag;asNomImag)
-```
-
-## Ejemplo 2
-
-El siguiente ejemplo prueba si la librería de imágenes está vacía o no:
-
-```4d
- PICTURE LIBRARY LIST(alRefImag;asNomImag)
- If(Size of array(alRefImag)=0)
- ALERT("La librería de imágenes está vacía.")
- Else
- ALERT("La librería de imágenes contiene "+String(Size of array(alRefImag))+" imágenes.")
- End if
-```
-
-## Ejemplo 3
-
-El siguiente ejemplo exporta la librería de imágenes a un documento almacenado en el disco:
-
-```4d
- PICTURE LIBRARY LIST($alPicRef;$asPicName)
- $vlNbPictures:=Size of array($alPicRef)
- If($vlNbPictures>0)
- SET CHANNEL(12;"")
- If(OK=1)
- $vsTag:="4DV6PICTURELIBRARYEXPORT"
- SEND VARIABLE($vsTag)
- SEND VARIABLE($vlNbPictures)
- gError:=0
- For($vlPicture;1;$vlNbPictures)
- $vlPicRef:=$alPicRef{$vlPicture}
- $vsPicName:=$asPicName{$vlPicture}
- GET PICTURE FROM LIBRARY($alPicRef{$vlPicture};$vgPicture)
- If(OK=1)
- SEND VARIABLE($vlPicRef)
- SEND VARIABLE($vsPicName)
- SEND VARIABLE($vgPicture)
- Else
- $vlPicture:=$vlPicture+1
- gError:=-108
- End if
- End for
- SET CHANNEL(11)
- If(gError#0)
- ALERT("La librería de imágenes no pudo exportarse, inténtelo con más memoria.")
- DELETE DOCUMENT(Document)
- End if
- End if
- Else
- ALERT("La librería de imágenes está vacía.")
- End if
-```
-
-## Ver también
-
-[GET PICTURE FROM LIBRARY](get-picture-from-library.md)
-[REMOVE PICTURE FROM LIBRARY](remove-picture-from-library.md)
-[SET PICTURE TO LIBRARY](set-picture-to-library.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 564 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/position.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/position.md
deleted file mode 100644
index c7c34be77c45e3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/position.md
+++ /dev/null
@@ -1,129 +0,0 @@
----
-id: position
-title: Position
-slug: /commands/position
-displayed_sidebar: docs
----
-
-**Position** ( *buscar* ; *laCadena* {; *inicio* {; *longEncont*}}{; *} ) -> Resultado
-**Position** ( *buscar* ; *laCadena* ; *inicio* ; *longEncont* ; *opciones* ) -> Resultado
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| buscar | Text | → | Cadena a buscar |
-| laText | Text | → | Cadena en la cual buscar |
-| inicio | Integer | → | Posición en la cadena donde comenzar la búsqueda |
-| longEncont | Integer | ← | Longitud de la cadena encontrada |
-| * | Operador | → | Si se pasa: búsqueda diacrítica |
-| Resultado | Integer | ← | Posición de la primera ocurrencia |
-| Position ( buscar ; laCadena ; inicio ; longEncont ; opciones ) -> Resultado |
-| Parámetro | Tipo | Descripción |
-| buscar | Text | → | Cadena a buscar |
-| laText | Text | → | Cadena en la cual buscar |
-| inicio | Integer | → | Posición en la cadena donde comenzar la búsqueda |
-| longEncont | Integer | → | Longitud de la cadena encontrada |
-| opciones | Integer | → | Condición(es) de búsqueda |
-| Resultado | Integer | ← | Posición de la primera ocurrencia |
-
-
-
-## Descripción
-
-**Position** devuelve la posición de la primera ocurrencia de *buscar* en *laCadena*.
-
-Si *laCadena* no contiene *buscar*, devuelve cero (0).
-
-Si **Position** ubica una ocurrencia de *buscar*, la función devuelve la posición del primer carácter de esta ocurrencia en *laCadena*.
-
-Si pregunta por la posición de una cadena vacía dentro de una cadena vacía, **Position** devuelve cero (0).
-
-Por defecto, la búsqueda comienza en el primer carácter de *laCadena*. El parámetro *inicio* permite precisar el carácter donde la búsqueda debe comenzar en *laCadena*.
-
-El parámetro *longEncont*, devuelve la longitud de la cadena encontrada por la búsqueda. Este parámetro es necesario para poder gestionar correctamente cartas escritas con uno o más caracteres (ejemplo: æ y ae, ß y ss, etc.).
-Si se pasa el parámetro *\** (ver abajo), estas letras no se consideran como equivalente (æ # ae); en modo diacrítico, *longEncont* siempre es igual a la longitud de *buscar* (si se encuentra una ocurrencia).
-
-Por defecto, el comando hace comparaciones globales teniendo en cuenta particularidades lingüísticas y letras que pueden estar escritas con uno o más caracteres (por ejemplo æ = ae). Por otra parte, no es diacrítica (a=A, a=à etc.) y no tiene en cuenta los caracteres "ignorables". Los caracteres ignorables incluyen todos los caracteres del subset unicode *CO Control* (U+0000 a U+001F, ascii character control set) excepto los caracteres imprimibles (U+0009 TAB, U+0010 LF, U+0011 VT, U+0012 FF y U+0013 CR).
-
-Para modificar este funcionamiento, puede pasar:
-
-* (**primera sintaxis - parámetro \***) el asterisco *\** como último parámetro. En este caso, las comparaciones se basan en los códigos de los caracteres. Debe pasar el parámetro *\**:
- * Si quiere tener en cuenta caracteres especiales, utilizados por ejemplo como delimitadores (**Char**(1), etc.),
- * Si la evaluación de caracteres debe ser sensible a las mayúsculas y minúsculas y tener en cuenta los caracteres acentuados (a#A, a#à, etc.).
- Note que en este modo, la evaluación no maneja variaciones en la escritura de las palabras.
-
- **Nota:** en ciertos casos, utilizar el parámetro *\** puede acelerar significativamente la ejecución del comando.
-* (**segunda sintaxis -** ***parámetro opciones**) una o una combinación de las siguientes constantes del tema *Cadenas*:
-
-| Constante | Valor | Comentario |
-| ------------------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| sk case insensitive | 2 | Las cadenas se comparan según el lenguaje actual de los datos sin tener en cuenta las diferencias de mayúsculas y minúsculas. Note que los signos diacríticos se tienen en cuenta. Por ejemplo, "A" se considera lo mismo que "a", sin embargo "a" no se considera lo mismo que "à" . Por defecto, la comparación de cadenas de 4D no diferencia entre mayúsculas y minúsculas. Puede combinarse con: sk char codes O sk diacritic insensitive sk whole word (comando [Position](position.md) únicamente) Esta constante implica el uso de las siguientes constantes (que también pueden combinarse para mejorar la legibilidad): sk kana insensitive sk width insensitive sk strict |
-| sk char codes | 1 | Las cadenas se comparan según los códigos de caracteres. Los parámetros actuales del lenguaje de datos no se tienen en cuenta durante la comparación. Se puede combinar con: sk case insensitive Sólo para los rangos "a-z" o "A-Z". (e.g., Alpha = alpha, pero Alpha # âlphà) |
-| sk diacritic insensitive | 4 | Las cadenas se comparan según el lenguaje actual de los datos sin embargo los acentos o símbolos de las letras se ignoran. Por ejemplo, "a" se considera lo mismo que "à". Puede combinarse con: sk case insensitive sk whole word (comando [Position](position.md) únicamente) Esta constante implica el uso de las siguientes constantes (que también pueden combinarse para mejorar la legibilidad): sk kana insensitive sk width insensitive sk strict |
-| sk kana insensitive | 8 | Para el idioma japonés. Controla la distinción entre sílabas Hiragana y Katakana. Desde el punto de vista semántico, la diferencia entre el hiragana y el katakana suele ser significativa, pero para capturar el mayor número posible de resultados, el modo por defecto en 4D es ignorar la diferencia (kana insensible). Por ejemplo, "あ" se considera igual que "ア". La opción sk strict realiza una comparación sensible al kana. sk kana insensitive puede utilizarse para relajar parcialmente la regla para que sea insensible al kana. **Nota:** el idioma de los datos debe ser el japonés para utilizar esta opción. Para todos los demás idiomas, la opción se ignora y [Compare strings](compare-strings.md) funcionará como si se especificara sk strict. En otras palabras, establecer esta opción en un contexto no japonés haría que la comparación fuera sensible al kana (el efecto contrario). Se puede combinar con: sk case insensitive sk diacritic insensitive Esta constante implica el uso de las siguientes constantes (que también pueden combinarse para mejorar la legibilidad): sk width insensitive sk strict |
-| sk strict | 0 | Las cadenas se comparan para obtener coincidencias exactas según el lenguaje de datos actual. En la mayoría de los casos, durante la comparación se tienen en cuenta las mayúsculas y minúsculas y las marcas diacríticas de las letras. Se puede combinar con: sk case insensitive sk diacritic insensitive sk kana insensitive Esta constante implica el uso de la siguiente constante (que también se puede combinar para mejorar la legibilidad): sk width insensitive |
-| sk whole word | 32 | Las cadenas se comparan según el lenguaje de datos actual. Sólo se consideran las cadenas que son palabras completas. Las cadenas que coinciden dentro de otras cadenas no se consideran. Por ejemplo, "where" no se considera cuando se encuentra dentro de "somewhere". Se puede combinar con: sk case insensitive (comando [Position](position.md) únicamente) sk diacritic insensitive (comando [Position](position.md) únicamente) |
-| sk width insensitive | 16 | Para el idioma japonés. Corresponde a la norma Unicode "East Asian Width", definida en el [Anexo #11 del estándar Unicode](http://www.unicode.org/reports/tr11/).Desde un punto de vista semántico, la diferencia entre un carácter "estrecho" y "ancho" o un carácter "ancho completo" y "medio ancho" suele ser insignificante, que es el modo por defecto en 4D.Por ejemplo, "ア" se considera lo mismo que "ア". La opción sk strict realiza una comparación sensible al ancho. **Notas:** El idioma de los datos debe ser el japonés para poder utilizar esta opción. Para todos los demás idiomas, la opción se ignora y [Compare strings](compare-strings.md) funcionará como si se especificara sk strict. En otras palabras, establecer esta opción en un contexto que no sea japonés haría que la comparación fuera sensible al ancho (el efecto contrario). Esta opción es ignorada por la función [Position](position.md). La comparación insensible al ancho de Unicode es asimétrica e imposible de localizar por posición o longitud. Se puede combinar con: sk case insensitive sk diacritic insensitive sk kana insensitive Esta constante implica el uso de la siguiente constante (que también se puede combinar para mejorar la legibilidad): sk strict |
-
-Para información sobre la definición del lenguaje de datos, ver la sección en la *Referencia de Diseño*.
-
-**Advertencia:** no puede utilizar el carácter arroba @ con **Position**. Por ejemplo, si pasa *"abc@"* en *buscar*, el comando buscará la cadena *"abc@"* y no "abc" seguido de otros caracteres.
-
-## Ejemplo 1
-
-Este ejemplo ilustra el uso de Position. Los resultados, descritos en los comentarios, se asignan a la variable *vlResult*.
-
-```4d
- vlResult:=Position("ll";"Billar") // vlResult toma el valor 3
- vlResult:=Position(vtText1;vtText2) // Posición de la primera ocurrencia de vtText1 en vtText2
- vlResult:=Position("todo";"todos los procesos dentro de un método";1) // vlResult toma el valor 1
- vlResult:=Position("todo";"todos los procesos dentro de un método";2) // vlResult toma el valor 35
- vlResult:=Position("TODO";"todos los procesos dentro de un método";1;*) // vlResult toma el valor 0
- vlResult:=Position("œ";"Bœuf";1;$largo) // vlResult =2, $largo= 1
-```
-
-## Ejemplo 2
-
-En el siguiente ejemplo, el parámetro *longEncont* permite buscar todas las ocurrencias de "aegis" en un texto, sin importar cómo está escrito:
-
-```4d
- $inicio:=1
- Repeat
- vlResult:=Position("aegis";$text;$inicio;$longEncont)
- $inicio:=$inicio+$longEncont
- Until(vlResult=0)
-```
-
-## Ejemplo 3
-
-En el siguiente ejemplo, usted quiere encontrar todas las instancias de una cadena y reemplazarla:
-
-```4d
- var $lengthFound : Integer
-
- $string:="Hello Joelle et joel!"
- $find:="joel"
- $replace:="Joël"
- $option:=sk case insensitive+sk diacritic insensitive
-
- $p:=0
- Repeat
- $p:=Position($find;$string;$p+1;$lengthFound;$option)
- If($p>0)
- $string:=Substring($string;1;$p-1)+$replace+Substring($string;$p+$lengthFound)
- End if
- Until($p<=0) //result: $string -> Hello Joëlle and Joël!
-```
-
-## Ver también
-
-[Compare strings](compare-strings.md)
-[Substring](substring.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 15 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/remove-picture-from-library.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/remove-picture-from-library.md
deleted file mode 100644
index 08fcfc2401dd5f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/remove-picture-from-library.md
+++ /dev/null
@@ -1,67 +0,0 @@
----
-id: remove-picture-from-library
-title: REMOVE PICTURE FROM LIBRARY
-slug: /commands/remove-picture-from-library
-displayed_sidebar: docs
----
-
-**REMOVE PICTURE FROM LIBRARY** ( refImag | nomImag )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| refImag | nomImag | Entero largo, Cadena | → | Número de referencia o nombre de una imagen de la librería de imágenes |
-
-
-
-## Descripción
-
-:::warning
-
-Este comando no puede utilizarse en proyectos porque la librería de imágenes sólo está disponible en bases de datos binarias.
-
-:::
-
-El comando REMOVE PICTURE FROM LIBRARY elimina de la librería de imágenes la imagen cuyo número de referencia se pasa en *refImag* o cuyo nombre se pasa en *nomImag*.
-
-Si el número de referencia o nombre no corresponden a ninguna imagen, el comando no hace nada.
-
-**4D Server:** REMOVE PICTURE FROM LIBRARY no puede utilizarse desde un método ejecutado en el equipo servidor (procedimiento almacenado o trigger). Si llama REMOVE PICTURE FROM LIBRARY en un equipo servidor, no pasa nada, se ignora la llamada.
-
-**Advertencia:** los objetos de diseño (elementos de lista jerárquica, líneas de menú, etc.) pueden hacer referencia a una imagen de la librería. Sea prudente cuando elimine por programación una imagen de la librería de imágenes.
-
-## Ejemplo 1
-
-El siguiente ejemplo borra la imagen #4444 de la librería de imágenes.
-
-```4d
- REMOVE PICTURE FROM LIBRARY(4444)
-```
-
-## Ejemplo 2
-
-El siguiente ejemplo borra de la librería de imágenes toda imagen cuyo nombre comience por el símbolo dólar (*$*):
-
-```4d
- PICTURE LIBRARY LIST($alRefImag;$asNomImag)
- For($vlImag;1;Size of array($alRefImag))
- If($asNomImag{$vlImag}="$@")
- REMOVE PICTURE FROM LIBRARY($alRefImag{$vlImag})
- End if
- End for
-```
-
-## Ver también
-
-[GET PICTURE FROM LIBRARY](get-picture-from-library.md)
-[PICTURE LIBRARY LIST](picture-library-list.md)
-[SET PICTURE TO LIBRARY](set-picture-to-library.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 567 |
-| Hilo seguro | ✗ |
-| Prohibido en el servidor ||
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/replace-string.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/replace-string.md
deleted file mode 100644
index 90773e53521265..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/replace-string.md
+++ /dev/null
@@ -1,83 +0,0 @@
----
-id: replace-string
-title: Replace string
-slug: /commands/replace-string
-displayed_sidebar: docs
----
-
-**Replace string** ( *fuente* ; *obsoleta* ; *nueva* {; *reemplazos*}{; *} ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| fuente | Text | → | Cadena original |
-| obsoleta | Text | → | Caracteres a reemplazar |
-| nueva | Text | → | Cadena de reemplazo (si la cadena está vacía, se borran todas las ocurrencias) |
-| reemplazos | Integer | → | Número de reemplazos a efectuar Si se omite, se reemplazan todas las ocurrencias |
-| * | Operador | → | Si se pasa: evaluación basada en los códigos de los caracteres |
-| Resultado | Text | ← | Cadena resultante |
-
-
-
-## Descripción
-
-Replace string devuelve una cadena de caracteres resultante de reemplazar *obsoleto* por *nuevo* en *fuente*.
-
-Si *nuevo* es una cadena vacía (""), Replace string borra cada ocurrencia de *obsoleto* en *fuente*.
-
-Si se especifica *reemplazos*, Replace string sólo reemplazará el número de ocurrencias especificado de *obsoleto*, a partir del primer carácter de *fuente*. Si no se especifica *reemplazos*, se reemplazan todas las ocurrencias de *obsoleto*.
-
-Si *reemplazos* es una cadena vacía, Replace string devuelve *fuente* intacto.
-
-Por defecto, el comando no tiene en cuenta si los caracteres están en mayúsculas o minúsculas o si están o no acentuados (a=A, a=à, etc.). Si pasa un asterisco *\** como último parámetro, indica que la evaluación de los caracteres debe ser diacrítica, en otras palabras, debe tener en cuenta las mayúsculas, minúsculas y caracteres acentuados (a#A, a#à...).
-
-Por defecto, el comando hace comparaciones globales teniendo en cuenta particularidades lingüísticas y de las letras que pueden escribirse con uno o más caracteres (por ejemplo æ = ae). Por otra parte, no es diacrítico (a=A, a=à, etc.) y no tiene en cuenta los caracteres "ignorables" tales como los caracteres cuyo código es < 9 (especificación Unicode).
-
-Para modificar este funcionamiento, pase como último parámetro *\**. En este caso, las comparaciones estarán basadas en códigos de caracteres. Debe pasar el parámetro *\**:
-
-* Si quiere reemplazar los caracteres especiales, utilizados por ejemplo como delimitadores (Char(1)...),
-* Si el reemplazo de caracteres debe tener en cuenta las mayúsculas, minúsculas y los caracteres acentuados (a#A, a#à, etc.).
-Note que en este modo, la evaluación no maneja variaciones de escritura de las palabras.
-
-**Nota:** en 4D v15 R3 y superior, se hizo una optimización significativa al algoritmo utilizado por este comando cuando se reemplaza una cadena por otra de diferente longitud, independientemente de la sintaxis utilizada. Esto da como resultado una aceleración considerable del procesamiento en este contexto.
-
-## Ejemplo 1
-
-El siguiente ejemplo ilustra el uso de Replace string. Los resultados, descritos en los comentarios, son asignados a la variable *vtResult*.
-
-```4d
- vtResult:=Replace string("Ventanilla";"illa";"d") // vtResult es igual a "Ventana"
- vtResult:=Replace string("Ventanilla";"ill";"") // vtResultes igual a "Ventana"
- vtResult:=Replace string(vtOtraVar;Char(Tab);",";*) // Reemplazar todas las tabulaciones en vtOtraVar por comas
-```
-
-## Ejemplo 2
-
-El siguiente ejemplo elimina los retornos de carro y las tabulaciones del texto en la variable *vtResult*:
-
-```4d
- vtResult:=Replace string(Replace string(vtResult;Char(Carriage return);"";*);Char(Tab);"")
-```
-
-## Ejemplo 3
-
-El siguiente ejemplo ilustra el uso del parámetro \* en el caso de una evaluación diacrítica:
-
-```4d
- vtResult:=Replace string("Crème brûlée";"Brulee";"caramel") //vtResult es igual a "Crème caramel"
- vtResult:=Replace string("Crème brûlée";"Brulee";"caramel";*) //vtResult es igual a "Crème brûlée"
-```
-
-## Ver también
-
-[Change string](change-string.md)
-[Delete string](delete-string.md)
-[Insert string](insert-string.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 233 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/request.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/request.md
deleted file mode 100644
index 0d2da9fe8892c8..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/request.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-id: request
-title: Request
-slug: /commands/request
-displayed_sidebar: docs
----
-
-**Request** ( *mensaje* {; *respuestaDefecto* {; *titulobotonOK* {; *titulobotoncancel*}}} ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| mensaje | Text | → | Mensaje a mostrar en la caja de diálogo |
-| respuestaDefecto | Text | → | Valor por defecto en el área de entrada de texto |
-| titulobotonOK | Text | → | Título del botón Aceptar |
-| titulobotoncancel | Text | → | Título del botón Cancelar |
-| Resultado | Text | ← | Valor introducido por el usuario |
-
-
-
-## Descripción
-
-El comando **Request** muestra una caja de diálogo compuesta de un mensaje, un área de entrada de texto, un botón **OK** y un botón **Cancelar**.
-
-El mensaje a mostrar se pasa en el parámetro *mensaje*. Si el mensaje no se ajusta al área de mensaje (por lo general alrededor de 50 caracteres, varía dependiendo del sistema y de la fuente utilizada), puede aparecer truncado.
-
-Por defecto, título del botón **OK** es “Aceptar” y el del botón **Cancelar** es “Cancelar.” Para cambiar los títulos de estos botones, pase los nuevos títulos en los parámetros opcionales *titulobotonOK* y *titulobotoncancel*. Si es necesario, el ancho de los botones se redimensiona hacia la izquierda, de acuerdo al ancho de los títulos personalizados que usted pase.
-
-El botón **OK** es el botón por defecto. Si el usuario hace clic en el botón **OK** o presiona **Intro** para aceptar la caja de diálogo, la variable sistema **OK** toma el valor 1\. Si el usuario hace clic en el botón **Cancelar** para cancelar la caja de diálogo, la variable sistema OK toma el valor 0.
-
-El usuario puede introducir texto en el área de entrada de texto. Para especificar un valor por defecto, pase el texto por defecto en el parámetro *respuestaDefecto*. Si el usuario hace clic en el botón **OK**, **Request** devuelve el texto. Si el usuario hace clic en **Cancelar**, **Request** devuelve una cadena vacía (""). Si la respuesta debe ser un valor numérico o una fecha, convierta la cadena devuelta por **Request** al tipo deseado con la ayuda de las funciones [Num](num.md) or [Date](../commands/date).
-
-**Nota:** no llame el comando **Request** desde un método de formulario o de objeto que maneje los eventos de formulario On Activate o On Deactivate; esto provocará un bucle infinito.
-
-**Consejo:** si necesita obtener varias piezas de información del usuario, diseñe un formulario y preséntelo con [DIALOG](../commands/dialog.md), en lugar de presentar una sucesión de cajas de diálogo de tipo **Request**.
-
-## Ejemplo 1
-
-La línea:
-
-```4d
- $vsPrompt:=Request("Por favor introduzca su nombre:")
-```
-
-Mostrará la siguiente caja de diálogo (en Windows):
-
-
-
-## Ejemplo 2
-
-La línea:
-
-```4d
- vsPrompt:=Request("Name of the Employee:";"";"Create Record";"Cancel")
- If(OK=1)
- ADD RECORD([Employees])
- //Nota: vsPrompt luego es copiado en el campo [Employees]Last name
- //durante el evento On Load en el método de formulario
- End if
-```
-
-Mostrará la siguiente caja de diálogo (en Windows):
-
-
-
-## Ejemplo 3
-
-La línea:
-
-```4d
- $vdPrompt:=Date(Request("Introduzca la nueva fecha:";String(Current date)))
-```
-
-Mostrará la siguiente caja de diálogo (en Windows):
-
-
-
-## Ver también
-
-[ALERT](alert.md)
-[CONFIRM](confirm.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 163 |
-| Hilo seguro | ✓ |
-| Modifica variables | OK |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/set-database-parameter.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/set-database-parameter.md
deleted file mode 100644
index 90f91fef5be0e4..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/set-database-parameter.md
+++ /dev/null
@@ -1,1049 +0,0 @@
----
-id: set-database-parameter
-title: SET DATABASE PARAMETER
-slug: /commands/set-database-parameter
-displayed_sidebar: docs
----
-
-**SET DATABASE PARAMETER** ( {*tabla* ;} *selector* ; *valor* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| tabla | Table | → | Tabla para la cual definir el parámetro o Tabla por defecto si se omite este parámetro |
-| selector | Integer | → | Código del parámetro de la base a modificar |
-| valor | Real, Text | → | Valor del parámetro |
-
-
-
-#### Descripción
-
-El comando **SET DATABASE PARAMETER** permite modificar varios parámetros internos de la base de datos 4D.
-
-El *selector* designa el parámetro a modificar. 4D ofrece constantes predefinidas, las cuales se ubican en el tema *Parámetros de la base*. La siguiente tabla lista cada constante, describe su alcance e indica si los cambios realizados se conservan entre dos sesiones:
-
-### 4D Server timeout (13)
-
-**Alcance**: aplicación 4D si *valor* positivo
-
-Se conserva entre dos **sesiones**: sí si *valor* positivo
-
-**Valores posibles**: 0 -> 32 767
-
-**Descripción**: valor del tiempo de espera antes de desconexión (timeout) de 4D Server a los equipos clientes. Por defecto, este valor se define en la página "Cliente-Servidor/Configuración" de la caja de diálogo Preferencias en el equipo servidor.
-
-El timeout del servidor define el periodo máximo de no respuesta del cliente "autorizado", por ejemplo si realiza una operación de bloqueo. Al terminar esta periodo, 4D Server desconecta al cliente. El selector 4D Server Timeout le permite asignar en el parámetro *valor*un nuevo timeout, expresado en minutos. Esta funcionalidad es particularmente útil para aumentar el valor del timeout antes de la ejecución en el equipo cliente de una operación de larga duración, tal como la impresión de un gran número de páginas, la cual puede causar un timeout inesperado.
-
-
-
-Tiene dos opciones:
-
-Si pasa un valor **positivo** en el parámetro *valor*, define un timeout global y permanente: el nuevo valor se aplica a todos los procesos y se almacena en las Preferencias de la aplicación 4D (equivalente a cambiar en el diálogo Preferencias).Si pasa un valor **negativo** en el parámetro *valor*, define un timeout lobal y temporal: el nuevo valor se aplica únicamente a los procesos llamantes (los otros procesos conservan los valores por defecto) y se restaura al valor por defecto tan pronto como el servidor recibe una señal de actividad del cliente, por ejemplo, cuando la operación termina. Esta opción es muy útil para administrar operaciones largas iniciadas por plug-ins 4D. Para definir una conexión "Sin timeout", pase 0 en *valor*. Ver el ejemplo 1.
-
-
-
-### 4D Remote mode timeout (14)
-
-**Alcance** (antigua capa de red únicamente): aplicación 4D si valor positivo
-
-**Se conserva entre dos sesiones**: sí si *valor* positivo
-
-**Descripción**: a utilizar en casos muy específicos. Valor del timeout otorgado por el equipo 4D remoto a la máquina 4D Server. Por defecto, este valor se define en la página "Cliente-Servidor/Configuración" de la caja de diálogo de Preferencias en el equipo remoto.
-
-El selector Timeout 4D mode distant no se tiene en cuenta si utiliza la antigua capa de red. Con la capa 4D *ServerNet* activada, se ignora: esta configuración es administrada por el selector Timeout 4D Server (13).
-
-
-
-### Port ID (15)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: no
-
-**Descripción**: Command SET DATABASE Número de puerto TCP utilizado por el servidor web 4D con 4D en modo local y 4D Server. Por defecto, el valor es 80.
-
-El número de puerto TCP está definido en la página "Web/Configuración" de la caja de diálogo de las Propiedades de la base. Puede utilizar las constantes del tema para el parámetro *valor*.
-
-El selector Port ID se utiliza en el marco de servidores web 4D compilados y fusionados con 4D Desktop (sin acceso al modo Diseño). Para mayor información sobre el número de puerto TCP, consulte la sección *Parámetros del servidor web*
-
-
-
-
-
-### Character set (17)
-
-**Alcance:** 4D local, 4D Server**
-
-Se conserva entre dos sesiones:** sí**
-
-Descripción:** constante obsoleta (se conserva por compatibilidad únicamente). Ahora recomendamos utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-
-
-### Max concurrent Web processes (18)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: sí
-
-**Valores**: todo valor entre 10 y 32 000\. El valor por defecto es 100.
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### Client port ID (22)
-
-**Alcance**: todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: ver selector 15
-
-**Descripción**: permite especificar este parámetro para todos los equipos 4D remotos utilizados como servidores web. Los valores definidos utilizando estos selectores se aplican a todos los equipos remotos utilizados como servidores web. Si quiere definir valores sólo para ciertos equipos remotos, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-### Client character set (24)
-
-**Alcance**: todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: ver selector 17
-
-**Descripción**: permite especificar este parámetro para todos los equipos 4D remotos utilizados como servidores web. Los valores definidos utilizando estos selectores se aplican a todos los equipos remotos utilizados como servidores web. Si quiere definir los valores sólo para algunos equipos remotos, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-### Client max concurrent Web proc (25)
-
-**Alcance**: todos los equipos 4D remotos
-
-Se conserva entre dos **sesiones**: sí
-
-Valores posibles: ver selector 18
-
-**Descripción**: permite especificar esta parámetro para las máquinas 4D remotas utilizadas como servidores web. Los valores definidos utilizando estos selectores se aplican a todos los equipos remotos utilizados como servidores web. Si quiere definir este valor sólo para ciertos equipos remotos, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-
-
-### Maximum Web requests size (27)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: sí
-
-**Valores posibles**: 500 000 a 2 147 483 648.
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### 4D Server log recording (28)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D Server, 4D remoto*
-
-* Se conserva entre dos **sesiones**: no
-
- **Valores** **posibles**: 0 ó de 1 a X (0 = no grabar, 1 a X = número secuencial, añadido al nombre del archivo).
-
-**Descripción**: inicia o detiene la grabación de las peticiones estándar recibidas por 4D Server (excluyendo las peticiones web). Por defecto, el valor es 0 (no se graban las peticiones).
-
-4D Server le permite grabar cada petición recibida por el equipo servidor en un archivo de historial. Cuando este mecanismo está activo, el archivo de historial se crea junto al archivo de estructura de la base. Su nombre es "4DRequestsLog\_X," donde X es el número secuencial del historial. Una vez el archivo alcanza un tamaño de 10 MB, se cierra y se genera un nuevo archivo, con un número secuencial incrementado. Si existe un archivo con el mismo nombre, se reemplaza directamente. Puede definir el número de inicio de la secuencia utilizando el parámetro *valor*.
-
-Este archivo texto almacena en formato tabulado simple diferente información sobre cada petición: hora, número de proceso, usuario, tamaño de la petición, duración del proceso, etc. Esta información puede ser útil particularmente durante la fase de afinamiento de la aplicación o con fines estadísticos. Por ejemplo puede importarse, en un software de hoja de cálculo para procesarse.
-
-
-
-### Client Web log recording (30)
-
-**Alcance**: todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: 0 = No grabar (por defecto), 1 = Registrar en formato CLF, 2 = Registrar en formato DLF, 3 = Registrar en formato ELF, 4 = Registrar en formato WLF.
-
-**Descripción**: inicia o detiene la grabación de las peticiones web recibidas por los servidores web de todos los equipos cliente. Por defecto, el valor es 0 (no se graban las peticiones).
-
-El funcionamiento de este selector es idéntico al del selector 29; sin embargo, aplica a todos los equipos 4D remotos utilizados como servidores web. El archivo "logweb.txt", en este caso, automáticamente ubicado en la subcarpeta Logs de la base 4D remota (carpeta de caché). Si quiere definir los valores únicamente para ciertos equipos cliente, utilice la caja de diálogo de Preferencias de 4D en modo remoto.
-
-
-
-### Table sequence number (31)
-
-**Alcance**: *a*plicación 4D
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: todo valor de tipo entero largo.
-
-**Descripción**: este selector se utiliza para modificar o modificar u obtener el número único actual de los registros de la tabla pasada en parámetro. "Número actual" significa "último número utilizado": si modifica este valor utilizando SET DATABASE PARAMETER, el siguiente registro será el valor pasado + 1\. Este nuevo número es el número devuelto por el comando Sequence number [](http://doc.tmp.4d.fr/Database-Parameters/4Dv11.4/ConstantTheme/4870/CMU00244.HTM) como también en todo campo de la tabla a la cual se asigna la propiedad "Autoincrementar" en el editor de estructura o vía SQL.
-
-Por defecto, este número único es definido por 4D y corresponde al orden de creación de los registros. Para información adicional, por favor consulte la documentación del comando [Sequence number](sequence-number.md "Sequence number").
-
-
-
-
-
-
-
-### Debug log recording (34)
-
-**Thread-safe** : Yes
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Descripción**: inicia o detiene la grabación secuencial de los eventos a nivel de programación de 4D en el archivo 4DDebugLog, que se ubica automáticamente en la subcarpeta Logs de la base de datos, junto al archivo de estructura. Un nuevo formato texto tabulado, más compacto se utiliza en el archivo de registro de eventos "4DDebugLog \[\_n\].txt" a partir de 4D v14 (donde \_n es el número de segmento del archivo).
-
-**Valores posibles**: Entero largo contiene un campo de bits: valor = bit1(1)+bit2(2)+bit3(4)+bit4(8)+…).
-
-- Bit 0 (valor 1) permite activar el archivo (note que cualquier otro valor no nulo también lo activará)
-
-- Bit 1 (valor 2) permite solicitar los parámetros de llamada a los métodos y comandos.
-
-- Bit 2 (valor 4) permite activar el nuevo formato tabulado.
-
-- Bit 3 (valor 8) permite desactivar la escritura inmediata de cada operación en el disco (activado por defecto). La escritura inmediata es menor rápida y más eficaz por ejemplo para buscar las causas de un fallo.Si desactiva este modo, el contenido del archivo será generado más rápidamente.
-
-- Bit 4 (valor 16) desactiva el registro de llamadas de plug-ins (activado por defecto).
-
-- Bit 5 (valor 32) desactiva el registro de las funciones miembros.
-
-Ejemplos:
-
-SET DATABASE PARAMETER (34;1) // activa el modo estándar sin los parámetros, con las duraciones
-
-SET DATABASE PARAMETER (34;2) // activa el modo estándar con los parámetros y las duraciones
-
-SET DATABASE PARAMETER (34;2+4) // activa el modo tabulado con los parámetros y las duraciones
-
-SET DATABASE PARAMETER (34;0) // desactiva el archivo Para todo tipo de aplicación 4D interpretada o compilada (4D todos los modos, 4D Server, 4D Volume Desktop), puede evitar que un archivo registre demasiada información:
-
-- restringiendo los comandos 4D que se examinan utilizando Log command list (selector 80), o
-
-- restringiéndolo sólo al proceso actual con Current process debug log recording (selector 111). Esto añadirá la letra "p" y el número de proceso al nombre del archivo: *4DDebugLog\[\_pn\_n\].txt* o *4DDebugLogServer\[\_pn\_n\].txt*
-
-Para más información sobre este formato y sobre el uso del archivo *4DDebugLog*, consulte la sección *Descripción de archivos de historial*. **Nota:** este selector se ofrece únicamente con fines de depuración y debe utilizarse con cuidado, ya que puede afectar al rendimiento de la aplicación.
-
-
-
-### Client Server port ID (35)
-
-**Alcance**: base de datos
-
-Se conserva entre dos **sesiones**: sí**
-
-Valores posibles**: 0 a 65535
-
-**Descripción**: número de puerto TCP donde el servidor 4D publica la base de datos (para conexión remota 4D). Por defecto, el valor es 19813\.
-
-La personalización de este valor permite utilizar varias aplicaciones 4D cliente-servidor en la misma máquina con el protocolo TCP; en este caso, debe indicar un número de puerto diferente para cada aplicación.
-
-El valor se guarda en el archivo de estructura de la base. Puede definirse con 4D en modo local pero sólo se tiene en cuenta en configuración cliente servidor.
-
-Cuando modifica este valor, es necesario reiniciar el equipo servidor para que el nuevo valor sea tenido en cuenta.
-
-
-
-### HTTPS Port ID (39)
-
-**Alcance**: 4D local, 4D Server
-
-Se conserva entre dos **sesiones**: sí
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### Client HTTPS port ID (40)
-
-**Alcance**:todos los equipos 4D remotos
-
- Se conserva entre dos **sesiones**: sí
-
- **Valores posibles**: 0 a 65535
-
-**Descripción**: número de puerto TCP utilizado por los servidores web de los equipos clientes para conexiones seguras vía SSL (protocolo HTTPS). Por defecto, el valor es 443 (valor estándar).
-
-Este selector puede utilizarse para modificar por programación el puerto TCP utilizado por los servidores web de los equipos clientes para las conexiones seguras vía SSL (protocolo HTTPS). Por defecto, el valor es 443 (valor estándar).
-
-Este selector funciona exactamente igual que el selector 39; sin embargo, aplica a todos los equipos 4D remotos utilizados como servidores web. Si quiere modificar el valor de ciertos equipos clientes únicamente, utilice la caja de diálogo de Preferencias de 4D remoto.
-
-
-
-
-
-### SQL Autocommit (43)
-
-**Alcance**:base de datos
-
- Se conserva entre dos **sesiones**: sí
-
- **Posibles valores**: 0 (desactivación) o 1 (activación)
-
-**Descripción**: activación o desactivación del modo SQL auto-commit. Por defecto, el valor es 0 (modo desactivado)
-
- El modo auto-commit permite reforzar la integridad referencial de la base. Cuando este modo está activo, las peticiones *SELECT*, INSERT, UPDATE y *DELETE* (SIUD) se incluyen automáticamente en las transacciones cuando no se han ejecutado dentro de una transacción. Este modo igualmente puede definirse en las Preferencias de la base.
-
-
-
-### SQL Engine case sensitivity (44)
-
-**Alcance**:base de datos
-
- Se conserva entre dos sesiones: sí
-
- **Valores posibles**: 0 (no se tienen en cuenta las mayúsculas y minúsculas) ó 1 (sensible a las mayúsculas y minúsculas)
-
-**Descripción**: activación o desactivación de la sensibilidad a mayúsculas y minúsculas para comparaciones de cadenas efectuadas por el motor SQL.
-
-Por defecto, el valor es 1 (sensible a las mayúsculas y minúsculas): el motor SQL diferencia entre mayúsculas y minúsculas y entre caracteres acentuados al comparar cadenas (ordenaciones y búsquedas). Por ejemplo “ABC”= “ABC” pero “ABC” # “Abc.” En algunos casos, por ejemplo para alinear el funcionamiento del motor SQL con el del motor 4D, podría querer que las comparaciones de cadenas no tengan en cuenta las mayúsculas y minúsculas (“ABC”=“Abc”).
-
-Esta opción también puede definirse en la [CALL SUBFORM CONTAINER](call-subform-container.md) de las Preferencias de la base.
-
-
-
-### Client log recording (45)
-
-**Alcance**:equipo 4D remoto
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 ó de 1 a X (0 = no grabar, 1 a X = número secuencial, asociado al nombre del archivo).
-
-**Descripción**: inicia o detiene la grabación de peticiones estándar efectuadas por el equipo cliente 4D que ejecutó el comando (excluyendo las peticiones web). Por defecto, el valor es 0 (no se graban las peticiones).
-
-4D le permite registrar el historial de peticiones realizadas por el equipo cliente. Cuando este mecanismo se activa, se crean dos archivos en el equipo cliente, en la subcarpeta Logs de la carpeta local de la base. Son llamados 4DRequestsLog\_X y 4DRequestsLog\_ProcessInfo\_X, donde X es el número secuencial del historial. Una vez el archivo 4DRequestsLog alcanza un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se reemplaza directamente. Puede definir el número de inicio para la secuencia utilizando el parámetro *valor*.
-
-Estos archivos texto almacenan en formato tabulado simple diferente información relacionada con cada petición: hora, número de proceso, tamaño de la petición, duración del proceso, etc. Esta información es particularmente útil durante la fase de desarrollo de la aplicación o con fines estadísticos.
-
-
-
-### Query by formula on server (46)
-
-**Alcance**: tabla y procesos actuales
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 (utilizar la configuración de la base), 1 (ejecutar en cliente) o 2 (ejecutar en servidor)
-
-**Descripción**: ubicación de la ejecución de los comandos [QUERY BY FORMULA](query-by-formula.md "QUERY BY FORMULA") y [QUERY SELECTION BY FORMULA](query-selection-by-formula.md "QUERY SELECTION BY FORMULA") para la *tabla* pasada en parámetro.
-
-Cuando se utiliza una base en modo cliente-servidor, los comandos de búsqueda "por fórmula" pueden ejecutarse en el servidor o en el equipo cliente:
-
-en bases creadas con 4D v11 SQL, estos comandos se ejecutan en el servidor.en bases convertidas, estos comandos se ejecutan en el equipo cliente, como en las versiones anteriores de 4D.en las bases convertidas, una preferencia específica permite modificar globalmente la ubicación de ejecución de estos comandos.Esta diferencia en ubicación de ejecución influye no sólo en el rendimiento de la aplicación (la ejecución en el servidor es generalmente más rápida) sino también en la programación. En efecto, el valor de los componentes de la fórmula (en particular las variables llamadas vía un método) varía de acuerdo al contexto de ejecución. Puede utilizar este selector para adaptar puntualmente el funcionamiento de su aplicación.
-
-Si pasa 0 en el parámetro *valor*, la ubicación de ejecución de los comandos de búsqueda "por fórmula" dependerá de la configuración de la base: en bases creadas con 4D v11 SQL, estos comandos se ejecutarán en el servidor. En bases convertidas, se ejecutarán en el equipo cliente o en el servidor en función de las preferencias de la base. Pase 1 ó 2 en *valor* para "forzar" la ejecución de estos comandos respectivamente en el equipo cliente o en el servidor. Consulte el ejemplo 2.
-
- si quiere activar las uniones "tipo SQL" (consulte el selector QUERY BY FORMULA Joins selector), siempre debe ejecutar las fórmulas en el servidor de manera que tengan acceso a los registros. Atención, en este contexto, la fórmula no debe contener llamadas a un método, de lo contrario pasará automáticamente al equipo remoto.
-
-
-
-### Order by formula on server (47)
-
-**Alcance**: tabla y procesos actuales
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 (utilizar la configuración de la base), 1 (ejecutar en el cliente) o 2 (ejecutar en el servidor)
-
-**Descripción**: ubicación de la ejecución del comando [ORDER BY FORMULA](order-by-formula.md "ORDER BY FORMULA") para la tabla pasada en parámetro.
-
-Al utilizar una base en modo cliente-servidor, el comando [ORDER BY FORMULA](order-by-formula.md "ORDER BY FORMULA") puede ejecutarse bien sea en el equipo servidor o en el cliente. Este selector puede utilizarse para especificar la ubicación de la ejecución de este comando (servidor o cliente). Este modo también puede definirse en las preferencias de la base. Para mayor información, consulte la descripción del selector 46, Query By Formula On Server.
-
-
-
- si quiere activar las uniones "tipo SQL" (consulte el selector QUERY BY FORMULA Joins selector), siempre debe ejecutar las fórmulas en el servidor de manera que tengan acceso a los registros. Atención, en este contexto, la fórmula no debe contener llamadas a un método, de lo contrario pasará automáticamente al equipo remoto.
-
-
-
-### Auto synchro resources folder (48)
-
-**Alcance**:equipo 4D remoto
-
- Se conserva entre dos **sesiones**: no
-
- **Valores p** **osibles**: 0 (sin sincronización), 1 (auto sincronización) ó 2 (preguntar).
-
-**Descripción**: modo de sincronización dinámico de la carpeta *Resources* del equipo cliente 4D que ejecuta el comando con el servidor.
-
-Cuando el contenido de la carpeta *Resources* en el servidor se ha modificado o un usuario ha solicitado la sincronización (por ejemplo vía el explorador de recursos o siguiendo la ejecución del comando [NOTIFY RESOURCES FOLDER MODIFICATION](notify-resources-folder-modification.md "NOTIFY RESOURCES FOLDER MODIFICATION")), el servidor notifica a los equipos cliente conectados.
-
-Tres modos de sincronización son posibles del lado del cliente. El selector Auto Synchro Resources Folder se utiliza para especificar el modo a utilizar por el equipo cliente para la sesión actual:
-
-0 (valor por defecto): sin sincronización dinámica (la petición de sincronización se ignora) 1: sincronización dinámica automática2: visualización de una caja de diálogo en los equipos clientes, con la posibilidad de efectuar o rechazar la sincronización.El modo de sincronización también puede definirse globalmente en las Preferencias de la aplicación.
-
-
-
-### Query by formula joins (49)
-
-**Alcance**:Proceso actual
-
- Se conserva entre dos **sesiones**: no
-
- **Valores posibles**: 0 (utilizar configuración de la base), 1 (siempre utilizar relaciones automáticas) o 2 (utilizar las uniones SQL si es posible).
-
-**Descripción**: modo de funcionamiento de los comandos [QUERY BY FORMULA](query-by-formula.md "QUERY BY FORMULA") y [QUERY SELECTION BY FORMULA](query-selection-by-formula.md "QUERY SELECTION BY FORMULA") relativos al uso de "uniones SQL."
-
-En las bases de datos creadas a partir de la versión 11.2 de 4D v11 SQL, estos comandos efectúan uniones basados en el modelo de uniones SQL. Este mecanismo permite modificar la selección de una tabla en función de una búsqueda efectuada en otra tabla sin que las tablas estén conectadas por una relación automática (condición necesaria en las versiones anteriores de 4D).
-
-El selector QUERY BY FORMULA Joins permite definir el modo de funcionamiento de los comandos de búsqueda por fórmula para el proceso actual:
-
-0: Utilizar los parámetros actuales de la base (valor por defecto). En bases creadas a partir de la versión 11.2 de 4D v11 SQL, las "uniones SQL" siempre se activan para las búsquedas por fórmula. En bases de datos convertidas, este mecanismo no se activa por defecto por razones de compatibilidad pero puede implementarse vía una preferencia.1: Siempre utilizar relaciones automáticas (= funcionamiento de versiones anteriores de 4D). En este modo, una relación es necesaria para definir la selección de una tabla en función de búsquedas efectuadas en otra tabla. 4D no efectúa más "uniones SQL."2: Utilizar las uniones SQL si es posible (= funcionamiento o defecto de las bases creadas en versión 11.2 y superiores de 4D v11 SQL). En este modo, 4D establece "uniones SQL" para las búsquedas por fórmula cuando la fórmula se ajusta para ello (con dos excepciones, ver la descripción del comando [QUERY BY FORMULA](query-by-formula.md "QUERY BY FORMULA") o [QUERY SELECTION BY FORMULA](query-selection-by-formula.md "QUERY SELECTION BY FORMULA")).**Nota:** si quiere activar las uniones "tipo SQL" (consulte el selector QUERY BY FORMULA Joins selector), siempre debe ejecutar las fórmulas en el servidor de manera que tengan acceso a los registros. Atención, en este contexto, la fórmula no debe contener llamadas a un método, de lo contrario pasará automáticamente al equipo remoto.
-
-
-
-### HTTP compression level (50)
-
-**Alcance**: aplicación 4D
-
-Se conserva entre dos **sesiones**: no
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### HTTP compression threshold (51)
-
-**Alcance**: aplicación 4D
-
-Se conserva entre dos **sesiones**: no
-
-Valores posibles: todo valor de tipo entero largo
-
-**Descripción**: Constante obsoleta (se conserva por compatibilidad únicamente). Se recomienda utilizar los comandos [WEB SET OPTION](web-set-option.md) y [WEB GET OPTION](web-get-option.md) para la configuración del servidor HTTP.
-
-
-
-### Server base process stack size (53)
-
-**Alcance**: 4D Server
-
- Se conserva entre dos sesiones: no
-
- **Valores posibles**: entero largo positivo.
-
-**Descripción**: tamaño de la pila asignada a cada proceso del sistema preferente en el servidor, expresado en bytes. El tamaño por defecto es determinado por el sistema.
-
-Los procesos sistema preferente (procesos de tipo Proceso base 4D client) se cargan para controlar los procesos cliente 4D principales. El tamaño asignado por defecto a la pila de cada proceso preferente da facilidad de ejecución pero puede resultar consecuente cuando se crea un gran número de procesos (varios cientos).
-
-Por razones de optimización, este tamaño puede reducirse considerablemente si las operaciones efectuadas por la base lo permiten (por ejemplo si la base no efectúa ordenaciones de grandes cantidades de registros). Son posibles valores de 512 o incluso 256 KB. Sea cuidadoso, subdimensionar la pila es critico y puede afectar la operación de 4D Server. La definición de este parámetro debe hacerse con precaución y tener en cuenta las condiciones de uso de la base (número de registros, tipo de operaciones, etc.).
-
-Para que sea tenido en cuenta, este parámetro debe ejecutarse en el equipo servidor (por ejemplo en el *Método base On Server Startup*).
-
-
-
-
-
-### Idle connections timeout (54)
-
-**Alcance**: aplicación 4D a menos que valor sea negativo
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles:** valor entero que expresa una duración en segundos. El valor puede ser positivo (nuevas conexiones) o negativo (conexiones existentes). Por defecto, el valor es 20.
-
-**Descripción**: máximo periodo de inactividad (timeout) para conexiones al motor de la base 4D y al motor SQL, así como también en modo *ServerNet* (nueva capa de red), al servidor de la aplicación 4D. Cuando una conexión inactiva alcanza este límite, se pone en espera automáticamente, lo cual congela la sesión cliente/servidor y cierra el socket de red. En la ventana de administración del servidor, el estado del proceso del usuario se indica como "Postponed". Este funcionamiento es totalmente transparente para el usuario: tan pronto como hay una nueva actividad en la conexión que está en espera, el socket se reabre automáticamente y la sesión cliente/servidor se restaura.
-
-Este parámetro permite, por una parte, economizar los recursos en el servidor: las conexiones en espera cierran el socket y liberan un proceso en el servidor. Por otra parte, esto le permite evitar pérdida de conexiones por el cierre de sockets por parte del firewall. Por esta razón, el valor del timeout para conexiones inactivas deber ser menor que el del firewall en este caso.
-
-Si pasa un valor positivo en *valor*, se aplicará a todas las nuevas conexiones en todos los procesos. Si pasa un valor negativo, se aplicará a las conexiones que se abran en el proceso actual. Si pasa 0, las conexiones inactivas no serán sometidas a un timeout.
-
-Este parámetro puede definirse del lado del cliente. Por lo general, no necesita cambiar este valor.
-
-
-
-### PHP interpreter IP address (55)
-
-**Alcance**: Aplicación 4D
-
-Se conserva entre dos **sesiones**: no
-
-**Valores**: cadena formateada del tipo "nnn.nnn.nnn.nnn" (por ejemplo "127.0.0.1").
-
-**Descripción**: dirección IP utilizada localmente por 4D para comunicarse con el intérprete PHP vía FastCGI. Por defecto, el valor es "127.0.0.1". Esta dirección debe corresponder a la máquina donde en encuentra 4D. Este parámetro también puede definirse globalmente para todas las máquinas vía las Propiedades de la base.
-
-Para mayor información sobre el intérprete PHP, por favor consulte el manual de *Diseño*.
-
-
-
-### PHP interpreter port (56)
-
-**Alcance**:Aplicación 4D
-
- **Se conserva entre dos sesiones**: No
-
-**Valores**: valor de tipo entero largo positivo. Por defecto, el valor es 8002\.
-
-**Descripción**: número de puerto TCP utilizado o por el intérprete PHP de 4D. Este parámetro también puede modificarse globalmente para todos los equipos vía las Propiedades de la base. Para mayor información sobre el intérprete PHP, consulte el manual de *Diseño*.
-
-
-
-### SSL cipher list (64)
-
-**Alcance**: Aplicación 4D
-
-Se conserva entre dos sesiones: No
-
-**Valores posibles**: secuencia de cadenas separadas por dos puntos.
-
-**Description:** **Descripción:** lista de cifrado (*cipher list*) utilizada por 4D para el protocolo seguro. Esta lista modifica la prioridad de los algoritmos de cifrado implementados por 4D. Por ejemplo, puede pasar la siguiente cadena en el parámetro *valor*: "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128:!RSA:!DH:!RC4".
-
-Para una descripción completa de la sintaxis para la lista cifrada, consulte la *página de cifrado del sitio OpenSSL*.
-
-Esta configuración se aplica al servidor web principal (excluyendo los objetos del servidor web), al servidor SQL, a las conexiones cliente/servidor, así como al cliente HTTP y a todos los comandos 4D que hacen uso del protocolo seguro. Es temporal (no se mantiene entre sesiones).
-
-Cuando la lista de cifrado se modifica, debe reiniciar el servidor correspondiente para que los nuevos parámetros sean tenidos en cuenta.
-
-Para reinicializar la lista de cifrado a su valor por defecto (guardado permanentemente en el archivo SLI), llame al comando [SET DATABASE PARAMETER](set-database-parameter.md) y pase una cadena vacía ("") en el parámetro *valor*.
-
-**Nota:** con el comando [Get database parameter](get-database-parameter.md), la lista de cifrado se devuelve en el parámetro opcional *valorAlfa* y el parámetro de retorno es siempre 0.
-
-
-
-### Cache unload minimum size (66)
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: Entero largo positivo > 1.
-
-**Descripción**: tamaño mínimo de memoria a liberar del caché de la base de datos cuando el motor necesita hacer espacio para ubicar un objeto (valor en bytes).
-
-El propósito de este selector es reducir el número de liberaciones de datos de la caché con el fin de obtener un mejor rendimiento. Puede hacer variar este parámetro en función del tamaño de la caché y del de los bloques de datos manipulados en su base.
-
-Por defecto, si este selector no se utiliza, 4D descarga mínimo 10% de la caché en caso de que se necesite espacio.Alcance: Aplicación 4D
-
-Se conserva entre dos sesiones: No
-
-Valores posibles: Entero largo positivo > 1.
-
-Descripción: tamaño mínimo de memoria a liberar del caché de la base de datos cuando el motor necesita hacer espacio para ubicar un objeto (valor en bytes).
-
-El propósito de este selector es reducir el número de liberaciones de datos de la caché con el fin de obtener un mejor rendimiento. Puede hacer variar este parámetro en función del tamaño de la caché y del de los bloques de datos manipulados en su base.
-
-Por defecto, si este selector no se utiliza, 4D descarga mínimo 10% de la caché en caso de que se necesite espacio.
-
-
-
-### Direct2D status (69)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Descripción**: modo de activación de Direct2D bajo Windows.
-
-**Valores posibles**: una de las siguientes constantes (modo 3 por defecto):
-
-Direct2D Disabled (0): el modo Direct2D no está habilitado y la base de datos funciona en el modo anterior (GDI/GDIPlus).
-
-Direct2D Hardware (1): utilice Direct2D como contexto de hardware de gráficos para toda la aplicación 4D. Si este contexto no está disponible, use el contexto del software de gráficos Direct2D.
-
-Direct2D Software (3) (modo predeterminado): a partir de Windows 7, utilice el contexto del software de gráficos Direct2D para toda la aplicación 4D.
-
-***Advertencia* : este selector se proporciona solo para fines de depuración. Dado que varias funciones 4D se basan en Direct2D, no se debe desactivar en las aplicaciones implementadas. Solo el modo predeterminado (Direct2D Software)* **está aprobado para las aplicaciones desplegadas.*
-
-
-
-### Direct2D get active status (74)
-
-**Nota**: sólo puede utilizar este selector con el comando [Get database parameter](get-database-parameter.md "Get database parameter") y su valor no puede definirse.
-
-**Descripción**: devuelve la implementación activa de Direct2D bajo Windows.
-
-**Valores posibles**: 0, 1, 2, 3, 4 o 5 (ver los valores del selector 69). El valor devuelto depende de la disponibilidad de Direct2D, del hardware y de la calidad Direct2D soportado por el sistema operativo.
-
-Por ejemplo, si ejecuta:
-
- SET DATABASE PARAMETER(Direct2D status;Direct2D Hardware) $mode:=Get database parameter(Direct2D get active status)
-
-- En Windows 7 y superiores, $mode vale 1 cuando el sistema detecta un hardware compatible con Direct2D; de lo contrario, $mode valdrá 3 (contexto software).
-
-- En Windows Vista, $mode valdrá 1 si el sistema detecta un hardware compatible con Direct2D; de lo contrario, $mode toma el valor 0 (desactivando Direct2D).
-
-- En Windows XP, $mode siempre valdrá 0 (no compatible con Direct2D).
-
-
-
-### Diagnostic log recording (79)
-
-**Thread-safe** : Yes
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: 0 ó 1 (0 = no guardar,1 = guardar)
-
-**Descripción**: inicio o detención del registro del archivo de diagnóstico de 4D. Por defecto, el valor es 0 (no guarda).
-
-4D permite guardar de manera continua en un archivo de diagnóstico un conjunto de eventos relativos al funcionamiento interno de la aplicación. La información contenida en este archivo está destinada a la actualización de las aplicaciones 4D y puede ser analizada con ayuda de los servicios técnicos de 4D. Cuando pasa 1 en este selector, el archivo de diagnóstico, llamado *NomBase.txt*, se crea automáticamente (o abre) en la carpeta **Logs** de la base. Una vez el archivo alcance un tamaño de 10 MB, se cierra y se genera un nuevo archivo *NomBase\_N.txt*, con un número secuencial N incrementado.
-
-Note que es posible incluir la información personalizada en este archivo con ayuda del comando [LOG EVENT](log-event.md).
-
-
-
-### Log command list (80)
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: cadena que contiene la lista de números de los comandos 4D a guardar (separados por dos puntos), "all" para guardar todos los comandos o "" (cadena vacía) para no guardar ninguno.
-
-**Descripción**: la lista de comandos 4D a guardar en el archivo de depuración (ver el selector 34, Debug Log Recording). Por defecto, se guardan todos los comandos 4D.
-
-Este selector permite guardar la cantidad de información almacenada en el archivo de depuración limitando los comandos 4D donde quiera guardar la ejecución.
-
-
-
-### Spellchecker (81)
-
-**Alcance**: Aplicación 4D
-
- **Se conserva entre dos sesiones**: No
-
- **Valores posibles**: 0 (por defecto) = corrector macOS nativo (Hunspell desactivado), 1 = corrector Hunspell activo.
-
-**Descripción**: permite activar el corrector ortográfico Hunspell bajo macOS. Por defecto, en esta plataforma el corrector nativo está activo. Puede preferir utilizar el corrector Hunspell, por ejemplo, para unificar la interfaz de sus aplicaciones multiplataformas (bajo Windows, sólo el corrector Hunspell está disponible). Para mayor información, consulte *Corrección ortográfica*.
-
-
-
-### Dates inside objects (85)
-
-**Alcance**: Proceso actual
-
- **Se conserva entre dos sesiones:** No**
-
- Valores posibles**: String type without time zone (0), String type with time zone (1), Date type (2) (por defecto)
-
-**Descripción**: define la forma en que se almacenan las fechas dentro de los objetos, así como también cómo se importan / exportan en JSON.
-
-Cuando el valor del selector es Date type (valor predeterminado para las bases creadas con 4D v17 y superior), las fechas 4D se almacenan con el tipo de fecha dentro de los objetos, con respecto a la configuración de fecha local. Cuando se convierte a formato JSON, los atributos de fecha se convertirán en cadenas que no incluyen un tiempo. (**Nota:** esta configuración se puede definir mediante la opción "Utilizar tipo de fecha en lugar del formato de fecha ISO en objetos" que se encuentra en *Página Compatibilidad* de la configuración de la base).
-
-Si pasa String type with time zone en este selector, convertirá las fechas 4D en cadenas ISO y tendrá en cuenta la zona horaria local. Por ejemplo, la conversión de la fecha 23/08/2013 le da "2013-08-22T22: 00: 000Z" en formato JSON cuando la operación se realiza en Francia durante el horario de verano (GMT+ 2). Este principio se ajusta al funcionamiento estándar de JavaScript. Esto puede ser una fuente de errores cuando desea enviar valores de fecha JSON a alguien en un huso horario diferente. Por ejemplo, cuando exporta una tabla usando [Selection to JSON](selection-to-json.md) en Francia que se debe reimportar en los EE. UU. utilizando [JSON TO SELECTION](json-to-selection.md). Dado que las fechas se vuelven a interpretar en cada zona horaria, los valores almacenados en la base de datos serán diferentes. En este caso, puede modificar el modo de conversión de las fechas para que no tengan en cuenta la zona horaria pasando String type without time zone en este selector. La conversión de la fecha 23/08/2013 le dará "2013-08-23T00: 00: 00Z" en todos los casos.
-
-
-
-
-
-### Diagnostic log level (86)
-
-**Thread-safe** : Yes
-
-**Alcance**: Aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Descripción**: nivel(es) de los mensajes que se incluirán en el registro de diagnóstico cuando esté habilitado (ver selector Diagnostic log recording). Cada nivel designa una categoría de mensajes de diagnóstico e incluye automáticamente las categorías más importantes. Para una descripción de las categorías, consulte la sección *Niveles de registro de diagnóstico* en *developer.4d.com*.
-
-**Valores posibles**: una de las siguientes constantes (Log info por defecto): Log trace: activa ERROR, WARN, INFO, DEBUG, TRACE (nivel más detallado) Log debug: activa ERROR, WARN, INFO, DEBUG Log info: activa ERROR, WARN, INFO (por defecto) Log warn: activa ERROR, WARN Log error: activa ERROR (nivel menos detallado)
-
-
-
-### Use legacy network layer (87)
-
-**Alcance:** 4D en modo local, 4D Server**
-
-Se conserva entre dos sesiones:** sí**
-
-** **Descripción:** fija u obtiene el estado actual de la capa de red antigua para las conexiones cliente/servidor.
-
-La capa de red antigua es obsoleta a partir de 4D v14 R5 y debe ser reemplazada progresivamente en sus aplicaciones por la capa de red *ServerNet*. *ServerNet* será requerida en próximas versiones 4D con el fin de beneficiarse de las futuras evoluciones de la red. Por razones de compatibilidad, la capa de red antigua aún se soporta para permitir una transición sin problemas para las aplicaciones existentes; (se usa por defecto en aplicaciones convertidas de una versión anterior a v14 R5). Pase 1 en este parámetro para utilizar la capa de red antigua (y desactivar *ServerNet*) para las conexiones cliente/servidor, y pase 0 para deshabilitar la red antigua (y utilizar *ServerNet*).
-
-Esta propiedad también se puede definir mediante la opción "Usar capa de red antigua " que se encuentran en *Página Compatibilidad* de las Propiedades de la base (ver *Opciones red y cliente-servidor*). En esta sección, también puede encontrar una discusión sobre la estrategia de migración. Le recomendamos que active *ServerNet* tan pronto como sea posible.
-
-Deberá reiniciar la aplicación para que este parámetro sea tenido en cuenta. No está disponible en 4D Server v14 R5 64-bit versión para macOS, que sólo soporta el *ServetNet*; (siempre devuelve 0).
-
-**Valores posibles:** 0 o 1 (0 = no utilizan capa de red antigua, 1 = uso capa de red antigua)
-
-**Valor por defecto:** 0 en bases de datos creadas con 4D v14 R5 o superior, 1 en bases de datos convertidas de 4D v14 R4 o anteriores.
-
-
-
-### SQL Server Port ID (88)
-
-**Alcance**: 4D modo local y 4D Server.
-
-: Sí
-
-**Descripción**: permite leer o definir el número del puerto TCP utilizado por el servidor SQL integrado de 4D en modo local o 4D Server. Por defecto, el valor es 19812\. Cuando se define este selector, la configuración de la base se actualiza. También puede definir el número del puerto TCP en la página "SQL" de la caja de diálogo de Propiedades de la base.
-
-**Valores posibles:** 0 a 65535.
-
-**Valor por defecto:** 19812
-
-
-
-### Circular log limitation (90)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D local, 4D Server.
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles**: todo valor entero, 0 = conservar todos los registros
-
-**Descripción**: número máximo de archivos a conservar en rotación para cada tipo de registro. Por defecto, todos los archivos se conservan. Si pasa un valor *X*, solo los *X* archivos más recientes se conservan, el más antiguo se borra automáticamente cuando se crea uno nuevo. Esta parametrización se aplica a cada uno de los siguientes archivos de registro: registros de peticiones (selectores 28 y 45), registro de depuración (selector 34), registro de eventos (selector 79), así como el historial de peticiones web (selectores 29 y 84 del comando [WEB SET OPTION](web-set-option.md)), etc.
-
-
-
-### Number of formulas in cache (92)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles**: enteros largos positivos
-
-**Valor por defecto**: 0 (sin caché)
-
-**Descripción**: establece u obtiene el número máximo de fórmulas a conservar en la memoria caché de fórmulas, que es utilizado por el comando [EXECUTE FORMULA](execute-formula.md). Este límite se aplica a todos los procesos, pero cada proceso tiene su propia caché de fórmulas. Ubicar las fórmulas en la caché acelera la ejecución del comando [EXECUTE FORMULA](execute-formula.md) en modo compilado, ya que cada fórmula en caché se tokeniza sólo una vez en este caso.Cuando se cambia el valor de la memoria caché, el contenido existente se restablecen incluso si el nuevo tamaño es más grande que el anterior. Una vez se alcanza el número máximo de fórmulas en la memoria caché, una nueva fórmula ejecutada borrará a la más antigua de la memoria caché (modo FIFO). Este parámetro sólo se tiene en cuenta en las bases o componentes compilados.
-
-
-
-### OpenSSL version (94)
-
-**Alcance**: todas las máquinas 4D
-
-**Se conserva entre dos sesiones**: no
-
-**Descripción**: devuelve el número de versión de la librería OpenSSL que se utiliza en la máquina. (Solo lectura)
-
-
-
-### Cache flush periodicity (95)
-
-**Thread-safe** : Yes
-
-
-**Alcance**: 4D local, 4D Server
-
-**Se conserva entre dos sesiones:** no
-
-**Valores posibles:** entero largo > 1 (segundos)
-
-**Descripción**: obtiene o establece la periodicidad del vaciado de la caché, expresado en segundos. La modificación de este valor prevalece sobre la opción **Vaciar caché cada X segundos** en [XML DECODE](xml-decode.md) de la configuración de la base para la sesión (que no se almacena en las Propiedades de la base).
-
-
-
-### Remote connection sleep timeout (98)
-
-**Alcance**: aplicación 4D Server
-
-**Se mantiene entre dos sesiones**: no
-
-**Valores posibles**: entero largo positivo
-
-**Descripción**: tiempo de espera actual de la conexión remota en segundos. Por defecto, el valor es 172800 (48 horas).
-
-El tiempo de espera de la conexión remota se aplica después de que una máquina que ejecuta una aplicación remota 4D haya pasado al modo de reposo. En este caso, su sesión es mantenida por 4D Server (ver la descripción de la funcionalidad ). 4D Server verifica cada 5 minutos si algún 4D remoto en reposo ha superado el tiempo de espera de reposo, en cuyo caso se abandona. Por lo tanto, el máximo tiempo de espera permitido es *el tiempo de espera actual* \+ 300\. En algunos casos, es posible que desee modificar el tiempo de espera, por ejemplo para liberar los registros/licencias bloqueados más rápidamente.
-
-
-
-
-
-### Tips enabled (101)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: 0 = consejos desactivados, 1 = consejos activados (predeterminado)
-
-**Descripción**: define u obtiene el estado de visualización actual de los consejos para la aplicación 4D. De forma predeterminada, las sugerencias están activadas.
-
-Tenga en cuenta que este parámetro define todos los consejos 4D, es decir, los mensajes de ayuda de formulario y las sugerencias del editor de modo Diseño.
-
-
-
-### Tips delay (102)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: entero largo >= 0 (tics)
-
-**Descripción**: retraso antes de que se muestren las sugerencias una vez que el cursor del ratón se haya detenido en objetos con mensajes de ayuda adjuntos. El valor se expresa en tics (1/60 de segundo). El valor predeterminado es 45 tics (0.75 segundos).
-
-
-
-### Tips duration (103)
-
-**Alcance**: aplicación 4D
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: entero largo >= 60 (tics)
-
-**Descripción**: duración máxima de visualización de una sugerencia. El valor se expresa en tics (1/60 de segundo). El valor predeterminado es 720 tics (12 segundos).
-
-
-
-### Min TLS version (105)
-
-**Alcance**: 4D Server, 4D Web Server y 4D SQL Server
-
-**Conservar entre dos sesiones**: No
-
-**Descripción**: se utiliza para especificar el nivel TLS (Transport Layer Security), que ofrece cifrado y autenticación de datos entre aplicaciones y servidores. Se rechazarán los intentos de conexión de clientes que sólo soporten versiones inferiores a la mínima. La configuración se aplica globalmente a la capa de red. Una vez modificado, el servidor debe reiniciarse para utilizar el nuevo valor.
-
-**Valor por defecto**: TLSv1\_3
-
-**Valores posibles**: TLSv1\_2 (TLS 1.2, introducido en 2008) TLSv1\_3 (TLS 1.3, introducido en 2018) **NOTAS**:
-
-- El plugin 4D Internet Commands utiliza una capa de red diferente, por lo que este selector no tendrá ningún impacto en su versión TLS.
-
-- Se ignorarán los intentos de aplicar TLS a la capa de red heredada.
-
-
-
-
-
-
-
-### User param value (108)
-
-**Alcance**: 4D local, 4D Server
-
-**Se conserva entre dos sesiones**: no
-
-**Valores posibles**: toda cadena personalizada
-
-**Descripción:** cadena personalizada pasada de una sesión a la siguiente cuando se reinicia la aplicación 4D. Este selector es útil en el contexto de pruebas unitarias automatizadas que requieren que las aplicaciones se reinicien con diferentes parámetros.
-
-Cuando se utiliza con [SET DATABASE PARAMETER](set-database-parameter.md), define un nuevo valor que estará disponible en la próxima base de datos abierta después de que 4D se reinicie manualmente o utilizando los comandos [OPEN DATABASE](open-database.md)(\*), [OPEN DATA FILE](open-data-file.md), o [RESTART 4D](restart-4d.md). Cuando se utiliza con [Get database parameter](get-database-parameter.md), obtiene el valor del parámetro de usuario actualmente disponible, definido mediante una línea de comando (ver *Interfaz de línea de comando*), el archivo .4DLink (ver *Usar un archivo 4DLink*), o una llamada a [SET DATABASE PARAMETER](set-database-parameter.md) durante la sesión anterior. (\*) Si [SET DATABASE PARAMETER](set-database-parameter.md) define un User param value antes de una llamada a [OPEN DATABASE](open-database.md) con un archivo .4DLink que también contiene un atributo xml user-param, 4D 4D tiene en cuenta solo el parámetro ofrecido por [SET DATABASE PARAMETER](set-database-parameter.md).
-
-
-
-### Times inside objects (109)
-
-Alcance: 4D local, 4D Server (todos los procesos)
-
- Se conserva entre dos sesiones: No
-
- **Valores posibles**: Times in seconds (0) (predeterminado), Times in milliseconds (1)
-
-**Descripción**: define la forma en que los valores de tipo hora se convierten y almacenan dentro de las propiedades de los objetos y los elementos de la colección, así como la forma en que se importan/exportan en JSON y en las áreas web. Por defecto, a partir de 4D v17, las horas se convierten y almacenan en número de segundos en los objetos.
-
-En versiones anteriores, los valores de tiempo se convertían y almacenaban como cantidad de milisegundos en esos contextos. Usar este selector puede ayudarlo a migrar sus aplicaciones volviendo a la configuración anterior si es necesario.
-
-**Nota**: los métodos ORDA y el motor SQL ignoran esta configuración, siempre suponen que los valores de tiempo son números de segundos.
-
-
-
-### SMTP Log (110)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D local, 4D Server*
-
-* **Se conserva entre dos sesiones**: No
-
- **Valores posibles**: 0 o de 1 a X (0 = no grabar, 1 a X = número secuencial, agregado al nombre del archivo). De forma predeterminada, el valor es 0 (intercambios SMTP no registrados).
-
-**Descripción**: inicia o detiene la grabación de intercambios entre 4D y el servidor SMTP, cuando un objeto *transportador* se procesa a través de *transporter.send( )* o *SMTP\_transporter.checkConnection( )*. Por defecto, el valor es 0 (intercambios no registrados). Cuando este mecanismo está habilitado, se crea un archivo de registro en la carpeta Logs de la base. Se llama 4DSMTPLog\_X.txt, donde X es el número secuencial del registro. Una vez que el archivo 4DSMTPLog ha alcanzado un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se reemplaza directamente. Puede definir el número de inicio de la secuencia utilizando el parámetro *valor*. De forma predeterminada, todos los archivos se conservan, pero puede controlar la cantidad de archivos a seguir utilizando el parámetro Circular log limitation.
-
-Para obtener más información sobre los archivos 4DSMTPLog\_X.txt, consulte la sección *Descripción de archivos de historial*.
-
-
-
-### Current process debug log recording (111)
-
-**Alcance:** Aplicación 4D
-
-**Se conserva entre dos sesiones:** No
-
-**Descripción**: inicia o detiene el registro secuencial de eventos de programación **del proceso actual** en un archivo de historial separado. Este historial es similar al Debug log recording (selector 34) pero se enfoca solo en el proceso actual. El nombre del archivo de historial incluye la letra "p" y el número del proceso: 4DDebugLog\[\_p*N*_*n*].txt, donde N es el ID único del proceso. Para más información sobre este formato y sobre el uso del archivo *4DDebugLog*, consulte *Descripción de archivos de historial* en el Modo Diseño. **Notas:** Este selector se proporciona únicamente con el fin de depurar y debe utilizarse con cuidado. En particular, no debe ponerse en producción, ya que puede tener un impacto en el rendimiento de la aplicación. Puede utilizarar ambos selectores Debug log recording y Current process debug log recording simultáneamente, en cuyo caso las acciones del proceso actual no se registrarán en el archivo de historial principal.
-
-
-
-### Is current database a project (112)
-
-**Nota:** solo puede utilizar este selector con el comando [Get database parameter](get-database-parameter.md) y su valor no se puede definir.
-
-**Alcance**: aplicación 4D
-
-**Descripción**: devuelve 1 si la arquitectura de la base actual es un proyecto y 0 en caso contrario. Para más información, consulte la sección *Base proyecto vs base binaria*.
-
-
-
-### Is host database a project (113)
-
-**Nota:** solo puede utilizar este selector con el comando [Get database parameter](get-database-parameter.md) y su valor no se puede definir.
-
-**Alcance**: aplicación 4D
-
-**Descripción**: devuelve 1 si la arquitectura de la base local es un proyecto y 0 en caso contrario. Para más información, consulte la sección *Base proyecto vs base binaria*.
-
-
-
-### Libldap version (114)
-
-**Alcance**: máquina 4D actual
-
-**Se conserva entre dos sesiones**: no
-
-**Descripción**: devuelve el número de versión de la librería LDAP en la aplicación 4D en la máquina actual. (Solo lectura)
-
-
-
-### Libsasl version (115)
-
-**Alcance**: máquina 4D actual
-
-**Se conserva entre dos sesiones**: no
-
-**Descripción**: devuelve el número de versión de la librería SASL en la aplicación 4D en la máquina actual. (Solo lectura)
-
-
-
-### POP3 Log (116)
-
-**Thread-safe** : Yes
-
-**Alcance:** 4D local, 4D Server
-
-**Se conserva entre dos sesiones**: no
-
-**Valores posibles:** 0 o de 1 a X (0 = no registrar, 1 a X = número secuencial, agregado al nombre del archivo). Por defecto, el valor es 0 (intercambios POP3 no registrados).
-
-: iInicia o detiene la grabación de intercambios entre 4D y el servidor POP3, cuando un objeto transportador se procesa a través de *POP3\_transporter.getMail( )* o *POP3\_transporter.checkConnection( )*. Por defecto, el valor es 0 (intercambios no registrados). Cuando este mecanismo está habilitado, se crea un archivo de registro en la carpeta Logs de la base. Se llama 4DPOP3Log\_X.txt, donde X es el número secuencial del registro. Una vez que el archivo 4DPOP3Log ha alcanzado un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se reemplaza directamente. Puede establecer el número inicial de la secuencia utilizando el parámetro valor. De manera predeterminada, todos los archivos se mantienen, pero puede controlar la cantidad de archivos que se deben seguir utilizando el parámetro Circular log limitation.
-
-Para más información sobre los archivos 4DPOP3Log\_X.txt, consulte la sección *Descripción de archivos de historial*.
-
-
-
-### Is host database writable (117)
-
-**Nota**: solo puede utilizar este selector con el comando [Get database parameter](get-database-parameter.md) y su valor no se puede definir.
-
-**Alcance**: aplicación 4D
-
-**Descripción**: devuelve 1 si el archivo estructura/archivo proyecto local es editable y 0 si es de solo lectura.
-
-
-
-### IMAP Log (119)
-
-**Thread-safe** : Yes
-
-**Alcance**: 4D local, 4D Server
-
-**Se conserva entre dos sesiones**: No
-
-**Valores posibles**: 0 o de 1 a X (0 = no grabar, 1 a X = número secuencial, añadido al nombre del archivo). Por defecto, el valor es 0 (los intercambios IMAP no se registran).
-
-**Descripción**: inicia o detiene la grabación de los intercambios entre 4D y el servidor IMAP, cuando se procesa un objeto transportador a través de *IMAP\_transporter.getMail( )* o *IMAP\_transporter.checkConnection( )*. Por defecto, el valor es 0 (intercambios no registrados). Cuando se activa este mecanismo, se crea un archivo de registro en la carpeta Logs de la base. Se llama 4DIMAPLog\_X.txt, donde X es el número secuencial del registro. Una vez que el archivo 4DIMAPLog ha alcanzado un tamaño de 10 MB, se cierra y se genera uno nuevo, con un número secuencial incrementado. Si ya existe un archivo con el mismo nombre, se sustituye directamente. Se puede definir el número inicial de la secuencia mediante el parámetro valor. Por defecto, se conservan todos los archivos, pero puede controlar el número de archivos a conservar utilizando el parámetro Circular log limitation.
-
-Para más información sobre los archivos 4DIMAPLog\_X.txt, consulte la sección *Descripción de archivos de historial*.
-
-
-
-### Libzip version (120)
-
-**Alcance**: máquina 4D actual
-
-**Se conserva entre dos sesiones**: n/a
-
-**Descripción**: devuelve el número de versión de la librería libzip en la aplicación 4D en la máquina actual. (Sólo lectura)
-
-
-
-### Pause logging (121)
-
-**Thread-safe** : Yes
-
-**Alcance**: aplicación 4D
-
-**Se mantiene entre dos sesiones**: no
-
-**Valores posibles**: 0 (reanudar historial), 1 (pausar historial)
-
-Este selector permite suspender/reanudar todas las operaciones de registro iniciadas en la aplicación (excepto los registros ORDA). Esta función puede ser útil para aligerar temporalmente las tareas de la aplicación 4D o programar las operaciones de registro.
-
-
-
-
-
-
-**Nota**: el parámetro *tabla* sólo es utilizado por los selectores 31, 46 y 47\. En todos los demás casos, se ignora si se pasa.
-
-Si no se mantiene una configuración constante entre sesiones, pero desea asegurarse de que se aplique, debe ejecutarla en o [Método base On Server Startup](metodo-base-on-server-startup.md).
-
-#### Selectores hilo seguro
-
-El comando **SET DATABASE PARAMETER** puede utilizarse en procesos apropiativos al llamar a los siguientes selectores:
-
-* [4D Server log recording](#4d-server-log-recording-28)
-* [Debug log recording](#debug-log-recording-34)
-* [Diagnostic log recording](#diagnostic-log-recording-79)
-* [Diagnostic log level](#diagnostic-log-level-86)
-* [Circular log limitation](#circular-log-limitation-90)
-* [Cache flush periodicity](#cache-flush-periodicity-95)
-* [SMTP Log](#smtp-log-110)
-* [POP3 Log](#pop3-log-116)
-* [IMAP Log](#imap-log-119)
-* [Pause logging](#pause-logging-121)
-
-
-#### Ejemplo 1
-
-La siguiente instrucción evitará un posible problema de timeout:
-
-```4d
- //Aumento del timeout a 3 horas para el proceso actual
- SET DATABASE PARAMETER(4D Server Timeout;-60*3)
- //Ejecución de una operación larga sin control de 4D
- ...
- WR PRINT MERGE(Area;3;0)
- ...
-```
-
-#### Ejemplo 2
-
-Este ejemplo forza temporalmente la ejecución de un comando búsqueda por fórmula en el equipo cliente:
-
-```4d
- curVal:=Get database parameter([tabla1];Query By Formula On Server) //Almacena la configuración actual
- SET DATABASE PARAMETER([tabla1];Query By Formula On Server;1) //Fuerza la ejecución en el equipo cliente
-```
-
-#### Ejemplo 3
-
-Usted quiere exportar datos en JSON que contienen una fecha 4D convertida. Note que la conversión ocurre cuando la fecha se guarda en el objeto, debe llamar al comando [SET DATABASE PARAMETER](set-database-parameter.md) antes de llamar a [OB SET](ob-set.md):
-
-```4d
- var $o : Object
- SET DATABASE PARAMETER(Dates inside objects;0)
- OB SET($o ;"myDate";Current date) // conversión JSON
- $json:=JSON Stringify($o)
- SET DATABASE PARAMETER(Dates inside objects;1)
-```
-
-#### Ver también
-
-[Get database parameter](get-database-parameter.md)
-[LOG EVENT](log-event.md)
-[QUERY SELECTION](query-selection.md)
-
-#### Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 642 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/set-picture-to-library.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/set-picture-to-library.md
deleted file mode 100644
index e7f28ee30e2d45..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/set-picture-to-library.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-id: set-picture-to-library
-title: SET PICTURE TO LIBRARY
-slug: /commands/set-picture-to-library
-displayed_sidebar: docs
----
-
-**SET PICTURE TO LIBRARY** ( *imagen* ; *refImag* ; *nomImag* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| imagen | Picture | → | Nueva imagen |
-| refImag | Integer | → | Número de referencia de la imagen en la librería de imágenes |
-| nomImag | Text | → | Nuevo nombre de la imagen |
-
-
-
-## Descripción
-
-:::warning
-
-Este comando no puede utilizarse en proyectos porque la librería de imágenes sólo está disponible en bases de datos binarias.
-
-:::
-
-El comando SET PICTURE TO LIBRARY crea una nueva imagen o reemplaza una imagen existente en la librería de imágenes.
-
-Antes de llamar el comando, usted pasa:
-
-* el número de referencia de la imagen en *refImag* (entre 1 y 32767 )
-* la imagen misma en *imagen*.
-* el nombre de la imagen en *nomImag* (longitud máxima: 255 caracteres).
-
-Si hay una imagen en la librería de imágenes con el mismo número de referencia, su contenido será reemplazado y la imagen se renombra con los valores pasados en *imagen* y *nomImag.*
-
-Si no hay una imagen en la librería de imágenes con el número de referencia pasado en *refImag*, una nueva imagen se añade a la librería de imágenes.
-
-**4D Server:** SET PICTURE TO LIBRARY no puede utilizarse dentro de un método ejecutado en el equipo servidor (procedimiento almacenado o trigger). Si llama SET PICTURE TO LIBRARY en un equipo servidor, no pasa nada, la llamada se ignora.
-
-**Advertencia:** los objetos de estructura (elementos de listas jerárquicas, líneas de menú, etc.) pueden referirse a una imagen de la librería de imágenes. Sea prudente cuando modifique por programación una imagen de la librería de imágenes.
-
-**Nota:** si pasa una imagen vacía en *imagen* o un valor negativo o nulo en *refImag*, el comando no hace nada.
-
-## Ejemplo 1
-
-Sin importar el contenido actual de la librería de imágenes, el siguiente ejemplo añade una nueva imagen a la librería buscando primero un número de referencia de una imagen única:
-
-```4d
- PICTURE LIBRARY LIST($alRefImag;$asNomsImag)
- Repeat
- $vlRefImag:=1+Abs(Random)
- Until(Find in array($alRefImag;$vlRefImag)<0)
- SET PICTURE TO LIBRARY(vgImagen;$vlRefImag;"Nueva Imagen")
-```
-
-## Ejemplo 2
-
-El siguiente ejemplo importa en la librería de imágenes las imágenes (almacenadas en un documento en disco) creadas por el tercer ejemplo del comando [PICTURE LIBRARY LIST](picture-library-list.md "PICTURE LIBRARY LIST"):
-
-```4d
- SET CHANNEL(10;"")
- If(OK=1)
- RECEIVE VARIABLE($vsTag)
- If($vsTag="4DV6PICTURELIBRARYEXPORT")
- RECEIVE VARIABLE($vlNbImagenes)
- If($vlNbImagenes>0)
- For($vlImag;1;$vlNbImagenes)
- RECEIVE VARIABLE($vlPicRef)
- If(OK=1)
- RECEIVE VARIABLE($vsNomImag)
- End if
- If(OK=1)
- RECEIVE VARIABLE($vgImag)
- End if
- If(OK=1)
- SET PICTURE TO LIBRARY($vgImag;$vlRefImag;$vsNomImag)
- Else
- $vlImag:=$vlNbImagenes+1
- ALERT("Este archivo parece estar dañado.")
- End if
- End for
- Else
- ALERT("Este archivo parece estar dañado.")
- End if
- Else
- ALERT("El archivo “"+Document+"” no es un archivo de exportación de la librería de imágenes.")
- End if
- SET CHANNEL(11)
- End if
-```
-
-## Gestión de errores
-
-Si no hay suficiente memoria para añadir la imagen a la librería de imágenes, se genera un error -108\. Note que los errores E/S también pueden ser generados (si por ejemplo el archivo de estructura está bloqueado). Puede interceptar estos errores con un método de gestión de errores.
-
-## Ver también
-
-[GET PICTURE FROM LIBRARY](get-picture-from-library.md)
-[PICTURE LIBRARY LIST](picture-library-list.md)
-[REMOVE PICTURE FROM LIBRARY](remove-picture-from-library.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 566 |
-| Hilo seguro | ✗ |
-| Modifica variables | error |
-| Prohibido en el servidor ||
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/sql-get-last-error.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/sql-get-last-error.md
deleted file mode 100644
index 77229544aa71b0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/sql-get-last-error.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-id: sql-get-last-error
-title: SQL GET LAST ERROR
-slug: /commands/sql-get-last-error
-displayed_sidebar: docs
----
-
-**SQL GET LAST ERROR** ( *errCode* ; *errText* ; *errODBC* ; *errSQLServer* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| errCode | Integer | ← | Código del error |
-| errText | Text | ← | Texto del error |
-| errODBC | Text | ← | Código del error ODBC |
-| errSQLServer | Integer | ← | Código del error nativo servidor SQL |
-
-
-
-## Descripción
-
-El comando SQL GET LAST ERROR devuelve la información relacionada con el último error encontrado durante la ejecución de un comando ODBC. El error puede venir de la aplicación 4D, la red, la fuente ODBC, etc.
-
-Este comando generalmente debe llamarse en el contexto de un método de gestión de errores instalado utilizando el comando [ON ERR CALL](on-err-call.md "ON ERR CALL").
-
-* El parámetro *errCode* devuelve el código del error.
-* El parámetro *errText* devuelve el texto del error.
-
-Los dos últimos parámetros sólo se llenan cuando el error viene de la fuente ODBC; de lo contrario, se devuelven vacíos.
-
-* El parámetro *errODBC* devuelve el código del error ODBC (estado SQL).
-* El parámetro *errSQLServer* devuelve el código del error nativo servidor SQL.
-
-## Ver también
-
-[Last errors](last-errors.md)
-[ON ERR CALL](on-err-call.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 825 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/string-list-to-array.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/string-list-to-array.md
deleted file mode 100644
index e2b3ee89cd398d..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/string-list-to-array.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-id: string-list-to-array
-title: STRING LIST TO ARRAY
-slug: /commands/string-list-to-array
-displayed_sidebar: docs
----
-
-**STRING LIST TO ARRAY** ( *resNum* ; *cadenas* {; *resArchivo*} )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| resNum | Integer | → | Número de referencia del recurso o Atributo "id" del elemento "group" (XLIFF) |
-| cadenas | Text array | ← | Cadenas del elemento "group" (XLIFF) |
-| resArchivo | Time | → | Número de referencia del archivo de recursos o Todos los archivos XLIFF o los archivos de recursos abiertos, si se omite |
-
-
-
-## Descripción
-
-El comando STRING LIST TO ARRAY llena el array *cadenas* con:
-
-* las cadenas almacenadas en el recurso de tipo lista de cadenas ("STR#") cuyo número se pasa en *resNum*.
-* o con una cadena almacenada en un archivo XLIFF abierto cuyo atributo "id" del elemento "group" se pasa en *resNum* (ver a continuación "Compatibilidad con la arquitectura XLIFF").
-
-Si el recurso no se encuentra, el array *cadenas* no cambia y la variable OK toma el valor 0 (cero).
-
- Si pasa un número de referencia de archivo de recursos válido en *resArchivo*, el recurso se busca en ese archivo únicamente. Si no pasa *resArchivo*, se devolverá la primera ocurrencia del recurso encontrado en la cadena de archivos de recursos. Antes de llamar STRING LIST TO ARRAY, puede predeclarar el array *cadenas* como una array de tipo cadena o texto. Si no predeclara el array, el comando crea *cadenas* como un array de tipo Texto.
-
-**Nota:** cada cadena de un recurso lista de cadenas puede contener hasta 255 caracteres.
-
-**Tip:** cuando utilice los recursos listas de cadenas, limítese a recursos de 32K, y a un máximo de unas centenas de cadenas por recurso.
-
-## Compatibilidad con la arquitectura XLIFF
-
-El comando STRING LIST TO ARRAY es compatible con la arquitectura XLIFF de 4D a partir de la versión 11: el comando busca primero por los valores correspondientes a *resNum* y *strNum* en todos los archivos XLIFF abiertos (si el parámetro *resArchivo* se omite) y llena el array *cadenas* con los valores correspondientes. En este caso, *resNum* específica el atributo **id** del elemento **group** y el array *cadenas* contiene todas las cadenas del elemento. Si no se encuentra el valor, el comando continua la búsqueda en los archivos de recursos abiertos. Para mayor información sobre la arquitectura XLIFF en 4D, consulte el Manual de Diseño.
-
-## Variables y conjuntos del sistema
-
-Si se encuentra el recurso, la variable sistema OK toma el valor 1, de lo contrario toma el valor 0 (cero).
-
-## Ver también
-
-[Get indexed string](get-indexed-string.md)
-[Get string resource](get-string-resource.md)
-[Get text resource](get-text-resource.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 511 |
-| Hilo seguro | ✗ |
-| Modifica variables | OK |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/string.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/string.md
deleted file mode 100644
index bcdc6c9df6ab01..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/string.md
+++ /dev/null
@@ -1,197 +0,0 @@
----
-id: string
-title: String
-slug: /commands/string
-displayed_sidebar: docs
----
-
-**String** ( *expresion* {; *formato* {; *agregarHora*}} ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| expresion | Expression | → | Expresión a convertir en cadena (puede ser de tipo Real, Entero, Entero largo, Fecha, Hora, String, Texto, Booleana, Indefinido o Null) |
-| formato | Integer, Text | → | Formato de visualización |
-| agregarTime | Time | → | Hora a añadir si expresión es una fecha |
-| Resultado | Text | ← | Expresión convertida en cadena alfanumérica |
-
-
-
-## Descripción
-
-El comando String devuelve en forma de cadena alfanumérica la expresión de tipo numérico, Fecha, Hora, cadena o Booleana que se pasa en *expresion*.
-
-Si no pasa el parámetro opcional *formato*, la cadena se devuelve en el formato por defecto del tipo de datos correspondiente. Si pasa *formato*, puede definir el formato de la cadena resultante.
-
-El parámetro opcional *agregarHora* añade una hora a una fecha en un formato combinado. Sólo puede utilizarse cuando el parámetro *expresion* es una fecha (ver a continuación).
-
-**Expresiones numéricas**
-Si *expresion* es una expresión numérica (Real, Entero, Entero largo), puede pasar el formato de la cadena opcional. Estos son algunos ejemplos:
-
-| **Ejemplo** | **Resultado** | **Comentarios** |
-| --------------------------------- | ----------------------- | ------------------------------------- |
-| String(2^15) | "32768" | Formato por defecto |
-| String(2^15;"###,##0 habitantes") | "32,768 habitantes" | |
-| String(1/3;"##0.00000") | "0.33333" | |
-| String(1/3) | "0.3333333333333330000" | Formato por defecto(\*) |
-| String(Arctan(1)\*4) | "3.141592653589790000" | Formato por defecto(\*) |
-| String(Arctan(1)\*4;"##0.00") | "3.14" | |
-| String(-1;"&x") | "0xFFFFFFFF" | |
-| String(-1;"&$") | "$FFFFFFFF" | |
-| String(0 ?+ 7;"&x") | "0x0080" | |
-| String(0 ?+ 7;"&$") | "$80" | |
-| String(0 ?+ 14;"&x") | "0x4000" | |
-| String(0 ?+ 14;"&$") | "$4000" | |
-| String(50,3;"&xml") | "50.3" | Siempre "." como un separador decimal |
-| String(Num(1=1);"True;;False") | "True" | |
-| String(Num(1=1);"True;;False") | "True" | |
-| String(Num(1=2);"True;;False") | "False" | |
-| String(Log(-1)) | "" | Número indefinido |
-| String(1/0) | "INF" | Número infinito positivo |
-| String(-1/0) | "-INF" | Número infinito positivo |
-
-(\*) El algoritmo de conversión de valores reales a texto está basado en 13 dígitos significativos.
-
-El formato se especifica de la misma forma que para un campo numérico en un formulario. Para mayor información sobre formatos numéricos, consulte la sección *Formatos de salida* del manual de Diseño de 4D. Igualmente puede pasar el nombre de un estilo personalizado en *formato*. El nombre del estilo personalizado debe estar precedido por el carácter *“|”*.
-
-**Nota:** la función **String** no es compatible con campos de tipo "Entero 64 bits" en modo compilado.
-
-**Expresiones de tipo Fecha**
-Si *expresion* es de tipo Fecha, la cadena se devuelve en el formato por defecto definido en el sistema.
-
-De lo contrario, en el parámetro *formato*, puede pasar:
-
-* o un formato predefinido disponible a través de las siguientes constantes del tema *Formatos de salida de fechas* (valor longint):
-
-| Constante | Valor | Comentario |
-| --------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------- |
-| Blank if null date | 100 | A añadir a la constante de formato. Indica que en caso de valor null, 4D debe devolver una cadena vacía en lugar de ceros. |
-| Date RFC 1123 | 10 | Fri, 10 Sep 2010 13:07:20 GMT |
-| Internal date abbreviated | 6 | 29 dic, 2006 |
-| Internal date long | 5 | 29 diciembre 2006 |
-| Internal date short | 7 | |
-| Internal date short special | 4 | 12/29/06 (pero 12/29/1896 o 12/29/2096) |
-| ISO Date | 8 | 2006-12-29T00:00:00 |
-| ISO Date GMT | 9 | 2010-09-13T16:11:53Z |
-| System date abbreviated | 2 | dom. 29 de 2006 |
-| System date long | 3 | domingo 29 diciembre 2006 |
-| System date short | 1 | |
-
-Ejemplos:
-```4d
- $vsResult:=String(!2023-11-27!) //"11/27/2023"
- $vsResult:=String(!2023-11-27!;Internal date long) // "November 27, 2023"
- $vsResult:=String(!2023-11-27!;ISO Date GMT) // "2023-11-26T23:00:00Z" en zona horaria de Francia
-```
-* o un [formato personalizado basado en un modelo](../Project/date-time-formats.md) (valor string)
-Ejemplos:
-
-```4d
- $vsResult:=String(!2023-11-27!;"EEEE d MMMM y GGGG") //"Monday 27 November 2023 Anno Domini"
- $vsResult:=String(!2023-11-27!;"E dd/MM/yyyy zzzz") //"Mon 27/11/2023 GMT+01:00" in French timezone
-```
-
-**Nota:** los formatos pueden variar dependiendo de la configuración del sistema.
-
-**Parámetro** ***agregarHora***
-
-Al procesar expresiones de fecha, también puede pasar una hora en el parámetro *agregarHora*. Este parámetro permite combinar una fecha con una hora para generar marcas de tiempo conformes a las normas vigentes (constantes ISO Date GMT y Date RFC 1123). Estos formatos son especialmente útiles en el contexto del procesamiento xml y Web. El parámetro *agregarHora* sólo puede utilizarse cuando el parámetro *expresion* es una fecha.
-
-Este parámetro puede utilizarse con formatos de fecha predefinidos o basados en patrones. Ejemplos:
-
-```4d
- $dateTime:=String(!2010-09-09!;ISO date GMT;Current time) //"2010-09-09T08:30:41Z"
- $dateTime2:=String(!2023-11-27!;"E dd/MM/yyyy 'at' hh:mm aa O";?11:15:00?) //"Mon 27/11/2023 at 11:15 AM GMT+1"
-```
-
-**Notas para los formatos combinados fecha/hora:**
-
-* El formato ISO Date GMT corresponde a la norma ISO8601 estándar y contiene una fecha y una hora expresada con respecto a la zona horaria (GMT).
-```4d
- $mydate:=String(Current date;ISO Date GMT;Current time) // devuelve por ejemplo, 2010-09-13T16:11:53Z en Francia
-```
-
-Note que el caracter "Z" al final indica el formato GMT.
-Si no pasa el parámetro *addTime*, el comando devuelve la fecha a la media noche (hora local) expresada en hora GMT lo cual puede causar que la fecha se mueva hacia adelante o hacia atrás dependiendo de la zona horaria local:
-```4d
- $mydate:=String(!13/09/2010!;ISO Date GMT) // devuelve 2010-09-12T22:00:00Z en Francia
-```
-* El formato ISO Date es similar al formato ISO Date GMT, excepto que expresa la fecha y la hora con respecto a la zona del huso horario. Note que como este formato no cumple con el estándar ISO8601, su uso deber reservarse a propósitos muy específicos.
-```4d
- $mydate:=String(!13/09/2010!;ISO Date) // devuelve 2010-09-13T00:00:00 sin importar la zona horaria
- $mydate:=String(Current date;ISO Date;Current time) // devuelve 2010-09-13T18:11:53
-```
-* El formato Date RFC 1123 permite formatear un conjunto fecha/hora siguiendo la norma definida por los RFC 822 y 1123\. Este formato es necesario por ejemplo para fijar la fecha de vencimiento de las cookies en un encabezado HTTP.
-```4d
- $mydate:=String(Current date;Date RFC 1123;Current time) // devuelve, por ejemplo Fri, 10 Sep 2010 13:07:20 GMT
-```
-
-La hora expresada tiene en cuenta la hora del huso horario (zona GMT). Si pasa una fecha, el comando devuelve la fecha a la media noche (hora loca) expresada en hora GMT lo que puede hacer que la fecha se mueva hacia adelante o hacia atrás dependiendo de la zona horaria local:
-```4d
- $mydate:=String(Current date;Date RFC 1123) // devuelve Thu, 09 Sep 2010 22:00:00 GMT
-```
-
-**Expresiones de tipo Hora**
-Si *expresion* es de tipo Hora, la cadena se devuelve utilizando el formato por defecto HH:MM:SS. Si es de otra forma, en el parámetro *formato*, puede pasar:
-
-* o un formato predefinido disponible a través de las siguientes constantes del tema *Formatos de salida de hora* (valor longint):
-
-|Constante | Valor | Comentario |
-| ---------------------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Blank if null time | 100 | "" en lugar de 0 |
-| HH MM | 2 | |
-| HH MM AM PM | 5 | |
-| HH MM SS | 1 | |
-| Hour min | 4 | 1 hora 2 minutos |
-| Hour min sec | 3 | 1 hora 2 minutos 3 segundos |
-| ISO time | 8 | 0000-00-00T01:02:03\. Corresponde a la norma ISO8601 y contiene, en teoría, una fecha y una hora. Como este formato no soporta fechas/horas combinadas, la parte de la fecha se rellena con 0s. Este formato expresa la hora local. |
-| Min sec | 7 | 62 minutos 3 segundos |
-| MM SS | 6 | |
-| System time long | 11 | 1:02:03 AM HNEC (Mac únicamente) |
-| System time long abbreviated | 10 | 1•02•03 AM (Mac únicamente) |
-| System time short | 9 | |
-
-Ejemplos:
-
-```4d
- $vsResult:=String(?17:30:45?;HH MM AM PM) //"5:30 PM"
- $vsResult:=String(?17:30:45?;Hour Min Sec) //"17 hours 30 minutes 45 seconds"
-```
-* o un [formato personalizado basado en un modelo](../Project/date-time-formats.md) (valor string)
-Ejemplos:
-
-```4d
- $vsResult:=String(?17:30:45?;"hh:mm aa O") //"05:30 PM GMT+1"
- $vsResult:=String(?17:30:45?;"'It is' K a") //"It is 5 PM"
-```
-
-**Expresiones de tipo cadena**
-Si *expresion* es de tipo Alfa o Texto, el comando devuelve el mismo valor que se pasa en el parámetro. Esto puede ser útil particularmente en programación genérica utilizando punteros.
-En este caso, si se pasa el parámetro *formato* se ignora.
-
-**Expresiones de tipo Booleano**
-Si *expresion* es de tipo Booleano, el comando devuelve la cadena “True” o “False” en el lenguaje de la aplicación (por ejemplo, “Vrai” o “Faux” en una versión francesa de 4D).
-En este caso si se pasa el parámetro *formato*, se ignora.
-
-**Expresiones indefinidas**
-Si *expresion* se evalúa como indefinida, el comando devuelve una cadena vacía. Esto es útil cuando se espera que el resultado de una expresión (por ejemplo, un atributo objeto) sea una cadena, incluso si puede ser indefinido.
-
-**Expresiones Null**
-
-Si *expresion* se evalúa como Null, el comando devuelve la cadena "null". Esto es útil cuando se espera que el resultado de una expresión (por ejemplo, un atributo objeto) sea una cadena, incluso si puede ser null.
-
-## Ver también
-
-[Bool](../commands/bool)
-[Date](../commands/date)
-[Num](num.md)
-[Time string](../commands/time-string)
-[Timestamp](../commands/timestamp)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 10 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/text-to-array.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/text-to-array.md
deleted file mode 100644
index 95f0c853169584..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/text-to-array.md
+++ /dev/null
@@ -1,119 +0,0 @@
----
-id: text-to-array
-title: TEXT TO ARRAY
-slug: /commands/text-to-array
-displayed_sidebar: docs
----
-
-**TEXT TO ARRAY** ( *varText* ; *arrText* ; *ancho* ; *nomFuente* ; *tamFuente* {; *estiloFuente* {; *}} )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| varText | Text | → | Texto original a dividir |
-| arrText | Text array | ← | Array que contiene el texto dividido en palabras o líneas |
-| ancho | Integer | → | Ancho máximo de la cadena(en píxeles) |
-| nomFuente | Text | → | Nombre de la fuente |
-| tamFuente | Integer | → | Tamaño de la fuente |
-| estiloFuente | Integer | → | Estilo de fuente |
-| * | Operador | → | Si se pasa = interpretar el texto como multistyle |
-
-
-
-## Descripción
-
-El comando **TEXT TO ARRAY** transforma una variable texto en un array texto. El texto original (con estilo o no) se divide y cada parte se convierte en un elemento del array *arrText* que es devuelto por el comando. Este comando se puede utilizar por ejemplo para llenar las páginas o las columnas con texto de un tamaño fijo.
-
-El texto original se divide en "palabras", basado en un tamaño de línea definido por los parámetros del comando y teniendo en cuenta todos los estilos utilizados.
-
-En el parámetro *varText*, pase el texto a dividir en elementos de array. Este texto puede ser o no multiestilo. Algunos parámetros se ignoran cuando el texto es multiestilo.
-
-Pase en el parámetro *arrText* el nombre del array a llenar con el texto dividido.
-
-En el parámetro *ancho*, pase un tamaño en píxeles que indique la longitud máxima de línea a medir para dividir el texto. Para todo el texto, el comando evaluara el número máximo de palabras que pueden "encajar" en este ancho en función de los atributos gráficos del texto (fuente, estilo).
-
-* Si el texto es multiestilo, los estilos del texto original se tienen en cuenta y los siguientes parámetros se ignoran si se pasan. En este caso, las líneas de texto en el array resultante conservan su estilo original (de manera que se puede imprimir una por una vía una variable texto o alfa por ejemplo).
-* Si se trata de texto plano (sin estilos), debe pasar todos los parámetros para que el comando pueda calcular la longitud de las líneas.
-
-Cada elemento del array debe contener al menos una palabra. Si el ancho pasado es demasiado pequeño para que la regla de división se respete estrictamente, el array se llena lo más aproximadamente posible de acuerdo a los parámetros y la variable OK toma el valor 0\. Por ejemplo, si pasa un ancho de 3 píxeles, es probable que la mayoría de las palabras sean más grandes que esta longitud. En este caso, la variable OK toma el valor 0.
-Esto también significa que el tamaño máximo teórico del array devuelto es igual al número de palabras presentes en *varText*.
-
-En los parámetros *nomFuente* y *tamFuente*, pase el nombre y el tamaño de la fuente con la cual *varText* debe ser evaluado por el comando para hacer la división. Estos parámetros son obligatorios en el caso de texto sin formato.
-
-En el parámetro *estiloFuente*, pase una o más constantes del tema *Estilos de fuente*.
-
-| Constante | Tipo | Valor |
-| --------- | ------------ | ----- |
-| Bold | Entero largo | 1 |
-| Italic | Entero largo | 2 |
-| Plain | Entero largo | 0 |
-| Underline | Entero largo | 4 |
-
-
-Este parámetro es opcional; cuando se omite, se utiliza el estilo Normal.
-
-El parámetro opcional *\**, si se pasa, permite forzar el que se tenga en cuenta los parámetros *nomFuente*, *tamFuente* y/o *estiloFuente* para los textos multiestilos cuando estos parámetros no están definidos en el texto original. Sin embargo, si estos parámetros están definidos en el texto original, los parámetros pasados al comando se ignoran en todos los casos.
-
-## Ejemplo 1
-
-Queremos dividir un texto multistyle en líneas con un tamaño máximo de 200 píxeles:
-
-```4d
- TEXT TO ARRAY(theText;TextArray;200;"Arial";20;Normal;*)
- // los atributos Arial, 20 y Normal sólo se tienen en cuenta si no están definidos en el texto
-```
-
-## Ejemplo 2
-
-Queremos dividir un texto en líneas de un tamaño máximo de 350 píxeles en fuente Bodoni negrita 14\. Como el comando no funciona correctamente si la fuente no está disponible, es útil verificar su presencia:
-
-```4d
- ARRAY TEXT($FontList;0)
- FONT LIST($FontList)
- $Font:="Bodoni"
- $p:=Find in array($FontList;$Font)
- If($p>0)
- TEXT TO ARRAY(theText;TextArray;350;"Bodoni";14;Bold)
- Else
- // utilizar otra fuente
- End if
-```
-
-## Ejemplo 3
-
-Un texto multiestilo debe imprimirse sin estilo en la fuente Arial normal 12 con un ancho máximo de 600 píxeles:
-
-```4d
- // transformamos el texto multiestilo en texto bruto
- $RawText:=OBJECT Get plain text(vText)
- // llenamos el array
- TEXT TO ARRAY($RawText;TextArray;600;"Arial";12)
-```
-
-## Ejemplo 4
-
-Debe imprimir en un área de 400 píxeles de largo un texto de un máximo de 80 líneas con la fuente más grande posible (sin exceder los 24 puntos). Puede escribir:
-
-```4d
- ARRAY TEXT(TextArray;0)
- $Size:=24
- Repeat
- TEXT TO ARRAY($RawText;TextArray;400;"Arial";$Size)
- $Size:=$Size-1
- $n:=Size of array(TextArray)
- Until($n<=80)
-```
-
-## Ver también
-
-[Split string](split-string.md)
-[ST Get plain text](st-get-plain-text.md)
-[ST Get text](st-get-text.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1149 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/throw.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/throw.md
deleted file mode 100644
index 9a6fd8ae1b85db..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/throw.md
+++ /dev/null
@@ -1,116 +0,0 @@
----
-id: throw
-title: throw
-slug: /commands/throw
-displayed_sidebar: docs
----
-
-**throw** ( *errorCode* {; *descripcion*} )
-*throw* {( *errorObj* )}
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| errorCode | Integer | → | Un entero largo que representa el código de error. |
-| descripcion | Text | → | Texto que describe el error. |
-| throw {( errorObj )} |
-| Parámetro | Tipo | Descripción |
-| errorObj | Object | → | Un objeto que contiene propiedades para construir el error |
-
-
-
-## Descripción
-
-El comando **throw** crea un error que será lanzado inmediatamente o cuando el método que lo llama devuelva a su llamador (modo diferido).
-
-Cuando se encuentre con una situación en su código 4D en la que surja una condición de error, puede utilizar el comando throw para lanzar explícitamente un error y dar un mensaje de error específico o un número de error. Esto puede ser útil para señalar condiciones excepcionales o entradas inválidas.
-
-Los errores lanzados utilizando el comando **throw** son gestionados por el runtime de 4D como cualquier error normal: se muestra el diálogo de error estándar a menos que se haya instalado un método de intercepción utilizando el comando [ON ERR CALL](on-err-call.md).
-
-El comando admite tres sintaxis:
-
-### **throw(errorCode{; description})**
-
-Especifica el código de error y un texto de descripción opcional, el error se lanza inmediatamente.
-Si no se indica ninguna descripción: se llena con:
-
-* Código de error (errorCode): (host) en la aplicación local
-* Código de error (errorCode): (C00x) en un componente
-
-### **throw(errorObj)**
-
-El objeto *errorObj* permite obtener información de error más detallada y controlar la gestión de errores. Puede contener las siguientes propiedades, así como toda propiedad personalizada a la que pueda hacer referencia la propiedad **message**.
-
-Puede contener las siguientes propiedades, así como toda propiedad personalizada a la que pueda hacer referencia utilizando marcadores de posición dentro de la propiedad message.
-
-| **propiedad** | **tipo ** | **descripción** |
-| ------------------ | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| componentSignature | text | Firma de cuatro letras latinas para identificar de forma única el origen del error. Si no se indica **componentSignature**, el comando utiliza "host" para la base de datos host, y "C001", "C002", ... para los componentes. |
-| errCode | number | Código de error. Si no se indica el **errCode**, el comando utiliza -1. |
-| message | text | Descripción del error. El **mensaje** puede contener marcadores de posición que serán sustituidos por propiedades personalizadas añadidas al objeto errorObj. Cada marcador de posición debe especificarse utilizando llaves {} encerrando el nombre de la propiedad a utilizar. Si el **mensaje** no se indica o es una cadena vacía, el comando buscará una descripción en los archivos xliff de la base de datos actual con un renombre construido así: ERR\_{component}\_{code}". |
-| deferred | boolean | True si el error debe diferirse cuando vuelva al método actual o al final del [Try block](../Concepts/error-handling.md#trycatchend-try). El valor por defecto es false. |
-
-Cuando se utiliza esta sintaxis, el objeto *errorObj* se devuelve en Últimos errores.
-
-**Nota:** es posible llamar al comando varias veces en el mismo método proyecto para generar varios errores. Puede utilizar la opción diferido para enviar todos los errores a la vez.
-
-### **throw**
-
-Lanza todos los errores actuales en **modo diferido**, lo que significa que se añadirán a una pila y se gestionarán cuando vuelva el método que los llama. Esto se hace típicamente desde dentro de una retrollamada [ON ERR CALL](on-err-call.md).
-
-* **En una aplicación**: cuando se produce un error, se añade a la pila de errores y se llama al método [ON ERR CALL](on-err-call.md) de la aplicación al final del método actual. La función [Last errors](last-errors.md) devuelve la pila de errores.
-* **Como consecuencia, en un componente:** la pila de errores se puede enviar a la aplicación local y se llama al método [ON ERR CALL](on-err-call.md) de la aplicación local.
-
-## Ejemplo 1
-
-```4d
- var $code : Integer
- var $description : text
- $code:=50042 //Código personalizado
- $description:=“This is a custom error”
- throw($code ;$description) // Lanza un error con el mensaje "This is a custom error" y errCode = 50042
-```
-
-## Ejemplo 2
-
-```4d
-throw({errCode: 1; message: "This an error"}) // Lanza un error con el mensaje errCode = 1 y mensaje "This an error"
-```
-
-## Ejemplo 3
-
-```4d
-throw({errCode: 1}) // Lanza un error con errCode = 1 y el mensaje "Error code: 1 (host)"
-```
-
-## Ejemplo 4
-
-```4d
-throw({message: "This an error"}) // Lanza un error con errCode = -1 y el mensaje "This is my error"
-```
-
-## Ejemplo 5
-
-```4d
-throw({message: "This is my error"; deferred: True}) // Lanza un error con el mensaje "This is my error" y errCode = -1 en modo diferido
-```
-
-## Ejemplo 6
-
-```4d
-throw({componentSignature: "xbox"; errCode: 600; name: "myFileName"; path: "myFilePath"; deferred: True})// Lanza un error con el mensaje "File myFileName not found (myFilePath)" en modo diferido.
-```
-
-## Ver también
-
-[ASSERT](assert.md)
-[Last errors](last-errors.md)
-[ON ERR CALL](on-err-call.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1805 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/time-string.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/time-string.md
deleted file mode 100644
index 4c18dfb1efb6cb..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/time-string.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-id: time-string
-title: Time string
-slug: /commands/time-string
-displayed_sidebar: docs
----
-
-**Time string** ( *segundos* ) : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| segundos | Integer, Time | → | Segundos desde la media noche |
-| Resultado | Text | ← | Hora como una cadena en formato 24 horas |
-
-
-
-## Descripción
-
-El comando Time string devuelve la cadena de la expresión tipo hora que usted pasó en *segundos*.
-
-El formato de la cadena es HH:MM:SS.
-
-Si pasa un número de segundos superior al número de segundos que hay en un día (86 400), Time string sigue añadiendo horas, minutos y segundos. Por ejemplo, Time string (86401) devuelve 24:00:01.
-
-**Nota:** si necesita el formato de la cadena de la expresión de tipo hora en una variedad de formatos, utilice [String](string.md "String").
-
-## Ejemplo
-
-El siguiente muestra una caja de alerta con el mensaje, “46 800 segundos representan 13:00:00.”
-
-```4d
- ALERT("46800 segundos representan "+Time string(46800))
-```
-
-## Ver también
-
-[String](string.md)
-[Time](time.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 180 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/time.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/time.md
deleted file mode 100644
index 318cfff10329c1..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/time.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-id: time
-title: Time
-slug: /commands/time
-displayed_sidebar: docs
----
-
-**Time** ( *valHora* ) : Time
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| valHora | Text, Integer | → | Valor a devolver en forma de hora |
-| Resultado | Time | ← | Hora especificada por horaCadena |
-
-
-
-#### Descripción
-
-El comando Time devuelve una expresión de tipo Hora equivalente a la hora especificada en el parámetro *valHora*.
-
-El parámetro *valHora* debe contener:
-
-* una cadena que contenga una hora expresada en uno de los siguientes formatos de hora estándar de 4D correspondientes al lenguaje de su sistema (para mayor información, consulte la descripción del comando [String](string.md)).
-* un entero largo que representa el número de segundos transcurridos desde 00:00:00.
-
-**Nota:** si la expresión *valHora* se evalúa como indefinida, **Time** devuelve una hora vacía (00:00:00). Esto es útil cuando se espera que el resultado de una expresión (por ejemplo, un atributo objeto) sea una hora, incluso si puede ser indefinida.
-
-#### Ejemplo 1
-
-El siguiente ejemplo muestra una caja de alerta con el mensaje “1:00 P.M. = 13 horas 0 minutos”:
-
-```4d
- ALERT("1:00 P.M. = "+String(Time("13:00:00");Hour Min))
-```
-
-#### Ejemplo 2
-
-Puede expresar todo valor numérico como una hora:
-
-```4d
- vTime:=Time(10000)
- //vTime is 02:46:40
- vTime2:=Time((60*60)+(20*60)+5200)
- //vTime2 is 02:46:40
-```
-
-#### Ver también
-
-[ARRAY TIME](array-time.md)
-[Bool](../commands/bool)
-[String](string.md)
-[Time string](../commands/time-string)
-[Timestamp](../commands/timestamp)
-
-#### Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 179 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/timestamp.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/timestamp.md
deleted file mode 100644
index 27b0c66e1ce66e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/timestamp.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-id: timestamp
-title: Timestamp
-slug: /commands/timestamp
-displayed_sidebar: docs
----
-
-**Timestamp** : Text
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| Resultado | Text | ← | Hora actual devuelta utilizando el formato ISO con milisegundos |
-
-
-
-#### Descripción
-
-**Timestamp** devuelve la hora UTC actual en formato ISO con milisegundos, es decir, aaaa-MM-ddTHH:mm:ss.SSSZ. Tenga en cuenta que el carácter "Z" indica la zona horaria GMT.
-
-Cada hora devuelta por **Timestamp** se expresa de acuerdo con la norma ISO 8601\. Para más información sobre este estándar, consulte:
-
-**Note:** esta función no es adecuada para tiempos; Debe utilizar [Milliseconds](milliseconds.md) cuando desee medir el tiempo transcurrido.
-
-#### Ejemplo
-
-Puede utilizar **Timestamp** en un archivo de historial para saber con precisión donde ocurrieron los eventos. Como se muestra a continuación, es posible que se produzcan varias operaciones durante el mismo segundo:
-
-```4d
- $vhDocRef:=Append document("TimestampProject.log")
- $logWithTimestamp:=Timestamp+Char(Tab)+"Log with timestamp"+Char(Carriage return)
- SEND PACKET($vhDocRef;String($logWithTimestamp))
-```
-
-Resultado:
-
-```RAW
-2016-12-12T13:31:29.477Z Log with timestamp2016-12-12T13:31:29.478Z Connection of user12016-12-12T13:31:29.486Z ERROR - Exception of type 'System exception'2016-12-12T13:31:29.492Z Click on button16842016-12-12T13:31:29.502Z [SP_HELP- 1 rows] Command processed2016-12-12T13:31:29.512Z [SP_HELP- 5 rows] Result set fetched
-```
-
-#### Ver también
-
-[Milliseconds](milliseconds.md)
-[String](string.md)
-[Time](time.md)
-
-#### Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1445 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/verify-password-hash.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/verify-password-hash.md
deleted file mode 100644
index b5aae64a011dd8..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/verify-password-hash.md
+++ /dev/null
@@ -1,64 +0,0 @@
----
-id: verify-password-hash
-title: Verify password hash
-slug: /commands/verify-password-hash
-displayed_sidebar: docs
----
-
-**Verify password hash** ( *contrasena* ; *hash* ) : Boolean
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| contrasena | Text | → | La contraseña de usuario. Sólo se utilizan los primeros 72 caracteres. |
-| hash | Text | → | Un hash de contraseña. |
-| Resultado | Boolean | ← | Devuelve TRUE si la contraseña y hash coinciden, de lo contrario devuelve FALSE. |
-
-
-
-## Descripción
-
-La función **Verify password hash** verifica que el hash dado coincida con la *contrasena* dada.
-
-Esta función compara la *contrasena* con un *hash* generado por la función [Generate password hash](generate-password-hash.md).
-
-### Gestión de errores
-
-Se pueden devolver los errores siguientes. Puede revisar un error con los comandos [Last errors](last-errors.md) y [ON ERR CALL](on-err-call.md).
-
-| **Número** | **Mensaje** |
-| ---------- | ----------------------------------------------------- |
-| 850 | Password-hash: Algoritmo no soportado. |
-| 851 | Password-hash: Fallo de verificación de consistencia. |
-
-**Recordatorio**: solo se soporta el algoritmo bcrypt. Si su hash no se generó utilizando bcrypt, se devuelve un error.
-
-## Ejemplo
-
-Este ejemplo verifica un hash de contraseña creado previamente por [Generate password hash](generate-password-hash.md) y almacenado en una tabla \[Users\] con una contraseña introducida recientemente:
-
-```4d
- var $password : Text
- $password:=Request("Por favor introduzca su contraseña")
-
- If(Verify password hash($password;[Users]hash))
- ALERT("Contraseña correcta")
- Else
- ALERT("Contraseña incorrecta")
- End if
-```
-
-**Nota:** la contraseña nunca se almacena en el disco, sólo el hash. Utilizando una aplicación 4D remota, el hash podría ser producido del lado del cliente. Si en cambio, utiliza un front end basado en JavaScript (o similar), la mejor práctica para la seguridad es crear el hash del lado del servidor. Por supuesto, debe utilizar una conexión de red cifrada TLS para la seguridad, ya que esto requiere la transferencia de la contraseña a través de la red.
-
-## Ver también
-
-
-[Generate password hash](generate-password-hash.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 1534 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/web-send-blob.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/web-send-blob.md
deleted file mode 100644
index d9e5817a91abe5..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands-legacy/web-send-blob.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-id: web-send-blob
-title: WEB SEND BLOB
-slug: /commands/web-send-blob
-displayed_sidebar: docs
----
-
-**WEB SEND BLOB** ( *BLOB* ; *tipo* )
-
-| Parámetro | Tipo | | Descripción |
-| --- | --- | --- | --- |
-| Blob | Blob | → | BLOB a enviar al navegador |
-| tipo | Text | → | Tipo de datos del BLOB |
-
-
-
-## Descripción
-
-El comando **WEB SEND BLOB** permite enviar el BLOB *blob* al navegador.
-
-El tipo de datos contenidos en el BLOB es indicado por *tipo*. Este parámetro puede contener los siguientes valores:
-
-* *tipo* \= **Cadena vacía** (""): en este caso, no necesita dar más información en el BLOB. El navegador intentará interpretar los contenidos del BLOB.
-* *tipo* \= **Extensión de archivo** (Ejemplo: ".HTM", ".GIF", ".JPEG", etc.): en este caso, especifique el navegador, por intermedio de su extensión, el tipo MIME de los datos contenidos en el BLOB. El BLOB será interpretado de acuerdo a su extensión. Sin embargo, la extensión debe ser estándar para que el navegador pueda interpretarla correctamente.
-* *tipo* \= **Mime/Tipo** (Ejemplo: “text/html”, “image/tiff”, etc.): en este caso, especifique directamente al navegador el tipo MIME de los datos contenidos en el BLOB. Esta solución ofrece más libertad. Además, los tipos estándar, puede pasar un tipo MIME personalizado para enviar los documentos propietarios en Intranet. Para hacerlo, sólo necesita configurar los navegadores con el fin de reconocer el tipo enviado y ejecutar la aplicación correspondiente. El valor a pasar en el parámetro *tipo* es, en este caso, “application/x-\[NombreTipo\]”. En los navegadores de los equipos clientes, usted referencia este tipo y lo asocia a la acción “Launch the application”. El comando **WEB SEND BLOB** permite entonces enviar documentos de todo tipo, los clientes Intranet abren automáticamente la aplicación asociada.
-
-**Nota:** para mayor información sobre los tipos MIME, consulte la página: .
-
-La lista de tipos MIME y sus extensiones de archivo soportados por el servidor 4D HTTP se guarda en el archivo "MimeTypes.xml" que se encuentra en la carpeta "Resources" de la aplicación 4D.
-
-Las referencias a las variables 4D y etiquetas de tipo *4DSCRIPT* en la página siempre se analizan.
-
-## Ejemplo
-
-Consulte el ejemplo de la rutina [PICTURE TO BLOB](picture-to-blob.md).
-
-## Ver también
-
-[WEB SEND FILE](web-send-file.md)
-
-## Propiedades
-
-| | |
-| --- | --- |
-| Número de comando | 654 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/command-index.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/command-index.md
deleted file mode 100644
index bb01a31eb1daf6..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/command-index.md
+++ /dev/null
@@ -1,1359 +0,0 @@
----
-id: command-index
-title: Índice
----
-
-[4D](#4D) - [A](#A) - [B](#B) - [C](#C) - [D](#D) - [E](#E) - [F](#F) - [G](#G) - [H](#H) - [I](#I) - [J](#J) - [K](#K) - [L](#L) - [M](#M) - [N](#N) - [O](#O) - [P](#P) - [Q](#Q) - [R](#R) - [S](#S) - [T](#T) - [U](#U) - [V](#V) - [W](#W) - [X](#X) - [Y](#Y) - [Z](#Z)
-
-4D
-
-[`4D`](4d.md)
-
-A
-
-[`ABORT`](../commands-legacy/abort.md)
-[`ABORT PROCESS BY ID`](../commands-legacy/abort-process-by-id.md)
-[`Abs`](../commands-legacy/abs.md)
-[`ACCEPT`](../commands-legacy/accept.md)
-[`ACCUMULATE`](../commands-legacy/accumulate.md)
-[`Action info`](../commands-legacy/action-info.md)
-[`Activated`](../commands-legacy/activated.md)
-[`Active transaction`](../commands-legacy/active-transaction.md)
-[`ACTIVITY SNAPSHOT`](../commands-legacy/activity-snapshot.md)
-[`ADD RECORD`](../commands-legacy/add-record.md)
-[`Add to date`](../commands-legacy/add-to-date.md)
-[`ADD TO SET`](../commands-legacy/add-to-set.md)
-[`ADJUST BLOBS CACHE PRIORITY`](../commands-legacy/adjust-blobs-cache-priority.md)
-[`ADJUST INDEX CACHE PRIORITY`](../commands-legacy/adjust-index-cache-priority.md)
-[`ADJUST TABLE CACHE PRIORITY`](../commands-legacy/adjust-table-cache-priority.md)
-[`After`](../commands-legacy/after.md)
-[`ALERT`](../commands-legacy/alert.md)
-[`ALL RECORDS`](../commands-legacy/all-records.md)
-[`APPEND DATA TO PASTEBOARD`](../commands-legacy/append-data-to-pasteboard.md)
-[`Append document`](../commands-legacy/append-document.md)
-[`APPEND MENU ITEM`](../commands-legacy/append-menu-item.md)
-[`APPEND TO ARRAY`](../commands-legacy/append-to-array.md)
-[`APPEND TO LIST`](../commands-legacy/append-to-list.md)
-[`Application file`](../commands-legacy/application-file.md)
-[`Application info`](../commands-legacy/application-info.md)
-[`Application type`](../commands-legacy/application-type.md)
-[`Application version`](../commands-legacy/application-version.md)
-[`APPLY TO SELECTION`](../commands-legacy/apply-to-selection.md)
-[`Arctan`](../commands-legacy/arctan.md)
-[`ARRAY BLOB`](../commands-legacy/array-blob.md)
-[`ARRAY BOOLEAN`](../commands-legacy/array-boolean.md)
-[`ARRAY DATE`](../commands-legacy/array-date.md)
-[`ARRAY INTEGER`](../commands-legacy/array-integer.md)
-[`ARRAY LONGINT`](../commands-legacy/array-longint.md)
-[`ARRAY OBJECT`](../commands-legacy/array-object.md)
-[`ARRAY PICTURE`](../commands-legacy/array-picture.md)
-[`ARRAY POINTER`](../commands-legacy/array-pointer.md)
-[`ARRAY REAL`](../commands-legacy/array-real.md)
-[`ARRAY TEXT`](../commands-legacy/array-text.md)
-[`ARRAY TIME`](../commands-legacy/array-time.md)
-[`ARRAY TO COLLECTION`](../commands-legacy/array-to-collection.md)
-[`ARRAY TO LIST`](../commands-legacy/array-to-list.md)
-[`ARRAY TO SELECTION`](../commands-legacy/array-to-selection.md)
-[`ASSERT`](../commands-legacy/assert.md)
-[`Asserted`](../commands-legacy/asserted.md)
-[`Average`](../commands-legacy/average.md)
-
-B
-
-[`BACKUP`](../commands-legacy/backup.md)
-[`BACKUP INFO`](../commands-legacy/backup-info.md)
-[`BASE64 DECODE`](../commands-legacy/base64-decode.md)
-[`BASE64 ENCODE`](../commands-legacy/base64-encode.md)
-[`BEEP`](../commands-legacy/beep.md)
-[`Before`](../commands-legacy/before.md)
-[`Before selection`](../commands-legacy/before-selection.md)
-[`Begin SQL`](../commands-legacy/begin-sql.md)
-[`BLOB PROPERTIES`](../commands-legacy/blob-properties.md)
-[`BLOB size`](../commands-legacy/blob-size.md)
-[`BLOB TO DOCUMENT`](../commands-legacy/blob-to-document.md)
-[`BLOB to integer`](../commands-legacy/blob-to-integer.md)
-[`BLOB to list`](../commands-legacy/blob-to-list.md)
-[`BLOB to longint`](../commands-legacy/blob-to-longint.md)
-[`BLOB TO PICTURE`](../commands-legacy/blob-to-picture.md)
-[`BLOB to print settings`](../commands-legacy/blob-to-print-settings.md)
-[`BLOB to real`](../commands-legacy/blob-to-real.md)
-[`BLOB to text`](../commands-legacy/blob-to-text.md)
-[`BLOB TO USERS`](../commands-legacy/blob-to-users.md)
-[`BLOB TO VARIABLE`](../commands-legacy/blob-to-variable.md)
-[`Bool`](../commands-legacy/bool.md)
-[`BOOLEAN ARRAY FROM SET`](../commands-legacy/boolean-array-from-set.md)
-[`BREAK LEVEL`](../commands-legacy/break-level.md)
-[`BRING TO FRONT`](../commands-legacy/bring-to-front.md)
-[`BUILD APPLICATION`](../commands-legacy/build-application.md)
-
-C
-
-[`Cache info`](../commands-legacy/cache-info.md)
-[`Call chain`](call-chain.md)
-[`CALL FORM`](../commands-legacy/call-form.md)
-[`CALL SUBFORM CONTAINER`](../commands-legacy/call-subform-container.md)
-[`CALL WORKER`](../commands-legacy/call-worker.md)
-[`CANCEL`](../commands-legacy/cancel.md)
-[`CANCEL TRANSACTION`](../commands-legacy/cancel-transaction.md)
-[`Caps lock down`](../commands-legacy/caps-lock-down.md)
-[`CHANGE CURRENT USER`](../commands-legacy/change-current-user.md)
-[`CHANGE LICENSES`](../commands-legacy/change-licenses.md)
-[`CHANGE PASSWORD`](../commands-legacy/change-password.md)
-[`Change string`](../commands-legacy/change-string.md)
-[`Char`](../commands-legacy/char.md)
-[`Character code`](../commands-legacy/character-code.md)
-[`CHECK LOG FILE`](../commands-legacy/check-log-file.md)
-[`Choose`](../commands-legacy/choose.md)
-[`CLEAR LIST`](../commands-legacy/clear-list.md)
-[`CLEAR NAMED SELECTION`](../commands-legacy/clear-named-selection.md)
-[`CLEAR PASTEBOARD`](../commands-legacy/clear-pasteboard.md)
-[`CLEAR SEMAPHORE`](../commands-legacy/clear-semaphore.md)
-[`CLEAR SET`](../commands-legacy/clear-set.md)
-[`CLEAR VARIABLE`](../commands-legacy/clear-variable.md)
-[`Clickcount`](../commands-legacy/clickcount.md)
-[`CLOSE DOCUMENT`](../commands-legacy/close-document.md)
-[`CLOSE PRINTING JOB`](../commands-legacy/close-printing-job.md)
-[`CLOSE RESOURCE FILE`](../commands-legacy/close-resource-file.md)
-[`CLOSE WINDOW`](../commands-legacy/close-window.md)
-[`COLLECTION TO ARRAY`](../commands-legacy/collection-to-array.md)
-[`COMBINE PICTURES`](../commands-legacy/combine-pictures.md)
-[`Command name`](command-name.md)
-[`Compact data file`](../commands-legacy/compact-data-file.md)
-[`Compare strings`](../commands-legacy/compare-strings.md)
-[`Compile project`](compile-project.md)
-[`COMPONENT LIST`](../commands-legacy/component-list.md)
-[`COMPRESS BLOB`](../commands-legacy/compress-blob.md)
-[`CONFIRM`](../commands-legacy/confirm.md)
-[`Contextual click`](../commands-legacy/contextual-click.md)
-[`CONVERT COORDINATES`](../commands-legacy/convert-coordinates.md)
-[`CONVERT FROM TEXT`](../commands-legacy/convert-from-text.md)
-[`Convert path POSIX to system`](../commands-legacy/convert-path-posix-to-system.md)
-[`Convert path system to POSIX`](../commands-legacy/convert-path-system-to-posix.md)
-[`CONVERT PICTURE`](../commands-legacy/convert-picture.md)
-[`Convert to text`](../commands-legacy/convert-to-text.md)
-[`COPY ARRAY`](../commands-legacy/copy-array.md)
-[`COPY BLOB`](../commands-legacy/copy-blob.md)
-[`COPY DOCUMENT`](../commands-legacy/copy-document.md)
-[`Copy list`](../commands-legacy/copy-list.md)
-[`COPY NAMED SELECTION`](../commands-legacy/copy-named-selection.md)
-[`Copy parameters`](../commands-legacy/copy-parameters.md)
-[`COPY SET`](../commands-legacy/copy-set.md)
-[`Cos`](../commands-legacy/cos.md)
-[`Count in array`](../commands-legacy/count-in-array.md)
-[`Count list items`](../commands-legacy/count-list-items.md)
-[`Count menu items`](../commands-legacy/count-menu-items.md)
-[`Count menus`](../commands-legacy/count-menus.md)
-[`Count parameters`](../commands-legacy/count-parameters.md)
-[`Count screens`](../commands-legacy/count-screens.md)
-[`Count tasks`](../commands-legacy/count-tasks.md)
-[`Count user processes`](../commands-legacy/count-user-processes.md)
-[`Count users`](../commands-legacy/count-users.md)
-[`CREATE ALIAS`](../commands-legacy/create-alias.md)
-[`CREATE DATA FILE`](../commands-legacy/create-data-file.md)
-[`Create deployment license`](../commands-legacy/create-deployment-license.md)
-[`Create document`](../commands-legacy/create-document.md)
-[`CREATE EMPTY SET`](../commands-legacy/create-empty-set.md)
-[`Create entity selection`](create-entity-selection.md)
-[`CREATE FOLDER`](../commands-legacy/create-folder.md)
-[`CREATE INDEX`](../commands-legacy/create-index.md)
-[`Create menu`](../commands-legacy/create-menu.md)
-[`CREATE RECORD`](../commands-legacy/create-record.md)
-[`CREATE RELATED ONE`](../commands-legacy/create-related-one.md)
-[`CREATE SELECTION FROM ARRAY`](../commands-legacy/create-selection-from-array.md)
-[`CREATE SET`](../commands-legacy/create-set.md)
-[`CREATE SET FROM ARRAY`](../commands-legacy/create-set-from-array.md)
-[`CREATE THUMBNAIL`](../commands-legacy/create-thumbnail.md)
-[`cs`](cs.md)
-[`Current client authentication`](../commands-legacy/current-client-authentication.md)
-[`Current date`](../commands-legacy/current-date.md)
-[`Current default table`](../commands-legacy/current-default-table.md)
-[`Current form name`](../commands-legacy/current-form-name.md)
-[`Current form table`](../commands-legacy/current-form-table.md)
-[`Current form window`](../commands-legacy/current-form-window.md)
-[`Current machine`](../commands-legacy/current-machine.md)
-[`Current method name`](../commands-legacy/current-method-name.md)
-[`Current method path`](../commands-legacy/current-method-path.md)
-[`Current process`](../commands-legacy/current-process.md)
-[`Current process name`](../commands-legacy/current-process-name.md)
-[`Current system user`](../commands-legacy/current-system-user.md)
-[`Current time`](../commands-legacy/current-time.md)
-[`Current user`](../commands-legacy/current-user.md)
-[`CUT NAMED SELECTION`](../commands-legacy/cut-named-selection.md)
-
-D
-
-[`Data file`](../commands-legacy/data-file.md)
-[`Data file encryption status`](../commands-legacy/data-file-encryption-status.md)
-[`Database measures`](../commands-legacy/database-measures.md)
-[`Date`](../commands-legacy/date.md)
-[`Day number`](../commands-legacy/day-number.md)
-[`Day of`](../commands-legacy/day-of.md)
-[`Deactivated`](../commands-legacy/deactivated.md)
-[`Dec`](../commands-legacy/dec.md)
-[`DECRYPT BLOB`](../commands-legacy/decrypt-blob.md)
-[`Decrypt data BLOB`](../commands-legacy/decrypt-data-blob.md)
-[`DEFAULT TABLE`](../commands-legacy/default-table.md)
-[`DELAY PROCESS`](../commands-legacy/delay-process.md)
-[`DELETE DOCUMENT`](../commands-legacy/delete-document.md)
-[`DELETE FOLDER`](../commands-legacy/delete-folder.md)
-[`DELETE FROM ARRAY`](../commands-legacy/delete-from-array.md)
-[`DELETE FROM BLOB`](../commands-legacy/delete-from-blob.md)
-[`DELETE FROM LIST`](../commands-legacy/delete-from-list.md)
-[`DELETE INDEX`](../commands-legacy/delete-index.md)
-[`DELETE MENU ITEM`](../commands-legacy/delete-menu-item.md)
-[`DELETE RECORD`](../commands-legacy/delete-record.md)
-[`DELETE SELECTION`](../commands-legacy/delete-selection.md)
-[`Delete string`](../commands-legacy/delete-string.md)
-[`DELETE USER`](../commands-legacy/delete-user.md)
-[`DESCRIBE QUERY EXECUTION`](../commands-legacy/describe-query-execution.md)
-[`DIALOG`](dialog.md)
-[`DIFFERENCE`](../commands-legacy/difference.md)
-[`DISABLE MENU ITEM`](../commands-legacy/disable-menu-item.md)
-[`Discover data key`](../commands-legacy/discover-data-key.md)
-[`DISPLAY NOTIFICATION`](../commands-legacy/display-notification.md)
-[`DISPLAY RECORD`](../commands-legacy/display-record.md)
-[`DISPLAY SELECTION`](../commands-legacy/display-selection.md)
-[`Displayed line number`](../commands-legacy/displayed-line-number.md)
-[`DISTINCT ATTRIBUTE PATHS`](../commands-legacy/distinct-attribute-paths.md)
-[`DISTINCT ATTRIBUTE VALUES`](../commands-legacy/distinct-attribute-values.md)
-[`DISTINCT VALUES`](../commands-legacy/distinct-values.md)
-[`DOCUMENT LIST`](../commands-legacy/document-list.md)
-[`DOCUMENT TO BLOB`](../commands-legacy/document-to-blob.md)
-[`Document to text`](../commands-legacy/document-to-text.md)
-[`DOM Append XML child node`](../commands-legacy/dom-append-xml-child-node.md)
-[`DOM Append XML element`](../commands-legacy/dom-append-xml-element.md)
-[`DOM CLOSE XML`](../commands-legacy/dom-close-xml.md)
-[`DOM Count XML attributes`](../commands-legacy/dom-count-xml-attributes.md)
-[`DOM Count XML elements`](../commands-legacy/dom-count-xml-elements.md)
-[`DOM Create XML element`](../commands-legacy/dom-create-xml-element.md)
-[`DOM Create XML element arrays`](../commands-legacy/dom-create-xml-element-arrays.md)
-[`DOM Create XML Ref`](../commands-legacy/dom-create-xml-ref.md)
-[`DOM EXPORT TO FILE`](../commands-legacy/dom-export-to-file.md)
-[`DOM EXPORT TO VAR`](../commands-legacy/dom-export-to-var.md)
-[`DOM Find XML element`](../commands-legacy/dom-find-xml-element.md)
-[`DOM Find XML element by ID`](../commands-legacy/dom-find-xml-element-by-id.md)
-[`DOM Get first child XML element`](../commands-legacy/dom-get-first-child-xml-element.md)
-[`DOM Get last child XML element`](../commands-legacy/dom-get-last-child-xml-element.md)
-[`DOM Get next sibling XML element`](../commands-legacy/dom-get-next-sibling-xml-element.md)
-[`DOM Get parent XML element`](../commands-legacy/dom-get-parent-xml-element.md)
-[`DOM Get previous sibling XML element`](../commands-legacy/dom-get-previous-sibling-xml-element.md)
-[`DOM Get root XML element`](../commands-legacy/dom-get-root-xml-element.md)
-[`DOM GET XML ATTRIBUTE BY INDEX`](../commands-legacy/dom-get-xml-attribute-by-index.md)
-[`DOM GET XML ATTRIBUTE BY NAME`](../commands-legacy/dom-get-xml-attribute-by-name.md)
-[`DOM GET XML CHILD NODES`](../commands-legacy/dom-get-xml-child-nodes.md)
-[`DOM Get XML document ref`](../commands-legacy/dom-get-xml-document-ref.md)
-[`DOM Get XML element`](../commands-legacy/dom-get-xml-element.md)
-[`DOM GET XML ELEMENT NAME`](../commands-legacy/dom-get-xml-element-name.md)
-[`DOM GET XML ELEMENT VALUE`](../commands-legacy/dom-get-xml-element-value.md)
-[`DOM Get XML information`](../commands-legacy/dom-get-xml-information.md)
-[`DOM Insert XML element`](../commands-legacy/dom-insert-xml-element.md)
-[`DOM Parse XML source`](../commands-legacy/dom-parse-xml-source.md)
-[`DOM Parse XML variable`](../commands-legacy/dom-parse-xml-variable.md)
-[`DOM REMOVE XML ATTRIBUTE`](../commands-legacy/dom-remove-xml-attribute.md)
-[`DOM REMOVE XML ELEMENT`](../commands-legacy/dom-remove-xml-element.md)
-[`DOM SET XML ATTRIBUTE`](../commands-legacy/dom-set-xml-attribute.md)
-[`DOM SET XML DECLARATION`](../commands-legacy/dom-set-xml-declaration.md)
-[`DOM SET XML ELEMENT NAME`](../commands-legacy/dom-set-xml-element-name.md)
-[`DOM SET XML ELEMENT VALUE`](../commands-legacy/dom-set-xml-element-value.md)
-[`DRAG WINDOW`](../commands-legacy/drag-window.md)
-[`Drop position`](../commands-legacy/drop-position.md)
-[`DROP REMOTE USER`](../commands-legacy/drop-remote-user.md)
-[`ds`](ds.md)
-[`DUPLICATE RECORD`](../commands-legacy/duplicate-record.md)
-[`Dynamic pop up menu`](../commands-legacy/dynamic-pop-up-menu.md)
-
-E
-
-[`EDIT ACCESS`](../commands-legacy/edit-access.md)
-[`EDIT FORMULA`](../commands-legacy/edit-formula.md)
-[`EDIT ITEM`](../commands-legacy/edit-item.md)
-[`ENABLE MENU ITEM`](../commands-legacy/enable-menu-item.md)
-[`ENCRYPT BLOB`](../commands-legacy/encrypt-blob.md)
-[`Encrypt data BLOB`](../commands-legacy/encrypt-data-blob.md)
-
-[`Encrypt data file`](../commands-legacy/encrypt-data-file.md)
-[`End selection`](../commands-legacy/end-selection.md)
-[`End SQL`](../commands-legacy/end-sql.md)
-[`Equal pictures`](../commands-legacy/equal-pictures.md)
-[`ERASE WINDOW`](../commands-legacy/erase-window.md)
-[`Euro converter`](../commands-legacy/euro-converter.md)
-[`EXECUTE FORMULA`](../commands-legacy/execute-formula.md)
-[`EXECUTE METHOD`](../commands-legacy/execute-method.md)
-[`EXECUTE METHOD IN SUBFORM`](../commands-legacy/execute-method-in-subform.md)
-[`EXECUTE ON CLIENT`](../commands-legacy/execute-on-client.md)
-[`Execute on server`](../commands-legacy/execute-on-server.md)
-[`Exp`](../commands-legacy/exp.md)
-[`EXPAND BLOB`](../commands-legacy/expand-blob.md)
-[`EXPORT DATA`](../commands-legacy/export-data.md)
-[`EXPORT DIF`](../commands-legacy/export-dif.md)
-[`EXPORT STRUCTURE`](../commands-legacy/export-structure.md)
-[`Export structure file`](../commands-legacy/export-structure-file.md)
-[`EXPORT SYLK`](../commands-legacy/export-sylk.md)
-[`EXPORT TEXT`](../commands-legacy/export-text.md)
-
-F
-
-[`False`](../commands-legacy/false.md)
-[`Field`](../commands-legacy/field.md)
-[`Field name`](../commands-legacy/field-name.md)
-[`File`](file.md)
-[`FILTER EVENT`](../commands-legacy/filter-event.md)
-[`FILTER KEYSTROKE`](../commands-legacy/filter-keystroke.md)
-[`Find in array`](../commands-legacy/find-in-array.md)
-[`Find in field`](../commands-legacy/find-in-field.md)
-[`Find in list`](../commands-legacy/find-in-list.md)
-[`Find in sorted array`](../commands-legacy/find-in-sorted-array.md)
-[`Find window`](../commands-legacy/find-window.md)
-[`FIRST RECORD`](../commands-legacy/first-record.md)
-[`FLUSH CACHE`](../commands-legacy/flush-cache.md)
-[`Focus object`](../commands-legacy/focus-object.md)
-[`Folder`](folder.md)
-[`FOLDER LIST`](../commands-legacy/folder-list.md)
-[`Font file`](../commands-legacy/font-file.md)
-[`FONT LIST`](../commands-legacy/font-list.md)
-[`FONT STYLE LIST`](../commands-legacy/font-style-list.md)
-[`Form`](form.md)
-[`FORM Convert to dynamic`](../commands-legacy/form-convert-to-dynamic.md)
-[`FORM EDIT`](form-edit.md)
-[`FORM Event`](form-event.md)
-[`Form event code`](form-event-code.md)
-[`FORM FIRST PAGE`](../commands-legacy/form-first-page.md)
-[`FORM Get color scheme`](../commands-legacy/form-get-color-scheme.md)
-[`FORM Get current page`](../commands-legacy/form-get-current-page.md)
-[`FORM GET ENTRY ORDER`](../commands-legacy/form-get-entry-order.md)
-[`FORM GET HORIZONTAL RESIZING`](../commands-legacy/form-get-horizontal-resizing.md)
-[`FORM GET NAMES`](../commands-legacy/form-get-names.md)
-[`FORM GET OBJECTS`](../commands-legacy/form-get-objects.md)
-[`FORM GET PROPERTIES`](../commands-legacy/form-get-properties.md)
-[`FORM GET VERTICAL RESIZING`](../commands-legacy/form-get-vertical-resizing.md)
-[`FORM GOTO PAGE`](../commands-legacy/form-goto-page.md)
-[`FORM LAST PAGE`](../commands-legacy/form-last-page.md)
-[`FORM LOAD`](form-load.md)
-[`FORM NEXT PAGE`](../commands-legacy/form-next-page.md)
-[`FORM PREVIOUS PAGE`](../commands-legacy/form-previous-page.md)
-[`FORM SCREENSHOT`](../commands-legacy/form-screenshot.md)
-[`FORM SET ENTRY ORDER`](../commands-legacy/form-set-entry-order.md)
-[`FORM SET HORIZONTAL RESIZING`](../commands-legacy/form-set-horizontal-resizing.md)
-[`FORM SET INPUT`](../commands-legacy/form-set-input.md)
-[`FORM SET OUTPUT`](../commands-legacy/form-set-output.md)
-[`FORM SET SIZE`](../commands-legacy/form-set-size.md)
-[`FORM SET VERTICAL RESIZING`](../commands-legacy/form-set-vertical-resizing.md)
-[`FORM UNLOAD`](../commands-legacy/form-unload.md)
-[`Formula`](formula.md)
-[`Formula from string`](formula-from-string.md)
-[`Frontmost process`](../commands-legacy/frontmost-process.md)
-[`Frontmost window`](../commands-legacy/frontmost-window.md)
-
-G
-
-[`GENERATE CERTIFICATE REQUEST`](../commands-legacy/generate-certificate-request.md)
-[`Generate digest`](../commands-legacy/generate-digest.md)
-[`GENERATE ENCRYPTION KEYPAIR`](../commands-legacy/generate-encryption-keypair.md)
-[`Generate password hash`](../commands-legacy/generate-password-hash.md)
-[`Generate UUID`](../commands-legacy/generate-uuid.md)
-[`Get 4D file`](../commands-legacy/get-4d-file.md)
-[`Get 4D folder`](../commands-legacy/get-4d-folder.md)
-[`Get adjusted blobs cache priority`](../commands-legacy/get-adjusted-blobs-cache-priority.md)
-[`Get adjusted index cache priority`](../commands-legacy/get-adjusted-index-cache-priority.md)
-[`Get adjusted table cache priority`](../commands-legacy/get-adjusted-table-cache-priority.md)
-[`GET ALLOWED METHODS`](../commands-legacy/get-allowed-methods.md)
-[`Get Application color scheme`](../commands-legacy/get-application-color-scheme.md)
-[`Get assert enabled`](../commands-legacy/get-assert-enabled.md)
-[`GET AUTOMATIC RELATIONS`](../commands-legacy/get-automatic-relations.md)
-[`Get cache size`](../commands-legacy/get-cache-size.md)
-[`Get current printer`](../commands-legacy/get-current-printer.md)
-[`Get database localization`](../commands-legacy/get-database-localization.md)
-[`Get database parameter`](../commands-legacy/get-database-parameter.md)
-[`Get default user`](../commands-legacy/get-default-user.md)
-[`GET DOCUMENT ICON`](../commands-legacy/get-document-icon.md)
-[`Get document position`](../commands-legacy/get-document-position.md)
-[`GET DOCUMENT PROPERTIES`](../commands-legacy/get-document-properties.md)
-[`Get document size`](../commands-legacy/get-document-size.md)
-[`Get edited text`](../commands-legacy/get-edited-text.md)
-[`Get external data path`](../commands-legacy/get-external-data-path.md)
-[`GET FIELD ENTRY PROPERTIES`](../commands-legacy/get-field-entry-properties.md)
-[`GET FIELD PROPERTIES`](../commands-legacy/get-field-properties.md)
-[`GET FIELD RELATION`](../commands-legacy/get-field-relation.md)
-[`GET FIELD TITLES`](../commands-legacy/get-field-titles.md)
-[`Get file from pasteboard`](../commands-legacy/get-file-from-pasteboard.md)
-[`Get group access`](../commands-legacy/get-group-access.md)
-[`GET GROUP LIST`](../commands-legacy/get-group-list.md)
-[`GET GROUP PROPERTIES`](../commands-legacy/get-group-properties.md)
-[`GET HIGHLIGHT`](../commands-legacy/get-highlight.md)
-[`GET HIGHLIGHTED RECORDS`](../commands-legacy/get-highlighted-records.md)
-[`Get indexed string`](../commands-legacy/get-indexed-string.md)
-[`Last update log path`](../commands-legacy/last-update-log-path.md)
-[`GET LIST ITEM`](../commands-legacy/get-list-item.md)
-[`Get list item font`](../commands-legacy/get-list-item-font.md)
-[`GET LIST ITEM ICON`](../commands-legacy/get-list-item-icon.md)
-[`GET LIST ITEM PARAMETER`](../commands-legacy/get-list-item-parameter.md)
-[`GET LIST ITEM PARAMETER ARRAYS`](../commands-legacy/get-list-item-parameter-arrays.md)
-[`GET LIST ITEM PROPERTIES`](../commands-legacy/get-list-item-properties.md)
-[`GET LIST PROPERTIES`](../commands-legacy/get-list-properties.md)
-[`GET MACRO PARAMETER`](../commands-legacy/get-macro-parameter.md)
-[`Get menu bar reference`](../commands-legacy/get-menu-bar-reference.md)
-[`Get menu item`](../commands-legacy/get-menu-item.md)
-[`GET MENU ITEM ICON`](../commands-legacy/get-menu-item-icon.md)
-[`Get menu item key`](../commands-legacy/get-menu-item-key.md)
-[`Get menu item mark`](../commands-legacy/get-menu-item-mark.md)
-[`Get menu item method`](../commands-legacy/get-menu-item-method.md)
-[`Get menu item modifiers`](../commands-legacy/get-menu-item-modifiers.md)
-[`Get menu item parameter`](../commands-legacy/get-menu-item-parameter.md)
-[`GET MENU ITEM PROPERTY`](../commands-legacy/get-menu-item-property.md)
-[`Get menu item style`](../commands-legacy/get-menu-item-style.md)
-[`GET MENU ITEMS`](../commands-legacy/get-menu-items.md)
-[`Get menu title`](../commands-legacy/get-menu-title.md)
-[`GET MISSING TABLE NAMES`](../commands-legacy/get-missing-table-names.md)
-[`GET PASTEBOARD DATA`](../commands-legacy/get-pasteboard-data.md)
-[`GET PASTEBOARD DATA TYPE`](../commands-legacy/get-pasteboard-data-type.md)
-[`Get picture file name`](../commands-legacy/get-picture-file-name.md)
-[`GET PICTURE FORMATS`](../commands-legacy/get-picture-formats.md)
-[`GET PICTURE FROM LIBRARY`](../commands-legacy/get-picture-from-library.md)
-[`GET PICTURE FROM PASTEBOARD`](../commands-legacy/get-picture-from-pasteboard.md)
-[`GET PICTURE KEYWORDS`](../commands-legacy/get-picture-keywords.md)
-[`GET PICTURE METADATA`](../commands-legacy/get-picture-metadata.md)
-[`GET PICTURE RESOURCE`](../commands-legacy/get-picture-resource.md)
-[`Get plugin access`](../commands-legacy/get-plugin-access.md)
-[`Get pointer`](../commands-legacy/get-pointer.md)
-[`Get print marker`](../commands-legacy/get-print-marker.md)
-[`GET PRINT OPTION`](../commands-legacy/get-print-option.md)
-[`Get print preview`](../commands-legacy/get-print-preview.md)
-[`GET PRINTABLE AREA`](../commands-legacy/get-printable-area.md)
-[`GET PRINTABLE MARGIN`](../commands-legacy/get-printable-margin.md)
-[`Get printed height`](../commands-legacy/get-printed-height.md)
-[`GET PROCESS VARIABLE`](../commands-legacy/get-process-variable.md)
-[`GET QUERY DESTINATION`](../commands-legacy/get-query-destination.md)
-[`Get query limit`](../commands-legacy/get-query-limit.md)
-[`GET REGISTERED CLIENTS`](../commands-legacy/get-registered-clients.md)
-[`GET RELATION PROPERTIES`](../commands-legacy/get-relation-properties.md)
-[`GET RESOURCE`](../commands-legacy/get-resource.md)
-[`Get resource name`](../commands-legacy/get-resource-name.md)
-[`Get resource properties`](../commands-legacy/get-resource-properties.md)
-[`Get selected menu item parameter`](../commands-legacy/get-selected-menu-item-parameter.md)
-[`GET SERIAL PORT MAPPING`](../commands-legacy/get-serial-port-mapping.md)
-[`Get string resource`](../commands-legacy/get-string-resource.md)
-[`GET STYLE SHEET INFO`](../commands-legacy/get-style-sheet-info.md)
-[`Get subrecord key`](../commands-legacy/get-subrecord-key.md)
-[`GET SYSTEM FORMAT`](../commands-legacy/get-system-format.md)
-[`GET TABLE PROPERTIES`](../commands-legacy/get-table-properties.md)
-[`GET TABLE TITLES`](../commands-legacy/get-table-titles.md)
-[`Get text from pasteboard`](../commands-legacy/get-text-from-pasteboard.md)
-[`GET TEXT KEYWORDS`](../commands-legacy/get-text-keywords.md)
-[`Get text resource`](../commands-legacy/get-text-resource.md)
-[`GET USER LIST`](../commands-legacy/get-user-list.md)
-[`GET USER PROPERTIES`](../commands-legacy/get-user-properties.md)
-[`GET WINDOW RECT`](../commands-legacy/get-window-rect.md)
-[`Get window title`](../commands-legacy/get-window-title.md)
-[`GOTO OBJECT`](../commands-legacy/goto-object.md)
-[`GOTO RECORD`](../commands-legacy/goto-record.md)
-[`GOTO SELECTED RECORD`](../commands-legacy/goto-selected-record.md)
-[`GOTO XY`](../commands-legacy/goto-xy.md)
-[`GRAPH`](../commands-legacy/graph.md)
-[`GRAPH SETTINGS`](../commands-legacy/graph-settings.md)
-
-H
-
-[`HIDE MENU BAR`](../commands-legacy/hide-menu-bar.md)
-[`HIDE PROCESS`](../commands-legacy/hide-process.md)
-[`HIDE TOOL BAR`](../commands-legacy/hide-tool-bar.md)
-[`HIDE WINDOW`](../commands-legacy/hide-window.md)
-[`HIGHLIGHT RECORDS`](../commands-legacy/highlight-records.md)
-[`HIGHLIGHT TEXT`](../commands-legacy/highlight-text.md)
-[`HTTP AUTHENTICATE`](../commands-legacy/http-authenticate.md)
-[`HTTP Get`](../commands-legacy/http-get.md)
-[`HTTP Get certificates folder`](../commands-legacy/http-get-certificates-folder.md)
-[`HTTP GET OPTION`](../commands-legacy/http-get-option.md)
-[`HTTP Parse message`](http-parse-message.md)
-[`HTTP Request`](../commands-legacy/http-request.md)
-[`HTTP SET CERTIFICATES FOLDER`](../commands-legacy/http-set-certificates-folder.md)
-[`HTTP SET OPTION`](../commands-legacy/http-set-option.md)
-
-I
-
-[`IDLE`](../commands-legacy/idle.md)
-[`IMAP New transporter`](imap-new-transporter.md)
-[`IMPORT DATA`](../commands-legacy/import-data.md)
-[`IMPORT DIF`](../commands-legacy/import-dif.md)
-[`IMPORT STRUCTURE`](../commands-legacy/import-structure.md)
-[`IMPORT SYLK`](../commands-legacy/import-sylk.md)
-[`IMPORT TEXT`](../commands-legacy/import-text.md)
-[`In break`](../commands-legacy/in-break.md)
-[`In footer`](../commands-legacy/in-footer.md)
-[`In header`](../commands-legacy/in-header.md)
-[`In transaction`](../commands-legacy/in-transaction.md)
-[`INSERT IN ARRAY`](../commands-legacy/insert-in-array.md)
-[`INSERT IN BLOB`](../commands-legacy/insert-in-blob.md)
-[`INSERT IN LIST`](../commands-legacy/insert-in-list.md)
-[`INSERT MENU ITEM`](../commands-legacy/insert-menu-item.md)
-[`Insert string`](../commands-legacy/insert-string.md)
-[`Int`](../commands-legacy/int.md)
-[`INTEGER TO BLOB`](../commands-legacy/integer-to-blob.md)
-[`INTEGRATE MIRROR LOG FILE`](../commands-legacy/integrate-mirror-log-file.md)
-[`INTERSECTION`](../commands-legacy/intersection.md)
-[`INVOKE ACTION`](../commands-legacy/invoke-action.md)
-[`Is a list`](../commands-legacy/is-a-list.md)
-[`Is a variable`](../commands-legacy/is-a-variable.md)
-[`Is compiled mode`](../commands-legacy/is-compiled-mode.md)
-[`Is data file locked`](../commands-legacy/is-data-file-locked.md)
-[`Is editing text`](../commands-legacy/is-editing-text.md)
-[`Is field number valid`](../commands-legacy/is-field-number-valid.md)
-[`Is field value Null`](../commands-legacy/is-field-value-null.md)
-[`Is in print preview`](../commands-legacy/is-in-print-preview.md)
-[`Is in set`](../commands-legacy/is-in-set.md)
-[`Is license available`](../commands-legacy/is-license-available.md)
-[`Is macOS`](../commands-legacy/is-macos.md)
-[`Is new record`](../commands-legacy/is-new-record.md)
-[`Is nil pointer`](../commands-legacy/is-nil-pointer.md)
-[`Is picture file`](../commands-legacy/is-picture-file.md)
-[`Is record loaded`](../commands-legacy/is-record-loaded.md)
-[`Is table number valid`](../commands-legacy/is-table-number-valid.md)
-[`Is user deleted`](../commands-legacy/is-user-deleted.md)
-[`Is waiting mouse up`](../commands-legacy/is-waiting-mouse-up.md)
-[`Is window maximized`](../commands-legacy/is-window-maximized.md)
-[`Is window reduced`](../commands-legacy/is-window-reduced.md)
-[`Is Windows`](../commands-legacy/is-windows.md)
-
-J
-
-[`JSON Parse`](../commands-legacy/json-parse.md)
-[`JSON PARSE ARRAY`](../commands-legacy/json-parse-array.md)
-[`JSON Resolve pointers`](../commands-legacy/json-resolve-pointers.md)
-[`JSON Stringify`](../commands-legacy/json-stringify.md)
-[`JSON Stringify array`](../commands-legacy/json-stringify-array.md)
-[`JSON TO SELECTION`](../commands-legacy/json-to-selection.md)
-[`JSON Validate`](../commands-legacy/json-validate.md)
-
-K
-
-[`Keystroke`](../commands-legacy/keystroke.md)
-[`KILL WORKER`](../commands-legacy/kill-worker.md)
-
-L
-
-[`Last errors`](../commands-legacy/last-errors.md)
-[`Last field number`](../commands-legacy/last-field-number.md)
-[`Last query path`](../commands-legacy/last-query-path.md)
-[`Last query plan`](../commands-legacy/last-query-plan.md)
-[`LAST RECORD`](../commands-legacy/last-record.md)
-[`Last table number`](../commands-legacy/last-table-number.md)
-[`LAUNCH EXTERNAL PROCESS`](../commands-legacy/launch-external-process.md)
-[`LDAP LOGIN`](../commands-legacy/ldap-login.md)
-[`LDAP LOGOUT`](../commands-legacy/ldap-logout.md)
-[`LDAP Search`](../commands-legacy/ldap-search.md)
-[`LDAP SEARCH ALL`](../commands-legacy/ldap-search-all.md)
-[`Length`](../commands-legacy/length.md)
-[`Level`](../commands-legacy/level.md)
-[`License info`](license-info.md)
-[`License usage`](../commands-legacy/license-usage.md)
-[`List item parent`](../commands-legacy/list-item-parent.md)
-[`List item position`](../commands-legacy/list-item-position.md)
-[`LIST OF CHOICE LISTS`](../commands-legacy/list-of-choice-lists.md)
-[`LIST OF STYLE SHEETS`](../commands-legacy/list-of-style-sheets.md)
-[`LIST TO ARRAY`](../commands-legacy/list-to-array.md)
-[`LIST TO BLOB`](../commands-legacy/list-to-blob.md)
-[`LISTBOX COLLAPSE`](../commands-legacy/listbox-collapse.md)
-[`LISTBOX DELETE COLUMN`](../commands-legacy/listbox-delete-column.md)
-[`LISTBOX DELETE ROWS`](../commands-legacy/listbox-delete-rows.md)
-[`LISTBOX DUPLICATE COLUMN`](../commands-legacy/listbox-duplicate-column.md)
-[`LISTBOX EXPAND`](../commands-legacy/listbox-expand.md)
-[`LISTBOX Get array`](../commands-legacy/listbox-get-array.md)
-[`LISTBOX GET ARRAYS`](../commands-legacy/listbox-get-arrays.md)
-[`LISTBOX Get auto row height`](../commands-legacy/listbox-get-auto-row-height.md)
-[`LISTBOX GET CELL COORDINATES`](../commands-legacy/listbox-get-cell-coordinates.md)
-[`LISTBOX GET CELL POSITION`](../commands-legacy/listbox-get-cell-position.md)
-[`LISTBOX Get column formula`](../commands-legacy/listbox-get-column-formula.md)
-[`LISTBOX Get column width`](../commands-legacy/listbox-get-column-width.md)
-[`LISTBOX Get footer calculation`](../commands-legacy/listbox-get-footer-calculation.md)
-[`LISTBOX Get footers height`](../commands-legacy/listbox-get-footers-height.md)
-[`LISTBOX GET GRID`](../commands-legacy/listbox-get-grid.md)
-[`LISTBOX GET GRID COLORS`](../commands-legacy/listbox-get-grid-colors.md)
-[`LISTBOX Get headers height`](../commands-legacy/listbox-get-headers-height.md)
-[`LISTBOX GET HIERARCHY`](../commands-legacy/listbox-get-hierarchy.md)
-[`LISTBOX Get locked columns`](../commands-legacy/listbox-get-locked-columns.md)
-[`LISTBOX Get number of columns`](../commands-legacy/listbox-get-number-of-columns.md)
-[`LISTBOX Get number of rows`](../commands-legacy/listbox-get-number-of-rows.md)
-[`LISTBOX GET OBJECTS`](../commands-legacy/listbox-get-objects.md)
-[`LISTBOX GET PRINT INFORMATION`](../commands-legacy/listbox-get-print-information.md)
-[`LISTBOX Get property`](../commands-legacy/listbox-get-property.md)
-[`LISTBOX Get row color`](../commands-legacy/listbox-get-row-color.md)
-[`LISTBOX Get row color as number`](../commands-legacy/listbox-get-row-color-as-number.md)
-[`LISTBOX Get row font style`](../commands-legacy/listbox-get-row-font-style.md)
-[`LISTBOX Get row height`](../commands-legacy/listbox-get-row-height.md)
-[`LISTBOX Get rows height`](../commands-legacy/listbox-get-rows-height.md)
-[`LISTBOX Get static columns`](../commands-legacy/listbox-get-static-columns.md)
-[`LISTBOX GET TABLE SOURCE`](../commands-legacy/listbox-get-table-source.md)
-[`LISTBOX INSERT COLUMN`](../commands-legacy/listbox-insert-column.md)
-[`LISTBOX INSERT COLUMN FORMULA`](../commands-legacy/listbox-insert-column-formula.md)
-[`LISTBOX INSERT ROWS`](../commands-legacy/listbox-insert-rows.md)
-[`LISTBOX MOVE COLUMN`](../commands-legacy/listbox-move-column.md)
-[`LISTBOX MOVED COLUMN NUMBER`](../commands-legacy/listbox-moved-column-number.md)
-[`LISTBOX MOVED ROW NUMBER`](../commands-legacy/listbox-moved-row-number.md)
-[`LISTBOX SELECT BREAK`](../commands-legacy/listbox-select-break.md)
-[`LISTBOX SELECT ROW`](../commands-legacy/listbox-select-row.md)
-[`LISTBOX SELECT ROWS`](../commands-legacy/listbox-select-rows.md)
-[`LISTBOX SET ARRAY`](../commands-legacy/listbox-set-array.md)
-[`LISTBOX SET AUTO ROW HEIGHT`](../commands-legacy/listbox-set-auto-row-height.md)
-[`LISTBOX SET COLUMN FORMULA`](../commands-legacy/listbox-set-column-formula.md)
-[`LISTBOX SET COLUMN WIDTH`](../commands-legacy/listbox-set-column-width.md)
-[`LISTBOX SET FOOTER CALCULATION`](../commands-legacy/listbox-set-footer-calculation.md)
-[`LISTBOX SET FOOTERS HEIGHT`](../commands-legacy/listbox-set-footers-height.md)
-[`LISTBOX SET GRID`](../commands-legacy/listbox-set-grid.md)
-[`LISTBOX SET GRID COLOR`](../commands-legacy/listbox-set-grid-color.md)
-[`LISTBOX SET HEADERS HEIGHT`](../commands-legacy/listbox-set-headers-height.md)
-[`LISTBOX SET HIERARCHY`](../commands-legacy/listbox-set-hierarchy.md)
-[`LISTBOX SET LOCKED COLUMNS`](../commands-legacy/listbox-set-locked-columns.md)
-[`LISTBOX SET PROPERTY`](../commands-legacy/listbox-set-property.md)
-[`LISTBOX SET ROW COLOR`](../commands-legacy/listbox-set-row-color.md)
-[`LISTBOX SET ROW FONT STYLE`](../commands-legacy/listbox-set-row-font-style.md)
-[`LISTBOX SET ROW HEIGHT`](../commands-legacy/listbox-set-row-height.md)
-[`LISTBOX SET ROWS HEIGHT`](../commands-legacy/listbox-set-rows-height.md)
-[`LISTBOX SET STATIC COLUMNS`](../commands-legacy/listbox-set-static-columns.md)
-[`LISTBOX SET TABLE SOURCE`](../commands-legacy/listbox-set-table-source.md)
-[`LISTBOX SORT COLUMNS`](../commands-legacy/listbox-sort-columns.md)
-[`Load 4D View document`](../commands-legacy/load-4d-view-document.md)
-[`Load list`](../commands-legacy/load-list.md)
-[`LOAD RECORD`](../commands-legacy/load-record.md)
-[`LOAD SET`](../commands-legacy/load-set.md)
-[`LOAD VARIABLES`](../commands-legacy/load-variables.md)
-[`Localized document path`](../commands-legacy/localized-document-path.md)
-[`Localized string`](../commands-legacy/localized-string.md)
-[`Locked`](../commands-legacy/locked.md)
-[`LOCKED BY`](../commands-legacy/locked-by.md)
-[`Locked records info`](../commands-legacy/locked-records-info.md)
-[`Log`](../commands-legacy/log.md)
-[`LOG EVENT`](../commands-legacy/log-event.md)
-[`Log File`](../commands-legacy/log-file.md)
-[`LOG FILE TO JSON`](../commands-legacy/log-file-to-json.md)
-[`LONGINT ARRAY FROM SELECTION`](../commands-legacy/longint-array-from-selection.md)
-[`LONGINT TO BLOB`](../commands-legacy/longint-to-blob.md)
-[`Lowercase`](../commands-legacy/lowercase.md)
-
-M
-
-[`Macintosh command down`](../commands-legacy/macintosh-command-down.md)
-[`Macintosh control down`](../commands-legacy/macintosh-control-down.md)
-[`Macintosh option down`](../commands-legacy/macintosh-option-down.md)
-[`MAIL Convert from MIME`](mail-convert-from-mime.md)
-[`MAIL Convert to MIME`](mail-convert-to-mime.md)
-[`MAIL New attachment`](mail-new-attachment.md)
-[`Match regex`](../commands-legacy/match-regex.md)
-[`Max`](../commands-legacy/max.md)
-[`MAXIMIZE WINDOW`](../commands-legacy/maximize-window.md)
-[`MEMORY STATISTICS`](../commands-legacy/memory-statistics.md)
-[`Menu bar height`](../commands-legacy/menu-bar-height.md)
-[`Menu bar screen`](../commands-legacy/menu-bar-screen.md)
-[`Menu selected`](../commands-legacy/menu-selected.md)
-[`MESSAGE`](../commands-legacy/message.md)
-[`MESSAGES OFF`](../commands-legacy/messages-off.md)
-[`MESSAGES ON`](../commands-legacy/messages-on.md)
-[`Method called on error`](../commands-legacy/method-called-on-error.md)
-[`Method called on event`](../commands-legacy/method-called-on-event.md)
-[`METHOD Get attribute`](../commands-legacy/method-get-attribute.md)
-[`METHOD GET ATTRIBUTES`](../commands-legacy/method-get-attributes.md)
-[`METHOD GET CODE`](../commands-legacy/method-get-code.md)
-[`METHOD GET COMMENTS`](../commands-legacy/method-get-comments.md)
-[`METHOD GET FOLDERS`](../commands-legacy/method-get-folders.md)
-[`METHOD GET MODIFICATION DATE`](../commands-legacy/method-get-modification-date.md)
-[`METHOD GET NAMES`](../commands-legacy/method-get-names.md)
-[`METHOD Get path`](../commands-legacy/method-get-path.md)
-[`METHOD GET PATHS`](../commands-legacy/method-get-paths.md)
-[`METHOD GET PATHS FORM`](../commands-legacy/method-get-paths-form.md)
-[`METHOD OPEN PATH`](../commands-legacy/method-open-path.md)
-[`METHOD RESOLVE PATH`](../commands-legacy/method-resolve-path.md)
-[`METHOD SET ACCESS MODE`](../commands-legacy/method-set-access-mode.md)
-[`METHOD SET ATTRIBUTE`](../commands-legacy/method-set-attribute.md)
-[`METHOD SET ATTRIBUTES`](../commands-legacy/method-set-attributes.md)
-[`METHOD SET CODE`](../commands-legacy/method-set-code.md)
-[`METHOD SET COMMENTS`](../commands-legacy/method-set-comments.md)
-[`Milliseconds`](../commands-legacy/milliseconds.md)
-[`Min`](../commands-legacy/min.md)
-[`MINIMIZE WINDOW`](../commands-legacy/minimize-window.md)
-[`MOBILE APP REFRESH SESSIONS`](../commands-legacy/mobile-app-refresh-sessions.md)
-[`Mod`](../commands-legacy/mod.md)
-[`Modified`](../commands-legacy/modified.md)
-[`Modified record`](../commands-legacy/modified-record.md)
-[`MODIFY RECORD`](../commands-legacy/modify-record.md)
-[`MODIFY SELECTION`](../commands-legacy/modify-selection.md)
-[`Monitored activity`](../commands-legacy/monitored-activity.md)
-[`Month of`](../commands-legacy/month-of.md)
-[`MOUSE POSITION`](../commands-legacy/mouse-position.md)
-[`MOVE DOCUMENT`](../commands-legacy/move-document.md)
-[`MULTI SORT ARRAY`](../commands-legacy/multi-sort-array.md)
-
-N
-
-[`New collection`](new-collection.md)
-[`New data key`](../commands-legacy/new-data-key.md)
-[`New list`](../commands-legacy/new-list.md)
-[`New log file`](new-log-file.md)
-[`New object`](../commands-legacy/new-object.md)
-[`New process`](../commands-legacy/new-process.md)
-[`New shared collection`](new-shared-collection.md)
-[`New shared object`](../commands-legacy/new-shared-object.md)
-[`New signal`](new-signal.md)
-[`NEXT RECORD`](../commands-legacy/next-record.md)
-[`Next window`](../commands-legacy/next-window.md)
-[`NO DEFAULT TABLE`](../commands-legacy/no-default-table.md)
-[`Not`](../commands-legacy/not.md)
-[`NOTIFY RESOURCES FOLDER MODIFICATION`](../commands-legacy/notify-resources-folder-modification.md)
-[`Null`](../commands-legacy/null.md)
-[`Num`](../commands-legacy/num.md)
-
-O
-
-[`OB Class`](../commands-legacy/ob-class.md)
-[`OB Copy`](../commands-legacy/ob-copy.md)
-[`OB Entries`](../commands-legacy/ob-entries.md)
-[`OB Get`](../commands-legacy/ob-get.md)
-[`OB GET ARRAY`](../commands-legacy/ob-get-array.md)
-[`OB GET PROPERTY NAMES`](../commands-legacy/ob-get-property-names.md)
-[`OB Get type`](../commands-legacy/ob-get-type.md)
-[`OB Instance of`](../commands-legacy/ob-instance-of.md)
-[`OB Is defined`](../commands-legacy/ob-is-defined.md)
-[`OB Is empty`](../commands-legacy/ob-is-empty.md)
-[`OB Is shared`](../commands-legacy/ob-is-shared.md)
-[`OB Keys`](../commands-legacy/ob-keys.md)
-[`OB REMOVE`](../commands-legacy/ob-remove.md)
-[`OB SET`](../commands-legacy/ob-set.md)
-[`OB SET ARRAY`](../commands-legacy/ob-set-array.md)
-[`OB SET NULL`](../commands-legacy/ob-set-null.md)
-[`OB Values`](../commands-legacy/ob-values.md)
-[`OBJECT DUPLICATE`](../commands-legacy/object-duplicate.md)
-[`OBJECT Get action`](../commands-legacy/object-get-action.md)
-[`OBJECT Get auto spellcheck`](../commands-legacy/object-get-auto-spellcheck.md)
-[`OBJECT GET BEST SIZE`](../commands-legacy/object-get-best-size.md)
-[`OBJECT Get border style`](../commands-legacy/object-get-border-style.md)
-[`OBJECT Get context menu`](../commands-legacy/object-get-context-menu.md)
-[`OBJECT GET COORDINATES`](../commands-legacy/object-get-coordinates.md)
-[`OBJECT Get corner radius`](../commands-legacy/object-get-corner-radius.md)
-[`OBJECT Get data source`](../commands-legacy/object-get-data-source.md)
-[`OBJECT GET DRAG AND DROP OPTIONS`](../commands-legacy/object-get-drag-and-drop-options.md)
-[`OBJECT Get enabled`](../commands-legacy/object-get-enabled.md)
-[`OBJECT Get enterable`](../commands-legacy/object-get-enterable.md)
-[`OBJECT GET EVENTS`](../commands-legacy/object-get-events.md)
-[`OBJECT Get filter`](../commands-legacy/object-get-filter.md)
-[`OBJECT Get focus rectangle invisible`](../commands-legacy/object-get-focus-rectangle-invisible.md)
-[`OBJECT Get font`](../commands-legacy/object-get-font.md)
-[`OBJECT Get font size`](../commands-legacy/object-get-font-size.md)
-[`OBJECT Get font style`](../commands-legacy/object-get-font-style.md)
-[`OBJECT Get format`](../commands-legacy/object-get-format.md)
-[`OBJECT Get help tip`](../commands-legacy/object-get-help-tip.md)
-[`OBJECT Get horizontal alignment`](../commands-legacy/object-get-horizontal-alignment.md)
-[`OBJECT Get indicator type`](../commands-legacy/object-get-indicator-type.md)
-[`OBJECT Get keyboard layout`](../commands-legacy/object-get-keyboard-layout.md)
-[`OBJECT Get list name`](../commands-legacy/object-get-list-name.md)
-[`OBJECT Get list reference`](../commands-legacy/object-get-list-reference.md)
-[`OBJECT GET MAXIMUM VALUE`](../commands-legacy/object-get-maximum-value.md)
-[`OBJECT GET MINIMUM VALUE`](../commands-legacy/object-get-minimum-value.md)
-[`OBJECT Get multiline`](../commands-legacy/object-get-multiline.md)
-[`OBJECT Get name`](../commands-legacy/object-get-name.md)
-[`OBJECT Get placeholder`](../commands-legacy/object-get-placeholder.md)
-[`OBJECT Get pointer`](../commands-legacy/object-get-pointer.md)
-[`OBJECT GET PRINT VARIABLE FRAME`](../commands-legacy/object-get-print-variable-frame.md)
-[`OBJECT GET RESIZING OPTIONS`](../commands-legacy/object-get-resizing-options.md)
-[`OBJECT GET RGB COLORS`](../commands-legacy/object-get-rgb-colors.md)
-[`OBJECT GET SCROLL POSITION`](../commands-legacy/object-get-scroll-position.md)
-[`OBJECT GET SCROLLBAR`](../commands-legacy/object-get-scrollbar.md)
-[`OBJECT GET SHORTCUT`](../commands-legacy/object-get-shortcut.md)
-[`OBJECT Get style sheet`](../commands-legacy/object-get-style-sheet.md)
-[`OBJECT GET SUBFORM`](../commands-legacy/object-get-subform.md)
-[`OBJECT GET SUBFORM CONTAINER SIZE`](../commands-legacy/object-get-subform-container-size.md)
-[`OBJECT Get subform container value`](../commands-legacy/object-get-subform-container-value.md)
-[`OBJECT Get text orientation`](../commands-legacy/object-get-text-orientation.md)
-[`OBJECT Get three states checkbox`](../commands-legacy/object-get-three-states-checkbox.md)
-[`OBJECT Get title`](../commands-legacy/object-get-title.md)
-[`OBJECT Get type`](../commands-legacy/object-get-type.md)
-[`OBJECT Get value`](../commands-legacy/object-get-value.md)
-[`OBJECT Get vertical alignment`](../commands-legacy/object-get-vertical-alignment.md)
-[`OBJECT Get visible`](../commands-legacy/object-get-visible.md)
-[`OBJECT Is styled text`](../commands-legacy/object-is-styled-text.md)
-[`OBJECT MOVE`](../commands-legacy/object-move.md)
-[`OBJECT SET ACTION`](../commands-legacy/object-set-action.md)
-[`OBJECT SET AUTO SPELLCHECK`](../commands-legacy/object-set-auto-spellcheck.md)
-[`OBJECT SET BORDER STYLE`](../commands-legacy/object-set-border-style.md)
-[`OBJECT SET CONTEXT MENU`](../commands-legacy/object-set-context-menu.md)
-[`OBJECT SET COORDINATES`](../commands-legacy/object-set-coordinates.md)
-[`OBJECT SET CORNER RADIUS`](../commands-legacy/object-set-corner-radius.md)
-[`OBJECT SET DATA SOURCE`](../commands-legacy/object-set-data-source.md)
-[`OBJECT SET DRAG AND DROP OPTIONS`](../commands-legacy/object-set-drag-and-drop-options.md)
-[`OBJECT SET ENABLED`](../commands-legacy/object-set-enabled.md)
-[`OBJECT SET ENTERABLE`](../commands-legacy/object-set-enterable.md)
-[`OBJECT SET EVENTS`](../commands-legacy/object-set-events.md)
-[`OBJECT SET FILTER`](../commands-legacy/object-set-filter.md)
-[`OBJECT SET FOCUS RECTANGLE INVISIBLE`](../commands-legacy/object-set-focus-rectangle-invisible.md)
-[`OBJECT SET FONT`](../commands-legacy/object-set-font.md)
-[`OBJECT SET FONT SIZE`](../commands-legacy/object-set-font-size.md)
-[`OBJECT SET FONT STYLE`](../commands-legacy/object-set-font-style.md)
-[`OBJECT SET FORMAT`](../commands-legacy/object-set-format.md)
-[`OBJECT SET HELP TIP`](../commands-legacy/object-set-help-tip.md)
-[`OBJECT SET HORIZONTAL ALIGNMENT`](../commands-legacy/object-set-horizontal-alignment.md)
-[`OBJECT SET INDICATOR TYPE`](../commands-legacy/object-set-indicator-type.md)
-[`OBJECT SET KEYBOARD LAYOUT`](../commands-legacy/object-set-keyboard-layout.md)
-[`OBJECT SET LIST BY NAME`](../commands-legacy/object-set-list-by-name.md)
-[`OBJECT SET LIST BY REFERENCE`](../commands-legacy/object-set-list-by-reference.md)
-[`OBJECT SET MAXIMUM VALUE`](../commands-legacy/object-set-maximum-value.md)
-[`OBJECT SET MINIMUM VALUE`](../commands-legacy/object-set-minimum-value.md)
-[`OBJECT SET MULTILINE`](../commands-legacy/object-set-multiline.md)
-[`OBJECT SET PLACEHOLDER`](../commands-legacy/object-set-placeholder.md)
-[`OBJECT SET PRINT VARIABLE FRAME`](../commands-legacy/object-set-print-variable-frame.md)
-[`OBJECT SET RESIZING OPTIONS`](../commands-legacy/object-set-resizing-options.md)
-[`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md)
-[`OBJECT SET SCROLL POSITION`](../commands-legacy/object-set-scroll-position.md)
-[`OBJECT SET SCROLLBAR`](../commands-legacy/object-set-scrollbar.md)
-[`OBJECT SET SHORTCUT`](../commands-legacy/object-set-shortcut.md)
-[`OBJECT SET STYLE SHEET`](../commands-legacy/object-set-style-sheet.md)
-[`OBJECT SET SUBFORM`](../commands-legacy/object-set-subform.md)
-[`OBJECT SET SUBFORM CONTAINER VALUE`](../commands-legacy/object-set-subform-container-value.md)
-[`OBJECT SET TEXT ORIENTATION`](../commands-legacy/object-set-text-orientation.md)
-[`OBJECT SET THREE STATES CHECKBOX`](../commands-legacy/object-set-three-states-checkbox.md)
-[`OBJECT SET TITLE`](../commands-legacy/object-set-title.md)
-[`OBJECT SET VALUE`](../commands-legacy/object-set-value.md)
-[`OBJECT SET VERTICAL ALIGNMENT`](../commands-legacy/object-set-vertical-alignment.md)
-[`OBJECT SET VISIBLE`](../commands-legacy/object-set-visible.md)
-[`Object to path`](../commands-legacy/object-to-path.md)
-[`Old`](../commands-legacy/old.md)
-[`OLD RELATED MANY`](../commands-legacy/old-related-many.md)
-[`OLD RELATED ONE`](../commands-legacy/old-related-one.md)
-[`On Backup Shutdown database method`](../commands-legacy/on-backup-shutdown-database-method.md)
-[`On Backup Startup database method`](../commands-legacy/on-backup-startup-database-method.md)
-[`On Drop database method`](../commands-legacy/on-drop-database-method.md)
-[`ON ERR CALL`](../commands-legacy/on-err-call.md)
-[`ON EVENT CALL`](../commands-legacy/on-event-call.md)
-[`On Exit database method`](../commands-legacy/on-exit-database-method.md)
-[`On Host Database Event database method`](../commands-legacy/on-host-database-event-database-method.md)
-[`On Mobile App Action database method`](../commands-legacy/on-mobile-app-action-database-method.md)
-[`On Mobile App Authentication database method`](../commands-legacy/on-mobile-app-authentication-database-method.md)
-[`On REST Authentication database method`](../commands-legacy/on-rest-authentication-database-method.md)
-[`On Server Close Connection database method`](../commands-legacy/on-server-close-connection-database-method.md)
-[`On Server Open Connection database method`](../commands-legacy/on-server-open-connection-database-method.md)
-[`On Server Shutdown database method`](../commands-legacy/on-server-shutdown-database-method.md)
-[`On Server Startup database method`](../commands-legacy/on-server-startup-database-method.md)
-[`On SQL Authentication database method`](../commands-legacy/on-sql-authentication-database-method.md)
-[`On Startup database method`](../commands-legacy/on-startup-database-method.md)
-[`On System Event database method`](../commands-legacy/on-system-event-database-method.md)
-[`On Web Authentication database method`](../commands-legacy/on-web-authentication-database-method.md)
-[`On Web Connection database method`](../commands-legacy/on-web-connection-database-method.md)
-[`On Web Legacy Close Session database method`](../commands-legacy/on-web-legacy-close-session-database-method.md)
-[`ONE RECORD SELECT`](../commands-legacy/one-record-select.md)
-[`OPEN ADMINISTRATION WINDOW`](../commands-legacy/open-administration-window.md)
-[`OPEN COLOR PICKER`](../commands-legacy/open-color-picker.md)
-[`OPEN DATA FILE`](../commands-legacy/open-data-file.md)
-[`OPEN DATABASE`](../commands-legacy/open-database.md)
-[`Open datastore`](open-datastore.md)
-[`Open document`](../commands-legacy/open-document.md)
-[`OPEN FONT PICKER`](../commands-legacy/open-font-picker.md)
-[`Open form window`](../commands-legacy/open-form-window.md)
-[`OPEN PRINTING JOB`](../commands-legacy/open-printing-job.md)
-[`Open resource file`](../commands-legacy/open-resource-file.md)
-[`OPEN RUNTIME EXPLORER`](../commands-legacy/open-runtime-explorer.md)
-[`OPEN SECURITY CENTER`](../commands-legacy/open-security-center.md)
-[`OPEN SETTINGS WINDOW`](../commands-legacy/open-settings-window.md)
-[`OPEN URL`](../commands-legacy/open-url.md)
-[`Open window`](../commands-legacy/open-window.md)
-[`ORDER BY`](../commands-legacy/order-by.md)
-[`ORDER BY ATTRIBUTE`](../commands-legacy/order-by-attribute.md)
-[`ORDER BY FORMULA`](../commands-legacy/order-by-formula.md)
-[`Outside call`](../commands-legacy/outside-call.md)
-
-P
-
-[`PAGE BREAK`](../commands-legacy/page-break.md)
-[`Parse formula`](../commands-legacy/parse-formula.md)
-[`Pasteboard data size`](../commands-legacy/pasteboard-data-size.md)
-[`Path to object`](../commands-legacy/path-to-object.md)
-[`PAUSE INDEXES`](../commands-legacy/pause-indexes.md)
-[`PAUSE PROCESS`](../commands-legacy/pause-process.md)
-[`PHP Execute`](../commands-legacy/php-execute.md)
-[`PHP GET FULL RESPONSE`](../commands-legacy/php-get-full-response.md)
-[`PHP GET OPTION`](../commands-legacy/php-get-option.md)
-[`PHP SET OPTION`](../commands-legacy/php-set-option.md)
-[`PICTURE CODEC LIST`](../commands-legacy/picture-codec-list.md)
-[`PICTURE LIBRARY LIST`](../commands-legacy/picture-library-list.md)
-[`PICTURE PROPERTIES`](../commands-legacy/picture-properties.md)
-[`Picture size`](../commands-legacy/picture-size.md)
-[`PICTURE TO BLOB`](../commands-legacy/picture-to-blob.md)
-[`PLAY`](../commands-legacy/play.md)
-[`PLUGIN LIST`](../commands-legacy/plugin-list.md)
-[`POP RECORD`](../commands-legacy/pop-record.md)
-[`Pop up menu`](../commands-legacy/pop-up-menu.md)
-[`POP3 New transporter`](pop3-new-transporter.md)
-[`Position`](../commands-legacy/position.md)
-[`POST CLICK`](../commands-legacy/post-click.md)
-[`POST EVENT`](../commands-legacy/post-event.md)
-[`POST KEY`](../commands-legacy/post-key.md)
-[`POST OUTSIDE CALL`](../commands-legacy/post-outside-call.md)
-[`PREVIOUS RECORD`](../commands-legacy/previous-record.md)
-[`Print form`](print-form.md)
-[`PRINT LABEL`](../commands-legacy/print-label.md)
-[`Print object`](../commands-legacy/print-object.md)
-[`PRINT OPTION VALUES`](../commands-legacy/print-option-values.md)
-[`PRINT RECORD`](../commands-legacy/print-record.md)
-[`PRINT SELECTION`](../commands-legacy/print-selection.md)
-[`PRINT SETTINGS`](../commands-legacy/print-settings.md)
-[`Print settings to BLOB`](../commands-legacy/print-settings-to-blob.md)
-[`PRINTERS LIST`](../commands-legacy/printers-list.md)
-[`Printing page`](../commands-legacy/printing-page.md)
-[`PROCESS 4D TAGS`](../commands-legacy/process-4d-tags.md)
-[`Process aborted`](../commands-legacy/process-aborted.md)
-[`Process activity`](process-activity.md) - **modified 4D 20 R7**
-[`Process info`](process-info.md) - **new 4D 20 R7**
-[`Process number`](process-number.md) - **modified 4D 20 R7**
-[`Process state`](../commands-legacy/process-state.md)
-[`PUSH RECORD`](../commands-legacy/push-record.md)
-
-Q
-
-[`QR BLOB TO REPORT`](../commands-legacy/qr-blob-to-report.md)
-[`QR Count columns`](../commands-legacy/qr-count-columns.md)
-[`QR DELETE COLUMN`](../commands-legacy/qr-delete-column.md)
-[`QR DELETE OFFSCREEN AREA`](../commands-legacy/qr-delete-offscreen-area.md)
-[`QR EXECUTE COMMAND`](../commands-legacy/qr-execute-command.md)
-[`QR Find column`](../commands-legacy/qr-find-column.md)
-[`QR Get area property`](../commands-legacy/qr-get-area-property.md)
-[`QR GET BORDERS`](../commands-legacy/qr-get-borders.md)
-[`QR Get command status`](../commands-legacy/qr-get-command-status.md)
-[`QR GET DESTINATION`](../commands-legacy/qr-get-destination.md)
-[`QR Get document property`](../commands-legacy/qr-get-document-property.md)
-[`QR Get drop column`](../commands-legacy/qr-get-drop-column.md)
-[`QR GET HEADER AND FOOTER`](../commands-legacy/qr-get-header-and-footer.md)
-[`QR Get HTML template`](../commands-legacy/qr-get-html-template.md)
-[`QR GET INFO COLUMN`](../commands-legacy/qr-get-info-column.md)
-[`QR Get info row`](../commands-legacy/qr-get-info-row.md)
-[`QR Get report kind`](../commands-legacy/qr-get-report-kind.md)
-[`QR Get report table`](../commands-legacy/qr-get-report-table.md)
-[`QR GET SELECTION`](../commands-legacy/qr-get-selection.md)
-[`QR GET SORTS`](../commands-legacy/qr-get-sorts.md)
-[`QR Get text property`](../commands-legacy/qr-get-text-property.md)
-[`QR GET TOTALS DATA`](../commands-legacy/qr-get-totals-data.md)
-[`QR GET TOTALS SPACING`](../commands-legacy/qr-get-totals-spacing.md)
-[`QR INSERT COLUMN`](../commands-legacy/qr-insert-column.md)
-[`QR MOVE COLUMN`](../commands-legacy/qr-move-column.md)
-[`QR NEW AREA`](../commands-legacy/qr-new-area.md)
-[`QR New offscreen area`](../commands-legacy/qr-new-offscreen-area.md)
-[`QR ON COMMAND`](../commands-legacy/qr-on-command.md)
-[`QR REPORT`](../commands-legacy/qr-report.md)
-[`QR REPORT TO BLOB`](../commands-legacy/qr-report-to-blob.md)
-[`QR RUN`](../commands-legacy/qr-run.md)
-[`QR SET AREA PROPERTY`](../commands-legacy/qr-set-area-property.md)
-[`QR SET BORDERS`](../commands-legacy/qr-set-borders.md)
-[`QR SET DESTINATION`](../commands-legacy/qr-set-destination.md)
-[`QR SET DOCUMENT PROPERTY`](../commands-legacy/qr-set-document-property.md)
-[`QR SET HEADER AND FOOTER`](../commands-legacy/qr-set-header-and-footer.md)
-[`QR SET HTML TEMPLATE`](../commands-legacy/qr-set-html-template.md)
-[`QR SET INFO COLUMN`](../commands-legacy/qr-set-info-column.md)
-[`QR SET INFO ROW`](../commands-legacy/qr-set-info-row.md)
-[`QR SET REPORT KIND`](../commands-legacy/qr-set-report-kind.md)
-[`QR SET REPORT TABLE`](../commands-legacy/qr-set-report-table.md)
-[`QR SET SELECTION`](../commands-legacy/qr-set-selection.md)
-[`QR SET SORTS`](../commands-legacy/qr-set-sorts.md)
-[`QR SET TEXT PROPERTY`](../commands-legacy/qr-set-text-property.md)
-[`QR SET TOTALS DATA`](../commands-legacy/qr-set-totals-data.md)
-[`QR SET TOTALS SPACING`](../commands-legacy/qr-set-totals-spacing.md)
-[`QUERY`](../commands-legacy/query.md)
-[`QUERY BY ATTRIBUTE`](../commands-legacy/query-by-attribute.md)
-[`QUERY BY EXAMPLE`](../commands-legacy/query-by-example.md)
-[`QUERY BY FORMULA`](../commands-legacy/query-by-formula.md)
-[`QUERY BY SQL`](../commands-legacy/query-by-sql.md)
-[`QUERY SELECTION`](../commands-legacy/query-selection.md)
-[`QUERY SELECTION BY ATTRIBUTE`](../commands-legacy/query-selection-by-attribute.md)
-[`QUERY SELECTION BY FORMULA`](../commands-legacy/query-selection-by-formula.md)
-[`QUERY SELECTION WITH ARRAY`](../commands-legacy/query-selection-with-array.md)
-[`QUERY WITH ARRAY`](../commands-legacy/query-with-array.md)
-[`QUIT 4D`](../commands-legacy/quit-4d.md)
-
-R
-
-[`Random`](../commands-legacy/random.md)
-[`READ ONLY`](../commands-legacy/read-only.md)
-[`Read only state`](../commands-legacy/read-only-state.md)
-[`READ PICTURE FILE`](../commands-legacy/read-picture-file.md)
-[`READ WRITE`](../commands-legacy/read-write.md)
-[`REAL TO BLOB`](../commands-legacy/real-to-blob.md)
-[`RECEIVE BUFFER`](../commands-legacy/receive-buffer.md)
-[`RECEIVE PACKET`](../commands-legacy/receive-packet.md)
-[`RECEIVE RECORD`](../commands-legacy/receive-record.md)
-[`RECEIVE VARIABLE`](../commands-legacy/receive-variable.md)
-[`Record number`](../commands-legacy/record-number.md)
-[`Records in selection`](../commands-legacy/records-in-selection.md)
-[`Records in set`](../commands-legacy/records-in-set.md)
-[`Records in table`](../commands-legacy/records-in-table.md)
-[`REDRAW`](../commands-legacy/redraw.md)
-[`REDRAW WINDOW`](../commands-legacy/redraw-window.md)
-[`REDUCE RESTORE WINDOW`](../commands-legacy/reduce-restore-window.md)
-[`REDUCE SELECTION`](../commands-legacy/reduce-selection.md)
-[`Refresh license`](../commands-legacy/refresh-license.md)
-[`REGENERATE MISSING TABLE`](../commands-legacy/regenerate-missing-table.md)
-[`REGISTER CLIENT`](../commands-legacy/register-client.md)
-[`Register data key`](../commands-legacy/register-data-key.md)
-[`REJECT`](../commands-legacy/reject.md)
-[`REJECT NEW REMOTE CONNECTIONS`](../commands-legacy/reject-new-remote-connections.md)
-[`RELATE MANY`](../commands-legacy/relate-many.md)
-[`RELATE MANY SELECTION`](../commands-legacy/relate-many-selection.md)
-[`RELATE ONE`](../commands-legacy/relate-one.md)
-[`RELATE ONE SELECTION`](../commands-legacy/relate-one-selection.md)
-[`RELEASE MENU`](../commands-legacy/release-menu.md)
-[`RELOAD EXTERNAL DATA`](../commands-legacy/reload-external-data.md)
-[`RELOAD PROJECT`](../commands-legacy/reload-project.md)
-[`REMOVE FROM SET`](../commands-legacy/remove-from-set.md)
-[`REMOVE PICTURE FROM LIBRARY`](../commands-legacy/remove-picture-from-library.md)
-[`Replace string`](../commands-legacy/replace-string.md)
-[`Request`](../commands-legacy/request.md)
-[`RESIZE FORM WINDOW`](../commands-legacy/resize-form-window.md)
-[`RESOLVE ALIAS`](../commands-legacy/resolve-alias.md)
-[`RESOLVE POINTER`](../commands-legacy/resolve-pointer.md)
-[`RESOURCE LIST`](../commands-legacy/resource-list.md)
-[`RESOURCE TYPE LIST`](../commands-legacy/resource-type-list.md)
-[`RESTART 4D`](../commands-legacy/restart-4d.md)
-[`RESTORE`](../commands-legacy/restore.md)
-[`RESTORE INFO`](../commands-legacy/restore-info.md)
-[`RESUME INDEXES`](../commands-legacy/resume-indexes.md)
-[`RESUME PROCESS`](../commands-legacy/resume-process.md)
-[`RESUME TRANSACTION`](../commands-legacy/resume-transaction.md)
-[`Right click`](../commands-legacy/right-click.md)
-[`Round`](../commands-legacy/round.md)
-
-S
-
-[`SAVE LIST`](../commands-legacy/save-list.md)
-[`SAVE RECORD`](../commands-legacy/save-record.md)
-[`SAVE RELATED ONE`](../commands-legacy/save-related-one.md)
-[`SAVE SET`](../commands-legacy/save-set.md)
-[`SAVE VARIABLES`](../commands-legacy/save-variables.md)
-[`SAX ADD PROCESSING INSTRUCTION`](../commands-legacy/sax-add-processing-instruction.md)
-[`SAX ADD XML CDATA`](../commands-legacy/sax-add-xml-cdata.md)
-[`SAX ADD XML COMMENT`](../commands-legacy/sax-add-xml-comment.md)
-[`SAX ADD XML DOCTYPE`](../commands-legacy/sax-add-xml-doctype.md)
-[`SAX ADD XML ELEMENT VALUE`](../commands-legacy/sax-add-xml-element-value.md)
-[`SAX CLOSE XML ELEMENT`](../commands-legacy/sax-close-xml-element.md)
-[`SAX GET XML CDATA`](../commands-legacy/sax-get-xml-cdata.md)
-[`SAX GET XML COMMENT`](../commands-legacy/sax-get-xml-comment.md)
-[`SAX GET XML DOCUMENT VALUES`](../commands-legacy/sax-get-xml-document-values.md)
-[`SAX GET XML ELEMENT`](../commands-legacy/sax-get-xml-element.md)
-[`SAX GET XML ELEMENT VALUE`](../commands-legacy/sax-get-xml-element-value.md)
-[`SAX GET XML ENTITY`](../commands-legacy/sax-get-xml-entity.md)
-[`SAX Get XML node`](../commands-legacy/sax-get-xml-node.md)
-[`SAX GET XML PROCESSING INSTRUCTION`](../commands-legacy/sax-get-xml-processing-instruction.md)
-[`SAX OPEN XML ELEMENT`](../commands-legacy/sax-open-xml-element.md)
-[`SAX OPEN XML ELEMENT ARRAYS`](../commands-legacy/sax-open-xml-element-arrays.md)
-[`SAX SET XML DECLARATION`](../commands-legacy/sax-set-xml-declaration.md)
-[`SCAN INDEX`](../commands-legacy/scan-index.md)
-[`SCREEN COORDINATES`](../commands-legacy/screen-coordinates.md)
-[`SCREEN DEPTH`](../commands-legacy/screen-depth.md)
-[`Screen height`](../commands-legacy/screen-height.md)
-[`Screen width`](../commands-legacy/screen-width.md)
-[`Select document`](../commands-legacy/select-document.md)
-[`Select folder`](../commands-legacy/select-folder.md)
-[`SELECT LIST ITEMS BY POSITION`](../commands-legacy/select-list-items-by-position.md)
-[`SELECT LIST ITEMS BY REFERENCE`](../commands-legacy/select-list-items-by-reference.md)
-[`SELECT LOG FILE`](select-log-file.md)
-[`Select RGB Color`](../commands-legacy/select-rgb-color.md)
-[`Selected list items`](../commands-legacy/selected-list-items.md)
-[`Selected record number`](../commands-legacy/selected-record-number.md)
-[`SELECTION RANGE TO ARRAY`](../commands-legacy/selection-range-to-array.md)
-[`SELECTION TO ARRAY`](../commands-legacy/selection-to-array.md)
-[`Selection to JSON`](../commands-legacy/selection-to-json.md)
-[`Self`](../commands-legacy/self.md)
-[`Semaphore`](../commands-legacy/semaphore.md)
-[`SEND MESSAGE TO REMOTE USER`](../commands-legacy/send-message-to-remote-user.md)
-[`SEND PACKET`](../commands-legacy/send-packet.md)
-[`SEND RECORD`](../commands-legacy/send-record.md)
-[`SEND VARIABLE`](../commands-legacy/send-variable.md)
-[`Sequence number`](../commands-legacy/sequence-number.md)
-[`Session`](session.md)
-[`Session info`](session-info.md) - **new 4D 20 R7**
-[`Session storage`](session-storage.md)
-[`SET ABOUT`](../commands-legacy/set-about.md)
-[`SET ALLOWED METHODS`](../commands/set-allowed-methods.md)
-[`SET APPLICATION COLOR SCHEME`](../commands-legacy/set-application-color-scheme.md)
-[`SET ASSERT ENABLED`](../commands-legacy/set-assert-enabled.md)
-[`SET AUTOMATIC RELATIONS`](../commands-legacy/set-automatic-relations.md)
-[`SET BLOB SIZE`](../commands-legacy/set-blob-size.md)
-[`SET BLOBS CACHE PRIORITY`](../commands-legacy/set-blobs-cache-priority.md)
-[`SET CACHE SIZE`](../commands-legacy/set-cache-size.md)
-[`SET CHANNEL`](../commands-legacy/set-channel.md)
-[`SET CURRENT PRINTER`](../commands-legacy/set-current-printer.md)
-[`SET CURSOR`](../commands-legacy/set-cursor.md)
-[`SET DATABASE LOCALIZATION`](../commands-legacy/set-database-localization.md)
-[`SET DATABASE PARAMETER`](../commands-legacy/set-database-parameter.md)
-[`SET DEFAULT CENTURY`](../commands-legacy/set-default-century.md)
-[`SET DOCUMENT POSITION`](../commands-legacy/set-document-position.md)
-[`SET DOCUMENT PROPERTIES`](../commands-legacy/set-document-properties.md)
-[`SET DOCUMENT SIZE`](../commands-legacy/set-document-size.md)
-[`SET DRAG ICON`](../commands-legacy/set-drag-icon.md)
-[`SET ENVIRONMENT VARIABLE`](../commands-legacy/set-environment-variable.md)
-[`SET EXTERNAL DATA PATH`](../commands-legacy/set-external-data-path.md)
-[`SET FIELD RELATION`](../commands-legacy/set-field-relation.md)
-[`SET FIELD TITLES`](../commands-legacy/set-field-titles.md)
-[`SET FIELD VALUE NULL`](../commands-legacy/set-field-value-null.md)
-[`SET FILE TO PASTEBOARD`](../commands-legacy/set-file-to-pasteboard.md)
-[`SET GROUP ACCESS`](../commands-legacy/set-group-access.md)
-[`Set group properties`](../commands-legacy/set-group-properties.md)
-[`SET HELP MENU`](../commands-legacy/set-help-menu.md)
-[`SET INDEX`](../commands-legacy/set-index.md)
-[`SET INDEX CACHE PRIORITY`](../commands-legacy/set-index-cache-priority.md)
-[`SET LIST ITEM`](../commands-legacy/set-list-item.md)
-[`SET LIST ITEM FONT`](../commands-legacy/set-list-item-font.md)
-[`SET LIST ITEM ICON`](../commands-legacy/set-list-item-icon.md)
-[`SET LIST ITEM PARAMETER`](../commands-legacy/set-list-item-parameter.md)
-[`SET LIST ITEM PROPERTIES`](../commands-legacy/set-list-item-properties.md)
-[`SET LIST PROPERTIES`](../commands-legacy/set-list-properties.md)
-[`SET MACRO PARAMETER`](../commands-legacy/set-macro-parameter.md)
-[`SET MENU BAR`](../commands-legacy/set-menu-bar.md)
-[`SET MENU ITEM`](../commands-legacy/set-menu-item.md)
-[`SET MENU ITEM ICON`](../commands-legacy/set-menu-item-icon.md)
-[`SET MENU ITEM MARK`](../commands-legacy/set-menu-item-mark.md)
-[`SET MENU ITEM METHOD`](../commands-legacy/set-menu-item-method.md)
-[`SET MENU ITEM PARAMETER`](../commands-legacy/set-menu-item-parameter.md)
-[`SET MENU ITEM PROPERTY`](../commands-legacy/set-menu-item-property.md)
-[`SET MENU ITEM SHORTCUT`](../commands-legacy/set-menu-item-shortcut.md)
-[`SET MENU ITEM STYLE`](../commands-legacy/set-menu-item-style.md)
-[`SET PICTURE FILE NAME`](../commands-legacy/set-picture-file-name.md)
-[`SET PICTURE METADATA`](../commands-legacy/set-picture-metadata.md)
-[`SET PICTURE TO LIBRARY`](../commands-legacy/set-picture-to-library.md)
-[`SET PICTURE TO PASTEBOARD`](../commands-legacy/set-picture-to-pasteboard.md)
-[`SET PLUGIN ACCESS`](../commands-legacy/set-plugin-access.md)
-[`SET PRINT MARKER`](../commands-legacy/set-print-marker.md)
-[`SET PRINT OPTION`](../commands-legacy/set-print-option.md)
-[`SET PRINT PREVIEW`](../commands-legacy/set-print-preview.md)
-[`SET PRINTABLE MARGIN`](../commands-legacy/set-printable-margin.md)
-[`SET PROCESS VARIABLE`](../commands-legacy/set-process-variable.md)
-[`SET QUERY AND LOCK`](../commands-legacy/set-query-and-lock.md)
-[`SET QUERY DESTINATION`](../commands-legacy/set-query-destination.md)
-[`SET QUERY LIMIT`](../commands-legacy/set-query-limit.md)
-[`SET REAL COMPARISON LEVEL`](../commands-legacy/set-real-comparison-level.md)
-[`SET RECENT FONTS`](../commands-legacy/set-recent-fonts.md)
-[`SET TABLE CACHE PRIORITY`](../commands-legacy/set-table-cache-priority.md)
-[`SET TABLE TITLES`](../commands-legacy/set-table-titles.md)
-[`SET TEXT TO PASTEBOARD`](../commands-legacy/set-text-to-pasteboard.md)
-[`SET TIMEOUT`](../commands-legacy/set-timeout.md)
-[`SET TIMER`](../commands-legacy/set-timer.md)
-[`SET UPDATE FOLDER`](../commands-legacy/set-update-folder.md)
-[`SET USER ALIAS`](../commands-legacy/set-user-alias.md)
-[`Set user properties`](../commands-legacy/set-user-properties.md)
-[`SET WINDOW DOCUMENT ICON`](set-window-document-icon.md) - **new 4D 20 R7**
-[`SET WINDOW RECT`](../commands-legacy/set-window-rect.md)
-[`SET WINDOW TITLE`](../commands-legacy/set-window-title.md)
-[`Shift down`](../commands-legacy/shift-down.md)
-[`SHOW MENU BAR`](../commands-legacy/show-menu-bar.md)
-[`SHOW ON DISK`](../commands-legacy/show-on-disk.md)
-[`SHOW PROCESS`](../commands-legacy/show-process.md)
-[`SHOW TOOL BAR`](../commands-legacy/show-tool-bar.md)
-[`SHOW WINDOW`](../commands-legacy/show-window.md)
-[`Sin`](../commands-legacy/sin.md)
-[`Size of array`](../commands-legacy/size-of-array.md)
-[`SMTP New transporter`](smtp-new-transporter.md)
-[`SOAP DECLARATION`](../commands-legacy/soap-declaration.md)
-[`SOAP Get info`](../commands-legacy/soap-get-info.md)
-[`SOAP REJECT NEW REQUESTS`](../commands-legacy/soap-reject-new-requests.md)
-[`SOAP Request`](../commands-legacy/soap-request.md)
-[`SOAP SEND FAULT`](../commands-legacy/soap-send-fault.md)
-[`SORT ARRAY`](../commands-legacy/sort-array.md)
-[`SORT LIST`](../commands-legacy/sort-list.md)
-[`SPELL ADD TO USER DICTIONARY`](../commands-legacy/spell-add-to-user-dictionary.md)
-[`SPELL CHECK TEXT`](../commands-legacy/spell-check-text.md)
-[`SPELL CHECKING`](../commands-legacy/spell-checking.md)
-[`SPELL Get current dictionary`](../commands-legacy/spell-get-current-dictionary.md)
-[`SPELL GET DICTIONARY LIST`](../commands-legacy/spell-get-dictionary-list.md)
-[`SPELL SET CURRENT DICTIONARY`](../commands-legacy/spell-set-current-dictionary.md)
-[`Split string`](../commands-legacy/split-string.md)
-[`SQL CANCEL LOAD`](../commands-legacy/sql-cancel-load.md)
-[`SQL End selection`](../commands-legacy/sql-end-selection.md)
-[`SQL EXECUTE`](../commands-legacy/sql-execute.md)
-[`SQL EXECUTE SCRIPT`](../commands-legacy/sql-execute-script.md)
-[`SQL EXPORT DATABASE`](../commands-legacy/sql-export-database.md)
-[`SQL EXPORT SELECTION`](../commands-legacy/sql-export-selection.md)
-[`SQL Get current data source`](../commands-legacy/sql-get-current-data-source.md)
-[`SQL GET DATA SOURCE LIST`](../commands-legacy/sql-get-data-source-list.md)
-[`SQL GET LAST ERROR`](../commands-legacy/sql-get-last-error.md)
-[`SQL GET OPTION`](../commands-legacy/sql-get-option.md)
-[`SQL LOAD RECORD`](../commands-legacy/sql-load-record.md)
-[`SQL LOGIN`](../commands-legacy/sql-login.md)
-[`SQL LOGOUT`](../commands-legacy/sql-logout.md)
-[`SQL SET OPTION`](../commands-legacy/sql-set-option.md)
-[`SQL SET PARAMETER`](../commands-legacy/sql-set-parameter.md)
-[`Square root`](../commands-legacy/square-root.md)
-[`ST COMPUTE EXPRESSIONS`](../commands-legacy/st-compute-expressions.md)
-[`ST FREEZE EXPRESSIONS`](../commands-legacy/st-freeze-expressions.md)
-[`ST GET ATTRIBUTES`](../commands-legacy/st-get-attributes.md)
-[`ST Get content type`](../commands-legacy/st-get-content-type.md)
-[`ST Get expression`](../commands-legacy/st-get-expression.md)
-[`ST GET OPTIONS`](../commands-legacy/st-get-options.md)
-[`ST Get plain text`](../commands-legacy/st-get-plain-text.md)
-[`ST Get text`](../commands-legacy/st-get-text.md)
-[`ST GET URL`](../commands-legacy/st-get-url.md)
-[`ST INSERT EXPRESSION`](../commands-legacy/st-insert-expression.md)
-[`ST INSERT URL`](../commands-legacy/st-insert-url.md)
-[`ST SET ATTRIBUTES`](../commands-legacy/st-set-attributes.md)
-[`ST SET OPTIONS`](../commands-legacy/st-set-options.md)
-[`ST SET PLAIN TEXT`](../commands-legacy/st-set-plain-text.md)
-[`ST SET TEXT`](../commands-legacy/st-set-text.md)
-[`START MONITORING ACTIVITY`](../commands-legacy/start-monitoring-activity.md)
-[`START SQL SERVER`](../commands-legacy/start-sql-server.md)
-[`START TRANSACTION`](../commands-legacy/start-transaction.md)
-[`Std deviation`](../commands-legacy/std-deviation.md)
-[`STOP MONITORING ACTIVITY`](../commands-legacy/stop-monitoring-activity.md)
-[`STOP SQL SERVER`](../commands-legacy/stop-sql-server.md)
-[`Storage`](../commands-legacy/storage.md)
-[`String`](../commands-legacy/string.md)
-[`STRING LIST TO ARRAY`](../commands-legacy/string-list-to-array.md)
-[`Structure file`](../commands-legacy/structure-file.md)
-[`Substring`](../commands-legacy/substring.md)
-[`Subtotal`](../commands-legacy/subtotal.md)
-[`Sum`](../commands-legacy/sum.md)
-[`Sum squares`](../commands-legacy/sum-squares.md)
-[`Super`](super.md)
-[`SUSPEND TRANSACTION`](../commands-legacy/suspend-transaction.md)
-[`SVG EXPORT TO PICTURE`](../commands-legacy/svg-export-to-picture.md)
-[`SVG Find element ID by coordinates`](../commands-legacy/svg-find-element-id-by-coordinates.md)
-[`SVG Find element IDs by rect`](../commands-legacy/svg-find-element-ids-by-rect.md)
-[`SVG GET ATTRIBUTE`](../commands-legacy/svg-get-attribute.md)
-[`SVG SET ATTRIBUTE`](../commands-legacy/svg-set-attribute.md)
-[`SVG SHOW ELEMENT`](../commands-legacy/svg-show-element.md)
-[`System folder`](../commands-legacy/system-folder.md)
-[`System info`](../commands-legacy/system-info.md)
-
-T
-
-[`Table`](../commands-legacy/table.md)
-[`Table fragmentation`](../commands-legacy/table-fragmentation.md)
-[`Table name`](../commands-legacy/table-name.md)
-[`Tan`](../commands-legacy/tan.md)
-[`Temporary folder`](../commands-legacy/temporary-folder.md)
-[`Test path name`](../commands-legacy/test-path-name.md)
-[`Test semaphore`](../commands-legacy/test-semaphore.md)
-[`TEXT TO ARRAY`](../commands-legacy/text-to-array.md)
-[`TEXT TO BLOB`](../commands-legacy/text-to-blob.md)
-[`TEXT TO DOCUMENT`](../commands-legacy/text-to-document.md)
-[`This`](this.md)
-[`throw`](../commands-legacy/throw.md)
-[`Tickcount`](../commands-legacy/tickcount.md)
-[`Time`](../commands-legacy/time.md)
-[`Time string`](../commands-legacy/time-string.md)
-[`Timestamp`](../commands-legacy/timestamp.md)
-[`Tool bar height`](../commands-legacy/tool-bar-height.md)
-[`TRACE`](../commands-legacy/trace.md)
-[`Transaction level`](../commands-legacy/transaction-level.md)
-[`TRANSFORM PICTURE`](../commands-legacy/transform-picture.md)
-[`Trigger event`](../commands-legacy/trigger-event.md)
-[`Trigger level`](../commands-legacy/trigger-level.md)
-[`TRIGGER PROPERTIES`](../commands-legacy/trigger-properties.md)
-[`True`](../commands-legacy/true.md)
-[`Trunc`](../commands-legacy/trunc.md)
-[`TRUNCATE TABLE`](../commands-legacy/truncate-table.md)
-[`Type`](../commands-legacy/type.md)
-
-U
-
-[`Undefined`](../commands-legacy/undefined.md)
-[`UNION`](../commands-legacy/union.md)
-[`UNLOAD RECORD`](../commands-legacy/unload-record.md)
-[`UNREGISTER CLIENT`](../commands-legacy/unregister-client.md)
-[`Uppercase`](../commands-legacy/uppercase.md)
-[`USE CHARACTER SET`](../commands-legacy/use-character-set.md)
-[`USE ENTITY SELECTION`](use-entity-selection.md)
-[`USE NAMED SELECTION`](../commands-legacy/use-named-selection.md)
-[`USE SET`](../commands-legacy/use-set.md)
-[`User in group`](../commands-legacy/user-in-group.md)
-[`USERS TO BLOB`](../commands-legacy/users-to-blob.md)
-
-V
-
-[`Validate password`](../commands-legacy/validate-password.md)
-[`VALIDATE TRANSACTION`](../commands-legacy/validate-transaction.md)
-[`Value type`](../commands-legacy/value-type.md)
-[`VARIABLE TO BLOB`](../commands-legacy/variable-to-blob.md)
-[`VARIABLE TO VARIABLE`](../commands-legacy/variable-to-variable.md)
-[`Variance`](../commands-legacy/variance.md)
-[`VERIFY CURRENT DATA FILE`](../commands-legacy/verify-current-data-file.md)
-[`VERIFY DATA FILE`](../commands-legacy/verify-data-file.md)
-[`Verify password hash`](../commands-legacy/verify-password-hash.md)
-[`Version type`](../commands-legacy/version-type.md)
-[`VOLUME ATTRIBUTES`](../commands-legacy/volume-attributes.md)
-[`VOLUME LIST`](../commands-legacy/volume-list.md)
-
-W
-
-[`WA Back URL available`](../commands-legacy/wa-back-url-available.md)
-[`WA Create URL history menu`](../commands-legacy/wa-create-url-history-menu.md)
-[`WA Evaluate JavaScript`](../commands-legacy/wa-evaluate-javascript.md)
-[`WA EXECUTE JAVASCRIPT FUNCTION`](../commands-legacy/wa-execute-javascript-function.md)
-[`WA Forward URL available`](../commands-legacy/wa-forward-url-available.md)
-[`WA Get context`](../commands/wa-get-context.md) **new 4D 20 R9**
-[`WA Get current URL`](../commands-legacy/wa-get-current-url.md)
-[`WA GET EXTERNAL LINKS FILTERS`](../commands-legacy/wa-get-external-links-filters.md)
-[`WA Get last filtered URL`](../commands-legacy/wa-get-last-filtered-url.md)
-[`WA GET LAST URL ERROR`](../commands-legacy/wa-get-last-url-error.md)
-[`WA Get page content`](../commands-legacy/wa-get-page-content.md)
-[`WA Get page title`](../commands-legacy/wa-get-page-title.md)
-[`WA GET PREFERENCE`](../commands-legacy/wa-get-preference.md)
-[`WA GET URL FILTERS`](../commands-legacy/wa-get-url-filters.md)
-[`WA GET URL HISTORY`](../commands-legacy/wa-get-url-history.md)
-[`WA OPEN BACK URL`](../commands-legacy/wa-open-back-url.md)
-[`WA OPEN FORWARD URL`](../commands-legacy/wa-open-forward-url.md)
-[`WA OPEN URL`](../commands-legacy/wa-open-url.md)
-[`WA OPEN WEB INSPECTOR`](../commands-legacy/wa-open-web-inspector.md)
-[`WA REFRESH CURRENT URL`](../commands-legacy/wa-refresh-current-url.md)
-[`WA Run offscreen area`](../commands-legacy/wa-run-offscreen-area.md)
-[`WA SET CONTEXT`](../commands/wa-set-context.md) **new 4D 20 R9**
-[`WA SET EXTERNAL LINKS FILTERS`](../commands-legacy/wa-set-external-links-filters.md)
-[`WA SET PAGE CONTENT`](../commands-legacy/wa-set-page-content.md)
-[`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md)
-[`WA SET URL FILTERS`](../commands-legacy/wa-set-url-filters.md)
-[`WA STOP LOADING URL`](../commands-legacy/wa-stop-loading-url.md)
-[`WA ZOOM IN`](../commands-legacy/wa-zoom-in.md)
-[`WA ZOOM OUT`](../commands-legacy/wa-zoom-out.md)
-[`WEB GET BODY PART`](../commands-legacy/web-get-body-part.md)
-[`WEB Get body part count`](../commands-legacy/web-get-body-part-count.md)
-[`WEB Get current session ID`](../commands-legacy/web-get-current-session-id.md)
-[`WEB GET HTTP BODY`](../commands-legacy/web-get-http-body.md)
-[`WEB GET HTTP HEADER`](../commands-legacy/web-get-http-header.md)
-[`WEB GET OPTION`](../commands-legacy/web-get-option.md)
-[`WEB Get server info`](../commands-legacy/web-get-server-info.md)
-[`WEB GET STATISTICS`](../commands-legacy/web-get-statistics.md)
-[`WEB GET VARIABLES`](../commands-legacy/web-get-variables.md)
-[`WEB Is secured connection`](../commands-legacy/web-is-secured-connection.md)
-[`WEB Is server running`](../commands-legacy/web-is-server-running.md)
-[`WEB LEGACY CLOSE SESSION`](../commands-legacy/web-legacy-close-session.md)
-[`WEB LEGACY GET SESSION EXPIRATION`](../commands-legacy/web-legacy-get-session-expiration.md)
-[`WEB SEND BLOB`](../commands-legacy/web-send-blob.md)
-[`WEB SEND FILE`](../commands-legacy/web-send-file.md)
-[`WEB SEND HTTP REDIRECT`](../commands-legacy/web-send-http-redirect.md)
-[`WEB SEND RAW DATA`](../commands-legacy/web-send-raw-data.md)
-[`WEB SEND TEXT`](../commands-legacy/web-send-text.md)
-[`WEB Server`](web-server.md)
-[`WEB Server list`](web-server-list.md)
-[`WEB SERVICE AUTHENTICATE`](../commands-legacy/web-service-authenticate.md)
-[`WEB SERVICE CALL`](../commands-legacy/web-service-call.md)
-[`WEB SERVICE Get info`](../commands-legacy/web-service-get-info.md)
-[`WEB SERVICE GET RESULT`](../commands-legacy/web-service-get-result.md)
-[`WEB SERVICE SET OPTION`](../commands-legacy/web-service-set-option.md)
-[`WEB SERVICE SET PARAMETER`](../commands-legacy/web-service-set-parameter.md)
-[`WEB SET HOME PAGE`](../commands-legacy/web-set-home-page.md)
-[`WEB SET HTTP HEADER`](../commands-legacy/web-set-http-header.md)
-[`WEB SET OPTION`](../commands-legacy/web-set-option.md)
-[`WEB SET ROOT FOLDER`](../commands-legacy/web-set-root-folder.md)
-[`WEB START SERVER`](../commands-legacy/web-start-server.md)
-[`WEB STOP SERVER`](../commands-legacy/web-stop-server.md)
-[`WEB Validate digest`](../commands-legacy/web-validate-digest.md)
-[`Window kind`](../commands-legacy/window-kind.md)
-[`WINDOW LIST`](../commands-legacy/window-list.md)
-[`Window process`](../commands-legacy/window-process.md)
-[`Windows Alt down`](../commands-legacy/windows-alt-down.md)
-[`Windows Ctrl down`](../commands-legacy/windows-ctrl-down.md)
-[`WRITE PICTURE FILE`](../commands-legacy/write-picture-file.md)
-
-X
-
-[`XML DECODE`](../commands-legacy/xml-decode.md)
-[`XML GET ERROR`](../commands-legacy/xml-get-error.md)
-[`XML GET OPTIONS`](../commands-legacy/xml-get-options.md)
-[`XML SET OPTIONS`](../commands-legacy/xml-set-options.md)
-
-Y
-
-[`Year of`](../commands-legacy/year-of.md)
-
-Z
-
-[`ZIP Create archive`](zip-create-archive.md)
-[`ZIP Read archive`](zip-read-archive.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/command-name.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/command-name.md
deleted file mode 100644
index 880bd49b2ad050..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/command-name.md
+++ /dev/null
@@ -1,144 +0,0 @@
----
-id: command-name
-title: Command name
-slug: /commands/command-name
-displayed_sidebar: docs
----
-
-**Command name** ( *command* {; *info* {; *theme*}} ) : Text
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | --------------------------- | ------------------------------- |
-| comando | Integer | → | Número de comando |
-| info | Integer | ← | Propiedad del comando a evaluar |
-| theme | Text | ← | Tema del lenguaje del comando |
-| Resultado | Text | ← | Nombre del comando |
-
-
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | -------------------------------- |
-| 20 R9 | Soporte de la propiedad obsoleta |
-
-
-
-## Descripción
-
-El comando **Command name** devuelve el nombre así como (opcionalmente) las propiedades del comando cuyo número de comando pasa en *command*. El número de cada comando se indica en el Explorador así como en el área Propiedades de esta documentación.
-
-**Compatibility note:** A command name may vary from one 4D version to the next (commands renamed), this command was used in previous versions to designate a command directly by means of its number, especially in non-tokenized portions of code. This need has diminished over time as 4D continues to evolve because, for non-tokenized statements (formulas), 4D now provides a token syntax. This syntax allows you to avoid potential problems due to variations in command names as well as other elements such as tables, while still being able to type these names in a legible manner (for more information, refer to the *Using tokens in formulas* section). Tenga en cuenta también que la opción \*[Usar parámetros del sistema regional\* de las Preferencias](../Preferences/methods.md#4d-programming-language-use-regional-system-settings) le permite seguir usando el idioma francés en una versión francesa de 4D.
-
-Hay dos parámetros opcionales:
-
-- *info*: propiedades del comando. The returned value is a *bit field*, where the following bits are meaningful:
- - Primer bit (bit 0): definido en 1 si el comando es [**hilo-seguro**](../Develop/preemptive.md#thread-safe-vs-thread-unsafe-code) (es decir, compatible con la ejecución en un proceso apropiativo) y 0 si es **hilo-inseguro**. Only thread-safe commands can be used in [preemptive processes](../Develop/preemptive.md).
- - Second bit (bit 1): set to 1 if the command is **deprecated**, and 0 if it is not. A deprecated command will continue to work normally as long as it is supported, but should be replaced whenever possible and must no longer be used in new code. Los comandos obsoletos en su código generan advertencias en el [Live Checker y el compilador](../code-editor/write-class-method.md#warnings-and-errors).
-
-*theme*: nombre del tema del lenguaje 4D para el comando.
-
-The **Command name** command sets the *OK* variable to 1 if *command* corresponds to an existing command number, and to 0 otherwise. Note, however, that some existing commands have been disabled, in which case **Command name** returns an empty string (see last example).
-
-## Ejemplo 1
-
-The following code allows you to load all valid 4D commands in an array:
-
-```4d
- var $Lon_id : Integer
- var $Txt_command : Text
- ARRAY LONGINT($tLon_Command_IDs;0)
- ARRAY TEXT($tTxt_commands;0)
-
- Repeat
- $Lon_id:=$Lon_id+1
- $Txt_command:=Command name($Lon_id)
- If(OK=1) //command number exists
- If(Length($Txt_command)>0) //command is not disabled
- APPEND TO ARRAY($tTxt_commands;$Txt_command)
- APPEND TO ARRAY($tLon_Command_IDs;$Lon_id)
- End if
- End if
- Until(OK=0) //end of existing commands
-```
-
-## Ejemplo 2
-
-En un formulario, quiere una lista desplegable con los comandos básicos de informe resumido. En el método objeto para esa lista desplegable, escribe:
-
-```4d
- Case of
- :(Form event code=On Before)
- ARRAY TEXT(asCommand;4)
- asCommand{1}:=Command name(1)
- asCommand{2}:=Command name(2)
- asCommand{3}:=Command name(4)
- asCommand{4}:=Command name(3)
- // ...
- End case
-```
-
-In the English version of 4D, the drop-down list will read: Sum, Average, Min, and Max. In the French version\*, the drop-down list will read: Somme, Moyenne, Min, and Max.
-
-\*with a 4D application configured to use the French programming language (see compatibility note)
-
-## Ejemplo 3
-
-You want to create a method that returns **True** if the command, whose number is passed as parameter, is thread-safe, and **False** otherwise.
-
-```4d
- //Is_Thread_Safe project method
- #declare($command : Integer) : Boolean
- var $threadsafe : Integer
- var $name; $theme : Text
- $name:=Command name($command;$threadsafe;$theme)
- If($threadsafe ?? 0) //if the first bit is set to 1
- return True
- Else
- return False
- End if
-```
-
-Then, for the "SAVE RECORD" command (53) for example, you can write:
-
-```4d
- $isSafe:=Is_Thread_Safe(53)
- // devuelve True
-```
-
-## Ejemplo 4
-
-You want to return a collection of all deprecated commands in your version of 4D.
-
-```4d
-var $info; $Lon_id : Integer
-var $Txt_command : Text
-var $deprecated : Collection
-
-Repeat
- $Lon_id:=$Lon_id+1
- $Txt_command:=Command name($Lon_id;$info)
- If($info ?? 1) //the second bit is set to 1
- //then the command is deprecated
- $deprecated.push($Txt_command)
- End if
-Until(OK=0) //end of existing commands
-
-```
-
-## Ver también
-
-[EXECUTE FORMULA](../commands-legacy/execute-formula.md)
-[Preemptive Processes](../Develop/preemptive.md)
-
-## Propiedades
-
-| | |
-| ---------------------- | --------------------------- |
-| Número de comando | 538 |
-| Hilo seguro | ✓ |
-| Modifica las variables | OK |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/compile-project.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/compile-project.md
deleted file mode 100644
index 9dc5160b0f1ff6..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/compile-project.md
+++ /dev/null
@@ -1,202 +0,0 @@
----
-id: compile-project
-title: Compile project
-slug: /commands/compile-project
-displayed_sidebar: docs
----
-
-**Compile project** {( {*projectFile*}{;}{*options*} )} : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ----------- | ----------------------- | --------------------------- | ----------------------------------------------------------------- |
-| projectFile | 4D.File | → | Archivo .4DProject a compilar |
-| options | Object | → | Objeto que especifica las opciones de compilación |
-| Resultado | Object | ← | Objeto que contiene información sobre el estado de la compilación |
-
-
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ----------------------------------------- |
-| 20 R8 | Soporte del "type" "formObjectExpression" |
-
-
-
-## Descripción
-
-**Compilar proyecto** le permite compilar el proyecto host actual o el proyecto especificado en el parámetro *projectFile*. Para más información sobre compilación, consulte la [página de compilación](../Project/compiler.md).
-
-De forma predeterminada, el comando utiliza las opciones del compilador definidas en los parámetros de estructura. Puede sobreescribirlas pasando un parámetro *options*. Se soportan las siguientes sintaxis:
-
-- **Compile project**(): compila el proyecto abierto utilizando las opciones definidas en los parámetros de estructura
-- **Compile project**(*options*): compila el proyecto abierto. Las *options* definidas reemplazan los parámetros de la estructura
-- **Compile project**(*projectFile*): compila el proyecto 4D *projectFile* usando las opciones definidas en los parámetros de estructura
-- **Compile project**(*projectFile*; *options*): compila el proyecto 4D *projectFile* y las *opciones* definidas reemplazan los parámetros de estructura
-
-**Nota:** las bases de datos binarias no pueden compilarse con este comando.
-
-A diferencia de la ventana del compilador, este comando requiere que usted designe explícitamente el(los) componente(s) a compilar. Al compilar un proyecto con **Compile project**, necesita declarar sus componentes usando la propiedad *components* del parámetro *options*. Tenga en cuenta que los componentes ya deben ser compilados (los componentes binarios están soportados).
-
-El código compilado resultante se almacenará en la carpeta DerivedData o Libraries del proyecto, dependiendo de la propiedad *targets* del parámetro *options*. Si quiere crear archivos .4dz, todavía necesita comprimir manualmente el proyecto compilado o usar la funcionalidad [build application](../Desktop/building.md).
-
-Si pasa una colección vacía en *targets*, **Compile project** ejecutará una comprobación de sintaxis sin compilar.
-
-Los errores de compilación, si los hay, se devuelven como objetos en la colección *errors*.
-
-**Nota:** no se puede llamar a este comando cuando se está ejecutando otra compilación (por ejemplo, una compilación lanzada desde la ventana de compilación).
-
-### Parámetro options
-
-El parámetro *options* es un objeto. Aquí están las opciones de compilación disponibles:
-
-| **Propiedad** | **Tipo** | **Description** |
-| ---------------------------------------------------------------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| components | Collection | Colección de objetos 4D.File a componentes dependientes (debe estar ya compilado) |
-| defaultTypeForButtons | Integer | Valor posible: Is real o Is longint |
-| defaultTypeForNumerics | Integer | Valor posible: Is real o Is longint |
-| generateSymbols | Boolean | True para generar información de símbolos en el objeto devuelto |
-| generateSyntaxFile | Boolean | True para generar un [archivo de sintaxis para la finalización del código](../settings/general.md) en la carpeta \\Resources\\en.lproj del proyecto |
-| generateTypingMethods | Text | "reset" o "append" para generar métodos de tipado. Si el valor es "append", las declaraciones de variables existentes no serán modificadas (comportamiento de la ventana del compilador). Si el valor es "reset" las declaraciones de variables existentes se eliminan de antemano. |
-| plugins | Objeto 4D.Folder | Carpeta de Plug-ins a usar en lugar de [Carpeta de Plug-ins del proyecto actual](../Project/architecture.md#plugins). Esta propiedad solo está disponible con la sintaxis *projectFile*. |
-| targets | Colección de cadenas | Valores posibles: "x86_64_generic", "arm64_macOS_lib". Pase una colección vacía para ejecutar sólo la verificación de sintaxis |
-| typeInference | Text | "all": el compilador deduce los tipos de todas las variables no declaradas explícitamente, "locals": el compilador deduce los tipos de variables locales no declaradas explícitamente, "none": todas las variables deben ser explícitamente declaradas en el código (modo antiguo), "direct": todas las variables deben ser explícitamente declaradas en el código ([escritura directa](../Project/compiler.md#enabling-direct-typing)). |
-| warnings | Colección de objetos | Define el estado de las advertencias |
-| \[\].major | Number | Número principal del warning, antes del punto |
-| \[\].minor | Number | Número secundario de warning, después del punto |
-| \[\].enabled | Boolean | Estado de activación del warning |
-
-**Nota:** cuando el atributo *warnings* no está definido en el objeto *options*, el comando **Compile project** utiliza los estados de generación de warnings por defecto definidos en los parámetros.
-
-### Resultado
-
-El objeto devuelto por **Compile project** tiene hasta tres propiedades:
-
-| **Propiedad** | **Tipo** | **Description** |
-| ---------------------------------------------------------------------------------------------------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
-| success | Boolean | True si la acción guardar tiene éxito, false en caso contrario. |
-| errors | Colección de objetos | **Disponible solo en caso de error o de warning**. Colección de objetos que describen errores de compilación o warnings |
-| \[\].isError | Boolean | Error si es True, sino warning |
-| \[\].message | Text | Mensaje de error |
-| \[\].code | Object | [objeto código](#code-object) |
-| \[\].line | Number | Número de línea del error en el código. Para métodos de clase, el número de línea en la función |
-| \[\].lineInFile | Number | Número de línea en el archivo (diferente de "line" para los métodos de clase, y tiene en cuenta la línea de prefijo %attributes) |
-| symbols | Object | **Disponible sólo si la opción generateSymbols es True:** |
-| symbols.interprocessVariables | Object | Lista de todas las variables interproceso |
-| symbols.interprocessVariables.variables | Collection | Colección de [objetos variables](#variable-objects) |
-| symbols.interprocessVariables.size | Number | |
-| symbols.processVariables | Object | Lista de todas las variables proceso |
-| symbols.processVariables.variables | Collection | Colección de [objetos variables](#variable-objects) |
-| symbols.processVariables.size | Number | |
-| symbols.localVariables | Colección de objetos | Lista de variables locales por método |
-| symbols.localVariables[].code | Object | [objeto código](#code-object) |
-| symbols.localVariables[].variables | Collection | Colección de [objetos variables](#variable-objects) |
-| symbols.methods | Colección de objetos | Lista de métodos |
-| symbols.methods\[\].code | Object | [objeto código](#code-object) |
-| symbols.methods\[\].callCount | Number | Número de veces que se ha llamado a este método |
-| symbols.methods\[\].params | Collection | Colección de tipos de parámetros (Códigos numéricos de tipos de valores) |
-| symbols.methods\[\]. threadSafe | Boolean | Indica si este método es hilo seguro |
-
-Para obtener más información, consulte [Herramientas de compilación](../Project/compiler.md#compilation-tools).
-
-## Objetos variables
-
-`interprocessVariables.variables` y `processVariables.variables` contienen objetos con la siguiente estructura:
-
-| **Propiedad** | **Tipo** | **Description** |
-| -------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
-| name | Text | Nombre de la variable |
-| type | number | Tipo de la variable (como el comando Value type) |
-| arrayDimension | number | Solo para arrays: 1 para los arrays mono dimensionales, 2 para los arrays bidimensionales |
-| code | Object | Para las variables proceso e interproceso: descripción de donde se ha definido la variable |
-
-## Objeto code
-
-La propiedad `code` en `methods.code` y `errors.code` es un objeto con las siguientes propiedades:
-
-| **Propiedad** | **Tipo** | **Description** |
-| -------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| type | Text | "projectMethod", "formObjectMethod", "formMethod", "databaseMethod", "triggerMethod", "executeOnServer" (al llamar a un método proyecto con el atributo *Execute on Server*), "executeFormula" (al ejecutar una fórmula a través de [PROCESS 4D TAGS](../commands-legacy/process-4d-tags.md) o de la evaluación de una fórmula en un documento 4D Write Pro), "class", "classFunction", "formObjectExpression" (para errores ocurridos en expresiones asociadas a objetos formulario) |
-| path | Text | Ruta del método (mismo formato que [METHOD OPEN PATH](../commands-legacy/method-open-path.md)) |
-| file | 4D.File | Archivo de método |
-| | | **Devuelto dependiendo del valor de la propiedad `type`:** |
-| methodName | Text | Métodos proyecto |
-| tabla | Number | Número de la tabla (retornado para un trigger, un método formulario tabla o un método objeto de formulario tabla) |
-| formName | Text | Nombre del formulario (devuelto para un método de formulario) |
-| objectName | Text | Nombre del objeto del formulario (devuelto para un método objeto) |
-| propertyName | Text | Nombre de la propiedad objeto de formulario (devuelto para una expresión de objeto del formulario) |
-| className | Text | Nombre de la clase |
-| functionName | Text | Nombre de la función de clase |
-| databaseMethod | Number | Índice de método base |
-
-## Ejemplos
-
-Para realizar una comprobación de sintaxis solamente, pase una colección vacía al parámetro targets:
-
-```4d
- var $status : Objeto
- var $options:={}
- $options.targets:=New collection //Colección vacía para verificación de sintaxis
- $status:=Compile project($options)
-```
-
-Compila el proyecto actual utilizando las opciones de compilación de la configuración de la estructura solamente:
-
-```4d
- var $status : Object
- $status:=Compile project
-```
-
-En un Silicon Mac, compile el proyecto actual sólo para ARM:
-
-```4d
- var $status : Object
- var $options:={}
- $options.targets:=New collection("arm64_macOS_lib")
- $status:=Compile project($options)
-```
-
-Compilar un proyecto distinto al proyecto actual:
-
-```4d
- var $status : Object
- var $projectFile: 4D.File
- $projectFile:=Folder(fk documents folder).file("Databases/myApp/Project/myApp.4DProject")
- $status:=Compile project($projectFile)
-```
-
-Compilar un proyecto y declarar su componente:
-
-```4d
- var $status : Object
- var $component : 4D.File
- var $options:={}
- $component:=Folder(fk documents folder).file("Components/myComponent.4dz")
- $options.components:=New collection($component)
- $status:=Compile project($options)
-```
-
-Desactivar las advertencias 518.1 y 518.2 al compilar su proyecto:
-
-```4d
-var $options:={}
-$options.warnings:=[]
-$options.warnings.push({major: 518; minor: 1; enabled: False})
-$options.warnings.push({major: 518; minor: 2; enabled: False})
-var $result:=Compile project($options)
-```
-
-## Ver también
-
-[BUILD APPLICATION](../commands-legacy/build-application.md)
-
-## Propiedades
-
-| | |
-| ----------------- | --------------------------- |
-| Número de comando | 1760 |
-| Hilo seguro | ✗ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/open-datastore.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/open-datastore.md
deleted file mode 100644
index 7339509d178465..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/open-datastore.md
+++ /dev/null
@@ -1,155 +0,0 @@
----
-id: open-datastore
-title: Open datastore
-displayed_sidebar: docs
----
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ---------------------------------------------- |
-| 20 R6 | Soporte para acceder a las instancias de Qodly |
-| 20 R4 | Nueva propiedad *passwordAlgorithm* |
-| 18 | Añadidos |
-
-
-
-**Open datastore**( *connectionInfo* : Object ; *localID* : Text ) : 4D.DataStoreImplementation
-
-
-
-| Parámetros | Tipo | | Descripción |
-| -------------- | ------------------------------------------ | --------------------------- | --------------------------------------------------------------------------------------------------- |
-| connectionInfo | Object | → | Propiedades de conexión utilizadas para alcanzar el almacén de datos remoto |
-| localID | Text | → | Id para asignar al almacén de datos abierto en la aplicación local (obligatorio) |
-| Resultado | 4D.DataStoreImplementation | ← | Objeto del almacén de datos |
-
-
-
-## Descripción
-
-El comando `Open datastore` conecta la aplicación al datastore remoto identificado por el parámetro *connectionInfo* y devuelve un objeto `4D.DataStoreImplementation` asociado con el alias local *localID*.
-
-El comando admite los siguientes almacenes de datos remotos:
-
-| Tipo de almacén de datos | Descripción |
-| --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Aplicación 4D remota | Una aplicación 4D disponible como datastore remoto, es decir:
su servidor web se ejecuta con http y/o https activados,
su datastore está expuesto a REST (opción [**Exponer como servidor REST**](REST/configuration.md#starting-the-rest-server) activada).
Puede exigirse una licencia (ver nota) |
-| [Aplicación Qodly](https://developer.qodly.com/docs/cloud/getStarted) | Una aplicación Qodly Server que le proporcionó un **api endpoint** y una **api key** válida asociada a un rol definido. Debe pasar la llave api en la propiedad `api-key` del objeto *connectionInfo*. A continuación, podrá trabajar con el objeto datastore devuelto, con todos los privilegios concedidos al rol asociado. |
-
-:::note
-
-Las peticiones `Open datastore` dependen de la API REST 4D y pueden requerir una licencia 4D Client para abrir la conexión en un 4D Server remoto. Consulte la [sección de inicio de sesión de usuario](../REST/authUsers.md#force-login-mode) para saber cómo configurar la autenticación dependiendo del modo de inicio de sesión de usuario seleccionado.
-
-:::
-
-Pase en *connectionInfo* un objeto que describa el almacén de datos remoto al que desea conectarse. Puede contener las siguientes propiedades (todas las propiedades son opcionales excepto *hostname*):
-
-| Propiedad | Tipo | Aplicación 4D remota | Aplicación Qodly |
-| ----------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
-| hostname | Text | Nombre o dirección IP de la base de datos remota + ":" + número de puerto (el número de puerto es obligatorio) | API Endpoint de la instancia Qodly cloud |
-| user | Text | Nombre de usuario | - (ignorado) |
-| contraseña | Text | Contraseña del usuario | - (ignorado) |
-| idleTimeout | Integer | Tiempo de espera de la sesión de inactividad (en minutos), después del cual la sesión es cerrada automáticamente por 4D. Si se omite, el valor por defecto es 60 (1h). El valor no puede ser < 60 (si se pasa un valor inferior, el tiempo de espera se establece en 60). Para más información, consulte **Cierre de sesiones**. | - (ignorado) |
-| tls | Boolean | True para utilizar una conexión segura(1). Si se omite, es false por defecto. Se recomienda utilizar una conexión segura siempre que sea posible. | True para usar conexión segura. Si se omite, es false por defecto |
-| type | Text | debe ser "4D Server" | - (ignorado) |
-| api-key | Text | - (ignorado) | API key de la instancia Qodly cloud |
-
-(1) Si `tls` es true, se utiliza el protocolo HTTPS si:
-
-- HTTPS está activado en el almacén de datos remoto
-- el número de puerto especificado coincide con el puerto HTTPS configurado en los ajustes de la base de datos
-- un certificado válido y una llave privada de encriptación están instalados en la aplicación 4D. En caso contrario, se produce el error "1610 - Una solicitud remota al host xxx ha fallado"
-
-*localID* es un alias local para la sesión abierta en el almacén de datos remoto. Si *localID* ya existe en la aplicación, se utiliza. En caso contrario, se crea una nueva sesión *localID* cuando se utiliza el objeto datastore.
-
-Una vez abierta la sesión, las siguientes sentencias son equivalentes y devuelven una referencia sobre el mismo objeto datastore:
-
-```4d
- $myds:=Open datastore(connectionInfo;"myLocalId")
- $myds2:=ds("myLocalId")
- //$myds y $myds2 son equivalentes
-```
-
-Los objetos disponibles en el `4D.DataStoreImplementation` son mapeados en función de las [reglas generales ORDA](ORDA/dsMapping.md#reglas-generales).
-
-Si no se encuentra ningún datastore coincidente, `Open datastore` devuelve **Null**.
-
-## Ejemplo 1
-
-Conexión a un almacén de datos remoto sin usuario/contraseña:
-
-```4d
- var $connectTo : Object
- var $remoteDS : 4D.DataStoreImplementation
- $connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
- $remoteDS:=Open datastore($connectTo;"students")
- ALERT("This remote datastore contains "+String($remoteDS.Students.all().length)+" students")
-```
-
-## Ejemplo 2
-
-Conexión a un almacén de datos remoto con usuario/contraseña/ timeout / tls:
-
-```4d
- var $connectTo : Object
- var $remoteDS : 4D.DataStoreImplementation
- $connectTo:=New object("type";"4D Server";"hostname";\"192.168.18.11:4443";\
- "user";"marie";"password";$pwd;"idleTimeout";70;"tls";True)
- $remoteDS:=Open datastore($connectTo;"students")
- ALERT("This remote datastore contains "+String($remoteDS.Students.all().length)+" students")
-```
-
-## Ejemplo 3
-
-Trabajar con varios almacenes de datos remotos:
-
-```4d
- var $connectTo : Object
- var $frenchStudents; $foreignStudents : 4D.DataStoreImplementation
- $connectTo:=New object("hostname";"192.168.18.11:8044")
- $frenchStudents:=Open datastore($connectTo;"french")
- $connectTo.hostname:="192.168.18.11:8050"
- $foreignStudents:=Open datastore($connectTo;"foreign")
- ALERT("They are "+String($frenchStudents.Students.all().length)+" French students")
- ALERT("They are "+String($foreignStudents.Students.all().length)+" foreign students")
-```
-
-## Ejemplo 4
-
-Conexión a una aplicación Qodly:
-
-```4d
-var $connectTo : Object:={hostname: "https://xxx-x54xxx-xx-xxxxx-8xx5-xxxxxx.xx-api.cloud.com"; tls: True}
-
-var $remoteDS : 4D.DataStoreImplementation
-var $data : 4D.EntitySelection
-
-$connectTo["api-key"]:="fxxxx-xxxx-4xxx-txxx-xxxxxxxx0" //solo con fines de ejemplo
- //se recomienda almacenar la clave de API en un lugar seguro (por ejemplo, un archivo)
- //y cargarla en el código
-
-$remoteDS:=Open datastore($connectTo; "remoteId")
-$data:=$remoteDS.item.all()
-
-ALERT(String($data.length)+" items have been read")
-
-```
-
-## Gestión de errores
-
-En caso de error, el comando devuelve **Null**. Si no se puede acceder al almacén de datos remoto (dirección incorrecta, servidor web no iniciado, http y https no habilitados...), se produce el error 1610 "Ha fallado una petición remota al host XXX". Puede interceptar este error con un método instalado por `ON ERR CALL`.
-
-## Ver también
-
-[ds](ds.md)
-
-## Propiedades
-
-| | |
-| ---------------------- | --------------------------- |
-| Número de comando | 1452 |
-| Hilo seguro | ✓ |
-| Modifica las variables | error |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/process-activity.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/process-activity.md
deleted file mode 100644
index 44a364190a3d99..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/process-activity.md
+++ /dev/null
@@ -1,113 +0,0 @@
----
-id: process-activity
-title: Process activity
-displayed_sidebar: docs
----
-
-**Process activity** () : Object **Process activity** ( *options* ) : Object **Process activity** ( *sessionID* ) : Object **Process activity** ( *sessionID* ; *options* ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------- | --------------------------- | ---------------------------------------------------------------------------------------------------- |
-| sessionID | Text | → | ID de sesión |
-| options | Integer | → | Opciones de retorno |
-| Resultado | Object | ← | Instantánea de los procesos en ejecución y/o sesiones de usuario (sólo 4D Server) |
-
-
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | --------------------------------- |
-| 20 R7 | Soporte del parámetro *sessionID* |
-
-
-
-## Descripción
-
-El comando **Process activity** devuelve una instantánea de los procesos en ejecución y/o (sólo en 4D Server) de las sesiones de usuario conectadas en un momento dado. Este comando devuelve todos los procesos, incluidos los procesos internos a los que no se puede acceder mediante el comando [Process info](process-info.md).
-
-Por defecto, cuando se utiliza sin ningún parámetro, **Process activity** devuelve un objeto que contiene las siguientes propiedades:
-
-- "processes", una colección de todos los procesos
-- "sessions" (sólo 4D Server), una colección de todas las sesiones
-
-En 4D Server, puede filtrar la información a devolver utilizando los parámetros opcionales *sessionID* y *options*:
-
-- Si pasa un ID de sesión usuario en el parámetro *sessionID*, el comando sólo devuelve información relacionada con esta sesión. Por defecto, si se omite el parámetro *options*, el objeto devuelto contiene una colección con todos los procesos relacionados con la sesión y una colección con un único objeto que describe la sesión. Si se pasa un ID de sesión inválido, se devuelve un objeto **null**.
-- Puede seleccionar la(s) colección(es) a devolver pasando una de las siguientes constantes en el parámetro *options*:
-
-| Constante | Valor | Comentario |
-| ---------------------- | ----- | ----------------------------------------------------------------------------------- |
-| Processes and sessions | 0 | Devuelve las listas "processes" y "sessions" (valor por defecto) |
-| Processes only | 1 | Devuelve sólo la lista "processes" |
-| Sólo sesiones | 2 | Devuelve solo la lista "sessions" |
-
-:::note
-
-Cuando se ejecuta en 4D en modo remoto o local, `Process activity` siempre devuelve la lista de procesos en ejecución (se ignoran los parámetros *sessionID* y *options*).
-
-:::
-
-**Sessions**
-
-La propiedad "sessions" contiene una colección de objetos que describen todas las sesiones en ejecución en el servidor. Para una descripción de las propiedades del objeto de sesión, por favor consulte el comando [`Session info`](session-info.md).
-
-:::note Notas
-
-- Puede obtener el objeto de una sesión utilizando el comando [Session](session.md).
-- `Process activity` returns remote client sessions, stored procedure session and rest sessions but not Web sessions (limitation).
-
-:::
-
-**Processes**
-
-La propiedad "processes" contiene una colección de objetos de proceso que describen todos los procesos en ejecución. Para una descripción de las propiedades del objeto de proceso, por favor consulte el comando [`Process info`](process-info.md).
-
-En el servidor, el comando `Process activity` devuelve una propiedad adicional "session":
-
-| Propiedad adicional | Tipo | Descripción | |
-| ------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - |
-| session | Object | La propiedad [`.info`](../API/SessionClass.md#info) de la sesión en la que se está ejecutando el proceso. Undefined si se pasa el parámetro `Processes only`. | |
-
-## Ejemplo 1
-
-Desea obtener la colección de todas las sesiones usuario:
-
-```4d
- //A ejecutar en el servidor
-
- var $o : Object
- var $i : Integer
- var $processName;$userName : Text
-
-
- $o:=Process activity //Obtener información de proceso y sesión
- For($i;0;($o.processes.length)-1) //Iterar sobre la colección "processes"
- $processName:=$o.processes[$i].name
- $userName:=String($o.processes[$i].session.userName) // Acceso fácil a userName
- //Utilizar String porque el objeto session puede estar indefinido
- End for
-```
-
-## Ejemplo 2
-
-Desea obtener todos los procesos relacionados con la sesión actual:
-
-```4d
- // a ejecutar en el servidor
-
- var $sessionID : Text:=Session.id
- var $o : Object
-
- $o:=Process activity($sessionID ;Processes only)
-
-```
-
-## Ver también
-
-[`Process info`](process-info.md)
-[`Session info`](session-info.md)
-[Session storage](session-storage.md)
-[WEB Get server info](../commands-legacy/web-get-server-info.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/session.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/session.md
deleted file mode 100644
index b218a4c0ad80c0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/session.md
+++ /dev/null
@@ -1,115 +0,0 @@
----
-id: session
-title: Session
-displayed_sidebar: docs
----
-
-**Session** : 4D.Session
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | -------------------------- | --------------------------- | -------------- |
-| Resultado | 4D.Session | ← | Objeto Session |
-
-
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | ------------------------------------------------------------------ |
-| 20 R8 | Soporte de sesiones autónomas |
-| 20 R5 | Soporte de cliente remoto y sesiones de procedimientos almacenados |
-| 18 R6 | Añadidos |
-
-
-
-## Descripción
-
-El comando `Session` devuelve el objeto `Session` correspondiente a la sesión usuario actual.
-
-Dependiendo del proceso desde el que se llame al comando, la sesión de usuario actual puede ser:
-
-- una sesión web (cuando las [sesiones escalables están activadas](WebServer/sessions.md#enabling-web-sessions)),
-- una sesión de cliente remoto,
-- la sesión de procedimientos almacenados,
-- la sesión del ***Print form*** en una aplicación independiente.
-
-Para obtener más información, consulte el párrafo [Tipos de sesion](../API/SessionClass.md#session-types).
-
-Si el comando se llama desde un contexto no soportado (por ejemplo, sesiones escalables desactivadas), devuelve *Null*.
-
-## Sesiones web
-
-El objeto `Session` de las sesiones web está disponible desde cualquier proceso web:
-
-- Métodos base `On Web Authentication`, `On Web Connection` y `On REST Authentication`,
-- código procesado a través de las etiquetas 4D en las páginas semidinámicas (4DTEXT, 4DHTML, 4DEVAL, 4DSCRIPT/, 4DCODE)
-- los métodos proyecto con el atributo "Available through 4D tags and URLs (4DACTION...)" y llamados a través de 4DACTION/ urls,
-- métodos base [`On Mobile App Authentication`](https://developer.4d.com/go-mobile/docs/4d/on-mobile-app-authentication) y [`On Mobile App Action`](https://developer.4d.com/go-mobile/docs/4d/on-mobile-app-action) para peticiones móviles,
-- Funciones ORDA [llamadas con peticiones REST](../REST/ClassFunctions.md).
-
-Para más información sobre las sesiones usuario web, consulte la sección [Sesiones web](../WebServer/sessions.md).
-
-## Sesiones de cliente remoto
-
-El objeto `Session` de las sesiones cliente remotas está disponible desde:
-
-- Métodos proyecto que tienen el atributo [Ejecutar en el Servidor](../Project/code-overview.md#execute-on-server) (se ejecutan en el proceso "twinned" del proceso cliente),
-- Triggers,
-- Los métodos base `On Server Open Connection` y `On Server Shutdown Connection` de la base de datos.
-
-Para más información sobre las sesiones usuario remoto, por favor consulte el párrafo [**Sesiones usuario cliente remoto**](../Desktop/clientServer.md#remote-user-sessions).
-
-## Sesión de procedimientos almacenados
-
-Todos los procesos de procedimientos almacenados comparten la misma sesión virtual de usuario. El objeto `Session` de los procedimientos almacenados está disponible desde:
-
-- métodos llamados con el comando [`Execute on server`](../commands-legacy/execute-on-server.md),
-- Los métodos base `On Server Startup`, `On Server Shutdown`, `On Backup Startup`, `On Backup Shutdown` y `On System event`
-
-Para obtener información sobre la sesión de usuario virtual de los procedimientos almacenados, consulte la página [4D Server y lenguaje 4D](https://doc.4d.com/4Dv20/4D/20/4D-Server-and-the-4D-Language.300-6330554.en.html).
-
-## Sesión independiente
-
-El objeto `Session` está disponible desde cualquier proceso en aplicaciones independientes (monousuario) para que pueda escribir y probar su código cliente/servidor utilizando el objeto `Session` en su entorno de desarrollo 4D.
-
-## Ejemplo
-
-Ha definido el método `action_Session` con el atributo "Disponible a través de etiquetas 4D y URLs". Se llama al método introduciendo la siguiente URL en el navegador:
-
-```
-IP:port/4DACTION/action_Session
-```
-
-```4d
- //método action_Session
- Case of
- :(Session#Null)
- If(Session.hasPrivilege("WebAdmin")) //llamando a la función hasPrivilege
- WEB SEND TEXT("4DACTION --> Session is WebAdmin")
- Else
- WEB SEND TEXT("4DACTION --> Session is not WebAdmin")
- End if
- Else
- WEB SEND TEXT("4DACTION --> Session is null")
- End case
-```
-
-## Ver también
-
-[Session storage](session-storage.md)
-[Session API](../API/SessionClass.md)
-[Web server user sessions](../WebServer/sessions.md)
-[*Scalable sessions for advanced web applications* (blog post)](https://blog.4d.com/scalable-sessions-for-advanced-web-applications/)
-
-- [*Permissions: Inspect Session Privileges for Easy Debugging* (blog post)](https://blog.4d.com/permissions-inspect-session-privileges-for-easy-debugging/)
-
-## Propiedades
-
-| | |
-| ----------------- | --------------------------- |
-| Número de comando | 1714 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/4D_Environment.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/4D_Environment.md
deleted file mode 100644
index bfe462d42a24ab..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/4D_Environment.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-id: 4D_Environment_theme
-title: Entorno 4D
-slug: /commands/theme/4D-Environment
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/application-file.md) |
-| [](../../commands-legacy/application-info.md) |
-| [](../../commands-legacy/application-type.md) |
-| [](../../commands-legacy/application-version.md) |
-| [](../../commands-legacy/build-application.md) |
-| [](../../commands-legacy/compact-data-file.md) |
-| [](../../commands-legacy/component-list.md) |
-| [](../../commands-legacy/create-data-file.md) |
-| [](../../commands/create-entity-selection.md) |
-| [](../../commands-legacy/data-file.md) |
-| [](../../commands-legacy/database-measures.md) |
-| [](../../commands-legacy/drop-remote-user.md) |
-| [](../../commands/ds.md) |
-| [](../../commands-legacy/export-structure-file.md) |
-| [](../../commands-legacy/get-4d-file.md) |
-| [](../../commands-legacy/get-4d-folder.md) |
-| [](../../commands-legacy/get-database-localization.md) |
-| [](../../commands-legacy/get-database-parameter.md) |
-| [](../../commands-legacy/last-update-log-path.md) |
-| [](../../commands-legacy/is-compiled-mode.md) |
-| [](../../commands-legacy/is-data-file-locked.md) |
-| [](../../commands-legacy/notify-resources-folder-modification.md) |
-| [](../../commands-legacy/open-administration-window.md) |
-| [](../../commands-legacy/open-data-file.md) |
-| [](../../commands-legacy/open-database.md) |
-| [](../../commands/open-datastore.md) |
-| [](../../commands-legacy/open-runtime-explorer.md) |
-| [](../../commands-legacy/open-security-center.md) |
-| [](../../commands-legacy/open-settings-window.md) |
-| [](../../commands-legacy/plugin-list.md) |
-| [](../../commands-legacy/quit-4d.md) |
-| [](../../commands-legacy/reject-new-remote-connections.md) |
-| [](../../commands-legacy/reload-project.md) |
-| [](../../commands-legacy/restart-4d.md) |
-| [](../../commands-legacy/send-message-to-remote-user.md) |
-| [](../../commands-legacy/set-database-localization.md) |
-| [](../../commands-legacy/set-database-parameter.md) |
-| [](../../commands-legacy/set-update-folder.md) |
-| [](../../commands-legacy/structure-file.md) |
-| [](../../commands-legacy/table-fragmentation.md) |
-| [](../../commands/use-entity-selection.md) |
-| [](../../commands-legacy/verify-current-data-file.md) |
-| [](../../commands-legacy/verify-data-file.md) |
-| [](../../commands-legacy/version-type.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Arrays.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Arrays.md
deleted file mode 100644
index f4f63720ac5f6f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Arrays.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-id: Arrays_theme
-title: Arrays
-slug: /commands/theme/Arrays
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/append-to-array.md) |
-| [](../../commands-legacy/array-blob.md) |
-| [](../../commands-legacy/array-boolean.md) |
-| [](../../commands-legacy/array-date.md) |
-| [](../../commands-legacy/array-integer.md) |
-| [](../../commands-legacy/array-longint.md) |
-| [](../../commands-legacy/array-object.md) |
-| [](../../commands-legacy/array-picture.md) |
-| [](../../commands-legacy/array-pointer.md) |
-| [](../../commands-legacy/array-real.md) |
-| [](../../commands-legacy/array-text.md) |
-| [](../../commands-legacy/array-time.md) |
-| [](../../commands-legacy/array-to-list.md) |
-| [](../../commands-legacy/array-to-selection.md) |
-| [](../../commands-legacy/boolean-array-from-set.md) |
-| [](../../commands-legacy/copy-array.md) |
-| [](../../commands-legacy/count-in-array.md) |
-| [](../../commands-legacy/delete-from-array.md) |
-| [](../../commands-legacy/distinct-attribute-paths.md) |
-| [](../../commands-legacy/distinct-attribute-values.md) |
-| [](../../commands-legacy/distinct-values.md) |
-| [](../../commands-legacy/find-in-array.md) |
-| [](../../commands-legacy/find-in-sorted-array.md) |
-| [](../../commands-legacy/insert-in-array.md) |
-| [](../../commands-legacy/list-to-array.md) |
-| [](../../commands-legacy/longint-array-from-selection.md) |
-| [](../../commands-legacy/multi-sort-array.md) |
-| [](../../commands-legacy/selection-range-to-array.md) |
-| [](../../commands-legacy/selection-to-array.md) |
-| [](../../commands-legacy/size-of-array.md) |
-| [](../../commands-legacy/sort-array.md) |
-| [](../../commands-legacy/text-to-array.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/BLOB.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/BLOB.md
deleted file mode 100644
index 77683df0289063..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/BLOB.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-id: BLOB_theme
-title: BLOB
-slug: /commands/theme/BLOB
----
-
-| |
-| ----------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/blob-properties.md) |
-| [](../../commands-legacy/blob-size.md) |
-| [](../../commands-legacy/blob-to-document.md) |
-| [](../../commands-legacy/blob-to-integer.md) |
-| [](../../commands-legacy/blob-to-list.md) |
-| [](../../commands-legacy/blob-to-longint.md) |
-| [](../../commands-legacy/blob-to-real.md) |
-| [](../../commands-legacy/blob-to-text.md) |
-| [](../../commands-legacy/blob-to-variable.md) |
-| [](../../commands-legacy/compress-blob.md) |
-| [](../../commands-legacy/copy-blob.md) |
-| [](../../commands-legacy/decrypt-blob.md) |
-| [](../../commands-legacy/delete-from-blob.md) |
-| [](../../commands-legacy/document-to-blob.md) |
-| [](../../commands-legacy/encrypt-blob.md) |
-| [](../../commands-legacy/expand-blob.md) |
-| [](../../commands-legacy/insert-in-blob.md) |
-| [](../../commands-legacy/integer-to-blob.md) |
-| [](../../commands-legacy/list-to-blob.md) |
-| [](../../commands-legacy/longint-to-blob.md) |
-| [](../../commands-legacy/real-to-blob.md) |
-| [](../../commands-legacy/set-blob-size.md) |
-| [](../../commands-legacy/text-to-blob.md) |
-| [](../../commands-legacy/variable-to-blob.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Backup.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Backup.md
deleted file mode 100644
index 093a1315cdf63c..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Backup.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-id: Backup_theme
-title: Copia de seguridad
-slug: /commands/theme/Backup
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/backup.md) |
-| [](../../commands-legacy/backup-info.md) |
-| [](../../commands-legacy/check-log-file.md) |
-| [](../../commands-legacy/integrate-mirror-log-file.md) |
-| [](../../commands-legacy/log-file.md) |
-| [](../../commands-legacy/log-file-to-json.md) |
-| [](../../commands/new-log-file.md) |
-| [](../../commands-legacy/restore.md) |
-| [](../../commands-legacy/restore-info.md) |
-| [](../../commands/select-log-file.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Boolean.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Boolean.md
deleted file mode 100644
index a85051feba69bd..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Boolean.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: Boolean_theme
-title: Boolean
-slug: /commands/theme/Boolean
----
-
-| |
-| ------------------------------------------------------------------------------- |
-| [](../../commands-legacy/bool.md) |
-| [](../../commands-legacy/false.md) |
-| [](../../commands-legacy/not.md) |
-| [](../../commands-legacy/true.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Cache_Management.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Cache_Management.md
deleted file mode 100644
index 5a1c5bc2ff6e97..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Cache_Management.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-id: Cache_Management_theme
-title: Gestión de caché
-slug: /commands/theme/Cache-Management
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/adjust-blobs-cache-priority.md) |
-| [](../../commands-legacy/adjust-index-cache-priority.md) |
-| [](../../commands-legacy/adjust-table-cache-priority.md) |
-| [](../../commands-legacy/cache-info.md) |
-| [](../../commands-legacy/flush-cache.md) |
-| [](../../commands-legacy/get-adjusted-blobs-cache-priority.md) |
-| [](../../commands-legacy/get-adjusted-index-cache-priority.md) |
-| [](../../commands-legacy/get-adjusted-table-cache-priority.md) |
-| [](../../commands-legacy/get-cache-size.md) |
-| [](../../commands-legacy/memory-statistics.md) |
-| [](../../commands-legacy/set-blobs-cache-priority.md) |
-| [](../../commands-legacy/set-cache-size.md) |
-| [](../../commands-legacy/set-index-cache-priority.md) |
-| [](../../commands-legacy/set-table-cache-priority.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Collections.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Collections.md
deleted file mode 100644
index 02d4a039e49cd8..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Collections.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: Collections_theme
-title: Collections
-slug: /commands/theme/Collections
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/array-to-collection.md) |
-| [](../../commands-legacy/collection-to-array.md) |
-| [](../../commands/new-collection.md) |
-| [](../../commands/new-shared-collection.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Communications.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Communications.md
deleted file mode 100644
index 90a3f44fccc42a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Communications.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-id: Communications_theme
-title: Comunicaciones
-slug: /commands/theme/Communications
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/get-serial-port-mapping.md) |
-| [](../../commands-legacy/receive-buffer.md) |
-| [](../../commands-legacy/receive-packet.md) |
-| [](../../commands-legacy/receive-record.md) |
-| [](../../commands-legacy/receive-variable.md) |
-| [](../../commands-legacy/send-packet.md) |
-| [](../../commands-legacy/send-record.md) |
-| [](../../commands-legacy/send-variable.md) |
-| [](../../commands-legacy/set-channel.md) |
-| [](../../commands-legacy/set-timeout.md) |
-| [](../../commands-legacy/use-character-set.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Compiler.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Compiler.md
deleted file mode 100644
index c402462a2c4e81..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Compiler.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-id: Compiler_theme
-title: Compilador
-slug: /commands/theme/Compiler
----
-
-| |
-| -------------------------------------------------------------------------------------------- |
-| [](../../commands/compile-project.md) |
-| [](../../commands-legacy/idle.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Data_Entry.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Data_Entry.md
deleted file mode 100644
index 45721092d28d69..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Data_Entry.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: Data_Entry_theme
-title: Entrada
-slug: /commands/theme/Data-Entry
----
-
-| |
-| ----------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/accept.md) |
-| [](../../commands-legacy/add-record.md) |
-| [](../../commands-legacy/cancel.md) |
-| [](../../commands/dialog.md) |
-| [](../../commands-legacy/modified.md) |
-| [](../../commands-legacy/modify-record.md) |
-| [](../../commands-legacy/old.md) |
-| [](../../commands-legacy/reject.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Data_Security.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Data_Security.md
deleted file mode 100644
index b20d92e581e7ac..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Data_Security.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-id: Data_Security_theme
-title: Seguridad de los datos
-slug: /commands/theme/Data-Security
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/data-file-encryption-status.md) |
-| [](../../commands-legacy/decrypt-data-blob.md) |
-| [](../../commands-legacy/discover-data-key.md) |
-| [](../../commands-legacy/encrypt-data-blob.md) |
-| [](../../commands-legacy/encrypt-data-file.md) |
-| [](../../commands-legacy/new-data-key.md) |
-| [](../../commands-legacy/register-data-key.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Database_Methods.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Database_Methods.md
deleted file mode 100644
index 1360d1aa07fafe..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Database_Methods.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-id: Database_Methods_theme
-title: Métodos base
-slug: /commands/theme/Database-Methods
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/on-backup-shutdown-database-method.md) |
-| [](../../commands-legacy/on-backup-startup-database-method.md) |
-| [](../../commands-legacy/on-drop-database-method.md) |
-| [](../../commands-legacy/on-exit-database-method.md) |
-| [](../../commands-legacy/on-host-database-event-database-method.md) |
-| [](../../commands-legacy/on-mobile-app-action-database-method.md) |
-| [](../../commands-legacy/on-mobile-app-authentication-database-method.md) |
-| [](../../commands-legacy/on-rest-authentication-database-method.md) |
-| [](../../commands-legacy/on-server-close-connection-database-method.md) |
-| [](../../commands-legacy/on-server-open-connection-database-method.md) |
-| [](../../commands-legacy/on-server-shutdown-database-method.md) |
-| [](../../commands-legacy/on-server-startup-database-method.md) |
-| [](../../commands-legacy/on-sql-authentication-database-method.md) |
-| [](../../commands-legacy/on-startup-database-method.md) |
-| [](../../commands-legacy/on-system-event-database-method.md) |
-| [](../../commands-legacy/on-web-authentication-database-method.md) |
-| [](../../commands-legacy/on-web-connection-database-method.md) |
-| [](../../commands-legacy/on-web-legacy-close-session-database-method.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Date_and_Time.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Date_and_Time.md
deleted file mode 100644
index 2fc3f09b8d0b83..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Date_and_Time.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-id: Date_and_Time_theme
-title: Fechas y horas
-slug: /commands/theme/Date-and-Time
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/add-to-date.md) |
-| [](../../commands-legacy/current-date.md) |
-| [](../../commands-legacy/current-time.md) |
-| [](../../commands-legacy/date.md) |
-| [](../../commands-legacy/day-number.md) |
-| [](../../commands-legacy/day-of.md) |
-| [](../../commands-legacy/milliseconds.md) |
-| [](../../commands-legacy/month-of.md) |
-| [](../../commands-legacy/set-default-century.md) |
-| [](../../commands-legacy/tickcount.md) |
-| [](../../commands-legacy/time.md) |
-| [](../../commands-legacy/time-string.md) |
-| [](../../commands-legacy/timestamp.md) |
-| [](../../commands-legacy/year-of.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Design_Object_Access.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Design_Object_Access.md
deleted file mode 100644
index 7ba63554e01770..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Design_Object_Access.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-id: Design_Object_Access_theme
-title: Acceso objetos diseño
-slug: /commands/theme/Design-Object-Access
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/current-method-path.md) |
-| [](../../commands/form-edit.md) |
-| [](../../commands-legacy/form-get-names.md) |
-| [](../../commands-legacy/method-get-attribute.md) |
-| [](../../commands-legacy/method-get-attributes.md) |
-| [](../../commands-legacy/method-get-code.md) |
-| [](../../commands-legacy/method-get-comments.md) |
-| [](../../commands-legacy/method-get-folders.md) |
-| [](../../commands-legacy/method-get-modification-date.md) |
-| [](../../commands-legacy/method-get-names.md) |
-| [](../../commands-legacy/method-get-path.md) |
-| [](../../commands-legacy/method-get-paths.md) |
-| [](../../commands-legacy/method-get-paths-form.md) |
-| [](../../commands-legacy/method-open-path.md) |
-| [](../../commands-legacy/method-resolve-path.md) |
-| [](../../commands-legacy/method-set-access-mode.md) |
-| [](../../commands-legacy/method-set-attribute.md) |
-| [](../../commands-legacy/method-set-attributes.md) |
-| [](../../commands-legacy/method-set-code.md) |
-| [](../../commands-legacy/method-set-comments.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Drag_and_Drop.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Drag_and_Drop.md
deleted file mode 100644
index 2c9cfb3da8d2d3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Drag_and_Drop.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-id: Drag_and_Drop_theme
-title: Arrastrar y soltar
-slug: /commands/theme/Drag-and-Drop
----
-
-| |
-| ----------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/drop-position.md) |
-| [](../../commands-legacy/set-drag-icon.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Entry_Control.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Entry_Control.md
deleted file mode 100644
index 956cda0166b5d6..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Entry_Control.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: Entry_Control_theme
-title: Control de entrada
-slug: /commands/theme/Entry-Control
----
-
-| |
-| ----------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/edit-item.md) |
-| [](../../commands-legacy/filter-keystroke.md) |
-| [](../../commands-legacy/get-edited-text.md) |
-| [](../../commands-legacy/get-highlight.md) |
-| [](../../commands-legacy/goto-object.md) |
-| [](../../commands-legacy/highlight-text.md) |
-| [](../../commands-legacy/is-editing-text.md) |
-| [](../../commands-legacy/keystroke.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/File_and_Folder.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/File_and_Folder.md
deleted file mode 100644
index d6721240bc3f70..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/File_and_Folder.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: File_and_Folder_theme
-title: Archivo y carpeta
-slug: /commands/theme/File-and-Folder
----
-
-| |
-| -------------------------------------------------------------------------------------------------- |
-| [](../../commands/file.md) |
-| [](../../commands/folder.md) |
-| [](../../commands/zip-create-archive.md) |
-| [](../../commands/zip-read-archive.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Form_Events.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Form_Events.md
deleted file mode 100644
index 8a570cf6aaaee1..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Form_Events.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-id: Form_Events_theme
-title: Eventos formulario
-slug: /commands/theme/Form-Events
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/activated.md) |
-| [](../../commands-legacy/after.md) |
-| [](../../commands-legacy/before.md) |
-| [](../../commands-legacy/call-form.md) |
-| [](../../commands-legacy/call-subform-container.md) |
-| [](../../commands-legacy/clickcount.md) |
-| [](../../commands-legacy/contextual-click.md) |
-| [](../../commands-legacy/deactivated.md) |
-| [](../../commands-legacy/execute-method-in-subform.md) |
-| [](../../commands/form-event.md) |
-| [](../../commands/form-event-code.md) |
-| [](../../commands-legacy/in-break.md) |
-| [](../../commands-legacy/in-footer.md) |
-| [](../../commands-legacy/in-header.md) |
-| [](../../commands-legacy/is-waiting-mouse-up.md) |
-| [](../../commands-legacy/outside-call.md) |
-| [](../../commands-legacy/post-outside-call.md) |
-| [](../../commands-legacy/right-click.md) |
-| [](../../commands-legacy/set-timer.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Forms.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Forms.md
deleted file mode 100644
index 365f78a91e90ce..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Forms.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-id: Forms_theme
-title: Formularios
-slug: /commands/theme/Forms
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/current-form-name.md) |
-| [](../../commands/form.md) |
-| [](../../commands-legacy/form-convert-to-dynamic.md) |
-| [](../../commands-legacy/form-first-page.md) |
-| [](../../commands-legacy/form-get-color-scheme.md) |
-| [](../../commands-legacy/form-get-current-page.md) |
-| [](../../commands-legacy/form-get-entry-order.md) |
-| [](../../commands-legacy/form-get-horizontal-resizing.md) |
-| [](../../commands-legacy/form-get-objects.md) |
-| [](../../commands-legacy/form-get-properties.md) |
-| [](../../commands-legacy/form-get-vertical-resizing.md) |
-| [](../../commands-legacy/form-goto-page.md) |
-| [](../../commands-legacy/form-last-page.md) |
-| [](../../commands/form-load.md) |
-| [](../../commands-legacy/form-next-page.md) |
-| [](../../commands-legacy/form-previous-page.md) |
-| [](../../commands-legacy/form-screenshot.md) |
-| [](../../commands-legacy/form-set-entry-order.md) |
-| [](../../commands-legacy/form-set-horizontal-resizing.md) |
-| [](../../commands-legacy/form-set-input.md) |
-| [](../../commands-legacy/form-set-output.md) |
-| [](../../commands-legacy/form-set-size.md) |
-| [](../../commands-legacy/form-set-vertical-resizing.md) |
-| [](../../commands-legacy/form-unload.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Formulas.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Formulas.md
deleted file mode 100644
index ce6c3275d36a2a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Formulas.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-id: Formulas_theme
-title: Fórmulas
-slug: /commands/theme/Formulas
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/edit-formula.md) |
-| [](../../commands-legacy/execute-formula.md) |
-| [](../../commands/formula.md) |
-| [](../../commands/formula-from-string.md) |
-| [](../../commands-legacy/get-allowed-methods.md) |
-| [](../../commands-legacy/parse-formula.md) |
-| [](../../commands/set-allowed-methods.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Graphs.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Graphs.md
deleted file mode 100644
index 0f2d71acd1fd82..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Graphs.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-id: Graphs_theme
-title: Gráficos
-slug: /commands/theme/Graphs
----
-
-| |
-| ------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/graph.md) |
-| [](../../commands-legacy/graph-settings.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/HTTP.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/HTTP.md
deleted file mode 100644
index 79c68885f2ab53..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/HTTP.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: HTTP_theme
-title: HTTP
-slug: /commands/theme/HTTP
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/http-authenticate.md) |
-| [](../../commands-legacy/http-get.md) |
-| [](../../commands-legacy/http-get-certificates-folder.md) |
-| [](../../commands-legacy/http-get-option.md) |
-| [](../../commands/http-parse-message.md) |
-| [](../../commands-legacy/http-request.md) |
-| [](../../commands-legacy/http-set-certificates-folder.md) |
-| [](../../commands-legacy/http-set-option.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Hierarchical_Lists.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Hierarchical_Lists.md
deleted file mode 100644
index a91df707fdbca3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Hierarchical_Lists.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-id: Hierarchical_Lists_theme
-title: Listas jerárquicas
-slug: /commands/theme/Hierarchical-Lists
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/append-to-list.md) |
-| [](../../commands-legacy/clear-list.md) |
-| [](../../commands-legacy/copy-list.md) |
-| [](../../commands-legacy/count-list-items.md) |
-| [](../../commands-legacy/delete-from-list.md) |
-| [](../../commands-legacy/find-in-list.md) |
-| [](../../commands-legacy/get-list-item.md) |
-| [](../../commands-legacy/get-list-item-font.md) |
-| [](../../commands-legacy/get-list-item-icon.md) |
-| [](../../commands-legacy/get-list-item-parameter.md) |
-| [](../../commands-legacy/get-list-item-parameter-arrays.md) |
-| [](../../commands-legacy/get-list-item-properties.md) |
-| [](../../commands-legacy/get-list-properties.md) |
-| [](../../commands-legacy/insert-in-list.md) |
-| [](../../commands-legacy/is-a-list.md) |
-| [](../../commands-legacy/list-item-parent.md) |
-| [](../../commands-legacy/list-item-position.md) |
-| [](../../commands-legacy/list-of-choice-lists.md) |
-| [](../../commands-legacy/load-list.md) |
-| [](../../commands-legacy/new-list.md) |
-| [](../../commands-legacy/save-list.md) |
-| [](../../commands-legacy/select-list-items-by-position.md) |
-| [](../../commands-legacy/select-list-items-by-reference.md) |
-| [](../../commands-legacy/selected-list-items.md) |
-| [](../../commands-legacy/set-list-item.md) |
-| [](../../commands-legacy/set-list-item-font.md) |
-| [](../../commands-legacy/set-list-item-icon.md) |
-| [](../../commands-legacy/set-list-item-parameter.md) |
-| [](../../commands-legacy/set-list-item-properties.md) |
-| [](../../commands-legacy/set-list-properties.md) |
-| [](../../commands-legacy/sort-list.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Import_and_Export.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Import_and_Export.md
deleted file mode 100644
index 562c873a550e3f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Import_and_Export.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: Import_and_Export_theme
-title: Import-Export
-slug: /commands/theme/Import-and-Export
----
-
-| |
-| ------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/export-data.md) |
-| [](../../commands-legacy/export-dif.md) |
-| [](../../commands-legacy/export-sylk.md) |
-| [](../../commands-legacy/export-text.md) |
-| [](../../commands-legacy/import-data.md) |
-| [](../../commands-legacy/import-dif.md) |
-| [](../../commands-legacy/import-sylk.md) |
-| [](../../commands-legacy/import-text.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Interruptions.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Interruptions.md
deleted file mode 100644
index 51f20da1d8ad45..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Interruptions.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-id: Interruptions_theme
-title: Interrupciones
-slug: /commands/theme/Interruptions
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/abort.md) |
-| [](../../commands-legacy/assert.md) |
-| [](../../commands-legacy/asserted.md) |
-| [](../../commands-legacy/filter-event.md) |
-| [](../../commands-legacy/get-assert-enabled.md) |
-| [](../../commands-legacy/last-errors.md) |
-| [](../../commands-legacy/method-called-on-error.md) |
-| [](../../commands-legacy/method-called-on-event.md) |
-| [](../../commands-legacy/on-err-call.md) |
-| [](../../commands-legacy/on-event-call.md) |
-| [](../../commands-legacy/set-assert-enabled.md) |
-| [](../../commands-legacy/throw.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/JSON.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/JSON.md
deleted file mode 100644
index 75904d8b599d70..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/JSON.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: JSON_theme
-title: JSON
-slug: /commands/theme/JSON
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/json-parse.md) |
-| [](../../commands-legacy/json-parse-array.md) |
-| [](../../commands-legacy/json-resolve-pointers.md) |
-| [](../../commands-legacy/json-stringify.md) |
-| [](../../commands-legacy/json-stringify-array.md) |
-| [](../../commands-legacy/json-to-selection.md) |
-| [](../../commands-legacy/json-validate.md) |
-| [](../../commands-legacy/selection-to-json.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/LDAP.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/LDAP.md
deleted file mode 100644
index 18dc275c685f8a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/LDAP.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: LDAP_theme
-title: LDAP
-slug: /commands/theme/LDAP
----
-
-| |
-| --------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/ldap-login.md) |
-| [](../../commands-legacy/ldap-logout.md) |
-| [](../../commands-legacy/ldap-search.md) |
-| [](../../commands-legacy/ldap-search-all.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Language.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Language.md
deleted file mode 100644
index c6d4426ee0d918..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Language.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-id: Language_theme
-title: Lenguaje
-slug: /commands/theme/Language
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/action-info.md) |
-| [](../call-chain.md) |
-| [](../../commands/command-name.md) |
-| [](../../commands-legacy/copy-parameters.md) |
-| [](../../commands-legacy/count-parameters.md) |
-| [](../../commands-legacy/current-method-name.md) |
-| [](../../commands-legacy/execute-method.md) |
-| [](../../commands-legacy/get-pointer.md) |
-| [](../../commands-legacy/invoke-action.md) |
-| [](../../commands-legacy/is-a-variable.md) |
-| [](../../commands-legacy/is-nil-pointer.md) |
-| [](../../commands-legacy/null.md) |
-| [](../../commands-legacy/resolve-pointer.md) |
-| [](../../commands-legacy/self.md) |
-| [](../../commands/super.md) |
-| [](../../commands/this.md) |
-| [](../../commands-legacy/trace.md) |
-| [](../../commands-legacy/type.md) |
-| [](../../commands-legacy/undefined.md) |
-| [](../../commands-legacy/value-type.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Licenses.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Licenses.md
deleted file mode 100644
index 6153d1a94a28f3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Licenses.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-id: Licenses_theme
-title: Licencias
-slug: /commands/theme/Licenses
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/change-licenses.md) |
-| [](../../commands-legacy/create-deployment-license.md) |
-| [](../../commands-legacy/is-license-available.md) |
-| [](../../commands/license-info.md) |
-| [](../../commands-legacy/license-usage.md) |
-| [](../../commands-legacy/refresh-license.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/List_Box.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/List_Box.md
deleted file mode 100644
index 27dbe4656fe489..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/List_Box.md
+++ /dev/null
@@ -1,67 +0,0 @@
----
-id: List_Box_theme
-title: List Box
-slug: /commands/theme/List-Box
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/listbox-collapse.md) |
-| [](../../commands-legacy/listbox-delete-column.md) |
-| [](../../commands-legacy/listbox-delete-rows.md) |
-| [](../../commands-legacy/listbox-duplicate-column.md) |
-| [](../../commands-legacy/listbox-expand.md) |
-| [](../../commands-legacy/listbox-get-array.md) |
-| [](../../commands-legacy/listbox-get-arrays.md) |
-| [](../../commands-legacy/listbox-get-auto-row-height.md) |
-| [](../../commands-legacy/listbox-get-cell-coordinates.md) |
-| [](../../commands-legacy/listbox-get-cell-position.md) |
-| [](../../commands-legacy/listbox-get-column-formula.md) |
-| [](../../commands-legacy/listbox-get-column-width.md) |
-| [](../../commands-legacy/listbox-get-footer-calculation.md) |
-| [](../../commands-legacy/listbox-get-footers-height.md) |
-| [](../../commands-legacy/listbox-get-grid.md) |
-| [](../../commands-legacy/listbox-get-grid-colors.md) |
-| [](../../commands-legacy/listbox-get-headers-height.md) |
-| [](../../commands-legacy/listbox-get-hierarchy.md) |
-| [](../../commands-legacy/listbox-get-locked-columns.md) |
-| [](../../commands-legacy/listbox-get-number-of-columns.md) |
-| [](../../commands-legacy/listbox-get-number-of-rows.md) |
-| [](../../commands-legacy/listbox-get-objects.md) |
-| [](../../commands-legacy/listbox-get-print-information.md) |
-| [](../../commands-legacy/listbox-get-property.md) |
-| [](../../commands-legacy/listbox-get-row-color.md) |
-| [](../../commands-legacy/listbox-get-row-color-as-number.md) |
-| [](../../commands-legacy/listbox-get-row-font-style.md) |
-| [](../../commands-legacy/listbox-get-row-height.md) |
-| [](../../commands-legacy/listbox-get-rows-height.md) |
-| [](../../commands-legacy/listbox-get-static-columns.md) |
-| [](../../commands-legacy/listbox-get-table-source.md) |
-| [](../../commands-legacy/listbox-insert-column.md) |
-| [](../../commands-legacy/listbox-insert-column-formula.md) |
-| [](../../commands-legacy/listbox-insert-rows.md) |
-| [](../../commands-legacy/listbox-move-column.md) |
-| [](../../commands-legacy/listbox-moved-column-number.md) |
-| [](../../commands-legacy/listbox-moved-row-number.md) |
-| [](../../commands-legacy/listbox-select-break.md) |
-| [](../../commands-legacy/listbox-select-row.md) |
-| [](../../commands-legacy/listbox-select-rows.md) |
-| [](../../commands-legacy/listbox-set-array.md) |
-| [](../../commands-legacy/listbox-set-auto-row-height.md) |
-| [](../../commands-legacy/listbox-set-column-formula.md) |
-| [](../../commands-legacy/listbox-set-column-width.md) |
-| [](../../commands-legacy/listbox-set-footer-calculation.md) |
-| [](../../commands-legacy/listbox-set-footers-height.md) |
-| [](../../commands-legacy/listbox-set-grid.md) |
-| [](../../commands-legacy/listbox-set-grid-color.md) |
-| [](../../commands-legacy/listbox-set-headers-height.md) |
-| [](../../commands-legacy/listbox-set-hierarchy.md) |
-| [](../../commands-legacy/listbox-set-locked-columns.md) |
-| [](../../commands-legacy/listbox-set-property.md) |
-| [](../../commands-legacy/listbox-set-row-color.md) |
-| [](../../commands-legacy/listbox-set-row-font-style.md) |
-| [](../../commands-legacy/listbox-set-row-height.md) |
-| [](../../commands-legacy/listbox-set-rows-height.md) |
-| [](../../commands-legacy/listbox-set-static-columns.md) |
-| [](../../commands-legacy/listbox-set-table-source.md) |
-| [](../../commands-legacy/listbox-sort-columns.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Mail.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Mail.md
deleted file mode 100644
index 1f7e72f667a4ef..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Mail.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-id: Mail_theme
-title: Mail
-slug: /commands/theme/Mail
----
-
-| |
-| ---------------------------------------------------------------------------------------------------------- |
-| [](../../commands/imap-new-transporter.md) |
-| [](../../commands/mail-convert-from-mime.md) |
-| [](../../commands/mail-convert-to-mime.md) |
-| [](../../commands/mail-new-attachment.md) |
-| [](../../commands/pop3-new-transporter.md) |
-| [](../../commands/smtp-new-transporter.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Math.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Math.md
deleted file mode 100644
index a0b8fff54de77a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Math.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-id: Math_theme
-title: Funciones matemáticas
-slug: /commands/theme/Math
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/abs.md) |
-| [](../../commands-legacy/arctan.md) |
-| [](../../commands-legacy/cos.md) |
-| [](../../commands-legacy/dec.md) |
-| [](../../commands-legacy/euro-converter.md) |
-| [](../../commands-legacy/exp.md) |
-| [](../../commands-legacy/int.md) |
-| [](../../commands-legacy/log.md) |
-| [](../../commands-legacy/mod.md) |
-| [](../../commands-legacy/random.md) |
-| [](../../commands-legacy/round.md) |
-| [](../../commands-legacy/set-real-comparison-level.md) |
-| [](../../commands-legacy/sin.md) |
-| [](../../commands-legacy/square-root.md) |
-| [](../../commands-legacy/tan.md) |
-| [](../../commands-legacy/trunc.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Menus.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Menus.md
deleted file mode 100644
index f21e9507b87187..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Menus.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-id: Menus_theme
-title: Menús
-slug: /commands/theme/Menus
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/append-menu-item.md) |
-| [](../../commands-legacy/count-menu-items.md) |
-| [](../../commands-legacy/count-menus.md) |
-| [](../../commands-legacy/create-menu.md) |
-| [](../../commands-legacy/delete-menu-item.md) |
-| [](../../commands-legacy/disable-menu-item.md) |
-| [](../../commands-legacy/dynamic-pop-up-menu.md) |
-| [](../../commands-legacy/enable-menu-item.md) |
-| [](../../commands-legacy/get-menu-bar-reference.md) |
-| [](../../commands-legacy/get-menu-item.md) |
-| [](../../commands-legacy/get-menu-item-icon.md) |
-| [](../../commands-legacy/get-menu-item-key.md) |
-| [](../../commands-legacy/get-menu-item-mark.md) |
-| [](../../commands-legacy/get-menu-item-method.md) |
-| [](../../commands-legacy/get-menu-item-modifiers.md) |
-| [](../../commands-legacy/get-menu-item-parameter.md) |
-| [](../../commands-legacy/get-menu-item-property.md) |
-| [](../../commands-legacy/get-menu-item-style.md) |
-| [](../../commands-legacy/get-menu-items.md) |
-| [](../../commands-legacy/get-menu-title.md) |
-| [](../../commands-legacy/get-selected-menu-item-parameter.md) |
-| [](../../commands-legacy/insert-menu-item.md) |
-| [](../../commands-legacy/menu-selected.md) |
-| [](../../commands-legacy/release-menu.md) |
-| [](../../commands-legacy/set-help-menu.md) |
-| [](../../commands-legacy/set-menu-bar.md) |
-| [](../../commands-legacy/set-menu-item.md) |
-| [](../../commands-legacy/set-menu-item-icon.md) |
-| [](../../commands-legacy/set-menu-item-mark.md) |
-| [](../../commands-legacy/set-menu-item-method.md) |
-| [](../../commands-legacy/set-menu-item-parameter.md) |
-| [](../../commands-legacy/set-menu-item-property.md) |
-| [](../../commands-legacy/set-menu-item-shortcut.md) |
-| [](../../commands-legacy/set-menu-item-style.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Messages.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Messages.md
deleted file mode 100644
index 7b15108273bf3f..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Messages.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: Messages_theme
-title: Messages
-slug: /commands/theme/Messages
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/alert.md) |
-| [](../../commands-legacy/confirm.md) |
-| [](../../commands-legacy/display-notification.md) |
-| [](../../commands-legacy/goto-xy.md) |
-| [](../../commands-legacy/message.md) |
-| [](../../commands-legacy/messages-off.md) |
-| [](../../commands-legacy/messages-on.md) |
-| [](../../commands-legacy/request.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Named_Selections.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Named_Selections.md
deleted file mode 100644
index 1515985f2c48a7..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Named_Selections.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: Named_Selections_theme
-title: Selecciones temporales
-slug: /commands/theme/Named-Selections
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/clear-named-selection.md) |
-| [](../../commands-legacy/copy-named-selection.md) |
-| [](../../commands-legacy/cut-named-selection.md) |
-| [](../../commands-legacy/use-named-selection.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Objects_Forms.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Objects_Forms.md
deleted file mode 100644
index 7f7969c47c9932..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Objects_Forms.md
+++ /dev/null
@@ -1,102 +0,0 @@
----
-id: Objects_Forms_theme
-title: Objetos (formularios)
-slug: /commands/theme/Objects-Forms
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/get-style-sheet-info.md) |
-| [](../../commands-legacy/list-of-style-sheets.md) |
-| [](../../commands-legacy/object-duplicate.md) |
-| [](../../commands-legacy/object-get-action.md) |
-| [](../../commands-legacy/object-get-auto-spellcheck.md) |
-| [](../../commands-legacy/object-get-best-size.md) |
-| [](../../commands-legacy/object-get-border-style.md) |
-| [](../../commands-legacy/object-get-context-menu.md) |
-| [](../../commands-legacy/object-get-coordinates.md) |
-| [](../../commands-legacy/object-get-corner-radius.md) |
-| [](../../commands-legacy/object-get-data-source.md) |
-| [](../../commands-legacy/object-get-drag-and-drop-options.md) |
-| [](../../commands-legacy/object-get-enabled.md) |
-| [](../../commands-legacy/object-get-enterable.md) |
-| [](../../commands-legacy/object-get-events.md) |
-| [](../../commands-legacy/object-get-filter.md) |
-| [](../../commands-legacy/object-get-focus-rectangle-invisible.md) |
-| [](../../commands-legacy/object-get-font.md) |
-| [](../../commands-legacy/object-get-font-size.md) |
-| [](../../commands-legacy/object-get-font-style.md) |
-| [](../../commands-legacy/object-get-format.md) |
-| [](../../commands-legacy/object-get-help-tip.md) |
-| [](../../commands-legacy/object-get-horizontal-alignment.md) |
-| [](../../commands-legacy/object-get-indicator-type.md) |
-| [](../../commands-legacy/object-get-keyboard-layout.md) |
-| [](../../commands-legacy/object-get-list-name.md) |
-| [](../../commands-legacy/object-get-list-reference.md) |
-| [](../../commands-legacy/object-get-maximum-value.md) |
-| [](../../commands-legacy/object-get-minimum-value.md) |
-| [](../../commands-legacy/object-get-multiline.md) |
-| [](../../commands-legacy/object-get-name.md) |
-| [](../../commands-legacy/object-get-placeholder.md) |
-| [](../../commands-legacy/object-get-pointer.md) |
-| [](../../commands-legacy/object-get-print-variable-frame.md) |
-| [](../../commands-legacy/object-get-resizing-options.md) |
-| [](../../commands-legacy/object-get-rgb-colors.md) |
-| [](../../commands-legacy/object-get-scroll-position.md) |
-| [](../../commands-legacy/object-get-scrollbar.md) |
-| [](../../commands-legacy/object-get-shortcut.md) |
-| [](../../commands-legacy/object-get-style-sheet.md) |
-| [](../../commands-legacy/object-get-subform.md) |
-| [](../../commands-legacy/object-get-subform-container-size.md) |
-| [](../../commands-legacy/object-get-subform-container-value.md) |
-| [](../../commands-legacy/object-get-text-orientation.md) |
-| [](../../commands-legacy/object-get-three-states-checkbox.md) |
-| [](../../commands-legacy/object-get-title.md) |
-| [](../../commands-legacy/object-get-type.md) |
-| [](../../commands-legacy/object-get-value.md) |
-| [](../../commands-legacy/object-get-vertical-alignment.md) |
-| [](../../commands-legacy/object-get-visible.md) |
-| [](../../commands-legacy/object-is-styled-text.md) |
-| [](../../commands-legacy/object-move.md) |
-| [](../../commands-legacy/object-set-action.md) |
-| [](../../commands-legacy/object-set-auto-spellcheck.md) |
-| [](../../commands-legacy/object-set-border-style.md) |
-| [](../../commands-legacy/object-set-context-menu.md) |
-| [](../../commands-legacy/object-set-coordinates.md) |
-| [](../../commands-legacy/object-set-corner-radius.md) |
-| [](../../commands-legacy/object-set-data-source.md) |
-| [](../../commands-legacy/object-set-drag-and-drop-options.md) |
-| [](../../commands-legacy/object-set-enabled.md) |
-| [](../../commands-legacy/object-set-enterable.md) |
-| [](../../commands-legacy/object-set-events.md) |
-| [](../../commands-legacy/object-set-filter.md) |
-| [](../../commands-legacy/object-set-focus-rectangle-invisible.md) |
-| [](../../commands-legacy/object-set-font.md) |
-| [](../../commands-legacy/object-set-font-size.md) |
-| [](../../commands-legacy/object-set-font-style.md) |
-| [](../../commands-legacy/object-set-format.md) |
-| [](../../commands-legacy/object-set-help-tip.md) |
-| [](../../commands-legacy/object-set-horizontal-alignment.md) |
-| [](../../commands-legacy/object-set-indicator-type.md) |
-| [](../../commands-legacy/object-set-keyboard-layout.md) |
-| [](../../commands-legacy/object-set-list-by-name.md) |
-| [](../../commands-legacy/object-set-list-by-reference.md) |
-| [](../../commands-legacy/object-set-maximum-value.md) |
-| [](../../commands-legacy/object-set-minimum-value.md) |
-| [](../../commands-legacy/object-set-multiline.md) |
-| [](../../commands-legacy/object-set-placeholder.md) |
-| [](../../commands-legacy/object-set-print-variable-frame.md) |
-| [](../../commands-legacy/object-set-resizing-options.md) |
-| [](../../commands-legacy/object-set-rgb-colors.md) |
-| [](../../commands-legacy/object-set-scroll-position.md) |
-| [](../../commands-legacy/object-set-scrollbar.md) |
-| [](../../commands-legacy/object-set-shortcut.md) |
-| [](../../commands-legacy/object-set-style-sheet.md) |
-| [](../../commands-legacy/object-set-subform.md) |
-| [](../../commands-legacy/object-set-subform-container-value.md) |
-| [](../../commands-legacy/object-set-text-orientation.md) |
-| [](../../commands-legacy/object-set-three-states-checkbox.md) |
-| [](../../commands-legacy/object-set-title.md) |
-| [](../../commands-legacy/object-set-value.md) |
-| [](../../commands-legacy/object-set-vertical-alignment.md) |
-| [](../../commands-legacy/object-set-visible.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Objects_Language.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Objects_Language.md
deleted file mode 100644
index 28b4e0860b8914..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Objects_Language.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-id: Objects_Language_theme
-title: Objetos (Lenguaje)
-slug: /commands/theme/Objects-Language
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/new-object.md) |
-| [](../../commands-legacy/new-shared-object.md) |
-| [](../../commands-legacy/ob-class.md) |
-| [](../../commands-legacy/ob-copy.md) |
-| [](../../commands-legacy/ob-entries.md) |
-| [](../../commands-legacy/ob-get.md) |
-| [](../../commands-legacy/ob-get-array.md) |
-| [](../../commands-legacy/ob-get-property-names.md) |
-| [](../../commands-legacy/ob-get-type.md) |
-| [](../../commands-legacy/ob-instance-of.md) |
-| [](../../commands-legacy/ob-is-defined.md) |
-| [](../../commands-legacy/ob-is-empty.md) |
-| [](../../commands-legacy/ob-is-shared.md) |
-| [](../../commands-legacy/ob-keys.md) |
-| [](../../commands-legacy/ob-remove.md) |
-| [](../../commands-legacy/ob-set.md) |
-| [](../../commands-legacy/ob-set-array.md) |
-| [](../../commands-legacy/ob-set-null.md) |
-| [](../../commands-legacy/ob-values.md) |
-| [](../../commands-legacy/storage.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/On_a_Series.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/On_a_Series.md
deleted file mode 100644
index 14fb58a8d21ea3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/On_a_Series.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-id: On_a_Series_theme
-title: Funciones estadísticas
-slug: /commands/theme/On-a-Series
----
-
-| |
-| ----------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/average.md) |
-| [](../../commands-legacy/max.md) |
-| [](../../commands-legacy/min.md) |
-| [](../../commands-legacy/std-deviation.md) |
-| [](../../commands-legacy/sum.md) |
-| [](../../commands-legacy/sum-squares.md) |
-| [](../../commands-legacy/variance.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/PHP.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/PHP.md
deleted file mode 100644
index 8513311bb2e840..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/PHP.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: PHP_theme
-title: PHP
-slug: /commands/theme/PHP
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/php-execute.md) |
-| [](../../commands-legacy/php-get-full-response.md) |
-| [](../../commands-legacy/php-get-option.md) |
-| [](../../commands-legacy/php-set-option.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Pasteboard.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Pasteboard.md
deleted file mode 100644
index 36eeaed58dc7dc..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Pasteboard.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-id: Pasteboard_theme
-title: Portapapeles
-slug: /commands/theme/Pasteboard
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/append-data-to-pasteboard.md) |
-| [](../../commands-legacy/clear-pasteboard.md) |
-| [](../../commands-legacy/get-file-from-pasteboard.md) |
-| [](../../commands-legacy/get-pasteboard-data.md) |
-| [](../../commands-legacy/get-pasteboard-data-type.md) |
-| [](../../commands-legacy/get-picture-from-pasteboard.md) |
-| [](../../commands-legacy/get-text-from-pasteboard.md) |
-| [](../../commands-legacy/pasteboard-data-size.md) |
-| [](../../commands-legacy/set-file-to-pasteboard.md) |
-| [](../../commands-legacy/set-picture-to-pasteboard.md) |
-| [](../../commands-legacy/set-text-to-pasteboard.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Pictures.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Pictures.md
deleted file mode 100644
index ed07b55a537370..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Pictures.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-id: Pictures_theme
-title: Imágenes
-slug: /commands/theme/Pictures
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/blob-to-picture.md) |
-| [](../../commands-legacy/combine-pictures.md) |
-| [](../../commands-legacy/convert-picture.md) |
-| [](../../commands-legacy/create-thumbnail.md) |
-| [](../../commands-legacy/equal-pictures.md) |
-| [](../../commands-legacy/get-picture-file-name.md) |
-| [](../../commands-legacy/get-picture-formats.md) |
-| [](../../commands-legacy/get-picture-from-library.md) |
-| [](../../commands-legacy/get-picture-keywords.md) |
-| [](../../commands-legacy/get-picture-metadata.md) |
-| [](../../commands-legacy/is-picture-file.md) |
-| [](../../commands-legacy/picture-codec-list.md) |
-| [](../../commands-legacy/picture-library-list.md) |
-| [](../../commands-legacy/picture-properties.md) |
-| [](../../commands-legacy/picture-size.md) |
-| [](../../commands-legacy/picture-to-blob.md) |
-| [](../../commands-legacy/read-picture-file.md) |
-| [](../../commands-legacy/remove-picture-from-library.md) |
-| [](../../commands-legacy/set-picture-file-name.md) |
-| [](../../commands-legacy/set-picture-metadata.md) |
-| [](../../commands-legacy/set-picture-to-library.md) |
-| [](../../commands-legacy/transform-picture.md) |
-| [](../../commands-legacy/write-picture-file.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Printing.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Printing.md
deleted file mode 100644
index dd67d80b5b4d92..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Printing.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-id: Printing_theme
-title: Impresiones
-slug: /commands/theme/Printing
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/accumulate.md) |
-| [](../../commands-legacy/blob-to-print-settings.md) |
-| [](../../commands-legacy/break-level.md) |
-| [](../../commands-legacy/close-printing-job.md) |
-| [](../../commands-legacy/get-current-printer.md) |
-| [](../../commands-legacy/get-print-marker.md) |
-| [](../../commands-legacy/get-print-option.md) |
-| [](../../commands-legacy/get-print-preview.md) |
-| [](../../commands-legacy/get-printable-area.md) |
-| [](../../commands-legacy/get-printable-margin.md) |
-| [](../../commands-legacy/get-printed-height.md) |
-| [](../../commands-legacy/is-in-print-preview.md) |
-| [](../../commands-legacy/level.md) |
-| [](../../commands-legacy/open-printing-job.md) |
-| [](../../commands-legacy/page-break.md) |
-| [](../../commands/print-form.md) |
-| [](../../commands-legacy/print-label.md) |
-| [](../../commands-legacy/print-object.md) |
-| [](../../commands-legacy/print-option-values.md) |
-| [](../../commands-legacy/print-record.md) |
-| [](../../commands-legacy/print-selection.md) |
-| [](../../commands-legacy/print-settings.md) |
-| [](../../commands-legacy/print-settings-to-blob.md) |
-| [](../../commands-legacy/printers-list.md) |
-| [](../../commands-legacy/printing-page.md) |
-| [](../../commands-legacy/set-current-printer.md) |
-| [](../../commands-legacy/set-print-marker.md) |
-| [](../../commands-legacy/set-print-option.md) |
-| [](../../commands-legacy/set-print-preview.md) |
-| [](../../commands-legacy/set-printable-margin.md) |
-| [](../../commands-legacy/subtotal.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Process_Communications.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Process_Communications.md
deleted file mode 100644
index a0e7c1629b1b6e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Process_Communications.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-id: Process_Communications_theme
-title: Process (Communications)
-slug: /commands/theme/Process-Communications
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/call-worker.md) |
-| [](../../commands-legacy/clear-semaphore.md) |
-| [](../../commands-legacy/get-process-variable.md) |
-| [](../../commands-legacy/kill-worker.md) |
-| [](../../commands/new-signal.md) |
-| [](../../commands-legacy/semaphore.md) |
-| [](../../commands-legacy/set-process-variable.md) |
-| [](../../commands-legacy/test-semaphore.md) |
-| [](../../commands-legacy/variable-to-variable.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Process_User_Interface.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Process_User_Interface.md
deleted file mode 100644
index 50fa636767ffac..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Process_User_Interface.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: Process_User_Interface_theme
-title: Proceso (interfaz de usuario)
-slug: /commands/theme/Process-User-Interface
----
-
-| |
-| ------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/bring-to-front.md) |
-| [](../../commands-legacy/frontmost-process.md) |
-| [](../../commands-legacy/hide-process.md) |
-| [](../../commands-legacy/show-process.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Processes.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Processes.md
deleted file mode 100644
index 25efd35b4d471e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Processes.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-id: Processes_theme
-title: Procesos
-slug: /commands/theme/Processes
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/abort-process-by-id.md) |
-| [](../../commands-legacy/count-tasks.md) |
-| [](../../commands-legacy/count-user-processes.md) |
-| [](../../commands-legacy/count-users.md) |
-| [](../../commands-legacy/current-process.md) |
-| [](../../commands-legacy/current-process-name.md) |
-| [](../../commands-legacy/delay-process.md) |
-| [](../../commands-legacy/execute-on-client.md) |
-| [](../../commands-legacy/execute-on-server.md) |
-| [](../../commands-legacy/get-registered-clients.md) |
-| [](../../commands-legacy/new-process.md) |
-| [](../../commands-legacy/pause-process.md) |
-| [](../../commands-legacy/process-aborted.md) |
-| [](../../commands/process-activity.md) |
-| [](../../commands/process-info.md) |
-| [](../../commands/process-number.md) |
-| [](../../commands-legacy/process-state.md) |
-| [](../../commands-legacy/register-client.md) |
-| [](../../commands-legacy/resume-process.md) |
-| [](../../commands/session.md) |
-| [](../../commands/session-info.md) |
-| [](../../commands/session-storage.md) |
-| [](../../commands-legacy/unregister-client.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Queries.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Queries.md
deleted file mode 100644
index 4e9aff05a22c7a..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Queries.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-id: Queries_theme
-title: Búsquedas
-slug: /commands/theme/Queries
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/describe-query-execution.md) |
-| [](../../commands-legacy/find-in-field.md) |
-| [](../../commands-legacy/get-query-destination.md) |
-| [](../../commands-legacy/get-query-limit.md) |
-| [](../../commands-legacy/last-query-path.md) |
-| [](../../commands-legacy/last-query-plan.md) |
-| [](../../commands-legacy/order-by.md) |
-| [](../../commands-legacy/order-by-attribute.md) |
-| [](../../commands-legacy/order-by-formula.md) |
-| [](../../commands-legacy/query.md) |
-| [](../../commands-legacy/query-by-attribute.md) |
-| [](../../commands-legacy/query-by-example.md) |
-| [](../../commands-legacy/query-by-formula.md) |
-| [](../../commands-legacy/query-selection.md) |
-| [](../../commands-legacy/query-selection-by-attribute.md) |
-| [](../../commands-legacy/query-selection-by-formula.md) |
-| [](../../commands-legacy/query-selection-with-array.md) |
-| [](../../commands-legacy/query-with-array.md) |
-| [](../../commands-legacy/set-query-and-lock.md) |
-| [](../../commands-legacy/set-query-destination.md) |
-| [](../../commands-legacy/set-query-limit.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Quick_Report.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Quick_Report.md
deleted file mode 100644
index fc3877471e72fb..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Quick_Report.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-id: Quick_Report_theme
-title: Informes rápidos
-slug: /commands/theme/Quick-Report
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/qr-blob-to-report.md) |
-| [](../../commands-legacy/qr-count-columns.md) |
-| [](../../commands-legacy/qr-delete-column.md) |
-| [](../../commands-legacy/qr-delete-offscreen-area.md) |
-| [](../../commands-legacy/qr-execute-command.md) |
-| [](../../commands-legacy/qr-find-column.md) |
-| [](../../commands-legacy/qr-get-area-property.md) |
-| [](../../commands-legacy/qr-get-borders.md) |
-| [](../../commands-legacy/qr-get-command-status.md) |
-| [](../../commands-legacy/qr-get-destination.md) |
-| [](../../commands-legacy/qr-get-document-property.md) |
-| [](../../commands-legacy/qr-get-drop-column.md) |
-| [](../../commands-legacy/qr-get-header-and-footer.md) |
-| [](../../commands-legacy/qr-get-html-template.md) |
-| [](../../commands-legacy/qr-get-info-column.md) |
-| [](../../commands-legacy/qr-get-info-row.md) |
-| [](../../commands-legacy/qr-get-report-kind.md) |
-| [](../../commands-legacy/qr-get-report-table.md) |
-| [](../../commands-legacy/qr-get-selection.md) |
-| [](../../commands-legacy/qr-get-sorts.md) |
-| [](../../commands-legacy/qr-get-text-property.md) |
-| [](../../commands-legacy/qr-get-totals-data.md) |
-| [](../../commands-legacy/qr-get-totals-spacing.md) |
-| [](../../commands-legacy/qr-insert-column.md) |
-| [](../../commands-legacy/qr-move-column.md) |
-| [](../../commands-legacy/qr-new-area.md) |
-| [](../../commands-legacy/qr-new-offscreen-area.md) |
-| [](../../commands-legacy/qr-on-command.md) |
-| [](../../commands-legacy/qr-report.md) |
-| [](../../commands-legacy/qr-report-to-blob.md) |
-| [](../../commands-legacy/qr-run.md) |
-| [](../../commands-legacy/qr-set-area-property.md) |
-| [](../../commands-legacy/qr-set-borders.md) |
-| [](../../commands-legacy/qr-set-destination.md) |
-| [](../../commands-legacy/qr-set-document-property.md) |
-| [](../../commands-legacy/qr-set-header-and-footer.md) |
-| [](../../commands-legacy/qr-set-html-template.md) |
-| [](../../commands-legacy/qr-set-info-column.md) |
-| [](../../commands-legacy/qr-set-info-row.md) |
-| [](../../commands-legacy/qr-set-report-kind.md) |
-| [](../../commands-legacy/qr-set-report-table.md) |
-| [](../../commands-legacy/qr-set-selection.md) |
-| [](../../commands-legacy/qr-set-sorts.md) |
-| [](../../commands-legacy/qr-set-text-property.md) |
-| [](../../commands-legacy/qr-set-totals-data.md) |
-| [](../../commands-legacy/qr-set-totals-spacing.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Record_Locking.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Record_Locking.md
deleted file mode 100644
index e96f21092c5231..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Record_Locking.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: Record_Locking_theme
-title: Bloqueo de registros
-slug: /commands/theme/Record-Locking
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/load-record.md) |
-| [](../../commands-legacy/locked.md) |
-| [](../../commands-legacy/locked-by.md) |
-| [](../../commands-legacy/locked-records-info.md) |
-| [](../../commands-legacy/read-only.md) |
-| [](../../commands-legacy/read-only-state.md) |
-| [](../../commands-legacy/read-write.md) |
-| [](../../commands-legacy/unload-record.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Records.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Records.md
deleted file mode 100644
index 350fe964c6c58b..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Records.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-id: Records_theme
-title: Registros
-slug: /commands/theme/Records
----
-
-| |
-| ----------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/create-record.md) |
-| [](../../commands-legacy/delete-record.md) |
-| [](../../commands-legacy/display-record.md) |
-| [](../../commands-legacy/duplicate-record.md) |
-| [](../../commands-legacy/goto-record.md) |
-| [](../../commands-legacy/goto-record.md) |
-| [](../../commands-legacy/is-record-loaded.md) |
-| [](../../commands-legacy/modified-record.md) |
-| [](../../commands-legacy/pop-record.md) |
-| [](../../commands-legacy/push-record.md) |
-| [](../../commands-legacy/record-number.md) |
-| [](../../commands-legacy/records-in-table.md) |
-| [](../../commands-legacy/save-record.md) |
-| [](../../commands-legacy/sequence-number.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Relations.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Relations.md
deleted file mode 100644
index 7a88175eb49057..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Relations.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-id: Relations_theme
-title: Relaciones
-slug: /commands/theme/Relations
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/create-related-one.md) |
-| [](../../commands-legacy/get-automatic-relations.md) |
-| [](../../commands-legacy/get-field-relation.md) |
-| [](../../commands-legacy/old-related-many.md) |
-| [](../../commands-legacy/old-related-one.md) |
-| [](../../commands-legacy/relate-many.md) |
-| [](../../commands-legacy/relate-many-selection.md) |
-| [](../../commands-legacy/relate-one.md) |
-| [](../../commands-legacy/relate-one-selection.md) |
-| [](../../commands-legacy/save-related-one.md) |
-| [](../../commands-legacy/set-automatic-relations.md) |
-| [](../../commands-legacy/set-field-relation.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Resources.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Resources.md
deleted file mode 100644
index a72d8cb27aad00..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Resources.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-id: Resources_theme
-title: Resources
-slug: /commands/theme/Resources
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/close-resource-file.md) |
-| [](../../commands-legacy/get-indexed-string.md) |
-| [](../../commands-legacy/get-picture-resource.md) |
-| [](../../commands-legacy/get-resource.md) |
-| [](../../commands-legacy/get-resource-name.md) |
-| [](../../commands-legacy/get-resource-properties.md) |
-| [](../../commands-legacy/get-string-resource.md) |
-| [](../../commands-legacy/get-text-resource.md) |
-| [](../../commands-legacy/open-resource-file.md) |
-| [](../../commands-legacy/resource-list.md) |
-| [](../../commands-legacy/resource-type-list.md) |
-| [](../../commands-legacy/string-list-to-array.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/SQL.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/SQL.md
deleted file mode 100644
index bebee726977df0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/SQL.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: SQL_theme
-title: SQL
-slug: /commands/theme/SQL
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/begin-sql.md) |
-| [](../../commands-legacy/end-sql.md) |
-| [](../../commands-legacy/is-field-value-null.md) |
-| [](../../commands-legacy/query-by-sql.md) |
-| [](../../commands-legacy/set-field-value-null.md) |
-| [](../../commands-legacy/sql-cancel-load.md) |
-| [](../../commands-legacy/sql-end-selection.md) |
-| [](../../commands-legacy/sql-execute.md) |
-| [](../../commands-legacy/sql-execute-script.md) |
-| [](../../commands-legacy/sql-export-database.md) |
-| [](../../commands-legacy/sql-export-selection.md) |
-| [](../../commands-legacy/sql-get-current-data-source.md) |
-| [](../../commands-legacy/sql-get-data-source-list.md) |
-| [](../../commands-legacy/sql-get-last-error.md) |
-| [](../../commands-legacy/sql-get-option.md) |
-| [](../../commands-legacy/sql-load-record.md) |
-| [](../../commands-legacy/sql-login.md) |
-| [](../../commands-legacy/sql-logout.md) |
-| [](../../commands-legacy/sql-set-option.md) |
-| [](../../commands-legacy/sql-set-parameter.md) |
-| [](../../commands-legacy/start-sql-server.md) |
-| [](../../commands-legacy/stop-sql-server.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/SVG.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/SVG.md
deleted file mode 100644
index 72c7bb149aa73e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/SVG.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-id: SVG_theme
-title: SVG
-slug: /commands/theme/SVG
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/svg-export-to-picture.md) |
-| [](../../commands-legacy/svg-find-element-id-by-coordinates.md) |
-| [](../../commands-legacy/svg-find-element-ids-by-rect.md) |
-| [](../../commands-legacy/svg-get-attribute.md) |
-| [](../../commands-legacy/svg-set-attribute.md) |
-| [](../../commands-legacy/svg-show-element.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Secured_Protocol.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Secured_Protocol.md
deleted file mode 100644
index 9ad0305ff2b2e7..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Secured_Protocol.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-id: Secured_Protocol_theme
-title: Protocolo seguro
-slug: /commands/theme/Secured-Protocol
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/generate-certificate-request.md) |
-| [](../../commands-legacy/generate-encryption-keypair.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Selection.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Selection.md
deleted file mode 100644
index 02c773aaf6c587..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Selection.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: Selection_theme
-title: Selección
-slug: /commands/theme/Selection
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/all-records.md) |
-| [](../../commands-legacy/apply-to-selection.md) |
-| [](../../commands-legacy/before-selection.md) |
-| [](../../commands-legacy/create-selection-from-array.md) |
-| [](../../commands-legacy/delete-selection.md) |
-| [](../../commands-legacy/display-selection.md) |
-| [](../../commands-legacy/displayed-line-number.md) |
-| [](../../commands-legacy/end-selection.md) |
-| [](../../commands-legacy/first-record.md) |
-| [](../../commands-legacy/get-highlighted-records.md) |
-| [](../../commands-legacy/goto-selected-record.md) |
-| [](../../commands-legacy/highlight-records.md) |
-| [](../../commands-legacy/last-record.md) |
-| [](../../commands-legacy/modify-selection.md) |
-| [](../../commands-legacy/next-record.md) |
-| [](../../commands-legacy/one-record-select.md) |
-| [](../../commands-legacy/previous-record.md) |
-| [](../../commands-legacy/records-in-selection.md) |
-| [](../../commands-legacy/reduce-selection.md) |
-| [](../../commands-legacy/scan-index.md) |
-| [](../../commands-legacy/selected-record-number.md) |
-| [](../../commands-legacy/truncate-table.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Sets.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Sets.md
deleted file mode 100644
index 2620e28519ecac..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Sets.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-id: Sets_theme
-title: Conjuntos
-slug: /commands/theme/Sets
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/add-to-set.md) |
-| [](../../commands-legacy/clear-set.md) |
-| [](../../commands-legacy/copy-set.md) |
-| [](../../commands-legacy/create-empty-set.md) |
-| [](../../commands-legacy/create-set.md) |
-| [](../../commands-legacy/create-set-from-array.md) |
-| [](../../commands-legacy/difference.md) |
-| [](../../commands-legacy/intersection.md) |
-| [](../../commands-legacy/is-in-set.md) |
-| [](../../commands-legacy/load-set.md) |
-| [](../../commands-legacy/records-in-set.md) |
-| [](../../commands-legacy/remove-from-set.md) |
-| [](../../commands-legacy/save-set.md) |
-| [](../../commands-legacy/union.md) |
-| [](../../commands-legacy/use-set.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Spell_Checker.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Spell_Checker.md
deleted file mode 100644
index c1a0d3074b92bc..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Spell_Checker.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-id: Spell_Checker_theme
-title: Corrector ortográfico
-slug: /commands/theme/Spell-Checker
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/spell-add-to-user-dictionary.md) |
-| [](../../commands-legacy/spell-check-text.md) |
-| [](../../commands-legacy/spell-checking.md) |
-| [](../../commands-legacy/spell-get-current-dictionary.md) |
-| [](../../commands-legacy/spell-get-dictionary-list.md) |
-| [](../../commands-legacy/spell-set-current-dictionary.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/String.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/String.md
deleted file mode 100644
index 5398a600bff92b..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/String.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-id: String_theme
-title: String
-slug: /commands/theme/String
----
-
-| |
-| ------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/change-string.md) |
-| [](../../commands-legacy/char.md) |
-| [](../../commands-legacy/character-code.md) |
-| [](../../commands-legacy/compare-strings.md) |
-| [](../../commands-legacy/convert-from-text.md) |
-| [](../../commands-legacy/convert-to-text.md) |
-| [](../../commands-legacy/delete-string.md) |
-| [](../../commands-legacy/get-text-keywords.md) |
-| [](../../commands-legacy/insert-string.md) |
-| [](../../commands-legacy/length.md) |
-| [](../../commands-legacy/localized-string.md) |
-| [](../../commands-legacy/lowercase.md) |
-| [](../../commands-legacy/match-regex.md) |
-| [](../../commands-legacy/num.md) |
-| [](../../commands-legacy/position.md) |
-| [](../../commands-legacy/replace-string.md) |
-| [](../../commands-legacy/split-string.md) |
-| [](../../commands-legacy/string.md) |
-| [](../../commands-legacy/substring.md) |
-| [](../../commands-legacy/uppercase.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Structure_Access.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Structure_Access.md
deleted file mode 100644
index 1a11edf8ef30b9..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Structure_Access.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-id: Structure_Access_theme
-title: Definición estructura
-slug: /commands/theme/Structure-Access
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/create-index.md) |
-| [](../../commands-legacy/delete-index.md) |
-| [](../../commands-legacy/export-structure.md) |
-| [](../../commands-legacy/field.md) |
-| [](../../commands-legacy/field-name.md) |
-| [](../../commands-legacy/get-external-data-path.md) |
-| [](../../commands-legacy/get-field-entry-properties.md) |
-| [](../../commands-legacy/get-field-properties.md) |
-| [](../../commands-legacy/get-missing-table-names.md) |
-| [](../../commands-legacy/get-relation-properties.md) |
-| [](../../commands-legacy/get-table-properties.md) |
-| [](../../commands-legacy/import-structure.md) |
-| [](../../commands-legacy/is-field-number-valid.md) |
-| [](../../commands-legacy/is-table-number-valid.md) |
-| [](../../commands-legacy/last-field-number.md) |
-| [](../../commands-legacy/last-table-number.md) |
-| [](../../commands-legacy/pause-indexes.md) |
-| [](../../commands-legacy/regenerate-missing-table.md) |
-| [](../../commands-legacy/reload-external-data.md) |
-| [](../../commands-legacy/resume-indexes.md) |
-| [](../../commands-legacy/set-external-data-path.md) |
-| [](../../commands-legacy/set-index.md) |
-| [](../../commands-legacy/table.md) |
-| [](../../commands-legacy/table-name.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Styled_Text.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Styled_Text.md
deleted file mode 100644
index 5163e15baf88f3..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Styled_Text.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-id: Styled_Text_theme
-title: Texto multiestilo
-slug: /commands/theme/Styled-Text
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/st-compute-expressions.md) |
-| [](../../commands-legacy/st-freeze-expressions.md) |
-| [](../../commands-legacy/st-get-attributes.md) |
-| [](../../commands-legacy/st-get-content-type.md) |
-| [](../../commands-legacy/st-get-expression.md) |
-| [](../../commands-legacy/st-get-options.md) |
-| [](../../commands-legacy/st-get-plain-text.md) |
-| [](../../commands-legacy/st-get-text.md) |
-| [](../../commands-legacy/st-get-url.md) |
-| [](../../commands-legacy/st-insert-expression.md) |
-| [](../../commands-legacy/st-insert-url.md) |
-| [](../../commands-legacy/st-set-attributes.md) |
-| [](../../commands-legacy/st-set-options.md) |
-| [](../../commands-legacy/st-set-plain-text.md) |
-| [](../../commands-legacy/st-set-text.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Subrecords.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Subrecords.md
deleted file mode 100644
index 44679a8baeb958..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Subrecords.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-id: Subrecords_theme
-title: Subregistros
-slug: /commands/theme/Subrecords
----
-
-| |
-| ------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/get-subrecord-key.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/System_Documents.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/System_Documents.md
deleted file mode 100644
index feb37cf75b49cf..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/System_Documents.md
+++ /dev/null
@@ -1,41 +0,0 @@
----
-id: System_Documents_theme
-title: Documentos sistema
-slug: /commands/theme/System-Documents
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/append-document.md) |
-| [](../../commands-legacy/close-document.md) |
-| [](../../commands-legacy/convert-path-posix-to-system.md) |
-| [](../../commands-legacy/convert-path-system-to-posix.md) |
-| [](../../commands-legacy/copy-document.md) |
-| [](../../commands-legacy/create-alias.md) |
-| [](../../commands-legacy/create-document.md) |
-| [](../../commands-legacy/create-folder.md) |
-| [](../../commands-legacy/delete-document.md) |
-| [](../../commands-legacy/delete-folder.md) |
-| [](../../commands-legacy/document-list.md) |
-| [](../../commands-legacy/document-to-text.md) |
-| [](../../commands-legacy/folder-list.md) |
-| [](../../commands-legacy/get-document-icon.md) |
-| [](../../commands-legacy/get-document-position.md) |
-| [](../../commands-legacy/get-document-properties.md) |
-| [](../../commands-legacy/get-document-size.md) |
-| [](../../commands-legacy/localized-document-path.md) |
-| [](../../commands-legacy/move-document.md) |
-| [](../../commands-legacy/object-to-path.md) |
-| [](../../commands-legacy/open-document.md) |
-| [](../../commands-legacy/path-to-object.md) |
-| [](../../commands-legacy/resolve-alias.md) |
-| [](../../commands-legacy/select-document.md) |
-| [](../../commands-legacy/select-folder.md) |
-| [](../../commands-legacy/set-document-position.md) |
-| [](../../commands-legacy/set-document-properties.md) |
-| [](../../commands-legacy/set-document-size.md) |
-| [](../../commands-legacy/show-on-disk.md) |
-| [](../../commands-legacy/test-path-name.md) |
-| [](../../commands-legacy/text-to-document.md) |
-| [](../../commands-legacy/volume-attributes.md) |
-| [](../../commands-legacy/volume-list.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/System_Environment.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/System_Environment.md
deleted file mode 100644
index 11f3faa06acdec..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/System_Environment.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-id: System_Environment_theme
-title: Entorno sistema
-slug: /commands/theme/System-Environment
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/count-screens.md) |
-| [](../../commands-legacy/current-client-authentication.md) |
-| [](../../commands-legacy/current-machine.md) |
-| [](../../commands-legacy/current-system-user.md) |
-| [](../../commands-legacy/font-file.md) |
-| [](../../commands-legacy/font-list.md) |
-| [](../../commands-legacy/font-style-list.md) |
-| [](../../commands-legacy/get-system-format.md) |
-| [](../../commands-legacy/is-macos.md) |
-| [](../../commands-legacy/is-windows.md) |
-| [](../../commands-legacy/log-event.md) |
-| [](../../commands-legacy/menu-bar-height.md) |
-| [](../../commands-legacy/menu-bar-screen.md) |
-| [](../../commands-legacy/open-color-picker.md) |
-| [](../../commands-legacy/open-font-picker.md) |
-| [](../../commands-legacy/screen-coordinates.md) |
-| [](../../commands-legacy/screen-depth.md) |
-| [](../../commands-legacy/screen-height.md) |
-| [](../../commands-legacy/screen-width.md) |
-| [](../../commands-legacy/select-rgb-color.md) |
-| [](../../commands-legacy/set-recent-fonts.md) |
-| [](../../commands-legacy/system-folder.md) |
-| [](../../commands-legacy/system-info.md) |
-| [](../../commands-legacy/temporary-folder.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Table.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Table.md
deleted file mode 100644
index f2c45ac99fcd17..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Table.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: Table_theme
-title: Tabla
-slug: /commands/theme/Table
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/current-default-table.md) |
-| [](../../commands-legacy/current-form-table.md) |
-| [](../../commands-legacy/default-table.md) |
-| [](../../commands-legacy/no-default-table.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Tools.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Tools.md
deleted file mode 100644
index b6568846d62995..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Tools.md
+++ /dev/null
@@ -1,27 +0,0 @@
----
-id: Tools_theme
-title: Herramientas
-slug: /commands/theme/Tools
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/activity-snapshot.md) |
-| [](../../commands-legacy/base64-decode.md) |
-| [](../../commands-legacy/base64-encode.md) |
-| [](../../commands-legacy/choose.md) |
-| [](../../commands-legacy/generate-digest.md) |
-| [](../../commands-legacy/generate-password-hash.md) |
-| [](../../commands-legacy/generate-uuid.md) |
-| [](../../commands-legacy/get-macro-parameter.md) |
-| [](../../commands-legacy/launch-external-process.md) |
-| [](../../commands-legacy/load-4d-view-document.md) |
-| [](../../commands-legacy/mobile-app-refresh-sessions.md) |
-| [](../../commands-legacy/monitored-activity.md) |
-| [](../../commands-legacy/open-url.md) |
-| [](../../commands-legacy/process-4d-tags.md) |
-| [](../../commands-legacy/set-environment-variable.md) |
-| [](../../commands-legacy/set-macro-parameter.md) |
-| [](../../commands-legacy/start-monitoring-activity.md) |
-| [](../../commands-legacy/stop-monitoring-activity.md) |
-| [](../../commands-legacy/verify-password-hash.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Transactions.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Transactions.md
deleted file mode 100644
index ea882859bc654e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Transactions.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-id: Transactions_theme
-title: Transacciones
-slug: /commands/theme/Transactions
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/active-transaction.md) |
-| [](../../commands-legacy/cancel-transaction.md) |
-| [](../../commands-legacy/in-transaction.md) |
-| [](../../commands-legacy/resume-transaction.md) |
-| [](../../commands-legacy/start-transaction.md) |
-| [](../../commands-legacy/suspend-transaction.md) |
-| [](../../commands-legacy/transaction-level.md) |
-| [](../../commands-legacy/validate-transaction.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Triggers.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Triggers.md
deleted file mode 100644
index 0bbae684d29f75..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Triggers.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-id: Triggers_theme
-title: Triggers
-slug: /commands/theme/Triggers
----
-
-| |
-| --------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/trigger-event.md) |
-| [](../../commands-legacy/trigger-level.md) |
-| [](../../commands-legacy/trigger-properties.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/User_Interface.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/User_Interface.md
deleted file mode 100644
index 7883ace4f5b720..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/User_Interface.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-id: User_Interface_theme
-title: Interfaz de usuario
-slug: /commands/theme/User-Interface
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/beep.md) |
-| [](../../commands-legacy/caps-lock-down.md) |
-| [](../../commands-legacy/focus-object.md) |
-| [](../../commands-legacy/get-application-color-scheme.md) |
-| [](../../commands-legacy/get-field-titles.md) |
-| [](../../commands-legacy/get-table-titles.md) |
-| [](../../commands-legacy/hide-menu-bar.md) |
-| [](../../commands-legacy/macintosh-command-down.md) |
-| [](../../commands-legacy/macintosh-control-down.md) |
-| [](../../commands-legacy/macintosh-option-down.md) |
-| [](../../commands-legacy/mouse-position.md) |
-| [](../../commands-legacy/play.md) |
-| [](../../commands-legacy/pop-up-menu.md) |
-| [](../../commands-legacy/post-click.md) |
-| [](../../commands-legacy/post-event.md) |
-| [](../../commands-legacy/post-key.md) |
-| [](../../commands-legacy/redraw.md) |
-| [](../../commands-legacy/set-about.md) |
-| [](../../commands-legacy/set-application-color-scheme.md) |
-| [](../../commands-legacy/set-cursor.md) |
-| [](../../commands-legacy/set-field-titles.md) |
-| [](../../commands-legacy/set-table-titles.md) |
-| [](../../commands-legacy/shift-down.md) |
-| [](../../commands-legacy/show-menu-bar.md) |
-| [](../../commands-legacy/windows-alt-down.md) |
-| [](../../commands-legacy/windows-ctrl-down.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Users_and_Groups.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Users_and_Groups.md
deleted file mode 100644
index 72abf80fcd49e5..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Users_and_Groups.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-id: Users_and_Groups_theme
-title: Usuarios y grupos
-slug: /commands/theme/Users-and-Groups
----
-
-| |
-| ------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/blob-to-users.md) |
-| [](../../commands-legacy/change-current-user.md) |
-| [](../../commands-legacy/change-password.md) |
-| [](../../commands-legacy/current-user.md) |
-| [](../../commands-legacy/delete-user.md) |
-| [](../../commands-legacy/edit-access.md) |
-| [](../../commands-legacy/get-default-user.md) |
-| [](../../commands-legacy/get-group-access.md) |
-| [](../../commands-legacy/get-group-list.md) |
-| [](../../commands-legacy/get-group-properties.md) |
-| [](../../commands-legacy/get-plugin-access.md) |
-| [](../../commands-legacy/get-user-list.md) |
-| [](../../commands-legacy/get-user-properties.md) |
-| [](../../commands-legacy/is-user-deleted.md) |
-| [](../../commands-legacy/set-group-access.md) |
-| [](../../commands-legacy/set-group-properties.md) |
-| [](../../commands-legacy/set-plugin-access.md) |
-| [](../../commands-legacy/set-user-alias.md) |
-| [](../../commands-legacy/set-user-properties.md) |
-| [](../../commands-legacy/user-in-group.md) |
-| [](../../commands-legacy/users-to-blob.md) |
-| [](../../commands-legacy/validate-password.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Variables.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Variables.md
deleted file mode 100644
index 48fa18a58d8c83..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Variables.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-id: Variables_theme
-title: Variables
-slug: /commands/theme/Variables
----
-
-| |
-| ------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/clear-variable.md) |
-| [](../../commands-legacy/load-variables.md) |
-| [](../../commands-legacy/save-variables.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Area.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Area.md
deleted file mode 100644
index c313437f77d794..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Area.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-id: Web_Area_theme
-title: Área Web
-slug: /commands/theme/Web-Area
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/wa-back-url-available.md) |
-| [](../../commands-legacy/wa-create-url-history-menu.md) |
-| [](../../commands-legacy/wa-evaluate-javascript.md) |
-| [](../../commands-legacy/wa-execute-javascript-function.md) |
-| [](../../commands-legacy/wa-forward-url-available.md) |
-| [](../../commands/wa-get-context.md) |
-| [](../../commands-legacy/wa-get-current-url.md) |
-| [](../../commands-legacy/wa-get-external-links-filters.md) |
-| [](../../commands-legacy/wa-get-last-filtered-url.md) |
-| [](../../commands-legacy/wa-get-last-url-error.md) |
-| [](../../commands-legacy/wa-get-page-content.md) |
-| [](../../commands-legacy/wa-get-page-title.md) |
-| [](../../commands-legacy/wa-get-preference.md) |
-| [](../../commands-legacy/wa-get-url-filters.md) |
-| [](../../commands-legacy/wa-get-url-history.md) |
-| [](../../commands-legacy/wa-open-back-url.md) |
-| [](../../commands-legacy/wa-open-forward-url.md) |
-| [](../../commands-legacy/wa-open-url.md) |
-| [](../../commands-legacy/wa-open-web-inspector.md) |
-| [](../../commands-legacy/wa-refresh-current-url.md) |
-| [](../../commands-legacy/wa-run-offscreen-area.md) |
-| [](../../commands/wa-set-context.md) |
-| [](../../commands-legacy/wa-set-external-links-filters.md) |
-| [](../../commands-legacy/wa-set-page-content.md) |
-| [](../../commands-legacy/wa-set-preference.md) |
-| [](../../commands-legacy/wa-set-url-filters.md) |
-| [](../../commands-legacy/wa-stop-loading-url.md) |
-| [](../../commands-legacy/wa-zoom-in.md) |
-| [](../../commands-legacy/wa-zoom-out.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Server.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Server.md
deleted file mode 100644
index 7d4ced289e8e8e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Server.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-id: Web_Server_theme
-title: Servidor Web
-slug: /commands/theme/Web-Server
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/web-get-body-part.md) |
-| [](../../commands-legacy/web-get-body-part-count.md) |
-| [](../../commands-legacy/web-get-current-session-id.md) |
-| [](../../commands-legacy/web-get-http-body.md) |
-| [](../../commands-legacy/web-get-http-header.md) |
-| [](../../commands-legacy/web-get-option.md) |
-| [](../../commands-legacy/web-get-server-info.md) |
-| [](../../commands-legacy/web-get-statistics.md) |
-| [](../../commands-legacy/web-get-variables.md) |
-| [](../../commands-legacy/web-is-secured-connection.md) |
-| [](../../commands-legacy/web-is-server-running.md) |
-| [](../../commands-legacy/web-legacy-close-session.md) |
-| [](../../commands-legacy/web-legacy-get-session-expiration.md) |
-| [](../../commands-legacy/web-send-blob.md) |
-| [](../../commands-legacy/web-send-file.md) |
-| [](../../commands-legacy/web-send-http-redirect.md) |
-| [](../../commands-legacy/web-send-raw-data.md) |
-| [](../../commands-legacy/web-send-text.md) |
-| [](../../commands/web-server.md) |
-| [](../../commands/web-server-list.md) |
-| [](../../commands-legacy/web-set-home-page.md) |
-| [](../../commands-legacy/web-set-http-header.md) |
-| [](../../commands-legacy/web-set-option.md) |
-| [](../../commands-legacy/web-set-root-folder.md) |
-| [](../../commands-legacy/web-start-server.md) |
-| [](../../commands-legacy/web-stop-server.md) |
-| [](../../commands-legacy/web-validate-digest.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Services_Client.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Services_Client.md
deleted file mode 100644
index bb9798a005327e..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Services_Client.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-id: Web_Services_Client_theme
-title: Web Services (Client)
-slug: /commands/theme/Web-Services-Client
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/web-service-authenticate.md) |
-| [](../../commands-legacy/web-service-call.md) |
-| [](../../commands-legacy/web-service-get-info.md) |
-| [](../../commands-legacy/web-service-get-result.md) |
-| [](../../commands-legacy/web-service-set-option.md) |
-| [](../../commands-legacy/web-service-set-parameter.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Services_Server.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Services_Server.md
deleted file mode 100644
index c36f3ac076d1ea..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Web_Services_Server.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-id: Web_Services_Server_theme
-title: Web Services (Servidor)
-slug: /commands/theme/Web-Services-Server
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/soap-declaration.md) |
-| [](../../commands-legacy/soap-get-info.md) |
-| [](../../commands-legacy/soap-reject-new-requests.md) |
-| [](../../commands-legacy/soap-request.md) |
-| [](../../commands-legacy/soap-send-fault.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Windows.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Windows.md
deleted file mode 100644
index 5589e2691c1ce1..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/Windows.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-id: Windows_theme
-title: Windows
-slug: /commands/theme/Windows
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/close-window.md) |
-| [](../../commands-legacy/convert-coordinates.md) |
-| [](../../commands-legacy/current-form-window.md) |
-| [](../../commands-legacy/drag-window.md) |
-| [](../../commands-legacy/erase-window.md) |
-| [](../../commands-legacy/find-window.md) |
-| [](../../commands-legacy/frontmost-window.md) |
-| [](../../commands-legacy/get-window-rect.md) |
-| [](../../commands-legacy/get-window-title.md) |
-| [](../../commands-legacy/hide-tool-bar.md) |
-| [](../../commands-legacy/hide-window.md) |
-| [](../../commands-legacy/is-window-maximized.md) |
-| [](../../commands-legacy/is-window-reduced.md) |
-| [](../../commands-legacy/maximize-window.md) |
-| [](../../commands-legacy/minimize-window.md) |
-| [](../../commands-legacy/next-window.md) |
-| [](../../commands-legacy/open-form-window.md) |
-| [](../../commands-legacy/open-window.md) |
-| [](../../commands-legacy/redraw-window.md) |
-| [](../../commands-legacy/reduce-restore-window.md) |
-| [](../../commands-legacy/resize-form-window.md) |
-| [](../../commands/set-window-document-icon.md) |
-| [](../../commands-legacy/set-window-rect.md) |
-| [](../../commands-legacy/set-window-title.md) |
-| [](../../commands-legacy/show-tool-bar.md) |
-| [](../../commands-legacy/show-window.md) |
-| [](../../commands-legacy/tool-bar-height.md) |
-| [](../../commands-legacy/window-kind.md) |
-| [](../../commands-legacy/window-list.md) |
-| [](../../commands-legacy/window-process.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML.md
deleted file mode 100644
index 2a922200d0f460..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-id: XML_theme
-title: XML
-slug: /commands/theme/XML
----
-
-| |
-| --------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/xml-decode.md) |
-| [](../../commands-legacy/xml-get-error.md) |
-| [](../../commands-legacy/xml-get-options.md) |
-| [](../../commands-legacy/xml-set-options.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML_DOM.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML_DOM.md
deleted file mode 100644
index d41dfbf9baf3ea..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML_DOM.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-id: XML_DOM_theme
-title: XML DOM
-slug: /commands/theme/XML-DOM
----
-
-| |
-| --------------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/dom-append-xml-child-node.md) |
-| [](../../commands-legacy/dom-append-xml-element.md) |
-| [](../../commands-legacy/dom-close-xml.md) |
-| [](../../commands-legacy/dom-count-xml-attributes.md) |
-| [](../../commands-legacy/dom-count-xml-elements.md) |
-| [](../../commands-legacy/dom-create-xml-element.md) |
-| [](../../commands-legacy/dom-create-xml-element-arrays.md) |
-| [](../../commands-legacy/dom-create-xml-ref.md) |
-| [](../../commands-legacy/dom-export-to-file.md) |
-| [](../../commands-legacy/dom-export-to-var.md) |
-| [](../../commands-legacy/dom-find-xml-element.md) |
-| [](../../commands-legacy/dom-find-xml-element-by-id.md) |
-| [](../../commands-legacy/dom-get-first-child-xml-element.md) |
-| [](../../commands-legacy/dom-get-last-child-xml-element.md) |
-| [](../../commands-legacy/dom-get-next-sibling-xml-element.md) |
-| [](../../commands-legacy/dom-get-parent-xml-element.md) |
-| [](../../commands-legacy/dom-get-previous-sibling-xml-element.md) |
-| [](../../commands-legacy/dom-get-root-xml-element.md) |
-| [](../../commands-legacy/dom-get-xml-attribute-by-index.md) |
-| [](../../commands-legacy/dom-get-xml-attribute-by-name.md) |
-| [](../../commands-legacy/dom-get-xml-child-nodes.md) |
-| [](../../commands-legacy/dom-get-xml-document-ref.md) |
-| [](../../commands-legacy/dom-get-xml-element.md) |
-| [](../../commands-legacy/dom-get-xml-element-name.md) |
-| [](../../commands-legacy/dom-get-xml-element-value.md) |
-| [](../../commands-legacy/dom-get-xml-information.md) |
-| [](../../commands-legacy/dom-insert-xml-element.md) |
-| [](../../commands-legacy/dom-parse-xml-source.md) |
-| [](../../commands-legacy/dom-parse-xml-variable.md) |
-| [](../../commands-legacy/dom-remove-xml-attribute.md) |
-| [](../../commands-legacy/dom-remove-xml-element.md) |
-| [](../../commands-legacy/dom-set-xml-attribute.md) |
-| [](../../commands-legacy/dom-set-xml-declaration.md) |
-| [](../../commands-legacy/dom-set-xml-element-name.md) |
-| [](../../commands-legacy/dom-set-xml-element-value.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML_SAX.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML_SAX.md
deleted file mode 100644
index b8ec47d0b38153..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/theme/XML_SAX.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-id: XML_SAX_theme
-title: XML SAX
-slug: /commands/theme/XML-SAX
----
-
-| |
-| ----------------------------------------------------------------------------------------------------------------------------------------- |
-| [](../../commands-legacy/sax-add-processing-instruction.md) |
-| [](../../commands-legacy/sax-add-xml-cdata.md) |
-| [](../../commands-legacy/sax-add-xml-comment.md) |
-| [](../../commands-legacy/sax-add-xml-doctype.md) |
-| [](../../commands-legacy/sax-add-xml-element-value.md) |
-| [](../../commands-legacy/sax-close-xml-element.md) |
-| [](../../commands-legacy/sax-get-xml-cdata.md) |
-| [](../../commands-legacy/sax-get-xml-comment.md) |
-| [](../../commands-legacy/sax-get-xml-document-values.md) |
-| [](../../commands-legacy/sax-get-xml-element.md) |
-| [](../../commands-legacy/sax-get-xml-element-value.md) |
-| [](../../commands-legacy/sax-get-xml-entity.md) |
-| [](../../commands-legacy/sax-get-xml-node.md) |
-| [](../../commands-legacy/sax-get-xml-processing-instruction.md) |
-| [](../../commands-legacy/sax-open-xml-element.md) |
-| [](../../commands-legacy/sax-open-xml-element-arrays.md) |
-| [](../../commands-legacy/sax-set-xml-declaration.md) |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/this.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/this.md
deleted file mode 100644
index d018cb470d272b..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/this.md
+++ /dev/null
@@ -1,188 +0,0 @@
----
-id: this
-title: This
-displayed_sidebar: docs
----
-
-**This** : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| ---------- | ------ | --------------------------- | ------------------------ |
-| Resultado | Object | ← | Elemento u objeto actual |
-
-
-
-## Descripción
-
-El comando `This` devuelve una referencia al objeto procesado actualmente.
-
-En la mayoría de los casos, el valor de `This` está determinado por cómo se llama una función. No se puede definir por asignación durante la ejecución, y puede ser diferente cada vez que se llame a la función.
-
-Este comando puede utilizarse en diferentes contextos, que se describen a continuación. Dentro de estos contextos, accederá a propiedades de elementos de objetos/colecciones o a atributos de entidades a través de **This.<*propertyPath*\>**. Por ejemplo, *This.name* o *This.employer.lastName* son rutas válidas a propiedades de objetos, elementos o entidades.
-
-En cualquier otro contexto, el comando devuelve **Null**.
-
-## Función de clase
-
-Cuando se utiliza una [función constructora de clase](../Concepts/classes.md#class-constructor) (con la función [`new()`](API/ClassClass.md#new)), su `This` está vinculado al nuevo objeto que se está construyendo.
-
-```4d
-//Class: ob
-
-Class constructor
-
- // Crear las propiedades en This
- // asignándolas
- This.a:=42
-```
-
-```4d
-// en un método 4D
-$o:=cs.ob.new()
-$val:=$o.a //42
-```
-
-> Al llamar a la superclase del constructor en un constructor utilizando la palabra clave [Super](super.md), tenga en cuenta que `This` no debe ser llamado antes del constructor de la superclase, de lo contrario se genera un error. Ver [este ejemplo](super.md#example-1).
-
-En todos los casos, `This` se refiere al objeto sobre el que se ha llamado el método, como si el método fuera una función del objeto.
-
-```4d
-//Clase: ob
-
-Function f() : Integer
- return This.a+This.b
-```
-
-Entonces puede escribir en un método proyecto:
-
-```4d
-$o:=cs.ob.new()
-$o.a:=5
-$o.b:=3
-$val:=$o.f() //8
-
-```
-
-En este ejemplo, el objeto asignado a la variable $o no tiene su propia propiedad *f*, la hereda de su clase. Como *f* es llamado como un método de $o, su `This` se refiere a $o.
-
-## Objeto fórmula
-
-En el contexto de la ejecución de un objeto fórmula creado por los comandos [Formula](formula.md) o [Formula from string](formula-from-string.md), `This` devuelve una referencia al objeto actualmente procesado por la fórmula.
-
-Por ejemplo, desea utilizar un método proyecto como una fórmula encapsulada en un objeto:
-
-```4d
- var $person : Object := New object
- $person.firstName:="John"
- $person.lastName:="Smith"
- $person.greeting:=Formula(Greeting)
- $g:=$person.greeting("hello") // devuelve "hola John Smith"
- $g:=$person.greeting("hi") // devuelve "hi John Smith"
-```
-
-Con el método proyecto *Greeting*:
-
-```4d
- #DECLARE($greeting : Text) : Text
- return $greeting+" "+This.firstName+" "+This.lastName
-```
-
-## List box
-
-En el contexto de un list box asociado a una colección o una selección de entidades, durante los eventos [`On Display Detail`](../Events/onDisplayDetail.md) o [`On Data Change`](../Events/onDataChange.md), `This` devuelve una referencia al elemento de colección o entidad a la que accede el list box para mostrar la línea actual.
-
-:::note
-
-Si utiliza una colección de valores escalares en un list box, 4D crea un objeto para cada elemento con una única propiedad **value**. Así, el valor del elemento es devuelto por la expresión no asignable **This.value**.
-
-:::
-
-## Ejemplo 1
-
-Una colección de objetos, cada uno con esta estructura:
-
-```json
-{
-"ID": 1234
-"name": "Xavier",
-"revenues": 47300,
-"employees": [
- "Allan",
- "Bob",
- "Charlie"
- ]
-},{
-"ID": 2563
-"name": "Carla",
-"revenues": 55000,
-"isFemale": true
-"employees": [
- "Igor",
- "Jane"
- ]
-},...
-
-```
-
-En el list box, cada columna se refiere a una de las propiedades del objeto, ya sea directamente (This.name), indirectamente (This.employees.length), o a través de una expresión (*getPicture*) en la que se puede usar directamente. El list box se ve así:
-
-
-
-El método proyecto *GetPicture* se ejecuta automáticamente durante el evento **On display detail**:
-
-```4d
- //GetPicture Method
- #DECLARE -> $genderPict : Picture
- If(This.isFemale)
- $genderPict:=Form.genericFemaleImage
- Else
- $genderPict:=Form.genericMaleImage
- End if
-```
-
-Una vez ejecutado el formulario, podrá ver el resultado:
-
-
-
-## Ejemplo 2
-
-Desea visualizar las entidades de la siguiente estructura en un list box:
-
-
-
-Se crea un list box de tipo "Collection o entity selection" con la siguiente definición:
-
-
-
-Note que:
-
-- *This.ID*, *This.Title* y *This.Date* se refiere directamente a los atributos correspondientes en la base de datos ds.Event.
-- *This.meetings* es un atributo relacionado (basado en el nombre de una relación de Uno a Muchos) que devuelve una selección de entidad de la base de datos ds.Meeting.
-- **Form.eventList** es la selección de entidades que se adjunta al list box. El código de inicialización se puede poner en el evento on load del formulario:
-
-```4d
- Case of
- :(Form event code=On Load)
- Form.eventList:=ds.Event.all() //devuelve una selección de entidad con todas las entidades
- End case
-```
-
-Una vez ejecutado el formulario, el list box se llena automáticamente con la selección de entidades:
-
-
-
-## Ver también
-
-[Self](../commands-legacy/self.md)\
-[Super](super.md)
-
-## Propiedades
-
-| | |
-| ----------------- | --------------------------- |
-| Número de comando | 1470 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/zip-create-archive.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/zip-create-archive.md
deleted file mode 100644
index e7c2fbc8a329bd..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/commands/zip-create-archive.md
+++ /dev/null
@@ -1,174 +0,0 @@
----
-id: zip-create-archive
-title: ZIP Create archive
-displayed_sidebar: docs
----
-
-**ZIP Create archive** ( *fileToZip* : 4D.File ; *destinationFile* : 4D.File ) : Object **ZIP Create archive** ( *folderToZip* : 4D.Folder ; *destinationFile* : 4D.File { ; *options* : Integer }) : Object **ZIP Create archive** ( *zipStructure* : Object ; *destinationFile* : 4D.File ) : Object
-
-
-
-| Parámetros | Tipo | | Descripción |
-| --------------- | ------------------------- | :-------------------------: | -------------------------------------------------------------------- |
-| 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 | ← | Objeto estado |
-
-
-
-Historia
-
-| Lanzamiento | Modificaciones |
-| ----------- | --------------------------------------------------------------------------------- |
-| 19 R3 | Adición de las propiedades `ZIP Compression LZMA`, `ZIP Compression xy`, `.level` |
-| 18 | Añadidos |
-
-
-
-## Descripción
-
-El comando `ZIP Create archive` crea un objeto archivo ZIP comprimido y devuelve el estado de la operación.
-
-Puede pasar un objeto 4D.File, 4D.Folder, o una estructura zip como primer parámetro:
-
-- *fileToZip*: pase simplemente un `4D.File` a comprimir.
-
-- *folderToZip*: pase un `4D.Folder` para comprimir. En este caso, el parámetro *options* permite comprimir sólo el contenido de la carpeta (es decir, excluir la carpeta padre). Por defecto, `ZIP Create archive` comprimirá la carpeta y su contenido, de modo que la operación de descompresión volverá a crear una carpeta. Si desea que la operación de descompresión restaure sólo el contenido de la carpeta, pase la constante `ZIP Without enclosing folder` en el parámetro *options*.
-
-- *zipStructure*: pase un objeto que describa el objeto ZIP archivo. Las siguientes propiedades están disponibles para definir la estructura:
-
-| Propiedad | Tipo | Descripción |
-| ------------ | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| compression | Integer |
|
-| 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 omite:
`ZIP Compression standard`: 6
`ZIP Compression LZMA`: 4
`ZIP Compression XZ`: 4
|
-| encryption | Integer | El cifrado a usar si se define una contraseña:
`ZIP Encryption AES128`: encriptación AES utilizando llave de 128 bits.
`ZIP Encryption AES192`: encriptación AES utilizando llave de 192 bits.
`ZIP Encryption AES256`: encriptación AES utilizando llave de 256 bits (por defecto si se define la contraseña).
`ZIP Encryption none`: los datos no están cifrados (por defecto si no se define una contraseña)
|
-| contraseña | Text | Una contraseña a utilizar si se requiere encriptación. |
-| Histórico | Collection |
una colección de objetos `4D.File` o `4D.Folder` o
una colección de objetos con las siguientes propiedades:
Propiedad
Tipo
Descripción
source
4D.Archivo o 4D.Carpeta
Archivo o Carpeta
destino
Texto
(opcional) - Especifique una ruta de archivo relativa para cambiar la organización del contenido del archivo
option
number
(opcional) - `ZIP Ignore invisible files` o 0 para comprimir todo el archivo
|
-| retrollamada | 4D.Function | Una fórmula de retrollamada que recibirá la progresión de la compresión (0 - 100) en $1. |
-
-En el parámetro *destinationFile*, pase un objeto `4D.File` que describa el archivo ZIP a crear (nombre, ubicación, etc.). Se aconseja utilizar la extensión ".zip" si quiere que el archivo ZIP sea procesado automáticamente por cualquier software.
-
-Una vez creado un archivo, puede utilizar el comando [ZIP Read archive](zip-read-archive.md) para acceder a él.
-
-**Status object**
-
-El objeto status devuelto contiene las siguientes propiedades:
-
-| Propiedad | Tipo | Descripción |
-| ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| statusText | Text | Mensaje de error (si lo hay):
Cannot open ZIP archive
Cannot create ZIP archive
Password is required for encryption
|
-| status | Integer | Código de estado |
-| success | Boolean | True si el archivo se ha creado con éxito, si no, false |
-
-## Ejemplo 1
-
-Para comprimir un archivo `4D.File`:
-
-```4d
- var $file; $destination : 4D.File
- var $status : Object
-
- $destination:=Folder(fk desktop folder).file("MyDocs/file.zip")
- $file:=Folder(fk desktop folder).file("MyDocs/text.txt")
-
- $status:=ZIP Create archive($file;$destination)
-```
-
-## Ejemplo 2
-
-Para comprimir una carpeta `4D.Folder` sin la carpeta en sí:
-
-```4d
- var $folder : 4D.Folder
- var $destination : 4D.File
- var $status : Object
-
- $destination:=Folder(fk desktop folder).file("MyDocs/Images.zip")
- $folder:=Folder(fk desktop folder).folder("MyDocs/Images")
-
- $status:=ZIP Create archive($folder;$destination;ZIP Without enclosing folder)
-```
-
-## Ejemplo 3
-
-Para comprimir una estructura de archivo ZIP con una contraseña y una barra de progreso:
-
-```4d
- var $destination : 4D.File
- var $zip;$status : Object
- var progID : Integer
-
- $destination:=Folder(fk desktop folder).file("MyDocs/Archive.zip")
-
- $zip:=New object
- $zip.files:=Folder(fk desktop folder).folder("MyDocs/Resources").folders()
- $zip.password:="password"
- $zip.callback:=Formula(myFormulaCompressingMethod($1))
-
- progID:=Progress New //utilizamos el componente 4D Progress
-
- $status:=ZIP Create archive($zip;$destination)
-
- Progress QUIT(progID)
-```
-
-`myFormulaCompressingMethod`:
-
-```4d
- #DECLARE ($current : Integer)
- Progress SET PROGRESS(progID;Num($current /100))
-```
-
-## Ejemplo 4
-
-Quiere pasar una colección de carpetas y archivos para comprimir al objeto *zipStructure*:
-
-```4d
- var $destination : 4D.File
- var $zip;$err : Object
- $zip:=New object
- $zip.files:=New collection
- $zip.files.push(New object("source";Folder(fk desktop folder).file("Tests/text.txt")))
- $zip.files.push(New object("source";Folder(fk desktop folder).file("Tests/text2.txt")))
- $zip.files.push(New object("source";Folder(fk desktop folder).file("Images/image.png")))
-
- $destination:=Folder(fk desktop folder).file("file.zip")
- $err:=ZIP Create archive($zip;$destination)
-```
-
-## Ejemplo 5
-
-Desea utilizar un algoritmo de compresión alternativo con un alto nivel de compresión:
-
-```4d
-var $destination : 4D.File
-var $zip; $err : Object
-
-$zip:=New object
-$zip.files:=New collection
-$zip.files.push(Folder(fk desktop folder).folder("images"))
-$zip.compression:=ZIP Compression LZMA
-$zip.level:=7 //por defecto es 4
-
-$destination:=Folder(fk desktop folder).file("images.zip")
-$err:=ZIP Create archive($zip; $destination)
-```
-
-## Ver también
-
-[ZipArchive Class](../API/ZipArchiveClass.md)
-[ZipFile Class](../API/ZipFileClass.md)
-[ZipFolder Class](../API/ZipFolderClass.md)
-[`ZIP Read archive`](zip-read-archive.md)
-
-## Propiedades
-
-| | |
-| ----------------- | --------------------------- |
-| Número de comando | 1640 |
-| Hilo seguro | ✓ |
-
-
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/client-server.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/client-server.md
deleted file mode 100644
index 40f657ba12dfd0..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/client-server.md
+++ /dev/null
@@ -1,134 +0,0 @@
----
-id: client-server
-title: Página Cliente/Servidor
----
-
-Las páginas Cliente-Servidor agrupan los parámetros relacionados con el uso de la base de datos en modo cliente-servidor. Naturalmente, estas propiedades sólo se tienen en cuenta cuando la base de datos se utiliza en modo remoto.
-
-## Página Opciones red
-
-### Red
-
-#### Publicar la base al inicio
-
-Esta opción le permite indicar si la base de datos 4D Server aparecerá o no en la lista de bases de datos publicadas.
-
-- Cuando esta opción está marcada (por defecto), la base de datos se hace pública y aparece en la lista de bases de datos publicadas (pestaña**Disponible**).
-- Cuando la opción no está marcada, la base de datos no se hace pública y no aparece en la lista de bases de datos publicadas. Para conectarse, los usuarios deben introducir manualmente la dirección de la base de datos en la pestaña **Personalizada** de la caja de diálogo de conexión.
-
-:::note
-
-Si modifica este parámetro, deberá reiniciar la base del servidor para que se tenga en cuenta.
-
-:::
-
-#### Nombre de publicación
-
-This option lets you change the publication name of a 4D Server database, *i.e.*, the name displayed on the dynamic **Available** tab of the connection dialog box (see the [Opening a remote project](../Desktop/clientServer.md#opening-a-remote-project) paragraph). Por defecto, 4D Server utiliza el nombre del archivo de proyecto. Puede introducir cualquier nombre personalizado que desee.
-
-:::note
-
-Este parámetro no se tiene en cuenta en las aplicaciones cliente-servidor personalizadas. En teoría, la aplicación cliente se conecta directamente a la aplicación servidor, sin pasar por la caja de diálogo de conexión. Sin embargo, en caso de error, puede aparecer esta caja de diálogo; en este caso, el nombre de publicación de la aplicación servidor es el nombre del proyecto compilado.
-
-:::
-
-#### Número de puerto
-
-Esta opción le permite cambiar el número del puerto TCP en el que 4D Server publica la base de datos. Esta información se almacena en el proyecto y en cada máquina cliente. Por defecto, el número de puerto TCP utilizado por 4D Server y 4D en modo remoto es 19813.
-
-La personalización de este valor es necesaria cuando desea utilizar varias aplicaciones 4D en la misma máquina; en este caso, debe especificar un número de puerto diferente para cada aplicación.
-Cuando se modifica este valor desde 4D Server o 4D, se transmite automáticamente a todas las máquinas 4D conectadas a la base de datos.
-
-Para actualizar las otras máquinas clientes que no estén conectadas, basta con introducir el nuevo número de puerto (precedido de dos puntos) después de la dirección IP del equipo servidor en la pestaña **Personalizado** de la caja de diálogo de conexión Por ejemplo, si el nuevo número de puerto es 19888: Por ejemplo, si el nuevo número de puerto es 19888:
-
-
-
-> Sólo las bases de datos publicadas en el mismo puerto que el definido en 4D client son visibles en la página de publicación dinámica TCP/IP.
-
-#### 4D Server y números de puerto
-
-4D Server utiliza tres puertos TCP para las comunicaciones entre los servidores internos y los clientes:
-
-- **SQL Server**: 19812 por defecto (puede modificarse a través de la página "SQL/Configuración" de las Preferencias).
-- **Servidor de aplicaciones**: 19813 por defecto (puede modificarse a través de la página "Cliente-Servidor/Configuración" de las Preferencias, ver arriba).
-- **Servidor DB4D** (servidor de base de datos): 19814 por defecto. Este número de puerto no se puede modificar directamente, pero siempre consiste en el número de puerto del servidor de aplicaciones + 1. Cuando un cliente 4D se conecta a 4D Server, utiliza el puerto TCP del servidor de aplicaciones (19813 o el puerto indicado después de los dos puntos ':' en la dirección IP mostrada en la caja de diálogo de conexión). La conexión a otros servidores a través de sus respectivos puertos es entonces automática; ya no es necesario especificarlos.\
- Tenga en cuenta que en caso de acceso a través de un enrutador o un cortafuegos, los tres puertos TCP deben abrirse explícitamente.
-- [**Depurador remoto**](../Debugging/debugging-remote.md): 19815 por defecto. Este número de puerto no puede modificarse directamente, pero siempre consta del número de puerto del servidor de aplicaciones + 2.
-
-#### Autenticación del usuario con el servidor de dominio
-
-Esta opción le permite implementar las funcionalidades SSO (*Single Sign On*) en su base de datos 4D Server en Windows. Al marcar esta opción, 4D se conecta de forma transparente al directorio Active del servidor de dominio Windows y obtiene los tokens de autenticación disponibles. Esta opción se describe en la sección [Single Sign On (SSO) en Windows](https://doc.4d.com/4Dv20/4D/20/Single-Sign-On-SSO-on-Windows.300-6330537.en.html).
-
-#### Service Principal Name
-
-Cuando la autenticación única (SSO) está activa (ver arriba), debe llenar este campo si desea utilizar Kerberos como protocolo de autenticación. Esta opción se describe en la sección [Single Sign On (SSO) en Windows](https://doc.4d.com/4Dv20/4D/20/Single-Sign-On-SSO-on-Windows.300-6330537.en.html).
-
-#### Capa de red
-
-Esta caja desplegable contiene 3 opciones de capa de red a elegir entre: **legacy**, **ServerNet** y **QUIC** (sólo en modo proyecto), que se utilizan para manejar las comunicaciones entre 4D Server y las máquinas 4D remotas (clientes).
-
-- **Legal**: esta antigua capa de red "Legal" sigue siendo soportada para garantizar la compatibilidad de las bases de datos creadas antes de la v15. Esta capa de red también puede habilitarse por programación utilizando el comando [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md).
-- **ServerNet** (por defecto): activa la capa de red de ServerNet en el servidor (disponible desde 4D v15).
-- **QUIC** (disponible solo en modo proyecto): activa la capa de red QUIC en el servidor.
-
- **Notas**:
-
- - Al seleccionar esta opción, se anula la opción Utilizar capa de red heredada en caso de que se haya definido mediante el comando [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md).
- - Puede saber si una aplicación 4D se está ejecutando con una capa de red QUIC utilizando el comando [Application info](../commands-legacy/application-info.md).
- - Dado que QUIC utiliza el protocolo UDP, asegúrese de que UDP está permitido en la configuración de seguridad de su red.
- - QUIC se conecta automáticamente al puerto 19813 tanto para el servidor de aplicaciones como para el servidor DB4D.
- - Cuando se selecciona la opción de capa QUIC:
- - Cerca del selector aparece un mensaje beta y un icono de alerta.
- - [los parámetros del tiempo de espera de las conexiones cliente-servidor](#client-server-connections-timeout) están ocultos
- - La casilla de verificación [Encriptar comunicación Cliente-Servidor](#encrypt-client-server-communications) está oculta (las comunicaciones QUIC son siempre en TLS, sea cual sea su modo seguro).
- - **Compatibilidad**: necesita desplegar sus aplicaciones cliente/servidor con 4D v20 o superior antes de cambiar a la capa de red QUIC.
-
-:::note
-
-En caso de modificación, deberá reiniciar la aplicación para que se tenga en cuenta el cambio. Toda aplicación cliente que estuviera conectada también debe reiniciarse para poder conectarse con la nueva capa de red.
-
-:::
-
-#### Tiempo antes de desconexión Cliente-Servidor
-
-Este dispositivo se utiliza para definir el tiempo de espera (periodo de inactividad más allá del cual se cierra la conexión) entre 4D Server y las máquinas cliente que se conectan a él. La opción ilimitada elimina el tiempo de espera. Cuando se selecciona esta opción, se elimina el control de la actividad del cliente.
-
-Cuando se selecciona un tiempo de espera, el servidor cerrará la conexión de un cliente si no recibe ninguna petición de éste durante el tiempo límite especificado.
-
-### Comunicación cliente-servidor
-
-#### Registrar los clientes al Inicio para Execute On Client
-
-Cuando esta opción está marcada, todas las máquinas remotas 4D que se conectan a la base de datos pueden ejecutar métodos remotamente. Este mecanismo se detalla en la sección [Procedimientos almacenados en las máquinas cliente](https://doc.4d.com/4Dv20/4D/20/Stored-procedures-on-client-machines.300-6330550.en.html).
-
-#### Cifrar las comunicaciones Cliente-Servidor
-
-Esta opción permite activar el modo seguro para las comunicaciones entre la máquina servidor y las máquinas remotas 4D. Esta opción se detalla en la sección [Cifrar las de conexiones cliente/servidor](https://doc.4d.com/4Dv20/4D/20/Encrypting-ClientServer-Connections.300-6330533.en.html).
-
-#### Actualizar la carpeta Resources durante una sesión
-
-Este parámetro puede utilizarse para definir globalmente el modo de actualización de la instancia local de la carpeta **Resources** en los equipos 4D conectados cuando se modifica la carpeta **Resources** de la base de datos durante la sesión (la carpeta **Resources** se sincroniza automáticamente en el equipo remoto cada vez que se abre una sesión). Hay tres parámetros disponibles:
-
-- **Nunca**: la carpeta local **Resources** no se actualiza durante la sesión. La notificación enviada por el servidor es ignorada. La carpeta **Resources** local puede actualizarse manualmente mediante el comando **Update Local Resources** del menú de acción (ver [Uso del explorador de recursos](https://doc.4d.com/4Dv20/4D/20.2/Using-the-Resources-explorer.300-6750254.en.html)).
-- **Siempre**: la sincronización de la carpeta local **Resources** se realiza automáticamente durante la sesión cada vez que el servidor envía una notificación.
-- **Preguntar**: cuando la notificación es enviada por el servidor, se muestra una caja de diálogo en las máquinas cliente, indicando la modificación. A continuación, el usuario puede aceptar o rechazar la sincronización de la carpeta local **Resources**.\
- La carpeta **Resources** centraliza los archivos personalizados necesarios para la interfaz de la base (archivos de traducción, imágenes, etc.). Se pueden utilizar mecanismos automáticos o manuales para notificar a cada cliente cuándo se ha modificado el contenido de esta carpeta. Para más información, consulte la sección [Gestión de la carpeta Resources](https://doc.4d.com/4Dv20/4D/20/Managing-the-Resources-folder.300-6330534.en.html).
-
-## Página Configuración IP
-
-### Tabla de configuración Autorizar-Rechazar
-
-Esta tabla permite definir las reglas de control de acceso a la base en función de las direcciones IP de las máquinas 4D remotas. Esta opción permite reforzar la seguridad, por ejemplo, para aplicaciones estratégicas.
-
-> Esta tabla de configuración no controla las conexiones web.
-
-El funcionamiento de la tabla de configuración es el siguiente:
-
-- La columna "Autorizar-Rechazar" permite seleccionar el tipo de regla a aplicar (Autorizar-Rechazar) mediante un menú emergente. Para añadir una regla, haga clic en el botón Añadir. Aparece una nueva línea en la tabla. El botón **Borrar** permite eliminar la línea actual.
-- La columna "Dirección IP" permite designar las direcciones IP afectadas por la regla. Para especificar una dirección, haga clic en la columna e introduzca la dirección de la siguiente forma: 123.45.67.89 (formato IPv4) o 2001:0DB8:0000:85A3:0000:0000:AC1F:8001 (formato IPv6). Puede utilizar un caracter \* (asterisco) para especificar las direcciones del tipo "comienza por". Por ejemplo, 192.168.\* indica todas las direcciones que empiezan por 192.168.
-- La aplicación de las reglas se basa en el orden de visualización de la tabla. Si dos reglas son contradictorias, se da prioridad a la regla situada más arriba en la tabla. Puede reordenar las líneas modificando la ordenación actual (haga clic en el encabezado de la columna para alternar la dirección de la ordenación). También puede mover las líneas utilizando arrastrar y soltar.
-- Por razones de seguridad, sólo las direcciones que realmente coincidan con una regla podrán conectarse. En otras palabras, si la tabla sólo contiene una o más reglas de tipo Rechazar, todas las direcciones serán rechazadas porque ninguna coincidirá con al menos una regla. Si desea denegar sólo determinadas direcciones (y permitir otras), añada una regla Autorizar\* al final de la tabla. Por ejemplo:
- - Denegar 192.168.\* (denegar todas las direcciones que empiecen por 192.168)
- - Autorizar \* (y permitir todas las demás direcciones)
-
-Por defecto, 4D Server no aplica ninguna restricción de conexión: la primera línea de la tabla contiene la etiqueta Autorizar y el caracter \* (todas las direcciones).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/database.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/database.md
deleted file mode 100644
index a5cb9f18fb31f5..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/database.md
+++ /dev/null
@@ -1,112 +0,0 @@
----
-id: database
-title: Página Base de datos
----
-
-## Página Almacenamiento de datos
-
-Esta página permite configurar el almacenamiento de datos de la base 4D en el disco.
-
-### Parámetros generales
-
-#### Autorizar el uso de archivos de datos de sólo lectura
-
-Esta opción permite configurar el funcionamiento de la aplicación al abrir un archivo de datos bloqueado a nivel del sistema operativo. 4D incluye un mecanismo que impide automáticamente la apertura de una base cuando su archivo de datos, o uno de sus segmentos está bloqueado. En este caso, cuando se activa esta opción de detección, 4D muestra un mensaje de advertencia y no abre la base:
-
-
-
-A menos que se marque esta opción, no es posible abrir una base cuando su archivo de datos está bloqueado (funcionamiento por defecto para las bases 4D).
-
-#### Sobre el bloqueo de archivos
-
-Los archivos bloqueados pueden ser leídos pero su contenido no puede ser modificado. Por ejemplo, los archivos se bloquean cuando se almacenan en un soporte no regrabable (tipo DVD) o cuando se copian desde este tipo de soporte. 4D puede trabajar de forma transparente con archivos de datos bloqueados, lo que permite, en particular, la utilización de proyectos guardados en DVD. Sin embargo, con esta operación se corre el riesgo de utilizar inadvertidamente un fichero de datos bloqueado en el que no se guardarán las modificaciones. Esta es la razón por la que, por defecto, 4D no permite abrir bases de datos con un archivo de datos bloqueado.
-
-### Ubicación de carpeta temporal
-
-Esta área le permite cambiar la ubicación de los archivos temporales creados mientras 4D está funcionando. La carpeta de archivos temporales es utilizada por la aplicación, cuando es necesario, para guardar temporalmente en disco los datos en memoria.
-
-La ubicación actual de esta carpeta se muestra en el área "Actual:". Puede hacer clic en esta área para mostrar el nombre de la ruta en forma de lista desplegable:
-
-
-
-Se ofrecen tres opciones de ubicación:
-
-- **Sistema**: cuando se selecciona esta opción, los archivos temporales 4D se crean en una carpeta situada en la ubicación especificada por Windows y/o macOS. Puede averiguar la ubicación actual definida por su sistema utilizando el comando [`Temporary folder`](../commands-legacy/temporary-folder.md) 4D. Los archivos se colocan en una subcarpeta cuyo nombre está formado por el nombre de la base y un identificador único.
-- **Carpeta de archivos de datos** (opción por defecto): cuando se selecciona esta opción, los archivos temporales 4D se crean en una carpeta llamada "archivos temporales" situada en el mismo nivel que el archivo de datos de la base de datos.
-- **Definido por el usuario**: esta opción se utiliza para definir una ubicación personalizada. Si se modifica la opción de ubicación, será necesario reiniciar la base para que se tenga en cuenta la nueva opción. 4D verifica si se puede acceder a la carpeta seleccionada mediante escritura. Si no es así, la aplicación prueba otras opciones hasta encontrar una carpeta válida.
-
-> Esta opción se almacena en las "propiedades adicionales" de la estructura, accesibles durante la exportación XML de la definición de estructura (ver [Exportar e importar las definiciones de estructura](https://doc.4d.com/4Dv20/4D/20.2/Exporting-and-importing-structure-definitions.300-6750295.en.html)).
-
-### Comparación de texto
-
-> Si cambia una de estas opciones, tiene que salir y volver a abrir la base para que el cambio surta efecto. Una vez reabierta la base, se vuelven a indexar automáticamente todos sus índices.
-
-- **Considere @ como comodín sólo cuando se encuentre al principio o al final de patrones de texto**: permite definir como se interpretará la arroba "@" cuando se utilice en una búsqueda o en una comparación de cadenas de caracteres, cuando se encuentre en
- Cuando esta opción no está marcada (valor por defecto), la arroba se utiliza como carácter comodín, es decir, sustituye a cualquier caracter (ver [Caracter comodín (@)](https://doc.4d.com/4Dv20/4D/20.2/Query-editor.300-6750279.en.html#463876)).
-
- Cuando la opción está marcada, la arroba se considera un caracter simple si se encuentra dentro de una palabra. Esta posibilidad es especialmente útil cuando se buscan direcciones de correo electrónico, donde el signo @ se utiliza internamente. Esta opción influye en las búsquedas, ordenaciones, comparaciones de cadenas de caracteres, así como en los datos almacenados en las tablas y los que se encuentran en memoria, como los arrays. Los campos y variables de tipo alfa (indexados o no) y texto se ven afectados por como se interpreta el caracter @ en las búsquedas y ordenaciones.
-
- **Notas:**
-
- - Para las búsquedas, si el criterio de búsqueda empieza o acaba por @, el caracter "@" se tratará como un comodín. Sólo si el carácter "@" se coloca en medio de una palabra (por ejemplo: bill@cgi.com) 4D lo trata de forma diferente.
- - Esta opción también puede influir en el comportamiento de los comandos del tema [Objetos (Formularios)](../commands/theme/Objects_Forms.md) que aceptan el caracter comodín ("@") en el parámetro objeto.
- - Por razones de seguridad, sólo el Administrador o Diseñador de la base de datos puede modificar este parámetro.
-
-- **Lenguaje del archivo de datos actual:** permite configurar el lenguaje utilizado para el procesamiento y la comparación de cadenas de caracteres. La elección de un idioma de comparación afecta a la ordenación y la búsqueda de textos, así como al cambio entre minúsculas y mayúsculas, pero no afecta a la traducción de etiquetas ni a los formatos de fecha, hora o moneda, que permanecen en el idioma del sistema. Por defecto, 4D utiliza el lenguaje del sistema.
-
- Así, un proyecto 4D puede funcionar en un lenguaje distinto del del sistema. Cuando se abre un proyecto, el motor de 4D detecta el lenguaje utilizado por el archivo de datos y lo pasa al lenguaje (modo intérpretado o compilado). Las comparaciones de texto, independientemente de si las efectúa el motor del proyecto o el lenguaje, se hacen en el mismo idioma.
-
- > Puede modificar esta configuración en las Preferencias de la aplicación (ver [Página general](../Preferences/general.md)). En este caso, la configuración se aplica a todas las nuevas bases creadas por 4D.
-
-- **Considerar sólo caracteres no alfanuméricos para las palabras claves**: modifica el algoritmo utilizado por 4D para identificar los separadores de palabras claves y crear así sus índices. Por defecto, cuando esta opción no está marcada, 4D utiliza un sofisticado algoritmo que tiene en cuenta las características lingüísticas.
-
- Este algoritmo es similar al que utilizan los programas de tratamiento de textos para determinar los límites al seleccionar una palabra sobre la que se hace doble clic. Para más información sobre este algoritmo, consulte la siguiente dirección: `http://userguide.icu-project.org/boundaryanalysis`.
-
- Cuando esta opción está marcada, 4D utiliza un algoritmo simplificado. En esta configuración, todo caracter no alfanumérico (es decir, que no sea una letra o un número) se considera un separador de palabras claves. Esta configuración cumple requisitos específicos asociados a determinados idiomas, como el japonés.
-
-- **Orden de clasificación apropiado para la búsqueda**: esta opción sólo aparece cuando se selecciona el idioma japonés. Modifica la interpretación de caracteres como la "Marca sonora prolongada Katakana-Hiragana" o "長音記号" o las "Marcas de iteración japonesa" como "ゝ" o "ゞ". Es probable que un hablante típico de japonés prefiera los resultados cuando el ajuste está activado.
-
-#### Soporte de Mecab (versión japonesa)
-
-En los sistemas japoneses, 4D soporta la librería *MeCab*, con un algoritmo de indexación de palabras claves especialmente adaptado al idioma japonés.
-
-Este algoritmo se utiliza por defecto en las versiones japonesas de 4D. Si es necesario, puede desactivar el uso del algoritmo *MeCab* y utilizar la librería convencional *ICU*.
-
-Para desactivar *MeCab*, sólo tiene que marcar la opción **Considerar solo caracteres no alfanuméricos para las palabras claves**:
-
-
-
-## Página Memoria
-
-Utilice los parámetros de esta pestaña para configurar la memoria caché de la base.
-
-### Parámetros de la caché para la base
-
-- **Cálculo de la caché adaptable**: cuando esta opción está marcada, la gestión de la memoria caché es realizada dinámicamente por el sistema, respetando los límites que defina. Esto permite configurar una memoria caché de alto rendimiento adaptada a la mayoría de las configuraciones. A continuación, el tamaño de la memoria caché se calcula dinámicamente en función de los parámetros definidos. Los valores ofrecidos por defecto corresponden al uso estándar de 4D.
-
- - **Memoria a reservar para el sistema y las otras aplicaciones**: parte de la memoria RAM a reservar para el Sistema y las otras aplicaciones. Este valor aumenta para la optimización cuando otras aplicaciones se ejecutan en la misma máquina que 4D.
- - **Porcentaje de memoria disponible utilizada para la caché**: porcentaje de la memoria restante asignada por defecto a la caché.\
- Para obtener el tamaño asignado por defecto a la caché, basta con realizar el siguiente cálculo: (Memoria física -- Memoria física a reservar) X Porcentaje de la memoria utilizada para la caché. En el modo adaptativo, el tamaño de la memoria caché varía dinámicamente en función de las necesidades de la aplicación y del sistema. Puede definir los límites utilizando las siguientes dos opciones:
- - **Tamaño mínimo**: cantidad mínima de memoria que debe reservarse para la caché. Este valor no puede ser inferior a 100 MB.
- - **Tamaño máximo**: cantidad máxima de memoria que puede utilizar la caché. Este valor es prácticamente ilimitado.\
- Definir límites es especialmente útil para bases distribuidas en máquinas de las que no se conoce a priori la configuración de memoria. En este caso, los límites definidos permiten garantizar un rendimiento mínimo en todos los casos. El siguiente diagrama ilustra este comportamiento:
-
- Ejemplo de cálculo de la memoria caché:
- *Memoria física a reservar = 256 MB
- Porcentaje de la memoria disponible utilizado para la caché = 50%
- Tamaño máximo = 1 GB Tamaño mínimo = 128 MB*
-
- 
-
-- **Cálculo de caché adaptativa no marcado**: en este modo, usted mismo define el tamaño de la memoria caché para la base. 4D muestra entonces un área de entrada que permite configurar la memoria caché a utilizar, así como información relacionada con la memoria física (RAM disponible en la máquina), la caché actual y la caché tras el reinicio (teniendo en cuenta sus cambios).
-
- El tamaño de la memoria caché que introduzca se reservará para la base 4D, independientemente del estado de los recursos de la máquina. Esta configuración puede utilizarse en determinadas configuraciones específicas, o cuando la base está diseñada para utilizarse en sistemas disímiles en cuanto a memoria. En la mayoría de los casos, la caché adaptativa ofrece un mejor rendimiento.
-
-- **Escritura caché cada... Segundos/Minutos**: especifica el periodo de tiempo entre cada guardado automático de la caché de datos, es decir, su escritura en el disco.
- 4D guarda los datos colocados en la caché a intervalos regulares. Puede especificar todo intervalo de tiempo entre 1 segundo y 500 minutos. Por defecto, 4D guarda sus datos cada 20 segundos. La aplicación también guarda sus datos en el disco cada vez que cambia a otro entorno o sale de la aplicación. También puede llamar al comando [FLUSH CACHE](../commands-legacy/flush-cache.md) para activar el vaciado en cualquier momento.
-
- Cuando prevea una entrada de muchos datos, considere la posibilidad de establecer un intervalo de tiempo breve entre guardados. En caso de corte del suministro eléctrico, sólo perderá los datos introducidos desde el último almacenamiento (si la base de datos funciona sin archivo de historial).
-
- Si la base de datos se ralentiza notablemente cada vez que se vacía la caché, deberá ajustar la frecuencia. Esta lentitud significa que se está guardando una gran cantidad de registros. Por lo tanto, un periodo más corto entre guardados sería más eficaz, ya que cada guardado implicaría menos registros y, por lo tanto, sería más rápido.
-
- Por defecto, 4D muestra una pequeña ventana cuando se vacía la caché. Si no desea este recordatorio visual, puede deseleccionar la opción **Escritura de caché** en la [página Interfaz](./interface.md).
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/overview.md
deleted file mode 100644
index 1bc4732214d9f4..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/overview.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-id: overview
-title: Propiedades
----
-
-Los parámetros configuran el funcionamiento del proyecto actual. Estos parámetros pueden ser diferentes para cada proyecto. Incluyen los puertos de escucha, las configuraciones de copia de seguridad, las opciones de seguridad, los parámetros Web, etc.
-
-
-
-> 4D ofrece otro conjunto de parámetros, llamados **Preferencias**, que se aplican a la aplicación 4D IDE. Para más información, consulte [Preferencias](../Preferences/general.md).
-
-## Acceso a los parámetros
-
-Puede acceder a la caja de diálogo Parámetros:
-
-- utilizando la opción de menú **Diseño > Parámetros...**
-- haciendo clic en **Parámetros** en la barra de herramientas 4D
-- en 4D Server, utilizando la opción de menú **Edición > Parámetros...**
-
-Cuando el [modo **Propiedades usuario** está activado](../Desktop/user-settings.md), **Propiedades...** pasa a llamarse **Propiedades de la estructura...** y hay dos comandos de menú adicionales disponibles en cada ubicación:
-
-- **Parámetros usuario...** le da acceso a los parámetros que pueden almacenarse externamente en un archivo usuario. Si se modifican, se utilizan en lugar de los parámetro de estructura.
-- **Parámetros usuario para el archivo de datos...** le da acceso a los parámetros que pueden almacenarse externamente en un archivo usuario adjunto al archivo de datos actual. Si se modifican, se utilizan en lugar de los parámetros usuario de los parámetros de estructura.
-
-### Información sobre el bloqueo
-
-El bloqueo puede ocurrir tanto en los modos Proyecto y Cliente/servidor cuando:
-
-- El archivo *settings.4DSettings* es de "sólo lectura" (sólo Proyectos). Al modificar un parámetro se mostrará una alerta para desbloquearlo, si es posible.
-- Dos o más usuarios intentan modificar los mismos parámetros al tiempo. Los parámetros no pueden utilizarse hasta que el primer usuario los libere cerrando la ventana. (Cliente/servidor únicamente)
-
-En ambos casos, los parámetros pueden abrirse en "Sólo lectura", pero no pueden utilizarse hasta que se elimine el bloqueo.
-
-## Personalización de los parámetros
-
-En las cajas de diálogo de las Propiedades, los parámetros cuyos valores se han modificado aparecen **en negrita**:
-
-
-
-Los parámetros indicados como personalizados pueden haber sido modificados directamente en la caja de diálogo, o pueden haber sido modificados previamente en el caso de un proyecto convertido.
-
-Un parámetro sigue apareciendo en negrita aunque su valor se remplace manualmente por sus valores por defecto. De este modo, siempre es posible identificar visualmente los parámetros que se hayan personalizado.
-
-La mayoría de los parámetros se aplican inmediatamente. Sin embargo, algunas de ellas (como la configuración del entorno de inicio) sólo surten efecto cuando se reinicia la base de datos. En este caso, aparece una caja de diálogo para informarle de que el cambio surtirá efecto en el próximo inicio.
-
-## Reinicialización de los parámetros
-
-Para reiniciar los parámetros a sus valores por defecto y eliminar el estilo negrita que indica que han sido personalizados, haga clic en **Restablecer los valores de fábrica**.
-
-Este botón reinicializa todos los parámetros de la página actual. Se activa cuando se ha modificado al menos un parámetro en la página actual.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/security.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/security.md
deleted file mode 100644
index 6c8d16430a74ee..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/security.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-id: security
-title: Página seguridad
----
-
-Esta página contiene opciones relacionadas con la protección del acceso y de los datos de sus aplicaciones de escritorio.
-
-**Nota**: para una visión general de las funciones de seguridad de 4D, consulte la [guía de seguridad de 4D](https://blog.4d.com/4d-security-guide/).
-
-## Acceso a datos / Acceso de usuarios remotos
-
-> Estos parámetros no se aplican a las bases proyecto abiertas en modo monopuesto.
-
-- **Acceso Diseño y al Explorador de ejecución**: da al grupo especificado la capacidad de entrar al modo Diseño de la base y mostrar el Explorador de ejecución.
-
- Note que:
-
- - La definición de un grupo de acceso en el entorno Diseño también permite desactivar la opción **Crear una tabla** de la caja de diálogo de importación de datos. Para más información sobre esta caja de diálogo, consulte [Importar los datos desde los archivos](https://doc.4d.com/4Dv20/4D/20.2/Importing-data-from-files.300-6750325.en.html).
-
- - El Diseñador y el Administrador siempre tienen acceso al entorno de diseño y al Explorador de ejecución, incluso si no son parte explícitamente del grupo de acceso específico. Para más información sobre usuarios y grupos de usuarios, consulta el capítulo [Usuarios y grupos](../Users/handling_users_groups.md).
-
-- **Usuario por defecto**: cuando se ha definido un Usuario por defecto, todos los usuarios que abren o se conectan a la base tienen los mismos privilegios y restricciones de acceso definidos para este Usuario por defecto. Ya no es necesario ingresar un nombre de usuario. Además, si no ha asociado una contraseña al usuario por defecto, la caja de diálogo Contraseña ya no aparece y la base se abre directamente.
- Esta opción simplifica el acceso a la base de datos a la vez que mantiene un sistema completo de control de datos.
-
- - Si ha asociado una contraseña al usuario predeterminado, al abrir la base aparece una caja de diálogo en el que los usuarios deben introducir una contraseña.
- - Si no ha asociado una contraseña al Usuario Predeterminado, la caja de diálogo de Identificación de Usuario no aparecerá.**Nota:** puede "forzar" la visualización de la caja de diálogo Identificación de usuario cuando el modo "Usuario por defecto" está activo, por ejemplo para conectarse como Administrador o Diseñador. Para ello, presione la tecla **Mayús** mientras abre la base de datos o se conecta a ella.
-
-- **Mostrar lista de usuarios en la caja de diálogo Contraseña**: si se marca esta opción, los usuarios deben elegir su nombre en la lista de usuarios e introducir su contraseña en la caja de diálogo de identificación de usuario. Si no está marcada, los usuarios deben introducir tanto su nombre como su contraseña. Para obtener más información sobre las dos versiones de la caja de diálogo de contraseña, consulte la sección "Acceso a las bases protegidas" en [Presentación del control de acceso](https://doc.4d.com/4Dv20/4D/20.2/Access-system-overview.300-6750353.en.html
-
- - **Ordenar la lista de los usuarios en orden alfabético** (sólo disponible si está marcada la opción anterior): cuando esta opción está seleccionada, la lista de los usuarios de la caja de diálogo de introducción de contraseña se ordena por orden alfabétic
-
-- **Los usuarios pueden cambiar su contraseña**: cuando esta opción está marcada, aparece un botón **Cambiar** en la caja de diálogo Identificación del usuario. Este botón permite al usuario acceder a una caja de diálogo que puede utilizar para modificar su contraseña (para más información sobre esta caja de diálogo, consulte "Modificación de la contraseña por el usuario" en [Garantizar el mantenimiento del sistema](https://doc.4d.com/4Dv20/4D/20.2/Ensuring-system-maintenance.300-6750352.en.html)). Si lo desea, puede ocultar el botón **Cambiar** para que los usuarios no puedan modificar sus contraseñas. Para ello, desmarque esta opción.
-
-## Opciones
-
-- **Filtrado de comandos y métodos proyecto en el editor de fórmulas y en los documentos 4D View Pro y 4D Write Pro**:
- por razones de seguridad, por defecto 4D restringe el acceso a los comandos, funciones y métodos proyecto en el [Editor de fórmulas](https://doc.4d.com/4Dv20/4D/20.2/Formula-editor.200-6750079.en.html) en el modo Aplicación o añadido a áreas multiestilo (usando [`ST INSERT EXPRESSION`](../commands-legacy/st-insert-expression.md)), Documentos 4D Write Pro y 4D View Pro: sólo ciertas funciones 4D y métodos proyecto que han sido declarados explícitamente utilizando el comando [`SET ALLOWED METHODS`](../commands/set-allowed-methods.md) pueden ser utilizados. Puede eliminar total o parcialmente este filtrado mediante las siguientes opciones.
- - **Activado para todos** (opción por defecto): el acceso a los comandos, funciones y métodos proyecto está restringido para todos los usuarios, incluidos el Diseñador y el Administrador.
- - **Desactivado para el Diseñador y el Administrador**: esta opción concede acceso completo a los comandos 4D y a los métodos sólo al Diseñador y al Administrador. Permite definir un modo de acceso ilimitado a los comandos y métodos sin perder el control de las operaciones efectuadas. Durante la fase de desarrollo, este modo puede utilizarse para probar libremente todas las fórmulas, informes, etc. Durante el funcionamiento, puede utilizarse para definir soluciones seguras que permitan el acceso temporal a comandos y métodos. This consists in changing the user (via the [`CHANGE CURRENT USER`](../commands-legacy/change-current-user.md) command) before calling a dialog box or starting a printing process that requires full access to the commands, then returning to the original user when the specific operation is completed.
- **Nota:** si se ha activado el acceso completo mediante la opción anterior, esta opción no tendrá ningún efecto.
- - **Desactivado para todos**: esta opción desactiva el control en las fórmulas. Cuando esta opción está marcada, los usuarios tienen acceso a todos los comandos 4D, plug-ins y métodos proyecto (excepto los invisibles).
- **Nota:** esta opción tiene prioridad sobre el comando [`SET ALLOWED METHODS`](../commands/set-allowed-methods.md). Cuando se selecciona, este comando no hace nada.
-
-- **Autorizar las propiedades usuario**: debe marcar esta opción para poder mostrar cajas de diálogo separadas para las propiedades usuario. Cuando esta opción está marcada, hay disponibles hasta tres cuadros de diálogo: **Propiedades estructura**, **Propiedades usuario**, y **Propiedades usuario para archivo de datos**. Para más información, consulte [Parámetros usuario](../Desktop/user-settings.md).
-
-- **Ejecutar el método "On Host Database Event" de los componentes**: el [método base On Host Database Event](../commands-legacy/on-host-database-event-database-method.md) facilita las fases de inicialización y copia de seguridad de los componentes 4D. Por razones de seguridad, debe autorizar explícitamente la ejecución de este método en cada base de datos local. Para hacer esto, debe marcar esta opción. Por defecto, no está marcado.
-
- Cuando esta opción está seleccionada:
-
- - los componentes 4D están cargados,
- - cada método base [On Host Database Event](../commands-legacy/on-host-database-event-database-method.md) del componente (si lo hay) es llamado por la base local,
- - se ejecuta el código del método.
-
- Cuando no está marcada:
-
- - Los componentes 4D se cargan, pero tienen que gestionar ellos mismos sus fases de inicialización y copia de seguridad.
- - el desarrollador del componente tiene que publicar los métodos del componente que deben ser llamados por la base de datos anfitriona durante estas fases (inicio y cierre)
- - el desarrollador de la base local debe llamar a los métodos apropiados del componente en el momento adecuado (debe estar contemplado en la documentación del componente).
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/web.md b/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/web.md
deleted file mode 100644
index 060f745580ee32..00000000000000
--- a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/settings/web.md
+++ /dev/null
@@ -1,327 +0,0 @@
----
-id: web
-title: Página Web
----
-
-A través de las pestañas de la página **Web**, puede configurar varios aspectos del servidor web integrado de 4D (seguridad, inicio, conexiones, servicios web, etc.). Para más información sobre el funcionamiento del servidor web de 4D, consulte [Servidor web](../WebServer/webServer.md). Para más información sobre los servicios web de 4D, consulte el capítulo [Publicación y uso de los servicios web](https://doc.4d.com/4Dv20/4D/20.2/Publication-and-use-of-Web-Services.200-6750103.en.html).
-
-## Configuración
-
-### Información de publicación
-
-#### Lanzar el servidor web al inicio
-
-Indica si el servidor web se lanzará al iniciar la aplicación 4D. Esta opción se describe en la sección [Administración del servidor web](../WebServer/webServerAdmin.md#starting-the-4d-web-server).
-
-#### Activar HTTP
-
-Indica si el servidor web aceptará o no conexiones no seguras. Ver [Activar HTTP](../WebServer/webServerConfig.md#enable-http).
-
-#### Puerto HTTP
-
-Número de puerto IP (TCP) de escucha para HTTP. Ver [Puerto HTTP](../WebServer/webServerConfig.md#http-port).
-
-#### Dirección IP
-
-Dirección IP en la que el servidor web 4D recibirá las peticiones HTTP (4D local y 4D Server). Ver [Dirección IP a escuchar](../WebServer/webServerConfig.md#ip-address-to-listen).
-
-#### Activar HTTPS
-
-Indica si el servidor web acepta conexiones seguras. Ver [Activar HTTPS](../WebServer/webServerConfig.md#enable-https).
-
-#### Puerto HTTPS
-
-Permite modificar el número de puerto TCP/IP utilizado por el servidor web para las conexiones HTTP seguras sobre TLS (protocolo HTTPS). Ver [Puerto HTTPS](../WebServer/webServerConfig.md#https-port).
-
-#### Autorizar el acceso a la base de datos a través de las URL 4DSYNC
-
-*Nota de compatibilidad:* esta opción es [obsoleta](../WebServer/webServerConfig.md#deprecated-settings). Para el acceso a la base de datos a través de HTTP, ahora se recomienda utilizar las funcionalidades del almacén de datos remoto ORDA y las peticiones REST.
-
-### Rutas
-
-#### Raíz HTML por defecto
-
-Definir la ubicación por defecto de los archivos del sitio web e indicar el nivel jerárquico en el disco por encima del cual los archivos no serán accesibles. Ver [Carpeta raíz](../WebServer/webServerConfig.md#root-folder).
-
-#### Página de inicio por defecto
-
-Designa una página de inicio por defecto para el servidor web. Ver [Página de inicio por defecto](../WebServer/webServerConfig.md#default-home-page).
-
-## Options (I)
-
-### Caché
-
-#### Utilizar la caché Web de 4D
-
-Activa la caché de la página web. Ver [Caché](../WebServer/webServerConfig.md#cache).
-
-#### Tamaño de la caché de las páginas
-
-Define el tamaño de la caché. Ver [Caché](../WebServer/webServerConfig.md#cache).
-
-#### Vaciar la caché
-
-En cualquier momento, puede vacíar la caché de las páginas y de las imágenes que contiene (si, por ejemplo, ha modificado una página estática y quiere volver a cargarla en la caché).
-At any moment, you can clear the cache of the pages and images that it contains (if, for example, you have modified a static page and you want to reload it in the cache). La caché se borra inmediatamente.
-
-> También puede utilizar la URL especial [/4DCACHECLEAR](../WebServer/webServerAdmin.md#4dcacheclear).
-
-### Procesos Web
-
-Esta área le permite configurar cómo el servidor web manejará las sesiones usuario y sus procesos asociados.
-
-> La opción **Sesiones heredadas** solo está disponible para la compatibilidad en las bases/proyectos creados con las versiones de 4D anteriores a 4D v18 R6.
-
-#### Sesiones extensibles (sesiones multiproceso)
-
-Cuando selecciona esta opción (recomendado), una sesión usuario se gestiona a través de un objeto **Session**. Ver la [página Sesiones usuario](../WebServer/sessions.md#enabling-web-sessions).
-
-#### Sin sesiones
-
-Cuando se selecciona esta opción, el servidor web no ofrece ningún soporte específico para las [sesiones usuario](../WebServer/sessions.md). Las solicitudes de sucesivas de los clientes web siempre son independientes y no se mantiene ningún contexto en el servidor.
-
-En este modo, puede configurar los parámetros del servidor web adicionales:
-
-- [Máximo de procesos web simultáneos](#maximum-concurrent-web-processes)
-- [Reutilización de contextos temporales (4D en modo remoto)](#reuse-temporary-contexts)
-- [Usar procesos apropiativos](#use-preemptive-processes)
-
-#### Sesiones antiguas (sesiones procesos únicos)
-
-*Nota de compatibilidad:* esta opción sólo está disponible en las bases/proyectos creados con una versión 4D anterior a 4D v18 R6.
-
-Esta opción permite gestionar las antiguas sesiones usuario por el servidor HTTP de 4D. Este mecanismo se describe en la sección [Gestión de Sesiones Web (Legado)](https://doc.4d.com/4Dv20/4D/20.6/Web-Sessions-Management-Legacy.300-7487177.en.html). Ver [Mantener sesión](../WebServer/webServerConfig.md#keep-session).
-
-Cuando se selecciona, la opción [Reutilización de los contextos temporales (4D en modo remoto)](#reuse-temporary-contexts) es marcada automáticamente (y bloqueada).
-
-#### Procesos Web simultáneos maximos
-
-No disponible con las [sesiones extensibles](../WebServer/sessions.md).
-
-Límite estrictamente superior de procesos web simultáneos. Ver [Procesos Web simultáneos máximos](../WebServer/webServerConfig.md#maximum-concurrent-web-processes).
-
-#### Reutilización de los contextos temporales
-
-No disponible con las [sesiones extensibles](../WebServer/sessions.md).
-
-Le permite optimizar el funcionamiento del servidor Web de 4D en modo remoto. Ver [Reutilización de los contextos temporales en modo remoto)](../WebServer/webServerConfig.md#reuse-temporary-contexts-in-remote-mode).
-
-#### Utilizar procesos apropiativos
-
-No disponible con las [sesiones extensibles](../WebServer/sessions.md).
-
-Activa los procesos web apropiativos en sus aplicaciones compiladas. Cuando se selecciona **Utilizar los procesos apropiativos**, la elegibilidad de su código relacionado con la web (incluyendo las etiquetas 4D y los métodos base Web) para la ejecución apropiativa será evaluada durante la compilación. Para más información, consulte [Utilizar los procesos web apropiativos](../WebServer/preemptiveWeb.md).
-
-> Esta opción no se aplica a las sesiones extensibles, a los procesos REST (modo compilado) ni a los procesos de servicios web (servidor o cliente). Ver [Activar el modo apropiativo para el servidor web](../WebServer/webServerConfig.md#use-preemptive-processes).
-
-#### Tiempo de espera del proceso inactivo
-
-No disponible con las [sesiones extensibles](../WebServer/sessions.md).
-
-Le permite definir el tiempo de espera máximo antes de cerrar los procesos Web inactivos en el servidor. Ver [Duración de los procesos inactivos](../WebServer/webServerConfig.md#inactive-process-timeout).
-
-### Contraseñas Web
-
-Define el sistema de autenticación que desea aplicar a su servidor web. Se proponen tres opciones:
-
-Custom (default) Passwords with BASIC protocol Passwords with DIGEST protocol
-
-Se recomienda utilizar la autenticación **personalizada**. Ver el capítulo [**Autenticación**](../WebServer/authentication.md) en la documentación *Desarrollo Web*.
-
-## Options (II)
-
-### Conversión texto
-
-#### Enviar directamente los caracteres extendidos
-
-Ver [Propiedades obsoletas](../WebServer/webServerConfig.md#deprecated-settings).
-
-#### Standard Set
-
-Define el conjunto de caracteres a utilizar por el servidor web 4D. Ver [Conjunto de caracteres](../WebServer/webServerConfig.md#character-set).
-
-### Conexiones Keep-Alive
-
-Ver [Propiedades obsoletas](../WebServer/webServerConfig.md#keep-alive-connections).
-
-### Parámetros CORS
-
-#### Activar CORS
-
-Activa el servicio Cross-origin resource sharing (CORS). Ver [Activar Cors](../WebServer/webServerConfig.md#activer-cors).
-
-#### Nombres de dominios/métodos HTTP permitidos
-
-Lista de hosts y métodos permitidos para el servicio CORS. Ver [Parámetros CORS](../WebServer/webServerConfig.md#cors-settings).
-
-## Historial (tipo)
-
-### Formato del historial
-
-Inicia o detiene el registro de las peticiones recibidas por el servidor web 4D en el archivo *logweb.txt* y define su formato. Ver [Registro de logs](../WebServer/webServerConfig.md#log-recording).
-
-> La activación y desactivación del archivo de historial de peticiones también se puede efectuar por programación utilizando el comando [WEB SET OPTION](../commands-legacy/web-set-option.md).
-
-El menú de formato de registro ofrece las siguientes opciones:
-
-- **Sin archivo de registro**: cuando se selecciona esta opción, 4D no generará un archivo de historial de peticiones.
-
-- **CLF (Common Log Format)**: cuando se selecciona esta opción, el historial de peticiones se genera en formato CLF. Con el formato CLF, cada línea del archivo representa una solicitud, como:\
- host rfc931 user [DD/MMM/AAAA:HH:MM:SS] "request" state length\
- Cada campo está separado por un espacio y cada línea termina con la secuencia CR/LF (character 13, character 10).
-
- - host: dirección IP del cliente (por ejemplo: "192.100.100.10)
- - rfc931: información no generada por 4D, siempre es - (un signo menos)
- - usuario: nombre del usuario como está autenticado, o - (un signo menos). Si el nombre de usuario contiene espacios, se remplazan por _ (un guión bajo).
- - DD: día, MMM: una abreviatura de 3 letras para el nombre del mes (Jan, Feb,...), YYYY: año, HH: hora, MM: minutos, SS: segundos
-
-> La fecha y hora son locales al servidor.
-
-- petición: solicitud enviada por el cliente (por ejemplo, GET /index.htm HTTP/1.0)
-- estado: respuesta dada por el servidor.
-- longitud: tamaño de los datos devueltos (excepto el encabezado HTTP) o 0.
-
-> **Nota:** por razones de rendimiento, las operaciones se guardan en una memoria búfer por paquetes de 1Kb antes de ser escritas en el disco. Las operaciones también se escriben en disco si no se ha enviado ninguna petición cada 5 segundos.
-> Los posibles valores de estado son los siguientes
-> 200: OK
-> 204: No contents
-> 302: Redirection
-> 304: Not modified
-> 400: Incorrect request
-> 401: Authentication required
-> 404: Not found
-> 500: Internal error
-> El formato CLF no puede personalizarse.
-
-- **DLF (Combined Log Format)**: cuando se selecciona esta opción, el historial de peticiones se genera en formato DLF. El formato DLF es similar al formato CLF y utiliza exactamente la misma estructura. Simplemente añade dos campos HTTP adicionales al final de cada petición: Referer y User-agent.
-
- - Referer: contiene la URL de la página que apunta al documento solicitado.
- - User-agent: contiene el nombre y la versión del navegador o del software cliente en el origen de la petición.
-
-> El formato DLF no se puede personalizar.
-
-- **ELF (Extended Log Format)**: cuando se selecciona esta opción, el historial de peticiones se genera en formato ELF. El formato ELF está muy extendido en el mundo de los navegadores HTTP. Puede utilizarse para construir historiales sofisticados que respondan a necesidades específicas. Por esta razón, el formato ELF se puede personalizar: es posible elegir los campos que se van a registrar, así como su orden de inserción en el archivo.
-
-- **WLF (WebStar Log Format)**: cuando se selecciona esta opción, el historial de peticiones se genera en formato WLF. El formato WLF se desarrolló específicamente para el servidor 4D WebSTAR. Es similar al formato ELF, con sólo unos pocos campos adicionales. Al igual que el formato ELF, se puede personalizar.
-
-**Configuring the fields** When you choose the ELF (Extended Log Format) or WLF (WebStar Log Format) format, the "Weg Log Token Selection" area displays the fields available for the chosen format. Deberá seleccionar cada campo para incluirlo en el registro. You will need to select each field to be included in the log.
-
-**Nota**: no puede seleccionar el mismo campo dos veces.
-
-La siguiente tabla enumera los campos disponibles para cada formato (en orden alfabético) y describe su contenido:
-
-| Campo | ELF | WLF | Valor |
-| ------------------------------------------------------ | --- | --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| BYTES_RECEIVED | | X | Número de bytes recibidos por el servidor |
-| BYTES_SENT | X | X | Número de bytes enviados por el servidor al cliente |
-| C_DNS | X | X | Dirección IP del DNS (ELF: campo idéntico al campo C_IP) |
-| C_IP | X | X | Dirección IP del cliente (por ejemplo 192.100.100.10) |
-| CONNECTION_ID | | X | Número de identificación de la conexión |
-| CS(COOKIE) | X | X | Información sobre las cookies contenidas en la petición HTTP |
-| CS(HOST) | X | X | Campo Host de la petición HTTP |
-| CS(REFERER) | X | X | URL de la página que apunta al documento solicitado |
-| CS(USER_AGENT) | X | X | Información sobre el software y el sistema operativo del cliente |
-| CS_SIP | X | X | Dirección IP del servidor |
-| CS_URI | X | X | URI sobre el que se realiza la petición |
-| CS_URI_QUERY | X | X | Parámetros de consulta de la petición |
-| CS_URI_STEM | X | X | Parte de la solicitud sin los parámetros de la consulta |
-| DATE | X | X | DD: día, MMM: abreviación de 3 letras para el mes (Jan, Feb,...), YYYY: año |
-| METHOD | X | X | Método HTTP utilizado para la solicitud enviada al servidor |
-| PATH_ARGS | | X | Parámetros de la CGI: cadena situada después del caracter "$" |
-| STATUS | X | X | Respuesta ofrecida por el servidor |
-| TIME | X | X | HH: hora, MM: minutos, SS: segundos |
-| TRANSFER_TIME | X | X | Tiempo solicitado por el servidor para generar la respuesta |
-| USER | X | X | Nombre de usuario si está autenticado; en caso contrario, - (signo menos). |
-| | | | Si el nombre de usuario contiene espacios, se sustituyen por _ (subrayado) |
-| URL | | X | URL solicitado por el cliente |
-
-> Las fechas y horas se indican en GMT.
-
-## Historial (periodicidad)
-
-Configure los parámetros de copia de seguridad automática para el registro de las peticiones. Primero debe elegir la frecuencia (días, semanas, etc.) o el criterio de límite de tamaño de archivo haciendo clic en el botón de opción correspondiente. A continuación, debe especificar el momento preciso de la copia de seguridad si es necesario.
-
-- **Sin copia de seguridad**: la función de copia de seguridad programada está desactivada.
-- **Cada X hora(s)**: esta opción se utiliza para programar las copias de seguridad con una base horaria. Puede introducir un valor entre 1 y 24 .
-
- - **a partir de**: permite definir la hora de activación de la primera copia de seguridad.
-- **Cada X día(s) a las X**: esta opción se utiliza para programar las copias de seguridad con una base diaria. Introduzca 1 si desea realizar una copia de seguridad diaria. Cuando esta opción está marcada, debe indicar la hora a la que debe comenzar la copia de seguridad.
-- **Cada X semana(s), día a las X**: esta opción se utiliza para programar las copias de seguridad con una base semanal. Introduzca 1 si desea realizar una copia de seguridad semanal. Enter 1 if you want to perform a weekly backup. When this option is checked, you must indicate the day(s) of the week and the time when each backup must be started. You can select several days of the week if desired.
-- **Cada X mes(es), el día X a las X**: esta opción se utiliza para programar las copias de seguridad con una base mensual. Introduzca 1 si desea realizar una copia de seguridad mensual. Enter 1 if you want to perform a monthly backup.
-- **Todos los X MB**: esta opción se utiliza para programar las copias de seguridad en función del tamaño del archivo de registro actual. Una copia de seguridad se activa automáticamente cuando el archivo alcanza el tamaño especificado. Puedes definir un límite de tamaño de 1, 10, 100 o 1000 MB.
-
-> En el caso de las copias de seguridad programadas, si el servidor web no fue lanzado cuando se programó la copia de seguridad, en el siguiente lanzamiento 4D considera que la copia de seguridad ha fallado y aplica los parámetros adecuados, definidos en las Propiedades de la base.
-
-## Web Services
-
-Las opciones de esta pestaña permiten activar y configurar los servicios Web para el proyecto 4D, tanto por su publicación (lado del servidor) y su suscripción (lado del cliente).
-
-Para más información sobre el soporte de los servicios web en 4D, consulte el capítulo [Publicación y uso de los servicios web](https://doc.4d.com/4Dv20/4D/20.2/Publication-and-use-of-Web-Services.200-6750103.en.html).
-
-### Servidor
-
-Esta área contiene varias opciones relativas con el uso de 4D como un "servidor" de Servicios Web, es decir la publicación de los métodos proyecto en forma de Servicios Web.
-
-- **Autorizar peticiones de servicios web**: esta opción le permite inicializar la publicación de servicios web. Si esta opción no ha sido seleccionada, 4D rechaza las peticiones SOAP y no genera una WSDL - incluso si los métodos tienen el atributo *Publicado en WSDL*. Cuando esta opción está marcada, 4D crea el archivo WSDL.
-- **Nombre del Servicio Web**: esta área le permite cambiar el "nombre genérico" del Servicio Web. Este nombre se utiliza para diferenciar los servicios tanto a nivel de servidor SOAP (cuando el servidor publica varios Servicios Web diferentes), así como en los directorios de Servicios Web. Por defecto, 4D utiliza el nombre A_WebService.
-- **Espacio de nombres de Servicios Web**: esta área se utiliza para cambiar el espacio de nombres (namespace) de los Servicios Web publicados por 4D. Cada Servicio Web publicado en Internet debe ser único. La unicidad de los nombres de los Servicios Web se asegura mediante el uso de espacios de nombres XML. Un namespace es una cadena de caracteres arbitraria usada para identificar de manera única un conjunto de etiquetas XML. Por lo general, el espacio de nombres comienza por la URL de la empresa (http://mycompany.com/mynamespace). En este caso, no es indispensable tener nada en particular en la URL indicada; lo que importa es que la cadena de caracteres utilizada sea única. Por defecto, 4D utiliza el siguiente espacio de nombres: http://www.4d.com/namespace/default.
-
-> Conforme al estándar XML para los nombres de etiquetas, las cadenas de caracteres utilizadas no deben contener espacios ni comenzar con un número. Además, para evitar cualquier riesgo de incompatibilidad, recomendamos que no utilice ningún caracter extendido (como los caracteres acentuados).
-
-### Cliente
-
-Esta área contiene varias opciones relacionadas con el uso de 4D como un "cliente" de Servicios Web, es decir, suscribirse a los servicios publicados en la red.
-
-- **Prefijo de los métodos creados por el asistente**: esta área le permite cambiar el prefijo que se añade automáticamente por 4D al nombre de los métodos proxy generados por el asistente de servicios web. Los métodos proyecto proxy forman un enlace entre la aplicación 4D y el servidor de Servicios Web. Por defecto, 4D utiliza el prefijo "proxy_".
-
-## Funcionalidades Web
-
-Esta página contiene las opciones utilizadas para activar y controlar las funcionalidades web avanzadas, como el servidor REST.
-
-### Publicación
-
-#### Activar el servicio REST
-
-Inicia y detiene el servidor REST. Ver [Configuración del servidor REST](../REST/configuration.md).
-
-### Acceso
-
-:::info Obsoleto
-
-**Esta sección está obsoleta** a partir de 4D 20 R6. Si la configuración actual del proyecto es obsoleta y debe actualizarse, se mostrará esta sección, incluido el botón **Activar la autenticación REST mediante la función ds.authentify()** (ver más abajo). Si su proyecto ya es compatible con el modo [Force login](../REST/authUsers.md#force-login-mode), la sección falta y puede ignorar este párrafo.
-
-:::
-
-See [Users and sessions](../REST/authUsers.md) to know the recommended way to control and manage REST access in your 4D projects.
-
-#### Activar la autenticación REST mediante la función ds.authentify()
-
-Haga clic en el botón **Activar la autenticación REST mediante la función ds.authentify()** para actualizar automáticamente su proyecto en lo que respecta al acceso de usuarios REST. Tenga en cuenta que esta operación no puede revertirse y puede requerir que modifique su código (aparece un cuadro de diálogo de advertencia al presionar el botón).
-
-:::note
-
-Este botón solo está disponible en los proyectos abiertos con la aplicación 4D (monopuesto).
-
-:::
-
-El botón activa la siguiente secuencia de actualización:
-
-- Se elimina el grupo de usuarios de la API REST definido en el menú **Leer/Escribir**.
-- Se elimina el método base `On REST Authentication` (se traslada a la papelera del sistema).
-- Se crea un archivo ["roles.json"](../ORDA/privileges.md#rolesjson-file) por defecto en la carpeta [Sources](../Project/architecture.md#sources) del proyecto si no existe, con su atributo `forceLogin` a `True`.
-
-Recuerde reiniciar su proyecto después de realizar esta actualización.
-
-El siguiente paso es modificar su código en consecuencia. [**Vea esta entrada del blog para saber cómo proceder**](https://blog.4d.com/force-login-becomes-default-for-all-rest-auth/).
-
-### Qodly Studio
-
-#### Activar el acceso a Qodly Studio
-
-:::note
-
-Esta opción sólo aparece si la licencia de Qodly Studio está activa.
-
-:::
-
-Esta opción permite el acceso del usuario a [Qodly Studio](../WebServer/qodly-studio.md) para el proyecto actual. Tenga en cuenta que el acceso global debe permitirse al [nivel de la aplicación](../Admin/webAdmin.md).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20/API/CollectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-20/API/CollectionClass.md
index 1d782b117b0b2b..589ce2c5986e0a 100644
--- a/i18n/es/docusaurus-plugin-content-docs/version-20/API/CollectionClass.md
+++ b/i18n/es/docusaurus-plugin-content-docs/version-20/API/CollectionClass.md
@@ -3249,19 +3249,18 @@ Quiere saber si al menos un valor de la colección es >0.
-**.sort**() : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
+**.sort**() : Collection **.sort**( *ascOrDesc* : Integer ) : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
-| Parámetros | Tipo | | Descripción |
-| ---------- | ----------- |:--:| ------------------------------------------------------ |
-| formula | 4D.Function | -> | Objeto fórmula |
-| methodName | Text | -> | Nombre de un método |
-| extraParam | any | -> | Parámetros del método |
-| Resultado | Collection | <- | Colección original ordenada|
-
-
-|
+| Parámetros | Tipo | | Descripción |
+| ---------- | ----------- |:--:| ---------------------------------------------------- |
+| ascOrDesc | Integer | -> | `ck ascending` o `ck descending` (valores escalares) |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| extraParam | any | -> | Parámetros del método |
+| Resultado | Collection | <- | La nueva colección |
+
#### Descripción
@@ -3269,7 +3268,16 @@ Quiere saber si al menos un valor de la colección es >0.
La función `.orderBy()` ordena los elementos de la colección original y también devuelve la colección ordenada .
> Esta función modifica la colección original.
-Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo. Si la colección contiene valores escalares de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si *attributePath* lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
+Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo. You can also pass one of the following constants in the *ascOrDesc* parameter:
+
+ |Constant| Type|Value|Comment|
+ |---|---|---|---|
+ |ck ascending|Integer|0|Elements are ordered in ascending order (default)|
+ |ck descending|Integer|1|Elements are ordered in descending order|
+
+ This syntax orders scalar values in the collection only (other element types such as objects or collections are returned unordered).
+
+ Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si *attributePath* lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
1. null
2. booleans
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 601f7f630e4e78..e5188fe1e9f7f2 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
-Este evento se dispara cuando la entrada de datos del registro ha sido validada, por ejemplo después de una llamada al comando `SAVE RECORD` o una [acción estándar](FormObjects/properties_Action.md#standard-action) `accept`.
+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).
### Subformulario
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21.json b/i18n/es/docusaurus-plugin-content-docs/version-21.json
new file mode 100644
index 00000000000000..5001d1f74f7ef5
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21.json
@@ -0,0 +1,478 @@
+{
+ "version.label": {
+ "message": "21 BETA",
+ "description": "The label for version 21"
+ },
+ "sidebar.docs.category.Getting Started": {
+ "message": "Comencemos",
+ "description": "The label for category Getting Started in sidebar docs"
+ },
+ "sidebar.docs.category.Getting Started.link.generated-index.title": {
+ "message": "Comencemos",
+ "description": "The generated-index page title for category Getting Started in sidebar docs"
+ },
+ "sidebar.docs.category.Project & IDE": {
+ "message": "Project & IDE",
+ "description": "The label for category Project & IDE in sidebar docs"
+ },
+ "sidebar.docs.category.Project & IDE.link.generated-index.title": {
+ "message": "Project & IDE",
+ "description": "The generated-index page title for category Project & IDE in sidebar docs"
+ },
+ "sidebar.docs.category.Dababase structure": {
+ "message": "Estructura de la base de datos",
+ "description": "The label for category Dababase structure in sidebar docs"
+ },
+ "sidebar.docs.category.Code & Methods": {
+ "message": "Código y métodos",
+ "description": "The label for category Code & Methods in sidebar docs"
+ },
+ "sidebar.docs.category.Settings": {
+ "message": "Propiedades",
+ "description": "The label for category Settings in sidebar docs"
+ },
+ "sidebar.docs.category.Debugging": {
+ "message": "Depuración",
+ "description": "The label for category Debugging in sidebar docs"
+ },
+ "sidebar.docs.category.Application Preferences": {
+ "message": "Preferencias de la aplicación",
+ "description": "The label for category Application Preferences in sidebar docs"
+ },
+ "sidebar.docs.category.4D Language": {
+ "message": "Lenguaje 4D",
+ "description": "The label for category 4D Language in sidebar docs"
+ },
+ "sidebar.docs.category.4D Language.link.generated-index.title": {
+ "message": "Lenguaje 4D",
+ "description": "The generated-index page title for category 4D Language in sidebar docs"
+ },
+ "sidebar.docs.category.Concepts": {
+ "message": "Conceptos",
+ "description": "The label for category Concepts in sidebar docs"
+ },
+ "sidebar.docs.category.Data Types": {
+ "message": "Tipos de datos",
+ "description": "The label for category Data Types in sidebar docs"
+ },
+ "sidebar.docs.category.Commands by theme": {
+ "message": "Comandos por tema",
+ "description": "The label for category Commands by theme in sidebar docs"
+ },
+ "sidebar.docs.category.Classes": {
+ "message": "Clases",
+ "description": "The label for category Classes in sidebar docs"
+ },
+ "sidebar.docs.category.Classes.link.generated-index.title": {
+ "message": "Clases",
+ "description": "The generated-index page title for category Classes in sidebar docs"
+ },
+ "sidebar.docs.category.Classes.link.generated-index.description": {
+ "message": "Lista de clases 4D integradas",
+ "description": "The generated-index page description for category Classes in sidebar docs"
+ },
+ "sidebar.docs.category.Core Development": {
+ "message": "Desarrollo",
+ "description": "The label for category Core Development in sidebar docs"
+ },
+ "sidebar.docs.category.Core Development.link.generated-index.title": {
+ "message": "Desarrollo",
+ "description": "The generated-index page title for category Core Development in sidebar docs"
+ },
+ "sidebar.docs.category.ORDA": {
+ "message": "ORDA",
+ "description": "The label for category ORDA in sidebar docs"
+ },
+ "sidebar.docs.category.Processes": {
+ "message": "Procesos",
+ "description": "The label for category Processes in sidebar docs"
+ },
+ "sidebar.docs.category.Processes.link.generated-index.title": {
+ "message": "Procesos",
+ "description": "The generated-index page title for category Processes in sidebar docs"
+ },
+ "sidebar.docs.category.Database Methods": {
+ "message": "Métodos base",
+ "description": "The label for category Database Methods in sidebar docs"
+ },
+ "sidebar.docs.category.Database Methods.link.generated-index.title": {
+ "message": "Métodos base",
+ "description": "The generated-index page title for category Database Methods in sidebar docs"
+ },
+ "sidebar.docs.category.Web Applications": {
+ "message": "Aplicaciones web",
+ "description": "The label for category Web Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Web Applications.link.generated-index.title": {
+ "message": "Aplicaciones web",
+ "description": "The generated-index page title for category Web Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Web Applications.link.generated-index.description": {
+ "message": "Guías para el desarrollo de aplicaciones Web con 4D",
+ "description": "The generated-index page description for category Web Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Web Server": {
+ "message": "Servidor Web",
+ "description": "The label for category Web Server in sidebar docs"
+ },
+ "sidebar.docs.category.REST API": {
+ "message": "REST API",
+ "description": "The label for category REST API in sidebar docs"
+ },
+ "sidebar.docs.category.REST API.link.generated-index.title": {
+ "message": "REST API",
+ "description": "The generated-index page title for category REST API in sidebar docs"
+ },
+ "sidebar.docs.category.REST API.link.generated-index.description": {
+ "message": "Exponiendo su datastore a REST y utilizando la API REST.",
+ "description": "The generated-index page description for category REST API in sidebar docs"
+ },
+ "sidebar.docs.category.Exposing your datastore in REST": {
+ "message": "Exponiendo su almacén de datos en REST",
+ "description": "The label for category Exposing your datastore in REST in sidebar docs"
+ },
+ "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.title": {
+ "message": "Exponiendo su almacén de datos en REST",
+ "description": "The generated-index page title for category Exposing your datastore in REST in sidebar docs"
+ },
+ "sidebar.docs.category.Exposing your datastore in REST.link.generated-index.description": {
+ "message": "Configura su almacén de datos para acceso REST",
+ "description": "The generated-index page description for category Exposing your datastore in REST in sidebar docs"
+ },
+ "sidebar.docs.category.API (general)": {
+ "message": "API (general)",
+ "description": "The label for category API (general) in sidebar docs"
+ },
+ "sidebar.docs.category.API (general).link.generated-index.title": {
+ "message": "API (general)",
+ "description": "The generated-index page title for category API (general) in sidebar docs"
+ },
+ "sidebar.docs.category.API (general).link.generated-index.description": {
+ "message": "API REST para información global",
+ "description": "The generated-index page description for category API (general) in sidebar docs"
+ },
+ "sidebar.docs.category.API (dataClass)": {
+ "message": "API (dataClass)",
+ "description": "The label for category API (dataClass) in sidebar docs"
+ },
+ "sidebar.docs.category.API (dataClass).link.generated-index.title": {
+ "message": "API (dataClass)",
+ "description": "The generated-index page title for category API (dataClass) in sidebar docs"
+ },
+ "sidebar.docs.category.API (dataClass).link.generated-index.description": {
+ "message": "API REST para dataClass.",
+ "description": "The generated-index page description for category API (dataClass) in sidebar docs"
+ },
+ "sidebar.docs.category.Desktop Applications": {
+ "message": "Aplicaciones de escritorio",
+ "description": "The label for category Desktop Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Desktop Applications.link.generated-index.title": {
+ "message": "Aplicaciones de escritorio",
+ "description": "The generated-index page title for category Desktop Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Desktop Applications.link.generated-index.description": {
+ "message": "Guías para el desarrollo de aplicaciones de escritorio con 4D",
+ "description": "The generated-index page description for category Desktop Applications in sidebar docs"
+ },
+ "sidebar.docs.category.Forms": {
+ "message": "Formularios",
+ "description": "The label for category Forms in sidebar docs"
+ },
+ "sidebar.docs.category.Form Editor": {
+ "message": "Editor de formularios",
+ "description": "The label for category Form Editor in sidebar docs"
+ },
+ "sidebar.docs.category.Form Properties": {
+ "message": "Propiedades de los formularios",
+ "description": "The label for category Form Properties in sidebar docs"
+ },
+ "sidebar.docs.category.Form Objects": {
+ "message": "Objetos formularios",
+ "description": "The label for category Form Objects in sidebar docs"
+ },
+ "sidebar.docs.category.Form Object Properties": {
+ "message": "Propiedades de los objetos de formulario",
+ "description": "The label for category Form Object Properties in sidebar docs"
+ },
+ "sidebar.docs.category.Form Events": {
+ "message": "Eventos formulario",
+ "description": "The label for category Form Events in sidebar docs"
+ },
+ "sidebar.docs.category.Menus": {
+ "message": "Menús",
+ "description": "The label for category Menus in sidebar docs"
+ },
+ "sidebar.docs.category.Access Rights": {
+ "message": "Derechos de acceso",
+ "description": "The label for category Access Rights in sidebar docs"
+ },
+ "sidebar.docs.category.Access Rights.link.generated-index.title": {
+ "message": "Derechos de acceso",
+ "description": "The generated-index page title for category Access Rights in sidebar docs"
+ },
+ "sidebar.docs.category.Access Rights.link.generated-index.description": {
+ "message": "Control de acceso y privilegios de usuario para aplicaciones de escritorio.",
+ "description": "The generated-index page description for category Access Rights in sidebar docs"
+ },
+ "sidebar.docs.category.Administration": {
+ "message": "Administración",
+ "description": "The label for category Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Administration.link.generated-index.title": {
+ "message": "Administración",
+ "description": "The generated-index page title for category Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Administration.link.generated-index.description": {
+ "message": "Cómo supervisar sus aplicaciones 4D",
+ "description": "The generated-index page description for category Administration in sidebar docs"
+ },
+ "sidebar.docs.category.4D Server Administration Window": {
+ "message": "Ventana de administración de 4D Server",
+ "description": "The label for category 4D Server Administration Window in sidebar docs"
+ },
+ "sidebar.docs.category.Web Administration": {
+ "message": "Administración Web",
+ "description": "The label for category Web Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Web Administration.link.generated-index.title": {
+ "message": "Administración Web",
+ "description": "The generated-index page title for category Web Administration in sidebar docs"
+ },
+ "sidebar.docs.category.Web Administration.link.generated-index.description": {
+ "message": "Herramientas web 4D para administrar y supervisar sus aplicaciones.",
+ "description": "The generated-index page description for category Web Administration in sidebar docs"
+ },
+ "sidebar.docs.category.MSC": {
+ "message": "CSM",
+ "description": "The label for category MSC in sidebar docs"
+ },
+ "sidebar.docs.category.Backup and Restore": {
+ "message": "Copia de seguridad y restauración",
+ "description": "The label for category Backup and Restore in sidebar docs"
+ },
+ "sidebar.docs.category.Extensions": {
+ "message": "Extensiones",
+ "description": "The label for category Extensions in sidebar docs"
+ },
+ "sidebar.docs.category.Extensions.link.generated-index.title": {
+ "message": "Extensiones",
+ "description": "The generated-index page title for category Extensions in sidebar docs"
+ },
+ "sidebar.docs.category.Extending 4D applications": {
+ "message": "Extensión de las aplicaciones 4D",
+ "description": "The label for category Extending 4D applications in sidebar docs"
+ },
+ "sidebar.docs.category.4D View Pro": {
+ "message": "4D View Pro",
+ "description": "The label for category 4D View Pro in sidebar docs"
+ },
+ "sidebar.docs.category.4D View Pro.link.generated-index.title": {
+ "message": "4D View Pro",
+ "description": "The generated-index page title for category 4D View Pro in sidebar docs"
+ },
+ "sidebar.docs.category.Commands": {
+ "message": "Comandos",
+ "description": "The label for category Commands in sidebar docs"
+ },
+ "sidebar.docs.category.A": {
+ "message": "A",
+ "description": "The label for category A in sidebar docs"
+ },
+ "sidebar.docs.category.A.link.generated-index.title": {
+ "message": "A",
+ "description": "The generated-index page title for category A in sidebar docs"
+ },
+ "sidebar.docs.category.C": {
+ "message": "C",
+ "description": "The label for category C in sidebar docs"
+ },
+ "sidebar.docs.category.C.link.generated-index.title": {
+ "message": "C",
+ "description": "The generated-index page title for category C in sidebar docs"
+ },
+ "sidebar.docs.category.D": {
+ "message": "D",
+ "description": "The label for category D in sidebar docs"
+ },
+ "sidebar.docs.category.D.link.generated-index.title": {
+ "message": "D",
+ "description": "The generated-index page title for category D in sidebar docs"
+ },
+ "sidebar.docs.category.E": {
+ "message": "E",
+ "description": "The label for category E in sidebar docs"
+ },
+ "sidebar.docs.category.E.link.generated-index.title": {
+ "message": "E",
+ "description": "The generated-index page title for category E in sidebar docs"
+ },
+ "sidebar.docs.category.F": {
+ "message": "F",
+ "description": "The label for category F in sidebar docs"
+ },
+ "sidebar.docs.category.F.link.generated-index.title": {
+ "message": "F",
+ "description": "The generated-index page title for category F in sidebar docs"
+ },
+ "sidebar.docs.category.G": {
+ "message": "G",
+ "description": "The label for category G in sidebar docs"
+ },
+ "sidebar.docs.category.G.link.generated-index.title": {
+ "message": "G",
+ "description": "The generated-index page title for category G in sidebar docs"
+ },
+ "sidebar.docs.category.I": {
+ "message": "I",
+ "description": "The label for category I in sidebar docs"
+ },
+ "sidebar.docs.category.I.link.generated-index.title": {
+ "message": "I",
+ "description": "The generated-index page title for category I in sidebar docs"
+ },
+ "sidebar.docs.category.M": {
+ "message": "M",
+ "description": "The label for category M in sidebar docs"
+ },
+ "sidebar.docs.category.M.link.generated-index.title": {
+ "message": "M",
+ "description": "The generated-index page title for category M in sidebar docs"
+ },
+ "sidebar.docs.category.N": {
+ "message": "N",
+ "description": "The label for category N in sidebar docs"
+ },
+ "sidebar.docs.category.N.link.generated-index.title": {
+ "message": "N",
+ "description": "The generated-index page title for category N in sidebar docs"
+ },
+ "sidebar.docs.category.O": {
+ "message": "O",
+ "description": "The label for category O in sidebar docs"
+ },
+ "sidebar.docs.category.O.link.generated-index.title": {
+ "message": "O",
+ "description": "The generated-index page title for category O in sidebar docs"
+ },
+ "sidebar.docs.category.P": {
+ "message": "P",
+ "description": "The label for category P in sidebar docs"
+ },
+ "sidebar.docs.category.P.link.generated-index.title": {
+ "message": "P",
+ "description": "The generated-index page title for category P in sidebar docs"
+ },
+ "sidebar.docs.category.R": {
+ "message": "R",
+ "description": "The label for category R in sidebar docs"
+ },
+ "sidebar.docs.category.R.link.generated-index.title": {
+ "message": "R",
+ "description": "The generated-index page title for category R in sidebar docs"
+ },
+ "sidebar.docs.category.S": {
+ "message": "S",
+ "description": "The label for category S in sidebar docs"
+ },
+ "sidebar.docs.category.S.link.generated-index.title": {
+ "message": "S",
+ "description": "The generated-index page title for category S in sidebar docs"
+ },
+ "sidebar.docs.category.4D Write Pro": {
+ "message": "4D Write Pro",
+ "description": "The label for category 4D Write Pro in sidebar docs"
+ },
+ "sidebar.docs.category.4D Write Pro.link.generated-index.title": {
+ "message": "4D Write Pro",
+ "description": "The generated-index page title for category 4D Write Pro in sidebar docs"
+ },
+ "sidebar.docs.category.Document Elements": {
+ "message": "Elementos del documento",
+ "description": "The label for category Document Elements in sidebar docs"
+ },
+ "sidebar.docs.category.Document Elements.link.generated-index.title": {
+ "message": "Elementos del documento",
+ "description": "The generated-index page title for category Document Elements in sidebar docs"
+ },
+ "sidebar.docs.category.Import and Export": {
+ "message": "Import-Export",
+ "description": "The label for category Import and Export in sidebar docs"
+ },
+ "sidebar.docs.category.Import and Export.link.generated-index.title": {
+ "message": "Import-Export",
+ "description": "The generated-index page title for category Import and Export in sidebar docs"
+ },
+ "sidebar.docs.category.4D AIKit": {
+ "message": "4D AIKit",
+ "description": "The label for category 4D AIKit in sidebar docs"
+ },
+ "sidebar.docs.category.4D AIKit.link.generated-index.title": {
+ "message": "4D AIKit",
+ "description": "The generated-index page title for category 4D AIKit in sidebar docs"
+ },
+ "sidebar.docs.link.4D Qodly Pro": {
+ "message": "4D Qodly Pro",
+ "description": "The label for link 4D Qodly Pro in sidebar docs, linking to https://developer.qodly.com/docs"
+ },
+ "sidebar.docs.link.4D NetKit": {
+ "message": "4D NetKit",
+ "description": "The label for link 4D NetKit in sidebar docs, linking to https://developer.4d.com/4D-NetKit"
+ },
+ "sidebar.docs.link.4D Progress": {
+ "message": "4D Progress",
+ "description": "The label for link 4D Progress in sidebar docs, linking to https://github.com/4d/4D-Progress/blob/main/README.md"
+ },
+ "sidebar.docs.link.4D SVG": {
+ "message": "4D SVG",
+ "description": "The label for link 4D SVG in sidebar docs, linking to https://developer.4d.com/4D-SVG"
+ },
+ "sidebar.docs.link.4D Widgets": {
+ "message": "4D Widgets",
+ "description": "The label for link 4D Widgets in sidebar docs, linking to https://github.com/4d/4D-Widgets/blob/main/Readme.md"
+ },
+ "sidebar.docs.link.4D QPDF": {
+ "message": "4D QPDF",
+ "description": "The label for link 4D QPDF in sidebar docs, linking to https://github.com/4d/4D-QPDF?tab=readme-ov-file#readme"
+ },
+ "sidebar.docs.link.Go Mobile with 4D": {
+ "message": "Go Mobile with 4D",
+ "description": "The label for link Go Mobile with 4D in sidebar docs, linking to https://developer.4d.com/go-mobile/"
+ },
+ "sidebar.docs.link.4D Mobile App Server": {
+ "message": "4D Mobile App Server",
+ "description": "The label for link 4D Mobile App Server in sidebar docs, linking to https://github.com/4d/4D-Mobile-App-Server/blob/main/README.md"
+ },
+ "sidebar.docs.link.Build4D": {
+ "message": "Build4D",
+ "description": "The label for link Build4D in sidebar docs, linking to https://github.com/4d/Build4D"
+ },
+ "sidebar.docs.doc.Client/Server": {
+ "message": "Cliente/Servidor",
+ "description": "The label for the doc item Client/Server in sidebar docs, linking to the doc Desktop/clientServer"
+ },
+ "sidebar.docs.doc.Labels": {
+ "message": "Etiquetas",
+ "description": "The label for the doc item Labels in sidebar docs, linking to the doc Desktop/labels"
+ },
+ "sidebar.docs.doc.Command Line Interface": {
+ "message": "Interfaz de línea de\n comando",
+ "description": "The label for the doc item Command Line Interface in sidebar docs, linking to the doc Admin/cli"
+ },
+ "sidebar.docs.doc.TLS Protocol": {
+ "message": "Protocolo TLS",
+ "description": "The label for the doc item TLS Protocol in sidebar docs, linking to the doc Admin/tls"
+ },
+ "sidebar.docs.doc.Licenses": {
+ "message": "Licencias",
+ "description": "The label for the doc item Licenses in sidebar docs, linking to the doc Admin/licenses"
+ },
+ "sidebar.docs.doc.Log Files": {
+ "message": "Archivos de registro",
+ "description": "The label for the doc item Log Files in sidebar docs, linking to the doc Debugging/debugLogFiles"
+ },
+ "sidebar.docs.doc.Data Collection": {
+ "message": "Recopilación de datos",
+ "description": "The label for the doc item Data Collection in sidebar docs, linking to the doc Admin/data-collect"
+ }
+}
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/BlobClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/BlobClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/BlobClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/BlobClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ClassClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/ClassClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ClassClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/ClassClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/CollectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/CollectionClass.md
new file mode 100644
index 00000000000000..de25918e361018
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/CollectionClass.md
@@ -0,0 +1,3336 @@
+---
+id: CollectionClass
+title: Collection
+---
+
+La clase Collection gestiona variables de tipo [Collection](Concepts/dt_collection.md).
+
+Una colección es inicializada con los comandos [`New collection`](../commands/new-collection.md) o [`New shared collection`](../commands/new-shared-collection.md).
+
+### Ejemplo
+
+```4d
+Notas
+```
+
+### Resumen
+
+| |
+| ------------------------------------------------------------------------------------------------------------------------------ |
+| [](#at) |
+| [](#average) |
+| [](#clear) |
+| [](#combine) |
+| [](#concat) |
+| [](#copy) |
+| [](#count) |
+| [](#countvalues) |
+| [](#distinct) |
+| [](#equal) |
+| [](#every) |
+| [](#extract) |
+| [](#fill) |
+| [](#filter) |
+| [](#find) |
+| [](#find) |
+| [](#first) |
+| [](#flat) |
+| [](#flatmap) |
+| [](#includes) |
+| [](#indexof) |
+| [](#indices) |
+| [](#insert) |
+| [](#join) |
+| [](#last) |
+| [](#lastindexof) |
+| [](#length) |
+| [](#map) |
+| [](#max) |
+| [](#min) |
+| [](#multisort) |
+| [](#orderby) |
+| [](#orderbymethod) |
+| [](#pop) |
+| [](#push) |
+| [](#query) |
+| [](#reduce) |
+| [](#reduceright) |
+| [](#remove) |
+| [](#resize) |
+| [](#reverse) |
+| [](#shift) |
+| [](#slice) |
+| [](#some) |
+| [](#sort) |
+| [](#sum) |
+| [](#unshift) |
+
+
+
+## .at()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.at**( *index* : Integer ) : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------------ |
+| index | Integer | -> | Índice del elemento a devolver |
+| Resultado | any | <- | El elemento en ese índice |
+
+
+
+#### Descripción
+
+La función `.at()` devuelve el elemento en la posición *index*, permitiendo enteros positivos y negativos.
+
+> Esta función no modifica la colección original.
+
+Los números enteros negativos cuentan hacia atrás desde el último elemento de la colección.
+
+Igual a
+
+#### Ejemplo
+
+```4d
+Lanzamiento
+```
+
+
+
+
+
+## .average()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.average**( {*propertyPath* : Text } ) : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | --------------- | :-------------------------: | ---------------------------------------------------------------- |
+| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
+| Resultado | Real, Undefined | <- | donde: |
+
+
+
+#### Descripción
+
+La función `.average()` devuelve la media aritmética (promedio) de los valores definidos en la instancia de la colección.
+
+Para el cálculo sólo se tienen en cuenta los elementos numéricos (se ignoran otros tipos de elementos).
+
+Si la colección contiene objetos, pasa el parámetro *propertyPath* para indicar la propiedad del objeto a tener en cuenta.
+
+`.average()` devuelve `undefined` si:
+
+- la colección está vacía,
+- la colección no contiene elementos numéricos,
+- *propertyPath* no se encuentra en la colección.
+
+#### Ejemplo 1
+
+```4d
+ var $col : Collection
+ $col:=New collection(10;20;"Monday";True;6)
+ $vAvg:=$col.average() //12
+```
+
+#### Ejemplo 2
+
+```4d
+ var $col : Collection
+ $col:=New collection
+ $col.push(New object("name";"Smith";"salary";10000))
+ $col.push(New object("name";"Wesson";"salary";50000))
+ $col.push(New object("name";"Gross";"salary";10500))
+ $vAvg:=$col.average("salary") //23500
+```
+
+
+
+
+
+## .clear()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.clear()** : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ------------------------------------------- |
+| Resultado | Collection | <- | Colección original sin elementos eliminados |
+
+
+
+#### Descripción
+
+La función `.clear()` elimina todos los elementos de la instancia de la colección y devuelve una colección vacía.
+
+> Esta función modifica la colección original.
+
+#### Ejemplo
+
+```4d
+var $col : Collection
+$col:=New collection(1;2;5)
+$col.clear()
+$vSize:=$col.length //$vSize=0
+```
+
+
+
+
+
+## .combine()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.combine**( *col2* : Collection {; *index* : Integer } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------ |
+| col2 | Collection | -> | Colección a combinar |
+| index | Integer | -> | Posición a la que se deben combinar los elementos de inserción en la colección (por defecto=length+1) |
+| Resultado | Collection | <- | Colección original sin elementos eliminados |
+
+
+
+#### Descripción
+
+La función `.combine()` inserta elementos *col2* al final o en la posición *index* especificada en la instancia de la colección y devuelve la colección modificada. A diferencia de la función `.insert()`, `.combine()` añade cada valor de *col2* en la colección original, y no como un único elemento de la colección.
+
+> Esta función modifica la colección original.
+
+Por defecto, los elementos *col2* se añaden al final de la colección original. Puede pasar en *index* la posición donde desea insertar los elementos *col2* en la colección.
+
+> **Atención**: recuerde que los elementos de la colección están numerados desde 0.
+
+- Si *index* es mayor que la longitud de la colección, el índice inicial real se definirá en la longitud de la colección.
+- Si *index* < 0, se recalcula como *index:=index+length* (se considera el desplazamiento desde el final de la colección).
+- En caso de incoherencia, se aplican las siguientes reglas:
+
+#### Ejemplo
+
+```4d
+var $c; $fruits : Collection
+$c:=New collection(1;2;3;4;5;6)
+$fruits:=New collection("Orange";"Banana";"Apple";"Grape")
+$c.combine($fruits;3) //[1,2,3,"Orange","Banana","Apple","Grape",4,5,6]
+```
+
+
+
+
+
+## .concat()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.concat**( *value* : any { *;...valueN* } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | -------------------------------------------------------------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------- |
+| value | Number, Text, Object, Collection, Date, Time, Boolean, Picture | -> | Valores a concatenar. Si *value* es una colección, todos sus elementos se añaden al final de la colección original. |
+| Resultado | Collection | <- | Colección original con valores rellenados |
+
+
+
+#### Descripción
+
+La función.`.concat()` devuelve una nueva colección que contiene los elementos de la colección original con todos los elementos del parámetro *value* añadidos al final.
+
+> Esta función no modifica la colección original.
+
+La colección devuelta contiene el elemento especificado por *startFrom* y todos los elementos subsiguientes hasta, pero sin incluir, el elemento especificado por *end*. Si sólo se especifica el parámetro *startFrom*, la colección devuelta contiene todos los elementos desde *startFrom* hasta el último elemento de la colección original.
+
+#### Ejemplo
+
+```4d
+var $c : Collection
+$c:=New collection(1;2;3;4;5)
+$fruits:=New collection("Orange";"Banana";"Apple";"Grape")
+$fruits.push(New object("Intruder";"Tomato"))
+$c2:=$c.concat($fruits) //[1,2,3,4,5,"Orange","Banana","Apple","Grape",{"Intruder":"Tomato"}]
+$c2:=$c.concat(6;7;8) //[1,2,3,4,5,6,7,8]
+```
+
+
+
+
+
+## .copy()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------------------------------- |
+| 18 R3 | Nueva opción *ck shared*. Nuevos parámetros *groupWith* |
+| v16 R6 | Añadidos |
+
+
+
+**.copy**() : Collection **.copy**( *option* : Integer ) : Collection **.copy**( *option* : Integer ; *groupWithCol* : Collection ) : Collection **.copy**( *option* : Integer ; *groupWithObj* : Object ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ---------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------- |
+| option | Integer | -> | `ck resolve pointers`: resolver punteros antes de copiar, `ck shared`: devolver una colección compartida |
+| groupWithCol | Collection | -> | Colección compartida que se agrupa con la colección resultante |
+| groupWithObj | Object | -> | Objeto compartido que se agrupa con la colección resultante |
+| Resultado | Collection | <- | Colección original ordenada |
+
+
+
+#### Descripción
+
+La función `.copy()` devuelve una copia profunda de la instancia de la colección. ***Deep copy*** significa que los objetos o colecciones dentro de la colección original se duplican y no comparten ninguna referencia con la colección devuelta.
+
+> Esta función no modifica la colección original.
+
+Lanzamiento
+
+| option | Descripción |
+| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ck resolve pointers` | Si la colección original contiene valores de tipo puntero, por defecto la copia también contiene los punteros. Si la colección original contiene valores de tipo puntero, por defecto la copia también contiene los punteros. En este caso, cada puntero presente en la colección se evalúa al copiar y se utiliza su valor desreferenciado. |
+| `ck shared` | Por defecto, `copy()` devuelve una colección Clásica (no compartida), incluso si el comando se aplica a una colección compartida. Pasa la constante `ck shared` para crear una colección compartida. En este caso, puede utilizar el parámetro *groupWith* para asociar la colección compartida con otra colección u objeto (ver más adelante). |
+
+Ejemplo 2
+
+:::note
+
+Los objetos Datastore, dataclass y entity no son copiables. Si se llama a `.copy()` con ellos, se devuelven valores `Null`.
+
+:::
+
+#### Ejemplo 1
+
+Queremos copiar la colección regular (no compartida) *$lastnames* en el objeto compartido *$sharedObject*. Para ello, debemos crear una copia compartida de la colección (*$sharedLastnames*).
+
+```4d
+var $sharedObject : Object
+var $lastnames;$sharedLastnames : Collection
+var $text : Text
+
+$sharedObject:=New shared object
+
+$text:=Document to text(Get 4D folder(Current resources folder)+"lastnames.txt")
+$lastnames:=JSON Parse($text) //$lastnames es una colección estándar
+
+$sharedLastnames:=$lastnames.copy(ck shared) //$sharedLastnames es una colección compartida
+
+//Now we can put $sharedLastnames into $sharedObject
+Use($sharedObject)
+ $sharedObject.lastnames:=$sharedLastnames
+End use
+```
+
+#### Ejemplo 2
+
+Queremos combinar *$sharedColl1* y *$sharedColl2*. Dado que pertenecen a diferentes grupos compartidos, una combinación directa daría lugar a un error. Dado que pertenecen a diferentes grupos compartidos, una combinación directa daría lugar a un error.
+
+```4d
+var $sharedColl1;$sharedColl2;$copyColl : Collection
+
+$sharedColl1:=New shared collection(New shared object("lastname";"Smith"))
+$sharedColl2:=New shared collection(New shared object("lastname";"Brown"))
+
+//$copyColl pertenece al mismo grupo compartido que $sharedColl2
+ $copyColl:=$sharedColl1.copy(ck shared;$sharedColl2)
+ Use($sharedColl2)
+ $sharedColl2.combine($copyColl)
+ End use
+```
+
+#### Ejemplo 3
+
+Tenemos una distribución estándar (*$lastnames*) y queremos ponerla en el **Storage** de la aplicación. Para ello, debemos crear previamente una copia compartida (*$sharedLastnames*).
+
+```4d
+var $lastnames;$sharedLastnames : Collection
+var $text : Text
+
+$text:=Document to text(Get 4D folder(Current resources folder)+"lastnames.txt")
+$lastnames:=JSON Parse($text) //$lastnames es una colección clásica
+
+$sharedLastnames:=$lastnames.copy(ck shared) // copia compartida
+
+Use(Storage)
+ Storage.lastnames:=$sharedLastnames
+End use
+```
+
+#### Ejemplo 4
+
+Primer elemento de la colección
+
+```4d
+Mayor que
+```
+
+
+
+
+
+## .count()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.count**( { *propertyPath* : Text } ) : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ---- | :-------------------------: | ---------------------------------------------------------------- |
+| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
+| Resultado | Real | <- | Primer elemento de la colección |
+
+
+
+#### Descripción
+
+La función `.count()` devuelve el número de elementos no nulos en la colección.
+
+Si la colección contiene objetos, puede pasar el parámetro *propertyPath*. En este caso, sólo se tienen en cuenta los elementos que contienen el *propertyPath*.
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ var $count1;$count2 : Real
+ $col:=New collection(20;30;Null;40)
+ $col.push(New object("name";"Smith";"salary";10000))
+ $col.push(New object("name";"Wesson";"salary";50000))
+ $col.push(New object("name";"Gross";"salary";10500))
+ $col.push(New object("lastName";"Henry";"salary";12000))
+ $count1:=$col.count() //$count1=7
+ $count2:=$col.count("name") //$count2=3
+
+```
+
+
+
+
+
+## .countValues()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.countValues**( *value* : any {; *propertyPath* : Text } ) : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ----------------------------------------------- | :-------------------------: | ---------------------------------------------------------------- |
+| value | Text, Number, Boolean, Date, Object, Collection | -> | Valor a contar |
+| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
+| Resultado | Real | <- | Valor a contar |
+
+
+
+#### Descripción
+
+La función `.countValues()` devuelve el número de veces que se encuentra el valor en la colección.
+
+Puede pasar en *value*:
+
+- un valor escalar (texto, número, booleano, fecha),
+- una referencia de objeto o de colección.
+
+Para encontrar un elemento, el tipo de *value* debe ser equivalente al tipo del elemento; el método utiliza el operador de igualdad.
+
+El parámetro opcional *propertyPath* permite contar valores dentro de una colección de objetos: pase en *propertyPath* la ruta de la propiedad cuyos valores quiere contar.
+
+> Esta función no modifica la colección original.
+
+#### Ejemplo 1
+
+```4d
+ var $col : Collection
+ var $vCount : Integer
+ $col:=New collection(1;2;5;5;5;3;6;4)
+ $vCount:=$col.countValues(5) // $vCount=3
+```
+
+#### Ejemplo 2
+
+```4d
+ var $col : Collection
+ var $vCount : Integer
+ $col:=New collection
+ $col.push(New object("name";"Smith";"age";5))
+ $col.push(New object("name";"Wesson";"age";2))
+ $col.push(New object("name";"Jones";"age";3))
+ $col.push(New object("name";"Henry";"age";4))
+ $col.push(New object("name";"Gross";"age";5))
+ $vCount:=$col.countValues(5;"age") //$vCount=2
+```
+
+#### Ejemplo 3
+
+```4d
+ var $numbers; $letters : Collection
+ var $vCount : Integer
+
+ $letters:=New collection("a";"b";"c")
+ $numbers:=New collection(1;2;$letters;3;4;5)
+
+ $vCount:=$numbers.countValues($letters) //$vCount=1
+```
+
+
+
+
+
+## .distinct()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ---------------------------- |
+| 20 | Soporte de `ck count values` |
+| v16 R6 | Añadidos |
+
+
+
+**.distinct**( {*options* : Integer} ) : Collection **.distinct**( *propertyPath* : Text {; *options* : Integer } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ---------- | :-------------------------: | ------------------------------------------------------- |
+| propertyPath | Text | -> | Ruta del atributo cuyos valores distintos desea obtener |
+| options | Integer | -> | `ck diacritical`, `ck count values` |
+| Resultado | Collection | <- | Lanzamiento |
+
+
+
+#### Descripción
+
+La función `.distinct()` devuelve una colección que contiene sólo valores distintos (diferentes) de la colección original.
+
+> Esta función no modifica la colección original.
+
+La colección devuelta se clasifica automáticamente. Los valores **Null** no son devueltos.
+
+Si la colección contiene objetos, puede pasar el parámetro *propertyPath* para indicar la propiedad del objeto cuyos valores distintos desea obtener.
+
+Ejemplos
+
+| Constante | Valor | Comentario |
+| ----------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ck diacritical` | 8 | La evaluación distingue entre mayúsculas y minúsculas y diferencia los caracteres acentuados. Por defecto si se omite, se realiza una evaluación no diacrítica |
+| `ck count values` | 32 | Devuelve el conteo de elementos para cada valor distinto. Cuando se pasa esta opción, `.distinct()` devuelve una colección de objetos que contienen un par de atributos `{"value":*value*; "count":*count*}`. |
+
+#### Ejemplos
+
+```4d
+ var $c; $c2; $c3 : Collection
+ $c:=New collection
+ $c.push("a";"b";"c";"A";"B";"c";"b";"b")
+ $c.push(New object("size";1))
+ $c.push(New object("size";3))
+ $c.push(New object("size";1))
+ $c2:=$c.distinct() //$c2=["a","b","c",{"size":1},{"size":3},{"size":1}]
+ $c2:=$c.distinct(ck diacritical) //$c2=["a","A","b","B","c",{"size":1},{"size":3},{"size":1}]
+ $c2:=$c.distinct("size") //$c2=[1,3]
+ $c3:=$c.distinct("size";ck count values) //$c3=[{value:1,count:2},{value:3,count:1}]
+
+```
+
+
+
+
+
+## .equal()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.equal**( *collection2* : Collection {; *option* : Integer } ) : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------- | ---------- | :-------------------------: | -------------------------------------------------------------------------------------------------- |
+| collection2 | Collection | -> | Colección a comparar |
+| option | Integer | -> | `ck diacritical`: evaluación diacrítica ("A" # "a" por ejemplo) |
+| Resultado | Boolean | <- | Descripción |
+
+
+
+#### Descripción
+
+La función `.equal()` compara recursivamente el contenido de la colección y *collection2* (comparación profunda/deep comparison) y devuelve **true** si son idénticas.
+
+:::note Notas
+
+- La función `.equal()` solo comprueba la igualdad para los elementos de tipo cadena, booleano, número y null en las colecciones. No verifica la igualdad para objetos nativos.
+- Constantes **null**: utilizando la palabra clave "null" se encontrarán las propiedades **null** y **undefined**.
+
+:::
+
+Por defecto, se realiza una evaluación no diacrítica. La evaluación distingue entre mayúsculas y minúsculas y diferencia los caracteres acentuados.
+
+:::tip
+
+Una comparación recursiva de colecciones puede llevar mucho tiempo si la colección es grande y contiene numerosos niveles. Si sólo desea comparar dos referencias de colección, puede considerar utilizar el operador de comparación [`=` para las referencias de colección](../Concepts/dt_collection.md#collection-operators).
+
+:::
+
+#### Ejemplo
+
+```4d
+ var $c; $c2 : Collection
+ var $b : Boolean
+
+ $c:=New collection(New object("a";1;"b";"orange");2;3)
+ $c2:=New collection(New object("a";1;"b";"orange");2;3;4)
+ $b:=$c.equal($c2) // false
+
+ $c:=New collection(New object("1";"a";"b";"orange");2;3)
+ $c2:=New collection(New object("a";1;"b";"orange");2;3)
+ $b:=$c.equal($c2) // false
+
+ $c:=New collection(New object("a";1;"b";"orange");2;3)
+ $c2:=New collection(New object("a";1;"b";"ORange");2;3)
+ $b:=$c.equal($c2) // true
+
+ $c:=New collection(New object("a";1;"b";"orange");2;3)
+ $c2:=New collection(New object("a";1;"b";"ORange");2;3)
+ $b:=$c.equal($c2;ck diacritical) //false
+```
+
+
+
+
+
+## .every()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.every**( { *startFrom* : Integer ; } *formula* : 4D.Function { ;*...param* : any } ) : Boolean **.every**( { *startFrom* : Integer ; } *methodName* : Text { ;*...param* : any } ) : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
+| startFrom | Integer | -> | Índice para iniciar la prueba en |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
+| Resultado | Boolean | <- | Lanzamiento |
+
+
+
+#### Descripción
+
+La función `.every()` devuelve **true** si todos los elementos de la colección han superado con éxito una prueba implementada en el objeto *formula* o el método *methodName*.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a evaluar
+- en *$2*: param
+- en *$N...*: paramN...
+
+Puede definir los siguientes parámetros:
+
+- (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario.
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+En todos los casos, en el momento en que la función.every() encuentra el primer elemento de la colección evaluado como false, deja de llamar a la retrollamada y devuelve false\*\*.
+
+Por defecto, `.every()` evalúa toda la colección. Opcionalmente, se puede pasar en *startFrom* el índice del elemento desde el que iniciar la prueba.
+
+- Si *startFrom* >= la longitud de la colección, se devuelve **false**, lo que significa que no se prueba la colección.
+- Diferente de Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
+- Si *startFrom* = 0, se busca en toda la colección (por defecto).
+
+#### Ejemplo 1
+
+```4d
+var $c : Collection
+var $b : Boolean
+var $f : 4D.Function
+
+$f:=Formula($1.value>0)
+$c:=New collection
+$c.push(5;3;1;4;6;2)
+$b:=$c.every($f) //devuelve true
+$c.push(-1)
+$b:=$c.every($f) //devuelve false
+```
+
+#### Ejemplo 2
+
+Este ejemplo comprueba que todos los elementos de una colección son de tipo real:
+
+```4d
+var $c : Collection
+var $b : Boolean
+var $f : 4D.Function
+
+$f:=Formula(Value type($1.value)=$2
+$c:=New collection
+$c.push(5;3;1;4;6;2)
+$b:=$c.every($f;Is real) //$b=true
+$c:=$c.push(New object("name";"Cleveland";"zc";35049))
+$c:=$c.push(New object("name";"Blountsville";"zc";35031))
+$b:=$c.every($f;Is real) //$b=false
+```
+
+
+
+
+
+## .extract()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.extract**( *propertyPath* : Text { ; *option* : Integer } ) : Collection **.extract**( *propertyPath* : Text ; *targetPath* : Text { ;...*propertyPathOrTargetPathN* : Text } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ---------- | :-------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| propertyPath | Text | -> | Ruta de la propiedad del objeto cuyos valores deben ser extraídos a la nueva colección |
+| targetpath | Text | -> | Ruta de la propiedad de destino o nombre de la propiedad |
+| option | Integer | -> | `ck keep null`: incluye la propiedad null en la colección devuelta (se ignora por defecto). Parámetro ignorado si se pasa *targetPath*. |
+| Resultado | Collection | <- | Nueva colección que contiene los valores extraídos |
+
+
+
+#### Descripción
+
+La función `.extract()` crea y devuelve una nueva colección que contiene valores *propertyPath* extraídos de la colección original de objetos.
+
+> Esta función no modifica la colección original.
+
+El contenido de la colección devuelta depende del parámetro *targetPath*:
+
+- Si se omite el parámetro *targetPath*, `.extract()` llena la nueva colección con los valores *propertyPath* de la colección original.
+
+ Por defecto, los elementos cuya *propertyPath* es null o indefinida se ignoran en la colección resultante. Puede pasar la constante `ck keep null` en el parámetro *option* para incluir estos valores como elementos null en la colección devuelta.
+
+- Si se pasan uno o más parámetros *targetPath* (correspondientes a uno o más parámetros *propertyPath*), `.extract()` llena la nueva colección con las propiedades *propertyPath* y cada elemento de la nueva colección es un objeto con propiedades *targetPath* llenadas con las propiedades *propertyPath* coincidentes. Se conservan los valores null (el parámetro *opción* se ignora con esta sintaxis).
+
+#### Ejemplo 1
+
+```4d
+var $c : Collection
+$c:=New collection
+$c.push(New object("name";"Cleveland"))
+$c.push(New object("zip";5321))
+$c.push(New object("name";"Blountsville"))
+$c.push(42)
+$c2:=$c.extract("name") // $c2=[Cleveland,Blountsville]
+$c2:=$c.extract("name";ck keep null) //$c2=[Cleveland,null,Blountsville,null]
+```
+
+#### Ejemplo 2
+
+```4d
+var $c : Collection
+$c:=New collection
+$c.push(New object("zc";35060))
+$c.push(New object("name";Null;"zc";35049))
+$c.push(New object("name";"Cleveland";"zc";35049))
+$c.push(New object("name";"Blountsville";"zc";35031))
+$c.push(New object("name";"Adger";"zc";35006))
+$c.push(New object("name";"Clanton";"zc";35046))
+$c.push(New object("name";"Clanton";"zc";35045))
+$c2:=$c.extract("name";"City") //$c2=[{City:null},{City:Cleveland},{City:Blountsville},{City:Adger},{City:Clanton},{City:Clanton}]
+$c2:=$c.extract("name";"City";"zc";"Zip") //$c2=[{Zip:35060},{City:null,Zip:35049},{City:Cleveland,Zip:35049},{City:Blountsville,Zip:35031},{City:Adger,Zip:35006},{City:Clanton,Zip:35046},{City:Clanton,Zip:35045}]
+```
+
+
+
+
+
+## .fill()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.fill**( *value* : any ) : Collection **.fill**( *value* : any ; *startFrom* : Integer { ; *end* : Integer } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ----------------------------------------------- | :-------------------------: | ---------------------------------------------- |
+| value | number, Text, Collection, Object, Date, Boolean | -> | Valor a asignar |
+| startFrom | Integer | -> | Índice de inicio (incluido) |
+| end | Integer | -> | Índice final (no incluido) |
+| Resultado | collection | <- | Colección original con valores rellenados |
+
+
+
+#### Descripción
+
+La función.fill() llena la colección con el value especificado, opcionalmente desde el índice startFrom hasta el índice end, y devuelve la colección resultante.
+
+> Esta función modifica la colección original.
+
+- Si se omite el parámetro *startFrom*, *value* se aplica a todos los elementos de la colección (*startFrom*=0).
+- Si se pasa el parámetro *startFrom* y se omite *end*, *value* se aplica a los elementos de la colección a partir de *startFrom* hasta el último elemento de la colección (*end*=length).
+- Si se pasan tanto el parámetro *startFrom* como *end*, *value* se aplica a los elementos de la colección empezando en *startFrom* hasta el elemento *end*.
+
+En caso de incoherencia, se aplican las siguientes reglas:
+
+- Si *startFrom* < 0, se recalcula como *startFrom:=startFrom+length* (se considera el desplazamiento desde el final de la colección). Si el valor calculado es negativo, *startFrom* toma el valor 0.
+- Si *end* < 0 , se recalcula como *end:=end+length*.
+- Si *end* < *startFrom* (valores pasados o calculados), el método no hace nada.
+
+#### Ejemplo
+
+```4d
+ var $c : Collection
+ $c:=New collection(1;2;3;"Lemon";Null;"";4;5)
+ $c.fill("2") // $c:=[2,2,2,2,2,2,2,2]
+ $c.fill("Hello";5) // $c=[2,2,2,2,2,Hello,Hello,Hello]
+ $c.fill(0;1;5) // $c=[2,0,0,0,0,Hello,Hello,Hello]
+ $c.fill("world";1;-5) //-5+8=3 -> $c=[2,"world","world",0,0,Hello,Hello,Hello]
+```
+
+
+
+
+
+## .filter()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.filter**( *formula* : 4D.Function { ; *...param* : any } ) : Collection **.filter**( *methodName* : Text { ; *...param* : any } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------------------------- |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
+| Resultado | Collection | <- | Nueva colección que contiene elementos filtrados (copia superficial) |
+
+
+
+#### Descripción
+
+La función `.filter()` devuelve una nueva colección que contiene todos los elementos de la colección original para los que el resultado de *formula* o *methodName* es **true**. Esta función devuelve una ***shallow copy***, lo que significa que los objetos o colecciones de ambas colecciones comparten la misma referencia. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para filtrar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+Se llama a la retrollamada con los parámetros pasados en *param* (opcional) y un objeto en primer parámetro (*$1*). La retrollamada puede realizar cualquier prueba, con o sin el parámetro(s) y debe devolver **true** para cada elemento que cumpla la condición y por lo tanto, debe añadirse a la nueva colección.
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a evaluar
+- en *$2*: param
+- en *$N...*: paramN...
+
+Puede definir los siguientes parámetros:
+
+- *$1.result* (booleano): **true** si el valor del elemento coincide con la condición de filtro y debe conservarse, **false** en caso contrario.
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+:::note
+
+Cuando se utiliza *methodName* como callback, y si el método no devuelve ningún valor, `.filter()` buscará la propiedad *$1.result* que debe definir como *true* para cada elemento que cumpla la condición.
+
+:::
+
+#### Ejemplo 1
+
+Desea obtener la colección de elementos de texto cuya longitud es inferior a 6:
+
+```4d
+var $col;$colNew : Collection
+$col:=New collection("hello";"world";"red horse";66;"tim";"san jose";"miami")
+$colNew:=$col.filter(Formula((Value type($1.value)=Is text) && (Length($1.value)<$2)); 6)
+ //$colNew=["hello","world","tim","miami"]
+```
+
+#### Ejemplo 2
+
+Quiere filtrar los elementos según su tipo de valor:
+
+```4d
+ var $c;$c2;$c3 : Collection
+ var $f : 4D.Function
+
+ $f:=Formula(OB Get type($1;"value")=$2)
+ $c:=New collection(5;3;1;4;6;2)
+ $c.push(New object("name";"Cleveland";"zc";35049))
+ $c.push(New object("name";"Blountsville";"zc";35031))
+ $c2:=$c.filter($f;Is real) // $c2=[5,3,1,4,6,2]
+ $c3:=$c.filter($f;Is object)
+ // $c3=[{name:Cleveland,zc:35049},{name:Blountsville,zc:35031}]
+```
+
+
+
+
+
+## .find()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.find**( { *startFrom* : Integer ; } *formula* : 4D.Function { ; *...param* : any } ) : any **.find**( { *startFrom* : Integer ; } *methodName* : Text { ; *...param* : any } ) : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
+| Resultado | any | <- | La función `.multiSort()` permite realizar una ordenación sincronizada multinivel sobre un conjunto de colecciones. |
+
+
+
+#### Descripción
+
+La función `.find()` devuelve el primer valor de la colección para el que el resultado de *formula* o de *methodName*, aplicado a cada elemento, devuelve **true**.
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a evaluar
+- en *$2*: param
+- en *$N...*: paramN...
+
+Puede definir los siguientes parámetros:
+
+- (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario.
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+Por defecto, `.find()` busca en toda la colección. Opcionalmente, se puede pasar en *startFrom* el índice del elemento desde el que iniciar la búsqueda.
+
+- Si *startFrom* >= la longitud de la colección, se devuelve -1, lo que significa que la colección no se busca.
+- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
+ **Nota**: incluso si *startFrom* es negativo, la colección se sigue buscando de izquierda a derecha.
+- Si *startFrom* = 0, se busca en toda la colección (por defecto).
+
+#### Ejemplo 1
+
+Quiere obtener el primer elemento de texto con una longitud menor que 5:
+
+```4d
+var $col : Collection
+$col:=New collection("hello";"world";4;"red horse";"tim";"san jose")
+$value:=$col.find(Formula((Value type($1.value)=Is text) && (Length($1.value)<$2)); 5) //$value="tim"
+```
+
+#### Ejemplo 2
+
+Quiere encontrar el nombre de una ciudad dentro de una colección:
+
+```4d
+var $c : Collection
+var $c2 : Object
+$c:=New collection
+$c.push(New object("name"; "Cleveland"; "zc"; 35049))
+$c.push(New object("name"; "Blountsville"; "zc"; 35031))
+$c.push(New object("name"; "Adger"; "zc"; 35006))
+$c.push(New object("name"; "Clanton"; "zc"; 35046))
+$c.push(New object("name"; "Clanton"; "zc"; 35045))
+
+$c2:=$c.find(Formula($1.value.name=$2); "Clanton") //$c2={name:Clanton,zc:35046}
+
+```
+
+
+
+
+
+## .findIndex()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.findIndex**( { *startFrom* : Integer ; } *formula* : 4D.Function { ; *...param* : any } ) : Integer **.findIndex**( { *startFrom* : Integer ; } *methodName* : Text { ; *...param* : any } ) : Integer
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
+| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
+| Resultado | Integer | <- | Índice del primer valor encontrado, o -1 si no se encuentra |
+
+
+
+#### Descripción
+
+La función `.findIndex()` devuelve el índice, en la colección, del primer valor para el que *formula* o *methodName*, aplicados sobre cada elemento, devuelven **true**.
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- *methodName*, el nombre de un método proyecto (texto).
+
+La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a evaluar
+- en *$2*: param
+- en *$N...*: paramN...
+
+Puede definir los siguientes parámetros:
+
+- (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario.
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+Por defecto, `.findIndex()` busca en toda la colección. Opcionalmente, se puede pasar en *startFrom* el índice del elemento desde el que iniciar la búsqueda.
+
+- Si *startFrom* >= la longitud de la colección, se devuelve -1, lo que significa que la colección no se busca.
+- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
+ **Nota**: incluso si *startFrom* es negativo, la colección se sigue buscando de izquierda a derecha.
+- Si *startFrom* = 0, se busca en toda la colección (por defecto).
+
+#### Ejemplo
+
+Quiere encontrar la posición del primer nombre de ciudad dentro de una colección:
+
+```4d
+var $c : Collection
+var $val2;$val3 : Integer
+$c:=New collection
+$c.push(New object("name";"Cleveland";"zc";35049))
+$c.push(New object("name";"Blountsville";"zc";35031))
+$c.push(New object("name";"Adger";"zc";35006))
+$c.push(New object("name";"Clanton";"zc";35046))
+$c.push(New object("name";"Clanton";"zc";35045))
+$val2:=$c.findIndex(Formula($1.value.name=$2);"Clanton") // $val2=3
+$val3:=$c.findIndex($val2+1;Formula($1.value.name=$2);"Clanton") //$val3=4
+```
+
+
+
+
+
+## .first()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.first**() : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-------------------------: | ------------------------------- |
+| Resultado | any | <- | Primer elemento de la colección |
+
+
+
+#### Descripción
+
+La función `.first()` devuelve el primer elemento de la colección.
+
+> Esta función no modifica la colección original.
+
+La función devuelve Undefined si la colección está vacía.
+
+#### Ejemplo
+
+```4d
+var $col; $emptyCol : Collection
+var $first : Variante
+$col:=New collection(10; 20; 30; "hello"; 50)
+$first:=$col.first() // 10
+
+$emptyCol:=New collection() //vacío
+// $first:=$emptyCol[0] //daría error
+$first:=$emptyCol.first() // devuelve Undefined
+```
+
+
+
+
+
+## .flat()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.flat**( { *depth* : Integer } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------- |
+| depth | Integer | -> | A qué profundidad debe aplanarse una estructura de colección anidada. Por defecto=1 |
+| Resultado | Collection | <- | Colección aplanada |
+
+
+
+#### Descripción
+
+La función `.flat()` crea una nueva colección con todos los elementos de la subcolección concatenados recursivamente hasta la *depth* especificada.
+
+Por defecto, si se omite el parámetro *depth*, sólo se aplanará el primer nivel de la estructura de la colección anidada.
+
+> Esta función no modifica la colección original.
+
+#### Ejemplo
+
+```4d
+$col:=New collection(1; 2; New collection(3; 4))
+$col.flat()
+// [1, 2, 3, 4]
+
+$col:=New collection(1; 2; New collection(3; 4; New collection(5; 6)))
+$col.flat()
+// [1, 2, 3, 4, [5, 6]]
+
+$col:=New collection(1; 2; New collection(3; 4; New collection(5; 6)))
+$col.flat(2)
+// [1, 2, 3, 4, 5, 6]
+
+$col:=New collection(1; 2; New collection(3; 4; 5; 6; New collection(7; 8; New collection(9; 10))))
+$col.flat(MAXLONG)
+// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+```
+
+
+
+
+
+## .flatMap()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.flatMap**( *formula* : 4D.Function { ; *...param* : any } ) : Collection **.flatMap**( *methodName* : Text { ; *...param* : any } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
+| Resultado | Collection | <- | Comentario |
+
+
+
+#### Descripción
+
+La función `.flatMap()` crea una nueva colección basada en el resultado de la llamada a la función *formula* 4D o al método *methodName* sobre cada elemento de la colección original y aplanada por una profundidad de 1. Opcionalmente, puede pasar parámetros a *formula* o *methodName* utilizando los parámetros *param*.
+
+Esta función es idéntica a una llamada a [`map()`](#map) seguida de una llamada a [`flat()`](#flat) de profundidad 1.
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+La retrollamada se llama con los parámetros pasados en *param* (opcional). The callback is called with the parameter(s) passed in param (optional). Recibe un `Object` en el primer parámetro ($1).
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a evaluar
+- en *$2*: param
+- en *$N...*: paramN...
+
+Puede definir los siguientes parámetros:
+
+- (obligatorio si ha utilizado un método) *$1.result* (cualquier tipo): nuevo valor transformado para añadir a la colección resultante
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+#### Ejemplo 1
+
+```4d
+var $col ; $result : Collection
+$col:=New collection(1; 2; 3; 4)
+
+$result:=$col.map(Formula(New collection($1.value*2)))
+ // [[2],[4],[6],[8]]
+
+$result:=$col.flatMap(Formula(New collection($1.value*2)))
+// [2,4,6,8]
+```
+
+#### Ejemplo 2
+
+```
+var $col; $result : Collection
+$col:=New collection("Hello how"; ""; "are you ?")
+
+$result:=$col.map(Formula(Split string($1.value; " ")))
+// [["Hello", "how"], [], ["are", "you", "?"]]
+
+$result:=$col.flatMap(Formula(Split string($1.value; " ")))
+// ["Hello", "how", "are", "you", "?"]
+```
+
+#### Ejemplo 3
+
+Desea calcular el porcentaje de cada valor de la colección con respecto al total:
+
+```4d
+var $c; $c2 : Collection
+var $f : 4D.Function
+$c:=New collection(1; 4; 9; 10; 20)
+$f:=Formula(New collection($1.value;Round(($1.value/$2)*100; 2)))
+$c2:=$c.flatMap($f; $c.sum())
+ //$c2=[1, 2.27, 4, 9.09,9, 20.45,10, 22.73, 20, 45.45]
+```
+
+
+
+
+
+## .includes()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.includes**( *toSearch* : expression { ; *startFrom* : Integer } ) : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------- | :-------------------------: | ----------------------------------------------- |
+| toSearch | expresión | -> | Expresión a buscar en la colección |
+| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
+| Resultado | Boolean | <- | True si *toSearch* se encuentra en la colección |
+
+
+
+#### Descripción
+
+La función `.includes()` devuelve True si la expresión *toSearch* se encuentra entre los elementos de la colección, en caso contrario False.
+
+> Esta función no modifica la colección original.
+
+En *toSearch*, pase la expresión a encontrar en la colección. Puede pasar:
+
+- un valor escalar (texto, número, booleano, fecha),
+- el valor null,
+- una referencia de objeto o de colección.
+
+*toSearch* debe coincidir exactamente con el elemento a encontrar (se aplican las mismas reglas que para el operador de igualdad del tipo de datos).
+
+Diferente de Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
+
+- Si *startFrom* >= la longitud de la colección, se devuelve False, lo que significa que no se busca en la colección.
+- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*). **Atención**: recuerde que los elementos de la colección están numerados desde 0.
+- Si *startFrom* = 0, se busca en toda la colección (por defecto).
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ var $in : Boolean
+ var $obj : Object
+ $obj:=New object("value"; 10)
+ $col:=New collection(1;2;"Henry";5;3;"Albert";6;4;"Alan";5;$obj)
+ $in:=$col.includes(3) //True
+ $in:=$col.includes(5;6) //True
+ $in:=$col.includes("al@") //True
+ $in:=$col.includes("Hello") //False
+ $in:=$col.includes($obj) //True
+ $in:=$col.includes(New object("value"; 10)) //False
+```
+
+
+
+
+
+## .indexOf()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.indexOf**( *toSearch* : expression { ; *startFrom* : Integer } ) : Integer
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------- | :-------------------------: | ---------------------------------- |
+| toSearch | expresión | -> | Expresión a buscar en la colección |
+| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
+| Resultado | Integer | <- | Descripción |
+
+
+
+#### Descripción
+
+La función `.indexOf()` busca la expresión *toSearch* entre los elementos de la colección y devuelve el índice de la primera ocurrencia encontrada, o -1 si no se encontró.
+
+> Esta función no modifica la colección original.
+
+En *toSearch*, pase la expresión a encontrar en la colección. Puede pasar:
+
+- un valor escalar (texto, número, booleano, fecha),
+- el valor null,
+- una referencia de objeto o de colección.
+
+*toSearch* debe coincidir exactamente con el elemento a encontrar (se aplican las mismas reglas que para el operador de igualdad del tipo de datos).
+
+Diferente de Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
+
+- Si *startFrom* >= la longitud de la colección, se devuelve -1, lo que significa que la colección no se busca.
+- Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
+ **Nota**: incluso si *startFrom* es negativo, la colección se sigue buscando de izquierda a derecha.
+- Si *startFrom* = 0, se busca en toda la colección (por defecto).
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ var $i : Integer
+ $col:=New collection(1;2;"Henry";5;3;"Albert";6;4;"Alan";5)
+ $i:=$col.indexOf(3) //$i=4
+ $i:=$col.indexOf(5;5) //$i=9
+ $i:=$col.indexOf("al@") //$i=5
+ $i:=$col.indexOf("Hello") //$i=-1
+```
+
+
+
+
+
+## .indices()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.indices**( *queryString* : Text { ; *...value* : any } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------- |
+| queryString | Text | -> | Criterio de búsqueda |
+| value | any | -> | Valor(es) a comparar cuando se utiliza(n) marcador(es) de posición |
+| Resultado | Collection | <- | Índice(s) de elementos que coinciden con queryString en la colección |
+
+
+
+#### Descripción
+
+La función `.indices()` funciona exactamente igual que la función [`.query()`](#query) pero devuelve índices, en la colección original, de elementos de la colección de objetos que coinciden con las condiciones de búsqueda *queryString*, y no elementos en sí. Los índices se devuelven en orden ascendente.
+
+> Esta función no modifica la colección original.
+
+El parámetro *queryString* utiliza la siguiente sintaxis:
+
+```4d
+propertyPath comparator value {logicalOperator propertyPath comparator value}
+```
+
+Para una descripción detallada de los parámetros *queryString* y *value*, consulte la función `dataClass.query()`.
+
+#### Ejemplo
+
+```4d
+ var $c; $icol : Collection
+ $c:=New collection
+ $c.push(New object("name";"Cleveland";"zc";35049))
+ $c.push(New object("name";"Blountsville";"zc";35031))
+
+ $c.push(New object("name";"Adger";"zc";35006))
+ $c.push(New object("name";"Clanton";"zc";35046))
+ $c.push(New object("name";"Clanton";"zc";35045))
+ $icol:=$c.indices("name = :1";"Cleveland") // $icol=[0]
+ $icol:=$c.indices("zc > 35040") // $icol=[0,3,4]
+```
+
+
+
+
+
+## .insert()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.insert**( *index* : Integer ; *element* : any ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | -------------------------------------------------------- |
+| index | Integer | -> | Dónde insertar el elemento |
+| element | any | -> | Elemento a insertar en la colección |
+| Resultado | Collection | <- | Colección original que contiene los elementos insertados |
+
+
+
+#### Descripción
+
+La función `.insert()` inserta *element* en la posición *index* especificada en la instancia de la colección y devuelve la colección modificada.
+
+> Esta función modifica la colección original.
+
+En *index*, pase la posición donde quiere insertar el elemento en la colección.
+
+> **Atención**: recuerde que los elementos de la colección están numerados desde 0.
+
+- Si *index* la longitud de la colección, el índice inicial real se fijará en la longitud de la colección.
+- Si *index* <0, se recalcula como *index:=index+length* (se considera el desplazamiento desde el final de la colección).
+- Si el valor calculado es negativo, index toma el valor 0.
+
+Se puede insertar cualquier tipo de elemento aceptado por una colección, incluso otra colección.
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ $col:=New collection("a";"b";"c";"d") //$col=["a","b","c","d"]
+ $col.insert(2;"X") //$col=["a","b","X","c","d"]
+ $col.insert(-2;"Y") //$col=["a","b","X","Y","c","d"]
+ $col.insert(-10;"Hi") //$col=["Hi","a","b","X","Y","c","d"]
+```
+
+
+
+
+
+## .join()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.join**( *delimiter* : Text { ; *option* : Integer } ) : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | --------------------------------------------------------------------------------------------- |
+| delimiter | Text | -> | Separador a utilizar entre elementos |
+| option | Integer | -> | `ck ignore null or empty`: ignorar las cadenas nulas y vacías en el resultado |
+| Resultado | Text | <- | Cadena que contiene todos los elementos de la colección, separados por un delimitador |
+
+
+
+#### Descripción
+
+La función `.join()` convierte todos los elementos de la colección en cadenas y las concatena utilizando la cadena delimiter especificada como separador.La función devuelve la cadena resultante.
+
+> Esta función no modifica la colección original.
+
+Por defecto, los elementos nulos o vacíos de la colección se devuelven en la cadena resultante. Pase la constante `ck ignore null or empty` en el parámetro *option* si quiere eliminarlos de la cadena resultante.
+
+#### Ejemplo
+
+```4d
+ var $c : Collection
+ var $t1;$t2 : Text
+ $c:=New collection(1;2;3;"Paris";Null;"";4;5)
+ $t1:=$c.join("|") //1|2|3|Paris|null||4|5
+ $t2:=$c.join("|";ck ignore null or empty) //1|2|3|Paris|4|5
+```
+
+
+
+
+
+## .last()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.last**() : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-------------------------: | ------------------------------- |
+| Resultado | any | <- | Último elemento de la colección |
+
+
+
+#### Descripción
+
+La función `.last()` devuelve el último elemento de la colección.
+
+> Esta función no modifica la colección original.
+
+La función devuelve Undefined si la colección está vacía.
+
+#### Ejemplo
+
+```4d
+Propiedad
+```
+
+
+
+
+
+## .lastIndexOf()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.lastIndexOf**( *toSearch* : expression { ; *startFrom* : Integer } ) : Integer
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------- | :-------------------------: | --------------------------------------------------------------------------------- |
+| toSearch | expresión | -> | El elemento que se va a buscar dentro de la colección |
+| startFrom | Integer | -> | Índice para iniciar la búsqueda en |
+| Resultado | Integer | <- | Índice de la última ocurrencia de toSearch en la colección, -1 si no se encuentra |
+
+
+
+#### Descripción
+
+La función `.lastIndexOf()` busca la expresión *toSearch* entre los elementos de la colección y devuelve el índice de la última ocurrencia , o -1 si no se encontró.
+
+> Esta función no modifica la colección original.
+
+En *toSearch*, pase la expresión a encontrar en la colección. Puede pasar:
+
+- un valor escalar (texto, número, booleano, fecha),
+- el valor null,
+- una referencia de objeto o de colección.
+
+*toSearch* debe coincidir exactamente con el elemento a encontrar (se aplican las mismas reglas que para el operador de igualdad del tipo de datos).
+
+Opcionalmente, puede pasar el índice de la colección desde el cual iniciar una búsqueda en reversa en *startFrom*.
+
+- Si *startFrom* >= la longitud de la colección menos uno (coll.length-1), se busca en toda la colección (por defecto).
+- Si *startFrom* < 0, se recalcula como *startFrom:=startFrom+length* (se considera el desplazamiento desde el final de la colección). Si el valor calculado es negativo, se devuelve -1 (no se busca en la colección).
+ **Nota:** incluso si *startFrom* es negativo, la colección se sigue buscando de derecha a izquierda.
+- Si *startFrom* = 0, se devuelve -1 lo que significa que la colección no se busca.
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ var $pos1;$pos2;$pos3;$pos4;$pos5 : Integer
+ $col:=Split string("a,b,c,d,e,f,g,h,i,j,e,k,e";",") //$col.length=13
+ $pos1:=$col.lastIndexOf("e") //devuelve 12
+ $pos2:=$col.lastIndexOf("e";6) //devuelve 4
+ $pos3:=$col.lastIndexOf("e";15) //devuelve 12
+ $pos4:=$col.lastIndexOf("e";-2) //devuelve 10
+ $pos5:=$col.lastIndexOf("x") //devuelve -1
+```
+
+
+
+
+
+## .length
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R5 | Añadidos |
+
+
+
+**.length** : Integer
+
+#### Descripción
+
+La propiedad `.length` devuelve el número de elementos en la colección.
+
+La propiedad `.length` se inicializa cuando se crea la colección. Añadir o eliminar elementos actualiza la longitud, si es necesario. Esta propiedad es **sólo lectura** (no se puede utilizar para definir el tamaño de la colección).
+
+#### Ejemplo
+
+```4d
+Tipo
+```
+
+
+
+
+
+## .map()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.map**( *formula* : 4D.Function { ; *...param* : any } ) : Collection **.map**( *methodName* : Text { ; *...param* : any } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| param | any | -> | Parámetro(s) a pasar a la *formula* o *methodName* |
+| Resultado | Collection | <- | `.pop()`, utilizado junto con [`.push()`](#push), puede utilizarse para implementar una funcionalidad primera entrada última salida de tratamiento de datos apilados: |
+
+
+
+#### Descripción
+
+La función `.map()` crea una nueva colección basada en el resultado de la llamada a la función *formula* 4D o al método *methodName* sobre cada elemento de la colección original. Opcionalmente, puede pasar parámetros a *formula* o *methodName* utilizando los parámetros *param*. `.map()` siempre devuelve una colección con el mismo tamaño que la colección original, excepto si se utilizó *$1.stop* (ver más abajo).
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+La retrollamada se llama con los parámetros pasados en *param* (opcional). The callback is called with the parameter(s) passed in param (optional). Recibe un `Object` en el primer parámetro ($1).
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a evaluar
+- en *$2*: param
+- en *$N...*: paramN...
+
+Puede definir los siguientes parámetros:
+
+- (obligatorio si ha utilizado un método) *$1.result* (cualquier tipo): nuevo valor transformado para añadir a la colección resultante
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+#### Ejemplo
+
+```4d
+var $c; $c2 : Collection
+$c:=New collection(1; 4; 9; 10; 20)
+$c2:=$c.map(Formula(Round(($1.value/$2)*100; 2)); $c.sum())
+ //$c2=[2.27,9.09,20.45,22.73,45.45]
+```
+
+
+
+
+
+## .max()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.max**( { *propertyPath* : Text } ) : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ----------------------------------------------- | :-------------------------: | ------------------------------------------------------------------- |
+| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para la evaluación |
+| Resultado | Boolean, Text, Number, Collection, Object, Date | <- | Valor máximo en la colección |
+
+
+
+#### Descripción
+
+La función `.max()` devuelve el elemento con el valor más alto de la colección (el último elemento de la colección tal y como se ordenaría en orden ascendente utilizando la función [`.sort()`](#sort)).
+
+> Esta función no modifica la colección original.
+
+Si la colección contiene diferentes tipos de valores, la función `.max()` devolverá el valor máximo dentro del último tipo de elemento en el orden de la lista de tipos (ver la descripción de [`.sort()`](#sort)).
+
+Si la colección contiene objetos, pase el parámetro *propertyPath* para indicar la propiedad del objeto cuyo valor máximo desea obtener.
+
+Si la colección está vacía, `.max()` devuelve *Undefined*.
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ $col:=New collection(200;150;55)
+ $col.push(New object("name";"Smith";"salary";10000))
+ $col.push(New object("name";"Wesson";"salary";50000))
+ $col.push(New object("name";"Alabama";"salary";10500))
+ $max:=$col.max() //{name:Alabama,salary:10500}
+ $maxSal:=$col.max("salary") //50000
+ $maxName:=$col.max("name") //"Wesson"
+```
+
+
+
+
+
+## .min()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.min**( { *propertyPath* : Text } ) : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ----------------------------------------------- | :-------------------------: | ------------------------------------------------------------------- |
+| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para la evaluación |
+| Resultado | Boolean, Text, Number, Collection, Object, Date | <- | Valor mínimo en la colección |
+
+
+
+#### Descripción
+
+La función `.min()` devuelve el elemento con el valor más pequeño de la colección (el primer elemento de la colección tal y como se ordenaría en orden ascendente utilizando la función [`.sort()`](#sort)).
+
+> Esta función no modifica la colección original.
+
+Si la colección contiene diferentes tipos de valores, la función `.min()` devolverá el valor mínimo dentro del primer tipo de elemento en el orden de la lista de tipos (ver la descripción de [`.sort()`](#sort)).
+
+Si la colección contiene objetos, pase el parámetro *propertyPath* para indicar la propiedad del objeto cuyo valor mínimo desea obtener.
+
+Si la colección está vacía, `.min()` devuelve *Undefined*.
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ $col:=New collection(200;150;55)
+ $col.push(New object("name";"Smith";"salary";10000))
+ $col.push(New object("name";"Wesson";"salary";50000))
+ $col.push(New object("name";"Alabama";"salary";10500))
+ $min:=$col.min() //55
+ $minSal:=$col.min("salary") //10000
+ $minName:=$col.min("name") //"Alabama"
+```
+
+
+
+
+
+## .multiSort()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R3 | Añadidos |
+
+
+
+**.multiSort**() : Collection **.multiSort**( *colsToSort* : Collection ) : Collection **.multiSort**( *formula* : 4D.Function ; *colsToSort* : Collection ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| formula | 4D.Function | -> | Objeto fórmula |
+| colsToSort | Collection | -> | Colección de colecciones y/u objetos con propiedades {`collection`:*colToSort*;`order`:`ck ascending` o `ck descending`} |
+| Resultado | Collection | <- | La nueva colección |
+
+
+
+#### Descripción
+
+Ejemplo 2
+
+> Esta función modifica la colección original, así como todas las colecciones utilizadas en el parámetro *colsToSort*.
+
+Si se llama a `.multiSort()` sin parámetros, la función tiene el mismo efecto que la función [`.sort()`](#sort): la colección se ordena (sólo valores escalares) en orden ascendente por defecto, según su tipo. Si la colección contiene valores de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
+
+1. null
+2. booleans
+3. cadenas
+4. numbers
+5. objects
+6. collections
+7. dates
+
+**Ordenación sincronizada de un nivel**
+
+Para ordenar varias colecciones de forma sincrónica, basta con pasar en *colsToSort* una colección de colecciones para ordenar. Puede pasar un número ilimitado de colecciones. La colección original se ordenará en orden ascendente y todas las colecciones *colsToSort* se ordenarán de forma sincronizada.
+
+:::note
+
+Todas las colecciones *colsToSort* deben tener el mismo número de elementos, de lo contrario se devuelve un error.
+
+:::
+
+Si desea ordenar las colecciones en algún otro orden que no sea ascendente, debe suministrar una *formula* ([objeto Formula](../commands/formula.md)) que defina el orden de clasificación. El valor de retorno debe ser un booleano que indica el orden relativo de los dos elementos: **True** si *$1.value* es menor que *$1.value2*, **False** si *$1.value* es mayor que *$1.value2*. Puede ofrecer parámetros adicionales a la fórmula si es necesario.
+
+La fórmula recibe los siguientes parámetros:
+
+- $1 (objeto), donde:
+ - *$1.value* (todo tipo): valor del primer elemento a comparar
+ - *$1.value2* (todo tipo): valor del segundo elemento a comparar
+- $2...$N (cualquier tipo): parámetros adicionales
+
+**Ordenación sincronizada multinivel**
+
+Ordenar una colección de números de forma ascendente y descendente:
+
+Los niveles de ordenación vienen determinados por el orden en que se pasan las colecciones en el parámetro *colsToSort*: la posición de un objeto `collection`/`order` en la sintaxis determina su nivel de ordenación.
+
+:::note
+
+Ordenar una colección de números de forma ascendente y descendente:
+
+:::
+
+#### Ejemplo 1
+
+Descripción
+
+```4d
+var $col;$col2;$col3 : Collection
+$col:=["A"; "C"; "B"]
+$col2:=[1; 2; 3]
+$col3:=[["Jim"; "Philip"; "Maria"]; ["blue"; "green"]; ["11"; 22; "33"]]
+
+$col.multiSort([$col2; $col3])
+//$col=["A","B","C"]
+//$col2=[1,3,2]
+//$col3[0]=["Jim","Philip","Maria"]
+//$col3[1]=["11",22,"33"]
+//$col3[2]=["blue","green"]
+
+```
+
+#### Ejemplo 2
+
+Desea ordenar tres colecciones sincronizadas: city, country y continent. Quiere una ordenación ascendente de la primera y la tercera colección y sincronización para la segunda colección:
+
+```4d
+var $city : Collection
+var $country : Collection
+var $continent : Collection
+
+$city:=["Paris"; "Lyon"; "Rabat"; "Eching"; "San Diego"]
+$country:=["France"; "France"; "Morocco"; "Germany"; "US"]
+$continent:=["Europe"; "Europe"; "Africa"; "Europe"; "America"]
+
+$continent.multiSort([$country; {collection: $city; order: ck ascending}])
+//$continent=["Africa","America","Europe","Europe","Europe"]
+//$country=["Morocco","US","France","France","Germany"]
+//$city=["Rabat","San Diego","Lyon","Paris","Eching"]
+
+```
+
+#### Ejemplo 3
+
+También puede sincronizar colecciones de objetos.
+
+```4d
+var $name : Collection
+var $address : Collection
+$name:=[]
+$name.push({firstname: "John"; lastname: "Smith"})
+$name.push({firstname: "Alain"; lastname: "Martin"})
+$name.push({firstname: "Jane"; lastname: "Doe"})
+$name.push({firstname: "John"; lastname: "Doe"})
+$address:=[]
+$address.push({city: "Paris"; country: "France"})
+$address.push({city: "Lyon"; country: "France"})
+$address.push({city: "Eching"; country: "Germany"})
+$address.push({city: "Berlin"; country: "Germany"})
+
+$name.multiSort(Formula($1.value.firstname<$1.value2.firstname); [$address])
+//"Alain Martin","Jane Doe","John Smith","John Doe"
+//"Lyon France","Eching Germany","Paris France","Berlin Germany"
+
+```
+
+
+
+
+
+## .orderBy()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.orderBy**( ) : Collection **.orderBy**( *pathStrings* : Text ) : Collection **.orderBy**( *pathObjects* : Collection ) : Collection **.orderBy**( *ascOrDesc* : Integer ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------- |
+| pathStrings | Text | -> | Ruta(s) de propiedad(es) a utilizar para ordenar la colección |
+| pathObjects | Collection | -> | Colección de objetos criterio |
+| ascOrDesc | Integer | -> | Ejemplo 1 |
+| Resultado | Collection | <- | Copia ordenada de la colección (copia superficial) |
+
+
+
+#### Descripción
+
+La función `.orderBy()` devuelve una nueva colección que contiene todos los elementos de la colección en el orden especificado.
+
+Esta función devuelve una *copia superficial*, lo que significa que los objetos o colecciones de ambas colecciones comparten la misma referencia. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
+
+> Esta función no modifica la colección original.
+
+Si no se pasa ningún parámetro, la función ordena los valores escalares de la colección en orden ascendente (otros tipos de elementos como objetos o colecciones se devuelven con un orden interno). Puede modificar este orden automático pasando las constantes `ck ascending` o `ck descending` en el parámetro *ascOrDesc* (ver más abajo).
+
+También puede pasar un parámetro de criterios para definir cómo deben ordenarse los elementos de la colección. Se admiten tres sintaxis para este parámetro:
+
+- *pathStrings* : Texto (fórmula). **Sintaxis**: `propertyPath1 {desc or asc}, propertyPath2 {desc or asc},...` (orden por defecto: asc). *pathStrings* contiene una fórmula compuesta de 1 a x rutas de propiedades y (opcionalmente) órdenes de clasificación, separados por comas. El orden en que se pasan las propiedades determina la prioridad de ordenación de los elementos de la colección. Por defecto, las propiedades se clasifican en orden ascendente. Puede definir el orden de clasificación de una propiedad en la cadena de criterios, separado de la ruta de la propiedad por un solo espacio: pase "asc" para ordenar en orden ascendente o "desc" en orden descendente.
+
+- *pathObjects* : Collection. Puede añadir tantos objetos en la colección *pathObjects* como sea necesario. Por defecto, las propiedades se clasifican en orden ascendente ("descending" es false). Cada elemento de la colección contiene un objeto estructurado de la siguiente manera:
+
+```4d
+{
+ "propertyPath": string,
+
+
+ "descending": boolean
+
+}
+```
+
+- *ascOrDesc* : Integer. Se pasa una de las siguientes constantes del tema **Objects and collections**:
+
+ | Constante | Tipo | Valor | Comentario |
+ | ------------- | ------- | ----- | ----------------------------------------------------------------------------- |
+ | ck ascending | Integer | 0 | Los elementos se ordenan de forma ascendente (por defecto) |
+ | ck descending | Integer | 1 | Los elementos se ordenan de forma descendente |
+
+ Esta sintaxis sólo ordena los valores escalares de la colección (otros tipos de elementos, como objetos o colecciones, se devuelven desordenados).
+
+Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
+
+1. null
+2. booleans
+3. cadenas
+4. numbers
+5. objects
+6. collections
+7. dates
+
+#### Ejemplo 1
+
+Ordenar una colección de números de forma ascendente y descendente:
+
+```4d
+ var $c; $c2; $c3 : Collection
+ $c:=New collection
+ For($vCounter;1;10)
+ $c.push(Random)
+ End for
+ $c2:=$c.orderBy(ck ascending)
+ $c3:=$c.orderBy(ck descending)
+```
+
+#### Ejemplo 2
+
+Ordenar una colección de objetos a partir de una fórmula de texto con nombres de propiedades:
+
+```4d
+ var $c; $c2 : Collection
+ $c:=New collection
+ For($vCounter;1;10)
+ $c.push(New object("id";$vCounter;"value";Random))
+ End for
+ $c2:=$c.orderBy("value desc")
+ $c2:=$c.orderBy("value desc, id")
+ $c2:=$c.orderBy("value desc, id asc")
+```
+
+Ordenar una colección de objetos con una ruta de propiedades:
+
+```4d
+ var $c; $c2 : Collection
+ $c:=New collection
+ $c.push(New object("name";"Cleveland";"phones";New object("p1";"01";"p2";"02")))
+ $c.push(New object("name";"Blountsville";"phones";New object("p1";"00";"p2";"03")))
+
+ $c2:=$c.orderBy("phones.p1 asc")
+```
+
+#### Ejemplo 3
+
+Ordenar una colección de objetos utilizando una colección de objetos criterio:
+
+```4d
+ var $crit; $c; $c2 : COllection
+ $crit:=New collection
+ $c:=New collection
+ For($vCounter;1;10)
+ $c.push(New object("id";$vCounter;"value";Random))
+ End for
+ $crit.push(New object("propertyPath";"value";"descending";True))
+ $crit.push(New object("propertyPath";"id";"descending";False))
+ $c2:=$c.orderBy($crit)
+```
+
+Ordenar con una ruta de propiedad:
+
+```4d
+
+ var $crit; $c; $c2 : Collection
+ $c:=New collection
+ $c.push(New object("name";"Cleveland";"phones";New object("p1";"01";"p2";"02")))
+ $c.push(New object("name";"Blountsville";"phones";New object("p1";"00";"p2";"03")))
+ $crit:=New collection(New object("propertyPath";"phones.p2";"descending";True))
+ $c2:=$c.orderBy($crit)
+```
+
+
+
+
+
+## .orderByMethod()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.orderByMethod**( *formula* : 4D.Function { ; ...*extraParam* : expression } ) : Collection **.orderByMethod**( *methodName* : Text { ; ...*extraParam* : expression } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | --------------------------------------------------------------------- |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| extraParam | any | -> | Parámetro(s) a pasar |
+| Resultado | Collection | <- | Copia ordenada de la colección (copia superficial) |
+
+
+
+#### Descripción
+
+La función `.orderByMethod()` devuelve una nueva colección que contiene todos los elementos de la colección en el orden definido mediante la función *formula* 4D o el método *methodName*.
+
+Esta función devuelve una *copia superficial*, lo que significa que los objetos o colecciones de ambas colecciones comparten la misma referencia. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+
+- o *methodName*, el nombre de un método proyecto (texto).
+
+En la retrolamada, pase un código que compare dos valores y devuelva **true** si el primer valor es menor que el segundo. Puede ofrecer los parámetros *extraParam* a la retrollamada si es necesario.
+
+La retrollamada recibe los siguientes parámetros:
+
+- $1 (objeto), donde:
+ - *$1.value* (todo tipo): valor del primer elemento a comparar
+ - *$1.value2* (todo tipo): valor del segundo elemento a comparar
+ - $2...$N (cualquier tipo): parámetros adicionales
+
+Si utilizó un método, debe definir el siguiente parámetro:
+
+- *$1.result* (boolean): **true** si *$1.value < $1.value2*, **false** de lo contrario
+
+#### Ejemplo 1
+
+Desea ordenar una colección de cadenas en orden numérico en lugar de orden alfabético:
+
+```4d
+ var $c; $c2; $c3 : Collection
+ $c:=New collection
+ $c.push("33";"4";"1111";"222")
+ $c2:=$c.orderBy() //$c2=["1111","222","33","4"], alphabetical order
+ $c3:=$c.orderByMethod(Formula(Num($1.value)Length(String($1.value2))))
+ //$c2=[Passion fruit,Blackberry,Orange,Banana,Apple,Grape,pear,fig]
+```
+
+#### Ejemplo 3
+
+Ordenar los elementos de la colección por código de caracteres o alfabéticamente:
+
+```4d
+var $strings1; $strings2 : Collection
+$strings1:=New collection("Alpha";"Charlie";"alpha";"bravo";"Bravo";"charlie")
+
+//utilizando el código de caracteres:
+$strings2:=$strings1.orderByMethod(Function(sortCollection);sk character codes)
+// result : ["Alpha","Bravo","Charlie","alpha","bravo","charlie"]
+
+//utilizando el lenguaje:
+$strings2:=$strings1.orderByMethod(Function(sortCollection);sk strict)
+// resultado : ["alpha","Alpha","bravo","Bravo","charlie","Charlie"]
+```
+
+Con el siguiente método ***Flatten***:
+
+```4d
+#DECLARE ($toSort : Object ; $option : Integer)
+
+$toSort.result:=(Compare strings($toSort.value;$toSort.value2;$option2)<0)
+```
+
+
+
+
+
+## .pop()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.pop()** : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-------------------------: | ------------------------------- |
+| Resultado | any | <- | Último elemento de la colección |
+
+
+
+#### Descripción
+
+La función `.pop()` elimina el último elemento de la colección y lo devuelve como resultado de la función.
+
+> Esta función modifica la colección original.
+
+Cuando se aplica a una colección vacía, `.pop()` devuelve ***undefined***.
+
+#### Ejemplo
+
+`.pop()`, utilizado junto con [`.push()`](#push), puede utilizarse para implementar una funcionalidad primera entrada última salida de tratamiento de datos apilados:
+
+```4d
+Lanzamiento
+```
+
+
+
+
+
+## .push()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.push**( *element* : any { ;...*elementN* } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ------------------------------------------------------ |
+| element | any | -> | Elemento(s) a añadir a la colección |
+| Resultado | Collection | <- | Colección que contiene los elementos añadidos |
+
+
+
+#### Descripción
+
+La función `.push()` añade uno o más *elemento*(s) al final de la instancia de la colección y devuelve la colección editada.
+
+> Esta función modifica la colección original.
+
+#### Ejemplo 1
+
+```4d
+ var $col : Collection
+ $col:=New collection(1;2) //$col=[1,2]
+ $col.push(3) //$col=[1,2,3]
+ $col.push(6;New object("firstname";"John";"lastname";"Smith"))
+ //$col=[1,2,3,6,{firstname:John,lastname:Smith}
+```
+
+#### Ejemplo 2
+
+Desea ordenar la colección resultante:
+
+```4d
+ var $col; $sortedCol : Collection
+ $col:=New collection(5;3;9) //$col=[5,3,9]
+ $sortedCol:=$col.push(7;50).sort()
+ //$col=[5,3,9,7,50]
+ //$sortedCol=[3,5,7,9,50]
+```
+
+
+
+
+
+## .query()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------------ |
+| 20 R6 | Ejemplo 1 |
+| 17 R5 | Soporte de querySettings |
+| v16 R6 | Añadidos |
+
+
+
+**.query**( *queryString* : Text ) : Collection **.query**( *queryString* : Text ; *...value* : any ) : Collection **.query**( *queryString* : Text ; *querySettings* : Object ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------- |
+| queryString | Text | -> | Criterio de búsqueda |
+| value | any | -> | Valor(es) a comparar cuando se utiliza(n) marcador(es) de posición |
+| querySettings | Object | -> | Opciones de búsqueda: parámetros, atributos |
+| Resultado | Collection | <- | Descripción |
+
+
+
+#### Descripción
+
+La función `.query()` devuelve todos los elementos de una colección de objetos que coinciden con las condiciones de búsqueda definidas por *queryString* y (opcionalmente) *value* o *querySettings*. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
+
+Se devuelve una colección vacía si la colección en la que se ejecuta la consulta no contiene el *valor* buscado.
+
+> Esta función no modifica la colección original.
+
+#### parámetro queryString
+
+El parámetro *queryString* utiliza la siguiente sintaxis:
+
+```4d
+propertyPath comparator value {logicalOperator propertyPath comparator value}
+```
+
+donde:
+
+- **propertyPath**: ruta de la propiedad sobre la cual quiere ejecutar la consulta. Este parámetro puede ser un nombre simple (por ejemplo, "país") o cualquier ruta de atributo válida (por ejemplo, "país.nombre"). En el caso de una ruta de atributo cuyo tipo es `Collection`, se utiliza la notación `[]` para manejar todas las ocurrencias (por ejemplo `children[].age`).
+
+- **comparator**: símbolo que compara *propertyPath* y *value*. Se soportan los siguientes símbolos:
+
+| Comparación | Símbolo(s) | Comentario |
+| ------------------------------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Igual a | =, == | Obtiene los datos coincidentes, admite el comodín (@), no distingue entre mayúsculas de minúsculas ni diacríticas. |
+| | ===, IS | Obtiene los datos coincidentes, considera @ como carácter estándar, no distingue entre mayúsculas de minúsculas ni diacríticas |
+| Diferente de | #, != | Soporta el comodín (@). Equivale a "Condición no aplicada en una instrucción" ). |
+| | !==, IS NOT | Considera la @ como un caracter estándar |
+| Condición No aplicada a una sentencia | NOT | Los paréntesis son obligatorios cuando se utiliza NOT antes de una instrucción que contiene varios operadores. Equivalente a "No igual a"). |
+| Menor que | < | |
+| Mayor que | > | |
+| Menor o igual que | <= | |
+| Mayor o igual que | > = | |
+| Incluído en | IN | Devuelve los datos iguales a al menos uno de los valores de una colección o de un conjunto de valores, admite el comodín (@) |
+
+- **valor**: valor a comparar con el valor actual de la propiedad de cada elemento de la colección. Puede ser cualquier valor de expresión constante que coincida con la propiedad del tipo de datos del elemento o un [**marcador de posición**](#using-placeholders).
+ For example, if the string "v20" is entered as value to compare with an integer attribute, it will be converted to 20.
+ - La constante de tipo **texto** puede pasarse con o sin comillas simples (ver **Uso de comillas** más abajo). Para consultar una cadena dentro de otra cadena (una consulta de tipo "contiene"), utilice el símbolo de comodín (@) en el valor para aislar la cadena a buscar como se muestra en este ejemplo: "@Smith@". Las siguientes palabras claves están prohibidas para las constantes de texto: true, false.
+ - Valores constantes de tipo **booleano**: **true** o **false** (Sensible a las mayúsculas y minúsculas).
+ - Valores constantes de **tipo numérico**: los decimales se separan con un '.' (punto).
+ - Constantes de tipo **date**: formato "YYYY-MM-DD"
+ - Constantes **null**: utilizando la palabra clave "null" se encontrarán las propiedades **null** y **undefined**.
+ - en el caso de una búsqueda con un comparador IN, *value* debe ser una colección, o los valores que coincidan con el tipo de la ruta del atributo entre \[ ] separados por comas (para las cadenas, los caracteres `"` deben escaparse con `\`).
+
+- **logicalOperator**: utilizado para unir condiciones múltiples en la búsqueda (opcional). Puede utilizar uno de los siguientes operadores lógicos (se puede utilizar el nombre o el símbolo):
+
+| Conjunción | Símbolo(s) |
+| ---------- | ----------------------------------------------------------------------------------- |
+| AND | &, &&, and |
+| O | |,||, or |
+
+#### Utilizar comillas
+
+Cuando utilice comillas dentro de las consultas, debe utilizar comillas simples ' ' dentro de la consulta y comillas dobles " " para encerrar toda la consulta, de lo contrario se devuelve un error. Por ejemplo:
+
+```4d
+"employee.name = 'smith' AND employee.firstname = 'john'"
+```
+
+> Las comillas simples (') no se admiten en los valores buscados, ya que romperían la cadena de búsqueda. Por ejemplo, "comp.name = 'John's pizza' " generará un error. Si necesita buscar en valores con comillas simples, puede considerar el uso de marcadores de posición (ver más abajo).
+
+#### Uso del paréntesis
+
+Puede utilizar paréntesis en la búsqueda para dar prioridad al cálculo. Por ejemplo, puede organizar una búsqueda de la siguiente manera:
+
+```4d
+"(employee.age >= 30 OR employee.age <= 65) AND (employee.salary <= 10000 OR employee.status = 'Manager')"
+```
+
+#### Uso de marcadores de posición
+
+4D le permite utilizar marcadores de posición para los argumentos *propertyPath* y *value* dentro del parámetro *queryString*. Un marcador es un parámetro que se inserta en las cadenas de búsqueda y que se sustituye por otro valor cuando se evalúa la cadena de búsqueda. El valor de los marcadores se evalúa una vez al principio de la búsqueda; no se evalúa para cada elemento.
+
+Lanzamiento
+
+- **Marcadores de posición indexados**: los parámetros se insertan como `:paramIndex` (por ejemplo ":1", ":2"...) en *queryString* y sus valores correspondientes son proporcionados por la secuencia de parámetros *value*. en *queryString* y sus valores correspondientes son proporcionados por la secuencia de parámetros *value*.
+
+Ejemplo:
+
+```4d
+$c:=$myCol.query(":1=:2";"city";"Chicago")
+```
+
+- Copia ordenada de la colección (copia superficial)
+
+Ejemplo:
+
+```4d
+$o.attributes:={att:"city"}
+$o.parameters:={name:"Chicago")
+$c:=$myCol.query(":att=:name";$o)
+```
+
+Puede mezclar todos los tipos de argumentos en *queryString*. Puede mezclar todos los tipos de argumentos en *queryString*.
+
+- valores directos (sin marcadores),
+- marcadores indexados y/o con nombre.
+
+El uso de marcadores de posición en las búsquedas **se recomienda** por las siguientes razones:
+
+1. Evita la inserción de código malicioso: si utiliza directamente variables completadas por el usuario dentro de la cadena de búsqueda, un usuario podría modificar las condiciones de búsqueda introduciendo argumentos de búsqueda adicionales. Por ejemplo, imagine una cadena de búsqueda como:
+
+```4d
+ $vquery:="status = 'public' & name = "+myname //el usuario introduce su nombre
+ $result:=$col.query($vquery)
+```
+
+Esta búsqueda parece segura ya que se filtran los datos no públicos. Sin embargo, si el usuario introduce en el área *myname* algo como *"smith OR status='private'*, la cadena de consulta se modificaría en el paso de interpretación y podría devolver datos privados.
+
+Cuando se utilizan marcadores de posición, no es posible anular las condiciones de seguridad:
+
+```4d
+ $result:=$col.query("status='public' & name=:1";myname)
+```
+
+En este caso, si el usuario introduce *smith OR status='private'* en el área *myname*, no se interpretará en la cadena de búsqueda, sino que sólo se pasará como valor. La búsqueda de una persona llamada "smith OR status='private'" simplemente fallará.
+
+2. Evita tener que preocuparse por cuestiones de formato o caracteres, especialmente cuando se manejan los parámetros *propertyPath* o *value* que pueden contener caracteres no alfanuméricos como ".", "['...
+
+3. Permite el uso de variables o expresiones en los argumentos de búsqueda. Ejemplos:
+
+```4d
+$result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
+$result2:=$col.query("company.name = :1";"John's Pizzas")
+```
+
+> El uso de una [**referencia de colección** o **referencia de objeto**](#objeto-o-referencia-de-colección-como-valor) en el parámetro *value* no está soportado con esta sintaxis. Debe utilizar el parámetro [*querySettings*](#querysettings-parameter).
+
+#### Búsqueda de valores null
+
+Cuando se buscan valores null, no se puede utilizar la sintaxis de marcador de posición porque el motor de búsqueda considera null como un valor de comparación invalido. Por ejemplo, si ejecuta la siguiente búsqueda:
+
+```4d
+Lanzamiento
+```
+
+No obtendrá el resultado esperado porque el valor null será evaluado por 4D como un error resultante de la evaluación del parámetro (por ejemplo, un atributo procedente de otra búsqueda). Para este tipo de búsquedas, debe utilizar la sintaxis de búsqueda directa:
+
+```4d
+Lanzamiento
+```
+
+#### Referencia de objeto o de colección como valor
+
+Puede consultar en una colección utilizando una referencia de objeto o una referencia de colección como parámetro *value* a comparar. La consulta coincidirá con los objetos de la colección que se refieran a (apunten a) la misma **instancia** de objeto o de colección.
+
+Para una descripción detallada de los parámetros *queryString* y *value*, consulte la función `dataClass.query()`.
+
+| Comparación | Símbolo(s) |
+| ------------ | ----------------------------- |
+| Igual a | =, == |
+| Diferente de | #, != |
+
+Para construir una consulta con un objeto o una referencia de colección, debe utilizar la sintaxis del parámetro *querySettings*. Ejemplo con una referencia de objeto:
+
+```4d
+var $o1:={a: 1}
+var $o2:={a: 1} /mismo objeto pero otra referencia
+var $o3:=$o1 /mismo objeto y referencia
+
+var $col; $colResult : Collection
+
+$col:=[{o: $o1}; {o: $o2}; {o: $o3}]
+$colResult:=$col.query("o = :v"; {parameters: {v: $o3}})
+ //$colResult.length=2
+ //$colResult[0].o=$o1 es true
+ //$colResult[1].o=$o1 es true
+
+```
+
+Ejemplo con una referencia de colección:
+
+```4d
+
+$c1:=[1; 2; 3]
+$c2:=[1; 2; 3] //misma colección pero otra referencia
+$c3:=$c1 //misma colección y referencia
+
+$col:=[{c: $c1}; {c: $c2}; {c: $c3}]
+$col2:=$col.query("c = :v"; {parameters: {v: $c3}})
+ //$col2.length=2
+ //$col2[0].c=$c1 es true
+ //$col2[1].c=$c1 es true
+
+```
+
+#### Parámetro querySettings
+
+En el parámetro *querySettings*, puede pasar un objeto que contenga marcadores de posición de consulta como objetos. Se soportan las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| parameters | Object | **Marcadores de posición con nombre para los valores** utilizados en *queryString*. Los valores se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para un valor en *queryString* o formula (":placeholder") y valor es el valor a comparar. Puede combinar marcadores de posición indexados (valores pasados directamente en parámetros de valor) y valores de marcadores de posición con nombre en la misma búsqueda. |
+| attributes | Object | **Marcadores de posición con nombre para rutas de atributos** utilizados en la *queryString*. Los atributos se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para una ruta de atributo en *queryString* (":placeholder"), y valor puede ser una cadena o una colección de cadenas. Cada valor es una ruta que puede designar una propiedad en un objeto de la colección
Tipo de objeto
Descripción
Cadena
Ruta de acceso del atributo expresado utilizando la notación de punto, por ejemplo, "name" o "user.address.zipCode"
Colección de cadenas
Cada cadena de la colección representa un nivel de attributePath, por ejemplo, `\["name"]` o `\["user","address","zipCode"]`. El uso de una colección permite realizar consultas sobre atributos con nombres que no son compatibles a la notación de puntos, por ejemplo, \["4Dv17.1", "en\/fr"]
Puede mezclar marcadores de posición indexados (valores pasados directamente en los parámetros *value*) y los valores de marcadores de posición con nombre en la misma consulta. |
+
+:::note
+
+El uso de este parámetro es obligatorio si desea consultar en una colección [utilizando una **referencia de colección** o una **referencia de un objeto**](#object-or-collection-reference-as-value).
+
+:::
+
+#### Ejemplo 1
+
+```4d
+ var $c; $c2; $c3 : Collection
+ $c:=New collection
+ $c.push(New object("name";"Cleveland";"zc";35049))
+ $c.push(New object("name";"Blountsville";"zc";35031))
+ $c.push(New object("name";"Adger";"zc";35006))
+ $c.push(New object("name";"Clanton";"zc";35046))
+ $c.push(New object("name";"Clanton";"zc";35045))
+ $c2:=$c.query("name = :1";"Cleveland") //$c2=[{name:Cleveland,zc:35049}]
+ $c3:=$c.query("zc > 35040") //$c3=[{name:Cleveland,zc:35049},{name:Clanton,zc:35046},{name:Clanton,zc:35045}]
+```
+
+#### Ejemplo 2
+
+```4d
+ var $c : Collection
+ $c:=New collection
+ $c.push(New object("name";"Smith";"dateHired";!22-05-2002!;"age";45))
+ $c.push(New object("name";"Wesson";"dateHired";!30-11-2017!))
+ $c.push(New object("name";"Winch";"dateHired";!16-05-2018!;"age";36))
+
+ $c.push(New object("name";"Sterling";"dateHired";!10-5-1999!;"age";Null))
+ $c.push(New object("name";"Mark";"dateHired";!01-01-2002!))
+```
+
+Este ejemplo devuelve las personas cuyo nombre contiene "in":
+
+```4d
+ $col:=$c.query("name = :1";"@in@")
+ //$col=[{name:Winch...},{name:Sterling...}]
+```
+
+Este ejemplo devuelve las personas cuyo nombre no empieza por una cadena de una variable (introducida por el usuario, por ejemplo):
+
+```4d
+ $col:=$c.query("name # :1";$aString+"@")
+ //if $astring="W"
+ //$col=[{name:Smith...},{name:Sterling...},{name:Mark...}]
+```
+
+Este ejemplo devuelve las personas cuya edad no se conoce (propiedad definida como null o indefinida):
+
+```4d
+Ejemplo
+```
+
+Este ejemplo devuelve las personas contratadas hace más de 90 días:
+
+```4d
+Comentario
+```
+
+#### Ejemplo 3
+
+Búsquedas con fechas:
+
+```4d
+
+$entitySelection:=ds.Employee.query("birthDate > :1";"1970-01-01")
+$entitySelection:=ds.Employee.query("birthDate <= :1";Current date-10950)
+```
+
+:::info
+
+Descripción Descripción Sin embargo, ten en cuenta que las fórmulas no están soportadas por la función `collection.query()`, ni en el parámetro *queryString* ni como parámetro objeto *formula*.
+
+:::
+
+
+
+
+
+## .reduce()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.reduce**( *formula* : 4D.Function { ; *initValue* : any { ; *...param* : expression }} ) : any **.reduce**( *methodName* : Text { ; *initValue* : any { ; *...param* : expression }} ) : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ----------------------------------------------- | :-------------------------: | --------------------------------------------- |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| initValue | Text, Number, Object, Collection, Date, Boolean | -> | Colección que contiene los elementos añadidos |
+| param | expresión | -> | Parámetro(s) a pasar |
+| Resultado | Text, Number, Object, Collection, Date, Boolean | <- | donde: |
+
+
+
+#### Descripción
+
+La función `.reduce()` aplica la retrollamada *formula* o *methodName* a un acumulador y cada elemento de la colección (de izquierda a derecha) para reducirlo a un único valor.
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+Tipo
+
+Puede pasar el valor para inicializar el acumulador en *initValue*. Si se omite, *$1.accumulator* empieza por *Undefined*.
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a procesar
+- en *$2: param*
+- en *$N...*: *paramN...*
+
+La retrollamada define los siguientes parámetros:
+
+- Descripción
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+#### Ejemplo 1
+
+```4d
+var $c : Collection
+$c:=New collection(5;3;5;1;3;4;4;6;2;2)
+$r:=$c.reduce(Formula($1.accumulator*=$1.value); 1) //devuelve 86400
+```
+
+#### Ejemplo 2
+
+Este ejemplo permite reducir varios elementos de la colección a uno solo:
+
+```4d
+ var $c;$r : Collection
+ $c:=New collection
+ $c.push(New collection(0;1))
+ $c.push(New collection(2;3))
+ $c.push(New collection(4;5))
+ $c.push(New collection(6;7))
+ $r:=$c.reduce(Formula(Flatten)) //$r=[0,1,2,3,4,5,6,7]
+```
+
+Con el siguiente método ***Flatten***:
+
+```4d
+ If($1.accumulator=Null)
+ $1.accumulator:=New collection
+ End if
+ $1.accumulator.combine($1.value)
+```
+
+
+
+
+
+## .reduceRight()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.reduceRight**( *formula* : 4D.Function { ; *initValue* : any { ; *...param* : expression }} ) : any **.reduceRight**( *methodName* : Text { ; *initValue* : any { ; *...param* : expression }} ) : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ----------------------------------------------- | :-------------------------: | --------------------------------------------- |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| initValue | Text, Number, Object, Collection, Date, Boolean | -> | Colección que contiene los elementos añadidos |
+| param | expresión | -> | Parámetro(s) a pasar |
+| Resultado | Text, Number, Object, Collection, Date, Boolean | <- | donde: |
+
+
+
+#### Descripción
+
+La función `.reduceRight()` aplica la retrollamada *formula* o *methodName* contra un acumulador y cada elemento de la colección (de derecha a izquierda) para reducirlo a un único valor.
+
+> Esta función no modifica la colección original.
+
+Se designa la retrollamada a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+Tipo
+
+Puede pasar el valor para inicializar el acumulador en *initValue*. Si se omite, *$1.accumulator* empieza por *Undefined*.
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a procesar
+- en *$2: param*
+- en *$N...*: *paramN...*
+
+La retrollamada define los siguientes parámetros:
+
+- Descripción
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+#### Ejemplo 1
+
+```4d
+Tipo
+```
+
+#### Ejemplo 2
+
+Este ejemplo permite reducir varios elementos de la colección a uno solo:
+
+```4d
+ var $c;$r : Collection
+ $c:=New collection
+ $c.push(New collection(0;1))
+ $c.push(New collection(2;3))
+ $c.push(New collection(4;5))
+ $c.push(New collection(6;7))
+ $r:=$c.reduceRight(Formula(Flatten)) //$r=[6,7,4,5,2,3,0,1]
+```
+
+Con el siguiente método ***Flatten***:
+
+```4d
+Ejemplo 4
+```
+
+
+
+
+
+## .remove()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.remove**( *index* : Integer { ; *howMany* : Integer } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------- |
+| index | Integer | -> | Elemento en el que se inicia la eliminación |
+| howMany | Integer | -> | Número de elementos a eliminar, o 1 elemento si se omite |
+| Resultado | Collection | <- | Colección modificada sin elemento(s) eliminado(s) |
+
+
+
+#### Descripción
+
+La función `.remove()` elimina uno o más elementos a partir de la posición *index* especificada en la colección y devuelve la colección editada.
+
+> Esta función modifica la colección original.
+
+Lanzamiento
+
+> **Atención**: recuerde que los elementos de la colección están numerados desde 0. Si *startFrom* < 0, se considera el desplazamiento desde el final de la colección (*startFrom:=startFrom+length*).
+
+- Si *index* < 0, se recalcula como *index:=index+length* (se considera el desplazamiento desde el final de la colección).
+- Lanzamiento
+- Ejemplo 1
+
+En *howMany*, pase el número de elementos a eliminar de *index*. Si no se especifica *howMany*, se elimina un elemento.
+
+Si se intenta eliminar un elemento de una colección vacía, el método no hace nada (no se genera ningún error).
+
+#### Ejemplo
+
+```4d
+ var $col : Collection
+ $col:=New collection("a";"b";"c";"d";"e";"f";"g";"h")
+ $col.remove(3) // $col=["a","b","c","e","f","g","h"]
+ $col.remove(3;2) // $col=["a","b","c","g","h"]
+ $col.remove(-8;1) // $col=["b","c","g","h"]
+ $col.remove(-3;1) // $col=["b","g","h"]
+```
+
+
+
+
+
+## .resize()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.resize**( *size* : Integer { ; *defaultValue* : any } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ----------------------------------------------- | :-------------------------: | ------------------------------------------------------------------------------------------- |
+| size | Integer | -> | Nuevo tamaño de la colección |
+| defaultValue | Number, Text, Object, Collection, Date, Boolean | -> | Valor por defecto para llenar nuevos elementos |
+| Resultado | Collection | <- | o *methodName*, el nombre de un método proyecto (texto). |
+
+
+
+#### Descripción
+
+La función `.resize()` ajusta la longitud de la colección al nuevo tamaño especificado y devuelve la colección redimensionada.
+
+> Esta función modifica la colección original.
+
+- Ejemplo 1
+- Ejemplo 1
+
+Por defecto, los nuevos elementos se llenan con valores **null**. Puede especificar el valor a llenar en los elementos añadidos utilizando el parámetro *defaultValue*.
+
+#### Ejemplo
+
+```4d
+ var $c : Collection
+ $c:=New collection
+ $c.resize(10) // $c=[null,null,null,null,null,null,null,null,null,null]
+
+ $c:=New collection
+ $c.resize(10;0) // $c=[0,0,0,0,0,0,0,0,0,0]
+
+ $c:=New collection(1;2;3;4;5)
+ $c.resize(10;New object("name";"X")) //$c=[1,2,3,4,5,{name:X},{name:X},{name:X},{name:X},{name:X}]
+
+ $c:=New collection(1;2;3;4;5)
+ $c.resize(2) //$c=[1,2]
+
+```
+
+
+
+
+
+## .reverse()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.reverse( )** : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Resultado | Collection | <- | (obligatorio si se ha utilizado un método) *$1.result* (booleano): **true** si la evaluación del valor del elemento tiene éxito, **false** en caso contrario. |
+
+
+
+#### Descripción
+
+La función `.reverse()` devuelve una copia profunda de la colección con todos sus elementos en orden inverso. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
+
+> Esta función no modifica la colección original.
+
+#### Ejemplo
+
+```4d
+ var $c; $c2 : Collection
+ $c:=New collection(1;3;5;2;4;6)
+ $c2:=$c.reverse() //$c2=[6,4,2,5,3,1]
+```
+
+
+
+
+
+## .shift()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.shift()** : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-------------------------: | ------------------------------- |
+| Resultado | any | <- | Primer elemento de la colección |
+
+
+
+#### Descripción
+
+La función `.shift()` elimina el primer elemento de la colección y lo devuelve como resultado de la función.
+
+> Esta función modifica la colección original.
+
+Si la colección está vacía, este método no hace nada.
+
+#### Ejemplo
+
+```4d
+ var $c : Collection
+ var $val : Variant
+ $c:=New collection(1;2;4;5;6;7;8)
+ $val:=$c.shift()
+ // $val=1
+ // $c=[2,4,5,6,7,8]
+```
+
+
+
+
+
+## .slice()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.slice**( *startFrom* : Integer { ; *end* : Integer } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ---------------------------------------------- |
+| startFrom | Integer | -> | Índice de inicio (incluido) |
+| end | Integer | -> | Índice final (no incluido) |
+| Resultado | Collection | <- | Resultado |
+
+
+
+#### Descripción
+
+La función `.slice()` devuelve una parte de una colección en una nueva colección, seleccionada de la posición *startFrom* a la posición *end* (no incluye *end*). Esta función devuelve una *copia superficial* de la colección. Si la colección original es una colección compartida, la colección devuelta es también una colección compartida.
+
+> Esta función no modifica la colección original.
+
+La colección devuelta contiene el elemento especificado por *startFrom* y todos los elementos subsiguientes hasta, pero sin incluir, el elemento especificado por *end*. Si sólo se especifica el parámetro *startFrom*, la colección devuelta contiene todos los elementos desde *startFrom* hasta el último elemento de la colección original.
+
+- Si *startFrom* < 0, se recalcula como *startFrom:=startFrom+length* (se considera el desplazamiento desde el final de la colección).
+- Descripción
+- Si *end* < 0 , se recalcula como *end:=end+length*.
+- Este ejemplo permite reducir varios elementos de la colección a uno solo:
+
+#### Ejemplo
+
+```4d
+ var $c; $nc : Collection
+ $c:=New collection(1;2;3;4;5)
+ $nc:=$c.slice(0;3) //$nc=[1,2,3]
+ $nc:=$c.slice(3) //$nc=[4,5]
+ $nc:=$c.slice(1;-1) //$nc=[2,3,4]
+ $nc:=$c.slice(-3;-2) //$nc=[3]
+```
+
+
+
+
+
+## .some()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.some**( { *startFrom* : Integer ; } *formula* : 4D.Function { ; *...param* : any } ) : Boolean **.some**( { *startFrom* : Integer ; } *methodName* : Text { ; *...param* : any } ) : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | ------------------------------------------------------------ |
+| startFrom | Integer | -> | Índice para iniciar la prueba en |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| param | any | -> | Parámetro(s) a pasar |
+| Resultado | Boolean | <- | True si al menos un elemento ha superado la prueba con éxito |
+
+
+
+#### Descripción
+
+La función `.some()` devuelve true si al menos un elemento de la colección ha pasado con éxito una prueba implementada en el código *formula* o *methodName* suministrado.
+
+Se designa el código 4D de retrollamada (callback) a ejecutar para evaluar los elementos de la colección utilizando:
+
+- *formula* (sintaxis recomendada), un [objeto Fórmula](FunctionClass.md) que puede encapsular toda expresión ejecutable, incluyendo funciones y métodos proyecto;
+- o *methodName*, el nombre de un método proyecto (texto).
+
+La retrollamada se llama con los parámetros pasados en *param* (opcional). La retrollamada puede efecturar toda prueba, con o sin los parámetros, y debe devolver *true* para cada elemento que cumpla la prueba. Recibe un `Object` en el primer parámetro ($1).
+
+La retrollamada recibe los siguientes parámetros:
+
+- en *$1.value*: valor del elemento a procesar
+- en *$2: param*
+- en *$N...*: *paramN...*
+
+Puede definir los siguientes parámetros:
+
+- Expresión a buscar en la colección
+- *$1.stop* (boolean, opcional): **true** para detener la retrollamada del método. El valor devuelto es el último calculado.
+
+En todo caso, en el momento en que la función `.some()` encuentra el primer elemento de la colección que devuelve true, deja de llamar a la llamada de retorno y devuelve **true**.
+
+Por defecto, `.some()` comprueba toda la colección. Opcionalmente, puede pasar el índice de un elemento desde el cual iniciar la prueba en *startFrom*.
+
+- Tipo
+
+- Añadidos
+
+- Si *startFrom* = 0, se busca en toda la colección (por defecto).
+
+#### Ejemplo
+
+Soporte de fórmula
+
+```4d
+ var $c : Collection
+ var $b : Boolean
+ $c:=New collection
+ $c.push(-5;-3;-1;-4;-6;-2)
+ $b:=$c.some(Formula($1.value>0)) // $b=false
+ $c.push(1)
+ $b:=$c.some(Formula($1.value>0)) // $b=true
+
+ $c:=New collection
+ $c.push(1;-5;-3;-1;-4;-6;-2)
+ $b:=$c.some(Formula($1.value>0)) //$b=true
+ $b:=$c.some(1;Formula($1.value>0)) //$b=false
+```
+
+
+
+
+
+## .sort()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------ |
+| 19 R6 | Soporte de fórmula |
+| v16 R6 | Añadidos |
+
+
+
+**.sort**() : Collection **.sort**( *ascOrDesc* : Integer ) : Collection **.sort**( *formula* : 4D.Function { ; *...extraParam* : any } ) : Collection **.sort**( *methodName* : Text { ; *...extraParam* : any } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------------------------- | :-------------------------: | --------------------- |
+| ascOrDesc | Integer | -> | Ejemplo 1 |
+| formula | 4D.Function | -> | Objeto fórmula |
+| methodName | Text | -> | Nombre de un método |
+| extraParam | any | -> | Parámetros del método |
+| Resultado | Collection | <- | La nueva colección |
+
+
+
+#### Descripción
+
+La función `.sort()` ordena los elementos de la colección original y además devuelve la colección ordenada.
+
+> Esta función modifica la colección original.
+
+Si se llama a `.sort()` sin parámetros, sólo se ordenan los valores escalares (número, texto, fecha, booleanos). Los elementos se ordenan por defecto de forma ascendente, según su tipo.
+You can also pass one of the following constants in the *ascOrDesc* parameter:
+
+ ```
+ |Constant| Type|Value|Comment|
+ |---|---|---|---|
+ |ck ascending|Integer|0|Elements are ordered in ascending order (default)|
+ |ck descending|Integer|1|Elements are ordered in descending order|
+
+ This syntax orders scalar values in the collection only (other element types such as objects or collections are returned unordered).
+ ```
+
+Si la colección contiene elementos de diferentes tipos, se agrupan primero por tipo y se ordenan después. Si attributePath lleva a una propiedad de objeto que contiene valores de diferentes tipos, primero se agrupan por tipo y se ordenan después.
+
+1. null
+2. booleans
+3. cadenas
+4. numbers
+5. objects
+6. collections
+7. dates
+
+Si quiere ordenar los elementos de la colección en algún otro orden o ordenar cualquier tipo de elemento, debe suministrar en *formula* ([objeto Formula](FunctionClass.md)) o *methodName* (Text) una retro llamada que define el orden de clasificación. El valor de retorno debe ser un booleano que indica el orden relativo de los dos elementos: **True** si *$1.value* es menor que *$1.value2*, **False** si *$1.value* es mayor que *$1.value2*. Puede ofrecer parámetros adicionales a la retrollamada si es necesario.
+
+La retrollamada recibe los siguientes parámetros:
+
+- $1 (objeto), donde:
+ - *$1.value* (todo tipo): valor del primer elemento a comparar
+ - *$1.value2* (todo tipo): valor del segundo elemento a comparar
+- $2...$N (cualquier tipo): parámetros adicionales
+
+Resultado
+
+- Elemento a insertar en la colección
+
+#### Ejemplo 1
+
+```4d
+ var $col; $col2 : Collection
+ $col:=New collection("Tom";5;"Mary";3;"Henry";1;"Jane";4;"Artie";6;"Chip";2)
+ $col2:=$col.sort() // $col2=["Artie","Chip","Henry","Jane","Mary","Tom",1,2,3,4,5,6]
+ // $col=["Artie","Chip","Henry","Jane","Mary","Tom",1,2,3,4,5,6]
+```
+
+#### Ejemplo 2
+
+```4d
+ var $col; $col2 : Collection
+ $col:=New collection(10;20)
+ $col2:=$col.push(5;3;1;4;6;2).sort() //$col2=[1,2,3,4,5,6,10,20]
+```
+
+#### Ejemplo 3
+
+```4d
+var $col; $col2; $col3 : Collection
+$col:=New collection(33;4;66;1111;222)
+$col2:=$col.sort() //numerical sort: [4,33,66,222,1111]
+$col3:=$col.sort(Formula(String($1.value)
+
+
+
+## .sum()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.sum**( { *propertyPath* : Text } ) : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ---- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| propertyPath | Text | -> | Ruta de la propiedad del objeto que se utilizará para el cálculo |
+| Resultado | Real | <- | `.pop()`, utilizado junto con [`.push()`](#push), puede utilizarse para implementar una funcionalidad primera entrada última salida de tratamiento de datos apilados: |
+
+
+
+#### Descripción
+
+La función `.sum()` devuelve la suma de todos los valores de la instancia de la colección.
+
+Para el cálculo sólo se tienen en cuenta los elementos numéricos (se ignoran otros tipos de elementos).
+
+Si la colección contiene objetos, pasa el parámetro *propertyPath* para indicar la propiedad del objeto a tener en cuenta.
+
+`.sum()` devuelve 0 si:
+
+- la colección está vacía,
+- la colección no contiene elementos numéricos,
+- *propertyPath* no se encuentra en la colección.
+
+#### Ejemplo 1
+
+```4d
+ var $col : Collection
+ var $vSum : Real
+ $col:=New collection(10;20;"Monday";True;2)
+ $vSum:=$col.sum() //32
+```
+
+#### Ejemplo 2
+
+```4d
+ var $col : Collection
+ var $vSum : Real
+ $col:=New collection
+ $col.push(New object("name";"Smith";"salary";10000))
+ $col.push(New object("name";"Wesson";"salary";50000))
+ $col.push(New object("name";"Gross";"salary";10500,5))
+ $vSum:=$col.sum("salary") //$vSum=70500,5
+```
+
+
+
+
+
+## .unshift()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| v16 R6 | Añadidos |
+
+
+
+**.unshift**( *value* : any { ;...*valueN* : any } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | -------------------------------------- | :-------------------------: | -------------------------------------------------------------------- |
+| value | Text, Number, Object, Collection, Date | -> | Valor(es) a insertar al principio de la colección |
+| Resultado | Collection | <- | Colección que contiene los elementos añadidos |
+| | | | |
+
+
+
+#### Descripción
+
+La función `.unshift()` inserta el *valor*(es) dado al principio de la colección y devuelve la colección modificada.
+
+> Esta función modifica la colección original.
+
+Si se pasan varios valores, se insertan todos a la vez, lo que significa que aparecen en la colección resultante en el mismo orden que en la lista de argumentos.
+
+#### Ejemplo
+
+```4d
+ var $c : Collection
+ $c:=New collection(1;2)
+ $c.unshift(4) // $c=[4,1,2]
+ $c.unshift(5) //$c=[5,4,1,2]
+ $c.unshift(6;7) // $c=[6,7,5,4,1,2]
+```
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/CryptoKeyClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/CryptoKeyClass.md
new file mode 100644
index 00000000000000..c653dc8dc6987d
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/CryptoKeyClass.md
@@ -0,0 +1,451 @@
+---
+id: CryptoKeyClass
+title: CryptoKey
+---
+
+La clase `CryptoKey` del lenguaje 4D encapsula un par de llaves de cifrado asimétrico.
+
+Esta clase está disponible en el "class store" de `4D`.
+
+:::info Ver también
+
+Para obtener una visión general de esta clase, consulte la entrada del blog [**CryptoKey: cifrar, descifrar, firmar y verificar**](https://blog.4d.com/cryptokey-encrypt-decrypt-sign-and-verify/).
+
+:::
+
+### Resumen
+
+| |
+| ---------------------------------------------------------------------------------------------------------------------------- |
+| [](#4dcryptokeynew) |
+| [](#curve) |
+| [](#decrypt) |
+| [](#encrypt) |
+| [](#getprivatekey) |
+| [](#getpublickey) |
+| [](#pem) |
+| [](#sign) |
+| [](#size) |
+| [](#type) |
+| [](#verify) |
+
+## 4D.CryptoKey.new()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**4D.CryptoKey.new**( *settings* : Object ) : 4D.CryptoKey
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------- | --------------------------- | ------------------------------------------------- |
+| settings | Object | -> | Parámetros para generar o cargar un par de llaves |
+| Resultado | 4D.CryptoKey | <- | Objeto que encapsula un par de llaves de cifrado |
+
+
+
+La función `4D.CryptoKey.new()` crea un nuevo objeto `4D.CryptoKey` que encapsula un par de llaves de cifrado, en función del parámetro *settings*. It allows to generate a new RSA or ECDSA key, or to load an existing key pair from a PEM definition.
+
+#### *settings*
+
+| Propiedad | Tipo | Descripción |
+| --------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type) | text | Defines the type of the key to create:
"RSA": generates a RSA key pair, using [.size](#size) as size.
"ECDSA": generates an Elliptic Curve Digital Signature Algorithm key pair, using [.curve](#curve) as curve. Note that ECDSA keys cannot be used for encryption but only for signature.
"PEM": loads a key pair definition in PEM format, using [.pem](#pem).
|
+| [curve](#curve) | text | Nombre de la curva ECDSA |
+| [pem](#pem) | text | Definición PEM de una llave de cifrado a cargar |
+| [size](#size) | integer | Tamaño de la llave RSA en bits |
+
+#### *CryptoKey*
+
+El objeto `CryptoKey` devuelto encapsula un par de llaves de cifrado. It is a shared object and can therefore be used by multiple 4D processes simultaneously.
+
+#### Ejemplo 1
+
+Un mensaje está firmado por una llave privada y la firma es verificada por la llave pública correspondiente. El siguiente código firma y verifica una firma de mensaje simple.
+
+- Lado bob:
+
+```4d
+// Crear el mensaje
+$message:="hello world"
+Folder(fk desktop folder).file("message.txt").setText($message)
+
+// Crear una clave
+$type:=New object("type";"RSA")
+$key:=4D.CryptoKey.new($type)
+
+// Obtener la llave pública y guardarla
+Folder(fk desktop folder).file("public.pem").setText($key.getPublicKey())
+
+// Obtener firma como base64 y guardarla
+Folder(fk desktop folder).file("signature").setText($key.sign($message;$type))
+
+/*Bob envía el mensaje, la llave pública y la firma a Alice*/
+```
+
+- Lado Alice:
+
+```4d
+// Obtener mensaje, llave pública y firma
+$message:=Folder(fk desktop folder).file("message.txt").getText()
+$publicKey:=Folder(fk desktop folder).file("public.pem").getText()
+$signature:=Folder(fk desktop folder).file("signature"). etText()
+
+// Crear una llave
+$type:=New object("type";"PEM";"pem";$publicKey)
+$key:=4D.CryptoKey.new($type)
+
+// Verificar la firma
+If ($key.verify($message;$signature;$type).success)
+// La firma es válida
+
+End if
+```
+
+#### Ejemplo 2
+
+El siguiente código de ejemplo firma y verifica un mensaje utilizando un nuevo par de llaves ECDSA, por ejemplo para hacer un token web JSON ES256.
+
+```4d
+ // Generar un nuevo par de llaves ECDSA
+$key:=4D.CryptoKey.new(New object("type";"ECDSA";"curve";"prime256v1"))
+
+ // Obtener la firma como base64
+$message:="hello world"
+$signature:=$key.sign($message;New object("hash";"SHA256"))
+
+ // Verificar firma
+$status:=$key.verify($message;$signature;New object("hash";"SHA256"))
+ASSERT($status.success)
+```
+
+
+
+## .curve
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.curve** : Text
+
+Definido sólo para las llaves ECDSA: el nombre de la curva normalizada de la llave. .
+
+
+
+
+
+## .decrypt()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.decrypt**( *message* : Text ; *options* : Object ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | --------------------------- | ----------------------------------------------------------------------------------------------------------- |
+| message | Text | -> | Cadena mensaje que se descodificará utilizando `options.encodingEncrypted` y se descifrará. |
+| options | Object | -> | Opciones de decodificación |
+| Resultado | Object | <- | Estado |
+
+
+
+La función `.decrypt()` descifra el parámetro *message* utilizando la llave **privada**. El algoritmo utilizado depende del tipo de la llave.
+
+La llave debe ser una llave RSA, el algoritmo es RSA-OAEP (ver [RFC 3447](https://tools.ietf.org/html/rfc3447)).
+
+#### *options*
+
+| Propiedad | Tipo | Descripción |
+| ----------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". |
+| encodingEncrypted | text | Codificación utilizada para convertir el parámetro `message` en la representación binaria a descifrar. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
+| encodingDecrypted | text | Codificación utilizada para convertir el mensaje binario descifrado en la cadena de resultados. Puede ser "UTF-8", "Base64", o "Base64URL". Por defecto es "UTF-8". |
+
+#### *Resultado*
+
+La función devuelve un objeto status con la propiedad `success` definida en `true` si el *message* pudo ser desencriptado con éxito.
+
+| Propiedad | Tipo | Descripción |
+| --------- | ---------- | ------------------------------------------------------------------------ |
+| success | boolean | True si el mensaje ha sido descifrado con éxito |
+| resultado | text | Mensaje descifrado y decodificado utilizando `options.encodingDecrypted` |
+| errors | collection | Si `success` es `false`, puede contener una colección de errores |
+
+En caso de que *message* no haya podido ser descifrado por no haber sido cifrado con la misma clave o algoritmo, el objeto `status` devuelto contiene una colección de errores en `status.errors`.
+
+
+
+
+
+## .encrypt()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.encrypt**( *message* : Text ; *options* : Object ) : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | --------------------------- | ----------------------------------------------------------------------------------------------- |
+| message | Text | -> | Cadena mensaje a codificar utilizando `options.encodingDecrypted` y encriptada. |
+| options | Object | -> | Opciones de codificación |
+| Resultado | Text | <- | Mensaje encriptado y codificado utilizando la opción `options.encodingEncrypted` |
+
+
+
+La función `.encrypt()` cifra el parámetro *message* utilizando la llave **pública**. El algoritmo utilizado depende del tipo de la llave.
+
+La llave debe ser una llave RSA, el algoritmo es RSA-OAEP (ver [RFC 3447](https://tools.ietf.org/html/rfc3447)).
+
+##### *options*
+
+| Propiedad | Tipo | Descripción |
+| ----------------- | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". |
+| encodingEncrypted | text | Codificación utilizada para convertir el mensaje binario encriptado en la cadena de resultados. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
+| encodingDecrypted | text | Codificación utilizada para convertir el parámetro `message` en la representación binaria a cifrar. Puede ser "UTF-8", "Base64", o "Base64URL". Por defecto es "UTF-8". |
+
+#### *Resultado*
+
+El valor devuelto es un mensaje encriptado.
+
+
+
+
+
+## .getPrivateKey()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.getPrivateKey()** : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | --------------------------- | ---------------------------- |
+| Resultado | Text | <- | Llave privada en formato PEM |
+
+
+
+La función `.getPrivateKey()` devuelve la llave privada del objeto `CryptoKey` en formato PEM, o una cadena vacía si no está disponible.
+
+#### *Resultado*
+
+El valor devuelto es la llave privada.
+
+
+
+
+
+## .getPublicKey()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.getPublicKey**() : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | --------------------------- | ---------------------------- |
+| Resultado | Text | <- | Llave pública en formato PEM |
+
+
+
+La función `.getPublicKey()` devuelve la llave pública del objeto `CryptoKey` en formato PEM, o una cadena vacía si no hay ninguna disponible.
+
+#### *Resultado*
+
+El valor devuelto es la llave pública.
+
+
+
+---
+
+
+
+## .pem
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.pem** : Text
+
+Definición PEM de una llave de cifrado a cargar. Si la llave es una llave privada, se deducirá de ella la llave pública RSA o ECDSA.
+
+
+
+
+
+## .sign()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------- |
+| 20 R8 | Soporte de mensajes como Blob |
+| 18 R4 | Añadidos |
+
+
+
+.**sign** (*message* : Text ; *options* : Object) : Text .**sign** (*message* : Blob ; *options* : Object) : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------ | --------------------------- | --------------------------------------------------------------------- |
+| message | Texto O Blob | -> | Mensaje a firmar |
+| options | Object | -> | Opciones de firma |
+| Resultado | Text | <- | Firma en representación Base64 o Base64URL, según la opción "encoding |
+
+
+
+La función `.sign()` firma la representación utf8 de una cadena *message* o Blob utilizando las llaves del objeto `CryptoKey` y las *options* suministradas. Devuelve su firma en formato base64 o base64URL, dependiendo del valor del atributo `options.encoding` que le haya pasado.
+
+La `CryptoKey` debe contener una llave **privada** válida.
+
+#### *options*
+
+| Propiedad | Tipo | Descripción |
+| ----------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". Cuando se utiliza para producir un JWT, el tamaño del hash debe coincidir con el tamaño del algoritmo PS@, ES@, RS@ o PS@ |
+| encodingEncrypted | text | Codificación utilizada para convertir el mensaje binario encriptado en la cadena de resultados. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
+| pss | boolean | Utilice el Probabilistic Signature Scheme (PSS). Se ignora si la llave no es una llave RSA. Pase `true` al producir un JWT para el algoritmo PS@ |
+| encoding | text | Representation of provided signature. Possible values are "Base64" or "Base64URL". Por defecto es "Base64". |
+
+#### *Resultado*
+
+La representación utf8 de *message*.
+
+
+
+
+
+## .size
+
+
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.size** : Integer
+
+Definido sólo para llaves RSA: el tamaño de la llave en bits. .
+
+
+
+## .type
+
+
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.type** : Text
+
+Contiene el nombre del tipo de llave - "RSA", "ECDSA", "PEM" .
+
+- "RSA": un par de llaves RSA, utilizando `settings.size` como [.size](#size).
+- "ECDSA": un par de llaves Elliptic Curve Digital Signature Algorithm, utilizando `settings.curve` como [.curve](#curve). Tenga en cuenta que las llaves ECDSA no pueden utilizarse para el cifrado, sino sólo para la firma.
+- "PEM": definición de par de llaves en formato PEM, utilizando `settings.pem` como [.pem](#pem).
+
+
+
+## .verify()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------- |
+| 20 R8 | Soporte de mensajes como Blob |
+| 18 R4 | Añadidos |
+
+
+
+**.verify**( *message* : Text ; *signature* : Text ; *options* : Object) : Object *.verify**( *message* : Blob ; *signature* : Text ; *options* : Object) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------ | --------------------------- | --------------------------------------------------------------------------------------------- |
+| message | Texto O Blob | -> | Mensaje utilizado para producir la firma |
+| signature | Text | -> | Firma a verificar, en representación Base64 o Base64URL, según el valor de `options.encoding` |
+| options | Object | -> | Opciones de firma |
+| Resultado | Object | <- | Estado de la verificación |
+
+
+
+La función `.verify()` verifica la firma base64 contra la representación utf8 del *message* usando las llaves del objeto `CryptoKey` y las *options* suministradas.
+
+La `CryptoKey` debe contener una llave **pública** válida.
+
+#### *options*
+
+| Propiedad | Tipo | Descripción |
+| --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| hash | text | Algoritmo Digest a utilizar. Por ejemplo: "SHA256", "SHA384" o "SHA512". Cuando se utiliza para producir un JWT, el tamaño del hash debe coincidir con el tamaño del algoritmo PS@, ES@, RS@ o PS@ |
+| pss | boolean | Utilice el Probabilistic Signature Scheme (PSS). Se ignora si la llave no es una llave RSA. Pase `true` al verificar un JWT para el algoritmo PS@ |
+| encoding | text | Codificación utilizada para convertir el mensaje binario encriptado en la cadena de resultados. Puede ser "Base64", o "Base64URL". Por defecto es "Base64". |
+
+#### *Resultado*
+
+La función devuelve un objeto de estado con la propiedad `success` en `true` si `message` ha podido ser verificado con éxito (es decir, la firma coincide).
+
+En caso de que la firma no se haya podido verificar porque no se ha firmado con el mismo *message*, llave o algoritmo, el objeto `status` que se devuelve contiene una colección de errores en `status.errors`.
+
+| Propiedad | Tipo | Descripción |
+| --------- | ---------- | ---------------------------------------------------------------- |
+| success | boolean | True si la firma coincide con el mensaje |
+| errors | collection | Si `success` es `false`, puede contener una colección de errores |
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataClassAttributeClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/DataClassAttributeClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/DataClassAttributeClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/DataClassAttributeClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/DataClassClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/DataClassClass.md
new file mode 100644
index 00000000000000..53054ee02534df
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/DataClassClass.md
@@ -0,0 +1,1677 @@
+---
+id: DataClassClass
+title: DataClass
+---
+
+Una [DataClass](ORDA/dsMapping.md#dataclass) ofrece un objeto de interfaz a una tabla de la base de datos. Todas las dataclasses de una aplicación 4D están disponibles como propiedad del [datastore](ORDA/dsMapping.md#datastore) `ds`.
+
+### Resumen
+
+| |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#attributename) |
+| [](#all) |
+| [](#clearremotecache) |
+| [](#fromcollection) |
+| [](#get) |
+| [](#getcount) |
+| [](#getdatastore) |
+| [](#getinfo) |
+| [](#getremotecache) |
+| [](#new) |
+| [](#newselection) |
+| [](#query) |
+| [](#setremotecachesettings) |
+
+
+
+## .*attributeName*
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------------- |
+| 19 R3 | Añadido el atributo .exposed |
+| 17 | Añadidos |
+
+
+
+***.attributeName*** : object
+
+#### Descripción
+
+Los atributos de las clases de datos sonobjetos que están disponibles directamente como propiedades de estas clases.
+
+Los objetos devueltos tienen propiedades que puede leer para obtener información sobre los atributos de su clase de datos.
+
+> Los objetos del atributo Dataclass pueden ser modificados, pero la estructura subyacente de la base de datos no será alterada.
+
+#### Objeto devuelto
+
+Los objetos de atributo devueltos contienen las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ---------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| autoFilled | Boolean | True si el valor del atributo es rellenado automáticamente por 4D. Corresponde a las siguientes propiedades de campo 4D: "Autoincremento" para campos de tipo numérico y "Auto UUID" para campos UUID (alfa). No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
+| exposed | Boolean | True si el atributo está expuesto en REST |
+| fieldNumber | integer | Número de campo 4D interno del atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
+| fieldType | Integer | Tipo de campo de base de datos 4D del atributo. Depende del atributo `kind`. Valores posibles:
si `.kind` = "storage": tipo de campo 4D correspondiente, ver [`Value type`](../commands-legacy/value-type.md)
si `.kind` = "relatedEntity": 38 (`is object`)
si `.kind` = "relatedEntities": 42 (`is collection`)
si `.kind` = "calculated" o "alias" = igual que arriba, dependiendo del valor resultante (tipo de campo, relatedEntity o relatedEntities)
|
+| indexed | Boolean | True si hay un índice B-tree o Cluster B-tree en el atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
+| inverseName | Text | Nombre del atributo que se encuentra al otro lado de la relación. Sólo se devuelve cuando `.kind` = "relatedEntity" o "relatedEntities". |
+| keywordIndexed | Boolean | True si existe un índice de palabras clave en el atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
+| kind | Text | Categoría del atributo. Valores posibles:
"storage": atributo de almacenamiento (o escalar), es decir, un atributo que almacena un valor, no una referencia a otro atributo
"calculated": atributo calculado, es decir, definido a través de una [`función get`](../ORDA/ordaClasses.md#function-get-attributename)
"alias": atributo construido sobre [otro atributo](../ORDA/ordaClasses.md#alias-attributes-1)
"relatedEntity": atributo de relación N -> 1 (referencia a una entidad)
"relatedEntities": atributo de relación 1 -> N (referencia a una selección de entidades)
|
+| mandatory | Boolean | True si se rechaza la entrada de valores null para el atributo. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". Nota: esta propiedad corresponde a la propiedad de campo "Rechazar entrada de valor NULL" a nivel de base de datos 4D. No tiene relación con la propiedad "Obligatorio" existente, que es una opción de control de entrada de datos para una tabla. |
+| name | Text | Nombre del atributo como cadena |
+| path | Text | Ruta de [un atributo alias](../ORDA/ordaClasses.md#alias-attributes-1) basada en una relación |
+| readOnly | Boolean | True si el atributo es de sólo lectura. Por ejemplo, los atributos calculados sin la [función `set`](../ORDA/ordaClasses.md#function-set-attributename) son de solo lectura. |
+| relatedDataClass | Text | Nombre del dataclass relacionado con el atributo. Sólo se devuelve cuando `.kind` = "relatedEntity" o "relatedEntities". |
+| type | Text | Tipo de valor conceptual del atributo, útil para la programación genérica. Depende del atributo `kind`. Valores posibles:
si `.kind` = "storage": "blob", "bool", "date", "image", "number", "object" o "string". "number" is returned for any numeric types including duration; "string" is returned for uuid, alpha and text attribute types; "blob" attributes are [blob objects](../Concepts/dt_blob.md#blob-types).
if `.kind` = "relatedEntity": related dataClass name
if `.kind` = "relatedEntities": related dataClass name + "Selection" suffix
if `.kind` = "calculated" or "alias": same as above, depending on the result
|
+| unique | Boolean | True si el valor del atributo debe ser único. No se devuelve si `.kind` = "relatedEntity" o "relatedEntities". |
+| classID | Text | Disponible sólo si `.type = "object"` y se ha especificado una clase en el editor de estructuras. Devuelve el nombre de la clase utilizada para instanciar el objeto. |
+
+:::tip
+
+Para programación genérica, utilice `Bool(attributeName.property)`, `Num(attributeName.property)` o `String(attributeName.property)` (dependiendo del tipo de propiedad) para obtener un valor válido incluso si la propiedad no se devuelve.
+
+:::
+
+#### Ejemplo 1
+
+```4d
+$salary:=ds.Employee.salary //devuelve el atributo salary en la clase de datos Employee
+$compCity:=ds.Company["city"] //devuelve el atributo city en la clase de datos Company
+```
+
+#### Ejemplo 2
+
+Considerando la siguiente estructura de la base:
+
+
+
+```4d
+var $firstnameAtt;$employerAtt;$employeesAtt : Object
+
+ $firstnameAtt:=ds.Employee.firstname
+ //{name:firstname,kind:storage,fieldType:0,type:string,fieldNumber:2,indexed:true,
+ //keyWordIndexed:false,autoFilled:false,mandatory:false,unique:false}
+
+ $employerAtt:=ds.Employee.employer
+ //{name:employer,kind:relatedEntity,relatedDataClass:Company,
+ //fieldType:38,type:Company,inverseName:employees}
+ //38=Is object
+
+ $employeesAtt:=ds.Company.employees
+ //{name:employees,kind:relatedEntities,relatedDataClass:Employee,
+ //fieldType:42,type:EmployeeSelection,inverseName:employer}
+ //42=Is collection
+```
+
+#### Ejemplo 3
+
+Considerando las propiedades de tabla siguientes:
+
+
+
+```4d
+ var $sequenceNumberAtt : Object
+ $sequenceNumberAtt=ds.Employee.sequenceNumber
+ //{name:sequenceNumber,kind:storage,fieldType:0,type:string,fieldNumber:13,
+ //indexed:true,keyWordIndexed:false,autoFilled:true,mandatory:false,unique:true}
+```
+
+
+
+## .all()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------- |
+| 17 R5 | Soporte del parámetro *settings* |
+| 17 | Añadidos |
+
+
+
+**.all** ( { *settings* : Object } ) : 4D.EntitySelection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------------- | :-------------------------: | ------------------------------------------------------------------------ |
+| settings | Object | -> | Opciones de construcción: context |
+| Resultado | 4D.EntitySelection | <- | Referencias sobre todas las entidades relacionadas con la clase de datos |
+
+
+
+#### Descripción
+
+La función `.all()` consulta el datastore para encontrar todas las entidades relacionadas con la dataclass y las devuelve como una selección de entidades.
+
+Las entidades se devuelven en el orden por defecto, que es inicialmente el orden en que fueron creadas. Tenga en cuenta, sin embargo, que si se han eliminado entidades y se han añadido otras nuevas, el orden por defecto ya no refleja el orden de creación.
+
+Si no se encuentra la entidad correspondiente, se devuelve una selección de entidades vacía.
+
+Se aplica carga diferida.
+
+**settings**
+
+En el parámetro opcional *settings* se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
+
+| Propiedad | Tipo | Descripción |
+| --------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| context | Text | Etiqueta para el contexto de optimización aplicado a la selección de entidades. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está [diseñada para el procesamiento cliente/servidor ORDA](../ORDA/client-server-optimization.md). |
+
+> Para conocer el número total de entidades de una dataclass, se recomienda utilizar la función [`getCount()`](#getcount) que está más optimizada que la expresión `ds.myClass.all().length`.
+
+#### Ejemplo
+
+```4d
+ var $allEmp : cs.EmployeeSelection
+ $allEmp:=ds.Employee.all()
+```
+
+## .clearRemoteCache()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.clearRemoteCache()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.clearRemoteCache()` vacía la caché ORDA de una dataclass.
+
+> Esta función no reinicializa los valores `timeout` y `maxEntries`.
+
+#### Ejemplo
+
+```4d
+var $ds : 4D.DataStoreImplementation
+var $persons : cs.PersonsSelection
+var $p : cs.PersonsEntity
+var $cache : Object
+var $info : Collection
+var $text : Text
+
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+$persons:=$ds.Persons.all()
+$text:=""
+For each ($p; $persons)
+ $text:=$p.firstname+" lives in "+$p.address.city+" / "
+End for each
+
+$cache:=$ds.Persons.getRemoteCache()
+
+$ds.Persons.clearRemoteCache()
+// Caché de la dataclass Persons = {timeout:30;maxEntries:30000;stamp:255;entries:[]}
+```
+
+#### Ver también
+
+[`entitySelection.refresh()`](EntitySelectionClass.md#refresh)
+
+
+
+## .fromCollection()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------- |
+| 17 R5 | Soporte del parámetro *settings* |
+| 17 | Añadidos |
+
+
+
+**.fromCollection**( *objectCol* : Collection { ; *settings* : Object } ) : 4D.EntitySelection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------------- | :-------------------------: | ------------------------------------------------- |
+| objectCol | Collection | -> | Colección de objetos a mapear con entidades |
+| settings | Object | -> | Opciones de construcción: context |
+| Resultado | 4D.EntitySelection | <- | Selección de entidades llenadas de la colección |
+
+
+
+#### Descripción
+
+La función `.fromCollection()` actualiza o crea entidades en la clase de datos según la colección de objetos *objectCol*, y devuelve la selección de entidades correspondiente.
+
+En el parámetro *objectCol*, pasa una colección de objetos para crear nuevas entidades o actualizar las existentes de la dataclass. Los nombres de las propiedades deben ser los mismos que los de los atributos de la clase de datos. Si un nombre de propiedad no existe en la clase de datos, se ignora. Si un valor de atributo no está definido en la colección, su valor es null.
+
+El mapeo entre los objetos de la colección y las entidades se realiza sobre los **nombres de atributos** y sus **tipos de datos**. Si la propiedad de un objeto tiene el mismo nombre que el atributo de una entidad pero sus tipos no coinciden, el atributo de la entidad no se llena.
+
+**Crear o actualizar modo**
+
+Para cada objeto de *objectCol*:
+
+- Si el objeto contiene una propiedad booleana "\__NEW" establecida en false (o no contiene una propiedad booleana "\__NEW"), la entidad se actualiza o se crea con los valores correspondientes de las propiedades del objeto. No se realiza ninguna comprobación con respecto a la llave primaria:
+ - Si la llave primaria se da y existe, la entidad se actualiza. En este caso, la llave primaria puede darse tal cual o con una propiedad "\_\_KEY" (llenada con el valor de la llave primaria).
+ - If the primary key is given (as is) and does not exist, the entity is created
+ - Si no se da la llave primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas estándar de la base de datos.
+- Si el objeto contiene una propiedad booleana "\_\_NEW" definida como **true**, la entidad se crea con los valores correspondientes de los atributos del objeto. Se realiza una verificación con respecto a la llave primaria:
+ - Si se da la llave primaria (tal cual) y existe, se envía un error
+ - If the primary key is given (as is) and does not exist, the entity is created
+ - Si no se da la primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas estándar de la base de datos.
+
+> La propiedad "\__KEY" que contiene un valor sólo se tiene en cuenta cuando la propiedad "\__NEW" tiene el valor **false** (o se omite) y existe una entidad correspondiente. The use of a \_\_KEY property allows independence from the primary key attribute name.
+
+**Entidades relacionadas**
+
+Los objetos de *objectCol* pueden contener uno o más objetos anidados que presentan una o más entidades relacionadas, lo que puede ser útil para crear o actualizar enlaces entre entidades.
+
+Los objetos anidados que presentan entidades relacionadas deben contener una propiedad "\_\*KEY" (llenada con el valor de la llave primaria de la entidad relacionada) o el atributo de llave primaria de la propia entidad relacionada. El uso de una propiedad \*\_KEY permite la independencia del nombre del atributo de la llave primaria.
+
+> El contenido de las entidades relacionadas no puede ser creado / actualizado a través de este mecanismo.
+
+**Stamp**
+
+Si se da un atributo \_\_STAMP, se realiza una comprobación con el sello en el almacén de datos y se puede devolver un error ("El sello dado no coincide con el actual para el registro# XX de la tabla XXXX"). Para obtener más información, consulte [Bloqueo de entidades](ORDA/entities.md#bloqueo-de-entidades).
+
+**settings**
+
+En el parámetro opcional *settings* se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
+
+| Propiedad | Tipo | Descripción |
+| --------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| context | Text | Etiqueta para el contexto de optimización aplicado a la selección de entidades. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está [diseñada para el procesamiento cliente/servidor ORDA](../ORDA/client-server-optimization.md). |
+
+#### Ejemplo 1
+
+Queremos actualizar una entidad existente. La propiedad \_\_NEW no se da, la llave primaria del empleado se da y existe:
+
+```4d
+ var $empsCollection : Collection
+ var $emp : Object
+ var $employees : cs.EmployeeSelection
+
+ $empsCollection:=New collection
+ $emp:=New object
+ $emp.ID:=668 //Existing PK in Employee table
+ $emp.firstName:="Arthur"
+ $emp.lastName:="Martin"
+ $emp.employer:=New object("ID";121) //PK existente en la dataClass relacionada Company
+ // Para este empleado, podemos cambiar la Empresa utilizando otro PK existente en la clase de datos relacionada Company
+ $empsCollection.push($emp)
+ $employees:=ds.Employee.fromCollection($empsCollection)
+```
+
+#### Ejemplo 2
+
+Queremos actualizar una entidad existente. La propiedad \_\*NEW no se da, la llave primaria del empleado está con el atributo \*\_KEY y existe:
+
+```4d
+ var $empsCollection : Collection
+ var $emp : Object
+ var $employees : cs.EmployeeSelection
+
+ $empsCollection:=New collection
+ $emp:=New object
+ $emp.__KEY:=1720 //PK existente en la tabla Employee
+ $emp.firstName:="John"
+ $emp.lastName:="Boorman"
+ $emp.employer:=New object("ID";121) // PK existente en la dataClass relacionada Company
+ // Para este empleado, podemos cambiar la Empresa utilizando otro PK existente en la dataClass relacionada Company
+ $empsCollection.push($emp)
+ $employees:=ds.Employee.fromCollection($empsCollection)
+```
+
+#### Ejemplo 3
+
+Queremos crear simplemente una nueva entidad a partir de una colección:
+
+```4d
+ var $empsCollection : Collection
+ var $emp : Object
+ var $employees : cs.EmployeeSelection
+
+ $empsCollection:=New collection
+ $emp:=New object
+ $emp.firstName:="Victor"
+ $emp.lastName:="Hugo"
+ $empsCollection.push($emp)
+ $employees:=ds.Employee.fromCollection($empsCollection)
+```
+
+#### Ejemplo 4
+
+Queremos crear una entidad. La propiedad \_\_NEW es True, la llave primaria del empleado no se da:
+
+```4d
+ var $empsCollection : Collection
+ var $emp : Object
+ var $employees : cs.EmployeeSelection
+
+ $empsCollection:=New collection
+ $emp:=New object
+ $emp.firstName:="Mary"
+ $emp.lastName:="Smith"
+ $emp.employer:=New object("__KEY";121) //PK existente en la dataClass Company
+ $emp.__NEW:=True
+ $empsCollection.push($emp)
+ $employees:=ds.Employee.fromCollection($empsCollection)
+
+
+
+
+
+
+```
+
+#### Ejemplo 5
+
+Queremos crear una entidad. La propiedad \_\_NEW se omite, la llave primaria del empleado se da y no existe:
+
+```4d
+ var $empsCollection : Collection
+ var $emp : Object
+ var $employees : cs.EmployeeSelection
+
+ $empsCollection:=New collection
+ $emp:=New object
+ $emp.ID:=10000 //Llave primaria inexistente
+ $emp.firstName:="Françoise"
+ $emp.lastName:="Sagan"
+ $empsCollection.push($emp)
+ $employees:=ds.Employee.fromCollection($empsCollection)
+```
+
+#### Ejemplo 6
+
+En este ejemplo, la primera entidad se creará y guardará pero la segunda fallará ya que ambas utilizan la misma llave primaria:
+
+```4d
+ var $empsCollection : Collection
+ var $emp; $emp2 : Object
+ var $employees : cs.EmployeeSelection
+
+ $empsCollection:=New collection
+ $emp:=New object
+ $emp.ID:=10001 // Llave primaria inexistente
+ $emp.firstName:="Simone"
+ $emp.lastName:="Martin"
+ $emp.__NEW:=True
+ $empsCollection.push($emp)
+
+ $emp2:=New object
+ $emp2.ID:=10001 // La misma llave primaria, ya existente
+ $emp2.firstName:="Marc"
+ $emp2.lastName:="Smith"
+ $emp2.__NEW:=True
+ $empsCollection.push($emp2)
+ $employees:=ds.Employee.fromCollection($empsCollection)
+ //se crea la primera entidad
+ //error de llave duplicada para la segunda entidad
+```
+
+#### Ver también
+
+[**.toCollection()**](EntitySelectionClass.md#tocollection)
+
+
+
+
+
+## .get()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.get**( *primaryKey* : Integer { ; *settings* : Object } ) : 4D.Entity **.get**( *primaryKey* : Text { ; *settings* : Object } ) : 4D.Entity
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | :-------------------------: | ---------------------------------------------------- |
+| primaryKey | Integer OR Text | -> | Valor de la llave primaria de la entidad a recuperar |
+| settings | Object | -> | Opciones de construcción: context |
+| Resultado | 4D.Entity | <- | Entidad que coincide con la llave primaria designada |
+
+
+
+#### Descripción
+
+La función `.get()` consulta la clase de datos para recuperar la entidad que coincide con el parámetro *primaryKey*.
+
+En *primaryKey*, pase el valor de la llave primaria de la entidad a recuperar. El tipo de valor debe coincidir con el tipo de la llave primaria definida en el almacén de datos (Entero o Texto). El tipo de valor debe coincidir con el tipo de la llave primaria definida en el almacén de datos (Entero o Texto).
+
+Si no se encuentra ninguna entidad con *primaryKey*, se devuelve una entidad **Null**.
+
+Se aplica la carga diferida, lo que significa que los datos relacionados se cargan desde el disco sólo cuando son necesarios.
+
+**settings**
+
+En el parámetro opcional *settings* se puede pasar un objeto que contenga opciones adicionales. Se soporta la siguiente propiedad:
+
+| Propiedad | Tipo | Descripción |
+| --------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| context | Text | Etiqueta para el contexto de optimización automática aplicado a la entidad. Este contexto será utilizado por el código siguiente que carga la entidad para que pueda beneficiarse de la optimización. Esta funcionalidad está [diseñada para el procesamiento cliente/servidor ORDA](../ORDA/client-server-optimization.md). |
+
+:::info
+
+Cuando se llama a la función `.get()` **sin** parámetro *settings*, se envía directamente al servidor una petición de valores de atributos (la [caché ORDA](../ORDA/client-server-optimization.md#orda-cache) no se utiliza). Por otro parte, cuando se llama a la función `.get()` **con** un `context` pasado en el parámetro *settings*, los valores de los atributos se recuperan de la caché ORDA correspondiente al contexto. En este caso, puede ser aconsejable llamar a [`reload()`](EntityClass.md#reload) para asegurarse de recuperar los datos más recientes del servidor.
+
+:::
+
+#### Ejemplo 1
+
+```4d
+ var $entity : cs.EmployeeEntity
+ var $entity2 : cs.InvoiceEntity
+ $entity:=ds.Employee.get(167) // devuelve la entidad cuyo valor de llave primaria es 167
+ $entity2:=ds.Invoice.get("DGGX20030") // devuelve la entidad cuyo valor de llave primaria es "DGGX20030"
+```
+
+#### Ejemplo 2
+
+Este ejemplo ilustra el uso de la propiedad *context*:
+
+```4d
+ var $e1; $e2; $e3; $e4 : cs.EmployeeEntity
+ var $settings; $settings2 : Object
+
+ $settings:=New object("context";"detail")
+ $settings2:=New object("context";"summary")
+
+ $e1:=ds.Employee.get(1;$settings)
+ completeAllData($e1) // En el método completeAllData, se lanza una optimización y se asocia al contexto "detail"
+
+ $e2:=ds.Employee.get(2;$settings)
+ completeAllData($e2) // En el método completeAllData, se aplica la optimización asociada al contexto "detail"
+
+ $e3:=ds.Employee.get(3;$settings2)
+ completeSummary($e3) //En el método completeSummary, se lanza una optimización y se asocia al contexto "summary"
+
+ $e4:=ds.Employee.get(4;$settings2)
+ completeSummary($e4) //En el método completeSummary se aplica la optimización asociada al contexto "summary"
+```
+
+
+
+
+
+## .getCount()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.getCount()** : Integer
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | --------------------------- | ----------------------------------- |
+| resultado | Integer | <- | Número de entidades en la dataclass |
+
+
+
+#### Descripción
+
+La función `.getCount()` devuelve el número de entidades de una clase de datos.
+
+Si se utiliza esta función dentro de una transacción, se tendrán en cuenta las entidades creadas durante la misma.
+
+#### Ejemplo
+
+```4d
+var $ds : 4D.DataStoreImplementation
+var $number : Integer
+
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+$number:=$ds.Persons.getCount()
+```
+
+
+
+
+
+## .getDataStore()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.getDataStore()** : cs.DataStore
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------- | :-------------------------: | ------------------------- |
+| Resultado | cs.DataStore | <- | Datastore de la dataclass |
+
+
+
+#### Descripción
+
+La función `.getDataStore()` devuelve el datastore para la clase de datos especificada.
+
+El almacén de datos puede ser:
+
+- el datastore principal, devuelto por el comando `ds`.
+- un datastore remoto, abierto utilizando el comando `Open datastore`.
+
+#### Ejemplo
+
+El método proyecto ***SearchDuplicate*** busca valores duplicados en cualquier clase de datos.
+
+```4d
+ var $pet : cs.CatsEntity
+
+ $pet:=ds.Cats.all().first() //obtener una entidad
+ SearchDuplicate($pet;"Dogs")
+```
+
+```4d
+ // método SearchDuplicate
+ // SearchDuplicate(entity_to_search;dataclass_name)
+
+ #DECLARE ($pet : Object ; $dataClassName : Text)
+ var $dataStore; $duplicates : Object
+
+ $dataStore:=$pet.getDataClass().getDataStore()
+ $duplicates:=$dataStore[$dataClassName].query("name=:1";$pet.name)
+```
+
+
+
+
+
+## .getInfo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ---------------------------------- |
+| 19 R3 | Se ha añadido la propiedad exposed |
+| 17 R5 | Añadidos |
+
+
+
+**.getInfo()** : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | --------------------------- | ----------------------------------- |
+| Resultado | Object | <- | Información sobre la clase de datos |
+
+
+
+#### Descripción
+
+La función `.getInfo()` devuelve un objeto que suministra información sobre la clase de datos. Esta función es útil para configurar el código genérico.
+
+**Objeto devuelto**
+
+| Propiedad | Tipo | Descripción |
+| ----------- | ------- | ------------------------------------------------ |
+| exposed | Boolean | True si la dataclass está expuesta en REST |
+| name | Text | Nombre de la dataclass |
+| primaryKey | Text | Nombre de la llave primaria de la clase de datos |
+| tableNumber | Integer | Número de la tabla 4D interna |
+
+#### Ejemplo 1
+
+```4d
+ #DECLARE ($entity : Object)
+ var $status : Object
+
+ computeEmployeeNumber($entity) //realizar algunas acciones en la entidad
+
+ $status:=$entity.save()
+ if($status.success)
+ ALERT("Record updated in table "+$entity.getDataClass().getInfo().name)
+ End if
+```
+
+#### Ejemplo 2
+
+```4d
+ var $settings : Object
+ var $es : cs.ClientsSelection
+
+ $settings:=New object
+ $settings.parameters:=New object("receivedIds";getIds())
+ $settings.attributes:=New object("pk";ds.Clients.getInfo().primaryKey)
+ $es:=ds.Clients.query(":pk in :receivedIds";$settings)
+```
+
+#### Ejemplo 3
+
+```4d
+ var $pk : Text
+ var $dataClassAttribute : Object
+
+ $pk:=ds.Employee.getInfo().primaryKey
+ $dataClassAttribute:=ds.Employee[$pk] // Si es necesario, el atributo que coincide con la llave primaria es accesible
+```
+
+
+
+## .getRemoteCache()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.getRemoteCache**() : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | --------------------------- | ----------------------------------------------------------------------------------------- |
+| resultado | Object | <- | Objeto que describe el contenido de la caché ORDA para la clase de datos. |
+
+
+
+> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
+
+#### Descripción
+
+La función `.getRemoteCache()` devuelve un objeto que contiene el contenido de la caché ORDA para una clase de datos.
+
+Llamar a esta función desde una aplicación monopuesto de 4D devuelve `Null`.
+
+El objeto devuelto tiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ---------- | ------------------------------------------------------------------------------------------------------ |
+| maxEntries | Integer | Número máximo de colecciones "entries". |
+| stamp | Integer | Marcador de la caché. |
+| timeout | Integer | Tiempo restante antes de que las nuevas entradas de la caché se marquen como vencidas. |
+| entries | Collection | Contiene un objeto de entrada para cada entidad en la caché. |
+
+Cada objeto entrada de la colección `entries` contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| --------- | ------- | ------------------------------------------------------------ |
+| data | Object | Objeto que contiene los datos de la entrada. |
+| expired | Boolean | True si la entrada ha expirado. |
+| key | Text | Llave primaria de la entidad. |
+
+El objeto `data` de cada entrada contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ----------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| __KEY | Text | Llave primaria de la entidad |
+| __STAMP | Integer | Stamp de la entidad en la base de datos |
+| __TIMESTAMP | Text | Timestamp de la entidad en la base de datos (el formato es YYYY-MM-DDTHH:MM:SS:ms:Z) |
+| dataClassAttributeName | Variant | Si hay datos en la caché para un atributo de dataclass, se devuelven en una propiedad con el mismo tipo que en la base de datos. |
+
+Los datos relativos a las entidades relacionadas se almacenan en la caché del objeto de datos.
+
+#### Ejemplo
+
+En el siguiente ejemplo, `$ds.Persons.all()` carga la primera entidad con todos sus atributos. A continuación, se activa el optimizado de la solicitud, de modo que sólo se cargan `firstname` y `address.city`.
+
+Tenga en cuenta que `address.city` se carga en la caché de la dataclass `Persons`.
+
+Sólo se almacena en la caché la primera entidad de la dataclass `Address`. Se carga durante la primera iteración del bucle.
+
+```4d
+var $ds : 4D.DataStoreImplementation
+var $persons : cs.PersonsSelection
+var $p : cs.PersonsEntity
+var $cachePersons; $cacheAddress : Object
+var $text : Text
+
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+$persons:=$ds.Persons.all()
+
+$text:=""
+For each ($p; $persons)
+ $text:=$p.firstname+" lives in "+$p.address.city+" / "
+End for each
+
+$cachePersons:=$ds.Persons.getRemoteCache()
+$cacheAddress:=$ds.Adress.getRemoteCache()
+```
+
+#### Ver también
+
+[.setRemoteCacheSettings()](#setremotecachesettings) [.clearRemoteCache()](#clearremotecache)
+
+
+
+## .new()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.new()** : 4D.Entity
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | --------------------------- | ------------------------------------------------ |
+| Resultado | 4D.Entity | <- | Nueva entidad que coincide con la clase de datos |
+
+
+
+#### Descripción
+
+La función `.new()` crea en memoria y devuelve una nueva entidad en blanco relacionada con la Dataclass.
+
+El objeto entidad se crea en memoria y no se guarda en la base de datos hasta que se llama a la función [`.save( )`](EntityClass.md#save). Si la entidad se borra antes de ser guardada, no se puede recuperar.
+
+**4D Server**: en cliente-servidor, si la llave primaria de la tabla correspondiente se autoincrementa, se calculará cuando la entidad se guarde en el servidor.
+
+Todos los atributos de la entidad se inicializan con el valor **null**.
+
+> Los atributos se pueden inicializar con valores por defecto si se selecciona la opción **Traducir los NULL a valores vacíos** al nivel de la estructura de la base 4D.
+
+#### Ejemplo
+
+Este ejemplo crea una nueva entidad en la clase de datos "Log" y registra la información en el atributo "info":
+
+```4d
+ var $entity : cs.LogEntity
+ $entity:=ds.Log.new() //crea una referencia
+ $entity.info:="New entry" //almacenar alguna información
+ $entity.save() //guardar la entidad
+```
+
+
+
+
+
+## .newSelection()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.newSelection**( { *keepOrder* : Integer } ) : 4D.EntitySelection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------------- | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| keepOrder | Integer | -> | `dk keep ordered`: crea una entity selection ordenada, `dk non ordered`: crea una entity selection no ordenada (por defecto si se omite) |
+| Resultado | 4D.EntitySelection | <- | Nueva selección de entidades en blanco relacionadas con la clase de datos |
+
+
+
+#### Descripción
+
+La función `.newSelection()` crea una nueva selección de entidades en blanco, no compartible, relacionada con la clase de datos, en memoria.
+
+> Para obtener información sobre las selecciones de entidades no compartibles, consulte [esta sección](ORDA/entities.md#shareable-or-alterable-entity-selections).
+
+Si desea crear una selección de entidades ordenada, pase el selector `dk keep ordered` en el parámetro *keepOrder*. Por defecto, si se omite este parámetro, o si se pasa el selector `dk non ordered`, el método crea una selección de entidades no ordenada. Las selecciones de entidades desordenadas son más rápidas pero no se puede confiar en las posiciones de las entidades. Las selecciones de entidades desordenadas son más rápidas pero no se puede confiar en las posiciones de las entidades.
+
+Cuando se crea, la selección de entidades no contiene ninguna entidad (`mySelection.length` devuelve 0). Este método permite construir gradualmente selecciones de entidades haciendo llamadas posteriores a la función [`add()`](EntitySelectionClass.md#add).
+
+#### Ejemplo
+
+```4d
+ var $USelection; $OSelection : cs.EmployeeSelection
+ $USelection:=ds.Employee.newSelection() //crea una selección de entidades vacía y desordenada
+ $OSelection:=ds.Employee.newSelection(dk keep ordered) //crea una selección de entidades vacía y ordenada
+```
+
+
+
+
+
+## .query()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------------------------------------ |
+| 21 | Soporte de los objetos 4D.Vector |
+| 17 R6 | Soporte de los parámetros Formula |
+| 17 R5 | Soporte de los marcadores para los valores |
+| 17 | Añadidos |
+
+
+
+**.query**( *queryString* : Text { ; *...value* : any } { ; *querySettings* : Object } ) : 4D.EntitySelection **.query**( *formula* : Object { ; *querySettings* : Object } ) : 4D.EntitySelection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------- | ---------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| queryString | Text | -> | Criterios de búsqueda como cadena |
+| formula | Object | -> | Criterios de búsqueda como objeto fórmula |
+| value | any | -> | Valor(es) a utilizar para los marcadores de posición indexados |
+| querySettings | Object | -> | Opciones de búsqueda: parameters, attributes, args, allowFormulas, context, queryPath, queryPlan |
+| Resultado | 4D.EntitySelection | <- | Nueva selección de entidades formada por las entidades de la clase de datos que cumplen los criterios de búsqueda especificados en *queryString* o *formula* |
+
+
+
+#### Descripción
+
+La función `.query()` busca las entidades que cumplan con los criterios de búsqueda especificados en *queryString* o *formula* y (opcionalmente) *value*(s), para todas las entidades de la dataclass, y devuelve un nuevo objeto de tipo `EntitySelection` que contiene todas las entidades encontradas. Se aplica carga diferida.
+
+Si no se encuentran entidades coincidentes, se devuelve una `EntitySelection` vacía.
+
+### parámetro queryString
+
+El parámetro *queryString* utiliza la siguiente sintaxis:
+
+```4d
+attributePath|formula comparator value
+ {logicalOperator attributePath|formula comparator value}
+ {order by attributePath {desc | asc}}
+```
+
+donde:
+
+- **attributePath**: ruta del atributo sobre el que se quiere ejecutar la búsqueda. Este parámetro puede ser un nombre simple (por ejemplo, "país") o cualquier ruta de atributo válida (por ejemplo, "país.nombre"). En el caso de una ruta de atributo cuyo tipo es `Collection`, se utiliza la notación `[]` para manejar todas las ocurrencias (por ejemplo `children[].age`).
+
+> \*No puede utilizar directamente atributos cuyo nombre contenga caracteres especiales como ".", "\[ ]", o "=", ">", "#"..., porque se evaluarán incorrectamente en la cadena de consulta. Si necesita consultar dichos atributos, debe considerar el uso de marcadores, que permiten un rango ampliado de caracteres en las rutas de los atributos (ver **Uso de marcadores de posición** *a continuación*)
+
+- **formula**: una fórmula válida pasada como `Text` u `Object`. La fórmula se evaluará para cada entidad procesada y debe devolver un valor booleano. Dentro de la fórmula, la entidad está disponible a través del objeto `This`.
+
+ - **Text**: la cadena de fórmulas debe ir precedida de la declaración `eval()`, para que el analizador de consultas evalúe la expresión correctamente. Por ejemplo: *"eval(length(This.lastname) >=30) "*
+ - **Objeto**: el [objeto fórmula](FunctionClass.md) se pasa como **placeholder** (ver más abajo). La fórmula debe haber sido creada utilizando el comando [`Formula`](../commands/formula.md) o [`Formula from string`](../commands/formula-from-string.md).
+
+> * Tenga en cuenta que las fórmulas 4D sólo admiten los símbolos `&` y `|` como operadores lógicos.
+> * Si la fórmula no es el único criterio de búsqueda, el optimizador del motor de búsquedas podría procesar previamente otros criterios (por ejemplo, los atributos indexados) y, por tanto, la fórmula podría evaluarse sólo para un subconjunto de entidades.
+
+Las fórmulas en las consultas pueden recibir parámetros a través de $1. Este punto se detalla en el párrafo **Parámetro fórmula** más abajo.
+
+> - También puede pasar directamente un objeto parámetro `formula` en lugar del parámetro `queryString` (recomendado cuando las fórmulas son más complejas). Vea el párrafo **Parámetros fórmula** abajo.
+> - Por razones de seguridad, las llamadas a fórmulas dentro de las funciones `query()` pueden ser desestimadas. Ver la descripción del parámetro `querySettings`.
+
+- **comparator**: símbolo que compara *attributePath* y *value*. Se soportan los siguientes símbolos:
+
+| Comparación | Símbolo(s) | Comentario | Soportado en similaridad vectorial |
+| ------------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
+| Igual a | =, == | Obtiene los datos coincidentes, admite el comodín (@), no distingue entre mayúsculas de minúsculas ni diacríticas. | |
+| | ===, IS | Obtiene los datos coincidentes, considera @ como carácter estándar, no distingue entre mayúsculas de minúsculas ni diacríticas | |
+| Diferente de | #, != | Soporta el comodín (@). Equivale a "Condición no aplicada en una sentencia" ([ver más abajo](#not-equal-to-in-collections)). | |
+| | !==, IS NOT | Considera la @ como un caracter estándar | |
+| Condición No aplicada a una sentencia | NOT | Los paréntesis son obligatorios cuando se utiliza NOT antes de una instrucción que contiene varios operadores. Equivalente a "Not equal to" ([ver abajo](#not-equal-to-in-collections)). | |
+| Menor que | < | | ✓ |
+| Mayor que | > | | ✓ |
+| Menor o igual que | <= | | ✓ |
+| Mayor o igual que | > = | | ✓ |
+| Incluído en | IN | Devuelve los datos iguales a al menos uno de los valores de una colección o de un conjunto de valores, admite el comodín (@) | |
+| Contiene palabra clave | % | Las palabras claves pueden utilizarse en atributos de tipo texto o imagen | |
+
+- Puede ser un **marcador de posición** (ver **Uso de marcadores de posición** más adelante) o cualquier expresión que coincida con la propiedad de tipo de datos. **value**: el valor a comparar con el valor actual de la propiedad de cada entidad en la selección de entidades. Por ejemplo, si se introduce la cadena "v20" como **value** para comparar con un atributo entero, se convertirá a 20. For example, if the string "v20" is entered as value to compare with an integer attribute, it will be converted to 20.
+ For example, if the string "v20" is entered as value to compare with an integer attribute, it will be converted to 20.
+ - La constante de tipo **texto** puede pasarse con o sin comillas simples (ver **Uso de comillas** más abajo). Para consultar una cadena dentro de otra cadena (una consulta de tipo "contiene"), utilice el símbolo de comodín (@) en el valor para aislar la cadena a buscar como se muestra en este ejemplo: "@Smith@". Las siguientes palabras claves están prohibidas para las constantes de texto: true, false.
+ - Valores constantes de tipo **booleano**: **true** o **false** (Sensible a las mayúsculas y minúsculas).
+ - Valores constantes de **tipo numérico**: los decimales se separan con un '.' (punto).
+ - Constantes de tipo **date**: formato "YYYY-MM-DD"
+ - Constantes **null**: utilizando la palabra clave "null" se encontrarán las propiedades **null** y **undefined**.
+ - en el caso de una búsqueda con un comparador IN, *value* debe ser una colección, o los valores que coincidan con el tipo de la ruta del atributo entre \[ ] separados por comas (para las cadenas, los caracteres `"` deben escaparse con `\`).
+ - **objeto**: sólo se admiten los objetos [4D.Vector](../API/VectorClass.md), en el contexto de **consultas de similaridad vectorial** (*attributePath* también debe contener objetos 4D.Vector válidos).
+- **logicalOperator**: utilizado para unir condiciones múltiples en la búsqueda (opcional). Puede utilizar uno de los siguientes operadores lógicos (se puede utilizar el nombre o el símbolo):
+
+| Conjunción | Símbolo(s) |
+| ---------- | ----------------------------------------------------------------------------------- |
+| AND | &, &&, and |
+| O | |,||, or |
+
+- **order by attributePath**: puede incluir una declaración order by *attributePath* en la consulta para que los datos resultantes se ordenen según esa declaración. Puede utilizar varias sentencias order by, separadas por comas (por ejemplo, order by *attributePath1* desc, *attributePath2* asc). Por defecto, el orden es ascendente. Pase 'desc' para definir un orden descendente y 'asc' para definir un orden ascendente.
+
+> Si utiliza esta instrucción, la selección de entidades devuelta estará ordenada (para más información, consulte [Selecciones de entidades ordenadas o desordenadas](ORDA/dsMapping.md#ordered-or-unordered-entity-selection)).
+
+### Utilizar comillas
+
+Cuando utilice comillas dentro de las consultas, debe utilizar comillas simples ' ' dentro de la consulta y comillas dobles " " para encerrar toda la consulta, de lo contrario se devuelve un error. Por ejemplo:
+
+```4d
+"employee.name = 'smith' AND employee.firstname = 'john'"
+```
+
+> Las comillas simples (') no se admiten en los valores buscados, ya que romperían la cadena de búsqueda. Por ejemplo, "comp.name = 'John's pizza' " generará un error. Si necesita buscar en valores con comillas simples, puede considerar el uso de marcadores de posición (ver más abajo).
+
+### Uso del paréntesis
+
+Puede utilizar paréntesis en la búsqueda para dar prioridad al cálculo. Por ejemplo, puede organizar una búsqueda de la siguiente manera:
+
+```4d
+"(employee.age >= 30 OR employee.age <= 65) AND (employee.salary <= 10000 OR employee.status = 'Manager')"
+```
+
+### Uso de marcadores de posición
+
+4D le permite utilizar marcadores de posición para los argumentos *attributePath*, *formula* y *value* en el parámetro *queryString*. Un marcador es un parámetro que se inserta en las cadenas de búsqueda y que se sustituye por otro valor cuando se evalúa la cadena de búsqueda. El valor de los marcadores se evalúa una vez al principio de la búsqueda; no se evalúa para cada elemento.
+
+Se pueden utilizar dos tipos de marcadores de posición: **marcadores de posición indexados** y **marcadores de posición con nombre**:
+
+| | Marcadores de posición indexados | Nombre del marcador de posición |
+| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Definición | Los parámetros se insertan como `:paramIndex` (por ejemplo :1, :2...) en *queryString* y sus valores correspondientes son proporcionados por la secuencia de parámetros *value*. Puede usar hasta 128 parámetros *value* | Los parámetros se insertan como: `:paramName` (por ejemplo :myparam) y sus valores se proporcionan en los atributos y/o objetos de parámetros en el parámetro *querySettings* |
+| Ejemplo | `$r:=class.query(":1=:2";"city";"Chicago")` | `$o.attributes:=New object("att";"city")` `$o.parameters:=New object("name";"Chicago")` `$r:=class.query(":att=:name";$o)` |
+
+Puede mezclar todos los tipos de argumentos en *queryString*. Una *queryString* puede contener, para los parámetros *attributePath*, *formula* y *value*:
+
+- valores directos (sin marcadores),
+- marcadores indexados y/o con nombre.
+
+El uso de marcadores de posición en las búsquedas **se recomienda** por las siguientes razones:
+
+1. Evita la inserción de código malicioso: si utiliza directamente variables completadas por el usuario dentro de la cadena de búsqueda, un usuario podría modificar las condiciones de búsqueda introduciendo argumentos de búsqueda adicionales. Por ejemplo, imagine una cadena de búsqueda como:
+
+ ```4d
+ $vquery:="status = 'public' & name = "+myname //el usuario introduce su nombre
+ $result:=$col.query($vquery)
+ ```
+
+Esta búsqueda parece segura ya que se filtran los datos no públicos. Sin embargo, si el usuario introduce en el área *myname* algo como *"smith OR status='private'*, la cadena de consulta se modificaría en el paso de interpretación y podría devolver datos privados.
+
+Cuando se utilizan marcadores de posición, no es posible anular las condiciones de seguridad:
+
+ ```4d
+ $result:=$col.query("status='public' & name=:1";myname)
+ ```
+
+En este caso, si el usuario introduce *smith OR status='private'* en el área *myname*, no se interpretará en la cadena de búsqueda, sino que sólo se pasará como valor. La búsqueda de una persona llamada "smith OR status='private'" simplemente fallará.
+
+2. Evita tener que preocuparse por cuestiones de formato o caracteres, especialmente cuando se manejan los parámetros *attributePath* o *value* que pueden contener caracteres no alfanuméricos como ".", "['...
+
+3. Permite el uso de variables o expresiones en los argumentos de búsqueda. Ejemplos:
+
+ ```4d
+ $result:=$col.query("address.city = :1 & name =:2";$city;$myVar+"@")
+ $result2:=$col.query("company.name = :1";"John's Pizzas")
+ ```
+
+### Búsqueda de valores null
+
+Cuando se buscan valores null, no se puede utilizar la sintaxis de marcador de posición porque el motor de búsqueda considera null como un valor de comparación invalido. Por ejemplo, si ejecuta la siguiente búsqueda:
+
+```4d
+$vSingles:=ds.Person.query("spouse = :1";Null) // NO funcionará
+```
+
+No obtendrá el resultado esperado porque el valor null será evaluado por 4D como un error resultante de la evaluación del parámetro (por ejemplo, un atributo procedente de otra búsqueda). Para este tipo de búsquedas, debe utilizar la sintaxis de búsqueda directa:
+
+```4d
+ $vSingles:=ds.Person.query("spouse = null") // Sintaxis correcta
+```
+
+### Diferente a valores null o undefined
+
+El comparador "no igual a *value*" (`#` o `!=`) no devuelve atributos cuyo valor es null o indefinido. Por ejemplo, la siguiente consulta solo devolverá personas cuyo estado "info.married" es `false` y no personas cuya propiedad "info.married" es "null" o falta:
+
+```4d
+$notMarried:=ds.Person.query("info.married#true") //encuentra personas con valor de atributo false
+```
+
+Si desea encontrar personas cuyo estado "info.married" es `false`, null, o indefinido, debe escribir:
+
+```4d
+$notMarried:=ds.Person.query("info.married#true | info.married=null") //encuentra atributos false, null e undefined
+```
+
+### No igual a en colecciones
+
+Al buscar dentro de atributos de objetos de dataclass que contengan las colecciones, el comparador "not equal to *value*" (`#` o `!=`) encontrará los elementos en los que TODAS las propiedades sean diferentes de *value* (y no aquellos en los que AL MENOS una propiedad sea diferente de *value*, que es como funcionan otros comparadores). Básicamente, equivale a buscar "Not(buscar elementos de la colección cuya propiedad sea igual a *value*"). Por ejemplo, con las siguientes entidades:
+
+```
+Entity 1:
+ds. Class.name: "A"
+ds.Class.info:
+ { "coll" : [ {
+ "val":1,
+ "val":1
+ } ] }
+
+Entity 2:
+ds. Class.name: "B"
+ds.Class.info:
+ { "coll" : [ {
+ "val":1,
+ "val":0
+ } ] }
+
+Entity 3:
+ds. Class.name: "C"
+ds.Class.info:
+ { "coll" : [ {
+ "val":0,
+ "val":0
+ } ] }
+```
+
+Considere los siguientes resultados:
+
+```4d
+ds.Class.query("info.coll[].val = :1";0)
+// devuelve B y C
+// encuentra "entidades con 0 en al menos una propiedad val"
+
+ds.Class.query("info.coll[].val != :1";0)
+// sólo devuelve A
+// encuentra "entidades en las que todas las propiedades val son distintas de 0"
+// lo que equivale a
+ds.Class.query(not("info.coll[].val = :1";0))
+```
+
+Si desea implementar una búsqueda que encuentre entidades en las que "al menos una propiedad sea diferente del *value*", deberá utilizar una notación especial utilizando una letra en el `[]`:
+
+```4d
+ds.Class.query("info.coll[a].val != :1";0)
+// devuelve A y B
+// encuentra "entidades donde al menos una propiedad val es diferente de 0"
+```
+
+Puede utilizar cualquier letra del alfabeto como notación `[a]`.
+
+#### Vinculación de los argumentos de búsqueda y los atributos de colección
+
+Para ello, es necesario vincular los argumentos de la búsqueda a los elementos de colección, de modo que sólo se encuentren los elementos únicos que contengan argumentos vinculados. Al buscar dentro de los atributos de objetos de clases de datos que contengan colecciones utilizando varios argumentos de consulta unidos por el operador AND, es posible que desee asegurarse de que sólo se devuelvan entidades que contengan elementos que coincidan con todos los argumentos, y no entidades en las que los argumentos puedan encontrarse en elementos diferentes.
+
+Por ejemplo, con las dos entidades siguientes:
+
+```
+Entity 1:
+ds. People.name: "martin"
+ds. People.places:
+ { "locations" : [ {
+ "kind":"home",
+ "city":"paris"
+ } ] }
+
+Entity 2:
+ds. People.name: "smith"
+ds. People.places:
+ { "locations" : [ {
+ "kind":"home",
+ "city":"lyon"
+ } , {
+ "kind":"office",
+ "city":"paris"
+ } ] }
+```
+
+Quiere encontrar personas con un tipo de ubicación "home" en la ciudad "paris". Si escribe:
+
+```4d
+ds.People.query("places.locations[].kind= :1 and places.locations[].city= :2";"home";"paris")
+```
+
+... la búsqueda devolverá "martin" **y** "smith" porque "smith" tiene un elemento "locations" cuyo "tipo" es "home" y un elemento "locations" cuya "ciudad" es "paris", aunque sean elementos diferentes.
+
+Si quiere obtener sólo las entidades en las que los argumentos correspondientes están en el mismo elemento de colección, necesita enlazar **los argumentos**. Para enlazar los argumentos de búsqueda:
+
+- Añada una letra entre los \[] en la primera ruta a enlazar y repita la misma letra en todos los argumentos enlazados. Por ejemplo: `locations[a].city y locations[a].kind`. Puede utilizar cualquier letra del alfabeto latino (no diferencia entre mayúsculas y minúsculas).
+- Para añadir diferentes criterios vinculados en la misma consulta, utilice otra letra. Puede crear hasta 26 combinaciones de criterios en una sola consulta.
+
+Con las entidades anteriores, si escribe:
+
+```4d
+ds.People.query("places.locations[a].kind= :1 and places.locations[a].city= :2";"home";"paris")
+```
+
+... la búsqueda sólo devolverá "martin" porque tiene un elemento "locations" cuyo "kind" es "home" y cuyo "city" es "paris". La búsqueda no devolverá "smith" porque los valores "home" y "paris" no están en el mismo elemento de colección.
+
+### Búsquedas en las relaciones Muchos a Muchos
+
+ORDA ofrece una sintaxis especial para facilitar las consultas en las relaciones de muchos a muchos. En este contexto, puede ser necesario buscar diferentes valores con un operador `AND` PERO en el mismo atributo. Por ejemplo, de una mirada a la siguiente estructura:
+
+
+
+Imagine que quiere buscar todas las películas en las que un actor A *y* un actor B tienen un papel. Si escribe una búsqueda simple utilizando un operador `AND`, no funcionará:
+
+```4d
+// código inválido
+$es:=ds.Movie.query("roles.actor.lastName = :1 AND roles.actor.lastName = :2";"Hanks";"Ryan")
+// $es está vacía
+```
+
+Básicamente, el problema está relacionado con la lógica interna de la búsqueda: no se puede buscar un atributo cuyo valor sea tanto "A" como "B".
+
+Para poder realizar este tipo de consultas, ORDA permite una sintaxis especial: basta con añadir un *índice de clase* entre **{}** en todos los atributos de relación adicionales utilizados en la cadena de búsqueda:
+
+```4d
+"relationAttribute.attribute = :1 AND relationAttribute{x}.attribute = :2 [AND relationAttribute{y}.attribute...]"
+```
+
+**{x}** indica a ORDA que cree otra referencia para el atributo relacional. A continuación, realizará todas las operaciones de mapa de bits internas necesarias. Tenga en cuenta que **x** puede ser cualquier número **excepto 0**: {1}, o {2}, o {1540}... ORDA sólo necesita una referencia única en la búsqueda para cada clase índice.
+
+En nuestro ejemplo, sería:
+
+```4d
+// código válido
+$es:=ds.Movie.query("roles.actor.lastName = :1 AND roles.actor{2}.lastName = :2";"Hanks";"Ryan")
+// $es contient des films (You've Got Mail, Sleepless in Seattle, Joe Versus the Volcano)
+```
+
+### Búsqueda por similaridad vectorial
+
+Si *attributePath* designa un atributo que almacena [**objetos vectores**](../API/VectorClass.md) (ver cómo [configurar un campo 4D para almacenar objetos de clase 4D.Vector](../Develop/field-properties.md#class)), puede construir consultas para encontrar entidades basadas en **embeddings** en lugar de palabras clave. Esta tecnología está diseñada para cargas de trabajo de Inteligencia Artificial (IA) y permite consultar datos basándose en la semántica, en lugar de en palabras clave.
+
+En este caso, el parámetro *value* debe ser un **objeto vectorial de comparación** que contenga las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| --------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| vector | [4D.Vector](../API/VectorClass.md) | Obligatorio. El vector a comparar |
+| metric | Text | Opcional. [Cálculo vectorial](../API/VectorClass.md#understanding-the-different-vector-computations) a utilizar para la consulta. You can use one of the following (Text) constants:
`mk cosine` (default if omitted): calculates the cosine distance between vectors.
`mk dot`: calculates the dot similarity of vectors.
`mk euclidean`: calculates the Euclidean distance between vectors. |
+| threshold | Real | Opcional (por defecto: 0,5). Un valor umbral utilizado para filtrar las comparaciones de vectores en función de su puntuación de similitud coseno, punto o euclídea según la "métrica" seleccionada. Es altamente recomendable elegir una similitud que se adapte mejor a su caso de uso específico para obtener resultados óptimos. |
+
+Sólo se admite un subconjunto de símbolos **comparadores**. Tenga en cuenta que comparan los resultados con el valor umbral:
+
+| Comparación | Símbolo(s) | Comentario |
+| ----------------- | ----------------------------- | --------------------------- |
+| Menor que | < | Inferior al umbral |
+| Mayor que | > | Superior al umbral |
+| Menor o igual que | <= | Inferior o igual al umbral |
+| Mayor o igual que | > = | Mayor o igual que el umbral |
+
+Por ejemplo, se desea devolver entidades de MyClass donde la similaridad con un vector es mayor que 1.2 umbrales, utilizando la métrica euclideana:
+
+```4d
+var $myVector : 4D.Vector
+$myVector := getVector ///método para obtener un vector, por ejemplo a partir de 4D.AIKit
+var $comparisonVector := {vector: $myVector; metric: mk euclidean; threshold: 1.2}
+var $results := ds.MyClass.query("myVectorField <= :1"; $comparisonVector)
+```
+
+Ver [más ejemplos a continuación](#example-4-2) (ejemplos 4 y 5).
+
+:::tip Entradas de blog relacionadas
+
+- [4D AI: Búsqueda de entidades por similaridad vectorial en 4D](https://blog.4d.com/4d-ai-searching-entities-by-vector-similarity-in-4d)
+- [Por qué su Pila de búsqueda está rota y cómo lo soluciona la búsqueda vectorial](https://blog.4d.com/why-your-search-stack-feels-broken-and-how-vector-search-fixes-it)
+
+:::
+
+### parámetro formula
+
+Como alternativa a la inserción de fórmulas dentro del parámetro *queryString* (ver arriba), puede pasar directamente un objeto fórmula como criterio de búsqueda booleano. La utilización de un objeto fórmula para las búsquedas es **recomendada** ya que se beneficia de la tokenización, y el código es más fácil de buscar/leer.
+
+La fórmula debe haber sido creada utilizando el comando [`Formula`](../commands/formula.md) o [`Formula from string`](../commands/formula-from-string.md). En este caso:
+
+- *formula* se evalúa para cada entidad y debe devolver true o false. Durante la ejecución de la búsqueda, si el resultado de la fórmula no es un booleano, se considera como false.
+- dentro de la *formula*, la entidad está disponible a través del objeto `This`.
+- si el objeto `Formula` es **null**, se genera el error 1626 ("Expecting a text or formula"), que puede interceptar utilizando un método instalado con [`ON ERR CALL`](../commands-legacy/on-err-call.md).
+
+> Por razones de seguridad, las llamadas a fórmulas dentro de las funciones `query()` pueden ser desestimadas. Ver la descripción del parámetro *querySettings*.
+
+### Pasar parámetros a fórmulas
+
+Toda *formula* llamada por la función `query()` puede recibir los parámetros:
+
+- Los parámetros deben pasarse a través de la propiedad **args** (objeto) del parámetro *querySettings*.
+- La fórmula recibe este objeto **args** como parámetro **$1**.
+
+Este pequeño código muestra los principios de cómo se pasan los parámetros a los métodos:
+
+```4d
+ $settings:=New object("args";New object("exclude";"-")) //objeto args a pasar los parámetros
+ $es:=ds.Students.query("eval(checkName($1.exclude))";$settings) //args se recibe en $1
+```
+
+En el ejemplo 3 se ofrecen más ejemplos.
+
+**4D Server**: en cliente/servidor, las fórmulas se ejecutan en el servidor. En este contexto, sólo el objeto `querySettings.args` se envía a las fórmulas.
+
+### Parámetro querySettings
+
+En el parámetro *querySettings* se puede pasar un objeto que contenga opciones adicionales. Se soportan las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| parameters | Object | **Marcadores de posición con nombre para los valores** utilizados en *queryString* o *formula*. Los valores se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para un valor en *queryString* o *formula* (":placeholder") y valor es el valor a comparar. Puede combinar marcadores de posición indexados (valores pasados directamente en parámetros de valor) y valores de marcadores de posición con nombre en la misma búsqueda. |
+| attributes | Object | **Marcadores de posición con nombre para rutas de atributos** utilizados en *queryString* o *formula*. Los atributos se expresan como pares propiedad / valor, donde propiedad es el nombre del marcador de posición insertado para una ruta de atributo en *queryString* o *formula* (":placeholder") y valor puede ser una cadena o una colección de cadenas. Cada valor es una ruta que puede designar un escalar o un atributo relacionado de la clase de datos o una propiedad en un campo objeto de la clase de datos
Tipo de datos
Descripción
Cadena
attributePath expresado utilizando la notación de puntos, por ejemplo "name" o "user.address.zipCode"
Colección de cadenas
Cada cadena de la colección representa un nivel de attributePath, por ejemplo, \["name"] o \["user","address","zipCode"]. El uso de una colección permite realizar consultas sobre atributos con nombres que no son compatibles a la notación de puntos, por ejemplo, \["4Dv17.1", "en\/fr"]
Puede mezclar marcadores de posición indexados (valores pasados directamente en los parámetros *value*) y los valores de marcadores de posición con nombre en la misma consulta. |
+| args | Object | Parámetro(s) a pasar a las fórmulas, si las hay. El objeto **args** se recibirá en $1 dentro de las fórmulas y, por tanto, sus valores estarán disponibles a través de *$1.property* (ver el ejemplo 3). |
+| allowFormulas | Boolean | True para permitir las llamadas de fórmulas en la búsqueda (por defecto). Pase false para desautorizar la ejecución de fórmulas. Si se define como false y `query()` recibe una fórmula, se envía un error (1278 - Fórmula no autorizada en este método miembro). |
+| context | Text | Etiqueta para el contexto de optimización automática aplicado a la entity selection. Este contexto será utilizado por el código que maneja la selección de entidades para que pueda beneficiarse de la optimización. Esta funcionalidad está diseñada para el procesamiento cliente/servidor; para más información, consulte la sección [**Optimización cliente/servidor**](../ORDA/client-server-optimization.md#optimization-context). |
+| queryPlan | Boolean | En la entity selection resultante, devuelve o no la descripción detallada de la búsqueda justo antes de que se ejecute, es decir, la búsqueda planificada. La propiedad devuelta es un objeto que incluye cada búsqueda y sub búsqueda prevista (en el caso de una búsqueda compleja). Esta opción es útil durante la fase de desarrollo de una aplicación. Suele utilizarse junto con queryPath. Por defecto si se omite: false. |
+| queryPath | Boolean | En la entity selection resultante, devuelve o no la descripción detallada de la búsqueda tal cual es realizada. La propiedad devuelta es un objeto que contiene la ruta utilizada para la búsqueda (normalmente idéntica a la de queryPlan, pero puede diferir si el motor consigue optimizar la búsqueda), así como el tiempo de procesamiento y el número de registros encontrados. Esta opción es útil durante la fase de desarrollo de una aplicación. Por defecto si se omite: false. |
+
+### Sobre queryPlan y queryPath
+
+La información registrada en `queryPlan`/`queryPath` incluye el tipo de búsqueda (indexada y secuencial) y cada subconsulta necesaria junto con los operadores de conjunción. Las rutas de acceso de las peticiones también contienen el número de entidades encontradas y el tiempo necesario para ejecutar cada criterio de búsqueda. Las rutas de acceso de las peticiones también contienen el número de entidades encontradas y el tiempo necesario para ejecutar cada criterio de búsqueda. Generalmente, la descripción del plan de consulta y su ruta de acceso son idénticas, pero pueden diferir porque 4D puede implementar optimizaciones dinámicas cuando se ejecuta una consulta para mejorar el rendimiento. Por ejemplo, el motor 4D puede convertir dinámicamente una consulta indexada en una secuencial si estima que es más rápida. Este caso concreto puede darse cuando el número de entidades que se buscan es bajo.
+
+Por ejemplo, si ejecuta la siguiente búsqueda:
+
+```4d
+ $sel:=ds.Employee.query("salary < :1 and employer.name = :2 or employer.revenues > :3";\
+ 50000;"Lima West Kilo";10000000;New object("queryPath";True;"queryPlan";True))
+```
+
+queryPlan:
+
+```4d
+{Or:[{And:[{item:[index : Employee.salary ] < 50000},
+ {item:Join on Table : Company : Employee.employerID = Company.ID,
+ subquery:[{item:[index : Company.name ] = Lima West Kilo}]}]},
+ {item:Join on Table : Company : Employee.employerID = Company.ID,
+ subquery:[{item:[index : Company.revenues ] > 10000000}]}]}
+```
+
+queryPath:
+
+```4d
+{steps:[{description:OR,time:63,recordsfounds:1388132,
+ steps:[{description:AND,time:32,recordsfounds:131,
+ steps:[{description:[index : Employee.salary ] < 50000,time:16,recordsfounds:728260},{description:Join on Table : Company : Employee.employerID = Company.ID,time:0,recordsfounds:131,
+ steps:[{steps:[{description:[index : Company.name ] = Lima West Kilo,time:0,recordsfounds:1}]}]}]},{description:Join on Table : Company : Employee.employerID = Company.ID,time:31,recordsfounds:1388132,
+ steps:[{steps:[{description:[index : Company.revenues ] > 10000000,time:0,recordsfounds:933}]}]}]}]}
+```
+
+#### Ejemplo 1
+
+Esta sección ofrece varios ejemplos de búsquedas.
+
+Búsquedas en una cadena:
+
+```4d
+$entitySelection:=ds.Customer.query("firstName = 'S@'")
+```
+
+Búsqueda con una instrucción NOT:
+
+```4d
+$entitySelection:=ds.Employee.query("not(firstName=Kim)")
+```
+
+Búsquedas con fechas:
+
+```4d
+$entitySelection:=ds.Employee.query("birthDate > :1";"1970-01-01")
+$entitySelection:=ds.Employee.query("birthDate <= :1";Current date-10950)
+```
+
+Búsqueda con marcadores de posición indexados para los valores:
+
+```4d
+$entitySelection:=ds.Customer.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@")
+```
+
+Búsqueda con marcadores de posición indexados para valores en una dataclass relacionada:
+
+```4d
+$entitySelection:=ds.Employee.query("lastName = :1 and manager.lastName = :2";"M@";"S@")
+```
+
+Búsqueda con marcador de posición indexado que incluye una instrucción de orden descendente:
+
+```4d
+$entitySelection:=ds.Student.query("nationality = :1 order by campus.name desc, lastname";"French")
+```
+
+Búsqueda con marcadores de posición con nombre para los valores:
+
+```4d
+var $querySettings : Object
+var $managedCustomers : cs.CustomerSelection
+$querySettings:=New object
+$querySettings.parameters:=New object("userId";1234;"extraInfo";New object("name";"Smith"))
+$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name = :extraInfo.name";$querySettings)
+```
+
+Búsqueda que utiliza marcadores de posición con nombre e indexados para los valores:
+
+```4d
+var $querySettings : Object
+var $managedCustomers : cs.CustomerSelection
+$querySettings.parameters:=New object("userId";1234)
+$managedCustomers:=ds.Customer.query("salesperson.userId = :userId and name=:1";"Smith";$querySettings)
+```
+
+Búsqueda con objetos queryPlan y queryPath:
+
+```4d
+$entitySelection:=ds.Employee.query("(firstName = :1 or firstName = :2) and (lastName = :3 or lastName = :4)";"D@";"R@";"S@";"K@";New object("queryPlan";True;"queryPath";True))
+
+ //puede obtener estas propiedades en la selección de entidades resultante
+var $queryPlan; $queryPath : Object
+$queryPlan:=$entitySelection.queryPlan
+$queryPath:=$entitySelection.queryPath
+```
+
+Búsqueda con una ruta de atributo de tipo Colección:
+
+```4d
+$entitySelection:=ds.Employee.query("extraInfo.hobbies[].name = :1";"horsebackriding")
+```
+
+Búsqueda con una ruta de atributos de tipo Collection y atributos vinculados:
+
+```4d
+$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and extraInfo.hobbies[a].level=:2";"horsebackriding";2)
+```
+
+Búsqueda con una ruta de atributos de tipo Collection y múltiples atributos vinculados:
+
+```4d
+$entitySelection:=ds.Employee.query("extraInfo.hobbies[a].name = :1 and
+ extraInfo.hobbies[a].level = :2 and extraInfo.hobbies[b].name = :3 and
+ extraInfo.hobbies[b].level = :4";"horsebackriding";2;"Tennis";5)
+```
+
+Búsqueda con una ruta de atributo de tipo Objeto:
+
+```4d
+$entitySelection:=ds.Employee.query("extra.eyeColor = :1";"blue")
+```
+
+Búsqueda con una instrucción IN:
+
+```4d
+$entitySelection:=ds.Employee.query("firstName in :1";New collection("Kim";"Dixie"))
+```
+
+Búsqueda con instrucción NOT (IN):
+
+```4d
+$entitySelection:=ds.Employee.query("not (firstName in :1)";New collection("John";"Jane"))
+```
+
+Búsqueda con marcadores de posición indexados para los atributos:
+
+```4d
+var $es : cs.EmployeeSelection
+$es:=ds.Employee.query(":1 = 1234 and :2 = 'Smith'";"salesperson.userId";"name")
+ //salesperson es una entidad relacionada
+```
+
+Búsqueda con marcadores de posición indexados para los atributos y marcadores de posición con nombre para los valores:
+
+```4d
+var $es : cs.EmployeeSelection
+var $querySettings : Object
+$querySettings:=New object
+$querySettings.parameters:=New object("customerName";"Smith")
+$es:=ds.Customer.query(":1 = 1234 and :2 = :customerName";"salesperson.userId";"name";$querySettings)
+ //salesperson es una entidad relacionada
+```
+
+Búsqueda con marcadores de posición indexados para los atributos y los valores:
+
+```4d
+var $es : cs.EmployeeSelection
+$es:=ds.Clients.query(":1 = 1234 and :2 = :3";"salesperson.userId";"name";"Smith")
+ //salesperson es una entidad relacionada
+```
+
+#### Ejemplo 2
+
+Esta sección ilustra las búsquedas con marcadores de posición con nombre para los atributos.
+
+Dada una dataclass Employee con 2 entidades:
+
+Entidad 1:
+
+```4d
+name: "Marie"
+number: 46
+softwares:{
+"Word 10.2": "Installed",
+"Excel 11.3": "To be upgraded",
+"Powerpoint 12.4": "Not installed"
+}
+```
+
+Entidad 2:
+
+```4d
+name: "Sophie"
+number: 47
+softwares:{
+"Word 10.2": "Not installed",
+"Excel 11.3": "To be upgraded",
+"Powerpoint 12.4": "Not installed"
+}
+```
+
+Búsqueda con marcadores de posición con nombre para los atributos:
+
+```4d
+ var $querySettings : Object
+ var $es : cs.EmployeeSelection
+ $querySettings:=New object
+ $querySettings.attributes:=New object("attName";"name";"attWord";New collection("softwares";"Word 10.2"))
+ $es:=ds.Employee.query(":attName = 'Marie' and :attWord = 'Installed'";$querySettings)
+ //$es.length=1 (Employee Marie)
+```
+
+Búsqueda con marcadores de posición con nombre para los atributos y los valores:
+
+```4d
+ var $querySettings : Object
+ var $es : cs.EmployeeSelection
+ var $name : Text
+ $querySettings:=New object
+ //Placeholders para los valores
+ //Se pide al usuario un nombre
+ $name:=Request("Por favor, introduzca el nombre a buscar:")
+ If(OK=1)
+ $querySettings.parameters:=New object("givenName";$name)
+ //Placeholders para las rutas de atributos
+ $querySettings.attributes:=New object("attName";"name")
+ $es:=ds.Employee.query(":attName= :givenName";$querySettings)
+ End if
+```
+
+#### Ejemplo 3
+
+Estos ejemplos ilustran las distintas formas de utilizar fórmulas con o sin parámetros en sus búsquedas.
+
+La fórmula se da como texto con `eval()` en el parámetro *queryString*:
+
+```4d
+ var $es : cs.StudentsSelection
+ $es:=ds.Students.query("eval(length(This.lastname) >=30) and nationality='French'")
+```
+
+La fórmula se da como un objeto `Formula` a través de un marcador de posición:
+
+```4d
+ var $es : cs.StudentsSelection
+ var $formula : Object
+ $formula:=Formula(Length(This.lastname)>=30)
+ $es:=ds.Students.query(":1 and nationality='French'";$formula)
+```
+
+Sólo se da como criterio un objeto `Formula`:
+
+```4d
+ var $es : cs.StudentsSelection
+ var $formula : Object
+ $formula:=Formula(Length(This.lastname)>=30)
+ $es:=ds.Students.query($formula)
+```
+
+Se pueden aplicar varias fórmulas:
+
+```4d
+ var $formula1; $1; $formula2 ;$0 : Object
+ $formula1:=$1
+ $formula2:=Formula(Length(This.firstname)>=30)
+ $0:=ds.Students.query(":1 and :2 and nationality='French'";$formula1;$formula2)
+```
+
+Una fórmula texto en *queryString* recibe un parámetro:
+
+```4d
+ var $es : cs.StudentsSelection
+ var $settings : Object
+ $settings:=New object()
+ $settings.args:=New object("filter";"-")
+ $es:=ds.Students.query("eval(checkName($1.filter)) and nationality=:1";"French";$settings)
+```
+
+```4d
+ //checkName method
+ #DECLARE($exclude : Text) -> $result : Boolean
+ $result:=(Position($exclude;This.lastname)=0)
+```
+
+Utilizando el mismo método ***checkName***, un objeto `Formula` como marcador de posición recibe un parámetro:
+
+```4d
+ var $es : cs.StudentsSelection
+ var $settings; $formula : Object
+ $formula:=Formula(checkName($1.filter))
+ $settings:=New object()
+ $settings.args:=New object("filter";"-")
+ $es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
+ $settings.args.filter:="*" // cambiar los parámetros sin actualizar el objeto $formula
+ $es:=ds.Students.query(":1 and nationality=:2";$formula;"French";$settings)
+```
+
+Queremos desautorizar las fórmulas, por ejemplo, cuando el usuario introduce su consulta:
+
+```4d
+ var $es : cs.StudentsSelection
+ var $settings : Object
+ var $queryString : Text
+ $queryString:=Request("Enter your query:")
+ if(OK=1)
+ $settings:=New object("allowFormulas";False)
+ $es:=ds.Students.query($queryString;$settings) //Se produce un error si $queryString contiene una fórmula
+ End if
+```
+
+#### Ejemplo 4
+
+Este ejemplo ilustra las distintas sintaxis admitidas para las búsquedas de similaridades vectoriales. Utiliza [4D-AIKit](../aikit/overview.md):
+
+```4d
+
+var $client:=cs.AIKit.OpenAI.new("my api key")
+var $result:=$client.embeddings.create("my long text to search"; "text-embedding-ada-002")
+var $vector:=$result.vector
+
+ //el atributo embedding se basa en un campo 4D que almacena objetos de clase 4D.Vector
+ //buscar con la métrica por defecto (coseno)
+var $employees:=ds.Employee.query("embedding > :1"; {vector : $vector})
+ //buscar con la métrica euclídea
+var $employees:=ds.Employee.query("embedding > :1"; {vector: $vector; metric: mk euclidean})
+ //búsqueda con métrica coseno explícita y umbral personalizado
+var $employees:=ds.Employee.query("embedding > :1"; {vector: $vector; metric: mk cosine; threshold: 0.9})
+ //buscar con una fórmula
+var $employees:=ds.Employee.query(Formula(This.embdedding.cosineSimilarity($vector)>0.9))
+
+```
+
+#### Ejemplo 5
+
+Queremos ejecutar una consulta por similitud vectorial utilizando vectores con diferentes métricas y ordenar los resultados por similaridades de coseno:
+
+```4d
+ //Crear los vectores de comparación
+var $vector1Comparison:={vector: $myvector; métrica: mk coseno; umbral: 0.4}
+var $vector2Comparison:={vector: $myvector; metric: mk euclidean; threshold:1}
+
+ //el atributo embedding se basa en un campo 4D que almacena objetos de clase 4D.Vector
+ds.VectorTable.query("embedding>:1 and embedding<:2";$vector1Comparison;$vector2Comparison)\
+ .orderByFormula(Formula(This.embedding.cosineSimilarity($vector1Comparison)))
+
+```
+
+#### Ver también
+
+[`.query()`](EntitySelectionClass.md#query) para las selecciones de entidades
+
+
+
+## .setRemoteCacheSettings()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.setRemoteCacheSettings**(*settings* : Object)
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | -- | ------------------------------------------------------------------------------------------------------------ |
+| settings | Object | -> | Objeto que define el tiempo de espera y el tamaño máximo de la caché ORDA para el dataclass. |
+
+
+
+> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
+
+#### Descripción
+
+La función `.setRemoteCacheSettings()` define el tiempo de espera y el tamaño máximo de la caché ORDA para una dataclass..
+
+En el parámetro *settings*, pase un objeto con las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ------- | --------------------------------------------- |
+| timeout | Integer | Tiempo de espera en segundos. |
+| maxEntries | Integer | Número máximo de entidades. |
+
+`timeout` define el tiempo de espera de la caché ORDA para la dataclass (por defecto es 30 segundos). Una vez transcurrido el tiempo de espera, las entidades de la dataclass en la caché son consideradas como vencidas. Esto significa que:
+
+- los datos siguen estando ahí
+- la próxima vez que se necesiten los datos, se le pedirán al servidor
+- 4D elimina automáticamente los datos caducados cuando se alcanza el número máximo de entidades
+
+Definir la propiedad `timeout` define un nuevo timeout para las entidades ya presentes en la caché. Es útil cuando se trabaja con los datos que no cambian con mucha frecuencia y, por tanto, cuando no son necesarias nuevas peticiones al servidor.
+
+`maxEntries` define el número máximo de entidades en la caché ORDA. Por defecto es 30 000.
+
+El número de entradas mínimo es 300, por lo que el valor de `maxEntries` debe ser igual o superior a 300. En caso contrario, se ignora y el número máximo de entradas se fija en 300.
+
+Si no se pasan propiedades válidas como `timeout` y `maxEntries`, la caché permanece sin cambios, con sus valores por defecto o previamente definidos.
+
+Cuando se guarda una entidad, se actualiza en la caché y vence una vez alcanzado el timeout.
+
+#### Ejemplo
+
+```4d
+var $ds : 4D.DataStoreImplementation
+
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+$ds.Buildings.setRemoteCacheSettings(New object("timeout"; 60; "maxEntries"; 350))
+```
+
+#### Ver también
+
+[.clearRemoteCache()](#clearremotecache) [.getRemoteCache()](#clearremotecache)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/DataStoreClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/DataStoreClass.md
new file mode 100644
index 00000000000000..391b3846ade686
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/DataStoreClass.md
@@ -0,0 +1,1261 @@
+---
+id: DataStoreClass
+title: DataStore
+---
+
+Un [Datastore](ORDA/dsMapping.md#datastore) es el objeto de interfaz suministrado por ORDA para referenciar y acceder a una base de datos. Los objetos `Datastore` son devueltos por los siguientes comandos:
+
+- [ds](../commands/ds.md): un acceso directo al datastore principal
+- [Open datastore](../commands/open-datastore.md): para abrir cualquier datastore remoto
+
+### Resumen
+
+| |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#canceltransaction) |
+| [](#clearallremotecontexts) |
+| [](#dataclassname) |
+| [](#encryptionstatus) |
+| [](#flushandlock) |
+| [](#getallremotecontexts) |
+| [](#getglobalstamp) |
+| [](#getinfo) |
+| [](#getremotecontextinfo) |
+| [](#getrequestlog) |
+| [](#locked) |
+| [](#makeselectionsalterable) |
+| [](#providedatakey) |
+| [](#setadminprotection) |
+| [](#setglobalstamp) |
+| [](#setremotecontextinfo) |
+| [](#startrequestlog) |
+| [](#starttransaction) |
+| [](#stoprequestlog) |
+| [](#unlock) |
+| [](#validatetransaction) |
+
+## *.dataclassName*
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+***.dataclassName*** : 4D.DataClass
+
+#### Descripción
+
+Cada dataclass en un datastore está disponible como propiedad del objeto [DataStore](ORDA/dsMapping.md#datastore). El objeto devuelto contiene una descripción de la clase de datos.
+
+#### Ejemplo
+
+```4d
+ var $emp : cs.Employee
+ var $sel : cs.EmployeeSelection
+ $emp:=ds.Employee //$emp contiene la dataclass Employee
+ $sel:=$emp.all() //obtiene una selección de entidades de todos los empleados
+
+ //también puede escribir directamente:
+ $sel:=ds.Employee.all()
+```
+
+
+
+## .cancelTransaction()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 | Añadidos |
+
+
+
+**.cancelTransaction()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.cancelTransaction()` cancela la transacción abierta por la función [`.startTransaction()`](#starttransaction) en el nivel correspondiente en el proceso actual para el datastore especificado.
+
+La función `.cancelTransaction()` cancela cualquier cambio realizado en los datos durante la transacción.
+
+Puede anidar varias transacciones (subtransacciones). Si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente mediante la función [`.validateTransaction()`](#validatetransaction).
+
+#### Ejemplo
+
+Ver el ejemplo de la función [`.startTransaction() `](#starttransaction).
+
+
+
+## .clearAllRemoteContexts()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.clearAllRemoteContexts()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.clearAllRemoteContexts()` borra todos los atributos de todos los contextos activos en el datastore.
+
+Esta función se utiliza principalmente en el contexto de la depuración. Una cosa a tener en cuenta es que cuando se abre el depurador, éste envía peticiones al servidor y consulta todos los atributos de la clase de datos para mostrarlos. Esto puede sobrecargar sus contextos con datos innecesarios.
+
+En estos casos, puedes utilizar `.clearAllRemoteContexts()` para borrar sus contextos y mantenerlos limpios.
+
+#### Ver también
+
+[.getRemoteContextInfo()](#getremotecontextinfo) [.getAllRemoteContexts()](#getallremotecontexts) [.setRemoteContextInfo()](#setremotecontextinfo)
+
+
+
+## .encryptionStatus()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.encryptionStatus()**: Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ------------------------------------------------------------------------ |
+| Resultado | Object | <- | Información sobre el cifrado del almacén de datos actual y de cada tabla |
+
+
+
+#### Descripción
+
+La función `.encryptionStatus()` devuelve un objeto que suministra el estado de cifrado del archivo de datos actual (es decir, el archivo de datos del datastore `ds`). También se proporciona el estado de cada tabla.
+
+> Utilice el comando `Data file encryption status` para determinar el estado de encriptación de cualquier otro archivo de datos.
+
+**Valor devuelto**
+
+El objeto devuelto contiene las siguientes propiedades:
+
+| Propiedad | | | Tipo | Descripción |
+| ----------- | ----------- | ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| isEncrypted | | | Boolean | True si el archivo de datos está encriptado |
+| keyProvided | | | Boolean | True si se proporciona la llave de encriptación que coincide con el archivo de datos encriptados(\*). |
+| tablas | | | Object | Objeto que contiene tantas propiedades como tablas encriptadas o codificadas. |
+| | *tableName* | | Object | Tabla encriptada o cifrada |
+| | | name | Text | Nombre de la tabla |
+| | | num | Number | Número de tabla |
+| | | isEncryptable | Boolean | Verdadero si la tabla está declarada como encriptada en el archivo de estructura |
+| | | isEncrypted | Boolean | True si los registros de la tabla están encriptados en el archivo de datos |
+
+(\*) Se puede suministrar la llave de encriptación:
+
+- con el comando `.provideDataKey()`,
+- en la raíz de un dispositivo conectado antes de abrir el almacén de datos,
+- con el comando `Discover data key`.
+
+#### Ejemplo
+
+Quiere saber el número de tablas encriptadas en el archivo de datos actual:
+
+```4d
+ var $status : Object
+
+ $status:=ds.encryptionStatus()
+
+ If($status.isEncrypted) //the database is encrypted
+ C_LONGINT($vcount)
+ C_TEXT($tabName)
+ For each($tabName;$status.tables)
+ If($status.tables[$tabName].isEncrypted)
+ $vcount:=$vcount+1
+ End if
+ End for each
+ ALERT(String($vcount)+" encrypted table(s) in this datastore.")
+ Else
+ ALERT("This database is not encrypted.")
+ End if
+```
+
+
+
+## .flushAndLock()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.flushAndLock()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | - | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.flushAndLock()` vacía la caché del datastore local e impide que otros procesos realicen operaciones de escritura en la base de datos. El datastore se pone en un estado consistente y congelado. Es necesario llamar a esta función antes de ejecutar una instantánea de la aplicación, por ejemplo.
+
+:::info
+
+Esta función sólo puede llamarse:
+
+- en el datastore local ([`ds`](../commands/ds.md)).
+- en entorno cliente/servidor, en la máquina servidor.
+
+:::
+
+Una vez ejecutada esta función, las operaciones de escritura como `.save()` u otras llamadas a `.flushAndLock()` se congelan en todos los demás procesos hasta que se desbloquee el datastore.
+
+Cuando se han realizado varias llamadas a `.flushAndLock()` en el mismo proceso, se debe ejecutar el mismo número de llamadas a [`.unlock()`](#unlock) para desbloquear realmente el datastore.
+
+El datastore se desbloquea cuando:
+
+- la función [`.unlock()`](#unlock) es llamada en el mismo proceso, o
+- el proceso que llamó a la función `.flushAndLock()` es eliminado.
+
+Si el datastore ya está bloqueado desde otro proceso, la llamada a `.flushAndLock()` se congela y se ejecutará cuando se desbloquee el datastore.
+
+Se produce un error si la función `.flushAndLock()` no puede ejecutarse (por ejemplo, se ejecuta en un 4D remoto), .
+
+:::caution
+
+Otras funciones y servicios 4D, como [backup](../Backup/backup.md), [vss](https://doc.4d.com/4Dv20/4D/20/Using-Volume-Shadow-Copy-Service-on-Windows.300-6330532.en.html) y [MSC](../MSC/overview.md) también pueden bloquear el almacén de datos. Antes de llamar a `.flushAndLock()`, asegúrese de que no se está utilizando ninguna otra acción de bloqueo, para evitar cualquier interacción inesperada.
+
+:::
+
+#### Ejemplo
+
+Desea crear una copia de la carpeta de datos junto con su archivo de historial actual:
+
+```4d
+$destination:=Folder(fk documents folder).folder("Archive")
+$destination.create()
+
+ds.flushAndLock() //Bloquear operaciones de escritura de otros procesos
+
+$dataFolder:=Folder(fk data folder)
+$dataFolder.copyTo($destination) //Copiar la carpeta de datos
+
+$oldJournalPath:=New log file //Cerrar el historial y crear uno nuevo
+$oldJournal:=File($oldJournalPath; fk platform path)
+$oldJournal.moveTo($destination) //Guardar el antiguo historial con datos
+
+ds.unlock() //Nuestra copia ha terminado, ahora podemos desbloquear el datastore
+```
+
+#### Ver también
+
+[.locked()](#locked) [.unlock()](#unlock)
+
+## .getAllRemoteContexts()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.getAllRemoteContexts()** : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | --------------------------- | ---------------------------------------------- |
+| Resultado | Collection | <- | Colección de objetos contextos de optimización |
+
+
+
+> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
+
+#### Descripción
+
+La función `.getAllRemoteContexts()` devuelve una colección de objetos que contienen información sobre todos los contextos de optimización activos en el datastore.
+
+> Para obtener más información sobre cómo se pueden crear contextos, consulte [Optimización cliente/servidor](../ORDA/client-server-optimization.md#optimization-context).
+
+Cada objeto de la colección devuelta tiene las propiedades enumeradas en la sección [`.getRemoteContextInfo()`](#getremotecontextinfo).
+
+#### Ejemplo
+
+El siguiente código define dos contextos y los recupera utilizando `.getAllRemoteContexts()`:
+
+```4d
+var $ds : 4D.DataStoreImplementation
+var $persons : cs.PersonsSelection
+var $addresses : cs.AddressSelection
+var $p : cs.PersonsEntity
+var $a : cs.AddressEntity
+var $contextA; $contextB : Object
+var $info : Collection
+var $text : Text
+
+// Open remote datastore
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+// Set context A
+$contextA:=New object("context"; "contextA")
+$persons:=$ds.Persons.all($contextA)
+$text:=""
+For each ($p; $persons)
+ $text:=$p.firstname+" lives in "+$p.address.city+" / "
+End for each
+
+// Set context B
+$contextB:=New object("context"; "contextB")
+$addresses:=$ds.Address.all($contextB)
+$text:=""
+For each ($a; $addresses)
+ $text:=$a.zipCode
+End for each
+
+// Get all remote contexts (in this case, contextA and contextB)
+$info:=$ds.getAllRemoteContexts()
+//$info = [{name:"contextB"; dataclass: "Address"; main:"zipCode"},
+{name:"contextA";dataclass:"Persons";main:"firstname,address.city"}]
+```
+
+> Este ejemplo sirve como demostración, no está pensado para una implementación real.
+
+#### Ver también
+
+[.getRemoteContextInfo()](#getremotecontextinfo) [.setRemoteContextInfo()](#setremotecontextinfo) [.clearAllRemoteContexts()](#clearallremotecontexts)
+
+## .getGlobalStamp()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R3 | Añadidos |
+
+
+
+**.getGlobalStamp**() : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | --------------------------- | ------------------------------------------------ |
+| Resultado | Real | <- | Valor actual del marcador de modificación global |
+
+
+
+#### Descripción
+
+The `.getGlobalStamp()` function returns the current value of the global modification stamp of the datastore.
+
+:::info
+
+Esta función sólo puede llamarse:
+
+- en el datastore local ([`ds`](../commands/ds.md)).
+- en entorno cliente/servidor, en la máquina servidor.
+
+:::
+
+Para más información sobre el marcador global y el seguimiento de las modificaciones de datos, por favor consulte la página [**Uso del marcador global**](../ORDA/global-stamp.md).
+
+#### Ejemplo
+
+```4d
+var $currentStamp : Real
+var $hasModifications : Boolean
+
+$currentStamp:=ds.getGlobalStamp()
+methodWhichCouldModifyEmployees //ejecutar código
+$hasModifications:=($currentStamp # ds.getGlobalStamp())
+```
+
+#### Ver también
+
+[.setGlobalStamp()](#setglobalstamp)
+
+
+
+## .getInfo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.getInfo()**: Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | -------------------------------- |
+| Resultado | Object | <- | Propiedades del almacén de datos |
+
+
+
+#### Descripción
+
+La función `.getInfo()` devuelve un objeto que proporciona información sobre el datastore. Esta función es útil para configurar el código genérico.
+
+**Objeto devuelto**
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| type | string |
"4D": datastore principal, disponible a través de ds
"4D Server": datastore remoto, abrir con Open datastore
|
+| networked | boolean |
True: the datastore is reached through a network connection.
False: the datastore is not reached through a network connection (local database)
|
+| localID | text | ID del almacén de datos en la máquina. ID del almacén de datos en la máquina. Cadena vacía ("") para el almacén de datos principal. |
+| connection | object | Objeto que describe la conexión del almacén de datos remoto (no se devuelve para el almacén de datos principal). Propiedades disponibles:
Propiedad
Tipo
Descripción
nombre de host
texto
Dirección IP o nombre del datastore remoto + ":" + número de puerto
tls
booleano
True si se utiliza una conexión segura con el datastore remoto
idleTimeout
número
Tiempo de inactividad de la sesión (en minutos)
usuario
texto
Usuario autenticado en el almacén de datos remoto
|
+
+- Si la función `.getInfo()` se ejecuta en un 4D Server o en un 4D monopuesto, `networked` es False.
+- Si la función `.getInfo()` se ejecuta en un 4D remoto, `networked` es True
+
+#### Ejemplo 1
+
+```4d
+ var $info : Object
+
+ $info:=ds.getInfo() //Ejecutado en 4D Server o 4D
+ //{"type":"4D","networked":false,"localID":""}
+
+ $info:=ds.getInfo() // Ejecutado en 4D remoto
+ //{"type":"4D","networked":true,"localID":""}
+```
+
+#### Ejemplo 2
+
+En un almacén de datos remoto:
+
+```4d
+ var $remoteDS : 4D.DataStoreImplementation
+ var $info; $connectTo : Object
+
+ $connectTo:=New object("hostname";"111.222.33.44:8044";"user";"marie";"password";"aaaa")
+ $remoteDS:=Open datastore($connectTo;"students")
+ $info:=$remoteDS.getInfo()
+
+ //{"type":"4D Server",
+ //"localID":"students",
+ //"networked":true,
+ //"connection":{hostname:"111.222.33.44:8044","tls":false,"idleTimeout":2880,"user":"marie"}}
+```
+
+
+
+## .getRemoteContextInfo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.getRemoteContextInfo**(*contextName* : Text) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------- | ------ | --------------------------- | ------------------------ |
+| contextName | Text | -> | Nombre del contexto |
+| Resultado | Object | <- | Descripción del contexto |
+
+
+
+> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
+
+#### Descripción
+
+La función `.getRemoteContextInfo()` devuelve un objeto que contiene información sobre el contexto de optimización *contextName* en el datastore.
+
+Para obtener más información sobre cómo se pueden crear contextos de optimización, consulte [optimización cliente/servidor](../ORDA/client-server-optimization.md#optimization-context).
+
+#### Objeto devuelto
+
+El objeto devuelto tiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ----------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| name | Text | Nombre del contexto |
+| main | Text | Atributo(s) asociado(s) al contexto (los nombres de atributos están separados por comas) |
+| dataclass | Text | Nombre de la clase de datos |
+| currentItem (opcional) | Text | Los atributos del [modo página](../ORDA/client-server-optimization.md#entity-selection-based-list-box) si el contexto está vinculado a un list box. Se devuelve como `Null` o elemento de texto vacío si el nombre del contexto no se utiliza para un list box, o si no hay contexto para el elemento actual (currentItem) |
+
+Como los contextos se comportan como filtros de atributos, si *main* se devuelve vacío, significa que no se aplica ningún filtro, y que el servidor devuelve todos los atributos de la dataclass.
+
+#### Ejemplo
+
+Ver el ejemplo de la sección [`.setRemoteContextInfo()`](#example-1-3).
+
+#### Ver también
+
+[.setRemoteContextInfo()](#setremotecontextinfo) [.getAllRemoteContexts()](#getallremotecontexts) [.clearAllRemoteContexts()](#clearallremotecontexts)
+
+
+
+## .getRequestLog()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R6 | Añadidos |
+
+
+
+**.getRequestLog()** : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | -------------------------------------------------------------- |
+| Resultado | Collection | <- | Colección de objetos, donde cada objeto describe una solicitud |
+
+
+
+#### Descripción
+
+La función `.getRequestLog()` devuelve las peticiones ORDA registradas en memoria del lado del cliente. El registro de peticiones ORDA debe haber sido activado previamente utilizando la función [`.startRequestLog()`](#startrequestlog).
+
+Esta función debe ser llamada en un 4D remoto, de lo contrario devuelve una colección vacía. Está diseñado para fines de depuración en configuraciones cliente/servidor.
+
+**Valor devuelto**
+
+Colección de objetos de petición apilados. La solicitud más reciente tiene el índice 0.
+
+Para una descripción del formato del registro de peticiones ORDA, por favor consulte la sección [**Peticiones ORDA**](../Debugging/debugLogFiles.md#orda-requests).
+
+#### Ejemplo
+
+Vea el ejemplo 2 de [`.startRequestLog()`](#startrequestlog).
+
+
+
+
+
+## .isAdminProtected()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R6 | Añadidos |
+
+
+
+**.isAdminProtected()** : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------ |
+| Resultado | Boolean | <- | True si el acceso al Explorador de Datos está desactivado, False si está activado (por defecto) |
+
+
+
+#### Descripción
+
+La función `.isAdminProtected()` devuelve `True` si se ha desactivado el acceso al [Data Explorer](Admin/dataExplorer.md) para la sesión de trabajo.
+
+Por defecto, se concede acceso al Data Explorer para las sesiones `webAdmin`, pero se puede desactivar para evitar cualquier acceso a los datos por parte de los administradores (ver la función [`.setAdminProtection()`](#setadminprotection)).
+
+#### Ver también
+
+[`.setAdminProtection()`](#setadminprotection)
+
+
+
+## .locked()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.locked()** : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | --------------------------- | ----------------- |
+| Resultado | Boolean | <- | True si bloqueado |
+
+
+
+#### Descripción
+
+La función `.locked()` devuelve True si el datastore local está bloqueado actualmente.
+
+Puede bloquear el datastore utilizando la función [.flushAndLock()](#flushandlock) antes de ejecutar una instantánea del archivo de datos, por ejemplo.
+
+:::caution
+
+La función también devolverá `True` si el datastore fue bloqueado por otra función de administración como el backup o el vss (ver [.flushAndLock()](#flushandlock)).
+
+:::
+
+#### Ver también
+
+[.flushAndLock()](#flushandlock) [.unlock()](#unlock)
+
+
+
+## .makeSelectionsAlterable()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R5 | Añadidos |
+
+
+
+**.makeSelectionsAlterable()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.makeSelectionsAlterable()` define todas las selecciones de entidades como alterables por defecto en los datastores de la aplicación actual (incluyendo [datastores remotos](ORDA/remoteDatastores.md)). Está pensado para ser utilizado una vez, por ejemplo en el método base `On Startup`.
+
+Cuando no se llama a esta función, las nuevas selecciones de entidades pueden ser compartibles, dependiendo de la naturaleza de su "padre", o de [cómo se crean](ORDA/entities.md#shareable-or-alterable-entity-selections).
+
+> Esta función no modifica las selecciones de entidades creadas por [`.copy()`](./EntitySelectionClass.md#copy) o `OB Copy` cuando se utiliza la opción explícita `ck shared`.
+
+> **Compatibilidad**: esta función sólo debe utilizarse en proyectos convertidos desde versiones de 4D anteriores a 4D v18 R5 y que contengan llamadas [.add()](EntitySelectionClass.md#add). En este contexto, el uso de `.makeSelectionsAlterable()` puede ahorrar tiempo al restaurar instantáneamente el comportamiento anterior de 4D en los proyectos existentes.
+> Por otro lado, utilizar este método en proyectos nuevos creados en 4D v18 R5 y superiores **no es recomendable**, ya que impide compartir las selecciones de entidades, lo que ofrece mayor rendimiento y escalabilidad.
+
+
+
+
+
+## .provideDataKey()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.provideDataKey**( *curPassPhrase* : Text ) : Object **.provideDataKey**( *curDataKey* : Object ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------- | ------ | --------------------------- | -------------------------------------------------------- |
+| curPassPhrase | Text | -> | Frase de cifrado actual |
+| curDataKey | Object | -> | Llave de encriptación de datos actual |
+| Resultado | Object | <- | Resultado de la coincidencia de la llave de encriptación |
+
+
+
+#### Descripción
+
+La función `.provideDataKey()` permite suministrar una llave de cifrado de datos para el archivo de datos actual del datastore y detecta si la llave coincide con los datos cifrados. Esta función se puede utilizar al abrir una base encriptada, o al ejecutar cualquier operación de encriptación que requiera la llave de encriptación, como por ejemplo volver a encriptar el archivo de datos.
+
+> - La función `.provideDataKey()` debe ser llamada en una base de datos encriptada. Si se llama en una base no cifrada, el error 2003 (la llave de cifrado no coincide con los datos.) es devuelto. Utilice el comando `Data file encryption status` para determinar si la base de datos está encriptada.
+> - La función `.provideDataKey()` no puede ser llamada desde un 4D remoto o un datastore remoto encriptado.
+
+Si utiliza el parámetro *curPassPhrase*, pase la cadena utilizada para generar la llave de cifrado de datos. Cuando se utiliza este parámetro, se genera una llave de encriptación.
+
+Si utiliza el parámetro *curDataKey*, pase un objeto (con la propiedad *encodedKey*) que contenga la llave de cifrado de los datos. Esta llave puede haber sido generada con el comando `New data key`.
+
+Si se aporta una llave de cifrado de datos válida, se añade a la *keyChain* de la memoria y se activa el modo de cifrado:
+
+- todas las modificaciones de datos en las tablas encriptadas se cifran en el disco (.4DD, .journal. 4Dindx)
+- todos los datos cargados desde tablas encriptadas se descifran en memoria
+
+**Resultado**
+
+El resultado de la orden se describe en el objeto devuelto:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | -------------------------------------------------------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la llave de encriptación proporcionada coincide con los datos encriptados, False en caso contrario |
+| | | | Las siguientes propiedades se devuelven sólo si success es *FALSE* |
+| status | | Number | Código de error (4 si la llave de encriptación suministrada es errónea) |
+| statusText | | Text | Mensaje de error |
+| errors | | Collection | Pila de errores. El primer error tiene el índice más alto |
+| | \[ ].componentSignature | Text | Nombre del componente interno |
+| | \[ ].errCode | Number | Número de error |
+| | \[ ].message | Text | Mensaje de error |
+
+Si no se proporciona *curPassphrase* o *curDataKey*, `.provideDataKey()` devuelve **null** (no se genera ningún error).
+
+#### Ejemplo
+
+```4d
+ var $keyStatus : Object
+ var $passphrase : Text
+
+ $passphrase:=Request("Enter the passphrase")
+ If(OK=1)
+ $keyStatus:=ds.provideDataKey($passphrase)
+ If($keyStatus.success)
+ ALERT("You have provided a valid encryption key")
+ Else
+ ALERT("You have provided an invalid encryption key, you will not be able to work with encrypted data")
+ End if
+ End if
+```
+
+
+
+
+
+## .setAdminProtection()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R6 | Añadidos |
+
+
+
+**.setAdminProtection**( *status* : Boolean )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | -- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| status | Boolean | -> | True para desactivar el acceso Data Explorer a los datos del puerto `webAdmin`, False (por defecto) para otorgar el acceso |
+
+
+
+#### Descripción
+
+La función `.setAdminProtection()` permite deshabilitar cualquier acceso a datos en el [puerto web admin](Admin/webAdmin.md#http-port), incluso para el [Explorador de datos](Admin/dataExplorer.md) en sesiones `WebAdmin`.
+
+Por defecto, cuando no se llama a la función, el acceso a los datos se concede siempre en el puerto de administración web para una sesión con privilegio `WebAdmin` utilizando el Explorador de Datos. En algunas configuraciones, por ejemplo, cuando el servidor de aplicaciones está alojado en una máquina de terceros, es posible que no desee que el administrador pueda ver sus datos, aunque puede editar la configuración del servidor, incluyendo los parámetros [access key](Admin/webAdmin.md#access-key).
+
+En este caso, puede llamar a esta función para deshabilitar el acceso a los datos del Explorador de Datos en el puerto de administración web de la máquina, incluso si la sesión de usuario tiene el privilegio `WebAdmin`. Cuando se ejecuta esta función, el archivo de datos se protege inmediatamente y el estado se almacena en el disco: el archivo de datos estará protegido incluso si se reinicia la aplicación.
+
+#### Ejemplo
+
+Se crea un método proyecto *protectDataFile* para llamar antes de los despliegues, por ejemplo:
+
+```4d
+ ds.setAdminProtection(True) //Desactiva el acceso a los datos del Explorador de datos
+```
+
+#### Ver también
+
+[`.isAdminProtected()`](#isadminprotected)
+
+
+
+## .setGlobalStamp()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R3 | Añadidos |
+
+
+
+**.setGlobalStamp**( *newStamp* : Real)
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | -- | ----------------------------------------------- |
+| newStamp | Real | -> | Nuevo valor del marcador de modificación global |
+
+
+
+:::info Modo avanzado
+
+Esta función está destinada a los desarrolladores que necesiten modificar el valor actual del marcador global. Debe utilizarse con cuidado.
+
+:::
+
+#### Descripción
+
+La función `.setGlobalStamp()` define *newStamp* como nuevo valor para del marcador de modificación global actual del datastore.
+
+:::info
+
+Esta función sólo puede llamarse:
+
+- en el datastore local ([`ds`](../commands/ds.md)).
+- en entorno cliente/servidor, en la máquina servidor.
+
+:::
+
+Para más información sobre el marcador global y el seguimiento de las modificaciones de datos, por favor consulte la página [**Uso del marcador global**](../ORDA/global-stamp.md).
+
+#### Ejemplo
+
+El siguiente código define el marcador de modificación global:
+
+```4d
+var $newValue: Real
+$newValue:=ReadValueFrom //obtener un nuevo valor para asignar
+ds.setGlobalStamp($newValue)
+```
+
+#### Ver también
+
+[.getGlobalStamp()](#getglobalstamp)
+
+## .setRemoteContextInfo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R5 | Añadidos |
+
+
+
+**.setRemoteContextInfo**( *contextName* : Text ; *dataClassName* : Text ; *attributes* : Text {; *contextType* : Text { ; *pageLength* : Integer}}) **.setRemoteContextInfo**( *contextName* : Text ; *dataClassName* : Text; *attributesColl* : Collection {; *contextType* : Text { ; *pageLength* : Integer }} ) **.setRemoteContextInfo**( *contextName* : Text ; *dataClassObject* : 4D.DataClass ; *attributes* : Text {; *contextType* : Text { ; *pageLength* : Integer }}) **.setRemoteContextInfo**( *contextName* : Text ; *dataClassObject* : 4D.DataClass ; *attributesColl* : Collection {; *contextType* : Text { ; *pageLength* : Integer }} )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| --------------- | ---------------------------- | -- | -------------------------------------------------------------------------------------------------------------- |
+| contextName | Text | -> | Nombre del contexto |
+| dataClassName | Text | -> | Nombre de la dataclass |
+| dataClassObject | 4D.DataClass | -> | dataclass object (e.g datastore. Employee) |
+| attributes | Text | -> | Lista de atributos separados por comas |
+| attributesColl | Collection | -> | Colección de nombres de atributos (text) |
+| contextType | Text | -> | Si se suministra, el valor debe ser "main" o "currentItem" |
+| pageLength | Integer | -> | Longitud de la página de la selección de entidades asociada al contexto (por defecto es 80) |
+
+
+
+> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
+
+#### Descripción
+
+La función `.setRemoteContextInfo()` vincula los atributos de la dataclass especificada al contexto de optimización *contextName*. Si ya existe un contexto de optimización para los atributos especificados, este comando lo reemplaza.
+
+Cuando se pasa un contexto a las funciones de clase ORDA, la optimización de las peticiones REST se activa inmediatamente:
+
+- la primera entidad no está totalmente cargada como se hace en el modo automático
+- las páginas de 80 entidades (o de `pageLength` entidades) se piden inmediatamente al servidor con sólo los atributos del contexto
+
+> Para más información sobre cómo se crean los contextos de optimización, consulte el [párrafo de optimización cliente/servidor](../ORDA/client-server-optimization.md#optimization-context)
+
+En *contextName*, pase el nombre del contexto de optimización para vincularlo a los atributos de la dataclass.
+
+Para designar la dataclass que recibirá el contexto, puede pasar un *dataClassName* o un *dataClassObject*.
+
+Para designar los atributos a vincular al contexto, pase una lista de atributos separados por una coma en *attributes* (Text), o una colección de nombres de atributos en *attributesColl* (colección de textos).
+
+Si *attributes* es un texto vacío, o si *attributesColl* es una colección vacía, todos los atributos escalares de la dataclass se integran al contexto de optimización. Si se pasa un atributo que no existe en la dataclass, la función lo ignora y se genera un error.
+
+Puede pasar un *contextType* para especificar si el contexto es un contexto estándar o el contexto del elemento actual de la selección de entidades mostrada en un list box:
+
+- Si el valor es "main" (por defecto), *contextName* designa un contexto estándar.
+- Si su valor es "currentItem", los atributos pasados se ponen en el contexto del elemento actual. Ver [List box basado en una entity selection](../ORDA/client-server-optimization.md#entity-selection-based-list-box).
+
+En *pageLength*, especifique el número de entidades de dataclass a solicitar al servidor.
+
+Puede pasar un *pageLength* para un atributo relacional que es una selección de entidades (de una a muchas). La sintaxis es `relationAttributeName:pageLength` (por ejemplo, empleados:20).
+
+#### Ejemplo 1
+
+```4d
+var $ds : 4D.DataStoreImplementation
+var $persons : cs.PersonsSelection
+var $p : cs.PersonsEntity
+var $contextA : Object
+var $info : Object
+var $text : Text
+
+// Abrir datastore remoto
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+// Definir el contexto
+$contextA:=New object("context"; "contextA")
+$ds.setRemoteContextInfo("contextA"; $ds.Persons; "firstname, lastname")
+
+// Envía las peticiones al servidor utilizando un bucle
+$persons:=$ds.Persons.all($contextA)
+$text:=""
+For each ($p; $persons)
+ $text:=$p.firstname + " " + $p.lastname
+End for each
+
+// Verificar el contenido del contexto
+$info:=$ds.getRemoteContextInfo("contextA")
+// $info = {name:"contextA";dataclass:"Persons";main:"firstname, lastname"}
+```
+
+> Este ejemplo sirve como demostración, no está pensado para una implementación real.
+
+#### Ejemplo 2
+
+El siguiente fragmento de código solicita al servidor páginas de 30 entidades de la dataclass `Address`. Las entidades devueltas sólo contienen el atributo `zipCode`.
+
+Por cada entidad `Address` se devuelven 20 entidades Persons, que sólo contienen los atributos `lastname` y `firstname`:
+
+```4d
+var $ds : 4D.DataStoreImplementation
+
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+$ds.setRemoteContextInfo("contextA"; $ds.Address; "zipCode, persons:20,\
+persons.lastname, persons.firstname"; "main"; 30)
+```
+
+#### Ejemplo 3 - Listbox
+
+```4d
+// When the form loads
+Case of
+ : (Form event code=On Load)
+
+ Form.ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+ // Set the attributes of the page context
+ Form.ds.setRemoteContextInfo("LB"; Form.ds.Persons; "age, gender,\
+ children"; "currentItem")
+
+ Form.settings:=New object("context"; "LB")
+ Form.persons:=Form.ds.Persons.all(Form.settings)
+ // Form.persons is displayed in a list box
+End case
+
+// When you get the attributes in the context of the current item: Form.currentItemLearntAttributes:=Form.selectedPerson.getRemoteContextAttributes()
+// Form.currentItemLearntAttributes = "age, gender, children"
+```
+
+#### Ver también
+
+[.getRemoteContextInfo()](#getremotecontextinfo) [.getAllRemoteContexts()](#getallremotecontexts) [.clearAllRemoteContexts()](#clearallremotecontexts)
+
+
+
+## .startRequestLog()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------------------------- |
+| 20 | Soporte del lado del servidor, nuevo parámetro `options` |
+| 17 R6 | Añadidos |
+
+
+
+**.startRequestLog**() **.startRequestLog**( *file* : 4D.File ) **.startRequestLog**( *file* : 4D.File ; *options* : Integer ) **.startRequestLog**( *reqNum* : Integer )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ----------------------- | -- | ---------------------------------------------------------------------------------- |
+| file | 4D.File | -> | Objeto File |
+| options | Integer | -> | Opción de registro de respuesta (servidor únicamente) |
+| reqNum | Integer | -> | Número de peticiones a mantener en memoria (cliente únicamente) |
+
+
+
+#### Descripción
+
+La función `.startRequestLog()` inicia el registro de peticiones ORDA del lado del cliente o del lado del servidor. Está diseñado para fines de depuración en configuraciones cliente/servidor.
+
+:::info
+
+Para una descripción del formato del registro de peticiones ORDA, por favor consulte la sección [**Peticiones ORDA**](../Debugging/debugLogFiles.md#orda-requests).
+
+:::
+
+#### Del lado del cliente
+
+Para crear un registro de peticiones ORDA del lado del cliente, llame a esta función en una máquina remota. El registro puede enviarse a un archivo o a la memoria, según el tipo de parámetro:
+
+- Si se pasa un objeto *file* creado con el comando `File`, los datos de registro se escriben en este archivo como una colección de objetos (formato JSON). Cada objeto representa una petición. Si el archivo no existe, se crea. En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él.
+ En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él.
+ Si se llama a `.startRequestLog()` con un archivo mientras se inició previamente un registro en memoria, el registro en memoria se detiene y se vacía.
+
+> Debe añadirse manualmente un carácter \N al final del archivo para realizar una validación JSON
+
+- Si se pasa un entero *reqNum*, se vacía el registro en memoria (si lo hay) y se inicializa un nuevo registro. It will keep *reqNum* requests in memory until the number is reached, in which case the oldest entries are emptied (FIFO stack). If `.startRequestLog()` is called with a *reqNum* while a logging was previously started in a file, the file logging is stopped.
+
+- Si no ha pasado ningún parámetro, el registro se inicia en la memoria. Si `.startRequestLog()` fue llamado previamente con un *reqNum* (antes de una `.stopRequestLog()`), los datos del registro se apilan en memoria hasta la próxima vez que se vacíe el registro o se llame a `.stopRequestLog()`.
+
+#### Del lado del servidor
+
+Para crear un registro de peticiones ORDA del lado del servidor, llame a esta función en la máquina servidor. Para crear un registro de peticiones ORDA del lado del servidor, llame a esta función en la máquina servidor. Cada objeto representa una petición. Si el archivo no existe, se crea. En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él.
+
+- Si ha pasado el parámetro *file*, los datos de registro se escriben en este archivo, en la ubicación solicitada. - Si omite el parámetro *file* o si es null, los datos del registro se escriben en un archivo llamado *ordaRequests.jsonl* y se almacenan en la carpeta "/LOGS".
+- El parámetro *options* puede utilizarse para especificar si la respuesta del servidor debe registrarse y si debe incluir el cuerpo. Por defecto, cuando se omite el parámetro, se registra la respuesta completa. En este parámetro se pueden utilizar las siguientes constantes:
+
+| Constante | Descripción |
+| ----------------------------- | -------------------------------------------------------------------------- |
+| srl log all | Registrar la respuesta por completo (valor por defecto) |
+| srl log no response | Desactivar el registro de la respuesta |
+| srl log response without body | Registrar la respuesta sin el cuerpo |
+
+#### Ejemplo 1
+
+Desea registrar las solicitudes de los clientes ORDA en un archivo y utilizar el número de secuencia del registro:
+
+```4d
+ var $file : 4D.File
+ var $e : cs.PersonsEntity
+
+ $file:=File("/LOGS/ORDARequests.txt") //logs folder
+
+ SET DATABASE PARAMETER(Client Log Recording;1) //para activar el número de secuencia log global
+ ds.startRequestLog($file)
+ $e:=ds.Persons.get(30001) //send a request
+ ds.stopRequestLog()
+ SET DATABASE PARAMETER(Client Log Recording;0)
+```
+
+#### Ejemplo 2
+
+Quiere registrar las peticiones de los clientes ORDA en la memoria:
+
+```4d
+ var $es : cs.PersonsSelection
+ var $log : Collection
+
+ ds.startRequestLog(3) //mantener 3 peticiones en memoria
+
+ $es:=ds.Persons.query("name=:1";"Marie")
+ $es:=ds.Persons.query("name IN :1";New collection("Marie"))
+ $es:=ds.Persons.query("name=:1";"So@")
+
+ $log:=ds.getRequestLog()
+ ALERT("The longest request lasted: "+String($log.max("duration"))+" ms")
+```
+
+#### Ejemplo 3
+
+Desea registrar las peticiones del servidor ORDA en un archivo específico y habilitar el número de secuencia de registro y la duración:
+
+```4d
+SET DATABASE PARAMETER(4D Server Log Recording;1)
+
+$file:=Folder(fk logs folder).file("myOrdaLog.jsonl")
+ds.startRequestLog($file)
+...
+ds.stopRequestLog()
+SET DATABASE PARAMETER(4D Server Log Recording;0)
+
+
+```
+
+
+
+
+
+## .startTransaction()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 | Añadidos |
+
+
+
+**.startTransaction()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.startTransaction()` inicia una transacción en el proceso actual en la base de datos que coincide con el datastore al que se aplica. Todos los cambios realizados en las entidades del almacén de datos en el proceso de la transacción se almacenan temporalmente hasta que la transacción se valida o se cancela.
+
+> Si se llama a este método en el almacén de datos principal (es decir, el almacén de datos devuelto por el comando `ds`), la transacción se aplica a todas las operaciones realizadas en el almacén de datos principal y en la base de datos subyacente, incluyendo por tanto ORDA y los lenguajes clásicos.
+
+Puede anidar varias transacciones (subtransacciones). Cada transacción o sub-transacción debe ser eventualmente cancelada o validada. Note que si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente mediante la función `.validateTransaction()`.
+
+#### Ejemplo
+
+```4d
+ var $connect; $status : Object
+ var $person : cs.PersonsEntity
+ var $ds : 4D.DataStoreImplementation
+ var $choice : Text
+ var $error : Boolean
+
+ Case of
+ :($choice="local")
+ $ds:=ds
+ :($choice="remote")
+ $connect:=New object("hostname";"111.222.3.4:8044")
+ $ds:=Open datastore($connect;"myRemoteDS")
+ End case
+
+ $ds.startTransaction()
+ $person:=$ds.Persons.query("lastname=:1";"Peters").first()
+
+ If($person#Null)
+ $person.lastname:="Smith"
+ $status:=$person.save()
+ End if
+ ...
+ ...
+ If($error)
+ $ds.cancelTransaction()
+ Else
+ $ds.validateTransaction()
+ End if
+```
+
+
+
+
+
+## .stopRequestLog()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------- |
+| 20 | Soporte del lado del servidor |
+| 17 R6 | Añadidos |
+
+
+
+**.stopRequestLog()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | - | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.stopRequestLog()` detiene cualquier registro de las peticiones ORDA en la máquina en la que se llama (cliente o servidor).
+
+En realidad, cierra el documento abierto en el disco. Del lado del cliente, si el registro se inició en memoria, se detiene.
+
+Esta función no hace nada si el registro de peticiones ORDA no se inició en la máquina.
+
+#### Ejemplo
+
+Ver ejemplos para [`.startRequestLog()`](#startrequestlog).
+
+
+
+## .unlock()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 | Añadidos |
+
+
+
+**.unlock()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | - | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.unlock()` elimina el bloqueo actual de las operaciones de escritura en el datastore, si se ha definido en el mismo proceso. Las operaciones de escritura pueden bloquearse en el almacén de datos local mediante la función [`.flushAndLock()`](#flushandlock).
+
+Si el bloqueo actual era el único bloqueo en el datastore, las operaciones de escritura se activan inmediatamente. Si la función `.flushAndLock()` fue llamada varias veces en el proceso, el mismo número de `.unlock()` debe ser llamado para realmente desbloquear el datastore.
+
+La función `.unlock()` debe ser llamada desde el proceso que llamó a la correspondiente `.flushAndLock()`, de lo contrario la función no hace nada y el bloqueo no se elimina.
+
+Si se llama a la función `.unlock()` en un datastore desbloqueado, no hace nada.
+
+#### Ver también
+
+[.flushAndLock()](#flushandlock) [.locked()](#locked)
+
+
+
+## .validateTransaction()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 | Añadidos |
+
+
+
+**.validateTransaction()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | - | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.validateTransaction()` acepta la transacción que se inició con [`.startTransaction()`](#starttransaction) en el nivel correspondiente en el datastore especificado.
+
+La función guarda los cambios en los datos del almacén de datos que se produjeron durante la transacción.
+
+Puede anidar varias transacciones (subtransacciones). Si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente utilizando esta función.
+
+#### Ejemplo
+
+Ver el ejemplo de la función [`.startTransaction()`](#starttransaction).
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/Directory.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/Directory.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/Directory.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/Directory.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/Document.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/Document.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/Document.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/Document.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/EmailObjectClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/EmailObjectClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/EmailObjectClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/EmailObjectClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/EntityClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/EntityClass.md
new file mode 100644
index 00000000000000..62663527a46221
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/EntityClass.md
@@ -0,0 +1,1832 @@
+---
+id: EntityClass
+title: Entity
+---
+
+Una [entidad](ORDA/dsMapping.md#entity) es una instancia de una [Dataclass](ORDA/dsMapping.md#dataclass), como un registro de la tabla que coincide con la dataclass en su datastore asociado. Contiene los mismos atributos que la clase de datos, así como los valores de los datos y las propiedades y funciones específicas.
+
+### Resumen
+
+| |
+| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#attributename) |
+| [](#clone) |
+| [](#diff) |
+| [](#drop) |
+| [](#first) |
+| [](#fromobject) |
+| [](#getdataclass) |
+| [](#getkey) |
+| [](#getremotecontextattributes) |
+| [](#getselection) |
+| [](#getstamp) |
+| [](#indexof) |
+| [](#isnew) |
+| [](#last) |
+| [](#lock) |
+| [](#next) |
+| [](#previous) |
+| [](#reload) |
+| [](#save) |
+| [](#toobject) |
+| [](#touched) |
+| [](#touchedattributes) |
+| [](#unlock) |
+
+
+
+## .*attributeName*
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+***.attributeName*** : any
+
+#### Descripción
+
+Todo atributo de la dataclass está disponible como una propiedad de una entidad, que almacena el valor del atributo para la entidad.
+
+> Los atributos dataclass también se pueden alcanzar utilizando la sintaxis alternativa con \[ ].
+
+El tipo de valor del atributo depende del tipo [kind](DataClassClass.md#attributename) (relation o storage):
+
+- Si el tipo de *attributeName* es **storage**:
+ `.attributeName` devuelve un valor del mismo tipo que *attributeName*.
+- Si el tipo de *attributeName* es **relatedEntity**:
+ `.attributeName` devuelve la entidad relacionada. Los valores de la entidad relacionada están disponibles directamente a través de las propiedades en cascada, por ejemplo "myEntity.employer.employees\[0].lastname".
+- Si el tipo *attributeName* es **relatedEnties**:
+ `.attributeName` devuelve una nueva selección de entidades relacionadas. Se eliminan los duplicados (se devuelve una entity selection desordenada).
+
+#### Ejemplo
+
+```4d
+ var $myEntity : cs.EmployeeEntity
+ $myEntity:=ds.Employee.new() //Crear una nueva entidad
+ $myEntity.name:="Dupont" // asignar 'Dupont' al atributo 'name'
+ $myEntity.firstname:="John" //asignar 'John' al atributo 'firstname'
+ $myEntity.save() //guardar la entidad
+```
+
+
+
+
+
+## .clone()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.clone()** : 4D.Entity
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | :-------------------------: | --------------------------------------------- |
+| Resultado | 4D.Entity | <- | Nueva entidad que hace referencia al registro |
+
+
+
+#### Descripción
+
+La función `.clone()` crea en la memoria una nueva entidad que hace referencia al mismo registro que la entidad original.
+
+Esta función permite actualizar las entidades por separado. Sin embargo, tenga en cuenta que, por razones de rendimiento, la nueva entidad comparte la misma referencia de atributos de objeto que la entidad clonada.
+
+> Tenga en cuenta que toda modificación realizada a las entidades se guardará en el registro referenciado sólo cuando se ejecute la función [`.save()`](#save).
+
+Esta función sólo puede utilizarse con entidades ya guardadas en la base de datos. No se puede llamar a una entidad recién creada (para la que [`isNew()`](#isnew) devuelve **True**).
+
+#### Ejemplo 1
+
+```4d
+ var $emp; $empCloned : cs.EmployeeEntity
+ $emp:=ds.Employee.get(672)
+ $empCloned:=$emp.clone()
+
+ $emp.lastName:="Smith" //Las actualizaciones realizadas en $emp no se realizan en $empCloned
+
+```
+
+#### Ejemplo 2
+
+Si no desea que la nueva entidad comparta referencias de atributos de tipo objeto, debe copiarlas.
+
+```4d
+ var $emp; $empCloned : cs.EmployeeEntity
+ $emp:=ds.Employee.all().first()
+ $empCloned:=$emp.clone()
+ $empCloned.objectAtt:=OB Copy($emp.objectAtt)
+```
+
+
+
+
+
+## .diff()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.diff**( *entityToCompare* : 4D.Entity { ; *attributesToCompare* : Collection } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------------- | ------------------------- | :-------------------------: | ------------------------------------------ |
+| entityToCompare | 4D.Entity | -> | Entidad a comparar con la entidad original |
+| attributesToCompare | Collection | -> | Nombre de los atributos a comparar |
+| Resultado | Collection | <- | Diferencias entre las entidades |
+
+
+
+#### Descripción
+
+La función `.diff()` compara el contenido de dos entidades y devuelve sus diferencias.
+
+En *entityToCompare*, pase la entidad que se va a comparar con la entidad original.
+
+En *attributesToCompare*, puede designar atributos específicos a comparar. Si se suministra, la comparación se realiza sólo en los atributos especificados. Si no se suministra, se devuelven todas las diferencias entre las entidades.
+
+Las diferencias se devuelven como una colección de objetos cuyas propiedades son:
+
+| Nombre de propiedad | Tipo | Descripción |
+| ------------------- | ----------------------------------------- | --------------------------------------- |
+| attributeName | Text | Nombre del atributo |
+| value | cualquiera - Depende del tipo de atributo | Valor del atributo en la entidad |
+| otherValue | cualquiera - Depende del tipo de atributo | Valor del atributo en *entityToCompare* |
+
+Sólo se incluyen en la colección los atributos con valores diferentes. Si no se encuentran diferencias, `.diff()` devuelve una colección vacía.
+
+La función se aplica a las propiedades cuyo [kind](DataClassClass.md#attributename) es **storage** o **relatedEntity**. En caso de que se haya actualizado una entidad relacionada (es decir, la llave foránea), el nombre de la entidad relacionada y su nombre de llave primaria se devuelven como propiedades *attributeName* (*value* y *otherValue* están vacíos para el nombre de la entidad relacionada).
+
+Si una de las entidades comparadas es **Null**, se produce un error.
+
+#### Ejemplo 1
+
+```4d
+ var $diff1; $diff2 : Collection
+ employee:=ds.Employee.query("ID=1001").first()
+ $clone:=employee.clone()
+ employee.firstName:="MARIE"
+ employee.lastName:="SOPHIE"
+ employee.salary:=500
+ $diff1:=$clone.diff(employee) // Se devuelven todas las diferencias
+ $diff2:=$clone.diff(employee;New collection("firstName"; "lastName"))
+ // Sólo se devuelven las diferencias en firstName y lastName
+```
+
+$diff1:
+
+```4d
+[
+ {
+ "attributeName": "firstName",
+ "value": "Natasha",
+ "otherValue": "MARIE"
+ },
+ {
+ "attributeName": "lastName",
+ "value": "Locke",
+ "otherValue": "SOPHIE"
+ },
+ {
+ "attributeName": "salary",
+ "value": 66600,
+ "otherValue": 500
+ }
+]
+$diff2:
+
+[
+ {
+ "attributeName": "firstName",
+ "value": "Natasha",
+ "otherValue": "MARIE"
+ },
+ {
+ "attributeName": "lastName",
+ "value": "Locke",
+ "otherValue": "SOPHIE"
+ }
+]
+```
+
+#### Ejemplo 2
+
+```4d
+ var vCompareResult1; vCompareResult2; vCompareResult3; $attributesToInspect : Collection
+ vCompareResult1:=New collection
+ vCompareResult2:=New collection
+ vCompareResult3:=New collection
+ $attributesToInspect:=New collection
+
+ $e1:=ds.Employee.get(636)
+ $e2:=ds.Employee.get(636)
+
+ $e1.firstName:=$e1.firstName+" update"
+ $e1.lastName:=$e1.lastName+" update"
+
+ $c:=ds.Company.get(117)
+ $e1.employer:=$c
+ $e2.salary:=100
+
+ $attributesToInspect.push("firstName")
+ $attributesToInspect.push("lastName")
+
+ vCompareResult1:=$e1.diff($e2)
+ vCompareResult2:=$e1.diff($e2;$attributesToInspect)
+ vCompareResult3:=$e1.diff($e2;$e1.touchedAttributes())
+```
+
+vCompareResult3 (sólo se devuelven las diferencias en atributos tocados $e1)
+
+```4d
+[
+ {
+ "attributeName": "firstName",
+ "value": "Karla update",
+ "otherValue": "Karla"
+ },
+ {
+ "attributeName": "lastName",
+ "value": "Marrero update",
+ "otherValue": "Marrero"
+ },
+ {
+ "attributeName": "salary",
+ "value": 33500,
+ "otherValue": 100
+ },
+ {
+ "attributeName": "employerID",
+ "value": 117,
+ "otherValue": 118
+ },
+ {
+ "attributeName": "employer",
+ "value": "[object Entity]",// Entity 117 from Company
+ "otherValue": "[object Entity]"// Entity 118 from Company
+ }
+]
+```
+
+vCompareResult2 (sólo se devuelven las diferencias en $attributesToInspect)
+
+```4d
+[
+ {
+ "attributeName": "firstName",
+ "value": "Karla update",
+ "otherValue": "Karla"
+ },
+ {
+ "attributeName": "lastName",
+ "value": "Marrero update",
+ "otherValue": "Marrero"
+ }
+]
+```
+
+vCompareResult1 (se devuelven todas las diferencias):
+
+```4d
+[
+ {
+ "attributeName": "firstName",
+ "value": "Karla update",
+ "otherValue": "Karla"
+ },
+ {
+ "attributeName": "lastName",
+ "value": "Marrero update",
+ "otherValue": "Marrero"
+ },
+ {
+ "attributeName": "employerID",
+ "value": 117,
+ "otherValue": 118
+ },
+ {
+ "attributeName": "employer",
+ "value": "[object Entity]",// Entity 117 from Company
+ "otherValue": "[object Entity]"// Entity 118 from Company
+
+ }
+]
+```
+
+
+
+
+
+## .drop()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------- |
+| 21 | Added status 7 and 8 |
+| 17 | Añadidos |
+
+
+
+**.drop**( {*mode* : Integer} ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | -------------------------------------------------------------------------------------------------- |
+| mode | Integer | -> | `dk force drop if stamp changed`: activa el soltar incluso si el sello ha cambiado |
+| Resultado | Object | <- | Resultado de la operación soltar |
+
+
+
+#### Descripción
+
+La función `.drop()` elimina los datos contenidos en la entidad desde el almacén de datos, desde la tabla relacionada con su Dataclass. Tenga en cuenta que la entidad permanece en la memoria.
+
+En una aplicación multiusuario o multiproceso, la función `.drop()` se ejecuta bajo un mecanismo ["bloqueo optimista"](ORDA/entities.md#entity-locking), en el que un sello de bloqueo interno se incrementa automáticamente cada vez que se guarda el registro.
+
+Por defecto, si se omite el parámetro *mode*, la función devolverá un error (ver más abajo) si la misma entidad fue modificada (es decir, el sello ha cambiado) por otro proceso o usuario en el ínterin.
+
+De lo contrario, puede pasar la opción `dk force drop if stamp changed` en el parámetro *mode*: en este caso, la entidad se elimina incluso si el marcador ha cambiado (y la llave primaria sigue siendo la misma).
+
+**Resultado**
+
+The object returned by `.drop()` contains the following properties:
+
+| Propiedad | | Tipo | Descripción |
+| --------------------------------- | ----------------------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| success | | boolean | true si la acción de soltar tiene éxito, false en caso contrario. |
+| | | | ***Disponible sólo en caso de error:*** |
+| status(\*) | | number | Código de error, ver abajo |
+| statusText(\*) | | text | Descripción del error, ver abajo |
+| | | | ***Disponible sólo en caso de error de bloqueo pesimista:*** |
+| LockKindText | | text | "Locked by record" |
+| lockInfo | | object | Información sobre el origen del bloqueo |
+| | task_id | number | Id del proceso |
+| | user_name | text | Nombre de usuario de la sesión en la máquina |
+| | user4d_alias | text | Alias usuario si está definido por `SET USER ALIAS`, si no, nombre de usuario en el directorio 4D |
+| | host_name | text | Nombre de la máquina |
+| | task_name | text | Nombre del proceso |
+| | client_version | text | |
+| | | | ***Disponible sólo en caso de error grave (un error grave puede ser intentar duplicar una llave primaria, disco lleno...):*** |
+| errors | | collection of objects | |
+| | message | text | Mensaje de error |
+| | component signature | text | firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) |
+| | errCode | number | Código de error |
+
+(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
+
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using entity.drop(), this error can be returned when dk force drop if stamp changed option is used. When using entity.lock(), this error can be returned when dk reload if stamp changed option is used.
**Associated statusText**: "Entity does not exist anymore" |
+| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
+| `dk status validation failed` | 7 | Non fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Mild Validation Error" |
+| `dk status serious error` | 4 | A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. **Associated statusText**: "Other error" |
+| `dk status serious validation error` | 8 | Fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Serious Validation Error" |
+| `dk status stamp has changed` | 2 | The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed"
|
+| `dk status wrong permission` | 1 | Los privilegios actuales no permiten suprimir la entidad. **Associated statusText**: "Permission Error" |
+
+#### Ejemplo 1
+
+Ejemplo sin la opción `dk force drop if stamp changed`:
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee : cs.EmployeeEntity
+ var $status : Object
+ $employees:=ds.Employee.query("lastName=:1";"Smith")
+ $employee:=$employees.first()
+ $status:=$employee.drop()
+ Case of
+ :($status.success)
+ ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //La entidad soltada permanece en la memoria
+ :($status.status=dk status stamp has changed)
+ ALERT($status.statusText)
+ End case
+```
+
+#### Ejemplo 2
+
+Ejemplo con la opción `dk force drop if stamp changed`:
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee : cs.EmployeeEntity
+ var $status : Object
+ $employees:=ds.Employee.query("lastName=:1";"Smith")
+ $employee:=$employees.first()
+ $status:=$employee.drop(dk force drop if stamp changed)
+ Case of
+ :($status.success)
+ ALERT("You have dropped "+$employee.firstName+" "+$employee.lastName) //La entidad soltada permanece en la memoria
+ :($status.status=dk status entity does not exist anymore)
+ ALERT($status.statusText)
+ End case
+```
+
+
+
+
+
+## .first()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.first()**: 4D.Entity
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | :-------------------------: | ---------------------------------------------------------------------------------------------------------- |
+| Resultado | 4D.Entity | <- | Referencia a la primera entidad de una selección de entidades (Null si no se encuentra) |
+
+
+
+#### Descripción
+
+La función `.first()` devuelve una referencia a la entidad en primera posición de la selección de entidades a la que pertenece la entidad.
+
+Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection( )](#getselection) devuelve Null), la función devuelve un valor Null.
+
+#### Ejemplo
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee; $firstEmployee : cs.EmployeeEntity
+ $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
+ $employee:=$employees[2]
+ $firstEmployee:=$employee.first() //$firstEmployee es la primera entidad de la selección de entidades $employees
+```
+
+
+
+
+
+## .fromObject()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.fromObject**( *filler* : Object )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-: | -------------------------------------------- |
+| filler | Object | -> | Objeto a partir del cual se llena la entidad |
+
+
+
+#### Descripción
+
+La función `.fromObject()` llena una entidad con el contenido de *filler*.
+
+> Esta función modifica la entidad original.
+
+El mapeo entre el objeto y la entidad se realiza sobre los nombres de los atributos:
+
+- Si una propiedad del objeto no existe en la dataclass, se ignora.
+- Los tipos de datos deben ser equivalentes. Si hay una diferencia de tipo entre el objeto y la dataclass, 4D intenta convertir los datos siempre que sea posible (ver [`Convertir tipos de datos`](Concepts/data-types.md#converting-data-types)), de lo contrario el atributo se deja sin tocar.
+- La llave primaria puede darse tal cual o con una propiedad "__KEY" (llenada con el valor de la llave primaria). La llave primaria puede darse tal cual o con una propiedad "__KEY" (llenada con el valor de la llave primaria). Si no se da la llave primaria, se crea la entidad y se asigna el valor de la llave primaria con respecto a las reglas de la base de datos. El autoincremento sólo se calcula si la llave primaria es nula.
+
+*filler* puede manejar una entidad relacionada bajo las siguientes condiciones:
+
+- *filler* contiene la propia llave foránea, o
+- *filler* contiene un objeto de propiedad con el mismo nombre que la entidad relacionada, que contiene una única propiedad denominada "\_\_KEY".
+- si la entidad relacionada no existe, se ignora.
+
+#### Ejemplo
+
+Con el siguiente objeto $o:
+
+```4d
+{
+ "firstName": "Mary",
+ "lastName": "Smith",
+ "salary": 36500,
+ "birthDate": "1958-10-27T00:00:00.000Z",
+ "woman": true,
+ "managerID": 411,// relatedEntity dada con PK
+ "employerID": 20 // relatedEntity dada con PK
+}
+```
+
+El siguiente código creará una entidad con entidades relacionadas con el gerente y el empleador.
+
+```4d
+ var $o : Object
+ var $entity : cs.EmpEntity
+ $entity:=ds.Emp.new()
+ $entity.fromObject($o)
+ $entity.save()
+```
+
+También puede utilizar una entidad relacionada dada como objeto:
+
+```4d
+
+{
+ "firstName": "Marie",
+ "lastName": "Lechat",
+ "salary": 68400,
+ "birthDate": "1971-09-03T00:00:00.000Z",
+ "woman": false,
+ "employer": {// relatedEntity dada como un objeto
+ "__KEY": "21"
+ },
+ "manager": {// relatedEntity dada como un objeto
+ "__KEY": "411"
+ }
+}
+```
+
+
+
+
+
+## .getDataClass()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.getDataClass()** : 4D.DataClass
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------- | :-------------------------: | -------------------------------------------- |
+| Resultado | 4D.DataClass | <- | Objeto DataClass al que pertenece la entidad |
+
+
+
+#### Descripción
+
+La función `.getDataClass()` devuelve la dataclass de la entidad. .
+
+#### Ejemplo
+
+El siguiente código genérico duplica cualquier entidad:
+
+```4d
+ //método duplicate_entity
+ //duplicate_entity($entity)
+
+ #DECLARE($entity : 4D.Entity)
+ var $entityNew : 4D.Entity
+ var $status : Object
+
+ $entityNew:=$entity.getDataClass().new() //crea una nueva entidad en la dataclass padre
+ $entityNew.fromObject($entity.toObject()) //obtiene todos los atributos
+ $entityNew[$entity.getDataClass().getInfo().primaryKey]:=Null //restablece la llave primaria
+ $status:=$entityNew.save() //guarda la entidad duplicada
+```
+
+
+
+
+
+## .getKey()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.getKey**( { *mode* : Integer } ) : any
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------- |
+| mode | Integer | -> | `dk key as string`: la llave primaria se devuelve como una cadena, sin importar el tipo de llave primaria |
+| Resultado | any | <- | Valor de la llave primaria de la entidad (Integer or Text) |
+
+
+
+#### Descripción
+
+La función `.getKey()` devuelve el valor de la llave primaria.
+
+Las llaves primarias pueden ser números (enteros) o cadenas. Puede "forzar" que el valor de la llave primaria devuelto sea una cadena, sin importar el tipo de llave primaria real, pasando la opción `dk key as string` en el parámetro *mode*.
+
+#### Ejemplo
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee : cs.EmployeeEntity
+ $employees:=ds.Employee.query("lastName=:1";"Smith")
+ $employee:=$employees[0]
+ ALERT("The primary key is "+$employee.getKey(dk key as string))
+```
+
+
+
+## .getRemoteContextAttributes()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19R5 | Añadidos |
+
+
+
+**.getRemoteContextAttributes()** : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | --------------------------- | --------------------------------------------------------------------- |
+| resultado | Text | <- | Atributos de contexto vinculados a la entidad, separados por una coma |
+
+
+
+> **Modo avanzado**: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
+
+#### Descripción
+
+La función `.getRemoteContextAttributes()` devuelve información sobre el contexto de optimización utilizado por la entidad .
+
+Si no hay un [contexto de optimización](../ORDA/client-server-optimization.md) para la entidad, la función devuelve un texto vacío.
+
+#### Ejemplo
+
+```4d
+var $ds : 4D.DataStoreImplementation
+var $address : cs.AddressEntity
+var $p : cs.PersonsEntity
+var $contextA : Object
+var $info : Text
+var $text : Text
+
+$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
+
+$contextA:=New object("context"; "contextA")
+
+$address:=$ds.Address.get(1; $contextA)
+$text:=""
+For each ($p; $address.persons)
+ $text:=$p.firstname+" "+$p.lastname
+End for each
+
+$info:=$address.getRemoteContextAttributes()
+
+//$info = "persons,persons.lastname,persons.firstname"
+```
+
+#### Ver también
+
+[EntitySelection.getRemoteContextAttributes()](./EntitySelectionClass.md#getremotecontextattributes) [.clearAllRemoteContexts()](./DataStoreClass.md#clearallremotecontexts) [.getRemoteContextInfo()](./DataStoreClass.md#getremotecontextinfo) [.getAllRemoteContexts()](./DataStoreClass.md#getallremotecontexts) [.setRemoteContextInfo()](./DataStoreClass.md#setremotecontextinfo)
+
+
+
+## .getSelection()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.getSelection()**: 4D.EntitySelection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------------- | :-------------------------: | ------------------------------------------------------------------------------------------- |
+| Resultado | 4D.EntitySelection | <- | Entity selection a la que pertenece la entidad (nula si no se encuentra) |
+
+
+
+#### Descripción
+
+La función `.getSelection()` devuelve la selección de entidades a la que pertenece la entidad.
+
+Si la entidad no pertenece a una selección de entidades, la función devuelve Null.
+
+#### Ejemplo
+
+```4d
+ var $emp : cs.EmployeeEntity
+ var $employees; $employees2 : cs.EmployeeSelection
+ $emp:=ds.Employee.get(672) // Esta entidad no pertenece a ninguna selección de entidades
+ $employees:=$emp.getSelection() // $employees es Null
+
+ $employees2:=ds.Employee.query("lastName=:1";"Smith") //Esta selección de entidades contiene 6 entidades
+ $emp:=$employees2[0] // Esta entidad pertenece a una selección de entidades
+
+ ALERT("La entity selection contiene "+String($emp.getSelection().length)+" entidades")
+```
+
+
+
+
+
+## .getStamp()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.getStamp()** : Integer
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ---------------------------------------------------------------------------- |
+| Resultado | Integer | <- | Sello de la entidad (0 si la entidad acaba de ser creada) |
+
+
+
+#### Descripción
+
+La función `.getStamp()` devuelve el valor actual del sello de la entidad.
+
+El sello interno se incrementa automáticamente en 4D cada vez que se guarda la entidad. Gestiona los accesos y modificaciones concurrentes de los usuarios a las mismas entidades (ver [**Bloqueo de entidades**](ORDA/entities.md#bloqueo-de-una-entidad)).
+
+> Para una entidad nueva (nunca guardada), la función devuelve 0. Para saber si una entidad acaba de ser creada, se recomienda utilizar [.isNew()](#isnew).
+
+#### Ejemplo
+
+```4d
+ var $entity : cs.EmployeeEntity
+ var $stamp : Integer
+
+ $entity:=ds.Employee.new()
+ $entity.lastname:="Smith"
+ $entity.save()
+ $stamp:=$entity.getStamp() //$stamp=1
+
+ $entity.lastname:="Wesson"
+ $entity.save()
+ $stamp:=$entity.getStamp() //$stamp=2
+```
+
+
+
+
+
+## .indexOf()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.indexOf**( { *entitySelection* : 4D.EntitySelection } ) : Integer
+
+
+
+| Parámetros | Tipo | | Descripción |
+| --------------- | ---------------------------------- | :-------------------------: | ------------------------------------------------------------------------- |
+| entitySelection | 4D.EntitySelection | -> | La posición de la entidad se da en función de esta selección de entidades |
+| Resultado | Integer | <- | Posición de la entidad en una selección de entidades |
+
+
+
+#### Descripción
+
+La función `.indexOf()` devuelve la posición de la entidad en una entity selection.
+
+Por defecto, si se omite el parámetro *entitySelection*, la función devuelve la posición de la entidad dentro de su propia selección de entidades. En caso contrario, devuelve la posición de la entidad dentro de la *entitySelection* especificada.
+
+El valor resultante se incluye entre 0 y la longitud de la selección de entidades -1.
+
+- Si la entidad no tiene una selección de entidad o no pertenece a *entitySelection*, la función devuelve -1.
+- Si *entitySelection* es Null o no pertenece a la misma clase de datos que la entidad, se produce un error.
+
+#### Ejemplo
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee : cs.EmployeeEntity
+ $employees:=ds.Employee.query("lastName = :1";"H@") //Esta entity selection contiene 3 entidades
+ $employee:=$employees[1] //Esta entidad pertenece a una entity selection
+ ALERT("El índice de la entidad en su propia selección de entidades es "+String($employee.indexOf())) //1
+
+ $employee:=ds.Employee.get(725) //Esta entidad no pertenece a una selección de entidades
+ ALERT("El índice de la entidad es "+String($employee.indexOf())) // -1
+```
+
+
+
+
+
+## .isNew()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.isNew()** : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------- |
+| Resultado | Boolean | <- | True si la entidad acaba de ser creada y aún no se ha guardado. En caso contrario, False. |
+
+
+
+#### Descripción
+
+La función `.isNew()` devuelve True si la entidad a la que se aplica acaba de ser creada y aún no ha sido guardada en el datastore. .
+
+#### Ejemplo
+
+```4d
+ var $emp : cs.EmployeeEntity
+
+ $emp:=ds.Employee.new()
+
+ If($emp.isNew())
+ ALERT("This is a new entity")
+ End if
+```
+
+
+
+
+
+## .last()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.last()** : 4D.Entity
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | :-------------------------: | --------------------------------------------------------------------------------------------------------- |
+| Resultado | 4D.Entity | <- | Referencia a la última entidad de una selección de entidades (Null si no se encuentra) |
+
+
+
+#### Descripción
+
+La función `.last()` devuelve una referencia a la entidad en la última posición de la selección de entidades a la que pertenece la entidad.
+
+Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection( )](#getselection) devuelve Null), la función devuelve un valor Null.
+
+#### Ejemplo
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee; $lastEmployee : cs.EmployeeEntity
+ $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
+ $employee:=$employees[0]
+ $lastEmployee:=$employee.last() //$lastEmployee es la última entidad de la selección de entidades $employees
+```
+
+
+
+
+
+## .lock()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.lock**( { *mode* : Integer } ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | --------------------------------------------------------------------------------------------------- |
+| mode | Integer | -> | `dk reload if stamp changed`: recargar antes de bloquear si el marcador ha cambiado |
+| Resultado | Object | <- | Resultado de la operación de bloqueo |
+
+
+
+#### Descripción
+
+La función `.lock()` pone un bloqueo pesimista en el registro referenciado por la entidad. El [bloqueo se establece](ORDA/entities.md#bloqueo-de-una-entidad) para un registro y todas las referencias de la entidad en el proceso actual.
+
+Otros procesos verán este registro como bloqueado (la propiedad `result.success` contendrá False si intentan bloquear la misma entidad usando esta función). Sólo las funciones ejecutadas en la sesión de "bloqueo" pueden editar y guardar los atributos de la entidad. La entidad puede ser cargada como de sólo lectura por otras sesiones, pero no podrán introducir y guardar valores.
+
+Un registro bloqueado por `.lock()` se desbloquea:
+
+- cuando la función [`unlock()`](#unlock) se llama en una entidad correspondiente en el mismo proceso
+- automáticamente, cuando ya no es referenciado por ninguna entidad en la memoria. Por ejemplo, si el bloqueo se pone sólo en una referencia local de una entidad, la entidad se desbloquea cuando la función termina. Mientras haya referencias a la entidad en la memoria, el registro permanece bloqueado.
+
+:::note Notas
+
+- [`unlock()`](#unlock) debe ser llamado tantas veces como `lock()` fue llamado en el mismo proceso para que la entidad sea realmente desbloqueada.
+- Una entidad también puede ser [bloqueada por una sesión REST](../REST/$lock.md), en cuyo caso solo puede ser desbloqueada por la sesión.
+
+:::
+
+Por defecto, si se omite el parámetro *mode*, la función devolverá un error (ver más abajo) si la misma entidad fue modificada (es decir, el sello ha cambiado) por otro proceso o usuario en el ínterin.
+
+De lo contrario, puede pasar la opción `dk reload if stamp changed` en el parámetro *mode*: en este caso, no se devuelve error y la entidad se recarga cuando el sello cambia (si la entidad aún existe y la llave primaria sigue siendo la misma).
+
+**Resultado**
+
+El objeto devuelto por `.lock()` contiene las siguientes propiedades:
+
+| Propiedad | | Tipo | Descripción |
+| --------------------------------- | ----------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| success | | boolean | true si la acción de bloqueo tiene éxito (o si la entidad ya está bloqueada en el proceso actual), false en caso contrario. |
+| | | | ***Disponible sólo si se utiliza la opción `dk reload if stamp changed`:*** |
+| **wasReloaded** | | boolean | true si la entidad fue recargada con éxito, false en caso contrario. |
+| | | | ***Disponible sólo en caso de error:*** |
+| status(\*) | | number | Código de error, ver abajo |
+| statusText(\*) | | text | Descripción del error, ver abajo |
+| | | | ***Disponible sólo en caso de error de bloqueo pesimista:*** |
+| lockKindText | | text | "Locked by record" si está bloqueado por un proceso 4D, "Locked by session" si está bloqueado por una sesión REST |
+| lockInfo | | object | Información sobre el origen del bloqueo. Las propiedades devueltas dependen del origen del bloqueo (proceso 4D o sesión REST). |
+| | | | ***Disponible sólo para un bloqueo por proceso 4D:*** |
+| | task_id | number | ID del Proceso |
+| | user_name | text | Nombre de usuario de la sesión en la máquina |
+| | user4d_alias | text | Nombre o alias del usuario 4D |
+| | user4d_id | number | ID del usuario en el directorio de la base de datos 4D |
+| | host_name | text | Nombre de la máquina |
+| | task_name | text | Nombre del proceso |
+| | client_version | text | Versión del cliente |
+| | | | ***Disponible sólo para un bloqueo por sesión REST:*** |
+| | host | text | URL que bloqueó la entidad (por ejemplo, "`www.myserver.com`") |
+| | IPAddr | text | Dirección IP del bloqueo (por ejemplo: "127.0.0.1") |
+| | userAgent | text | userAgent del origen del bloqueo (ej: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36") |
+| | | | ***Disponible sólo en caso de error crítico*** (llave primaria duplicada, disco lleno...): |
+| errors | | collection of objects | |
+| | message | text | Mensaje de error |
+| | component signature | text | firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) |
+| | errCode | number | Código de error |
+
+(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
+
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using `.drop()`, this error can be returned when dk force drop if stamp changed option is used. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
+| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
+| `dk status mild validation error` | 7 | Can be returned by the developer only in validate events and do not require |
+| `dk status serious error` | 4 | A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. **Associated statusText**: "Other error" |
+| `dk status stamp has changed` | 2 | The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed" |
+
+#### Ejemplo 1
+
+Ejemplo con error:
+
+```4d
+ var $employee : cs.EmployeeEntity
+ var $status : Object
+ $employee:=ds.Employee.get(716)
+ $status:=$employee.lock()
+ Case of
+ :($status.success)
+ ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
+ :($status.status=dk status stamp has changed)
+ ALERT($status.statusText)
+ End case
+```
+
+#### Ejemplo 2
+
+Ejemplo con la opción `dk reload if stamp changed`:
+
+```4d
+ var $employee : cs.EmployeeEntity
+ var $status : Object
+ $employee:=ds.Employee.get(717)
+ $status:=$employee.lock(dk reload if stamp changed)
+ Case of
+ :($status.success)
+ ALERT("You have locked "+$employee.firstName+" "+$employee.lastName)
+ :($status.status=dk status entity does not exist anymore)
+ ALERT($status.statusText)
+ End case
+```
+
+
+
+
+
+## .next()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.next()** : 4D.Entity
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | :-------------------------: | ----------------------------------------------------------------------------------------------------------- |
+| Resultado | 4D.Entity | <- | Referencia a la siguiente entidad en la selección de entidades (Null si no se encuentra) |
+
+
+
+#### Descripción
+
+La función `.next()` devuelve una referencia a la siguiente entidad en la selección de entidades a la que pertenece la entidad.
+
+Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection()](#getselection) devuelve Null), la función devuelve un valor Null.
+
+Si no hay una entidad siguiente válida en la selección de entidades (es decir, se encuentra en la última entidad de la selección), la función devuelve Null. Si la siguiente entidad ha sido descartada, la función devuelve la siguiente entidad válida (y eventualmente Null).
+
+#### Ejemplo
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee; $nextEmployee : cs.EmployeeEntity
+ $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
+ $employee:=$employees[0]
+ $nextEmployee:=$employee.next() //$nextEmployee es la segunda entidad de entidad
+selection $employees
+
+```
+
+
+
+
+
+## .previous()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.previous()** : 4D.Entity
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | :-------------------------: | ---------------------------------------------------------------------------------------------------------- |
+| Resultado | 4D.Entity | <- | Referencia a la entidad anterior en la selección de entidades (Null si no se encuentra) |
+
+
+
+#### Descripción
+
+La función `.previous()` devuelve una referencia a la entidad anterior en la selección de entidades a la que pertenece la entidad.
+
+Si la entidad no pertenece a ninguna entity selection (es decir, [.getSelection()](#getselection) devuelve Null), la función devuelve un valor Null.
+
+Si no hay una entidad anterior válida en la selección de entidades (es decir, se encuentra en la primera entidad de la selección), la función devuelve Null. Si la entidad anterior ha sido soltada, la función devuelve la entidad válida anterior (y eventualmente Null).
+
+#### Ejemplo
+
+```4d
+ var $employees : cs.EmployeeSelection
+ var $employee; $previousEmployee : cs.EmployeeEntity
+ $employees:=ds.Employee.query("lastName = :1";"H@") //Esta selección de entidades contiene 3 entidades
+ $employee:=$employees[1]
+ $previousEmployee:=$employee.previous() //$previousEmployee es la primera entidad de la selección de entidades $employees
+```
+
+
+
+
+
+## .reload()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.reload()** : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ------------- |
+| Resultado | Object | <- | Objeto estado |
+
+
+
+#### Descripción
+
+La función `.reload()` recarga el contenido de la entidad en memoria, según la información almacenada en la tabla relacionada con la dataclass en el datastore. La recarga se realiza sólo si la entidad sigue existiendo con la misma llave primaria.
+
+**Resultado**
+
+El objeto devuelto por `.reload( )` contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| --------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
+| success | boolean | True si la acción de recarga tiene éxito, False en caso contrario. ***Disponible sólo en caso de error***: |
+| status(\*) | number | Código de error, ver abajo |
+| statusText(\*) | text | Descripción del error, ver abajo |
+
+(\*) Los siguientes valores pueden ser devueltos en las propiedades *status* y *statusText* del objeto *Result* en caso de error:
+
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using `.drop()`, this error can be returned when `dk force drop if stamp changed` option is used. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
+| `dk status serious error` | 4 | A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. ***statusText asociado***: "Other error" |
+
+#### Ejemplo
+
+```4d
+ var $employee : cs.EmployeeEntity
+ var $employees : cs.EmployeeSelection
+ var $result : Object
+
+ $employees:=ds.Employee.query("lastName=:1";"Hollis")
+ $employee:=$employees[0]
+ $employee.firstName:="Mary"
+ $result:=$employee.reload()
+ Case of
+ :($result.success)
+ ALERT("Reload has been done")
+ :($result.status=dk status entity does not exist anymore)
+ ALERT("The entity has been dropped")
+ End case
+```
+
+
+
+
+
+## .save()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------- |
+| 21 | Added status 7 and 8 |
+| 17 | Añadidos |
+
+
+
+**.save**( { *mode* : Integer } ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ----------------------------------------------------------------- |
+| mode | Integer | -> | `dk auto merge`: activa el modo "automatic merge" |
+| Resultado | Object | <- | Resultado de la operación guardar |
+
+
+
+#### Descripción
+
+La función `.save()` guarda los cambios realizados en la entidad en la tabla relacionada con su dataClass. Debe llamar a este método después de crear o modificar una entidad si quiere guardar los cambios realizados en ella.
+
+La operación de guardar se ejecuta sólo si se ha "tocado" al menos un atributo de la entidad (ver las funciones [`.touched()`](#touched) y [`.touchedAttributes()`](#touchedattributes)). En caso contrario, la función no hace nada (no se llama al activador).
+
+En una aplicación multiusuario o multiproceso, la función `.save()` se ejecuta con el mecanismo del ["bloqueo optimista"](ORDA/entities.md#entity-locking), en el que un contador interno (stamp) se incrementa automáticamente cada vez que se guarda el registro.
+
+Por defecto, si se omite el parámetro *mode*, el método devolverá un error (ver más abajo) siempre que la misma entidad haya sido modificada por otro proceso o usuario mientras tanto, sin importar el atributo o atributos modificados.
+
+En caso contrario, se puede pasar la opción `dk auto merge` en el parámetro *mode*: cuando el modo "automatic merge" está activado, una modificación realizada simultáneamente por otro proceso/usuario en la misma entidad pero en un atributo diferente no dará lugar a un error. Los datos resultantes guardados en la entidad serán la combinación (la "fusión") de todas las modificaciones no concurrentes (si se aplicaron modificaciones al mismo atributo, el guardado falla y se devuelve un error, incluso con el modo de fusión automática).
+
+> El modo de fusión automática no está disponible para los atributos de tipo Imagen, Objeto y Texto cuando se almacenan fuera del registro. Los cambios concurrentes en estos atributos darán lugar a un error `dk status stamp has changed`.
+
+**Resultado**
+
+El objeto devuelto por `.save()` contiene las siguientes propiedades:
+
+| Propiedad | | Tipo | Descripción |
+| ------------ | ----------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| success | | boolean | True si la acción guardar tiene éxito, false en caso contrario. |
+| | | | ***Disponible sólo si se utiliza la opción `dk auto merge`***: |
+| autoMerged | | boolean | True si se ha realizado una fusión automática, False en caso contrario. |
+| | | | ***Disponible sólo en caso de error***: |
+| status | | number | Código de error, [ver abajo](#status-and-statustext) |
+| statusText | | text | Descripción del error, [ver abajo](#status-and-statustext) |
+| | | | ***Disponible sólo en caso de error de bloqueo pesimista***: |
+| lockKindText | | text | "Locked by record" |
+| lockInfo | | object | Información sobre el origen del bloqueo |
+| | task_id | number | Id del proceso |
+| | user_name | text | Nombre de usuario de la sesión en la máquina |
+| | user4d_alias | text | Alias usuario si está definido por `SET USER ALIAS`, si no, nombre de usuario en el directorio 4D |
+| | host_name | text | Nombre de la máquina |
+| | task_name | text | Nombre del proceso |
+| | client_version | text | |
+| | | | ***Disponible sólo en caso de error crítico*** (error crítico - puede ser intentar duplicar una llave primaria, disco lleno...): |
+| errors | | collection of objects | |
+| | message | text | Mensaje de error |
+| | componentSignature | text | Firma del componente interno (por ejemplo, "dmbg" significa el componente de la base) |
+| | errCode | number | Código de error |
+
+##### status y statusText
+
+Los siguientes valores pueden ser devueltos en las propiedades `status`y `statusText` del objeto Result en caso de error:
+
+| Constante | Valor | Comentario |
+| ----------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `dk status automerge failed` | 6 | (Only if the `dk auto merge` option is used) The automatic merge option failed when saving the entity. **Associated statusText**: "Auto merge failed" |
+| `dk status entity does not exist anymore` | 5 | La entidad ya no existe en los datos. Este error puede ocurrir en los siguientes casos:
la entidad ha sido eliminada (el marcador ha cambiado y ahora el espacio de memoria está libre)
la entidad ha sido eliminada y reemplazada por otra con otra clave primaria (el marcador ha cambiado y una nueva entidad ahora utiliza el espacio memoria). When using `.drop()`, this error can be returned when `dk force drop if stamp changed` option is used. Cuando se utiliza `.lock()`, este error puede ser devuelto cuando se utiliza la opción `dk reload if stamp changed`
**statusText asociado**: "Entity does not exist anymore" |
+| `dk status locked` | 3 | La entidad está bloqueada por un bloqueo pesimista. **statusText asociado**: "Already locked" |
+| `dk status validation failed` | 7 | Non fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Mild Validation Error" |
+| `dk status serious error` | 4 | A serious error is a low-level database error (e.g. duplicated key), a hardware error, etc. **Associated statusText**: "Other error" |
+| `dk status serious validation error` | 8 | Fatal error sent by the developer for a [validate event](../ORDA/orda-events.md). **Associated statusText**: "Serious Validation Error" |
+| `dk status stamp has changed` | 2 | The internal stamp value of the entity does not match the one of the entity stored in the data (optimistic lock).
with `.save()`: error only if the `dk auto merge` option is not used
with `.drop()`: error only if the `dk force drop if stamp changed` option is not used
with `.lock()`: error only if the `dk reload if stamp changed` option is not used
**Associated statusText**: "Stamp has changed" |
+| `dk status wrong permission` | 1 | Los privilegios actuales no permiten guardar la entidad. **Associated statusText**: "Permission Error" |
+
+#### Ejemplo 1
+
+Crear una nueva entidad:
+
+```4d
+ var $status : Object
+ var $employee : cs.EmployeeEntity
+ $employee:=ds.Employee.new()
+ $employee.firstName:="Mary"
+ $employee.lastName:="Smith"
+ $status:=$employee.save()
+ If($status.success)
+ ALERT("Employee created")
+ End if
+```
+
+#### Ejemplo 2
+
+Actualizando una entidad sin opción `dk auto merge`:
+
+```4d
+ var $status : Object
+ var $employee : cs.EmployeeEntity
+ var $employees : cs.EmployeeSelection
+ $employees:=ds.Employee.query("lastName=:1";"Smith")
+ $employee:=$employees.first()
+ $employee.lastName:="Mac Arthur"
+ $status:=$employee.save()
+ Case of
+ :($status.success)
+ ALERT("Employee updated")
+ :($status.status=dk status stamp has changed)
+ ALERT($status.statusText)
+ End case
+```
+
+#### Ejemplo 3
+
+Actualización de una entidad con la opción `dk auto merge`:
+
+```4d
+ var $status : Object
+
+ var $employee : cs.EmployeeEntity
+ var $employees : cs.EmployeeSelection
+
+ $employees:=ds.Employee.query("lastName=:1";"Smith")
+ $employee:=$employees.first()
+ $employee.lastName:="Mac Arthur"
+ $status:=$employee.save(dk auto merge)
+ Case of
+ :($status.success)
+ ALERT("Employee updated")
+ :($status.status=dk status automerge failed)
+ ALERT($status.statusText)
+ End case
+```
+
+
+
+
+
+## .toObject()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.toObject**() : Object **.toObject**( *filterString* : Text { ; *options* : Integer} ) : Object **.toObject**( *filterCol* : Collection { ; *options* : Integer } ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------ | ---------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| filterString | Text | -> | Atributo(s) a extraer (cadena separada por comas) |
+| filterCol | Collection | -> | Colección de atributos a extraer |
+| options | Integer | -> | `dk with primary key`: adds the \_\_KEY property; `dk with stamp`: adds the \_STAMP property |
+| Resultado | Object | <- | Objeto creado a partir de la entidad |
+
+
+
+#### Descripción
+
+La función `.toObject()` devuelve un objeto que ha sido construido a partir de la entidad. Los nombres de las propiedades en el objeto coinciden con los nombres de los atributos de la entidad.
+
+Si no se especifica ningún filtro, o si el parámetro *filterString* contiene una cadena vacía o "\*", el objeto devuelto contendrá:
+
+- todos los atributos de la entidad de almacenamiento
+- atributos de [kind](DataClassClass.md#attributename) `relatedEntity`: se obtiene una propiedad con el mismo nombre que la entidad relacionada (nombre del enlace muchos-a-uno). El atributo se extrae con la forma simple.
+- atributos de [kind](DataClassClass.md#attributename) `relatedEntities`: no se devuelve el atributo.
+
+En el primer parámetro, se pasa el atributo o atributos de la entidad a extraer. Puede pasar:
+
+- *filterString*: una cadena con rutas de propiedades separadas por comas: "propertyPath1, propertyPath2, ...", o
+- *filterCol*: una colección de cadenas: \["propertyPath1","propertyPath2";...]
+
+Si se especifica un filtro para los atributos cuyo [kind](DataClassClass.md#attributename) es relatedEntity:
+
+- propertyPath = "relatedEntity" -> se extrae de forma sencilla: un objeto con la propiedad \_\_KEY (llave primaria).
+- propertyPath = "relatedEntity.\*" -> se extraen todas las propiedades
+- propertyPath = "relatedEntity.propertyName1; relatedEntity.propertyName2; ..." -> sólo se extraen esas propiedades
+
+Si se especifica un filtro para los atributos cuyo [kind](DataClassClass.md#attributename) es relatedEntities:
+
+- propertyPath = "relatedEntities.\*" -> se extraen todas las propiedades
+- propertyPath = "relatedEntities.propertyName1; relatedEntities.propertyName2; ..." -> sólo se extraen esas propiedades
+
+En el parámetro *options*, puedes pasar el selector `dk with primary key` y/o `dk with stamp` para agregar las llaves primarias y/o los stamps en los objetos extraídos.
+
+:::caution Atención
+
+Si utiliza otro atributo distinto de la llave primaria como atributo Uno en una relación, el valor de este atributo se escribirá en la propiedad "__KEY". Si utiliza otro atributo distinto de la llave primaria como atributo Uno en una relación, el valor de este atributo se escribirá en la propiedad "__KEY".
+
+:::
+
+#### Ejemplo 1
+
+En todos los ejemplos de esta sección se utilizará la siguiente estructura:
+
+
+
+Sin parámetro de filtro:
+
+```4d
+employeeObject:=employeeSelected.toObject()
+```
+
+Ejemplo con el tipo relatedEntity con una forma simple:
+
+```4d
+{
+ "ID": 413,
+ "firstName": "Greg",
+ "lastName": "Wahl",
+ "salary": 0,
+ "birthDate": "1963-02-01T00:00:00.000Z",
+ "woman": false,
+ "managerID": 412,
+ "employerID": 20,
+ "photo": "[object Picture]",
+ "extra": null,
+ "employer": { // relatedEntity extracted with simple form
+ "__KEY": 20
+ },
+ "manager": {
+ "__KEY": 412
+ }
+}
+```
+
+#### Ejemplo 2
+
+Extraer la llave primaria y el sello:
+
+```4d
+employeeObject:=employeeSelected.toObject("";dk with primary key+dk with stamp)
+```
+
+Ejemplo con el tipo relatedEntity con una forma simple:
+
+```4d
+{
+ "__KEY": 413,
+ "__STAMP": 1,
+ "ID": 413,
+ "firstName": "Greg",
+ "lastName": "Wahl",
+ "salary": 0,
+ "birthDate": "1963-02-01T00:00:00.000Z",
+ "woman": false,
+ "managerID": 412,
+ "employerID": 20,
+ "photo": "[object Picture]",
+ "extra": null,
+ "employer": {
+ "__KEY": 20
+ },
+ "manager": {
+ "__KEY": 412
+ }
+}
+```
+
+#### Ejemplo 3
+
+Extrayendo todas las propiedades de `relatedEntities`:
+
+```4d
+employeeObject:=employeeSelected.toObject("directReports.*")
+```
+
+```4d
+{
+ "directReports": [
+ {
+ "ID": 418,
+ "firstName": "Lorena",
+ "lastName": "Boothe",
+ "salary": 44800,
+ "birthDate": "1970-10-02T00:00:00.000Z",
+ "woman": true,
+ "managerID": 413,
+ "employerID": 20,
+ "photo": "[object Picture]",
+ "extra": null,
+ "employer": {
+ "__KEY": 20
+ },
+ "manager": {
+ "__KEY": 413
+ }
+ },
+ {
+ "ID": 419,
+ "firstName": "Drew",
+ "lastName": "Caudill",
+ "salary": 41000,
+ "birthDate": "2030-01-12T00:00:00.000Z",
+ "woman": false,
+ "managerID": 413,
+ "employerID": 20,
+ "photo": "[object Picture]",
+ "extra": null,
+ "employer": {
+ "__KEY": 20
+ },
+ "manager": {
+ "__KEY": 413
+ }
+ },
+ {
+ "ID": 420,
+ "firstName": "Nathan",
+ "lastName": "Gomes",
+ "salary": 46300,
+ "birthDate": "2010-05-29T00:00:00.000Z",
+ "woman": false,
+ "managerID": 413,
+ "employerID": 20,
+ "photo": "[object Picture]",
+ "extra": null,
+ "employer": {
+ "__KEY": 20
+ },
+ "manager": {
+ "__KEY": 413
+ }
+ }
+ ]
+}
+```
+
+#### Ejemplo 4
+
+Extracción de algunas propiedades de `relatedEntities`:
+
+```4d
+ employeeObject:=employeeSelected.toObject("firstName, directReports.lastName")
+```
+
+Ejemplo con el tipo relatedEntity con una forma simple:
+
+```4d
+{
+ "firstName": "Greg",
+ "directReports": [
+ {
+ "lastName": "Boothe"
+ },
+ {
+ "lastName": "Caudill"
+ },
+ {
+ "lastName": "Gomes"
+ }
+ ]
+}
+```
+
+#### Ejemplo 5
+
+Extrayendo un `relatedEntity` con una forma simple:
+
+```4d
+ $coll:=New collection("firstName";"employer")
+ employeeObject:=employeeSelected.toObject($coll)
+```
+
+Ejemplo con el tipo relatedEntity con una forma simple:
+
+```4d
+{
+ "firstName": "Greg",
+ "employer": {
+ "__KEY": 20
+ }
+}
+```
+
+#### Ejemplo 6
+
+Extrayendo todas las propiedades de una `relatedEntity`:
+
+```4d
+ employeeObject:=employeeSelected.toObject("employer.*")
+```
+
+Ejemplo con el tipo relatedEntity con una forma simple:
+
+```4d
+{
+ "employer": {
+ "ID": 20,
+ "name": "India Astral Secretary",
+ "creationDate": "1984-08-25T00:00:00.000Z",
+ "revenues": 12000000,
+ "extra": null
+ }
+}
+```
+
+#### Ejemplo 7
+
+Extracción de algunas propiedades de una `relatedEntity`:
+
+```4d
+ $col:=New collection
+ $col.push("employer.name")
+ $col.push("employer.revenues")
+ employeeObject:=employeeSelected.toObject($col)
+```
+
+Ejemplo con el tipo relatedEntity con una forma simple:
+
+```4d
+{
+ "employer": {
+ "name": "India Astral Secretary",
+ "revenues": 12000000
+ }
+}
+```
+
+
+
+
+
+## .touched()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.touched()** : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------------------------- |
+| Resultado | Boolean | <- | True si se ha modificado al menos un atributo de la entidad y aún no se ha guardado, si no, False |
+
+
+
+#### Descripción
+
+La función `.touched()` devuelve True si al menos un atributo de la entidad ha sido modificado desde que la entidad fue cargada en memoria o guardada. Puede utilizar esta función para determinar si necesita guardar la entidad.
+
+Esto solo se aplica a los atributos de [`kind`](DataClassClass.md#returned-object) "storage" o "relatedEntity".
+
+Para una nueva entidad que acaba de ser creada (con [`.new()`](DataClassClass.md#new)), la función devuelve False. Sin embargo, en este contexto, si accede a un atributo cuya [propiedad `autoFilled`](./DataClassClass.md#returned-object) es True, la función `.touched()` entonces devolverá True. Por ejemplo, después de ejecutar `$id:=ds.Employee.ID` para una nueva entidad (asumiendo que el atributo ID tiene la propiedad "Autoincrement"), `.touched()` devuelve True.
+
+#### Ejemplo
+
+En este ejemplo, comprobamos si es necesario guardar la entidad:
+
+```4d
+ var $emp : cs.EmployeeEntity
+ $emp:=ds.Employee.get(672)
+ $emp.firstName:=$emp.firstName //Aunque se actualice con el mismo valor, el atributo se marca como tocado
+
+ If($emp.touched()) //si se ha modificado al menos uno de los atributos
+ $emp.save()
+ End if // de lo contrario, no es necesario guardar la entidad
+```
+
+
+
+
+
+## .touchedAttributes()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.touchedAttributes()** : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ----------------------------------------------- |
+| Resultado | Collection | <- | Nombres de atributos tocados, o colección vacía |
+
+
+
+#### Descripción
+
+La función`.touchedAttributes()` devuelve los nombres de los atributos que han sido modificados desde que la entidad fue cargada en memoria.
+
+Esto solo se aplica a los atributos de [`kind`](DataClassClass.md#returned-object) "storage" o "relatedEntity".
+
+En el caso de que se haya tocado una entidad relacionada (es decir, la llave externa), se devuelve el nombre de la entidad relacionada y el nombre de su llave primaria.
+
+Si no se ha tocado ningún atributo de entidad, el método devuelve una colección vacía.
+
+#### Ejemplo 1
+
+```4d
+ var $touchedAttributes : Collection
+ var $emp : cs.EmployeeEntity
+
+ $touchedAttributes:=New collection
+ $emp:=ds.Employee.get(725)
+ $emp.firstName:=$emp.firstName //Aunque se actualice con el mismo valor, el atributo se marca como tocado
+ $emp.lastName:="Martin"
+ $touchedAttributes:=$emp.touchedAttributes()
+ //$touchedAttributes: ["firstName","lastName"]
+```
+
+#### Ejemplo 2
+
+```4d
+ var $touchedAttributes : Collection
+ var $emp : cs.EmployeeEntity
+ var $company : cs.CompanyEntity
+
+ $touchedAttributes:=New collection
+
+ $emp:=ds.Employee.get(672)
+ $emp.firstName:=$emp.firstName
+ $emp.lastName:="Martin"
+
+ $company:=ds.Company.get(121)
+ $emp.employer:=$company
+
+ $touchedAttributes:=$emp.touchedAttributes()
+
+ //collection $touchedAttributes: ["firstName","lastName","employer","employerID"]
+```
+
+En este caso:
+
+- firstName y lastName tienen un tipo `storage`
+- el empleador tiene un tipo `relatedEntity`
+- employerID es la llave extranjera de la entidad relacionada con el empleador
+
+
+
+
+
+## .unlock()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 | Añadidos |
+
+
+
+**.unlock()** : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ------------- |
+| Resultado | Object | <- | Objeto estado |
+
+
+
+#### Descripción
+
+La función `.unlock()` elimina el bloqueo pesimista del registro que coincide con la entidad en el datastore y la tabla relacionada con su dataclass.
+
+> Para más información, por favor consulte la sección [Bloqueo de entidades](ORDA/entities.md#bloqueo-de-una-entidad).
+
+Un registro se desbloquea automáticamente cuando ya no es referenciado por ninguna entidad en el proceso de bloqueo (por ejemplo: si el bloqueo se pone sólo en una referencia local de una entidad, la entidad y, por tanto, el registro se desbloquea cuando el proceso termina).
+
+Cuando un registro se bloquea, debe desbloquearse desde el proceso de bloqueo y en la referencia de la entidad que puso el bloqueo. Por ejemplo:
+
+```4d
+ $e1:=ds.Emp.all()[0]
+ $e2:=ds.Emp.all()[0]
+ $res:=$e1.lock() //$res.success=true
+ $res:=$e2.unlock() //$res.success=false
+ $res:=$e1.unlock() //$res.success=true
+```
+
+:::note
+
+`unlock()` debe ser llamado tantas veces como [`lock()`](#lock) fue llamado en el mismo proceso para que la entidad sea realmente desbloqueada.
+
+:::
+
+**Resultado**
+
+El objeto devuelto por `.unlock()` contiene la siguiente propiedad:
+
+| Propiedad | Tipo | Descripción |
+| ------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| success | Boolean | True si la acción de desbloquear tiene éxito, False en caso contrario. Si el desbloqueo se realiza en una entidad abandonada, en un registro no bloqueado o en un registro bloqueado por otro proceso o entidad, el éxito es False. |
+| wasNotLocked | Boolean | (sólo si "success" es False) True si la entidad no fue bloqueada en el proceso. |
+
+#### Ejemplo
+
+```4d
+ var $employee : cs.EmployeeEntity
+ var $status : Object
+
+ $employee:=ds.Employee.get(725)
+ $status:=$employee.lock()
+ ... //processing
+ $status:=$employee.unlock()
+ If($status.success)
+ ALERT("The entity is now unlocked")
+ End if
+```
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/EntitySelectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/EntitySelectionClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/EntitySelectionClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/EntitySelectionClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/FileClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/FileClass.md
new file mode 100644
index 00000000000000..164dfffa0e1dc4
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/FileClass.md
@@ -0,0 +1,799 @@
+---
+id: FileClass
+title: File
+---
+
+Los objetos `File` se crean con el comando [`File`](../commands/file.md). Contienen referencias a archivos de disco que pueden o no existir realmente en el disco. Por ejemplo, cuando ejecuta el comando `File` para crear un nuevo archivo, se crea un objeto `File` válido pero en realidad nada se guarda en el disco hasta que se llama a la función [`file.create( )`](#create).
+
+### Ejemplo
+
+El siguiente ejemplo crea un archivo de preferencias en la carpeta del proyecto:
+
+```code4d
+var $created : Boolean
+$created:=File("/PACKAGE/SpecialPrefs/"+Current user+".myPrefs").create()
+```
+
+### Rutas de acceso
+
+Los objetos `File` soportan varios nombres de ruta, incluyendo la sintaxis `filesystems` o `posix`. Los nombres de ruta soportados se detallan en la página [**Rutas de acceso**](../Concepts/paths.md).
+
+### Objeto File
+
+| |
+| ------------------------------------------------------------------------------------------------------------------------------- |
+| [](#copyto) |
+| [](#create) |
+| [](#createalias) |
+| [](#creationdate) |
+| [](#creationtime) |
+| [](#delete) |
+| [](#exists) |
+| [](#extension) |
+| [](#fullname) |
+| [](#getappinfo) |
+| [](#getcontent) |
+| [](#geticon) |
+| [](#gettext) |
+| [](#hidden) |
+| [](#isalias) |
+| [](#isfile) |
+| [](#isfolder) |
+| [](#iswritable) |
+| [](#modificationdate) |
+| [](#modificationtime) |
+| [](#moveto) |
+| [](#name) |
+| [](#open) |
+| [](#original) |
+| [](#parent) |
+| [](#path) |
+| [](#platformpath) |
+| [](#rename) |
+| [](#setappinfo) |
+| [](#setcontent) |
+| [](#settext) |
+| [](#size) |
+
+## 4D.File.new()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R6 | Añadidos |
+
+
+
+
+
+**4D.File.new** ( *path* : Text { ; *pathType* : Integer } ) : 4D.File **4D.File.new** ( *fileConstant* : Integer ) : 4D.File
+
+#### Descripción
+
+Lanzamiento Es idéntico al comando [`File`](../commands/file.md) (atajo).
+
+> Se recomienda utilizar el comando de acceso directo [`File`](../commands/file.md) en lugar de `4D.File.new()`.
+
+
+
+
+
+## .create()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+
+
+**No disponible para archivos ZIP**
+
+**.create()** : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | --------------------------- | ------------------------------------------------------------------ |
+| Resultado | Boolean | <- | True si el archivo se ha creado con éxito, false en caso contrario |
+
+
+
+#### Descripción
+
+La función `.create()` crea un archivo en el disco según las propiedades del objeto `File`.
+
+Si es necesario, la función crea la jerarquía de carpetas como se describe en las propiedades [platformPath](#platformpath) o [path](#path). Si el archivo ya existe en el disco, la función no hace nada (no se lanza ningún error) y devuelve false.
+
+**Valor devuelto**
+
+- **True** si el archivo se crea con éxito;
+- **False** si ya existe un archivo con el mismo nombre o si ha ocurrido un error.
+
+#### Ejemplo
+
+Creación de un archivo de preferencias en la carpeta principal:
+
+```4d
+ var $created : Boolean
+ $created:=File("/PACKAGE/SpecialPrefs/"+Current user+".myPrefs").create()
+```
+
+
+
+
+
+## .createAlias()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.createAlias**( *destinationFolder* : 4D.Folder ; *aliasName* : Text { ; *aliasType* : Integer } ) : 4D.File
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------------- | ------------------------- | --------------------------- | ---------------------------------------------------- |
+| destinationFolder | 4D.Folder | -> | Carpeta de destino para el alias o el acceso directo |
+| aliasName | Text | -> | Nombre del alias o del atajo |
+| aliasType | Integer | -> | Tipo de enlace del alias |
+| Resultado | 4D.File | <- | Referencia del archivo del alias o de atajo |
+
+
+
+#### Descripción
+
+La función `.createAlias()` crea un alias (macOS) o un acceso directo (Windows) al archivo con el nombre *aliasName* especificado en la carpeta designada por el objeto *destinationFolder*.
+
+Pase el nombre del alias o del acceso directo a crear en el parámetro *aliasName*.
+
+Por defecto en macOS, la función crea un alias estándar. También puede crear un enlace simbólico utilizando el parámetro *aliasType*. Las siguientes constantes están disponibles:
+
+| Constante | Valor | Comentario |
+| ------------------ | ----- | ----------------------------------------------------- |
+| `fk alias link` | 0 | Enlace de alias (por defecto) |
+| `fk symbolic link` | 1 | Enlace simbólico (sólo para macOS) |
+
+En Windows, siempre se crea un acceso directo (archivo.lnk) (el parámetro *aliasType* es ignorado).
+
+**Objeto devuelto**
+
+Un objeto `4D.File` con la propiedad `isAlias` definida en **true**.
+
+#### Ejemplo
+
+Quiere crear un alias para un archivo en su carpeta principal:
+
+```4d
+ $myFile:=Folder(fk documents folder).file("Archives/ReadMe.txt")
+ $aliasFile:=$myFile.createAlias(File("/PACKAGE");"ReadMe")
+```
+
+
+
+
+
+
+
+
+
+## .delete()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.delete**()
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `.delete()` borra el archivo.
+
+Si el archivo no existe en el disco, la función no hace nada (no se genera ningún error).
+
+Si el archivo está abierto, el resultado depende del sistema operativo:
+
+- en Windows, se genera un error,
+- en macOS, no se genera ningún error y el archivo se elimina.
+
+:::caution
+
+`.delete()` puede eliminar cualquier archivo de un disco. Esto incluye los documentos creados con otras aplicaciones, así como las propias aplicaciones. `.delete()` debe utilizarse con extrema precaución. Eliminar un archivo es una operación permanente y no se puede deshacer.
+
+:::
+
+#### Ejemplo
+
+Desea eliminar un archivo específico en la carpeta de la base de datos:
+
+```4d
+ $tempo:=File("/PACKAGE/SpecialPrefs/"+Current user+".prefs")
+ If($tempo.exists)
+ $tempo.delete()
+ ALERT("User preference file deleted.")
+ End if
+```
+
+
+
+
+
+
+
+
+
+
+
+## .getAppInfo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | --------------------------------------------- |
+| 20 R9 | Lectura de los UUIDs en los ejecutables macOS |
+| 19 | Añadidos |
+
+
+
+**.getAppInfo**() : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | --------------------------- | ---------------------------------------- |
+| Resultado | Object | <- | Información del archivo de la aplicación |
+
+
+
+#### Descripción
+
+La función `.getAppInfo()` devuelve el contenido de la información de un archivo de aplicación como un objeto.
+
+La función debe ser usada con un archivo existente y soportado: **.plist** (todas las plataformas), **.exe**/**.dll** (Windows), o **ejecutable macOS**. Si el archivo no existe en el disco o no es un archivo soportado, la función devuelve un objeto vacío (no se genera ningún error).
+
+**Objeto devuelto con un archivo .plist (todas las plataformas)**
+
+El contenido xml del archivo se analiza y las llaves se devuelven como propiedades del objeto, conservando sus tipos (texto, booleano, numérico). `.plist dict` se devuelve como un objeto JSON y `.plist array` se devuelve como un array JSON.
+
+:::note
+
+La función sólo admite archivos .plist en formato xml (basados en texto). Se devuelve un error si se utiliza con un archivo .plist en formato binario.
+
+:::
+
+**Objeto devuelto con un archivo .exe o .dll (sólo Windows)**
+
+Todos los valores de propiedades son de tipo Texto.
+
+| Propiedad | Tipo |
+| ---------------- | ---- |
+| InternalName | Text |
+| ProductName | Text |
+| CompanyName | Text |
+| LegalCopyright | Text |
+| ProductVersion | Text |
+| FileDescription | Text |
+| FileVersion | Text |
+| OriginalFilename | Text |
+
+**Objeto devuelto con un archivo ejecutable macOS (solo macOS)**
+
+:::note
+
+Un archivo ejecutable macOS se encuentra dentro de un paquete (por ejemplo, myApp.app/Contents/MacOS/myApp).
+
+:::
+
+La función devuelve un objeto `archs` que contiene una colección de objetos que describen cada arquitectura encontrada en el ejecutable (un gran ejecutable puede integrar varias arquitecturas). Cada objeto de la colección contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| --------- | ------ | -------------------------------------------------------------------------------------- |
+| name | Text | Nombre de la arquitectura ("arm64" o "x86_64") |
+| type | Number | Identificador numérico de la arquitectura |
+| uuid | Text | Representación textual del uuid del ejecutable |
+
+#### Ejemplo 1
+
+```4d
+ // mostrar información de derechos de autor de una info.plist (cualquier plataforma)
+var $infoPlistFile : 4D.File
+var $info : Object
+$infoPlistFile:=File("/RESOURCES/info.plist")
+$info:=$infoPlistFile.getAppInfo()
+ALERT($info.Copyright)
+```
+
+#### Ejemplo 2
+
+```4d
+ // mostrar información de copyright del archivo .exe de aplicación (windows)
+var $exeFile : 4D.File
+var $info : Object
+$exeFile:=File(Application file; fk platform path)
+$info:=$exeFile.getAppInfo()
+ALERT($info.LegalCopyright)
+```
+
+#### Ejemplo 3
+
+```4d
+ // Obtener uuids de una aplicación (macOS)
+var $app:=File("/Applications/myApp.app/Contents/MacOS/myApp")
+var $info:=$app.getAppInfo()
+```
+
+Resultado en *$info*:
+
+```json
+{
+ "archs":
+ [
+ {
+ "name":"x86_64",
+ "type":16777223,
+ "uuid":"3840983CDA32392DA4D1D32F08AB3212"
+ },
+ {
+ "name":"arm64",
+ "type":16777228,
+ "uuid":"E49F6BA275B931DDA183C0B0CDF0ADAF"
+ }
+ ]
+}
+```
+
+#### Ver también
+
+[.setAppInfo()](#setappinfo)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## .moveTo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.moveTo**( *destinationFolder* : 4D.Folder { ; *newName* : Text } ) : 4D.File
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------------- | ------------------------- | --------------------------- | -------------------------------------- |
+| destinationFolder | 4D.Folder | -> | Carpeta de destino |
+| newName | Text | -> | Nombre completo del archivo trasladado |
+| Resultado | 4D.File | <- | Archivo movido |
+
+
+
+#### Descripción
+
+La función `.moveTo()` mueve o renombra el objeto `File` en la carpeta especificada *destinationFolder*.
+
+La *destinationFolder* debe existir en el disco, de lo contrario se genera un error.
+
+Por defecto, el archivo conserva su nombre cuando se mueve. Si desea renombrar el archivo desplazado, pase el nombre completo en el parámetro *newName*. El nuevo nombre debe cumplir con las reglas de nomenclatura (por ejemplo, no debe contener caracteres como ":", "/", etc.), de lo contrario se devuelve un error.
+
+**Objeto devuelto**
+
+El objeto `File` movido.
+
+#### Ejemplo
+
+```4d
+$DocFolder:=Folder(fk documents folder)
+$myFile:=$DocFolder.file("Current/Infos.txt")
+$myFile.moveTo($DocFolder.folder("Archives");"Infos_old.txt")
+```
+
+
+
+
+
+
+
+## .open()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R7 | Añadidos |
+
+
+
+**.open**( { *mode* : Text } ) : 4D.FileHandle **.open**( { *options* : Object } ) : 4D.FileHandle
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------------------------------ | --------------------------- | ----------------------------------------------------------- |
+| mode | Text | -> | Modo de apertura: "read", "write", "append" |
+| options | Object | -> | Opciones de apertura |
+| Resultado | [4D.FileHandle](FileHandleClass) | <- | Nuevo objeto File handle |
+
+
+
+#### Descripción
+
+La función `.open()` crea y devuelve un nuevo objeto [4D.FileHandle](FileHandleClass) en el archivo, en el modo especificado o con las opciones especificadas. Puede utilizar las funciones y propiedades de la clase [4D.FileHandle](FileHandleClass) para escribir, leer o añadir contenido al archivo.
+
+Si utiliza el parámetro *mode* (texto), pase el modo de apertura para el file handle:
+
+| *mode* | Descripción |
+| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| "read" | (Por defecto) Crea un file handle para leer los valores en el archivo. Si el archivo no existe en el disco, se devuelve un error. Puede abrir tantos file handles como quiera en modo "read" en el mismo objeto File. |
+| "write" | Crea un file handle para escribir valores en el archivo (empezando por el inicio del contenido del archivo). Si el archivo no existe en el disco, se crea. Sólo se puede abrir un file handle en modo "write" en el mismo objeto File. |
+| "append" | Crea un file handle para escribir los valores en el archivo (empezando por el final del contenido del archivo). Si el archivo no existe en el disco, se crea. Sólo se puede abrir un file handle en modo "append" en el mismo objeto File. |
+
+> El valor de *mode* es sensible a las mayúsculas y minúsculas.
+
+Si utiliza el parámetro *options* (object), puede pasar más opciones para el file handle a través de las siguientes propiedades (estas propiedades se pueden leer después desde el objeto [file handle](FileHandleClass) abierto):
+
+| *options* | Tipo | Descripción | Por defecto |
+| ----------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
+| `.mode` | Text | Modo de apertura (ver *mode* arriba) | "read" |
+| `.charset` | Text | Conjunto de caracteres utilizado al leer o escribir en el archivo. Utilice el nombre estándar del conjunto (por ejemplo, "ISO-8859-1" o "UTF-8") | "UTF-8" |
+| `.breakModeRead` | Texto o número | Modo de procesamiento de los saltos de línea utilizados al leer el archivo (ver abajo) | "native" o 1 |
+| `.breakModeWrite` | Texto o número | Modo de procesamiento de los saltos de línea utilizados al escribir en el archivo (ver abajo) | "native" o 1 |
+
+La función reemplaza todos los delimitadores originales de final de línea. Por defecto, se utiliza el delimitador nativo, pero puede definir otro delimitador. Las propiedades `.breakModeRead` y `.breakModeWrite` indican el procesamiento a aplicar a los caracteres de fin de línea en el documento. Puede utilizar uno de los siguientes valores (texto o número):
+
+| Modo de ruptura en texto | Break mode en numérico (constante) | Descripción |
+| ------------------------ | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| "native" | 1 (`Document with native format`) | (Por defecto) Los saltos de línea se convierten al formato nativo del sistema operativo: LF (salto de línea) en macOS, CRLF (retorno de carro + salto de línea) en Windows |
+| "crlf" | 2 (`Document with CRLF`) | Los fines de línea se convierten en CRLF (retorno de carro + salto de línea), el formato predeterminado de Windows |
+| "cr" | 3 (`Document with CR`) | Los fines de línea se convierten en CR (retorno de carro), el formato clásico por defecto de Mac OS |
+| "lf" | 4 (`Document with LF`) | Los fines de línea se convierten en LF (salto de línea), el formato Unix y macOS por defecto |
+
+> El valor del parámetro *break mode as text* es sensible a las mayúsculas y minúsculas.
+
+#### Ejemplo
+
+Quiere crear un file handle para leer el archivo "ReadMe.txt":
+
+```4d
+var $f : 4D.File
+var $fhandle : 4D.FileHandle
+
+$f:=File("C:\\Documents\\Archives\\ReadMe.txt";fk platform path)
+$fhandle:=$f.open("read")
+
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+## .rename()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.rename**( *newName* : Text ) : 4D.File
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ----------------------- | --------------------------- | --------------------------------- |
+| newName | Text | -> | Nuevo nombre completo del archivo |
+| Resultado | 4D.File | <- | Archivo renombrado |
+
+
+
+#### Descripción
+
+La función `.rename()` renombra el archivo con el nombre que se ha pasado en *newName* y devuelve el objeto `File` renombrado.
+
+El parámetro *newName* debe cumplir con las reglas de nomenclatura (por ejemplo, no debe contener caracteres como ":", "/", etc.), de lo contrario se devuelve un error. Si ya existe un archivo con el mismo nombre, se devuelve un error.
+
+Tenga en cuenta que la función modifica el nombre completo del archivo, es decir, si no pasa una extensión en *newName*, el archivo tendrá un nombre sin extensión.
+
+**Objeto devuelto**
+
+El objeto `File` renombrado.
+
+#### Ejemplo
+
+Quiere renombrar "ReadMe.txt" como "ReadMe_new.txt":
+
+```4d
+ $toRename:=File("C:\\Documents\\Archives\\ReadMe.txt";fk platform path)
+ $newName:=$toRename.rename($toRename.name+"_new"+$toRename.extension)
+```
+
+
+
+## .setAppInfo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | --------------------------------------------- |
+| 20 R9 | Lectura de los UUIDs en los ejecutables macOS |
+| 20 | Soporte de WinIcon |
+| 19 | Añadidos |
+
+
+
+**.setAppInfo**( *info* : Object )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | -- | ----------------------------------------------------------------------- |
+| info | Object | -> | Propiedades para escribir en la información de un archivo de aplicación |
+
+
+
+#### Descripción
+
+La función `.setAppInfo()` escribe las propiedades *info* como contenido informativo de un archivo de aplicación.
+
+La función sólo se puede usar con los siguientes tipos de archivos: **.plist** (todas las plataformas), existente **.exe**/**.dll** (Windows), o **ejecutable macOS**. Si se usa con otro tipo de archivo o con un archivo **.exe**/**.dll** que ya no existe en el disco, la función no hace nada (no se genera ningún error).
+
+Parámetro ***info* con un archivo .plist (todas las plataformas)**
+
+:::note
+
+La función sólo admite archivos .plist en formato xml (basados en texto). Se devuelve un error si se utiliza con un archivo .plist en formato binario.
+
+:::
+
+Si el archivo .plist ya existe en el disco, se actualiza. De lo contrario, se creará.
+
+Cada propiedad válida definida en el parámetro objeto *info* se escribe en el archivo .plist en forma de llave. Se aceptan todos los nombre de llaves. Los tipos de valores se conservan cuando es posible.
+
+Si un conjunto de llaves en el parámetro *info* ya está definido en el archivo .plist, su valor se actualiza manteniendo su tipo original. Las demás llaves existentes en el archivo .plist no se modifican.
+
+:::note
+
+Para definir un valor de tipo Fecha, el formato a utilizar es una cadena de timestamp json formada en ISO UTC sin milisegundos ("2003-02-01T01:02:03Z") como en el editor de plist Xcode.
+
+:::
+
+**Parámetro objeto *info* con un archivo .exe o .dll (sólo Windows)**
+
+Cada propiedad válida definida en el parámetro objeto *info* se escribe en el recurso de versión del archivo .exe o .dll. Las propiedades disponibles son (toda otra propiedad será ignorada):
+
+| Propiedad | Tipo | Comentario |
+| ---------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| InternalName | Text | |
+| ProductName | Text | |
+| CompanyName | Text | |
+| LegalCopyright | Text | |
+| ProductVersion | Text | |
+| FileDescription | Text | |
+| FileVersion | Text | |
+| OriginalFilename | Text | |
+| WinIcon | Text | Ruta Posix del archivo .ico. Esta propiedad sólo se aplica a los archivos ejecutables generados por 4D. |
+
+Para todas las propiedades excepto `WinIcon`, si se pasa un texto nulo o vacío como valor, se escribe una cadena vacía en la propiedad. Si pasa un valor de tipo diferente a texto, se convierte en una cadena.
+
+Para la propiedad `WinIcon`, si el archivo del icono no existe o tiene un formato incorrecto, se genera un error.
+
+**Parámetro *info* con un archivo ejecutable macOS (sólo macOS)**
+
+*info* debe ser un objeto con una única propiedad llamada `archs` que es una colección de objetos en el formato devuelto por [`getAppInfo()`](#getappinfo). Cada objeto debe contener al menos las propiedades `type` y `uuid` (`name` no es usado).
+
+Cada objeto de la colección *info*.archs debe contener las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| --------- | ------ | ----------------------------------------------------- |
+| type | Number | Identificador numérico de la arquitectura a modificar |
+| uuid | Text | Representación textual del nuevo uuid ejecutable |
+
+#### Ejemplo 1
+
+```4d
+ // definir algunas llaves en un archivo info.plist (todas las plataformas)
+var $infoPlistFile : 4D.File
+var $info : Object
+$infoPlistFile:=File("/RESOURCES/info.plist")
+$info:=New object
+$info.Copyright:="Copyright 4D 2023" //text
+$info.ProductVersion:=12 //integer
+$info.ShipmentDate:="2023-04-22T06:00:00Z" //timestamp
+$info.CFBundleIconFile:="myApp.icns" //para macOS
+$infoPlistFile.setAppInfo($info)
+```
+
+#### Ejemplo 2
+
+```4d
+ // definir el copyright y versión de un archivo .exe (Windows)
+var $exeFile; $iconFile : 4D.File
+var $info : Object
+$exeFile:=File(Application file; fk platform path)
+$iconFile:=File("/RESOURCES/myApp.ico")
+$info:=New object
+$info.LegalCopyright:="Copyright 4D 2023"
+$info.ProductVersion:="1.0.0"
+$info.WinIcon:=$iconFile.path
+$exeFile.setAppInfo($info)
+```
+
+#### Ejemplo 3
+
+```4d
+// regenerar uuids de una aplicación (macOS)
+
+// leer uuids de myApp
+var $app:=File("/Applications/myApp.app/Contents/MacOS/myApp")
+var $info:=$app.getAppInfo()
+
+// regenera los uuids para todas las arquitecturas
+For each ($i; $info.archs)
+ $i.uuid:=Generate UUID
+End for each
+
+// actualiza la app con los nuevos uuids
+$app.setAppInfo($info)
+```
+
+#### Ver también
+
+[.getAppInfo()](#getappinfo)
+
+
+
+## .setContent()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 17 R5 | Añadidos |
+
+
+
+**.setContent** ( *content* : Blob )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | -- | ----------------------------- |
+| content | BLOB | -> | Nuevos contenidos del archivo |
+
+
+
+#### Descripción
+
+La función `.setContent( )` reescribe todo el contenido del archivo utilizando los datos almacenados en el BLOB *content*. Para obtener información sobre BLOBs, consulte la sección [BLOB](Concepts/dt_blob.md).
+
+#### Ejemplo
+
+```4d
+ $myFile:=Folder(fk documents folder).file("Archives/data.txt")
+ $myFile.setContent([aTable]aBlobField)
+```
+
+
+
+
+
+## .setText()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------------------------------------------------------------------------------------------- |
+| 19 R3 | Por defecto para los nuevos proyectos: sin BOM y (macOS) LF para EOL |
+| 17 R5 | Añadidos |
+
+
+
+**.setText** ( *text* : Text {; *charSetName* : Text { ; *breakMode* : Integer } } ) **.setText** ( *text* : Text {; *charSetNum* : Integer { ; *breakMode* : Integer } } )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------- | ------- | -- | ------------------------------------------ |
+| text | Text | -> | Texto a almacenar en el archivo |
+| charSetName | Text | -> | Nombre del juego de caracteres |
+| charSetNum | Integer | -> | Número del conjunto de caracteres |
+| breakMode | Integer | -> | Modo de tratamiento de los saltos de línea |
+
+
+
+#### Descripción
+
+La función `.setText()` escribe *text* como el nuevo contenido del archivo.
+
+Si el archivo referenciado en el objeto `File` no existe en el disco, la función lo crea. Cuando el archivo ya existe en el disco, se borra su contenido anterior, excepto si ya está abierto, en cuyo caso se bloquea su contenido y se genera un error.
+
+En *text*, pase el texto a escribir en el archivo. Puede ser un texto literal ("my text"), o un campo / variable texto 4D.
+
+Opcionalmente, puede designar el conjunto de caracteres que se utilizará para la escritura del contenido. Puede pasar:
+
+- en *charSetName*, una cadena que contiene el nombre del conjunto estándar (por ejemplo "ISO-8859-1" o "UTF-8"),
+- o en *charSetNum*, el ID MIBEnum (número) del nombre del conjunto estándar.
+
+> Para conocer la lista de los conjuntos de caracteres que soporta 4D, consulte la descripción del comando `CONVERT FROM TEXT`.
+
+Si existe una marca de orden de bytes (BOM) para el conjunto de caracteres, 4D la inserta en el archivo a menos que el conjunto de caracteres utilizado contenga el sufijo "-no-bom" (por ejemplo, "UTF-8-no-bom"). Si no especifica un conjunto de caracteres, por defecto 4D utiliza el conjunto de caracteres "UTF-8" sin BOM.
+
+En *breakMode*, se puede pasar un número que indica el procesamiento a aplicar a los caracteres de fin de línea antes de guardarlos en el archivo. Las siguientes constantes, que se encuentran en el tema **Documentos sistema**, están disponibles:
+
+| Constante | Valor | Comentario |
+| ----------------------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `Document unchanged` | 0 | Sin procesar |
+| `Document with native format` | 1 | (Por defecto) Los saltos de línea se convierten al formato nativo del sistema operativo: LF (salto de línea) en macOS, CRLF (salto de línea + retorno de carro) en Windows |
+| `Document with CRLF` | 2 | Los fines de línea se convierten en CRLF (retorno de carro + salto de línea), el formato predeterminado de Windows |
+| `Document with CR` | 3 | Los fines de línea se convierten en CR (retorno de carro), el formato clásico por defecto de Mac OS |
+| `Document with LF` | 4 | Los fines de línea se convierten en LF (salto de línea), el formato Unix y macOS por defecto |
+
+Por defecto, cuando se omite el parámetro *breakMode*, los saltos de línea se procesan en modo nativo (1).
+
+> **Nota de compatibilidad**: las opciones de compatibilidad están disponibles para la gestión de EOL y de BOM. Ver la [página Compatibilidad](https://doc.4d.com/4Dv20/4D/20.2/Compatibility-page.300-6750362.en.html) en doc.4d.com.
+
+#### Ejemplo
+
+```4d
+$myFile:=File("C:\\Documents\\Hello.txt";fk platform path)
+$myFile.setText("Hello world")
+```
+
+
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FileHandleClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/FileHandleClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FileHandleClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/FileHandleClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FolderClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/FolderClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FolderClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/FolderClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FunctionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/FunctionClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/FunctionClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/FunctionClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPAgentClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPAgentClass.md
new file mode 100644
index 00000000000000..80a5c130f43acb
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPAgentClass.md
@@ -0,0 +1,159 @@
+---
+id: HTTPAgentClass
+title: HTTPAgent
+---
+
+La clase `HTTPAgent` permite manejar [objetos`HTTPAgent`](#httpagent-object) que pueden ser utilizados para gestionar la persistencia y reutilización de conexiones a servidores utilizando la [clase HTTPRequest](HTTPRequestClass.md).
+
+La clase `HTTPAgent` está disponible en el class store `4D`. Puede crear un nuevo [`objeto HTTPAgent`](#httpagent-object) utilizando la función [4D.HTTPAgent.new()](#4dhttpagentnew).
+
+Cuando no hay ningún agente asociado a una petición HTTP, se utiliza un agente global con valores por defecto. El agente por defecto es la forma más simple de agente HTTP, adecuado para casos de uso básicos. Los agentes personalizados se recomiendan para tener un mayor control, a nivel de agente en lugar de para cada petición HTTP, sobre aspectos específicos de la conexión como la configuración de keep-alive, los tiempos de espera o las configuraciones TLS/SSL.
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R6 | Clase añadida |
+
+
+
+### Objeto HTTPAgent
+
+Un objeto HTTPAgent es un objeto compartible.
+
+Los objetos HTTPAgent ofrecen las siguientes propiedades y funciones:
+
+| |
+| ------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#params) |
+| [](#requestscount) |
+| [](#freesocketscount) |
+
+:::tip
+
+Dado que HTTPAgent es un objeto compartible, puede añadir uno a una clase singleton para poder utilizar el mismo agente para todas sus peticiones al mismo servidor.
+
+:::
+
+## 4D.HTTPAgent.new()
+
+**4D.HTTPAgent.new**( { *options* : Object } ) : 4D.HTTPAgent
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------------------------------ |
+| 21 | Support of *storeCertificateName* property |
+
+
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------------------------------- | :-------------------------: | -------------------------------------- |
+| options | Object | -> | opciones por defecto para el HTTPAgent |
+| Resultado | [4D.HTTPAgent](#httpagent-object) | <- | Nuevo objeto HTTPAgent |
+
+
+
+#### Descripción
+
+La función `4D.HTTPAgent.new()` crea un objeto HTTPAgent compartible con las *opciones* definidas, y devuelve un objeto `4D.HTTPAgent`.
+
+El [`objeto HTTPAgent`] devuelto (#httpagent-object) se utiliza para personalizar las conexiones a servidores HTTP.
+
+#### Parámetro *options*
+
+En el parámetro *options*, pase un objeto que pueda contener las siguientes propiedades (todas las propiedades son opcionales):
+
+:::note
+
+Las opciones de HTTPAgent se fusionarán con [opciones HTTPRequest](HTTPRequestClass.md#4dhttprequestnew) (las opciones de HTTPRequest tienen preferencia); si no se define un agente específico, se utilizará un agente global.
+
+:::
+
+| Propiedad | Tipo | Por defecto | Descripción |
+| ---------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| certificatesFolder | Folder | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la carpeta activa de certificados de cliente para las solicitudes que utilizan el agente. Puede reemplazarse por "storeCertificateName" (ver abajo) |
+| keepAlive | Boolean | true | Activa keep alive para el agente |
+| maxSockets | Integer | 65535 | Número máximo de sockets por servidor |
+| maxTotalSockets | Integer | 65535 | Número máximo de sockets para el agente |
+| minTLSVersion | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Define la versión mínima de TLS para las solicitudes que utilizan este agente |
+| protocol | Text | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Protocolo usado para las peticiones utilizando el agente |
+| storeCertificateName | Text | indefinido | (Windows only) Name of the OS certificate store (e.g. "LocalMachine") from where to use certificates instead of those in the certificates folder for the requests using the agent. Si no se encuentra el almacén de certificados, se devuelve un error. For more information, see [this blog post](https://blog.4d.com/https-requests-now-support-windows-certificate-store). |
+| timeout | Real | indefinido | Si se define, tiempo después del cual se cierra un socket no utilizado |
+| validateTLSCertificate | Boolean | undefined (ver valor por defecto en [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | Validar el certificado Tls para las solicitudes que utilizan el agente |
+
+:::note
+
+Lanzamiento En ese caso, cada servidor tendrá su propio grupo de conexiones utilizando las mismas opciones de agente.
+
+:::
+
+#### Ejemplo
+
+Creación del HTTPAgent:
+
+```4d
+var $options:={}
+$options.maxSockets:=5 //5 is the maximum number of sockets per server
+$options.maxTotalSockets:=10 //10 is the maximum number of sockets for the agent
+$options.validateTLSCertificate:=True //To validate the server's certificate
+
+var $myAgent:=4D.HTTPAgent.new($options)
+
+```
+
+Enviando una solicitud para comprobar la hora local de cualquier ciudad:
+
+```4d
+var $options:={}
+$options.method:="GET"
+$options.agent:=$myAgent
+var $myRequest:=4D.HTTPRequest.new("http://worldtimeapi.org/api/timezone/Europe/Paris"; $options)
+
+```
+
+:::note
+
+Cuando no hay ningún agente asociado a una HTTPRequest, se utiliza un agente global con valores por defecto.
+
+:::
+
+
+
+## .params
+
+**options** : Object
+
+#### Descripción
+
+El objeto de propiedad `.params` contiene las opciones utilizadas actualmente del HTTPAgent.
+
+
+
+
+
+## .requestsCount
+
+**requestsCount** : Integer
+
+#### Descripción
+
+La propiedad `.requestsCount` contiene el número de peticiones gestionadas actualmente por el HTTPAgent.
+
+
+
+
+
+## .freeSocketsCount
+
+**freeSocketsCount** : Integer
+
+#### Descripción
+
+La propiedad `.freeSocketsCount` contiene el número de sockets libres de `maxSockets` asociados al HTTPAgent.
+
+
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPRequestClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPRequestClass.md
new file mode 100644
index 00000000000000..92a75a36fcc322
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/HTTPRequestClass.md
@@ -0,0 +1,425 @@
+---
+id: HTTPRequestClass
+title: HTTPRequest
+---
+
+La clase `HTTPRequest` permite manejar [objetos `HTTPRequest`](#httprequest-object) que se pueden utilizar para configurar y enviar solicitudes a un servidor HTTP, así como para procesar las respuestas del servidor HTTP.
+
+La clase `HTTPRequest` está disponible en el class store `4D`. Para crear y enviar peticiones HTTP se utiliza la función [4D.HTTPRequest.new()](#4dhttprequestnew), que devuelve un [objeto `HTTPRequest`](#httprequest-object).
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R6 | Clase añadida |
+
+
+
+### Ejemplo
+
+Crear una clase `MyHttpRequestOptions` para las opciones de la petición:
+
+```4d
+Class constructor($method : Text; $headers : Object; $body : Text)
+This.method:=$method
+This.headers:=$headers
+This.body:=$body
+
+Function onResponse($request : 4D.HTTPRequest; $event : Object)
+// Mi método onResponse, si quiere manejar la petición de forma asíncrona
+
+Function onError($request : 4D.HTTPRequest; $event : Object)
+// Mi método onError, si quiere manejar la petición de forma asíncrona
+```
+
+Ahora puede crear su petición:
+
+```4d
+var $headers : Object
+$headers:=New object()
+$headers["field1"]:="value1"
+
+var myHttpRequestOptions : cs.MyHttpRequestOptions
+myHttpRequestOptions := cs.MyHttpRequestOptions.new("GET"; $headers; "")
+
+var $request : 4D.HTTPRequest
+$request:=4D.HTTPRequest.new("www.google.com"; myHttpRequestOptions)
+$request.wait() // Si desea gestionar la solicitud de forma sincrónica
+// Ahora puede utilizar $request.response para acceder al resultado de la petición o $request.error para comprobar el error que se ha producido.
+```
+
+### Objeto HTTPRequest
+
+Un objeto HTTPRequest es un objeto no compartible.
+
+Los objetos HTTPRequest ofrecen las siguientes propiedades y funciones:
+
+| |
+| ------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#agent) |
+| [](#datatype) |
+| [](#encoding) |
+| [](#errors) |
+| [](#headers) |
+| [](#method) |
+| [](#protocol) |
+| [](#response) |
+| [](#datatype) |
+| [](#terminate) |
+| [](#terminated) |
+| [](#timeout) |
+| [](#url) |
+| [](#wait) |
+
+
+
+## 4D.HTTPRequest.new()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------------------------- |
+| 21 | Support of *storeCertificateName* property |
+| 20 | Validación TLS por defecto |
+| 19 R7 | Soporte de las propiedades *automaticRedirections* y *decodeData* |
+
+
+
+**4D.HTTPRequest.new**( *url* : Text { ; *options* : Object } ) : 4D.HTTPRequest
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------------ | :-------------------------: | ------------------------------------------- |
+| url | Text | -> | URL a la que enviar la solicitud |
+| options | Object | -> | Propiedades de configuración de la petición |
+| Resultado | 4D.HTTPRequest | <- | Nuevo objeto HTTPRequest |
+
+
+
+#### Descripción
+
+La función `4D.HTTPRequest.new()` crea y envía una solicitud HTTP al servidor HTTP definido en *url* con las opciones definidas, y devuelve un objeto `4D.HTTPRequest`.
+
+El objeto `HTTPRequest` devuelto se utiliza para procesar las respuestas del servidor HTTP y llamar a los métodos.
+
+En *url*, pase la URL a la que desea enviar la petición. La sintaxis a utilizar es:
+
+```
+{http://}[{user}:[{password}]@]host[:{port}][/{path}][?{queryString}]
+{https://}[{user}:[{password}]@]host[:{port}][/{path}][?{queryString}]
+```
+
+Si se omite la parte "scheme" (`http://` o `https://`), se envía una petición https.
+
+Por ejemplo, puede pasar las siguientes cadenas:
+
+```
+ http://www.myserver.com
+ www.myserver.com/path
+ http://www.myserver.com/path?name="jones"
+ https://www.myserver.com/login
+ http://123.45.67.89:8083
+ http://john:smith@123.45.67.89:8083
+ http://[2001:0db8:0000:0000:0000:ff00:0042:8329]
+ http://[2001:0db8:0000:0000:0000:ff00:0042:8329]:8080/index.html (**)
+```
+
+#### Parámetro *options*
+
+En el parámetro *options*, pase un objeto que puede contener las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción | Por defecto |
+| ---------------------- | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
+| agent | [4D.HTTPAgent](HTTPAgentClass.md) | HTTPAgent a utilizar para la HTTPRequest. Las opciones del agente se fusionarán con las opciones de la petición (las opciones de la petición tienen prioridad). Si no se define un agente específico, se utiliza un agente global con valores predeterminados. | Objeto agente global |
+| automaticRedirections | Boolean | Si es true, las redirecciones se realizan automáticamente (se gestionan hasta 5 redirecciones, se devuelve la 6ª respuesta de redirección si la hay) | True |
+| body | Variant | Cuerpo de la petición (necesario en el caso de las peticiones `post` o `put`). Puede ser un texto, un blob, o un objeto. El content-type se determina a partir del tipo de esta propiedad a menos que se defina dentro de los encabezados | indefinido |
+| certificatesFolder | [Folder](FolderClass.md) | Define la carpeta de certificados de cliente activa. Puede reemplazarse por "storeCertificateName" (ver abajo). | indefinido |
+| dataType | Text | Tipo de atributo del cuerpo de la respuesta. Valores: "text", "blob", "object", o "auto". Si "auto", el tipo de contenido del cuerpo se deducirá de su tipo MIME (object para JSON, texto para texto, javascript, xml, mensaje http y formulario codificado en url, blob en caso contrario) | "auto" |
+| decodeData | Boolean | Si true, los datos recibidos en la retrollamada `onData` se descomprimen | False |
+| encoding | Text | Se utiliza sólo en caso de peticiones con un `body` (métodos `post` o `put`). Codificación del contenido del cuerpo de la petición si es un texto, se ignora si se define content-type dentro de los encabezados | "UTF-8" |
+| headers | Object | Encabezados de la petición. Sintaxis: `headers.key=value` (*value* puede ser una colección si la misma llave debe aparecer varias veces) | Objeto vacío |
+| method | Text | "POST", "GET" u otro método | "GET" |
+| minTLSVersion | Text | Define la versión mínima de TLS: "`TLSv1_0`", "`TLSv1_1`", "`TLSv1_2`", "`TLSv1_3`" | "`TLSv1_2`" |
+| onData | [Function](FunctionClass.md) | Retrollamada cuando se reciben los datos del cuerpo. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
+| onError | [Function](FunctionClass.md) | Retrollamada cuando ocurre un error. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
+| onHeaders | [Function](FunctionClass.md) | Retrollamada cuando se reciben los encabezados. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
+| onResponse | [Function](FunctionClass.md) | Retrollamada cuando se recibe una respuesta. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
+| onTerminate | [Function](FunctionClass.md) | Retrollamada cuando la petición haya terminado. Recibe dos objetos como parámetros (ver más abajo) | indefinido |
+| protocol | Text | "auto" o "HTTP1". "auto" significa HTTP1 en la implementación actual | "auto" |
+| proxyAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del proxy de gestión de objetos | indefinido |
+| returnResponseBody | Boolean | Si false, el cuerpo de la respuesta no se devuelve en el [objeto `response`](#response). Devuelve un error si es false y `onData` es undefined | True |
+| serverAuthentication | [objeto de autenticación](#authentication-object) | Autenticación del servidor de gestión de objetos | indefinido |
+| storeCertificateName | Text | (Sólo Windows) Nombre del almacén de certificados del sistema operativo (por ejemplo, "LocalMachine") desde donde utilizar los certificados en lugar de los de la carpeta de certificados. Si no se encuentra el almacén de certificados, se devuelve un error. For more information, see [this blog post](https://blog.4d.com/https-requests-now-support-windows-certificate-store). | indefinido |
+| timeout | Real | Tiempo de espera en segundos. indefinido = sin tiempo de espera | indefinido |
+| validateTLSCertificate | Boolean | Si false, 4D no valida el certificado TLS y no devuelve un error si no es válido (es decir, caducado, autofirmado...). Importante: en la implementación actual, la propia Autoridad de Certificación no se verifica. | True |
+
+#### Función callback (retrollamada)
+
+Todas las funciones de retrollamada reciben dos parámetros objeto:
+
+| Parámetros | Tipo |
+| ---------- | ------------------------------------------- |
+| $param1 | [`Objeto HTTPRequest`](#httprequest-object) |
+| $param2 | [Objeto `Event`](#event-object) |
+
+Esta es la secuencia de llamadas de retorno:
+
+1. `onHeaders` se llama siempre una vez
+2. `onData` se llama cero o varias veces (no se llama si la petición no tiene cuerpo)
+3. Si no se ha producido ningún error, `onResponse` siempre se llama una vez
+4. Si se produce un error, `onError` se ejecuta una vez (y termina la petición)
+5. `onTerminate` se ejecuta siempre una vez
+
+:::info
+
+Para que las funciones de retrollamada se llamen cuando no utilice [`wait()`](#wait) (llamada asíncrona), el proceso debe ser un [worker](../Develop/processes.md#worker-processes) creado con [`CALL WORKER`](../commands-legacy/call-worker.md), NO [`New process`](../commands-legacy/new-process.md).
+
+:::
+
+#### objeto evento
+
+Un objeto `event` es devuelto cuando una [función de callback](#callback-functions) es llamada. Contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| --------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------- |
+| .data | blob | Datos recibidos. Siempre es *undefined* excepto en la retrollamada `onData` |
+| .type | text | Tipo de evento. Valores posibles: "response", "error", "headers", "data", o "terminate |
+
+#### authentication object
+
+Un objeto de autenticación maneja la propiedad `options.serverAuthentication` o `options.proxyAuthentication`. Puede contener las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción | Por defecto |
+| ---------- | ---- | --------------------------------------------------------------------------------- | ----------- |
+| name | Text | Nombre usado para la autenticación | indefinido |
+| contraseña | Text | Contraseña utilizada para la autenticación | indefinido |
+| method | Text | Método utilizado para la autenticación: "basic", "digest", "auto" | "auto" |
+
+
+
+
+
+## .agent
+
+**agent** : 4D.HTTPAgent
+
+#### Descripción
+
+La propiedad `.agent` contiene el objeto `agent` pasado en [`options`](#options-parameter) o el objeto agente global si se omitió.
+
+
+
+
+
+## .dataType
+
+**dataType** : Text
+
+#### Descripción
+
+La propiedad `.dataType` contiene el `dataType` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew), "auto" si se omitió.
+
+
+
+
+
+## .encoding
+
+**encoding** : Text
+
+#### Descripción
+
+La propiedad `.encoding` contiene el `encoding` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew), "UTF-8" si se omitió.
+
+
+
+
+
+## .errors
+
+**errors** : Collection
+
+#### Descripción
+
+La propiedad `.errors` contiene la colección de todos los errores si se ha generado al menos un error.
+
+Este es el contenido de la propiedad `.errors`:
+
+| Propiedad | | Tipo | Descripción |
+| --------- | ----------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------- |
+| errors | | Collection | Pila de error 4D en caso de error |
+| | [].errCode | Number | Código de error 4D |
+| | [].message | Text | Descripción del error 4D |
+| | [].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+
+
+
+
+## .headers
+
+**headers** : Object
+
+#### Descripción
+
+La propiedad `.headers` contiene los `headers` pasados en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). Si se omite, contiene un objeto vacío.
+
+
+
+
+
+## .method
+
+**method** : Text
+
+#### Descripción
+
+La propiedad `.method` contiene el `method` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . .
+
+
+
+
+
+## .protocol
+
+**protocol** : Text
+
+#### Descripción
+
+La propiedad `.protocol` contiene el `protocol` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . Si se ha omitido o si se ha utilizado "auto", contiene la versión del protocolo utilizada.
+
+
+
+
+
+## .response
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------------------------------------------------------------- |
+| 19 R8 | `.headers` devuelve los nombres en minúsculas. Nueva propiedad `.rawHeaders` |
+
+
+
+**response** : Object
+
+#### Descripción
+
+La propiedad `.response` contiene la respuesta a la solicitud si ha recibido al menos el código de estado, de lo contrario undefined.
+
+Un objeto `response` es un objeto no compartible. Ofrece las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| --------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| .body | Variant | Cuerpo de la respuesta. El tipo del mensaje se define según la propiedad [`dataType`](#datatype). Indefinido si el cuerpo no se ha recibido todavía |
+| .headers | Object | Encabezados de la respuesta. Los nombres de los encabezados se devuelven en minúsculas. `.key` = valor (el valor puede ser una colección si la misma llave aparece varias veces). Indefinido si el los encabezados no se ha recibido aún. |
+| .status | Number | Código de estado de la respuesta |
+| .statusText | Text | Mensaje explicando el código de estado |
+| .rawHeaders | Object | Encabezados de la respuesta. Los nombres de los encabezadoss se devuelven intactos (con sus mayúsculas y minúsculas originales). `.key` = valor (el valor puede ser una colección si la misma llave aparece varias veces). Indefinido si el los encabezados no se ha recibido aún. |
+
+
+
+
+
+## .returnResponseBody
+
+**returnResponseBody** : Boolean
+
+#### Descripción
+
+La propiedad `.returnResponseBody` contiene el `returnResponseBody` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . Si se omite, contiene True.
+
+
+
+
+
+## .terminate()
+
+**.terminate()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+> Esta función es hilo seguro.
+
+La función `.terminate()` interrumpe la solicitud HTTP. Activa el evento `onTerminate`.
+
+
+
+
+
+## .terminated
+
+**terminated** : Boolean
+
+#### Descripción
+
+La propiedad `.terminated` contiene True si la solicitud es terminada (después de la llamada a `onTerminate`), false de lo contrario.
+
+
+
+
+
+## .timeout
+
+**timeout** : Real
+
+#### Descripción
+
+La propiedad `.timeout` contiene el `timeout` pasado en el objeto [`options`](#options-parameter) al llamar a [new()](#4dhttprequestnew). . .
+
+
+
+
+
+## .url
+
+**url** : Text
+
+#### Descripción
+
+La propiedad `.url` contiene la URL de la solicitud HTTP.
+
+
+
+
+
+## .wait()
+
+**.wait**( { *timeout* : Real } ) : 4D.HTTPRequest
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------------ | :-------------------------: | ----------------------------------- |
+| timeout | Real | -> | Tiempo máximo de espera en segundos |
+| Resultado | 4D.HTTPRequest | <- | Objeto HTTPRequest |
+
+
+
+#### Descripción
+
+> Esta función es hilo seguro.
+
+La función `wait()` espera una respuesta del servidor o hasta que se alcance el `timeout` especificado.
+
+Si se pasa un *timeout*, la función espera la duración especificada en este parámetro. Se aceptan decimales.
+
+Si la respuesta del servidor ya ha llegado, la función regresa inmediatamente.
+
+:::note
+
+Durante la ejecución de .wait(), se ejecutan las funciones de retrollamada de los workers, tanto si proceden de otras instancias `HTTPRequest` o [`SystemWorker`](SystemWorkerClass.md), como de otras llamadas [`CALL WORKER`](../commands-legacy/call-worker.md). Puede salir de un .wait() llamando a [`terminate()`](#terminate) desde una retrollamada.
+
+:::
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/IMAPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/IMAPTransporterClass.md
new file mode 100644
index 00000000000000..2586d2f95f4f9a
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/IMAPTransporterClass.md
@@ -0,0 +1,1850 @@
+---
+id: IMAPTransporterClass
+title: IMAPTransporter
+---
+
+La clase `IMAPTransporter` le permite recuperar mensajes de un servidor de correo IMAP.
+
+### Objeto IMAP Transporter
+
+Los objetos IMAP Transporter se instancian con el comando [IMAP New transporter](../commands/imap-new-transporter.md). Ofrecen las siguientes propiedades y funciones:
+
+| |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#acceptunsecureconnection) |
+| [](#addflags) |
+| [](#append) |
+| [](#authenticationmode) |
+| [](#checkconnection) |
+| [](#checkconnectiondelay) |
+| [](#connectiontimeout) |
+| [](#copy) |
+| [](#createbox) |
+| [](#delete) |
+| [](#deletebox) |
+| [](#expunge) |
+| [](#getboxinfo) |
+| [](#getboxlist) |
+| [](#getdelimiter) |
+| [](#getmail) |
+| [](#getmails) |
+| [](#getmimeasblob) |
+| [](#host) |
+| [](#logfile) |
+| [](#move) |
+| [](#numtoid) |
+| [](#removeflags) |
+| [](#renamebox) |
+| [](#port) |
+| [](#searchmails) |
+| [](#selectbox) |
+| [](#subscribe) |
+| [](#unsubscribe) |
+| [](#user) |
+
+## 4D.IMAPTransporter.new()
+
+**4D.IMAPTransporter.new**( *server* : Object ) : 4D.IMAPTransporter
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------------------------------- | :-------------------------: | ----------------------------------------------------- |
+| server | Object | -> | Información del servidor de correo |
+| Resultado | 4D.IMAPTransporter | <- | [Objeto transportador IMAP](#objeto-imap-transporter) |
+
+
+
+#### Descripción
+
+La función `4D.IMAPTransporter.new()` crea y devuelve un nuevo objeto de tipo `4D.IMAPTransporter`. Es idéntico al comando [`IMAP New transporter`](../commands/imap-new-transporter.md) (acceso directo).
+
+
+
+
+
+## .addFlags()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------- |
+| 20 | Soporta palabras claves personalizadas |
+| 18 R6 | Añadidos |
+
+
+
+**.addFlags**( *msgIDs* : any ; *keywords* : Object ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 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 claves a añadir |
+| Resultado | Object | <- | Estado de la operación addFlags |
+
+
+
+#### Descripción
+
+La función `.addFlags()` agrega banderas a los `msgIDs` para las `keywords` especificadas.
+
+En el parámetro `msgIDs`, puedes pasar:
+
+- una *colección* que contiene los IDs únicos de mensajes específicos o
+- el ID único (*text*) de un solo mensaje o
+- la siguiente constante (*longint*) para todos los mensajes del buzón seleccionado:
+
+| Constante | Valor | Comentario |
+| --------- | ----- | ----------------------------------------------------- |
+| IMAP all | 1 | Seleccionar todos los mensajes del buzón seleccionado |
+
+El parámetro `keywords` permite definir las banderas a añadir a `msgIDs`. Puede utilizar las siguientes banderas estándar, así como banderas personalizadas (la compatibilidad con banderas personalizadas depende de la implementación del servidor):
+
+| Propiedad | Tipo | Descripción |
+| --------------- | ------- | ---------------------------------------------------- |
+| $draft | Boolean | True para añadir el marcador "draft" al mensaje |
+| $seen | Boolean | True para añadir el marcador "seen" al mensaje |
+| $flagged | Boolean | True para añadir el marcador "flagged" al mensaje |
+| $answered | Boolean | True para añadir el marcador "answered" al mensaje |
+| $deleted | Boolean | True para añadir el marcador "deleted" al mensaje |
+| `` | Boolean | True para añadir la bandera personalizada al mensaje |
+
+Los nombres de las banderas personalizadas deben respetar esta regla: la palabra clave debe ser una cadena que no distinga entre mayúsculas y minúsculas, excluyendo los caracteres de control y el espacio, y no puede incluir ninguno de estos caracteres: `( ) { ] % * " \`
+
+> - Para que una palabra clave se tenga en cuenta tiene que ser true.
+> - La interpretación de los indicadores de palabras claves puede variar según el cliente de correo.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+```4d
+var $options;$transporter;$boxInfo;$status : Object
+
+$options:=New object
+$options.host:="imap.gmail.com"
+$options.port:=993
+$options.user:="4d@gmail.com"
+$options.password:="xxxxx"
+
+// Crear transportador
+$transporter:=IMAP New transporter($options)
+
+// Seleccionar buzón de correo
+$boxInfo:=$transporter.selectBox("INBOX")
+
+// Marcar todos los mensajes de INBOX como leídos/vistos
+$flags:=New object
+$flags["$seen"]:=True
+$status:=$transporter.addFlags(IMAP all;$flags)
+```
+
+
+
+
+
+## .append()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R6 | Añadidos |
+
+
+
+**.append**( *mailObj* : Object ; *destinationBox* : Text ; *options* : Object ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| -------------- | ------ | :-------------------------: | ------------------------------------------- |
+| mailObj | Object | -> | Objeto Email |
+| destinationBox | Text | -> | Buzón para recibir el objeto Email |
+| options | Object | -> | Objeto que contiene información del charset |
+| Resultado | Object | <- | Estado de la operación |
+
+
+
+#### Descripción
+
+La función `.append()` añade un `mailObj` al `destinationBox`.
+
+En el parámetro `mailObj`, pase un objeto email. Para obtener una descripción completa de las propiedades del correo, consulte [objeto Email](EmailObjectClass.md#objeto-email). La función `.append()` soporta los marcadores de palabras claves en el atributo `keywords` de objetos Email.
+
+El parámetro opcional `destinationBox` permite pasar el nombre de un buzón donde se añadirá el objeto `mailObj`. Si se omite, se utiliza el buzón actual.
+
+En el parámetro opcional `options`, puede pasar un objeto para definir el conjunto de caracteres y la codificación para partes específicas del correo electrónico. Propiedades disponibles:
+
+| Propiedad | Tipo | Descripción |
+| ------------- | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| headerCharset | Text | Charset y codificación utilizados para las siguientes partes del correo electrónico: asunto, nombres de archivos adjuntos y atributo(s) del nombre del correo electrónico. Valores posibles: ver la tabla de charsets posibles a continuación |
+| bodyCharset | Text | Charset y codificación utilizados para el contenido html y el texto del cuerpo del correo electrónico. Valores posibles: ver la tabla de charsets posibles a continuación |
+
+Charsets posibles:
+
+| Constante | Valor | Comentario |
+| ------------------------ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| mail mode ISO2022JP | US-ASCII_ISO-2022-JP_UTF8_QP |
headerCharset: US-ASCII si es posible, Japanese (ISO-2022-JP) &Quoted-printable si es posible, de lo contrario UTF-8 & Quoted-printable
bodyCharset: US-ASCII si es posible, Japanese (ISO-2022-JP) & 7-bit si es posible, de lo contrario UTF-8 & Quoted-printable
|
+| mail mode ISO88591 | ISO-8859-1 |
headerCharset: ISO-8859-1 & Quoted-printable
bodyCharset: ISO-8859-1 & 8-bit
|
+| mail mode UTF8 | US-ASCII_UTF8_QP | headerCharset & bodyCharset: US-ASCII si es posible, de lo contrario UTF-8 & Quoted-printable (**valor por defecto**) |
+| mail mode UTF8 in base64 | US-ASCII_UTF8_B64 | headerCharset & bodyCharset: US-ASCII si es posible, de lo contrario UTF-8 & base64 |
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+Para guardar un correo electrónico en el buzón de borradores:
+
+```4d
+var $settings; $status; $msg; $imap: Object
+
+$settings:=New object("host"; "domain.com"; "user"; "xxxx"; "password"; "xxxx"; "port"; 993)
+
+$imap:=IMAP New transporter($settings)
+
+$msg:=New object
+$msg.from:="xxxx@domain.com"
+$msg.subject:="Lorem Ipsum"
+$msg.textBody:="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
+$msg.keywords:=New object
+$msg.keywords["$seen"]:=True//flag the message as read
+$msg.keywords["$draft"]:=True//flag the message as a draft
+
+$status:=$imap.append($msg; "Drafts")
+```
+
+
+
+
+
+
+
+
+
+## .checkConnectionDelay
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.checkConnectionDelay** : Integer
+
+#### Descripción
+
+La propiedad `.checkConnectionDelay` contiene el tiempo máximo (en segundos) permitido antes de verificar la conexión con el servidor. Si se supera este tiempo entre dos llamadas al método, se comprobará la conexión con el servidor. Por defecto, si la propiedad no se ha definido en el objeto *server*, el valor es de 300.
+
+> **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.
+
+
+
+
+
+
+
+## .copy()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R5 | Añadidos |
+
+
+
+**.copy**( *msgsIDs* : Collection ; *destinationBox* : Text ) : Object **.copy**( *allMsgs* : Integer ; *destinationBox* : Text ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| -------------- | ---------- | :-------------------------: | ---------------------------------------------------------------------------- |
+| msgsIDs | Collection | -> | Colección de identificadores únicos de mensajes (cadenas) |
+| allMsgs | Integer | -> | `IMAP all`: todos los mensajes en el buzón seleccionado |
+| destinationBox | Text | -> | Buzón para recibir mensajes copiados |
+| Resultado | Object | <- | Estado de la operación de copia |
+
+
+
+#### Descripción
+
+La función `.copy()` copia los mensajes definidos por *msgsIDs* o *allMsgs* en la *destinationBox* en el servidor IMAP.
+
+Puede pasar:
+
+- en el parámetro *msgsIDs*, una colección que contiene los IDs únicos de los mensajes específicos a copiar, o
+- en el parámetro *allMsgs*, la constante `IMAP all` (entero) para copiar todos los mensajes del buzón seleccionado.
+
+El parámetro *destinationBox* permite pasar un valor texto con el nombre del buzón donde se colocarán las copias de los mensajes.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo 1
+
+Para copiar una selección de mensajes:
+
+```4d
+ var $server;$boxInfo;$status : Object
+ var $mailIds : Collection
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("inbox")
+
+ //obtener la colección de IDs únicos de los mensajes
+ $mailIds:=$transporter.searchMails("subject \"4D new feature:\"")
+
+ // copiar los mensajes encontrados en el buzón "documents"
+ $status:=$transporter.copy($mailIds;"documents")
+```
+
+#### Ejemplo 2
+
+Para copiar todos los mensajes del buzón actual:
+
+```4d
+ var $server;$boxInfo;$status : Object
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+
+ $boxInfo:=$transporter.selectBox("inbox")
+
+ // copiar los mensajes encontrados en el buzón "documents"
+ $status:=$transporter.copy(IMAP all;"documents")
+```
+
+
+
+
+
+## .createBox()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 | Añadidos |
+
+
+
+**.createBox**( *name* : Text ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | -------------------------------------------- |
+| name | Text | -> | Nombre del nuevo buzón |
+| Resultado | Object | <- | Estado de la operación de creación del buzón |
+
+
+
+#### Descripción
+
+La función `.createBox()` crea un buzón con el nombre dado. Si el caracter separador de jerarquía del servidor IMAP aparece en otra parte del nombre del buzón, el servidor IMAP creará todos los nombre padre necesarios para crear el buzón dado.
+
+En otras palabras, un intento de crear "Projects/IMAP/Doc" en un servidor en el que "/" es el carácter separador de jerarquía creará:
+
+- Sólo el buzón "Doc" si "Projects" & "IMAP" ya existen.
+- Los buzones "IMAP" & "Doc" si sólo existe "Projects".
+- Los buzones "Projects" & "IMAP" & "Doc", si no existen.
+
+En el parámetro `name`, pase el nombre del nuevo buzón.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+Para crear un nuevo buzón "Invoices":
+
+```4d
+var $pw : text
+var $options; $transporter; $status : object
+
+$options:=New object
+
+$pw:=Request("Please enter your password:")
+If(OK=1)
+$options.host:="imap.gmail.com"
+$options.user:="test@gmail.com"
+$options.password:=$pw
+
+$transporter:=IMAP New transporter($options)
+
+$status:=$transporter.createBox("Invoices")
+
+If ($status.success)
+ALERT("Mailbox creation successful!")
+Else
+ALERT("Error: "+$status.statusText)
+End if
+End if
+```
+
+
+
+
+
+## .delete()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R5 | Añadidos |
+
+
+
+**.delete**( *msgsIDs* : Collection ) : Object **.delete**( *allMsgs* : Integer ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ---------------------------------------------------------------------------- |
+| msgsIDs | Collection | -> | Colección de identificadores únicos de mensajes (cadenas) |
+| allMsgs | Integer | -> | `IMAP all`: todos los mensajes en el buzón seleccionado |
+| Resultado | Object | <- | Estado de la operación de eliminación |
+
+
+
+#### Descripción
+
+La función `.delete()` define el marcador "deleted" para los mensajes definidos en `msgsIDs` o `allMsgs`.
+
+Puede pasar:
+
+- en el parámetro `msgsIDs`, una colección contiene los IDs únicos de los mensajes específicos a eliminar, o
+- en el parámetro `allMsgs`, la constante `IMAP all` (entero) para borrar todos los mensajes en el buzón de correo seleccionado.
+
+La ejecución de esta función no elimina realmente los mensajes. Los mensajes con el marcador "delete" pueden seguir siendo encontrados por la función [.searchMails()](#searchmails). Los mensajes marcados se eliminan del servidor IMAP con la [función `.expunge()`](#expunge) o al seleccionar otro buzón o cuando el [objeto transporter](#imap-transporter-object) (creado con [IMAP New transporter](../commands/imap-new-transporter.md)) es destruido.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo 1
+
+Para eliminar una selección de mensajes:
+
+```4d
+ var $server;$boxInfo;$status : Object
+ var $mailIds : Collection
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("Inbox")
+
+ //obtener la colección de IDs únicos de los mensajes
+ $mailIds:=$transporter.searchMails("subject \"Reports\"")
+
+ // Borrar los mensajes seleccionados
+ $status:=$transporter.delete($mailIds)
+```
+
+#### Ejemplo 2
+
+Para eliminar todos los mensajes del buzón actual:
+
+```4d
+ var $server;$boxInfo;$status : Object
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("Junk Email")
+
+ // Borrar los mensajes seleccionados en el buzón actual
+ $status:=$transporter.delete(IMAP all)
+```
+
+
+
+
+
+## .deleteBox()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 | Añadidos |
+
+
+
+**.deleteBox**( *name* : Text ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ----------------------------------------------- |
+| name | Text | -> | Nombre del buzón a eliminar |
+| Resultado | Object | <- | Estado de la operación de eliminación del buzón |
+
+
+
+#### Descripción
+
+La función `.deleteBox()` elimina permanentemente el buzón de correo con el `name` dado del servidor IMAP. Intentar eliminar un INBOX o un buzón que no existe generará un error.
+
+En el parámetro `name`, pase el nombre del buzón a eliminar.
+
+> - La función no puede eliminar un buzón que tiene buzones hijos si el buzón padre tiene el atributo "\Noselect".
+> - Todos los mensajes del buzón eliminado también se borrarán.
+> - La posibilidad de eliminar un buzón depende del servidor de correo.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+Para eliminar el buzón secundario "Nova Orion Industries" del interior del buzón "Bills":
+
+```4d
+var $pw; $name : text
+var $options; $transporter; $status : object
+
+$options:=New object
+
+$pw:=Request("Please enter your password:")
+
+If(OK=1) $options.host:="imap.gmail.com"
+$options.user:="test@gmail.com"
+$options.password:=$pw
+
+$transporter:=IMAP New transporter($options)
+
+// eliminar buzón
+$name:="Bills"+$transporter.getDelimiter()+"Nova Orion Industries"
+$status:=$transporter.deleteBox($name)
+
+If ($status.success)
+ ALERT("Mailbox deletion successful!")
+ Else
+ ALERT("Error: "+$status.statusText)
+ End if
+End if
+```
+
+
+
+
+
+## .expunge()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R6 | Añadidos |
+
+
+
+**.expunge()** : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ------------------------------ |
+| Resultado | Object | <- | Estado de la operación expunge |
+
+
+
+#### Descripción
+
+La función `.expunge()` elimina todos los mensajes con la bandera "eliminada" del servidor de correo IMAP. La bandera "deleted" puede definirse con los métodos [`.delete()`](#delete) o [`.addFlags()`](#addflags).
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+```4d
+var $options;$transporter;$boxInfo;$status : Object
+var $ids : Collection
+
+$options:=New object
+$options.host:="imap.gmail.com"
+$options.port:=993
+$options.user:="4d@gmail.com"
+$options.password:="xxxxx"
+
+// Crear transportador
+$transporter:=IMAP New transporter($options)
+
+// Seleccionar buzón
+$boxInfo:=$transporter.selectBox("INBOX")
+
+// Buscar y eliminar todos los mensajes vistos en INBOX
+$ids:=$transporter.searchMails("SEEN")
+$status:=$transporter.delete($ids)
+
+// Purgar todos los mensajes marcados como borrados
+$status:=$transporter.expunge()
+```
+
+
+
+
+
+## .getBoxInfo()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | --------------------- |
+| 20 | \*se devuelve el *id* |
+| 18 R5 | *name* es opcional |
+| 18 R4 | Añadidos |
+
+
+
+**.getBoxInfo**( { *name* : Text }) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ---------------- |
+| name | Text | -> | Nombre del buzón |
+| Resultado | Object | <- | objeto boxInfo |
+
+
+
+#### Descripción
+
+La función `.getBoxInfo()` devuelve un objeto `boxInfo` correspondiente al buzón de correo actual o el buzón de correo *name*. Esta función devuelve la misma información que [`.selectBox()`](#selectbox) sin cambiar el buzón actual.
+
+En el parámetro opcional *name*, pase el nombre del buzón a acceder. El nombre representa una jerarquía inequívoca de izquierda a derecha, con niveles separados por un carácter delimitador específico. El delimitador se puede encontrar con la función [`.getDelimiter()`](#getdelimiter).
+
+Si el buzón *name* no es seleccionable o no existe, la función genera un error y devuelve **null**.
+
+**Objeto devuelto**
+
+El objeto `boxInfo` devuelto contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ------ | ------------------------------------------------------------------------------------------------- |
+| name | Text | Nombre del buzón |
+| mailCount | Number | Número de mensajes en el buzón |
+| mailRecent | Number | Número de mensajes con el marcador "reciente" (que indica los mensajes nuevos) |
+| id | text | Id. único del buzón |
+| mailUnseen | Number | Número de mensajes marcados como "unseen" |
+
+#### Ejemplo
+
+```4d
+ var $transporter : 4D.IMAPTransporter
+ $transporter:=IMAP New transporter($server)
+
+ $info:=$transporter.getBoxInfo("INBOX")
+ ALERT("INBOX contains "+String($info.mailRecent)+" recent emails.")
+```
+
+
+
+
+
+## .getBoxList()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------------------- |
+| 18 R4 | Añadidos |
+| 19 | Añadir parámetro `isSubscribed` |
+
+
+
+**.getBoxList**( { *parameters* : Object } ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ---------------------------- |
+| parameters | Object | -> | Objeto de parámetro |
+| Resultado | Collection | <- | Colección de objetos mailbox |
+
+
+
+#### Descripción
+
+La función `.getBoxList()` devuelve una colección de bandejas de entrada que describe todas las bandejas de entrada disponibles. Esta función permite gestionar localmente la lista de mensajes localizados en el servidor de correo IMAP.
+
+En el parámetro opcional `parameters`, pase un objeto que contenga valores para filtrar los buzones devueltos. Puede pasar:
+
+| Propiedad | Tipo | Descripción |
+| ----------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| isSubscribed | Boolean |
**True** para devolver sólo los buzones a los que se haya suscrito
**False** para devolver todos los buzones disponibles
|
+| names | Collection | Colección de objetos que contienen un atributo "name" o colección de textos que contienen los nombres de las cajas |
+| withBoxProperties | Boolean | Si true (por defecto): agrega los atributos `selectable`, `inferior` e `interesting` al objeto de resultado. Si es false, se omiten estos atributos. |
+| withBoxInfo | Boolean | El valor por defecto es false. Si true, agrega los atributos `mailCount`, `mailRecent` e `id` al objeto resultado. |
+
+#### Resultado
+
+Cada objeto de la colección devuelta contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ------------------------------------------------------------------------------------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| \[].name | Text | Nombre del buzón. Devuelto si withBoxProperties=true o withBoxInfo=true |
+| \[].selectable | Boolean | Indica si los derechos de acceso permiten o no seleccionar el buzón de correo:
true - el buzón puede ser seleccionado
false - el buzón de correo no puede ser seleccionado
Devuelto si withBoxProperties=true |
+| \[].inferior | Boolean | Indica si los derechos de acceso permiten o no crear una jerarquía inferior en el buzón:
true - se puede crear un nivel inferior
false - no se puede crear un nivel inferior
Se devuelve si withBoxProperties=true |
+| \[].interesting | Boolean | Indica si el buzón ha sido marcado como "interesante" por el servidor:
true - El buzón ha sido marcado como "interesante" por el servidor. For example, it may contain new messages.
false - The mailbox has not been marked "interesting" by the server.
Se devuelve si withBoxProperties=true |
+| [].mailCount | Number | Número de mensajes en el buzón. Devuelto si withBoxInfo=true |
+| [].mailRecent | Number | Número de mensajes marcados como "recent" (indicando nuevos mensajes). Devuelto si withBoxInfo=true |
+| [].mailUnseen | Number | Número de mensajes marcados como "unseen". Devuelto si withBoxInfo=true |
+| [].id | Text | Identificador único del buzón. Devuelto si withBoxInfo=true |
+
+Si la cuenta no contiene buzones, se devuelve una colección vacía.
+
+> - Si no hay ninguna conexión abierta, `.getBoxList()` abrirá una conexión.
+> - Si la conexión no ha sido utilizada desde el retraso de conexión designado (ver `IMAP New transporter`), la función `.checkConnection()` se llama automáticamente.
+
+#### Ejemplo
+
+```4d
+ var $transporter : 4D.IMAPTransporter
+ $transporter:=IMAP New transporter($server)
+
+ $boxList:=$transporter.getBoxList()
+
+ For each($box;$boxList)
+ If($box.interesting)
+ $split:=Split string($box.name;$transporter.getDelimiter())
+ ALERT("New emails are available in the box: "+$split[$split.length-1])
+ End if
+ End for each
+```
+
+
+
+
+
+## .getDelimiter()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.getDelimiter()** : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-------------------------: | --------------------------------- |
+| Resultado | Text | <- | Caracter delimitador de jerarquía |
+
+
+
+#### Descripción
+
+La función `.getDelimiter()` devuelve el caracter utilizado para delimitar niveles de jerarquía en el nombre del buzón.
+
+El delimitador es un carácter que puede utilizarse para:
+
+- crear buzones de nivel inferior
+- buscar más arriba o más abajo en la jerarquía del buzón
+
+#### Resultado
+
+Caracter delimitador del nombre del buzón.
+
+> - Si no hay ninguna conexión abierta, `.getDelimiter()` abrirá una conexión.
+> - Si la conexión no se ha utilizado desde la [duración máxima definida](#checkconnectiondelay), se llama automáticamente a la función [`.checkConnection()`](#checkconnection).
+
+#### Ejemplo
+
+```4d
+ var $transporter : 4D.IMAPTransporter
+ $transporter:=IMAP New transporter($server)
+
+ $boxList:=$transporter.getBoxList()
+
+ For each($box;$boxList)
+ If($box.interesting)
+ $split:=Split string($box.name;$transporter.getDelimiter())
+ ALERT("New emails are available in the box: "+$split[$split.length-1])
+ End if
+ End for each
+```
+
+
+
+
+
+## .getMail()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.getMail**( *msgNumber*: Integer { ; *options* : Object } ) : Object **.getMail**( *msgID*: Text { ; *options* : Object } ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ---------------------------------------------- |
+| msgNumber | Integer | -> | Número de secuencia del mensaje |
+| msgID | Text | -> | ID único del mensaje |
+| options | Object | -> | Instrucciones sobre la gestión de mensajes |
+| Resultado | Object | <- | [Objet Email](EmailObjectClass.md#objet-email) |
+
+
+
+#### Descripción
+
+La función `.getMail()` devuelve el objeto `Email` correspondiente al *msgNumber* o *msgID* en el buzón designado por el `IMAP_transporter`. Esta función permite recuperar la información sobre el email.
+
+En el primer parámetro, puede pasar:
+
+- *msgNumber*, un valor *integer* indicando el número de secuencia del mensaje a recuperar o
+- *msgID*, un valor *text* indicando el ID único del mensaje a recuperar.
+
+El parámetro opcional *options* permite pasar un objeto que define las instrucciones adicionales para la gestión del mensaje. Las siguientes propiedades están disponibles:
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| updateSeen | boolean | Si True, el mensaje se marca como "visto" en el buzón. Si es False, el mensaje no se marca como "visto". Valor por defecto: True |
+| withBody | boolean | Pase True para devolver el cuerpo del mensaje. Si es False, sólo se devuelve el encabezado del mensaje. Valor por defecto: True |
+
+> - La función genera un error y devuelve **Null** si *msgID* designa un mensaje inexistente,
+> - Si no se selecciona ningún buzón con la función [`.selectBox()`](#selectbox), se genera un error,
+> - Si no hay ninguna conexión abierta, `.getMail()` abrirá una conexión el último buzón especificado con [`.selectBox()`](#selectbox)\`.
+
+#### Resultado
+
+`.getMail()` devuelve un objeto [`Email`](EmailObjectClass.md#email-object) con las siguientes propiedades IMAP específicas: *id*, *receivedAt*, y *size*.
+
+#### Ejemplo
+
+Quiere obtener el mensaje con ID = 1:
+
+```4d
+ var $server : Object
+ var $info; $mail; $boxInfo : Variant
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ //crear transportador
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("Inbox")
+
+ //obtener el objeto Email con ID 1
+ $mail:=$transporter.getMail(1)
+```
+
+
+
+
+
+## .getMails()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R5 | Añadidos |
+
+
+
+**.getMails**( *ids* : Collection { ; *options* : Object } ) : Object **.getMails**( *startMsg* : Integer ; *endMsg* : Integer { ; *options* : Object } ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| ids | Collection | -> | Colección de identificadores de mensajes |
+| startMsg | Integer | -> | Número de secuencia del primer mensaje |
+| endMsg | Integer | -> | Número de secuencia del último mensaje |
+| options | Object | -> | Instrucciones sobre la gestión de mensajes |
+| Resultado | Object | <- | Objeto que contiene
una colección de [objetos Email](EmailObjectClass.md#email-object) y
una colección de IDs o de números para los mensajes que faltan, si los hay
|
+
+
+
+#### Descripción
+
+La función `.getMails()` devuelve un objeto que contiene una colección de objetos `Email`.
+
+**Primera sintaxis:**
+
+***.getMails( ids { ; options } ) -> result***
+
+La primera sintaxis permite recuperar los mensajes en función de sus identificadores.
+
+En el parámetro *ids*, pase una colección de IDs para los mensajes a devolver. Puedes obtener los IDs con [`.getMail()`](#getmail).
+
+El parámetro opcional *options* permite definir las partes de los mensajes a devolver. Consulte la tabla **Options** a continuación para obtener una descripción de las propiedades disponibles.
+
+**Segunda sintaxis:**
+
+***.getMails( startMsg ; endMsg { ; options } ) -> result***
+
+La segunda sintaxis permite recuperar los mensajes en función de un rango secuencial. Los valores pasados representan la posición de los mensajes en el buzón.
+
+En el parámetro *startMsg*, pase un valor *entero* correspondiente al número del primer mensaje en un rango secuencial. Si se pasa un número negativo (*startMsg* <= 0), se utilizará el primer mensaje del buzón como inicio de la secuencia.
+
+En el parámetro *endMsg*, pase un valor *entero* correspondiente al número del último mensaje que se incluirá en un rango secuencial. Si se pasa un número negativo (*endMsg* <= 0), se utilizará el último mensaje del buzón como fin de secuencia.
+
+El parámetro opcional *options* permite definir las partes de los mensajes a devolver.
+
+**Options**
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| updateSeen | Boolean | Si True, los mensajes especificados se marcan como "vistos" en el buzón. Si False, los mensajes no se marcan como "vistos". Valor por defecto: True |
+| withBody | Boolean | Pase True para devolver el cuerpo de los mensajes específicos. Si False, sólo se devuelve los encabezados de los mensajes. Valor por defecto: True |
+
+> - Si no se selecciona ningún buzón con el comando [`.selectBox()`](#selectbox), se genera un error.
+> - Si no hay ninguna conexión abierta, `.getMails()` abrirá una conexión el último buzón especificado con [`.selectBox()`](#selectbox).
+
+#### Resultado
+
+`.getMails()` devuelve un objeto que contiene las siguientes colecciones:
+
+| Propiedad | Tipo | Descripción |
+| --------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| lista | Collection | Colección de [`objetos Email`](EmailObjectClass.md#objeto-email). Si no se encuentran objetos Email, se devuelve una colección vacía. |
+| notFound | Collection | Colección de:
primera sintaxis - IDs de mensajes previamente pasados que no existen
segunda sintaxis - números de secuencia de mensajes entre startMsg y endMsg que no existen
Si se encuentran todos los mensajes, se devuelve una colección vacía. |
+
+#### Ejemplo
+
+Quiere recuperar los 20 correos electrónicos más recientes sin cambiar el estado "visto":
+
+```4d
+ var $server,$boxInfo,$result : Object
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ //crear transportador
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("INBOX")
+
+ If($boxInfo.mailCount>0)
+ // recuperar los encabezados de los últimos 20 mensajes sin marcarlos como leídos
+ $result:=$transporter.getMails($boxInfo.mailCount-20;$boxInfo.mailCount;\
+ New object("withBody";False;"updateSeen";False))
+ For each($mail;$result.list)
+ // ...
+ End for each
+ End if
+```
+
+
+
+
+
+## .getMIMEAsBlob()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R4 | Añadidos |
+
+
+
+**.getMIMEAsBlob**( *msgNumber* : Integer { ; *updateSeen* : Boolean } ) : Blob **.getMIMEAsBlob**( *msgID* : Text { ; *updateSeen* : Boolean } ) : Blob
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | -------------------------------------------------------------------------------------------------------------------------- |
+| msgNumber | Integer | -> | Número de secuencia del mensaje |
+| msgID | Text | -> | ID único del mensaje |
+| updateSeen | Boolean | -> | Si True, el mensaje se marca como "visto" en el buzón. Si False, el mensaje se deja igual. |
+| Resultado | BLOB | <- | Blob de la cadena MIME devuelta por el servidor de correo |
+
+
+
+#### Descripción
+
+La función `.getMIMEAsBlob()` devuelve un BLOB con el contenido MIME del mensaje correspondiente al *msgNumber* o *msgID* en el buzón designado por el `IMAP_transporter`.
+
+En el primer parámetro, puede pasar:
+
+- *msgNumber*, un valor *integer* indicando el número de secuencia del mensaje a recuperar o
+- *msgID*, un valor *text* indicando el ID único del mensaje a recuperar.
+
+El parámetro opcional *updateSeen* permite indicar si el mensaje está marcado como "visto" en el buzón. Puede pasar:
+
+- **True** - para marcar el mensaje como "visto" (indicando que el mensaje ha sido leído)
+- **False** - para dejar intacto el estado "visto" del mensaje
+
+> * La función devuelve un BLOB vacío si *msgNumber* o msgID\* designa un mensaje inexistente,
+> * Si no se selecciona ningún buzón con el comando [`.selectBox()`](#selectbox), se genera un error,
+> * Si no hay ninguna conexión abierta, `.getMIMEAsBlob()` abrirá una conexión el último buzón especificado con `.selectBox()`.
+
+#### Resultado
+
+`.getMIMEAsBlob()` devuelve un `BLOB` que puede almacenarse en una base de datos o convertirse en un objeto [`Email`](EmailObjectClass.md#email-object) con el comando `MAIL Convert from MIME`.
+
+#### Ejemplo
+
+```4d
+ var $server : Object
+ var $boxInfo : Variant
+ var $blob : Blob
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com"
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ //crear transportador
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("Inbox")
+
+ //obtener BLOB
+ $blob:=$transporter.getMIMEAsBlob(1)
+```
+
+
+
+
+
+
+
+
+
+## .move()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R5 | Añadidos |
+
+
+
+**.move**( *msgsIDs* : Collection ; *destinationBox* : Text ) : Object **.move**( *allMsgs* : Integer ; *destinationBox* : Text ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| -------------- | ---------- | :-------------------------: | ---------------------------------------------------------------------------- |
+| msgsIDs | Collection | -> | Colección de identificadores únicos de mensajes (cadenas) |
+| allMsgs | Integer | -> | `IMAP all`: todos los mensajes en el buzón seleccionado |
+| destinationBox | Text | -> | Buzón para recibir los mensajes desplazados |
+| Resultado | Object | <- | Estado de la operación de desplazamiento |
+
+
+
+#### Descripción
+
+La función `.move()` mueve los mensajes definidos por *msgsIDs* o *allMsgs* a la *destinationBox* del servidor IMAP.
+
+Puede pasar:
+
+- en el parámetro *msgsIDs*, una colección contiene los IDs únicos de los mensajes específicos a mover, o
+- en el parámetro *allMsgs*, la constante `IMAP all` (entero) para desplazar todos los mensajes del buzón seleccionado.
+
+El parámetro *destinationBox* permite pasar un valor texto con el nombre del buzón donde los mensajes serán desplazados.
+
+> Esta función sólo es compatible con los servidores IMAP que cumplen la RFC [8474](https://tools.ietf.org/html/rfc8474).
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo 1
+
+Para mover una selección de mensajes:
+
+```4d
+ var $server;$boxInfo;$status : Object
+ var $mailIds : Collection
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("inbox")
+
+ //obtener la colección de IDs únicos de los mensajes
+ $mailIds:=$transporter.searchMails("subject \"4D new feature:\"")
+
+ // Mover los mensajes encontrados del buzón actual al buzón "documents"
+ $status:=$transporter.move($mailIds;"documents")
+```
+
+#### Ejemplo 2
+
+Para mover todos los mensajes del buzón actual:
+
+```4d
+ var $server;$boxInfo;$status : Object
+ var $transporter : 4D.IMAPTransporter
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("inbox")
+
+ // mover todos los mensajes del buzón actual al buzón "documents"
+ $status:=$transporter.move(IMAP all;"documents")
+```
+
+
+
+
+
+## .numToID()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R5 | Añadidos |
+
+
+
+**.numToID**( *startMsg* : Integer ; *endMsg* : Integer ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ----------------------------------------------- |
+| startMsg | Integer | -> | Número de secuencia del primer mensaje |
+| endMsg | Integer | -> | Número de secuencia del último mensaje |
+| Resultado | Collection | <- | Colección de identificadores de mensajes únicos |
+
+
+
+#### Descripción
+
+La función `.numToID()` convierte los números de secuencia en IDs únicos IMAP para los mensajes en el rango secuencial designado por *startMsg* y *endMsg* en el buzón actualmente seleccionado.
+
+En el parámetro *startMsg*, pase un valor entero correspondiente al número del primer mensaje en un rango secuencial. Si se pasa un número negativo (*startMsg* <= 0), se utilizará el primer mensaje del buzón como inicio de la secuencia.
+
+En el parámetro *endMsg*, pase un valor entero correspondiente al número del último mensaje que se incluirá en un rango secuencial. Si se pasa un número negativo (*endMsg* <= 0), se utilizará el último mensaje del buzón como fin de secuencia.
+
+#### Resultado
+
+La función devuelve una colección de cadenas (IDs únicos).
+
+#### Ejemplo
+
+```4d
+ var $transporter : 4D.IMAPTransporter
+ var $server;$boxInfo;$status : Object
+ var $mailIds : Collection
+
+ $server:=New object
+ $server.host:="imap.gmail.com" //Obligatorio
+ $server.port:=993
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ $transporter:=IMAP New transporter($server)
+
+ //seleccionar buzón
+ $boxInfo:=$transporter.selectBox("inbox")
+
+ //obtener los ID de los 5 últimos mensajes recibidos
+ $mailIds:=$transporter.numToID(($boxInfo.mailCount-5);$boxInfo.mailCount)
+
+ //eliminar los mensajes del buzón actual
+ $status:=$transporter.delete($mailIds)
+```
+
+
+
+
+
+## .removeFlags()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------- |
+| 20 | Soporta palabras claves personalizadas |
+| 18 R6 | Añadidos |
+
+
+
+**.removeFlags**( *msgIDs* : any ; *keywords* : Object ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 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 claves a eliminar |
+| Resultado | Object | <- | Estado de la operación removeFlags |
+
+
+
+#### Descripción
+
+La función `.removeFlags()` elimina las banderas de los `msgIDs` para las `keywords` especificadas.
+
+En el parámetro `msgIDs`, puedes pasar:
+
+- una *colección* que contiene los IDs únicos de mensajes específicos o
+- el ID único (*text*) de un solo mensaje o
+- la siguiente constante (*longint*) para todos los mensajes del buzón seleccionado:
+
+| Constante | Valor | Comentario |
+| --------- | ----- | ----------------------------------------------------- |
+| IMAP all | 1 | Seleccionar todos los mensajes del buzón seleccionado |
+
+El parámetro `keywords` permite definir las banderas a eliminar de `msgIDs`. Puede utilizar las siguientes banderas estándar, así como banderas personalizadas:
+
+| Parámetros | Tipo | Descripción |
+| --------------- | ------- | ------------------------------------------------------- |
+| $draft | Boolean | True para eliminar el marcador "draft" del mensaje |
+| $seen | Boolean | True para eliminar el marcador "seen" del mensaje |
+| $flagged | Boolean | True para eliminar el marcador "flagged" del mensaje |
+| $answered | Boolean | True para eliminar el marcador "answered" del mensaje |
+| $deleted | Boolean | True para eliminar el marcador "deleted" del mensaje |
+| `` | Boolean | True para eliminar la bandera personalizada del mensaje |
+
+Consulte [.addFlags()](#addflags) para obtener más información sobre las banderas personalizadas.
+
+> - Para que una palabra clave se tenga en cuenta tiene que ser true.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+```4d
+var $options;$transporter;$boxInfo;$status : Object
+
+$options:=New object
+$options.host:="imap.gmail.com"
+$options.port:=993
+$options.user:="4d@gmail.com"
+$options.password:="xxxxx"
+
+// Crear transportador
+$transporter:=IMAP New transporter($options)
+
+// Seleccionar buzón
+$boxInfo:=$transporter.selectBox("INBOX")
+
+// Marcar todos los mensajes de INBOX como no vistos
+$flags:=New object
+$flags["$seen"]:=True
+$status:=$transporter.removeFlags(IMAP all;$flags)
+```
+
+
+
+
+
+## .renameBox()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 | Añadidos |
+
+
+
+**.renameBox**( *currentName* : Text ; *newName* : Text ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ----------- | ------ | :-------------------------: | -------------------------------- |
+| currentName | Text | -> | Nombre del nuevo actual |
+| newName | Text | -> | Nuevo nombre del buzón |
+| Resultado | Object | <- | Estado de la operación renombrar |
+
+
+
+#### Descripción
+
+La función `.renameBox()` cambia el nombre de un buzón en el servidor IMAP. Si se intenta renombrar un buzón desde un nombre de buzón que no existe o a un nombre de buzón que ya existe, se generará un error.
+
+En el parámetro `currentName`, pase el nombre del buzón a renombrar.
+
+Pase el nuevo nombre del buzón en el parámetro `newName`.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+Para cambiar el nombre de su buzón de "Invoices" a "Bills":
+
+```4d
+var $pw : text
+var $options; $transporter; $status : object
+
+$options:=Nuevo objeto
+
+$pw:=Request("Por favor, introduzca su contraseña:")
+
+If(OK=1) $options.host:="imap.gmail.com"
+
+$options.user:="test@gmail.com"
+$options.password:=$pw
+
+$transporter:=IMAP New transporter($options)
+
+// renombrar buzón
+$status:=$transporter.renameBox("Facturas"; "Facturas")
+
+If ($status.success)
+ ALERT("¡Cambio de nombre de buzón correcto!")
+ Else
+ ALERT("Error: "+$status.statusText)
+ End if
+End if
+```
+
+
+
+
+
+
+
+## .searchMails()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R5 | Añadidos |
+
+
+
+**.searchMails**( *searchCriteria* : Text ) : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| -------------- | ---------- | :-------------------------: | -------------------------------- |
+| searchCriteria | Text | -> | Criterio de búsqueda |
+| Resultado | Collection | <- | Colección de números de mensajes |
+
+
+
+#### Descripción
+
+> Esta función se basa en la especificación del [protocolo IMAP](https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol).
+
+La función `.searchMails()` busca los mensajes que coincidan con los criterios de búsqueda *searchCriteria* dados en el buzón actual. *searchCriteria* consiste en una o más llaves de búsqueda.
+
+*searchCriteria* es un parámetro texto que enumera una o varias llaves de búsqueda (ver [llaves de búsqueda autorizadas](#authorized-search-keys) abajo) asociadas o no a valores a buscar. Una llave de búsqueda puede ser uno o varios elementos. Por ejemplo:
+
+```
+SearchKey1 = FLAGGED
+SearchKey2 = NOT FLAGGED
+SearchKey3 = FLAGGED DRAFT
+```
+
+> Para obtener la información de un buzón sin cambiar el buzón actual, utilice .getBoxInfo().
+
+- Si el *searchCriteria* es una cadena null, la búsqueda será equivalente a un "seleccionar todo".
+- Si *searchCriteria* incluye varias llaves de búsqueda, el resultado es la intersección (función AND) de todos los mensajes que coinciden con esas llaves.
+
+```
+searchCriteria = FLAGGED FROM "SMITH"
+```
+
+... devuelve todos los mensajes con el marcador \Flagged AND activado y enviados por Smith.
+
+- Puede utilizar los operadores **OR** o **NOT** de la siguiente manera:
+
+```
+searchCriteria = OR SEEN FLAGGED
+```
+
+... devuelve todos los mensajes con el marcador \Seen O \Flagged
+
+```
+searchCriteria = NOT SEEN
+```
+
+... devuelve todos los mensajes con el marcador \Seen.
+
+```
+searchCriteria = HEADER CONTENT-TYPE "MIXED" NOT HEADER CONTENT-TYPE "TEXT"...
+```
+
+... devuelve los mensajes cuyo encabezado content-type contiene "Mixed" y no contiene "Text".
+
+```
+searchCriteria = HEADER CONTENT-TYPE "E" NOT SUBJECT "o" NOT HEADER CONTENT-TYPE "MIXED"
+```
+
+... devuelve los mensajes cuyo encabezado content-type contiene " e " y cuyo encabezado Subject no contiene " o " y cuyo encabezado content-type no es " Mixed ".
+
+En cuanto a los dos últimos ejemplos, observe que el resultado de la búsqueda es diferente cuando se eliminan los paréntesis de la primera lista de llaves de búsqueda.
+
+- El parámetro *searchCriteria* puede incluir opcionalmente la instrucción \[CHARSET]. Esta instrucción consiste en la palabra "CHARSET" seguida de un conjunto de caracteres definido \[CHARSET] (US ASCII, ISO-8859). Indica el conjunto de caracteres de la cadena *searchCriteria*. Por lo tanto, debe convertir la cadena *searchCriteria* al conjunto de caracteres especificado si utiliza la instrucción \[CHARSET] (consulte los comandos `CONVERT FROM TEXT` o `Convert to text`).
+ Por defecto, 4D codifica la cadena de criterios searchCriteria en Quotable Printable si contiene los caracteres extendidos.
+
+```
+searchCriteria = CHARSET "ISO-8859" BODY "Help"
+```
+
+... significa que los criterios de búsqueda utilizan el conjunto de caracteres iso-8859 y el servidor tendrá que convertir los criterios de búsqueda antes de buscar, si es necesario.
+
+#### Tipos de valores de búsqueda
+
+Las claves de búsqueda pueden solicitar el valor a buscar:
+
+- **Valores de tipo fecha**: los valores de tipo fecha se colocan en cadenas con el siguiente formato: *date-day+"-"+date-month+"-"+date-year* donde date-day indica la fecha del día del mes (2 caracteres como máximo), date-month indica el mes (Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Dec) y date-year indica el año (4 dígitos).
+ Ejemplo: `searchCriteria = SENTBEFORE 1-Feb-2020` (una fecha no suele necesitar comillas, ya que no contiene caracteres especiales)
+
+- **Valores de tipo cadena**: la cadena puede contener cualquier caracter y debe ir entre comillas. Si la cadena no contiene ningún caracter especial, como el espacio, por ejemplo, no es necesario colocarla entre comillas. Al colocar entre comillas estas cadenas se garantiza que su valor se interpretará correctamente.
+ Ejemplo: `searchCriteria = FROM "SMITH"`
+ Para todas las llaves de búsqueda que utilizan cadenas, un mensaje coincide con la llave si la cadena es una subcadena del campo. Las coincidencias no diferencian entre mayúsculas y minúsculas.
+
+- **Llaves de búsqueda con un valor nombres de campo**: los valores de tipo nombre de campo contienen el nombre de un campo de encabezado.
+ Ejemplo: `searchCriteria = HEADER CONTENT-TYPE "MIXED"`
+
+- **Llaves de búsqueda con 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`
+
+- **Llaves de búsqueda con un valor de 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 indicador \Answered activado.
+
+#### Teclas de búsqueda disponibles
+
+**ALL**: todos los mensajes en el buzón.
+**ANSWERED**: mensajes con el indicador \Answered activado.
+**UNANSWERED**: mensajes que no tienen el indicador \Answered activo.
+**DELETED**: mensajes con el indicador \Deleted activado.
+**UNDELETED**: mensajes que no tienen el indicador \Deleted activado.
+**DRAFT**: mensajes con el indicador \Draft activado.
+**UNDRAFT**: mensajes que no tienen el indicador \Draft activado.
+**FLAGGED**: mensajes con el indicador \Flagged activado.
+**UNFLAGGED**: mensajes que no tienen el indicador \Flagged activado.
+**RECENT**: mensajes que tienen el indicador \Recent activado.
+**OLD**: mensajes que no tienen el indicador \Recent activado.
+**SEEN**: mensajes que tienen el indicador \Seen activo.
+**UNSEEN**: mensajes que no tienen el indicador \Seen activo.
+**NEW**: mensajes que tienen el indicador \Recent activado pero no el indicador \Seen. Esto es funcionalmente equivalente a “(RECENT UNSEEN)”.
+**KEYWORD *flag***: mensajes con el conjunto de palabras clave especificado.
+**UNKEYWORD *flag***: mensajes que no tienen la palabra clave especificada.
+**BEFORE *date***: mensajes cuya fecha interna es anterior a la fecha especificada.
+**ON *date***: mensajes cuya fecha interna está dentro de la fecha especificada.
+**SINCE *date***: mensajes cuya fecha interna es anterior o posterior a la fecha especificada.
+**SENTBEFORE *date***: mensajes cuyo encabezado Date es anterior a la fecha especificada.
+**SENTON *date***: mensajes cuyo encabezado Date está dentro de la fecha especificada.
+**SENTSINCE *date***: mensajes cuyo encabezado Date está dentro o posterior a la fecha especificada.
+**TO *string***: mensajes que contienen la cadena especificada en el encabezado TO.
+**FROM *string***: mensajes que contienen la cadena especificada en el encabezado FROM.
+**CC *string***: mensajes que contienen la cadena especificada en el encabezado CC.
+**BCC *string***: mensajes que contienen la cadena especificada en el encabezado BCC.
+**SUBJECT *string***: mensajes que contienen la cadena especificada en el encabezado Asunto.
+**BODY *string***: mensajes que contienen la cadena especificada en el cuerpo del mensaje.
+**TEXT *string***: mensajes que contienen la cadena especificada en el encabezado o en el cuerpo del mensaje.
+**HEADER *field-name* *string***: mensajes que tienen un encabezado con el nombre de campo especificado y que contiene la cadena especificada en el field-body.
+**UID *message-UID***: mensajes con identificadores únicos correspondientes al conjunto de identificadores únicos especificados.
+**LARGER *n***: mensajes con un tamaño superior al número de bytes especificado.
+**SMALLER *n***: mensajes con un tamaño menor que el número especificado de bytes.
+**NOT *search-key***: mensajes que no coinciden con la llave de búsqueda especificada.
+**OR *search-key1* *search-key2***: mensajes que corresponden con cualquiera de las palabras clave de búsqueda.
+
+
+
+
+
+## .selectBox()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------------- |
+| 20 | *id*, *flags*, *permanentFlags* se devuelven |
+| 18 R4 | Añadidos |
+
+
+
+**.selectBox**( *name* : Text { ; *state* : Integer } ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------- |
+| name | Text | -> | Nombre del buzón |
+| state | Integer | -> | Estado de acceso al buzón |
+| Resultado | Object | <- | objeto boxInfo |
+
+
+
+#### Descripción
+
+La función `.selectBox()` selecciona el buzón *name* como buzón actual. Esta función permite recuperar la información sobre el buzón.
+
+> Para obtener la información de un buzón sin cambiar el buzón actual, utilice [`.getBoxInfo()`](#getboxinfo).
+
+En el parámetro *name*, pase el nombre del buzón a acceder. El nombre representa una jerarquía inequívoca de izquierda a derecha, con niveles separados por un carácter delimitador específico. El delimitador se puede encontrar con la función [`.getDelimiter()`](#getdelimiter).
+
+El parámetro opcional *state* define el tipo de acceso al buzón. Los valores posibles son:
+
+| Constante | Valor | Comentario |
+| --------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| IMAP read only state | 1 | Se accede al buzón seleccionado con privilegios de sólo lectura. Los mensajes con la bandera "reciente" (que indica que son nuevos) no se modifican. |
+| IMAP read write state | 0 | Se accede al buzón seleccionado con privilegios de lectura y escritura. Los mensajes se consideran "vistos" y pierden la bandera "reciente" (que indica que son mensajes nuevos). Default value: |
+
+> - La función genera un error y devuelve **Null** si *name* designa un buzón inexistente.
+> - Si no hay ninguna conexión abierta, `.selectBox()` abrirá una conexión.
+> - Si la conexión no ha sido usada desde la demora de conexión designada (ver `IMAP New transporter`), la función [`.checkConnection()`](#checkconnection) es llamada automáticamente.
+
+**Objeto devuelto**
+
+El objeto `boxInfo` devuelto contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| -------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| name | Text | Nombre del buzón |
+| mailCount | number | Número de mensajes en el buzón |
+| mailRecent | number | Número de mensajes con la bandera "recent" |
+| id | text | Id. único del buzón |
+| flags | text | Lista de banderas utilizadas actualmente para el buzón, separadas por espacios |
+| permanentFlags | text | Lista de banderas que el cliente puede cambiar permanentemente (excepto el indicador \Recent, que gestiona el servidor IMAP), separados por espacios |
+
+:::info
+
+Si la cadena `permanentFlags` incluye la bandera especial \*, significa que el servidor soporta [banderas personalizadas](#addflags).
+
+:::
+
+#### Ejemplo
+
+```4d
+ var $server; $boxinfo : Object
+ $server:=New object
+ $server.host:="imap.gmail.com" //Mandatory
+ $server.user:="4d@gmail.com"
+ $server.password:="XXXXXXXX"
+
+ var $transporter : 4D.IMAPTransporter
+ $transporter:=IMAP New transporter($server)
+ $boxInfo:=$transporter.selectBox("INBOX")
+```
+
+
+
+
+
+## .subscribe()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 | Añadidos |
+
+
+
+**.subscribe**( *name* : Text ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | -------------------------------- |
+| name | Text | -> | Nombre del buzón |
+| Resultado | Object | <- | Estado de la operación subscribe |
+
+
+
+#### Descripción
+
+La función `.subscribe()` permite añadir el buzón especificado al conjunto de buzones "suscritos" del servidor IMAP. De este modo, puede optar por acotar una gran lista de buzones disponibles suscribiéndose a los que habitualmente consulta.
+
+En el parámetro `name`, pase el nombre del buzón a añadir (suscribir) a sus buzones "suscritos".
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+Para suscribirse al buzón "Atlas Corp" en la jerarquía "Bills":
+
+```4d
+var $pw; $name : text
+var $options; $transporter; $status : object
+
+$options:=New object
+
+$pw:=Request("Please enter your password:")
+
+If(OK=1) $options.host:="imap.gmail.com"
+$options.user:="test@gmail.com"
+$options.password:=$pw
+
+$transporter:=IMAP New transporter($options)
+
+$name:="Bills"+$transporter.getDelimiter()+"Atlas Corp"
+$status:=$transporter.subscribe($name)
+
+If ($status.success)
+ ALERT("Mailbox subscription successful!")
+ Else
+ ALERT("Error: "+$status.statusText)
+ End if
+End if
+```
+
+
+
+
+
+## .unsubscribe()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 | Añadidos |
+
+
+
+**.unsubscribe**( *name* : Text ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | :-------------------------: | ---------------------------------- |
+| name | Text | -> | Nombre del buzón |
+| Resultado | Object | <- | Estado de la operación unsubscribe |
+
+
+
+#### Descripción
+
+La función `.unsubscribe()` elimina un buzón de un conjunto de buzones suscritos. Esto le permite reducir el número de buzones que suele ver.
+
+En el parámetro `name`, pase el nombre del buzón a eliminar (darse de baja) de sus buzones activos.
+
+**Objeto devuelto**
+
+La función devuelve un objeto que describe el estado IMAP:
+
+| Propiedad | | Tipo | Descripción |
+| ---------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si la operación tiene éxito, False en caso contrario |
+| statusText | | Text | Mensaje de estado devuelto por el servidor IMAP, o último error devuelto en la pila de errores 4D |
+| errors | | Collection | Pila de errores 4D (no se devuelve si se recibe una respuesta del servidor IMAP) |
+| | \[].errcode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+#### Ejemplo
+
+Para desuscribirse del buzón "Atlas Corp" en la jerarquía "Bills":
+
+```4d
+var $pw; $name : text
+var $options; $transporter; $status : object
+
+$options:=New object
+
+$pw:=Request("Please enter your password:")
+
+If(OK=1) $options.host:="imap.gmail.com"
+$options.user:="test@gmail.com"
+$options.password:=$pw
+
+$transporter:=IMAP New transporter($options)
+
+$name:="Bills"+$transporter.getDelimiter()+"Atlas Corp"
+$status:=$transporter.unsubscribe($name)
+
+If ($status.success)
+ ALERT("Mailbox unsubscription successful!")
+ Else
+ ALERT("Error: "+$status.statusText)
+ End if
+End if
+```
+
+
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/IncomingMessageClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/IncomingMessageClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/IncomingMessageClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/IncomingMessageClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/MailAttachmentClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/MailAttachmentClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/MailAttachmentClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/MailAttachmentClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/OutgoingMessageClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/OutgoingMessageClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/OutgoingMessageClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/OutgoingMessageClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/POP3TransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/POP3TransporterClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/POP3TransporterClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/POP3TransporterClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SMTPTransporterClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/SMTPTransporterClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SMTPTransporterClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/SMTPTransporterClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/SessionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/SessionClass.md
new file mode 100644
index 00000000000000..7b9392b7d194f3
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/SessionClass.md
@@ -0,0 +1,891 @@
+---
+id: SessionClass
+title: Session
+---
+
+Los objetos de sesión son devueltos por el comando [`Session`](../commands/session.md). Estos objetos ofrecen al desarrollador una interfaz que permite gestionar la sesión de usuario actual y ejecutar acciones como almacenar datos contextuales, compartir información entre procesos de sesión, lanzar procesos preferentes relacionados con la sesión o (sólo web) gestionar [privilegios](../ORDA/privileges.md).
+
+:::tip Entradas de blog relacionadas
+
+- [Sesiones escalables para aplicaciones web avanzadas](https://blog.4d.com/scalable-sessions-for-advanced-web-applications/)
+- [Permissions: inspeccionar los privilegios de la sesión para facilitar la depuración](https://blog.4d.com/permissions-inspect-session-privileges-for-easy-debugging/)
+- [Generar, compartir y utilizar contraseñas de un solo uso (OTP) para las sesiones web](https://blog.4d.com/connect-your-web-apps-to-third-party-systems/)
+
+:::
+
+### Tipos de sesiones
+
+Los siguientes tipos de sesiones están soportados por esta clase:
+
+- [**Sesiones usuario web**](WebServer/sessions.md): las sesiones usuario web están disponibles cuando [las sesiones escalables están activas en su proyecto](WebServer/sessions.md#enabling-web-sessions). Se utilizan para conexiones Web y REST, y se les pueden asignar privilegios.
+- [Sesiones usuario cliente remoto\*\*](../Desktop/clientServer.md#remote-user-sessions): en las aplicaciones cliente/servidor, los usuarios remotos tienen sus propias sesiones gestionadas en el servidor.
+- [**Sesión de procedimientos almacenados**](https://doc.4d.com/4Dv20/4D/20/4D-Server-and-the-4D-Language.300-6330554.en.html): todos los procedimientos almacenados ejecutados en el servidor comparten la misma sesión usuario virtual.
+- [**Sesión independiente**](../Project/overview.md#development): objeto de sesión local devuelto en una aplicación de un solo usuario (útil en las fases de desarrollo y prueba de aplicaciones cliente/servidor).
+
+:::note
+
+La disponibilidad de las propiedades y funciones del objeto `Session` depende del tipo de sesión.
+
+:::
+
+### Resumen
+
+| |
+| ---------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#clearprivileges) |
+| [](#createotp) |
+| [](#demote) |
+| [](#expirationdate) |
+| [](#getprivileges) |
+| [](#hasprivilege) |
+| [](#id) |
+| [](#idletimeout) |
+| [](#info) |
+| [](#isguest) |
+| [](#promote) |
+| [](#restore) |
+| [](#setprivileges) |
+| [](#storage) |
+| [](#username) |
+
+
+
+## .clearPrivileges()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------- |
+| 21 | Support of remote sessions |
+| 18 R6 | Añadidos |
+
+
+
+**.clearPrivileges()** : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | -------------------------------------------------- |
+| Resultado | Boolean | <- | True si la ejecución se ha realizado correctamente |
+
+
+
+#### Descripción
+
+:::note
+
+This function does nothing and always returns **True** with stored procedure sessions and standalone sessions.
+
+:::
+
+La función `.clearPrivileges()` elimina todos los privilegios asociados a la sesión (excluyendo privilegios promocionados)y devuelve **True** si la ejecución se ha realizado correctamente.
+
+A menos que esté en modo ["forceLogin"](../REST/authUsers.md#force-login-mode), la sesión se convierte automáticamente en una sesión de Invitado. En modo "forceLogin", `.clearPrivileges()` no transforma la sesión a una sesión de invitado, sólo elimina los privilegios de la sesión.
+
+:::note
+
+Esta función no elimina los **privilegios promovidos** del proceso web, tanto si se han añadido a través del archivo [roles.json](../ORDA/privileges.md#rolesjson-file) como de la función [`promote()`](#promote).
+
+:::
+
+Regarding remote client sessions, the function only impacts [code accessing the web server](../WebServer/preemptiveWeb.md#writing-thread-safe-web-server-code).
+
+#### Ejemplo
+
+```4d
+//Invalidar una sesión usuario web
+var $isGuest : Boolean
+var $isOK : Boolean
+
+$isOK:=Session.clearPrivileges()
+$isGuest:=Session.isGuest() //$isGuest es True
+```
+
+
+
+
+
+## .createOTP()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------- |
+| 21 | Support of remote sessions |
+| 20 R9 | Añadidos |
+
+
+
+**.createOTP** ( { *lifespan* : Integer } ) : Text
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | --------------------------------------------------- |
+| lifespan | Integer | -> | Duración de la vida del token de sesión en segundos |
+| Resultado | Text | <- | UUID del token |
+
+
+
+#### Descripción
+
+:::note
+
+This function is available with web user sessions and remote sessions. It returns an empty string in stored procedure and standalone sessions.
+
+:::
+
+La función `.createOTP()` crea un nuevo OTP (One Time Passcode) para la sesión y devuelve su token UUID. Este token es único en la sesión en la que fue generado.
+
+Para más información sobre los tokens OTP, por favor consulte [esta sección](../WebServer/sessions.md#session-token-otp).
+
+Puede definir un tiempo de espera personalizado pasando un valor en segundos en *lifespan*. If an expired token is used to restore a session, it is ignored. By default, if the *lifespan* parameter is omitted:
+
+- with web user sessions, the token is created with the same lifespan as the [`.idleTimeOut`](#idletimeout) of the session.
+- with remote sessions, the token is created with a 10 seconds lifespan.
+
+For **web user sessions**, the returned token can be used in exchanges with third-party applications or websites to securely identify the session. Por ejemplo, el token OTP de sesión se puede utilizar con una aplicación de pago.
+
+For **remote sessions**, the returned token can be used on 4D Server to identitfy requests coming from a [remote 4D running Qodly forms in a Web area](../Desktop/clientServer.md#remote-user-sessions).
+
+#### Ejemplo
+
+```4d
+var $token : Text
+$token := Session.createOTP( 60 ) //el token es válido durante 1 mn
+```
+
+
+
+
+
+## .demote()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R10 | Añadidos |
+
+
+
+**.demote**( *promoteId* : Integer )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-: | -------------------------------------- |
+| promoteId | Integer | -> | Id devuelto por la función `promote()` |
+
+
+
+#### Descripción
+
+:::note
+
+Esta función no hace nada en las sesiones cliente remoto, procedimientos almacenados y autónomos.
+
+:::
+
+La función `.demote()` elimina del proceso web el privilegio promocionado cuyo id pasó en *promoteId*, si fue añadido previamente por la función [`.promote()`](#promote).
+
+Si ningún privilegio con *promoteId* fue promovido usando [`.promote()`](#promote) en el proceso web, la función no hace nada.
+
+Si se han añadido varios privilegios al proceso web, se debe llamar a la función `demote()` para cada uno de ellos con el *promoteId* apropiado. Los privilegios se apilan en el orden en que se han añadido al proceso, se recomienda desapilar los privilegios en un orden LIFO (*Last In, First Out*).
+
+#### Ejemplo
+
+```4d
+exposed Function search($search : Text) : Collection
+
+ var $employees : Collection
+ var $promoteId1; $promoteId2 : Integer
+
+ $promoteId1:=Session.promote("admin")
+ $promoteId2:=Session.promote("superAdmin")
+
+ $search:="@"+$search+"@"
+
+ $employees:=This.query("type = :1 and lastname = :2"; "Intern"; $search).toCollection()
+
+ Session.demote($promoteId2)
+ Session.demote($promoteId1)
+
+ return $employees
+```
+
+#### Ver también
+
+[`.promote()`](#promote)
+
+
+
+
+
+## .expirationDate
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R6 | Añadidos |
+
+
+
+**.expirationDate** : Text
+
+#### Descripción
+
+:::note
+
+Esta propiedad sólo está disponible con sesiones de usuario web.
+
+:::
+
+La propiedad `.expirationDate` contiene la fecha y hora de expiración de la cookie de sesión. El valor se expresa como texto en el formato ISO 8601: `YYYY-MM-DDTHH:MM:SS.mmmZ`.
+
+Esta propiedad es de **solo lectura**. Se recalcula automáticamente si se modifica el valor de la propiedad [`.idleTimeout`](#idletimeout).
+
+#### Ejemplo
+
+```4d
+var $expiration : Text
+$expiration:=Session.expirationDate //eg "2021-11-05T17:10:42Z"
+```
+
+
+
+
+
+## .getPrivileges()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------- |
+| 21 | Soporte de sesiones cliente remotas |
+| 20 R6 | Añadidos |
+
+
+
+**.getPrivileges**() : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ---------------------------------------------------------------- |
+| Resultado | Collection | <- | Colección de nombres de privilegios (cadenas) |
+
+
+
+#### Descripción
+
+La función `.getPrivileges()` devuelve una colección de todos los nombres de privilegios asociados a la sesión.
+
+:::note
+
+Esta función devuelve los privilegios asignados a una Sesión utilizando únicamente la función [`setPrivileges()`](#setprivileges). Los privilegios promocionados NO son devueltos por la función, ya sea a través del archivo [roles.json](../ORDA/privileges.md#rolesjson-file) o la función [`promote()`](#promote).
+
+:::
+
+With remote client sessions, the privileges only concerns the code executed in the context of a [web request sent through a Web area](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+
+With stored procedure sessions and standalone sessions, this function returns a collection only containing "WebAdmin".
+
+#### Ejemplo
+
+Se ha definido el siguiente archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file):
+
+```json
+{
+ "privileges":[
+ {
+ "privilege":"simple",
+ "includes":[
+
+ ]
+ },
+ {
+ "privilege":"medium",
+ "includes":[
+ "simple"
+ ]
+ }
+ ],
+ "roles":[
+ {
+ "role":"Medium",
+ "privileges":[
+ "medium"
+ ]
+ }
+ ],
+ "permissions":{
+ "allowed":[
+
+ ]
+ }
+}
+```
+
+El rol de sesión se asigna en una función datastore `authentify()`:
+
+```4d
+ //Clase Datastore
+
+exposed Function authentify($role : Text) : Text
+ Session.clearPrivileges()
+ Session.setPrivileges({roles: $role})
+```
+
+Asumiendo que la función `authentify()` es llamada con el rol "Medium":
+
+```4d
+var $privileges : Collection
+$privileges := Session.getPrivileges()
+//$privileges: ["simple","medium"]
+```
+
+#### Ver también
+
+[.setPrivileges()](#setprivileges)
+[*Permisos - Inspeccionar los privilegios en la sesión para una fácil depuración* (entrada de blog)](https://blog.4d.com/permissions-inspect-the-privileges-in-the-session-for-an-easy-debugging)
+
+
+
+
+
+## .hasPrivilege()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------------------------------- |
+| 21 | Returns True for promoted privileges, Support of remote client sessions |
+| 18 R6 | Añadidos |
+
+
+
+**.hasPrivilege**( *privilege* : Text ) : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------------------------------------------ |
+| privilege | Text | -> | Nombre del privilegio a verificar |
+| Resultado | Boolean | <- | True si la sesión tiene *privilege*, False en caso contrario |
+
+
+
+#### Descripción
+
+La función `.hasPrivilege()` devuelve True si *privilege* está asociado a la sesión, y False en caso contrario.
+
+:::note
+
+Esta función devuelve True para el *privilegio* si se llama desde una función que fue promovida para este privilegio (ya sea a través del archivo [roles.json](../ORDA/privileges.md#rolesjson-file) o la función [`promote()`](#promote)).
+
+:::
+
+Regarding remote client sessions, the function only impacts [code accessing the web server](../WebServer/preemptiveWeb.md#writing-thread-safe-web-server-code).
+
+With stored procedure sessions and standalone sessions, this function always returns True, whatever the *privilege*.
+
+#### Ejemplo
+
+Quiere comprobar si el privilegio "WebAdmin" está asociado a la sesión usuario web:
+
+```4d
+If (Session.hasPrivilege("WebAdmin"))
+ //Acceso concedido, no hacer nada
+Else
+ //Mostrar una página de autenticación
+
+End if
+```
+
+#### Ver también
+
+[*Publicaciones de blog sobre esta funcionalidad*](https://blog.4d.com/?s=hasPrivilege)
+
+
+
+
+
+## .id
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R5 | Añadidos |
+
+
+
+**.id** : Text
+
+#### Descripción
+
+La propiedad `.id` contiene el identificador único (UUID) de la sesión de usuario. Con 4D Server, esta cadena única es asignada automáticamente por el servidor para cada sesión y permite identificar sus procesos.
+
+:::tip
+
+Puede utilizar esta propiedad para obtener el objeto [`.storage`](#storage) de una sesión gracias al comando [`Session storage`](../commands/session-storage.md).
+
+:::
+
+
+
+
+
+## .idleTimeout
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+
+|18 R6|Añadido|
+
+
+
+**.idleTimeout** : Integer
+
+#### Descripción
+
+:::note
+
+Esta propiedad sólo está disponible con sesiones de usuario web.
+
+:::
+
+La propiedad `.idleTimeout` contiene el tiempo de inactividad de la sesión (en minutos), después del cual la sesión es cerrada automáticamente por 4D.
+
+Si no se define esta propiedad, el valor por defecto es 60 (1h).
+
+Cuando se define esta propiedad, la propiedad [`expirationDate`](#expirationdate) se actualiza en consecuencia.
+
+> El valor no puede ser inferior a 60: si se define un valor inferior, el tiempo de espera se eleva hasta 60.
+
+Esta propiedad está en **lectura escritura**.
+
+#### Ejemplo
+
+```4d
+If (Session.isGuest())
+ // Una sesión de invitado se cerrará tras 60 minutos de inactividad
+ Session.idleTimeout:=60
+Else
+ // Otras sesiones se cerrarán tras 120 minutos de inactividad
+ Session.idleTimeout:=120
+End if
+
+```
+
+
+
+
+
+## .info
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R5 | Añadidos |
+
+
+
+**.info** : Object
+
+#### Descripción
+
+:::note
+
+Esta propiedad solo está disponible con clientes remotos, procedimientos almacenados y sesiones independientes.
+
+:::
+
+La propiedad `.info` describe la sesión del cliente remoto o del procedimiento almacenado en el servidor, o la sesión autónoma.
+
+:::note
+
+- El objeto `.info` es el mismo objeto que el devuelto en la propiedad "session" por el comando [`Process activity`](../commands/process-activity.md) para sesiones de cliente remoto y procedimientos almacenados.
+- El objeto `.info` es el mismo que devuelve el comando [`Session info`](../commands/session-info.md) para una sesión autónoma.
+
+:::
+
+El objeto `.info` contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ---------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| type | Text | Tipo de sesión: "remote", "storedProcedure", "standalone" |
+| userName | Text | Nombre de usuario 4D (mismo valor que [`.userName`](#username)) |
+| machineName | Text | Sesiones remotas: nombre de la máquina remota. Sesión de procedimientos almacenados: nombre del equipo servidor. Sesión autónoma: nombre de la máquina |
+| systemUserName | Text | Sesiones remotas: nombre de la sesión del sistema abierta en la máquina remota. |
+| IPAddress | Text | Dirección IP de la máquina remota |
+| hostType | Text | Tipo de host: "windows" o "mac" |
+| creationDateTime | Date ISO 8601 | Fecha y hora de creación de la sesión. Sesión autónoma: fecha y hora de inicio de la aplicación |
+| state | Text | Estado de la sesión: "active", "postponed", "sleeping" |
+| ID | Text | UUID de sesión (el mismo valor que [`.id`](#id)) |
+| persistentID | Text | Sesiones remotas: ID persistente de la sesión |
+
+:::note
+
+Dado que `.info` es una propiedad calculada, se recomienda llamarla una vez y luego almacenarla en una variable local si se desea realizar algún procesamiento sobre sus propiedades.
+
+:::
+
+
+
+
+
+## .isGuest()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R6 | Añadidos |
+
+
+
+**.isGuest()** : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | -------------------------------------------------------------- |
+| Resultado | Boolean | <- | True si la sesión es una sesión Guest, False en caso contrario |
+
+
+
+#### Descripción
+
+:::note
+
+Esta función siempre devuelve **False** con clientes remotos, procedimientos almacenados y sesiones independientes.
+
+:::
+
+La función `.isGuest()` devuelve True si la sesión es una sesión Guest (es decir, no tiene privilegios).
+
+#### Ejemplo
+
+En el método base `On Web Connection`:
+
+```4d
+If (Session.isGuest())
+ //Hacer algo para el usuario invitado
+End if
+```
+
+
+
+
+
+## .promote()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R10 | Añadidos |
+
+
+
+**.promote**( *privilege* : Text ) : Integer
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ---------------------------------------------------------- |
+| privilege | Text | -> | Nombre del privilegio |
+| Resultado | Integer | <- | id a utilizar al llamar a la función [`demote()`](#demote) |
+
+
+
+#### Descripción
+
+:::note
+
+Esta función no hace nada en las sesiones cliente remoto, procedimientos almacenados y autónomos.
+
+:::
+
+La función `.promote()` añade el privilegio definido en el parámetro *privilege* al proceso actual durante la ejecución de la función de llamada y devuelve el id del privilegio promovido.
+
+La adición dinámica de privilegios es útil cuando los derechos de acceso dependen del contexto de ejecución, que no puede definirse completamente en el archivo "roles.json". Esto es especialmente relevante cuando la misma función puede ser ejecutada por usuarios con diferentes niveles de acceso. El uso de `.promote()` asegura que sólo el proceso actual reciba los privilegios necesarios, sin afectar a otros.
+
+La función no hace nada y devuelve 0 si:
+
+- el *privilegio* no existe en el archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file),
+- el *privilegio* ya está asignado al proceso actual (usando `.promote()` o a través de una [acción de promoción estática](../ORDA/privileges.md#permission-actions) declarada para la función de llamada en el archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file)).
+
+Puede llamar a la función `promote()` varias veces en el mismo proceso para añadir diferentes privilegios.
+
+El id devuelto se incrementa cada vez que un privilegio se añade dinámicamente al proceso.
+
+Para eliminar un privilegio dinámicamente, llame a la función `demote()` con el id apropiado.
+
+#### Ejemplo
+
+Varios usuarios se conectan a un único punto final que sirve a distintas aplicaciones. Un usuario de la aplicación #1 no necesita el privilegio "super_admin" porque no crea "VerySensitiveInfo". Un usuario de la aplicación #2 necesita privilegios "super_admin".
+
+Puede proporcionar dinámicamente los privilegios adecuados en la función *CreateInfo*:
+
+```4d
+exposed Function createInfo($info1 : Text; $info2 : Text)
+
+var $sensitive : cs.SensitiveInfoEntity
+var $verySensitiveInfo : cs.VerySensitiveInfoEntity
+var $status : Object
+var $promoteId : Integer
+
+$sensitive:=ds.SensitiveInfo.new()
+$sensitive.info:=$info1
+$status:=$sensitive.save()
+
+If (Session.storage.role.name="userApp2")
+ $promoteId:=Session.promote("super_admin")
+ $verySensitiveInfo:=ds.VerySensitiveInfo.new()
+ $verySensitiveInfo.info:=$info2
+ $status:=$verySensitiveInfo.save()
+ Session.demote($promoteId)
+End if
+```
+
+#### Ver también
+
+[`.demote()`](#demote) [`hasPrivilege()`](#hasprivilege)
+
+
+
+
+
+## .restore()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R9 | Añadidos |
+
+
+
+**.restore** ( *token* : Text ) : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-------------------------: | ------------------------------------------------------------------------------ |
+| token | Text | -> | UUID del token de sesión |
+| Resultado | Boolean | <- | True si la sesión actual ha sido reemplazada con éxito por la sesión del token |
+
+
+
+#### Descripción
+
+:::note
+
+Esta función solo está disponible con sesiones usuario web. Devuelve False en otros contextos.
+
+:::
+
+La función `.restore()` sustituye la sesión actual del usuario web por su sesión original correspondiente al *token* UUID. El almacenamiento y los privilegios de la sesión son restaurados.
+
+Si la sesión original del usuario ha sido correctamente restaurada, la función devuelve `true`.
+
+La función devuelve `false` si:
+
+- el token de sesión ya ha sido utilizado,
+- el token de sesión ha caducado,
+- el token de sesión no existe,
+- la propia sesión original ha caducado.
+
+En este caso, la sesión actual de usuario web se deja sin tocar (no se restaura la sesión).
+
+#### Ejemplo
+
+En un singleton llamado por un HTTP Request handler personalizado:
+
+```4d
+shared singleton Class constructor()
+
+Function callback($request : 4D.IncomingMessage) : 4D.OutgoingMessage
+ Session.restore($request.urlQuery.state)
+```
+
+#### Ver también
+
+[`.createOTP()`](#createotp)
+
+
+
+
+
+## .setPrivileges()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | --------------------------------------------------- |
+| 21 | Soporte de sesiones cliente remotas |
+| 19 R8 | Compatibilidad con la propiedad "roles" en Settings |
+| 18 R6 | Añadidos |
+
+
+
+**.setPrivileges**( *privilege* : Text ) : Boolean **.setPrivileges**( *privileges* : Collection ) **.setPrivileges**( *settings* : Object ) : Boolean
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | :-------------------------: | ------------------------------------------------------------------------------ |
+| privilege | Text | -> | Nombre del privilegio |
+| privileges | Collection | -> | Colección de nombres de privilegios |
+| settings | Object | -> | Objeto con una propiedad "privilegios" (cadena o colección) |
+| Resultado | Boolean | <- | True si la ejecución se ha realizado correctamente |
+
+
+
+#### Descripción
+
+:::note
+
+This function does nothing and always returns **False** with stored procedure sessions and standalone sessions.
+
+:::
+
+La función `.setPrivileges()` asocia a la sesión los privilegios y/o roles definidos en el parámetro y devuelve **True** si la ejecución se ha realizado correctamente.
+
+- En el parámetro *privilege*, pase una cadena que contenga un nombre de privilegio (o varios nombres de privilegio separados por comas).
+- En el parámetro *privileges*, pase una colección de cadenas que contengan nombres de privilegios.
+- En el parámetro *settings*, pase un objeto que contenga las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ---------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| privileges | Text o Collection |
Cadena que contiene un nombre de privilegio, o
Colección de cadenas que contienen nombres de privilegios
|
+| roles | Text o Collection |
Cadena que contiene un rol, o
Colección de cadenas que contienen roles
|
+| userName | Text | User name to associate to the session (optional, web sessions only). Not available in remote client sessions (ignored). |
+
+:::note
+
+Los privilegios y los roles se definen en el archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file) del proyecto. Para más información, consulte la sección [**Privilegios**](../ORDA/privileges.md).
+
+:::
+
+Si la propiedad `privileges` o `roles` contiene un nombre que no está declarado en el archivo [`roles.json`](../ORDA/privileges.md#rolesjson-file), se ignora.
+
+Por defecto, cuando no hay ningún privilegio o rol asociado a la sesión, la sesión es una [sesión de invitado](#isguest).
+
+La propiedad [`userName`](#username) está disponible a nivel de objeto de sesión (sólo lectura).
+
+Regarding remote client sessions, the function only concerns the code executed in the context of a [web request sent through a Web area](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+
+#### Ejemplo
+
+En un método de autenticación personalizado, se establece el privilegio "WebAdmin" para el usuario:
+
+```4d
+var $userOK : Boolean
+
+... //Autenticar al usuario
+
+If ($userOK) //El usuario ha sido aprobado
+ var $info : Object
+ $info:=New object()
+ $info.privileges:=New collection("WebAdmin")
+ Session.setPrivileges($info)
+End if
+
+```
+
+#### Ver también
+
+[.getPrivileges()](#getprivileges)
+
+
+
+
+
+## .storage
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------------------------------------------------------ |
+| 20 R5 | Soporte de cliente remoto y sesiones de procedimientos almacenados |
+| 18 R6 | Añadidos |
+
+
+
+**.storage** : Object
+
+#### Descripción
+
+La propiedad `.storage` contiene un objeto compartido que puede utilizarse para almacenar información disponible para todos los procesos de la sesión.
+
+Cuando se crea un objeto `Session`, la propiedad `.storage` está vacía. Al ser un objeto compartido, esta propiedad estará disponible en el objeto `Storage` del servidor.
+
+> Al igual que el objeto `Storage` del servidor, la propiedad `.storage` es siempre "single": añadir un objeto compartido o una colección compartida a `.storage` no crea un grupo compartido.
+
+Esta propiedad es **sólo lectura** en sí misma pero devuelve un objeto de lectura-escritura.
+
+:::tip
+
+Puede obtener la propiedad `.storage` de una sesión utilizando el comando [`Session storage`](../commands/session-storage.md).
+
+:::
+
+#### Ejemplo de sesión web
+
+Desea almacenar la IP del cliente en la propiedad `.storage`. Puede escribir en el método base `On Web Authentication`:
+
+```4d
+If (Session.storage.clientIP=Null) //first access
+ Use (Session.storage)
+ Session.storage.clientIP:=New shared object("value"; $clientIP)
+ End use
+End if
+```
+
+#### Ejemplo de sesión remota
+
+Desea compartir datos entre procesos de la misma sesión:
+
+```4d
+Use (Session.storage)
+ Session.storage.settings:=New shared object("property"; $value; "property2"; $value2)
+End use
+```
+
+
+
+
+
+## .userName
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ------------------------------------------------------------------ |
+| 20 R5 | Soporte de cliente remoto y sesiones de procedimientos almacenados |
+| 18 R6 | Añadidos |
+
+
+
+**.userName** : Text
+
+#### Descripción
+
+La propiedad `.userName` contiene el nombre de usuario asociado a la sesión. Puede utilizarlo para identificar al usuario dentro de su código.
+
+- Con las sesiones web, esta propiedad es una cadena vacía por defecto. Puede definirse mediante la propiedad `privileges` de la función [`setPrivileges()`](#setprivileges).
+- Con sesiones remotas y de procedimientos almacenados, esta propiedad devuelve el mismo nombre de usuario que el comando [`Current user`](../commands-legacy/current-user.md).
+- Con sesiones independientes, esta propiedad contiene "diseñador" o el nombre definido con el comando [`SET USER ALIAS`](../commands-legacy/set-user-alias.md).
+
+Esta propiedad es **solo lectura**.
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SignalClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/SignalClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SignalClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/SignalClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SystemWorkerClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/SystemWorkerClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/SystemWorkerClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/SystemWorkerClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/TCPConnectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/TCPConnectionClass.md
new file mode 100644
index 00000000000000..846550e7f5f448
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/TCPConnectionClass.md
@@ -0,0 +1,354 @@
+---
+id: TCPConnectionClass
+title: TCPConnection
+---
+
+La clase `TCPConnection` permite gestionar conexiones cliente del Protocolo de Control de Transmisión (TCP) a un [servidor](./TCPListenerClass.md), permitiendo enviar y recibir datos, y manejar eventos del ciclo de vida de la conexión mediante retrollamadas.
+
+La clase `TCPConnection` está disponible en el class store `4D`. Puede crear una conexión TCP utilizando la función [4D.TCPConnection.new()](#4dtcpconnectionnew) que devuelve un [TCPConnection object](#tcpconnection-object).
+
+Todas las funciones de la clase `TCPConnection` son hilo seguro.
+
+Gracias al *refcounting* estándar de los objetos 4D, una TCPConnection se libera automáticamente cuando deja de estar referenciada. En consecuencia, los recursos asociados, se limpian adecuadamente sin necesidad de un cierre explícito.
+
+Los objetos TCPConnection se liberan cuando ya no existen referencias a ellos en memoria. Esto ocurre típicamente, por ejemplo, al final de una ejecución de un método para variables locales. Si desea "forzar" el cierre de una conexión en cualquier momento, [**nulifique** sus referencias poniéndolas en **Null**](../Concepts/dt_object.md#resources).
+
+:::info 4DTCPUDPLog.txt file
+
+For debugging and monitoring, you can use the [4DTCPUDPLog.txt log file](../Debugging/debugLogFiles.md#4dtcpudplogtxt) that records events related to TCP connections. Los eventos incluyen transmisión de datos, errores e información del ciclo de vida de la conexión.
+
+:::
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------- |
+| 20 R9 | Nuevos atributos `listener`, `address` y `port` |
+| 20 R8 | Clase añadida |
+
+
+
+### Ejemplos
+
+Los siguientes ejemplos demuestran cómo utilizar las clases 4D.TCPConnection y 4D.TCPEvent para gestionar una conexión cliente TCP, manejar eventos, enviar datos y cerrar correctamente la conexión. Se ofrecen ejemplos tanto síncronos como asíncronos.
+
+#### Ejemplo sincrónico
+
+Este ejemplo muestra cómo establecer una conexión, enviar datos y cerrarla utilizando un simple objeto para la configuración:
+
+```4d
+var $domain : Text := "127.0.0.1"
+var $port : Integer := 10000
+var $options : Object := New object() // Objeto de configuración
+var $tcpClient : 4D.TCPConnection
+var $message : Text := "test message"
+
+// Abrir una conexión
+$tcpClient := 4D.TCPConnection.new($domain; $port; $options)
+
+// Enviar datos
+var $blobData : Blob
+TEXT TO BLOB($message; $blobData; UTF8 text without length)
+$tcpClient.send($blobData)
+
+// Apagar
+$tcpClient.shutdown()
+$tcpClient.wait(0)
+
+```
+
+#### Ejemplo asincrónico
+
+Este ejemplo define una clase que maneja el ciclo de vida de la conexión y los eventos, mostrando cómo trabajar de forma asíncrona:
+
+```4d
+// Definición de la clase: cs.MyAsyncTCPConnection
+
+Class constructor($url : Text; $port : Integer)
+ This.connection := Null
+ This.url := $url
+ This.port := $port
+
+// Conectarse a uno de los servidores lanzados dentro de los workers
+Function connect()
+ This.connection := 4D.TCPConnection.new(This.url; This.port; This)
+
+// Desconectarse del servidor
+Function disconnect()
+ This.connection.shutdown()
+ This.connection := Null
+
+// Enviar datos al servidor
+Function getInfo()
+ var $blob : Blob
+ TEXT TO BLOB("Información"; $blob)
+ This.connection.send($blob)
+
+// Retrollamada cuando la conexión se ha establecido correctamente
+Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
+ ALERT("Conexión establecida")
+
+// Retrollamada cuando la conexión se ha cerrado correctamente
+Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
+ ALERT("Conexión cerrada")
+
+// Retrollamada cuando se reciben datos del servidor
+Function onData($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
+ ALERT(BLOB to text($event.data; UTF8 text without length))
+
+ //Atención: no hay garantía de que reciba todos los datos que necesita en un solo paquete de red.
+
+// Retrollamada cuando la conexión se cierra inesperadamente
+Function onError($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
+ ALERT("Error de conexión")
+
+// Retrollamada después de onShutdown/onError justo antes de que el objeto TCPConnection sea liberado
+Function onTerminate($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
+ ALERT("Conexión terminada")
+
+
+```
+
+##### Ejemplo de uso
+
+Crea un nuevo método llamado AsyncTCP, para inicializar y gestionar la conexión TCP:
+
+```4d
+var $myObject : cs.MyAsyncTCPConnection
+$myObject := cs.MyAsyncTCPConnection.new("myURL"; 10000)
+$myObject.connect()
+$myObject.getInfo()
+$myObject.disconnect()
+
+```
+
+Llama al método AsyncTCP en un worker:
+
+```4d
+CALL WORKER("new process"; "Async_TCP")
+
+```
+
+### Objeto TCPConnection
+
+Un objeto TCPConnection es un objeto no compartible.
+
+Los objetos TCPConnection ofrecen las siguientes propiedades y funciones:
+
+| |
+| --------------------------------------------------------------------------------------------------------------------- |
+| [](#address) |
+| [](#closed) |
+| [](#errors) |
+| [](#listener) |
+| [](#nodelay) |
+| [](#port) |
+| [](#send) |
+| [](#shutdown) |
+| [](#wait) |
+
+
+
+## 4D.TCPConnection.new()
+
+**4D.TCPConnection.new**( *serverAddress* : Text ; *serverPort* : Number ; *options* : Object ) : 4D.TCPConnection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------- | -------------------------------- | --------------------------- | ------------------------------------------------------------- |
+| serverAddress | Text | -> | Nombre de dominio o dirección IP del servidor |
+| serverPort | Integer | -> | Número de puerto del servidor |
+| options | Object | -> | Configuración [opciones](#options-parameter) para la conexión |
+| Resultado | 4D.TCPConnection | <- | Nuevo objeto TCPConnection |
+
+
+
+#### Descripción
+
+The `4D.TCPConnection.new()` function creates a new TCP connection to the specified *serverAddress* and *serverPort*, using the defined *options*, and returns a `4D.TCPConnection` object.
+
+#### Parámetro *options*
+
+En el parámetro *options*, pase un objeto que puede contener las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción | Por defecto |
+| ----------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
+| onConnection | Formula | Retrollamada que se activa cuando se establece la conexión. | Indefinido |
+| onData | Formula | Retrollamada activada cuando se reciben datos | Indefinido |
+| onShutdown | Formula | Retrollamada activada cuando la conexión se cierra correctamente | Indefinido |
+| onError | Formula | Retrollamada en caso de error | Indefinido |
+| onTerminate | Formula | Retrollamada activada justo antes de que se libere la TCPConnection | Indefinido |
+| noDelay | Boolean | **Sólo lectura** cesactiva el algoritmo de Nagle si `true` | False |
+| connectionTimeout | Real | Tiempo máximo (en segundos) para establecer la conexión. Si se supera, se interrumpe el intento de conexión | Definido por el sistema, generalmente ≥ 30 |
+| TLS | Boolean | Activa el cifrado TLS para las conexiones | False |
+
+#### Función callback (retrollamada)
+
+Todas las funciones de retrollamada reciben dos parámetros:
+
+| Parámetros | Tipo | Descripción |
+| ----------- | ----------------------------------------------- | ----------------------------------------------------- |
+| $connection | [objeto `TCPConnection`](#tcpconnection-object) | La instancia de conexión TCP actual. |
+| $event | [objeto `TCPEvent`](#tcpevent-object) | Contiene información sobre el evento. |
+
+**Secuencia de retrollamadas:**
+
+1. `onConnection` se activa cuando se establece la conexión.
+2. `onData` se activa cada vez que se reciben datos.
+3. Se activa `onShutdown` o `onError`:
+ - `onShutdown` se activa cuando la conexión se cierra correctamente.
+ - `onError` se activa si se produce un error.
+4. `onTerminate` siempre se activa justo antes de que la TCPConnection se libere (la conexión se cierra o se produce un error).
+
+#### Objeto TCPEvent
+
+Un objeto [`TCPEvent`](TCPEventClass.md) es devuelto cuando se llama una [función de retrollamada](#callback-functions).
+
+
+
+
+
+## .address
+
+**address** : Text
+
+#### Descripción
+
+La propiedad `.address` contiene la dirección IP o el nombre de dominio de la máquina remota.
+
+
+
+
+
+## .closed
+
+**closed** : Boolean
+
+#### Descripción
+
+La propiedad `.closed` contiene si la conexión está cerrada. Devuelve `true` si la conexión se ha cerrado, ya sea debido a un error, una llamada a `shutdown()`, o el cierre por parte del servidor.
+
+
+
+
+
+## .errors
+
+**errors** : Collection
+
+#### Descripción
+
+La propiedad `.errors` contiene una colección de objetos de error asociados a la conexión. Cada objeto de error incluye el código de error, una descripción y la firma del componente que causó el error.
+
+| Propiedad | | Tipo | Descripción |
+| --------- | ----------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------- |
+| errors | | Collection | Pila de error 4D en caso de error |
+| | [].errCode | Number | Código de error 4D |
+| | [].message | Text | Descripción del error 4D |
+| | [].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+
+
+
+
+## .listener
+
+**listener** : Object
+
+#### Descripción
+
+La propiedad `.listener` contiene el objeto [`TCPListener`](./TCPListenerClass.md) que creó la `TCPConnection`, si existe. Esta propiedad es de **solo lectura**.
+
+
+
+
+
+## .noDelay
+
+**noDelay** : Boolean
+
+#### Descripción
+
+La propiedad `.noDelay` contiene si el algoritmo de Nagle está desactivado (`true`) o activado (`false`). Esta propiedad es de **solo lectura**.
+
+
+
+
+
+## .port
+
+**port** : Number
+
+#### Descripción
+
+La propiedad `.port` contiene el número de puerto de la máquina remota. Esta propiedad es de **solo lectura**.
+
+
+
+
+
+## .send()
+
+**.send**( *data* : Blob )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | -- | -------------- |
+| data | Blob | -> | Datos a enviar |
+
+
+
+#### Descripción
+
+La función `send()` envía datos al servidor. Si la conexión no se ha establecido todavía, los datos se envían una vez que se ha establecido la conexión.
+
+
+
+
+
+## .shutdown()
+
+**.shutdown**()
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+#### Descripción
+
+La función `shutdown()`cierra el canal *write* de la conexión (cliente a servidor) mientras se mantiene abierto el canal *read* (servidor al flujo del cliente) permitiéndole continuar recibiendo datos hasta que la conexión sea completamente cerrada por el servidor o se produzca un error.
+
+
+
+
+
+## .wait()
+
+**.wait**( { *timeout* : Real } )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | :-: | ----------------------------------- |
+| timeout | Real | -> | Tiempo máximo de espera en segundos |
+
+
+
+#### Descripción
+
+La función `wait()` espera hasta que se cierre la conexión TCP o se alcance el `timeout` especificado
+
+:::note
+
+Durante la ejecución de `.wait()`, se ejecutan funciones de retrollamda, tanto si proceden de otras instancias de `SystemWorker`. Puede salir de un `.wait()` llamando a [`shutdown()`](#shutdown) desde una retrollamada.
+
+:::
+
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/TCPEventClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/TCPEventClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/TCPEventClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/TCPEventClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/TCPListenerClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/TCPListenerClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/TCPListenerClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/TCPListenerClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/Transporter.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/Transporter.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/Transporter.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/Transporter.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/UDPEventClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/UDPEventClass.md
new file mode 100644
index 00000000000000..50ee0a4757f21a
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/UDPEventClass.md
@@ -0,0 +1,83 @@
+---
+id: UDPEventClass
+title: UDPEvent
+---
+
+La clase `UDPEvent` ofrece información sobre los eventos que ocurren durante el ciclo de vida de un socket UDP. Se genera cuando se abre un [UDPSocket](UDPSocketClass.md) y se utiliza en las retrollamadas `onData`, `onError`, y `onTerminate`.
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R10 | Clase añadida |
+
+
+
+### Objeto UDPEvent
+
+Un objeto `UDPEvent` es inmutable y no se puede transmitir.
+
+Las siguientes propiedades están disponibles:
+
+| |
+| ---------------------------------------------------------------------------------------------------- |
+| [](#address) |
+| [](#data) |
+| [](#port) |
+| [](#type) |
+
+
+
+## .address
+
+**address** : Text
+
+#### Descripción
+
+The `.address` property contains the IP address of the remote machine.
+
+
+
+
+
+## .data
+
+**data** : Blob
+
+#### Descripción
+
+La propiedad `.data` contiene los datos asociados con el evento. Sólo es válido para eventos de tipo "data".
+
+
+
+
+
+## .port
+
+**port** : Number
+
+#### Descripción
+
+La propiedad `.port` contiene el número de puerto de la máquina remota.
+
+
+
+
+
+## .type
+
+**type** : Text
+
+#### Descripción
+
+La propiedad `.type` contiene el tipo del evento. Los valores posibles son:
+
+- `"data"`: indica que los datos han sido recibidos.
+- `"error"`: indica que se ha producido un error durante el UDPSocket.
+- `"terminate"`: indica que el UDPSocket está a punto de ser liberado.
+
+
+
+#### Ver también
+
+[UDPSocket](UDPSocketClass.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/UDPSocketClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/UDPSocketClass.md
new file mode 100644
index 00000000000000..4431e2440854ce
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/UDPSocketClass.md
@@ -0,0 +1,150 @@
+---
+id: UDPSocketClass
+title: UDPSocket
+---
+
+La clase `UDPSocket` permite enviar y recibir paquetes UDP. UDP (User Datagram Protocol) es un protocolo de fácil implementación para el envío de datos. Es más rápido y sencillo que TCP (sólo 8 bytes de encabezado frente a los al menos 20 bytes en TCP), pero no ofrece el mismo nivel de fiabilidad. Es útil para aplicaciones en las que los datos deben llegar rápidamente a su destino. Sin embargo, no permite verificar la entrega, ni comprobar errores o recuperar datos que no se hayan entregado correctamente.
+
+La clase `UDPSocket` está disponible en el class store `4D`. Puede crear una conexión UDP utilizando la función [4D.UDPSocket.new()](#4dudpsocketnew), que devuelve un [objeto UDPSocket](#udpsocket-object).
+
+Gracias al *refcounting* de los objetos 4D estándar, un socket UDPSocket se libera automáticamente cuando deja de estar referenciado, es decir, cuando no existen más referencias a ellos en memoria. Esto ocurre típicamente, por ejemplo, al final de una ejecución de un método para variables locales. En consecuencia, los recursos asociados se limpian adecuadamente sin necesidad de un cierre explícito. Sin embargo, si quieres "forzar" el cierre de un socket en cualquier momento, [**nulifica** sus referencias poniéndolas **Null**](../Concepts/dt_object.md#resources).
+
+:::info 4DTCPUDPLog.txt file
+
+Para depuración y monitorización, puede utilizar el fichero de registro [4DTCPUDPLog.txt](../Debugging/debugLogFiles.md#4dtcpudplogtxt) que registra los eventos relacionados con los sockets UDP. Los eventos incluyen transmisión de datos, errores e información del ciclo de vida de la conexión.
+
+:::
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R10 | Clase añadida |
+
+
+
+### Ejemplo
+
+### Objeto UDPSocket
+
+Un objeto UDPSocket no es modificable y no es streamable.
+
+Los objetos UDPSocket ofrecen las siguientes propiedades y funciones:
+
+| |
+| --------------------------------------------------------------------------------------------------- |
+| [](#errors) |
+| [](#port) |
+| [](#send) |
+
+
+
+## 4D.UDPSocket.new()
+
+**4D.UDPSocket.new**() : 4D.UDPSocket **4D.UDPSocket.new**( *options* : Object ) : 4D.UDPSocket **4D.UDPSocket.new**( *port* : Integer ) : 4D.UDPSocket **4D.UDPSocket.new**( *port* : Integer ; *options* : Object ) : 4D.UDPSocket
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | --------- | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
+| port | Integer | -> | Puerto local utilizado para el socket UDP (0 u omitido = buscar cualquier puerto no utilizado para utilizar) |
+| options | Object | -> | Configuración [opciones](#options-parameter) para el socket |
+| Resultado | UDPSocket | <- | Nuevo objeto UDPSocket |
+
+
+
+#### Descripción
+
+La función `4D.UDPSocket.new()` crea un nuevo socket UDP utilizando las *options* definidas (si las hay) en el *port* especificado (si lo hay) o en un puerto aleatorio no utilizado, y devuelve un objeto `4D.UDPSocket`.
+
+#### Parámetro *options*
+
+En el parámetro *options*, puede pasar un objeto que contenga las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción | Por defecto |
+| ----------- | ------- | ------------------------------------------------ | ----------- |
+| onData | Formula | Retrollamada activada cuando se reciben datos | Indefinido |
+| onError | Formula | Retrollamada en caso de error | Indefinido |
+| onTerminate | Formula | Retrollamada activada cuando se libera el puerto | Indefinido |
+
+#### Función callback (retrollamada)
+
+Todas las funciones de retrollamada reciben dos parámetros:
+
+| Parámetros | Tipo | Descripción |
+| ---------- | --------------------------------------- | ----------------------------------------------------- |
+| $socket | [`UDPSocket` object](#udpsocket-object) | La instancia UDPSocket actual. |
+| $event | [`UDPEvent` object](#udpevent-object) | Contiene información sobre el evento. |
+
+**Secuencia de retrollamadas:**
+
+1. `onData` se activa cada vez que se reciben datos.
+2. `onError` se activa si se produce un error.
+3. `onTerminate` siempre se activa justo antes de que el puerto se libere (el socket se cierra o se produce un error).
+
+#### Objeto UDPEvent
+
+Un objeto [`UDPEvent`](UDPEventClass.md) es devuelto cuando se llama una [función de retrollamada](#callback-functions).
+
+
+
+
+
+## .errors
+
+**errors** : Collection
+
+#### Descripción
+
+La propiedad `.errors` contiene una colección de objetos de error asociados al socket. Cada objeto de error incluye el código de error, una descripción y la firma del componente que causó el error.
+
+| Propiedad | | Tipo | Descripción |
+| --------- | ----------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------- |
+| errors | | Collection | Pila de error 4D en caso de error |
+| | [].errCode | Number | Código de error 4D |
+| | [].message | Text | Descripción del error 4D |
+| | [].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+
+
+
+
+## .port
+
+**port** : Number
+
+#### Descripción
+
+La propiedad `.port` contiene el número de puerto a escuchar. Esta propiedad es de **solo lectura**.
+
+
+
+
+
+## .send()
+
+**.send**( *data* : Blob ; *hostName* : Text ; *remotePort* : Integer )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | -- | ----------------------------------------------------------------- |
+| data | Blob | -> | Datos a enviar |
+| hostName | Text | -> | Nombre o dirección IP del servidor |
+| remotePort | Integer | -> | Puerto remoto al que conectarse (0=cualquiera) |
+
+
+
+#### Descripción
+
+La función `send()` envía *data* al servidor remoto *hostName* en el *remotePort* especificado.
+
+*hostName* es el nombre o la dirección IP del servidor al que se enviarán los datos.
+
+*remotePort* es el número del puerto al que hay que conectarse. Si pasa 0, se utilizará cualquier puerto disponible.
+
+
+
+#### Ver también
+
+[UDPEvent](UDPEventClass.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/VectorClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/VectorClass.md
new file mode 100644
index 00000000000000..9ec0540feb02f6
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/VectorClass.md
@@ -0,0 +1,300 @@
+---
+id: VectorClass
+title: Vector
+---
+
+La clase `Vector` permite manejar **vectores** y ejecutar cálculos de distancia y similitud entre ellos. Esta clase está disponible en el "class store" de `4D`.
+
+En el mundo de las IA, un vector es una secuencia de números que permite a una máquina comprender y manipular datos complejos. Para una visión detallada del papel de los vectores con las IAs, puede consultar [esta página](https://aiforsocialgood.ca/blog/understanding-the-role-of-vectors-in-artificial-intelligence-a-comprehensive-guide).
+
+### Comprender los diferentes cálculos vectoriales
+
+La clase `4D.Vector` propone tres tipos de cálculos vectoriales. La siguiente tabla resume las principales características de cada uno:
+
+| | cosineSimilarity | dotSimilarity | euclideanDistance |
+| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Definición | Compara la orientación de dos textos representados como vectores. Cuanto más apunta en la misma dirección, más cerca están. | Suma de productos entre cada dimensión vectorial. Es como una puntuación ponderada de compatibilidad. | Distancia real entre dos vectores, como si se midiera con una regla. |
+| Analogía simple | ¿Estamos hablando del mismo tema? | ¿Se refiere usted al mismo tema de forma insistente? | ¿Está realmente lejos de lo que estoy diciendo? |
+| Ejemplo | Imagine que busca películas para ver en un servicio de streaming de vídeo a la carta. La similitud del coseno se utiliza para comparar sus gustos (por ejemplo, le gustan las películas de acción con un poco de comedia) con las descripciones de las películas de su base de datos. No importa si es un "pequeño" fan (ve 1 película al mes) o un "gran" fan (ve 10 películas a la semana), lo que importa es si las películas tienen características similares a lo que le gusta (acción + comedia). El servicio de streaming utiliza la similitud del coseno para recomendar películas que "apuntan en la misma dirección" que sus preferencias. | Piense en un motor de búsqueda. Cuando escribe "receta de tarta de chocolate", el algoritmo compara su consulta con páginas web. El producto punto se puede utilizar no sólo para comprobar si una página habla de pasteles de chocolate (una dirección similar a la de su búsqueda), sino también para dar más peso a las páginas que son muy relevantes (por ejemplo, una página con mucho contenido detallado sobre pasteles de chocolate tendrá una mayor "longitud" y, por tanto, una puntuación más alta). Una página con una sola frase sobre el tema tendrá una puntuación más baja. | Imagine una aplicación de citas. El algoritmo puede utilizar la distancia euclidiana para comparar su perfil (sus intereses, edad, ubicación, etc.) con las de otros usuarios. Si sus perfiles son muy similares (por ejemplo, a ambos les gusta el senderismo, la música pop, y viven a 5 km de distancia), la distancia euclidiana entre sus perfiles será baja, y la aplicación sugerirá a esta persona como un buen "match". Aquí cuentan todas las diferencias (por pequeñas que sean), no sólo la orientación general de sus gustos. |
+
+En cualquier caso, conviene probar los distintos vectores para determinar cuál se adapta mejor a sus necesidades y datos.
+
+### Objeto vector
+
+Los objetos vectoriales son compartidos, inmutables y transmisibles.
+
+| |
+| -------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#cosinesimilarity) |
+| [](#dotsimilarity) |
+| [](#euclideandistance) |
+| [](#length) |
+| [](#tocollection) |
+
+## 4D.Vector.new()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R10 | Añadidos |
+
+
+
+**4D.Vector.new** ( *parameter* : Collection ) : 4D.Vector
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | --------------------------- | ----------------------------------------------------- |
+| parámetros | Colección de reales | -> | Colección de números reales que representan un vector |
+| Resultado | 4D.Vector | <- | Nuevo objeto vector |
+
+
+
+#### Descripción
+
+La función `4D.Vector.new()` crea y devuelve un nuevo objeto del tipo `4D.Vector`.
+
+En *parameter*, pase una colección de números reales que representen el vector a crear. Estos valores los ofrecen las inteligencias artificiales y representan matemáticamente objetos como palabras o datos.
+
+#### Ejemplo
+
+Para crear un vector:
+
+```4d
+var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
+```
+
+Puede acceder a componentes individuales o convertir todo el vector en una colección:
+
+```4d
+var $firstComponent := $vector[0]
+var $collection := $vector.toCollection()
+```
+
+## .cosineSimilarity()
+
+**.cosineSimilarity**( *vector* : 4D.Vector ) : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | --------------------------- | -------------------------- |
+| vector | 4D.Vector | -> | Vector con el que comparar |
+| Resultado | Real | <- | Distancia entre vectores |
+
+
+
+#### Descripción
+
+La función `.cosineSimilarity()` calcula la similitud coseno entre el vector 4D actual y el que se paso en el parámetro *vector*. Ambos vectores deben tener el mismo tamaño.
+
+Esta métrica mide el **ángulo entre vectores** y se utiliza habitualmente para determinar la similitud semántica entre textos. Se recomienda para incrustaciones de texto, documentos, frases y cualquier dato en el que la **dirección** importe más que la **magnitud** (por ejemplo, para la búsqueda semántica o la clasificación de textos).
+
+**Valor devuelto**
+
+- Rango: -1 (opuesto) a 1 (idéntico).
+- Cuanto mayor sea el valor devuelto, más parecidos son los vectores.
+
+#### Ejemplo 1
+
+```4d
+var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
+var $anotherVector := 4D.Vector.new([0.598; -0.951; 0.789])
+var $similarity := $vector.cosineSimilarity($anotherVector)
+```
+
+#### Ejemplo 2
+
+:::info
+
+Este ejemplo utiliza la extensión [4D AIKit](../aikit/overview.md) para generar incrustaciones.
+
+:::
+
+```4d
+
+var $model:="text-embedding-ada-002"
+var $people:=ds.People.get(1)
+
+$prompt:=String($people.Firstname)+" "+String($people.Lastname)+" was born on "+\
+String($people.Birthday)+" and lives in "+String($people.Address)+", "+\
+String($people.ZipCode)+", "+String($people.City)+", "+String($people.Country)+\
+". Contact: "+String($people.email)+", "+String($people.Cell)+", "+\
+String($people.Phone)+". Family IDs - Father: "+String($people.FatherID)+\
+", Mother : "+String($people.MotherID)+", Partner: "+String($people.PartnerID)+"."
+
+var $clientAI:=cs.AIKit.OpenAI.new(getAIKey())
+
+// Cálculo de vectores con 4D AIKit
+var $result:=$clientAI.embeddings.create($prompt; $model)
+
+// Creación de objetos 4D.vector
+var $vector:=$result.vector
+
+var $question:="I'm looking for John who lives in USA"
+
+// Cálculo vectorial con componente 4D AIKit
+var $questionVector:=$clientAI.embeddings.create($question; $model).vector
+
+// cálculo de similitud
+If ($vector.cosineSimilarity($questionVector)>0.9)
+ ALERT("Interesting result")
+End if
+
+//resultado real: 0,7360136465949
+
+
+```
+
+## .dotSimilarity()
+
+**.dotSimilarity**( *vector* : 4D.Vector ) : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | --------------------------- | -------------------------- |
+| vector | 4D.Vector | -> | Vector con el que comparar |
+| Resultado | Real | <- | Distancia entre vectores |
+
+
+
+#### Descripción
+
+La función `.dotSimilarity()` calcula el producto punto del vector 4D actual y el que pasó en el parámetro *vector*. Ambos vectores deben tener el mismo tamaño.
+
+Esta métrica refleja tanto la **similitud** como la **magnitud**, y se utiliza generalmente en modelos en los que varían las normas vectoriales (magnitudes). Se recomienda para escenarios en los que las incrustaciones se han afinado teniendo en cuenta la magnitud (por ejemplo, motores de recomendación, puntuación de relevancia).
+
+**Valor devuelto**
+
+- Depende de las magnitudes y direcciones de los vectores
+- Cuanto mayor sea el valor devuelto, más parecidos son los vectores.
+
+#### Ejemplo
+
+```4d
+var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
+var $anotherVector := 4D.Vector.new([0.598; -0.951; 0.789])
+var $score := $vector.dotSimilarity($anotherVector)
+
+```
+
+#### Ejemplo 2
+
+:::info
+
+Este ejemplo utiliza la extensión [4D AIKit](../aikit/overview.md) para generar incrustaciones.
+
+:::
+
+```4d
+var $model:="text-embedding-ada-002"
+var $clientAI:=cs.AIKit.OpenAI.new(getAIKey())
+
+$documents:=[{text: "How to bake a chocolate cake"; similarity: 0}; \
+{text: "Best hiking trails in the Alps"; similarity: 0}; \
+{text: "Tips for learning 4D programming"; similarity: 0}; \
+{text: "Top 10 sci-fi movies of all time"; similarity: 0}]
+
+$question:="4D coding tutorials"
+
+// Cálculo de vectores con el componente AIKit 4D
+$questionVector:=$clientAI.embeddings.create($question; $model).vector
+
+For each ($document; $documents)
+ // Cálculo de vectores con el componente AIKit 4D
+ $vector:=$clientAI.embeddings.create($document.text; $model).vector
+ // similitud
+ $document.similarity:=$vector.dotSimilarity($questionVector)
+End for each
+
+$documents:=$documents.orderBy("similarity desc")
+ALERT("Best answer: "+$documents[0].text)
+
+//$documents:
+//{text:Tips for learning 4D programming,similarity:0.90409492325102}
+//{text:Top 10 sci-fi movies of all time,similarity:0.75362527646035}
+//{text:How to bake a chocolate cake,similarity:0.73664833336323}
+//{text:Best hiking trails in the Alps,similarity:0.73138600461065}
+
+```
+
+## .euclideanDistance()
+
+**.euclideanDistance**( *vector* : 4D.Vector ) : Real
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------------- | --------------------------- | -------------------------- |
+| vector | 4D.Vector | -> | Vector con el que comparar |
+| Resultado | Real | <- | Distancia entre vectores |
+
+
+
+#### Descripción
+
+La función `.euclideanDistance()` calcula la distancia euclídea entre el vector 4D actual y el que pasó en el parámetro *vector*. Ambos vectores deben tener el mismo tamaño.
+
+Esto mide la distancia de línea recta en el espacio vectorial. Se recomienda para incrustaciones de datos numéricos o estructurados, o cuando se utilizan modelos en los que la proximidad en el espacio bruto se correlaciona directamente con la similitud.
+
+**Valor devuelto**
+
+- valor devuelto >= 0
+- Cuanto más bajo sea el valor devuelto, más parecidos son los vectores.
+
+#### Ejemplo 1
+
+```4d
+var $vector := 4D.Vector.new([0.123; -0.456; 0.789])
+var $anotherVector := 4D.Vector.new([0.598; -0.951; 0.789])
+var $distance := $vector.euclideanDistance($anotherVector)
+
+```
+
+#### Ejemplo 2
+
+```4d
+$places:=[\
+{name: "Eiffel Tower"; coord: [48.8584; 200.2945]; similarity: 0}; \
+{name: "Louvre Museum"; coord: [48.8606; 200.3376]; similarity: 0}; \
+{name: "Notre-Dame"; coord: [48.8529; 200.35]; similarity: 0}; \
+{name: "Montmartre"; coord: [48.8867; 200.3431]; similarity: 0}\
+]
+
+$userLocation:=[8.8566; 20.3522]
+var $vector:=4D.Vector.new($userLocation)
+
+For each ($place; $places)
+ $place.similarity:=$vector.euclideanDistance(4D.Vector.new($place.coord))
+End for each
+
+$places:=$places.orderBy("similarity asc")
+ALERT("Nearest monument: "+$places[0].name)
+```
+
+## .length
+
+**length** : Integer
+
+#### Descripción
+
+La propiedad `.length` contiene el número de componentes del vector.
+
+## .toCollection()
+
+**.toCollection**() : Collection
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---------- | --------------------------- | ---------------------------------------------------------------------- |
+| Resultado | Collection | <- | Colección de números reales que representan los componentes del vector |
+
+
+
+La función `.toCollection()` devuelve los componentes del vector como una colección de reales.
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebFormClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebFormClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebFormClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/WebFormClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebFormItemClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebFormItemClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebFormItemClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/WebFormItemClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebServerClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebServerClass.md
new file mode 100644
index 00000000000000..6fed6a0c01983c
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebServerClass.md
@@ -0,0 +1,687 @@
+---
+id: WebServerClass
+title: WebServer
+---
+
+La API clase `WebServer` le permite iniciar y controlar un servidor web para la aplicación principal (host) así como para cada componente alojado (ver la descripción general del [objeto servidor web](WebServer/webServerObject.md)). Esta clase está disponible en el "class store" de `4D`.
+
+### Objeto servidor web
+
+Los objetos servidor web se instancian con el comando [`WEB Server`](../commands/web-server.md).
+
+Ofrecen las siguientes propiedades y funciones:
+
+### Resumen
+
+| |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [](#accesskeydefined) |
+| [](#certificatefolder) |
+| [](#characterset) |
+| [](#ciphersuite) |
+| [](#corsenabled) |
+| [](#corssettings) |
+| [](#debuglog) |
+| [](#defaulthomepage) |
+| [](#handlers) |
+| [](#hstsenabled) |
+| [](#hstsmaxage) |
+| [](#httpcompressionlevel) |
+| [](#httpcompressionthreshold) |
+| [](#httpenabled) |
+| [](#httpport) |
+| [](#httptrace) |
+| [](#httpsenabled) |
+| [](#httpsport) |
+| [](#inactiveprocesstimeout) |
+| [](#inactivesessiontimeout) |
+| [](#ipaddresstolisten) |
+| [](#isrunning) |
+| [](#keepsession) |
+| [](#logrecording) |
+| [](#maxconcurrentprocesses) |
+| [](#maxrequestsize) |
+| [](#maxsessions) |
+| [](#mintlsversion) |
+| [](#name) |
+| [](#opensslversion) |
+| [](#perfectforwardsecrecy) |
+| [](#rootfolder) |
+| [](#rules) |
+| [](#scalablesession) |
+| [](#sessioncookiedomain) |
+| [](#sessioncookiename) |
+| [](#sessioncookiepath) |
+| [](#sessioncookiesamesite) |
+| [](#sessionipaddressvalidation) |
+| [](#start) |
+| [](#stop) |
+
+## .accessKeyDefined
+
+**.accessKeyDefined** : Boolean
+
+La propiedad **.accessKeyDefined** contiene true si se define una llave de acceso en la configuración del servidor web. Esta propiedad es utilizada por el servidor web de WebAdmin para validar la configuración de seguridad de la interfaz de administración.
+
+
+
+## .certificateFolder
+
+**.certificateFolder** : Text
+
+Ruta de la carpeta donde se encuentran los archivos de los certificados. La ruta se formatea en la ruta completa POSIX utilizando filesystems. Cuando se utiliza esta propiedad en el parámetro `settings` de la función [`.start()`](#start) puede ser un objeto [`Folder`](FolderClass.md).
+
+
+
+
+
+## .characterSet
+
+**.characterSet** : Number **.characterSet** : Text
+
+El conjunto de caracteres que el Servidor Web 4D debe utilizar para comunicarse con los navegadores que se conectan a la aplicación. El valor por defecto depende del lenguaje del sistema operativo. El valor por defecto depende del lenguaje del sistema operativo. 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
+- 13 = ISO-8859-10
+- 17 = Shift-JIS
+- 2024 = Windows-31J
+- 2026 = Big5
+- 38 = euc-kr
+- 106 = UTF-8
+- 2250 = Windows-1250
+- 2251 = Windows-1251
+- 2253 = Windows-1253
+- 2255 = Windows-1255
+- 2256 = Windows-1256
+
+
+
+
+
+## .cipherSuite
+
+**.cipherSuite** : Text
+
+La 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.
+
+
+
+
+
+## .CORSEnabled
+
+**.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. Por razones de seguridad, las peticiones "cross-domain" están prohibidas por defecto a nivel del navegador. 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)
+
+Para más información sobre CORS, consulte la página [Cross-origin resource sharing page](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) en Wikipedia.
+
+
+
+
+
+## .CORSSettings
+
+**.CORSSettings** : Collection
+
+Contiene la lista de hosts y de métodos autorizados para el servicio CORS (ver la propiedad [`CORSEnabled`](#corsenabled)). Cada objeto debe contener una propiedad **host** y, opcionalmente, una propiedad **methods**:
+
+- **host** (texto, obligatorio): nombre de dominio o dirección IP desde donde las páginas externas pueden enviar solicitudes de datos al Servidor a través de CORS. Se pueden añadir múltiples atributos de dominio para crear una lista blanca. Si *host* no está presente o está vacío, el objeto se ignora. Se soportan varias sintaxis:
+ - 192.168.5.17:8081
+ - 192.168.5.17
+ - 192.168.\*
+ - 192.168.\*:8081
+ -
+ -
+ -
+ - \*.myDomain.com
+ - myProject.myDomain.com
+ - \*
+
+- **methods** (texto, opcional): método(s) HTTP aceptado(s) para el host CORS correspondiente. Separe cada método con un ";" (por ejemplo: "post;get"). Separe cada método con un ";" (por ejemplo: "post;get").
+
+
+
+
+
+## .debugLog
+
+**.debugLog** : Integer
+
+El estado del archivo de registro de peticiones HTTP (HTTPDebugLog_nn.txt, almacenado en la carpeta "Logs" de la aplicación -- nn es el número de archivo).
+
+- 0 = desactivado
+- 1 = activado sin partes del cuerpo (en este caso se suministra el tamaño del cuerpo)
+- 3 = activado con las partes del cuerpo en respuesta únicamente
+- 5 = activado con las partes del cuerpo en petición únicamente
+- 7 = activado con las partes del cuerpo en respuesta y petición
+
+
+
+
+
+## .defaultHomepage
+
+**.defaultHomepage** : Text
+
+El nombre de la página de inicio por defecto o "" para no enviar la página de inicio personalizada.
+
+
+
+
+
+## .handlers
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 21 | Añadidos |
+
+
+
+**.handlers** : Collection
+
+*Propiedad de sólo lectura*
+
+A collection of custom HTTP handler objects. An HTTP handler object contains a listened URL pattern, a handled verb, and the code to be called. HTTP handlers can be defined through a HTTPHandlers.json file or the *settings* parameter of the [`.start()`](#start) function. For more information, please refer to the [HTTP Request handler](../WebServer/http-request-handler.md) page.
+
+
+
+
+
+## .HSTSEnabled
+
+**.HSTSEnabled** : Boolean
+
+El estado 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. HSTS permite al servidor web declarar que los navegadores sólo deben interactuar con él a través de conexiones HTTPS seguras. HSTS requiere que HTTPS esté activado en el servidor. HTTP también debe estar activado para permitir las conexiones cliente iniciales.
+
+
+
+
+
+## .HSTSMaxAge
+
+**.HSTSMaxAge** : Integer
+
+El máximo de tiempo (en segundos) que HSTS está activo 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).
+
+
+
+
+
+## .HTTPCompressionLevel
+
+**.HTTPCompressionLevel** : Integer
+
+El nivel de compresión para todos los intercambios HTTP comprimidos para el servidor HTTP 4D (peticiones del cliente o respuestas del 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:
+
+- 1 a 9 (donde 1 es la compresión más rápida y 9 la más alta).
+- -1 = definir un compromiso entre la velocidad y la tasa de compresión.
+
+Valores posibles:
+
+
+
+
+
+## .HTTPCompressionThreshold
+
+**.HTTPCompressionThreshold** : Integer
+
+El umbral de tamaño (bytes) para las solicitudes por debajo del cual los intercambios no deben ser comprimidos. 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
+
+
+
+
+
+## .HTTPEnabled
+
+**.HTTPEnabled** : Boolean
+
+El estado del protocolo HTTP.
+
+
+
+
+
+## .HTTPPort
+
+**.HTTPPort** : Integer
+
+El número de puerto IP de escucha para HTTP.
+
+Por defecto = 80
+
+
+
+
+
+## .HTTPTrace
+
+**.HTTPTrace** : Boolean
+
+La 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.
+
+
+
+
+
+## .HTTPSEnabled
+
+**.HTTPSEnabled** : Boolean
+
+El estado del protocolo HTTPS.
+
+
+
+
+
+## .HTTPSPort
+
+**.HTTPSPort** : Integer
+
+El número de puerto IP de escucha para HTTPS.
+
+Por defecto = 443
+
+
+
+
+
+## .inactiveProcessTimeout
+
+**.inactiveProcessTimeout** : Integer
+
+> Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession).
+
+La duración (en minutos) de los procesos de sesión heredados 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`, luego se destruye el contexto de sesión heredado.
+
+Por defecto = 480 minutos
+
+
+
+
+
+## .inactiveSessionTimeout
+
+**.inactiveSessionTimeout** : Integer
+
+> Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession).
+
+La duración (en minutos) de las sesiones heredadas inactivas (duración establecida 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
+
+
+
+
+
+## .IPAddressToListen
+
+**.IPAddressToListen** : Text
+
+La 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.
+
+
+
+
+
+## .isRunning
+
+**.isRunning** : Boolean
+
+*Propiedad de sólo lectura*
+
+El estado de ejecución del servidor web.
+
+
+
+
+
+## .keepSession
+
+**.keepSession** : Boolean
+
+Contiene `True` si las sesiones heredadas están activadas en el servidor web, `False` en caso contrario.
+
+##### Ver también
+
+[.scalableSession](#scalablesession)
+
+
+
+
+
+## .logRecording
+
+**.logRecording** : Integer
+
+El valor de registro log (logweb.txt).
+
+- 0 = No registrar (por defecto)
+- 1 = Registro en formato CLF
+- 2 = Registro en formato DLF
+- 3 = Registro en formato ELF
+- 4 = Registro en formato WLF
+
+
+
+
+
+## .maxConcurrentProcesses
+
+**.maxConcurrentProcesses** : Integer
+
+El número máximo de procesos web concurrentes que soporta 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
+
+Valores posibles: 500000 - 2147483648
+
+
+
+
+
+## .maxRequestSize
+
+**.maxRequestSize** : Integer
+
+Contiene el tamaño máximo (en bytes) de las peticiones HTTP entrantes (POST) que el servidor web puede procesar. Pasar el valor máximo (2147483647) significa que, en la práctica, no se define ningún límite. Este límite se utiliza para evitar la saturación del servidor web debido a peticiones entrantes demasiado grandes. Si una petición alcanza este límite, el servidor web la rechaza.
+
+Valores posibles: 500000 - 2147483647
+
+
+
+
+
+## .maxSessions
+
+**.maxSessions** : Integer
+
+> Esta propiedad no se devuelve en [modo sesiones escalables](#scalablesession).
+
+Contiene el número máximo de sesiones simultáneas legacy. Cuando alcanza el límite, se cierra la sesión heredada más antigua (y se llama al método base `On Web Legacy Close Session`) si el servidor web necesita crear una nueva. El número de sesiones heredadas simultáneas no puede superar el número total de procesos web (propiedad `maxConcurrentProcesses`, 100 por defecto)
+
+
+
+
+
+## .minTLSVersion
+
+**.minTLSVersion** : Integer
+
+La versión TLS mínima 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:
+
+- 1 = TLSv1_0
+- 2 = TLSv1_1
+- 3 = TLSv1_2 (por defecto)
+- 4 = TLSv1_3
+
+Valores posibles:
+
+
+
+
+
+## .name
+
+**.name** : Text
+
+*Propiedad de sólo lectura*
+
+The name of the web server application.
+
+
+
+
+
+## .openSSLVersion
+
+**.openSSLVersion** : Text
+
+*Propiedad de sólo lectura*
+
+La versión de la librería OpenSSL utilizada.
+
+
+
+
+
+## .perfectForwardSecrecy
+
+**.perfectForwardSecrecy** : Boolean
+
+*Propiedad de sólo lectura*
+
+La disponibilidad de PFS en el servidor.
+
+
+
+
+
+## .rootFolder
+
+**.rootFolder** : Text
+
+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`.
+
+
+
+
+
+## .rules
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 21 | Añadidos |
+
+
+
+**.rules** : Collection
+
+*Propiedad de sólo lectura*
+
+A collection of rule objects currently handled to customize HTTP headers. A rule object contains a "regexPattern" property, as well as an action name with a value. HTTP rules can be defined through a HTTPRules.json file or the *settings* parameter of the [`.start()`](#start) function. For more information, please refer to the [HTTP Rules](../WebServer/http-rules.md) page.
+
+
+
+
+
+## .scalableSession
+
+**.scalableSession** : Boolean
+
+Contiene `True` si se utilizan sesiones escalables en el servidor web, y `False` en caso contrario.
+
+##### Ver también
+
+[.keepSession](#keepsession)
+
+
+
+
+
+## .sessionCookieDomain
+
+**.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.
+
+
+
+
+
+## .sessionCookieName
+
+**.sessionCookieName** : Text
+
+El nombre de la cookie utilizada para almacenar el ID de sesión.
+
+*Propiedad de sólo lectura*
+
+
+
+
+
+## .sessionCookiePath
+
+**.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.
+
+
+
+
+
+## .sessionCookieSameSite
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 | Añadidos |
+
+
+
+**.sessionCookieSameSite** : Text
+
+El valor de la cookie de sesión "SameSite". Valores posibles (utilizando constantes):
+
+| Constante | Valor | Descripción |
+| ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Web SameSite Strict | "Strict" | *Valor por defecto* - Las cookies sólo se envían en un contexto interno (first-party) |
+| Web SameSite Lax | "Lax" | Las cookies también se envían en las sub-solicitudes entre sitios, pero sólo cuando un usuario está navegando hacia el sitio de origen (es decir, cuando sigue un enlace). |
+| Web SameSite None | "None" | Las cookies se envían en todos los contextos, es decir, en las respuestas a las solicitudes de primera parte y de origen cruzado. |
+
+Consulta la descripción de [cookies de sesión SameSite](WebServer/webServerConfig.md#session-cookie-samesite) para obtener información detallada.
+
+
+
+
+
+## .sessionIPAddressValidation
+
+**.sessionIPAddressValidation** : Boolean
+
+> Esta propiedad no se utiliza en [modo sesiones escalables](#scalablesession) (no hay validación de dirección IP).
+
+La 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).
+
+
+
+
+
+## .start()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R3 | Añadidos |
+
+
+
+**.start**() : Object **.start**( *settings* : Object ) : Object
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------ | --------------------------- | ----------------------------------------------- |
+| settings | Object | -> | Parámetros del servidor web a definir al inicio |
+| Resultado | Object | <- | Estado del inicio del servidor web |
+
+
+
+La función `.start()` inicia el servidor web en el que se aplica, utilizando las propiedades definidas en el parámetro opcional del objeto *settings*.
+
+El servidor web se inicia con los parámetros por defecto definidos en el archivo de configuración del proyecto o (base host únicamente) utilizando el comando `WEB SET OPTION`. Sin embargo, utilizando el parámetro *settings*, se pueden definir propiedades personalizadas para la sesión del servidor web.
+
+Todas los parámetros de los [objetos Servidor Web](../commands/web-server.md) pueden personalizarse, excepto las propiedades de sólo lectura ([.isRunning](#isrunning), [.name](#name), [.openSSLVersion](#opensslversion), [.perfectForwardSecrecy](#perfectforwardsecrecy) y [.sessionCookieName](#sessioncookiename)).
+
+Los parámetros de sesión personalizados se reiniciarán cuando se llame la función [`.stop()`](#stop).
+
+#### Objeto devuelto
+
+La función devuelve un objeto que describe el estado de lanzamiento del servidor web. Este objeto puede contener las siguientes propiedades:
+
+| Propiedad | | Tipo | Descripción |
+| --------- | ------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------------------------------------------------- |
+| success | | Boolean | True si el servidor web se ha iniciado correctamente, False en caso contrario |
+| errors | | Collection | Pila de errores 4D (no se devuelve si el servidor web se inició con éxito) |
+| | \[].errCode | Number | Código de error 4D |
+| | \[].message | Text | Descripción del error 4D |
+| | \[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
+
+> Si el servidor web ya fue lanzado, se devuelve un error.
+
+#### Ejemplo
+
+```4d
+ var $settings;$result : Object
+ var $webServer : 4D.WebServer
+
+ $settings:=New object("HTTPPort";8080;"defaultHomepage";"myAdminHomepage.html")
+
+ $webServer:=WEB Server
+ $result:=$webServer.start($settings)
+ If($result.success)
+ //...
+ End if
+```
+
+
+
+
+
+## .stop()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 18 R3 | Añadidos |
+
+
+
+**.stop()**
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ---- | - | ---------------------------- |
+| | | | No requiere ningún parámetro |
+
+
+
+La función `.stop()` detiene el servidor web sobre el que se aplica.
+
+Si el servidor web se ha iniciado, todas las conexiones y procesos web se cierran, una vez que las peticiones actualmente gestionadas han finalizado. Si el servidor web no se ha iniciado, el método no hace nada.
+
+> Esta función reinicia los parámetros web personalizados definidos para la sesión utilizando el parámetro *settings* de la función [`.start()`](#start), si los hay.
+
+#### Ejemplo
+
+Para detener el servidor web de la base:
+
+```4d
+ var $webServer : 4D.WebServer
+
+ $webServer:=WEB Server(Web server database)
+ $webServer.stop()
+```
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebSocketClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebSocketClass.md
new file mode 100644
index 00000000000000..f4215154de6605
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebSocketClass.md
@@ -0,0 +1,258 @@
+---
+id: WebSocketClass
+title: WebSocket
+---
+
+La clase `WebSocket` permite abrir una conexión de cliente WebSocket con un servidor, enviar y recibir datos y cerrar la conexión.
+
+Las conexiones cliente WebSocket son útiles, por ejemplo, para recibir datos financieros en tiempo real o enviar y recibir mensajes de un chat.
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R2 | Añadidos |
+
+
+
+### Ejemplo
+
+En este ejemplo, creamos un cliente WebSocket muy básico.
+
+1. Cree la clase usuario `WSConnectionHandler` que contiene la(s) función(es) de retrollamada utilizada(s) para gestionar las retrollamadas evento WebSocket:
+
+```4d
+// WSConnectionHandler class
+
+Class constructor
+
+Function onMessage($ws : 4D.WebSocket; $event : Object)
+ ALERT($event.data)
+
+Function onTerminate($ws : 4D.WebSocket; $event : Object)
+ ALERT("Connection closed")
+```
+
+2. Conécte al servidor WebSocket desde un formulario 4D instanciando un 4D.WebSocket:
+
+```4d
+Form.webSocket:=4D.WebSocket.new($wssUrl; cs.WSConnectionHandler.new())
+```
+
+3. Para enviar mensajes al servidor WebSocket desde el formulario 4D, puede escribir:
+
+```4d
+Form.webSocket.send("Hello world")
+
+```
+
+### Objeto WebSocket
+
+Los objetos WebSocket ofrecen las siguientes propiedades y funciones:
+
+| |
+| -------------------------------------------------------------------------------------------------------------------------- |
+| [](#datatype) |
+| [](#handler) |
+| [](#id) |
+| [](#send) |
+| [](#status) |
+| [](#terminate) |
+| [](#url) |
+
+## 4D.WebSocket.new()
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------------------------- |
+| 20 R3 | Soporte de la propiedad `headers` en *connectionHandler* |
+
+
+
+**4D.WebSocket.new**( *url* : Text { ; *connectionHandler* : Object } ) : 4D.WebSocket
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ------------------------------------------------- | ---------------------------- | :-------------------------: | ---------------------------------------------- |
+| url | Text | -> | URL a la que conectarse |
+| [connectionHandler](#connectionhandler-parameter) | Object | -> | Objeto que declara las retrollamadas WebSocket |
+| Resultado | 4D.WebSocket | <- | Nuevo [objeto WebSocket](#websocket-object) |
+
+
+
+La función `4D.WebSocket.new()` crea y devuelve un nuevo [objeto `4D.WebSocket`](#websocket-object) conectado al servidor WebSocket en la dirección especificada en *url*. El objeto `4D.WebSocket` ofrece una API para crear y gestionar una conexión WebSocket a un servidor, así como para enviar y recibir datos hacia y desde el servidor.
+
+En *url*, pase la URL a la que responderá el servidor WebSocket. Se pueden utilizar los siguientes patrones de URL:
+
+- `ws://host[:port]path[?query]` para conexiones estándar
+- `wss://host[:port]path[?query]` para conexiones seguras TLS
+
+Si la conexión no es posible, se devuelve un objeto `null` y se genera un error (que puede interceptar utilizando un método instalado con `ON ERR CALL`).
+
+### Parámetro *connectionHandler*
+
+En *connectionHandler*, puede pasar un objeto que contenga funciones de retrollamada a ser llamadas según los eventos de conexión, así como el tipo de datos y encabezados a manejar.
+
+- Las retrollamadas se llaman automáticamente en el contexto del formulario o worker que inicia la conexión.
+- El WebSocket será válido siempre y cuando el formulario o trabajador no esté cerrado.
+
+| Propiedad | Tipo | Descripción |
+| ----------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| onMessage | [Function](FunctionClass.md) | Función de retrollamada para datos WebSocket. Llamada cada vez que el WebSocket ha recibido datos. La retrollamada recibe los siguientes parámetros
:`$1`: objeto WebSocket`$2`
: objeto
`$2.type` (texto): siempre "message"
`$2.data` (texto, blob u objeto, ver `dataType`): datos recibidos
|
+| onError | [Function](FunctionClass.md) | Función de retrollamada para errores de ejecución. The callback receives the following parameters:
`$1`: WebSocket object
`$2`: Object
`$2.type` (text): always "error"
`$2.errors`: collection of 4D errors stack in case of execution error.
`[].errCode` (number): 4D error code
`[].message` (text): Description of the 4D error
`[].componentSignature` (text): Signature of the internal component which returned the error
|
+| onTerminate | [Function](FunctionClass.md) | Función de retrollamada cuando el WebSocket se termina. The callback receives the following parameters:
`$1`: WebSocket object
`$2`: Object
`$2.code` (number, read-only): unsigned short containing the close code sent by the server.
`$2.reason` (text, read-only): Reason why the server closed the connection. Esto es específico al servidor y al subprotocolo particular.
|
+| onOpen | [Function](FunctionClass.md) | Función de retrollamada cuando el webSocket está abierto. La retrollamada recibe los siguientes parámetros
:`$1`: objeto WebSocket
:`$2` objeto
`$2.type` (texto): siempre "open"
|
+| dataType | Text | Tipo de datos recibidos o enviados. Valores disponibles: "text" (por defecto), "blob", "object". "text" = utf-8 |
+| headers | Object | Encabezados del WebSocket.
Syntax for standard key assignment: `headers.*key*:=*value*` (*value* can be a Collection if the same key appears multiple times)
|
+
+Esta es la secuencia de llamadas de retorno:
+
+1. `onOpen` se ejecuta una vez
+2. Cero o varios `onMessage` son ejecutados
+3. Cero o un `onError` es ejecutado (detiene el procesamiento)
+4. `onTerminate` se ejecuta siempre una vez
+
+#### Ejemplo
+
+Quiere definir los encabezados en la clase usuario `WSConnectionHandler`:
+
+```4d
+// Clase WSConnectionHandler
+
+Class constructor($myToken:Text)
+
+// Creación de los encabezados enviados al servidor
+This.headers:=New object("x-authorization";$myToken)
+// Definimos dos cookies
+This.headers.Cookie:="yummy_cookie=choco; tasty_cookie=fresa"
+...
+
+```
+
+
+
+## .dataType
+
+**.dataType** : Text
+
+#### Descripción
+
+La propiedad `.dataType` contiene el tipo de contenido del cuerpo de la respuesta. Puede ser "text", "blob" u "object".
+
+Esta propiedad es de sólo lectura.
+
+
+
+
+
+## .handler
+
+**.handler** : Object
+
+#### Descripción
+
+La propiedad `.handler` contiene el accessor que obtiene el objeto `connectionHandler` utilizado para iniciar la conexión.
+
+Esta propiedad es de sólo lectura.
+
+
+
+
+
+## .id
+
+**.id** : Integer
+
+#### Descripción
+
+La propiedad `.id` contiene el identificador único de la conexión.
+
+Esta propiedad es de sólo lectura.
+
+
+
+
+
+## .send()
+
+**.send**( *message* : Text ) **.send**( *message* : Blob ) **.send**( *message* : Object )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------------------ | :-: | ---------------- |
+| message | Text, Blob, Object | -> | Mensaje a enviar |
+
+
+
+#### Descripción
+
+La función `.send()` envía *message* al servidor WebSocket en el tipo de datos definido (Texto, Blob u Objeto).
+
+Los siguientes contenidos se envían en función del tipo de *message*:
+
+| Tipo | Contenido |
+| ------ | ------------------------------------------------------------------------------------------------------------------------- |
+| Text | Texto en UTF-8 |
+| Blob | Datos binarios |
+| Object | Texto en JSON UTF-8 (mismo resultado que con [`JSON Stringify`](../commands-legacy/json-stringify.md)) |
+
+
+
+
+
+## .status
+
+**.status** : Text
+
+#### Descripción
+
+La propiedad `.status` contiene el estado actual de la conexión (puede ser "Connecting", "Closing", "Closed", o "Connected").
+
+Esta propiedad es de sólo lectura.
+
+
+
+
+
+## .terminate()
+
+**.terminate**( { *code* : Integer { ; *reason* : Text } } )
+
+
+
+| Parámetros | Tipo | | Descripción |
+| ---------- | ------- | :-: | ---------------------------------------------------------- |
+| code | Integer | -> | Código de estado que explica por qué se cierra la conexión |
+| reason | Text | -> | La razón por la que se cierra la conexión |
+
+
+
+#### Descripción
+
+La función `.terminate()` cierra la conexión WebSocket, junto con los parámetros opcionales *code* y *reason*.
+
+En *code*, puede pasar un código de estado que explique por qué se está cerrando la conexión (ver también [WebSocket Connection Close Code in the RFC6455](https://www.rfc-editor.org/rfc/rfc6455.html#section-7.1.5)):
+
+- Si no se especifica, el código de cierre de la conexión se establece automáticamente en 1000 para un cierre normal o, en caso contrario, en otro valor estándar del rango 1001-1015 que indique la razón real por la que se cerró la conexión.
+- Si se especifica, el valor de este parámetro de código anula el ajuste automático. El valor debe ser un número entero. O 1000, o un código personalizado en el rango 3000-4999. Si especifica un valor *code*, también debe especificar un valor *reason*.
+
+En *reason*, puede pasar una cadena que describa por qué se está cerrando la conexión.
+
+
+
+
+
+## .url
+
+**.url** : Text
+
+#### Descripción
+
+La propiedad `.url` contiene la URL a la que se ha conectado el WebSocket. Es la URL que ha pasado a la función [`new()`](#4dwebsocketnew).
+
+Esta propiedad es de sólo lectura.
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebSocketConnectionClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebSocketConnectionClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebSocketConnectionClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/WebSocketConnectionClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebSocketServerClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/WebSocketServerClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/WebSocketServerClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/WebSocketServerClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ZipArchiveClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/ZipArchiveClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ZipArchiveClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/ZipArchiveClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ZipFileClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/ZipFileClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ZipFileClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/ZipFileClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ZipFolderClass.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/ZipFolderClass.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/ZipFolderClass.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/ZipFolderClass.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/API/overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/API/overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/API/overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/cli.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/cli.md
new file mode 100644
index 00000000000000..cdc65c6656666b
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/cli.md
@@ -0,0 +1,265 @@
+---
+id: cli
+title: |-
+ Interfaz de línea de
+ comando
+---
+
+Puede utilizar el Terminal de macOS o la consola de Windows para manejar sus aplicaciones 4D (4D, 4D Server, aplicación fusionada y [tool4d](#tool4d)) utilizando líneas de comando. Más concretamente,
+esta funcionalidad le permite:
+
+- lanzar una base de
+ datos de forma remota, lo que puede ser especialmente útil para administrar los servidores
+ web.
+- ejecutar pruebas
+ automáticas para sus aplicaciones.
+
+## Información básica
+
+Puede ejecutar
+líneas de comando para las aplicaciones 4D utilizando el terminal macOS o la consola
+Windows.
+
+- En macOS, debe utilizar el comando `open`.
+- En Windows, puede
+ pasar los argumentos directamente.
+
+> En macOS, se pueden
+> pasar los argumentos directamente yendo a la carpeta donde se encuentra la aplicación
+> dentro del paquete (Contents/MacOS), lo que permite direccionar el flujo stderr. Por ejemplo, si el paquete 4D se encuentra en la carpeta `MyFolder`, debe escribir la línea de comandos de la siguiente manera: `/MyFolder/4D.app/Contents/MacOS/4D`. Sin embargo, recomendamos que utilice el comando `open` siempre que no necesite acceder al stream stderr.
+
+Lanzar una
+aplicación 4D
+-------------
+
+A continuación se describen las líneas de comando y los
+argumentos soportados para lanzar aplicaciones 4D.
+
+Sintaxis:
+
+```
+ [--version] [--help] [--project] [ [--data ]]
+[--opening-mode interpreted | compiled] [--create-data] [--user-param ] [--headless] [--dataless]
+[--webadmin-settings-file] [--webadmin-access-key] [--webadmin-auto-start] [--webadmin-store-settings]
+[--utility] [--skip-onstartup] [--startup-method ]
+```
+
+| Argumento | Valor | Descripción |
+| :-------------------------- | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `applicationPath` | Ruta de 4D, 4D Server, aplicación fusionada o tool4d | Lanza la aplicación. If not headless: identical to double-clicking the application; when called without structure file argument, the application is executed and the 'select database' dialog box appears. |
+| `--version` | | Muestra la versión de la aplicación y sale |
+| `--help` | | Muestra el mensaje de ayuda y sale. Argumentos
alternativos: -?, -h |
+| `--project` | projectPath
| packagePath | 4dlinkPath | Archivo de proyecto
a abrir con el archivo de datos actual. No aparece ninguna
caja de diálogo. |
+| `--data` | dataPath | Archivo de datos a
abrir con el archivo de proyecto designado. Si no se especifica, se utiliza el último archivo de datos
abierto. |
+| `--opening-mode` | interpreted
| compiled | Base de datos de
peticiones a abrir en modo interpretado o compilado. No se lanza ningún
error si el modo solicitado no está disponible. |
+| `--create-data` | | Crea automáticamente
un nuevo archivo de datos si no se encuentra un archivo de datos válido. No aparece ninguna
caja de diálogo. 4D utiliza el nombre
del archivo pasado en el argumento "--data" si lo hay (genera un error si ya
existe un archivo con el mismo nombre). |
+| `--user-param` | Cadena usuario
personalizada | Una cadena que estará disponible en la aplicación a través del comando [`Get database parameter`](../commands-legacy/get-database-parameter.md) (la cadena no debe comenzar por un carácter "-", que está reservado). |
+| `--headless` | | Lanza 4D, 4D Server o la aplicación fusionada sin interfaz (modo headless). En este modo:
El modo Diseño no está disponible, la base de datos se inicia en modo Aplicación
No se muestra la barra de herramientas, la barra de menú, la ventana MDI ni la pantalla de presentación
No se muestra ningún icono en el dock o la barra de tareas
La base de datos abierta no se registra en el menú "Bases de datos recientes"
Se inicia automáticamente el registro de diagnóstico (ver [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md), selector 79)
Se intercepta cada llamada a una caja de diálogo y se suministra una respuesta automática (por ejemplo, OK para el comando [ALERT](../commands-legacy/alert.md), Abort para un diálogo de error...). All intercepted commands(\*) are logged in the diagnostic log.
For maintenance needs, you can send any text to standard output streams using the [LOG EVENT](../commands-legacy/log-event.md) command. Tenga en cuenta que las aplicaciones 4D sin interfaz sólo pueden cerrarse mediante una llamada a [QUIT 4D](../commands-legacy/quit-4d.md) o utilizando el administrador de tareas del sistema operativo. |
+| `--dataless` | | Lanza 4D, 4D Server, la aplicación fusionada o tool4d en modo sin datos. El modo sin datos es útil cuando 4D ejecuta tareas sin necesidad de datos (compilación de proyectos, por ejemplo). In this mode:
No file containing data is opened, even if specified in the command line or the `.4DLink` file, or when using the `CREATE DATA FILE` and `OPEN DATA FILE` commands.
Los comandos que manipulan datos arrojarán un error. For example, `CREATE RECORD` throws “no table to apply the command to”.
**Nota**:
si se pasa en la línea de comando, el modo dataless se aplica a todas las bases de datos abiertas en 4D, mientras no se cierre la aplicación.
If passed using the `.4DLink` file, dataless mode only applies to the database specified in the `.4DLink` file. Para más información sobre los archivos `.4DLink`, ver [Atajos para abrir proyectos](../GettingStarted/creating.md#project-opening-shortcuts).
|
+| `--webadmin-settings-file` | Ruta del archivo | Ruta del archivo `.4DSettings` personalizado para el [servidor web WebAdmin](webAdmin.md). No disponible con [tool4d](#tool4d). |
+| `--webadmin-access-key` | Text | Llave de acceso para el [servidor web WebAdmin](webAdmin.md). No disponible con [tool4d](#tool4d). |
+| `--webadmin-auto-start` | Boolean | Estado del lanzamiento automático del [servidor web WebAdmin](webAdmin.md). No disponible con [tool4d](#tool4d). |
+| `--webadmin-store-settings` | | Almacena la llave de acceso y los parámetros de inicio automático en el archivo de parámetros actualmente utilizado (es decir, el archivo [`WebAdmin.4DSettings`](webAdmin.md#webadmin-settings) por defecto o un archivo personalizado designado con el parámetro `--webadmin-settings-path`). Utilice el argumento `--webadmin-store-settings` para guardar esta configuración si es necesario. No disponible con [tool4d](#tool4d). |
+| `--utility` | | Sólo disponible con 4D Server. Sólo disponible con 4D Server. |
+| `--skip-onstartup` | | Lanza el proyecto sin ejecutar ningún método "automático", incluyendo los métodos base `On Startup` y `On Exit` |
+| `--startup-method` | Nombre del método proyecto (cadena) | Método de proyecto a ejecutar inmediatamente después del método base `On Startup` (si no se omite con `--skip-onstartup`). |
+
+(\*) Algunos diálogos se muestran antes de abrir la base de datos, por lo que es imposible escribir en el [archivo de registro de diagnóstico](Debugging/debugLogFiles.md#4ddiagnosticlogtxt) (alerta de licencia, diálogo de conversión, selección de bases de datos, selección de archivos de datos). En este caso, se
+lanza un mensaje de error tanto en el flujo stderr como en el registro de eventos sistema,
+y luego la aplicación se cierra.
+
+### Ejemplos
+
+> La carpeta actual
+> del usuario se alcanza utilizando el comando "~ " en macOS y el comando
+> "%HOMEPATH%" en Windows.
+
+Lance una aplicación 4D almacenada en el escritorio:
+
+- macOS:
+
+```bash
+open ~/Desktop/4D.app
+ open "~/Desktop/4D Server.app"
+```
+
+- Windows:
+
+```bash
+%HOMEPATH%\Desktop\4D\4D.exe
+ %HOMEPATH%\Desktop\"4D Server.exe"
+```
+
+Abra un paquete en macOS:
+
+```bash
+--args ~/Documents/myDB.4dbase
+```
+
+Abra un archivo de proyecto:
+
+- macOS:
+
+```bash
+--args ~/Documents/myProj/Project/myProj.4DProject
+```
+
+- Windows:
+
+```bash
+%HOMEPATH%\Documents\myProj\Project\myProj.4DProject
+```
+
+Abra un archivo de proyecto y un archivo de datos:
+
+- macOS:
+
+```bash
+--args --project ~/Documents/myProj/Project/myProj.4DProject
+ --data ~/Documents/data/myData.4DD
+```
+
+- Windows:
+
+```bash
+--project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject
+ --data %HOMEPATH%\Documents\data\myData.4DD
+ o:
+ /project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject /data
+ %HOMEPATH%\Documents\data\myData.4DD
+```
+
+Abra un archivo .4DLink:
+
+- macOS:
+
+```bash
+~/Desktop/MyDatabase.4DLink
+```
+
+- Windows:
+
+```bash
+%HOMEPATH%\Desktop\MyDatabase.4DLink
+```
+
+Lance la aplicación en modo compilado y cree un archivo de datos
+si no está disponible:
+
+- macOS:
+
+```bash
+~/Documents/myBase.4dbase --args --opening-mode compiled
+ --create-data true
+```
+
+- Windows:
+
+```bash
+%HOMEPATH%\Documents\myBase.4dbase\myDB.4db --opening-mode
+ compiled --create-data true
+```
+
+Lance la aplicación con un archivo proyecto y un archivo de datos
+y pase una cadena como parámetro de usuario:
+
+- macOS:
+
+```bash
+--args --project ~/Documents/myProj/Project/myProj.4DProject
+ --data ~/Documents/data/myData.4DD --user-param "Hello world"
+```
+
+- Windows:
+
+```bash
+--project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject
+ --data %HOMEPATH%\Documents\data\myData.4DD --user-param "Hello world"
+```
+
+Apertura sin interfaz (modo headless):
+
+- macOS:
+
+```bash
+--args --project ~/Documents/myProj/Project/myProj.4DProject --data ~/Documents/data/myData.4DD --headless
+```
+
+- Windows:
+
+```bash
+--project %HOMEPATH%\Documents\myProj\Project\myProj.4DProject
+ --data %HOMEPATH%\Documents\data\myData.4DD --headless
+```
+
+## tool4d
+
+**tool4d** es una aplicación gratuita, ligera y autónoma que le permite abrir un proyecto 4D en modo sin interfaz y ejecutar código 4D utilizando la lìnea de comando (CLI).
+
+tool4d está disponible en Windows y macOS y siempre está asociado
+a una versión 4D (misma versión y número de compilación). Sólo está disponible en inglés.
+
+tool4d es una herramienta perfecta si desea:
+
+- implementar una cadena CI/CD para su aplicación 4D,
+- utilizar un ejecutable 4D ligero para ejecutar scripts 4D, por
+ ejemplo para ejecutar pruebas unitarias automáticas.
+
+### Uso de tool4d
+
+Puedes obtener tool4d de la [Página de descarga de productos](https://product-download.4d.com/).
+
+Se utiliza tool4d ejecutando una [línea de comandos](#launch-a-4d-application) con un proyecto 4D estándar. Puede utilizar todos los argumentos descritos en la tabla anterior, excepto --`webadmin` ya que este componente está [desactivado en tool4d](#disabled-4d-features). Con tool4d, se lanza la siguiente secuencia específica:
+
+1. La herramienta 4D ejecuta el método base `On Startup` (y todos los métodos "automáticos" como el [método usuario](../Users/handling_users_groups.md#propiedades-del-usuario)), excepto si se pasa el argumento `--skip-onstartup`.
+2. tool4d ejecuta el método designado por el argumento `--startup-method`, si existe.
+3. tool4d ejecuta el método base `On Exit`, excepto si se pasa el argumento `--skip-onstartup`.
+4. tool4d cierra.
+
+En Windows, tool4d es una aplicación de consola, de modo que el stream `stdout` se muestra en el terminal (cmd, powershell...).
+
+:::note Notas
+
+- tool4d siempre se ejecuta sin interfaz (la opción de línea de comandos `headless` es inútil).
+- El comando [`Application type`](../commands-legacy/application-type.md) devuelve el valor 6 ("tool4d") cuando se llama desde la aplicación tool4d.
+- el [archivo de registro de diagnóstico](../Debugging/debugLogFiles.md#4ddiagnosticlogtxt) tiene el prefijo "4DDiagnosticLogTool".
+
+:::
+
+### Funcionalidades 4D desactivadas
+
+Tenga en cuenta que tool4d se ejecuta automáticamente en **modo sin interfaz** (ver `--headless` en [esta tabla](#launch-a-4d-application)), y no da acceso al IDE 4D ni a ninguno de sus servidores. En concreto, se desactivan las siguientes funcionalidades:
+
+- servidor de aplicaciones, servidor web, servidor SQL,
+- programador de copias de seguridad,
+- ODBC y SQL pass-through,
+- todos los componentes como 4D View Pro, 4D SVG, 4D NetKit...,
+- corrector ortográfico hunspell,
+- corrector ortográfico japonés (librería *mecab*),
+- WebAdmin
+- CEF,
+- PHP,
+- depurador remoto (depurador local, el comando `TRACE` y los puntos de interrupción se ignoran en las aplicaciones sin interfaz).
+
+## 4D Server en modo utilitario
+
+Puede lanzar una instancia 4D Server en modo utilitario (sin interfaz) utilizando la opción CLI `--utility`. En este caso, se activa el siguiente flujo de trabajo:
+
+1. 4D Server ejecuta el método base `On Startup` (y todos los métodos "automáticos" como el [método usuario](../Users/handling_users_groups.md#user-properties)), excepto si se pasa el parámetro `--skip-onstartup`.
+2. 4D Server ejecuta el método designado por el `--startup-method`, si existe.
+3. El servidor 4D ejecuta el método base `On Exit`, excepto si se pasa el parámetro `--skip-onstartup`.
+4. 4D Server se cierra.
+
+:::info
+
+A diferencia de tool4d, 4D Server en modo utilitario tiene todas
+sus funcionalidades activadas. Sin embargo, el servidor de aplicaciones y el resto de servidores
+no se inician.
+
+:::
+
+:::tip Ver también
+
+Ver [esta publicación de blog](https://blog.4d.com/a-tool-for-4d-code-execution-in-cli/) para ejemplos de cómo utilizar tool4d y 4D Server en modo utilitario.
+
+:::
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/data-collect.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/data-collect.md
new file mode 100644
index 00000000000000..949c3e42802b80
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/data-collect.md
@@ -0,0 +1,120 @@
+---
+id: data-collect
+title: Recopilación de datos
+---
+
+Para que nuestros productos sean siempre mejores, recogemos automáticamente los datos relativos a las estadísticas de uso de las aplicaciones 4D Server en funcionamiento. Los datos recogidos son completamente anónimos y se transfieren sin afectar la experiencia del usuario.
+
+Esta página explica:
+
+- qué información se recoge,
+- dónde se almacena la información y cuándo se envía a 4D,
+- cómo desactivar la recopilación automática de datos en las aplicaciones integradas cliente/servidor.
+
+## Información recopilada
+
+Los datos se recogen durante los siguientes eventos:
+
+- inicio de la base de datos,
+- cierre de base de datos,
+- inicio del servidor web,
+- uso de funciones específicas como php, open datastore, depurador remoto,
+- conexión con el cliente,
+- envío de recolección de datos.
+
+También se recogen algunos datos a intervalos regulares.
+
+| Datos | Tipo | Notas |
+| ----------------------------------------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
+| buildNumber | Number | Número de build de la aplicación 4D |
+| cacheMissBytes | Object | Número de bytes perdidos de la caché |
+| cacheMissCount | Object | Número de lecturas perdidas en la caché |
+| cacheReadBytes | Object | Número de bytes leídos de la caché |
+| cacheReadCount | Object | Número de lecturas en la caché |
+| cacheSize | Number | Tamaño de caché en bytes |
+| compiled | Boolean | True si la aplicación está compilada |
+| connectionSystems | Collection | Sistema operativo del cliente sin el número de compilación (entre paréntesis) y número de clientes que lo utilizan |
+| CPU | Text | Nombre, tipo y velocidad del procesador |
+| dataFileSize | Number | Tamaño del archivo de datos en bytes |
+| dataSegment1.diskReadBytes | Object | Número de bytes leídos en el archivo de datos |
+| dataSegment1.diskReadCount | Object | Número de lecturas en el archivo de datos |
+| dataSegment1.diskWriteBytes | Object | Número de bytes escritos en el archivo de datos |
+| dataSegment1.diskWriteCount | Object | Número de escrituras en el archivo de datos |
+| databases.externalDatastoreOpened | Number | Número de llamadas a `Open datastore` |
+| databases.internalDatastoreOpened | Number | Número de veces que un servidor externo abre el almacén de datos |
+| databases.remoteDebugger4DRemoteAttachments | Number | Número de adjuntos al depurador remoto desde un 4D remoto |
+| databases.remoteDebuggerQodlyAttachments | Number | Número de archivos adjuntos al depurador remoto de Qodly |
+| databases.remoteDebuggerVSCodeAttachments | Number | Número de archivos adjuntos al depurador remoto desde VS Code |
+| databases.restMaxLicensedSessions | Number | Número máximo de sesiones web REST en el servidor que utilizan la licencia REST |
+| databases.restMaxUnlicensedSessions | Number | Número máximo de otras sesiones web REST en el servidor |
+| databases.webIPAddressesNumber | Number | Número de direcciones IP diferentes que hicieron una petición a 4D Server |
+| databases.webMaxLicensedSessions | Number | Número máximo de sesiones web no REST en el servidor que utilizan la licencia del servidor web |
+| databases.webMaxUnlicensedSessions | Number | Número máximo de otras sesiones web no REST en el servidor |
+| databases.webScalableSessions | Boolean | True si las sesiones escalables están activadas |
+| encrypted | Boolean | True si el archivo de datos está encriptado |
+| encryptedConnections | Boolean | True si las conexiones cliente/servidor están encriptadas |
+| externalPHP | Boolean | True si el cliente realiza una llamada a `PHP execute` y utiliza su propia versión de php |
+| hasDataChangeTracking | Boolean | True si existe una tabla "__DeletedRecords |
+| headless | Boolean | True si la aplicación se ejecuta en modo sin interfaz |
+| id | Texto (cadena con hash) | Identificador único asociado a la base de datos (*Polinomio Rolling hash del nombre de la base*) |
+| indexSegment.diskReadBytes | Number | Número de bytes leídos en el archivo índice |
+| indexSegment.diskReadCount | Number | Número de lecturas en el archivo índice |
+| indexSegment.diskWriteBytes | Number | Número de bytes escritos en el archivo índice |
+| indexSegment.diskWriteCount | Number | Número de escrituras en el archivo índice |
+| indexesSize | Number | Tamaño del índice en bytes |
+| isEngined | Boolean | True si la aplicación se fusiona con 4D Volume Desktop |
+| isRosetta | Boolean | True si 4D es emulado a través de Rosetta en macOS, False en caso contrario (no emulado o en Windows). |
+| LDAPLogin | Number | Número de llamadas a `LDAP LOGIN` |
+| license | Object | Nombre comercial y descripción de las licencias de los productos |
+| maximum4DClientConnections | Number | Número máximo de conexiones 4D Client al servidor |
+| maximumNumberOfWebProcesses | Number | Número máximo de procesos web simultáneos |
+| maximumUsedPhysicalMemory | Number | Uso máximo de la memoria física |
+| maximumUsedVirtualMemory | Number | Uso máximo de la memoria virtual |
+| memory | Number | Volumen de almacenamiento de memoria (en bytes) disponible en la máquina |
+| mobile | Collection | Información sobre sesiones móviles |
+| numberOfCores | Number | Número total de núcleos |
+| numberOfFields | Number | Número de campos |
+| numberOfKeepRecordSyncInfo | Number | Número de tablas con la opción "Activar la replicación" marcada |
+| numberOfRecordsMax | Number | Número total de registros |
+| numberOfTables | Number | Número de tablas |
+| numberOfWebServices | Number | Número de métodos publicados como servicios web |
+| ODBCLogin | Number | Número de llamadas a `SQL LOGIN` utilizando ODBC |
+| phpCall | Number | Número de llamadas a `PHP execute` |
+| projectMode | Boolean | True si la aplicación es un proyecto |
+| qodly.webforms | Number | Número de formularios web Qodly |
+| QueryBySQL | Number | Número de llamadas a `QUERY BY SQL` |
+| restHits | Number | Número de accesos al servidor REST durante la recolección de datos |
+| SQLBeginEndStatement | Number | Número de usos de "Begin SQL" / "End SQL" |
+| SQLLoginInternal | Number | Número de llamadas a `SQL LOGIN` utilizando SQL_INTERNAL |
+| SQL Server | Number | Número de peticiones SQL a través de la red |
+| system | Text | Versión del sistema operativo y número de build |
+| uniqueID | Text | ID único de 4D Server |
+| uptime | Number | Tiempo transcurrido (en segundos) desde que se abrió la base 4D local |
+| usingLegacyNetworkLayer | Boolean | True si se utiliza la capa de red heredada para el servidor de aplicaciones |
+| usingQUICNetworkLayer | Boolean | True si la base utiliza la capa de red QUIC |
+| version | Number | Número de versión de la aplicación 4D |
+| webServer | Object | "started":true si el servidor web está arrancando o iniciado |
+| webserverBytesIn | Number | Bytes recibidos por el servidor web durante la recolección de datos |
+| webserverBytesOut | Number | Bytes enviados por el servidor web durante la recolección de datos |
+| webserverHits | Number | Número de visitas al servidor web durante la recolección de datos |
+
+## ¿Dónde se almacena y envía?
+
+Los datos recolectados se escriben en un archivo de texto (formato JSON) por base de datos cuando 4D Server cierra. El archivo se guarda dentro de la [carpeta activa de 4D](../commands-legacy/get-4d-folder.md), es decir:
+
+- en Windows: `Users\[userName]\AppData\Roaming\4D Server`
+- en macOS: `/Users/[userName]/Library/ApplicationSupport/4D Server`
+
+Una vez a la semana, el archivo se envía automáticamente por la red a 4D. A continuación, el archivo se elimina de la carpeta activa de 4D.
+
+
+
+> Si el archivo no ha podido ser enviado por alguna razón, no obstante se elimina y no se muestra ningún mensaje de error del lado de 4D Server.
+
+El archivo se envía a la siguiente dirección del servidor: `https://dcollector.4d.com` (ip: 195.68.52.83).
+
+## Desactivar la recopilación de datos en las aplicaciones cliente/servidor integradas
+
+Puede desactivar la recolección automática de datos en [aplicaciones integradas cliente/servidor](../Desktop/building.md#clientserver-page).
+
+Para desactivar la colección, pase el valor **False** a la llave [`ServerDataCollection`](https://doc.4d.com/4Dv20/4D/20/ServerDataCollection.300-6335775.en.html) en el archivo `buildApp.4DSettings`, utilizado para crear la aplicación cliente/servidor.
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/dataExplorer.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/dataExplorer.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/dataExplorer.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Admin/dataExplorer.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/licenses.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/licenses.md
new file mode 100644
index 00000000000000..3f0cb32f0e1398
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/licenses.md
@@ -0,0 +1,174 @@
+---
+id: licenses
+title: Licencias
+---
+
+## Visión general de las licencias 4D
+
+Para utilizar los productos y funcionalidades 4D, necesita instalar las licencias apropiadas en su ordenador. 4D ofrece dos categorías de licencias:
+
+- **Licencias de desarrollo**, necesarias para trabajar con 4D y 4D Server IDE.
+- **Licencias de despliegue**, necesarias para desplegar sus aplicaciones personalizadas creadas con 4D.
+
+### Licencias de desarrollo
+
+Las licencias de desarrollo son necesarias para acceder al entorno Diseño 4D y a las funcionalidades. Por ejemplo, *4D Developer Pro* es una licencia de desarrollo monopuesto. Las licencias de desarrollo registradas se instalan automáticamente [al iniciar sesión](GettingStarted/Installation.md) en el Asistente de bienvenida, o puede añadirlas utilizando el diálogo [Activación instantánea](#instant-activation).
+
+### Licencias de despliegue
+
+Las licencias de despliegue pueden ser anidadas en el paso de creación por el desarrollador o introducido en el primer lanzamiento por el usuario final, como se describe en la siguiente tabla:
+
+| Licencia de despliegue | Descripción | Dónde introducirla |
+| ------------------------ | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| *4D OEM Desktop* | Licencia personalizada incorporada, contacte al equipo de ventas 4D para obtener información | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
+| *4D Unlimited Desktop* | **Descontinuada** - Licencia personalizada integrada | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
+| *4D Desktop* | Licencia por usuario, que permite utilizar aplicaciones 4D independientes | Diálogo [Primera activación](#first-activation) en la máquina usuario |
+| *4D Desktop Business* | Licencia personalizada integrada para aplicaciones 4D independientes | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
+| *4D Server OEM* | Licencia personalizada incorporada, contacte al equipo de ventas 4D para obtener información | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
+| *4D XML Keys Activation* | Utilizado para activar las licencias OEM del servidor 4D en modo de embebido no automático | Página [Licencias](../Desktop/building.md#licenses) del diálogo Crear aplicación |
+| *4D Server* | Licencia por usuario, que les permite utilizar 4D Server y clientes | Diálogo [Primera activación](#first-activation) en la máquina usuario |
+
+### Vencimiento
+
+Algunas licencias 4D tienen una fecha de caducidad, después de la cual deben ser renovadas. Cuando la suscripción a la licencia se renueva en 4D Store, sus licencias se actualizan automáticamente en sus aplicaciones 4D al iniciar el proceso [cuando se conecta](GettingStarted/Installation.md) en el Asistente de bienvenida.
+
+En algunos casos, la actualización de la licencia puede necesitar que haga clic en el botón [**Actualizar**](#refresh) de la caja de diálogo del Gestor de licencias.
+
+## Activación de licencias
+
+Una vez instalados en su disco, debe activar sus productos 4D para poder utilizarlos. Normalmente, **la activación es automática** si [inicia sesión con su cuenta 4D](GettingStarted/Installation.md) en el asistente de bienvenida.
+
+Sin embargo, en algunos casos específicos podría ser necesario activar las licencias manualmente, por ejemplo si:
+
+- su configuración no permite la activación automática,
+- ha comprado licencias de desarrollo adicionales.
+
+No es necesaria la activación para los siguientes usos:
+
+- 4D utilizado en modo remoto (conexión a un 4D Server)
+- 4D utilizado en modo local con un proyecto aplicación interpretado sin acceso al entorno Diseño.
+
+### Primera activación
+
+Con 4D, seleccione el comando **Gestión de licencias...** del menú **Ayuda** de la aplicación. Con 4D Server, basta con lanzar la aplicación 4D Server. Aparece el diálogo para seleccionar el modo de activación.
+
+
+
+4D ofrece tres modos de activación. Recomendamos **Activación inmediata**.
+
+### Activación inmediata
+
+Introduzca su identificación de usuario (correo electrónico o cuenta 4D) así como su contraseña. Si no tiene una cuenta de usuario, deberá crearla en la siguiente dirección:
+
+[https://account.4d.com/us/login.shtml](https://account.4d.com/us/login.shtml)
+
+
+
+A continuación, introduzca el número de licencia del producto que desea activar. Este número se facilita por correo electrónico o por correo tras la compra de un producto.
+
+
+
+### Activación diferida
+
+Si no puede utilizar la [activación inmediata](#instant-activation) porque su ordenador no tiene acceso a Internet, proceda a la activación diferida siguiendo los siguientes pasos.
+
+1. En la ventana del Administrador de licencias, seleccione la pestaña **Activación diferida**.
+2. Ingrese el número de licencia y su dirección de correo electrónico, luego haga clic en **Generar archivo** para crear el archivo de ID (*reg.txt*).
+
+
+
+3. Guarde el archivo *reg.txt* en una unidad USB y llévelo a un ordenador que tenga acceso a Internet.
+4. En la máquina con acceso a Internet, inicie sesión en [https://activation.4d.com](https://activation.4d.com).
+5. En la página Web, haz clic en el botón **Elegir archivo...** y seleccione el archivo *reg.txt* de los pasos 3 y 4; luego haga clic en el botón **Activate**.
+6. Descargue los archivos seriales.
+
+
+
+7. Guarde el(los) archivo(s) *license4d* en un medio compartido y transfiéralo(s) de nuevo a la máquina 4D del paso 1.
+8. Ahora, de vuelta en la máquina con 4D, aún en la página de **Activación Diferida**, haga clic en **Siguiente**; luego clic en el botón **Cargar...** y seleccione un archivo *license4d* de los medios compartidos del paso 7.
+
+
+
+Con el archivo de licencia cargado, haga clic en **Siguiente**.
+
+
+
+9. Haga clic en el botón **Añadir N°** para añadir otra licencia. Repita estos pasos hasta que se hayan integrado todas las licencias del paso 6.
+
+Su aplicación 4D está ahora activada.
+
+### Activación de emergencia
+
+Este modo puede utilizarse para una activación temporal especial de 4D (5 días como máximo) sin conectarse al sitio web de 4D. Esta activación sólo puede utilizarse una vez.
+
+## Refresh
+
+Las licencias generalmente se actualizan automáticamente al inicio de su aplicación 4D.
+
+Puede utilizar el botón **Refrescar** en los siguientes contextos:
+
+- Cuando haya comprado una expansión adicional y quiera activarla,
+- Cuando necesite actualizar un número de licencia caducado (Partners o evoluciones).
+
+Elija el comando **Administrador de licencias...** del menú **Ayuda** de la aplicación 4D o 4D Server, y luego haga clic en el botón **Refrescar**:
+
+
+
+Este botón lo conecta con nuestra base clientes y activa automáticamente todas las licencias nueva o actualizadas relacionadas con la licencia actual (la licencia actual se muestra en **negrita** en la lista de "Licencias activas"). Sólo se le pedirá su cuenta de usuario y su contraseña.
+
+- Si ha adquirido expansiones adicionales para un servidor 4D, no es necesario introducir ningún número de licencia, simplemente haga clic en **Refrescar**.
+- En la primera activación de un 4D Server, basta con introducir el número de servidor y todas las expansiones adquiridas se asignan automáticamente.
+
+## 4D Online Store
+
+En 4D Store, puede pedir, actualizar, extender y/o gestionar los productos 4D. Puede llegar a la tienda en la siguiente dirección: [https://store.4d.com/us/](https://store.4d.com/us/) (deberá seleccionar su país).
+
+Haga clic en **Inicio de sesión** para acceder con su cuenta actual o en **Nueva cuenta** para crear una nueva, y luego siga las instrucciones que aparecen en pantalla.
+
+### Gestión de licencias
+
+Después de iniciar sesión, puede hacer clic en **Lista de licencias** en la parte superior derecha de la página:
+
+
+
+Aquí puede gestionar sus licencias asignándolas a proyectos.
+
+Seleccione la licencia adecuada de la lista y, a continuación, haga clic en **Enlazar a un proyecto... >**:
+
+
+
+Puede seleccionar un proyecto existente o crear uno nuevo:
+
+
+
+
+
+Puede utilizar los proyectos para organizar sus licencias según sus necesidades:
+
+
+
+## Solución de problemas
+
+Si el proceso de instalación o activación falla, compruebe la siguiente tabla, en la que se indican las causas más comunes de mal funcionamiento:
+
+| Síntomas | Causas posibles | Solución(es) |
+| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Imposible descargar el producto desde el sitio web de 4D | Sitio de Internet no disponible, aplicación antivirus, cortafuegos | 1- Inténtelo de nuevo más tarde O 2- Desactive temporalmente su aplicación antivirus o su cortafuegos. |
+| Imposible instalar el producto en el disco (instalación rechazada). | Derechos de acceso de usuario insuficientes | Abra una sesión con derechos de acceso que le permitan instalar aplicaciones (acceso administrador) |
+| Fallo de activación en línea | Aplicación antivirus, cortafuegos, proxy | 1- Desactivar temporalmente su aplicación antivirus o su cortafuegos O 2- Utilizar la activación diferida (no disponible con las licencias de las versiones "R") |
+
+Si esta información no le ayuda a resolver su problema, contacte 4D o a su distribuidor local.
+
+## Contactos
+
+Para cualquier pregunta sobre la instalación o activación de su producto, póngase en contacto con 4D, Inc. o con su distribuidor local.
+
+Para US:
+
+- Web: [https://us.4d.com/4d-technical-support](https://us.4d.com/4d-technical-support)
+- Tel: 1-408-557-4600
+
+Para UK:
+
+- Web: [https://uk.4d.com/4d-technical-support](https://uk.4d.com/4d-technical-support)
+- Teléfono: 01625 536178
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/tls.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/tls.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/tls.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Admin/tls.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/webAdmin.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Admin/webAdmin.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Admin/webAdmin.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Admin/webAdmin.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/backup.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Backup/backup.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/backup.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Backup/backup.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Backup/log.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Backup/log.md
new file mode 100644
index 00000000000000..39ae2c905a552a
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Backup/log.md
@@ -0,0 +1,89 @@
+---
+id: log
+title: Archivo de historial (.journal)
+---
+
+Una aplicación de uso continuo siempre está registrando cambios, adiciones o supresiones. Realizar copias de seguridad periódicas de los datos es importante, pero no permite (en caso de incidente) restaurar los datos introducidos desde la última copia de seguridad. Para responder a esta necesidad, 4D ofrece ahora una herramienta específica: el archivo de historial. Este archivo permite garantizar la seguridad permanente de los datos.
+
+Además, 4D trabaja continuamente con una caché de datos en la memoria. Esto acelera el funcionamiento de las aplicaciones; de hecho, el acceso a la memoria es más rápido que el acceso al disco duro. Todos los cambios realizados en los datos de la aplicación se almacenan temporalmente en la caché antes de escribirse en el disco duro. Si se produce un incidente en la aplicación antes de que los datos almacenados en la caché puedan escribirse en el disco, deberá incluir el archivo de historial actual para poder recuperar la aplicación por completo.
+
+Por último, 4D dispone de funciones que analizan el contenido del archivo de historial, permitiendo revertir las operaciones realizadas sobre los datos de la aplicación. Estas funciones están disponibles en el CSM: consulte la página [Análisis de actividades](MSC/analysis.md) y la página [Retroceder](MSC/rollback.md).
+
+## Funcionamiento del archivo de historial
+
+El archivo de historial generado por 4D contiene una descripción de todas las operaciones realizadas en los datos de las tablas registradas en el diario, que se registran de forma secuencial. Por defecto, todas las tablas se registran en el diario, es decir, se incluyen en el archivo de historial, pero puede anular la selección de tablas individuales mediante la propiedad **Incluir en el archivo de historial**.
+
+Así, cada operación realizada por un usuario provoca dos acciones simultáneas: la primera en el archivo de datos (la instrucción se ejecuta normalmente) y la segunda en el archivo de historial (se registra la descripción de la operación). El archivo de historial se crea de forma independiente, sin perturbar ni ralentizar el trabajo del usuario. El archivo de historial se crea de forma independiente, sin perturbar ni ralentizar el trabajo del usuario. El archivo de historial registra los siguientes tipos de acciones:
+
+- Apertura y cierre del archivo de datos,
+- Apertura y cierre del proceso (contextos),
+- Adición de registros o BLOBs,
+- Modificación de registros,
+- Eliminación de registros,
+- Creación y cierre de transacciones.
+
+Para más información sobre estas acciones, consulte la página [Análisis de actividades](MSC/analysis.md) del CSM.
+
+4D gestiona el archivo de historial. Tiene en cuenta todas las operaciones que afectan al archivo de datos por igual, independientemente de las manipulaciones realizadas por un usuario, métodos 4D, el motor SQL, los plug-ins, o un navegador web o una aplicación móvil.
+
+La siguiente ilustración resume el funcionamiento del archivo de historial:
+
+
+
+El archivo de historial actual se guarda automáticamente con el archivo de datos actual. Este mecanismo tiene dos ventajas distintas:
+
+- Evitar la saturación del volumen de disco donde se almacena el archivo de historial. Sin una copia de seguridad, el archivo de historial se haría cada vez más grande con el uso, y acabaría utilizando todo el espacio disponible en el disco. Para cada copia de seguridad del archivo de datos, 4D o 4D Server cierra el archivo de historial actual e inmediatamente inicia un nuevo archivo vacío, evitando así el riesgo de saturación. A continuación, el archivo de historial antiguo se archiva y, finalmente, se destruye en función del mecanismo de gestión de los conjuntos de copias de seguridad.
+- Conservar los archivos de historial correspondientes a las copias de seguridad para poder analizar o reparar una aplicación en un momento posterior. La integración de un archivo de historial sólo puede hacerse en la aplicación a la que corresponde. Para poder integrar correctamente un archivo de historial en una copia de seguridad, es importante que las copias de seguridad y los archivos de historial se archiven simultáneamente.
+
+## Crear el archivo de historial
+
+Por defecto, toda aplicación creada con 4D utiliza un archivo de historial (opción definida en la página **General** de las Preferencias). El archivo de historial se llama *data.journal* y se coloca en la carpeta Data.
+
+Puede averiguar si su aplicación utiliza un archivo de historial en cualquier momento: sólo tiene que comprobar si la opción **Utilizar el archivo de historial** está seleccionada en la página **Backup/Configuración** de las Propiedades. Si deselecciona esta opción, o si utiliza una aplicación sin archivo de historial y desea configurar una estrategia de copia de seguridad con un archivo de historial, tendrá que crear uno.
+
+Para crear un archivo de historial:
+
+1. En la página **Copia de seguridad/Configuración** de las Propiedades de estructura, marque la opción **Utilizar el archivo de historial**.
+ El programa muestra una caja de diálogo estándar de abrir/nuevo archivo. Por defecto, el archivo de historial se llama *data.journal*.
+
+2. Mantenga el nombre por defecto o cambie el nombre, y luego seleccione la ubicación del archivo.
+ Si tiene al menos dos discos duros, se recomienda colocar el archivo de historial en un disco distinto al que contiene el proyecto de aplicación. Si se pierde el disco duro de la aplicación, aún puede recuperar su archivo de historial.
+
+3. Presione **Guardar**.
+ El disco y el nombre del archivo de historial abierto se muestran ahora en el área **Utilizar historial** de la caja de diálogo. Puede hacer clic en esta área para que aparezca un menú emergente con la ruta del historial en el disco.
+
+4. Valide la caja de diálogo de las Propiedades.
+
+Para poder crear directamente un archivo de historial, los datos deben estar en una de las siguientes situaciones:
+
+- El archivo de datos está en blanco,
+- Acaba de realizar una copia de seguridad y aún no se han realizado cambios en los datos.
+
+Si hace clic en Aceptar, la copia de seguridad comienza inmediatamente, y luego se activa el archivo de historial. Si hace clic en **Aceptar**, la copia de seguridad comienza inmediatamente, y luego se activa el archivo de historial. Si hace clic en **Cancelar**, la solicitud se guarda pero la creación del archivo de historial se pospone y en realidad sólo se creará después de la siguiente copia de seguridad de la aplicación. Esta precaución es indispensable porque, para restaurar una aplicación después de algún incidente, necesitará una copia de la aplicación en la que se integrarán las operaciones registradas en el archivo de historial.
+
+Sin tener que hacer nada más, todas las operaciones realizadas sobre los datos se registran en este archivo y se utilizarán en el futuro cuando se abra la aplicación.
+
+Debe crear otro archivo de historial si crea un nuevo archivo de datos. Debe establecer o crear otro archivo de historial si abre otro archivo de datos que no está asociado a un archivo de historial (o si falta el archivo de historial).
+
+## Parámetros del archivo de historial
+
+Los [parámetros del archivo de historial](settings.md#log-management) se basa en dos datos: un valor booleano y una ruta.
+
+1. **Valor booleano**: indica si la funcionalidad "Utilizar archivo de registro" está activada o desactivada en la aplicación. Por defecto, el valor booleano se almacena en *catalog.4DCatalog*. Sin embargo, cuando se activan los [parámetros usuario](../settings/overview.md#user-settings), la configuración del archivo *catalog.4DCatalog* se anula, y el valor booleano puede definirse tanto en el archivo *Backup.4DSettings* [junto al archivo de datos](../Project/architecture.md#settings-user-data) como en el archivo *Backup.4DSettings* [en la carpeta del proyecto](../Project/architecture.md#settings-user) (ver también la documentación de la llave de backup xml `JournalFileEnabled` en [doc.4d.com](https://doc.4d.com)).
+
+2. **Ruta**: una cadena que indica dónde se encuentra el archivo de registro. La ruta del archivo de registro siempre se almacena en el archivo de datos vinculados.
+
+## Cerrar el historial
+
+Si desea dejar de registrar las operaciones en el archivo de historial actual, sólo tiene que anular la selección de la opción **Utilizar el archivo de historial** en la página **Copia de seguridad/Configuración** de las Propiedades.
+
+4D muestra entonces un mensaje de alerta para recordarle que esta acción le impide aprovechar la seguridad que ofrece el archivo de historial:
+
+
+
+Si hace clic en el botón **Parar**, el archivo de historial actual se cierra inmediatamente (la caja de dialogo de las Propiedades no necesita ser validada después).
+
+Si desea cerrar el archivo de historial actual porque es demasiado grande, puede considerar la posibilidad de realizar una copia de seguridad del archivo de datos, lo que hará que el archivo de historial se copie también.
+
+> **4D Server:** el comando `New log file` cierra automáticamente el archivo de historial actual e inicia uno nuevo.
+> Si por alguna razón el archivo de historial no está disponible durante una sesión de trabajo, se genera el error 1274 y 4D Server no permite a los usuarios escribir más datos. Cuando el archivo de historial está disponible de nuevo, es necesario hacer una copia de seguridad.
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Backup/overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Backup/overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/restore.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Backup/restore.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/restore.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Backup/restore.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/settings.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Backup/settings.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Backup/settings.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Backup/settings.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/about.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/about.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/about.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/about.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/arrays.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/arrays.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/arrays.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/arrays.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/classes.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/classes.md
new file mode 100644
index 00000000000000..41471d66e3a903
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/classes.md
@@ -0,0 +1,877 @@
+---
+id: classes
+title: Clases
+---
+
+## Generalidades
+
+El lenguaje 4D soporta el concepto de **clases**. En un lenguaje de programación, el uso de una clase permite definir el comportamiento de un objeto con propiedades y funciones asociadas.
+
+Una vez definida una clase usuario, puede instanciar los objetos de esta clase en cualquier parte de su código. Una vez definida una clase usuario, puede instanciar los objetos de esta clase en cualquier parte de su código. Una clase puede [`extend`](#class-extends-classname) otra clase, y luego hereda sus [funciones](#function) y propiedades ([declaradas](#property) y [calculadas](#function-get-and-function-set)).
+
+> El modelo de clases en 4D es similar al de las clases en JavaScript, y se basa en una cadena de prototipos.
+
+Por ejemplo, puede crear una clase `Person` con la siguiente definición:
+
+```4d
+//Class: Person.4dm
+Class constructor($firstname : Text; $lastname : Text)
+ This.firstName:=$firstname
+ This.lastName:=$lastname
+
+Function get fullName() -> $fullName : Text
+ $fullName:=This.firstName+" "+This.lastName
+
+Function sayHello() -> $welcome : Text
+
+ $welcome:="Hello "+This.fullName
+```
+
+En un método, creando una "Persona":
+
+```4d
+var $person : cs.Person //object of Person class
+var $hello : Text
+$person:=cs.Person.new("John";"Doe")
+// $person:{firstName: "John"; lastName: "Doe"; fullName: "John Doe"}
+$hello:=$person.sayHello() //"Hello John Doe"
+```
+
+## Gestión de clases
+
+### Definición de una clase
+
+Una clase usuario en 4D está definida por un archivo [método ](methods.md) específico (.4dm), almacenado en la carpeta `/Project/Sources/Classes/`. El nombre del archivo es el nombre de la clase.
+
+Al nombrar las clases, debe tener en cuenta las siguientes reglas:
+
+- Un [nombre de clase](identifiers.md#classes) debe cumplir con [reglas de denominación de las propiedades](identifiers.md#object-properties).
+- .
+- No se recomienda dar el mismo nombre a una clase y a una tabla de la base, para evitar conflictos.
+
+Por ejemplo, si quiere definir una clase llamada "Polygon", tiene que crear el siguiente archivo:
+
+```
+Project folder Project Sources Classes Polygon.4dm
+```
+
+### Borrar una clase
+
+Para eliminar una clase existente, puede:
+
+- en su disco, elimine el archivo de clase .4dm de la carpeta "Classes",
+- en el Explorador 4D, seleccione la clase y haga clic  o elija **Mover a la Papelera** en el menú contextual.
+
+### Utilizar la interfaz 4D
+
+Los archivos de clase se almacenan automáticamente en la ubicación adecuada cuando se crean a través de la interfaz de 4D, ya sea a través del menú **Archivo** o del Explorador.
+
+#### Menú Archivo y barra de herramientas
+
+Puede crear un nuevo archivo de clase para el proyecto seleccionando **Nueva > Clase...** en el menú **Archivo** de 4D Developer o en la barra de herramientas.
+
+También puede utilizar el atajo **Ctrl+Mayús+Alt+k**.
+
+#### Explorador
+
+En la página **Métodos** del Explorador, las clases se agrupan en la categoría **Clases**.
+
+Para crear una nueva clase, puede:
+
+- seleccione la categoría **Clases** y haga clic en el botón .
+- seleccione **Nueva clase...** en el menú de acciones de la parte inferior de la ventana del Explorador, o en el menú contextual del grupo Clases.
+ 
+- seleccione **Nueva > Clase...** en el menú contextual de la página de inicio del Explorador.
+
+#### Soporte del código de clase
+
+En las diferentes ventanas 4D (editor de código, compilador, depurador, explorador de ejecución), el código de la clase se maneja básicamente como un método proyecto con algunas especificidades:
+
+- En el editor de código:
+ - una clase no puede ser ejecutada
+ - una función de clase es un bloque de código
+ - **Ir a la definición** en un objeto miembro busca las declaraciones de función de clase; por ejemplo, "$o.f()" encontrará "Function f".
+ - **Buscar referencias** en la declaración de función de clase busca la función utilizada como miembro de objeto; por ejemplo, "Function f" encontrará "$o.f()".
+- En el explorador de tiempo de ejecución y en el depurador, las funciones de clase se muestran con el `` constructor o `.` el formato.
+
+## Class stores
+
+Las clases disponibles son accesibles desde sus class stores. Hay dos class stores disponibles:
+
+- [`cs`](../commands/cs.md) para el almacén de clases de usuario
+- [`4D`](../commands/4d.md) para el almacén de clases integrado
+
+### `cs`
+
+**cs** : Object
+
+
+
+| Parámetros | Tipo | | Descripción | |
+| ---------- | ------ | --------------------------- | ------------------------------------------------- | ---------------- |
+| classStore | Object | ← | Class store usuario para el proyecto o componente | |
+
+El comando `cs` devuelve el almacén de clases de usuario para el proyecto o componente actual. Devuelve todas las clases de usuario [definidas](#class-definition) en el proyecto o componente abierto. Por defecto, sólo las [clases ORDA](ORDA/ordaClasses.md) están disponibles.
+
+#### Ejemplo
+
+Quiere crear una nueva instancia de un objeto de `myClass`:
+
+```4d
+$instance:=cs.myClass.new()
+```
+
+### `4D`
+
+**4D** : Object
+
+
+
+| Parámetros | Tipo | | Descripción | |
+| ---------- | ------ | --------------------------- | -------------- | ---------------- |
+| classStore | Object | ← | Class store 4D | |
+
+El comando `4D` devuelve el almacén de clases para las clases 4D integradas. Ofrece acceso a las APIs específicas como [CryptoKey](API/CryptoKeyClass.md).
+
+#### Ejemplos
+
+Quiere crear una nueva llave en la clase `CryptoKey`:
+
+```4d
+$key:=4D.CryptoKey.new(New object("type";"ECDSA";"curve";"prime256v1"))
+```
+
+Quiere listar las clases integradas en 4D:
+
+```4d
+ var $keys : collection
+ $keys:=OB Keys(4D)
+ ALERT("There are "+String($keys.length)+" built-in classes.")
+```
+
+## El objeto clase
+
+Cuando una clase es [definida](#class-definition) en el proyecto, se carga en el entorno del lenguaje 4D. Una clase es un objeto de la [clase "Class"](API/ClassClass.md). Un objeto clase tiene las siguientes propiedades y funciones:
+
+- cadena [`name`](API/ClassClass.md#name)
+- objeto [`superclass`](API/ClassClass.md#superclass) (null si no hay)
+- función [`new()`](API/ClassClass.md#new), que permite instanciar objetos de clase
+- propiedad [`isShared`](API/ClassClass.md#isshared), true si la clase es [compartida](#clases-compartidas)
+- propiedad [`isSingleton`](API/ClassClass.md#issingleton), verdadero si la clase define una [clase singleton](#singleton-classes).
+- propiedad [`isSectionSingleton`](API/ClassClass.md#issectionsingleton), true si la clase define un [sesión singleton](#singleton-classes).
+- Propiedad [`me`](API/ClassClass.md#me), que permite instanciar y acceder a [singletons](#singleton-classes).
+
+Además, un objeto clase puede hacer referencia a un objeto [`constructor`](#class-constructor) (opcional).
+
+Un objeto de clase en sí mismo es un [objeto compartido](shared.md) y, por tanto, se puede acceder a él desde diferentes procesos de 4D simultáneamente.
+
+### Herencia
+
+Si una clase hereda de otra clase (es decir, se utiliza la palabra clave [Class extends](classes.md#class-extends-classname) en su definición), la clase padre es su [`superclass`](API/ClassClass.md#superclass).
+
+Cuando 4D no encuentra una función o una propiedad en una clase, la busca en su [`superclass`](API/ClassClass.md#superclass); si no la encuentra, 4D sigue buscando en la superclase de la superclase, y así sucesivamente hasta que no haya más superclase (todos los objetos heredan de la superclase "Object").
+
+## Palabras clave de clase
+
+En las definiciones de clase se pueden utilizar palabras claves específicas de 4D:
+
+- `Function ` para definir las funciones de clase de los objetos.
+- `Class constructor` para inicializar nuevos objetos de la clase.
+- `property` para definir propiedades estáticas de los objetos con un tipo.
+- `Function get ` y `Function set ` para definir las propiedades calculadas de los objetos.
+- `Class extends ` para definir la herencia.
+- `This` y `Super` son comandos que tienen funcionalidades especiales dentro de clases.
+
+### `Function`
+
+#### Sintaxis
+
+```4d
+{shared} Function ({$parameterName : type; ...}){->$parameterName : type}
+// code
+```
+
+:::note
+
+No hay palabra clave final para el código de una función. El lenguaje 4D detecta automáticamente el final del código de una función por la siguiente palabra clave `Function` o el final del archivo de clase.
+
+:::
+
+Las funciones de clase son propiedades específicas de la clase. Son objetos de la clase [4D.Function](API/FunctionClass.md). En el archivo de definición de clase, las declaraciones de función utilizan la palabra clave `Function` seguida del nombre de la función.
+
+Si las funciones se declaran en una [clase compartida](#shared-class-constructor), puede utilizar la palabra clave `shared` con ellas para que puedan ser llamadas sin la estructura [`Use...End use`](shared.md#useend-use). Para obtener más información, consulte el párrafo [Funciones compartidas](#shared-functions) a continuación.
+
+El nombre de la función debe ser compatible con las [reglas de nomenclatura de objetos](Concepts/identifiers.md#object-properties).
+
+:::note
+
+Dado que las propiedades y las funciones comparten el mismo espacio de nombres, no está permitido utilizar el mismo nombre para una propiedad y una función de la misma clase (en este caso se produce un error).
+
+:::
+
+:::tip
+
+Comenzar el nombre de la función con un caracter guión bajo ("_") excluirá la función de las funcionalidades de autocompletado en el editor de código 4D. Por ejemplo, si declara `Function _myPrivateFunction` en `MyClass`, no se propondrá en el editor de código cuando digite en `"cs.MyClass. "`.
+
+:::
+
+Inmediatamente después del nombre de la función, los [parámetros](#parameters) de la función se pueden declarar con un nombre y un tipo de datos asignados, incluido el parámetro de retorno (opcional). Por ejemplo:
+
+```4d
+Function computeArea($width : Integer; $height : Integer)->$area : Integer
+```
+
+En una función de clase, el comando `This` se utiliza como instancia del objeto. Por ejemplo:
+
+```4d
+Function setFullname($firstname : Text; $lastname : Text)
+ This.firstName:=$firstname
+ This.lastName:=$lastname
+
+Function getFullname()->$fullname : Text
+ $fullname:=This.firstName+" "+Uppercase(This.lastName)
+```
+
+Para una función de clase, el comando `Current method name` devuelve: `.`, por ejemplo "MyClass.myFunction".
+
+En el código de la aplicación, las funciones de clases se llaman como los métodos miembros de las instancias de objetos y pueden recibir [parámetros](#parameters) si los hay. Se soportan las siguientes sintaxis:
+
+- uso del operador `()`. Por ejemplo, `myObject.methodName("hello")`
+- utilización de un método miembro de la clase "4D.Function":
+ - [`apply()`](API/FunctionClass.md#apply)
+ - [`call()`](API/FunctionClass.md#call)
+
+:::warning Aviso de seguridad del hilo
+
+Si una función de clase no es hilo seguro y es llamada por un método con el atributo "Puede ejecutarse en proceso apropiativo":
+
+- el compilador no genera ningún error (lo que es diferente en comparación con los métodos regulares),
+- un error es lanzado por 4D sólo en tiempo de ejecución.
+
+:::
+
+#### Parámetros
+
+Los parámetros de las funciones se declaran utilizando el nombre del parámetro y su tipo, separados por dos puntos. El nombre del parámetro debe cumplir con las [reglas de nomenclatura de las propiedades](Concepts/identifiers.md#object-properties). Múltiples parámetros (y tipos) están separados por punto y coma (;).
+
+```4d
+Function add($x; $y : Variant; $z : Integer; $xy : Object)
+```
+
+:::note
+
+Si no se declaró el tipo, el parámetro se definirá como `Variant`.
+
+:::
+
+#### Valor devuelto
+
+Se declara el parámetro de retorno (opcional) añadiendo una flecha (`->`) y la definición del parámetro de retorno después de la lista de parámetros de entrada, o dos puntos (`:`) y el tipo de parámetro de retorno únicamente. Por ejemplo:
+
+```4d
+Function add($x : Variant; $y : Integer)->$result : Integer
+ $result:=$x+$y
+```
+
+También puedes declarar el parámetro de retorno añadiendo sólo `: type` y utilizar la [`expresión return`](parameters.md#return-expression) (también terminará la ejecución de la función). Por ejemplo:
+
+```4d
+Function add($x : Variant; $y : Integer): Integer
+ // algo de código
+ return $x+$y
+```
+
+#### Ejemplo 1
+
+```4d
+property name : Text
+property height; width : Integer
+
+// Clase: Rectangle
+Class constructor($width : Integer; $height : Integer)
+ This.name:="Rectangle"
+ This.height:=$height
+ This.width:=$width
+
+// Definición de función
+Function getArea()->$result : Integer
+ $result:=(This.height)*(This.width)
+```
+
+```4d
+// En un método proyecto
+
+var $rect : cs.Rectangle
+var $area : Real
+
+$rect:=cs.Rectangle.new(50;100)
+$area:=$rect.getArea() //5000
+```
+
+#### Ejemplo 2
+
+Este ejemplo utiliza la [`expresión return`](parameters.md#return-expression):
+
+```4d
+Function getRectArea($width : Integer; $height : Integer) : Integer
+ If ($width > 0 && $height > 0)
+ return $width * $height
+ Else
+ return 0
+ End if
+```
+
+### `Class constructor`
+
+#### Sintaxis
+
+```4d
+// Class: MyClass
+{shared} {{session} singleton} Class constructor({$parameterName : type; ...})
+// código
+```
+
+:::note
+
+No hay palabra clave final para el código de función class constructor. El lenguaje 4D detecta automáticamente el final del código de una función por la siguiente palabra clave `Function` o el final del archivo de clase.
+
+:::
+
+Una función constructora de clase acepta [parámetros](#parameters) opcionales y puede ser utilizada para crear e inicializar objetos de la clase del usuario.
+
+Cuando llama a la función [`new()`](API/ClassClass.md#new), el constructor de clase es llamado con los parámetros opcionalmente pasados a la función `new()`.
+
+Sólo puede haber una función constructora en una clase (de lo contrario se devuelve un error). El comando [`Super`](../commands/super.md) permite realizar llamadas a [`superclass`](../API/ClassClass#superclass), es decir, a la clase padre de la función.
+
+Puede crear y escribir propiedades de instancia dentro del constructor (ver ejemplo). Alternativamente, si los valores de las propiedades de instancia no dependen de los parámetros pasados al constructor, puede definirlos utilizando la palabra clave [`property`](#property).
+
+Utilizando la palabra clave `shared` se crea una **clase compartida**, utilizada para instanciar únicamente objetos compartidos. Para obtener más información, consulte el párrafo [Clases compartidas](#shared-classes).
+
+Utilizando la palabra clave `singleton` se crea un **singleton**, utilizado para crear una sola instancia de la sesión. Un `session singleton` crea una sola instancia por sesión. Para obtener más información, consulte el párrafo [Clases singleton](#singleton-classes).
+
+:::note
+
+Las [clases de entidad ORDA](../ORDA/ordaClasses.md#entity-class) también pueden beneficiarse de una función `Class constructor`. La implementación es similar a la de las clases normales pero [con algunas diferencias](../ORDA/ordaClasses.md#class-constructor-1).
+
+:::
+
+#### Ejemplo
+
+```4d
+// Class: MyClass
+// Class constructor of MyClass
+Class constructor ($name : Text ; $age : Integer)
+ This.name:=$name
+ This.age:=$age
+```
+
+```4d
+// En un método proyecto
+// Se puede instanciar un objeto
+var $o : cs.MyClass
+$o:=cs.MyClass.new("John";42)
+// $o = {"name":"John";"age":42}
+```
+
+### `propiedad`
+
+#### Sintaxis
+
+`property {; ;...}{ : }`
+
+La palabra clave`property` se puede utilizar para declarar una propiedad dentro de una clase usuario. Una propiedad de clase tiene un nombre y un tipo.
+
+La declaración de propiedades de clase mejora las sugerencias del editor de código, las funciones de tecleo predictivo y la detección de errores.
+
+Las propiedades se declaran para nuevos objetos cuando llama a [`new()`](API/ClassClass.md#new), sin embargo, no se añaden automáticamente a los objetos (sólo se añaden cuando se les asigna un valor).
+
+:::note
+
+Una propiedad se añade automáticamente al objeto cuando se [inicializa en la línea de declaración](#initializing-the-property-in-the-declaration-line).
+
+:::
+
+Los nombres de las propiedades deben cumplir [las normas de denominación de propiedades](Concepts/identifiers.md#object-properties).
+
+:::note
+
+Dado que las propiedades y las funciones comparten el mismo espacio de nombres, no está permitido utilizar el mismo nombre para una propiedad y una función de la misma clase (en este caso se produce un error).
+
+:::
+
+El tipo de propiedad puede ser uno de los siguientes tipos soportados:
+
+| propertyType | Contenido |
+| ---------------------------- | --------------------------------------------------------------------------- |
+| `Text` | Valor texto |
+| `Date` | Valor fecha |
+| `Time` | Valor Hora |
+| `Boolean` | Valor booleano |
+| `Integer` | Valor entero largo |
+| `Real` | Valor real |
+| `Pointer` | Valor puntero |
+| `Picture` | Valor imagen |
+| `Blob` | Valeor Blob escalar |
+| `Collection` | Valor colección |
+| `Variant` | Valor variant |
+| `Object` | Objeto con clase por defecto (4D.object) |
+| `4D.` | Objeto del nombre de la clase 4D |
+| `cs.` | Objeto del nombre de la clase usuario |
+| `cs..` | Objeto del componente `` nombre de la clase |
+
+Si omite el tipo en la línea de declaración, la propiedad se crea como una variante.
+
+:::info
+
+La palabra clave `property` sólo puede utilizarse en métodos clase y fuera de cualquier bloque `Function` o `Class constructor`.
+
+:::
+
+#### Inicialización de la propiedad en la línea de declaración
+
+Al declarar una propiedad, tiene la flexibilidad de especificar su tipo de datos y proporcionar su valor en una sola declaración. La sintaxis soportada es:
+
+`property { : } := `
+
+:::note
+
+Cuando se utiliza esta sintaxis, no se pueden declarar varias propiedades en la línea de declaración.
+
+:::
+
+Puede omitir el tipo en la línea de declaración, en cuyo caso el tipo se deducirá cuando sea posible. Por ejemplo:
+
+```4d
+// Class: MyClass
+
+property name : Text := "Smith"
+property age : Integer := 42
+
+property birthDate := !1988-09-29! //se deduce la fecha
+property fuzzy //variant
+```
+
+Cuando inicializa una propiedad en su línea de declaración, se agrega al objeto de la clase después de su instanciación con la función [`new()`](API/ClassClass.md#new) pero antes de llamar al constructor.
+
+Si una clase [extiende a](#class-extends-classname) otra, las propiedades de la clase padre se instancian antes que las propiedades de la clase hija.
+
+:::note
+
+Si inicializa una propiedad en su línea de declaración con un objeto o una colección en una [clase compartida](#clases-compartidas), el valor se transforma automáticamente en un valor compartido:
+
+```4d
+// en una clase compartida
+property myCollection := ["something"]
+// myCollection será una colección compartida
+// equivalente a:
+myCollection := New shared collection("something")
+```
+
+:::
+
+#### Ejemplo
+
+```4d
+// Clase: MyClass
+
+property name : Text
+property age : Integer
+property color : Text := "Blue"
+```
+
+En un método:
+
+```4d
+var $o : cs.MyClass
+$o:=cs.MyClass.new() //$o:{"color" : "Blue"}
+$o.name:="Juan" //$o:{"color" : "Azul"; "name" : "John"}
+$o.age:="Smith" //error con la sintaxis de verificación
+```
+
+### `Function get` y `Function set`
+
+#### Sintaxis
+
+```4d
+{shared} Function get ()->$result : type
+// código
+```
+
+```4d
+{shared} Function set ($parameterName : type)
+// código
+```
+
+`Function get` y `Function set` son accesos que definen las **propiedades calculadas** en la clase. Una propiedad calculada es una propiedad nombradas con un tipo de datos que enmascara un cálculo. Cuando se accede a un valor de propiedad calculado, 4D sustituye el código del accesor correspondiente:
+
+- cuando se lee la propiedad, `Function get` se ejecuta,
+- cuando se escribe la propiedad, `Function get` se ejecuta.
+
+Si no se accede a la propiedad, el código nunca se ejecuta.
+
+:::note
+
+Las [clases de entidad ORDA](../ORDA/ordaClasses.md#entity-class) se benefician de una implementación extendida de propiedades computadas con [dos funciones adicionales](../ORDA/ordaClasses.md#computed-attributes-1): `query` y `orderBy`.
+
+:::
+
+Las propiedades calculadas están diseñadas para manejar datos que no necesitan ser guardados en memoria. Generalmente se basan en propiedades persistentes. Por ejemplo, si un objeto de clase contiene como propiedad persistente el *precio bruto* y el *tipo de IVA*, El *precio neto* podría ser manejado por una propiedad calculada.
+
+En el archivo de definición de la clase, las declaraciones de propiedades calculadas utilizan las palabras claves `Function get` (*getter*) y `Function set` (*setter*) seguido por el nombre de la propiedad. El nombre debe cumplir con las [reglas de nomenclatura de las propiedades](Concepts/identifiers.md#object-properties).
+
+`Función get` devuelve un valor del tipo de la propiedad y `Function set` toma un parámetro del tipo de la propiedad. Ambos argumentos deben cumplir con los [parámetros de función](#parameters) estándar.
+
+Cuando ambas funciones están definidas, la propiedad calculada es **read-write**. Si solo se define una `Function get`, la propiedad calculada es **de solo lectura**. En este caso, se devuelve un error si el código intenta modificar la propiedad. En este caso, se devuelve un error si el código intenta modificar la propiedad.
+
+Si las funciones se declaran en una [clase compartida](#shared-classes), puede utilizar la palabra clave `shared` con ellas para que puedan ser llamadas sin la estructura [`Use...End use`](shared.md#useend-use). Para obtener más información, consulte el párrafo [Funciones compartidas](#shared-functions) a continuación.
+
+El tipo de la propiedad calculada es definido por la declaración de tipo `$return` del \*getter \*. Puede ser de cualquier [tipo de propiedad válido](dt_object.md).
+
+> Asignar *undefined* a una propiedad de objeto limpia su valor mientras se preserva su tipo. Para ello, la `Function get` es llamada primero para recuperar el tipo de valor, luego `Function set` es llamado con un valor vacío de ese tipo.
+
+:::note
+
+Las clases de entidad ORDA también pueden beneficiarse de una función `Class constructor`. La implementación es similar a la de las clases normales pero [con algunas diferencias](../ORDA/ordaClasses.md#class-constructor-1).
+
+:::
+
+#### Ejemplo 1
+
+```4d
+//Clase: Person.4dm
+property firstName; lastName : Text
+
+Class constructor($firstname : Text; $lastname : Text)
+ This.firstName:=$firstname
+ This.lastName:=$lastname
+
+Function get fullName() -> $fullName : Text
+ $fullName:=This.firstName+" "+This.lastName
+
+Function set fullName( $fullName : Text )
+ $p:=Position(" "; $fullName)
+ This.firstName:=Substring($fullName; 1; $p-1)
+ This.lastName:=Substring($fullName; $p+1)
+```
+
+```4d
+//en un método proyecto
+$fullName:=$person.fullName // Function get fullName() is called
+$person.fullName:="John Smith" // Function set fullName() is called
+```
+
+#### Ejemplo 2
+
+```4d
+Function get fullAddress()->$result : Object
+
+ $result:=New object
+
+ $result.fullName:=This.fullName
+ $result.address:=This.address
+ $result.zipCode:=This.zipCode
+ $result.city:=This.city
+ $result.state:=This.state
+ $result.country:=This.country
+```
+
+### `Class extends `
+
+#### Sintaxis
+
+```4d
+// Class hijo
+Class extends
+```
+
+La palabra clave `Class extends` se utiliza en la declaración de clase para crear una clase usuario que es hijo de otra clase usuario. La clase hijo hereda todas las funciones de la clase padre.
+
+La extensión de clase debe respetar las siguientes reglas:
+
+- Una clase de usuario no puede extender una clase integrada (excepto las 4D.Object y [clases ORDA](../ORDA/ordaClasses.md) que se extienden por defecto para las clases de usuario).
+- Una clase usuario no puede extender una clase usuario de otro proyecto o componente.
+- Una clase usuario no puede extenderse a sí misma.
+- No es posible extender las clases de una manera circular (es decir, "a" extiende "b" que extiende "a").
+- No es posible definir una [clase usuario compartida](#shared-classes) extendida a partir de una clase usuario no compartida.
+
+La ruptura de tal regla no es detectada por el editor de código o el intérprete, solo el compilador y `comprobar sintaxis` arrojará un error en este caso.
+
+Una clase extendida puede llamar al constructor de su clase padre utilizando el comando [`Super`](#super).
+
+#### Ejemplo
+
+Este ejemplo crea una clase llamada `Square` de una clase llamada `Polygon`.
+
+```4d
+//Clase: Square
+
+//ruta: Classes/Square.4dm
+
+Class extends Polygon
+
+Class constructor ($side : Integer)
+
+Llama al constructor de la clase padre con las longitudes
+ // suministradas para el ancho y alto del polígono
+ Super($side;$side)
+ // En las clases derivadas, Super debe ser llamado antes de
+ // utilizar 'This'
+ This.name:="Square"
+
+
+
+ Function getArea() -> $area : Integer
+ $area:=This.height*This.width
+```
+
+## Comandos de función clase
+
+Los siguientes comandos tienen características específicas cuando se utilizan dentro de las funciones clase:
+
+### `Super`
+
+El comando [`Super`](../commands/super.md) permite realizar llamadas a [`superclass`](../API/ClassClass#superclass), es decir, a la clase padre de la función. Sólo puede haber una función constructora en una clase (de lo contrario se devuelve un error).
+
+Para más detalles, vea la descripción del comando [`Super`](../commands/super.md).
+
+### `This`
+
+El comando [`This`](../commands/this.md) devuelve una referencia al objeto procesado actualmente. En la mayoría de los casos, el valor de `This` está determinado por cómo se llama una función clase. Normalmente, `This` se refiere al objeto al que la función fue llamada, como si la función estuviera sobre el objeto.
+
+Ejemplo:
+
+```4d
+//Clase: ob
+
+Function f() : Integer
+ return This.a+This.b
+```
+
+A continuación, puede escribir en un método:
+
+```4d
+$o:=cs.ob.new()
+$o.a:=5
+$o.b:=3
+$val:=$o.f() //8
+```
+
+Para más detalles, vea la descripción del comando [`This`](../commands/this.md).
+
+## Comandos de clases
+
+Varios comandos del lenguaje 4D permiten manejar las funcionalidades de las clases.
+
+### `OB Class`
+
+#### `OB Class ( object ) -> Object | Null`
+
+`OB Class` devuelve la clase del objeto pasado como parámetro.
+
+### `OB Instance of`
+
+#### `OB Instance of ( object ; class ) -> Boolean`
+
+`OB Instance of` devuelve `true` si `object` pertenece a la `class` o a una de las clases heredadas y `false` de lo contrario.
+
+## Clases compartidas
+
+Puede crear **clases compartidas**. Una clase compartida es una clase usuario que instancia un [objeto compartido](shared.md) cuando se llama a la función [`new()`](../API/ClassClass.md#new) en la clase. Una clase compartida sólo puede crear objetos compartidos.
+
+Las clases compartidas también admiten **funciones compartidas** que pueden llamarse sin estructuras [`Use...End use`](shared.md#useend-use).
+
+La propiedad [`.isShared`](../API/ClassClass.md#isshared) de los objetos de la Clase permite saber si la clase está compartida.
+
+:::info
+
+- Una clase [que hereda](#class-extends-classname) de una clase no compartida no puede definirse como compartida.
+- Las clases compartidas no están soportadas por las [clases basadas en ORDA](../ORDA/ordaClasses.md).
+
+:::
+
+### Creación de una clase compartida
+
+Para crear una clase compartida, añada la palabra clave `shared` antes del [Class constructor](#class-constructor). Por ejemplo:
+
+```4d
+ //shared class: Person
+shared Class constructor($firstname : Text; $lastname : Text)
+ This.firstName:=$firstname
+ This.lastName:=$lastname
+
+```
+
+```4d
+//myMethod
+var $person := cs.Person.new("John"; "Smith")
+OB Is shared($person) // true
+cs.Person.isShared //true
+```
+
+### Funciones compartidas
+
+Si una función definida al interior de una clase compartida modifica objetos de la clase, debería llamar a la estructura [`Use...End use`](shared.md#useend-use) para proteger el acceso a los objetos compartidos. Sin embargo, para simplificar el código, puede definir la función como **compartida**, de modo que active automáticamente un `Use...End use` interno cuando se ejecute.
+
+Para crear una función compartida, añada la palabra clave `shared` antes de la palabra clave [Function](#function) en una clase compartida. Por ejemplo:
+
+```4d
+//clase compartida Foo
+shared Class constructor()
+ This.variable:=1
+
+shared Function Bar($value : Integer)
+ This.variable:=$value //no es necesario llamar use/end use
+```
+
+:::note
+
+Si se utiliza la palabra clave `shared` en una clase usuario no compartida, se ignora.
+
+:::
+
+## Clases Singleton
+
+Una **clase singleton** es una clase usuario que sólo produce una única instancia. Para más información sobre el concepto de singletons, por favor consulte la [página Wikipedia sobre los singletons](https://en.wikipedia.org/wiki/Singleton_pattern).
+
+### Tipos de Singletons
+
+4D soporta tres tipos de singletons:
+
+- un **singleton proceso** tiene una instancia única para el proceso en el que se instancia,
+- un **singleton compartido** tiene una instancia única para todos los procesos en la máquina.
+- un **singleton de sesión** es un singleton compartido pero con una instancia única para todos los procesos en la [sesión](../API/SessionClass.md). Los singletons de sesión son compartidos dentro de una sesión completa, pero varían entre sesiones. En el contexto de un cliente-servidor o una aplicación web, los singletons de sesión hacen posible crear y utilizar una instancia diferente para cada sesión, y por lo tanto para cada usuario.
+
+Los singletons son útiles para definir los valores que necesitan estar disponibles desde cualquier parte de una aplicación, una sesión o un proceso.
+
+:::info
+
+Las clases Singleton no están soportadas por las [clases ORDA](../ORDA/ordaClasses.md).
+
+:::
+
+La siguiente tabla indica el alcance de una instancia singleton dependiendo de donde se creó:
+
+| Singleton creado en | Alcance del proceso singleton | Alcance del singleton compartido | Alcance del singleton de sesión |
+| ------------------- | --------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------ |
+| **4D monopuesto** | Proceso | Aplicación | Aplicación o sesión Web/REST |
+| **4D Server** | Proceso | Máquina 4D Server | Sesión cliente/servidor o sesión Web/REST o sesión de procedimiento almacenado |
+| **Modo remoto 4D** | Proceso (*nota*: los singletons no están sincronizados en el proceso gemelo) | Máquina remota 4D | Máquina remota 4D o sesión Web/REST |
+
+Una vez instanciado, existe una clase singleton (y su singleton) siempre que exista una referencia a ella en algún lugar de la aplicación que se ejecuta en la máquina.
+
+### Crear y utilizar singletons
+
+Se declaran clases singleton añadiendo la(s) palabra(s) clave(s) apropiada(s) antes del [`Class constructor`](#class-constructor):
+
+- Para declarar una clase singleton (proceso), escriba `singleton Class constructor()`.
+- Para declarar una clase singleton compartida, escribe `shared singleton Class constructor()`.
+- Para declarar una clase singleton de sesión, escriba `session singleton Class constructor()`.
+
+:::note
+
+- Los singletons de sesión son automáticamente singletons compartidos (no hay necesidad de usar la palabra clave `shared` en el constructor de clases).
+- Las funciones compartidas Singleton soportan [palabra clave `onHTTPGet`](../ORDA/ordaClasses.md#onhttpget-keyword).
+
+:::
+
+El singleton de la clase se instanciará en la primera llamada del comando [`cs..me`](../API/ClassClass.md#me) property. El singleton instanciado de la clase se devuelve siempre cuando se utiliza la propiedad [`me`](../API/ClassClass.md#me).
+
+Si necesita instanciar un singleton con parámetros, también puede llamar la función [`new()`](../API/ClassClass.md#new). En este caso, se recomienda instanciar el singleton en algún código ejecutado al inicio de la aplicación.
+
+La propiedad [`isSingleton`](../API/ClassClass.md#issingleton) de los objetos Clase permite saber si la clase es un singleton.
+
+La propiedad [`.isSessionSingleton`](../API/ClassClass.md#issessionsingleton) de los objetos Class permite saber si la clase es un singleton de sesión.
+
+### Ejemplos
+
+#### Singleton Proceso
+
+```4d
+ //class: ProcessTag
+singleton Class constructor()
+ This.tag:=Random
+```
+
+Para utilizar el singleton:
+
+```4d
+ //en otro proceso
+var $mySingleton := cs.ProcessTag.me //Primera instanciación
+ //$mySingleton.tag = 5425 por ejemplo
+...
+var $myOtherSingleton := cs.ProcessTag.me
+ //$myOtherSingleton.tag = 5425
+
+```
+
+```4d
+ //en otro proceso
+var $mySingleton := cs.ProcessTag.me //Primera instanciación
+ //$mySingleton.tag = 14856 por ejemplo
+...
+var $myOtherSingleton := cs.ProcessTag.me
+ //$myOtherSingleton.tag = 14856
+```
+
+#### Singleton compartido
+
+```4d
+//Class VehicleFactory
+
+property vehicleBuilt : Integer
+
+shared singleton Class constructor()
+ This.vehicleBuilt := 0 //Número de vehículos construidos por la fábrica
+
+shared Function buildVehicle ($type : Text) -> $vehicle : cs.Vehicle
+
+ Case of
+ : $type="car"
+ $vehicle:=cs.Car.new()
+ : $type="truck"
+ $vehicle:=cs.Truck.new()
+ : $type="sport car"
+ $vehicle:=cs.SportCar.new()
+ : $type="motorbike"
+ $vehicle:=cs.Motorbike.new()
+ Else
+ $vehicle:=cs.Car.new()
+ End case
+ This.vehicleBuilt+=1
+```
+
+Luego puede llamar al singleton **cs.VehicleFactory** para obtener un nuevo vehículo desde cualquier lugar de la aplicación en su máquina con una sola línea:
+
+```4d
+$vehicle:=cs.VehicleFactory.me.buildVehicle("truck")
+```
+
+Dado que la función *buildVehicle()* modifica el singleton **cs.VehicleFactory** (incrementando `This.vehicleBuilt`), debe agregar la palabra clave `shared`.
+
+#### Singleton de sesión
+
+En una aplicación de inventario, desea implementar un inventario de artículos utilizando singletons de sesión.
+
+```4d
+//class ItemInventory
+
+property itemList : Collection:=[]
+
+session singleton Class constructor()
+
+shared function addItem($item:object)
+ This.itemList.push($item)
+```
+
+Al definir la clase ItemInventory como un singleton de sesión, asegúrese de que cada sesión y por lo tanto cada usuario tiene su propio inventario. Acceder al inventario del usuario es tan simple como:
+
+```4d
+//en una sesión usuario
+$myList := cs.ItemInventory.me.itemList
+//lista de elemento del usuario actual
+
+```
+
+#### Ver también
+
+[Singletons en 4D](https://blog.4d.com/singletons-in-4d) (post del blog) [Singletons de sesión](https://blog.4d.com/introducing-session-singletons) (post del blog).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/components.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/components.md
new file mode 100644
index 00000000000000..16edac0f404e2c
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/components.md
@@ -0,0 +1,36 @@
+---
+id: components
+title: Componentes
+---
+
+Un componente 4D es un conjunto de código y de formularios 4D que representan una o varias funcionalidades que pueden instalarse y utilizarse en sus proyectos. Por ejemplo, el [componente 4D SVG](https://github.com/4d/4D-SVG) añade comandos avanzados y un motor de renderizado integrado que puede utilizarse para visualizar archivos SVG.
+
+## Instalación de los componentes
+
+Installation and loading of components in your 4D projects are handled through the [4D Dependency manager](../Project/components.md).
+
+Varios componentes son [desarrollados por 4D](../Extensions/overview.md#components-developed-by-4d), pero muchos componentes 4D de la comunidad 4D [se pueden encontrar en GitHub](https://github.com/search?q=4d-component&type=Repositories). Adicionalmente, puede [desarrollar sus propios componentes 4D](../Extensions/develop-components.md).
+
+## Utilización de los componentes
+
+El código expuesto de los componentes (métodos y funciones) así como los formularios pueden ser utilizados como elementos estándar en su desarrollo 4D.
+
+Cuando un componente instalado contiene métodos, clases y funciones, éstos aparecen en el tema **Métodos componente** de la página Métodos del Explorador:
+
+
+
+:::note
+
+Si el componente está compilado, su [espacio de nombres](../Extensions/develop-components.md#declaring-the-component-namespace) se escribe entre paréntesis después de su nombre. Utilice este espacio de nombres para acceder a las funciones del componente.
+
+:::
+
+Puede seleccionar un [método proyecto](methods.md) o [clase](classes.md) y hacer clic en el botón **Documentación** del Explorador para obtener información sobre el mismo, [si la hay](Project/documentation.md).
+
+
+
+:::note
+
+El código de componente interpretado puede [editarse directamente desde el proyecto anfitrión](../Extensions/develop-components.md#editing-components-from-the-host) si el contexto es compatible.
+
+:::
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/data-types.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/data-types.md
new file mode 100644
index 00000000000000..1c05d7e9ff4a14
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/data-types.md
@@ -0,0 +1,86 @@
+---
+id: data-types
+title: Tipos de datos
+---
+
+En 4D, los datos se manejan según su tipo en dos lugares: los campos de la base y el lenguaje 4D.
+
+Aunque suelen ser equivalentes, algunos tipos de datos disponibles en la base no están disponibles directamente en el lenguaje y se convierten automáticamente. Por el contrario, algunos tipos de datos sólo pueden manejarse a través del lenguaje. La siguiente tabla lista todos los tipos de datos disponibles y cómo se soportan/declaran:
+
+| Tipos de datos | Soporte para la base (1) | Soporte para el lenguaje | [declaración `var`](variables.md) | [Declaración ARRAY\`](arrays.md) |
+| ------------------------------------------------------- | ------------------------------------------- | -------------------------- | --------------------------------- | -------------------------------- |
+| [Alfanumérico](dt_string.md) | Sí | Convertido en texto | - | - |
+| [Text](Concepts/dt_string.md) | Sí | Sí | `Text` | `ARRAY TEXT` |
+| [Fecha](Concepts/dt_date.md) | Sí | Sí | `Date` | `ARRAY DATE` |
+| [Hora](Concepts/dt_time.md) | Sí | Sí | `Time` | `ARRAY TIME` |
+| [Boolean](Concepts/dt_boolean.md) | Sí | Sí | `Boolean` | `ARRAY BOOLEAN` |
+| [Integer](Concepts/dt_number.md) | Sí | Convertido en entero largo | `Integer` | `ARRAY INTEGER` |
+| [Longint](Concepts/dt_number.md) | Sí | Sí | `Integer` | `ARRAY LONGINT` |
+| [Entero largo 64 bits](Concepts/dt_number.md) | Sí (SQL) | Convertido en real | - | - |
+| [Real](Concepts/dt_number.md) | Sí | Sí | `Real` | `ARRAY REAL` |
+| [Indefinido](Concepts/dt_null_undefined.md) | - | Sí | - | - |
+| [Null](Concepts/dt_null_undefined.md) | - | Sí | - | - |
+| [Pointer](Concepts/dt_pointer.md) | - | Sí | `Pointer` | `ARRAY POINTER` |
+| [Picture](Concepts/dt_picture.md) | Sí | Sí | `Picture` | `ARRAY PICTURE` |
+| [BLOB](Concepts/dt_blob.md) | Sí | Sí | `Blob`, `4D.Blob` | `ARRAY BLOB` |
+| [Object](Concepts/dt_object.md) | Sí(3) | Sí | `Object` | `ARRAY OBJECT` |
+| [Collection](Concepts/dt_collection.md) | - | Sí | `Collection` | |
+| [Variant](Concepts/dt_variant.md)(2) | - | Sí | `Variant` | |
+
+(1) Tenga en cuenta que ORDA maneja los campos de la base a través de objetos (entidades) y por lo tanto, sólo soporta los tipos de datos disponibles para estos objetos. Para más información, consulte la descripción del tipo de datos [Objeto](Concepts/dt_object.md).
+
+(2) Variant no es en realidad un tipo *data* sino un tipo *variable* que puede contener un valor de cualquier otro tipo de datos.
+
+(3) Puede [asignar una clase](../Develop/field-properties.md) a un campo objeto en el editor de estructura.
+
+## Comandos
+
+Siempre puede conocer el tipo de un campo o variable usando los siguientes comandos:
+
+- [`Type`](../commands-legacy/type.md) para campos y variables escalares
+- [`Tipo de valor`](../commands-legacy/value-type.md) para expresiones
+
+## Valores por defecto
+
+Cuando las [variables](variables.md) o los [parámetros](parameters.md) se tipifican mediante una [declaración explícita](variables.md#declaring-variables), reciben un valor por defecto, que mantendrán durante la sesión mientras no hayan sido asignados.
+
+El valor por defecto depende del tipo de variable:
+
+| Tipo | Valor por defecto |
+| ---------- | ---------------------------------------- |
+| Booleano | False |
+| Fecha | 00-00-00 |
+| Integer | 0 |
+| Time | 00:00:00 |
+| Picture | picture size=0 |
+| Real | 0 |
+| Puntero | Nil=true |
+| Text | "" |
+| Blob | Tamaño Blob=0 |
+| Object | null |
+| Collection | null |
+| Variant | indefinido |
+
+### Null como valor por defecto
+
+Las variables de tipo Object, Collection, Pointer y Picture tienen **null** como valor por defecto, pero en realidad obtienen un estado intermedio cuando se declaran y no se asignan. Se *comportan como* los valores **null**, pero con algunas diferencias, generando menos errores cuando el código intenta acceder a ellos.
+
+## Convertir los tipos de datos
+
+El lenguaje 4D contiene operadores y comandos para convertir entre tipos de datos, cuando dichas conversiones tienen sentido. El lenguaje 4D aplica la verificación de tipos de datos. Por ejemplo, no se puede escribir: "abc"+0.5+!12/25/96!-?00:30:45?. Esto generará errores de sintaxis.
+
+La siguiente tabla lista los tipos de datos básicos, los tipos de datos a los que se pueden convertir y los comandos utilizados para hacerlo:
+
+| Tipos a convertir | en Cadena | en Número | en Fecha | en Hora | en Booleano |
+| ----------------------------- | --------- | --------- | -------- | ------- | ----------- |
+| String (1) | | `Num` | `Date` | `Time` | `Bool` |
+| Número (2) | `String` | | | | `Bool` |
+| Fecha | `String` | | | | `Bool` |
+| Time | `String` | | | | `Bool` |
+| Boolean | | `Num` | | | |
+
+(1) Las cadenas formateadas en JSON pueden convertirse en datos escalares, objetos o colecciones, utilizando el comando `JSON Parse`.
+
+(2) Los valores de tipo Hora pueden tratarse como números.
+
+**Nota**: además de las conversiones de datos listadas en esta tabla, se pueden obtener conversiones de datos más sofisticadas combinando operadores y otros comandos.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_blob.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_blob.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_blob.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_blob.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_boolean.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_boolean.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_boolean.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_boolean.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_collection.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_collection.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_collection.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_collection.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_date.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_date.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_date.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_date.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_null_undefined.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_null_undefined.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_null_undefined.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_null_undefined.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_number.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_number.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_number.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_number.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_object.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_object.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_object.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_object.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_picture.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_picture.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_picture.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_picture.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_pointer.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_pointer.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_pointer.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_pointer.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_string.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_string.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_string.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_string.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_time.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_time.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_time.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_time.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_variant.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_variant.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/dt_variant.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/dt_variant.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/error-handling.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/error-handling.md
new file mode 100644
index 00000000000000..706dcbef348f6c
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/error-handling.md
@@ -0,0 +1,298 @@
+---
+id: error-handling
+title: Gestión de errores
+---
+
+El manejo de errores es el proceso de anticipar y responder a los errores que puedan ocurrir en su aplicación. 4D soporta de forma completa la detección y notificación de errores en tiempo de ejecución, así como el análisis de sus condiciones.
+
+La gestión de errores responde a dos necesidades principales:
+
+- descubrir y corregir posibles errores y fallos en el código durante la fase de desarrollo,
+- detectar y recuperar errores inesperados en las aplicaciones desplegadas; en particular, puede sustituir los diálogos de error del sistema (disco lleno, archivo perdido, etc.) por su propia interfaz.
+
+Básicamente, hay dos maneras de manejar los errores en 4D. Puede:
+
+- [instalar un método de gestión de errores](#installing-an-error-handling-method), o
+- utilice una [palabra clave Try()`](#tryexpression) o una [estructura Try/Catch`](#trycatchend-try) antes de piezas de código que llaman a una función, método o expresión que pueden arrojar un error.
+
+:::tip Buenas prácticas
+
+Es muy recomendable instalar un método global de gestión de errores en 4D Server, para todo el código que se ejecute en el servidor. Cuando 4D Server no se ejecuta [headless](../Admin/cli.md) (es decir, se lanza con su [ventana de administración](../ServerWindow/overview.md)), este método evitaría que se mostraran cajas de diálogo inesperadas en la máquina servidor. En modo sin interfaz, los errores se registran en el archivo [4DDebugLog](../Debugging/debugLogFiles.md#4ddebuglogtxt-standard) para su posterior análisis.
+
+:::
+
+## Predictable vs unpredictable errors
+
+Many 4D class functions, such as [`entity.save()`](../API/EntityClass.md#save) or [`transporter.send()`](../API/SMTPTransporterClass.md#send), return a object containing *status* information. This object is used to store **predictable** errors in the runtime context, e.g. invalid password, locked entity, etc., that do not require to stop program execution. This category of errors, also named **silent errors** errors, can be handled by regular code. When such errors occur in an error handling context, i.e. a [`Try`](#tryexpression), [`Try/Catch`](#trycatchend-try) or an [error-handling method](#installing-an-error-handling-method), they do not interrupt the execution and do not trigger the error handling (e.g. the `Catch` part of the [`Try/Catch`](#trycatchend-try) is not executed). They are not listed in the [`Last errors`](../commands/last-errors.md) collection. The error is only returned in the `status` and `statusText` properties of the returned object. It can be processed according to your business logic.
+
+The other category of errors are **unpredictable** errors, also named **serious errors**. They include disk write error, network failure, or in general any unexpected interruption. This category of errors generates exceptions defined by [a *code*, a *message* and a *signature*](#error-codes). They interrupt the execution and trigger the error processing of the [`Try`](#tryexpression), [`Try/Catch`](#trycatchend-try) or [error-handling method](#installing-an-error-handling-method) features. They are listed in the [`Last errors`](../commands/last-errors.md) collection. Note that serious errors can also return values in the `status` and `statusText` properties, e.g. `dk status serious error` - "Other error".
+
+## Instalación de un método de gestión de errores
+
+En 4D, todos los errores pueden ser detectados y manejados por métodos proyecto específicos, llamados **métodos de gestión de errores** (o **métodos de intercepción de errores**).
+
+Una vez instalados, los manejadores de errores son llamados automáticamente en modo interpretado o compilado en caso de error en la aplicación 4D o en uno de sus componentes. Se puede llamar a un manejador de errores diferente en función del contexto de ejecución (ver abajo).
+
+Para *instalar* un método proyecto de gestión de errores, basta con llamar al comando [`ON ERR CALL`](../commands-legacy/on-err-call.md) con el nombre del método proyecto y (opcionalmente) el alcance como parámetros. Por ejemplo:
+
+```4d
+ON ERR CALL("IO_Errors";ek local) //Instala un método local de gestión de errores
+```
+
+Para dejar de interceptar los errores en un contexto de ejecución y devolver la mano, llame `ON ERR CALL` con una cadena vacía:
+
+```4d
+ON ERR CALL("";ek local) //devuelve el control al proceso local
+```
+
+El comando [`Method called on error`](../commands-legacy/method-called-on-error.md) le permite conocer el nombre del método instalado por `ON ERR CALL` para el proceso actual. Es particularmente útil en el contexto de código genérico porque permite cambiar temporalmente y luego restaurar el método de captura de error:
+
+```4d
+ $methCurrent:=Method called on error(ek local)
+ ON ERR CALL("NewMethod";ek local)
+ //Si no se puede abrir el documento, se genera un error
+ $ref:=Open document("MyDocument")
+ //Reinstalación del método anterior
+ ON ERR CALL($methCurrent;ek local)
+
+```
+
+### Alcance y componentes
+
+Se puede definir un método de gestión de errores para diferentes contextos de ejecución:
+
+- para el **proceso actual**- sólo se llamará a un gestor de errores local para los errores ocurridos en el proceso actual del proyecto actual,
+- para **toda la aplicación**- se llamará a un gestor de errores global para todos los errores que se produzcan en el contexto de ejecución de la aplicación del proyecto actual,
+- desde los **componentes**- este manejador de errores se define en un proyecto local y será llamado para todos los errores que ocurran en los componentes cuando no hayan sido ya interceptados por un manejador de componentes.
+
+Ejemplos:
+
+```4d
+ON ERR CALL("IO_Errors";ek local) //Instala un método de gestión de errores local
+ON ERR CALL("globalHandler";ek global) //Instala un método de gestión de errores global
+ON ERR CALL("componentHandler";ek errors from components) //Instala un método de gestión de errores para los componentes
+```
+
+Puede instalar un gestor de errores global que servirá como "fallback" y gestores de errores locales específicos para determinados procesos. Un gestor de errores global también es útil en el servidor para evitar diálogos de error en el servidor cuando se ejecuta con interfaz.
+
+Se puede definir un único método de captura de errores para toda la aplicación o diferentes métodos por módulo de aplicación. Sin embargo, sólo se puede instalar un método por contexto de ejecución y por proyecto.
+
+Cuando se produce un error, sólo se llama a un método, como se describe en el siguiente diagrama:
+
+
+
+### Manejo de errores e el método
+
+Dentro de un método de gestión de errores personalizado, tiene acceso a varios datos que le ayudarán a identificar el error:
+
+- las variables sistema dedicadas:
+
+ - `Error` (entero largo): código de error
+ - `Error method`(texto): nombre del método que ha provocado el error
+ - `Error line` (entero largo): número de línea del método que ha provocado el error
+ - `Error formula` (texto): fórmula del código 4D (texto bruto) que está en el origen del error.
+
+:::info
+
+4D mantiene automáticamente una serie de variables denominadas [**variables sistema**](variables.md#system-variables), que responden a diferentes necesidades.
+:::
+
+- el comando [`Last errors`](../commands/last-errors.md) que devuelve una colección de la pila actual de errores ocurridos en la aplicación 4D.
+- el comando `Call chain` que devuelve una colección de objetos que describen cada paso de la cadena de llamadas a métodos dentro del proceso actual.
+
+#### Ejemplo
+
+He aquí un sistema de gestión de errores sencillo:
+
+```4d
+//instalar el método de gestión de errores
+ ON ERR CALL("errorMethod")
+ //... ejecutar el código
+ ON ERR CALL("") //giving control back to 4D
+```
+
+```4d
+// método proyecto errorMethod
+ If (Error#1006) //este no es una interrupción del usuario
+ ALERT("El error "+String(Error)+" ocurrido". El código en cuestión es: \""+Error formula+"\"")
+ End if
+```
+
+### Utilizar un método de gestión de errores vacío
+
+Si desea principalmente que la caja de diálogo de error estándar esté oculta, puede instalar un método de gestión de errores vacío. La variable sistema `Error` puede ser probada en cualquier método, es decir, fuera del método de gestión de errores:
+
+```4d
+ON ERR CALL("emptyMethod") //emptyMethod existe pero está vacío
+$doc:=Open document( "myFile.txt")
+If (Error=-43)
+ ALERT("Archivo no encontrado.")
+End if
+ON ERR CALL("")
+```
+
+## Try(expression)
+
+La sentencia `Try(expression)` permite probar una expresión de una sola línea en su contexto de ejecución real (incluyendo, en particular, los valores de las variables locales) e interceptar los errores que arroje para que no se muestre el diálogo de erro El uso de `Try(expression)` ofrece una manera fácil de manejar casos de error simples con un número muy bajo de líneas de código, y sin requerir un método de gestión de errores.
+
+:::note
+
+Si desea probar un código más complejo que una expresión de una sola línea, puede considerar la posibilidad de utilizar una estructura [`Try/Catch`](#trycatchend-try).
+
+:::
+
+La sintaxis formal de la declaración `Try(expresión)` es:
+
+```4d
+
+Try (expression) : any | Undefined
+
+```
+
+*expresion* puede ser toda expresión válida.
+
+Si se produce un error durante su ejecución, se intercepta y no se muestra ningún diálogo de error, si un [método de gestión de errores](#installing-an-error-handling-method) fue instalado o no antes de la llamada a `Try()`. Si *expression* devuelve un valor, `Try()` devuelve el último valor evaluado, en caso contrario devuelve `Define`.
+
+Puede manejar los errores utilizando el comando [`Last errors`](../commands/last-errors.md). Si *expression* arroja un error dentro de una pila de llamadas `Try()`, el flujo de ejecución se detiene y devuelve a la última ejecución `Try()` (la primera encontrada de nuevo en la pila de llamadas).
+
+:::note
+
+Si un [método de gestión de errores](#installing-an-error-handling-method) es instalado por *expression*, es llamado en caso de error.
+
+:::
+
+### Ejemplos
+
+1. Quiere mostrar el contenido de un archivo si el archivo se puede abrir sin errores y si su contenido se puede leer. Puede escribir:
+
+```4d
+var $text : Text
+var $file : 4D.File := File("/RESOURCES/myFile.txt")
+var $fileHandle : 4D.FileHandle := Try($file.open())
+If ($fileHandle # Null)
+ $text:=Try($fileHandle.readText()) || "Error al leer el archivo"
+End if
+```
+
+2. Quiere manejar el error de dividir por cero. En este caso, se desea devolver 0 y lanzar un error:
+
+```4d
+function divide( $p1: real; $p2: real)-> $result: real
+ if ($p2=0)
+ $result:=0 //sólo por claridad (0 es el valor por defecto para reales)
+ throw(-12345; "División por cero")
+ else
+ $result:=$p1/$p2
+ end if
+
+function test()
+ $result:=Try(divide($p1;$p2))
+ If (Last errors # null)
+ ALERT("Error")
+ End if
+
+```
+
+3. Desea gestionar tanto los errores [previsibles como los no previsibles>](#error-or-status):
+
+```4d
+var $e:=ds.Employee.new()
+$e.name:="Smith"
+$status:=Try($e.save()) //Capturar errores predecibles y no predecibles
+If ($status.success)
+ ALERT( "Success")
+Else
+ ALERT( "Error: "+JSON Stringify($status.errors))
+End if
+
+```
+
+## Try...Catch...End try
+
+La estructura `Try...Catch...End try` permite probar el código de un bloque en su contexto de ejecución real (incluyendo, en particular, los valores de las variables locales) e interceptar los errores que lanza para que no se muestre el diálogo de error d
+
+A diferencia de la palabra clave `Try(expression)` que evalúa una expresión de una sola línea, la estructura `Try...Catch...End try` permite evaluar cualquier bloque de código, desde el más simple al más complejo, sin necesidad de un método de gestión de Además, el bloque `Catch` puede utilizarse para gestionar el error de forma personalizada.
+
+La sintaxis formal de la estructura `Try...Catch...End try` es:
+
+```4d
+
+Try
+ statement(s) // Código a evaluar
+Catch
+ statement(s) // Código a ejecutar en caso de error
+End try
+
+```
+
+El código entre las palabras clave `Try` y `Catch` se ejecuta en primer lugar, luego el flujo depende del error o errores encontrados durante esta ejecución.
+
+- Si no se lanza ningún error, la ejecución del código continúa después de la palabra clave correspondiente `End try`. El código situado entre las palabras clave `Catch` y `End try` no se ejecuta.
+- Si la ejecución del bloque de código arroja un error no diferido \*\*, el flujo de ejecución se detiene y ejecuta el bloque de código correspondiente `Catch`.
+- If the code block calls a method that throws a *deferred error*, the execution flow jumps directly to the corresponding `Catch` code block.
+- Si un error diferido es lanzado directamente desde el bloque `Try`, el flujo de ejecución continúa hasta el final del bloque `Try` y no ejecuta el correspondiente bloque `Catch`.
+
+:::note
+
+Si se lanza un error *diferido* fuera del bloque `Try`, la ejecución del código continúa hasta el final del método o función.
+
+:::
+
+:::info
+
+Para más información sobre errores *diferidos* y *no diferidos*, por favor consulte la descripción del comando [`throw`](../commands-legacy/throw.md).
+
+:::
+
+En el bloque de código `Catch`, puede gestionar los errores utilizando los comandos estándar de gestión de errores. La función [`Last errors`](../commands/last-errors.md) contiene la colección de los últimos errores. En este bloque de código puede declarar [un método de gestión de errores](#installing-an-error-handling-method), en cuyo caso se llama en caso de error (de lo contrario se muestra el diálogo de error de 4D).
+
+:::note
+
+Si se instala un [método de gestión de errores](#installing-an-error-handling-method) en el código colocado entre las palabras clave `Try` y `Catch`, se llama en caso de error.
+
+:::
+
+### Ejemplo
+
+La combinación de transacciones y estructuras `Try...Catch...End try` permite escribir código seguro para funciones críticas.
+
+```4d
+Function createInvoice($customer : cs.customerEntity; $items : Collection; $invoiceRef : Text) : cs.invoiceEntity
+ var $newInvoice : cs.invoiceEntity
+ var $newInvoiceLine : cs.invoiceLineEntity
+ var $item : Object
+ ds.startTransaction()
+ Try
+ $newInvoice:=This.new()
+ $newInvoice.customer:=$customer
+ $newInvoice.invoiceRef:=$invoiceRef
+ For each ($item; $items)
+ $newInvoiceLine:=ds.invoiceLine.new()
+ $newInvoiceLine.item:=$item.item
+ $newInvoiceLine.amount:=$item.amount
+ $newInvoiceLine.invoice:=$newInvoice
+ //llamar a otras funciones específicas para validar la línea de factura
+ $newInvoiceLine.save()
+ End for each
+ $newInvoice.save()
+ ds.validateTransaction()
+ Catch
+ ds.cancelTransaction()
+ ds.logErrors(Last errors)
+ $newInvoice:=Null
+ End try
+ return $newInvoice
+
+```
+
+## Códigos de error
+
+Excepciones que interrumpen la ejecución de código son devueltas por 4D pero pueden tener diferentes orígenes como el sistema operativo, un dispositivo, el núcleo 4D, un [`throw`](../commands-legacy/throw.md) en su código, etc. Por lo tanto, tres elementos definen un error:
+
+- una **firma del componente**, que es el origen del error (ver [`Last errors`](../commands/last-errors.md) para tener una lista de firmas)
+- un **mensaje**, que explica por qué se ha producido el error
+- un **código**, que es un número arbitrario devuelto por el componente
+
+La [caja de diálogo de error 4D](../Debugging/basics.md) muestra el código y el mensaje al usuario.
+
+Para tener una descripción completa de un error y especialmente su origen, necesita llamar al comando [`Last errors`](../commands/last-errors.md). Cuando intercepta y maneja errores usando un [método de gestión de errores](#installing-an-error-handling-method) en sus aplicaciones finales, use [`Last errors`](../commands/last-errors.md) y asegúrese de registrar todas las propiedades del objeto *error* ya que los códigos de error dependen de los componentes.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/flow-control.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/flow-control.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/flow-control.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/flow-control.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/identifiers.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/identifiers.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/identifiers.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/identifiers.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/interpreted.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/interpreted.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/interpreted.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/interpreted.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/methods.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/methods.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/methods.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/methods.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/operators.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/operators.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/operators.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/operators.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/parameters.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/parameters.md
new file mode 100644
index 00000000000000..3a78e87c6b82f8
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/parameters.md
@@ -0,0 +1,538 @@
+---
+id: parameters
+title: Parámetros
+---
+
+A menudo encontrará que necesita pasar datos a sus métodos y funciones. Esto se hace fácilmente con parámetros.
+
+## Generalidades
+
+**Los parámetros** (o **argumentos**) son piezas de datos que un método o una función de clase necesita para realizar su tarea. Los términos *parámetros* y *argumentos* se utilizan indistintamente en este manual. Los parámetros también se pasan a los comandos integrados de 4D. En este ejemplo, la cadena "Hello" es un argumento para el comando integrado `ALERT`:
+
+```4d
+ALERT("Hello")
+```
+
+Los parámetros se pasan de la misma manera a los métodos o las funciones de clase. Por ejemplo, si una función de clase llamada `getArea()` acepta dos parámetros, una llamada a la función de clase podría verse así:
+
+```4d
+$area:=$o.getArea(50;100)
+```
+
+O, si un método proyecto llamado `DO_SOMETHING` acepta tres parámetros, una llamada al método podría verse así:
+
+```4d
+DO_SOMETHING($WithThis;$AndThat;$ThisWay)
+```
+
+Los parámetros de entrada están separados por punto y coma (;).
+
+Los mismos principios se aplican cuando los métodos se ejecutan a través de comandos dedicados, por ejemplo:
+
+```4d
+EXECUTE METHOD IN SUBFORM("Cal2";"SetCalendarDate";*;!05/05/20!)
+//pasar la fecha !05/05/20! como parámetro a SetCalendarDate
+//en el contexto de un subformulario
+```
+
+Los datos también pueden ser **devueltos** desde métodos y funciones de clase. Por ejemplo, la siguiente línea de instrucción utiliza el comando integrado, `Length`, para devolver la longitud de una cadena. La instrucción pone el valor devuelto por `Length` en una variable llamada *MyLength*. Esta es la instrucción:
+
+```4d
+MyLength:=Length("How did I get here?")
+```
+
+Toda subrutina puede devolver un valor. Sólo se puede declarar un único parámetro de salida por método o función de clase.
+
+Los valores de entrada y salida son [evaluados](#values-or-references) en el momento de la llamada y copiados en o desde variables locales dentro de la función o método de la clase llamada. Los parámetros variables deben ser [declarados](#declaring-parameters) en el código llamado.
+
+:::info Compatibilidad
+
+La sintaxis de declaración heredada, donde los parámetros se copian automáticamente en variables locales numeradas secuencialmente $0, $1, etc. y declarado usando directivas de compilador como `C_TEXT($1;$2)`, es **obsoleto** a partir de 4D 20 R7.
+
+:::
+
+## Declaración de parámetros
+
+En los métodos llamados o en las funciones de clase, los valores de los parámetros se asignan a las variables locales. Se declararan los parámetros utilizando un **nombre de parámetro** con un **tipo de parámetro**, separados por dos puntos.
+
+- Para funciones de clase, los parámetros se declaran junto con el prototipo de función, por ejemplo, cuando se utilizan las palabras clave `Function` o `Class constructor`.
+- Para los métodos (métodos proyecto, métodos objeto formulario, métodos base y triggers), los parámetros se declaran utilizando la palabra clave **`#DECLARE`** al principio del código del método.
+
+Ejemplos:
+
+```4d
+Function getArea($width : Integer; $height : Integer) -> $area : Integer
+```
+
+```4d
+ //myProjectMethod
+#DECLARE ($i : Integer) -> $myResult : Object
+```
+
+Se aplican las siguientes reglas:
+
+- La línea de declaración debe ser la primera línea del código del método o de la función, de lo contrario se mostrará un error (sólo los comentarios o los saltos de línea pueden preceder la declaración).
+- Los nombres de los parámetros deben comenzar con un carácter `$` y cumplir con [reglas de denominación de las propiedades](identifiers.md#object-properties).
+- Múltiples parámetros (y tipos) están separados por punto y coma (;).
+- Las sintaxis multilínea están soportadas (utilizando el carácter "\\").
+
+Por ejemplo, cuando se llama a una función `getArea()` con dos parámetros:
+
+```4d
+$area:=$o.getArea(50;100)
+```
+
+En el código de la función clase, el valor de cada parámetro se copia en el parámetro declarado correspondiente:
+
+```4d
+// Class: Polygon
+Function getArea($width : Integer; $height : Integer)-> $area : Integer
+ $area:=$width*$height
+```
+
+> Si no se define el tipo, el parámetro se definirá como [`Variant`](dt_variant.md).
+
+Todos los tipos de métodos de 4D soportan la palabra clave `#DECLARE`, incluidos los métodos base. Por ejemplo, en el método base `On Web Authentication`, puede declarar parámetros temporales:
+
+```4d
+// Método base On Web Authentication
+#DECLARE ($url : Text; $header : Text; \
+ $BrowserIP : Text; $ServerIP : Text; \
+ $user : Text; $password : Text) \
+ -> $RequestAccepted : Boolean
+$entitySelection:=ds.User.query("login=:1"; $user)
+// Verificar la contraseña hash...
+```
+
+### Valor devuelto
+
+El parámetro de retorno de una función se declara añadiendo una flecha (->) y la definición del parámetro después de la lista de parámetros de entrada. Por ejemplo:
+
+```4d
+Function add($x : Variant; $y : Integer) -> $result : Integer
+```
+
+También puede declarar el parámetro de retorno añadiendo sólo `: type`, en cuyo caso puede ser manejado por un [return](#return-expression). Por ejemplo:
+
+```4d
+Function add($x : Variant; $y : Integer): Integer
+ return $x+$y
+```
+
+:::warning
+
+Los parámetros, que incluyen el valor devuelto, deben declararse una sola vez. En particular, no se puede declarar el mismo parámetro como entrada y salida, incluso con el mismo tipo. Por ejemplo:
+
+```qs
+ //declaración inválida
+Función myTransform ($x : Integer) -> $x : Integer
+ //error: $x se declara dos veces
+```
+
+:::
+
+### Tipos de datos soportados
+
+Con los parámetros con nombre, puede utilizar los mismos tipos de datos [soportados por la palabra clave `var`](variables.md), incluidos los objetos de las clases. Por ejemplo:
+
+```4d
+Function saveToFile($entity : cs.ShapesEntity; $file : 4D.File)
+```
+
+:::note
+
+Las expresiones de tablas o arrays sólo pueden pasarse [como referencia utilizando un puntero](dt_pointer.md#pointers-as-parameters-to-methods).
+
+:::
+
+### Inicialización
+
+Cuando se declaran los parámetros, se inicializan con el [**valor por defecto correspondiente a su tipo**](data-types.md#valores-por-defecto), que mantendrán durante la sesión mientras no hayan sido asignados.
+
+## `return {expression}`
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 19 R4 | Añadidos |
+
+
+
+La instrucción `return` finaliza la ejecución de una función o de un método y puede utilizarse para devolver una expresión a quien la llama.
+
+Por ejemplo, la siguiente función devuelve el cuadrado de su argumento, $x, donde $x es un número.
+
+```4d
+Function square($x : Integer) -> $result : Integer
+ return $x * $x
+```
+
+:::note
+
+Internamente, `return x` ejecuta `myReturnValue:=x`, y regresa al llamante. Si `return` se utiliza sin una expresión, la función o el método devuelve un valor nulo del tipo de retorno declarado (si lo hay), de lo contrario *undefined*.
+
+:::
+
+La instrucción `return` puede utilizarse junto con la sintaxis estándar para los [valores devueltos](#valor-devuelto) (el valor devuelto debe ser del tipo declarado). Sin embargo, hay que tener en cuenta que termina inmediatamente la ejecución del código. Por ejemplo:
+
+```4d
+Function getValue -> $v : Integer
+ $v:=10
+ return 20
+ // devuelve 20
+
+Function getValue -> $v : Integer
+ return 10
+ $v:=20 // nunca ejecutado
+ // devuelve 10
+```
+
+## Indirección de parámetros (${N})
+
+Los métodos y funciones 4D aceptan un número variable de parámetros. Puede dirigirse a esos parámetros con un bucle `For...End for`, el comando [`Count parameters`](../commands-legacy/count-parameters.md) y la **sintaxis de indirección de parámetros**. Dentro del método, una dirección de indirección tiene el formato `${N}`, donde `N` es una expresión numérica.
+
+### Utilización de parámetros variables
+
+Por ejemplo, considere un método que suma valores y devuelve la suma formateada según un formato que se pasa como parámetro. Cada vez que se llama a este método, el número de valores a sumar puede variar. Debemos pasar los valores como parámetros al método y el formato en forma de cadena de caracteres. El número de valores puede variar de una llamada a otra.
+
+Aquí está el método, llamado `MySum`:
+
+```4d
+ #DECLARE($format : Text) -> $result : Text
+ $sum:=0
+ For($i;2;Count parameters)
+ $sum:=$sum+${$i}
+ End for
+ $result:=String($sum;$format)
+```
+
+Los parámetros del método deben pasarse en el orden correcto, primero el formato y luego un número variable de valores:
+
+```4d
+ Result:=MySum("##0.00";125,2;33,5;24) //"182.70"
+ Result:=MySum("000";1;2;200) //"203"
+```
+
+Tenga en cuenta que aunque haya declarado 0, 1 o más parámetros, siempre puede pasar el número de parámetros que desee. Los parámetros están todos disponibles dentro del código llamado a través de la sintaxis `${N}` y el tipo de parámetros extra es [Variant](dt_variant.md) por defecto (puede declararlos utilizando la [notación variadic](#declaring-variadic-parameters)). Solo necesita asegurarse de que los parámetros existan, gracias al comando [`Count parameters`](../commands-legacy/count-parameters.md). Por ejemplo:
+
+```4d
+//método foo
+#DECLARE($p1: Text;$p2 : Text; $p3 : Date)
+For($i;1;Count parameters)
+ ALERT("param "+String($i)+" = "+String(${$i}))
+End for
+```
+
+Este método se puede llamar:
+
+```4d
+foo("hello";"world";!01/01/2021!;42;?12:00:00?) //se pasan parámetros adicionales
+```
+
+> La indirección de parámetros se gestiona mejor si se respeta la siguiente convención: si sólo algunos de los parámetros se dirigen por indirección, deben pasarse después de los demás.
+
+### Declaración de parámetros variables
+
+No es obligatorio declarar parámetros variables. Los parámetros variables no declarados obtienen automáticamente el tipo [Variant](dt_variant.md).
+
+Sin embargo, para evitar errores de correspondencia de tipos durante la ejecución del código, puede declarar un número variable de parámetros utilizando la notación "..." en los prototipos de sus funciones, constructores de clases y métodos (parámetros variables). Especifique el tipo del parámetro siguiendo la notación "..." con el tipo deseado.
+
+```4d
+#DECLARE ( ... : Text ) // Número indefinido de parámetros 'Text'
+
+```
+
+```4d
+Function myfunction ( ... : Text)
+
+```
+
+Cuando se declaran varios parámetros, debe emplearse la notación variable en la última posición, por ejemplo:
+
+```4d
+#DECLARE ( param: Real ; ... : Text )
+
+```
+
+```4d
+Function myfunction (var1: Integer ; ... : Text)
+```
+
+#### Ejemplo
+
+Aquí tenemos un método llamado `SumNumbers` que devuelve el total calculado para todos los números pasados como parámetros:
+
+```4d
+
+#DECLARE( ... : Real) : Real
+
+
+
+var $number; $total : Real
+
+For each ($number; 1; Count parameters)
+ $total+=${$number}
+End for each
+
+return $total
+
+```
+
+Este método puede llamarse con un número variable de parámetros Real. En caso de que el tipo de parámetro sea incorrecto, se devolverá un error antes de que se ejecute el método:
+
+```4d
+
+$total1:=SumNumbers // devuelve 0
+$total2:=SumNumbers(1; 2; 3; 4; 5) // devuelve 15
+$total3:=SumNumbers(1; 2; "hola"; 4; 5) // error
+
+```
+
+:::note Compatibilidad
+
+La sintaxis heredada para declarar parámetros variadicos (`C_TEXT(${4})`) está obsoleta a partir de 4D 20 R7.
+
+:::
+
+## Triggers y On Drag Over
+
+Algunos contextos no soportan la declaración en un método "Compiler_", por lo que se tratan de forma específica:
+
+- Triggers - El parámetro $0 (Entero largo), que es el resultado de un trigger, será digitado por el compilador si el parámetro no ha sido declarado explícitamente. Sin embargo, si quiere declararlo, debe hacerlo en el propio trigger.
+
+## Tipo de parámetro equivocado
+
+Llamar a un parámetro con un tipo incorrecto o una clase incorrecta (para parámetros de objeto) es un [error](error-handling.md) que impide la correcta ejecución. Por ejemplo, si escribe los siguientes métodos:
+
+```4d
+// method1
+#DECLARE($value : Text)
+```
+
+```4d
+// method2
+method1(42) //tipo incorrecto, texto esperado
+```
+
+También se genera un error cuando los parámetros son objetos con clases:
+
+```4d
+// method1
+#DECLARE($obj : cs.MyClass1)
+```
+
+```4d
+// method2
+var $param := cs.MyClass2.new(42)
+method1($param) //instancia de clase incorrecta, cs.MyClass1 esperada
+```
+
+Estos casos son tratados por 4D en función del contexto:
+
+- en los proyectos interpretados:
+ - si el parámetro fue declarado usando la sintaxis con nombre (`#DECLARE` o `Function`), se genera un error por el [live checker](../code-editor/write-class-method.md#warnings-and-errors) mientras se escribe el código, o cuando se llama al método.
+ - si el parámetro se declaró utilizando una sintaxis heredada (`_C_XXX`), no se genera ningún error, el método llamado recibe un valor vacío del tipo esperado.
+- en [proyectos compilados](interpreted.md), se genera un error en el paso de compilación siempre que sea posible. En caso contrario, se genera un error cuando se llama al método.
+
+## Utilización de las propiedades de objeto como parámetros con nombre
+
+La utilización de objetos como parámetros permite manejar **parámetros con nombre**. Este estilo de programación es simple, flexible y fácil de leer.
+
+Por ejemplo, utilizando el método `CreatePerson`:
+
+```4d
+ //CreatePerson
+ var $person : Object
+ $person:=New object("Name";"Smith";"Age";40)
+ ChangeAge($person)
+ ALERT(String($person.Age))
+```
+
+En el método `ChangeAge` puede escribir:
+
+```4d
+ //ChangeAge
+ #DECLARE ($para : Object)
+ $para.Age:=$para.Age+10
+ ALERT($para.Name+" is "+String($para.Age)+" years old.")
+```
+
+Esto ofrece una poderosa manera de definir [parámetros opcionales](#optional-parameters) (ver también abajo). Para manejar los parámetros que faltan, puede:
+
+- verificar si se suministran todos los parámetros esperados comparándolos con el valor `Null`, o
+- predefinir los valores de los parámetros, o
+- utilizarlos como valores vacíos.
+
+En el método `ChangeAge` anterior, las propiedades Age y Name son obligatorias y producirían errores si faltaran. Para evitar este caso, puede escribir simplemente:
+
+```4d
+ //ChangeAge
+ #DECLARE ($para : Object)
+ $para.Age:=Num($para.Age)+10
+ ALERT(String($para.Name)+" is "+String($para.Age)+" years old.")
+```
+
+Entonces ambos parámetros son opcionales; si no se llenan, el resultado será " is 10 years old", pero no se generará ningún error.
+
+Por último, con los parámetros con nombre, el mantenimiento o la reproducción de las aplicaciones es muy sencillo y seguro. Imagine que más adelante se da cuenta de que añadir 10 años no siempre es apropiado. Necesita otro parámetro para definir cuántos años hay que añadir. Escriba:
+
+```4d
+$person:=New object("Name";"Smith";"Age";40;"toAdd";10)
+ChangeAge($person)
+
+//ChangeAge
+#DECLARE ($para : Object)
+If ($para.toAdd=Null)
+ $para.toAdd:=10
+End if
+$para.Age:=Num($para.Age)+$para.toAdd
+ALERT(String($para.Name)+" is "+String($para.Age)+" years old.")
+```
+
+El poder aquí es que no tendrá que cambiar su código existente. Siempre funcionará como en la versión anterior, pero si es necesario, puede utilizar otro valor que no sea 10 años.
+
+Con las variables con nombre, cualquier parámetro puede ser opcional. En el ejemplo anterior, todos los parámetros son opcionales y se puede dar cualquiera, en cualquier orden.
+
+## Parámetros opcionales
+
+En el manual *Lenguaje de 4D*, los caracteres { } (llaves) indican parámetros opcionales. Por ejemplo, `ALERT (message{; okButtonTitle})` significa que el parámetro *okButtonTitle* puede omitirse al llamar al comando. Se puede llamar de las siguientes maneras:
+
+```4d
+ALERT("Are you sure?";"Yes I am") //2 parámetros
+ALERT("Time is over") //1 parámetro
+```
+
+Los métodos y las funciones 4D también aceptan estos parámetros opcionales. Tenga en cuenta que aunque haya declarado 0, 1 o más parámetros en el método, siempre puede pasar el número de parámetros que desee. Si llama a un método o función con menos parámetros que los declarados, los parámetros que faltan se procesan como valores por defecto en el código llamado, [según su tipo](data-types.md#default-values). Por ejemplo:
+
+```4d
+// función "concate" de myClass
+Function concate ($param1 : Text ; $param2 : Text)->$result : Text
+$result:=$param1+" "+$param2
+```
+
+```4d
+ // Método llamante
+ $class:=cs.myClass.new()
+ $class.concate("Hello") // "Hello "
+ $class.concate() // Displays " "
+```
+
+:::note
+
+También puede llamar a un método o función con más parámetros de los declarados. Estarán disponibles en el código llamado a través de la sintaxis [${N}](#parameter-indirection-n).
+
+:::
+
+Utilizando el comando `Count parameters` desde dentro del método llamado, puede detectar el número real de parámetros y realizar diferentes operaciones dependiendo de lo que haya recibido.
+
+El siguiente ejemplo muestra un mensaje de texto y puede insertar el texto en un documento en el disco o en un área de 4D Write Pro:
+
+```4d
+// APPEND TEXT Project Method
+// APPEND TEXT ( Text { ; Text { ; Object } } )
+// APPEND TEXT ( Message { ; Path { ; 4DWPArea } } )
+
+ #DECLARE ($message : Text; $path : Text; $wpArea : Object)
+
+ ALERT($message)
+ If(Count parameters>=3)
+ WP SET TEXT($wpArea;$1;wk append)
+ Else
+ If(Count parameters>=2)
+ TEXT TO DOCUMENT($path;$message)
+ End if
+ End if
+```
+
+Después de añadir este método proyecto a su aplicación, puede escribir:
+
+```4d
+APPEND TEXT(vtSomeText) //Sólo mostrará el mensaje
+APPEND TEXT(vtSomeText;$path) //Muestra el mensaje y el anexo al documento en $path
+APPEND TEXT(vtSomeText;"";$wpArea) //Muestra el mensaje y lo escribe en $wpArea
+```
+
+:::tip
+
+Cuando los parámetros opcionales son necesarios en sus métodos, también puede considerar el uso de [propiedades de objeto como parámetros con nombre](#using-object-properties-as-named-parameters) que ofrecen una forma flexible de manejar un número de parámetros variable.
+
+:::
+
+## Valores o referencias
+
+Cuando pasa un parámetro, 4D siempre evalúa la expresión del parámetro en el contexto del método que llama y define el **valor resultante** en las variables locales en la función de clase o la subrutina. Las variables/parámetros locales no son los campos, variables o expresiones reales pasados por el método que llama; sólo contienen los valores que se han pasado. Las variables/parámetros locales no son los campos, variables o expresiones reales pasados por el método que llama; sólo contienen los valores que se han pasado. Por ejemplo:
+
+```4d
+ //Aquí hay un código del método MY_METHOD
+DO_SOMETHING([People]Name) ///Digamos [People]El valor del nombre es "williams"
+ALERT([People]Name)
+
+ //Aquí está el código del método DO_SOMETHING
+ #DECLARE($param : Text)
+ $param:=Uppercase($param)
+ ALERT($param)
+```
+
+La caja de alerta mostrada por `DO_SOMETHING` dirá "WILLIAMS" y la caja de alerta mostrada por `MY_METHOD` dirá "williams". El método cambió localmente el valor del parámetro $param, pero esto no afecta al valor del campo `[People]Name` pasado como parámetro por el método `MY_METHOD`.
+
+Hay dos formas de hacer que el método `DO_SOMETHING` cambie el valor del campo:
+
+1. En lugar de pasar el campo al método, se pasa un puntero al mismo, por lo que se escribiría:
+
+```4d
+ //Aquí hay un código del método MY_METHOD
+DO_SOMETHING(->[People]Name) ///Digamos [People]El valor del nombre es "williams"
+ALERT([People]Last Name)
+
+ //Aquí el código del método DO_SOMETHING
+#DECLARE($param : Text)
+$param->:=Uppercase($param->)
+ALERT($param->)
+```
+
+Aquí el parámetro no es el campo, sino un puntero al mismo. Por lo tanto, dentro del método `DO SOMETHING`, $param ya no es el valor del campo sino un puntero al campo. El objeto **referenciado** por $param ($param-> en el código anterior) es el campo real. Por lo tanto, cambiar el objeto referenciado va más allá del alcance de la subrutina, y el campo real se ve afectado. En este ejemplo, las dos cajas de alerta dirán "WILLIAMS".
+
+2. En lugar de que el método `DO_SOMETHING` "haga algo", puede reescribir el método para que devuelva un valor. Por lo tanto, escribiría:
+
+```4d
+ //Aquí hay un código del método MY METHOD
+ [People]Name:=DO_SOMETHING([People]Name) ///Digamos [People]El valor del nombre es "williams"
+ ALERT([People]Name)
+
+ //Aquí el código del método DO SOMETHING
+ #DECLARE ($param : Text) -> ($result : Text)
+ $result:=Uppercase($param)
+ ALERT($result)
+```
+
+Esta segunda técnica de retornar un valor por una subrutina se llama "utilizar una función". Se describe en el párrafo [Valores devueltos](#returned-value).
+
+### Casos particulares: objetos y colecciones
+
+Debe prestar atención al hecho de que los tipos de datos Objeto y Colección sólo pueden manejarse a través de una referencia (es decir, un *puntero* interno).
+
+Consequently, when using such data types as parameters, `$param, $return...` do not contain *values* but *references*. La modificación del valor de los parámetros `$param, $return...` dentro de la subrutina se propagará a cualquier lugar donde se utilice el objeto o colección fuente. Este es el mismo principio que para [los punteros](dt_pointer.md#pointers-as-parameters-to-methods), excepto que los parámetros `$param, $return...` no necesitan ser desreferenciados en la subrutina.
+
+Por ejemplo, considere el método `CreatePerson` que crea un objeto y lo envía como parámetro:
+
+```4d
+ //CreatePerson
+ var $person : Object
+ $person:=New object("Name";"Smith";"Age";40)
+ ChangeAge($person)
+ ALERT(String($person.Age))
+```
+
+El método `ChangeAge` añade 10 al atributo Age del objeto recibido
+
+```4d
+ //ChangeAge
+ #DECLARE ($person : Object)
+ $person.Age:=$person.Age+10
+ ALERT(String($person.Age))
+```
+
+Cuando se ejecuta el método `CreatePerson`, las dos cajas de alerta dirán "50" ya que la misma referencia de objeto es manejada por ambos métodos.
+
+**4D Server:** cuando se pasan parámetros entre métodos que no se ejecutan en la misma máquina (utilizando por ejemplo la opción "Ejecutar en el servidor"), las referencias no son utilizables. En estos casos, se envían copias de los parámetros de objetos y colecciones en lugar de referencias.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/paths.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/paths.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/paths.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/paths.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/plug-ins.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/plug-ins.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/plug-ins.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/plug-ins.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/quick-tour.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/quick-tour.md
new file mode 100644
index 00000000000000..94c07b452efc7d
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/quick-tour.md
@@ -0,0 +1,431 @@
+---
+id: quick-tour
+title: Un recorrido rápido
+sidebar_label: Un recorrido rápido
+---
+
+Utilizando el lenguaje 4D, la impresión del tradicional mensaje "Hello, world!" en pantalla puede hacerse de varias maneras. Lo más sencillo es probablemente escribir la siguiente línea única en un método de proyecto:
+
+```4d
+ALERT("Hello, World!")
+```
+
+Este código mostrará una caja de diálogo de alerta estándar de la plataforma con el mensaje "Hello, World!", que contiene un botón de OK. Para ejecutar el código, basta con hacer clic en el botón de ejecución en el editor de código:
+
+
+
+O bien, podría adjuntar este código a un botón de formulario y ejecutarlo, en cuyo caso al hacer clic en el botón se mostraría la caja de diálogo de alerta. En todo caso, ¡acaba de ejecutar su primera línea de código 4D!
+
+## Asignar los valores
+
+Los datos pueden introducirse y copiarse en variables, campos, elementos de arrays... Poner datos en una variable se llama asignar los datos a la variable y se hace con el operador de asignación (:=). El operador de asignación también se utiliza para asignar datos a campos o elementos de arrays.
+
+```4d
+$MyNumber:=3 //asigna 3 a la variable MyNumber
+[Products]Size:=$MyNumber //asigna la variable MyNumber al campo [Products]Size
+arrDays{2}:="Tuesday" //asigna la cadena "Tuesday" al segundo elemento de arrDays
+MyVar:=Length("Acme") //asigna el resultado de la función (4) a MyVar
+$myDate:=!2018/01/21! //asigna una fecha literal
+$myHour:=?08:12:55? //asigna una hora literal
+```
+
+Debe distinguir el operador de asignación := de los demás operadores. En lugar de combinar expresiones en una nueva expresión, el operador de asignación copia el valor de la expresión a la derecha del operador de asignación en la variable o campo a la izquierda del operador.
+
+**Importante:** no confunda el operador de asignación (:=) con el signo igual (=). Se ha elegido deliberadamente un operador de asignación diferente (y no =) para evitar los problemas y la confusión que suelen producirse con == o === en otros lenguajes de programación. Estos errores son a menudo difíciles de reconocer por el compilador y conducen a una solución de problemas que requiere mucho tiempo.
+
+## Variables
+
+El lenguaje 4D es estricto con los tipos de datos, aunque se permite cierta flexibilidad en muchos casos. Por ejemplo, para crear una variable de tipo fecha, puede escribir: Se crea una variable digitada utilizando la palabra clave var.
+
+```4d
+var MyDate : Date
+```
+
+La palabra clave `var` permite declarar variables objeto de un tipo de clase definido, por ejemplo:
+
+```4d
+var myPerson : cs.Person
+//variable de la clase usuario Person
+```
+
+Aunque no se suele recomendar, se pueden crear variables simplemente utilizándolas; no es necesario definirlas formalmente. Por ejemplo, si desea una variable que contenga la fecha actual más 30 días, puede escribir:
+
+```4d
+MyOtherDate:=Current date+30
+```
+
+La línea de código dice "MyOtherDate obtiene la fecha actual más 30 días" Esta línea declara la variable, la asigna con el tipo de fecha (temporal) y un contenido. Esta línea crea la variable, la asigna con el tipo de fecha (temporal) y un contenido. Una variable creada por asignación se interpreta como sin tipo, es decir, puede ser asignada con otros tipos en otras líneas y cambia el tipo dinámicamente. Esta flexibilidad no se aplica a las variables declaradas con la palabra clave `var` (su tipo no puede cambiar) y en [modo compilado](interpreted.md), donde el tipo nunca puede cambiarse, independientemente de cómo se haya creado la variable.
+
+## Comandos
+
+Los comandos 4D son métodos integrados para realizar una acción. Los comandos se utilizan a menudo con parámetros, que se pasan entre corchetes () y separados por punto y coma (;). Ejemplo:
+
+```4d
+COPY DOCUMENT("folder1\\name1";"folder2\\" ; "new")
+```
+
+Algunos comandos se adjuntan a colecciones u objetos, en cuyo caso son funciones temporales que se utilizan con la notación de puntos. Por ejemplo:
+
+```4d
+$c:=New collection(1;2;3;4;5)
+$nc:=$c.slice(0;3) //$nc=[1,2,3]
+
+$lastEmployee:=$employee.last()
+```
+
+Puede utilizar los plug-ins o los componentes 4D que añaden nuevos comandos a su entorno de desarrollo 4D.
+
+Hay muchos plug-ins propuestos por la comunidad de usuarios de 4D o por desarrolladores terceros. Por ejemplo, utilizando el [4d-plugin-pdf-pages](https://github.com/miyako/4d-plugin-pdf-pages) en macOS:
+
+```4d
+PDF REMOVE PAGE(path;page)
+```
+
+4D SVG es un ejemplo de componente utilitario que aumenta las capacidades de su aplicación:
+
+```4d
+//hacer un dibujo
+svgRef:=SVG_New
+objectRef:=SVG_New_arc(svgRef;100;100;90;90;180)
+```
+
+4D SVG está incluido en 4D.
+
+## Constantes
+
+4D ofrece un conjunto extensivo de constantes predefinidas, cuyos valores son accesibles por nombre. Permiten escribir un código más legible. Por ejemplo, `Read Mode` es una constante (valor 2).
+
+```4d
+vRef:=Open document("PassFile";"TEXT";Read Mode) // abrir el documento en modo de sólo lectura
+```
+
+> Las constantes predefinidas aparecen subrayadas por defecto en el editor de código 4D.
+
+## Métodos
+
+4D ofrece un gran número de métodos (o comandos) integrados, pero también le permite crear sus propios **métodos de proyecto**. Los métodos de proyecto son métodos definidos por el usuario que contienen comandos, operadores y otras partes del lenguaje.
+Los métodos proyecto son métodos genéricos, pero hay otros tipos de métodos: métodos objeto, métodos formulario, métodos tabla (Triggers) y métodos base.
+
+Un método se compone de varias líneas de instrucciones, cada una de las cuales consta de una línea en el método. Una línea de instrucción realiza una acción, y puede ser simple o compleja.
+
+Por ejemplo, la siguiente línea es una sentencia que mostrará una caja de diálogo de confirmación:
+
+```4d
+CONFIRM("¿Realmente quiere cerrar esta cuenta?"; "Sí"; "No")
+```
+
+Un método también contiene pruebas y bucles que controlan el flujo de ejecución. 4D methods support `If...Else...End if` and `Case of... Else...End case` branching structures as well as looping structures: `While...End while`, `Repeat...Until`, `For...End for`, and `For each... End for each`:
+
+El siguiente ejemplo recorre todos los caracteres del texto vtSomeText:
+
+```4d
+For($vlChar;1;Length(vtSomeText))
+ //Hacer algo con el carácter si es un TAB
+
+
+ If(Character code(vtSomeText[[$vlChar]])=Tab)
+ //...
+ End if
+End for
+```
+
+Un método proyecto puede llamar a otro método proyecto con o sin parámetros (argumentos). Los parámetros se pasan al método entre paréntesis, a continuación del nombre del método. Cada parámetro está separado del siguiente por un punto y coma (;). Los parámetros están disponibles directamente en el método llamado si se han declarado. Un método puede devolver un único valor en un parámetro, que debe ser declarado. Cuando se llama a un método, sólo hay que escribir su nombre:
+
+```4d
+$myText:="hello"
+$myText:=Hacer_algo($myText) //Llamar al método Do_Something
+ALERT($myText) //"HELLO"
+
+ //Aquí el código del método Do_Something
+#DECLARE ($in : Text) -> $out : Text
+$out:=Uppercase($in)
+```
+
+## Tipos de datos
+
+En el lenguaje, los distintos tipos de datos que se pueden manejar se denominan tipos de datos. Existen tipos de datos básicos (cadena, numérico, fecha, hora, booleano, imagen, punteros, arrays), y también tipos de datos compuestos (BLOBs, objetos, colecciones).
+
+Tenga en cuenta que los datos de tipo cadena y numérico pueden asociarse a más de un tipo de campo. Cuando se introducen datos en un campo, el lenguaje convierte automáticamente los datos en el tipo correcto para el campo. Por ejemplo, si se utiliza un campo entero, sus datos se tratan automáticamente como numéricos. En otras palabras, no tiene que preocuparse por mezclar tipos de campos similares al utilizar el lenguaje; éste los gestionará por usted.
+
+Sin embargo, al utilizar el lenguaje es importante no mezclar los diferentes tipos de datos. Del mismo modo que no tiene sentido almacenar "ABC" en un campo de fecha, tampoco tiene sentido poner "ABC" en una variable utilizada para fechas. En la mayoría de los casos, 4D es muy tolerante y tratará de dar sentido a lo que está haciendo. Por ejemplo, si añade un número a una fecha, 4D asumirá que quiere añadir ese número de días a la fecha, pero si intenta añadir una cadena a una fecha, 4D le dirá que la operación no puede funcionar.
+
+Hay casos en los que es necesario almacenar datos como un tipo y utilizarlos como otro. El lenguaje contiene un conjunto completo de comandos que permiten convertir de un tipo de datos a otro. Por ejemplo, es posible que necesite crear un número de pieza que empiece por un número y termine con caracteres como "abc". En este caso, podría escribir:
+
+```4d
+[Products]Part Number:=String(Number)+"abc"
+```
+
+Si *Number* es 17, entonces *[Products]Part Number* obtendrá el valor “17abc”.
+
+Los tipos de datos están completamente definidos en la sección [Tipos de datos](Concepts/data-types.md).
+
+## Objetos y colecciones
+
+Puedes manejar objetos y colecciones del lenguaje 4D utilizando la notación objeto para obtener o definir sus valores. Por ejemplo:
+
+```4d
+employee.name:="Smith"
+```
+
+También puede utilizar una cadena entre corchetes, por ejemplo:
+
+```4d
+$vName:=employee["name"]
+```
+
+Como el valor de una propiedad de objeto puede ser un objeto o una colección, la notación objeto acepta una secuencia de símbolos para acceder a subpropiedades, por ejemplo:
+
+```4d
+$vAge:=employee.children[2].age
+```
+
+Tenga en cuenta que si el valor de la propiedad del objeto es un objeto que encapsula un método (una fórmula), debe añadir paréntesis () al nombre de la propiedad para ejecutar el método:
+
+```4d
+$f:=New object
+$f.message:=Formula(ALERT("Hello world!"))
+$f.message() //muestra "Hello world!"
+```
+
+Para acceder a un elemento de la colección, debe pasar el número del elemento entre corchetes:
+
+```4d
+var myColl : Collection
+myColl:=New collection("A";"B";1;2;Current time)
+myColl[3] //acceso al 4º elemento de la colección
+```
+
+## Clases
+
+El lenguaje 4D soporta las clases de objetos. Añade un archivo `myClass.4dm` en la carpeta Project/Sources/Classes de un proyecto para crear una clase llamada "myClass".
+
+Para instanciar un objeto de la clase en un método, llame la clase usuario desde el *class store* (`cs`) y utilice la función miembro `new()`. Se pueden pasar parámetros.
+
+```4d
+// en un método 4D
+$o:=cs.myClass.new()
+```
+
+En el método clase `myClass`, utilice la instrucción `Function` para definir la función miembro clase *methodName*. Una función miembro de clase puede recibir y devolver parámetros como todo método, y utilizar `This` como instancia del objeto.
+
+```4d
+
+//en el archivo myClass.4dm
+Function hello -> $welcome : Text
+ $welcome:="Hello "+This.who
+```
+
+Para ejecutar una función miembro de clase, basta con utilizar el operador `()` en la función miembro de la instancia del objeto.
+
+```4d
+$o:=cs.myClass.new()
+$o.who:="World"
+$message:=$o.myClass.hello()
+//$message: "Hello World"
+```
+
+Opcionalmente, utilice la palabra clave `Class constructor` para declarar las propiedades del objeto.
+
+```4d
+//en el archivo Rectangle.4dm
+Class constructor ($width : Integer; $height : Integer)
+This.height:=$height
+This.width:=$width
+This.name:="Rectangle"
+```
+
+Una clase puede extender otra clase utilizando `Class extends `. Las superclasses se pueden llamar con el comando `Super`. Por ejemplo:
+
+```4d
+//en el archivo Square.4dm
+Class extends rectangle
+
+Class constructor ($length : Integer)
+ // Llama al constructor de la clase padre con las longitudes
+ // ofrecidas para el ancho y alto del rectángulo
+Super($length;$length)
+
+This.name:="Square"
+```
+
+## Operadores
+
+Cuando se utiliza el lenguaje, es raro que se quiera simplemente un dato. Es más probable que quiera hacer algo con esos datos. Estos cálculos se realizan con operadores. Los operadores, en general, toman dos datos y realizan una operación sobre ellos que da como resultado un nuevo dato. Usted ya conoce a la mayoría de los operadores. You are already familiar with many operators. For example, 1 + 2 uses the addition (or plus sign) operator to add two numbers together, and the result is 3.
+
+| Operador | Operación | Ejemplo |
+| -------- | -------------- | ---------- |
+| + | Adición | 1 + 2 = 3 |
+| – | Resta | 3 - 2 = 1 |
+| \* | Multiplicación | 2 \* 3 = 6 |
+| / | División | 6 / 2 = 3 |
+
+Los operadores numéricos son sólo un tipo de operador disponible. 4D soporta múltiples tipos de datos, como números, texto, fechas e imágenes, por lo que existen operadores que realizan operaciones con estos diferentes tipos de datos.
+
+Los mismos símbolos se utilizan a menudo para diferentes operaciones, dependiendo del tipo de datos. Por ejemplo, el signo más (+) realiza diferentes operaciones con diferentes datos:
+
+| Tipos de datos | Operación | Ejemplo |
+| -------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------- |
+| Number | Adición | 1 + 2 suma los números y da como resultado 3 |
+| Text | Concatenación | "Hola" + "a todos" concatena (une) las cadenas y da como resultado "Hola a todos" |
+| Fecha y Número | Adición de fecha | !1989-01-01! !1989-01-01! + 20 adds 20 days to the date January 1, 1989, and results in the date January 21, 1989 |
+
+## Expresiones
+
+En pocas palabras, las expresiones devuelven un valor. De hecho, al utilizar el lenguaje 4D, se utilizan expresiones todo el tiempo y se tiende a pensar en ellas sólo en términos del valor que representan. Las expresiones también se llaman fórmulas.
+
+Las expresiones se componen de casi todas las demás partes del lenguaje: comandos, operadores, variables, campos, propiedades de objetos y elementos de colección. Se utilizan expresiones para escribir líneas de código, que a su vez se utilizan para construir métodos. El lenguaje utiliza expresiones siempre que necesita un dato.
+
+Las expresiones son rara vez "autónomas." Hay varios lugares en 4D donde una expresión puede ser utilizada por sí misma. Incluye:
+
+- Editor de fórmulas (apply formula, query with formula, order by formula)
+- El comando `EXECUTE FORMULA`
+- La lista de propiedades, donde se puede utilizar una expresión como fuente de datos para la mayoría de los widgets
+- Depurador donde se puede comprobar el valor de las expresiones
+- En el editor de informes rápidos como fórmula para una columna
+
+### Tese de expresiones
+
+Se hace referencia a una expresión por el tipo de datos que devuelve. Hay varios tipos de expresiones. En la siguiente tabla se dan ejemplos de cada tipo de expresión.
+
+| Expression | Tipo | Descripción |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| “Hello” | Text | La palabra Hola es una constante cadena, indicada por las comillas dobles. |
+| “Hello ” + “there” | Text | Dos cadenas, "Hola" y "a todos", se suman (concatenan) con el operador de concatenación de cadenas (+). Se devuelve la cadena "Hola". |
+| “Sr. ” + [People]Name | Text | Se concatenan dos cadenas: la cadena "Sr." y el valor actual del campo Nombre de la tabla Personas. Si el campo contiene "Smith", la expresión devuelve "Mr. Smith". |
+| Uppercase("smith") | Text | Esta expresión utiliza `Uppercase`, un comando del lenguaje, para convertir la cadena "smith" a mayúsculas. Devuelve “SMITH”. |
+| 4 | Number | Se trata de una constante numérica, 4. |
+| 4 \* 2 | Number | Dos números, 4 y 2, se multiplican utilizando el operador de multiplicación (\*). El resultado es el número 8. |
+| myButton | Number | Es una variable asociada a un botón. Devuelve el valor actual del botón: 1 si se ha hecho clic, 0 si no. |
+| !1997-01-25! | Fecha | Esta es una constante fecha para la fecha 1/25/97 (25 de enero de 1997). |
+| Current date+ 30 | Fecha | Esta es una expresión de tipo Fecha que utiliza el comando `Current date` para obtener la fecha de hoy. Añade 30 días a la fecha de hoy y devuelve la nueva fecha. |
+| ?8:05:30? | Time | Es una constante hora que representa 8 horas, 5 minutos y 30 segundos. |
+| ?2:03:04? + ?1:02:03? ?2:03:04? + ?1:02:03? ?2:03:04? + ?1:02:03? ?2:03:04? + ?1:02:03? + ?1:02:03? | Time | Esta expresión suma dos horas y devuelve la hora 3:05:07. |
+| True | Boolean | Este comando devuelve el valor booleano TRUE. |
+| 10 # 20 | Boolean | Se trata de una comparación lógica entre dos números. El símbolo número (#) significa "es diferente de". Como 10 "es diferente de" 20, la expresión devuelve TRUE. |
+| “ABC” = “XYZ” | Boolean | Se trata de una comparación lógica entre dos cadenas. Son diferentes, por lo que la expresión devuelve FALSE. |
+| My Picture + 50 | Picture | Esta expresión toma la imagen en My Picture, la mueve 50 píxeles a la derecha y devuelve la imagen resultante. |
+| ->[People]Name | Puntero | Esta expresión devuelve un puntero al campo llamado [People]Name. |
+| Table (1) | Puntero | Este es un comando que devuelve un puntero a la primera tabla. |
+| JSON Parse (MyString) | Object | Este es un comando que devuelve MyString como un objeto (si el formato es el adecuado) |
+| JSON Parse (MyJSONArray) | Collection | Este es un comando que devuelve MyJSONArray en forma de colección (si el formato es el adecuado) |
+| Form.pageNumber | Propiedad objeto | Una propiedad objeto es una expresión que puede ser de todo tipo soportado |
+| Col[5] | Elementos de colección | Un elemento de colección es una expresión que puede ser de todo tipo soportado |
+| $entitySel[0] | Entity | Un elemento de una selección de entidades ORDA es una expresión de tipo entidad. Este tipo de expresión es **no asignable** |
+
+### Expresiones asignables y no asignables
+
+Una expresión puede ser simplemente una constante literal, como el número 4 o la cadena "Hello", o una variable como `$myButton`. También puede utilizar los operadores. Por ejemplo, 4 + 2 es una expresión que utiliza el operador de adición para sumar dos números y devolver el resultado 6. En todos los casos, estas expresiones son **no asignables**, lo que significa que no se les puede asignar un valor.
+En 4D, las expresiones pueden ser **asignables**. Una expresión es asignable cuando puede utilizarse a la izquierda del operador de asignación. Por ejemplo:
+
+```4d
+//$myVar variable is assignable, you can write:
+$myVar:="Hello" //assign "Hello" to myVar
+//Form.pageNumber is assignable, you can write: Form.pageNumber:=10 //assign 10 to Form.pageNumber
+//Form.pageTotal-Form.pageNumber is not assignable: Form.pageTotal- Form.pageNumber:=10 //error, non-assignable
+```
+
+En general, las expresiones que utilizan un operador no son asignables. Por ejemplo, `[Person]FirstName+" "+[Person]LastName` no es asignable.
+
+## Punteros
+
+El lenguaje 4D ofrece una implementación avanzada de punteros, que permite escribir código poderoso y modular. Puede utilizar punteros para referenciar tablas, campos, variables, arrays y elementos de arrays.
+
+Un puntero a un elemento se crea añadiendo un símbolo "->" antes del nombre del elemento, y se puede desreferenciar añadiendo el símbolo "->" después del nombre del puntero.
+
+```4d
+MyVar:="Hello"
+MyPointer:=->MyVar
+ALERT(MyPointer->)
+```
+
+## Código en varias líneas
+
+Puede escribir una única instrucción en varias líneas terminando cada línea de la instrucción con un caracter barra invertida final `\`. El lenguaje 4D considerará todas las líneas a la vez. Por ejemplo, ambas sentencias son equivalentes:
+
+```4d
+$str:=String("hello world!")
+```
+
+```4d
+$str:=String("hello"+\
+" world"+\
+"!")
+```
+
+## Comentarios
+
+Los comentarios son líneas de instrucciones inactivas. Estas líneas no son interpretadas por el programa 4D y no se ejecutan cuando el código se llama.
+
+Hay dos maneras de crear comentarios:
+
+- `//` para crear una línea de comentario
+- `/*...*/` para los bloques de comentarios en línea o multilínea.
+
+Ambos estilos de comentarios pueden utilizarse simultáneamente.
+
+#### Comentarios de una línea (`//comentario`)
+
+Inserte `//` al principio de una línea o después de una instrucción para añadir una línea de comentario. Ejemplo:
+
+```4d
+//Este es un comentario
+For($vCounter;1;100) //Bucle inicial
+ //comentario
+ //comentario
+ //comentario
+End for
+```
+
+#### Comentarios en línea o multilínea (`/*comment*/`)
+
+Rodea el contenido con los caracteres `/*` ... `*/` para para crear bloques de comentarios en línea o multilíneas. Tanto los bloques de comentarios en línea como los multilínea comienzan con `/*` y terminan con `*/`.
+
+- Las **líneas de comentarios en línea** se pueden insertar en cualquier parte del código. Ejemplo:
+
+```4d
+For /* inline comment */ ($vCounter;1;100)
+ ...
+End for
+```
+
+- Los **bloques de comentarios multilíneas** permiten comentar un número ilimitado de líneas. Los bloques de comentarios pueden anidarse (útil desde que el editor de código 4D soporta los bloques contraídos). Ejemplo:
+
+```4d
+For ($vCounter;1;100)
+/*
+comentarios
+ /*
+ otros comentarios
+ */
+*/
+```
+
+## Secuencias de escape
+
+El lenguaje 4D permite utilizar secuencias de escape (también llamadas caracteres de escape). Una secuencia de escape es una secuencia de caracteres que puede utilizarse para sustituir a un caracter "especial".
+
+La secuencia consiste en una barra invertida `\`, seguida de un caracter. Por ejemplo, `\t` es una secuencia de escape para el caracter **Tab**. Las secuencias de escape facilitan la introducción de caracteres especiales: el ejemplo anterior (`\t`) sustituye a la entrada "Caracter(Tab)".
+
+En 4D, se pueden utilizar las siguientes secuencias de escape:
+
+| Secuencias de escape | Carácter reemplazado |
+| -------------------- | ----------------------------------------- |
+| `\n` | LF (Retorno línea) |
+| `\t` | HT (Tabulación) |
+| `\r` | CR (Retorno carro) |
+| `\\` | `\` (Barra invertida) |
+| `\"` | " (Comillas) |
+
+> Es posible utilizar mayúsculas o minúsculas en las secuencias de escape.
+
+En el siguiente ejemplo, el caracter **Retorno de carro** (secuencia de escape `\r`) se inserta en una sentencia para obtener un diálogo:
+
+`ALERT("The operation has been completed successfully.\rYou may now disconnect.")`
+
+## Convenciones de escritura
+
+The following conventions are used in the 4D language documentation:
+
+- los caracteres{ }`(llaves) indican parámetros opcionales. Por ejemplo,`.delete( { option : Integer } )\` significa que el parámetro *option* puede omitirse al llamar a la función.
+- la notación `{ ; ...param }` indica un número ilimitado de parámetros. Por ejemplo, `.concat( value : any { ;...valueN } ) : Collection` significa que se puede pasar a la función un número ilimitado de valores de cualquier tipo.
+- the `any` keyword is used for parameters that can be of any type (number, text, boolean, date, time, object, collection...).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/shared.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/shared.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/shared.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/shared.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/variables.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/variables.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Concepts/variables.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Concepts/variables.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/basics.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/basics.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/basics.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/basics.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/breakpoints.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/breakpoints.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/breakpoints.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/breakpoints.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/debugLogFiles.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/debugLogFiles.md
new file mode 100644
index 00000000000000..d6b32a4f015be7
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/debugLogFiles.md
@@ -0,0 +1,716 @@
+---
+id: debugLogFiles
+title: Archivo de historial
+---
+
+Las aplicaciones 4D pueden generar varios archivos de historial que son útiles para depurar u optimizar su ejecución. Los registros generalmente se inician o detienen utilizando los selectores de los comandos [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md), [WEB SET OPTION](../commands-legacy/web-set-option.md) o [HTTP SET OPTION](../commands-legacy/http-set-option.md) y se almacenan en la [carpeta de registros](../Project/architecture.md#logs) del proyecto.
+
+La información histórica debe ser analizada para detectar y solucionar los problemas. Esta sección ofrece una descripción completa de los siguientes archivos de registro:
+
+- [4DRequestsLog.txt](#4drequestslogtxt)
+- [4DRequestsLog_ProcessInfo.txt](l#4drequestslog_processinfotxt)
+- [HTTPDebugLog.txt](#httpdebuglogtxt)
+- [4DHTTPClientLog.txt](#4dhttpclientlogtxt)
+- 4DDebugLog.txt ([standard](#4ddebuglogtxt-standard) & [tabular](#4ddebuglogtxt-tabular))
+- [4DDiagnosticLog.txt](#4ddiagnosticlogtxt)
+- [4DIMAPLog.txt](#4dsmtplogtxt-4dpop3logtxt-and-4dimaplogtxt)
+- [4DPOP3Log.txt](#4dsmtplogtxt-4dpop3logtxt-and-4dimaplogtxt)
+- [4DSMTPLog.txt](#4dsmtplogtxt-4dpop3logtxt-and-4dimaplogtxt)
+- [ORDA requests log file](#orda-requests)
+- [4DTCPUDPLog.txt](#4dtcpudplogtxt)
+
+> Cuando un archivo de historial puede generarse tanto en 4D Server como en el cliente remoto, se añade la palabra "Server" al nombre del archivo de historial del lado del servidor, por ejemplo "4DRequestsLogServer.txt"
+
+Los archivos de historial comparten algunos campos para que pueda establecer una cronología y hacer conexiones entre las entradas mientras depura:
+
+- `sequence_number`: este número es único en todos los registros de depuración y se incrementa para cada nueva entrada cualquiera que sea el archivo de historial, para que pueda conocer la secuencia exacta de las operaciones.
+- `connection_uuid`: para cada proceso 4D creado en un cliente 4D que se conecte a un servidor, este UUID de conexión se registra tanto del lado del servidor como del cliente. Permite identificar fácilmente el cliente remoto que lanzó cada proceso.
+
+## 4DRequestsLog.txt
+
+Este archivo de historial registra las solicitudes estándar llevadas a cabo por la máquina 4D Server o la máquina remota 4D que ejecutó el comando (excluyendo las solicitudes web).
+
+Como iniciar este historial:
+
+- en el servidor:
+
+```4d
+SET DATABASE PARAMETER(4D Server log recording;1)
+//del lado del servidor
+```
+
+- en un cliente:
+
+```4d
+SET DATABASE PARAMETER(Client Log Recording;1)
+//del lado remoto
+```
+
+> Esta instrucción también inicia el archivo de historial [4DRequestsLog_ProcessInfo.txt](#4drequestslog_processinfotxt).
+
+#### Encabezados
+
+Este archivo comienza con los siguientes encabezados:
+
+- Log Session Identifier (Identificador de sesión de historial)
+- Nombre del servidor que aloja la aplicación
+- Nombre de usuario: nombre de usuario en el sistema operativo que ejecutó la aplicación 4D en el servidor.
+
+#### Contenido
+
+Para cada petición, se registran los siguientes campos:
+
+| Nombre del campo | Descripción |
+| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| sequence_number | Número de operación único y secuencial en la sesión de historial |
+| time | Fecha y hora utilizando el formato ISO 8601: 'YYYY-MM-DDTHH:MM:SS.mmm' |
+| systemid | ID del sistema |
+| component | Firma del componente (por ejemplo, "4SQLS" o "dbmg") |
+| process\_info\_index | Corresponde al campo "index" en el archivo de historial 4DRequestsLog_ProcessInfo.txt, y permite vincular una petición a un proceso. |
+| request | [ID de petición C/S u ORDA](https://github.com/4d/request-log-definitions/blob/master/RequestIDs.txt) o cadena de mensaje para peticiones SQL o mensajes `LOG EVENT` |
+| bytes_in | Número de bytes recibidos |
+| bytes_out | Número de bytes enviados |
+| server\_duration | exec\_duration | Depende del lugar donde se genere el registro:
_server\*duration* cuando se genera en el cliente --Time tomado en microsegundos para que el servidor procese la solicitud y devuelva una respuesta. B a F en la imagen de abajo, O
_exec\*duration* cuando se genera en el servidor --Tiempo empleado en microsegundos para que el servidor procese la petición. B a E en la imagen de abajo.
|
+| write\_duration | Tiempo tomado en microsegundos para enviar la:
Petición (cuando se ejecuta en el cliente). A a B en la imagen inferior.
Respuesta (cuando se ejecuta en el servidor). E a F en la imagen de abajo.
|
+| task_kind | Apropiativo o cooperativo (respectivamente "p" o "c") |
+| rtt | Tiempo estimado en microsegundos para que el cliente envíe la solicitud y el servidor la acuse de recibo. A a D y E a H en la imagen inferior.
Only measured when using the ServerNet network layer, returns 0 when used with the legacy network layer.
For Windows versions prior to Windows 10 or Windows Server 2016, the call will return 0.
|
+| extra | Información adicional relacionada con el contexto, por ejemplo el nombre de la clase de datos y/o el nombre del atributo en caso de petición ORDA |
+
+Flujo de solicitudes:
+
+
+
+## 4DRequestsLog_ProcessInfo.txt
+
+Este archivo de historial registra la información de cada proceso creado en la máquina 4D Server o en la máquina remota 4D que ejecutó el comando (excluyendo las solicitudes web).
+
+Como iniciar este historial:
+
+- en el servidor:
+
+```4d
+SET DATABASE PARAMETER(4D Server log recording;1) //lado servidor
+```
+
+- en un cliente:
+
+```4d
+SET DATABASE PARAMETER(Client Log Recording;1) //del lado remoto
+```
+
+> Esta instrucción también inicia el archivo de historial [4DRequestsLog.txt](#4drequestslogtxt).
+
+#### Encabezados
+
+Este archivo comienza con los siguientes encabezados:
+
+- Log Session Identifier (Identificador de sesión de historial)
+- Nombre del servidor que aloja la aplicación
+- Nombre de usuario: nombre de usuario en el sistema operativo que ejecutó la aplicación 4D en el servidor.
+
+#### Contenido
+
+Para cada proceso, se registran los siguientes campos:
+
+| Nombre del campo | Descripción |
+| --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
+| sequence_number | Número de operación único y secuencial en la sesión de historial |
+| time | Fecha y hora utilizando el formato ISO 8601: 'YYYY-MM-DDTHH:MM:SS.mmm" |
+| process\_info\_index | Número de proceso único y secuencial |
+| CDB4DBaseContext | UUID del contexto de base del componente DB4D |
+| systemid | ID del sistema |
+| server\_process\_id | ID del proceso en el servidor |
+| remote\_process\_id | ID del proceso en el cliente |
+| process\_name | Nombre del proceso |
+| cID | Identificador de la conexión 4D |
+| uID | Identificador del cliente 4D |
+| IP Client | Dirección IPv4/IPv6 |
+| host_name | Nombre de host del cliente |
+| user_name | Nombre de conexión usuario en el cliente |
+| connection\_uuid | Identificador UUID de proceso de conexión |
+| server\_process\_unique\_id | ID único del proceso en el servidor |
+
+## HTTPDebugLog.txt
+
+Este archivo de historial registra cada petición HTTP y cada respuesta en modo bruto (raw). Se registran las solicitudes completas, incluidos los encabezados; opcionalmente, también se pueden registrar las partes del cuerpo.
+
+Como iniciar este historial:
+
+```4d
+
+WEB SET OPTION(Web debug log;wdl enable without body)
+//otros valores están disponibles
+```
+
+Los siguientes campos se registran tanto para la solicitud como para la respuesta:
+
+| Nombre del campo | Descripción |
+| ---------------- | ------------------------------------------------------------------------------------- |
+| SocketID | ID del socket utilizado para la comunicación |
+| PeerIP | Dirección IPv4 del host (cliente) |
+| PeerPort | Puerto utilizado por host (cliente) |
+| TimeStamp | Timestamp en milisegundos (desde el inicio del sistema) |
+| ConnectionID | Conexión UUID (UUID del VTCPSocket utilizado para la comunicación) |
+| SequenceNumber | Número de operación único y secuencial en la sesión de historial |
+
+## 4DHTTPClientLog.txt
+
+Este archivo de historial registra el tráfico HTTP que pasa por el cliente HTTP de 4D. Se registran las peticiones y respuestas completas, incluidos los encabezados; opcionalmente, también se pueden registrar las partes del cuerpo.
+
+Como iniciar este historial:
+
+```4d
+
+HTTP SET OPTION(HTTP client log; HTTP enable log with all body parts)
+//hay otros valores disponibles
+```
+
+Los siguientes campos se registran tanto para la solicitud como para la respuesta:
+
+| Nombre del campo | Descripción |
+| ---------------- | ------------------------------------------------------------------------------------------------------------------------- |
+| SequenceID | Número de operación único y secuencial en la sesión de historial |
+| ConnectionID | Identificador UUID de proceso de conexión |
+| LocalIP | Dirección IP del cliente |
+| PeerIP | Dirección IP del servidor |
+| TimeStamp | Marca de tiempo (ms) en el momento en que se envía la solicitud o se recibe completamente la respuesta |
+| ElapsedTimeInMs | (sólo respuesta) Diferencia con la marca de tiempo de la petición |
+
+Dependiendo de las opciones de historial, también se pueden registrar otros campos.
+
+- Para la petición: línea de petición, encabezados, cuerpo de la petición
+- Para respuesta: línea de estado, encabezados, cuerpo de la respuesta (sin comprimir), si lo hay
+
+## 4DDebugLog.txt (estándar)
+
+Este archivo de historial registra cada evento que se produce a nivel de programación 4D. El modo estándar ofrece una visión básica de los eventos.
+
+Como iniciar este historial:
+
+```4d
+SET DATABASE PARAMETER(Debug Log Recording;2)
+//estándar, todos los procesos
+
+SET DATABASE PARAMETER(Current process debug log recording;2)
+//estándar, sólo el proceso actual
+```
+
+Los siguientes campos se registran para cada evento:
+
+| Columna # | Descripción |
+| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 1 | Número de operación único y secuencial en la sesión de historial |
+| 2 | Fecha y hora en el formato ISO 8601: (YYYY-MM-DDThh:mm:ss.mmm) |
+| 3 | ID proceso (p=xx) e ID único proceso (puid=xx) |
+| 4 | Nivel de stack |
+| 5 | Puede ser Nombre del comando/Nombre del método/Mensaje/Información de inicio y parada de la tarea/Nombre, evento o callback plugin / UUID conexión |
+| 6 | Tiempo de la operación de conexión en milisegundos |
+
+## 4DDebugLog.txt (tabular)
+
+Este archivo de historial registra cada evento que se produce a nivel de programación 4D en un formato compacto y con tabulaciones que incluye información adicional (en comparación con el formato estándar).
+
+Como iniciar este historial:
+
+```4d
+SET DATABASE PARAMETER(Debug Log Recording;2+4)
+//formato tabular extendido, todos los procesos
+
+SET DATABASE PARAMETER(Current process debug log recording;2+4)
+//extendido, sólo el proceso actual
+```
+
+Los siguientes campos se registran para cada evento:
+
+| Columna # | Nombre del campo | Descripción |
+| --------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 1 | sequence_number | Número de operación único y secuencial en la sesión de historial |
+| 2 | time | Fecha y hora en el formato ISO 8601: (YYYY-MM-DDThh:mm:ss.mmm) |
+| 3 | ProcessID | ID del Proceso |
+| 4 | unique_processID | ID único del proceso |
+| 5 | stack_level | Nivel de stack |
+| 6 | operation_type | Tipo de operación histórico. Este valor puede ser un valor absoluto:
Comando
Método (método proyecto, método base, etc.)
Mensaje (enviado solo por el comando [LOG EVENT](../commands-legacy/log-event.md))
PluginMessage
PluginEvent
PluginCommand
PluginCallback
Task
Método miembro (método adjunto a una colección o un objeto)
Al cerrar un nivel de pila, las columnas `operation_type`, `operation` y `operation_parameters` tienen el mismo valor que el nivel de pila de apertura registrado en la columna `stack_opening_sequence_number`. Por ejemplo:
Las líneas 1 y 2 abren un nivel de pila, las líneas 3 y 4 cierran un nivel de pila. Los valores de las columnas 6, 7 y 8 se repiten en la línea del nivel de pila de cierre. La columna 10 contiene los números de secuencia de apertura del nivel de pila, es decir, 122 para la tercera línea y 121 para la cuarta. |
+| 7 | operation | Puede representar (dependiendo del tipo de operación):
un ID de Comando de Idioma (cuando el tipo=1)
un Nombre de Método (cuando el tipo=2)
una combinación de pluginIndex;pluginCommand (cuando el tipo=4, 5, 6 o 7). Puede contener algo como '3;2'
un UUID de tarea de conexión (cuando type=8)
|
+| 8 | operation_parameters | Parámetros pasados a comandos, métodos o plugins |
+| 9 | form_event | Evento formulario si lo hay; vacío en otros casos (supongamos que la columna se utiliza cuando se ejecuta el código en un método formulario o en un método objeto) |
+| 10 | stack_opening_sequence_number | Sólo para los niveles de pila de cierre: número de secuencia del nivel de pila de apertura correspondiente |
+| 11 | stack_level_execution_time | Sólo cuando se cierra el nivel de la pila: el tiempo transcurrido en microsegundos de la acción registrada actualmente (ver la décima columna en las líneas 123 y 124 del registro anterior) |
+
+## 4DDiagnosticLog.txt
+
+Este archivo de historial registra muchos eventos relacionados con el funcionamiento interno de la aplicación y es legible para las personas. Puede incluir información personalizada en este archivo utilizando el comando [LOG EVENT](../commands-legacy/log-event.md).
+
+Como iniciar este historial:
+
+```4d
+ SET DATABASE PARAMETER(Diagnostic log recording;1) //iniciar registro
+```
+
+Los siguientes campos se registran para cada evento:
+
+| Nombre del campo | Descripción |
+| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| sequenceNumber | Número de operación único y secuencial en la sesión de historial |
+| timestamp | Fecha y hora en el formato ISO 8601: (YYYY-MM-DDThh:mm:ss.mmm) |
+| loggerID | Opcional |
+| componentSignature | Opcional - firma del componente interno |
+| messageLevel | Información, avisos, errores |
+| message | Descripción de la entrada del historial |
+
+Dependiendo del evento, se pueden incluir otros campos en el registro, como la tarea, socket, etc.
+
+### Cómo activar el archivo
+
+El archivo *4DDiagnosticLog.txt* puede registrar diferentes niveles de mensajes, desde `ERROR` (más importante) a `TRACE` (menos importante). Por defecto, se define el nivel `INFO`, lo que significa que el archivo registrará sólo los eventos importantes, incluidos los errores y los resultados inesperados (ver más adelante).
+
+Puede seleccionar el nivel de los mensajes utilizando el selector `Diagnostic log level` del comando [SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md), en función de sus necesidades. Cuando se selecciona un nivel, los niveles superiores (que son más importantes) también se seleccionan implícitamente. Los siguientes niveles están disponibles:
+
+| Constante | Descripción | Cuando se selecciona, incluye |
+| ----------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
+| `Log error` | Una parte de la aplicación no funciona | `Log error` |
+| `Log warn` | Posible error, uso de una función obsoleta, usos deficientes, situación indeseable o inesperada | `Log error`, `Log warn` |
+| `Log info` | *Nivel por defecto* - Evento de aplicación importante | `Log error`, `Log warn`, `Log info` |
+| `Log debug` | Detalle del flujo de aplicación (para los servicios técnicos 4D) | `Log error`, `Log warn`, `Log info`, `Log debug` |
+| `Log trace` | Otra información interna (para los servicios técnicos de 4D) | `Log error`, `Log warn`, `Log info`, `Log debug`, `Log trace` |
+
+Ejemplo:
+
+```4d
+SET DATABASE PARAMETER (Diagnostic log recording; 1)
+SET DATABASE PARAMETER (Diagnostic log level; Log trace)
+```
+
+## 4DSMTPLog.txt, 4DPOP3Log.txt y 4DIMAPLog.txt
+
+Estos archivos de registro registran cada intercambio entre la aplicación 4D y el servidor de correo (SMTP, POP3, IMAP) que ha sido iniciado por los siguientes comandos:
+
+- SMTP - [SMTP New transporter](../commands/smtp-new-transporter.md)
+- POP3 - [POP3 New transporter](../commands/pop3-new-transporter.md)
+- IMAP - [IMAP New transporter](../commands/imap-new-transporter.md)
+
+Los archivos de historial pueden producirse en dos versiones:
+
+- una versión normal:
+ - archivos llamados 4DSMTPLog.txt, 4DPOP3Log.txt, o 4DIMAPLog.txt
+ - sin adjuntos
+ - utiliza un reciclaje automático de archivos circulares cada 10 MB
+ - destinado a la depuración habitual
+
+Para iniciar este historial:
+
+```4d
+SET DATABASE PARAMETER(SMTP Log;1) //inicia SMTP log
+SET DATABASE PARAMETER(POP3 Log;1) //inicia POP3 log
+SET DATABASE PARAMETER(IMAP Log;1) //inicia IMAP log
+```
+
+> 4D Server: clic en el botón **Iniciar los historiales de peticiones y de depuración** en la página [Mantenimiento](ServerWindow/maintenance.md) ode la ventana de administración de 4D Server.
+
+Esta ruta al historial es devuelta por el comando `Get 4D file`.
+
+- una versión extendida:
+ - attachment(s) included no automatic recycling
+ - nombre personalizado
+ - reservado con fines específicos
+
+Para iniciar este historial:
+
+ ```4d
+ $server:=New object
+ ...
+ //SMTP
+ $server.logFile:="MySMTPAuthLog.txt"
+ $transporter:=SMTP New transporter($server)
+
+ // POP3
+ $server.logFile:="MyPOP3AuthLog.txt"
+ $transporter:=POP3 New transporter($server)
+
+ //IMAP
+ $server.logFile:="MyIMAPAuthLog.txt"
+ $transporter:=IMAP New transporter($server)
+ ```
+
+#### Contenido
+
+Para cada petición, se registran los siguientes campos:
+
+| Columna # | Descripción |
+| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 1 | Número de operación único y secuencial en la sesión de historial |
+| 2 | Fecha y hora en el formato RFC3339 (yyyy-mm-ddThh:mm:ss.ms) |
+| 3 | ID Proceso 4D |
+| 4 | ID único del proceso |
+| 5 |
SMTP,POP3, or IMAP session startup information, including server host name, TCP port number used to connect to SMTP,POP3, or IMAP server and TLS status,or
data exchanged between server and client, starting with "S <" (data received from the SMTP,POP3, or IMAP server) or "C >" (data sent by the SMTP,POP3, or IMAP client): authentication mode list sent by the server and selected authentication mode, any error reported by the SMTP,POP3, or IMAP Server, header information of sent mail (standard version only) and if the mail is saved on the server,or
SMTP,POP3, or IMAP session closing information.
|
+
+## Peticiones ORDA
+
+Los registros de peticiones ORDA pueden registrar cada petición ORDA y la respuesta del servidor. Existen dos registros de peticiones ORDA:
+
+- un registro de peticiones ORDA del lado del cliente, en formato .txt
+- un registro de peticiones ORDA del lado del servidor, en formato .jsonl
+
+### Del lado del cliente
+
+El registro ORDA del lado del cliente registra cada petición ORDA enviada desde una máquina remota. Puede dirigir la información de registro a la memoria o a un archivo .txt en el disco de la máquina remota. El nombre y la ubicación de este archivo de registro son de su elección.
+
+Como iniciar este historial:
+
+```4d
+//en una máquina remota
+SET DATABASE PARAMETER(Client Log Recording;1)
+ds.startRequestLog(File("/PACKAGE/Logs/ordaLog.txt"))
+ //también se puede enviar a la memoria
+SET DATABASE PARAMETER(Client Log Recording;0)
+```
+
+:::note
+
+La activación del cliente [4DRequestsLog.txt](#4drequestslogtxt) utilianzdo `SET DATABASE PARAMETER` no es obligatoria. Sin embargo, es necesario si desea registrar el campo `sequenceNumber` único.
+
+:::
+
+Los siguientes campos se registran para cada petición:
+
+| Nombre del campo | Descripción | Ejemplo |
+| ---------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| sequenceNumber | Número de operación único y secuencial en la sesión de historial | 104 |
+| url | Solicitar URL | "rest/Persons(30001)" |
+| startTime | Fecha y hora de inicio en formato ISO 8601 | "2019-05-28T08:25:12.346Z" |
+| endTime | Fecha y hora final en formato ISO 8601 | "2019-05-28T08:25:12.371Z" |
+| duration | Duración del procesamiento del cliente en milisegundos (ms) | 25 |
+| response | Objeto respuesta del servidor | {"status":200,"body":{"__entityModel":"Persons",\[...]}} |
+
+#### Ejemplo
+
+Este es un ejemplo de un registro de archivo de historial ORDA del lado del cliente:
+
+```json
+ {
+ "sequenceNumber": 7880,
+ "url": "rest/Employees/$entityset/F910C2E4A2EE6B43BBEE74A0A4F68E5A/Salary?$compute='sum'&$progress4Dinfo='D0706F1E77D4F24985BE4DDE9FFA1739'",
+ "startTime": "2023-05-15T10:43:39.400Z",
+ "endTime": "2023-05-15T10:43:39.419Z",
+ "duration": 19,
+ "response": {
+ "status": 200,
+ "body": 75651
+ }
+ }
+```
+
+### Del lado del servidor
+
+El registro ORDA del lado del servidor registra cada petición ORDA procesada por el servidor, así como la respuesta del servidor (opcional). La información de registro se guarda en un archivo .jsonl en el disco de la máquina del servidor (por defecto, *ordaRequests.jsonl*).
+
+Como iniciar este historial:
+
+```4d
+//en el servidor
+SET DATABASE PARAMETER(4D Server log recording;1)
+ds.startRequestLog(File("/PACKAGE/Logs/ordaRequests.jsonl");srl log response without body)
+ //srl... el parámetro es opcional
+SET DATABASE PARAMETER(4D Server log recording;0)
+```
+
+:::note
+
+La activación del lado del servidor [4DRequestsLog.txt](#4drequestslogtxt) utilianzdo `SET DATABASE PARAMETER` no es obligatoria. Sin embargo, es necesario si desea registrar los campos exclusivos `sequenceNumber` y `duration`.
+
+:::
+
+Los siguientes campos se registran para cada petición:
+
+| Nombre del campo | Descripción | Ejemplo |
+| ---------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| sequenceNumber | Número de operación único y secuencial en la sesión de historial | 104 |
+| url | Solicitar URL | "rest/Persons(30001)" |
+| startTime | Fecha y hora de inicio en formato ISO 8601 | "2019-05-28T08:25:12.346Z" |
+| duration | Duración del procesamiento del servidor en microsegundos (µ) | 2500 |
+| response | Objeto de respuesta del servidor, se puede configurar en [`.startRequestLog()`](../API/DataStoreClass.md#startrequestlog) | {"status":200,"body":{"__entityModel":"Persons",\[...]}} |
+| ipAddress | Dirección IP del usuario | "192.168.1.5" |
+| userName | Nombre del usuario 4D | "henry" |
+| systemUserName | Nombre de inicio de sesión del usuario en la máquina | "hsmith" |
+| machineName | Nombre de la máquina del usuario | "PC of Henry Smith" |
+
+#### Ejemplo
+
+Este es un ejemplo de un registro ORDA del lado del servidor:
+
+```json
+ {
+ "url": "rest/Employees/$entityset/F910C2E4A2EE6B43BBEE74A0A4F68E5A/Salary?$compute='sum'&$progress4Dinfo='D0706F1E77D4F24985BE4DDE9FFA1739'",
+ "systemUserName": "Admin",
+ "userName": "Designer",
+ "machineName": "DESKTOP-QSK9738",
+ "taskID": 5,
+ "taskName": "P_1",
+ "startTime": "2023-05-15T11:43:39.401",
+ "response": {
+ "status": 200,
+ "body": 75651
+ },
+ "sequenceNumber": 7008,
+ "duration": 240
+ }
+
+```
+
+## 4DTCPUDPLog.txt
+
+Este archivo de registro registra eventos relacionados con conexiones TCP o UDP. Los eventos incluyen transmisión de datos, errores e información del ciclo de vida de la conexión. Este registro ayuda a los desarrolladores a monitorear y depurar la actividad de red dentro de sus aplicaciones.
+
+Como iniciar este historial:
+
+- Utilice el comando `SET DATABASE PARAMETER`:
+
+ ```4d
+ SET DATABASE PARAMETER(TCPUDP log recording; 1)
+ ```
+
+- Cómo activar el archivo
+
+ ```json
+ {
+ "TCPUDPLogs":{
+ "state" : 1
+ }
+ }
+ ```
+
+Los siguientes campos se registran para cada evento:
+
+| Nombre del campo | Tipo | Descripción |
+| ---------------- | ---------- | --------------------------------------------------------------------------------------------- |
+| time | Fecha/Hora | Fecha y hora del evento en formato ISO 8601 |
+| localPort | Number | Puerto local usado para la conexión |
+| peerAddress | Text | Dirección IP del peer remoto |
+| peerPort | Number | Puerto del peer remoto |
+| protocol | Text | "TCP" o "UDP |
+| evento | Text | El tipo de evento: `open`, `close`, `error`, `send`, `receive`, `listen` |
+| size | Number | La cantidad de datos enviados o recibidos (en bytes), 0 si no es aplicable |
+| excerpt | Number | Primeros 10 bytes de datos en formato hexadecimal |
+| textExcerpt | Text | Primeros 10 bytes de datos en formato texto |
+| comment | Text | Información adicional sobre el evento, como detalles de error o estado de cifrado |
+
+## Utilización de un archivo de configuración de log
+
+Puede utilizar un **archivo de configuración de log** para gestionar fácilmente el registro de los historiales en un entorno de producción. Este archivo está preconfigurado por el desarrollador. Normalmente, se puede enviar a los clientes para que sólo tengan que seleccionarlo o copiarlo en una carpeta local. Una vez activado, el archivo de configuración de log desencadena el registro de registros específicos.
+
+### Cómo activar el archivo
+
+Hay varias maneras de activar el archivo de configuración de registro, dependiendo de su configuración:
+
+- **4D Server con interfaz**: puede abrir la página de mantenimiento y hacer clic en el botón [Cargar el archivo de configuración de logs](ServerWindow/maintenance.md#load-logs-configuration-file) y luego seleccionar el archivo. En este caso, puede utilizar cualquier nombre para el archivo de configuración. Se activa inmediatamente en el servidor.
+- **un proyecto interpretado o compilado**: el archivo debe llamarse `logConfig.json` y copiarse en la [carpeta de Configuración](../Project/architecture.md#settings-user) del proyecto (situada al mismo nivel que la [carpeta `Proyecto`](../Project/architecture.md#project-folder)). Se activa al iniciar el proyecto (sólo en el servidor en cliente/servidor).
+- **una aplicación construida**: el archivo debe llamarse `logConfig.json` y copiarse en la siguiente carpeta:
+ - Windows: `Users\[userName]\AppData\Roaming\[application]`
+ - macOS: `/Users/[userName]/Library/ApplicationSupport/[application]`
+- **todos los proyectos con un 4D autónomo o remoto**: el archivo debe llamarse `logConfig.json` y copiarse en la siguiente carpeta:
+ - Windows: `Users\[userName]\AppData\Roaming\4D`
+ - macOS: `/Users/[userName]/Library/ApplicationSupport/4D`
+- **todos los proyectos con 4D Server**: el archivo debe llamarse `logConfig.json` y copiarse en la siguiente carpeta:
+ - Windows: `Users\[userName]\AppData\Roaming\4D Server`
+ - macOS: `/Users/[userName]/Library/ApplicationSupport/4D Server`
+
+:::note
+
+Si se instala un archivo `logConfig.json` tanto en la carpeta Settings como en AppData/Library, el archivo de la carpeta Settings tendrá prioridad.
+
+:::
+
+### Descripción del archivo JSON
+
+El archivo de configuración del registro es un archivo `.json` que debe cumplir con el siguiente esquema json:
+
+```json
+{
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "title": "Logs Configuration File",
+ "description": "A file that controls the state of different types of logs in 4D clients and servers",
+ "type": "object",
+ "properties": {
+ "forceConfiguration": {
+ "description": "Forcing the logs configuration described in the file ingoring changes coming from code or user interface",
+ "type": "boolean",
+ "default": true
+ },
+ "requestLogs": {
+ "description": "Configuration for request logs",
+ "type": "object",
+ "properties": {
+ "clientState": {
+ "description": "Enable/Disable client request logs (from 0 to N)",
+ "type": "integer",
+ "minimum": 0
+ },
+ "serverState": {
+ "description": "Enable/Disable server request logs (from 0 to N)",
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "debugLogs": {
+ "description": "Configuration for debug logs",
+ "type": "object",
+ "properties": {
+ "commandList": {
+ "description": "Commands to log or not log",
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1,
+ "uniqueItems": true
+ },
+ "state": {
+ "description": "integer to specify type of debuglog and options",
+
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "diagnosticLogs":{
+ "description": "Configuration for debug logs",
+ "type": "object",
+ "properties": {
+ "state":{
+ "description": "Enable/Disable diagnostic logs 0 or 1 (0 = do not record, 1 = record)",
+ "type": "integer",
+ "minimum": 0
+ },
+ "level": {
+ "description": "Configure diagnostic logs",
+ "type": "integer",
+ "minimum": 2,
+ "maximum": 6
+ }
+ }
+ },
+ "httpDebugLogs": {
+ "description": "Configuration for http debug logs",
+ "type": "object",
+ "properties": {
+ "level": {
+ "description": "Configure http request logs",
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 7
+ },
+ "state": {
+ "description": "Enable/Disable recording of web requests",
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4
+ }
+ }
+ },
+ "HTTPClientLogs": {
+ "description": "Configuration for http client logs",
+ "type": "object",
+ "properties": {
+ "state": {
+ "description": "Configure http client logs",
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 7
+ },
+ }
+ },
+ "POP3Logs": {
+ "description": "Configuration for POP3 logs",
+ "type": "object",
+ "properties": {
+ "state": {
+ "description": "Enable/Disable POP3 logs (from 0 to N)",
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "SMTPLogs": {
+ "description": "Configuration for SMTP logs",
+ "type": "object",
+ "properties": {
+ "state": {
+ "description": "Enable/Disable SMTP log recording (from 0 to N)",
+ "type": "integer",
+ "minimum": 0
+ }
+ }
+ },
+ "IMAPLogs": {
+ "description": "Configuration for IMAP logs",
+ "type": "object",
+ "properties": {
+ "state": {
+ "description": "Enable/Disable IMAP log recording (from 0 to N)",
+ "type": "integer"
+ }
+ }
+ },
+ "ORDALogs": {
+ "description": "Configuration for ORDA logs",
+ "type": "object",
+ "properties": {
+ "state": {
+ "description": "Enable/Disable ORDA logs (0 or 1)",
+ "type": "integer"
+ },
+ "filename": {
+ "type": "string"
+ }
+ }
+ }
+ }
+}
+```
+
+:::note
+
+- The "state" property values are described in the corresponding commands: `[`WEB SET OPTION`](../commands-legacy/web-set-option.md) (`Web log recording`), [`HTTP SET OPTION`](../commands-legacy/http-set-option.md) (`HTTP client log`), [`SET DATABASE PARAMETER`](../commands-legacy/set-database-parameter.md) (`Client Web log recording`, `IMAP Log\\\\\\\`,...).
+- Para httpDebugLogs, la propiedad "level" corresponde a las opciones constantes `wdl` descritas en el comando [`WEB SET OPTION`](../commands-legacy/web-set-option.md).
+- Para diagnosticLogs, la propiedad "level" corresponde a los valores constantes de `Diagnostic log level` descritos en el comando [`SET DATABASE PARAMETER`](../commands-legacy/set-database-parameter.md).
+
+:::
+
+### Ejemplo
+
+Este es un ejemplo de archivo de configuración de log:
+
+```json
+{
+ "forceLoggingConfiguration": false,
+ "requestLogs": {
+ "clientState": 1,
+ "serverState": 1
+ },
+ "debugLogs": {
+ "commandList":["322","311","112"],
+ "state": 4
+ },
+ "diagnosticLogs":{
+ "state" : 1
+ },
+ "httpDebugLogs": {
+ "level": 5,
+ "state" : 1
+ },
+ "POP3Logs": {
+ "state" : 1
+ },
+ "SMTPLogs": {
+ "state" : 1
+ },
+ "IMAPLogs": {
+ "state" : 1
+
+ },
+ "ORDALogs": {
+ "state" : 1,
+ "filename": "ORDALog.txt"
+ }
+}
+```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/debugger.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/debugger.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/debugger.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/debugger.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/debugging-remote.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/debugging-remote.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Debugging/debugging-remote.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Debugging/debugging-remote.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/building.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/building.md
new file mode 100644
index 00000000000000..b4bb86c4b4387c
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/building.md
@@ -0,0 +1,797 @@
+---
+id: building
+title: Creador de aplicaciones
+---
+
+4D incluye un generador de aplicaciones para crear un paquete de proyecto (versión final). Este generador simplifica el proceso de finalización y despliegue de las aplicaciones compiladas en 4D. Maneja automáticamente las funcionalidades específicas de los distintos sistemas operativos y facilita el despliegue de aplicaciones cliente-servidor.
+
+El generador de aplicaciones le permite:
+
+- Crear una estructura o componente compilado, sin código interpretado,
+- Generar una aplicación autónoma ejecutable, *es decir*, fusionada con 4D Volume Desktop, el motor de base de datos 4D,
+- Generar diferentes aplicaciones a partir de la misma estructura compilada mediante un proyecto XML,
+- Generar aplicaciones cliente-servidor homogéneas,
+- Generar aplicaciones cliente-servidor con actualización automática de los componentes del cliente y del servidor.
+- Guardar sus parámetros de generación para su uso futuro (botón *Guardar los parámetros*).
+
+> Las aplicaciones compiladas se basan en archivos [.4dz](#build-compiled-structure) que son **de sólo lectura**. Tenga en cuenta que el uso de comandos o funciones que modifican los archivos fuente (como `CREATE INDEX` o `CREATE TABLE` (SQL)) no es posible por defecto en las aplicaciones compiladas. Sin embargo, puede crear aplicaciones específicas que soporten modificaciones locales utilizando la llave XML `PackProject` (ver [doc.4d.com](https://doc.4d.com)).
+
+## Generalidades
+
+Generar un paquete de proyecto puede realizarse utilizando:
+
+- ya sea con el comando [`BUILD APPLICATION`](../commands-legacy/build-application.md),
+- o en la [caja de diálogo Crear aplicación](#build-application-dialog).
+
+:::tip
+
+También puede descargar y utilizar [`Build4D`](https://github.com/4d-depot/Build4D), un componente que ofrece clases para compilar, crear y firmar proyectos 4D, incluso desde una aplicación sin interfaz.
+
+:::
+
+### Diálogo crear aplicación
+
+Para mostrar la caja de diálogo Generar la aplicación, seleccione **Diseño** > **Generar aplicación...** en la barra de menús.
+
+
+
+La caja de diálogo del generador de aplicaciones incluye varias páginas a las que se puede acceder mediante pestañas:
+
+
+
+La generación sólo puede efectuarse una vez compilado el proyecto. Si selecciona este comando sin haber compilado previamente el proyecto, o si el código compilado no se corresponde con el código interpretado, aparece una caja de diálogo de advertencia que indica que el proyecto debe ser (re)compilado.
+
+### buildApp.4DSettings
+
+Cada parámetro de generación de la aplicación se almacena como una llave XML en el archivo de proyecto de la aplicación llamado `buildApp.4DSettings`, ubicado en la carpeta [`Settings` del proyecto](../Project/architecture.md#settings-user).
+
+Los parámetros por defecto se utilizan la primera vez que se utiliza la caja de diálogo del Generador de aplicaciones. El contenido del archivo proyecto se actualiza, si es necesario, al hacer clic en **Construir** o **Guardar los parámetros**. Puede definir varios archivos de parámetros XML para el mismo proyecto y utilizarlos con el comando [`BUILD APPLICATION`](../commands-legacy/build-application.md).
+
+Las llaves XML ofrecen opciones adicionales a las que se muestran en la caja de diálogo del Generador de aplicaciones. La descripción de estas llaves se detalla en el manual [4D XML Keys BuildApplication](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html).
+
+### Archivo de historial
+
+Cuando se crea una aplicación, 4D genera un archivo de registro llamado *BuildApp.log.xml* en la carpeta **Logs** del proyecto. El archivo de historial almacena la siguiente información para cada generación:
+
+- El inicio y el fin de la generación de objetivos,
+- El nombre y la ruta de acceso completa de los archivos generados,
+- La fecha y la hora de la generación,
+- Todos los errores que se han producido,
+- Todo problema de firma (por ejemplo, un plug-in no firmado).
+
+La comprobación de este archivo puede ayudarle a ahorrar tiempo durante los siguientes pasos de despliegue, por ejemplo si tiene intención de [notarizar](#about-notarization) su aplicación en macOS.
+
+> Utilice la sentencia `Get 4D file(Build application log file)` para obtener la ubicación del archivo de registro.
+
+## Nombre de la aplicación y carpeta de destino
+
+
+
+Introduzca el nombre de la aplicación en **Nombre de la aplicación**.
+
+Especifique la carpeta para la aplicación generada en la **Carpeta de destino**. Si la carpeta especificada no existe todavía, 4D creará una carpeta *Build*.
+
+## Página de estructura compilada
+
+Esta pestaña le permite generar un archivo de estructura compilado estándar y/o un componente compilado:
+
+
+
+### Generar una estructura compilada
+
+Genera una aplicación que sólo contiene código compilado.
+
+Esta funcionalidad crea un archivo *.4dz* en una carpeta `Compiled Database/`. Por ejemplo, si ha llamado a su aplicación "MyProject", 4D creará:
+
+`/Compiled Database/MyProject/MyProject.4dz`
+
+Un archivo .4dz es esencialmente una versión comprimida (empaquetada) de la carpeta del proyecto. Un archivo .4dz es esencialmente una versión comprimida (empaquetada) de la carpeta del proyecto. El tamaño compacto y optimizado de los archivos .4dz hace que los paquetes de proyectos sean fáciles de desplegar.
+
+> Al generar archivos .4dz, 4D utiliza por defecto un formato zip **estándar**. La ventaja de este formato es que es fácilmente legible por cualquier herramienta unzip. Si no quiere utilizar este formato estándar, añada la llave XML `UseStandardZipFormat` con valor `False` en su archivo [`buildApp.4DSettings`](#buildapp4dsettings) (para más información, vea el manual [4D XML Keys BuildApplication](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html)).
+
+#### Incluir las carpetas asociadas
+
+Cuando se marca esta opción, todas las carpetas relacionadas con el proyecto se copian en la carpeta Build como carpetas *Components* y *Resources*. Para más información sobre estas carpetas, consulte la [descripción de la arquitectura del proyecto](Project/architecture.md).
+
+### Generar un componente
+
+Genera un componente compilado a partir de la estructura.
+
+Un [componente](../Extensions/develop-components.md) es un proyecto estándar 4D en el que se han desarrollado funcionalidades específicas. Una vez configurado e [instalado en otro proyecto 4D](../Project/components.md) (el proyecto de la aplicación local), sus funcionalidades son accesibles desde el proyecto local.
+
+Si ha llamado a su aplicación *MyComponent*, 4D creará automáticamente una carpeta *Components* con la siguiente estructura:
+
+`/Components/MyComponent.4dbase/Contents/`.
+
+The *MyComponent.4dbase* folder is the [package folder of the compiled component](../Project/components.md#package-folder).
+
+The *Contents* folder contains:
+
+- *MyComponent.4DZ* file - the [compiled structure](#build-compiled-structure).
+- Una carpeta *Resources*: todos los resources asociados se copian automáticamente en esta carpeta. Los otros componentes y/o carpetas de plugins no se copian (un componente no puede utilizar plugins u otros componentes).
+- An *Info.plist* file - this file is required to build [notarizeable and stapleable](#about-notarization) components for macOS (it is ignored on Windows). Si un archivo *Info.plist* ya existe [en la raíz del componente](../Extensions/develop-components.md#infoplist) está fusionado, de lo contrario se crea un archivo por defecto. Las siguientes [llaves de Apple bundle](https://developer.apple.com/documentation/bundleresources/information-property-list) están prellenadas:
+ - `CFBundleDisplayName` y `CFBundleName` para el nombre de la aplicación,
+ - `NSHumanReadableCopyright`, puede ser [definido usando una llave XML](https://doc.4d.com/4Dv20/4D/20/CommonCopyright.300-6335859.en.html).
+ - `CFBundleShortVersionString` y `CFBundleVersion` para la versión de la aplicación (x.x.x, p. ej., 1.0.5), puede ser [definido usando una llave XML](https://doc.4d.com/4Dv20/4D/20/CommonVersion.300-6335858.en.html).
+
+## Página Application
+
+Esta pestaña le permite crear una versión autónoma y monopuesto de su aplicación:
+
+
+
+### Crear una aplicación autónoma
+
+Al marcar la opción **Crear una aplicación autónoma** y hacer clic en **Generar** se creará una aplicación autónoma (con doble clic) directamente desde su proyecto de aplicación. En Windows, esta función crea un archivo ejecutable (.exe). En macOS, se encarga de la creación de paquetes de software.
+
+Las funcionalidades ofrecidas por el archivo 4D Volume Desktop están relacionadas con la oferta de productos a la que se ha suscrito. Las funcionalidades ofrecidas por el archivo 4D Volume Desktop están relacionadas con la oferta de productos a la que se ha suscrito. Para más información sobre este punto, consulte la documentación de ventas y el [4D Store](http://www.4d.com/).
+
+- Puede definir un archivo de datos predeterminado o permitir a los usuarios [crear y utilizar su propio archivo de datos](#management-of-data-files).
+- Puede incrustar una [licencia de despliegue](../Admin/licenses.md#deployment-licenses) o dejar que el usuario final introduzca su licencia en el primer lanzamiento de la aplicación (ver [**Licencias**](#licenses) más abajo).
+
+:::note
+
+Es posible [automatizar la actualización de aplicaciones fusionadas de un solo usuario](#automatic-updating-of-server-or-single-user-applications) mediante una secuencia de comandos de lenguaje.
+
+:::
+
+### Ubicación de 4D Volume Desktop
+
+Para crear una aplicación autónoma, primero debe designar la carpeta que contiene el archivo 4D Volume Desktop:
+
+- *Windows* - la carpeta contiene los archivos 4D Volume Desktop.4DE, 4D Volume Desktop. RSR, así como varios archivos y carpetas necesarios para su funcionamiento. Estos elementos deben colocarse al mismo nivel que la carpeta seleccionada.
+- *macOS* - 4D Volume Desktop se entrega en forma de un paquete de software estructurado que contiene varios archivos y carpetas genéricos.
+
+Para seleccionar la carpeta 4D Volume Desktop, haga clic en el botón **[...]**. Aparece una caja de diálogo que le permite designar la carpeta de 4D Volume Desktop (Windows) o el paquete (macOS).
+
+Una vez seleccionada la carpeta, se muestra su ruta completa y, si realmente contiene 4D Volume Desktop, se activa la opción de generación de una aplicación ejecutable.
+
+> El número de versión de 4D Volume Desktop debe coincidir con el número de versión de 4D Developer Edition. Por ejemplo, si utiliza 4D 20, debe seleccionar un 4D Volume Desktop 20.
+
+### Modo de enlace de datos
+
+Esta opción permite elegir el modo de enlace entre la aplicación fusionada y el archivo de datos local. Hay dos modos de enlazar disponibles:
+
+- **Por nombre de la aplicación** (por defecto) - La aplicación 4D abre automáticamente el archivo de datos abierto más recientemente correspondiente al archivo de estructura. Esto le permite mover el paquete de aplicaciones libremente en el disco. Esta opción debería usarse generalmente para aplicaciones fusionadas, a menos que necesite específicamente duplicar su aplicación.
+
+- **Por ruta de la aplicación** - La aplicación 4D fusionada analizará el archivo *lastDataPath.xml* de la aplicación e intentará abrir el archivo de datos con un atributo "executablePath" que coincida con la ruta completa de la aplicación. Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath"). Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath").
+
+Para más información sobre el modo de vinculación de datos, consulte la sección [Último archivo de datos abierto](#last-data-file-opened).
+
+### Archivos generados
+
+Al hacer clic en el botón **Generar**, 4D crea automáticamente una carpeta **Final Application** en la **carpeta de destino** definida. Dentro de la carpeta Final Application hay una subcarpeta con el nombre de la aplicación especificada.
+
+Si ha especificado "MyProject" como nombre de la aplicación, encontrará los siguientes archivos en esta subcarpeta (MyProject):
+
+- *Windows*
+ - MyProject.exe - Su ejecutable y un MyProject.rsr (los recursos de la aplicación)
+ - Las carpetas 4D Extensions y Resources, varias librerías (DLL), la carpeta Native Components y SASL Plugins - Archivos necesarios para el funcionamiento de la aplicación
+ - Una carpeta Database - Incluye una carpeta Resources y un archivo MyProject.4DZ. Constituyen la estructura compilada del proyecto, así como también la carpeta Resources.
+ **Nota**: esta carpeta también contiene la carpeta *Default Data*, si se ha definido (ver [Gestión de archivos de datos en las aplicaciones finales](#management-of-data-files).
+ - (Opcional) Carpeta de componentes y/o carpeta Plugins - Contiene todos los componentes y/o archivos de plugins incluidos en el proyecto. Para más información sobre este punto, consulte la sección [Plugins y componentes](#plugins--components-page).
+ - (Opcional) Carpeta Licencias - Un archivo XML con los números de licencia integrados en la aplicación, si los hubiera. Para obtener más información sobre este punto, consulte la sección [Licencias y certificados](#licenses--certificate-page).
+ - Elementos adicionales añadidos a la carpeta 4D Volume Desktop, si los hay (ver [Personalizar la carpeta 4D Volume Desktop](#customizing-4d-volume-desktop-folder)).
+
+Todos estos elementos deben estar en la misma carpeta para que el ejecutable funcione.
+
+- *macOS*
+ - Un paquete de software llamado MyProject.app que contiene su aplicación y todos los elementos necesarios para su funcionamiento, incluyendo los plug-ins, componentes y licencias. Para más información sobre la integración de plug-ins y componentes, consulte la sección [Plugins y componentes](#plugins--components-page). Para obtener más información sobre la integración de licencias, consulte la sección [Licencias y certificados](#licenses--certificate-page). **Nota**: en macOS, el comando [Application file](../commands-legacy/application-file.md) del lenguaje 4D devuelve la ruta del archivo ApplicationName (ubicado en la carpeta Contents:macOS del paquete de software) y no la del archivo .comp (carpeta Contents:Resources del paquete de software).
+
+#### Personalizar la carpeta 4D Volume Desktop
+
+Cuando se construye una aplicación independiente, 4D copia el contenido de la carpeta 4D Volume Desktop en la carpeta Destination > *Final Application*. A continuación, podrá personalizar el contenido de la carpeta 4D Volume Desktop original según sus necesidades. Puede, por ejemplo:
+
+- Instalar una versión de 4D Volume Desktop correspondiente a un lenguaje específico;
+- Añadir una carpeta *Plugins* personalizada;
+- Personalizar el contenido de la carpeta *Resources*.
+
+> En macOS, 4D Volume Desktop se ofrece en forma de paquete de software. Para modificarlo, primero debe visualizar su contenido (**Control+clic** en el icono).
+
+#### Ubicación de los archivos web
+
+Si su aplicación ejecutable se utiliza como servidor web, los archivos y los archivos y carpetas requeridos por el servidor deben instalarse en ubicaciones específicas. Estos elementos son los siguientes:
+
+- archivos *cert.pem* y *key.pem* (opcional): etos archivos se utilizan para las conexiones TLS y por los comandos de encriptación de datos,
+- carpeta raíz web por defecto.
+
+Los elementos deben ser instalados:
+
+- **En Windows**: en la subcarpeta *Final Application\MyProject\Database*.
+- **En macOS**: junto al paquete de software *MyProject.app*.
+
+## Página Cliente/Servidor
+
+En esta pestaña, usted puede construir aplicaciones cliente y servidor personalizadas que son homogénicas, multiplataforma y con una opción de actualización automática.
+
+
+
+### ¿Qué es una aplicación cliente/servidor?
+
+Una aplicación cliente/servidor proviene de la combinación de tres elementos:
+
+- Un proyecto 4D compilado,
+- La aplicación 4D Server,
+- La aplicación 4D Volumen Desktop (macOS y/o Windows).
+
+Una vez generada, una aplicación cliente/servidor se compone de dos partes personalizadas: la parte Servidor (única) y la parte Cliente (a instalar en cada máquina cliente).
+
+> Si desea desplegar una aplicación cliente/servidor en un entorno heterogéneo (aplicaciones cliente ejecutándose en máquinas Intel/AMD y Apple Silicon), se recomienda [compilar el proyecto para todos los procesadores](Project/compiler.md#compilation-target) en una máquina macOS, para que todas las aplicaciones clientes funcionen de forma nativa.
+
+Además, se personaliza la aplicación cliente/servidor y se simplifica su manejo:
+
+- Para lanzar la parte del servidor, el usuario simplemente hace doble clic en la aplicación servidor. No es necesario seleccionar el archivo proyecto.
+- Para lanzar la parte cliente, el usuario simplemente hace doble clic en la aplicación cliente, que se conecta directamente a la aplicación servidor. No es necesario elegir un servidor en una caja de diálogo de conexión. Si desea que la aplicación cliente se conecte al servidor utilizando una dirección específica (distinta del nombre del servidor publicado en la subred), debe utilizar la llave XML `IPAddress` en el archivo buildapp.4DSettings. Si la conexión falla, [se pueden implementar mecanismos alternativos específicos](#management-of-client-connections). Puede "forzar" la visualización de la caja de diálogo de conexión estándar presionando la tecla **Opción** (macOS) o **Alt** (Windows) mientras inicia la aplicación cliente.
+ Sólo la parte cliente puede conectarse a la parte del servidor correspondiente. Si un usuario intenta conectarse a la parte servidor utilizando una aplicación estándar 4D, se devuelve un mensaje de error y la conexión es imposible.
+- Una aplicación cliente/servidor puede configurarse para que la parte cliente [se actualice automáticamente a través de la red](#copy-of-client-applications-inside-the-server-application). Sólo es necesario crear y distribuir una versión inicial de la aplicación cliente, las actualizaciones posteriores se gestionan mediante el mecanismo de actualización automática.
+- También es posible automatizar la actualización de la parte del servidor a través del uso de una secuencia de comandos de lenguaje ([SET UPDATE FOLDER](../commands-legacy/set-update-folder.md) y [RESTART 4D](../commands-legacy/restart-4d.md).
+
+:::note
+
+Si quiere que las conexiones cliente/servidor se realicen en [TLS](../Admin/tls.md), solo tiene que marcar la [configuración apropiada](../settings/client-server.md#encrypt-client-server-communications). Si desea utilizar un certificado personalizado, por favor considere usar los [`CertificateAuthoritiesCertificates`](https://doc.4d.com/4Dv20R8/4D/20-R8/CertificateAuthoritiesCertificates.300-7479862.en.html).
+
+:::
+
+### Construir aplicación servidor
+
+Marque esta opción para generar la parte del servidor de su aplicación durante la fase de construcción. Debe designar la ubicación en su disco de la aplicación 4D Server que va a utilizar. Debe designar la ubicación en su disco de la aplicación 4D Server que va a utilizar.
+
+#### Ubicación de 4D Server
+
+Haga clic en el botón **[...]** y utilice la caja de diálogo *Navegar carpeta* para localizar la aplicación 4D Server. En macOS, debe seleccionar directamente el paquete 4D Server.
+
+#### Versión actual
+
+Se utiliza para indicar el número de versión actual de la aplicación generada. A continuación, podrá aceptar o rechazar las conexiones de las aplicaciones cliente en función de su número de versión. El intervalo de compatibilidad para las aplicaciones cliente y servidor se define mediante el uso de [llaves XML](#buildapp4dsettings) específicas).
+
+#### Integrar el proyecto Usuarios y Grupos en la aplicación servidor creada
+
+**Nota preliminar:** en esta sección se utilizan los siguientes términos:
+
+| Nombre | Definición |
+| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| Archivo de directorio del proyecto | archivo [directory.json](../Users/handling_users_groups.md#directoryjson-file) ubicado en la [carpeta Settings](../Project/architecture.md#settings-user) del proyecto |
+| Archivo de directorio de la aplicación | archivo [directory.json](../Users/handling_users_groups.md#directoryjson-file) ubicado en la [carpeta Settings](../Project/architecture.md#settings-user) del servidor 4D creado |
+| Archivo de directorio de datos | archivo [directory.json](../Users/handling_users_groups.md#directoryjson-file) en la carpeta [Data > Settings](../Project/architecture.md#settings-user-data) |
+
+Cuando se marca esta opción, el archivo del directorio del proyecto se copia en el archivo del directorio de la aplicación en el momento de la generación.
+
+Cuando ejecute una aplicación 4D Server generada:
+
+- Si el servidor tiene un archivo de directorio de datos, se carga.
+- Si el servidor no tiene un archivo de directorio de datos, se carga el archivo de directorio de la aplicación.
+
+El archivo de directorio de la aplicación es de sólo lectura. Las modificaciones realizadas a los usuarios, grupos y permisos durante la ejecución del servidor se almacenan en el archivo del directorio de datos. Si ya no existe ningún archivo de directorio de datos, se creará automáticamente. Si el archivo del directorio de la aplicación estaba integrado, se duplica como archivo del directorio de datos.
+
+La incorporación del archivo del directorio del proyecto le permite desplegar una aplicación cliente/servidor con una configuración básica de la seguridad de los usuarios y de los grupos. Las modificaciones posteriores se añaden al archivo del directorio de datos.
+
+#### Autorizar la conexión de los clientes Silicon Mac
+
+Cuando se cree un servidor en Windows, marque esta opción para permitir que los clientes Apple Silicon se conecten a su aplicación servidor. A continuación, puede especificar una ruta de acceso a la estructura compilada para Apple Silicon/Intel.
+
+Para permitir a los clientes Apple Silicon conectarse a una aplicación servidor creada en Windows, primero debe crear una aplicación cliente en macOS, con un proyecto compilado para Apple Silicon e Intel. Esto crea automáticamente una estructura compilada, idéntica a la creada con la opción **[Build compiled structure](#build-compiled-structure)** (sin las carpetas asociadas).
+
+A continuación, puede copiar esa estructura en su máquina Windows y utilizarla para construir la aplicación servidor:
+
+
+
+#### Ubicación de la estructura compilada
+
+Ruta de acceso a la estructura compilada de la aplicación cliente Apple Silicon/Intel utilizada para crear un servidor Windows (ver [Permitir la conexión de clientes Silicon Mac](#allow-connection-of-silicon-mac-clients)).
+
+#### Modo de enlace de datos
+
+Esta opción permite elegir el modo de enlace entre la aplicación fusionada y el archivo de datos local. Hay dos modos de enlazar disponibles:
+
+- **Por nombre de la aplicación** (por defecto) - La aplicación 4D abre automáticamente el archivo de datos abierto más recientemente correspondiente al archivo de estructura. Esto le permite mover el paquete de aplicaciones libremente en el disco. Esta opción debería usarse generalmente para aplicaciones fusionadas, a menos que necesite específicamente duplicar su aplicación.
+
+- **Por ruta de la aplicación** - La aplicación 4D fusionada analizará el archivo *lastDataPath.xml* de la aplicación e intentará abrir el archivo de datos con un atributo "executablePath" que coincida con la ruta completa de la aplicación. Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath"). Si se encuentra una entrada de este tipo, se abre su correspondiente archivo de datos (definido a través de su atributo "dataFilePath").
+
+Para más información sobre el modo de vinculación de datos, consulte la sección [Último archivo de datos abierto](#last-data-file-opened).
+
+### Crear aplicación cliente
+
+Marque esta opción para generar la parte cliente de su aplicación durante la fase de construcción.
+
+Puede marcar esta opción:
+
+- junto con la opción [**Crear aplicación servidor**](#build-server-application) para crear las partes servidor y cliente correspondientes para la plataforma actual y (opcionalmente) incluir los archivos de actualización automática,
+- sin seleccionar la opción de [**Crear aplicación servidor**](#build-server-application), generalmente para construir el archivo de actualización que se seleccionará de la plataforma "concurrente" al crear la parte del servidor.
+
+#### Ubicación de 4D Volume Desktop
+
+Designa la ubicación en su disco de la aplicación 4D Volume Desktop que se utilizará para construir la parte cliente de su aplicación.
+
+> El número de versión de 4D Volume Desktop debe coincidir con el número de versión de 4D Developer Edition. Por ejemplo, si utiliza 4D 20, debe seleccionar un 4D Volume Desktop 20.
+
+El 4D Volume Desktop debe corresponder a la plataforma actual (que será también la plataforma de la aplicación cliente). Si desea generar una aplicación cliente para la plataforma "concurrente", debe realizar una operación adicional utilizando una aplicación 4D que se ejecute en dicha plataforma.
+
+Si desea que la aplicación cliente se conecte al servidor utilizando una dirección específica (distinta del nombre del servidor publicado en la subred), debe utilizar la llave XML `IPAddress` en el archivo buildapp.4DSettings. También puede implementar mecanismos específicos en caso de fallo de la conexión. También puede implementar mecanismos específicos en caso de fallo de la conexión. También puede implementar mecanismos específicos en caso de fallo de la conexión.
+
+#### Copia de las aplicaciones clientes en la aplicación servidor
+
+Las opciones de esta área configuran el mecanismo para actualizar la(s) parte(s) cliente de sus aplicaciones cliente/servidor utilizando la red cada vez que se genera una nueva versión de la aplicación. Estas opciones sólo se activan cuando la opción **Crear aplicación cliente** está marcada.
+
+- **Permitir la actualización automática de la aplicación cliente Windows** - Marque esta opción para construir un archivo `.4darchive` que puede ser enviado a sus aplicaciones cliente en la plataforma Windows en caso de actualización.
+- **Permitir la actualización automática de la aplicación cliente Macintosh** - Marque esta opción para construir un archivo `.4darchive` que puede ser enviado a sus aplicaciones cliente en la plataforma Macintosh en caso de actualización.
+
+El archivo `.4darchive` se copia en la siguiente ubicación:
+
+```
+_Build/Client Server executable/Upgrade4DClient/
+```
+
+#### Seleccionar el archivo cliente para la plataforma concurrente
+
+Puede marcar la opción **Permitir la actualización automática...** para las aplicaciones clientes ejecutadas en la plataforma concurrente. Esta opción sólo se activa si:
+
+- la opción **Crear aplicación servidor** está marcada,
+- la opción **Permitir la actualización automática...** para las aplicaciones clientes ejecutadas en la plataforma actual está marcada.
+
+Esta funcionalidad requiere que haga clic en el botón **[...]** y designe la ubicación en su disco del archivo que se utilizará para la actualización. El archivo a seleccionar depende de la plataforma actual del servidor:
+
+| Plataforma del servidor actual | Archivo requerido | Detalles |
+| ------------------------------ | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| macOS | Windows 4D Volume Desktop *o* Windows client update archive | Por defecto, se selecciona la aplicación `4D Volume Desktop` para Windows. Para seleccionar un archivo `.4darchive` previamente construido en Windows, presione **Shift** mientras hace clic en [...] |
+| Windows | macOS client update archive | Seleccione un archivo `.4darchive` firmado previamente creado en macOS |
+
+Puede crear un archivo `.4darchive` específico en la plataforma concurrente seleccionando únicamente la opción [**Crear aplicación cliente**](#build-client-application) y la opción apropiada [**Permitir actualización automática...**](#copy-of-client-applications-inside-the-server-application).
+
+#### Visualización de la notificación de actualización
+
+La notificación de actualización de la aplicación cliente se realiza automáticamente tras la actualización de la aplicación servidor.
+
+Funciona de la siguiente manera: cuando se genera una nueva versión de la aplicación cliente/servidor utilizando el generador de aplicaciones, la nueva parte cliente se copia como un archivo comprimido en la subcarpeta **Upgrade4DClient** de la carpeta **ApplicationName** Server (en macOS, estas carpetas se incluyen en el paquete servidor). Si ha seguido el proceso de generación de una aplicación cliente multiplataforma, un archivo de actualización .*4darchive* está disponible para cada plataforma:
+
+Para activar las notificaciones de actualización de la aplicación cliente, basta con sustituir la versión antigua de la aplicación servidor por la nueva y ejecutarla. El resto del proceso es automático.
+
+Del lado del cliente, cuando la aplicación cliente "antigua" intenta conectarse a la aplicación servidor actualizada, se muestra una caja de diálogo en la máquina cliente, indicando que hay nueva versión disponible. El usuario puede actualizar su versión o cancelar la caja de diálogo.
+
+- Si el usuario hace clic en **OK**, la nueva versión se descarga en el equipo cliente a través de la red. Una vez finalizada la descarga, se cierra la aplicación cliente antigua y se lanza la nueva versión, que se conecta al servidor. Una vez finalizada la descarga, se cierra la aplicación cliente antigua y se lanza la nueva versión, que se conecta al servidor.
+- Si el usuario hace clic en **Cancelar**, la actualización se cancela; si la versión antigua de la aplicación cliente no está en el rango de versiones aceptadas por el servidor (consulte el siguiente párrafo), la aplicación se cierra y la conexión es impos En caso contrario (por defecto), se establece la conexión. En caso contrario (por defecto), se establece la conexión.
+
+#### Forzar las actualizaciones automáticas
+
+En algunos casos, es posible que desee evitar que las aplicaciones cliente puedan cancelar la descarga de la actualización. Por ejemplo, si ha utilizado una nueva versión de la aplicación fuente de 4D Server, la nueva versión de la aplicación cliente debe estar instalada en cada máquina cliente.
+
+Para forzar la actualización, basta con excluir el número de versión actual de las aplicaciones cliente (X-1 y anteriores) en el rango de número de versión compatible con la aplicación servidor. En este caso, el mecanismo de actualización no permitirá que las aplicaciones cliente no actualizadas se conecten. En este caso, el mecanismo de actualización no permitirá que las aplicaciones cliente no actualizadas se conecten.
+
+El [número de versión actual](#current-version) se define en la página Cliente/Servidor del generador de la aplicación. Los intervalos de los números autorizados se definen en el proyecto de la aplicación vía las [llaves XML](#buildapp4dsettings) específicas.
+
+#### En caso de error
+
+Si 4D no puede llevar a cabo la actualización de la aplicación cliente, la máquina cliente muestra el siguiente mensaje de error: La aplicación va a cerrar ahora."
+
+Hay muchas causas posibles para este error. Cuando reciba este mensaje, es aconsejable que compruebe primero los siguientes parámetros:
+
+- **Nombres de ruta**: compruebe la validez de los nombres de ruta definidos en el proyecto de la aplicación a través del diálogo del Generador de aplicaciones o mediante las llaves XML (por ejemplo, *ClientMacFolderToWin*). Más concretamente, compruebe los nombres de ruta de las versiones de 4D Volume Desktop.
+- **Privilegios lectura/escritura**: en la máquina cliente, compruebe que el usuario actual tiene derechos de acceso de escritura para la actualización de la aplicación cliente.
+
+### Archivos generados
+
+Una vez creada la aplicación cliente/servidor, encontrará una nueva carpeta en la carpeta de destino llamada **Client Server executable**. Esta carpeta contiene dos subcarpetas, `Client` y `Server`.
+
+> Estas carpetas no se generan si ocurre un error. En este caso, abra el [archivo de historial](#log-file) para conocer la causa del error.
+
+La carpeta `Client` contiene la parte cliente de la aplicación correspondiente a la plataforma de ejecución del generador de aplicaciones. Esta carpeta debe instalarse en cada máquina cliente. La carpeta `Server` contiene la parte del servidor de la aplicación.
+
+El contenido de estas carpetas varía en función de la plataforma actual:
+
+- *Windows* - Cada carpeta contiene el archivo ejecutable de la aplicación, denominado `Client.exe` para la parte cliente y `Server.exe` para la parte servidor, así como los archivos .rsr correspondientes. Las carpetas también contienen varios archivos y carpetas necesarios para que las aplicaciones funcionen y elementos personalizados que pueden estar en las carpetas originales de 4D Volume Desktop y 4D Server.
+- *macOS* - Cada carpeta contiene únicamente el paquete de la aplicación, denominado `Client` para la parte cliente y `Server` para la parte servidor. Cada paquete contiene todos los elementos necesarios para que la aplicación funcione. En macOS, un paquete se lanza haciendo doble clic en él.
+
+> Los paquetes macOS generados contienen los mismos elementos que las subcarpetas Windows. Puede visualizar su contenido (**Control+clic** en el icono) para poder modificarlo.
+
+Si ha marcado la opción "Permitir la actualización automática de la aplicación cliente", se añade una subcarpeta adicional llamada *Upgrade4DClient* en la carpeta/paquete `Server`. Esta subcarpeta contiene la aplicación cliente en formato macOS y/o Windows como archivo comprimido. Esta subcarpeta contiene la aplicación cliente en formato macOS y/o Windows como archivo comprimido.
+
+#### Ubicación de los archivos web
+
+Si la parte servidor y/o la del cliente de su aplicación ejecutable se utiliza como servidor web, los archivos y carpetas requeridos por el servidor deben instalarse en ubicaciones específicas. Estos elementos son los siguientes:
+
+- archivos *cert.pem* y *key.pem* (opcional): etos archivos se utilizan para las conexiones TLS y por los comandos de encriptación de datos,
+- Carpeta raíz web por defecto (WebFolder).
+
+Los elementos deben ser instalados:
+
+- **en Windows**
+ - **Aplicación del servidor** - en la subcarpeta `Client Server executable/Server/Server Database`.
+ - **Aplicación cliente** - en la subcarpeta `Client Server executable/Client`.
+
+- **en macOS**
+ - **Aplicación del servidor** - junto al paquete de software `Server`.
+ - **Aplicación cliente** - junto al paquete de software `Cliente`.
+
+### Integrar una aplicación cliente monopuesto
+
+4D permite integrar una estructura compilada en la aplicación Cliente. Esta funcionalidad puede utilizarse, por ejemplo, para ofrecer a los usuarios una aplicación "portal", que da acceso a diferentes aplicaciones del servidor gracias al comando `OPEN DATABASE` que ejecuta un archivo `.4dlink`.
+
+Para activar esta funcionalidad, añada las llaves `DatabaseToEmbedInClientWinFolder` y/o `DatabaseToEmbedInClientMacFolder` en el archivo de configuración *buildApp*. Cuando una de estas llaves está presente, el proceso de generación de la aplicación cliente genera una aplicación monopuesto: la estructura compilada, en lugar del archivo *EnginedServer.4Dlink*, se coloca en la carpeta "Database".
+
+- Si existe una carpeta de datos por defecto en la aplicación monopuesto, se integra una licencia.
+- Si no existe una carpeta de datos por defecto en la aplicación monopuesto, ésta se ejecutará sin archivo de datos y sin licencia.
+
+El escenario básico es:
+
+1. En la caja de diálogo del Generador de aplicaciones, seleccione la opción "Generar una estructura compilada" para producir un .4DZ o un .4DC para utilizar la aplicación en modo monopuesto.
+2. En el archivo *buildApp.4DSettings* de la aplicación cliente-servidor, utilice la(s) siguiente(s) llave(s) xml para indicar la ruta de la carpeta que contiene la aplicación compilada monopuesto:
+
+- `DatabaseToEmbedInClientWinFolder`
+- `DatabaseToEmbedInClientMacFolder`
+
+3. Genere la aplicación cliente-servidor. Esto tendrá los siguientes efectos:
+
+- la carpeta de la aplicación monopuesto se copia completa dentro de la carpeta "Database" del cliente fusionado
+- el archivo *EnginedServer.4Dlink* de la carpeta "Database" no se genera
+- los archivos .4DC, .4DZ, .4DIndy de la copia de la aplicación monopuesto se renombran utilizando el nombre del cliente fusionado
+- la llave `PublishName` no se copia en el *info.plist* del cliente fusionado
+- si la aplicación monopuesto no tiene una carpeta "Data" por defecto, el cliente fusionado se ejecutará sin datos.
+
+Actualización automática de funciones del servidor 4D número de ([versión actual](#current-version), comando [`SET UPDATE FOLDER`](../commands-legacy/set-update-folder.md)...) trabaja con una aplicación de un solo usuario como con una aplicación remota estándar. Al conectarse, la aplicación monopuesto compara su llave `CurrentVers` con el rango de versión 4D Server. Si está fuera del rango, la aplicación cliente actualizada se descarga del servidor y el Updater lanza el proceso de actualización local.
+
+### Personalizar nombres de carpeta de caché cliente y/o servidor
+
+Las carpetas de caché cliente y servidor se utilizan para almacenar elementos compartidos, como recursos o componentes. Son necesarios para gestionar los intercambios entre el servidor y los clientes remotos. Las aplicaciones cliente/servidor utilizan las rutas de acceso por defecto para las carpetas de caché sistema del cliente y servidor.
+
+En algunos casos específicos, puede ser necesario personalizar los nombres de estas carpetas para implementar arquitecturas específicas (ver abajo). 4D le ofrece las llaves `ClientServerSystemFolderName` y `ServerStructureFolderName` a definir en el archivo de parámetros *buildApp*.
+
+#### Carpeta de caché cliente
+
+La personalización del nombre de la carpeta de caché del lado del cliente puede ser útil cuando su aplicación cliente se utiliza para conectarse a varios servidores fusionados que son similares pero utilizan diferentes conjuntos de datos. En este caso, para ahorrar múltiples descargas innecesarias de recursos locales idénticos, puede utilizar la misma carpeta de caché local personalizada.
+
+- Configuración por defecto (*para cada conexión a un servidor, una carpeta caché específica se descarga/actualiza*):
+
+
+
+- Utilizando la llave `ClientServerSystemFolderName` (*se utiliza una única carpeta de caché para todos los servidores*):
+
+
+
+#### Carpeta de caché del servidor
+
+La personalización del nombre de la carpeta de caché del lado del servidor es útil cuando se ejecutan varias aplicaciones servidor idénticas creadas con diferentes versiones de 4D en el mismo ordenador. Si quiere que cada servidor utilice su propio conjunto de recursos, debe personalizar la carpeta de caché del servidor.
+
+- Configuración por defecto (*las mismas aplicaciones servidor comparten la misma carpeta de caché*):
+
+
+
+- Utilizando la llave `ServerStructureFolderName` (*se utiliza una carpeta de caché dedicada para cada aplicación servidor*):
+
+
+
+## Página Plugins y componentes
+
+En esta pestaña, configurara cada [**plug-in**](Concepts/plug-ins.md), [**componente**](../Project/components.md) y [**módulo**](#deseleccionar-modulos) que utilizará en su aplicación independiente o cliente/servidor.
+
+La página lista los elementos cargados por la aplicación 4D actual:
+
+
+
+- La columna **Activa** indica los elementos que se integrarán en la aplicación generada. Todos los elementos están marcados por defecto. Para excluir un plug-in, un componente o un módulo, desmarque la casilla de selección situada junto a él.
+
+- columna **Plugins y componentes** - Muestra el nombre del plug-in/componente/módulo.
+
+- Columna **ID** - Muestra el número de identificación del elemento (si lo hay).
+
+- Columna **Tipo** - Indica el tipo de elemento: Plug-in, Componente o Módulo.
+
+### Añadiendo plug-ins o componentes
+
+Si desea integrar otros plug-ins o componentes en la aplicación ejecutable, sólo tiene que colocarlos en una carpeta **Plugins** o **Components** junto a la aplicación 4D Volume Desktop o junto a la aplicación 4D Server. El mecanismo para copiar el contenido de la carpeta de la aplicación fuente (ver [Personalizar la carpeta 4D Volume Desktop](#customizing-4d-volume-desktop-folder)) puede utilizarse para integrar todo tipo de archivo en la aplicación ejecutable.
+
+Si hay un conflicto entre dos versiones diferentes del mismo plug-in (una cargada por 4D y la otra ubicada en la carpeta de la aplicación fuente), la prioridad la tiene el plug-in instalado en la carpeta de 4D Volume Desktop/4D Server. Sin embargo, si hay dos instancias de un mismo componente, la aplicación no se abrirá.
+
+> El uso de plug-ins y/o componentes en una versión de despliegue puede requerir números de licencia.
+
+### Desmarcar módulos
+
+Un módulo es una librería de código integrada que 4D utiliza para controlar funcionalidades específicas. Si sabe que su aplicación generada no utiliza ninguna de las funcionalidades cubiertas por un módulo, puede desmarcarlo en la lista para reducir el tamaño de los archivos de su aplicación.
+
+> **Atención:** deseleccionar un módulo podría impedir que su aplicación generada funcione como se espera. Si no está 100% seguro de que un módulo nunca será llamado por su aplicación, se recomienda mantenerlo seleccionado.
+
+Los siguientes módulos opcionales pueden ser deseleccionados:
+
+- **CEF**: Librería integrada Chromium. Es necesario ejecutar [áreas Web](../FormObjects/webArea_overview.md) que utilizan el motor de renderizado integrado y [áreas 4D View Pro](../FormObjects/viewProArea_overview.md). La llamada a estas áreas cuando el CEF está deseleccionado mostrará áreas en blanco y/o generará errores.
+- **MeCab**: librería utilizada para la indexación de textos en lengua japonesa (ver este [párrafo de propiedades](../settings/database.md#support-of-mecab-japanese-version)). Si se deselecciona este módulo, los índices de texto se reconstruirán en japonés.
+
+> Si deselecciona MeCab para una aplicación en lenguaje japonés utilizada en plataformas heterogéneas, asegúrese de deseleccionarlo tanto en la compilación cliente/servidor como en la [compilación de la aplicación cliente](#build-client-application) (para la plataforma concurrente), de lo contrario se producirán fallos importantes en la aplicación.
+
+- **SpellChecker**: se utiliza para las funciones integradas de [corrección ortográfica](../FormObjects/properties_Entry.md#auto-spellcheck) y los comandos disponibles para las áreas de entrada y las áreas 4D Write Pro.
+- **4D Updater**: controla la [actualización automática](#what-is-a-clientserver-application) de las partes del cliente y es utilizado por el comando `SET UPDATE FOLDER` para [actualizaciones automáticas del servidor](#automatic-updating-of-server-or-single-user-applications).
+
+## Página licencias y certificados
+
+La página de Licencias y certificados puede utilizarse para:
+
+- configure las [licencias de despliegue](../Admin/licenses.md#deployment-licenses) que quiere integrar en su aplicación [monopuesto](#application-page) o [cliente-servidor](#clientserver-page),
+- firmar la aplicación mediante un certificado en macOS.
+
+
+
+### Licencias
+
+Esta pestaña muestra el menú **Tipo de aplicación**, que le permite definir cómo desea gestionar las licencias en la aplicación creada. Las siguientes opciones están disponibles:
+
+
+
+#### Aplicación sin licencia integrada
+
+Seleccione esta opción para crear una aplicación sin licencia de despliegue incrustada.
+
+En este caso, el usuario final tendrá que comprar e introducir una licencia *4D Desktop* o *4D Server* por usuario la primera vez que inicie la aplicación (cuando integra una licencia de despliegue, el usuario no tiene que introducir ni utilizar su propio número de licencia). Para más información, consulte la sección [**Licencias de despliegue**](../Admin/licenses.md#deployment-licenses).
+
+#### Aplicación de evaluación
+
+Seleccione esta opción para crear una versión de evaluación de su aplicación.
+
+Una aplicación de evaluación permite al usuario final ejecutar una versión completa de su aplicación autónoma o de servidor en su máquina durante un periodo de tiempo limitado, a partir del primer lanzamiento. Al final del periodo de evaluación, la aplicación ya no podrá utilizarse durante un determinado periodo de tiempo en la misma máquina.
+
+:::info
+
+Se requiere una conexión a Internet en la máquina del usuario en el primer lanzamiento de la aplicación de evaluación.
+
+:::
+
+:::note Notas
+
+- El comando [`License info`](../commands/license-info.md) permite conocer el tipo de licencia de la aplicación (colección *.attributes*) y su fecha de caducidad (objeto *.expirationDate*).
+- La llave xml BuildApplication [`EvaluationMode`](https://doc.4d.com/4Dv20R8/4D/20-R8/EvaluationMode.300-7542468.en.html) permite gestionar las versiones de evaluación.
+- El comando [`CHANGE LICENCES`](../commands-legacy/change-licenses.md) no hace nada cuando se llama desde una versión de evaluación.
+
+:::
+
+#### Aplicación que incorpora automáticamente las licencias disponibles
+
+Seleccione esta opción para crear una aplicación lista para usar (autónoma o cliente-servidor), incrustando automáticamente las [licencias de despliegue](../Admin/licenses.md#deployment-licenses) disponibles.
+
+Al crear la aplicación, 4D integrará automáticamente la(s) licencia(s) necesaria(s) que se encuentra(n) en la [Carpeta de licencias](../commands-legacy/get-4d-folder.md#licenses-folder) de la máquina. Si hay varias licencias válidas disponibles, 4D utilizará la más apropiada, en el siguiente orden:
+
+1. licencias OEM, o
+2. licencias 4D Desktop Business, o
+3. otras licencias.
+
+La pestaña de licencias muestra la lista de licencias utilizadas automáticamente para la compilación. La lista no puede modificarse.
+
+Una vez iniciada la compilación, si no se encuentra una licencia válida, se genera un error. De lo contrario, se muestra un cuadro de diálogo para enumerar la(s) aplicación(es) generada(s). La información detallada también se proporciona en el [Archivo de registro](#log-file).
+
+Una vez creada una aplicación licenciada, se incluye automáticamente un nuevo archivo de licencia de despliegue en la carpeta Licencias junto a la aplicación ejecutable (Windows) o en el paquete (macOS).
+
+#### Aplicación que integra las licencias de la siguiente lista
+
+Seleccione esta opción para crear una aplicación lista para usar (independiente o cliente-servidor), incrustando las [licencias de despliegue](../Admin/licenses.md#deployment-licenses) necesarias que usted designe específicamente.
+
+Al seleccionar esta opción, se muestra una lista de licencias en la pestaña. Debe designar los archivos que contienen sus licencias. Estos archivos se generaron o actualizaron al adquirir la licencia *4D Developer Professional* y las licencias de despliegue. Su licencia actual *4D Developer Professional* se asocia automáticamente a cada licencia de despliegue que se vaya a utilizar en la aplicación creada. Puede añadir otro número 4D Developer Professional y sus licencias asociadas.
+
+Para eliminar o añadir una licencia, utilice los botones **[+]** y **[-]** de la parte inferior de la ventana. Al hacer clic en el botón \N-[+], aparece una caja de diálogo para abrir archivos que muestra por defecto el contenido de la carpeta *Licencias* de su máquina. Para obtener más información sobre la ubicación de esta carpeta, consulte el comando [Get 4D folder](../commands-legacy/get-4d-folder.md).
+
+Una vez seleccionado un archivo, la lista indicará las características de la licencia que contiene.
+
+- **Licencia #** - número de licencia del producto
+- **Licencia** - Nombre del producto
+- **Fecha de vencimiento**: fecha de vencimiento de la licencia (si la hay)
+- **Ruta de acceso** - Ubicación en el disco
+
+Si una licencia no es válida, un mensaje le avisará.
+
+Puede designar tantos archivos válidos como desee. Al generar una aplicación ejecutable, 4D utilizará la licencia más apropiada disponible.
+
+> Se necesitan licencias "R" dedicadas para generar aplicaciones basadas en las versiones "R-release" (los números de licencia de los productos "R" empiezan por "R-4DDP").
+
+Una vez creada una aplicación licenciada, se incluye automáticamente un nuevo archivo de licencia de despliegue en la carpeta Licencias junto a la aplicación ejecutable (Windows) o en el paquete (macOS).
+
+### certificado de firma macOS
+
+El generador de aplicaciones puede firmar aplicaciones 4D fusionadas bajo macOS (aplicaciones monopuesto, componentes, 4D Server y partes cliente bajo macOS). La firma de una aplicación autoriza su ejecución por la funcionalidad Gatekeeper de macOS cuando se selecciona la opción "Mac App Store y desarrolladores identificados" (ver "Acerca de Gatekeeper" más adelante).
+
+- Marque la opción **Firmar la aplicación** para incluir la certificación en el procedimiento de generación de aplicaciones para macOS. 4D comprobará la disponibilidad de los elementos necesarios para la certificación cuando se produzca la generación:
+
+
+
+Esta opción aparece tanto en Windows como en macOS, pero sólo se tiene en cuenta en las versiones de macOS.
+
+- **Nombre del certificado**: introduzca en esta área el nombre de su certificado desarrollador validado por Apple. El nombre del certificado suele ser el nombre del certificado en el utilitario Keychain Access (la parte en rojo en el siguiente ejemplo):
+
+
+
+Para obtener un certificado de desarrollador de Apple, Inc., puede utilizar los comandos del menú de acceso al llavero o ir aquí: [http://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html](http://developer.apple.com/library/mac/#documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html).
+
+> Este certificado requiere la presencia del utilitario codesign de Apple, que se ofrece por defecto y suele estar ubicado en la carpeta "/usr/bin/". Si se produce un error, asegúrese de que este utilitario esté presente en su disco.
+
+- **Generar un certificado autofirmado** - ejecuta el "Asistente de Certificados" que permite generar un certificado autofirmado. Si no tiene un certificado de desarrollador Apple, debe suministrar un certificado autofirmado. Con este certificado, no se muestra ningún mensaje de alerta si la aplicación se despliega internamente. Si la aplicación se despliega externamente (es decir, a través de http o correo electrónico), al iniciarse macOS muestra un mensaje de alerta que indica que el desarrollador de la aplicación no está identificado. El usuario puede "forzar" la apertura de la aplicación. En el "Asistente de Certificados", asegúrese de seleccionar las opciones apropiadas:
+ 
+ 
+
+> 4D recomienda suscribirse al Programa Apple Developer Program para tener acceso a los Certificados de Desarrollador que son necesarios para notarizar las aplicaciones (ver más abajo).
+
+#### Sobre Gatekeeper
+
+Gatekeeper es una función de seguridad macOS que controla la ejecución de las aplicaciones descargadas de Internet. Si una aplicación descargada no procede del Apple Store o no está firmada, se rechaza y no se puede ser lanzada.
+
+> En las máquinas Apple Silicon, los [componentes](../Project/components.md)4D deben ser firmados. Un componente sin firmar generará un error al iniciar la aplicación ("lib4d-arm64.dylib no se puede abrir...").
+
+La opción **Firmar la aplicación** del Generador de aplicaciones de 4D le permite generar aplicaciones y componentes compatibles con esta opción por defecto.
+
+#### Sobre la notarización
+
+La notarización de las aplicaciones es muy recomendada por Apple a partir de macOS 10.14.5 (Mojave) y 10.15 (Catalina), ya que las aplicaciones no notarizadas que se despliegan a través de internet se bloquean por defecto.
+
+La notarización en sí debe ser realizada por el desarrollador y es independiente de 4D (tenga en cuenta también que requiere la instalación de Xcode). La notarización en sí debe ser realizada por el desarrollador y es independiente de 4D (tenga en cuenta también que requiere la instalación de Xcode). The 4D [built-in signing features](#macos-signing-certificate) have been adapted to meet all of Apple's requirements to allow using the Apple notary service.
+
+Para más información sobre el concepto de notarización, consulte [esta página en el sitio web para desarrolladores de Apple](https://developer.apple.com/documentation/xcode/notarizing_your_app_before_distribution/customizing_the_notarization_workflow).
+
+Para más información sobre el concepto de grapado, lea [este mensaje del foro de Apple](https://forums.developer.apple.com/forums/thread/720093).
+
+## Personalizar los iconos de una aplicación
+
+4D asocia un icono por defecto a las aplicaciones ejecutables (monopuestos y cliente-servidor). Sin embargo puede personalizar el icono para cada aplicación.
+
+- **macOs** - cuando se crea una aplicación con doble clic, 4D se encarga de la personalización del icono. Para ello, debe crear un archivo de iconos (tipo icns), antes de crear el archivo de la aplicación, y colocarlo junto a la carpeta del proyecto.
+
+> Apple, Inc. ofrece una herramienta específica para crear archivos de iconos *icns* (para obtener más información, consulte la [documentación de Apple](https://developer.apple.com/library/archive/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40012302-CH7-SW2)).
+
+Su archivo de iconos debe tener el mismo nombre que el archivo del proyecto e incluir la extensión *.icns*. 4D tiene en cuenta automáticamente este archivo cuando genera la aplicación de doble clic (el archivo *.icns* es renombrado *NomApplication.icns* y copiado en la carpeta Resources; la entrada *CFBundleFileIcon* del archivo *info.plist* es actualizada).
+
+- **Windows** - Cuando se crea una aplicación con doble clic, 4D se encarga de la personalización de su icono. Para ello, debe crear un archivo de iconos (extensión *.ico*), antes de crear el archivo de la aplicación, y colocarlo junto a la carpeta del proyecto.
+
+Su archivo de iconos debe tener el mismo nombre que el archivo del proyecto e incluir la extensión *.ico*. 4D tiene en cuenta automáticamente este archivo cuando genera la aplicación de doble clic.
+
+También puede definir las [llaves XML](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html) específicas en el archivo buildApp.4DSettings para designar cada icono a utilizar. Están disponibles las siguientes llaves:
+
+- RuntimeVLIconWinPath
+- RuntimeVLIconMacPath
+- ServerIconWinPath
+- ServerIconMacPath
+- ClientMacIconForMacPath
+- ClientWinIconForMacPath
+- ClientMacIconForWinPath
+- ClientWinIconForWinPath
+
+## Gestión de archivos de datos
+
+### Apertura del archivo de datos
+
+Cuando un usuario lanza una aplicación fusionada o una actualización (aplicaciones monopuesto o cliente/servidor), 4D intenta seleccionar un archivo de datos válido. Varias ubicaciones son examinadas sucesivamente por la aplicación.
+
+La secuencia de lanzamiento de una aplicación fusionada es:
+
+1. 4D intenta abrir el último archivo de datos abierto, [como se describe a continuación](#last-data-file-opened) (no aplicable durante el lanzamiento inicial).
+2. Si no se encuentra, 4D intenta abrir el archivo de datos en una carpeta de datos por defecto junto al archivo .4DZ en modo de sólo lectura.
+3. Si no se encuentra, 4D intenta abrir el archivo de datos estándar por defecto (mismo nombre y misma ubicación que el archivo .4DZ).
+4. Si no se encuentra, 4D muestra una caja de diálogo estándar "Abrir archivo de datos".
+
+### Último archivo de datos abierto
+
+#### Ruta del último archivo de datos
+
+Toda aplicación autónoma o servidor generada con 4D almacena la ruta de acceso del último archivo de datos abierto en la carpeta de preferencias del usuario de la aplicación.
+
+La ubicación de la carpeta de preferencias del usuario de la aplicación corresponde a la ruta devuelta por la instrucción siguiente:
+
+```4d
+userPrefs:=Get 4D folder(Carpeta 4D activa)
+```
+
+La ruta del archivo de datos se almacena en un archivo dedicado, llamado *lastDataPath.xml*.
+
+Gracias a esta arquitectura, cuando usted ofrece una actualización de su aplicación, el archivo de datos del usuario local (último archivo de datos utilizado) se abre automáticamente en el primer lanzamiento.
+
+Este mecanismo suele ser adecuado para los despliegues estándar. Sin embargo, para necesidades específicas, por ejemplo, si duplica sus aplicaciones fusionadas, es posible que desee cambiar la forma en que el archivo de datos está vinculado a la aplicación (se describe a continuación).
+
+#### Configurar el modo de enlace de los datos
+
+Con sus aplicaciones compiladas, 4D utiliza automáticamente el último archivo de datos abierto. Por defecto, la ruta del archivo de datos se almacena en la carpeta de preferencias del usuario de la aplicación y está vinculada al **nombre de la aplicación**.
+
+Esto puede ser inadecuado si se quiere duplicar una aplicación fusionada destinada a utilizar diferentes archivos de datos. Las aplicaciones duplicadas en realidad comparten la carpeta de preferencias del usuario de la aplicación y, por lo tanto, siempre utilizan el mismo archivo de datos - incluso si el archivo de datos se cambia de nombre, porque se abre el último archivo utilizado para la aplicación.
+
+Por lo tanto, 4D le permite vincular la ruta del archivo de datos a la ruta de la aplicación. En este caso, el archivo de datos se relacionará con una ruta específica y no será simplemente el último archivo abierto. Por lo tanto, 4D le permite vincular la ruta del archivo de datos a la ruta de la aplicación.
+
+Este modo le permite duplicar sus aplicaciones fusionadas sin romper el vínculo con el archivo de datos. Sin embargo, con esta opción, si el paquete de la aplicación se mueve en el disco, se pedirá al usuario un archivo de datos, ya que la ruta de la aplicación ya no coincidirá con el atributo "executablePath" (después de que el usuario haya seleccionado un archivo de datos, el archivo *lastDataPath.xml* se actualiza en consecuencia).
+
+*Duplicación cuando los datos están vinculados por nombre de la aplicación:*
+
+
+*Duplicación cuando los datos están vinculados por ruta de la aplicación:*
+
+
+Puede seleccionar el modo de vinculación de datos durante el proceso de generación de la aplicación. Puede:
+
+- Utilice la [página Aplicación](#application-page) o la [Página cliente/servidor](#clientserver-page) de la caja de diálogo del Generador de aplicaciones.
+- Utilice la llave XML **LastDataPathLookup** (aplicación monopuesto o aplicación servidor).
+
+### Definir una carpeta de datos por defecto
+
+4D le permite definir un archivo de datos por defecto en la fase de construcción de la aplicación. Cuando la aplicación se lanza por primera vez, si no se encuentra ningún archivo de datos local (ver \[secuencia de lanzamiento descrita anteriormente\](#opening-the-data-file)), el archivo de datos por defecto se abre automáticamente y de forma silenciosa en modo de sólo lectura por 4D. Cuando la aplicación se lanza por primera vez, si no se encuentra ningún archivo de datos local (ver \[secuencia de lanzamiento descrita anteriormente\](#opening-the-data-file)), el archivo de datos por defecto se abre automáticamente y de forma silenciosa en modo de sólo lectura por 4D.
+
+Más específicamente, se cubren los siguientes casos:
+
+- Evitar la visualización de la caja de diálogo "Abrir archivo de datos" de 4D al lanzar una nueva aplicación fusionada o actualizada. Puede detectar, por ejemplo al inicio, que se ha abierto el archivo de datos por defecto y así ejecutar su propio código y/o diálogos para crear o seleccionar un archivo de datos local.
+- Permitir la distribución de aplicaciones fusionadas con datos de sólo lectura (para aplicaciones de demostración, por ejemplo).
+
+Para definir y utilizar un archivo de datos por defecto:
+
+- Debe suministrar un archivo de datos por defecto (llamado "Default.4DD") y almacenarlo en una carpeta específica por defecto (llamada "Default Data") dentro de la carpeta del proyecto de la aplicación. Este archivo debe suministrarse junto con todos los demás archivos necesarios, dependiendo de la configuración del proyecto: índice (.4DIndx), blobs externos, journal, etc. Es su responsabilidad proveer un archivo de datos válido por defecto. Es su responsabilidad proveer un archivo de datos válido por defecto.
+- Cuando se genera la aplicación, la carpeta de datos por defecto se integra en la aplicación fusionada. Todos los archivos dentro de esta carpeta por defecto también están anidados.
+
+El siguiente gráfico ilustra esta funcionalidad:
+
+
+
+Cuando se detecta el archivo de datos por defecto en el primer lanzamiento, se abre silenciosamente en modo de sólo lectura, lo que le permite ejecutar toda operación personalizada que no modifique el archivo de datos en sí.
+
+## Gestión de la conexión(es) de las aplicaciones clientes
+
+La gestión de las conexiones de las aplicaciones clientes abarca los mecanismos por los que una aplicación cliente fusionada se conecta al servidor objetivo, una vez que está en su entorno de producción.
+
+### Escenario de conexión
+
+El procedimiento de conexión para las aplicaciones cliente fusionadas admite los casos en los que el servidor dedicado no está disponible. El escenario de inicio de una aplicación cliente 4D es el siguiente:
+
+1. Si la información de conexión válida se encuentra almacenada en el archivo "EnginedServer.4DLink" dentro de la aplicación cliente, la aplicación cliente se conecta a la dirección del servidor especificada.\
+ O\
+ La aplicación cliente intenta conectarse al servidor utilizando el servicio de descubrimiento (basado en el nombre del servidor, transmitido en la misma subred).\
+ O\
+ La aplicación cliente intenta conectarse al servidor utilizando el servicio de descubrimiento (basado en el nombre del servidor, transmitido en la misma subred).
+ O
+ La aplicación cliente intenta conectarse al servidor utilizando el servicio de descubrimiento (basado en el nombre del servidor, transmitido en la misma subred).
+
+2. Si esto falla, la aplicación cliente intenta conectarse al servidor utilizando la información almacenada en la carpeta de preferencias del usuario de la aplicación (archivo "lastServer.xml", ver último paso).
+
+3. Si esto falla, la aplicación cliente muestra una caja de diálogo de error de conexión.
+
+- Si el usuario hace clic en el botón **Seleccionar...** (cuando lo permite el desarrollador 4D al momento de la generación, ver más abajo), se muestra la caja de diálogo estándar "Conexión al servidor".
+- Si el usuario hace clic en el botón **Salir**, la aplicación cliente se cierra.
+
+4. Si la conexión tiene éxito, la aplicación cliente guarda esta información de conexión en la carpeta de preferencias usuario de la aplicación para su uso futuro.
+
+Todo el procedimiento se describe en el siguiente diagrama:
+
+
+
+### Almacenando la última ruta del servidor
+
+La última ruta servidor utilizada y validada se guarda automáticamente en un archivo llamado "lastServer.xml" en la carpeta de preferencias usuario de la aplicación. Esta carpeta se guarda en la siguiente ubicación:
+
+```4d
+userPrefs:=Get 4D folder(Carpeta 4D activa)
+```
+
+Este mecanismo aborda el caso en el que el servidor objetivo primario esté disponible temporalmente por alguna razón (modo mantenimiento, por ejemplo). Cuando se produce este caso por primera vez, se muestra la caja de diálogo de selección de servidor (si está permitido, ver más adelante) y el usuario puede seleccionar manualmente un servidor alternativo, cuya ruta se guarda si la conexión tiene éxito. Toda indisponibilidad posterior se gestionaría automáticamente a través de la información de la ruta "lastServer.xml".
+
+> - Cuando las aplicaciones cliente no pueden beneficiarse permanentemente del servicio de descubrimiento, por ejemplo debido a la configuración de la red, se recomienda que el desarrollador indique un nombre de host en el momento de la generación utilizando la llave [IPAddress](https://doc.4d.com/4Dv20/4D/20/IPAddress.300-6335763.en.html) en el archivo "BuildApp.4DSettings". El mecanismo aborda los casos de indisponibilidad temporal.
+> - Presionar la tecla **Alt/Opción** al inicio para mostrar la caja de diálogo de selección del servidor sigue siendo soportado en todos los casos.
+
+### Disponibilidad de la caja de diálogo de selección del servidor en caso de error
+
+Puede elegir si mostrar o no la caja de diálogo estándar de selección de servidor en las aplicaciones cliente fusionadas cuando no se puede acceder al servidor. La configuración depende del valor de la [ServerSelectionAllowed](https://doc.4d.com/4Dv20/4D/20/ServerSelectionAllowed.300-6335767.en.html) La llave XML en la máquina donde se generó la aplicación:
+
+- **Visualización de un mensaje de error sin poder acceder a la caja de diálogo de selección del servidor**. Funcionamiento por defecto. La aplicación solo puede cerrarse.
+ `ServerSelectionAllowed`: **False** o llave omitida
+ 
+
+- **Visualización de un mensaje de error con acceso posible a la caja de diálogo de selección del servidor**. El usuario puede acceder a la ventana de selección del servidor haciendo clic en el botón **Seleccionar...**.
+ `ServerSelectionAllowed`: **True**
+ 
+ 
+
+## Actualización automática de aplicaciones servidor o monopuesto
+
+En principio, la actualización de las aplicaciones servidor o de las aplicaciones monopuesto fusionadas requiere la intervención del usuario (o la programación de rutinas de sistema personalizadas): cada vez que esté disponible una nueva versión de la aplicación fusionada, hay que salir de la aplicación en producción y sustituir manualmente los archivos antiguos por los nuevos; a continuación, reiniciar la aplicación y seleccionar el archivo de datos actual.
+
+Puede automatizar este procedimiento en gran medida utilizando los siguientes comandos del lenguaje: [`SET UPDATE FOLDER`](../commands-legacy/set-update-folder.md), [`RESTART 4D`](../commands-legacy/restart-4d.md), y también [`Last update log path`](../commands-legacy/last-update-log-path.md) para operaciones de monitoreo. La idea es implementar una función en su aplicación 4D que active la secuencia de actualización automática descrita a continuación. Puede ser un comando de menú o un proceso que se ejecuta en segundo plano y comprueba a intervalos regulares la presencia de un archivo en un servidor.
+
+> También dispone de llaves XML para elevar los privilegios de instalación y poder utilizar archivos protegidos en Windows (consulte el manual [4D XML Keys BuildApplication](https://doc.4d.com/4Dv20/4D/20/4D-XML-Keys-BuildApplication.100-6335734.en.html)).
+
+Este es el escenario para actualizar un servidor o una aplicación unipersonal fusionada:
+
+1. Se transfiere, por ejemplo utilizando un servidor HTTP, la nueva versión de la aplicación servidor o la aplicación monopuesto fusionada a la máquina en producción.
+2. En la aplicación en producción, se llama al comando `SET UPDATE FOLDER`: este comando designa la ubicación de la carpeta donde se encuentra la actualización "pendiente" de la aplicación actual. Opcionalmente, puede copiar en esta carpeta los elementos personalizados de la versión en producción (archivos usuario).
+3. En la aplicación en producción, llame al comando `RESTART 4D`: este comando desencadena automáticamente la ejecución de un programa utilitario llamado "updater" que sale de la aplicación actual, la reemplaza utilizando la actualización "pendiente" si se especifica una y reinicia la aplicación con el archivo de datos actual. La versión anterior ha sido renombrada.
+
+> Esta secuencia es compatible con las aplicaciones servidor de Windows que se ejecutan como servicio.
+
+### Historial de actualización
+
+El procedimiento de instalación genera un archivo de registro en el que se detallan las operaciones de actualización de las aplicaciones fusionadas (cliente, servidor o monopuesto) en los equipos de destino. Este archivo es útil para analizar cualquier error que se produzca durante el proceso de instalación.
+
+El historial de actualización se denomina `YYYY-MM-DD_HH-MM-SS_log_X.txt`, por ejemplo, `2021-08-25_14-23-00_log_1.txt` para un archivo creado el 25 de agosto de 2021 a las 14:23.
+
+Este archivo se crea en la carpeta de la aplicación "Updater", dentro de la carpeta de usuario del sistema. Puede encontrar la ubicación de este archivo en cualquier momento utilizando el comando [`Last update log path`](../commands-legacy/last-update-log-path.md).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/clientServer.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/clientServer.md
new file mode 100644
index 00000000000000..3fb97a773f2ad5
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/clientServer.md
@@ -0,0 +1,177 @@
+---
+id: clientServer
+title: Gestión Cliente/Servidor
+---
+
+Las aplicaciones 4D Desktop pueden utilizarse en una configuración Cliente/Servidor, ya sea como aplicaciones combinadas cliente/servidor o como proyectos remotos.
+
+- Las **aplicaciones cliente/servidor fusionadas** son generadas por el [gestor de creación de aplicaciones](building.md#clientserver-page). Se utilizan para el despliegue de aplicaciones.
+
+- Los **proyectos remotos** son archivos [.4DProject](Project/architecture.md) abiertos por 4D Server y a los que se accede con 4D en modo remoto. El servidor envía una versión .4dz del proyecto ([formato comprimido](building.md#build-compiled-structure)) al 4D remoto, por lo que los archivos de estructura son de sólo lectura. Esta configuración se suele utilizar para probar la aplicación.
+
+
+
+> La conexión a un proyecto remoto desde **la misma máquina que 4D Server** permite modificar los archivos del proyecto. Esta [funcionalidad específica](#using-4d-and-4d-server-on-the-same-machine) permite desarrollar una aplicación cliente/servidor en el mismo contexto del despliegue.
+
+## Abrir una aplicación cliente/servidor fusionada
+
+Una aplicación cliente/servidor fusionada se personaliza y su puesta en marcha se simplifica:
+
+- Para lanzar la parte del servidor, el usuario simplemente hace doble clic en la aplicación servidor. No es necesario seleccionar el archivo proyecto.
+- Para lanzar la parte cliente, el usuario simplemente hace doble clic en la aplicación cliente, que se conecta directamente a la aplicación servidor.
+
+Estos principios se detallan en la página [Creación de aplicaciones](building.md#what-is-a-clientserver-application).
+
+## Abrir un proyecto remoto
+
+La primera vez que se conecte a un proyecto 4D Server a través de un 4D remoto, normalmente utilizará la caja de diálogo de conexión estándar. Luego, podrá conectarse directamente utilizando el menú **Abrir proyectos recientes** o un archivo de acceso directo 4DLink.
+
+Para conectarse remotamente a un proyecto 4D Server:
+
+1. Haga una de las siguientes cosas:
+ - Seleccione **Conectar a 4D Server** en la caja de diálogo del asistente de bienvenida
+ - Seleccione **Abrir/Proyecto remoto...** desde el menú **Archivo** o del botón**Abrir** de la barra de herramientas.
+
+Aparece el diálogo de conexión de 4D Server. Este diálogo tiene tres pestañas: **Reciente**, **Disponible** y **Personalizado**.
+
+Si 4D Server está conectado a la misma subred que el 4D remoto, seleccione **Disponible**. 4D Server incluye un sistema de difusión integrado que, por defecto, publica el nombre de los proyectos 4D Server disponibles en la red. La lista se ordena por orden de aparición y se actualiza dinámicamente.
+
+
+
+Para conectarse a un servidor de la lista, haga doble clic en su nombre o selecciónelo y presione el botón **Aceptar**.
+
+Si el proyecto publicado no aparece en la lista **Disponible**, seleccione **Personalizado**. La página Personalizada le permite conectarse a un servidor publicado en la red utilizando su dirección de red y asignándole un nombre personalizado.
+
+
+
+- **Nombre del proyecto**: define el nombre local del proyecto 4D Server. Este nombre se utilizará en la página **Reciente** cuando se haga referencia al proyecto.
+- **Dirección red**: la dirección IP de la máquina donde se lanzó el 4D Server.
+ - Si dos servidores se ejecutan simultáneamente en la misma máquina, la dirección IP debe ir seguida de dos puntos y del número de puerto, por ejemplo: `192.168.92.104:19814`.
+ - Por defecto, el puerto de publicación de un 4D Server es el 19813. Este número puede modificarse en los parámetros del proyecto.
+
+> La opción **Activar modo desarrollo** abre la conexión remota en un modo especial de lectura/escritura y requiere acceder a la carpeta del proyecto desde el 4D remoto (opción de compatibilidad).
+
+Una vez que esta página asigna un servidor, al hacer clic en el botón **Aceptar** podrá conectarse al servidor.
+
+Una vez establecida la conexión con el servidor, el proyecto remoto aparecerá en la pestaña **Recientes**.
+
+### Actualización de los archivos del proyecto en el servidor
+
+4D Server crea y envía automáticamente a las máquinas remotas una versión [.4dz](building.md#build-compiled-structure) del archivo proyecto *.4DProject* (no comprimido) en modo interpretado.
+
+- Una versión .4dz actualizada del proyecto se produce automáticamente cuando es necesario, \*es decir, \*cuando el proyecto ha sido modificado y recargado por 4D Server. El proyecto se recarga:
+ - automáticamente, cuando la ventana de la aplicación 4D Server pasa al frente del sistema operativo o cuando la aplicación 4D en la misma máquina guarda una modificación (ver abajo).
+ - cuando se ejecuta el comando `RELOAD PROJECT`. Llamar a este comando es necesario cuando, por ejemplo, se ha sacado una nueva versión del proyecto desde la plataforma de control de fuentes.
+
+### Actualización de los archivos de proyecto en las máquinas remotas
+
+Cuando se ha producido una versión .4dz actualizada del proyecto en 4D Server, las máquinas 4D remotas conectadas deben cerrar la sesión y volver a conectarse a 4D Server para poder beneficiarse de la versión actualizada.
+
+## Utilizar 4D y 4D Server en la misma máquina
+
+Cuando 4D se conecta a un 4D Server en la misma máquina, la aplicación se comporta como 4D en modo monopuesto y el entorno de diseño le permite editar los archivos del proyecto. Esta funcionalidad le permite desarrollar una aplicación cliente/servidor en el mismo contexto de despliegue.
+
+> When 4D connects to a 4D Server on the same machine, the **development mode** is automatically activated, whatever the [Activate development mode](#opening-a-remote-project) option status.
+
+Cada vez que 4D realiza una acción **Guardar todo** desde el entorno de diseño (explícitamente desde el menú **Archivo** o implícitamente al cambiar al modo aplicación, por ejemplo), 4D Server recarga sincronizadamente los archivos del proyecto. 4D espera a que 4D Server termine de recargar los archivos del proyecto antes de continuar.
+
+Sin embargo, debe prestar atención a las siguientes diferencias de comportamiento en comparación con [la arquitectura proyecto estándar](Project/architecture.md):
+
+- la carpeta userPreferences.\{username\} utilizada por 4D no es la misma carpeta utilizada por 4D Server en la carpeta proyecto. En su lugar, es una carpeta dedicada, llamada "userPreferences", almacenada en la carpeta sistema del proyecto (es decir, la misma ubicación que al abrir un proyecto .4dz).
+- la carpeta utilizada por 4D para los datos derivados no es la carpeta llamada "DerivedData" en la carpeta proyecto. En su lugar, se trata de una carpeta dedicada llamada "DerivedDataRemote" situada en la carpeta del sistema del proyecto.
+- el archivo catalog.4DCatalog no es editado por 4D sino por 4D Server. La información del catálogo se sincroniza mediante peticiones cliente/servidor
+- el archivo directory.json no es editado por 4D sino por 4D Server. La información del directorio se sincroniza mediante peticiones cliente/servidor
+- 4D utiliza sus propios componentes internos y plug-ins en lugar de los de 4D Server.
+
+> No se recomienda instalar plug-ins o componentes a nivel de la aplicación 4D o 4D Server.
+
+## Sesiones de usuarios remotos
+
+En el servidor, el comando [`Session`](../commands/session.md) devuelve un objeto `session` que describe la sesión de usuario actual. Este objeto se maneja a través de las funciones y propiedades de la [clase `Session`](../API/SessionClass.md).
+
+:::tip Entradas de blog relacionadas
+
+[Objeto sesión remota 4D con conexión cliente/servidor y procedimiento almacenado](https://blog.4d.com/new-4D-remote-session-object-with-client-server-connection-and-stored-procedure).
+
+:::
+
+### Utilización
+
+The `session` object allows you to handle information and privileges for the remote user session.
+
+Puede compartir datos entre todos los procesos de la sesión del usuario utilizando el objeto compartido [`session.storage`](../API/SessionClass.md#storage). Por ejemplo, puede iniciar un procedimiento de autenticación y verificación de usuario cuando un cliente se conecta al servidor, que involucra ingresar un código enviado por correo electrónico o SMS en la aplicación. A continuación, añada la información de usuario al almacenamiento de sesión, permitiendo al servidor identificar al usuario. De este modo, el servidor 4D puede acceder a la información del usuario para todos los procesos del cliente, lo que permite escribir código personalizado según el rol del usuario.
+
+You can also assign privileges to a remote user session to control access when the session comes from Qodly pages running in web areas.
+
+### Disponibilidad
+
+El objeto `session` del usuario remoto está disponible en:
+
+- Métodos proyecto que tienen el atributo [Ejecutar en el Servidor](../Project/code-overview.md#execute-on-server) (se ejecutan en el proceso "twinned" del proceso cliente),
+- Triggers,
+- ORDA [funciones del modelo de datos](../ORDA/ordaClasses.md) (excepto las declaradas con la palabra clave [`local`](../ORDA/ordaClasses.md#local-functions),
+- Los métodos base `On Server Open Connection` y `On Server Shutdown Connection` de la base de datos.
+
+:::info
+
+Todos los procedimientos almacenados en el servidor comparten la misma sesión de usuario virtual. Para más información, consulte [esta página en doc.4d.com](https://doc.4d.com/4Dv20/4D/20/Stored-Procedures.300-6330553.en.html).
+
+:::
+
+### Sharing the session with Qodly pages in Web areas
+
+Remote client sessions can be used to handle Client/Server applications where [Qodly pages](https://developer.4d.com/qodly/4DQodlyPro/pageLoaders/pageLoaderOverview) are used for the interface, running on remote machines. With this configuration, your applications have modern CSS-based web interfaces but still benefit from the power and simplicity of integrated client/server development. In such applications, Qodly pages are executed within standard 4D [Web areas](../FormObjects/webArea_overview.md).
+
+To manage this configuration, you need to use remote client sessions. Actually, requests coming from both the remote 4D application and its Qodly pages loaded in Web areas need to work inside a single user session. You just have to share the same session between the remote client and its web pages so that you can have the same [session storage](../API/SessionClass.md#storage) and client license, whatever the request origin.
+
+Note that [privileges](../ORDA/privileges.md) should be set in the session before executing a web request from a Web area, so that the user automatically gets their privileges for web access (see example). Keep in mind that privileges only apply to requests coming from the web, not to the 4D code executed in a standard remote session.
+
+Shared sessions are handled through [OTP tokens](../WebServer/sessions.md#session-token-otp). After you created an OTP token on the server for the user session, you add the token (through the `$4DSID` parameter value) to web requests sent from web areas containing Qodly pages so that the user session on the server is identified and shared. On the web server side, if a web request contains an *OTP id* in the $4DSID parameter, the session corresponding to this OTP token is used.
+
+:::tip Entrada de blog relacionada
+
+[Share your 4D remote client session with web accesses](https://blog.4d.com/share-your-4d-remote-client-session-with-web-accesses)
+
+:::
+
+#### Ejemplo
+
+```4d
+var $otp : Text
+
+// Some privileges are put in the remote user session on the server for a further web access
+ds.resetPrivileges("basic")
+
+// An OTP is created on the server for this remote client session
+$otp:=ds.getOTP()
+
+
+// The user has already the required privileges for a web access
+// and the same session is shared between this remote user and the web Qodly app
+WA OPEN URL(*; "Welcome"; "http://127.0.0.1/$lib/renderer/?w=People&$4DSID="+$otp)
+
+```
+
+*resetPrivileges()* function in the Datastore class:
+
+```4d
+// This function is run on the server
+// and puts some privileges in the session for a further web access
+
+Function resetPrivileges($priv : Text)
+
+ Session.clearPrivileges()
+ Session.setPrivileges($priv)
+```
+
+*getOTP()* function in the Datastore class:
+
+```4d
+// This function is run on the server
+// and generates an OTP able to retrieve this remote user session
+
+Function getOTP(): Text
+
+ return Session.createOTP()
+
+```
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/labels.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/labels.md
new file mode 100644
index 00000000000000..9f39573be56933
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/labels.md
@@ -0,0 +1,247 @@
+---
+id: labels
+title: Etiquetas
+---
+
+El editor de etiquetas de 4D ofrece una forma práctica de imprimir una amplia variedad de etiquetas. Con ella, puede hacer lo siguiente:
+
+- Diseñe etiquetas para envíos postales, carpetas y fichas de archivo, y para muchas otras necesidades,
+- crear e insertar elementos decorativos en un modelo de etiquetas,
+- definir la fuente, el tamaño y el estilo de la fuente a utilizar para las etiquetas,
+- determinar el número de etiquetas a lo largo y a lo ancho de cada página,
+- Especifique cuántas etiquetas imprimir por registro,
+- Especifique los márgenes de la página de etiquetas,
+- designar un método a ejecutar al imprimir cada etiqueta o registro,
+- Crea una vista previa e imprime las etiquetas.
+
+:::note
+
+Las etiquetas también se pueden crear usando el [Editor de formularios](../FormEditor/formEditor.md). Utilice el editor de formularios para diseñar etiquetas especializadas que incluyan variables o aproveche las herramientas de dibujo disponibles en el editor de formularios e imprímalas utilizando el editor de etiquetas o el comando [`PRINT LABEL`](../commands-legacy/print-label.md).
+
+:::
+
+El editor de etiquetas permite crear, formatear e imprimir las etiquetas. El editor de etiquetas contiene los parámetros para diseñar etiquetas y colocarlas en el papel de etiquetas. Por ejemplo, al producir etiquetas de correo, es posible que desee un diseño de etiqueta que incluya el nombre y apellidos de la persona en la primera línea, la dirección postal en la segunda línea, etc. Como parte del diseño, el editor de etiquetas le permite especificar el número de etiquetas de la página y los márgenes del papel de etiquetas para que el texto de las etiquetas quede centrado dentro de las mismas.
+Cuando crea un diseño de etiqueta satisfactorio, puede guardarlo en disco para poder reutilizarlo.
+
+Para abrir el editor de etiquetas:
+
+- En el entorno Diseño, elija **Etiquetas...** en el menú **Herramientas** o en el menú asociado al botón "Herramientas" en la barra de herramientas de 4D.
+ O
+- En una aplicación, llame al comando [`PRINT LABEL`](../commands-legacy/print-label.md).
+
+
+
+Utilice la página Etiqueta para especificar el contenido de la etiqueta y la página Diseño para definir el tamaño y la posición de las etiquetas en la página.
+
+
+
+## Página Etiqueta
+
+La página Etiqueta contiene varias áreas con opciones para diseñar y dar formato a las etiquetas.
+
+### Lista de campos
+
+Muestra los nombres de los campos de la tabla actual en una lista jerárquica. Si esta tabla está relacionada con otras tablas, los campos de clave externa tienen un signo más (en Windows) o una flecha (en macOS). Puede visualizar los campos de la tabla relacionada expandiendo los campos relacionados. Los campos de la tabla relacionada están indentados. Para utilizar un campo de esta lista en la plantilla de etiquetas, basta con arrastrarlo a la zona de vista previa de etiquetas situada a la derecha de la lista.
+
+:::note Notas
+
+- Sólo las tablas y los campos visibles aparecen en el editor de etiquetas.
+- Los campos de [tipo Objeto](../Concepts/dt_object.md) no son compatibles con el editor de etiquetas.
+
+:::
+
+El área de búsqueda le permite limitar la lista de campos mostrados a aquellos que contengan la cadena de caracteres introducida:
+
+
+
+### Vista previa de etiqueta
+
+Utilice esta área para diseñar su zona de etiquetas colocando y posicionando todos los elementos que desee incluir en su etiqueta. El rectángulo blanco representa una sola etiqueta (su tamaño se configura en la página [Diseño](#layout-page)).
+
+- Puede arrastrar los campos a la etiqueta.
+- También puede concatenar dos campos soltando el segundo campo sobre el primero. Se separan automáticamente con un espacio.
+ 
+ Si mantiene presionada la tecla **Mayús**, se separan con un retorno de carro. Esto le permite crear, por ejemplo, etiquetas de direcciones utilizando varios campos superpuestos (Dirección1, Dirección2, etc.), sin producir una línea vacía cuando una dirección sólo requiere un campo.
+- Puede añadir una fórmula a la etiqueta seleccionando la herramienta **Fórmula**  (o eligiendo **Herramienta>Fórmula** en el menú contextual) y dibujando un área. Aparecerá el **Editor de fórmulas**:
+ 
+ Por ejemplo, puede aplicar un formato a un campo utilizando el comando [`String`](../commands/string.md):
+
+
+
+:::note
+
+Tenga en cuenta que sólo puede introducir métodos "permitidos" para la base de datos en el Editor de fórmulas. Los métodos permitidos dependen de los [parámetros del proyecto](../settings/security.md#options) y del comando [`SET ALLOWED METHODS`](../commands/set-allowed-methods.md).
+
+:::
+
+- Puedes arrastrar y soltar archivos imagen, así como archivos de etiquetas (archivos ".4lbp") desde el escritorio del sistema operativo.
+
+- Para modificar el área, haga doble clic en el contenido para pasar al modo edición. Al hacer doble clic en campos o fórmulas, aparece el **Editor de fórmulas**, que permite eliminar o modificar elementos:
+ 
+
+### Formulario a utilizar
+
+Esta lista desplegable permite definir un formulario tabla como modelo de etiqueta. El formulario elegido debe estar especialmente adaptado a la creación de etiquetas.
+En este caso, el editor de etiquetas está parcialmente deshabilitado: sólo las funciones de la [página de diseño](#layout-page) pueden ser usadas — para permitirte configurar la página basada en el formulario. La imagen del formulario seleccionado se muestra en el área de previsualización de etiquetas.
+Cuando se utiliza un formulario, 4D ejecuta cualquier método de formulario u objeto asociado a él. Al usar esta opción, también puede designar un método proyecto para ejecutar para cada registro o etiqueta y luego asignar variables (ver [este ejemplo](#printing-labels-using-forms-and-methods-example) más abajo). Si desea crear sus etiquetas utilizando el propio editor, deberá elegir la opción **Sin formulario**.
+
+:::note Notas
+
+- Puede restringir los formularios listados que aparecen en este menú mediante un [archivo JSON específico](#controlling-available-forms-and-methods).
+- Si la base no contiene ningún formulario tabla, este menú no se muestra.
+
+:::
+
+### Comandos del área gráfica
+
+El área gráfica del editor incluye tanto una barra de herramientas como un menú contextual que puede utilizar para diseñar su plantilla de etiquetas.
+
+La parte izquierda de la barra de herramientas incluye comandos para seleccionar e insertar objetos. También puede acceder a estas herramientas mediante el comando **Herramienta>** del menú contextual del área.
+
+| Icono | Nombre de la herramienta | Descripción |
+| ----------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+|  | Selección | Haga clic en un solo objeto o dibuje un cuadro de selección alrededor de varios objetos. Para una selección de objetos no adyacentes, mantenga presionada **Mayús** y haga clic en cada objeto que desee seleccionar. |
+|  | Creación de línea | |
+|  | Creación rectangular | Para creación de rectángulo o rectángulo redondeado. |
+|  | Creación de círculo | |
+|  | Inserción de texto | Dibuja un rectángulo e introduce texto en su interior. Puede editar toda área de texto, incluidas las que contienen referencias a campos, haciendo doble clic en ellas. |
+|  | Inserción de fórmula | Dibuje un rectángulo para mostrar el **Editor de fórmulas**, donde puede definir el contenido dinámico de las etiquetas (campos y fórmulas). |
+
+Hay atajos disponibles para mover o redimensionar objetos con mayor precisión utilizando las teclas de flecha del teclado:
+
+- Las teclas de flecha del teclado mueven la selección de objetos de 1 píxel a la vez.
+- **Mayús** + teclas de flecha mueven la selección de objetos 10 píxeles a la vez.
+- **Ctrl** + teclas de flecha agrandan o reducen la selección de objetos en 1 píxel.
+- **Ctrl** + **Maj** + teclas de flecha amplían o reducen la selección de objetos en 10 píxeles.
+
+El lado derecho de la barra de herramientas contiene comandos utilizados para modificar elementos de la plantilla de etiqueta:
+
+| Icono | Nombre de la herramienta | Descripción |
+| ------------------------------------------ | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+|  | Color de relleno | todos los iconos de color muestran el color seleccionado |
+|  | Color de línea | |
+|  | Peso lineal | |
+|  | Menú Fuente | Define la fuente y su tamaño, así como el estilo, el color y la alineación del texto para los bloques de texto seleccionados. |
+|  | Alineación y distribución | Deben seleccionarse dos o más objetos para que las opciones de alineación estén disponibles. "Repartir" objetos significa definir automáticamente los intervalos horizontales o verticales entre al menos tres objetos, de modo que sean idénticos. El intervalo resultante es una media de todos los existentes en la selección. |
+|  | Nivel de los objetos | Mueve los objetos a la parte frontal o atrás, o mueve uno o más objetos hacia arriba o hacia abajo de un nivel. |
+
+## Página Diseño
+
+The Layout page contains controls for printing labels based on the requirements of your current print settings.
+
+
+
+- **Labels Order**: Specifies whether labels should be printed in the direction of the rows or the columns.
+- **Rows** and **Columns**: Set the number of labels to be printed by "row" and by "column" on each sheet. These settings determine the label size when the "Automatic resizing" option is enabled.
+- **Labels per record**: Sets the number of copies to print for each label (copies are printed consecutively).
+- **Print Setup...**: Sets the format of the page on which the sheet of labels will be printed. When you click this button, the setup dialog box for the printer selected in your system appears. By default, the sheet of labels is generated based on an A4 page in portrait mode.
+ **Note:** The sheet created by the editor is based on the logical page of the printer, i.e. the physical page (for instance, an A4 page) less the margins that cannot be used on each side of the sheet. The physical margins of the page are shown by blue lines in the preview area.
+- **Unit**: Changes the units in which you specify your label and label page measurements. Puede utilizar puntos, milímetros, centímetros o pulgadas.
+- **Automatic resizing**: Means that 4D automatically calculates the size of the labels (i.e. the Width and Height parameters) according to the values set in all the other parameters. When this option is checked, the label size is adjusted each time you modify a page parameter. Los parámetros Ancho y Alto ya no pueden ajustarse manualmente.
+- **Width** and **Height**: Sets the height and width of each label manually. They cannot be edited when the **Automatic resizing** option is checked.
+- **Márgenes** (Superior, Derecho, Izquierdo, Inferior): define los márgenes de su hoja. These margins are symbolized by blue lines in the preview area. Clicking on **Use printer margins** replicates, in the preview area, the margin information provided by the selected printer (these values can be modified).
+- **Gaps**: Set the amount of vertical and/or horizontal space between label rows and columns.
+- **Method**: Lets you trigger a specific method that will be run at print time. For example, you can execute a method that posts the date and time that each label was printed. This feature is also useful when you print labels using a dedicated table form, in which case you can fill variables from a method.
+ To be eligible for label processing, a project method must comply with the following settings:
+ - debe ser "permitido" para la base de datos (los métodos permitidos dependen de los [parámetros del proyecto](../settings/security.md#options) y el comando [`SET ALLOWED METHODS`](../commands/set-allowed-methods.md), de lo contrario no se mostrará en el menú **Aplicación**.
+ - debe tener la opción [Compartido por componentes y base de datos local](../Project/code-overview.md#shared-by-components-and-host-database).
+ Ver también [este ejemplo](#printing-labels-using-forms-and-methods-example) a continuación.
+
+:::note
+
+Para necesidades avanzadas, puede restringir la lista de métodos disponibles utilizando un [archivo json específico](#controlling-available-forms-and-methods).
+The **For each: Record or Label** options are used to specify whether to run the method once per label or once per record. This control has meaning only if you are printing more than one copy of each label and you are also executing a method at print time.
+
+:::
+
+- **Layout preview**: Provides a reduced view of how an entire page of labels will look, based on the dimensions you enter in the Label editor. The page preview also reflects the paper size selected in the Print Setup dialog box. También puede utilizar esta zona para designar la primera etiqueta de la página que se va a imprimir (esta opción sólo afecta a la primera hoja en caso de impresión multipágina). This can be useful, for example, when you want to print on a sheet of adhesive labels, part of which has already been used. You can also select the first label on the page to be printed by clicking on it:
+
+
+
+## Impresión de etiquetas mediante formularios y métodos (ejemplo)
+
+You can use dedicated table forms and project methods to print labels with calculated variables. This simple example shows how to configure the different elements.
+
+1. En un formulario tabla dedicado, añada su(s) campo(s) de etiqueta y su(s) variable(s).
+ Here, in a table form named "label", we added the *myVar* variable:
+ 
+
+2. Create a `setMyVar` project method with the following code:
+
+```4d
+ var myVar+=1
+```
+
+3. Defina el método proyecto como ["Compartido por los componentes y la base de datos local"](../Project/code-overview.md#shared-by-components-and-host-database).
+
+4. Before displaying the Label editor, make sure the project method is allowed by executing this code:
+
+```4d
+ ARRAY TEXT($methods;1)
+ $methods{1}:="setMyVar"
+ SET ALLOWED METHODS($methods)
+```
+
+5. Open the Label editor and use your form:
+ 
+
+6. In the Layout page, select the method:
+ 
+
+Then you can print your labels:
+
+
+## Control de los formularios y métodos disponibles
+
+The Label editor includes an advanced feature allowing you to restrict which project forms and methods (within "allowed" methods) can be selected in the dialog box:
+
+- en el menú **Formulario a utilizar** de la página "Etiqueta" y/o
+- en el menú **Aplicar (método)** de la página "Diseño".
+
+1. Crea un archivo JSON llamado **labels.json** y ponlo en la [carpeta de recursos](../Project/architecture.md#resources) del proyecto.
+2. En este archivo, añada los nombres de los formularios y/o métodos proyecto que desea poder seleccionar en los menús del editor de etiquetas.
+
+El contenido del archivo **labels.json** debe ser similar a:
+
+```json
+[
+ {"tableId":2,"forms":[],"methods":["myMethod1","myMethod2"]},
+ {"tableId":1,"forms":["Sample Label 1","Sample Label 2"],"methods":[]}
+]
+```
+
+Si no se ha definido ningún archivo **labels.json** entonces no se aplica ningún filtro.
+
+## Gestión de archivos de etiquetas
+
+4D le permite guardar cada modelo de etiquetas en un archivo que podrá abrir posteriormente desde el asistente. Si guarda sus diseños de etiquetas, podrá crear una biblioteca de etiquetas adaptada a sus necesidades específicas. Cada diseño de etiqueta almacena los ajustes definidos en las páginas Etiqueta y Diseño.
+
+Puede arrastrar y soltar archivos de etiquetas desde el escritorio al área de diseño de etiquetas.
+
+Los diseños de etiquetas se gestionan mediante los botones **Cargar** y **Guardar** de la barra de herramientas.
+
+- Para cargar un diseño de etiqueta, haga clic en el botón **Cargar** y designe el diseño que desea cargar mediante el cuadro de diálogo Abrir archivo (si ya existe un diseño de etiqueta en el asistente, 4D lo sustituye por el que ha cargado).
+- Para guardar un diseño de etiqueta, haga clic en el botón **Guardar** e indique el nombre y la ubicación del diseño que desea crear.
+
+### Formato del archivo
+
+La extensión de archivo de las etiquetas 4D guardadas por el asistente es ".4lbp". Tenga en cuenta que este formato es abierto, ya que está escrito internamente en XML.
+
+### Precargando archivos de etiqueta
+
+El editor de etiquetas le permite almacenar archivos de etiquetas dentro de su aplicación, de forma que los diseños de etiquetas puedan ser seleccionados y abiertos por el usuario directamente mediante el botón **Cargar**.
+
+Para ello, basta con crear una carpeta llamada `Labels` en la [carpeta Resources](../Project/architecture.md#resources) del proyecto y copiar en ella los archivos de etiquetas:
+
+
+
+:::note
+
+Se admiten tanto los archivos ".4lbp" estándar como los generados por el asistente anterior (".4lb").
+
+:::
+
+Cuando se inicia el Asistente de etiquetas, si se detecta esta carpeta y contiene archivos de etiquetas válidos, se añade un icono emergente al botón **Cargar**. Los modelos de etiquetas pueden seleccionarse a través de una línea de menú:
+
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/user-settings.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/user-settings.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Desktop/user-settings.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Desktop/user-settings.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Develop-legacy/transactions.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop-legacy/transactions.md
new file mode 100644
index 00000000000000..84adbd9996a1cd
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop-legacy/transactions.md
@@ -0,0 +1,222 @@
+---
+id: transactions
+title: Transactions
+---
+
+## Descripción
+
+Las transacciones son una serie de modificaciones de datos relacionadas que se realizan en una base de datos o almacén de datos dentro de un [proceso](./processes.md). Una transacción no se guarda en una base de datos de forma permanente hasta que se valida la transacción. Si una transacción no se completa, ya sea porque se cancela o por algún evento externo, las modificaciones no se guardan.
+
+Durante una transacción, todos los cambios realizados en los datos de la base de datos dentro de un proceso se almacenan localmente en un buffer temporal. Si la transacción se acepta con [`VALIDATE TRANSACTION`](../commands-legacy/validate-transaction.md) o [`validateTransaction()`](../API/DataStoreClass.md#validatetransaction), los cambios se guardan permanentemente. Si la transacción se cancela con [`CANCEL TRANSACTION`](../commands-legacy/cancel-transaction.md) o [`cancelTransaction()`](../API/DataStoreClass.md#canceltransaction), los cambios no se guardan. En todos los casos, ni la selección actual ni el registro actual son modificados por los comandos de gestión de transacciones.
+
+4D soporta transacciones anidadas, es decir, transacciones en varios niveles jerárquicos. El número de subtransacciones permitidas es ilimitado. El comando [`Transaction level`](../commands-legacy/transaction-level.md) puede utilizarse para averiguar el nivel de transacción actual en el que se ejecuta el código. Cuando se utilizan transacciones anidadas, el resultado de cada subtransacción depende de la validación o cancelación de la transacción de nivel superior. Si se valida la transacción de nivel superior, se confirman los resultados de las subtransacciones (validación o cancelación). Por el contrario, si se anula la operación de nivel superior, se anulan todas las suboperaciones, independientemente de sus respectivos resultados.
+
+4D incluye una funcionalidad que le permite [suspender y resumir transacciones](#suspending-transactions) dentro de su código 4D. Cuando una transacción está suspendida, puede ejecutar operaciones independientemente de la transacción misma y luego reanudar la transacción para validarla o cancelarla como de costumbre.
+
+### Ejemplo
+
+En este ejemplo, la base de datos es un simple sistema de facturación. Las líneas de factura se almacenan en una tabla llamada [Invoice Lines], que está relacionada con la tabla [Invoices] mediante una relación entre los campos [Invoices]Invoice ID y [Invoice Lines]Invoice ID. Cuando se añade una factura, se calcula un ID único, utilizando el comando [`Sequence number`](../commands-legacy/sequence-number.md). La relación entre [Invoices] e [Invoice Lines] es una relación automática Relate Many. La casilla **Asignar automáticamente valor relacionado en subformulario** está marcada.
+
+La relación entre [Invoice Lines] y [Parts] es manual.
+
+
+
+
+Cuando un usuario introduce una factura, se ejecutan las siguientes acciones:
+
+- Añadir un registro en la tabla [Invoices].
+- Añadir varios registros en la tabla [Invoice Lines].
+- Actualizar el campo [Parts]In Warehouse de cada parte listada en la factura.
+
+Este ejemplo es una situación típica en la que necesita utilizar una transacción. Debe estar seguro de que podrá guardar todos estos registros durante la operación o de que podrá cancelar la transacción si no se puede añadir o actualizar un registro. En otras palabras, debe guardar los datos relacionados. Si no utiliza una transacción, no podrá garantizar la integridad lógica de los datos de su base de datos. Por ejemplo, si uno de los registros de [Parts] está bloqueado, no podrá actualizar la cantidad almacenada en el campo [Parts]In Warehouse. Por lo tanto, este campo será lógicamente incorrecto. La suma de las piezas vendidas y las piezas que quedan en el almacén no será igual a la cantidad original introducida en el registro. Puede evitar esta situación utilizando transacciones.
+
+Existen varias formas de realizar la introducción de datos utilizando transacciones:
+
+1. Puede gestionar las transacciones usted mismo utilizando los comandos de transacción [`START TRANSACTION`](../commands-legacy/start-transaction.md), [`VALIDATE TRANSACTION`](../commands-legacy/validate-transaction.md) y [`CANCEL TRANSACTION`](../commands-legacy/cancel-transaction.md). Puede escribir, por ejemplo:
+
+```4d
+ READ WRITE([Invoice Lines])
+ READ WRITE([Parts])
+ FORM SET INPUT([Invoices];"Input")
+ Repeat
+ START TRANSACTION
+ ADD RECORD([Invoices])
+ If(OK=1)
+ VALIDATE TRANSACTION
+ Else
+ CANCEL TRANSACTION
+ End if
+ Until(OK=0)
+ READ ONLY(*)
+```
+
+2. Para reducir el bloqueo de registros mientras se realiza la entrada de datos, también puede optar por gestionar las transacciones desde el método del formulario y acceder a las tablas en `READ WRITE` sólo cuando sea necesario. La entrada de datos se realiza mediante el formulario de entrada de [Invoices], que contiene la tabla relacionada [Invoice Lines] en un subformulario. El formulario tiene dos botones: *bCancel* y *bOK*, ue no son botones de acción.
+
+El bucle de adición se convierte en:
+
+```4d
+ READ WRITE([Invoice Lines])
+ READ ONLY([Parts])
+ FORM SET INPUT([Invoices];"Input")
+ Repeat
+ ADD RECORD([Invoices])
+ Until(bOK=0)
+ READ ONLY([Invoice Lines])
+```
+
+Tenga en cuenta que la tabla [Parts] está ahora en modo de acceso de sólo lectura durante la entrada de datos. El acceso de lectura/escritura sólo estará disponible si se valida la entrada de datos.
+
+La transacción se inicia en el método del formulario de entrada [Invoices] que se indica a continuación:
+
+```4d
+ Case of
+ :(Form event code=On Load)
+ START TRANSACTION
+ [Invoices]Invoice ID:=Sequence number([Invoices]Invoice ID)
+ Else
+ [Invoices]Total Invoice:=Sum([Invoice Lines]Total line)
+ End case
+```
+
+Si hace clic en el botón *bCancel*, e cancelará tanto la entrada de datos como la transacción. Este es el método objeto del botón *bCancel*:
+
+```4d
+ Case of
+ :(Form event code=On Clicked)
+ CANCEL TRANSACTION
+ CANCEL
+ End case
+```
+
+Si hace clic en el botón *bOK*, la entrada de datos debe ser aceptada y la transacción debe ser validada. Este es el método objeto del botón *bOK*:
+
+```4d
+ Case of
+ :(Form event code=On Clicked)
+ var $NbLines:=Records in selection([Invoice Lines])
+ READ WRITE([Parts]) //Switch to Read/Write access for the [Parts] table
+ FIRST RECORD([Invoice Lines]) //Start at the first line
+ var $ValidTrans:=True //Assume everything will be OK
+ var $Line : Integer
+ For($Line;1;$NbLines) //For each line
+ RELATE ONE([Invoice Lines]Part No)
+ OK:=1 //Assume you want to continue
+ While(Locked([Parts]) & (OK=1)) //Try getting the record in Read/Write access
+ CONFIRM("The Part "+[Invoice Lines]Part No+" is in use. Wait?")
+ If(OK=1)
+ DELAY PROCESS(Current process;60)
+ LOAD RECORD([Parts])
+ End if
+ End while
+ If(OK=1)
+ //Update quantity in the warehouse
+ [Parts]In Warehouse:=[Parts]In Warehouse-[Invoice Lines]Quantity
+ SAVE RECORD([Parts]) //Save the record
+ Else
+ $Line:=$NbLines+1 //Leave the loop
+ $ValidTrans:=False
+ End if
+ NEXT RECORD([Invoice Lines]) //Go next line
+ End for
+ READ ONLY([Parts]) //Set the table state to read only
+ If($ValidTrans)
+ SAVE RECORD([Invoices]) //Save the Invoices record
+ VALIDATE TRANSACTION //Validate all database modifications
+ Else
+ CANCEL TRANSACTION //Cancel everything
+ End if
+ CANCEL //Salir del formulario
+ End case
+```
+
+En este código, llamamos al comando `CANCEL` independientemente del botón pulsado. El nuevo registro no se valida mediante una llamada a [`ACCEPT`](../commands-legacy/accept.md), sino mediante el comando [`SAVE RECORD`](../commands-legacy/save-record.md). Además, tenga en cuenta que `SAVE RECORD` se ejecuta justo antes del comando [`VALIDATE TRANSACTION`](../commands-legacy/validate-transaction.md). Por lo tanto, guardar el registro [Invoices] es en realidad una parte de la transacción. El comando `ACCEPT` también validaría el registro, pero en este caso la transacción se validaría antes de guardar el registro [Invoices]. En otras palabras, el registro se guardaría fuera de la transacción.
+
+Dependiendo de sus necesidades, puede personalizar su base de datos, como se muestra en estos ejemplos. En el último ejemplo, la gestión de registros bloqueados en la tabla [Parts] podría desarrollarse aún más.
+
+
+## Suspender transacciones
+
+### Principio
+
+Suspender una transacción es útil cuando necesita realizar, desde dentro de una transacción, ciertas operaciones que no necesitan ser ejecutadas bajo el control de esta transacción. Por ejemplo, imagine el caso en el que un cliente realiza un pedido, por tanto dentro de una transacción, y también actualiza su dirección. A continuación, el cliente cambia de opinión y cancela el pedido. La transacción se cancela, pero usted no desea que se revierta el cambio de dirección. Este es un ejemplo típico en el que resulta útil suspender la transacción. Se utilizan tres comandos para suspender y reanudar transacciones:
+
+- [`SUSPEND TRANSACTION`](../commands-legacy/suspend-transaction.md): pausa la transacción actual. Los registros actualizados o añadidos permanecen bloqueados.
+- [`RESUME TRANSACTION`](../commands-legacy/resume-transaction.md): reactiva una transacción suspendida.
+- [`Active transaction`](../commands-legacy/active-transaction.md): devuelve False si la transacción está suspendida o si no hay transacción en curso, y True si se ha iniciado o reanudado.
+
+### Ejemplo
+
+Este ejemplo ilustra la necesidad de una transacción suspendida. En una base Invoices, queremos obtener un nuevo número de factura durante una transacción. Este número se calcula y almacena en una tabla [Settings]. En un entorno multiusuario, los accesos concurrentes deben estar protegidos; sin embargo, debido a la transacción, la tabla [Settings] podría estar bloqueada por otro usuario, aunque estos datos sean independientes de la transacción principal. En este caso, puede suspender la transacción cuando acceda a la tabla.
+
+```4d
+ //Método estándar que crea una factura
+ START TRANSACTION
+ ...
+ CREATE RECORD([Invoices])
+ //llamar al método para obtener un número disponible
+ [Invoices]InvoiceID:=GetInvoiceNum
+ ...
+ SAVE RECORD([Invoices])
+ VALIDATE TRANSACTION
+
+ ```
+
+El método *GetInvoiceNum* suspende la transacción antes de ejecutarse. Tenga en cuenta que este código funcionará incluso cuando el método sea llamado desde fuera de una transacción:
+
+```4d
+ //Método proyecto GetInvoiceNum
+ //GetInvoiceNum -> Siguiente número de factura disponible
+ #DECLARE -> $freeNum : Integer
+ SUSPEND TRANSACTION
+ ALL RECORDS([Settings])
+ If(Locked([Settings])) //acceso multiusuario
+ While(Locked([Settings]))
+ MESSAGE("Waiting for locked Settings record")
+ DELAY PROCESS(Current process;30)
+ LOAD RECORD([Settings])
+ End while
+ End if
+ [Settings]InvoiceNum:=[Settings]InvoiceNum+1
+ $freeNum:=[Settings]InvoiceNum
+ SAVE RECORD([Settings])
+ UNLOAD RECORD([Settings])
+ RESUME TRANSACTION
+
+```
+
+### Operación detallada
+
+#### ¿Cómo funciona una transacción suspendida?
+
+Cuando se suspende una transacción, se aplican los siguientes principios:
+
+- Puede acceder a los registros que se añadieron o modificaron durante la transacción, y no puede ver los registros que se eliminaron durante la transacción.
+- Puede crear, guardar, eliminar o modificar registros fuera de la transacción.
+- Puede iniciar una nueva transacción, pero dentro de esta transacción incluida no podrá ver ningún registro o valor de registro que se haya añadido o modificado durante la transacción suspendida. De hecho, esta nueva transacción es totalmente independiente de la suspendida, similar a una transacción de otro proceso, y dado que la transacción suspendida podría reanudarse o cancelarse posteriormente, cualquier registro añadido o modificado se oculta automáticamente para la nueva transacción. En cuanto se reanude o cancele la nueva transacción, se podrán ver de nuevo estos registros.
+- Los registros modificados, borrados o añadidos dentro de la transacción suspendida permanecen bloqueados para otros procesos. Si se intenta modificar o eliminar estos registros fuera de la transacción o en una nueva transacción, se genera un error.
+
+Estas implementaciones se resumen en el siguiente gráfico:
+
+
+
+
+*Los valores editados durante la transacción A (el registro ID1 obtiene Val11) no están disponibles en una nueva transacción (B) creada durante el periodo «suspendido». Los valores editados durante el periodo «suspendido» (el registro ID2 obtiene Val22 y el registro ID3 obtiene Val33) se guardan incluso después de cancelar la transacción A.*
+
+Se han añadido funcionalidades específicas para gestionar los errores:
+
+- El registro actual de cada tabla se bloquea temporalmente si se modifica durante la transacción y se desbloquea automáticamente cuando ésta se reanuda. Este mecanismo es importante para evitar guardados no deseados en partes de la transacción.
+- Si se ejecuta una secuencia no válida como iniciar transacción / suspender transacción / iniciar transacción / reanudar transacción, se genera un error. Este mecanismo evita que los desarrolladores olviden consignar o cancelar cualquier transacción incluida antes de reanudar la transacción suspendida.
+
+
+#### Transacciones suspendidas y estado del proceso
+
+El comando [`In transaction`](../commands-legacy/in-transaction.md) devuelve True cuando se ha iniciado una transacción, aunque esté suspendida. Para saber si la transacción actual está suspendida, es necesario utilizar el comando [`Active transaction`](../commands-legacy/active-transaction.md), que devuelve False en este caso.
+
+Ambos comandos, sin embargo, también devuelven False si no se ha iniciado ninguna transacción. En ese caso, es posible que tenga que utilizar el comando [`Transaction level`](../commands-legacy/transaction-level.md), que devuelve 0 en este contexto (no se ha iniciado ninguna transacción).
+
+
+El siguiente gráfico ilustra los distintos contextos de transacción y los valores correspondientes devueltos por los comandos de transacción:
+
+
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/field-properties.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/field-properties.md
new file mode 100644
index 00000000000000..d486ff3d6bbabd
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/field-properties.md
@@ -0,0 +1,36 @@
+---
+id: field-properties
+title: Propiedades de los campos
+---
+
+For other field properties, please refer to [doc.4d.com](https://doc.4d.com/4Dv20R10/4D/20-R10/Field-properties.300-7543749.en.html#5523008).
+
+## Class
+
+
+
+This property is available for fields of type **Object** (in 4D projects only). It allows you to define a **class-typed object field**, enhancing code completion, syntax checking, and runtime validation when typing code that involves object fields.
+
+You can enter any valid class name in this property, including:
+
+- Clases usuario (por ejemplo, `cs.MyClass`)
+- Clases 4D integradas (por ejemplo, `4D.File`, `4D.Folder`)
+- [Exposed](../Extensions/develop-components.md#sharing-of-classes) component-defined classes (e.g. `cs.MyComponent.MyClass`)
+
+If you enter an invalid class name, a warning is triggered and the input is rejected.
+
+:::note
+
+**Non-streamable classes** such as [ORDA Data Model classes](../ORDA/ordaClasses.md), [file handles](../API/FileHandleClass.md), [web server](../API/WebServerClass.md)... no pueden asociarse a campos objeto.
+
+:::
+
+In your code, when assigning a value to a class-typed object field, 4D verifies that it belongs to the declared class. Si no es así o si el objeto no tiene clase, se produce un error. El acceso a atributos desconocidos también provocará errores de sintaxis.
+
+To retrieve the associated class name at runtime, use the [`classID`](../API/DataClassClass.md#attributename) property, for example `ds.MyTable.MyField.classID`.
+
+### Ver también
+
+- [Blog post: Stricter class-based typing for objects](https://blog.4d.com/stricter-class-based-typing-for-objects/)
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Develop/preemptive.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/preemptive.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Develop/preemptive.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Develop/preemptive.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Develop/processes.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Develop/processes.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Develop/processes.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Develop/processes.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Events/onActivate.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Events/onActivate.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Events/onActivate.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Events/onActivate.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Events/onAfterEdit.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Events/onAfterEdit.md
new file mode 100644
index 00000000000000..122a0395c08180
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Events/onAfterEdit.md
@@ -0,0 +1,114 @@
+---
+id: onAfterEdit
+title: On After Edit
+---
+
+| Code | Puede ser llamado por | Definición |
+| ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
+| 45 | [Área 4D View Pro](../FormObjects/viewProArea_overview.md) - [Área 4D Write Pro](../FormObjects/writeProArea_overview.md) - [Combo Box](FormObjects/comboBox_overview.md) - Formulario - [Entrada](FormObjects/input_overview.md) - [Lista Jerárquica](FormObjects/list_overview.md) - [Lista de selección](FormObjects/listbox_overview.md) - [Columna de lista de selección](FormObjects/listbox_overview.md#list-box-columns) | El contenido del objeto introducible que tiene el foco acaba de ser modificado |
+
+## Descripción
+
+### Caso general
+
+Este evento se puede utilizar para filtrar la entrada de datos en los objetos editables por teclado en el nivel más bajo.
+
+Cuando se utiliza, este evento se genera después de cada cambio realizado en el contenido de un objeto editable, independientemente de la acción que haya provocado la modificación, *es decir*:
+
+- Acciones de edición estándar que modifican el contenido como pegar, cortar, borrar o cancelar;
+- Soltar un valor (acción similar a pegar);
+- Toda entrada de teclado realizada por el usuario; en este caso, el evento `On After Edit` se genera después de los eventos [`On Before Keystroke`](onBeforeKeystroke. d) y [`On After Keystroke`](onAfterKeystroke.md), si se utilizan.
+- Cualquier modificación realizada mediante un comando del lenguaje que simule una acción del usuario (es decir, `POST KEY`).
+
+Dentro del evento `On After Edit`, los datos de texto que se ingresan son devueltos por el comando [`Get edited text`](../commands-legacy/get-edited-text.md).
+
+### 4D View Pro
+
+El objeto devuelto por el comando `FORM Event` contiene:
+
+| Propiedad | Tipo | Descripción |
+| ----------- | ------------ | --------------------------------------------------------------------------------------------------- |
+| code | entero largo | On After Edit |
+| description | text | "On After Edit" |
+| objectName | text | Nombre del área 4D View Pro |
+| sheetName | text | Nombre de la hoja del evento |
+| action | text | "editChange", "valueChanged", "DragDropBlock", "DragFillBlock", "formulaChanged", "clipboardPasted" |
+
+En función del valor de la propiedad `action`, el [objeto evento](overview.md#event-object) contendrá propiedades adicionales.
+
+#### action = editChange
+
+| Propiedad | Tipo | Descripción |
+| ----------- | ------- | -------------------------------------- |
+| range | object | Rango de celdas |
+| editingText | variant | El valor proveniente del editor actual |
+
+#### action = valueChanged
+
+| Propiedad | Tipo | Descripción |
+| --------- | ------- | ------------------------------------------ |
+| range | object | Rango de celdas |
+| oldValue | variant | Valor de la celda antes de la modificación |
+| newValue | variant | Valor de la celda luego de la modificación |
+
+#### action = DragDropBlock
+
+| Propiedad | Tipo | Descripción |
+| --------- | ------- | --------------------------------------------------------------------- |
+| fromRange | object | Rango de celdas fuente (que se arrastra) |
+| toRange | object | Rango de la celda de destino (ubicación de soltar) |
+| copy | boolean | Indica si el rango fuente se copia o no |
+| insert | boolean | Indica si el rango fuente se inserta o no |
+
+#### action = DragFillBlock
+
+| Propiedad | Tipo | Descripción |
+| ------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| fillRange | object | Gama utilizada para el relleno |
+| autoFillType | entero largo | Valor utilizado para el relleno.
0: Cells are filled with all data (values, formatting, and formulas)
1: Cells are filled with automatically sequential data
2: Cells are filled with formatting only
3: Cells are filled with values but not formatting
4: Values are removed from the cells
5: Cells are filled automatically
|
+| fillDirection | entero largo | Dirección del relleno.
0: The cells to the left are filled
1: The cells to the right are filled
2: The cells above are filled
3: The cells below are filled
|
+
+#### action = formulaChanged
+
+| Propiedad | Tipo | Descripción |
+| --------- | ------ | ---------------------- |
+| range | object | Rango de celdas |
+| formula | text | La fórmula introducida |
+
+#### action = clipboardPasted
+
+| Propiedad | Tipo | Descripción |
+| ----------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| range | object | Rango de celdas |
+| pasteOption | entero largo | Especifica lo que se pega en el portapapeles:
0: todo es pegado (valores, formato y fórmulas)
1: solo los valores se pegan
2: solo el formato se pega
3: solo las fórmulas se pegan
4: los valores y el formato se pegan (no las fórmulas)
5: las fórmulas y el formato se pegan (no los valores)
|
+| pasteData | object | Los datos del portapapeles a pegar
**Note**: When an object of the Text or Group Box type is selected, pressing the **Enter** key lets you switch to editing mode.
|
+|  | [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. |
+|  | [Mover](#mover-objetos) | 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. |
+|  | [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. |
+|  | [Alineación](#alineación-objetos) | Este botón está asociado a un menú que permite alinear los objetos en el formulario. It is enabled (or not) depending on the objects selected. Disabled if one selected object position is locked by a CSS property |
+|  | [Distribución](#distribución-objetos) | Este botón está asociado a un menú que permite repartir los objetos en el formulario. It is enabled (or not) depending on the objects selected. Disabled if one selected object position is locked by a CSS property |
+|  | [Nivel](#layering-objects) | Este botón está asociado a un menú que permite cambiar el nivel de los objetos en el formulario. Se activa (o no) en función de los objetos seleccionados. |
+|  | [Agrupar/Desagrupar](#grouping-objects) | Este botón está asociado a un menú que permite agrupar y desagrupar la selección de objetos del formulario. Se activa (o no) en función de los objetos seleccionados. |
+|  | [Visualización y gestión de páginas](forms.html#form-pages) | Esta área permite pasar de una página de formulario a otra y añadir páginas. Para navegar entre las páginas del formulario, haga clic en los botones de flecha o en el área central y elija la página que desea visualizar en el menú que aparece. Si pulsa el botón flecha derecha mientras se muestra la última página del formulario, 4D le permite añadir una página. |
+|  | [Vista previa CSS](#css-preview) | Este botón se utiliza para seleccionar el modo CSS a utilizar. |
+|  | [Gestión de vistas](#vistas) | Este botón muestra u oculta la paleta de vistas. Esta función se detalla en la sección Utilizar las vistas de objeto. |
+|  | [Visualización de escudos](#shields) | Cada clic en este botón provoca la visualización sucesiva de todos los tipos de escudos de formulario. El botón también está vinculado a un menú que permite seleccionar directamente el tipo de escudo a mostrar. |
+|  | [Biblioteca de objetos preconfigurada](objectLibrary.html) | Este botón muestra la librería de objetos preconfigurada que ofrece numerosos objetos con ciertas propiedades que han sido predefinidas. |
+|  | [Generador de list box](#list-box-builder) | Este botón crea nuevos list box de tipo selección de entidades. |
+|  | [Insertar campos](#insertar-campos) | Este botón inserta en el formulario todos los campos (excepto los de tipo objeto y blob) de la tabla del formulario, junto con sus etiquetas y respetando las normas de la interfaz. |
+
+### Barra de objetos
+
+La barra de objetos contiene todos los objetos activos e inactivos que se pueden utilizar en los formularios 4D. Algunos objetos se agrupan por temas. Cada tema incluye varias alternativas entre las que puede elegir. Cuando la barra de objetos tiene el foco, puede seleccionar los botones utilizando las teclas del teclado. La siguiente tabla describe los grupos de objetos disponibles y su tecla de acceso directo asociada.
+
+| Botón | Agrupar | Llave |
+| ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---: |
+|  | [Text](FormObjects/text.md) / [Group Box](FormObjects/groupBox.md) | T |
+|  | [Entrada](FormObjects/input_overview.md) | F |
+|  | [Lista jerárquica](FormObjects/list_overview.md) / [List Box](FormObjects/listbox_overview.md) | L |
+|  | [Combo Box](FormObjects/comboBox_overview.md) / [Lista desplegable](FormObjects/dropdownList_Overview.md) / [Menú emergente de imágenes](FormObjects/picturePopupMenu_overview.md) | P |
+|  | [Botón](FormObjects/button_overview.md) / [Botón imagen](FormObjects/pictureButton_overview.md) / [Rejilla de botones](FormObjects/buttonGrid_overview.md) | B |
+|  | [Botón de radio](FormObjects/radio_overview.md) | R |
+|  | [Casilla de verificación](FormObjects/checkbox_overview.md) | C |
+|  | [Indicador de progreso](FormObjects/progressIndicator.md) / [Regla](FormObjects/ruler.md) / [Stepper](FormObjects/stepper.md) / [Spinner](FormObjects/spinner.md) | I |
+|  | [Rectángulo](FormObjects/shapes_overview.md#rectangle) / [Línea](FormObjects/shapes_overview.md#line) / [Óvalo](FormObjects/shapes_overview.md#oval) | S |
+|  | [Splitter](FormObjects/splitters.md) / [Control de pestañas](FormObjects/tabControl.md) | D |
+|  | [Área de plug-in ](FormObjects/pluginArea_overview.md) / [Subformulario](FormObjects/subform_overview.md) / [Área Web](FormObjects/webArea_overview.md) / [4D Write Pro](FormObjects/writeProArea_overview.md) / [4D View Pro](FormObjects/viewProArea_overview | X |
+
+Para dibujar un tipo de objeto, seleccione el botón correspondiente y luego trace el objeto en el formulario. Después de crear un objeto, puede modificar su tipo utilizando la lista de propiedades. Para dibujar un tipo de objeto, seleccione el botón correspondiente y luego trace el objeto en el formulario. Las líneas se limitan a horizontales, 45° o verticales, los rectángulos se limitan a cuadrados y los óvalos se limitan a círculos.
+
+La variante actual del tema es el objeto que se insertará en el formulario. Al hacer clic en la parte derecha de un botón, se accede al menú de variantes:
+
+
+
+Puede presionar dos veces el botón para que permanezca seleccionado incluso después de haber trazado un objeto en el formulario (selección continua). Esta función facilita la creación de varios objetos sucesivos del mismo tipo. Para cancelar una selección continua, haga clic en otro objeto o herramienta.
+
+### Lista de propiedades
+
+
+
+Tanto los formularios como los objetos de formulario tienen propiedades que controlan el acceso al formulario, la apariencia del mismo y el comportamiento del formulario cuando se utiliza. Las propiedades del formulario incluyen, por ejemplo, el nombre del formulario, su barra de menú y su tamaño. Las propiedades de los objetos incluyen, por ejemplo, su nombre, sus dimensiones, su color de fondo y su fuente.
+
+Puede visualizar y modificar las propiedades de los objetos y formularios utilizando la lista de propiedades. Muestra las propiedades del formulario o de los objetos en función de lo que se seleccione en la ventana del editor.
+
+Para mostrar/ocultar la lista de propiedades, seleccione **Lista de propiedades** en el menú **Formulario** o en el menú contextual del editor de formularios. También puede mostrarlo haciendo doble clic en una área vacía del formulario.
+
+#### Atajos
+
+Puede utilizar los siguientes atajos en la Lista de propiedades:
+
+- **Tecla de flecha**s ↑ ↓: se utiliza para pasar de una celda a otra.
+- **Teclas flechas** ← →: se utiliza para expandir/contraer los temas o entrar en el modo de edición.
+- **PgUp** y **PgDn**: selecciona la primera o la última celda visible de la lista mostrada.
+- **Inicio** y **Fin**: selecciona la primera o la última celda de la lista.
+- **Ctrl+clic** (Windows) o **Comando+clic** (macOS) sobre un evento: utilizado para seleccionar/deseleccionar cada evento de la lista, según el estado inicial del evento sobre el que se ha hecho clic.
+- **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en la etiqueta de un tema: Permite contraer/expandir todos los temas de la lista.
+- **Ctrl+clic** (Windows) o **Comando+clic** (macOS) sobre un valor de propiedad mostrado en **negrita**: restablece la propiedad a su valor por defecto.
+
+## Manipulación de objetos formulario
+
+### Añadir objetos
+
+Puede añadir objetos en los formularios de varias maneras:
+
+- Dibujando el objeto directamente en el formulario después de seleccionar su tipo en la barra de objetos (ver [Utilizando la barra de objetos](#object-bar))
+- Arrastrando y soltando el objeto desde la barra de objetos
+- Mediante operaciones de arrastrar y soltar o copiar y pegar sobre un objeto seleccionado de la [librería de objetos](objectLibrary.md) preconfigurada,
+- Arrastrando y soltando un objeto desde otro formulario,
+- Arrastrando y soltando un objeto desde el Explorador (campos) o desde otros editores del modo Diseño (listas, imágenes, etc.)
+
+Una vez insertado el objeto en el formulario, puede modificar sus características utilizando el editor de formularios.
+
+Puede trabajar con dos tipos de objetos en sus formularios:
+
+- **Objetos estáticos** (líneas, marcos, imágenes de fondo, etc.): estos objetos se utilizan generalmente para definir la apariencia del formulario y sus etiquetas, así como para la interfaz gráfica. Están disponibles en la barra de objetos del editor de formularios. Están disponibles en la barra de objetos del editor de formularios. Están disponibles en la barra de objetos del editor de formularios. Los objetos estáticos no tienen variables asociadas como los objetos activos. Sin embargo, se pueden insertar objetos dinámicos en objetos estáticos.
+
+- **Objetos activos**: estos objetos realizan tareas o funciones en la interfaz y pueden adoptar muchas formas: campos, botones, listas desplazables, etc. Cada objeto activo está asociado a un campo o a una variable.
+
+### Seleccionar los objetos
+
+Antes de poder realizar cualquier operación en un objeto (como cambiar el ancho de la línea o la fuente), debe seleccionar el objeto que desea modificar.
+
+Para seleccionar un objeto utilizando la barra de herramientas:
+
+1. Haga clic en la herramienta Flecha de la barra de herramientas.

+
+
Cuando se mueve el puntero en el área del formulario, se convierte en un puntero estándar con forma de flecha
.
+
+2. Haga clic en el objeto que desea seleccionar. Las manillas de redimensionamiento identifican el objeto seleccionado.

+
+Para seleccionar un objeto utilizando la Lista de propiedades:
+
+1. Seleccione el nombre del objeto en la lista desplegable de objetos situada en la parte superior de la lista de propiedades. Con estos dos métodos, puede seleccionar un objeto que esté oculto por otros objetos o que se encuentre fuera del área visible de la ventana actual.
+ Para deseleccionar un objeto, haga clic fuera del límite del objeto o **Mayúsculas+clic** en el objeto.
+
+> También es posible seleccionar objetos haciendo doble clic en la ventana de resultados de la operación "Buscar en diseño".
+
+### Selección de múltiples objetos
+
+Es posible que desee realizar la misma operación en más de un objeto de un formulario, por ejemplo, para mover los objetos, alinearlos o cambiar su apariencia. 4D le permite seleccionar varios objetos al mismo tiempo. Hay varias formas de seleccionar varios objetos:
+
+- Seleccione **Seleccionar todo** en el menú Edición para seleccionar todos los objetos.
+- Haga clic con el botón derecho en el objeto y elija el comando **Seleccionar objetos del mismo tipo** en el menú contextual.
+- Mantenga presionada la tecla **Mayús** y haga clic en los objetos que desee seleccionar.
+- Comience en una ubicación fuera del grupo de objetos que desea seleccionar y arrastre un marco (a veces llamado rectángulo de selección) alrededor de los objetos. Al soltar el botón del ratón, si alguna parte de un objeto se encuentra dentro o toca los límites del rectángulo de selección, ese objeto queda seleccionado.
+- Mantenga presionada la tecla **Alt** (Windows) o la tecla **Opción** (macOS) y dibuje un rectángulo de selección. Se selecciona todo objeto que esté completamente encerrado por el marco.
+
+La imagen siguiente muestra el dibujo de un rectángulo para seleccionar dos objetos:
+
+
+
+Para deseleccionar un objeto que forma parte de un grupo de objetos seleccionados, mantenga presionada la tecla **Mayús** y haga clic en el objeto. Los demás objetos permanecen seleccionados. Para deseleccionar todos los objetos seleccionados, haga clic fuera de los límites de todos los objetos.
+
+### Duplicar los objetos
+
+Puede duplicar todo objeto de formulario, incluidos los objetos activos. Las copias de los objetos activos conservan todas las propiedades del objeto original, incluidos el nombre, el tipo, la acción estándar, el formato de visualización y el método objeto.
+
+Puede duplicar un objeto directamente con la herramienta Duplicar de la paleta Herramientas o utilizar la caja de diálogo Duplicar varios para duplicar un objeto más de una vez. Además, a través de esta caja de diálogo, se puede definir la distancia entre dos copias.
+
+Para duplicar uno o más objetos:
+
+1. Seleccione el objeto u objetos que desea duplicar.
+2. Elija **Duplicar** en el menú **Edición**. 4D crea una copia de cada objeto seleccionado y coloca la copia delante y justo al lado del original.
+3. Mueva la copia (o las copias) a la ubicación deseada.
+ Si vuelve a elegir el elemento de menú Duplicar, 4D crea otra copia de cada objeto y la mueve exactamente a la misma distancia y dirección de la primera copia. Si necesita distribuir copias del objeto a lo largo de una línea, debe utilizar el siguiente procedimiento. Duplique el objeto original, mueva la copia a otro lugar del formulario y luego duplique la copia. La segunda copia se coloca automáticamente en la misma posición que la primera copia tenía en relación con el objeto original. Las copias posteriores también se sitúan en la misma relación con sus originales. La siguiente figura explica el funcionamiento de la ubicación relativa de las copias:
+
+
+
+#### Duplicar muchos
+
+La caja de diálogo "Duplicar muchos" aparece cuando se selecciona uno o más objetos y se elige el comando **Duplicar muchos...** del menú **Objeto**.
+
+
+
+- En el área superior, introduzca el número de columnas y líneas de objetos que desea obtener. Por ejemplo, si desea tres columnas y dos líneas de objetos, introduzca 3 en el área Columna(s) y 2 en el área Línea(s). En el área superior, introduzca el número de columnas y líneas de objetos que desea obtener.
+
+- Para las líneas y columnas, defina el desplazamiento que desea aplicar a cada copia. El valor debe expresarse en puntos. It will be applied to each copy, or copies, in relation to the original object. For example, if you want to leave a vertical offset of 20 points between each object and the height of the source object is 50 points, enter 70 in the column’s “Offset” area.
+
+- Si desea crear una matriz de variables, seleccione la opción **Numerar las variables** y seleccione la dirección en la que se van a numerar las variables, ya sea por línea(s) o por columna(s).
+ Esta opción sólo se activa cuando el objeto seleccionado es una variable. Para más información sobre esta opción, consulte **Duplicar en una matriz** en el *Manual de diseño*.
+
+### Mover objetos
+
+Puede mover todo gráfico u objeto activo del formulario, incluidos los campos y los objetos creados con una plantilla. Al mover un objeto, tiene las siguientes opciones:
+
+- Mover el objeto arrastrándolo,
+- Mover el objeto un píxel a la vez utilizando las teclas de flecha,
+- Mover el objeto por pasos utilizando las teclas de flecha (pasos de 20 píxeles por defecto),
+
+Al comenzar a arrastrar el objeto seleccionado, sus controles desaparecen. 4D muestra marcadores que indican la ubicación de los límites del objeto en las reglas para que pueda colocar el objeto exactamente donde lo quiere. Tenga cuidado de no arrastrar un mango. Al arrastrar un mango se cambia el tamaño del objeto. Puede presionar la tecla **Mayúsculas** para realizar el movimiento con una restricción.
+
+Cuando la [rejilla magnética](#using-the-magnetic-grid) está activada, los objetos se mueven por etapas indicando ubicaciones perceptibles.
+
+Para mover un objeto un píxel por píxel:
+
+- Seleccione el objeto u objetos y utilice las teclas de flecha del teclado para mover el objeto. Cada vez que se presiona una tecla flecha, el objeto se mueve un píxel en la dirección de la flecha.
+
+Mover un objeto por pasos:
+
+- Selecciona el objeto u objetos que quiera mover y mantenga presionada la tecla **Mayúsculas** y utilice las teclas de dirección para mover el objeto por pasos. Por defecto, los pasos son de 20 píxeles cada vez. Puede cambiar este valor en la página Formularios de las Preferencias.
+
+### Agrupar objetos
+
+4D le permite agrupar objetos para que pueda seleccionar, mover y modificar el grupo como un solo objeto. Los objetos agrupados conservan su posición en relación con los demás. Lo normal es agrupar un campo y su etiqueta, un botón invisible y su icono, etc.
+
+Cuando se redimensiona un grupo, todos los objetos del grupo se redimensionan proporcionalmente (excepto las áreas de texto, que se redimensionan por pasos según el tamaño de sus fuentes).
+
+Puede desagrupar un grupo de objetos para tratarlos de nuevo como objetos individuales.
+
+Un objeto activo que ha sido agrupado debe ser desagrupado antes de poder acceder a sus propiedades o métodos. Sin embargo, es posible seleccionar un objeto perteneciente a un grupo sin reagrupar el conjunto: para ello, **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en el objeto (el grupo debe estar seleccionado previamente).
+
+La agrupación sólo afecta a los objetos en el editor de formularios. Cuando se ejecuta el formulario, todos los objetos agrupados actúan como si estuvieran desagrupados.
+
+> La rejilla magnética también influye en el redimensionamiento manual de los objetos.
+
+Para agrupar los objetos:
+
+1. Seleccione los objetos que desea agrupar.
+2. Elija **Agrupar** en el menú Objetos. O
+ Haga clic en el botón Agrupar en la barra de herramientas del editor de formularios:

+ 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.
+
+### Alinear objetos
+
+Puede alinear los objetos entre sí o mediante una rejilla invisible en el formulario.
+
+- Cuando se alinea un objeto con otro, se puede alinear con la parte superior, inferior, lateral o con el centro horizontal o vertical del otro objeto. Puede alinear directamente una selección de objetos utilizando las herramientas de alineación o aplicar ajustes de alineación más avanzados utilizando el Asistente de Alineación. Esta última opción permite, por ejemplo, definir el objeto que se utilizará como referencia de posición y previsualizar la alineación en el formulario antes de aplicarla.
+- Cuando se utiliza la rejilla invisible, cada objeto puede alinearse manualmente con otros basándose en posiciones "perceptibles" que se representan con líneas de puntos que aparecen cuando el objeto que se mueve se acerca a otros objetos.
+
+#### Utilizar las herramientas de alineación directa
+
+Las herramientas de alineación de la barra de herramientas y del submenú Alinear del menú Objeto permiten alinear rápidamente los objetos seleccionados.
+
+
+
+Cuando 4D alinea los objetos, deja un objeto seleccionado en su lugar y alinea el resto de los objetos a ese. Este objeto es el "ancla." Utiliza el objeto que está más lejos en la dirección de la alineación como ancla y alinea los otros objetos a ese objeto. Por ejemplo, si quiere realizar una alineación a la derecha en un conjunto de objetos, el objeto más a la derecha se utilizará como ancla.
+La figura siguiente muestra objetos sin alineación, "alineados a la izquierda", "alineados horizontalmente por centros" y "alineados a la derecha":
+
+
+
+#### Utilizar el asistente de alineación
+
+El Asistente de Alineación permite realizar cualquier tipo de alineación y/o distribución de objetos.
+
+
+
+Para mostrar esta caja de diálogo, seleccione los objetos que desee alinear y, a continuación, elija el comando **Alineación** del submenú **Alinear** del menú **Objeto** o del menú contextual del editor.
+
+- In the “Left/Right Alignment” and/or “Top/Bottom Alignment” areas, click the icon that corresponds to the alignment you want to perform.
El área de ejemplo muestra los resultados de su selección.
+
+- Para realizar una alineación que utilice el esquema de anclaje estándar, haga clic en **Ver** o **Aplicar**. En este caso, 4D utiliza el objeto que está más lejos en la dirección de la alineación como ancla y alinea los otros objetos a ese objeto. Por ejemplo, si quiere realizar una alineación a la derecha en un conjunto de objetos, el objeto más a la derecha se utilizará como ancla. O:
para alinear los objetos a un objeto específico, seleccione la opción **Alinear en** y seleccione el objeto al que desea que se alineen los demás objetos de la lista de objetos. En este caso, la posición del objeto de referencia no se alterará.
+
+Puede previsualizar los resultados de la alineación haciendo clic en el botón **Previsualización**. Los objetos se alinean entonces en el editor de formularios, pero como la caja de diálogo permanece en el primer plano, aún puede cancelar o aplicar la alineación.
+
+> Esta caja de diálogo le permite alinear y distribuir objetos en una sola operación. Para más información sobre cómo distribuir objetos, consulte [Repartir objetos](#distributing-objects).
+
+#### Utilizar la rejilla magnética
+
+El editor de formularios dispone de una rejilla magnética virtual que puede ayudarle a colocar y alinear objetos en un formulario. La alineación magnética de los objetos se basa en su posición con respecto a los demás. La rejilla magnética sólo puede utilizarse cuando hay al menos dos objetos en el formulario.
+
+Esto funciona de la siguiente manera: cuando mueve un objeto en el formulario, 4D indica las posibles ubicaciones de este objeto basándose en alineaciones notables con otros objetos formulario. Una alineación evidente se establece cada vez que:
+
+- Horizontalmente, los bordes o centros de dos objetos coinciden,
+- Verticalmente, los bordes de dos objetos coinciden.
+
+Cuando esto ocurre, 4D coloca el objeto en el lugar y muestra una línea roja que indica la alineación notable que se ha tenido en cuenta:
+
+
+
+En cuanto a la distribución de los objetos, 4D ofrece una distancia basada en los estándares de interfaz. Al igual que en el caso de la alineación magnética, las líneas rojas indican las diferencias notables una vez alcanzadas.
+
+
+
+Este funcionamiento se aplica a todos los tipos de objetos de los formularios. La rejilla magnética puede activarse o desactivarse en cualquier momento utilizando el comando **Activar la rejilla magnética** del menú **Formulario** o del menú contextual del editor. También es posible definir la activación de esta función por defecto en la página **Preferencias** > **Formularios** (opción **Activar la alineación automática por defecto**). Puede activar o desactivar manualmente la rejilla magnética cuando se selecciona un objeto presionando la tecla **Ctrl** (Windows) o **Control** (macOS) .
+
+> La rejilla magnética también influye en el redimensionamiento manual de los objetos.
+
+### Distribuir los objetos
+
+Puede repartir los objetos de manera que queden dispuestos con el mismo espacio entre ellos. Para ello, puede distribuir los objetos utilizando las herramientas de distribución de la paleta Herramientas o el Asistente de alineación. Este último le permite alinear y distribuir objetos en una sola operación.
+
+> Puede cambiar el orden de entrada en tiempo de ejecución utilizando los comandos `FORM SET ENTRY ORDER` y `FORM GET ENTRY ORDER`.
+
+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.

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.
+
+Para distribuir objetos utilizando la caja de diálogo Alinear y Distribuir:
+
+1. Seleccione los objetos que desea 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:
+
+3. En las áreas Alineación izquierda/derecha y/o Alineación superior/inferior, haga clic en el icono de distribución estándar: 
(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:
+
+- Horizontalmente, los iconos corresponden a las siguientes distribuciones: uniformemente con respecto a los lados izquierdos, centros (hor.) y los lados derechos de los objetos seleccionados.
+- Verticalmente, los iconos corresponden a las siguientes distribuciones: uniformemente con respecto a los bordes superiores, centros (vert.) y los bordes inferiores de los objetos seleccionados.
+
+Puede previsualizar el resultado real de sus parámetros haciendo clic en el botón **Previsualización**: la operación se lleva a cabo en el editor de formularios, pero la caja de diálogo permanece en primer plano. Puede entoces **Cancelar** o **Aplicar** las modificaciones.
+
+> Esta caja de diálogo permite combinar la alineación y la distribución de objetos. Para más información sobre la alineación, consulte [Alinear objetos](#aligning-objects).
+
+### Gestionar los planos de los objetos
+
+A veces tendrá que reorganizar los objetos que obstruyen la vista de otros objetos del formulario. Por ejemplo, puede tener un gráfico que desee que aparezca detrás de los campos en un formulario. A veces tendrá que reorganizar los objetos que obstruyen la vista de otros objetos del formulario. Estas capas también determinan el orden de entrada por defecto (ver Modificación del orden de entrada de datos). La figura siguiente muestra objetos delante y detrás de otros objetos:
+
+
+
+Para mover un objeto a otro plano, selecciónelo y elija:
+
+- Uno de los comandos **Mover hacia atrás**, **Mover hacia delante**, **Subir un nivel** y **Bajar un nivel** en el menú Objeto,
+- Uno de los comandos del submenú **Plano>** del menú contextual del editor,
+- Uno de los comandos asociados al botón de gestión de los planos de la barra de herramientas.
+
+
+
+> Cuando se superponen varios objetos, se puede utilizar el atajo **Ctrl+Mayús+clic** / **Comando+Mayús+clic** para seleccionar cada objeto sucesivamente bajando un plano con cada clic.
+
+Al ordenar los diferentes niveles, 4D siempre va del fondo al primer plano. Como resultado, el nivel anterior desplaza la selección de objetos de un plano hacia el fondo del formulario. El siguiente nivel mueve la selección un plano hacia el primer plano del formulario.
+
+### Orden de entrada de los datos
+
+El orden de entrada de datos es el orden en el que se seleccionan los campos, subformularios y otros objetos activos al presionar la tecla **Tab** o la tecla **Retorno de carro** en un formulario de entrada. Es posible desplazarse por el formulario en sentido contrario (invertir el orden de entrada de datos) presionando las teclas **Mayúsc+Tab** o **Mayúsc+Retorno de carro** de retorno.
+
+> Puede cambiar el orden de entrada en tiempo de ejecución utilizando los comandos `FORM SET ENTRY ORDER` y `FORM GET ENTRY ORDER`.
+
+Todos los objetos que soportan la propiedad enfocable se incluyen por defecto en el orden de entrada de datos.
+
+Definir el orden de entrada para un formulario JSON se hace con la propiedad [`entryOrder`](properties_JSONref.md).
+
+Si no especifica un orden de entrada personalizado, 4D utiliza por defecto el plano de los objetos para determinar el orden de entrada en el sentido "fondo hacia primer plano." El orden de entrada estándar corresponde, por tanto, al orden de creación de los objetos en el formulario.
+
+En algunos formularios, se necesita definir un orden de entrada de datos personalizado. A continuación, por ejemplo, se han añadido campos adicionales relacionados con la dirección después de la creación del formulario. El orden de entrada estándar resultante se vuelve ilógico y obliga al usuario a introducir la información de forma extraña:
+
+
+
+En casos como éste, un orden de entrada de datos personalizado le permite introducir la información en un orden más lógico:
+
+
+
+#### Visualizar y modificar el orden de entrada de datos
+
+Puede ver el orden de entrada actual utilizando marcas "Orden de entrada" o utilizando el modo "Orden de entrada". Sin embargo, sólo puede modificar el orden de entrada utilizando el modo "Orden de entrada".
+
+Este párrafo describe la visualización y la modificación del orden de entrada en modo "Orden de entrada". Para más información sobre la visualización del orden de entrada utilizando marcas, consulte [Using shields](#using-shields).
+
+Para ver o cambiar el orden de entrada:
+
+1. Seleccione **Orden de entrada** en el menú **Formulario** o haga clic en el botón Orden de entrada en la barra de herramientas de la ventana:

+
+ 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.

4D will adjust the entry order accordingly.
+
+3. Repita el paso 2 tantas veces como sea necesario para establecer el orden de entrada de datos que desee.
+
+4. Cuando esté satisfecho con el orden de entrada de datos, haga clic en cualquier herramienta no seleccionada de la barra de herramientas o elija **Orden de entrada** en el menú **Formulario**. 4D vuelve al modo de funcionamiento normal del editor de formularios.
+
+> Sólo se muestra el orden de entrada de la página actual del formulario. Si el formulario contiene objetos editables en la página 0 o procedentes de un formulario heredado, el orden de entrada por defecto es el siguiente: objetos de la página 0 del formulario heredado > Objetos de la página 1 del formulario heredado > Objetos de la página 0 del formulario abierto > Objetos de la página actual del formulario abierto.
+
+#### Utilizar un grupo de entrada
+
+Cuando se cambia el orden de entrada, se puede seleccionar un grupo de objetos en el formulario para que el orden de entrada estándar se aplique a los objetos del grupo. Esto le permite definir fácilmente el orden de entrada para los formularios en los que los campos están separados en grupos o columnas.
+
+Para crear un grupo de entrada:
+
+1. Seleccione **Orden de entrada** en el menú *Formulario* o haga clic en el botón de la barra de herramientas.
+2. Dibuje un rectángulo de selección alrededor de los objetos que desee agrupar para la entrada de datos.
+
+Al soltar el botón del ratón, los objetos encerrados o tocados por el rectángulo siguen el orden de entrada por defecto. El orden de entrada de los otros objetos restantes se ajusta según sea necesario.
+
+#### Excluir un objeto del orden de entrada
+
+Por defecto, todos los objetos que soportan la propiedad enfocable se incluyen en el orden de entrada. Para excluir un objeto del orden de entrada:
+
+1. Seleccione el modo de orden de entrada, y luego
+
+2. **Mayúsculas-clic** en el objeto
+
+3. **haga clic derecho** en el objeto y seleccione la opción **Eliminar del orden de entrada** del menú contextual
+
+## Vista previa del CSS
+
+El editor de formularios le permite ver sus formularios con o sin valores CSS aplicados.
+
+Cuando se han definido [hojas de estilo](createStylesheet.md), los formularios (incluidos los formularios y subformularios heredados) se abren por defecto en el modo de vista previa CSS para su sistema operativo.
+
+### Seleccionando el modo de vista previa CSS
+
+La barra de herramientas del editor de formularios ofrece un botón CSS para ver los objetos con estilo:
+
+
+
+Seleccione uno de los siguientes modos de vista previa en el menú:
+
+| Icono barra de herramientas | Modo de vista previa CSS | Descripción |
+| --------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+|  | Ninguno | No se aplican valores CSS en el formulario y no se muestran valores o iconos CSS en la lista de propiedades. |
+|  | Windows | Los valores CSS para la plataforma Windows se aplican en el formulario. Los valores e iconos CSS que se muestran en la lista de propiedades. |
+|  | macOS | Los valores CSS para la plataforma macOS se aplican en el formulario. Los valores e iconos CSS que se muestran en la lista de propiedades. |
+
+> Si se define un tamaño de fuente demasiado grande para un objeto en una hoja de estilo o JSON, el objeto se renderizará automáticamente para acomodar la fuente, sin embargo el tamaño del objeto no se modificará.
+
+El modo de vista previa CSS refleja el orden de prioridad aplicado a las hojas de estilo frente a los atributos JSON, tal y como se define en la sección [JSON vs Hoja de estilo](stylesheets.html#json-vs-style-sheet).
+
+Una vez seleccionado el modo de vista previa CSS, los objetos se muestran automáticamente con los estilos definidos en una hoja de estilo (si la hay).
+
+> Al copiar o duplicar objetos, sólo se copian las referencias CSS (si las hay) y los valores JSON.
+
+### Soporte CSS en la Lista de Propiedades
+
+En el modo Vista Previa CSS, si el valor de un atributo ha sido definido en una hoja de estilo, el nombre del atributo aparecerá con un icono CSS junto a él en la Lista de Propiedades. Por ejemplo, los valores de los atributos definidos en esta hoja de estilo:
+
+```4d
+.myButton {
+font-family: comic sans;
+font-size: 14;
+stroke: #800080;
+}
+```
+
+se muestran con un icono CSS en la lista de propiedades:
+
+
+
+Un valor de atributo definido en una hoja de estilo puede ser anulado en la descripción del formulario JSON (excepto si el CSS incluye la declaración `!important`, ver más abajo). En este caso, la lista de propiedades muestra el valor del formulario JSON en **negrita**. Puede restablecer el valor a su definición de hoja de estilo con los atajos **Ctrl + clic** (Windows) o **Comando + clic** (macOs).
+
+> Si un atributo ha sido definido con la declaración `!important` para un grupo, un objeto dentro de un grupo, o cualquier objeto dentro de una selección de múltiples objetos, el valor de ese atributo está bloqueado y no puede ser cambiado en la Lista de Pr
+
+#### Lista de propiedades de iconos CSS
+
+| Icono | Descripción |
+| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+|  | Indica que un valor de atributo ha sido definido en una hoja de estilo |
+|  | Indica que un valor de atributo ha sido definido en una hoja de estilo con la declaración `!important` |
+|  | Se muestra cuando un valor de atributo definido en una hoja de estilo para al menos un elemento de un grupo o una selección de varios objetos es diferente de los demás objetos |
+
+## Creación de list box
+
+Puede crear rápidamente nuevos list box de tipo selección de entidades con el **-Generador de list box**. El nuevo list box puede ser utilizado inmediatamente o puede ser editado a través del Editor de formularios.
+
+El generador de list box le permite crear y llenar los list box de tipo selección de entidades en unas pocas y sencillas operaciones.
+
+### Utilización del generador de list box
+
+1. En la barra de herramientas del Editor de formularios, haga clic en el icono del generador de list box:
+
+
+
+Se muestra el generador de list box:
+
+
+
+2. Seleccione una tabla de la lista desplegable **Tabla**:
+
+
+
+3. Seleccione los campos del list box en el área **Campos**:
+
+
+
+Por defecto, se seleccionan todos los campos. Puede seleccionar o deseleccionar los campos individualmente o utilizar **Ctrl+clic** (Windows) o **Cmd+clic** (macOS) para seleccionarlos o deseleccionarlos todos a la vez.
+
+Puede cambiar el orden de los campos arrastrándolos y soltándolos.
+
+4. La expresión para llenar las líneas del list box a partir de la selección de la entidad se llena previamente:
+
+
+
+Esta expresión puede modificarse si es necesario.
+
+5. Al hacer clic en el botón **Copiar** se copiará la expresión para cargar todos los registros en la memoria:
+
+
+
+6. Haga clic en el botón **Crear un widget** para crear el list box.
+
+
+
+El list box final:
+
+
+
+## Insertar campos
+
+El botón **Insertar campos** inserta en el formulario todos los campos (excepto los de tipo objeto y blob) de la tabla del formulario, junto con sus etiquetas y respetando las normas de la interfaz. Este asistente es un atajo para diseñar formularios de entrada básicos o formularios listados.
+
+El botón **Insertar campos** sólo está disponible con formularios tabla.
+
+El diseño del formulario resultante depende del tipo de formulario:
+
+- **Formulario detallado**: al hacer clic en el botón **Insertar campos** se genera un formulario con un diseño de página:
+
+
+
+- **Formulario listado**: al hacer clic en el botón **Insertar campos** se genera un diseño de formulario listado con campos organizados en una sola línea y marcadores de área:
+
+
+
+## Atajos
+
+El editor de formularios 4D utiliza marcas para facilitar la visualización de las propiedades de los objetos. Puede encontrarlos en la barra de herramientas del formulario:
+
+
+
+El principio de esta función es el siguiente: cada escudo está asociado a una propiedad (por ejemplo, **Vistas**, que significa que el objeto "está en la vista actual"). Al activar una marca, 4D muestra un pequeño icono (marca) en la parte superior izquierda de cada objeto del formulario donde se aplica la propiedad.
+
+
+
+### Utilizar marcas
+
+Para activar una marca, haga clic en el icono *Marca* de la barra de herramientas hasta seleccionar la marca deseada. También puede hacer clic en la parte derecha del botón y seleccionar el tipo de marca que desea mostrar directamente en el menú asociado:
+
+Si no quiere mostrar marcas, seleccione **Sin marcas** en el menú de selección.
+
+> La vista actual no se puede ocultar.
+
+### Descripciones de marcas
+
+A continuación se describe cada tipo de escudo:
+
+| Icono | Nombre | Se muestra... |
+| ----------------------------------------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+|  | Método objeto | Para los objetos con un método objeto asociado |
+|  | Acción estándar | Para los objetos con una acción estándar asociada |
+|  | Redimensionamiento | Para los objetos con al menos una propiedad de redimensionamiento, indica la combinación de propiedades actuales |
+|  | Orden de entrada | En el caso de los objetos editables, indica el número de orden de entrada |
+|  | Vista actual | Para todos los objetos de la vista actual |
+|  | [Hojas de estilo](stylesheets.html) | Para objetos con uno o más valores de atributos reemplazados por una hoja de estilo. |
+|  | Filtro | Para los objetos introducibles con un filtro de entrada asociado |
+|  | Mensaje de ayuda | Para los objetos con un mensaje de ayuda asociado |
+|  | Localizado | Para los objetos cuya etiqueta proviene de una referencia (etiqueta que empieza por ":"). La referencia puede ser de tipo recurso (STR#) o XLIFF |
+|  | Sin marcas | No aparecen marcas |
+
+## Vistas
+
+El editor de formularios de 4D le permite crear formularios complejos distribuyendo los objetos formulario entre distintas vistas que pueden ocultarse o mostrarse según sea necesario.
+
+Por ejemplo, puede distribuir los objetos según su tipo (campos, variables, objetos estáticos, etc.). Todo tipo de objeto formulario, incluidos los subformularios y las áreas de plug-in, puede incluirse en las vistas.
+
+No hay límite en el número de vistas por formulario. Puedes crear tantas vistas diferentes como necesite. Además, cada vista puede mostrarse, ocultarse y/o bloquearse.
+
+La gestión de las vistas se realiza a través de la paleta de vistas.
+
+
+
+### Acceder a la paleta de vistas
+
+Hay tres formas de acceder a la paleta de vistas:
+
+- **Barra de herramientas**: haga clic en el icono Vistas de la barra de herramientas del Editor de formularios. (Este icono aparece en gris cuando al menos un objeto pertenece a una vista distinta de la vista por defecto.)
+
+| Sólo vista por defecto | Con vistas adicionales |
+| :-----------------------------------------------------: | :---------------------------------------------------: |
+|  |  |
+
+- **Menú contextual** (formulario u objeto): haga clic derecho en cualquier lugar del editor de formularios o de un objeto, y seleccione **Vista actual**
+
+
+
+La vista actual se indica con una marca de verificación (por ejemplo, "Dirección de trabajo" en la imagen superior)
+
+- **Menú Formulario**: haga clic en el menú **Formulario** y seleccione **Mostrar la lista**
+
+
+
+### Antes de comenzar
+
+Aquí hay algunas cosas importantes que hay que saber antes de empezar a trabajar con vistas:
+
+- **Contexto de uso**: las vistas son una herramienta puramente gráfica que sólo se puede utilizar en el Editor de formularios; no se puede acceder a las vistas por programación ni en el modo Aplicación.
+
+- **Vistas y páginas**: Los objetos de una misma vista pueden pertenecer a diferentes páginas del formulario; sólo se pueden mostrar los objetos de la página actual (y de la página 0 si es visible), independientemente de la configuración de las vistas.
+
+- **Vistas y niveles**: las vistas son independientes de los niveles de los objetos; no existe una jerarquía de visualización entre las diferentes vistas.
+
+- **Vistas y grupos**: sólo se pueden agrupar los objetos que pertenecen a la vista actual.
+
+- **Vistas actuales y por defecto**: la vista por defecto es la primera vista de un formulario y no se puede eliminar; la vista actual es la que se está editando y el nombre se muestra en negrita.
+
+### Gestión de vistas
+
+#### Crear vistas
+
+Todo objeto creado en un formulario se coloca en la primera vista ("Vista 1") del formulario. La primera vista es **siempre** la vista por defecto, indicada por (por defecto) después del nombre. El nombre de la vista puede cambiarse (ver [Renombrar vistas](#renaming-views)), sin embargo sigue siendo la vista por defecto.
+
+
+
+Hay dos maneras de añadir vistas adicionales:
+
+- Haga clic en el botón **Añadir una nueva vista** en la parte inferior de la paleta Vista:
+
+
+
+- Haga clic con el botón derecho en una vista existente y seleccione **Insertar vista**:
+
+
+
+No hay límite en el número de vistas.
+
+#### Renombrar vistas
+
+Por defecto las vistas se nombran como "Vista" + el número de la vista, sin embargo puede cambiar estos nombres para mejorar la legibilidad y adaptarse mejor a sus necesidades.
+
+Para cambiar el nombre de una vista, puede utilizar:
+
+- Hacer doble clic directamente en el nombre de la vista (la vista seleccionada en este caso). El nombre se convierte entonces en editable:
+
+
+
+- Haga clic derecho en el nombre de la vista. El nombre se convierte entonces en editable:
+
+
+
+#### Reordenar las vistas
+
+Puede cambiar el orden de visualización de las vistas haciendo arrastrar y soltar dentro de la paleta de vistas.
+
+Tenga en cuenta que la vista por defecto no cambia:
+
+
+
+#### Eliminar vistas
+
+Para cambiar el nombre de una vista, puede utilizar:
+
+- Haga clic en el botón **Eliminar la vista seleccionada** en la parte inferior de la paleta Vista:
+
+
+
+- Haga clic derecho en el nombre de la vista y seleccione **Eliminar la vista**:
+
+
+
+> La vista actual no se puede bloquear.
+
+### Utilización de las vistas
+
+Una vez creadas las vistas, puede utilizar la paleta de vistas para:
+
+- Añadir un objeto a las vistas,
+- Mover los objetos de una vista a otra,
+- Seleccionar todos los objetos de la misma vista con un solo clic,
+- Mostrar u ocultar objetos para cada vista,
+- Bloquear los objetos de una vista.
+
+#### Añadir los objetos a las vistas
+
+Un objeto sólo puede pertenecer a una única vista.
+
+Para crear un objeto en otra vista, basta con seleccionar la vista en la paleta de vistas (antes de crear el objeto) haciendo clic en su nombre (se muestra un icono de edición para la [Vista actual](#before-you-begin) y el nombre aparece en negrita):
+
+
+
+#### Mover objetos entre vistas
+
+También es posible mover uno o más objetos de una vista a otra. En el formulario, seleccione el o los objetos cuya vista desea modificar. La lista de vistas indica, utilizando un símbolo, la vista a la que pertenece la selección:
+
+
+
+> La selección puede contener varios objetos pertenecientes a diferentes vistas.
+
+Simplemente seleccione la vista de destino, haga clic derecho y seleccione **Mover a**:
+
+
+
+O
+
+Seleccione la vista de destino de la selección y haga clic en el botón **Mover a** de la parte inferior de la paleta de vistas:
+
+
+
+La selección se coloca entonces en la nueva vista:
+
+
+
+También puede mover un objeto a otra vista a través del menú contextual del objeto. Haga clic derecho en el objeto, seleccione **Mover a la vista** y seleccione una vista en la lista de vistas disponibles:
+
+
+
+> La [vista actual](#before-you-begin) se muestra en negrita.
+
+#### Seleccionar todos los objetos de una vista
+
+Puede seleccionar todos los objetos que pertenecen a la misma vista en la página actual del formulario. Esta función es útil para aplicar cambios globales a un conjunto de objetos.
+
+Para ello, haga clic derecho en la vista en la que desea seleccionar todos los objetos, haga clic en **Seleccionar todo**:
+
+
+
+También puede utilizar el botón situado en la parte inferior de la paleta de vistas:
+
+
+
+#### Mostrar u ocultar los objetos de una vista
+
+Puede mostrar u ocultar objetos pertenecientes a una vista en cualquier momento en la página actual del formulario. De este modo, podrá centrarse en determinados objetos al editar el formulario, por ejemplo.
+
+Por defecto, se muestran todas las vistas, como indica el icono *Mostrar/Ocultar*:
+
+
+
+Para ocultar una vista, haga clic en el icono *Mostrar/Ocultar*. Entonces se atenúa y los objetos de la vista correspondiente dejan de mostrarse en el formulario:
+
+
+
+> La [vista actual](#before-you-begin) no se puede ocultar.
+
+Para mostrar una vista que está oculta, simplemente selecciónela o haga clic en el icono *Mostrar/Ocultar* de esa vista.
+
+#### Bloquear los objetos de una vista
+
+Puede bloquear los objetos de una vista. Esto impide que se seleccionen, modifiquen o eliminen del formulario. Una vez bloqueado, un objeto no puede seleccionarse mediante un clic, un rectángulo o el comando **Seleccionar objetos similares** del menú contextual. Esta función es útil para evitar errores de manipulación.
+
+Por defecto, todas las vistas están desbloqueadas, como lo indica el icono *Bloquear/Desbloquear* que aparece junto a cada vista:
+
+
+
+Para bloquear los objetos de una vista, haga clic en el icono *Bloquear/Desbloquear*. El candado está cerrado, lo que significa que la vista está bloqueada:
+
+
+
+> La [vista actual](#before-you-begin) no se puede bloquear.
+
+Para desbloquear una vista que está bloqueada, basta con seleccionarla o hacer clic en el icono *Bloquear/Desbloquear* de esa vista.
+
+## Zoom
+
+Puede hacer zoom en el formulario actual. Pase al modo "Zoom" haciendo clic en el icono de la lupa o haciendo clic directamente en la barra de porcentaje deseada (50%, 100%, 200%, 400% y 800%):
+
+
+
+- Al hacer clic en la lupa, el cursor se convierte en una lupa. A continuación, puede hacer clic en el formulario para aumentar la visualización o mantener presionada la tecla Mayús y hacer clic para reducir el porcentaje de visualización.
+- Al hacer clic en una barra de porcentaje, la visualización se modifica inmediatamente.
+
+En el modo Zoom, todas las funciones del editor de formularios siguen estando disponibles(\*).
+
+(\*) Por razones técnicas, no es posible seleccionar los elementos del list box (encabezados, columnas, pies de página) cuando el editor de formularios está en modo Zoom.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/forms.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/forms.md
new file mode 100644
index 00000000000000..dc0b5a8bdb81ab
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/forms.md
@@ -0,0 +1,197 @@
+---
+id: forms
+title: Formularios
+---
+
+Los formularios ofrecen la interfaz a través de la cual se introduce, modifica e imprime la información en una aplicación de escritorio. Los usuarios interactúan con los datos de una base de datos mediante formularios e imprimen informes utilizando formularios. Los formularios pueden utilizarse para crear cajas de diálogo personalizadas, paletas o toda ventana personalizada.
+
+
+
+Los formularios también pueden contener otros formularios a través de las siguientes funcionalidades:
+
+- [objetos de subformulario](FormObjects/subform_overview.md)
+- [formularios heredados](./properties_FormProperties.md#inherited-form-name)
+
+## Creación de formularios
+
+Puede añadir o modificar formularios 4D utilizando los siguientes elementos:
+
+- **La interfaz 4D Developer:** cree nuevos formularios desde el menú **Archivo** o la ventana del **Explorador**.
+- **El editor de formularios**: modifique sus formularios utilizando el **[editor de formularios](FormEditor/formEditor.md)**.
+- **El código JSON:** cree y diseñe sus formularios utilizando JSON y guarde los archivos de los formularios en la [ubicación adecuada](Project/architecture#sources). Ejemplo:
+
+```
+{
+ "windowTitle": "Hello World",
+ "windowMinWidth": 220,
+ "windowMinHeight": 80,
+ "method": "HWexample",
+ "pages": [
+ null,
+ {
+ "objects": {
+ "text": {
+ "type": "text",
+ "text": "Hello World!",
+ "textAlign": "center",
+ "left": 50,
+ "top": 120,
+ "width": 120,
+ "height": 80
+ },
+ "image": {
+ "type": "picture",
+ "pictureFormat": "scaled",
+ "picture": "/RESOURCES/Images/HW.png",
+ "alignment":"center",
+ "left": 70,
+ "top": 20,
+ "width":75,
+ "height":75
+ },
+ "button": {
+ "type": "button",
+ "text": "OK",
+ "action": "Cancel",
+ "left": 60,
+ "top": 160,
+
+
+ "width": 100,
+ "height": 20
+ }
+ }
+ }
+ ]
+}
+```
+
+## Formulario proyecto y formulario tabla
+
+Hay dos categorías de formularios:
+
+- **Los formularios de proyecto** - Formularios independientes que no están unidos a ninguna tabla. Están pensados, sobre todo, para crear cajas de diálogo de interfaz, al igual que componentes. Los formularios proyecto pueden utilizarse para crear interfaces que cumplan fácilmente con los estándares del sistema operativo.
+
+- **Los formularios tablas** - Se adjuntan a tablas específicas y, por tanto, se benefician de funciones automáticas útiles para el desarrollo de aplicaciones basadas en bases de datos. Normalmente, una tabla tiene formularios de entrada y salida separados.
+
+Normalmente, se selecciona la categoría del formulario al crearlo, pero se puede cambiar después.
+
+## Páginas formulario
+
+Cada formulario consta de al menos dos páginas:
+
+- una página 1: una página principal, mostrada por defecto
+- una página 0: una página de fondo, cuyo contenido se muestra en todas las demás páginas.
+
+Puede crear varias páginas para un formulario de entrada. Si tiene más campos o variables de los que caben en una pantalla, puede crear páginas adicionales para mostrarlos. Las páginas múltiples le permiten hacer lo siguiente:
+
+- Coloque la información más importante en la primera página y la menos importante en otras.
+- Organice cada tema en su propia página.
+- Reducir o eliminar el desplazamiento durante la entrada de datos definiendo el [orden de entrada](formEditor.md#data-entry-order).
+- Deje espacio alrededor de los elementos del formulario para lograr un diseño de pantalla atractivo.
+
+Las páginas múltiples son útiles sólo para los formularios de entrada. No son para imprimir. Cuando se imprime un formulario de varias páginas, sólo se imprime la primera.
+
+No hay restricciones en el número de páginas que puede tener un formulario. El mismo campo puede aparecer un número ilimitado de veces en un formulario y en todas las páginas que desee. Sin embargo, cuantas más páginas tenga un formulario, más tiempo tardará en mostrarse.
+
+Un formulario multipáginas tiene una página de fondo y varias páginas de visualización. Los objetos que se colocan en la página de fondo pueden ser visibles en todas las páginas de visualización, pero sólo se pueden seleccionar y editar en la página de fondo. En los formularios multipágina, debe colocar su paleta de botones en la página de fondo. También es necesario incluir uno o más objetos en la página de fondo que ofrezcan las herramientas de navegación para el usuario.
+
+## Fluent UI rendering (Developer Preview)
+
+On Windows, 4D supports **Fluent UI** form rendering, Microsoft's modern graphical user interface design, based upon **WinUI 3** technology. **WinUI 3** is the foundation of the Windows App SDK and represents the upcoming Windows graphical interfaces.
+
+:::caution Vista previa para desarrolladores
+
+Fluent UI support is currently in the Developer Preview phase. No debe utilizarse en producción.
+
+:::
+
+:::info macOS
+
+This feature can only be used on Windows. On macOS, it is ignored.
+
+:::
+
+### Fluent UI rendering availability
+
+The Fluent UI rendering is available in the following execution environments only:
+
+- Windows with [Windows App SDK](https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/downloads) version 1.7.3 installed (you need to install this SDK on any Windows machine displaying your forms).
+- Fusionado aplicación 4D [autónomo](../Desktop/building.md#build-stand-alone-application) o [cliente](../Desktop/building.md#build-client-application)
+- [**Test application** feature](../Menus/bars.md#previewing-menu-bars) available from the Run menu.
+
+:::note
+
+If the Windows App SDK is not properly installed, 4D will render all your forms in classic mode with no error.
+
+:::
+
+### Enabling the Fluent UI rendering
+
+You can enable the Fluent UI rendering mode at the application level or at the form level. Form setting has priority over application setting.
+
+#### Application setting
+
+Check the **Use Fluent UI on Windows** option in the "Interface" page of the Settings dialog box.
+
+
+
+In this case, the Fluent UI rendering mode will be used by default on Windows for all forms.
+
+#### Form setting
+
+Each form can define its own rendering via the **Widget appearance** property. Las siguientes opciones están disponibles:
+
+- **Inherited**: inherits the global application setting (default),
+- **Classic**: uses the classic Windows style,
+- **Fluent UI**: enables the modern rendering based on Fluent UI.
+ 
+
+The corresponding [JSON form property](./properties_JSONref.md) is `fluentUI` with value undefined (i.e. inherited, default value), "true" or "false".
+
+### Features and limitations
+
+Fluent UI rendering offers modern and attractive controls, support of dark/light system themes, smoother rendering optimized for high-resolution displays, and consistent user experience aligned with recent Microsoft applications.
+
+When using 4D forms with Fluent UI rendering, you need to pay attention to the following points:
+
+- The `FORM Window theme` command returns the actual display theme of the current form. Possible values: "Classic" or "FluentUI". If there is no current form or the command is called on macOS, and empty string is returned.
+- If [`GET STYLE SHEET INFO`](../commands-legacy/get-style-sheet-info.md) is called in the context of a form, the information returned relates to the current appearance of the form (Classic or FluentUI). If the command is called outside the context of a form, the information returned relates to the [global project settings](#application-setting).
+- [`SET MENU ITEM STYLE`](../commands-legacy/set-menu-item-style.md) with `Underline` *itemStyle* parameter is not supported (ignored) for pop up menus.
+- A focus ring can be added to picture and text [inputs](../FormObjects/input_overview.md).
+- [Stepper](../FormObjects/stepper.md) form object does not support [double-click event](../Events/onDoubleClicked.md).
+- [Circle buttons](../FormObjects/button_overview.md#circle) are supported (similar as macOS).
+- The [`WA ZOOM IN`](../commands-legacy/wa-zoom-in.md) / [`WA ZOOM OUT`](../commands-legacy/wa-zoom-out.md) commands are not supported in Web areas with system rendering engine.
+
+## Formularios heredados
+
+Los formularios 4D pueden utilizar y ser utilizados como "formularios heredados", lo que significa que todos los objetos de *Formulario A* pueden ser utilizados en *Formulario B*. En este caso, *Formulario B* "hereda" los objetos de *Formulario A*.
+
+Las referencias a un formulario heredado están siempre activas: si se modifica un elemento de un formulario heredado (estilos de botón, por ejemplo), se modificarán automáticamente todos los formularios que utilicen este elemento.
+
+Todos los formularios (formularios tabla y formularios proyecto) pueden ser designados como un formulario heredado. Sin embargo, los elementos que contienen deben ser compatibles con el uso en diferentes tablas de la base de datos.
+
+Cuando se ejecuta un formulario, los objetos se cargan y combinan en el siguiente orden:
+
+1. Página cero del formulario heredado
+2. Página 1 del formulario heredado
+3. Página cero del formulario abierto
+4. Página actual del formulario abierto.
+
+Este orden determina el [orden de entrada](formEditor.md#data-entry-order) de los objetos en el formulario.
+
+> Sólo las páginas 0 y 1 del formulario heredado pueden aparecer en otros formularios.
+
+Las propiedades y el método de un formulario no se tienen en cuenta cuando ese formulario se utiliza como formulario heredado. Por otro lado, se llaman los métodos de los objetos que contiene.
+
+Para definir un formulario heredado, el [nombre del formulario heredado](properties_FormProperties.md#inherited-form-name) y la [Tabla de formularios heredada](properties_FormProperties.md#inherited-form-table) (para el formulario tabla) las propiedades deben definirse en la forma que heredará algo de otro formulario.
+
+Un formulario puede heredar de un formulario proyecto, definiendo la propiedad [Inherited Form Table](properties_FormProperties.md#inherited-form-table) en `\` en la Lista de propiedades (o " " en JSON).
+
+Para dejar de heredar un formulario, seleccione `\` en la lista de propiedades (o " " en JSON) para la propiedad [Inherited Form Name](properties_FormProperties.md#inherited-form-name).
+
+> Es posible definir un formulario heredado en un formulario que eventualmente se utilizará como formulario heredado para un tercer formulario. La combinación de objetos se realiza de forma recursiva. 4D detecta los bucles recursivos (por ejemplo, si el formulario [table1]form1 se define como el formulario heredado de [table1]form1, es decir, él mismo) e interrumpe la cadena de formularios.
+
+## Propiedades soportadas
+
+[Barra de menú asociada](properties_Menu.md#associated-menu-bar) - [Altura fija](properties_WindowSize.md#fixed-height) - [Ancho fijo](properties_WindowSize.md#fixed-width) - [Divisor de formulario](properties_Markers.md#form-break) - [Detalle de formulario](properties_Markers.md#form-detail) - [Pie de formulario](properties_Markers.md#form-footer) - [Encabezado de formulario](properties_Markers.md#form-header) - [Nombre de formulario](properties_FormProperties.md#form-name) - [Tipo de formulario](properties_FormProperties.md#form-type) - [Nombre de formulario heredado](properties_FormProperties.md#inherited-form-name) - [Tabla de formulario heredado](properties_FormProperties.md#inherited-form-table) - [Altura máxima](properties_WindowSize.md#maximum-height-minimum-height) - [Ancho máximo](properties_WindowSize.md#maximum-width-minimum-width) - [Método](properties_Action.md#method) - [Altura mínima](properties_WindowSize.md#maximum-height-minimum-height) - [Ancho mínimo](properties_WindowSize.md#maximum-width-minimum-width) - [Páginas](properties_FormProperties.md#pages) - [Configuración de impresión](properties_Print.md#settings) - [Publicado como subformulario](properties_FormProperties.md#published-as-subform) - [Guardar geometría](properties_FormProperties.md#save-geometry) - [Título de ventana](properties_FormProperties.md#window-title)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/macros.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/macros.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/macros.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/macros.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/objectLibrary.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/objectLibrary.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/objectLibrary.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/objectLibrary.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/pictures.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/pictures.md
new file mode 100644
index 00000000000000..ccec3fb9feb360
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/pictures.md
@@ -0,0 +1,86 @@
+---
+id: pictures
+title: Imágenes
+---
+
+4D soporta específicamente las imágenes utilizadas en sus formularios.
+
+## Formatos nativos soportados
+
+4D integra la gestión nativa de los formatos de imagen. Esto significa que las imágenes se mostrarán y almacenarán en su formato original, sin ninguna interpretación en 4D. Las características específicas de los diferentes formatos (sombreado, áreas transparentes, etc.) se mantendrán al ser copiados y pegados, y se mostrarán sin alteración. Este soporte nativo es válido para todas las imágenes almacenadas en los formularios de 4D: [imágenes estáticas](FormObjects/staticPicture.md) pegadas en el modo Diseño, imágenes pegadas en [objetos de entrada](FormObjects/input_overview.md) en ejecución,
+
+Los formatos de imagen más comunes son soportados en ambas plataformas: .jpeg, .gif, .png, .tiff, .bmp, etc. En macOS, el formato .pdf también está disponible para su codificación y descodificación.
+
+> La lista completa de formatos soportados varía según el sistema operativo y los códecs personalizados que estén instalados en las máquinas. Para saber qué códecs están disponibles, debe utilizar el comando `PICTURE CODEC LIST` (ver también la descripción de [tipo de datos imagen](Concepts/dt_picture.md)).
+
+### Formato de imagen no disponible
+
+Se muestra un icono específico para las imágenes guardadas en un formato que no está disponible en la máquina. La extensión del formato que falta se muestra en la parte inferior del icono:
+
+
+
+El icono se utiliza automáticamente en todos los lugares en los que se pretende visualizar la imagen:
+
+
+
+Este icono indica que la imagen no puede ser visualizada o manipulada localmente, pero puede ser guardada sin alteraciones para que pueda ser visualizada en otras máquinas. Este es el caso, por ejemplo, para las imágenes PDF en Windows, o las imágenes en formato PICT.
+
+## Imágenes de alta resolución
+
+4D soporta imágenes de alta resolución tanto en plataformas macOS como Windows. Las imágenes de alta resolución pueden definirse por el factor de escala o dpi.
+
+### Factor de escala
+
+Las pantallas de alta resolución tienen una mayor densidad de píxeles que las pantallas estándar tradicionales. Para que las imágenes se muestren correctamente en pantallas de alta resolución, el número de píxeles de la imagen debe multiplicarse por el *factor de escala* (*es decir*, dos veces más grande, tres veces más grande, etc.).
+
+Cuando se utilizan imágenes de alta resolución, se puede especificar el factor de escala añadiendo "@nx" en el nombre de la imagen (donde *n* designa el factor de escala). En la tabla siguiente, puede ver que el factor de escala se indica en los nombres de las imágenes de alta resolución, *circle@2x.png* y *circle@3x.png*.
+
+| Tipo de visualización | Factor de escala | Ejemplo |
+| --------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Resolución estándar | densidad de pixel 1:1. | **1x**  *circle.png* |
+| Alta resolución | La densidad de píxeles se ha multiplicado por 2 o 3. |
|
+
+Las imágenes de alta resolución con la convención @nx pueden utilizarse en los siguientes objetos:
+
+- [Imágenes estáticas](FormObjects/staticPicture.md)
+- [Botones](FormObjects/button_overview.md)/[radio](FormObjects/radio_overview.md)/[casillas de selección](FormObjects/checkbox_overview.md)
+- [Botones imagen](FormObjects/pictureButton_overview.md)/[imagen Pop-up](FormObjects/picturePopupMenu_overview.md)
+- [Controles de pestaña](FormObjects/tabControl.md)
+- [Encabezados de list box](FormObjects/listbox_overview.md#list-box-headers)
+- [Iconos de menú](Menus/properties.md#item-icon)
+
+4D prioriza automáticamente las imágenes con mayor resolución. 4D prioriza automáticamente las imágenes con mayor resolución. Incluso si un comando o propiedad especifica *circle.png*, se utilizará *circle@3x.png* (si existe).
+
+> Tenga en cuenta que la priorización de la resolución sólo se produce para la visualización de imágenes en pantalla, no se realiza una priorización automática al imprimir.
+
+### DPI
+
+Aunque 4D prioriza automáticamente la resolución más alta, existen, sin embargo, algunas diferencias de comportamiento en función de los ppp de la pantalla y de la imagen\*(\*)\*, y del formato de la imagen:
+
+| Operación | Comportamiento |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Soltar o pegar | If the picture has:
**72dpi or 96dpi** - The picture is "[Center](FormObjects/properties_Picture.md#center--truncated-non-centered)" formatted and the object containing the picture has the same number of pixels.
**Other dpi** - The picture is "[Scaled to fit](FormObjects/properties_Picture.md#scaled-to-fit)" formatted and the object containing the picture is equal to (picture's number of pixels \* screen dpi) / (picture's dpi)
**No dpi** - The picture is "[Scaled to fit](FormObjects/properties_Picture.md#scaled-to-fit)" formatted.
|
+| [Tamaño automático](https://doc.4d.com/4Dv20/4D/20.2/Setting-object-display-properties.300-6750143.en.html#148057) (menú contextual del editor de formularios) | Si el formato de visualización de la imagen es:
**[Escalado](FormObjects/properties_Picture.md#scaled-to-fit)** - El objeto que contiene la imagen se redimensiona según (número de píxeles de la imagen \* dpi de la pantalla) / (dpi de la imagen)
**No escalado** - El objeto que contiene la imagen tiene la misma cantidad de píxeles que la imagen.
|
+
+*(\*) Generalmente, macOS = 72 dpi, Windows = 96 dpi*
+
+## Imágenes en modo oscuro (sólo en macOS)
+
+Puede definir imágenes e iconos específicos que se utilizarán en lugar de las imágenes estándar cuando [los formularios utilicen el esquema oscuro](properties_FormProperties.md#color-scheme).
+
+Una imagen en modo oscuro se define de la siguiente manera:
+
+- la imagen en modo oscuro tiene el mismo nombre que la versión estándar (modo claro) con el sufijo "`_dark`"
+- la imagen en modo oscuro se almacena junto a la versión estándar.
+
+En tiempo de ejecución, 4D cargará automáticamente la imagen clara u oscura según el [modo de colores de formulario actual](../FormEditor/properties_FormProperties.md#color-scheme).
+
+
+
+## Coordenadas del ratón en una imagen
+
+4D le permite recuperar las coordenadas locales del ratón en un [objeto de entrada](FormObjects/input_overview.md) asociado con una [expresión de imagen](FormObjects/properties_Object.md#expression-type), en caso de un clic o un desplazamiento, incluso si se ha aplicado un desplazamiento o zoom a la imagen. Este mecanismo, similar al de un mapa de imágenes, puede utilizarse, por ejemplo, para manejar barras de botones desplazables o la interfaz de un software de cartografía.
+
+Las coordenadas se devuelven en las *MouseX* and *MouseY* [Variables Sistema](../Concepts/variables.md#system-variables). Las coordenadas se expresan en píxeles con respecto a la esquina superior izquierda de la imagen (0,0). Si el ratón está fuera del sistema de coordenadas de la imagen, se devuelve -1 en *MouseX* y *MouseY*.
+
+Puede obtener el valor de estas variables como parte de los eventos de formulario [`On Clicked`](Events/onClicked.md), [`On Double Clicked`](Events/onDoubleClicked.md), [`On Mouse up`](Events/onMouseUp.md), [`On Mouse Enter`](Events/onMouseEnter.md) o [`On Mouse Move`](Events/onMouseMove.md).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Action.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Action.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Action.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Action.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_FormProperties.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_FormProperties.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_FormProperties.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_FormProperties.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_FormSize.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_FormSize.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_FormSize.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_FormSize.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_JSONref.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_JSONref.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_JSONref.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_JSONref.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Markers.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Markers.md
new file mode 100644
index 00000000000000..162789047315b6
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Markers.md
@@ -0,0 +1,112 @@
+---
+id: markers
+title: Marcadores
+---
+
+Estas propiedades permiten especificar la ubicación precisa de los marcadores en la regla vertical de un **formulario tabla**. Los marcadores se utilizan principalmente en los formularios de salida. Controlan la información que se lista y definen las áreas de encabezado, saltos, detalles y pie de página del formulario. Todo objeto que se coloque en estas áreas se mostrará o imprimirá en el lugar correspondiente.
+
+Siempre que se utilice cualquier formulario para la salida, ya sea para la visualización en pantalla o para la impresión, las líneas de marcador de salida tienen efecto y las áreas se muestran o imprimen en los lugares designados. Los marcadores también tienen efecto cuando un formulario se utiliza como formulario lista en un área de subformulario. Sin embargo, no tienen ningún efecto cuando se utiliza un formulario para introducir datos.
+
+Los métodos asociados a los objetos de estas áreas se ejecutan cuando las áreas se imprimen o se muestran siempre que se hayan activado los eventos correspondientes. Por ejemplo, un método objeto colocado en el área Encabezado se ejecuta cuando se produce el evento `On Header`.
+
+---
+
+## Ruptura de formulario
+
+Las áreas de Ruptura del formulario se muestran una vez al final de la lista de registros y se imprimen una vez después de imprimir los registros en un informe.
+
+El área Ruptura se define como el área comprendida entre la línea de control Detalle y la línea de control Ruptura. Puede haber [varias áreas de ruptura](#additional-areas) en su informe.
+
+Puede hacer que las áreas Ruptura sean más pequeñas o más grandes. Puede utilizar un área de pausa para mostrar información que no forme parte de los registros (instrucciones, fecha actual, hora actual, etc.), o para mostrar una línea u otro elemento gráfico que concluya la visualización de la pantalla. En un informe impreso, puede utilizar un área de Ruptura para calcular e imprimir subtotales y otros cálculos de resumen.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
+| markerBreak | integer | integer collection | Break marker position or collection of break marker positions in pixels. Valor mínimo: 0 |
+
+---
+
+## Formulario detallado
+
+El área Detalle del formulario se muestra en la pantalla y se imprime una vez por cada registro de un informe. El área Detalle se define como el área comprendida entre la línea de control Encabezado y la línea de control Detalle.
+
+Puede hacer el área Detalle más pequeña o más grande. Lo que coloque en el área Detalle se muestra o imprime una vez por cada registro. Lo más habitual es colocar campos o variables en el área Detalle para que se muestre o imprima la información de cada registro, pero también se pueden colocar otros elementos en el área Detalle.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | --------------------------------------------------------------------------- |
+| markerBody | integer | Posición del marcador de detalle. Mínimo: 0 |
+
+---
+
+## Pie del formulario
+
+El área de pie de página del formulario se muestra en pantalla bajo la lista de registros. Siempre se imprime al final de cada página de un informe. El área de pie de página se define como el área comprendida entre la línea de control de salto y la línea de control de pie de página.
+
+Puede hacer que el área del pie de página sea más pequeña o más grande.
+
+Puede utilizar el área de pie de página para imprimir gráficos, números de página, la fecha actual o cualquier texto que desee en la parte inferior de cada página de un informe. En los formularios de salida diseñados para su uso en pantalla, el área de pie de página suele contener botones que ofrecen al usuario opciones como realizar una búsqueda u ordenación, imprimir registros o guardar el informe actual. Se aceptan los objetos activos.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ------------------------- |
+| markerFooter | integer | mínimo: 0 |
+
+---
+
+## Encabezado del formulario
+
+El área de encabezado del formulario se muestra en la parte superior de cada pantalla y se imprime en la parte superior de cada página de un informe. El área de encabezado se define como el área por encima de la línea de control del encabezado.
+
+Puede hacer el área Encabezado más pequeña o más grande. Puede utilizar el área Encabezado para los nombres de las columnas, para instrucciones, información adicional o incluso un gráfico como el logotipo de una empresa o un patrón decorativo.
+
+También puede colocar y utilizar objetos activos en el área de encabezado de los formularios de salida mostrados como subformularios, en la ventana de visualización de registros o utilizando los comandos `DISPLAY SELECTION` y `MODIFY SELECTION`. Se pueden insertar los siguientes objetos activos:
+
+- Botones, botones imagen,
+- Combo boxes, listas desplegables, menús emergentes de imágenes,
+- listas jerárquicas, list boxes
+- Botones de radio, casillas de selección, casillas de selección 3D,
+- Indicadores de progreso, reglas, steppers, spinners.
+
+A los botones insertados se les pueden asignar acciones estándar como `Add Subrecord`, `Cancel` (listas visualizadas utilizando `DISPLAY SELECTION` y `MODIFY SELECTION`) o `Automatic splitter`. Los siguientes eventos se aplican a los objetos activos que inserte en el área Encabezado: `On Load`, `On Clicked`, `On Header`, `On Printing Footer`, `On Double Clicked`, `On Drop`, `On Drag Over`, `On Unload`. Tenga en cuenta que el método formulario se llama con el evento `On Header` después de llamar a los métodos del objeto del área.
+
+El formulario puede contener [áreas de encabezado adicionales](#additional-areas) que se asociarán a rupturas adicionales. Se imprime un Encabezado nivel 1 justo antes de imprimir los registros agrupados por el primer campo ordenado.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
+| markerHeader | integer | integer collection | Header marker position or collection of header marker positions in pixels. Valor mínimo: 0 |
+
+## Áreas adicionales
+
+Puede crear áreas de Ruptura y Encabezados adicionales para un informe. Estas áreas adicionales permiten imprimir subtotales y otros cálculos en un informe y mostrar otra información de forma eficaz.
+
+Las áreas adicionales se definen cuando se utiliza una colección de posiciones en las propiedades [Ruptura](#form-break) y [Encabezado](#form-header).
+
+> En el editor de formularios 4D, puede crear líneas de control adicionales manteniendo presionada la tecla **Alt** mientras hace clic en el marcador de control apropiado.
+
+Un formulario comienza siempre con las áreas de Encabezado, Detalle, Nivel 0 y Pie de página.
+
+La Ruptura en el nivel 0 cero toma todos los registros; se produce después de imprimir todos los registros. Se pueden añadir áreas de ruptura adicionales, es decir, un nivel de ruptura 1, un nivel de ruptura 2, etc.
+
+Un nivel de Ruptura 1 se produce después de imprimir los registros agrupados por el primer campo ordenado.
+
+| Etiqueta | Descripción | Imprime después de grupos creados por |
+| -------- | ------------------ | ------------------------------------- |
+| B1 | Nivel de ruptura 1 | Primer campo ordenado |
+| B2 | Nivel de ruptura 2 | Segundo campo ordenado |
+| B3 | Nivel de ruptura 3 | Tercer campo ordenado |
+
+Las áreas adicionales del encabezado están asociadas a las interrupciones. Se imprime un Encabezado nivel 1 justo antes de imprimir los registros agrupados por el primer campo ordenado.
+
+| Etiqueta | Descripción | Imprime después de grupos creados por |
+| -------- | ------------------------ | ------------------------------------- |
+| H1 | Encabezado en el nivel 1 | Primer campo ordenado |
+| H2 | Encabezado en el nivel 2 | Segundo campo ordenado |
+| H3 | Encabezado en el nivel 3 | Tercer campo ordenado |
+
+Si utiliza la función `Subtotal` para iniciar el procesamiento de Rupturas, deberá crear un área de Pausa para cada nivel de Ruptura que generará el orden de clasificación, menos uno. Si no necesita imprimir nada en una de las áreas de Ruptura, puede reducir su tamaño a nada colocando su marcador sobre otra línea de control. Si tiene más niveles de clasificación que áreas de pausa, la última área de pausa se repetirá durante la impresión.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Menu.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Menu.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Menu.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Menu.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Print.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Print.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_Print.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_Print.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_WindowSize.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_WindowSize.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormEditor/properties_WindowSize.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormEditor/properties_WindowSize.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/buttonGrid_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/buttonGrid_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/buttonGrid_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/buttonGrid_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/button_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/button_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/button_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/button_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/checkbox_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/checkbox_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/checkbox_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/checkbox_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/comboBox_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/comboBox_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/comboBox_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/comboBox_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/dropdownList_Overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/dropdownList_Overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/dropdownList_Overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/dropdownList_Overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/formObjects_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/formObjects_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/formObjects_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/formObjects_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/groupBox.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/groupBox.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/groupBox.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/groupBox.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/input_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/input_overview.md
new file mode 100644
index 00000000000000..209a1daf6f52d8
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/input_overview.md
@@ -0,0 +1,55 @@
+---
+id: inputOverview
+title: Entrada
+---
+
+Las entradas permiten añadir expresiones editables o no editables, como campos de base de datos y [variables](Concepts/variables.md) a sus formularios. Las entradas pueden manejar datos basados en caracteres (texto, fechas, números...) o imágenes:
+
+
+
+Las entradas pueden contener [expresiones asignables o no asignables](Concepts/quick-tour.md#assignable-vs-non-assignable-expressions).
+
+Además, las entradas pueden ser [editables o no editables](properties_Entry.md#enterable). Una entrada introducible acepta los datos. Puede definir los controles de entrada de datos para el objeto. Una entrada no editable sólo puede mostrar valores, pero no puede ser editada por el usuario.
+
+Puede gestionar los datos con los [métodos](Concepts/methods.md) objeto o formulario.
+
+:::note
+
+Por razones de seguridad, en las áreas de entrada [multiestilo](./properties_Text.md#multi-style), cuando se pegan fórmulas desde una aplicación 4D diferente o un entorno externo, solo se pegan los *valores calculados* (texto o imágenes) disponibles en el momento de la copia. Si no hay ningún valor disponible (por ejemplo, la fórmula nunca se calculó), 4D pega la fuente de la fórmula como texto sin formato.
+
+:::
+
+### Ejemplo JSON:
+
+```4d
+ "myText": {
+ "type": "input", //definir el tipo de objeto
+ "spellcheck": true, //activar la verificación ortográfica
+ "left": 60, //posición izquierda en el formulario
+ "top": 160, //posición superior en el formulario
+ "width": 100, //ancho del objeto
+ "height": 20 //altura del objeto
+ }
+```
+
+## Propiedades soportadas
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ---------------------------------------- |
+| 19 R7 | Soporte de la propiedad Radio de esquina |
+
+
+
+[Permitir selector de fuente/color](properties_Text.md#allow-fontcolor-picker) - [Formato alfa](properties_Display.md#alpha-format) - [Corrección ortográfica automática](properties_Entry.md#auto-spellcheck) - [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) - [Negrita](properties_Text.md#bold) - [Formato booleano](properties_Display.md#text-when-falsetext-when-true) - [Estilo de línea de borde](properties_BackgroundAndBorder.md#border-line-style) - [Inferior](properties_CoordinatesAndSizing.md#bottom) - [Lista de opciones](properties_DataSource.md#choice-list) - [Clase](properties_Object.md#css-class) - [Menú contextual](properties_Entry.md#context-menu) - [Radio de esquina](properties_CoordinatesAndSizing.md#corner-radius) - [Formato Fecha](properties_Display.md#date-format) - [Valor por defecto](properties_RangeOfValues.md#default-value) - [Arrastrable](properties_Action.md#draggable) - [Soltable](properties_Action.md#droppable) - [Enterable](properties_Entry.md#enterable) - [Filtro de entrada](properties_Entry.md#entry-filter) - [Lista excluida](properties_RangeOfValues.md#excluded-list) - [Tipo de expresión](properties_Object.md#expression-type) - [Color de relleno](properties_BackgroundAndBorder.md#background-color--fill-color) - [Fuente](properties_Text.md#font) - [Color de fuente](properties_Text.md#font-color) - [Tamaño de fuente](properties_Text.md#font-size) - [Alto](properties_CoordinatesAndSizing.md#height) - [Hide focus rectangle](properties_Appearance.md#hide-focus-rectangle) - [Alineación horizontal](properties_Text.md#horizontal-alignment) - [Barra de desplazamiento horizontal](properties_Appearance.md#horizontal-scroll-bar) - [Tamaño horizontal](properties_ResizingOptions.md#horizontal-sizing) - [Cursiva](properties_Text.md#italic) - [Izquierda](properties_CoordinatesAndSizing.md#left) - [Multilínea](properties_Entry.md#multiline) - [Multiestilo](properties_Text.md#multi-style) - [Formato numérico](properties_Display.md#formato-numérico) - [Nombre de objeto](properties_Object.md#nombre-de-objeto) - [Orientación](properties_Text.md#orientación) - [Formato de imagen](properties_Display.md#formato-de-imagen) - [Marcador de posición](properties_Entry.md#placeholder) - [Marco de impresión](properties_Print.md#print-frame) - [Lista obligatoria](properties_RangeOfValues.md#required-list) - [Derecha](properties_CoordinatesAndSizing.md#right) - [Selección siempre visible](properties_Entry.md#selection-always-visible) - [Almacenar con etiquetas de estilo predeterminadas](properties_Text.md#store-with-default-style-tags) - [Texto cuando False/Texto cuando True](properties_Display.md#text-when-falsetext-when-true) - [Formato de tiempo](properties_Display.md#formato-de-tiempo) - [Arriba](properties_CoordinatesAndSizing.md#top) - [Tipo](properties_Object.md#type) - [Subrayado](properties_Text.md#underline) - [Variable o expresión](properties_Object.md#variable-or-expression) - [Barra de desplazamiento vertical](properties_Appearance.md#barra-de-desplazamiento-vertical) - [Tamaño vertical](properties_ResizingOptions.md#tamaño-vertical) - [Visibilidad](properties_Display.md#visibilidad) - [Ancho](properties_CoordinatesAndSizing.md#ancho) - [Ajuste de palabras](properties_Display.md#wordwrap)
+
+---
+
+## Alternativas
+
+También puede representar expresiones de campos y de variables en sus formularios utilizando objetos alternativos, más concretamente:
+
+- Puede mostrar e introducir datos de los campos de la base directamente en las columnas [de tipo List box](listbox_overview.md).
+- Puede representar un campo de lista o una variable directamente en un formulario utilizando los objetos [Menús desplegables/Listas desplegables](dropdownList_Overview.md) y [Combo Box](comboBox_overview.md).
+- Puede representar una expresión booleana como una [casilla de selección](checkbox_overview.md) o como un objeto [botón radio](radio_overview.md).
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/list_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/list_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/list_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/list_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/listbox_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/listbox_overview.md
new file mode 100644
index 00000000000000..492d678bcc786a
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/listbox_overview.md
@@ -0,0 +1,1227 @@
+---
+id: listboxOverview
+title: List Box
+---
+
+Los list boxes son objetos activos complejos que permiten mostrar e introducir datos en forma de columnas sincronizadas. Pueden vincularse a contenidos de la base de datos, como selecciones de entidades y secciones de registros, o a cualquier contenido del lenguaje, como colecciones y arrays. Incluyen funciones avanzadas relativas a la entrada de datos, la ordenación de columnas, la gestión de eventos, el aspecto personalizado, el desplazamiento de columnas, etc.
+
+
+
+Un list box contiene una o varias columnas cuyo contenido se sincroniza automáticamente. El número de columnas es, en teoría, ilimitado (depende de los recursos de la máquina).
+
+## Generalidades
+
+### Principios de utilización básicos
+
+Durante la ejecución, los list box permiten visualizar e introducir datos en forma de listas. Para hacer que una celda sea editable ([si se permite la entrada para la columna](#managing-entry)), basta con pulsar dos veces sobre el valor que contiene:
+
+
+
+Los usuarios pueden introducir y mostrar el texto en varias líneas dentro de una celda de list box. Para añadir un salto de línea, presione **Ctrl+Retorno de carro** en Windows o **Opción+Retorno de carro** en macOS.
+
+En las celdas se pueden mostrar booleanos e imágenes, así como fechas, horas o números. Es posible ordenar los valores de las columnas haciendo clic en un encabezado ([ordenación estándar](#managing-sorts)). Todas las columnas se sincronizan automáticamente.
+
+También es posible cambiar el tamaño de cada columna, y el usuario puede modificar el orden de las [columnas](properties_ListBox.md#locked-columns-and-static-columns) y [líneas](properties_Action.md#movable-rows) moviéndolas con el ratón, si esta acción e Tenga en cuenta que los list box se pueden utilizar en [modo jerárquico](#hierarchical-list-boxes). Tenga en cuenta que los list box se pueden utilizar en [modo jerárquico](#hierarchical-list-boxes).
+
+El usuario puede seleccionar una o varias líneas utilizando los atajos estándar: **Mayúsculas+clic** para una selección adyacente y **Ctrl+clic** (Windows) o **Comando+clic** (macOS) para una selección no adyacente.
+
+### Partes de list box
+
+Un list box se compone de cuatro partes distintas:
+
+- el objeto list box en su totalidad,
+- las columnas,
+- los encabezados de las columnas, y
+- los pies de las columnas.
+
+
+
+Cada parte tiene su propio nombre y propiedades específicas. Por ejemplo, el número de columnas o el color alternativo de cada línea se define en las propiedades del objeto list box, el ancho de cada columna se define en las propiedades de las columnas y el tipo de fuente del encabezado se define en las propiedades de los encabezados.
+
+Es posible añadir un método objeto al objeto list box y/o a cada columna del list box. Los métodos objeto se llaman en el siguiente orden:
+
+1. Método objeto de cada columna
+2. Método objeto del list box
+
+El método objeto de columna obtiene los eventos que se producen en su [encabezado](#list-box-headers) y [pie](#list-box-footers).
+
+### Tipos de list box
+
+Hay varios tipos de list box, con sus propios comportamientos y propiedades específicas. Hay varios tipos de list box, con sus propios comportamientos y propiedades específicas.
+
+- **Arrays**: cada columna está ligada a un array 4D. Los list boxes basados en arrays pueden mostrarse como [list boxes jerárquicos](listbox_overview.md#hierarchical-list-boxes).
+- **Selección** (**Selección actual** o **Selección con nombre**): cada columna está vinculada a una expresión (por ejemplo, un campo) que se evalúa para cada registro de la selección.
+- **Collection o Entity selection**: cada columna está ligada a una expresión que se evalúa para cada elemento de la colección o cada entidad de la selección de entidades.
+
+> > > No es posible combinar diferentes tipos de list box en el mismo objeto list box. La fuente de datos se define cuando se crea el list box. Entonces ya no es posible modificarlo por programación.
+
+### Gestión de list boxes
+
+Se puede configurar completamente un objeto list box a través de sus propiedades, y también se puede gestionar dinámicamente por programación.
+
+El lenguaje 4D incluye un tema "List Box" dedicado a los comandos de list box, pero los comandos de otros temas, tales como "Propiedades de los objetos" o los comandos `EDIT ITEM` y `Displayed line number` también pueden ser utilizados. Para mayor información consulte la página [List Box Commands Summary](https://doc.4d.com/4Dv20/4D/20.6/List-Box-Commands-Summary.300-7487600.en.html) del manual *Lenguaje 4D*.
+
+## Objetos tipo List box
+
+### List box de tipo array
+
+En un list box de tipo array, cada columna debe estar asociada a un array unidimensional 4D; se pueden utilizar todos los tipos de array, a excepción de los arrays de punteros. El número de líneas se basa en el número de elementos del array.
+
+Por defecto, 4D asigna el nombre "ColumnX" a cada columna. Puede cambiarlo, así como las otras propiedades de la columna, en las [propiedades de las columnas](listbox_overview.md#column-specific-properties). El formato de visualización de cada columna también puede definirse mediante el comando `OBJECT SET FORMAT`.
+
+> Los list boxes de tipo array pueden mostrarse en [modo jerárquico](listbox_overview.md#hierarchical-list-boxes), con mecanismos específicos.
+
+Con los list box de tipo array, los valores introducidos o mostrados se gestionan utilizando el lenguaje 4D. También puede asociar una [lista de opciones](properties_DataSource.md#choice-list) con una columna para controlar la entrada de datos.
+Los valores de las columnas se gestionan mediante comandos de alto nivel de List box (como [`LISTBOX INSERT ROWS`](../commands/listbox-insert-rows) o `LISTBOX DELETE ROWS`), así como comandos de manipulación de arrays. Por ejemplo, para inicializar el contenido de una columna, puede utilizar la siguiente instrucción:
+
+```4d
+ARRAY TEXT(varCol;size)
+```
+
+También puede utilizar una lista:
+
+```4d
+LIST TO ARRAY("ListName";varCol)
+```
+
+> **Atención**: cuando un objeto List box contiene varias columnas de diferentes tamaños, sólo se mostrará el número de elementos del array (columna) más pequeño. Debe asegurarse de que cada array tenga el mismo número de elementos que los demás. Además, si una columna del list box está vacía (esto ocurre cuando el array asociado no fue declarado o dimensionado correctamente con el lenguaje), el list box no muestra nada.
+
+### List box de tipo selección
+
+En este tipo de list box, cada columna puede estar asociada a un campo (por ejemplo `[Employees]LastName)` o a una expresión. La expresión puede basarse en uno o más campos (por ejemplo, `[Employees]FirstName+" "[Employees]LastName`) o puede ser simplemente una fórmula (por ejemplo `String(Milliseconds)`). La expresión también puede ser un método proyecto, una variable o un elemento de array. La expresión también puede ser un método proyecto, una variable o un elemento de array.
+
+A continuación, el contenido de cada línea se evalúa en función de una selección de registros: la **selección actual** de una tabla o una **selección temporal**.
+
+En el caso de un list box basado en la selección actual de una tabla, cualquier modificación realizada desde la base de datos se refleja automáticamente en el list box, y viceversa. Por lo tanto, la selección actual es siempre la misma en ambos lugares.
+
+### List box colección o entity selection
+
+En este tipo de list box, cada columna debe estar asociada a una expresión. El contenido de cada línea se evalúa entonces por elemento de la colección o por entidad de la selección de entidades.
+
+Cada elemento de la colección o cada entidad está disponible como un objeto al que se puede acceder a través de la palabra clave [This](../Concepts/classes.md#this). A column expression can be a property path, a project method, a variable, or any formula, accessing each entity or collection element object through `This`, for example `This.` (o `This.value` en caso de una colección de valores escalares). La expresión también puede ser un método proyecto, una variable o un elemento de array.
+
+Cuando la fuente de datos es una entity selection, cualquier modificación realizada del lado del list box se guarda automáticamente en la base de datos. Por otro lado, las modificaciones realizadas en la base de datos son visibles en el list box después de que se hayan recargado las entidades modificadas.
+
+:::note
+
+Cuando se eliminan entidades, sus referencias permanecen en la selección de entidades con un valor *undefined*, por lo que aparecen filas en blanco en el list box. En este caso, puede llamar a la función [`.clean()`](API/EntitySelectionClass.md#clean) para obtener una nueva selección de entidades pero sin las referencias de entidades eliminadas.
+
+:::
+
+Cuando la fuente de datos es una colección, toda modificación realizada en los valores del list box se refleja en la colección. Cuando la fuente de datos es una colección, toda modificación realizada en los valores del list box se refleja en la colección. Por ejemplo:
+
+```4d
+myCol:=myCol.push("new value") //mostrar el nuevo valor en el list box
+```
+
+### Propiedades soportadas
+
+Las propiedades soportadas dependen del tipo de list box.
+
+| Propiedad | List box array | List box selección | List box colección o entity selection |
+| ------------------------------------------------------------------------------------------------- | -------------- | ------------------ | ------------------------------------- |
+| [Color de fondo alterno](properties_BackgroundAndBorder.md#alternate-background-color) | X | X | X |
+| [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) | X | X | X |
+| [Negrita](properties_Text.md#bold) | X | X | X |
+| [Expresión del color de fondo](properties_BackgroundAndBorder.md#background-color-expression) | | X | X |
+| [Estilo de línea de borde](properties_BackgroundAndBorder.md#border-line-style) | X | X | X |
+| [Inferior](properties_CoordinatesAndSizing.md#bottom) | X | X | X |
+| [Clase](properties_Object.md#css-class) | X | X | X |
+| [Colección o entity selection](properties_Object.md#collection-or-entity-selection) | | X | X |
+| [Redimensionamiento automático de columnas](properties_ResizingOptions.md#column-auto-resizing) | X | X | X |
+| [Elemento actual](properties_DataSource.md#current-item) | | | X |
+| [Posición actual del elemento](properties_DataSource.md#current-item-position) | | | X |
+| [Fuente de datos](properties_Object.md#data-source) | X | X | X |
+| [Nombre del formulario detallado](properties_ListBox.md#detail-form-name) | | X | |
+| [Mostrar encabezados](properties_Headers.md#display-headers) | X | X | X |
+| [Mostrar pies de página](properties_Footers.md#display-footers) | X | X | X |
+| [Doble clic en la fila](properties_ListBox.md#double-click-on-row) | | X | |
+| [Arrastrable](properties_Action.md#droppable) | X | X | X |
+| [Soltable](properties_Action.md#droppable) | X | X | X |
+| [Enfocable](properties_Entry.md#focusable) | X | X | X |
+| [Fuente](properties_Text.md#fuente) | X | X | X |
+| [Color de fuente](properties_Text.md#font-color) | X | X | X |
+| [Expresión de color de fuente](properties_Text.md#font-color-expression) | | X | X |
+| [Tamaño de fuente](properties_Text.md#font-size) | X | X | X |
+| [Altura (list box)](properties_CoordinatesAndSizing.md#height) | X | X | X |
+| [Altura (encabezados)](properties_Headers.md#height) | X | X | X |
+| [Altura (pies de página)](properties_Footers.md#height) | X | X | X |
+| [Ocultar líneas en blanco adicionales](properties_BackgroundAndBorder.md#hide-extra-blank-rows) | X | X | X |
+| [Ocultar rectángulo de enfoque](properties_Appearance.md#hide-focus-rectangle) | X | X | X |
+| [Ocultar resaltado de selección](properties_Appearance.md#hide-selection-highlight) | X | X | X |
+| [List Box jerárquico](properties_Object.md#array-list-box) | X | | |
+| [Conjunto de resaltado](properties_ListBox.md#highlight-set) | | X | |
+| [Alineación horizontal](properties_Text.md#alineación-horizontal) | X | X | X |
+| [Color de línea horizontal](properties_Gridlines.md#horizontal-line-color) | X | X | X |
+| [Relleno horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) | X | X | X |
+| [Barra de desplazamiento horizontal](properties_Appearance.md#horizontal-scroll-bar) | X | X | X |
+| [Tamaño horizontal](properties_ResizingOptions.md#horizontal-sizing) | X | X | X |
+| [Itálica](properties_Text.md#italic) | X | X | X |
+| [Izquierda](properties_CoordinatesAndSizing.md#izquierda) | X | X | X |
+| [Tabla maestra](properties_DataSource.md#master-table) | | X | |
+| [Expresión info Meta](properties_Text.md#meta-info-expression) | | | X |
+| [Método](properties_Action.md#method) | X | X | X |
+| [Líneas móviles](properties_Action.md#movable-rows) | X | | |
+| [Selección temporal](properties_DataSource.md#selection-name) | | X | |
+| [Número de columnas](properties_ListBox.md#number-of-columns) | X | X | X |
+| [Número de columnas bloqueadas](properties_ListBox.md#number-of-locked-columns) | X | X | X |
+| [Número de columnas estáticas](properties_ListBox.md#number-of-static-columns) | X | X | X |
+| [Nombre del objeto](properties_Object.md#object-name) | X | X | X |
+| [Derecha](properties_CoordinatesAndSizing.md#right) | X | X | X |
+| [Array de colores de fondo de fila](properties_BackgroundAndBorder.md#row-background-color-array) | X | | |
+| [Array de control de filas](properties_ListBox.md#row-control-array) | X | | |
+| [Array color de fuente de fila](properties_Text.md#row-font-color-array) | X | | |
+| [Altura de línea](properties_CoordinatesAndSizing.md#row-height) | X | | |
+| [Array altura de línea](properties_CoordinatesAndSizing.md#row-height-array) | X | | |
+| [Array de estilo de línea](properties_Text.md#row-style-array) | X | | |
+| [Elementos seleccionados](properties_DataSource.md#selected-items) | | | X |
+| [Modo de selección](properties_ListBox.md#selection-mode) | X | X | X |
+| [Edición con un solo clic](properties_Entry.md#single-click-edit) | X | X | X |
+| [Ordenable](properties_Action.md#sortable) | X | X | X |
+| [Acción estándar](properties_Action.md#standard-action) | X | | |
+| [Expresión de estilo](properties_Text.md#style-expression) | | X | X |
+| [Superior](properties_CoordinatesAndSizing.md#top) | X | X | X |
+| [Transparente](properties_BackgroundAndBorder.md#transparent) | X | X | X |
+| [Tipo](properties_Object.md#type) | X | X | X |
+| [Subrayado](properties_Text.md#underline) | X | X | X |
+| [Variable o Expresión](properties_Object.md#variable-or-expression) | X | X | |
+| [Alineación vertical](properties_Text.md#vertical-alignment) | X | X | X |
+| [Color de línea vertical](properties_Gridlines.md#vertical-line-color) | X | X | X |
+| [Relleno vertical](properties_CoordinatesAndSizing.md#vertical-padding) | X | X | X |
+| [Barra de desplazamiento vertical](properties_Appearance.md#vertical-scroll-bar) | X | X | X |
+| [Tamaño vertical](properties_ResizingOptions.md#vertical-sizing) | X | X | X |
+| [Visibilidad](properties_Display.md#visibility) | X | X | X |
+| [Ancho](properties_CoordinatesAndSizing.md#width) | X | X | X |
+
+> Las columnas, los encabezados y los pies de list box soportan propiedades específicas.
+
+### Eventos de formulario soportados {#supported-form-events}
+
+| Evento formulario | Propiedades adicionales devueltas (ver [Evento formulario](../commands/form-event.md) para las propiedades principales) | Comentarios |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| On After Edit |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On After Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On After Sort |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| *Las fórmulas compuestas no se pueden ordenar. (por ejemplo, This.firstName + This.lastName)* |
+| On Alternative Click |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *List box array únicamente* |
+| On Before Data Entry |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Before Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Begin Drag Over |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Clicked |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Close Detail |
[row](#propiedades adicionales)
| *List box Selección actual y Selección temporal únicamente* |
+| On Collapse |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *List box jerárquicos únicamente* |
+| On Column Moved |
| *List box arrays, selección actual y selección temporal únicamente* |
+| On Getting Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo al editar una celda* |
+| On Header Click |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| |
+| On Load | | |
+| On Losing Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo cuando la modificación de una celda se completa* |
+| On Mouse Enter |
[area](#additional-properties)
[areaName](#additional-properties)
[column](#additional-properties)
[columnName](#additional-properties)
[row](#additional-properties)
| |
+| On Mouse Leave | | |
+| On Mouse Move |
[area](#additional-properties)
[areaName](#additional-properties)
[column](#additional-properties)
[columnName](#additional-properties)
[row](#additional-properties)
| |
+| On Open Detail |
[row](#propiedades adicionales)
| *List box Selección actual y Selección temporal únicamente* |
+| On Row Moved |
[newPosition](#additional-properties)
[oldPosition](#additional-properties)
| *List box array únicamente* |
+| On Selection Change | | |
+| On Scroll |
[horizontalScroll](#additional-properties)
[verticalScroll](#additional-properties)
| |
+| On Unload | | |
+
+#### Propiedades adicionales {additional-properties}
+
+Los eventos formulario de los objetos list box o columnas de list box pueden devolver las siguientes propiedades adicionales:
+
+| Propiedad | Tipo | Descripción |
+| ---------------- | ------------ | ------------------------------------------------------------------------------------ |
+| area | text | Área de objeto list box ("header", "footer", "cell") |
+| areaName | text | Nombre del área |
+| column | entero largo | Número de columna |
+| columnName | text | Nombre de la columna |
+| footerName | text | Nombre del pie |
+| headerName | text | Nombre del encabezado |
+| horizontalScroll | entero largo | Positivo si el desplazamiento es hacia la derecha, negativo si es hacia la izquierda |
+| isRowSelected | boolean | True si la línea está seleccionada, de lo contrario False |
+| newPosition | entero largo | Nueva posición de la columna o línea |
+| newSize | entero largo | Nuevo tamaño (en píxeles) de la columna o línea |
+| oldPosition | entero largo | Posición anterior de la columna o línea |
+| oldSize | entero largo | Tamaño anterior (en píxeles) de la columna o línea |
+| row | entero largo | Número de línea |
+| verticalScroll | entero largo | Positivo si el desplazamiento es hacia abajo, negativo si es hacia arriba |
+
+> Si un evento se produce en una columna o línea "fake" que no existe, se suele devolver una cadena vacía.
+
+## Columnas list box {#list-box-columns}
+
+Un list box está formado por uno o varios objetos columna que tienen propiedades específicas. Puede seleccionar una columna de list box en el editor de formularios haciendo clic en ella cuando el objeto list box está seleccionado:
+
+
+
+Puede definir propiedades estándar (texto, color de fondo, etc.) para cada columna del list box; estas propiedades tienen prioridad sobre las del objeto list box.
+
+> Puede definir el [tipo de expresión](properties_Object.md#expression-type) para las columnas de list box de tipo array (cadena, texto, número, fecha, hora, imagen, booleano u objeto).
+
+### Propiedades específicas de columna {#column-specific-properties}
+
+[Formato Alfa](properties_Display.md#alpha-format) - [Color de fondo alternativo](properties_BackgroundAndBorder.md#alternate-background-color) - [Altura de línea automática](properties_CoordinatesAndSizing.md#automatic-row-height) - [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) - [Expresión de color de fondo](properties_BackgroundAndBorder.md#background-color-expression) - [Negrita](properties_Text.md#bold) - [Lista de selección](properties_DataSource.md#choice-list) - [Clase](properties_Object.md#css-class) - [Tipo de datos (selección y columna de list box colección)](properties_DataSource.md#data-type-list) - [Formato Fecha](properties_Display.md#date-format) - [Valores por defecto](properties_DataSource.md#default-list-of-values) - [Tipo de visualización](properties_Display.md#display-type) - [Editable](properties_Entry.md#enterable) - [Filtro de entrada](properties_Entry.md#entry-filter) - [Lista excluída](properties_RangeOfValues.md#excluded-list) - [Expresión](properties_DataSource.md#expression) - [Tipo de expresión (column de list box array)](properties_Object.md#expression-type) - [Fuente](properties_Text.md#font) - [Color de fuente](properties_Text.md#font-color) - [Alineación Horizontal](properties_Text.md#horizontal-alignment) - [Relleno Horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) - [Itálica](properties_Text.md#italic) - [Invisible](properties_Display.md#visibility) - [Ancho máximo](properties_CoordinatesAndSizing.md#maximum-width) - [Método](properties_Action.md#method) - [Ancho mínimo](properties_CoordinatesAndSizing.md#minimum-width) - [Multiestilo](properties_Text.md#multi-style) - [Formato número](properties_Display.md#number-format) - [Nombre de objeto](properties_Object.md#object-name) - [Formato Imagen](properties_Display.md#picture-format) - [Redimensionable](properties_ResizingOptions.md#resizable) - [Lista requerida](properties_RangeOfValues.md#required-list) - [Array de color de fondo de línea](properties_BackgroundAndBorder.md#row-background-color-array) - [Array de color de fuente de línea](properties_Text.md#row-font-color-) - [Array de estilo de línea](properties_Text.md#row-style-array) - [Guardar como](properties_DataSource.md#save-as) - [Expresión de estilo](properties_Text.md#style-expression) - [Texto cuando False/Texto cuando True](properties_Display.md#text-when-falsetext-when-true) - [Formato Hora](properties_Display.md#time-format) - [Truncar con elipsis](properties_Display.md#truncate-with-ellipsis) - [Subrayar](properties_Text.md#underline) - [Variable o Expresión](properties_Object.md#variable-or-expression) - Alineación
+Vertical - [Relleno vertical](properties_CoordinatesAndSizing.md#vertical-padding) - [Ancho](properties_CoordinatesAndSizing.md#width) - [Ajuste de palabras](properties_Display.md#wordwrap)
+
+### Eventos de formulario soportados {#supported-form-events-1}
+
+| Evento formulario | Propiedades adicionales devueltas (ver [Evento formulario](../commands/form-event.md) para las propiedades principales) | Comentarios |
+| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| On After Edit |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On After Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On After Sort |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| *Las fórmulas compuestas no se pueden ordenar. (por ejemplo, This.firstName + This.lastName)* |
+| On Alternative Click |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *List box array únicamente* |
+| On Before Data Entry |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Before Keystroke |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Begin Drag Over |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Clicked |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Column Moved |
[columnName](#additional-properties)
[newPosition](#additional-properties)
[oldPosition](#additional-properties)
| |
+| On Column Resize |
[column](#additional-properties)
[columnName](#additional-properties)
[newSize](#additional-properties)
[oldSize](#additional-properties)
| |
+| On Data Change |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Double Clicked |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Drag Over |
[area](#additional-properties)
[areaName](#additional-properties)
[column](#additional-properties)
[columnName](#additional-properties)
[row](#additional-properties)
| |
+| On Drop |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| |
+| On Footer Click |
[column](#additional-properties)
[columnName](#additional-properties)
[footerName](#additional-properties)
| *List box arrays, selección actual y selección temporal únicamente* |
+| On Getting Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo al editar una celda* |
+| On Header Click |
[column](#additional-properties)
[columnName](#additional-properties)
[headerName](#additional-properties)
| |
+| On Load | | |
+| On Losing Focus |
[columna](#additional-properties)
[nombreColumna](#additional-properties)
[línea](#additional-properties)
| *Propiedades adicionales devueltas sólo cuando la modificación de una celda se completa* |
+| On Row Moved |
[newPosition](#additional-properties)
[oldPosition](#additional-properties)
| *List box array únicamente* |
+| On Scroll |
[horizontalScroll](#additional-properties)
[verticalScroll](#additional-properties)
| |
+| On Unload | | |
+
+## Encabezados de list box
+
+> Para poder acceder a las propiedades de los pies de un list box, debe activar la opción [Mostrar pies](properties_Footers.md#display-footers).
+
+Cuando se muestran los encabezados, puede seleccionar un encabezado en el editor de formularios haciendo clic en él cuando el objeto List box esté seleccionado:
+
+
+
+Puede definir propiedades de texto estándar para cada encabezado de columna de List box; en este caso, estas propiedades tienen prioridad sobre las de la columna o del propio List box.
+
+Además, tiene acceso a las propiedades específicas de los encabezados. En particular, se puede mostrar un icono en el encabezado junto al título de la columna o en su lugar, por ejemplo, cuando se realizan [ordenaciones personalizadas](#managing-sorts).
+
+
+
+Al momento de la ejecución, los eventos que se producen en un encabezado se generan en el método objeto de la columna de list box.
+
+Cuando el comando [`OBJECT SET VISIBLE`](../commands/object-set-visible) es usado con un encabezado, se aplica a todos los encabezados, independientemente del elemento individual definido por el comando. Por ejemplo, `OBJECT SET VISIBLE(*; "header3";False)` ocultará todos los encabezados del objeto list box al que pertenece *header3* y no simplemente este encabezado.
+
+### Propiedades específicas de los encabezados
+
+[Negrita](properties_Text.md#bold) - [Clase](properties_Object.md#css-class) - [Fuente](properties_Text.md#font) - [Color de Fuente](properties_Text.md#font-color) - [Mensaje de ayuda](properties_Help.md#help-tip) - [Alineación Horizontal](properties_Text.md#horizontal-alignment) - [Relleno Horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) - [Ubicación del Ícono](properties_TextAndPicture.md#icon-location) - [Cursiva](properties_Text.md#italic) - [Nombre del objeto](properties_Object.md#object-name) - [Ruta](properties_TextAndPicture.md#picture-pathname) - [Título](properties_Object.md#title) - [Subrayado](properties_Text.md#underline) - [Variable o Expresión](properties_Object.md#variable-or-expression) - [Alineación Vertical](properties_Text.md#vertical-alignment) - [Relleno Vertical](properties_CoordinatesAndSizing.md#vertical-padding) - [Ancho](properties_CoordinatesAndSizing.md#width)
+
+## Pies de list box
+
+> Para poder acceder a las propiedades de los encabezados de un list box, debe activar la opción [Mostrar encabezados](properties_Headers.md#display-headers) del list box.
+
+Los List box pueden contener "pies de página" no editables, que muestren información adicional. En el caso de los datos mostrados en forma de tabla, los pies de página suelen utilizarse para mostrar cálculos como los totales o los promedios.
+
+Cuando se muestran los pies, puede hacer clic para seleccionar un pie de list box en el editor de formularios haciendo clic en el objeto:
+
+
+
+Para cada pie de columna de list box, puede definir propiedades de texto estándar: en este caso, estas propiedades tienen prioridad sobre las de la columna o del list box. También puede acceder a propiedades específicas para los pies de página. En particular, puede insertar un [cálculo personalizado o automático](properties_Object.md#variable-calculation).
+
+Al momento de la ejecución, los eventos que se producen en un pie de página se generan en el método objeto de la columna de list box.
+
+Cuando se utiliza el comando [`OBJECT SET VISIBLE`](../commands/object-set-visible) con un pie de página, se aplica a todos los pies de página, independientemente del elemento individual definido por el comando. Por ejemplo, `OBJECT SET VISIBLE(*; "footer3";False)` ocultará todos los pies de página del objeto list box al que pertenece *footer3* y no simplemente este pie de página.
+
+### Propiedades específicas de los pies
+
+[Formato Alfa](properties_Display.md#alpha-format) - [Color de fondo](properties_BackgroundAndBorder.md#background-color--fill-color) - [Negrita](properties_Text.md#bold) - [Clase](properties_Object.md#css-class) - [Formato fecha](properties_Display.md#date-format) - [Tipo de expresión](properties_Object.md#expression-type) - [Fuente](properties_Text.md#font) - [Color de fuente](properties_Text.md#font-color) - [Consejo de ayuda](properties_Help.md#help-tip) - [Alineación horizontal](properties_Text.md#horizontal-alignment) - [Relleno horizontal](properties_CoordinatesAndSizing.md#horizontal-padding) - [Itálica](properties_Text.md#italic) - [Formato número](properties_Display.md#number-format) - [Nombre del objeto](properties_Object.md#object-name) - [Formato imagen](properties_Display.md#picture-format) - [Formato hora](properties_Display.md#time-format) - [Truncar con puntos suspensivos](properties_Display.md#truncate-with-ellipsis) - [Subrayado](properties_Text.md#underline) - [Cálculo de variable](properties_Object.md#variable-calculation) - [Variable o expresión](properties_Object.md#variable-or-expression) - [Alineación vertical](properties_Text.md#vertical-alignment) - [Relleno vertical](properties_CoordinatesAndSizing.md#vertical-padding) - [Ancho](properties_CoordinatesAndSizing.md#width) - [Ajuste de línea](properties_Display.md#wordwrap)
+
+## Gestión de entrada
+
+Para que una celda de list box sea editable, deben cumplirse las dos condiciones siguientes:
+
+- La columna de la celda debe haberse definido como [Enterable](properties_Entry.md#enterable) (de lo contrario, las celdas de la columna nunca podrán ser editables).
+- En el evento `On Before Data Entry`, $0 no devuelve -1. Cuando el cursor llega a la celda, se genera el evento `On Before Data Entry` en el método de la columna. Si, en el contexto de este evento, $0 se define como -1, la celda se considera como no editable. Si el evento se generó después de presionar **Tab** o **Mayús+Tab**, el foco pasa a la siguiente celda o a la anterior, respectivamente. Si $0 no es -1 (por defecto $0 es 0), la celda se puede introducir y pasa al modo de edición.
+
+Consideremos el ejemplo de un list box que contiene dos arrays, uno fecha y otro texto. El array de la fecha no se puede introducir, pero el array del texto sí se puede introducir si la fecha no ha pasado.
+
+
+
+Aquí está el método de la columna *arrText*:
+
+```4d
+ Case of
+ :(FORM event.code=On Before Data Entry) // una celda obtiene el foco
+ LISTBOX GET CELL POSITION(*;"lb";$col;$row)
+ // identification of cell
+ If(arrDate{$row} La entrada de datos en los list box de tipo colección/selección de entidades tiene una limitación cuando la expresión se evalúa como nula. En este caso, no es posible editar o eliminar el valor nulo en la celda.
+
+## Gestión de selecciones
+
+La gestión de selecciones es diferente dependiendo de si el list box se basa en un array, en una selección de registros o en una selección de colecciones/entidades:
+
+- **Lista box de tipo selección**: las selecciones se gestionan mediante un conjunto llamado por defecto `$ListboxSetX` (donde X empieza en 0 y se incrementa en función del número de list box en el formulario), que puede modificar si es necesario. Este conjunto se [define en las propiedades](properties_ListBox.md#highlight-set) del list box. Es mantenido automáticamente por 4D: si el usuario selecciona una o más líneas en el list box, el conjunto se actualiza inmediatamente. Por otra parte, también es posible utilizar los comandos del tema "Conjuntos" para modificar por programación la selección en el list box.
+
+- **List box de tipo colección/selección de entidades**: las selecciones se gestionan a través de las propiedades del list box dedicado:
+ - [Elemento actual](properties_DataSource.md#current-item) es un objeto que recibirá el elemento/la entidad seleccionado(a)
+ - [Elementos seleccionados](properties_DataSource.md#selected-items) es un objeto colección/selección de entidades de elementos seleccionados
+ - [Posición del elemento actual](properties_DataSource.md#current-item-position) devuelve la posición del elemento o de la entidad seleccionada.
+
+- **List box de tipo array**: el comando `LISTBOX SELECT ROW` puede utilizarse para seleccionar una o más líneas del list box por programación.
+ La [variable asociada al objeto List box](propiedades_Objeto.md#variable-o-expresión) se utiliza para obtener, definir o almacenar las selecciones de líneas en el objeto. Esta variable corresponde a un array de booleanos que es creado y mantenido automáticamente por 4D. El tamaño de este array viene determinado por el tamaño del list box: contiene el mismo número de elementos que el array más pequeño asociado a las columnas.
+ Cada elemento de este array contiene `True` si se selecciona la línea correspondiente y `False` en caso contrario. 4D actualiza el contenido de este array en función de las acciones del usuario. Por el contrario, puede cambiar el valor de los elementos del array para cambiar la selección en el list box.
+ Por otra parte, no se pueden insertar ni borrar líneas en este array; tampoco se pueden reescribir las líneas. El comando `Count in array` puede utilizarse para averiguar el número de líneas seleccionadas.
+ Por ejemplo, este método permite invertir la selección de la primera línea del list box (tipo array):
+
+```4d
+ ARRAY BOOLEAN(tBListBox;10)
+ //tBListBox es el nombre de la variable asociada al list box en el formulario
+ If(tBListBox{1}=True)
+ tBListBox{1}:=False
+ Else
+ tBListBox{1}:=True
+ End if
+```
+
+> El comando [`OBJECT SET SCROLL POSITION`](../commands/object-set-scroll-position) desplaza las líneas del list box de modo que se muestre la primera línea seleccionada o una línea especificada.
+
+### Personalizar la apariencia de las líneas seleccionadas
+
+Cuando la opción [Ocultar el resaltado de la selección](properties_Appearance.md#hide-selection-highlight) está seleccionada, debe gestionar la representación visual de las selecciones en el list box utilizando las opciones de interfaz disponibles. Dado que las selecciones siguen siendo gestionadas en su totalidad por 4D, esto significa:
+
+- En el caso de los list box de tipo array, debe analizar la variable array booleana asociada al list box para determinar qué líneas están seleccionadas o no.
+- Para los list box de tipo selección, hay que comprobar si el registro actual (línea) pertenece al conjunto especificado en la propiedad [Conjunto resaltado](properties_ListBox.md#highlight-set) del list box.
+
+A continuación, puede definir por programación los colores de fondo, los colores y/o estilos de fuentes específicas para personalizar la apariencia de las líneas seleccionadas. Esto puede hacerse utilizando arrays o expresiones, en función del tipo de list box mostrado (ver las siguientes secciones).
+
+> Puede utilizar la constante `lk inherited` para aplicar la apariencia actual del list box (por ejemplo, el color de la fuente, el color de fondo, el estilo de la fuente, etc.).
+
+#### List box de tipo selección
+
+Para determinar qué líneas están seleccionadas, hay que comprobar si están incluidas en el conjunto indicado en la propiedad [Conjunto resaltado](properties_ListBox.md#highlight-set) del list box. A continuación, puede definir la apariencia de las líneas seleccionadas utilizando una o varias de las [propiedades de expresión de color o estilo](#using-arrays-and-expressions) relevantes.
+
+Tenga en cuenta que las expresiones se reevalúan automáticamente cada vez que:
+
+- la selección de list box cambia.
+- list box obtiene o pierde el foco.
+- la ventana formulario que contiene el list box se convierte, o deja de ser, la ventana del primer plano.
+
+#### List box de tipo array
+
+Tiene que analizar el array booleano [Variable o expresión](properties_Object.md#variable-or-expression) asociado al list box para determinar si las líneas están seleccionadas o no.
+
+A continuación, puede definir la apariencia de las líneas seleccionadas utilizando una o varias de las [propiedades de array de color o de estilo](#using-arrays-and-expressions) relevantes.
+
+Tenga en cuenta que los arrays de list box utilizados para definir la apariencia de las líneas seleccionadas deben recalcularse en el evento formulario `On Selection Change`; sin embargo, también puede modificar estos arrays basándose en los siguientes ev
+
+- `On Getting Focus` (propiedad list box)
+- `On Losing Focus` (propiedad list box)
+- `On Activate` (propiedad list box)
+- `On Deactivate` (form property) ...depending on whether and how you want to visually represent changes of focus in selections.
+
+##### Ejemplo
+
+Ha elegido ocultar el resaltado sistema y desea mostrar las selecciones en el list box con un color de fondo verde, como se muestra aquí:
+
+
+
+Para un list box de tipo array, es necesario actualizar el [Array colores de fondo](properties_BackgroundAndBorder.md#row-background-color-array) por programación. En el formulario JSON, ha definido el Array colores de fondo de línea para el list box:
+
+```
+ "rowFillSource": "_ListboxBackground",
+```
+
+En el método objeto del list box, puede escribir:
+
+```4d
+ Case of
+ :(FORM event.code=On Selection Change)
+ $n:=Size of array(LB_Arrays)
+ ARRAY LONGINT(_ListboxBackground;$n) // colores de fondo de la línea
+ For($i;1;$n)
+ If(LB_Arrays{$i}=True) // selected
+ _ListboxBackground{$i}:=0x0080C080 // fondo verde
+ Else // not selected
+ _ListboxBackground{$i}:=lk inherited
+ End if
+ End for
+ End case
+```
+
+Para un list box de tipo selección, para producir el mismo efecto puede utilizar un método para actualizar la [expresión de color de fondo](properties_BackgroundAndBorder.md#background-color-expression) basado en el conjunto especificado en la propiedad [Conjunto de resaltado](properties_ListBox.md#highlight-set).
+
+Por ejemplo, en el formulario JSON, ha definido el conjunto resaltado y la expresión de color de fondo siguientes para el list box:
+
+```
+ "highlightSet": "$SampleSet",
+ "rowFillSource": "UI_SetColor",
+```
+
+Puede escribir en el método *UI_SetColor*:
+
+```4d
+ If(Is in set("$SampleSet"))
+ $color:=0x0080C080 // fondo verde
+ Else
+ $color:=lk inherited
+ End if
+
+ $0:=$color
+```
+
+> En los list box jerárquicos, las líneas de ruptura no pueden resaltarse cuando la opción [Ocultar resaltado selección](properties_Appearance.md#hide-selection-highlight) está seleccionada. Como no es posible tener colores distintos para los encabezados del mismo nivel, no hay manera de destacar una línea de ruptura específica por programación.
+
+## Gestión de ordenaciones
+
+Un orden en un list box puede ser estándar o personalizado. Cuando se ordena una columna de un list box, todas las demás columnas se sincronizan siempre automáticamente.
+
+### Ordenación estándar
+
+Por defecto, un list box ofrece una ordenación de columnas estándar cuando se hace clic en el encabezado. Una ordenación estándar es una ordenación alfanumérica de los valores de las columnas evaluadas, alternativamente ascendiendo/descendiendo con cada clic sucesivo.
+
+Puede activar o desactivar la ordenación usuario estándar desactivando la propiedad [Ordenable](properties_Action.md#sortable) del list box (activada por defecto).
+
+El soporte de ordenación estándar depende del tipo de list box:
+
+| Tipo de list box | Soporte de ordenación estándar | Comentarios |
+| ------------------------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| Colección de objetos | Sí |
"This.a" or "This.a.b" columns are sortable.
The [list box source property](properties_Object.md#variable-or-expression) must be an [assignable expression](../Concepts/quick-tour.md#assignable-vs-non-assignable-expressions).
|
+| Colección de valores escalares | No | Utilice la ordenación personalizada con la función [`orderBy()`](../API/CollectionClass.md#orderby) |
+| Entity selection | Sí |
The [list box source property](properties_Object.md#variable-or-expression) must be an [assignable expression](../Concepts/quick-tour.md#assignable-vs-non-assignable-expressions).
Supported: sorts on object attribute properties (e.g. "This.data.city" when "data" is an object attribute)
Supported: sorts on related attributes (e.g. "This.company.name")
Not supported: sorts on object attribute properties through related attributes (e.g. "This.company.data.city"). Para ello, debe utilizar la ordenación personalizada con la función [`orderByFormula()`](../API/EntitySelectionClass.md#orderbyformula) (ver el siguiente ejemplo)
|
+| Selección actual | Sí | Sólo se pueden ordenar las expresiones simples (por ejemplo, `[Table_1]Campo_2`) |
+| Selección temporal | No | |
+| Arrays | Sí | Las columnas vinculadas a arrays de imágenes y punteros no se pueden ordenar |
+
+### Ordenación personalizada
+
+El desarrollador puede configurar ordenaciones personalizadas, por ejemplo utilizando el comando [`LISTBOX SORT COLUMNS`](../commands-legacy/listbox-sort-columns.md) y/o combinando los eventos de formulario [`On Header Click`](../Events/onHeaderClick) y [`On After Sort`](../Events/onAfterSort) y los comandos 4D relevantes.
+
+Los ordenamientos personalizados le permiten:
+
+- realizar ordenaciones multinivel en varias columnas, gracias al comando [`LISTBOX SORT COLUMNS`](../commands-legacy/listbox-sort-columns.md),
+- utilizar funciones como [`collection.orderByMethod()`](../API/CollectionClass.md#orderbymethod) o [`entitySelection.orderByFormula()`](../API/EntitySelectionClass.md#orderbyformula) para ordenar columnas según criterios complejos.
+
+#### Ejemplo
+
+Desea ordenar un list box utilizando los valores de una propiedad almacenada en un atributo de objeto relacionado. Tiene la siguiente estructura:
+
+
+
+Se diseña un list box de tipo entity selection, vinculado a la expresión `Form.child`. En el evento formulario `On Load`, se ejecuta `Form.child:=ds.Child.all()`.
+
+Se muestran dos columnas:
+
+| Nombre del hijo | Apodo del padre |
+| --------------- | ---------------------------- |
+| `This.name` | `This.parent.extra.nickname` |
+
+Si quiere ordenar el list box utilizando los valores de la segunda columna, debe escribir:
+
+```4d
+If (Form event code=On Header Click)
+ Form.child:=Form.child.orderByFormula("This.parent.extra.nickname"; dk ascending)
+End if
+```
+
+### Variable de encabezado de columna
+
+El valor de la [variable asociada al encabezado de una columna](properties_Object.md#variable-or-expression) permite gestionar una información adicional: la ordenación actual de la columna (lectura) y la visualización de la flecha de ordenación.
+
+- Si la variable se define en 0, la columna no se ordena y la flecha de ordenación no se muestra.
+ 
+
+- Si la variable está en 1, la columna se ordena en orden ascendente y se muestra la flecha de ordenación.
+ 
+
+- Si la variable se establece en 2, la columna se clasifica en orden descendente y se muestra la flecha de clasificación.
+ 
+
+> Sólo las [variables](Concepts/variables.md) declaradas o dinámicas pueden utilizarse como variables de encabezado de columna. Otros tipos de [expresiones](Concepts/quick-tour.md#expressions) como `Form.sortValue` no son soportadas.
+
+Puede definir el valor de la variable (por ejemplo, Header2:=2) para "forzar" la visualización de la flecha de ordenación. En este caso no se modifica la ordenación por columnas en sí, sino que es el desarrollador quien debe encargarse de ello.
+
+> El comando [`OBJECT SET FORMAT`](../commands-legacy/object-set-format.md) ofrece soporte específico para iconos en los encabezados de los list box, lo que puede ser útil cuando se desea trabajar con un icono de ordenación personalizado.
+
+## Gestión de los colores, estilos y visualización de las líneas
+
+Hay varias formas de definir los colores de fondo, los colores de fuente y los estilos de fuente en los list box:
+
+- al nivel de las [propiedades del objeto list box](#list-box-objects),
+- a nivel de las [propiedades de la columna](#list-box-columns),
+- utilizando los [arrays o expresiones](#using-arrays-and-expressions) para el list box y/o para cada columna,
+- a nivel del texto de cada celda (si [texto multi-estilo](properties_Text.md#multi-style)).
+
+### Prioridad y herencia
+
+Los principios de prioridad y de herencia se observan cuando la misma propiedad se define en más de un nivel.
+
+| Nivel de prioridad | Ubicación del parámetro |
+| ------------------ | ----------------------------------------------------------------------------------------------------------- |
+| alta prioridad | Celda (si texto multiestilo) |
+| | Arrays de columnas/métodos |
+| | Arrays/métodos de Listbox |
+| | Propiedades de la columna |
+| | Propiedades de list box |
+| baja prioridad | Expresiones de metainformación (para colecciones o list boxes de selección de entidades) |
+
+Por ejemplo, si define un estilo de fuente en las propiedades del list box y otro mediante un array de estilos para la columna, se tendrá en cuenta este último.
+
+Para cada atributo (estilo, color y color de fondo), se implementa una **herencia** cuando se utiliza el valor por defecto:
+
+- para los atributos de las celdas: valores de atributos de las líneas
+- para los atributos líneas: valores de atributos de columnas
+- para los atributos de la columna: valores de los atributos del list box
+
+De esta forma, si desea que un objeto herede el valor de atributo de un nivel superior, puede utilizar pasar la constante `lk inherited` (valor por defecto) al comando de definición o directamente en el elemento del array de estilo/color correspondiente. Por ejemplo, dado un list box array contiene un estilo de fuente estándar con colores alternos:
+
+
+Realiza las siguientes modificaciones:
+
+- cambiar el fondo de la línea 2 a rojo utilizando la propiedad [Row Background Color Array](properties_BackgroundAndBorder.md#row-background-color-array) del objeto list box,
+- cambia el estilo de la línea 4 a cursiva utilizando la propiedad [Row Style Array](properties_Text.md#row-style-array) del objeto list box,
+- dos elementos de la columna 5 se cambian a negrita utilizando la propiedad [Row Style Array](properties_Text.md#row-style-array) del objeto columna 5,
+- los 2 elementos de la columna 1 y 2 se cambian a azul oscuro utilizando la propiedad [Row Background Color Array](properties_BackgroundAndBorder.md#row-background-color-array) para los objetos de la columna 1 y 2:
+
+
+
+Para restaurar la apariencia original de la caja del list box, puede:
+
+- pasar la constante `lk inherited` en el elemento 2 de los arrays de color de fondo de las columnas 1 y 2: entonces heredan el color de fondo rojo de la línea.
+- pasar la constante `lk inherited` en los elementos 3 y 4 del array de estilo de la columna 5: entonces heredan el estilo estándar, excepto el elemento 4, que cambia a itálica según lo especificado en el array de estilo del list box.
+- pasar la constante `lk inherited` en el elemento 4 del array de estilos para el list box con el fin de eliminar el estilo itálica.
+- pasar la constante `lk inherited` en el elemento 2 del array de colores de fondo para el list box con el fin de restaurar el color alternativo original del list box.
+
+### Uso de arrays y expresiones
+
+Según el tipo de list box, puede utilizar diferentes propiedades para personalizar los colores, estilos y visualización de las líneas:
+
+| Propiedad | List box array | List box selección | List box colección o entity selection |
+| ---------------- | ------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Color de fondo | [Array de colores de fondo de fila](properties_BackgroundAndBorder.md#row-background-color-array) | [Expresión del color de fondo](properties_BackgroundAndBorder.md#background-color-expression) | [Expresión color de fondo](properties_BackgroundAndBorder.md#background-color-expression) o [Meta info expresión](properties_Text.md#meta-info-expression) |
+| Color de fuente | [Array color de fuente de fila](properties_Text.md#row-font-color-array) | [Expresión de color de fuente](properties_Text.md#font-color-expression) | [Expresión color de fuente](properties_Text.md#font-color-expression) o [Meta info expression](properties_Text.md#meta-info-expression) |
+| Estilo de fuente | [Array de estilo de línea](properties_Text.md#row-style-array) | [Expresión de estilo](properties_Text.md#style-expression) | [Expresión de estilo](properties_Text.md#style-expression) o [Expresión meta info](properties_Text.md#meta-info-expression) |
+| Visualización | [Array de control de filas](properties_ListBox.md#row-control-array) | - | - |
+
+## Imprimir list boxes
+
+Hay dos modos de impresión disponibles: **modo vista previa** - que se puede utilizar para imprimir un list box como un objeto de formulario y el **modo avanzado**, que le permite controlar la impresión del propio objeto list box en el formulario. Tenga en cuenta que la apariencia "Impresión" está disponible para los list boxes en el editor de formularios.
+
+### Modo de vista previa
+
+La impresión de un list box en modo vista previa consiste en imprimir directamente el list box y el formulario que lo contiene utilizando los comandos de impresión estándar o el comando de menú **Imprimir**. El list box se imprime tal como está en el formulario. Este modo no permite controlar con precisión la impresión del objeto; en particular, no permite imprimir todas las líneas de un list box que contenga más líneas de las que puede mostrar.
+
+### Modo avanzado
+
+En este modo, la impresión de los list box se realiza por programación, a través del comando `Print object` (se soportan los formularios proyecto y los formularios tabla). The [`LISTBOX GET PRINT INFORMATION`](../commands/listbox-get-print-information) command is used to control the printing of the object.
+
+En este modo:
+
+- La altura del objeto list box se reduce automáticamente cuando el número de líneas a imprimir es inferior a la altura original del objeto (no se imprimen líneas "vacías"). Por el contrario, la altura no aumenta automáticamente en función del contenido del objeto. The size of the object actually printed can be obtained via the [`LISTBOX GET PRINT INFORMATION`](../commands/listbox-get-print-information) command.
+- El objeto list box se imprime "tal cual", es decir, teniendo en cuenta sus parámetros de visualización actuales: visibilidad de los encabezados y de las rejillas, líneas ocultas y mostradas, etc.
+ These parameters also include the first row to be printed: if you call the [`OBJECT SET SCROLL POSITION`](../commands/object-set-scroll-position) command before launching the printing, the first row printed in the list box will be the one designated by the command.
+- Un mecanismo automático facilita la impresión de los list box que contienen más líneas de las que es posible mostrar: se pueden realizar llamadas sucesivas a `Print object` para imprimir cada vez un nuevo conjunto de líneas. The [`LISTBOX GET PRINT INFORMATION`](../commands/listbox-get-print-information) command can be used to check the status of the printing while it is underway.
+
+## List box jerárquicos
+
+Un list box jerárquico es un list box en el que el contenido de la primera columna aparece en forma jerárquica. Este tipo de representación se adapta a la presentación de información que incluye valores repetidos y/o que dependen jerárquicamente (país/región/ciudad, etc.).
+
+> Sólo los [list box de tipo array](#array-list-boxes) pueden ser jerárquicos.
+
+Los list box jerárquicos son una forma particular de representar los datos, pero no modifican la estructura de datos (arrays). Los list box jerárquicos se gestionan exactamente igual que los list box clásicos.
+
+### Definir una jerarquía
+
+Para definir un list box jerárquico, existen varias posibilidades:
+
+- Configurar manualmente los elementos jerárquicos utilizando la lista de propiedades del editor de formularios (o editar el formulario JSON).
+- Generar visualmente la jerarquía utilizando el menú emergente de gestión de list box, en el editor de formularios.
+- Use the [`LISTBOX SET HIERARCHY`](../commands-legacy/listbox-set-hierarchy.md) and [`LISTBOX GET HIERARCHY`](../commands-legacy/listbox-get-hierarchy.md) commands.
+
+#### Propiedades del List Box jerárquico
+
+Esta propiedad especifica que el list box debe mostrarse en forma jerárquica. En el formulario JSON, esta función se activa [cuando el valor de la propiedad *dataSource* de la columna es un array](properties_Object.md#array-list-box), es decir, una colección.
+
+Las opciones adicionales (**Variable 1...10**) están disponibles cuando se selecciona la opción *List box jerárquico*, correspondiente a cada elemento del array *dataSource* a utilizar como columna de ruptura. Cada vez que se introduce un valor en un campo, se añade una nueva línea. Se pueden especificar hasta 10 variables. Estas variables definen los niveles jerárquicos a mostrar en la primera columna.
+
+La primera variable corresponde siempre al nombre de la variable de la primera columna del list box (los dos valores se vinculan automáticamente). Esta primera variable está siempre visible y se puede editar. Por ejemplo: country.
+La segunda variable también es siempre visible y editable; define el segundo nivel jerárquico. Por ejemplo: regions.
+A partir del tercer campo, cada variable depende de la anterior. Por ejemplo: counties, cities, etc. Se puede especificar un máximo de diez niveles jerárquicos. Si se elimina un valor, toda la jerarquía sube de nivel.
+
+La última variable nunca es jerárquica aunque existan varios valores idénticos en este nivel. Por ejemplo, refiriéndonos a la configuración ilustrada anteriormente, imagine que arr1 contiene los valores A A B B B, arr2 tiene los valores 1 1 1 2 2 2 y arr3 los valores X X Y Y Z. En este caso, A, B, 1 y 2 podrían aparecer de forma contraída, pero no X e Y:
+
+
+
+Este principio no se aplica cuando sólo se especifica una variable en la jerarquía: en este caso, pueden agruparse valores idénticos.
+
+> Si especifica una jerarquía basada en las primeras columnas de un list box existente, deberá eliminar u ocultar estas columnas (excepto la primera), ya que de lo contrario aparecerán duplicadas en el list box. Si especifica la jerarquía mediante el menú emergente del editor (ver abajo), las columnas innecesarias se eliminan automáticamente del list box.
+
+#### Crear una jerarquía utilizando el menú contextual
+
+Cuando selecciona al menos una columna además de la primera en un objeto list box (de tipo array) en el editor de formularios, el comando **Crear jerarquía** está disponible en el menú contextual:
+
+
+
+Este comando es un acceso directo para definir una jerarquía. Cuando se selecciona, se llevan a cabo las siguientes acciones:
+
+- La opción **List box jerárquico** está marcada para el objeto en la Lista de propiedades.
+- Las variables de las columnas se utilizan para definir la jerarquía. Reemplazan las variables ya definidas.
+- Las columnas seleccionadas ya no aparecen en el list box (excepto el título de la primera).
+
+Ejemplo: dado un list box cuyas primeras columnas contienen País, Región, Ciudad y Población. Cuando se seleccionan País, Región y Ciudad, si se elige **Crear jerarquía** en el menú contextual, se crea una jerarquía de tres niveles en la primera columna, se eliminan las columnas 2 y 3 y la columna Población pasa a ser la segunda:
+
+
+
+##### Cancelar jerarquía
+
+Cuando la primera columna está seleccionada y ya se ha definido como jerárquica, puede utilizar el comando **Cancelar jerarquía**. Cuando elige este comando, se llevan a cabo las siguientes acciones:
+
+- La opción **List box jerárquico** está deseleccionada para el objeto,
+- Los niveles jerárquicos 2 a X se eliminan y se transforman en columnas añadidas al list box.
+
+### Principios de funcionamiento
+
+Cuando se abre por primera vez un formulario que contiene un list box jerárquico, por defecto se despliegan todas las líneas.
+
+Cuando los valores se repiten en los arrays, se añade automáticamente una línea de ruptura y un "nodo" jerárquico en el list box. Por ejemplo, imagine un list box que contenga cuatro arrays que indiquen las ciudades, cada una de ellas caracterizada por su país, su región, su nombre y su número de habitantes:
+
+
+
+Si este list box se muestra en forma jerárquica (los tres primeros arrays están incluidos en la jerarquía), se obtiene:
+
+
+
+Los arrays no se ordenan antes de construir la jerarquía. Si, por ejemplo, un array contiene los datos AAABBAACC, la jerarquía obtenida es:
+\> A
+\> B
+\> A
+\> C
+
+Para desplegar o contraer un "nodo" jerárquico, basta con hacer clic en él. Si hace **Alt+clic** (Windows) o **Opción+clic** (macOS) en el nodo, todos sus subelementos se desplegarán o contraerán también. Estas operaciones también pueden realizarse por programación utilizando los comandos `LISTBOX EXPAND` y `LISTBOX COLLAPSE`.
+
+Cuando se incluyen valores del tipo fecha u hora en un list box jerárquico, se muestran en el formato del sistema corto.
+
+#### Ordenación en list box jerárquicos
+
+Cuando se incluyen valores del tipo fecha u hora en un list box jerárquico, se muestran en el formato del sistema corto.
+
+- En primer lugar, todos los niveles de la columna jerárquica (primera columna) se clasifican automáticamente por orden ascendente.
+- La ordenación se realiza por orden ascendente o descendente (según la acción del usuario) sobre los valores de la columna en la que se ha hecho clic.
+- Todas las columnas son sincronizadas.
+- En las siguientes ordenaciones realizadas en columnas no jerárquicas del list box, sólo se ordena el último nivel de la primera columna. Es posible modificar la ordenación de esta columna haciendo clic en su encabezado.
+
+Cuando se incluyen valores del tipo fecha u hora en un list box jerárquico, se muestran en el formato del sistema corto.
+
+
+
+Si hace clic en el encabezado "Population" para ordenar las poblaciones por orden ascendente (o alternativamente descendente), los datos aparecen de la siguiente manera:
+
+
+
+Como para todos los list box, puede [desactivar el mecanismo de ordenación estándar](properties_Action.md#sortable) y gestionar las ordenaciones por programación.
+
+#### Selecciones y posiciones en list box jerárquicos
+
+Un list box jerárquico muestra un número variable de líneas en la pantalla según el estado desplegado/contraído de los nodos jerárquicos. Sin embargo, esto no significa que el número de líneas de los arrays varíe. Sólo se modifica la visualización, no los datos. Es importante entender este principio porque la gestión programada de los list box jerárquicos se basa siempre en los datos de los arrays, no en los datos mostrados. En particular, las filas de ruptura añadidas automáticamente no se tienen en cuenta en los arrays de opciones de visualización (ver más adelante).
+
+Veamos, por ejemplo, los siguientes arrays:
+
+
+
+Si estos arrays se representan jerárquicamente, la línea "Quimper" no se mostrará en la segunda línea, sino en la cuarta, debido a las dos líneas de ruptura que se añaden:
+
+
+
+Independientemente de cómo se muestren los datos en el list box (de forma jerárquica o no), si quiere cambiar la línea que contiene "Quimper" a negrita, debe utilizar la instrucción Style{2} = bold. Sólo se tiene en cuenta la posición de la línea en los arrays.
+
+Este principio se aplica a los arrays internos que se pueden utilizar para gestionar:
+
+- colores
+
+- colores de fondo
+
+- estilos
+
+- líneas ocultas
+
+- selecciones
+
+Este principio se aplica a los arrays internos que se pueden utilizar para gestionar:
+
+```4d
+ ->MyListbox{3}:=True
+```
+
+Representación no jerárquica:
+
+Representación jerárquica:
+
+
+> Si una o más líneas están ocultas porque sus padres están contraídos, ya no se seleccionan. Sólo se pueden seleccionar las líneas visibles (directamente o por desplazamiento). En otras palabras, las líneas no pueden estar ocultas y seleccionadas a la vez.
+
+As with selections, the [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command will return the same values for a hierarchical list box and a non-hierarchical list box. This means that in both of the examples below, [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) will return the same position: (3;2).
+
+*Representación no jerárquica:*
+
+
+*Representación jerárquica:*
+
+
+Cuando se ocultan todas las líneas de una subjerarquía, la línea de ruptura se oculta automáticamente. En el ejemplo anterior, si las líneas 1 a 3 están ocultas, la línea de ruptura "Bretaña" no aparecerá.
+
+#### Líneas de quiebre
+
+If the user selects a break row, [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) returns the first occurrence of the row in the corresponding array. En el caso siguiente:
+
+
+
+... [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) returns (2;4). To select a break row by programming, you will need to use the [`LISTBOX SELECT BREAK`](../commands/listbox-select-break) command.
+
+Las líneas de rotura no se tienen en cuenta en los arrays internos utilizados para gestionar el aspecto gráfico de los list box (estilos y colores). No obstante, es posible modificar estas características para las líneas de ruptura mediante los comandos de gestión gráfica de los objetos. Basta con ejecutar los comandos adecuados en los arrays que constituyen la jerarquía.
+
+El siguiente list box fue diseñado utilizando un array de objetos:
+
+*Representación no jerárquica:*
+
+
+*Representación jerárquica:*
+
+
+En modo jerárquico, los niveles de ruptura no son tenidos en cuenta por los arrays de modificación de estilo denominados `tStyle` y `tColors`. Para modificar el color o el estilo de los niveles de ruptura, debe ejecutar las siguientes instrucciones:
+
+```4d
+ OBJECT SET RGB COLORS(T1;0x0000FF;0xB0B0B0)
+ OBJECT SET FONT STYLE(T2;Bold)
+```
+
+> En este contexto, sólo la sintaxis que utiliza la variable array puede funcionar con los comandos de la propiedad del objeto porque los arrays no tienen ningún objeto asociado.
+
+Resultado:
+
+
+
+#### Gestión optimizada de desplegar/contraer
+
+Puede optimizar la visualización y gestión de los list box jerárquicos utilizando los eventos formulario `On Expand` y `On Collapse`.
+
+Un list box jerárquico se construye a partir del contenido de sus arrays, por lo que sólo puede mostrarse cuando todos estos arrays están cargados en memoria. This makes it difficult to build large hierarchical list boxes based on arrays generated from data (through the [`SELECTION TO ARRAY`](../commands/selection-to-array) command), not only because of the display speed but also the memory used.
+
+El uso de los eventos de formulario `On Expand` y `On Collapse` puede superar estas limitaciones: por ejemplo, puede mostrar sólo una parte de la jerarquía y cargar/descargar los arrays sobre la marcha, basándose en las acciones del usuario. In the context of these events, the [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command returns the cell where the user clicked in order to expand or collapse a row.
+
+En este caso, debe llenar y vaciar los arrays por código. Los principios que deben aplicarse son:
+
+- Cuando se muestra el list box, sólo se debe llenar el primer array. Sin embargo, debe crear un segundo array con valores vacíos para que el list box muestre los botones desplegar/contraer:
+ 
+
+- Cuando un usuario hace clic en un botón de expandir, puede procesar el evento `On Expand`. The [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command returns the cell concerned and lets you build the appropriate hierarchy: you fill the first array with the repeated values and the second with the values sent from the [`SELECTION TO ARRAY`](../commands/selection-to-array) command and you insert as many rows as needed in the list box using the [`LISTBOX INSERT ROWS`](../commands/listbox-insert-rows) command.
+ 
+
+- Cuando un usuario hace clic en un botón de contracción, puede procesar el evento `On Collapse`. The [`LISTBOX GET CELL POSITION`](../commands/listbox-get-cell-position) command returns the cell concerned: you remove as many rows as needed from the list box using the [`LISTBOX DELETE ROWS`](../commands/listbox-delete-rows) command.
+
+## Arrays de objetos en columnas
+
+Las columnas de list box pueden manejar arrays de objetos. Como los arrays de objetos pueden contener diferentes tipos de datos, esta nueva y poderosa funcionalidad permite mezclar diferentes tipos de entrada en las líneas de una misma columna, y mostrar también varios widgets. Por ejemplo, puede insertar una entrada de texto en la primera línea, una casilla de selección en la segunda y una lista desplegable en la tercera. Los arrays de objetos también dan acceso a nuevos tipos de widgets, como botones o selectores de color.
+
+El siguiente list box fue diseñado utilizando un array de objetos:
+
+
+
+### Configurar una columna array de objetos
+
+Para asignar un array de objetos a una columna list box, basta con definir el nombre del array de objetos en la lista de propiedades (campo "Nombre de variable"), o utilizando el comando [LISTBOX INSERT COLUMN](../commands-legacy/listbox-insert-column.md), como para toda columna basada en arrays. En la lista de propiedades, ahora puede seleccionar Objeto como "Tipo de expresión" para la columna:
+
+
+
+Las propiedades estándar relacionadas con las coordenadas, el tamaño y el estilo están disponibles para las columnas de tipo objeto. Puede definirlos utilizando la lista de Propiedades, o programando el estilo, el color de fuente, el color de fondo y la visibilidad para cada línea de una columna objeto del list box. Estos tipos de columnas también se pueden ocultar.
+
+Sin embargo, el tema Fuente de datos no está disponible para las columnas objeto del list box. De hecho, el contenido de cada celda de la columna se basa en los atributos presentes en el elemento correspondiente del array de objetos. Cada elemento de array puede definir:
+
+the value type (mandatory): text, color, event, etc. the value itself (optional): used for input/output.
+the cell content display (optional): button, list, etc. additional settings (optional): depend on the value type To define these properties, you need to set the appropriate attributes in the object (available attributes are listed below). Por ejemplo, puede escribir "¡Hola Mundo!" en una columna objeto utilizando este sencillo código:
+
+```4d
+ARRAY OBJECT(obColumn;0) //array de columnas
+ C_OBJECT($ob) //primer elemento
+ OB SET($ob; "valueType"; "text") //define el tipo de valor (obligatorio)
+ OB SET($ob; "value"; "Hello World!") //define el valor
+ APPEND TO ARRAY(obColumn;$ob)
+```
+
+
+
+> El formato de visualización y los filtros de entrada no pueden definirse para una columna de objetos. Dependen automáticamente del tipo de valor.
+
+#### valueType y visualización de datos
+
+Cuando una columna de list box está asociada a un array de objetos, la forma en que se muestra, introduce o edita una celda se basa en el atributo valueType del elemento del array. Los valores valueType soportados son:
+
+- "text": para un valor de texto
+- "real": para un valor numérico que puede incluir separadores como un `\`, `<.>`, o `<,>`
+- "integer": para un valor entero
+- "boolean": para un valor True/False
+- "color": para definir un color de fondo
+- "event": para mostrar un botón con una etiqueta.
+
+4D utiliza widgets por defecto en función del valor "valueType" (es decir, un "text" se muestra como un widget de entrada de texto, un "boolean" como una casilla de selección), pero también están disponibles visualizaciones alternativas a través de opciones (*por ejemplo*, un real también se puede representar como un menú desplegable). La siguiente tabla muestra la visualización por defecto, así como las alternativas para cada tipo de valor:
+
+| valueType | Widget por defecto | Widget(s) alternativo(s) |
+| --------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
+| text | entrada de texto | menú desplegable (lista obligatoria) o combo box (lista de selección) |
+| real | entrada de texto controlada (números y separadores) | menú desplegable (lista obligatoria) o combo box (lista de selección) |
+| integer | entrada de texto controlada (números únicamente) | menú desplegable (lista obligatoria) o combo box (lista de opciones) o casilla de verificación de tres estados |
+| boolean | casilla de selección | menú desplegable (lista requerida) |
+| color | color de fondo | text |
+| evento | botón con etiqueta | |
+| | | Todos los widgets pueden tener un botón adicional de alternancia de unidades o un botón de elipsis asociado a la celda. |
+
+Usted define la visualización de la celda y las opciones utilizando atributos específicos en cada objeto (ver abajo).
+
+#### Formatos de visualización y filtros de entrada
+
+No se pueden definir formatos de visualización ni filtros de entrada para las columnas objeto de los list box. Se definen automáticamente en función del tipo de valor. Estos están listados en la siguiente tabla:
+
+| Tipo de valor | Formato por defecto | Control de entrada |
+| ------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------- |
+| text | lo mismo que se define en el objeto | cualquiera (sin control) |
+| real | lo mismo que se define en el objeto (utilizando el separador decimal del sistema) | "0-9" y "." y "-" |
+| | | "0-9" y "." si min>=0 |
+| integer | lo mismo que se define en el objeto | "0-9" y "-" |
+| | | "0-9" si min>=0 |
+| Boolean | casilla de selección | N/A |
+| color | N/A | N/A |
+| evento | N/A | N/A |
+
+### Atributos
+
+Cada elemento del array de objetos es un objeto que puede contener uno o más atributos que definirán el contenido de la celda y la visualización de los datos (ver el ejemplo anterior).
+
+El único atributo obligatorio es "valueType" y sus valores soportados son "text", "real", "integer", "boolean", "color" y "event". La siguiente tabla lista todos los atributos soportados en los arrays de objetos de los list box, en función del valor "valueType" (cualquier otro atributo se ignora). A continuación se detallan los formatos de visualización y se ofrecen ejemplos.
+
+| | valueType | text | real | integer | boolean | color | evento |
+| --------------------- | ------------------------------------------------------- | ---- | ---- | ------- | ------- | ----- | ------ |
+| *Atributos* | *Description* | | | | | | |
+| value | valor de la celda (entrada o salida) | x | x | x | | | |
+| min | valor mínimo | | x | x | | | |
+| max | valor máximo | | x | x | | | |
+| behavior | Valor "tres Estados" | | | x | | | |
+| requiredList | lista desplegable definida en objeto | x | x | x | | | |
+| choiceList | combo box definido en objeto | x | x | x | | | |
+| requiredListReference | RefList 4D, depende del valor de "saveAs" | x | x | x | | | |
+| requiredListName | Nombre de la lista 4D, depende del valor "saveAs" | x | x | x | | | |
+| saveAs | "reference" o "value" | x | x | x | | | |
+| choiceListReference | RefList 4D, muestra un combo box | x | x | x | | | |
+| choiceListName | Nombre de la lista 4D, mostrar combo box | x | x | x | | | |
+| unitList | array de X elementos | x | x | x | | | |
+| unitReference | índice del elemento seleccionado | x | x | x | | | |
+| unitsListReference | Ver lista de unidades 4D | x | x | x | | | |
+| unitsListName | 4D lista nombre de la unidad | x | x | x | | | |
+| alternateButton | añadir un botón alternativo | x | x | x | x | x | |
+
+#### value
+
+Los valores de las celdas se almacenan en el atributo "value". Este atributo se utiliza tanto para la entrada como para la salida. También puede utilizarse para definir valores por defecto cuando se utilizan listas (ver a continuación).
+
+```4d
+ ARRAY OBJECT(obColumn;0) //array columna
+ C_OBJECT($ob1)
+ $entry:="Hello world!"
+ OB SET($ob1;"valueType";"text")
+ OB SET($ob1;"value";$entry) // si el usuario introduce un nuevo valor, $entry contendrá el valor editado
+ C_OBJECT($ob2)
+ OB SET($ob2;"valueType";"real")
+ OB SET($ob2;"value";2/3)
+ C_OBJECT($ob3)
+ OB SET($ob3;"valueType";"boolean")
+ OB SET($ob3;"value";True)
+
+ APPEND TO ARRAY(obColumn;$ob1)
+ APPEND TO ARRAY(obColumn;$ob2)
+ APPEND TO ARRAY(obColumn;$ob3)
+```
+
+
+
+> Los valores null se soportan y dan como resultado una celda vacía.
+
+#### min y max
+
+Cuando el "valueType" es "real" o "integer", el objeto también acepta atributos min y max con valores apropiados (los valores deben ser del mismo tipo que el valueType).
+
+Estos atributos pueden utilizarse para controlar el rango de valores de entrada. Cuando se valida una celda (cuando pierde el foco), si el valor de entrada es menor que el valor mínimo o mayor que el valor máximo, entonces se rechaza. En este caso, se mantiene el valor anterior y un consejo muestra una explicación.
+
+```4d
+ C_OBJECT($ob3)
+ $entry3:=2015
+ OB SET($ob3;"valueType";"integer")
+ OB SET($ob3;"value";$entry3)
+ OB SET($ob3;"min";2000)
+ OB SET($ob3;"max";3000)
+```
+
+
+
+#### behavior
+
+El atributo behavior ofrece variaciones a la representación estándar de los valores. En 4D v15, se ofrece una única variación:
+
+| Atributo | Valor(es) disponible(s) | valueType(s) | Descripción |
+| -------- | ------------------------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| behavior | threeStates | integer | Representa un valor numérico como una casilla de verificación de tres estados. 2=semi-checked, 1=checked, 0=unchecked, -1=invisible, -2=unchecked disabled, -3=checked disabled, -4=semi-checked disabled |
+
+```4d
+ C_OBJECT($ob3)
+ OB SET($ob3;"valueType";"integer")
+
+ OB SET($ob3;"value";-3)
+ C_OBJECT($ob4)
+ OB SET($ob4;"valueType";"integer")
+ OB SET($ob4;"value";-3)
+ OB SET($ob4;"behavior";"threeStates")
+```
+
+
+
+#### requiredList y choiceList
+
+Cuando un atributo "choiceList" o "requiredList" está presente dentro del objeto, la entrada de texto se sustituye por una lista desplegable o un combo box, dependiendo del atributo:
+
+- Si el atributo es "choiceList", la celda se muestra como un combo box. Esto significa que el usuario puede seleccionar o escribir un valor.
+- Si el atributo es "requiredList", la celda se muestra como una lista desplegable y el usuario sólo puede seleccionar uno de los valores de la lista.
+
+En ambos casos, se puede utilizar un atributo "valor" para preseleccionar un valor en el widget.
+
+> Los valores del widget se definen a través de un array. Si quiere asociar el widget a una lista 4D existente, debe utilizar los atributos "requiredListReference", "requiredListName", "choiceListReference" o "choiceListName".
+
+Ejemplos:
+
+- Quiere mostrar una lista desplegable con sólo dos opciones: "Open" o "Closed". "Closed" debe estar preseleccionado:
+
+```4d
+ ARRAY TEXT($RequiredList;0)
+ APPEND TO ARRAY($RequiredList;"Open")
+ APPEND TO ARRAY($RequiredList;"Closed")
+ C_OBJECT($ob)
+ OB SET($ob;"valueType";"text")
+ OB SET($ob;"value";"Closed")
+ OB SET ARRAY($ob;"requiredList";$RequiredList)
+```
+
+
+
+- Quiere aceptar todo valor entero, pero mostrar un combo box para sugerir los valores más comunes:
+
+```4d
+ ARRAY LONGINT($ChoiceList;0)
+ APPEND TO ARRAY($ChoiceList;5)
+ APPEND TO ARRAY($ChoiceList;10)
+ APPEND TO ARRAY($ChoiceList;20)
+ APPEND TO ARRAY($ChoiceList;50)
+ APPEND TO ARRAY($ChoiceList;100)
+ C_OBJECT($ob)
+ OB SET($ob;"valueType";"integer")
+ OB SET($ob;"value";10) //10 como valor por defecto
+ OB SET ARRAY($ob;"choiceList";$ChoiceList)
+```
+
+
+
+#### requiredListName y requiredListReference
+
+Los atributos "requiredListName" y "requiredListReference" permiten utilizar, en una celda de list box, una lista definida en 4D, ya sea en modo Diseño (en el editor de Listas de la Caja de Herramientas) o por programación (utilizando el comando New list). La celda se mostrará entonces como una lista desplegable. Esto significa que el usuario sólo puede seleccionar uno de los valores proporcionados en la lista.
+
+Utilice "requiredListName" o "requiredListReference" en función del origen de la lista: si la lista procede de la caja de herramientas, pase un nombre; en caso contrario, si la lista se ha definido por programación, pase una referencia. En ambos casos, se puede utilizar un atributo "valor" para preseleccionar un valor en el widget.
+
+> - Si desea definir estos valores a través de un simple array, debe utilizar el atributo "requiredList".
+> - Si la lista contiene elementos de texto que representan valores reales, el separador decimal debe ser un punto ("."), independientemente de la configuración local, por ejemplo "17.6" "1234.456".
+
+Ejemplos:
+
+- Desea mostrar una lista desplegable basada en una lista de "colores" definida en la caja de herramientas (que contiene los valores "azul", "amarillo" y "verde"), guardarla como valor y mostrar "azul" por defecto:
+
+
+
+```4d
+ C_OBJECT($ob)
+ OB SET($ob;"valueType";"text")
+ OB SET($ob;"saveAs";"value")
+ OB SET($ob;"value";"blue")
+ OB SET($ob;"requiredListName";"colors")
+```
+
+
+
+- Quiere mostrar una lista desplegable basada en una lista definida por programación y guardarla como referencia:
+
+```4d
+ <>List:=New list
+ APPEND TO LIST(<>List;"Paris";1)
+ APPEND TO LIST(<>List;"London";2)
+ APPEND TO LIST(<>List;"Berlin";3)
+ APPEND TO LIST(<>List;"Madrid";4)
+ C_OBJECT($ob)
+ OB SET($ob;"valueType";"integer")
+ OB SET($ob;"saveAs";"reference")
+ OB SET($ob;"value";2) //muestra London por defecto
+ OB SET($ob;"requiredListReference";<>List)
+```
+
+ ```
+ 
+ ```
+
+#### choiceListName y choiceListReference
+
+Los atributos "choiceListName" and "choiceListReference" permiten utilizar, en una celda de list box, una lista definida en 4D, ya sea en modo Diseño (en el editor de Listas de la Caja de Herramientas) o por programación (utilizando el comando New list). La celda se muestra entonces como un combo box, lo que significa que el usuario puede seleccionar o escribir un valor.
+
+Utilice "choiceListName" o "choiceListReference" en función del origen de la lista: si la lista procede de la caja de herramientas, pase un nombre; en caso contrario, si la lista se ha definido por programación, pase una referencia. En ambos casos, se puede utilizar un atributo "valor" para preseleccionar un valor en el widget.
+
+> - Si desea definir estos valores a través de un simple array, debe utilizar el atributo "choiceList".
+> - Si la lista contiene elementos de texto que representan valores reales, el separador decimal debe ser un punto ("."), independientemente de la configuración local, por ejemplo "17.6" "1234.456".
+
+Ejemplo:
+
+Ejemplo:
+
+
+
+```4d
+ C_OBJECT($ob)
+ OB SET($ob;"valueType";"text")
+
+ OB SET($ob;"value";"blue")
+ OB SET($ob;"choiceListName";"colors")
+```
+
+
+
+#### unitsList, unitsListName, unitsListReference y unitReference
+
+Puede utilizar atributos específicos para añadir unidades asociadas a los valores de las celdas (\*por ejemplo, \*: "10 cm", "20 píxeles", etc.). Para definir la lista de unidades, puede utilizar uno de los siguientes atributos:
+
+- "unitsList": un array que contiene los elementos x utilizados para definir las unidades disponibles (por ejemplo: "cm", "pulgadas", "km", "millas", etc.). Utilice este atributo para definir las unidades dentro del objeto.
+- "unitsListReference": una referencia a una lista 4D que contiene las unidades disponibles. Utilice este atributo para definir unidades con una lista 4D creada con el comando [`New list`](../commands-legacy/new-list.md).
+- "unitsListName": un nombre de una lista 4D basada en el diseño que contiene unidades disponibles. Utilice este atributo para definir las unidades con una lista 4D creada en la caja de herramientas.
+
+Independientemente de la forma en que se defina la lista de unidades, puede asociarse con el siguiente atributo:
+
+- "unitReference": un único valor que contiene el índice (de 1 a x) del elemento seleccionado en la lista de valores "unitList", "unitsListReference" o "unitsListName".
+
+Independientemente de la forma en que se defina la lista de unidades, puede asociarse con el siguiente atributo:
+
+Ejemplo:
+
+Queremos definir una entrada numérica seguida de dos posibles unidades: " líneas " o " píxeles ". El valor actual es "2" + "líneas". Utilizamos valores definidos directamente en el objeto (atributo "unitsList"):
+
+```4d
+ARRAY TEXT($_units;0)
+APPEND TO ARRAY($_units;"lines")
+APPEND TO ARRAY($_units;"pixels")
+C_OBJECT($ob)
+OB SET($ob;"valueType";"integer")
+OB SET($ob;"value";2) // 2 "units"
+OB SET($ob;"unitReference";1) //"lines"
+OB SET ARRAY($ob;"unitsList";$_units)
+```
+
+
+
+#### alternateButton
+
+Si desea añadir un botón de elipsis [...] a una celda, basta con pasar el "alternateButton" con el valor True en el objeto. El botón se mostrará en la celda automáticamente.
+
+Cuando este botón es presionado por un usuario, se generará un evento `On Alternate Click`, y usted podrá manejarlo como quiera (vea el párrafo "Manejo de eventos" para más información).
+
+Ejemplo:
+
+```4d
+C_OBJECT($ob1)
+$entry:="Hello world!"
+OB SET($ob;"valueType";"text")
+OB SET($ob;"alternateButton";True)
+OB SET($ob;"value";$entry)
+```
+
+
+
+#### valueType color
+
+El atributo valueType de valor "color" permite mostrar un color o un texto.
+
+- Si el valor es un número, se dibuja un rectángulo de color dentro de la celda. Ejemplo:
+
+ ```4d
+ C_OBJECT($ob4)
+ OB SET($ob4;"valueType";"color")
+ OB SET($ob4;"value";0x00FF0000)
+ ```
+
+
+
+- Si el valor es un texto, entonces se muestra el texto (*por ejemplo*: "valor"; "Automatic").
+
+#### event valueType
+
+El "event" valueType muestra un botón que genera un evento `On Clicked` al ser presionado. No se puede pasar ni devolver ningún dato o valor.
+
+Opcionalmente, se puede pasar un atributo "label".
+
+Ejemplo:
+
+```4d
+C_OBJECT($ob)
+OB SET($ob;"valueType";"event")
+OB SET($ob;"label";"Edit...")
+```
+
+
+
+### Gestión de eventos
+
+Se pueden manejar varios eventos mientras se utiliza un array list box de objetos:
+
+- **On Data Change**: un evento `On Data Change` se dispara cuando se ha modificado algún valor:
+ - en un área de entrada de texto
+ - en una lista desplegable
+ - en un área combo box
+ - en un botón de unidad (cambiar del valor x al valor x+1)
+ - en una casilla de selección (cambia entre marcado/desmarcado)
+- **On Clicked**: cuando el usuario haga clic en un botón instalado con el "event" atributo *valueType*, se generará un evento `On Clicked`. Este evento es gestionado por el programador.
+- **On Alternative Click**: cuando el usuario haga clic en un botón de elipsis (atributo "alternateButton"), se generará un evento `On Alternative Click`. Este evento es gestionado por el programador.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/pictureButton_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/pictureButton_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/pictureButton_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/pictureButton_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/picturePopupMenu_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/picturePopupMenu_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/picturePopupMenu_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/picturePopupMenu_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/pluginArea_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/pluginArea_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/pluginArea_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/pluginArea_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/progressIndicator.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/progressIndicator.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/progressIndicator.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/progressIndicator.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Action.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Action.md
new file mode 100644
index 00000000000000..1e4635722fa0b1
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Action.md
@@ -0,0 +1,209 @@
+---
+id: propertiesAction
+title: Acción
+---
+
+---
+
+## Arrastrable
+
+Controle si el usuario puede arrastrar el objeto y cómo. Por defecto, no se permite ninguna operación de arrastre.
+
+Hay dos modos de arrastrar disponibles:
+
+- **Personalizado**: en este modo, toda operación de arrastrar realizada en el objeto dispara el evento formulario `On Begin Drag` en el contexto del objeto. A continuación, gestiona la acción arrastrar utilizando un método.
+ En el modo personalizado, básicamente toda la operación de arrastrar y soltar es realizada por el programador. Este modo le permite implementar cualquier interfaz basada en la función de arrastrar y soltar, incluidas las interfaces que no necesariamente transportan datos, sino que pueden realizar cualquier acción como abrir archivos o activar un cálculo. Este modo se basa en una combinación de propiedades, eventos y comandos específicos del tema `Portapapeles`.
+- **Automático**: en este modo, 4D **copia** el texto o las imágenes directamente desde el objeto formulario. Puede utilizarse en la misma área 4D, entre dos áreas 4D o entre 4D y otra aplicación. Por ejemplo, arrastrar (y soltar) automáticamente le permite copiar un valor entre dos campos sin usar programación:\
+ \
+ 
+ En este modo, NO se genera el evento del formulario `On Begin Drag`. Si quiere "forzar" el uso del arrastre personalizado mientras está activado el arrastre automático, mantenga presionada la tecla **Alt** (Windows) o **Opción** (macOS) durante la acción. Esta opción no está disponible para las imágenes.
+
+Para más información, consulte [Arrastrar y soltar](https://doc.4d.com/4Dv20/4D/20.6/Drag-and-Drop.300-7487471.en.html) en el manual *Lenguaje 4D*.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ------------------------------------------------------------------------------------------------------- |
+| dragging | text | "none" (por defecto), "custom", "automatic" (excluyendo list box) |
+
+#### Objetos soportados
+
+[Áreas 4D Write Pro](writeProArea_overview.md) - [Combo Box](comboBox_overview.md) - [Entrada](input_overview.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Área de Plug-in](pluginArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET DRAG AND DROP OPTIONS](../commands-legacy/object-get-drag-and-drop-options.md) - [OBJECT SET DRAG AND DROP OPTIONS](../commands-legacy/object-set-drag-and-drop-options.md)
+
+#### Ver también
+
+[Droppable](#droppable)
+
+---
+
+## Soltable
+
+Controla si el objeto puede ser el destino de una operación de arrastrar y soltar y cómo hacerlo.
+
+Hay dos modos de soltar disponibles:
+
+- **Personalizado**: en este modo, cualquier operación de soltar realizada en el objeto activa los eventos formulario `On Drag Over` y `On Drop` en el contexto del objeto. A continuación, gestiona la acción soltar utilizando un método.
+ En el modo personalizado, básicamente toda la operación de arrastrar y soltar es realizada por el programador. Este modo le permite implementar cualquier interfaz basada en la función de arrastrar y soltar, incluidas las interfaces que no necesariamente transportan datos, sino que pueden realizar cualquier acción como abrir archivos o activar un cálculo. Este modo se basa en una combinación de propiedades, eventos y comandos específicos del tema `Portapapeles`.
+- **Automático**: en este modo, 4D gestiona automáticamente, si es posible, la inserción de los datos arrastrados de tipo texto o imagen que se sueltan sobre el objeto (los datos se pegan en el objeto). Los eventos `On Drag Over` y `On Drop` NO se generan. Por otra parte, se generan los eventos `On After Edit` (durante el soltar) y `On Data Change` (cuando el objeto pierde el foco).
+
+Para más información, consulte [Arrastrar y soltar](https://doc.4d.com/4Dv20/4D/20.6/Drag-and-Drop.300-7487471.en.html) en el manual *Lenguaje 4D*.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ------------------------------------------------------------------------------------------------------- |
+| dropping | text | "none" (por defecto), "custom", "automatic" (excluyendo list box) |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Combo Box](comboBox_overview.md) - [Entrada](input_overview.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Área Plug-in](pluginArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET DRAG AND DROP OPTIONS](../commands-legacy/object-get-drag-and-drop-options.md) - [OBJECT SET DRAG AND DROP OPTIONS](../commands-legacy/object-set-drag-and-drop-options.md)
+
+#### Ver también
+
+[Draggable](#draggable)
+
+---
+
+## Ejecutar método objeto
+
+Cuando esta opción está activada, el método objeto se ejecuta con el evento `On Data Change` *en el mismo momento* en que el usuario cambia el valor del indicador. Cuando la opción está desactivada, el método se ejecuta *tras* la modificación.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------- | -------------- | ---------------- |
+| continuousExecution | boolean | true, false |
+
+#### Objetos soportados
+
+[Indicador de progreso](progressIndicator.md) - [Regla](ruler.md) - [Stepper](stepper.md)
+
+---
+
+## Método
+
+Referencia de un método adjunto al objeto. Los métodos de objeto generalmente "gestionan" el objeto mientras el formulario se muestra o se imprime. No llame a un método objeto, 4D lo llama automáticamente cuando un evento implica el objeto al que el método objeto está asociado.
+
+Se soportan varios tipos de referencias de métodos:
+
+- una ruta de archivo de método objeto estándar, es decir, que utilice el siguiente patrón:\
+ `ObjectMethods/objectName.4dm`\
+ ... donde `objectName` es el [nombre del objeto](properties_Object.md#object-name). Este tipo de referencia indica que el archivo del método se encuentra en la ubicación por defecto ("sources/forms/*formName*/ObjectMethods/"). En este caso, 4D maneja automáticamente el método objeto cuando se ejecutan operaciones en el objeto formulario (renombrar, duplicar, copiar/pegar...)
+
+- a project method name: name of an existing project method without file extension, i.e.: `myMethod` In this case, 4D does not provide automatic support for object operations.
+
+- una ruta de archivo de métodos personalizados que incluya la extensión .4dm, por ejemplo:
+ `../../CustomMethods/myMethod.4dm`
+ También puede utilizar un sistema de archivos:\
+ `/RESOURCES/Buttons/bOK.4dm`
+ En este caso, 4D no ofrece soporte automático para operaciones con objetos.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | --------------------------------------------------------------------------------------- |
+| method | text | Ruta de archivo estándar o personalizada del método objeto o nombre del método proyecto |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Formularios](FormEditor/forms.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
+
+---
+
+## Líneas desplazables
+
+`List boxes de tipo array`
+
+Autoriza el desplazamiento de líneas durante la ejecución. Esta opción está seleccionada por defecto. No está disponible para los [list box de tipo selección](listbox_overview.md#selection-list-boxes) ni para los [list box en modo jerárquico](properties_Hierarchy.md#hierarchical-list-box).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ---------------- |
+| movableRows | boolean | true, false |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Multi-seleccionable
+
+Permite la selección de múltiples registros/opciones en una [lista jerárquica](list_overview.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------------------- |
+| selectionMode | text | "multiple", "single", "none" |
+
+#### Objetos soportados
+
+[Lista jerárquica](list_overview.md)
+
+#### Comandos
+
+[GET LIST PROPERTIES](../commands-legacy/get-list-properties.md) - [SET LIST PROPERTIES](../commands-legacy/set-list-properties.md)
+
+---
+
+## Ordenable
+
+Permite ordenar los datos de las columnas haciendo clic en un encabezado [listbox](listbox_overview.md). Esta opción está seleccionada por defecto. Los arrays de tipo imagen (columnas) no pueden ordenarse utilizando esta función.
+
+En los list box basados en una selección de registros, sólo está disponible la función de ordenación estándar:
+
+- Cuando la fuente de datos es *Selección actual*,
+- Con columnas asociadas a campos (de tipo Alfa, Número, Fecha, Hora o Booleano).
+
+En otros casos (list box basados en selecciones temporales, columnas asociadas a expresiones), la función de ordenación estándar no está disponible. Una ordenación estándar del list box cambia el orden de la selección actual en la base de datos. Sin embargo, los registros resaltados y el registro actual no se modifican. Una ordenación estándar sincroniza todas las columnas del list box, incluidas las columnas calculadas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ---------------- |
+| sortable | boolean | true, false |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Acción estándar
+
+Actividades típicas que deben realizar los objetos activos (\*por ejemplo, permitir al usuario aceptar, cancelar o eliminar registros, desplazarse entre registros o de una página a otra en un formulario multipágina, etc.) han sido predefinidas por 4D como acciones estándar. Se describen con detalle en la sección [Acciones estándar](https://doc.4d.com/4Dv20/4D/20.2/Standard-actions.300-6750239.en.html) de la *manual de Diseño*.
+
+Puede asignar al mismo tiempo una acción estándar y un método proyecto de un objeto. En este caso, la acción estándar suele ejecutarse después del método y 4D utiliza esta acción para activar/desactivar el objeto según el contexto actual. Cuando se desactiva un objeto, no se puede ejecutar el método proyecto asociado.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| action | string | El nombre de una [acción estándar válida](https://doc.4d.com/4Dv20/4D/20.2/Standard-actions.300-6750239.en.html). |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de selección](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Menú emergente imagen](picturePopupMenu_overview.md) - [Control de pestañas](tabControl.md)
+
+#### Comandos
+
+[`OBJECT Get action`](../commands-legacy/object-get-action.md) - [`OBJECT SET ACTION`](../commands-legacy/object-set-action.md)
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Animation.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Animation.md
new file mode 100644
index 00000000000000..9c30ded8e6391b
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Animation.md
@@ -0,0 +1,123 @@
+---
+id: propertiesAnimation
+title: Animación
+---
+
+## Vuelve a la primera secuencia
+
+Las imágenes se muestran en un bucle continuo. Cuando el usuario llega a la última imagen y vuelve a hacer clic, aparece la primera imagen, y así sucesivamente.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------------- | -------------- | ---------------- |
+| loopBackToFirstFrame | boolean | true, false |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Retorna cuando se libera
+
+Muestra la primera imagen todo el tiempo, excepto cuando el usuario hace clic en el botón. Muestra la segunda imagen hasta que se suelta el botón del ratón. Este modo le permite crear un botón de acción con una imagen diferente para cada estado (inactivo y pulsado). Puede utilizar este modo para crear un efecto 3D o mostrar cualquier imagen que represente la acción del botón.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------------------- | -------------- | ---------------- |
+| switchBackWhenReleased | boolean | true, false |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Desplazamiento continuo en clics
+
+Permite al usuario mantener pulsado el botón del ratón para mostrar las imágenes de forma continua (es decir, como una animación). Cuando el usuario llega a la última imagen, el objeto no vuelve a la primera imagen.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------ | -------------- | ---------------- |
+| switchContinuously | boolean | true, false |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Cambiar cada x ticks
+
+Permite recorrer el contenido del botón de imagen a la velocidad especificada (en ticks). En este modo, se ignoran todas las demás opciones.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ------------------------- |
+| frameDelay | integer | mínimo: 0 |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Cambiar cuando se pasa por encima el cursor
+
+Modifica el contenido del botón de la imagen cuando el cursor del ratón pasa por encima. La imagen inicial se muestra cuando el cursor sale del área del botón.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------ | -------------- | ---------------- |
+| switchWhenRollover | boolean | true, false |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Utilizar el Último cuadro como Desactivado
+
+Permite definir la última miniatura como la que se mostrará cuando el botón esté desactivado. La imagen en miniatura utilizada cuando el botón está desactivado es procesada por separado por 4D: cuando se combina esta opción con "Cambiar continuamente" y "Retroceder en bucle a la primera imagen", la última imagen se excluye de la secuencia asociada al botón y sólo aparece cuando está desactivado.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :--------------------- | -------------- | ---------------- |
+| useLastFrameAsDisabled | boolean | true, false |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Appearance.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Appearance.md
new file mode 100644
index 00000000000000..7a9302fe6e5cb3
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Appearance.md
@@ -0,0 +1,458 @@
+---
+id: propertiesAppearance
+title: Apariencia
+---
+
+## Botón por defecto
+
+La propiedad del botón por defecto designa el botón que obtiene el foco inicial en ejecución cuando ningún botón del formulario tiene la propiedad [Focusable](properties_Entry.md#focusable).
+
+Sólo puede haber un botón por defecto por página de formulario.
+
+Además, en macOS, la propiedad del botón por defecto modifica la apariencia del botón para indicar una "opción recomendada" al usuario y se vincula automáticamente a la tecla **Intro**, aunque no tenga el foco. El botón por defecto puede ser diferente del botón enfocado. Los botones por defecto tienen un aspecto azul específico en macOS:
+
+
+
+> El botón debe tener una altura estándar para obtener la apariencia de botón por defecto.
+
+En Windows, el concepto de "opción recomendada" no está soportado: sólo el botón enfocado tiene una apariencia diferente en tiempo de ejecución y la tecla **Intro** está vinculada al botón enfocado. Sin embargo, en el editor de formularios de 4D, el botón por defecto se representa con un contorno azul:
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------- |
+| defaultButton | boolean | true, false |
+
+#### Objetos soportados
+
+[Botón regular ](button_overview.md#regular) - [Botón plano](button_overview.md#regular)
+
+---
+
+## Ocultar rectángulo de enfoque
+
+Durante la ejecución, un campo o toda área introducible es delimitada por un rectángulo de selección cuando tiene el foco (a través de la tecla Tab o un simple clic). Puede ocultar este rectángulo activando esta propiedad. Ocultar el rectángulo de enfoque puede ser útil en el caso de interfaces específicas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------- |
+| hideFocusRing | boolean | true, false |
+
+#### Objetos soportados
+
+[Áreas 4D Write Pro](writeProArea_overview.md) - [Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [List Box](listbox_overview.md) - [Sub formulario](subform_overview.md)
+
+#### Comandos
+
+[OBJECT Get focus rectangle invisible](../commands-legacy/object-get-focus-rectangle-invisible.md) - [OBJECT SET FOCUS RECTANGLE INVISIBLE](../commands-legacy/object-set-focus-rectangle-invisible.md)
+
+---
+
+## Ocultar resaltado selección
+
+`List boxes de tipo selección`
+
+Esta propiedad se utiliza para desactivar el resaltado de la selección en los list box.
+
+Cuando esta opción está activada, el resaltado de la selección ya no es visible para las selecciones realizadas en los list box. Las selecciones en sí siguen siendo válidas y funcionan exactamente igual que antes; sin embargo, ya no se representan gráficamente en pantalla, y tendrá que [definir su apariencia por programación](listbox_overview.md#customizing-appearance-of-selected-rows).
+
+Por defecto, esta opción no está activa.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------- | -------------- | ---------------- |
+| hideSystemHighlight | boolean | true, false |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Barra de desplazamiento horizontal
+
+Una herramienta de interfaz que permite al usuario desplazar el área de visualización hacia la izquierda o la derecha.
+
+Valores disponibles:
+
+| Lista de propiedades | Valor JSON | Descripción |
+| -------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Sí | "visible" | La barra de desplazamiento está siempre visible, incluso cuando no es necesaria (es decir, cuando el tamaño del contenido del objeto es menor que el del marco). |
+| No | "hidden" | La barra de desplazamiento nunca es visible |
+| Automático | "automatic" | La barra de desplazamiento aparece automáticamente cuando es necesario y el usuario puede introducir un texto mayor que el ancho del objeto |
+
+> Los objetos imagen pueden tener las barras de desplazamiento cuando el formato de visualización de la imagen está definido como "Truncado (no centrado)."
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------- | -------------- | -------------------------------- |
+| scrollbarHorizontal | text | "visible", "hidden", "automatic" |
+
+#### Objetos soportados
+
+[Lista jerárquica](list_overview.md) - [Sub formulario](subform_overview.md) - [List Box](listbox_overview.md) - [Área de entrada](input_overview.md) - [Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET SCROLLBAR](../commands-legacy/object-get-scrollbar.md) - [OBJECT SET SCROLLBAR](../commands-legacy/object-set-scrollbar.md)
+
+#### Ver también
+
+[Barra de desplazamiento vertical](#vertical-scroll-bar)
+
+---
+
+## Resolution
+
+Define la resolución de la pantalla para el contenido del área 4D Write Pro. Por defecto, se define a 72 ppp (macOS), que es la resolución estándar para los formularios 4D en todas las plataformas. Si se define esta propiedad en 96 ppp, se establecerá un renderizado Windows/Web tanto en plataformas macOS como Windows. Si se define esta propiedad como **automática** significa que la representación del documento diferirá entre las plataformas macOS y Windows.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------- |
+| dpi | number | 0=automatic, 72, 96 |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar el fondo
+
+Muestra/oculta tanto las imágenes de fondo como el color de fondo.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | -------------------------------------------- |
+| showBackground | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar los pies de página
+
+Muestra/oculta los pies de página cuando el [modo visualización de la página ](#view-mode) está definido como "Página".
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | -------------------------------------------- |
+| showFooters | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar la barra de fórmula
+
+Cuando está activada, la barra de fórmulas es visible debajo de la interfaz de la barra de herramientas en el área 4D View Pro. Si no se selecciona, la barra de fórmulas se oculta.
+
+> Esta propiedad sólo está disponible para la interfaz de la [Barra de herramientas](#user-interface).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | -------------------------------------------- |
+| withFormulaBar | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md)
+
+---
+
+## Mostrar los encabezados
+
+Muestra/oculta los encabezados cuando el [modo visualización de la página ](#view-mode) está definido como "Página".
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | -------------------------------------------- |
+| showHeaders | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar los caracteres ocultos
+
+Muestra/oculta los caracteres invisibles
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | -------------------------------------------- |
+| showHiddenChars | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar la regla horizontal
+
+Muestra/oculta la regla horizontal cuando la vista del documento está en modo [Página](#modo-de-vista).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------- | -------------- | -------------------------------------------- |
+| showHorizontalRuler | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar HTML WYSIWYG
+
+Activa/desactiva la vista HTML WYSIWYG, en la que se eliminan los atributos avanzados de 4D Write Pro que no son compatibles con todos los navegadores.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | -------------------------------------------- |
+| showHTMLWysiwyg | boolean | true, false (por defecto) |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar el marco de la página
+
+Muestra/oculta el marco de la página cuando [modo visualización de página ](#view-mode) está definido como "Página".
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | ---------------- |
+| showPageFrames | boolean | true, false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar las referencias
+
+Muestra todas las expresiones 4D insertadas en el documento de 4D Write Pro como *referencias*. Cuando esta opción está desactivada, las expresiones 4D se muestran como *valores*. Por defecto, cuando se inserta un campo o expresión 4D, 4D Write Pro calcula y muestra su valor actual. Seleccione esta propiedad si desea saber qué campo o expresión se muestra. Las referencias de campo o de expresión aparecen entonces en su documento, con un fondo gris.
+
+Por ejemplo, ha insertado la fecha actual junto con un formato, la fecha se muestra:
+
+
+
+Con la propiedad Mostrar referencias activada, se muestra la referencia:
+
+
+
+> Las expresiones 4D se pueden insertar con el comando `ST INSERT EXPRESSION`.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | -------------------------------------------- |
+| showReferences | boolean | true, false (por defecto) |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Mostrar regla vertical
+
+Muestra/oculta la regla vertical cuando la vista del documento está en modo [Página](#view-mode).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------- | -------------- | -------------------------------------------- |
+| showVerticalRuler | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Pestañas
+
+Puede definir la dirección de las pestañas en sus formularios. Esta propiedad está disponible en todas las plataformas, pero sólo puede mostrarse en macOS. Puede elegir colocar los controles de las pestañas en la parte superior (estándar) o en la parte inferior.
+
+Cuando los controles de pestañas con una dirección personalizada se muestran en Windows, vuelven automáticamente a la dirección estándar (superior).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ---------------- |
+| labelsPlacement | boolean | "top", "bottom" |
+
+#### Objetos soportados
+
+[Control de pestañas](tabControl.md)
+
+---
+
+## Interfaz de usuario
+
+Puede añadir una interfaz a las áreas 4D View Pro para permitir a los usuarios finales realizar modificaciones básicas y manipulaciones de datos. 4D View Pro ofrece dos interfaces opcionales a elegir, **Cinta** y **Barra de herramientas**.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ------------------------------------------------------------ |
+| userInterface | text | "none" (por defecto), "ribbon", "toolbar" |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md)
+
+#### Ver también
+
+[Guía de referencia de 4D View Pro](../ViewPro/getting-started.md)
+
+---
+
+## Barra de desplazamiento vertical
+
+Una herramienta de interfaz que permite al usuario mover el área de visualización hacia arriba y hacia abajo.
+
+Valores disponibles:
+
+| Lista de propiedades | Valor JSON | Descripción |
+| -------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Sí | "visible" | La barra de desplazamiento está siempre visible, incluso cuando no es necesaria (es decir, cuando el tamaño del contenido del objeto es menor que el del marco). |
+| No | "hidden" | La barra de desplazamiento nunca es visible |
+| Automático | "automatic" | La barra de desplazamiento aparece automáticamente cuando es necesario (es decir, cuando el tamaño del contenido del objeto es mayor que el del marco) |
+
+> Los objetos imagen pueden tener las barras de desplazamiento cuando el formato de visualización de la imagen está definido como "Truncado (no centrado)."
+
+> Si un objeto de entrada de texto no tiene una barra de desplazamiento, el usuario puede desplazarse por la información utilizando las teclas de flecha.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------- | -------------- | -------------------------------- |
+| scrollbarVertical | text | "visible", "hidden", "automatic" |
+
+#### Objetos soportados
+
+[Lista jerárquica](list_overview.md) - [Sub formulario](subform_overview.md) - [List Box](listbox_overview.md) - [Área de entrada](input_overview.md) - [Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET SCROLLBAR](../commands-legacy/object-get-scrollbar.md) - [OBJECT SET SCROLLBAR](../commands-legacy/object-set-scrollbar.md)
+
+#### Ver también
+
+[Barra de desplazamiento horizontal](#horizontal-scroll-bar)
+
+---
+
+## Modo de visualización
+
+Establece el modo de visualización del documento de 4D Write Pro en el área del formulario. Hay tres valores disponibles:
+
+- **Página**: el modo de vista más completo, que incluye contornos de página, orientación, márgenes, saltos de página, encabezados y pies de página, etc.
+- **Borrador**: modo borrador con propiedades básicas del documento
+- **Embedded**: modo de vista adecuado para zonas integradas; no muestra márgenes, pies de página, encabezados, marcos de página, etc. Este modo también se puede utilizar para producir una salida de vista similar a la de la web (si también selecciona la [resolución de 96 dpi ](#resolution) y las propiedades [Mostrar HTML WYSIWYG](#show-html-wysiwyg)).
+
+> La propiedad Modo vista sólo se utiliza para la renderización en pantalla. En cuanto a la configuración de la impresión, se utilizan automáticamente reglas de renderización específicas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | --------------------------- |
+| layoutMode | text | "page", "draft", "embedded" |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Zoom
+
+Define el porcentaje de zoom para mostrar el contenido del área 4D Write Pro.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------- |
+| zoom | number | mínimo = 0 |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[WP Get view properties](../WritePro/commands-legacy/wp-get-view-properties.md) - [WP SET VIEW PROPERTIES](../WritePro/commands-legacy/wp-set-view-properties.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_BackgroundAndBorder.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_BackgroundAndBorder.md
new file mode 100644
index 00000000000000..fd5d143c861665
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_BackgroundAndBorder.md
@@ -0,0 +1,255 @@
+---
+id: propertiesBackgroundAndBorder
+title: Fondo y borde
+---
+
+## Color de fondo alternado
+
+Permite definir un color de fondo diferente para las líneas o columnas impares de un list box. Permite definir un color de fondo diferente para las líneas o columnas impares de un list box.
+
+También puede definir esta propiedad utilizando el comando.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ----------------------------------------------------------------------- |
+| alternateFill | string | todos los valores css; "transparent"; "automatic"; "automaticAlternate" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[`OBJECT GET RGB COLORS`](../commands-legacy/object-get-rgb-colors.md) - [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md)
+
+---
+
+## Color de fondo / Color de relleno
+
+Define el color de fondo de un objeto.
+
+En el caso de un list box, por defecto se selecciona *Automático*: la columna utiliza el color de fondo definido al nivel del list box.
+
+También puede definir esta propiedad utilizando el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------------------------------- |
+| fill | string | un valor css; "transparent"; "automatic" |
+
+#### Objetos soportados
+
+[Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers) - [Óvalo](shapes_overview.md#oval) - [Rectángulo](shapes_overview.md#rectangle) - [Área de texto](text.md)
+
+#### Comandos
+
+[`LISTBOX Get row color`](../commands-legacy/listbox-get-row-color.md) - [`LISTBOX SET ROW COLOR`](../commands-legacy/listbox-set-row-color.md) - [`OBJECT GET RGB COLORS`](../commands-legacy/object-get-rgb-colors.md) - [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md)
+
+#### Ver también
+
+[Transparente](#transparente)
+
+---
+
+## Background Color Expression {#background-color-expression}
+
+`List box de tipo colección y de tipo selección de entidades`
+
+Una expresión o una variable (no se pueden utilizar variables array) para aplicar un color de fondo personalizado a cada línea del list box. La expresión o la variable se evaluará para cada línea mostrada y debe devolver un valor de color RGB. Para más información, consulte la descripción del comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md) en el *Manual de Referencia del Lenguaje 4D*.
+
+También puede establecer esta propiedad utilizando el comando [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md) con la constante `lk background color expression`.
+
+> Con los list box de tipo colección o selección de entidades, esta propiedad también puede definirse utilizando una [Meta Info Expression](properties_Text.md#meta-info-expression).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ------------------------------------------------ |
+| rowFillSource | string | Una expresión que devuelve un valor de color RGB |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[`LISTBOX Get property`](../commands/listbox-get-property.md) - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md)
+
+---
+
+## Estilo de línea de borde {#border-line-style}
+
+Permite definir un estilo estándar para el borde del objeto.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ----------------------------------------------------------------- |
+| borderStyle | text | "system", "none", "solid", "dotted", "raised", "sunken", "double" |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Áreas 4D Write Pro](writeProArea_overview.md) - [Botones](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Regla](ruler.md) - [Spinner](spinner.md) - [Stepper](stepper.md) - [Subformulario](subform_overview.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[`OBJECT Get border style`](../commands-legacy/object-get-border-style.md) - [`OBJECT SET BORDER STYLE`](../commands-legacy/object-set-border-style.md)
+
+---
+
+## Tipo de línea punteada {#dotted-line-type}
+
+Describe el tipo de línea punteada como una secuencia de puntos blancos y negros.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
+| strokeDashArray | arrays numéricos o cadenas | Ej. "6 1" o \[6,1\] para una secuencia de 6 puntos negros y 1 punto blanco |
+
+#### Objetos soportados
+
+[Rectángulo](shapes_overview.md#rectangle) - [Óvalo](shapes_overview.md#oval) - [Línea](shapes_overview.md#line)
+
+---
+
+## Ocultar líneas vacías finales
+
+Controla la visualización de las líneas vacías adicionales añadidas en la parte inferior de un objeto list box. Por defecto, 4D añade esas líneas adicionales para llenar el área vacía:
+
+
+
+Puede eliminar estas líneas vacías seleccionando esta opción. La parte inferior del objeto del list box se deja vacía:
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------ | -------------- | ---------------- |
+| hideExtraBlankRows | boolean | true, false |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[`LISTBOX Get property`](../commands/listbox-get-property.md) - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md)
+
+---
+
+## Color de línea
+
+Designa el color de las líneas del objeto.
+El color puede ser especificado por:
+
+- un nombre de color - como "red"
+- un valor HEX - como "# ff0000"
+- un valor RVB - como "rgb (255,0,0)"
+
+También puede definir esta propiedad utilizando el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------------------------------- |
+| stroke | string | un valor css, "transparent", "automatic" |
+
+> Esta propiedad también está disponible para los objetos basados en texto, en cuyo caso designa tanto el color de la fuente como las líneas del objeto, ver [Color de la fuente](properties_Text.md#font-color).
+
+#### Objetos soportados
+
+[Línea](shapes_overview.md#line) - [Óvalo](shapes_overview.md#oval) - [Rectángulo](shapes_overview.md#rectangle)
+
+#### Comandos
+
+[`OBJECT GET RGB COLORS`](../commands-legacy/object-get-rgb-colors.md) - [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md)
+
+---
+
+## Ancho de línea
+
+Designa el grosor de una línea.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | --------------------------------------------------------------------------------------------------------------- |
+| strokeWidth | number | 0 para el ancho más pequeño en un formulario impreso, o cualquier valor de entero < 20 |
+
+#### Objetos soportados
+
+[Línea](shapes_overview.md#line) - [Óvalo](shapes_overview.md#oval) - [Rectángulo](shapes_overview.md#rectangle)
+
+---
+
+## Row Background Color Array {#row-background-color-array}
+
+`List boxes de tipo array`
+
+El nombre de un array para aplicar un color de fondo personalizado a cada línea o columna del list box.
+
+Debe introducirse el nombre de un array Entero largo. Cada elemento de este array corresponde a una línea del list box (si se aplica al list box) o a una celda de la columna (si se aplica a una columna), por lo que el array debe tener el mismo tamaño que el array asociado a la columna. Puede utilizar las constantes descritas en el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md). Si desea que la celda herede el color de fondo definido en el nivel superior, pase el valor -255 al elemento del array correspondiente.
+
+Por ejemplo, dado un list box en el que las líneas tienen un color gris/gris claro alternado, definido en las propiedades del list box. También se ha definido para el list box un array de color de fondo con el fin de cambiar a naranja claro el color de las líneas en las que al menos un valor es negativo:
+
+```4d
+ <>_BgndColors{$i}:=0x00FFD0B0 // naranja
+ <>_BgndColors{$i}:=-255 // valor por defecto
+```
+
+
+
+A continuación, quiere colorear las celdas con valores negativos en naranja oscuro. A continuación, quiere colorear las celdas con valores negativos en naranja oscuro. Los valores de estos arrays tienen prioridad sobre los definidos en las propiedades del list box, así como los del array de color de fondo general:
+
+```4d
+ <>_BgndColorsCol_3{2}:=0x00FF8000 // naranja oscuro
+ <>_BgndColorsCol_2{5}:=0x00FF8000
+ <>_BgndColorsCol_1{9}:=0x00FF8000
+ <>_BgndColorsCol_1{16}:=0x00FF8000
+```
+
+
+
+Puede obtener el mismo resultado utilizando los comandos [`LISTBOX SET ROW FONT STYLE`](../commands-legacy/listbox-set-row-font-style.md) y [`LISTBOX SET ROW COLOR`](../commands-legacy/listbox-set-row-color.md). Tienen la ventaja de permitirle omitir el tener que predefinir arrays de estilo/color para las columnas: en su lugar son creadas dinámicamente por los comandos.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | --------------------------------------------------- |
+| rowFillSource | string | El nombre de un array entero largo. |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[`LISTBOX Get array`](../commands-legacy/listbox-get-array.md) - [`LISTBOX GET ARRAYS`](../commands-legacy/listbox-get-arrays.md)
+
+---
+
+## Transparente
+
+Define el fondo del list box como "Transparent". Cuando se define, se ignora cualquier [color de fondo alternativo](#alternate-background-color) o [color de fondo](#background-color--fill-color) definido para la columna.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------- |
+| fill | text | "transparent" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[`OBJECT GET RGB COLORS`](../commands-legacy/object-get-rgb-colors.md) - [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md)
+
+#### Ver también
+
+[Color de fondo / Color de relleno](#background-color--fill-color)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_CoordinatesAndSizing.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_CoordinatesAndSizing.md
new file mode 100644
index 00000000000000..29ac8171fee0be
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_CoordinatesAndSizing.md
@@ -0,0 +1,379 @@
+---
+id: propertiesCoordinatesAndSizing
+title: Coordenadas y dimensiones
+---
+
+## Altura de línea automática
+
+Esta propiedad sólo está disponible para los list boxes con las siguientes [fuentes de datos](properties_Object.md#data-source):
+
+- collection o entity selection,
+- array (no jerárquico).
+
+Esta propiedad no está seleccionada por defecto. Cuando se utiliza para al menos una columna, la altura de cada línea de la columna será calculada automáticamente por 4D, y se tendrá en cuenta el contenido de la columna. Tenga en cuenta que sólo se tendrán en cuenta las columnas con la opción seleccionada para calcular el alto de línea.
+
+:::note
+
+Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal](properties_ResizingOptions.md#horizontal-sizing) "Agrandar" fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
+
+:::
+
+Cuando esta propiedad está activada, la altura de cada línea se calcula automáticamente para que el contenido de la celda quepa por completo sin ser truncado (a menos que la opción [Wordwrap](properties_Display.md#wordwrap) esté desactivada.
+
+- El cálculo de la altura de línea tiene en cuenta:
+ - todo tipo de contenido (texto, números, fechas, horas, imágenes (el cálculo depende del formato de la imagen), objetos),
+ - todo tipo de control (entradas, casillas de selección, listas, listas desplegables),
+ - fuentes, estilos y tamaños de letra,
+ - la opción [Wordwrap](properties_Display.md#wordwrap): si está desactivada, la altura se basa en el número de párrafos (las líneas se truncan); si está activada, la altura se basa en el número de líneas (no se trunca).
+
+- El cálculo de la altura de línea no tiene en cuenta:
+ - contenido de columna oculta
+ - Para los list box de tipo array, esta propiedad sólo está disponible si la opción [Altura de línea automática](#automatic-row-height) no está seleccionada.
+
+:::caution
+
+> Since it requires additional calculations at runtime, the automatic row height option could affect the scrolling fluidity of your list box, in particular when it contains a large number of rows.
+
+:::
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------- |
+| rowHeightAuto | boolean | true, false |
+
+#### Objetos soportados
+
+[Columna de list box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[`LISTBOX Get property`](../commands/listbox-get-property.md) - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md)
+
+---
+
+## Abajo
+
+Coordenadas inferiores del objeto en el formulario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------- |
+| bottom | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET COORDINATES](../commands-legacy/object-get-coordinates.md) - [OBJECT MOVE](../commands-legacy/object-move.md) - [OBJECT SET COORDINATES](../commands-legacy/object-set-coordinates.md)
+
+---
+
+## Izquierda
+
+Coordenadas de izquierda del objeto en el formulario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------- |
+| left | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET COORDINATES](../commands-legacy/object-get-coordinates.md) - [OBJECT MOVE](../commands-legacy/object-move.md) - [OBJECT SET COORDINATES](../commands-legacy/object-set-coordinates.md)
+
+---
+
+## Derecha
+
+Coordenadas de derecha del objeto en el formulario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------- |
+| right | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET COORDINATES](../commands-legacy/object-get-coordinates.md) - [OBJECT MOVE](../commands-legacy/object-move.md) - [OBJECT SET COORDINATES](../commands-legacy/object-set-coordinates.md)
+
+---
+
+## Arriba
+
+Coordenadas superiores del objeto en el formulario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------- |
+| top | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET COORDINATES](../commands-legacy/object-get-coordinates.md) - [OBJECT MOVE](../commands-legacy/object-move.md) - [OBJECT SET COORDINATES](../commands-legacy/object-set-coordinates.md)
+
+---
+
+## Radio de redondeo
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------------------------------- |
+| 19 R7 | Soporte para entradas y áreas de texto |
+
+
+
+Define la redondez de las esquinas (en píxeles) del objeto. Por defecto, el valor del radio es de 0 píxeles. Puede cambiar esta propiedad para dibujar objetos redondeados con formas personalizadas:
+
+
+
+El valor mínimo es 0, en este caso se dibuja un objeto estándar no redondeado.
+El valor máximo depende del tamaño del rectángulo (no puede superar la mitad del tamaño del lado más corto del rectángulo) y se calcula dinámicamente.
+
+:::note
+
+Con [áreas de texto](text.md) y [entradas](input_overview.md):
+
+- la propiedad de radio de la esquina sólo está disponible con los [estilos de línea de borde](properties_BackgroundAndBorder.md#border-line-style) "ninguno", "sólido" o "punteado",
+- la redondez de la esquina se dibuja fuera del área del objeto (el objeto aparece más grande en el formulario pero su [ancho](properties_CoordinatesAndSizing.md#width) y [alto](properties_CoordinatesAndSizing.md#height) no se amplían).
+
+
+
+:::
+
+You can also set this property using the [OBJECT Get corner radius](../commands-legacy/object-get-corner-radius.md) and [OBJECT SET CORNER RADIUS](../commands-legacy/object-set-corner-radius.md) commands.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ------------------------- |
+| borderRadius | integer | mínimo: 0 |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md) - [Rectángulo](shapes_overview.md#rectangle) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT GET CORNER RADIUS](../commands-legacy/object-get-corner-radius.md) - [OBJECT SET CORNER RADIUS](../commands-legacy/object-set-corner-radius.md)
+
+---
+
+## Altura
+
+Esta propiedad designa el tamaño vertical de un objeto.
+
+> Algunos objetos pueden tener una altura predefinida que no se puede modificar.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------- |
+| height | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET COORDINATES](../commands-legacy/object-get-coordinates.md) - [OBJECT MOVE](../commands-legacy/object-move.md) - [OBJECT SET COORDINATES](../commands-legacy/object-set-coordinates.md)
+
+---
+
+## Ancho
+
+Esta propiedad designa el tamaño horizontal de un objeto.
+
+> - Algunos objetos pueden tener una altura predefinida que no se puede modificar.
+> - Si la propiedad [Redimensionable](properties_ResizingOptions.md#resizable) se utiliza para una [columna de list box](listbox_overview.md#list-box-columns), el usuario también puede cambiar manualmente el tamaño de la columna.
+> - Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal "Agrandar"](properties_ResizingOptions.md#horizontal-sizing) fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------- |
+| ancho | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md#) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Línea](shapes_overview.md#line) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Rectángulo](shapes_overview.md#rectangle) - [Regla](ruler.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[OBJECT GET COORDINATES](../commands-legacy/object-get-coordinates.md) - [OBJECT MOVE](../commands-legacy/object-move.md) - [OBJECT SET COORDINATES](../commands-legacy/object-set-coordinates.md)
+
+---
+
+## Ancho máximo
+
+El ancho máximo de la columna (en píxeles). El ancho de la columna no puede aumentarse más allá de este valor al redimensionar la columna o el formulario.
+
+> Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal "Agrandar"](properties_ResizingOptions.md#horizontal-sizing) fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ------------------------- |
+| maxWidth | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Columna de list box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[LISTBOX Get column width](../commands-legacy/listbox-get-column-width.md) - [LISTBOX SET COLUMN WIDTH](../commands-legacy/listbox-set-column-width.md)
+
+---
+
+## Ancho mínimo
+
+El ancho mínimo de la columna (en píxeles). El ancho de la columna no puede reducirse más allá de este valor al redimensionar la columna o el formulario.
+
+> Al redimensionar el formulario, si la propiedad de [dimensionamiento horizontal "Agrandar"](properties_ResizingOptions.md#horizontal-sizing) fue asignada al list box, la columna más a la derecha se agrandará más allá de su ancho máximo, si es necesario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ------------------------- |
+| minWidth | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Columna de list box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[LISTBOX Get column width](../commands-legacy/listbox-get-column-width.md) - [LISTBOX SET COLUMN WIDTH](../commands-legacy/listbox-set-column-width.md)
+
+---
+
+## Altura de las líneas
+
+Define la altura de las líneas del list box (excluyendo los encabezados y pies de página). Por defecto, la altura de la línea se define según la plataforma y el tamaño de la fuente.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | ------------------------------------------------------------------- |
+| rowHeight | string | valor css en la unidad "em" o "px" (por defecto) |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get row height](../commands-legacy/listbox-get-row-height.md) - [LISTBOX Get rows height](../commands-legacy/listbox-get-rows-height.md) - [LISTBOX SET ROW HEIGHT](../commands-legacy/listbox-set-row-height.md) - [LISTBOX SET ROWS HEIGHT](../commands-legacy/listbox-set-rows-height.md)
+
+#### Ver también
+
+[Array altura de línea](#row-height-array)
+
+---
+
+## Array altura de las líneas
+
+Esta propiedad se utiliza para indicar el nombre de un array de altura de línea que se quiere asociar al list box. Un array de altura de línea debe ser de tipo numérico (entero largo por defecto).
+
+Cuando se define un array de altura de línea, cada uno de sus elementos cuyo valor es diferente de 0 (cero) se tiene en cuenta para determinar la altura de la línea correspondiente en el list box, basándose en la unidad de altura de línea actual.
+
+Por ejemplo, puede escribir:
+
+```4d
+ARRAY LONGINT(RowHeights;20)
+RowHeights{5}:=3
+```
+
+Asumiendo que la unidad de las líneas es "líneas", entonces la quinta línea del list box tendrá una altura de tres líneas, mientras que todas las demás líneas mantendrán su altura por defecto.
+
+> - Para los list box de tipo array, esta propiedad sólo está disponible si la opción Altura de línea automática no está seleccionada.
+> - Para los array y list boxes colecciones/selección de entidades, esta propiedad sólo está disponible si la opción [Alto de línea automático](#automatic-row-height) no está seleccionada.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ------------------------------------------------ |
+| rowHeightSource | string | Nombre de una variable array 4D. |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[`LISTBOX Get array`](../commands-legacy/listbox-get-array.md) - [`LISTBOX GET ARRAYS`](../commands-legacy/listbox-get-arrays.md)
+
+#### Ver también
+
+[Altura de fila](#altura-fila)
+
+---
+
+## Relleno horizontal
+
+Establece un relleno horizontal para las celdas. El valor se establece en píxeles (por defecto = 0).
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------- | -------------- | --------------------------------------------------- |
+| horizontalPadding | number | Número de píxeles (debe ser >=0) |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pies de página](properties_Footers.md) - [Encabezados](properties_Headers.md)
+
+#### Comandos
+
+[`LISTBOX Get property`](../commands/listbox-get-property.md) - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md)
+
+#### Ver también
+
+[Relleno vertical](#vertical-padding)
+
+---
+
+## Relleno vertical
+
+Establece un relleno vertical para las celdas. El valor se establece en píxeles (por defecto = 0).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | --------------------------------------------------- |
+| verticalPadding | number | Número de píxeles (debe ser >=0) |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pies de página](properties_Footers.md) - [Encabezados](properties_Headers.md)
+
+#### Comandos
+
+[`LISTBOX Get property`](../commands/listbox-get-property.md) - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md)
+
+#### Ver también
+
+[Relleno horizontal](#horizontal-padding)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Crop.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Crop.md
new file mode 100644
index 00000000000000..04e1c72485b8f5
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Crop.md
@@ -0,0 +1,42 @@
+---
+id: propertiesCrop
+title: Corte
+---
+
+## Columnas
+
+Define el número de columnas de una tabla de miniaturas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :---------- | :------------: | ------------------------- |
+| columnCount | integer | mínimo: 1 |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Menú desplegable imagen](picturePopupMenu_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Rows
+
+Define el número de líneas de una tabla de miniaturas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :------- | :------------: | ------------------------- |
+| rowCount | integer | mínimo: 1 |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Menú desplegable imagen](picturePopupMenu_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_DataSource.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_DataSource.md
new file mode 100644
index 00000000000000..d826dc525158aa
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_DataSource.md
@@ -0,0 +1,354 @@
+---
+id: propertiesDataSource
+title: Fuente de datos
+---
+
+## Inserción automática
+
+Cuando se selecciona esta opción, si un usuario introduce un valor que no se encuentra en la lista asociada al objeto, este valor se añade automáticamente a la lista almacenada en memoria.
+
+Cuando la opción **inserción automática** no está definida (por defecto), el valor introducido se almacena en el objeto formulario pero no en la lista en memoria.
+
+Esta propiedad es soportada por:
+
+- objetos formulario [Combo box](comboBox_overview.md) y [columna list box](listbox_overview.md#list-box-columns) asociadoa a una lista de selección.
+- objetos de formulario [Combo box](comboBox_overview.md) cuya lista asociada se llena mediante su array o fuente de datos de objetos.
+
+Por ejemplo, dada una lista de selección que contiene "Francia, Alemania, Italia" que está asociada a un combo box "Países": si la propiedad **inserción automática** está activada y un usuario introduce "España", entonces el valor "España" se añade automáticamente a la lista en memoria:
+
+
+
+> Si la lista de selección se creó a partir de una lista definida en el modo Diseño, la lista original no se modifica.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------ | -------------- | ---------------- |
+| automaticInsertion | boolean | true, false |
+
+#### Objetos soportados
+
+[Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+---
+
+## Lista de selección
+
+Asocia una lista de selección a un objeto. Puede ser un nombre de lista de elección (una referencia de lista) o una colección de valores por defecto.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | ---------------- | -------------------------------------------------------------------------------- |
+| choiceList | list, collection | Una lista de valores posibles |
+| lista | list, collection | Una lista de valores posibles (listas jerárquicas únicamente) |
+
+#### Objetos soportados
+
+[Lista desplegable](dropdownList_Overview.md) -
+[Combo box](comboBox_overview.md) - [Lista Jerárquica](list_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[OBJECT Get list name](../commands-legacy/object-get-list-name.md) - [OBJECT Get list reference](../commands-legacy/object-get-list-reference.md) - [OBJECT SET LIST BY NAME](../commands-legacy/object-set-list-by-name.md) - [OBJECT SET LIST BY REFERENCE](../commands-legacy/object-set-list-by-reference.md)
+
+---
+
+## Lista de selección (lista estática)
+
+Lista de valores estáticos a utilizar como etiquetas para el objeto de control de pestañas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | ---------------- | ------------------------------------------------------- |
+| labels | list, collection | Una lista de valores para llenar el control de pestañas |
+
+#### Objetos soportados
+
+[Control de pestañas](tabControl.md)
+
+---
+
+## Elemento actual {#current-item}
+
+`List box colección o entity selection`
+
+Especifica una variable o expresión a la que se asignará el elemento/entidad de la colección seleccionado por el usuario. Debe utilizar una variable objeto o una expresión asignable que acepte objetos. Si el usuario no selecciona nada o si ha utilizado una colección de valores escalares, se asigna el valor Null.
+
+> Esta propiedad es de "sólo lectura", se actualiza automáticamente según las acciones del usuario en el list box. No se puede editar su valor para modificar el estado de selección del list box.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------- | -------------- | -------------------- |
+| currentItemSource | string | Expresión del objeto |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Posición actual del elemento {#current-item-position}
+
+`List box colección o entity selection`
+
+Indica una variable o expresión a la que se le asignará un entero largo que indica la posición del elemento/entidad de colección seleccionado por el usuario.
+
+- si no se selecciona ningún elemento/entidad, la variable o expresión recibe cero,
+- si se selecciona un solo elemento/entidad, la variable o expresión recibe su ubicación,
+- si se seleccionan varios elementos/entidades, la variable o expresión recibe la posición del elemento/entidad que se seleccionó de última.
+
+> Esta propiedad es de "sólo lectura", se actualiza automáticamente según las acciones del usuario en el list box. No se puede editar su valor para modificar el estado de selección del list box.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------------- | -------------- | ------------------ |
+| currentItemPositionSource | string | Expresión numérica |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Tipo de datos (tipo de expresión)
+
+Define el tipo de datos para la expresión mostrada. Esta propiedad se utiliza con:
+
+- [Columnas del List box](listbox_overview.md#list-box-columns) de los tipos de selección y colección.
+- [Listas desplegables](dropdownList_Overview.md) asociadas a objetos o arrays.
+
+Ver también la sección [**Tipo de Expresión**](properties_Object.md#expression-type).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| dataSourceTypeHint | string |
|
+
+#### Objetos soportados
+
+[Listas desplegables](dropdownList_Overview.md) asociadas a objetos o arrays - [Columna List Box](listbox_overview.md#list-box-columns)
+
+---
+
+## Tipo de datos (lista)
+
+Define el tipo de datos a guardar en el campo o variable asociado a la [lista desplegable](dropdownList_Overview.md). Esta propiedad se utiliza con:
+
+- Listas desplegables [asociadas a una lista de opciones](dropdownList_Overview.md#using-a-choice-list).
+- Listas desplegables [asociadas a una lista de selección jerárquica](dropdownList_Overview.md#using-a-hierarchical-choice-list).
+
+Hay tres opciones disponibles:
+
+- **Referencia de lista**: declara que la lista desplegable es jerárquica. Significa que la lista desplegable puede mostrar hasta dos niveles jerárquicos y su contenido puede gestionarse mediante los comandos del lenguaje 4D del tema **Listas jerárquicas**.
+- **Valor del elemento seleccionado** (por defecto): la lista desplegable no es jerárquica y el valor del elemento elegido en la lista por el usuario se guarda directamente. Por ejemplo, si el usuario elige el valor "Azul", este valor se guarda en el campo.
+- **Referencia del elemento seleccionado**: la lista desplegable no es jerárquica y la referencia del elemento de la lista de selección se guarda en el objeto. Esta referencia es el valor numérico asociado a cada elemento, ya sea a través del parámetro *itemRef* de los comandos [`APPEND TO LIST`](../commands-legacy/append-to-list.md) o [`SET LIST ITEM`](../commands-legacy/set-list-item.md), o en el editor de listas. Esta opción permite optimizar el uso de la memoria: almacenar valores numéricos en los campos ocupa menos espacio que almacenar cadenas. También facilita la traducción de aplicaciones: basta con crear varias listas en distintos idiomas pero con las mismas referencias de elementos y, a continuación, cargar la lista en función del idioma de la aplicación.
+
+La utilización de la opción **Referencia del elemento seleccionado** requiere el cumplimiento de los siguientes principios:
+
+- Para poder almacenar la referencia, el campo o fuente de datos variable debe ser de tipo Número (independientemente del tipo de valor que aparezca en la lista). La propiedad [expresión ](properties_Object.md#expression-type) se define automáticamente.
+- Las referencias válidas y únicas deben estar asociadas a los elementos de la lista.
+- La lista desplegable debe estar asociada a un campo o a una variable.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | -------------------- |
+| saveAs | string | "value", "reference" |
+
+> Definir sólo `"dataSourceTypeHint" : "integer"` con un `"type": "dropdown"` objeto de formulario declarará una lista desplegable jerárquica.
+
+#### Objetos soportados
+
+[Listas desplegables](dropdownList_Overview.md) asociadas a listas
+
+---
+
+## Valores por defecto (lista de)
+
+Lista de valores que se utilizarán como valores por defecto para la columna del list box (sólo de tipo array). Lista de valores que se utilizarán como valores por defecto para la columna del list box (sólo de tipo array). Utilizando el lenguaje, se puede gestionar el objeto haciendo referencia a este array.
+
+> No confunda esta propiedad con la propiedad "[valor por defecto](properties_RangeOfValues.md#default-value)" que permite definir un valor de campo en los nuevos registros.
+
+Debe introducir una lista de valores. En el editor de formularios, un diálogo específico permite introducir valores separados por retornos de carro:
+
+
+
+> También puede definir una [lista de selección](properties_DataSource.md#choice-list) con la columna list box. Sin embargo, se utilizará una lista de selección como lista de valores seleccionables para cada línea de columna, mientras que la lista por defecto rellena todas las líneas de columna.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------------------------------------------------------------------------------------------------ |
+| values | collection | Una colección de valores por defecto (cadenas), por ejemplo: "a", "b", "c", "d" |
+
+#### Objetos soportados
+
+[Columna List Box (sólo tipo array)](listbox_overview.md#list-box-columns)
+
+---
+
+## Expression
+
+This description is specific to [selection](listbox_overview.md#selection-list-boxes) and [collection](listbox_overview.md#collection-or-entity-selection-list-boxes) type list box columns. Ver también la sección **[Variable o Expresión](properties_Object.md#variable-or-expression)**.
+
+Una expresión 4D que se asociará a una columna. Puede introducir:
+
+- Una **variable simple** (en este caso, debe ser declarada explícitamente para la compilación). Se puede utilizar cualquier tipo de variable excepto BLOBs y arrays. El valor de la variable se calculará generalmente en el evento `On Display Detail`.
+
+- Un **campo** que utiliza la sintaxis estándar [Tabla]Campo (solo [list box tipo selección](listbox_overview.md#selection-list-boxes)), por ejemplo: `[Employees]LastName`. Se pueden utilizar los siguientes tipos de campos:
+ - String
+ - Numeric
+ - Fecha
+ - Time
+ - Picture
+ - Boolean\
+ Puede utilizar campos de la tabla maestra o de otras tablas.
+
+- Una **expresión 4D** (expresión simple, fórmula o método 4D). La expresión debe devolver un valor. La expresión debe devolver un valor. El resultado de la expresión se mostrará automáticamente cuando cambie al modo Aplicación. La expresión se evaluará para cada registro de la selección (actual o temporal) de la tabla maestra (para list boxes de tipo selección), cada elemento de la colección (para list boxes de tipo colección) o cada entidad de la selección (para list boxes selección de entidades). Si está vacía, la columna no mostrará ningún resultado.
+ Se soportan los siguientes tipos de expresiones:
+ - String
+ - Numeric
+ - Fecha
+ - Picture
+ - Boolean
+
+Para los list boxes colección/entity selection, Null o tipos no soportados se muestran como cadenas vacías.\
+Cuando utilice colecciones o selecciones de entidades, normalmente declarará la propiedad del elemento o el atributo de entidad asociado a una columna dentro de una expresión que contenga [This](https://doc.4d.com/4Dv17R6/4D/17-R6/This.301-4310806.en.html).\
+Cuando utilice colecciones o selecciones de entidades, normalmente declarará la propiedad del elemento o el atributo de entidad asociado a una columna dentro de una expresión que contenga [This](https://doc.4d.com/4Dv17R6/4D/17-R6/This.301-4310806.en.html).
+Cuando utilice colecciones o selecciones de entidades, normalmente declarará la propiedad del elemento o el atributo de entidad asociado a una columna dentro de una expresión que contenga [This](../commands/this.md). `This` es un comando 4D dedicado que devuelve una referencia al elemento actualmente procesado. Por ejemplo, puede utilizar `This.\` donde `\` es la ruta de una propiedad en la colección o una ruta de atributo de entidad para acceder al valor actual de cada elemento/entidad.
+Si utiliza una colección de valores escalares, 4D creará un objeto para cada elemento de la colección con una única propiedad (llamada "valor"), llenada con el valor del elemento. En este caso, utilizará `This.value` como expresión.
+
+Si se utiliza una expresión no asignable (por ejemplo, `[Person]FirstName+" "+[Person]LastName`), la columna nunca se podrá introducir aunque la propiedad [Editable](properties_Entry.md#enterable) esté activada.
+
+Si se utiliza un campo, una variable o una expresión asignable (*por ejemplo Person.lastName*), la columna puede ser editable o no dependiendo de la propiedad [Editable](properties_Entry.md#enterable).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ----------------------------------------------------------------------------------------------------- |
+| dataSource | string | Una variable 4D, un nombre de campo o una expresión del lenguaje compleja arbitraria. |
+
+#### Objetos soportados
+
+[Columna de list box](listbox_overview.md#list-box-columns)
+
+---
+
+## Tabla principal
+
+`Current selection list boxes`
+
+Especifica la tabla cuya selección actual se utilizará. Esta tabla y su selección actual constituirán la referencia de los campos asociados a las columnas del list box (referencias de campo o expresiones que contienen campos). Aunque algunas columnas contengan campos de otras tablas, el número de líneas mostradas será definido por la tabla maestra.
+
+Se pueden utilizar todas las tablas de la base de datos, independientemente de si el formulario está relacionado con una tabla (formulario tabla) o no (formulario proyecto).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------- |
+| tabla | number | Número de tabla |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX GET TABLE SOURCE](../commands-legacy/listbox-get-table-source.md) - [LISTBOX SET TABLE SOURCE](../commands-legacy/listbox-set-table-source.md)
+
+---
+
+## Guardar como
+
+Esta propiedad está disponible en las siguientes condiciones:
+
+- una [lista de selección](#choice-list) está asociada al objeto
+- para [entradas](input_overview.md) y [columnas list box](listbox_overview.md#columnas-de-list-box), también se define una [lista requerida](properties_RangeOfValues.md#lista-requerida) para el objeto (ambas opciones deben usar normalmente la misma lista), de modo que solo se puedan ingresar valores de la lista por parte del usuario.
+
+Esta propiedad especifica, en el contexto de un campo o variable asociado a una lista de valores, el tipo de contenido a guardar:
+
+- **Guardar como valor** (opción por defecto): el valor del elemento elegido en la lista por el usuario se guarda directamente. Por ejemplo, si el usuario elige el valor "Azul", este valor se guarda en el campo.
+- **Guardar como referencia**: la referencia del elemento de la lista de opciones se guarda en el objeto. Esta referencia es el valor numérico asociado a cada elemento, ya sea a través del parámetro *itemRef* de los comandos [`APPEND TO LIST`](../commands-legacy/append-to-list.md) o [`SET LIST ITEM`](../commands-legacy/set-list-item.md), o en el editor de listas.
+
+Esta opción permite optimizar el uso de la memoria: almacenar valores numéricos en los campos ocupa menos espacio que almacenar cadenas. También facilita la traducción de aplicaciones: basta con crear varias listas en distintos idiomas pero con las mismas referencias de elementos y, a continuación, cargar la lista en función del idioma de la aplicación.
+
+El uso de esta propiedad requiere el cumplimiento de los siguientes principios:
+
+- Para poder almacenar la referencia, el campo o fuente de datos variable debe ser de tipo Número (independientemente del tipo de valor que aparezca en la lista). La propiedad [expresión ](properties_Object.md#expression-type) se define automáticamente.
+- Las referencias válidas y únicas deben estar asociadas a los elementos de la lista.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | -------------------- |
+| saveAs | string | "value", "reference" |
+
+#### Objetos soportados
+
+[Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+---
+
+## Elementos seleccionados {#selected-items}
+
+`List box colección o entity selection`
+
+Especifica una variable o expresión a la que se asignarán los elementos o entidades seleccionados por el usuario.
+
+- para un list box colección, debe utilizar una variable colección o una expresión asignable que acepte colecciones,
+- para un list box selección de entidades, se crea un objeto de selección de entidades. Debe utilizar una variable objeto o una expresión asignable que acepte objetos.
+
+> Esta propiedad es de "sólo lectura", se actualiza automáticamente según las acciones del usuario en el list box. No se puede editar su valor para modificar el estado de selección del list box.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------- | -------------- | ----------------------------------------- |
+| selectedItemsSource | string | Colección asignable o expresión de objeto |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Selección temporal
+
+`List boxes de tipo selección nombrada`
+
+Especifica la selección temporal a utilizar. Debe introducir el nombre de una selección temporal válida. Puede ser una selección temporal proceso o interproceso. El contenido del list box se basará en esta selección. La selección elegida debe existir y ser válida en el momento en que se muestre el list box; de lo contrario, el list box se mostrará en blanco.
+
+> Las selecciones temporales son listas ordenadas de registros. Se utilizan para mantener en memoria el orden y el registro actual de una selección. Para más información, consulte la sección **Selecciones temporales** del manual *Lenguaje 4D*.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | ---------------------- |
+| namedSelection | string | Nombre de la selección |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX GET TABLE SOURCE](../commands-legacy/listbox-get-table-source.md) - [LISTBOX SET TABLE SOURCE](../commands-legacy/listbox-set-table-source.md)
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Display.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Display.md
new file mode 100644
index 00000000000000..70acd1ce6ab087
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Display.md
@@ -0,0 +1,665 @@
+---
+id: propertiesDisplay
+title: Visualización
+---
+
+---
+
+## Formato Alfa
+
+Los formatos alfabéticos controlan la forma en que aparecen los campos alfanuméricos y las variables cuando se visualizan o imprimen. Aquí hay una lista de formatos suministrados para los campos alfanuméricos:
+
+
+
+Puede elegir un formato de esta lista o utilizar cualquier formato personalizado. La lista por defecto contiene formatos para algunos de los campos alfa más comunes que requieren formatos: Números de teléfono de EE. UU. (locales y de larga distancia), números de la Seguridad Social y códigos postales. También puede introducir un nombre de formato personalizado definido en el editor Filtros y formatos de la caja de herramientas. En este caso, el formato no se puede modificar en las propiedades del objeto.
+Los formatos o filtros personalizados que haya creado estarán disponibles automáticamente, precedidos de una barra vertical (|).
+
+El signo número (#) es el marcador de posición para un formato de visualización alfanumérico. Puede incluir los guiones, rayas, espacios y cualquier otro signo de puntuación que desee mostrar. Utilice los signos de puntuación que desee y el signo número para cada caracter que desee mostrar.
+
+Por ejemplo, considere un número de parte con un formato como "RB-1762-1".
+
+El formato alfa sería:
+
+\##-####-#
+
+Cuando el usuario introduce "RB17621," el campo muestra:
+
+RB-1762-1
+
+El campo contiene realmente "RB17621".
+
+Si el usuario introduce más caracteres de los que permite el formato, 4D muestra los últimos caracteres. Por ejemplo, si el formato es:
+
+(#######)
+
+y el usuario introduce "proporción", el campo muestra:
+
+(portion)
+
+El campo contiene realmente "proportion". 4D acepta y almacena la entrada completa sin importar el formato de visualización. No se pierde ninguna información.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------------------------------------------------------------------------------------------------------- |
+| textFormat | string | "### ####", "(###) ### ####", "### ### ####", "### ## ####", "00000", formatos personalizados |
+
+#### Objetos soportados
+
+[Lista desplegable](dropdownList_Overview.md) - [Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Formato Fecha
+
+Los formatos de fecha controlan la forma en que aparecen las fechas cuando se muestran o imprimen. Para la entrada de datos, las fechas se introducen en el formato MM/DD/AAAA, independientemente del formato de visualización que haya elegido.
+
+Se pueden definir formatos de visualización para las fechas:
+
+- utilizando un formato integrado en 4D,
+- utilizando un modelo personalizado.
+
+### Formatos integrados
+
+La siguiente tabla muestra las opciones disponibles:
+
+| Nombre del formato | Cadena JSON | Ejemplo (sistema USA) |
+| ------------------------------------------------ | -------------------------------------------- | ------------------------------------------------------------- |
+| System date short | systemShort (por defecto) | 03/25/20 |
+| System date abbreviated *(1)* | systemMedium | Wed, Mar 25, 2020 |
+| System date long | systemLong | Wednesday, March 25, 2020 |
+| RFC 822 | rfc822 | Tue, 25 Mar 2020 22:00:00 GMT |
+| Short Century | shortCentury | 03/25/20 pero 04/25/2032 *(2)* |
+| Internal date long | largo | March 25, 2020 |
+| Fecha interna abreviada *(1)* | abbreviated | Mar 25, 2020 |
+| Internal date short | short | 03/25/2020 |
+| ISO Date Time *(3)* | iso8601 | 2020-03-25T00:00:00 |
+
+*(1)* Para evitar ambigüedades y de acuerdo con la práctica actual, los formatos de fecha abreviados muestran "jun" para junio y "jul" para julio. Esta particularidad sólo se aplica a las versiones francesas de 4D.
+
+*(2)* El año se muestra con dos dígitos cuando pertenece al intervalo (1930;2029), de lo contrario se mostrará con cuatro dígitos. Esto es por defecto, pero puede modificarse utilizando el comando [SET DEFAULT CENTURY](../commands-legacy/set-default-century.md).
+
+*(3)* El formato `ISO Date Time` corresponde a la norma XML de representación de fecha y hora (ISO8601). Está pensado principalmente para ser utilizado al importar/exportar datos en formato XML y en Servicios Web.
+
+> Independientemente del formato de visualización, si el año se introduce con dos dígitos, 4D asume que el siglo es el 21 si el año pertenece al intervalo (00;29) y el 20 si pertenece al intervalo (30;99). Esta es la configuración por defecto, pero puede modificarse utilizando el comando [SET DEFAULT CENTURY](../commands-legacy/set-default-century.md).
+
+### Formatos personalizados
+
+Se pueden crear formatos de fecha personalizados utilizando varios patrones descritos en la página [**Formatos de fecha y hora**](../Project/date-time-formats.md). Por ejemplo:
+
+| Modelo | Ejemplo (sistema USA) |
+| -------------------- | ---------------------------------------- |
+| "eeee, dd" | Wednesday, 29 |
+| "'Día' #D 'del año'" | Día 333 del año |
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| dateFormat | string |
Formatos personalizados: todo formato creado utilizando un [patrón soportado](../Project/date-time-formats.md) + " blankIfNull"
|
+
+:::note blankIfNull
+
+- By default, a [null date](../Concepts/dt_date.md#date-literals) is displayed with zeros, e.g. 00/00/00. Con la opción "blankIfNull", una fecha null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado.
+- Las [columnas list box](listbox_overview.md#list-box-columns) y los [pies List box](listbox_overview.md#list-box-footers) de tipo fecha utilizan siempre el comportamiento "blank if null" (no se puede desactivar).
+
+:::
+
+#### Objetos soportados
+
+[Combo Box](comboBox_overview.md) - [Drop-down List](dropdownList_Overview.md) - [Input](input_overview.md) - [List Box Column](listbox_overview.md#list-box-columns) - [List Box Footer](listbox_overview.md#list-box-footers)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Formato de número
+
+> Los campos numéricos incluyen los tipos Integer, Long integer, Integer 64 bits, Real y Float.
+
+Los formatos numéricos controlan la forma en que aparecen los números cuando se muestran o imprimen. Para la entrada de datos, sólo se introducen los números (incluido el punto decimal o el signo menos si es necesario), independientemente del formato de visualización que se haya elegido.
+
+4D ofrece varios formatos de números por defecto.
+
+### Marcadores
+
+En cada uno de los formatos de visualización de números, el signo número (#), el cero (0), el signo de intercalación (^) y el asterisco (\*) se utilizan como marcadores de posición. Puede crear sus propios formatos numéricos utilizando un marcador de posición para cada dígito que desee mostrar.
+
+| Marcador | Efecto para cero inicial o posterior |
+| -------- | ----------------------------------------- |
+| # | No muestra nada |
+| 0 | Muestra 0 |
+| ^ | Muestra un espacio (1) |
+| \* | Muestra un asterisco |
+
+(1) El signo de intercalación (^) genera un caracter de espacio que ocupa el mismo ancho que un dígito en la mayoría de los tipos de fuente.
+
+Por ejemplo, si desea mostrar números de tres digitos, puede utilizar el formato ###. Si el usuario introduce más caracteres de los que permite el formato, 4D muestra los últimos caracteres.
+
+Si el usuario introduce un número negativo, el caracter situado más a la izquierda se muestra como un signo menos (a menos que se haya especificado un formato de visualización negativo). Si ##0 es el formato, menos 26 se muestra como -26 y menos 260 se muestra como <<< porque el signo menos ocupa un marcador de posición y sólo hay tres marcadores de posición.
+
+> Sea cual sea el formato de visualización, 4D acepta y almacena el número introducido en el campo. No se pierde ninguna información.
+
+Cada caracter de marcador de posición tiene un efecto diferente en la visualización de ceros a la izquierda o a la derecha. Un cero inicial es un cero que comienza un número antes del punto decimal; un cero final es un cero que termina un número después del punto decimal.
+
+Supongamos que usa el formato ##0 para mostrar tres dígitos. Si el usuario no introduce nada en el campo, el campo muestra 0. Si el usuario introduce 26, el campo muestra 26.
+
+### Caracteres separadores
+
+Los formatos numéricos de visualización (excepto las notaciones científicas) se basan automáticamente en los parámetros regionales del sistema. 4D sustituye los caracteres "." y "," por, respectivamente, el separador decimal y el separador de miles definidos en el sistema operativo. Así, el punto y la coma se consideran caracteres comodín, siguiendo el ejemplo de 0 o #.
+
+> En Windows, cuando se utiliza la tecla separadora decimal del teclado numérico, 4D hace una distinción según el tipo de campo donde se encuentre el cursor:
+>
+> - en un campo de tipo Real, al utilizar esta tecla se insertará el separador decimal definido en el sistema,
+> - en cualquier otro tipo de campo, esta llave inserta el carácter asociado a la clave, normalmente un punto (.) o coma (,).
+
+### Puntos decimales y otros caracteres de visualización
+
+Puede utilizar un punto decimal en un formato de visualización de números. Si desea que el decimal se muestre independientemente de si el usuario lo teclea o no, debe colocarlo entre ceros.
+
+Puede utilizar cualquier otro caracter en el formato. Cuando se utilizan solos, o se colocan antes o después de marcadores de posición, los caracteres siempre aparecen. Por ejemplo, si utiliza el siguiente formato:
+
+$##0
+
+siempre aparece un signo de dólar porque se coloca antes de los marcadores de posición.
+
+Si se colocan caracteres entre los marcadores de posición, sólo aparecerán si se muestran dígitos a ambos lados. Por ejemplo, si define el formato:
+
+\###.##0
+
+el punto aparece sólo si el usuario introduce al menos cuatro dígitos.
+
+Los espacios se tratan como caracteres en los formatos de visualización de números.
+
+### Formatos para positivo, negativo y cero
+
+Un formato de visualización de números puede tener hasta tres partes, lo que permite especificar formatos de visualización para valores positivos, negativos y cero. Especifique las tres partes separándolas con punto y coma, como se muestra a continuación:
+
+Positivo;Negativo;Cero
+
+No es necesario especificar las tres partes del formato. Si utiliza sólo una parte, 4D la utiliza para todos los números, colocando un signo menos delante de los números negativos.
+
+Si utiliza dos partes, 4D utiliza la primera parte para los números positivos y el cero y la segunda parte para los números negativos. Si utiliza tres partes, la primera es para los números positivos, la segunda para los negativos y la tercera para el cero.
+
+> La tercera parte (cero) no se interpreta y no acepta caracteres de sustitución. Si introduce `###;###;#`, el valor cero se mostrará "#". En otras palabras, lo que realmente introduzca es lo que se mostrará para el valor cero.
+
+A continuación se muestra un ejemplo de formato de visualización de números que muestra signos de dólar y comas, coloca los valores negativos entre paréntesis y no muestra ceros:
+
+¥###,##0.00;(¥###,##0.00);
+
+Observe que la presencia del segundo punto y coma indica a 4D que utilice nada para mostrar el cero. El siguiente formato es similar excepto que la ausencia del segundo punto y coma indica a 4D que utilice el formato de número positivo para el cero:
+
+¥###,##0.00;(¥###,##0.00)
+
+En este caso, la visualización del cero sería $0.00.
+
+### Notación científica
+
+Si desea mostrar números en notación científica, utilice el **ampersand** (&) seguido de un número para especificar el número de dígitos que desea mostrar. Por ejemplo, el formato:
+
+&3
+
+mostrará 759.62 como:
+
+7.60e+2
+
+El formato de notación científica es el único que redondea automáticamente el número mostrado. Observe en el ejemplo anterior que el número se redondea a 7,60e+2 en lugar de truncarse en 7,59e+2.
+
+### Formatos hexadecimales
+
+Puede visualizar un número en hexadecimal utilizando los siguientes formatos de visualización:
+
+- `&x`: este formato muestra números hexadecimales utilizando el formato “0xFFFF”.
+- `&$`: este formato muestra números hexadecimales utilizando el formato "$FFFF".
+
+### Notación XML
+
+El formato `&xml` hará que un número cumpla las normas estándar XML. En particular, el caracter separador decimal será un punto "." en todos los casos, independientemente de la configuración del sistema.
+
+### Mostrar un número como una hora
+
+Puede visualizar un número como una hora (con un formato de hora) utilizando `&/` seguido de un dígito. La hora se determina calculando el número de segundos desde medianoche que representa el valor. El dígito en el formato corresponde al orden en que aparece el formato de hora en el menú desplegable Formato.
+
+Por ejemplo, el formato:
+
+&/5
+
+corresponde al 5º formato horario del menú desplegable, concretamente a la hora AM/PM. Un campo numérico con este formato mostraría 25000 como:
+
+6:56 AM
+
+### Ejemplos
+
+La siguiente tabla muestra cómo afectan los distintos formatos a la visualización de los números. Las tres columnas, Positiva, Negativa y Cero, muestran cada una cómo se mostrarían 1.234,50, -1.234,50 y 0.
+
+| Formato introducido | Positivo | Negativo | Cero |
+| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | ------------------------------ |
+| ### | <<< | <<< | |
+| #### | 1234 | <<<< | |
+| ####### | 1234 | -1234 | |
+| #####.## | 1234.5 | -1234.5 | |
+| ####0.00 | 1234.50 | -1234.50 | 0.00 |
+| #####0 | 1234 | -1234 | 0 |
+| +#####0;–#####0;0 | +1234 | -1234 | 0 |
+| #####0DB;#####0CR;0 | 1234DB | 1234CR | 0 |
+| #####0;(#####0) | 1234 | (1234) | 0 |
+| ###,##0 | 1,234 | -1,234 | 0 |
+| ##,##0.00 | 1,234.50 | -1,234.50 | 0.00 |
+| \^\^\^\^\^\^\^ | 1234 | -1234 | |
+| \^\^\^\^\^\^0 | 1234 | -1234 | 0 |
+| \^\^\^,\^\^0 | 1,234 | -1,234 | 0 |
+| \^\^,\^\^0.00 | 1,234.50 | -1,234.50 | 0.00 |
+| \*\*\*\*\*\*\* | \*\*\*1234 | \*\*-1234 | \*\*\*\*\*\*\* |
+| \*\*\*\*\*\*0 | \*\*\*1234 | \*\*-1234 | \*\*\*\*\*\*0 |
+| \*\*\*,\*\*0 | \*\*1,234 | \*-1,234 | \*\*\*\*\*\*0 |
+| \*\*,\*\*0.00 | \*1,234.50 | -1,234.50 | \*\*\*\*\*0.00 |
+| $\*,\*\*0.00;–$\*,\*\*0.00 | $1,234.50 | -$1,234.50 | $\*\*\*\*0.00 |
+| $\^\^\^\^0 | $ 1234 | $–1234 | $ 0 |
+| $\^\^\^0;–$\^\^\^0 | $1234 | –$1234 | $ 0 |
+| $\^\^\^0 ;($\^\^\^0) | $1234 | ($1234) | $ 0 |
+| $\^,\^\^0.00 ;($\^,\^\^0.00) | $1,234.50 | ($1,234.50) | $ 0.00 |
+| &2 | 1.2e+3 | -1.2e+3 | 0.0e+0 |
+| &5 | 1.23450e+3 | -1.23450e+3 | 0.00000 |
+| &xml | 1234.5 | -1234.5 | 0 |
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ----------------------------------------------------------------------------------------- |
+| numberFormat | string | Números (incluyendo un punto decimal o un signo menos si es necesario) |
+
+#### Objetos soportados
+
+[Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Indicadores de progreso](progressIndicator.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md) - [String](./commands/string)
+
+---
+
+## Formato imagen
+
+Los formatos Imagen controlan la apariencia de las imágenes cuando se muestran o se imprimen. Para la entrada de datos, el usuario siempre introduce las imágenes pegándolas desde el Portapapeles o arrastrándolas y soltándolas, independientemente del formato de visualización.
+
+Las opciones de truncamiento y escalado no afectan a la imagen en sí. El contenido de un campo Imagen siempre se guarda. El formato de visualización de la imagen sólo afecta a la visualización en el formulario en cuestión.
+
+### A escala para ajustarse
+
+`Gramática JSON: "scaled"`
+
+El formato **A escala para ajustarse** hace que 4D redimensione la imagen para ajustarla a las dimensiones del área.
+
+
+
+### Truncado (centrado y no centrado)
+
+`Gramática JSON: "truncatedCenter" / "truncatedTopLeft"`
+
+El formato **Truncado (centrado)** hace que 4D centre la imagen en el área y recorte cualquier parte que no quepa dentro del área. 4D recorta por igual desde cada borde y desde la parte superior e inferior.
+
+El formato **Truncado (no centrado)** hace que 4D coloque la esquina superior izquierda de la imagen en la esquina superior izquierda del área y recorte cualquier parte que no quepa dentro del área. 4D corta desde la derecha y desde abajo.
+
+> Cuando el formato de la imagen es **Truncado (no centrado)**, es posible añadir barras de desplazamiento al área de entrada.
+
+
+
+### Escala de ajuste (proporcional) y Escala de ajuste centrada (proporcional)
+
+`Gramática JSON: "proportionalTopLeft" / "proportionalCenter"`
+
+Si utiliza **Escala de ajuste (proporcional)**, la imagen se reduce proporcionalmente en todos sus lados para ajustarse al área creada para la imagen. La opción **Escalado para ajustar centrado (proporcional)** hace lo mismo, pero centra la imagen en el área imagen.
+
+Si la imagen es más pequeña que el área definida en el formulario, no se modificará. Si la imagen es mayor que el área definida en el formulario, se reduce proporcionalmente. Como se reduce proporcionalmente, la imagen no aparecerá distorsionada.
+
+Si ha aplicado el formato **Escalado para ajustar centrado (proporcional)**, la imagen también se centra en el área:
+
+
+
+### Replicado
+
+`Gramática JSON: "tiled"`
+
+Cuando se amplía el área que contiene una imagen con el formato **Replicada**, la imagen no se deforma sino que se replica tantas veces como sea necesario para llenar el área por completo.
+
+
+
+Si el campo se reduce a un tamaño menor que el de la imagen original, la imagen queda truncada (no centrada).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
+| pictureFormat | string | "truncatedTopLeft", "scaled", "truncatedCenter", "tiled", "proportionalTopLeft", "proportionalCenter" |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Formato Hora
+
+Los formatos de hora controlan la forma en que aparecen las horas cuando se muestran o imprimen. For data entry, you enter times in the 24-hour HH: MM:SS format or the 12-hour HH: MM:SS AM/PM format, regardless of the display format you have chosen.
+
+Se pueden definir los formatos de visualización de las horas:
+
+- utilizando un formato integrado en 4D,
+- utilizando un modelo personalizado.
+
+### Formatos integrados
+
+La siguiente tabla muestra los formatos de visualización de los campos de hora y da ejemplos:
+
+| Nombre del formato | Cadena JSON | Comentarios | Ejemplo para 04:30:25 |
+| ---------------------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
+| HH:MM:SS | hh_mm_ss | | 04:30:25 |
+| HH:MM | hh_mm | | 04:30 |
+| Hour Min Sec | HH_MM_SS | | 4 horas 30 minutos 25 segundos |
+| Hour Min | HH_MM | | 4 horas 30 minutos |
+| HH:MM AM/PM | hh_mm_am | | 4:30 a.m. |
+| MM SS | mm_ss | Hora expresada como duración a partir de las 00:00:00 | 270:25 |
+| Min Sec | MM_SS | Hora expresada como duración a partir de las 00:00:00 | 270 Minutos 25 Segundos |
+| ISO Date Time | iso8601 | Corresponde al estándar XML para representar datos relacionados con la hora. Está pensado principalmente para ser utilizado cuando se importan/exportan datos en formato XML | 0000-00-00T04:30:25 |
+| System time short | - (por defecto) | Formato de hora estándar definido en el sistema | 04:30:25 |
+| System time long abbreviated | systemMedium | sólo macOS: formato de tiempo abreviado definido en el sistema. Windows: este formato es el mismo que el formato corto de la hora del sistema | 4•30•25 AM |
+| System time long | systemLong | macOS únicamente: formato de tiempo largo definido en el sistema. Windows: este formato es el mismo que el formato corto de la hora del sistema | 4:30:25 AM HNEC |
+
+### Formatos personalizados
+
+Se pueden crear formatos de hora personalizados utilizando varios patrones descritos en la página [**Formatos de fecha y hora**](../Project/date-time-formats.md). Por ejemplo:
+
+| Modelo | Ejemplo (sistema USA) |
+| --------------------------------------- | ---------------------------------------- |
+| "HH 'horas' mm 'minutos' ss 'segundos'" | 13 horas 25 minutos 12 segundos |
+| "hh:mm aa" | 01:25 PM |
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| timeFormat | string |
|
+
+:::note blankIfNull
+
+Por defecto, una hora null se muestra con ceros, por ejemplo "00:00:00". Con la opción "blankIfNull", una hora null se muestra como un área vacía. La cadena "blankIfNull" (distingue mayúsculas de minúsculas) debe combinarse con el valor de formato seleccionado. Ej: "MM_SS blankIfNull" o "hh:mm aa blankIfNull"
+
+:::
+
+#### Objetos soportados
+
+[Combo Box](comboBox_overview.md) - [Drop-down List](dropdownList_Overview.md) - [Input](input_overview.md) - [List Box Column](listbox_overview.md#list-box-columns) - [List Box Footer](listbox_overview.md#list-box-footers)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Texto cuando False/Texto cuando True
+
+Cuando una [expresión booleana](properties_Object.md#expression-type) se muestra como:
+
+- un texto en un [objeto de entrada](input_overview.md)
+- un "popup" [](properties_Display.md#display-type) en una [columna del list box](listbox_overview.md#list-box-columns),
+
+... puede seleccionar el texto que se mostrará para cada valor:
+
+- **Text cuando True** - el texto que se mostrará cuando el valor sea "true"
+- **Text cuando False** - el texto que se mostrará cuando el valor sea "false"
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------- |
+| booleanFormat | string | "\<*textWhenTrue*\>;\<*textWhenFalse*\>", por ejemplo "Assigned;Unassigned" |
+
+#### Objetos soportados
+
+[Columna List Box](listbox_overview.md#list-box-columns) - [Entrada](input_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Tipo de visualización
+
+Utilizado para asociar un formato de visualización con los datos de la columna. Los formatos suministrados dependen del tipo de variable (list box de tipo array) o del tipo dato/campo (list boxes de tipo selección y colección).
+
+Las columnas booleanas y numéricas (números o enteros) pueden mostrarse como casillas de verificación. En este caso, se puede definir la propiedad [Título](#title).
+
+Las columnas booleanas también pueden mostrarse como menús emergentes. En este caso, deben definirse las propiedades [Text cuando False y Text cuando True](#text-when-falsetext-when-true).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
+| controlType | string |
**columnas numéricas**: "automatic" (por defecto) o "checkbox"
**columnas booleanas**: "checkbox" (por defecto) o "popup"
|
+
+#### Objetos soportados
+
+[Columna de list box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## No renderizado
+
+Cuando esta propiedad está activada, el objeto no se dibuja en el formulario, sin embargo aún puede activarse.
+
+En particular, esta propiedad permite implementar botones "invisibles". Los botones no renderizados pueden colocarse sobre los objetos gráficos. Permanecen invisibles y no se resaltan al hacer clic sobre ellos, pero su acción se activa a al pulsarlos.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------- | -------------- | ---------------- |
+| display | boolean | true, false |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Lista desplegable](dropdownList_Overview.md)
+
+---
+
+## Tres estados
+
+Permite que un objeto casilla de selección acepte un tercer estado. La variable asociada a la casilla de selección devuelve el valor 2 cuando la casilla está en el tercer estado.
+
+#### Casillas de verificación de tres estados en columnas list box
+
+Las columnas de list box con un [tipo de datos](properties_Object.md#expression-type) numérico pueden mostrarse como casillas de verificación de tres estados. Si se elige, se muestran los siguientes valores:
+
+- 0 = casilla no seleccionada,
+- 1 = casilla seleccionada,
+- 2 (o cualquier valor >0) = caja semi-marcada (tercer estado). Para la entrada de datos, este estado devuelve el valor 2.
+- -1 = casilla de verificación invisible,
+- -2 = casilla desmarcada, no editable,
+- -3 = casilla marcada, no editable,
+- -4 = casilla semi-marcada, no editable
+
+También en este caso, la propiedad [Título](#title) está disponible para que se pueda introducir el título de la casilla de verificación.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------- |
+| threeState | boolean | true, false |
+
+#### Objetos soportados
+
+[Casilla de selección](checkbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[OBJECT Get three states checkbox](../commands-legacy/object-get-three-states-checkbox.md) - [OBJECT SET THREE STATES CHECKBOX](../commands-legacy/object-set-three-states-checkbox.md)
+
+---
+
+## Título
+
+Esta propiedad está disponible para una columna de list box si:
+
+- el [tipo de columna](properties_Object.md#expression-type) es **boolean** y su [tipo de visualización](properties_Display.md#display-type) es "Casilla de selección"
+- el [tipo de columna](properties_Object.md#expression-type) es **número** (numérico o entero) y su [tipo de visualización](properties_Display.md#display-type) es "Casilla de verificación de tres estados".
+
+En ese caso, el título de la casilla de verificación puede introducirse utilizando esta propiedad.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | -------------------------------------------------------- |
+| controlTitle | string | Toda etiqueta personalizada para la casilla de selección |
+
+#### Objetos soportados
+
+[Columna de list box](listbox_overview.md#list-box-columns)
+
+---
+
+## Truncar con puntos suspensivos
+
+Controla la visualización de los valores cuando las columnas del list box son demasiado estrechas para mostrar todo su contenido.
+
+Esta opción está disponible para columnas con cualquier tipo de contenido, excepto imágenes y objetos.
+
+- Cuando la propiedad está activada (por defecto), si el contenido de una celda del list box excede el ancho de la columna, se trunca y se muestra una elipsis:
+
+
+
+> La posición de la elipsis depende del sistema operativo. En el ejemplo anterior (Windows), se añade a la derecha del texto. En macOS, la elipsis se añade en medio del texto.
+
+- Cuando la propiedad está desactivada, si el contenido de una celda excede el ancho de la columna, simplemente se recorta sin añadir elipsis:
+
+
+
+La opción Truncar con elipsis está activada por defecto y puede especificarse con list boxes de tipo Array, Selección o Colección.
+
+> Cuando se aplica a columnas de tipo Texto, la opción Truncar con elipsis sólo está disponible si la opción [Ajustar texto](#wordwrap) no está seleccionada. Cuando se selecciona la propiedad Ajuste de palabras, el contenido adicional de las celdas se gestiona mediante las funciones de ajuste de palabras, por lo que la propiedad Truncar con elipsis no está disponible.
+
+La propiedad Truncar con elipsis puede aplicarse a columnas de tipo booleano; sin embargo, el resultado difiere en función del [formato de celda](#display-type):
+
+- En los formatos booleanos de tipo emergente, las etiquetas se truncan con una elipsis,
+- Para los formatos booleanos de tipo casilla de verificación, las etiquetas siempre se recortan.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ---------------------- |
+| truncateMode | string | "withEllipsis", "none" |
+
+#### Objetos soportados
+
+[Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
+
+#### Comandos
+
+[`LISTBOX Get property`](../commands/listbox-get-property.md) - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md)
+
+---
+
+## Visibilidad
+
+Esta propiedad permite ocultar el objeto en el entorno Aplicación.
+
+Puede manejar la propiedad Visibilidad para la mayoría de los objetos del formulario. Esta propiedad se utiliza principalmente para simplificar el desarrollo de interfaces dinámicas. En este contexto, a menudo es necesario ocultar objetos por programación durante el evento `On load` del formulario y luego mostrar determinados objetos. In this context, it is often necessary to hide objects programatically during the On load event of the form then to display certain objects afterwards. El desarrollador puede entonces programar su pantalla utilizando el comando [`OBJECT SET VISIBLE`](../commands-legacy/object-set-visible.md) cuando lo necesite.
+
+#### Visibilidad automática en los formularios lista
+
+En el contexto de los [formularios "lista"](FormEditor/properties_FormProperties.md#form-type), la propiedad Visibilidad soporta dos valores específicos:
+
+- **Si registro seleccionado** (nombre JSON: "selectedRows")
+- **Si el registro no está seleccionado** (nombre JSON: "unselectedRows")
+
+Esta propiedad sólo se utiliza cuando se dibujan objetos situados en el cuerpo de un formulario listado. Indica a 4D si debe o no dibujar el objeto dependiendo de si el registro que se está procesando está seleccionado/no seleccionado. Permite representar una selección de registros utilizando atributos visuales distintos de los colores de resaltado:
+
+
+
+4D no tiene en cuenta esta propiedad si el objeto se ocultó utilizando el comando [`OBJECT SET VISIBLE`](../commands-legacy/object-set-visible.md); en este caso, el objeto permanece invisible independientemente de si el registro está seleccionado o no.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| visibility | string | "visible", "hidden", "selectedRows" (formulario listado únicamente), "unselectedRows" (formulario listado únicamente) |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Spinner](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[OBJECT Get visible](../commands-legacy/object-get-visible.md) - [OBJECT SET VISIBLE](../commands-legacy/object-set-visible.md)
+
+---
+
+## Ajuste de texto
+
+> Para los objetos [entrada](input_overview.md), disponibles cuando la propiedad [Multilínea](properties_Entry.md#multiline) está definida como "yes".
+
+Gestiona la visualización del contenido cuando supera el ancho del objeto.
+
+#### Marcada para list box/Sí para entrada
+
+`Gramática JSON: "normal"`
+
+Cuando esta opción está seleccionada, el texto pasa automáticamente a la línea siguiente siempre que su ancho supere el de la columna/área, si la altura de la columna/área lo permite.
+
+- En las columnas/áreas de una sola línea, sólo se muestra la última palabra que puede mostrarse entera. 4D inserta retornos de línea; es posible desplazarse por el contenido del área presionando la tecla de flecha abajo.
+
+- En las columnas/áreas multilínea, 4D realiza retornos de línea automáticos.
+
+
+
+#### Sin marcar para el list box/No para entrada
+
+`Gramática JSON: "none"`
+
+Cuando se selecciona esta opción, 4D no realiza ningún retorno de línea automático y la última palabra que se puede mostrar puede quedar truncada. En las áreas de tipo de texto, se soportan los retornos de carro:
+
+
+
+En los list boxes, el texto demasiado largo se trunca y se muestra con una elipse (...). En el siguiente ejemplo, la opción Wordwrap está **marcada para la columna izquierda** y **desmarcada para la columna derecha**:
+
+
+
+Tenga en cuenta que, independientemente del valor de la opción Ajuste de texto, la altura de la línea no se modifica. Si el texto con saltos de línea no puede visualizarse por completo en la columna, se trunca (sin elipse). En el caso de los list boxes que muestran una sola línea, sólo se muestra la primera línea de texto:
+
+
+
+#### Automático para entrada (opción por defecto)
+
+`Gramática JSON: "automatic"`
+
+- En las áreas de una sola línea, las palabras situadas al final de las líneas se truncan y no hay retornos de línea.
+- En áreas multilíneas, 4D realiza retornos de línea automáticos.
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ---------------------------------------------------------------------- |
+| wordwrap | string | "automatic" (excluyendo list box), "normal", "none" |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers)
+
+#### Comandos
+
+[`LISTBOX Get property`](../commands/listbox-get-property.md) - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Entry.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Entry.md
new file mode 100644
index 00000000000000..e9c0f4a5d429e2
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Entry.md
@@ -0,0 +1,346 @@
+---
+id: propertiesEntry
+title: Entrada
+---
+
+## Corrección ortográfica automática
+
+4D incluye funcionalidades de corrección ortográfica integradas y personalizables. Se pueden verificar las [entradas](input_overview.md) de tipo texto, así como también los documentos [4D Write Pro](writeProArea_overview.md).
+
+La propiedad de corrección ortográfica automática activa la corrección ortográfica de cada objeto. Cuando se utiliza, se realiza automáticamente una corrección ortográfica durante la entrada de datos. También puede ejecutar el comando de lenguaje 4D `SPELL CHECKING` para cada objeto a verificar.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------- |
+| spellcheck | boolean | true, false |
+
+#### Objetos soportados
+
+[Área 4D Write Pro](writeProArea_overview.md) - [Área de entrada](input_overview.md)
+
+#### Comandos
+
+[`OBJECT Get auto spellcheck`](../commands-legacy/object-get-auto-spellcheck.md) - [`OBJECT SET AUTO SPELLCHECK`](../commands-legacy/object-set-auto-spellcheck.md) - [`WP Get view properties`](../WritePro/commands-legacy/wp-get-view-properties.md) - [`WP SET VIEW PROPERTIES`](../WritePro/commands-legacy/wp-set-view-properties.md)
+
+---
+
+## Menú contextual
+
+Permite al usuario acceder a un menú contextual estándar en el objeto cuando se ejecuta el formulario.
+
+Para una imagen de tipo [entrada](input_overview.md), además de los comandos de edición estándar (Cortar, Copiar, Pegar y Borrar), el menú contiene el comando **Importar...**, que puede utilizarse para importar una imagen almacenada en un archivo, así como el comando **Guardar como...**, que puede utilizarse para guardar la imagen en el disco. El menú también permite modificar el formato de visualización de la imagen: se ofrecen las opciones **Truncado no centrado**, **Escalado para ajustar** y **Escalado para ajustar centrado prop.**. La modificación del [formato de visualización](properties_Display.md#picture-format) utilizando este menú es temporal; no se guarda con el registro.
+
+Para un tipo de texto [multiestilo](properties_Text.md#multi-style) [input](input_overview.md), además de los comandos de edición estándar, el menú contextual ofrece los siguientes comandos:
+
+- **Fuentes...**: muestra el diálogo del sistema de fuentes
+- **Fuentes recientes**: muestra los nombres de las fuentes recientes seleccionadas durante la sesión. La lista puede almacenar hasta 10 fuentes (más allá, la última fuente utilizada sustituye a la más antigua). Por defecto, esta lista está vacía y la opción no se muestra. Puede gestionar esta lista utilizando los comandos `SET RECENT FONTS` y `FONT LIST`.
+- comandos para las modificaciones de estilo soportados: fuente, tamaño, estilo, color y color de fondo.
+ Cuando el usuario modifica un atributo de estilo a través de este menú emergente, 4D genera el evento de formulario `On After Edit`.
+
+Para un [Área Web](webArea_overview.md), el contenido del menú depende del motor de renderizado de la plataforma. Es posible controlar el acceso al menú contextual mediante el comando [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ------------------------------------------------------------ |
+| contextMenu | string | "automatic" (se utiliza si falta), "none" |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md) - [Área Web](webArea_overview.md) - [Áreas 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[`OBJECT Get context menu`](../commands-legacy/object-get-context-menu.md) - [`OBJECT SET CONTEXT MENU`](../commands-legacy/object-set-context-menu.md) - [`WA GET PREFERENCE`](../commands-legacy/wa-get-preference.md) - [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md)
+
+---
+
+## Editable
+
+El atributo Editable indica si los usuarios pueden introducir valores en el objeto.
+
+Los objetos son editables por defecto. Si desea hacer que un campo o un objeto no se pueda introducir en ese formulario, puede desactivar la propiedad Editable del objeto. Un objeto no editable sólo muestra datos. Los datos se controlan mediante métodos que utilizan el nombre del campo o de la variable. Puede seguir utilizando los eventos de formulario `On Clicked`, `On Double Clicked`, `On Drag Over`, `On Drop`, `On Getting Focus` y `On Losing Focus` con objetos no editables. Esto facilita la gestión de menús contextuales personalizados y permite diseñar interfaces en las que es posible arrastrar y soltar y seleccionar variables no introducibles.
+
+Cuando esta propiedad está desactivada, se desactiva todo menú emergente asociado a una columna list box a través de una lista.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ---------------- |
+| editable | boolean | true, false |
+
+#### Objetos soportados
+
+[Áreas 4D Write Pro](writeProArea_overview.md) - [Casilla de selección](checkbox_overview.md) - [Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Barra de progreso](progressIndicator.md) - [Regla](ruler.md) - [Contador](stepper.md)
+
+#### Comandos
+
+[`OBJECT Get enterable`](../commands-legacy/object-get-enterable.md) - [`OBJECT SET ENTERABLE`](../commands-legacy/object-set-enterable.md)
+
+#### Ver también
+
+[`FORM GET ENTRY ORDER`](../commands-legacy/form-get-entry-order.md) - [`FORM SET ENTRY ORDER`](../commands-legacy/form-set-entry-order.md)
+
+---
+
+## Filtro de entrada
+
+Un filtro de entrada controla exactamente lo que el usuario puede escribir durante la entrada de datos. Un filtro de entrada controla exactamente lo que el usuario puede escribir durante la entrada de datos. Por ejemplo, si un número de componente siempre tiene dos letras seguidas de tres dígitos, puede utilizar un filtro de entrada para restringir al usuario a respetar ese patrón. Incluso puede controlar las letras y números en particular.
+
+Un filtro de entrada sólo funciona durante la entrada de datos. No tiene efecto en la visualización de los datos después de que el usuario deseleccione el objeto. En general, se utilizan conjuntamente los filtros de entrada con los [formatos de visualización](properties_Display.md). El filtro restringe la entrada de datos y el formato asegura la correcta visualización del valor tras la entrada de datos.
+
+Durante la entrada de datos, un filtro de entrada evalúa cada caracter a medida que se escribe. Si el usuario intenta escribir un caracter no válido (un número en lugar de una letra, por ejemplo), 4D simplemente no lo acepta. El caracter null permanece sin cambios hasta que el usuario escribe un caracter válido.
+
+Los filtros de entrada también pueden utilizarse para mostrar los caracteres de formato necesarios para que el usuario no tenga que introducirlos. Por ejemplo, un número de teléfono estadounidense tiene un código de área de tres dígitos, seguido de un número de siete dígitos que se divide en dos grupos de tres y cuatro dígitos, respectivamente. Se puede utilizar un formato de visualización para encerrar el código de área entre paréntesis y para mostrar un guión después del tercer dígito del número de teléfono. Cuando se utiliza este formato, el usuario no necesita introducir los paréntesis ni los guiones.
+
+### Definir un filtro de entrada
+
+La mayoría de las veces, puede utilizar uno de los [filtros integrados](#default-entry-filters) de 4D para lo que necesite; sin embargo, también puede crear y utilizar filtros personalizados:
+
+- puede introducir directamente una cadena de definición de filtro
+- o puede introducir el nombre de un filtro de entrada creado en el editor de filtros de la caja de herramientas. Los nombres de los filtros personalizados que se crean comienzan con una barra vertical (|).
+
+### Filtros de entrada por defecto
+
+A continuación se presenta una tabla que explica cada una de las opciones de filtro de entrada en la lista desplegable Filtro de entrada:
+
+| Filtro de entrada | Descripción |
+| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| ~A | Permite la entrada de todas las letras, pero las conviete a mayúsculas. |
+| &9 | Permitir sólo números. |
+| &A | Permitir sólo letras mayúsculas. |
+| &a | Permitir sólo letras (mayúsculas y minúsculas). |
+| &@ | Permitir sólo caracteres alfanuméricos. No hay caracteres especiales. |
+| ~a## | Abreviatura del nombre del estado (por ej., CA). Permite la entrada de dos letras, pero las convierte en mayúsculas. |
+| !0&9##/##/## | Formato de entrada de fechas estándar. Mostrar ceros en los espacios de entrada. Permitir cualquier número. |
+| !0&9 Día: ## Mes: ## Año: ## | Time entry format. Mostrar ceros en los espacios de entrada. Permitir cualquier número. Limited to hours and minutes. |
+| !0&9##:## | Formato de entrada de hora. Limitado a horas y minutos. Mostrar ceros en los espacios de entrada. Permitir cuatro números, separados por dos puntos. |
+| !0&9## Horas ## Minutos ## Segundos | Formato de entrada de hora. Mostrar ceros en los espacios de entrada. Permitir dos números antes de cada palabra. |
+| !0&9Horas: ## Minutas: ## Segundos: ## | Formato de entrada de hora. Mostrar ceros en los espacios de entrada. Permitir dos números después de cada palabra. |
+| !0&9##-##-##-## | Formato de número de teléfono local. Mostrar ceros en los espacios de entrada. Permitir cualquier número. Tres entradas, guión, cuatro entradas. |
+| !_&9(###)!0###-#### | Número de teléfono de larga distancia. Mostrar guiones bajos en los tres primeros espacios de entrada, ceros en el resto. |
+| !0&9###-###-### | Número de teléfono de larga distancia. Mostrar ceros en los espacios de entrada. Permitir cualquier número. Tres entradas, guión, tres entradas, guión, cuatro entradas. |
+| !0&9###-##-### | Número de la Seguridad Social. Mostrar ceros en los espacios de entrada. Permitir cualquier número. |
+| ~"A-Z;0-9; ;,;.;-" | Letras mayúsculas y puntuación. Permita sólo letras mayúsculas, números, espacios, comas, puntos y guiones. |
+| &"a-z;0-9; ;,;.;-" | Letras mayúsculas y minúsculas y puntuación. Permite letras minúsculas, números, espacios, comas, puntos y guiones. |
+| &"0-9;.;-" | Números. Sólo se permiten números, puntos decimales y guiones (signo menos). |
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------- |
+| entryFilter | string |
Código de filtro de entrada
o
Nombre de filtro de entrada (los nombres de filtro empiezan por | )
|
+
+#### Objetos soportados
+
+[Check Box](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [ Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+---
+
+#### Comandos
+
+[`OBJECT Get filter`](../commands-legacy/object-get-filter.md) - [`OBJECT SET FILTER`](../commands-legacy/object-set-filter.md)
+
+## Focusable
+
+Cuando la propiedad **Enfocable** está activada para un objeto, el objeto puede tener el foco (y por lo tanto puede ser activado por el teclado por ejemplo). Cuando está seleccionado, aparece delimitado por una línea de puntos gris, excepto si también se ha seleccionado la opción [Ocultar rectángulo de enfoque](properties_Appearance.md#hide-focus-rectangle).
+
+> Un [objeto de entrada](input_overview.md) es siempre enfocable si tiene la propiedad [Editable](#enterable).
+
+-  Check box shows focus when selected
+
+-  Check box is selected but cannot show focus|
+
+Cuando se selecciona la propiedad **Enfocable** para un objeto no editable, el usuario puede seleccionar, copiar o incluso arrastrar y soltar el contenido del área.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | ---------------- |
+| focusable | boolean | true, false |
+
+#### Objetos soportados
+
+[Áreas 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Casilla de selección](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Lista jerárquica](list_overview.md) - [Área de entrada](input_overview.md) - [List Box](listbox_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Botón de opción](radio_overview.md) - [Subformulario](subform_overview.md)
+
+#### Comandos
+
+[`OBJECT Get enterable`](../commands-legacy/object-get-enterable.md) - [`OBJECT SET ENTERABLE`](../commands-legacy/object-set-enterable.md)
+
+---
+
+## Disposición del teclado
+
+Esta propiedad asocia una distribución de teclado específica a un [objeto de entrada](input_overview.md). Por ejemplo, en una aplicación internacional, si un formulario contiene un campo cuyo contenido debe introducirse en caracteres griegos, puede asociar a este campo la disposición de teclado "griego". De este modo, durante la entrada de datos, la configuración del teclado cambia automáticamente cuando este campo tiene el foco.
+
+Por defecto, el objeto utiliza la disposición actual del teclado.
+
+> También puede configurar y obtener el teclado dinámicamente utilizando los comandos `OBJECT SET KEYBOARD LAYOUT` y `OBJECT Get keyboard layout`.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ---------------------------------------------------------------------------------------------- |
+| keyboardDialect | text | Código del lenguaje, por ejemplo "ar-ma" o "cs". Ver RFC3066, ISO639 e ISO3166 |
+
+#### Objetos soportados
+
+[Áreas 4D Write Pro](writeProArea_overview.md) - [Área de entrada](input_overview.md)
+
+#### Comandos
+
+[`OBJECT Get keyboard layout`](../commands-legacy/object-get-keyboard-layout.md) - [`OBJECT SET KEYBOARD LAYOUT`](../commands-legacy/object-set-keyboard-layout.md)
+
+---
+
+## Multilínea
+
+Esta propiedad está disponible para [objetos de entrada](input_overview.md) que contienen expresiones de tipo Texto y campos de tipo Alfa y Texto. Puede tener tres valores diferentes: Sí, No, Automático (por defecto).
+
+#### Automático
+
+- En las entradas de una línea, las palabras situadas al final de las líneas se truncan y no hay retornos de línea.
+- En las entradas multilínea, 4D realiza retornos de línea automáticos:\
+ 
+
+#### No
+
+- En las entradas de una línea, las palabras situadas al final de las líneas se truncan y no hay retornos de línea.
+- Nunca hay retornos de línea: el texto siempre se muestra en una sola línea. Si el campo o variable Alfa o Texto contiene retornos de carro, el texto situado después del primer retorno de carro se elimina en cuanto se modifica el área:\
+ 
+
+#### Sí
+
+Cuando se selecciona este valor, la propiedad es gestionada por la opción [Retorno de línea](properties_Display.md#wordwrap).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ------------------------------------------------------------------------- |
+| multilínea | text | "yes", "no", "automatic" (por defecto si no se define) |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md)
+
+#### Comandos
+
+[`OBJECT Get multiline`](../commands-legacy/object-get-multiline.md) - [`OBJECT SET MULTILINE`](../commands-legacy/object-set-multiline.md)
+
+---
+
+## Marcador
+
+4D puede mostrar texto con marcador de posición en los campos de sus formularios.
+
+El texto del marcador de posición aparece como texto de marca de agua en un campo, suministrando un mensaje de ayuda, una indicación o un ejemplo de los datos que deben introducirse. Este texto desaparece tan pronto como el usuario ingrese un caracter en el área:
+
+
+
+El texto del marcador de posición vuelve a aparecer si se borra el contenido del campo.
+
+Se puede mostrar un marcador de posición para los siguientes tipos de datos:
+
+- cadena (text o alpha)
+- fecha y hora en que se activa la propiedad **Blank if null**.
+
+Puede utilizar una referencia XLIFF en la forma ":xliff:resname" como marcador de posición, por ejemplo:
+
+:xliff:PH_Lastname
+
+Sólo se pasa la referencia en el campo "Marcador de posición"; no es posible combinar una referencia con texto estático.
+
+> También puedes definir y obtener el texto del marcador de posición por programación utilizando los comandos [`OBJECT SET PLACEHOLDER`](../commands-legacy/object-set-placeholder.md) y [`OBJECT Get placeholder`](../commands-legacy/object-get-placeholder.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | -------------------------------------------------------------------------------------- |
+| placeholder | string | Texto a mostrar (en gris) cuando el objeto no contiene ningún valor |
+
+#### Objetos soportados
+
+[Combo Box](comboBox_overview.md) - [Área de entrada](input_overview.md)
+
+#### Ver también
+
+[Mensaje de ayuda](properties_Help.md)
+
+#### Comandos
+
+[`OBJECT Get placeholder`](../commands-legacy/object-get-placeholder.md) - [`OBJECT SET PLACEHOLDER`](../commands-legacy/object-set-placeholder.md)
+
+---
+
+## Selección siempre visible
+
+Esta propiedad mantiene la selección visible dentro del objeto después de haber perdido el foco. Esto facilita la implementación de interfaces que permiten modificar el estilo del texto (ver [Multi estilo](properties_Text.md#multi-style)).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------- |
+| showSelection | boolean | true, false |
+
+#### Objetos soportados
+
+[Áreas 4D Write Pro](writeProArea_overview.md) - [Área de entrada](input_overview.md)
+
+---
+
+## Atajo
+
+Esta propiedad permite definir teclas de significado especial (atajos de teclado) para los [botones](button_overview.md), los [botones radio](radio_overview.md) y las [casillas de selección](checkbox_overview.md). Permiten al usuario utilizar el control utilizando el teclado en lugar de tener que utilizar el ratón.
+
+Puede configurar esta opción haciendo clic en [...] en la propiedad Accesos directos de la Lista de propiedades.
+
+
+
+> También puede asignar un acceso directo a un comando de menú personalizado. Si hay un conflicto entre dos accesos directos, el objeto activo tiene prioridad. Para más información sobre cómo asociar accesos directos a los menús, consulte [Configuración de las propiedades de los menús](../Menus/properties.md).
+
+Para ver una lista de todos los métodos abreviados utilizados en el entorno Diseño de 4D, consulte la [página Atajos](../Preferences/shortcuts.md) en la caja de diálogo Preferencias.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| shortcutAccel | boolean | true, false (Windows: Ctrl/macOS: Command) |
+| shortcutAlt | boolean | true, false |
+| shortcutControl | boolean | true, false (macOS: Control) |
+| shortcutShift | boolean | true, false |
+| | | |
+| shortcutKey | string |
|
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de selección](checkbox_overview.md) - [Botón Imagen](pictureButton_overview.md) - [Botón radio](radio_overview.md)
+
+#### Comandos
+
+[`OBJECT GET SHORTCUT`](../commands-legacy/object-get-shortcut.md) - [`OBJECT SET SHORTCUT`](../commands-legacy/object-set-shortcut.md)
+
+---
+
+## Edición con un solo clic
+
+Permite el paso directo al modo de edición en list boxes.
+
+Cuando esta opción está activada, las celdas del list box cambian al modo de edición tras un solo clic del usuario, independientemente de si esta área del list box estaba seleccionada de antemano o no. Cuando esta opción está activada, las celdas del list box cambian al modo de edición tras un solo clic del usuario, independientemente de si esta área del list box estaba seleccionada de antemano o no.
+
+Cuando esta opción no está activa, los usuarios deben seleccionar primero la línea de celdas y luego, hacer clic en una celda para editar su contenido.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ---------------- |
+| singleClickEdit | boolean | true, false |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Footers.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Footers.md
new file mode 100644
index 00000000000000..46239c0d094b63
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Footers.md
@@ -0,0 +1,73 @@
+---
+id: propertiesFooters
+title: Pies
+---
+
+## Mostrar pies
+
+Esta propiedad se utiliza para mostrar u ocultar [los pies de columna listbox](listbox_overview.md#list-box-footers). Hay un pie de página por columna; cada pie de página se configura por separado.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ---------------- |
+| showFooters | boolean | true, false |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Altura
+
+Esta propiedad se utiliza para definir la altura de línea de un pie de list box en **píxeles** o **líneas de texto** (cuando se muestra). Ambos tipos de unidades pueden utilizarse en el mismo list box:
+
+- *Píxel* - el valor de la altura se aplica directamente a la línea en cuestión, independientemente del tamaño de la fuente contenida en las columnas. Si una fuente es demasiado grande, el texto se trunca. Además, las imágenes se truncan o cambian de tamaño según su formato.
+
+- *Línea* - la altura se calcula teniendo en cuenta el tamaño de la fuente de la línea en cuestión.
+ - Si se define más de un tamaño, 4D utiliza el mayor. Por ejemplo, si una línea contiene "Verdana 18", "Geneva 12" y "Arial 9", 4D utiliza "Verdana 18" para determinar la altura de la línea (por ejemplo, 25 píxeles). Esta altura se multiplica por el número de líneas definidas.
+ - Este cálculo no tiene en cuenta el tamaño de las imágenes ni los estilos aplicados a las fuentes.
+ - En macOS, la altura de línea puede ser incorrecta si el usuario introduce caracteres que no están disponibles en la fuente seleccionada. Cuando esto ocurre, se utiliza un tipo de letra sustituto, lo que puede provocar variaciones en el tamaño.
+
+> Esta propiedad también puede definirse dinámicamente mediante el comando [LISTBOX SET FOOTERS HEIGHT](../commands-legacy/listbox-set-footers-height.md).
+
+Conversión de unidades: cuando se pasa de una unidad a otra, 4D las convierte automáticamente y muestra el resultado en la Lista de propiedades. Por ejemplo, si la fuente utilizada es "Lucida grande 24", una altura de "1 línea" se convierte en "30 píxeles" y una altura de "60 píxeles" se convierte en "2 líneas".
+
+Tenga en cuenta que la conversión de ida y vuelta puede conducir a un resultado final diferente del valor inicial debido a los cálculos automáticos realizados por 4D. Esto se ilustra en las siguientes secuencias:
+
+*(fuente Arial 18)*: 52 píxeles -> 2 líneas -> 40 píxeles
+*(font Arial 12)*: 3 píxeles -> 0,4 línea redondeada a 1 línea -> 19 píxeles
+
+#### Ejemplo JSON
+
+```
+ "List Box": {
+ "type": "listbox",
+ "showFooters": true,
+ "footerHeight": "44px",
+ ...
+ }
+```
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ----------------------------------------------------- |
+| footerHeight | string | decimales positivos +px | em |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get footers height](../commands-legacy/listbox-get-footers-height.md) - [LISTBOX SET FOOTERS HEIGHT](../commands-legacy/listbox-set-footers-height.md)
+
+#### Ver también
+
+[Encabezados](properties_Headers.md) - [Pies List box](listbox_overview.md#list-box-footers)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Gridlines.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Gridlines.md
new file mode 100644
index 00000000000000..330ceeeeeb9264
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Gridlines.md
@@ -0,0 +1,42 @@
+---
+id: propertiesGridlines
+title: Rejillas
+---
+
+## Color líneas horizontales
+
+Define el color de las líneas horizontales de un list box (gris por defecto).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------------- | -------------- | ------------------------------------------ |
+| horizontalLineStroke | color | Todo valor CSS, "transparent", "automatic" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX GET GRID COLORS](../commands-legacy/listbox-get-grid-colors.md) - [LISTBOX SET GRID COLOR](../commands-legacy/listbox-set-grid-color.md)
+
+---
+
+## Color líneas verticales
+
+Define el color de las líneas verticales de un list box (gris por defecto).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------ | -------------- | ------------------------------------------ |
+| verticalLineStroke | color | Todo valor CSS, "transparent", "automatic" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX GET GRID COLORS](../commands-legacy/listbox-get-grid-colors.md) - [LISTBOX SET GRID COLOR](../commands-legacy/listbox-set-grid-color.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Headers.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Headers.md
new file mode 100644
index 00000000000000..56db5e4528fdfd
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Headers.md
@@ -0,0 +1,73 @@
+---
+id: propertiesHeaders
+title: Encabezados
+---
+
+## Mostrar encabezados
+
+Esta propiedad se utiliza para mostrar u ocultar [los encabezados de columna listbox](listbox_overview.md#list-box-headers). Hay un encabezado por columna; cada encabezado se configura por separado.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ---------------- |
+| showHeaders | boolean | true, false |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Altura
+
+Esta propiedad se utiliza para definir la altura de línea de un encabezado de list box en **píxeles** o **líneas de texto** (cuando se muestra). Ambos tipos de unidades pueden utilizarse en el mismo list box:
+
+- *Píxel* - el valor de la altura se aplica directamente a la línea en cuestión, independientemente del tamaño de la fuente contenida en las columnas. Si una fuente es demasiado grande, el texto se trunca. Además, las imágenes se truncan o cambian de tamaño según su formato.
+
+- *Línea* - la altura se calcula teniendo en cuenta el tamaño de la fuente de la línea en cuestión.
+ - Si se define más de un tamaño, 4D utiliza el mayor. Por ejemplo, si una línea contiene "Verdana 18", "Geneva 12" y "Arial 9", 4D utiliza "Verdana 18" para determinar la altura de la línea (por ejemplo, 25 píxeles). Esta altura se multiplica por el número de líneas definidas.
+ - Este cálculo no tiene en cuenta el tamaño de las imágenes ni los estilos aplicados a las fuentes.
+ - En macOS, la altura de línea puede ser incorrecta si el usuario introduce caracteres que no están disponibles en la fuente seleccionada. Cuando esto ocurre, se utiliza un tipo de letra sustituto, lo que puede provocar variaciones en el tamaño.
+
+> > This property can also be set dynamically using the [LISTBOX SET HEADERS HEIGHT](../commands-legacy/listbox-set-headers-height.md) command.
+
+Conversión de unidades: cuando se pasa de una unidad a otra, 4D las convierte automáticamente y muestra el resultado en la Lista de propiedades. Por ejemplo, si la fuente utilizada es "Lucida grande 24", una altura de "1 línea" se convierte en "30 píxeles" y una altura de "60 píxeles" se convierte en "2 líneas".
+
+Tenga en cuenta que la conversión de ida y vuelta puede conducir a un resultado final diferente del valor inicial debido a los cálculos automáticos realizados por 4D. Esto se ilustra en las siguientes secuencias:
+
+- (fuente Arial 18)\*: 52 píxeles -> 2 líneas -> 40 píxeles
+- (fuente Arial 12)\*: 3 píxeles -> 0,4 línea redondeada a 1 línea -> 19 píxeles
+
+#### Ejemplo JSON
+
+```
+ "List Box": {
+ "type": "listbox",
+ "showHeaders": true,
+ "headerHeight": "22px",
+ ...
+ }
+```
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ----------------------------------------------------- |
+| headerHeight | string | decimales positivos +px | em |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[`LISTBOX Get headers height`](../commands-legacy/listbox-get-headers-height.md) - [`LISTBOX SET HEADERS HEIGHT`](../commands-legacy/listbox-set-headers-height.md)
+
+#### Ver también
+
+[Pies](properties_Footers.md) - [Encabezados List box](listbox_overview.md#list-box-headers)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Help.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Help.md
new file mode 100644
index 00000000000000..a7bb5d1a42f229
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Help.md
@@ -0,0 +1,51 @@
+---
+id: propertiesHelp
+title: Ayuda
+---
+
+## Mensaje de ayuda
+
+Esta propiedad permite asociar los mensajes de ayuda a los objetos activos de sus formularios. Se pueden mostrar en ejecución:
+
+
+
+> - El retardo de la visualización y la duración máxima de los mensajes de ayuda pueden controlarse utilizando los selectores `Tips delay` y `Tips duration` del comando **[SET DATABASE PARAMETER](../commands-legacy/set-database-parameter.md)**.
+> - Los mensajes de ayuda se pueden deshabilitar o habilitar globalmente para la aplicación utilizando el selector del comando [**SET DATABASE PARAMETER**](../commands-legacy/set-database-parameter.md).
+
+Puede:
+
+- designar un mensajes de ayuda existente, previamente especificado en el editor de [mensajes de ayuda](https://doc.4d.com/4Dv20/4D/20.2/Help-tips.200-6750100.en.html) de 4D.
+- o introducir el mensaje de ayuda directamente como una cadena. Esto le permite aprovechar la arquitectura XLIFF. Aquí puede introducir una referencia XLIFF para mostrar un mensaje en el lenguaje de la aplicación (para más información sobre XLIFF, consulte el [Apéndice B: Arquitectura XLIFF](https://doc.4d.com/4Dv20/4D/20.2/Appendix-B-XLIFF-architecture.300-6750166.en.html). También puede utilizar referencias 4D ([ver Uso de referencias en texto estático](https://doc.4d.com/4Dv20/4D/20.2/Using-references-in-static-text.300-6750154.en.html)).
+
+> > In macOS, displaying help tips is not supported in pop-up type windows.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :-----: | :------------: | -------------------------------------------- |
+| tooltip | text | información adicional para ayudar al usuario |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Combo Box](comboBox_overview.md) - [Lista jerárquica](list_overview.md) - [Encabezado de lista de List Box](listbox_overview.md#list-box-headers) - [Pie de lista de List Box](listbox_overview.md#list-box-footers) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Botón de opción](radio_overview.md)
+
+#### Otras funcionalidades de ayuda
+
+También puede asociar los mensajes de ayuda a los objetos formulario de otras dos maneras:
+
+- a nivel de la estructura de la base de datos (sólo campos). En este caso, la ayuda del campo se muestra en todos los formularios en los que aparece. Para más información, consulte "Consejos de ayuda" en [Propiedades de los campos](https://doc.4d.com/4Dv20/4D/20.2/Field-properties.300-6750280.en.html#3367486).
+- utilizando el comando **[OBJECT SET HELP TIP](../commands-legacy/object-set-help-tip.md)**, para el proceso actual.
+
+Cuando se asocian consejos diferentes a un mismo objeto en varias ubicaciones, se aplica el siguiente orden de prioridad:
+
+1. nivel de estructura (prioridad más baja)
+2. editor de formulario
+3. Comando **[OBJECT SET HELP TIP](../commands-legacy/object-set-help-tip.md)** (alta prioridad)
+
+#### Comandos
+
+[`OBJECT Get help tip`](../commands-legacy/object-get-help-tip.md) - [`OBJECT SET HELP TIP`](../commands-legacy/object-set-help-tip.md)
+
+#### Ver también
+
+[Marcador de posición](properties_Entry.md#placeholder)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Hierarchy.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Hierarchy.md
new file mode 100644
index 00000000000000..f797e21e83d684
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Hierarchy.md
@@ -0,0 +1,30 @@
+---
+id: propertiesHierarchy
+title: Jerarquía
+---
+
+## List box jerárquico
+
+`List boxes de tipo array`
+
+Esta propiedad especifica que el list box debe mostrarse en forma jerárquica. En el formulario JSON, esta función se activa [cuando el valor de la propiedad *dataSource* es un array](properties_Object.md#array-list-box), es decir, una colección.
+
+Las opciones adicionales (**Variable 1...10**) están disponibles cuando se selecciona la opción *List box jerárquico*, correspondiente a cada elemento del array *dataSource* a utilizar como columna de ruptura. Cada vez que se introduce un valor en un campo, se añade una nueva línea. Se pueden especificar hasta 10 variables. Estas variables definen los niveles jerárquicos a mostrar en la primera columna.
+
+Ver [List box jerárquicos](listbox_overview.md#hierarchical-list-boxes)
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ------------------------------------------------------- |
+| datasource | array cadena | Colección de nombres de arrays que definen la jerarquía |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX GET HIERARCHY](../commands-legacy/listbox-get-hierarchy.md) - [LISTBOX SET HIERARCHY](../commands-legacy/listbox-set-headers-height.md)
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_ListBox.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_ListBox.md
new file mode 100644
index 00000000000000..345bc1640042b3
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_ListBox.md
@@ -0,0 +1,266 @@
+---
+id: propertiesListBox
+title: List Box
+---
+
+---
+
+## Columnas
+
+Colección de columnas del list box.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------- | ---------------------------- | ---------------------------------------------------- |
+| columns | colección de objetos columna | Contiene las propiedades de las columnas de list box |
+
+Para ver una lista de las propiedades que soportan los objetos columna, consulte la sección [Propiedades específicas de la columna](listbox_overview.md#column-specific-properties).
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+---
+
+## Nombre formulario detallado
+
+`List box del tipo selección`
+
+Especifica el formulario que se utilizará para modificar o mostrar los registros individuales del list box.
+
+Se muestra el formulario especificado:
+
+- cuando se utilizan las acciones estándar `Add Subrecord` y `Edit Subrecord` aplicadas al list box (ver [Utilización de las acciones estándar](https://doc.4d.com/4Dv20/4D/20.2/Standard-actions.300-6750239.en.html)),
+- cuando se hace doble clic en una línea y la propiedad [Doble clic en la línea ](#double-click-on-row)está definida en "Editar registro" o "Mostrar registro".
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| detailForm | string |
Nombre (cadena) de la tabla o formulario proyecto
Ruta POSIX (cadena) a un archivo .json que describe el formulario
Objeto que describe el formulario
|
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+---
+
+## Doble clic en línea
+
+`List box del tipo selección`
+
+Define la acción a realizar cuando un usuario haga doble clic en una línea en el list box. Las opciones disponibles son:
+
+- **No hacer nada** (por defecto): hacer doble clic en una línea no desencadena ninguna acción automática.
+- **Editar registro**: al hacer doble clic en una línea se muestra el registro correspondiente en el formulario detallado definido [ para el list box](#detail-form-name). El registro se abre en modo de lectura-escritura para que pueda ser modificado.
+- **Mostrar registro**: idéntica a la acción anterior, salvo que el registro se abre en modo de sólo lectura para que no pueda ser modificado.
+
+> > Double-clicking an empty row is ignored in list boxes.
+
+Independientemente de la acción seleccionada/elegida, se genera el evento de formulario `On Double clicked`.
+
+Para las dos últimas acciones, también se genera el evento de formulario `On Open Detail`. `On Close Detail` se genera cuando un registro mostrado en el formulario detallado asociado al list box está a punto de cerrarse (independientemente de que el registro se haya modificado o no).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------------------- | -------------- | ----------------------------------- |
+| doubleClickInRowAction | string | "editSubrecord", "displaySubrecord" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Highlight Set {#highlight-set}
+
+`List box del tipo selección`
+
+Esta propiedad se utiliza para especificar el conjunto a utilizar para gestionar los registros resaltados en el list box (cuando se selecciona la fuente de datos **Arrays**, se utiliza un conjunto booleano con el mismo nombre que el list box).
+
+4D crea un conjunto por defecto llamado *ListBoxSetN* donde *N* empieza en 0 y se incrementa según el número de list boxes en el formulario. Si es necesario, puede modificar el conjunto por defecto. Puede ser un conjunto local, proceso o interproceso (recomendamos utilizar un conjunto local, por ejemplo *$LBSet*, para limitar el tráfico de red). A continuación, 4D lo mantiene automáticamente. Si el usuario selecciona una o varias líneas en el list box, el conjunto se actualiza inmediatamente. Si desea seleccionar una o varias líneas por programación, puede aplicar a este conjunto los comandos del tema "Conjuntos".
+
+> - El estado de resaltado de las líneas del list box y el estado de resaltado de los registros de la tabla son completamente independientes.
+> - Si la propiedad "Conjunto resaltado" no contiene un nombre, no será posible realizar selecciones en el list box.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ------------------- |
+| highlightSet | string | Nombre del conjunto |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Columnas bloqueadas y columnas estáticas
+
+Las columnas bloqueadas y las columnas estáticas son dos funcionalidades distintas e independientes en los list boxes:
+
+- Las columnas bloqueadas siempre se muestran a la izquierda del list box; no se desplazan horizontalmente.
+- Las columnas estáticas no pueden moverse arrastrándolas y soltándolas dentro del list box.
+
+> Puede definir columnas estáticas y bloqueadas por programación, consulte la sección "List Box" en el manual *de Lenguaje 4D*.
+
+Estas propiedades interactúan de la siguiente manera:
+
+- Si define columnas que sólo son estáticas, no se pueden mover.
+
+- Si define columnas bloqueadas pero no estáticas, puede seguir cambiando su posición libremente dentro del área bloqueada. Sin embargo, una columna bloqueada no puede moverse fuera de esta área bloqueada.
+
+
+
+- Si define todas las columnas del área bloqueada como estáticas, no podrá mover estas columnas dentro del área bloqueada.
+
+
+
+- Puede definir una combinación de columnas bloqueadas y estáticas según sus necesidades. Por ejemplo, si define tres columnas bloqueadas y una columna estática, el usuario puede intercambiar las dos columnas situadas más a la derecha dentro del área bloqueada (ya que sólo la primera columna es estática).
+
+### Número de columnas bloqueadas
+
+Número de columnas que deben permanecer visualizadas permanentemente en la parte izquierda del list box, incluso cuando el usuario se desplaza horizontalmente por las columnas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------- | -------------- | ------------------------- |
+| lockedColumnCount | integer | mínimo: 0 |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+### Número de columnas estáticas
+
+Número de columnas que no se pueden mover durante la ejecución.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------- | -------------- | ------------------------- |
+| staticColumnCount | integer | mínimo: 0 |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get locked columns](../commands-legacy/listbox-get-locked-columns.md) - [LISTBOX Get static columns](../commands-legacy/listbox-get-static-columns.md) - [LISTBOX SET LOCKED COLUMNS](../commands-legacy/listbox-set-locked-columns.md) - [LISTBOX SET STATIC COLUMNS](../commands-legacy/listbox-set-static-columns.md)
+
+---
+
+## Número de columnas
+
+Define el número de columnas del list box.
+
+> Puede añadir o eliminar columnas dinámicamente por programación, utilizando comandos como [`LISTBOX INSERT COLUMN`](../commands-legacy/listbox-insert-column.md) o [`LISTBOX DELETE COLUMN`](../commands-legacy/listbox-delete-column.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ------------------------- |
+| columnCount | integer | mínimo: 1 |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[`LISTBOX DELETE COLUMN`](../commands-legacy/listbox-delete-column.md) - [LISTBOX Get number of columns](../commands-legacy/listbox-get-number-of-columns.md) - [`LISTBOX INSERT COLUMN`](../commands-legacy/listbox-insert-column.md) - [`LISTBOX INSERT COLUMN FORMULA`](../commands-legacy/listbox-insert-column-formula.md)
+
+---
+
+## Row Control Array {#row-control-array}
+
+`List box de tipo array`
+
+Un array 4D que controla la visualización de las líneas del list box.
+
+Puede definir las propiedades de interfaz "oculta", "desactivada" y "seleccionable" para cada línea de un list box basado en arrays utilizando este array. También puede ser designado utilizando el comando `LISTBOX SET ARRAY`.
+
+El array de control de líneas debe ser de tipo Longint e incluir el mismo número de líneas que el list box. Cada elemento del *Array de control de líneas* define el estado de la interfaz de su línea correspondiente en el list box. Hay tres propiedades de interfaz disponibles utilizando constantes en el tema de constantes "List Box":
+
+| Constante | Valor | Comentario |
+| ------------------------ | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| lk row is disabled | 2 | La línea correspondiente está desactivada. El texto y los controles, como las casillas de selección, aparecen atenuados o en gris. Las áreas de entrada de texto introducibles ya no lo son. Valor por defecto: Activado |
+| lk row is hidden | 1 | La línea correspondiente está oculta. Ocultar las líneas sólo afecta a la visualización del list box. Las líneas ocultas siguen presentes en los arrays y pueden gestionarse por programación. Los comandos de lenguaje, más concretamente `LISTBOX Get number of rows` o `LISTBOX GET CELL POSITION`, no tienen en cuenta el estado mostrado/oculto de las líneas. Por ejemplo, en un list box con 10 líneas en el que las 9 primeras líneas están ocultas, `LISTBOX Get number of rows` devuelve 10. Desde el punto de vista del usuario, la presencia de líneas ocultas en un list box no es visiblemente perceptible. Sólo pueden seleccionarse las líneas visibles (por ejemplo, utiliznado el comando Seleccionar todo). Valor por defecto: Visible |
+| lk row is not selectable | 4 | La línea correspondiente no es seleccionable (no es posible resaltarla). Las áreas de entrada de texto ya no se pueden modificar a menos que esté activada la opción [Single-Click Edit](properties_Entry.md#single-click-edit). Sin embargo, los controles como las casillas de verificación y las listas siguen siendo funcionales. Esta configuración se ignora si el modo de selección del list box es "Ninguno". Valor por defecto: Seleccionable |
+
+Para cambiar el estado de una línea, basta con definir la(s) constante(s) adecuada(s) en el elemento array correspondiente. Por ejemplo, si no quiere que la línea #10 sea seleccionable, puede escribir:
+
+```4d
+ aLControlArr{10}:=lk row is not selectable
+```
+
+
+
+Puede definir varias propiedades de la interfaz a la vez:
+
+```4d
+ aLControlArr{8}:=lk row is not selectable + lk row is disabled
+```
+
+
+
+Tenga en cuenta que la configuración de las propiedades de un elemento anula cualquier otro valor de este elemento (si no se restablece). Por ejemplo:
+
+```4d
+ aLControlArr{6}:=lk row is disabled + lk row is not selectable
+ //define la línea 6 como desactivada Y no seleccionable
+ aLControlArr{6}:=lk row is disabled
+ //define la línea 6 como desactivada pero seleccionable nuevamente
+```
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------------- | -------------- | ------------------------------------- |
+| rowControlSource | string | Nombre del array de control de líneas |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[`LISTBOX Get array`](../commands-legacy/listbox-get-array.md) - [`LISTBOX GET ARRAYS`](../commands-legacy/listbox-get-arrays.md) - [`LISTBOX SET ARRAY`](../commands-legacy/listbox-set-array.md)
+
+---
+
+## Modo de selección
+
+Designa la opción para permitir a los usuarios seleccionar líneas:
+
+- **Ninguna**: las líneas no se pueden seleccionar si se elige este modo. Hacer clic en la lista no tendrá ningún efecto a menos que la opción [Edición con un solo clic](properties_Entry.md#single-click-edit) esté activada. Las teclas de navegación sólo hacen que la lista se desplace; no se genera el evento de formulario `On Selection Change`.
+- **Simple**: en este modo se puede seleccionar una línea a la vez. Si hace clic en una línea, la seleccionará. Un **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en una fila cambia su estado (entre seleccionado o no).
+ Las teclas de flecha arriba y abajo seleccionan el registro anterior/siguiente en la lista. Las otras teclas de navegación se desplazan por la lista. El evento de formulario `On Selection Change` se genera cada vez que se cambia la línea actual.
+- **Múltiple**: en este modo se pueden seleccionar varias líneas simultáneamente.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------------------- |
+| selectionMode | string | "multiple", "single", "none" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Object.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Object.md
new file mode 100644
index 00000000000000..50129194b5e4ba
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Object.md
@@ -0,0 +1,339 @@
+---
+id: propertiesObject
+title: Objetos
+---
+
+---
+
+## Tipo
+
+`PARÁMETRO OBLIGATORIO`
+
+Esta propiedad designa el tipo del [objeto formulario activo o inactivo](formObjects_overview.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| type | string | "button", "buttonGrid", "checkbox", "combo", "dropdown", "groupBox", "input", "line", "list", "listbox", "oval", "picture", "pictureButton", "picturePopup", "plugin", "progress", "radio", "rectangle", "ruler", "spinner", "splitter", "stepper", "subform", "tab", "text", "view", "webArea", "write" |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Spinner](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+---
+
+## Nombre del objeto
+
+Cada objeto de formulario activo está asociado a un nombre de objeto. Cada nombre de objeto debe ser único.
+
+> Los nombres de objetos están limitados a un tamaño de 255 bytes.
+
+Al utilizar el lenguaje de 4D, puede referirse a un objeto formulario activo por su nombre de objeto (ver los comandos [Object (Forms)](../commands/theme/Objects_Forms.md))).
+
+Para más información sobre las reglas de denominación de los objetos de formulario, consulte la sección [Identificadores](Concepts/identifiers.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------------------------------------------------------- |
+| name | string | Todo nombre permitido que no pertenezca a un objeto ya existente |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md#overview) - [List Box](listbox_overview.md#overview) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Botón con imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md#overview) - [Indicador de progreso](progressIndicator.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Botón de opción](radio_overview.md) - [Subformulario](subform_overview.md#overview) - [Control de pestañas](tabControl.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[FORM GET OBJECTS](../commands-legacy/form-get-objects.md) - [OBJECT Get name](../commands-legacy/object-get-name.md)
+
+---
+
+## Guardar valor
+
+Esta propiedad está disponible cuando la opción [Guardar geometría](FormEditor/properties_FormProperties.md#save-geometry) está marcada para el formulario.
+
+Esta funcionalidad sólo es soportada con los objetos que contribuyen a la geometría general del formulario. Por ejemplo, esta opción está disponible para las casillas de verificación porque su valor puede utilizarse para ocultar o mostrar áreas adicionales en la ventana.
+
+Esta es la lista de objetos cuyo valor se puede guardar:
+
+| Object | Valor guardado |
+| ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
+| [Casilla de verificación](checkbox_overview.md) | Valor de la variable asociada (0, 1, 2) |
+| [Lista desplegable](dropdownList_Overview.md) | Número de línea seleccionada |
+| [Botón de radio](radio_overview.md) | Valor de la variable asociada (1, 0, True o False para los botones de acuerdo a su tipo) |
+| [Control de pestañas](tabControl.md) | Número de pestaña seleccionada |
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------- |
+| memorizeValue | boolean | true, false |
+
+#### Objetos soportados
+
+[Casilla de selección](checkbox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Botón de radio](radio_overview.md) - [Control de pestañas](tabControl.md)
+
+---
+
+## Variable or Expression {#variable-or-expression}
+
+> Ver también **[Expression](properties_DataSource.md#expression)** para las columnas de list box de tipo selección y colección.
+
+Esta propiedad especifica la fuente de los datos. Cada objeto de formulario activo está asociado a un nombre de objeto y a un nombre de variable. El nombre de la variable puede ser diferente del nombre del objeto. En el mismo formulario, puede utilizar la misma variable varias veces, mientras que cada [nombre de objeto](#object-name) debe ser único.
+
+> El tamaño del nombre de la variable está limitado a 31 bytes. Consulte la sección [Identificadores](Concepts/identifiers.md) para obtener más información sobre las reglas de asignación de nombres.
+
+Las variables de los objetos del formulario permiten controlar y supervisar los objetos. Por ejemplo, cuando se presiona un botón, su variable se pone en 1; el resto del tiempo, en 0. La expresión asociada a un indicador de progreso permite leer y modificar el parámetro actual.
+
+Las variables o expresiones se pueden introducir o no y pueden recibir datos de tipo Texto, Entero, Numérico, Fecha, Hora, Imagen, Booleano u Objeto.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| dataSource | cadena o array de cadenas |
4D variable, field name, or any expression.
Empty string for [dynamic variables](#dynamic-variables).
String array (collection of array names) for a [hierarchical listbox](listbox_overview.md#hierarchical-list-boxes) column]
|
+
+### Expresiones
+
+Puede utilizar una [expresión](Concepts/quick-tour.md#expressions) como fuente de datos para un objeto. Se permite toda expresión 4D válida: expresión simple, propiedad de objeto, fórmula, función 4D, nombre de método proyecto o campo que utilice la sintaxis estándar `[Table]Field`. La expresión se evalúa cuando se ejecuta el formulario y se reevalúa para cada evento del formulario. Tenga en cuenta que las expresiones pueden ser [asignables o no asignables](Concepts/quick-tour.md#expressions).
+
+> Si el valor introducido corresponde a la vez a un nombre de variable y a un nombre de método, 4D considera que está indicando el método.
+
+### Variables dinámicas
+
+Puede dejarle a 4D crear variables asociadas con los objetos de su formulario (botones, variables editables, casillas de verificación, etc.) dinámicamente y de acuerdo a sus necesidades. Para ello, basta con dejar en blanco la propiedad "Variable o expresión" (o el campo JSON de `dataSource`).
+
+Cuando una variable no tiene nombre, al cargar el formulario, 4D crea una nueva variable para el objeto, con un nombre calculado que es único en el espacio de las variables de proceso del intérprete (lo que significa que este mecanismo puede utilizarse incluso en modo compilado). Esta variable temporal se destruirá cuando se cierre el formulario.
+
+Obtener o definir el valor de los objetos del formulario que utilizan variables dinámicas, solo necesita llamar a los comandos [`OBJECT Get value`](../commands-legacy/object-get-value.md) y [`OBJECT SET VALUE`](../commands-legacy/object-set-value.md). Por ejemplo:
+
+```4d
+ var $value : Variant
+ $value:=OBJECT Get value("comments")
+ OBJECT SET VALUE("comments";$value+10)
+```
+
+### List box array
+
+Para un list box array, la propiedad **Variable o Expresión** normalmente contiene el nombre de la variable array definida para el list box y para cada columna. Sin embargo, puede utilizar un array de cadenas (que contenga nombres de arrays) como *dataSource* valor de una columna list box para definir un [list box jerárquico](listbox_overview.md#hierarchical-list-boxes).
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Selector](spinner.md) - [Separador](splitters.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[`LISTBOX Get column formula`](../commands-legacy/listbox-get-column-formula.md) - [`LISTBOX SET COLUMN FORMULA`](../commands-legacy/listbox-set-column-formula.md) - [`OBJECT Get data source`](../commands-legacy/object-get-data-source.md) - [`OBJECT Get data source formula`](../commands/object-get-data-source-formula.md) - [`OBJECT Get value`](../commands-legacy/object-get-value.md) - [`OBJECT Get pointer`](../commands-legacy/object-get-pointer.md) - [`OBJECT SET VALUE`](../commands-legacy/object-set-value.md) - [`OBJECT SET DATA SOURCE`](../commands-legacy/object-set-data-source.md) - [`OBJECT SET DATA SOURCE FORMULA`](../commands/object-set-data-source-formula.md)
+
+---
+
+## Tipo de expresión
+
+> Esta propiedad se denomina [**Tipo de datos**](properties_DataSource.md#data-type-expression-type) en la Lista de propiedades para [selección](listbox_overview.md#selection-list-boxes) y [colección](listbox_overview.md#collection-or-entity-selection-list-boxes) y para [Listas desplegables](dropdownList_Overview.md) asociadas a un [objeto](FormObjects/dropdownList_Overview.md#using-an-object) o un [array](FormObjects/dropdownList_Overview.md#using-an-array).
+
+Especifique el tipo de datos para la expresión o variable asociada al objeto. Tenga en cuenta que el objetivo principal de este ajuste es configurar las opciones (como los formatos de visualización) disponibles para el tipo de datos. En realidad, no escribe la variable en sí. De cara a la compilación del proyecto, debe [declarar la variable](Concepts/variables.md#declaring-variables).
+
+Sin embargo, esta propiedad tiene una función tipográfica en los siguientes casos específicos:
+
+- **[Variables dinámicas](#dynamic-variables)**: puede utilizar esta propiedad para declarar el tipo de variables dinámicas.
+- **[Columnas List Box ](listbox_overview.md#list-box-columns)**: esta propiedad se utiliza para asociar un formato de visualización a los datos de la columna. Los formatos suministrados dependerán del tipo de variable (list box de tipo array) o del tipo dato/campo (list boxes de tipo selección y colección). Los formatos 4D estándar que pueden utilizarse son: Alfa, Numérico, Fecha, Hora, Imagen y Booleano. El tipo Texto no tiene formatos de visualización específicos. Todos los formatos personalizados existentes también están disponibles.
+- **[Variables imagen](input_overview.md)**: puede utilizar este menú para declarar las variables antes de cargar el formulario en modo interpretado. Mecanismos nativos específicos rigen la visualización de variables de imagen en los formularios. Estos mecanismos exigen una mayor precisión a la hora de configurar las variables: a partir de ahora, deberán haber sido declaradas antes de cargar el formulario -es decir, incluso antes del evento de formulario `On Load` - a diferencia de otros tipos de Estos mecanismos exigen una mayor precisión a la hora de configurar las variables: a partir de ahora, deberán haber sido declaradas antes de cargar el formulario -es decir, incluso antes del evento de formulario `On Load` - a diferencia de otros tipos de Estos mecanismos exigen una mayor precisión a la hora de configurar las variables: a partir de ahora, deberán haber sido declaradas antes de cargar el formulario -es decir, incluso antes del evento de formulario `On Load` - a diferencia de otros tipos de To do this, you need either for the statement `var varName : Picture` to have been executed before loading the form (typically, in the method calling the `DIALOG` command), or for the variable to have been typed at the form level using the expression type property.
+ De lo contrario, la variable imagen no se mostrará correctamente (sólo en modo interpretado).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------ | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| dataSourceTypeHint | string | **
**columnas de lista:** "boolean", "number", "picture", "text", date", "time". *Sólo para Array/selección list box*: "integer", "object"
|
+
+#### Objetos soportados
+
+[Casilla de verificación](checkbox_overview.md) - [Cuadro combinado](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie List Box](listbox_overview.md#list-box-footers) - [Área de Plug-in](pluginArea_overview.md) - [Indicador de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Selector](spinner.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestaña](tabControl.md)
+
+---
+
+## Clase CSS
+
+Lista de palabras separadas por espacios que se utilizan como selectores de clase en los [archivos css](FormEditor/createStylesheet.md#style-sheet-files).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------------------------------------------------------- |
+| class | string | Una cadena con los nombres de los CSS separados por caracteres de espacio |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [List Box](listbox_overview.md) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Botón de opción](radio_overview.md) - [Imagen estática](staticPicture.md) - [Subformulario](subform_overview.md) - [Área de texto](text.md) - [Área web](webArea_overview.md)
+
+---
+
+## Collection o entity selection
+
+Para utilizar elementos de colección o entidades para definir el contenido de las líneas del list box.
+
+Introduzca una expresión que devuelva una colección o una selección de entidades. Normalmente, introducirá el nombre de una variable, un elemento de una colección o una propiedad que contenga una colección o una selección de entidades.
+
+La colección o la selección de entidades debe estar disponible para el formulario cuando se carga. Cada elemento de la colección o cada entidad de la selección de entidades se asociará a una fila del list box y estará disponible como objeto a través de la palabra clave [`This`](../Concepts/classes.md#this):
+
+- si ha utilizado una colección de objetos, puede llamar a **This** en la expresión de la fuente de datos para acceder a cada valor de propiedad, por ejemplo `This.`.
+- si ha utilizado una selección de entidades, puede llamar a **This** en la expresión de la fuente de datos para acceder a cada valor de atributo, por ejemplo `This.`.
+
+> Si ha utilizado una colección de valores escalares (y no objetos), 4D le permite mostrar cada valor llamando a **This.value** en la expresión datasource. Sin embargo, en este caso no podrá modificar valores ni acceder al objeto actual (ver más adelante).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------------------------------------------------------------------------- |
+| dataSource | string | Expresión que devuelve una colección o una selección de entidades. |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[`OBJECT Get data source`](../commands-legacy/object-get-data-source.md) - [`OBJECT Get data source formula`](../commands/object-get-data-source-formula.md) - [`OBJECT Get value`](../commands-legacy/object-get-value.md) - [`OBJECT Get pointer`](../commands-legacy/object-get-pointer.md) - [`OBJECT SET VALUE`](../commands-legacy/object-set-value.md) - [`OBJECT SET DATA SOURCE`](../commands-legacy/object-set-data-source.md) - [`OBJECT SET DATA SOURCE FORMULA`](../commands/object-set-data-source-formula.md)
+
+---
+
+## Fuente de datos
+
+Especifique el tipo de list box.
+
+
+
+- **Arrays**(por defecto): utiliza elementos de array como líneas del list box.
+- **Selección actual**: utiliza expresiones, campos o métodos cuyos valores se evaluarán para cada registro de la selección actual de una tabla.
+- **Selección temporal**: utiliza expresiones, campos o métodos cuyos valores se evaluarán para cada registro de una selección temporal.
+- **Colección o Selección de entidades**: utilice elementos de colección o entidades para definir el contenido de las líneas del list box. Tenga en cuenta que con este tipo de list box, debe definir la propiedad [Colección o Selección de entidades](properties_Object.md#collection-or-entity-selection).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------- | -------------- | ----------------------------------------------------------- |
+| listboxType | string | "array", "currentSelection", "namedSelection", "collection" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+---
+
+## Tipo de plug-in
+
+Nombre del [área externa del plug-in](pluginArea_overview.md) asociada al objeto. Los nombres de las áreas externas del plug-in.se publican en el archivo manifest.json del plug-in.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | ----------------------------------------------------------------------------------- |
+| pluginAreaKind | string | Nombre del área externa del plug-in (comienza con un carácter %) |
+
+#### Objetos soportados
+
+[Área de plugin](pluginArea_overview.md)
+
+---
+
+## Grupo radio
+
+Permite utilizar los botones de radio en conjuntos coordinados: sólo se puede seleccionar un botón a la vez en el conjunto.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------------- |
+| radioGroup | string | Nombre del grupo radio |
+
+#### Objetos soportados
+
+[Botón de radio](radio_overview.md)
+
+---
+
+## Título
+
+Permite insertar una etiqueta en un objeto. Se puede especificar la fuente y el estilo de esta etiqueta.
+
+Puede forzar un retorno de carro en la etiqueta utilizando el caracter \ (barra invertida).
+
+
+
+Para insertar un \ en la etiqueta, ingrese "\\".
+
+Por defecto, la etiqueta se coloca en el centro del objeto. Cuando el objeto también contiene un icono, puede modificar la ubicación relativa de estos dos elementos utilizando la propiedad [Posición Título/imagen](properties_TextAndPicture.md#titlepicture-position).
+
+Para la traducción de la aplicación, puede introducir una referencia XLIFF en el área del título de un botón (ver [Apéndice B: arquitectura XLIFF](https://doc.4d.com/4Dv20/4D/20.2/Appendix-B-XLIFF-architecture.300-6750166.en.html)).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------- |
+| text | string | todo texto |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de selección](checkbox_overview.md) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Botón radio](radio_overview.md) - [ÁreaTexto](text.md)
+
+#### Comandos
+
+[`OBJECT Get title`](../commands-legacy/object-get-title.md) - [`OBJECT SET TITLE`](../commands-legacy/object-set-title.md)
+
+---
+
+## Cálculo de variables
+
+Esta propiedad define el tipo de cálculo que se realizará en un área [pie de columna](listbox_overview.md#list-box-footers).
+
+> El cálculo de los pies de página también puede establecerse utilizando el comando 4D [`LISTBOX SET FOOTER CALCULATION`](../commands-legacy/listbox-set-footer-calculation.md).
+
+Hay varios tipos de cálculos disponibles. La tabla siguiente muestra los cálculos que se pueden utilizar según el tipo de datos que se encuentran en cada columna e indica el tipo afectado automáticamente por 4D a la variable de pie de página (si no está escrita por el código):
+
+| Cálculo | Num | Text | Fecha | Time | Bool | Imágenes | tipos de variables de pie de página |
+| ------------------------------------------ | --- | ---- | ----- | ---- | ---- | -------- | ----------------------------------- |
+| Mínimo | X | X | X | X | X | | Igual que el tipo de columna |
+| Máximo | X | X | X | X | X | | Igual que el tipo de columna |
+| Suma | X | | | X | X | | Igual que el tipo de columna |
+| Conteo | X | X | X | X | X | X | Integer |
+| Promedio | X | | | X | | | Real |
+| Desviación estándar(\*) | X | | | X | | | Real |
+| Varianza(\*) | X | | | X | | | Real |
+| Suma de cuadrados(\*) | X | | | X | | | Real |
+| Personalizado ("None ") | X | X | X | X | X | X | Cualquiera |
+
+(\*) Sólo para list boxes de tipo array.
+
+> Sólo las [variables](Concepts/variables.md) declaradas o dinámicas pueden utilizarse para mostrar los cálculos de pie de página. No se soportan otros tipos de [expresiones](Concepts/quick-tour.md#expressions) como `Form.value`.
+
+Los cálculos automáticos ignoran el estado mostrado/oculto de las líneas list box. Si desea restringir un cálculo sólo a las líneas visibles, debe utilizar un cálculo personalizado.
+
+*Null* no se tienen en cuenta para ningún cálculo.
+
+Si la columna contiene distintos tipos de valores (columna basada en colecciones, por ejemplo):
+
+- Promedio y Suma sólo tienen en cuenta elementos numéricos (se ignoran otros tipos de elementos).
+- Mínimo y Máximo devuelven un resultado según el orden habitual de las listas de tipos, tal como se define en la función [collection.sort()](API/CollectionClass.md#sort).
+
+El uso de cálculos automáticos en pies de columnas basados en expresiones tiene las siguientes limitaciones:
+
+- es **soportado** con todos los tipos de list boxes cuando la expresión es "simple" (como `[table]field` o `this.attribute`),
+- se **soporta pero no se recomienda** por razones de rendimiento con list boxes colección/selección de entidades cuando la expresión es "compleja" (distinta de `this.attribute`) y el list box contiene un gran número de líneas,
+- **no se soporta** con list boxes selección actual/selección temporal cuando la expresión es "compleja". Es necesario utilizar cálculos personalizados.
+
+Cuando está configurado **Personalizado** ("none" en JSON), 4D no realiza cálculos automáticos y debe asignar el valor de la variable en esta área por programación.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
+| variableCalculation | string | "none", "minimum", "maximum", "sum", "count", "average", "standardDeviation", "variance", "sumSquare" |
+
+#### Objetos soportados
+
+[Pie de List Box](listbox_overview.md#list-box-footers)
+
+#### Comandos
+
+[`LISTBOX Get footer calculation`](../commands-legacy/listbox-get-footer-calculation.md) - [`LISTBOX SET FOOTER CALCULATION`](../commands-legacy/listbox-set-footer-calculation.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Picture.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Picture.md
new file mode 100644
index 00000000000000..8b752f154c5f4d
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Picture.md
@@ -0,0 +1,76 @@
+---
+id: propertiesPicture
+title: Picture
+---
+
+## Ruta de acceso
+
+Ruta de una imagen source estática para un [botón imagen](pictureButton_overview.md), [menú emergente de imagen](picturePopupMenu_overview.md), o [imagen estática](staticPicture.md). Debe utilizar la sintaxis POSIX.
+
+Las siguientes ubicaciones pueden utilizarse para las imágenes estáticas:
+
+- en la carpeta **Resources** del proyecto. Apropiado cuando se desea compartir imágenes estáticas entre varios formularios en el proyecto. En este caso, el nombre de la ruta es "/RESOURCES/".
+- en una carpeta de imágenes (por ejemplo, llamada **Images**) dentro de la carpeta del formulario. Apropiado cuando las imágenes estáticas se utilizan sólo en el formulario y/o se quiere poder mover o duplicar todo el formulario dentro del proyecto o de diferentes proyectos. En este caso, el nombre de la ruta es "" y se resuelve desde la raíz de la carpeta del formulario.
+- en una variable imagen 4D. La imagen debe cargarse en la memoria cuando se ejecuta el formulario. En este caso, el nombre de la ruta es "var:".
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :-----: | :------------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| picture | text | Ruta relativa o del sistema de archivos en sintaxis POSIX, o "var:" para una variable tipo imagen |
+
+#### Objetos soportados
+
+[Botón imagen](pictureButton_overview.md) - [Menú emergente imagen](picturePopupMenu_overview.md) - [Imagen estática](staticPicture.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Visualización
+
+### A escala para ajustarse
+
+`Gramática JSON: "scaled"`
+
+El formato **A escala para ajustarse** hace que 4D redimensione la imagen para ajustarla a las dimensiones del área.
+
+
+
+### Replicado
+
+`Gramática JSON: "tiled"`
+
+Cuando se amplía el área que contiene una imagen con el formato **Replicada**, la imagen no se deforma sino que se replica tantas veces como sea necesario para llenar el área por completo.
+
+
+
+Si el campo se reduce a un tamaño menor que el de la imagen original, la imagen queda truncada (no centrada).
+
+### Centrado / Truncado (no centrado)
+
+`Gramática JSON: "truncatedCenter" / "truncatedTopLeft"`
+
+El formato **Centro** hace que 4D centre la imagen en el área y recorte cualquier parte que no quepa dentro del área. 4D recorta por igual desde cada borde y desde la parte superior e inferior.
+
+El formato **Truncado (no centrado)** hace que 4D coloque la esquina superior izquierda de la imagen en la esquina superior izquierda del área y recorte cualquier parte que no quepa dentro del área. 4D corta desde la derecha y desde abajo.
+
+> Cuando el formato de la imagen es **Truncado (no centrado)**, es posible añadir barras de desplazamiento al área de entrada.
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | -------------------------------------------------------- |
+| pictureFormat | string | "scaled", "tiled", "truncatedCenter", "truncatedTopLeft" |
+
+#### Objetos soportados
+
+[Imagen estática](staticPicture.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Plugins.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Plugins.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Plugins.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Plugins.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Print.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Print.md
new file mode 100644
index 00000000000000..049b008ae37199
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Print.md
@@ -0,0 +1,36 @@
+---
+id: propertiesPrint
+title: Imprimir
+---
+
+## Impresión marco
+
+Esta propiedad gestiona el modo de impresión de los objetos cuyo tamaño puede variar de un registro a otro en función de su contenido. Estos objetos pueden configurarse para imprimirse con un marco fijo o variable. Los objetos de marco fijo se imprimen dentro de los límites del objeto tal y como fue creado en el formulario. Los objetos de marco variable se expanden durante la impresión para incluir todo el contenido del objeto. Tenga en cuenta que el ancho de los objetos impresos como tamaño variable no se ve afectado por esta propiedad; sólo la altura varía automáticamente en función del contenido del objeto.
+
+No se puede colocar más de un objeto de marco variable uno al lado del otro en un formulario. Puede colocar objetos de marco no variable a ambos lados de un objeto que se imprimirá con un tamaño variable siempre que el objeto de marco variable sea al menos una línea más largo que el objeto de al lado y que todos los objetos estén alineados en la parte superior. Si no se respeta esta condición, el contenido de los otros campos se repetirá para cada corte horizontal del objeto marco variable.
+
+> Los comandos [`Print object`](../commands-legacy/print-object.md) y [`Print form`](../commands/print-form.md) no soportan esta propiedad.
+
+Las opciones de impresión son:
+
+- La opción **Variable** / **Imprimir marco variable** marcada: 4D amplía o reduce el área del objeto del formulario para imprimir todos los subregistros.
+
+- **Opción fija (truncamiento)** / **Imprimir marco variable** no seleccionada: 4D sólo imprime el contenido que aparece en el área del objeto. El formulario sólo se imprime una vez y el contenido no impreso se ignora.
+
+- **Fijo (Múltiples Registros)** (sólo subformularios): se mantiene el tamaño inicial del área del subformulario pero 4D imprime el formulario varias veces para imprimir todos los registros.
+
+> Esta propiedad puede definirse por programación utilizando el comando [`OBJECT SET PRINT VARIABLE FRAME`](../commands-legacy/object-set-print-variable-frame.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :--------: | :------------: | ---------------------------------------------------------------------------------- |
+| printFrame | string | "fixed", "variable", (subformulario únicamente) "fixedMultiple" |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md) - [Subformularios](subform_overview.md) (sólo subformularios lista) - [Áreas 4D Write Pro](writeProArea_overview.md)
+
+#### Comandos
+
+[`OBJECT GET PRINT VARIABLE FRAME`](../commands-legacy/object-get-print-variable-frame.md) - [`OBJECT SET PRINT VARIABLE FRAME`](../commands-legacy/object-set-print-variable-frame.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_RangeOfValues.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_RangeOfValues.md
new file mode 100644
index 00000000000000..71b8b3f5a33616
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_RangeOfValues.md
@@ -0,0 +1,85 @@
+---
+id: propertiesRangeOfValues
+title: Rango de valores
+---
+
+## Valor por defecto
+
+Puede asignar un valor por defecto para ser introducido en un objeto de entrada. Esta propiedad es útil, por ejemplo, cuando la entrada [fuente de datos](properties_Object.md#variable-or-expression) es un campo: el valor por defecto se introduce cuando se muestra un nuevo registro por primera vez. Puede cambiar el valor a menos que el área de entrada se haya definido como [no editable](properties_Entry.md#enterable).
+
+El valor por defecto sólo puede utilizarse si el [tipo de fuente de datos](properties_Object.md#expression-type) es:
+
+- texto/cadena
+- number/integer
+- date
+- time
+- boolean
+
+4D ofrece sellos para generar valores por defecto para la fecha, la hora y el número de secuencia. La fecha y la hora se toman de la fecha y la hora del sistema. 4D genera automáticamente los números de secuencia necesarios. La siguiente tabla muestra el sello a utilizar para generar valores por defecto de forma automática:
+
+| Stamp | Significado |
+| ----- | ------------------- |
+| #D | Fecha actual |
+| #H | Hora actual |
+| #N | Número de secuencia |
+
+Puede utilizar un número de secuencia para crear un número único para cada registro de la tabla para el archivo de datos actual. Un número de secuencia es un longint que se genera para cada nuevo registro. Los números comienzan en uno (1) y van aumentando de uno en uno. Un número de secuencia no se repite nunca, incluso si el registro al que se asigna se elimina de la tabla. Cada tabla tiene su propio contador interno de números de secuencia. Para más información, consulte el párrafo [Autoincremento](https://doc.4d.com/4Dv20/4D/20.2/Field-properties.300-6750280.en.html#976029).
+
+> No hay que confundir esta propiedad con la propiedad "valores por defecto" que permite llenar una columna list box con valores estáticos.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | ----------------------------------- | --------------------------------------------------------- |
+| defaultValue | string, number, date, time, boolean | Todo valor y/o un sello: "#D", "#H", "#N" |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md)
+
+---
+
+## Lista de excluidos
+
+Permite definir una lista cuyos valores no pueden introducirse en el objeto. Si se introduce un valor excluido, no se acepta y se muestra un mensaje de error.
+
+> Si una lista especificada es jerárquica, sólo se tienen en cuenta los elementos del primer nivel.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ----------------------------------------------- |
+| excludedList | lista | Una lista de valores a excluir. |
+
+#### Objetos soportados
+
+[Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Entrada](input_overview.md)
+
+#### Comandos
+
+[OBJECT Get list name](../commands-legacy/object-get-list-name.md) - [OBJECT Get list reference](../commands-legacy/object-get-list-reference.md) - [OBJECT SET LIST BY NAME](../commands-legacy/object-set-list-by-name.md) - [OBJECT SET LIST BY REFERENCE](../commands-legacy/object-set-list-by-reference.md)
+
+---
+
+## Lista requerida
+
+Restringe las entradas válidas a los elementos de la lista. Por ejemplo, es posible que desee utilizar una lista obligatoria para los títulos de los puestos de trabajo, de modo que las entradas válidas se limiten a los títulos que han sido aprobados por la dirección.
+
+La creación de una lista obligatoria no muestra automáticamente la lista cuando se selecciona el campo. Si desea mostrar la lista requerida, asigne la misma lista a la propiedad [Lista de opciones](properties_DataSource.md#choice-list).
+Sin embargo, a diferencia de la propiedad [Lista de selección](properties_DataSource.md#choice-list), cuando se define una lista requerida, ya no es posible la introducción mediante el teclado, sólo se permite la selección de un valor de la lista mediante Si se definen diferentes listas utilizando las propiedades [Lista de selección](properties_DataSource.md#choice-list) y Lista requerida, la propiedad Lista requerida tiene prioridad.
+
+> Si una lista especificada es jerárquica, sólo se tienen en cuenta los elementos del primer nivel.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | -------------------------------------------------- |
+| requiredList | lista | Una lista de valores obligatorios. |
+
+#### Objetos soportados
+
+[Combo Box](comboBox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Entrada](input_overview.md)
+
+#### Comandos
+
+[OBJECT Get list name](../commands-legacy/object-get-list-name.md) - [OBJECT Get list reference](../commands-legacy/object-get-list-reference.md) - [OBJECT SET LIST BY NAME](../commands-legacy/object-set-list-by-name.md) - [OBJECT SET LIST BY REFERENCE](../commands-legacy/object-set-list-by-reference.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Reference.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Reference.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/properties_Reference.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Reference.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_ResizingOptions.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_ResizingOptions.md
new file mode 100644
index 00000000000000..c83d2daaa5fd1e
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_ResizingOptions.md
@@ -0,0 +1,150 @@
+---
+id: propertiesResizingOptions
+title: Opciones de redimensionamiento
+---
+
+## Redimensionamiento columnas auto
+
+Cuando esta propiedad está activada (valor `rightToLeft` en JSON), las columnas del list box se redimensionan automáticamente junto con el list box, dentro de los límites de los anchos [mínimo](properties_CoordinatesAndSizing.md#minimum-width) y [máximo](properties_CoordinatesAndSizing.md#maximum-width) definidos.
+
+Cuando esta propiedad está desactivada (valor `legacy` en JSON), sólo se redimensiona la columna más a la derecha del listbox, aunque su ancho supere el valor máximo definido.
+
+### Cómo funciona el redimensionamiento automático de las columnas
+
+- A medida que el ancho del list box aumenta, sus columnas se amplían, una a una, empezando de derecha a izquierda, hasta que cada una alcanza su [ancho máximo](properties_CoordinatesAndSizing.md#maximum-width). Sólo se redimensionan las columnas con la propiedad [Resizable](#resizable) seleccionada.
+
+- El mismo procedimiento se aplica cuando el ancho del list box disminuye, pero en orden inverso (*es decir,*, las columnas se redimensionan empezando de izquierda a derecha). Cuando cada columna ha alcanzado su [ancho mínimo](properties_CoordinatesAndSizing.md#minimum-width), la barra de desplazamiento horizontal vuelve a activarse.
+
+- Las columnas se redimensionan sólo cuando la barra de desplazamiento horizontal no está "activa"; *es decir,*, todas las columnas son totalmente visibles en el list box en su tamaño actual. **Nota**: si la barra de desplazamiento horizontal está oculta, esto no altera su estado: una barra de desplazamiento puede seguir estando activa, aunque no sea visible.
+
+- Una vez que todas las columnas alcanzan su tamaño máximo, dejan de ampliarse y en su lugar se añade una columna en blanco (falsa) a la derecha para rellenar el espacio extra. Si hay una columna falsa (en blanco), cuando el ancho del list box disminuye, ésta es la primera área que se reduce.
+
+
+
+#### Sobre la columna falsa (en blanco)
+
+La apariencia de la columna falsa coincide con la de las columnas existentes; tendrá un encabezado y/o un pie de página falsos si estos elementos están presentes en las columnas del list box existentes y tendrá aplicados los mismos colores de fondo.
+
+Se puede hacer clic en el encabezado y/o en el pie de página falsos, pero esto no tiene ningún efecto sobre las otras columnas (por ejemplo: no se realiza ninguna ordenación); no obstante, los eventos se generan en consecuencia `On Clicked`, \\\`On Header Cl
+
+Si se hace clic en una celda de la columna falsa, el comando [LISTBOX GET CELL POSITION](../commands-legacy/listbox-get-cell-position.md) devuelve "X+1" para su número de columna (donde X es el número de columnas existent
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ----------------------- |
+| resizingMode | string | "rightToLeft", "legacy" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Dimensionamiento horizontal
+
+Esta propiedad especifica si un objeto debe moverse o redimensionarse horizontalmente cuando un usuario redimensiona el formulario. También puede establecerse dinámicamente mediante el comando de lenguaje [`OBJECT SET RESIZING OPTIONS`](../commands-legacy/object-set-resizing-options.md).
+
+Hay tres opciones disponibles:
+
+| Option | Valor JSON | Resultado |
+| -------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Agrandar | "grow" | El mismo porcentaje se aplica al ancho del objeto cuando el usuario redimensiona el ancho de la ventana, |
+| Mover | "move" | El objeto se desplaza la misma cantidad a la izquierda o a la derecha que el aumento del ancho cuando el usuario redimensiona el ancho de la ventana, |
+| Ninguno | "fixed" | El objeto permanece inmóvil cuando se cambia el tamaño del formulario |
+
+> Esta propiedad funciona junto con la propiedad [Dimensionamiento vertical](#tamaño-vertical).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------- | -------------- | ----------------------- |
+| sizingX | string | "grow", "move", "fixed" |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[`OBJECT GET RESIZING OPTIONS`](../commands-legacy/object-get-resizing-options.md) - [`OBJECT SET RESIZING OPTIONS`](../commands-legacy/object-set-resizing-options.md)
+
+---
+
+## Dimensionamiento vertical
+
+Esta propiedad especifica si un objeto debe ser movido verticalmente o redimensionado cuando un usuario redimensiona el formulario.También puede definirse dinámicamente por el comando de lenguaje `OBJECT SET RESIZING OPTIONS`.
+
+Hay tres opciones disponibles:
+
+| Option | Valor JSON | Resultado |
+| -------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Agrandar | "grow" | El mismo porcentaje se aplica a la altura del objeto cuando el usuario redimensiona el ancho de la ventana, |
+| Mover | "move" | El objeto se desplaza la misma cantidad hacia arriba o hacia abajo que el aumento de la altura cuando el usuario redimensiona el ancho de la ventana, |
+| Ninguno | "fixed" | El objeto permanece inmóvil cuando se cambia el tamaño del formulario |
+
+> Esta propiedad funciona junto con la propiedad [Dimensionamiento horizontal](#horizontal-sizing).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------- | -------------- | ----------------------- |
+| sizingY | string | "grow", "move", "fixed" |
+
+#### Objetos soportados
+
+[Área 4D View Pro](viewProArea_overview.md) - [Área 4D Write Pro](writeProArea_overview.md) - [Botón](button_overview.md) - [Rejilla de botones](buttonGrid_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [Línea](shapes_overview.md#line) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Óvalo](shapes_overview.md#oval) - [Botón imagen](pictureButton_overview.md) - [Menú emergente con imagen](picturePopupMenu_overview.md) - [Área de Plug-in](pluginArea_overview.md) - [Indicadores de progreso](progressIndicator.md) - [Botón de opción](radio_overview.md) - [Regla](ruler.md) - [Rectángulo](shapes_overview.md#rectangle) - [Selector](spinner.md) - [Separador](splitters.md) - [Imagen estática](staticPicture.md) - [Pasos](stepper.md) - [Subformulario](subform_overview.md) - [Control de pestañas](tabControl.md) - [Área web](webArea_overview.md)
+
+#### Comandos
+
+[`OBJECT GET RESIZING OPTIONS`](../commands-legacy/object-get-resizing-options.md) - [`OBJECT SET RESIZING OPTIONS`](../commands-legacy/object-set-resizing-options.md)
+
+---
+
+## Pulsador
+
+Cuando un objeto splitter tiene esta propiedad, los otros objetos a su derecha (splitter vertical) o debajo de él (separador horizontal) son empujados al mismo tiempo que el splitter, sin parar.
+
+Este es el resultado de un separador "pusher" que se mueve:
+
+
+
+
+Cuando esta propiedad no se aplica al splitter, el resultado es el siguiente:
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :----------- | :------------: | :------------------------------------------------------------------------: |
+| splitterMode | string | "move" (pusher), "resize" (standard) |
+
+#### Objetos soportados
+
+[Separadores](splitters.md)
+
+---
+
+## Redimensionable
+
+Designa si el tamaño de la columna puede ser modificado por el usuario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :-------------- | :------------: | :--------------: |
+| redimensionable | boolean | "true", "false" |
+
+#### Objetos soportados
+
+[Columna de list box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Scale.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Scale.md
new file mode 100644
index 00000000000000..409a30134a2e23
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Scale.md
@@ -0,0 +1,149 @@
+---
+id: propertiesScale
+title: Escala
+---
+
+## Barber shop
+
+Activa la variante "barber shop" para el termómetro.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :------------: | :------------: | --------------------------------------------------------------------------------- |
+| [max](#máximo) | number | NO pasado = activado; pasado = desactivado (termómetro básico) |
+
+#### Objetos soportados
+
+[Barbería](progressIndicator.md#barber-shop)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT Get indicator type](../commands-legacy/object-get-indicator-type.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md) - [OBJECT SET INDICATOR TYPE](../commands-legacy/object-set-indicator-type.md)
+
+---
+
+## Mostrar graduación
+
+Muestra/Oculta las graduaciones junto a las etiquetas.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :-------------: | :------------: | ---------------- |
+| showGraduations | boolean | "true", "false" |
+
+#### Objetos soportados
+
+[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Paso en la graduación
+
+Medición de la visualización de la escala.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :------------: | :------------: | ------------------------- |
+| graduationStep | integer | mínimo: 0 |
+
+#### Objetos soportados
+
+[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Posición de la etiqueta
+
+Especifica la ubicación del texto mostrado de un objeto.
+
+- Ninguno - no se muestra ninguna etiqueta
+- Arriba - Muestra las etiquetas a la izquierda o sobre el indicador
+- Abajo - Muestra las etiquetas a la derecha o debajo de un indicador
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :-------------: | :------------: | ---------------------------------------- |
+| labelsPlacement | string | "none", "top", "bottom", "left", "right" |
+
+#### Objetos soportados
+
+[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Máximo
+
+Valor máximo de un indicador.
+
+- Para los steppers numéricos, esta propiedad representa los segundos cuando el objeto está asociado a un valor de tipo hora y se ignoran cuando están asociados a un valor de tipo fecha.
+- Para activar los [termómetros del Barber Shop](progressIndicator.md#barber-shop), esta propiedad debe omitirse.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :----: | :------------: | ---------------- |
+| max | number | Cualquier número |
+
+#### Objetos soportados
+
+[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md) - [Stepper](stepper.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get maximum-value](../commands-legacy/object-get-maximum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md) - [OBJECT SET MAXIMUM VALUE](../commands-legacy/object-set-maximum-value.md)
+
+---
+
+## Mínimo
+
+Valor mínimo de un indicador. Para los steppers numéricos, esta propiedad representa los segundos cuando el objeto está asociado a un valor de tipo hora y se ignoran cuando están asociados a un valor de tipo fecha.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :----: | :------------: | ---------------- |
+| min | number | Cualquier número |
+
+#### Objetos soportados
+
+[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md) - [Stepper](stepper.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md) - [OBJECT SET MINIMUM VALUE](../commands-legacy/object-set-minimum-value.md)
+
+---
+
+## Step
+
+Intervalo mínimo aceptado entre los valores durante el uso. Para los steppers numéricos, esta propiedad representa los segundos cuando el objeto está asociado a un valor de tipo hora y los días cuando está asociado a un valor de tipo fecha.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :----: | :------------: | ------------------------- |
+| step | integer | mínimo: 1 |
+
+#### Objetos soportados
+
+[Termómetro](progressIndicator.md#default-thermometer) - [Regla](ruler.md) - [Stepper](stepper.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Subform.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Subform.md
new file mode 100644
index 00000000000000..d210e1a4e5733b
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Subform.md
@@ -0,0 +1,180 @@
+---
+id: propertiesSubform
+title: Subformulario
+---
+
+---
+
+## Autorizar la eliminación
+
+Especifica si el usuario puede eliminar subregistros en un subformulario listado.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ------------------------------------------------------------------ |
+| deletableInList | boolean | true, false (por defecto: true) |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
+
+---
+
+## Formulario detallado
+
+Esta propiedad se utiliza para declarar el formulario detallado que se utilizará en el subformulario. Puede ser:
+
+- un widget, es decir, un subformulario de tipo página dotado de funciones específicas. En este caso, las propiedades [list subform](#list-form) y [Source](#source) deben estar vacías o no estar presentes.
+ Puede seleccionar un nombre de formulario de componente cuando se publica en el componente.
+
+> Para ello, basta con hacer dos clics en el campo a modificar para que pase al modo edición (asegúrese de dejar suficiente tiempo entre los dos clics para no generar un doble clic).
+
+- el formulario detallado a asociar al [subformulario listado](#formulario-de-lista). El formulario detallado puede utilizarse para introducir o ver los subregistros. Generalmente contiene más información que el subformulario lista. Naturalmente, el formulario detallado debe pertenecer a la misma tabla que el subformulario. Normalmente se utiliza un formulario de salida como formulario lista y un formulario de entrada como formulario detallado. Si no especifica el formulario a utilizar para la entrada de la página completa, 4D utiliza automáticamente el formato de entrada por defecto de la tabla.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| detailForm | string | Nombre (cadena) de la tabla o formulario proyecto, una ruta POSIX (cadena) a un archivo .json que describa el formulario, o un objeto que describa el formulario |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
+
+#### Comandos
+
+[OBJECT GET SUBFORM](../commands-legacy/object-get-subform.md) - [OBJECT SET SUBFORM](../commands-legacy/object-set-subform.md)
+
+---
+
+## Doble clic en línea vacía
+
+Acción a realizar en caso de doble clic en una línea vacía de un subformulario listado. Las siguientes opciones están disponibles:
+
+- No hacer nada (por defecto): hacer doble clic en una línea no desencadena ninguna acción automática.
+- Añadir registro: crea un nuevo registro en el subformulario y cambia al modo edición. El registro se creará directamente en la lista si la propiedad [Editable en la lista](#enterable-in-list) está activada. En caso contrario, se creará en modo página, en el [formulario detallado](#detail-form) asociado al subformulario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------------------------- | -------------- | --------------------------------- |
+| doubleClickInEmptyAreaAction | string | "addSubrecord" o "" to do nothing |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
+
+#### Ver también
+
+[Doble clic en la línea](#double-click-on-row)
+
+---
+
+## Doble clic en línea
+
+`Sub-formularios lista`
+
+Define la acción a realizar cuando un usuario haga doble clic en una línea en un subformulario lista. Las opciones disponibles son:
+
+- **No hacer nada** (por defecto): hacer doble clic en una línea no desencadena ninguna acción automática.
+- **Editar registro**: al hacer doble clic en una línea se muestra el registro correspondiente en el [formulario detallado](#detail-form) definido para el subformulario lista. El registro se abre en modo de lectura-escritura para que pueda ser modificado.
+- **Mostrar registro**: idéntica a la acción anterior, salvo que el registro se abre en modo de sólo lectura para que no pueda ser modificado.
+
+Independientemente de la acción seleccionada/elegida, se genera el evento de formulario `On Double clicked`.
+
+Para las dos últimas acciones, también se genera el evento de formulario `On Open Detail`. `On Close Detail` se genera cuando un registro mostrado en el formulario detallado asociado al list box está a punto de cerrarse (independientemente de que el registro se haya modificado o no).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------------------- | -------------- | ----------------------------------- |
+| doubleClickInRowAction | string | "editSubrecord", "displaySubrecord" |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
+
+#### Ver también
+
+[Doble clic en la fila vacía](#double-click-on-empty-row)
+
+---
+
+## Editable en lista
+
+Cuando un subformulario lista tiene esta propiedad activada, el usuario puede modificar los datos del registro directamente en la lista, sin tener que utilizar el [formulario detallado asociado](#detail-form).
+
+> Para ello, basta con hacer dos clics en el campo a modificar para que pase al modo edición (asegúrese de dejar suficiente tiempo entre los dos clics para no generar un doble clic).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ---------------- |
+| enterableInList | boolean | true, false |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
+
+---
+
+## Formulario listado
+
+Esta propiedad se utiliza para declarar el formulario listado que se utilizará en el subformulario. Un subformulario lista le permite introducir, ver y modificar datos en otras tablas.
+
+Los subformularios de lista pueden utilizarse para la entrada de datos de dos maneras: el usuario puede introducir los datos directamente en el subformulario, o introducirlos en un [formulario de entrada](#detail-form). En esta configuración, el formulario utilizado como subformulario se denomina formulario Lista. El formulario de entrada se denomina formulario detallado.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| listForm | string | Nombre (cadena) de la tabla o formulario proyecto, una ruta POSIX (cadena) a un archivo .json que describa el formulario, o un objeto que describa el formulario |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
+
+#### Comandos
+
+[OBJECT GET SUBFORM](../commands-legacy/object-get-subform.md) - [OBJECT SET SUBFORM](../commands-legacy/object-set-subform.md)
+
+---
+
+## Source
+
+Especifica la tabla a la que pertenece el subformulario Lista (si la hay).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------------------------------------------ |
+| tabla | string | Nombre de la tabla 4D, o "" si no hay tabla. |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
+
+---
+
+## Modo de selección
+
+Designa la opción para permitir a los usuarios seleccionar líneas:
+
+- **Ninguna**: las líneas no se pueden seleccionar si se elige este modo. Hacer clic en la lista no tendrá ningún efecto a menos que la opción [Editable en lista](#enterable-in-list) esté activada. Las teclas de navegación sólo hacen que la lista se desplace; no se genera el evento de formulario `On Selection Change`.
+- **Simple**: en este modo se puede seleccionar una línea a la vez. Si hace clic en una línea, la seleccionará. Un **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en una fila cambia su estado (entre seleccionado o no).
+ Las teclas de flecha arriba y abajo seleccionan el registro anterior/siguiente en la lista. Las otras teclas de navegación se desplazan por la lista. El evento de formulario `On Selection Change` se genera cada vez que se cambia la línea actual.
+- **Múltiple**: en este modo se pueden seleccionar varias líneas simultáneamente.
+ - Los subregistros seleccionados son devueltos por el comando `GET HIGHLIGHTED RECORDS`.
+ - Al hacer clic en el registro se selecciona, pero no se modifica el registro actual.
+ - Un **Ctrl+clic** (Windows) o **Comando+clic** (macOS) en un registro cambia su estado (entre seleccionado o no). Las teclas de flecha arriba y abajo seleccionan el registro anterior/siguiente en la lista. Las otras teclas de navegación se desplazan por la lista. El evento de formulario `On Selection Change` se genera cada vez que el registro seleccionado se modifica.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------------------- |
+| selectionMode | string | "multiple", "single", "none" |
+
+#### Objetos soportados
+
+[Subformulario](subform_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Text.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Text.md
new file mode 100644
index 00000000000000..2745aa87c59e22
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_Text.md
@@ -0,0 +1,547 @@
+---
+id: propertiesText
+title: Text
+---
+
+---
+
+## Autorizar selector fuente/color
+
+Cuando esta propiedad está activada, los comandos [OPEN FONT PICKER](../commands-legacy/open-font-picker.md) y [OPEN COLOR PICKER](../commands-legacy/open-color-picker.md) pueden ser invocados para mostrar las ventanas de selección de fuente y color del sistema. A través de estas ventanas, los usuarios pueden cambiar la fuente o el color de un objeto formulario que tenga el foco directamente haciendo clic. Cuando esta propiedad está desactivada (por defecto), los comandos del selector abierto no tienen efecto.
+
+#### Gramática JSON
+
+| Propiedad | Tipos de datos | Valores posibles |
+| -------------------- | -------------- | -------------------------------------------- |
+| allowFontColorPicker | boolean | false (por defecto), true |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md)
+
+---
+
+## Negrita
+
+Ajusta el texto seleccionado para que aparezca más oscuro y pesado.
+
+Puede definir esta propiedad utilizando el comando [**OBJECT SET FONT STYLE**](../commands-legacy/object-set-font-style.md).
+
+> Este es un texto normal.
+> **Esto es texto en negrita.**
+
+#### Gramática JSON
+
+| Propiedad | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------- |
+| fontWeight | text | "normal", "bold" |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get font style](../commands-legacy/object-get-font-style.md) - [OBJECT SET FONT STYLE](../commands-legacy/object-set-font-style.md)
+
+---
+
+## Itálica
+
+Hace que el texto seleccionado se incline ligeramente hacia la derecha.
+
+También puede definir esta propiedad por medio del comando [**OBJECT SET FONT STYLE**](../commands-legacy/object-set-font-style.md).
+
+> Este es un texto normal.
+> *Este texto está en cursiva.*
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | ------------------ |
+| fontStyle | string | "normal", "italic" |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get font style](../commands-legacy/object-get-font-style.md) - [OBJECT SET FONT STYLE](../commands-legacy/object-set-font-style.md)
+
+---
+
+## Subrayado
+
+Hace que el texto tenga una línea por debajo.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | --------------------- |
+| textDecoration | string | "normal", "underline" |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get font style](../commands-legacy/object-get-font-style.md) - [OBJECT SET FONT STYLE](../commands-legacy/object-set-font-style.md)
+
+---
+
+## Fuente
+
+Esta propiedad permite indicar el **tema de la fuente** o la **familia de fuente** utilizada en el objeto.
+
+> Las propiedades **Tema de la fuente** y de la **familia de la fuente** son mutuamente excluyentes. Un tema de fuente se encarga de los atributos de fuente, incluido el tamaño. Una familia de fuentes permite definir el nombre, el tamaño y el color de la fuente.
+
+### Tema de fuente
+
+La propiedad de tema de fuente designa un nombre de estilo automático. Los estilos automáticos determinan de forma dinámica la familia de fuentes, el tamaño y el color de la fuente que se utilizará para el objeto, según los parámetros sistema. Estos parámetros dependen de:
+
+- la plataforma,
+- el lenguaje del sistema,
+- y el tipo de objeto de formulario.
+
+Con el tema de fuente, se garantiza que los títulos se muestren siempre de acuerdo con los estándares actuales de la interfaz del sistema. Sin embargo, su tamaño puede variar de una máquina a otra.
+
+Hay tres temas de fuentes disponibles:
+
+- **normal**: estilo automático, aplicado por defecto a todo nuevo objeto creado en el editor de formularios.
+- Los temas de fuentes **principales** y **suplementarios** solo son soportados por las [áreas de texto](text.md) y las [áreas de entrada](input_overview.md). Estos temas están pensados principalmente para diseñar cajas de diálogo. Se refieren a los estilos de fuente utilizados, respectivamente, para el texto principal y la información adicional en las ventanas de su interfaz. A continuación se muestran las cajas de diálogo típicas (macOS y Windows) que utilizan estos temas de fuentes:
+
+
+
+> Los temas de fuentes gestionan la fuente, así como su tamaño y color. Puede aplicar propiedades de estilo personalizadas (Negrita, Cursiva o Subrayado) sin alterar su funcionamiento.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | ------------------------------ |
+| fontTheme | string | "normal", "main", "additional" |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get style sheet](../commands-legacy/object-get-style-sheet) - [OBJECT SET STYLE SHEET](../commands-legacy/object-set-style-sheet)
+
+### Familia de fuentes
+
+Hay dos tipos de nombres de familias de fuentes:
+
+- *family-name:* El nombre de una familia de fuentes, como "times", "courier", "arial", etc.
+- *generic-family:* El nombre de una familia genérica, como "serif", "sans-serif", "cursive", "fantasy", "monospace".
+
+Puede configurarlo utilizando el comando [`OBJECT SET FONT`](../commands-legacy/object-set-font.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ----------------------------------- |
+| fontFamily | string | Nombre de la familia de fuentes CSS |
+
+> 4D recomienda utilizar sólo fuentes [seguras para la web](https://www.w3schools.com/cssref/css_websafe_fonts.asp).
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get font](../commands-legacy/object-get-font.md) - [OBJECT SET FONT](../commands-legacy/object-set-font.md)
+
+## Tamaño fuente
+
+Permite definir el tamaño de la fuente del objeto en puntos.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------- | -------------- | -------------------------------------------------------------------------- |
+| fontSize | integer | Tamaño de letra en puntos. Valor mínimo: 0 |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Botón de opción](radio_overview.md) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get font size](../commands-legacy/object-get-font-size.md) - [OBJECT SET FONT SIZE](../commands-legacy/object-set-font-size.md)
+
+---
+
+## Color de fuente
+
+Designa el color de la fuente.
+
+> Esta propiedad también define el color del borde del objeto (si existe) cuando se utiliza el estilo "plano" o "punteado".
+
+El color puede ser especificado por:
+
+- un nombre de color - como "red"
+- un valor HEX - como "# ff0000"
+- un valor RVB - como "rgb (255,0,0)"
+
+También puede definir esta propiedad utilizando el comando [**OBJECT SET RGB COLORS**](../commands-legacy/object-set-rgb-colors.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ---------------------------------------- |
+| stroke | string | un valor css, "transparent", "automatic" |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) - [Combo Box](comboBox_overview.md) - [Lista desplegable](dropdownList_Overview.md) - [Group Box](groupBox.md) - [Lista jerárquica](list_overview.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna de List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado de List Box](listbox_overview.md#list-box-headers) - [Indicadores de progreso](progressIndicator.md) - [Regla](ruler.md) - [Botón radio](radio_overview.md) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT GET RGB COLORS](../commands-legacy/object-get-rgb-colors.md) - [OBJECT SET RGB COLORS](../commands-legacy/object-set-rgb-colors.md)
+
+---
+
+## Expresión color fuente
+
+`List box de tipo colección/selección de entidades`
+
+Se utiliza para aplicar un color de fuente personalizado a cada línea del list box. Debe utilizar valores de color RGB. Para más información, consulte la descripción del comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
+
+Debe introducir una expresión o una variable (no se pueden utilizar variables de tipo array). La expresión o variable se evaluará para cada línea mostrada. Puede utilizar las constantes descritas en el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md).
+
+También puede establecer esta propiedad utilizando el comando [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md) con la constante `lk font color expression`.
+
+> Esta propiedad también puede definirse mediante una [Expresión Meta Info](properties_Text.md#meta-info-expression).
+
+El siguiente ejemplo utiliza un nombre de variable: introduzca *CompanyColor* para la **Expresión color fuente** y, en el método formulario, escriba el siguiente código:
+
+```4d
+CompanyColor:=Choose([Companies]ID;Background color;Light shadow color;
+Foreground color;Dark shadow color)
+```
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ---------------------- |
+| rowStrokeSource | string | Expresión color fuente |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Style Expression {#style-expression}
+
+`List box de tipo colección/selección de entidades`
+
+Utilizado para aplicar un estilo de fuente personalizado a cada línea de list box o de cada celda de la columna.
+
+Debe introducir una expresión o una variable (no se pueden utilizar variables de tipo array). La expresión o variable se evaluará para cada línea mostrada (si se aplica al list box) o cada celda mostrada (si se aplica a una columna). Puede usar las constantes listadas en el comando [`LISTBOX SET ROW FONT STYLE`](../commands-legacy/listbox-set-row-font-style.md).
+
+Ejemplo:
+
+```4d
+Choose([Companies]ID;Bold;Plain;Italic;Underline)
+```
+
+También puede establecer esta propiedad utilizando el comando [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md) con la constante `lk font style expression`.
+
+> Esta propiedad también puede definirse mediante una [Expresión Meta Info](properties_Text.md#meta-info-expression).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | -------------------------------------------------------------------- |
+| rowStyleSource | string | Expresión de estilo a evaluar para cada línea/celda. |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Alineación horizontal
+
+Ubicación horizontal del texto dentro del área que lo contiene.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | ------------------------------------------------- |
+| textAlign | string | "right", "center", "left", "automatic", "justify" |
+
+:::note
+
+- "automatic" no es compatible con [casillas de selección](checkbox_overview.md) y [botones radio](radio_overview.md)
+- "justify" sólo es compatible con las [entradas ](input_overview.md) y [áreas de texto](text.md)
+
+:::
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Casilla de verificación](checkbox_overview.md) (todos los estilos excepto Regular y Plano) - [Combo Box](comboBox_overview.md) - [Lista desplegables](dropdownList_Overview.md) - [Caja de grupo](groupBox.md) - [Entrada](input_overview.md) - [List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Pie List Box](listbox_overview.md#list-box-footers) - [Botón de opción](radio_overview.md) (todos los estilos excepto Regular y Plano) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get horizontal alignment](../commands-legacy/object-get-horizontal-alignment.md) - [OBJECT SET HORIZONTAL ALIGNMENT](../commands-legacy/object-set-horizontal-alignment.md)
+
+---
+
+## Alineamiento vertical
+
+Ubicación vertical del texto dentro del área que lo contiene.
+
+La opción **Predeterminado** (`automático` valor JSON) define la alineación según el tipo de datos que se encuentran en cada columna:
+
+- `abajo` para todos los datos (excepto las imágenes) y
+- `arriba` para los datos del tipo imagen.
+
+Esta propiedad también puede ser manejada por los comandos [`OBJECT Get vertical alignment`](../commands-legacy/object-get-vertical-alignment.md) y [`OBJECT SET VERTICAL ALIGNMENT`](../commands-legacy/object-set-vertical-alignment.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | -------------------------------------- |
+| verticalAlign | string | "automatic", "top", "middle", "bottom" |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns) - [Pie de List Box](listbox_overview.md#list-box-footers) - [Encabezado List Box](listbox_overview.md#list-box-headers)
+
+#### Comandos
+
+[`OBJECT Get vertical alignment`](../commands-legacy/object-get-vertical-alignment.md) - [`OBJECT SET VERTICAL ALIGNMENT`](../commands-legacy/object-set-vertical-alignment.md)
+
+---
+
+## Meta Info expression
+
+`List boxes de tipo Collection o entity selection`
+
+Indica una expresión o una variable que se evaluará para cada línea mostrada. Permite definir todo un conjunto de atributos texto de las líneas. Debe pasar una **variable objeto** o una **expresión que devuelva un objeto**. Se soportan las siguientes propiedades:
+
+| Nombre de propiedad | Tipo | Descripción |
+| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| stroke | string | Color de la fuente. Todo color CSS (por ejemplo: "#FF00FF"), "automatic", "transparent" |
+| fill | string | Color de fondo. Todo color CSS (por ejemplo: "#F00FFF"), "automatic", "transparent" |
+| fontStyle | string | "normal","italic" |
+| fontWeight | string | "normal","bold" |
+| textDecoration | string | "normal","underline" |
+| unselectable | boolean | Designa la línea correspondiente como no seleccionable (\* es decir, \*, no es posible el resaltado). Las áreas que se pueden introducir ya no se pueden introducir si esta opción está activada, a menos que la opción "Edición con un solo clic" también esté activada. Los controles como las casillas de selección y las listas siguen siendo funcionales. Esta configuración se ignora si el modo de selección del list box es "Ninguno". Valores por defecto: False. |
+| disabled | boolean | Desactiva la línea correspondiente. Las áreas editables ya no son accesibles si esta opción está activada. Texto y controles (casillas de verificación, listas, etc.) aparecen atenuados o desactivados. Valores por defecto: False. |
+
+La propiedad especial "cell" permite aplicar un conjunto de propiedades a una sola columna:
+
+| Nombre de propiedad | | | Tipo | Descripción |
+| ------------------- | ------------ | -------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| cell | | | object | Propiedades aplicables a una o varias columnas |
+| | *columnName* | | object | *columnName* es el nombre del objeto de la columna del list box |
+| | | *propertyName* | string | las propiedades "stroke", "fill", "fontStyle", "fontWeight" o "textDecoration" (ver arriba). **Nota**: las propiedades "no seleccionable" y "desactivada" sólo pueden definirse a nivel de la línea. Se ignoran si se pasan en el objeto "celda" |
+
+> Los ajustes de estilo hechos con esta propiedad son ignorados si otros ajustes de estilo ya están definidos a través de expresiones (\*por ejemplo, [Expresión de estilo](#style-expression), [Expresión de color de fuente](#font-color-expression), [Expresión de color de fondo](./properties_BackgroundAndBorder.md#background-color-expression)).
+
+**Ejemplos**
+
+En un método proyecto *Color*, escriba el siguiente código:
+
+```4d
+//Método Color
+//Define el color de la fuente para ciertas líneas y el color de fondo para las columnas Col2 y Col3
+Form.meta:=New object
+If(This.ID<5) //ID es un atributo de los objetos/entidades de la colección
+ Form.meta.stroke:="purple"
+ Form.meta.cell:=New object("Col2";New object("fill";"black");\
+ "Col3";New object("fill";"red"))
+Else
+ Form.meta.stroke:="orange"
+End if
+```
+
+**Buenas prácticas:** por razones de optimización, normalmente se recomienda crear el objeto `meta.cell` una vez en el método del formulario:
+
+```4d
+ //método formulario
+ Case of
+ :(Form event code=On Load)
+ Form.colStyle:=New object("Col2";New object("fill";"black");\
+ "Col3";New object("fill";"red"))
+ // también puede definir otros conjuntos de estilos
+ Form.colStyle2:=New object("Col2";New object("fill";"green");\
+ "Col3";New object("fontWeight";"bold"))
+ End case
+```
+
+Entonces, el método *Color* contendría:
+
+```4d
+ //Método Color
+ ...
+ If(This.ID>5)
+ Form.meta.stroke:="purple"
+ Form.meta.cell:=Form.colStyle //reuse el mismo objeto para un mejor rendimiento
+ Else
+ Form.meta.stroke:="orange"
+ Form.meta.cell:=Form.colStyle2
+ End if
+ ...
+```
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | -------------------------------------------------------------------- |
+| metaSource | string | Expresión de objeto a evaluar para cada línea/celda. |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md)
+
+---
+
+## Multistyle
+
+Esta propiedad permite la posibilidad de usar [estilos específicos](https://doc.4d.com/4Dv20/4D/20.6/Supported-tags.300-7488021.en.html) en el área seleccionada. Cuando esta opción está marcada, 4D interpreta todas las etiquetas ` HTML` presentes en el área.
+
+Por defecto, esta opción no está activa.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ---------------- |
+| styledText | boolean | true, false |
+
+#### Objetos soportados
+
+[Área de entrada](input_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[LISTBOX Get property](../commands/listbox-get-property.md) - [LISTBOX SET PROPERTY](../commands/listbox-set-property.md) - [OBJECT Is styled text](../commands-legacy/object-is-styled-text.md) -
+
+---
+
+## Orientación
+
+Modifica la orientación (rotación) de un área de texto. Las áreas de texto pueden girarse en incrementos de 90°. Cada valor de orientación se aplica manteniendo el mismo punto de partida inferior izquierdo para el objeto:
+
+| Valor de orientación | Resultado |
+| ---------------------------------- | ---------------------------------------------- |
+| 0 (por defecto) |  |
+| 90 |  |
+| 180 |  |
+| 270 |  |
+
+Además de [áreas de texto estáticas](text.md), los objetos de texto de las [áreas de entrada](input_overview.md) pueden girar cuando no son[editables](properties_Entry.md#enterable). Cuando se aplica una propiedad de rotación a un objeto de entrada, se elimina la propiedad editable (si la hay). Este objeto se excluye entonces del orden de entrada.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | ---------------- |
+| textAngle | number | 0, 90, 180, 270 |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md) (no editable) - [Área de texto](text.md)
+
+#### Comandos
+
+[OBJECT Get text orientation](../commands-legacy/object-get-text-orientation.md) - [OBJECT SET TEXT ORIENTATION](../commands-legacy/object-set-text-orientation.md)
+
+---
+
+## Row Font Color Array {#row-font-color-array}
+
+`List boxes de tipo array`
+
+Permite definir un color de fuente personalizado para cada línea del list box o celda de la columna.
+
+Se debe utilizar el nombre de un array Entero largo. Cada elemento de este array corresponde a una línea del list box (si se aplica al list box) o a una celda de la columna (si se aplica a una columna), por lo que el array debe tener el mismo tamaño que el array asociado a la columna. Puede utilizar las constantes descritas en el comando [`OBJECT SET RGB COLORS`](../commands-legacy/object-set-rgb-colors.md). Si desea que la celda herede el color de fondo definido en el nivel superior, pase el valor -255 al elemento del array correspondiente.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------------- | -------------- | ---------------------------------- |
+| rowStrokeSource | string | El nombre de un array entero largo |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[`LISTBOX Get array`](../commands-legacy/listbox-get-array.md) - [`LISTBOX GET ARRAYS`](../commands-legacy/listbox-get-arrays.md) - [`LISTBOX SET ARRAY`](../commands-legacy/listbox-set-array.md)
+
+---
+
+## Row Style Array {#row-style-array)
+
+`List boxes de tipo array`
+
+Permite definir un estilo de fuente personalizado para cada línea del list box o cada celda de la columna.
+
+Se debe utilizar el nombre de un array Entero largo. Cada elemento de este array corresponde a una línea del list box (si se aplica al list box) o a una celda de la columna (si se aplica a una columna), por lo que el array debe tener el mismo tamaño que el array asociado a la columna. Para llenar la matriz (utilizando un método), utilice las constantes enumeradas en el comando [`LISTBOX SET ROW FONT STYLE`](../commands-legacy/listbox-set-row-font-style.md). Se pueden añadir constantes para combinar estilos. Si desea que la celda herede el estilo definido en el nivel superior, pase el valor -255 al elemento del array correspondiente.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | --------------------------------------------------- |
+| rowStyleSource | string | El nombre de un array entero largo. |
+
+#### Objetos soportados
+
+[List Box](listbox_overview.md) - [Columna List Box](listbox_overview.md#list-box-columns)
+
+#### Comandos
+
+[`LISTBOX Get array`](../commands-legacy/listbox-get-array.md) - [`LISTBOX GET ARRAYS`](../commands-legacy/listbox-get-arrays.md) - [`LISTBOX SET ARRAY`](../commands-legacy/listbox-set-array.md)
+
+---
+
+## Almacenar con etiquetas de estilo por defecto
+
+Esta propiedad sólo está disponible para un área de entrada [Multi-estilo](#multi-estilo).
+Cuando esta propiedad está activada, el área almacenará las etiquetas de estilo con el texto, incluso si no se ha realizado ninguna modificación. En este caso, las etiquetas corresponden al estilo por defecto. Cuando esta propiedad está desactivada, sólo se almacenan las etiquetas de estilo modificadas.
+
+Por ejemplo, este es un texto que incluye una modificación de estilo:
+
+
+
+Cuando la propiedad está desactivada, el área sólo almacena la modificación. Por lo tanto, los contenidos almacenados son:
+
+```
+¡Qué hermoso día!
+```
+
+Cuando la propiedad está activa, el área almacena toda la información de formato. La primera etiqueta genérica describe el estilo por defecto y luego cada variación es objeto de un par de etiquetas anidadas. Por lo tanto, los contenidos almacenados en el área son:
+
+```
+¡Qué hermoso día!
+```
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------- | -------------- | ------------------------------------------------------------- |
+| storeDefaultStyle | boolean | true, false (por defecto). |
+
+#### Objetos soportados
+
+[Entrada](input_overview.md)
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_TextAndPicture.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_TextAndPicture.md
new file mode 100644
index 00000000000000..a226a6bb32e8fc
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_TextAndPicture.md
@@ -0,0 +1,308 @@
+---
+id: propertiesTextAndPicture
+title: Texto e Imagen
+---
+
+## Ruta de acceso fondo
+
+Define la ruta de la imagen que se dibujará en el fondo del objeto. Si el objeto utiliza un [icono](#picture-pathname) con [diferentes estados](#number-of-states), la imagen de fondo soportará automáticamente el mismo número de estados.
+
+El nombre de la ruta a introducir es similar al de [la propiedad Ruta de acceso para las imágenes estáticas](properties_Picture.md#pathname).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ----------------------- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
+| customBackgroundPicture | string | Ruta relativa en sintaxis POSIX. Debe utilizarse junto con la opción "Personalizado" de la propiedad "Style". |
+
+#### Objetos soportados
+
+[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Estilos de botón
+
+Aspecto general del botón. El estilo del botón también influye en la disponibilidad de ciertas opciones.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :----: | :------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| style | text | "regular", "flat", "toolbar", "bevel", "roundedBevel", "gradientBevel", "texturedBevel", "office", "help", "circular", "disclosure", "roundedDisclosure", "custom" |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) - [Botón radio](radio_overview.md) - [Casilla de selección](checkbox_overview.md) - [Botón Radio](radio_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Margen horizontal
+
+Esta propiedad permite definir el tamaño (en píxeles) de los márgenes horizontales del botón. Este margen delimita el área que el icono del botón y el título no deben sobrepasar.
+
+Este parámetro es útil, por ejemplo, cuando la imagen de fondo contiene bordes:
+
+| Con / Sin | Ejemplo |
+| ------------------------ | ------------------------------------------------------------ |
+| Sin margen |  |
+| Con un margen 13 píxeles |  |
+
+> Esta propiedad funciona junto con la propiedad [Margen vertical](#vertical-margin).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------------------------------------------------------------------------- |
+| customBorderX | number | Para usar con el estilo "personalizado". Mínimo: 0 |
+
+#### Objetos soportados
+
+[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Ubicación del icono
+
+Designa la ubicación de un icono en relación con el objeto formulario.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ----------------------- |
+| iconPlacement | string | "none", "left", "right" |
+
+#### Objetos soportados
+
+[Encabezado de List Box](listbox_overview.md#list-box-headers)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Desplazamiento icono
+
+Define un valor de desplazamiento personalizado en píxeles, que se utilizará cuando se haga clic en el botón
+
+El título del botón se desplazará hacia la derecha y hacia la parte inferior por el número de píxeles introducidos. Esto permite aplicar un efecto 3D personalizado cuando se presiona el botón.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------ | -------------- | ------------------------- |
+| customOffset | number | mínimo: 0 |
+
+#### Objetos soportados
+
+[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Número de estados
+
+Esta propiedad define el número exacto de estados presentes en la imagen utilizada como icono para un [botón con icono](button_overview.md), una [casilla de selección](checkbox_overview.md) o un [botón radio](radio_overview.md) personalizado.
+
+La imagen puede contener de 2 a 6 estados.
+
+- 2 estados: false, true
+- 3 estados: false, true, rollover,
+- 4 estados: false, true, rollover, desactivado,
+- 5 estados (sólo para casillas de verificación y botones radio): false, true, rollover false, rollover true, desactivado
+- 6 estados (sólo para casillas de verificación y botones radio): false, true, false rollover, true rollover, false desactivado, true desactivado.
+
+:::note
+
+- "false" significa botón no presionado/no seleccionado o casilla desmarcada (valor de la variable=0)
+- "true" significa botón presionado/seleccionado o casilla marcada (valor de la variable=1)
+
+:::
+
+Cada estado está representado por una imagen diferente. En la imagen fuente, los estados deben apilarse verticalmente:
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ---------- | -------------- | ----------------------------------------------------------------------------------- |
+| iconFrames | number | Número de estados en la imagen del icono. Mínimo: 1 |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) (todos los estilos excepto [Ayuda](button_overview.md#help)) - [Casilla de selección](checkbox_overview.md) - [Botón radio](radio_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Ruta de acceso de la imagen
+
+Define la ruta de la imagen que se utilizará como icono del objeto.
+
+El nombre de la ruta a introducir es similar al de [la propiedad Ruta de acceso para las imágenes estáticas](properties_Picture.md#pathname).
+
+> Cuando se utiliza como icono de objetos activos, la imagen debe estar diseñada para soportar un [número de estados](#number-of-states) variable.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------ | -------------- | ------------------------------------------------------------- |
+| icon | picture | Ruta relativa o filesystem en sintaxis POSIX. |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) (todos los estilos excepto [Ayuda](button_overview.md#help)) - [Casilla de selección](checkbox_overview.md) - [Encabezado List Box](listbox_overview.md#list-box-headers) - [Botón radio](radio_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Posición título/imagen
+
+Esta propiedad permite modificar la ubicación relativa del título del botón en relación con el icono asociado. Esta propiedad no tiene efecto cuando el botón sólo contiene un título (sin imagen asociada) o una imagen (sin título). Por defecto, cuando un botón contiene un título y una imagen, el texto se coloca debajo de la imagen.
+
+Aquí están los resultados utilizando las distintas opciones para esta propiedad:
+
+| Option | Descripción | Ejemplo |
+| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
+| **Izquierda** | El texto se coloca a la izquierda del icono. El contenido del botón se alinea a la derecha. |  |
+| **Arriba** | El texto se coloca debajo del icono. El contenido del botón está centrado. |  |
+| **Derecha** | El texto se coloca a la derecha del icono. El contenido del botón se alinea a la izquierda. |  |
+| **Abajo** | El texto se coloca sobre el icono. El contenido del botón está centrado. |  |
+| **Centrado** | El texto del icono está centrado vertical y horizontalmente en el botón. Este parámetro es útil, por ejemplo, para el texto incluido en un icono. |  |
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ------------------------------------------ |
+| textPlacement | string | "left", "top", "right", "bottom", "center" |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) (todos los estilos excepto [Ayuda](button_overview.md#help)) - [Casilla de selección](checkbox_overview.md) - [Botón radio](radio_overview.md)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Posición título imagen
+
+Esta propiedad permite definir si el título y la imagen del botón deben estar visualmente contiguos o separados, según las propiedades [Posición del título/imagen](#titlepicture-position) y [Alineación horizontal](properties_Text.md#horizontal-alignment).
+
+Esta propiedad no tiene efecto cuando el botón sólo contiene un título (sin imagen asociada) o una imagen (sin título).
+
+Por defecto, cuando un botón contiene un título y una imagen, los elementos se unen. El siguiente gráfico muestra el efecto de la propiedad `imageHugsTitle` (true cuando la propiedad está activada) con diferentes alineaciones de los botones:
+
+
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | -------------------------------------------- |
+| imageHugsTitle | boolean | true (por defecto), false |
+
+#### Objetos soportados
+
+[Botón](button_overview.md) (todos los estilos excepto Ayuda) - [Casilla de verificación](checkbox_overview.md) (todos los estilos excepto Normal, Plano, Revelar y Contraer/Expandir) - [Botón de radio](radio_overview.md) (todos los estilos excepto Normal, Plano, Revelar y Contraer/Expandir).
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Margen vertical
+
+Esta propiedad permite definir el tamaño (en píxeles) de los márgenes verticales del botón. Este margen delimita el área que el icono del botón y el título no deben sobrepasar.
+
+Este parámetro es útil, por ejemplo, cuando la imagen de fondo contiene bordes.
+
+> Esta propiedad funciona junto con la propiedad [Margen horizontal](#horizontal-margin).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| ------------- | -------------- | ---------------------------------------------------------------------------------- |
+| customBorderY | number | Para usar con el estilo "personalizado". Mínimo: 0 |
+
+#### Objetos soportados
+
+[Botón personalizado](button_overview.md#custom) - [Casilla de selección personalizada](checkbox_overview.md#custom) - [Botón radio personalizado](radio_overview.md#custom)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
+---
+
+## Con menú pop-up
+
+Esta propiedad permite mostrar un símbolo que aparece como un triángulo en el botón para indicar la presencia de un menú emergente adjunto:
+
+
+
+La apariencia y ubicación de este símbolo depende del estilo del botón y de la plataforma actual.
+
+### Vinculados y separados
+
+Para asociar un símbolo de menú emergente a un botón, hay dos opciones de visualización disponibles:
+
+| Enlazado | Separado |
+| :-----------------------------------------------------: | :--------------------------------------------------------: |
+|  |  |
+
+> La disponibilidad efectiva de un modo "separado" depende del estilo del botón y de la plataforma.
+
+Cada opción precisa la relación entre el botón y el menú emergente asociado:
+
+- Cuando el menú emergente está **separado**, al hacer clic en la parte izquierda del botón se ejecuta directamente la acción actual del botón; esta acción puede modificarse mediante el menú emergente accesible en la parte derecha del botón.
+- Cuando el menú emergente está **vinculado**, un simple clic en el botón sólo muestra el menú emergente. Sólo la selección de la acción en el menú emergente provoca su ejecución.
+
+:::info
+
+Consulte la descripción del evento [`On Alternative Click`](../Events/onAlternativeClick.md) para más información sobre la gestión de eventos en este caso.
+
+:::
+
+### Gestión del menú emergente
+
+Es importante señalar que la propiedad "Con menú emergente" sólo gestiona el aspecto gráfico del botón. La visualización del menú emergente y sus valores deben ser manejados enteramente por el desarrollador, más particularmente utilizando los comandos [`form events`](../Events/overview.md) y [`Dynamic pop up menu`](../commands-legacy/dynamic-pop-up-menu.md) y [`Pop up menu`](../commands-legacy/pop-up-menu.md).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| :------------- | -------------- | ---------------------------------------------------- |
+| popupPlacement | string |
"none"
"linked"
"separated"
|
+
+#### Objetos soportados
+
+[Botón de barra de herramientas](button_overview.md#toolbar) - [Botón biselado](button_overview.md#bevel) - [Botón biselado redondeado](button_overview.md#rounded-bevel) - [Botón de degradado OS X](button_overview.md#os-x-gradient) - [Botón con textura OS X](button_overview.md#os-x-textured) - [Botón Office XP](button_overview.md#office-xp) - [Botón circular](button_overview.md#circle) - [Personalizado](button_overview.md#custom)
+
+#### Comandos
+
+[OBJECT Get format](../commands-legacy/object-get-format.md) [OBJECT Get minimum-value](../commands-legacy/object-get-minimum-value.md) - [OBJECT SET FORMAT](../commands-legacy/object-set-format.md)
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_WebArea.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_WebArea.md
new file mode 100644
index 00000000000000..01248476c89f34
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/properties_WebArea.md
@@ -0,0 +1,113 @@
+---
+id: propertiesWebArea
+title: Área Web
+---
+
+---
+
+## Acceder a los métodos 4D
+
+Puede llamar a métodos 4D y funciones de clase desde el código JavaScript ejecutado en un área Web y obtener valores a cambio. Para poder llamar a los métodos 4D desde un área Web, debe activar la propiedad de accesibilidad de los métodos 4D ("todos").
+
+> Esta propiedad sólo está disponible si el área web [utiliza el motor de renderizado web integrado](properties_WebArea.md#use-embedded-web-rendering-engine).
+
+Cuando esta propiedad está activada, se instancia un objeto JavaScript especial llamado `$4d`en el área web, que puede [utilizar para gestionar las llamadas a los métodos proyecto y funciones 4D](webArea_overview.md#4d-object).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------------- | -------------- | ---------------------------------------------- |
+| methodsAccessibility | string | "none" (por defecto), "all" |
+
+#### Objetos soportados
+
+[Área web](webArea_overview.md)
+
+---
+
+## Variable Progression
+
+Nombre de una variable de tipo Longint. Esta variable recibirá un valor entre 0 y 100, que representa el porcentaje de finalización de la carga de la página en el área web. Actualizado automáticamente por 4D, no puede ser modificado manualmente.
+
+> A partir de 4D v19 R5, esta variable solo se actualiza en Windows si el área Web [utiliza el motor de renderizado Web anidado](properties_WebArea.md#use-embedded-web-rendering-engine).
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| -------------- | -------------- | ------------------------------ |
+| progressSource | string | Nombre de una variable Longint |
+
+#### Objetos soportados
+
+[Área web](webArea_overview.md)
+
+---
+
+## URL
+
+La variable URL es de tipo cadena. Contiene la URL cargada o que está siendo cargada por el área web asociada. La asociación entre la variable y el área web funciona en ambas direcciones:
+
+- Si el usuario asigna una nueva URL a la variable, esta URL es cargada automáticamente por el área web.
+- Toda la navegación que se realice dentro del área web actualizará automáticamente el contenido de la variable.
+
+Esquemáticamente, esta variable funciona como el área de direcciones de un navegador web. Puede representarlo a través de un área de texto sobre el área Web.
+
+### Variable URL y comando WA OPEN URL
+
+La variable URL produce los mismos efectos que el comando [`WA OPEN URL`](../commands-legacy/wa-open-url.md). No obstante, hay que señalar las siguientes diferencias:
+
+- Para el acceso a los documentos, esta variable sólo acepta URLs que cumplan con el RFC ("file://c:/My%20Doc") y no los nombres de ruta del sistema ("c:\MyDoc"). El comando [`WA OPEN URL`](../commands-legacy/wa-open-url.md) acepta ambas notaciones.
+- Si la variable URL contiene una cadena vacía, el área web no intenta cargar la URL. El comando [`WA OPEN URL`](../commands-legacy/wa-open-url.md) genera un error en este caso.
+- Si la variable URL no contiene un protocolo (http, correo, archivo, etc.), el área web añade "http://", lo cual no es el caso del comando [`WA OPEN URL`](../commands-legacy/wa-open-url.md).
+- Cuando el área Web no se muestra en el formulario (cuando se encuentra en otra página del formulario), la ejecución del comando [`WA OPEN URL`](../commands-legacy/wa-open-url.md) no tiene ningún efecto, mientras que la asignación de un valor a la variable URL puede utilizarse para actualizar la URL actual.
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | ------------------------ |
+| urlSource | string | Una URL. |
+
+#### Objetos soportados
+
+[Área web](webArea_overview.md)
+
+#### Comandos
+
+[`WA GET PREFERENCE`](../commands-legacy/wa-get-preference.md) - [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md)
+
+---
+
+## Utilizar el motor de renderizado web integrado
+
+Esta opción permite elegir entre dos motores de renderizado para el área web, dependiendo de las particularidades de su aplicación:
+
+- **no marcado** - `valor JSON: sistema` (por defecto): en este caso, 4D utiliza el "mejor" motor correspondiente al sistema. Esto significa que usted se beneficia automáticamente de los últimos avances en la renderización web, a través de HTML5 o JavaScript. Sin embargo, es posible que note algunas diferencias de renderizado entre plataformas. En Windows, 4D utiliza Microsoft Edge WebView2. En macOS, 4D utiliza la versión actual de WebKit (Safari).
+
+> En Windows, si Microsoft Edge WebView2 no está instalado, 4D utiliza el motor integrado como motor de renderizado del sistema. Para saber si está instalado en su sistema, busque "Microsoft Edge WebView2 Runtime" en su panel de aplicaciones.
+
+- **marcado** - `valor JSON: anidado`: en este caso, 4D utiliza Chromium Embedded Framework (CEF). La utilización del motor web integrado significa que la representación de las áreas web y su funcionamiento en su aplicación son idénticos independientemente de la plataforma utilizada para ejecutar 4D (no obstante, pueden observarse ligeras variaciones de píxeles o diferencias relacionadas con la implementación de la red). La utilización del motor web integrado significa que la representación de las áreas web y su funcionamiento en su aplicación son idénticos independientemente de la plataforma utilizada para ejecutar 4D (no obstante, pueden observarse ligeras variaciones de píxeles o diferencias relacionadas con la implementación de la red).
+
+El motor CEF tiene las siguientes limitaciones:
+
+- [WA SET PAGE CONTENT](../commands-legacy/wa-set-page-content.md): el uso de este comando requiere que al menos una página ya esté cargada en el área (mediante una llamada a [`WA OPEN URL`](../commands-legacy/wa-open-url.md) o una asignación a la variable URL asociada al área).
+- Cuando se habilita soltar URL mediante el selector `WA enable URL drop` del comando [WA SET PREFERENCE](../commands-legacy/wa-set-preference.md), la primera caída debe ir precedida de al menos una llamada a [WA OPEN URL](../commands-legacy/wa-open-url.md) o una asignación a la variable URL asociada al área.
+
+:::note
+
+Puede personalizar los parámetros del área de CEF creando un [archivo de configuración 4DCEFParameters.json] local (webArea_overview.md#4dcefparametersjson).
+
+:::
+
+#### Gramática JSON
+
+| Nombre | Tipos de datos | Valores posibles |
+| --------- | -------------- | -------------------- |
+| webEngine | string | "embedded", "system" |
+
+#### Objetos soportados
+
+[Área web](webArea_overview.md)
+
+#### Comandos
+
+[`WA GET PREFERENCE`](../commands-legacy/wa-get-preference.md) - [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md)
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/radio_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/radio_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/radio_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/radio_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/ruler.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/ruler.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/ruler.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/ruler.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/shapes_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/shapes_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/shapes_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/shapes_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/spinner.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/spinner.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/spinner.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/spinner.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/splitters.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/splitters.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/splitters.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/splitters.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/staticPicture.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/staticPicture.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/staticPicture.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/staticPicture.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/stepper.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/stepper.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/stepper.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/stepper.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/subform_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/subform_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/subform_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/subform_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/tabControl.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/tabControl.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/tabControl.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/tabControl.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/text.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/text.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/text.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/text.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/viewProArea_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/viewProArea_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/viewProArea_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/viewProArea_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/webArea_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/webArea_overview.md
new file mode 100644
index 00000000000000..deebe6ce0e1e73
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/webArea_overview.md
@@ -0,0 +1,347 @@
+---
+id: webAreaOverview
+title: Área Web
+---
+
+Las áreas web pueden mostrar varios tipos de contenido web dentro de sus formularios: páginas HTML con contenidos estáticos o dinámicos, archivos, imágenes, JavaScript, etc. El motor de renderizado del área web depende de la plataforma de ejecución de la aplicación y de la [opción motor de renderizado](properties_WebArea.md#use-embedded-web-rendering-engine) seleccionada.
+
+Es posible crear varias áreas web en el mismo formulario. Tenga en cuenta, sin embargo, que el uso de las áreas web debe seguir [varias reglas](#web-area-rules).
+
+Varias [acciones estándar](#standard-actions) dedicadas, numerosos [comandos de lenguaje](../category/web-area) así como [eventos de formulario](#form-events) genéricos y específicos permiten al desarrollador controlar el funcionamiento de las áreas web. Se pueden utilizar variables específicas para intercambiar información entre el área y el entorno 4D.
+
+:::info Displaying Qodly pages
+
+In 4D client/server applications, Web areas can be used to display Qodly pages and [share the remote user session](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas). This feature allows you to design web-based interfaces for your client/server desktop applications.
+
+:::
+
+## Propiedades específicas
+
+### Variables asociadas
+
+Se pueden asociar dos variables específicas a cada área web:
+
+- [`URL`](properties_WebArea.md#url) --para controlar la URL mostrada por el área web
+- [`Progression`](properties_WebArea.md#progression) -- para controlar el porcentaje de carga de la página mostrada en el área web.
+
+> A partir de 4D v19 R5, la variable Progression ya no se actualiza en las Áreas Web que utilizan el [motor de renderizado del sistema Windows](./webArea_overview.md#web-rendering-engine).
+
+### Motor de renderización web
+
+Puede elegir entre [dos motores de renderizado](properties_WebArea.md#use-embedded-web-rendering-engine) para el área web, dependiendo de las especificaciones de su aplicación.
+
+Seleccionar el motor de renderizado web anidado permite llamar a los métodos de 4D desde el área web y asegurarse de que las funcionalidades en macOS y Windows sean similares. Se recomienda seleccionar el motor de renderizado del sistema cuando el área web está conectada a Internet porque siempre se beneficia de las últimas actualizaciones de seguridad.
+
+### Acceder a los métodos 4D
+
+Cuando la propiedad [Acceso a los métodos 4D](properties_WebArea.md#access-4d-methods) está seleccionada, puede llamar a métodos 4D desde un área web.
+
+:::note Notas
+
+- Esta propiedad sólo está disponible si el área web [utiliza el motor de renderizado web integrado](properties_WebArea.md#use-embedded-web-rendering-engine).
+- Por razones de seguridad, ya que permite ejecutar código 4D, esta opción solo debe habilitarse para páginas de confianza, como las páginas generadas por la aplicación.
+
+:::
+
+## Objeto $4d
+
+The [`4D embedded web rendering engine`](properties_WebArea.md#use-embedded-web-rendering-engine) provides a **JavaScript object named `$4d`** in the web area. Por defecto, `$4d` permite acceder a todos los métodos proyecto 4D utilizando la notación de puntos.
+
+Por ejemplo, llamando al método `HelloWorld` en 4D:
+
+```js
+$4d.HelloWorld();
+```
+
+> **Note:** JavaScript is **case-sensitive**, so the object is named **`$4d`** (with a lowercase "d").
+
+### Controlar el acceso a $4d
+
+Con [`WA SET CONTEXT`](../commands/wa-set-context.md), los desarrolladores pueden controlar lo que puede estar disponible a través de `$4d` desde un área Web. Using this command you define a **context object** that declares for example 4D methods through formulas and class instances.
+
+Para verificar el contexto definido actualmente, utilice [`WA Get context`](../commands/wa-get-context.md).
+
+Para más información, consulte [`WA SET CONTEXT`](../commands/wa-set-context.md).
+
+### Llamada a métodos 4D desde JavaScript
+
+La sintaxis de las llamadas a los métodos 4D es la siguiente:
+
+```js
+$4d.4DMethodName(param1,paramN,function(result){})
+```
+
+- `param1...paramN`: puede pasar tantos parámetros como necesite al método 4D.
+ Estos parámetros pueden ser de cualquier tipo soportado por JavaScript (cadena, número, array, objeto).
+
+- `function(result)`: función a pasar como último argumento. Esta función "callback" se llama de forma sincrónica una vez que el método 4D termina de ejecutarse. Recibe el parámetro `result`.
+
+- `result`: resultado de la ejecución del método 4D. Este resultado puede ser de cualquier tipo soportado por JavaScript (cadena, número, array, objeto).
+
+> Por defecto, 4D trabaja en UTF-8. Cuando devuelva un texto que contenga caracteres extendidos, por ejemplo, caracteres con acentos, asegúrese de que la codificación de la página mostrada en el área web esté declarada como UTF-8, ya que de lo contrario los caracteres podrían representarse incorrectamente. En este caso, añada la siguiente línea en la página HTML para declarar la codificación:
+> ``
+
+#### Ejemplo 1
+
+Dado un método proyecto 4D llamado `today`que no recibe parámetros y devuelve la fecha actual como una cadena.
+
+Código 4D del método `today`:
+
+```4d
+#DECLARE -> $result : Text
+$result := String(Current date;System date long)
+```
+
+En el área web, el método 4D puede ser llamado con la siguiente sintaxis:
+
+```js
+$4d.today()
+```
+
+El método 4D no recibe ningún parámetro pero devuelve el resultado a la función de retrollamada por 4D después de la ejecución del método. Queremos mostrar la fecha en la página HTML que es cargada por el área web.
+
+Aquí está el código de la página HTML:
+
+```html
+
+
+
+
+
+Today is:
+
+
+```
+
+#### Ejemplo 2
+
+En lugar de utilizar un método independiente, también podemos definir una **clase** que se encargue del cálculo.
+
+Define the Class with 4D project method `calcSum` which receives parameters and returns their sum:
+
+```4d
+// SumCalculator user class
+
+Function calcSum(... : Real) -> $sum : Real
+ // receives n Real type parameters
+ // and returns a Real
+ var $i; $n : Integer
+ $n := Count parameters
+
+ For ($i; 1; $n)
+ $sum += ${$i}
+ End for
+```
+
+En otro método, creamos una instancia y la asignamos a $4d
+
+```4d
+var $myCalculator := cs.SumCalculator.new()
+WA SET CONTEXT OBJECT(*; "myWebArea"; $myCalculator)
+```
+
+El código JavaScript que se ejecuta en el área web es el siguiente:
+
+```js
+$4d.calcSum(33, 45, 75, 102.5, 7, function(theSum)
+ {
+ var result = theSum // el resultado es 262.5
+});
+```
+
+## Acciones estándar
+
+Existen cuatro acciones estándar específicas para gestionar automáticamente las áreas web: `Open Back URL`, `Open Forward URL`, `Refresh Current URL` y `Stop Loading URL`. Estas acciones pueden asociarse a botones o comandos de menú y permiten una rápida implementación de interfaces web básicas. Estas acciones pueden asociarse a botones o comandos de menú y permiten una rápida implementación de interfaces web básicas.
+
+## Eventos formulario
+
+Los eventos formulario específicos están destinados a la gestión programada de las áreas de la web, más concretamente a la activación de los enlaces:
+
+- [`On Begin URL Loading`](Events/onBeginUrlLoading.md)
+- [`On URL Resource Loading`](Events/onUrlResourceLoading.md)
+- [`On End URL Loading`](Events/onEndUrlLoading.md)
+- [`On URL Loading Error`](Events/onUrlLoadingError.md)
+- [`On URL Filtering`](Events/onUrlFiltering.md)
+- [`On Open External Link`](Events/onOpenExternalLink.md)
+- [`On Window Opening Denied`](Events/onWindowOpeningDenied.md)
+
+Además, las áreas web soportan los siguientes eventos de formulario genéricos:
+
+- [`On Load`](Events/onLoad.md)
+- [`On Unload`](Events/onUnload.md)
+- [`On Getting Focus`](Events/onGettingFocus.md)
+- [`On Losing Focus`](Events/onLosingFocus.md)
+
+## Reglas de las áreas web
+
+### Interfaz de usuario
+
+Cuando se ejecuta el formulario, las funciones estándar de la interfaz del navegador están disponibles para el usuario en el área web, lo que permite la interacción con otras áreas del formulario:
+
+- **Comandos menú Edición**: cuando el área web tiene el foco, los comandos del menú **Edición** pueden utilizarse para realizar acciones como copiar, pegar, seleccionar todo, etc., según la selección.
+- **Menú contextual**: es posible utilizar el [menú contextual] estándar (properties_Entry.md#context-menu) del sistema con el área web. La visualización del menú contextual puede controlarse utilizando el comando [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md).
+- **Arrastrar y soltar**: el usuario puede arrastrar y soltar texto, imágenes y documentos dentro del área web o entre un área web y los objetos de los formularios 4D, según las propiedades de los objetos 4D.
+ Por razones de seguridad, no se permite por defecto cambiar el contenido de un área web mediante la acción de arrastrar y soltar un archivo o una URL. En este caso, el cursor muestra un icono de "prohibido" . Tiene que usar la instrucción `WA SET PREFERENCE(*; "warea";WA enable URL drop;True)` para mostrar un icono "drop" y generar el evento [`On Window Opening Denied`](Events/onWindowOpeningDenied.md). En este evento, puede llamar al comando [`WA OPEN URL`](../commands-legacy/wa-open-url.md) o definir la [variable URL](properties_WebArea.md#url) en respuesta a un soltar del usuario.
+
+> Las funciones de arrastrar y soltar descritas anteriormente no son compatibles con las áreas web que utilizan el [motor de renderizado del sistema macOS](properties_WebArea.md#use-embedded-web-rendering-engine).
+
+### Subformularios
+
+Por razones relacionadas con los mecanismos de redibujado de ventanas, la inserción de un área web en un subformulario está sujeta a las siguientes restricciones:
+
+- El subformulario no debe poder desplazarse
+- Los límites del área web no deben superar el tamaño del subformulario
+
+> No se soporta la superposición de un área web sobre o debajo de otros objetos formulario.
+
+### Conflicto entre el área web y el servidor web (Windows)
+
+En Windows, no se recomienda acceder, a través de un área web, al servidor web de la aplicación 4D que contiene el área, ya que esta configuración podría provocar un conflicto que paralice la aplicación. Por supuesto, un 4D remoto puede acceder al servidor web de 4D Server, pero no a su propio servidor web.
+
+### Inserción del protocolo (macOS)
+
+Las URLs manejadas por programación en áreas web bajo macOS deben comenzar con el protocolo. Por ejemplo, debe pasar la cadena "http://www.mysite.com" y no sólo "www.mysite.com".
+
+## Acceso al inspector web
+
+Puede visualizar y utilizar un inspector web dentro de las áreas web de sus formularios o en las áreas web fuera de la pantalla. El inspector web es un depurador que permite analizar el código y el flujo de información de las páginas web.
+
+Para mostrar el inspector Web, puede ejecutar el comando `WA OPEN WEB INSPECTOR` o utilizar el menú contextual del área web.
+
+- **Execute the `WA OPEN WEB INSPECTOR` command**
+ This command can be used directly with onscreen (form object) and offscreen web areas.
+
+- **Use the web area context menu**
+ This feature can only be used with onscreen web areas and requires that the following conditions are met:
+ - el [menú contextual](properties_Entry.md#context-menu) del área web está activado
+ - el uso del inspector está expresamente autorizado en el área mediante la siguiente declaración:
+ ```4d
+ WA SET PREFERENCE(*;"WA";WA enable Web inspector;True)
+ ```
+
+> Con el [motor de renderizado del sistema de Windows](properties_WebArea.md#use-embedded-web-rendering-engine), un cambio en esta preferencia requiere que se tenga en cuenta una acción de navegación en el área (por ejemplo, una actualización de la página).
+
+Para más información, consulte la descripción del comando [`WA SET PREFERENCE`](../commands-legacy/wa-set-preference.md).
+
+Cuando haya realizado los ajustes como se ha descrito anteriormente, entonces tendrá nuevas opciones como **Inspeccionar el elemento** en el menú contextual del área. Al seleccionar esta opción, se muestra la ventana del inspector web.
+
+> Para una descripción detallada de las funcionalidades de este depurador, consulte la documentación que ofrece el motor de renderizado web.
+
+## Propiedades soportadas
+
+[Estilo de línea de borde](properties_BackgroundAndBorder.md#border-line-style) - [Fondo](properties_CoordinatesAndSizing.md#bottom) - [Clase](properties_Object.md#css-class) - [Menú contextual](properties_Entry.md#context-menu) - [Altura](properties_CoordinatesAndSizing.md#height) - [Tamaño horizontal](properties_ResizingOptions.md#horizontal-sizing) - [Izquierda](properties_CoordinatesAndSizing.md#left) - [Método](properties_Action.md#method) - [Nombre del objeto](properties_Object.md#nombre-del-objeto) - [Progresión](properties_WebArea.md#progression) - [Derecha](properties_CoordinatesAndSizing.md#right) - [Arriba](properties_CoordinatesAndSizing.md#top) - [Tipo](properties_Object.md#type) - [URL](properties_WebArea.md#url) - [Usar motor de renderizado web incrustado](properties_WebArea.md#use-embedded-web-rendering-engine) - [Variable o expresión](properties_Object.md#variable-or-expression) - [Tamaño vertical](properties_ResizingOptions.md#vertical-sizing) - [Visibilidad](properties_Display.md#visibility) - [Ancho](properties_CoordinatesAndSizing.md#width)
+
+## 4DCEFParameters.json
+
+El 4DCEFParameters.json es un archivo de configuración que permite la personalización de los parámetros CEF para gestionar el comportamiento de las áreas web dentro de las aplicaciones 4D.
+
+Se suministran [interruptores predeterminados](#default-file), pero puede reemplazarlos utilizando un archivo 4DCEFParameters.json personalizado.
+
+En la fase de desarrollo (utilizando la aplicación 4D), cree un archivo 4DCEFParameters.json en la siguiente ubicación:
+
+- Windows: `Users\[userName]\AppData\Roaming\4D\4DCEFParameters.json`
+- macOS: `$HOME/Library/Application Support/4D/4DCEFParameters.json`
+
+Antes de generar la aplicación final, añada el archivo personalizado 4DCEFParameters.json a la carpeta Resources del proyecto.
+
+:::warning
+
+Añadir un archivo 4DCEFParameters.json personalizado puede afectar fundamentalmente a todas las áreas web integradas de 4D, incluyendo las [áreas 4D View Pro](../ViewPro/configuring.md#form-area-properties). Es responsabilidad del desarrollador asegurarse de que los interruptores personalizados no desestabilizan la aplicación 4D.
+
+:::
+
+El formato del archivo 4DCEFParameters.json es el siguiente:
+
+```json
+
+{
+ "switches":{
+ "key":value
+ },
+ "macOS":{
+ "switches": {
+ "key":value
+ }
+ },
+ "windows": {
+ "switches": {
+ "key":value
+ }
+ }
+}
+```
+
+La estructura del archivo 4DCEFParameters.json contiene:
+
+- **switches**: una lista de switches CEF y sus correspondientes valores aplicados tanto para macOS como para Windows.
+- **macOS.switches**: conmutadores CEF específicos de macOS.
+- **windows.switches**: interruptores CEF específicos para Windows.
+
+Los interruptores del archivo personalizado tienen prioridad. En caso de duplicación de interruptores dentro del mismo archivo, los interruptores definidos en la subsección específica de la plataforma ("macOS.switches" o "windows.switches") tienen prioridad y son usadas para la configuración.
+
+:::note
+
+La lista de conmutadores compatibles evoluciona constantemente y está gestionada por el equipo de desarrollo de CEF. Para obtener información sobre los conmutadores disponibles, debe consultar la comunidad de desarrolladores de CEF.
+
+:::
+
+### Ejemplos
+
+#### Archivo por defecto
+
+El archivo 4DCEFParameters.json por defecto contiene los siguientes cambios:
+
+```json
+{
+ "switches":{
+ "enable-media-stream":true,
+ "enable-print-preview":true
+ },
+ "macOS":{
+ "switches": {
+ "use-mock-keychain": true
+ }
+ },
+ "windows": {
+ "switches": {
+ "disable-features": "WinUseBrowserSpellChecker"
+ }
+ }
+}
+
+```
+
+#### Ejemplo de desactivación del interruptor por defecto
+
+```json
+{
+ "switches": {
+ "disable-javascript": true,
+ "disable-web-security": true
+ }
+}
+```
+
+#### Ejemplo para Autoplay
+
+```json
+{
+ "switches":{
+ "autoplay-policy": "no-user-gesture-required"
+ }
+}
+```
+
+### Ver también
+
+[Especifique sus propios parámetros para inicializar el área web integrada (entrada de blog)](https://blog.4d.com/specify-your-own-parameters-to-initialize-the-embedded-web-area)
+
+
+
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/writeProArea_overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/writeProArea_overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/FormObjects/writeProArea_overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/FormObjects/writeProArea_overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/GettingStarted/Installation.md b/i18n/es/docusaurus-plugin-content-docs/version-21/GettingStarted/Installation.md
new file mode 100644
index 00000000000000..99711e555030d7
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/GettingStarted/Installation.md
@@ -0,0 +1,52 @@
+---
+id: installation
+title: Instalación
+---
+
+¡Bienvenido a 4D! ¡Bienvenido a 4D! A continuación encontrará toda la información necesaria sobre cómo instalar y registrar su aplicación 4D. Welcome to 4D! On this page, you will find all of the necessary information about installing and launching your 4D product.
+
+## Configuración requerida
+
+La página [Descarga de productos](https://us.4d.com/product-download) del sitio web de 4D ofrece información sobre los requisitos mínimos del sistema macOS / Windows para su serie 4D.
+
+Encontrará más detalles técnicos en la [página Recursos](https://us.4d.com/resources/feature-release) del sitio web de 4D.
+
+## Instalación en disco
+
+Los productos 4D se instalan desde el sitio web de 4D:
+
+1. Conéctese al sitio web de 4D y vaya a la página de [Descargas](https://us.4d.com/product-download).
+
+2. Haga clic en el enlace de descarga de su producto 4D y siga las instrucciones en pantalla.
+
+## Conexión
+
+Una vez que haya completado la instalación, puede iniciar 4D e iniciar la sesión. Para ello, haga doble clic en el icono del producto 4D.
+
+
+
+A continuación, aparece el Asistente de bienvenida:
+
+
+
+- Si desea descubrir y explorar 4D, haga clic en el enlace **prueba gratuita**. Sólo se le pedirá que se registre o que cree una cuenta 4D.
+
+- Si ya tiene una cuenta en 4D, haga clic en el enlace **Iniciar sesión** en la parte superior derecha del diálogo del Asistente de Bienvenida e introduzca los datos de su cuenta.
+ - Any already activated 4D products are automatically updated (or additional expansion packs loaded) on your machine.
+ - If no product is activated on the machine but there is a development license associated with the 4D account, a dialog box appears, prompting you to install it directly.
+
+Despliegue el área **Abrir o crear un proyecto aplicación** y seleccione la acción que desea realizar:
+
+- **Conéctese a 4D Server** - utilice 4D como cliente remoto y conéctese a una aplicación ya cargada por 4D Server.
+
+- **Abra un proyecto de aplicación local**: cargue un proyecto de aplicación existente almacenado en su disco.
+
+- **Cree un nuevo proyecto de aplicación**: cree un nuevo proyecto de aplicación vacío en su disco.
+
+¡Disfrute de su experiencia 4D!
+
+:::info
+
+¿Necesita activar licencias específicas? Visite la página [Gestión de licencias 4D](../Admin/licenses.md).
+
+:::
\ No newline at end of file
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/GettingStarted/creating.md b/i18n/es/docusaurus-plugin-content-docs/version-21/GettingStarted/creating.md
new file mode 100644
index 00000000000000..6a85b83e9214e6
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/GettingStarted/creating.md
@@ -0,0 +1,105 @@
+---
+id: creating
+title: Crear o abrir un proyecto
+---
+
+## Crear un proyecto
+
+Se pueden crear nuevos proyectos de aplicaciones 4D desde **4D** o **4D Server**. En cualquier caso, los archivos del proyecto se almacenan en la máquina local.
+
+Para crear un nuevo proyecto:
+
+1. Lance 4D o 4D Server.
+
+2. Haga una de las siguientes cosas:
+ - Selecciona **Nuevo > Proyecto...** en el menú **Archivo**: 
+ - (solo 4D) Seleccione **Proyecto...** desde el **Nuevo** botón de la barra de herramientas:

Aparece un diálogo **Guardar** estándar para que pueda elegir el nombre y la ubicación de la carpeta principal del proyecto 4D.
+
+3. Introduzca el nombre de su carpeta de proyecto y haga clic en **Guardar**. Este nombre se utilizará:
+
+ - como nombre de la carpeta del proyecto,
+ - como nombre del archivo .4DProject en el primer nivel de la [carpeta "Project"](../Project/architecture.md#project-folder).
+
+Puedes elegir cualquier nombre permitido por su sistema operativo. Sin embargo, si su proyecto está destinado a funcionar en otros sistemas o a ser guardado a través de una herramienta de control de fuente, debe tener en cuenta sus recomendaciones de denominación específicas.
+
+Al validar el diálogo **Guardar**, 4D cierra el proyecto actual (si lo hay), crea una carpeta de proyecto en la ubicación indicada y coloca en ella todos los archivos necesarios para el proyecto. Para más información, consulte [Arquitectura de un proyecto 4D](Project/architecture.md).
+
+A continuación, puede empezar a desarrollar su proyecto.
+
+## Abrir un proyecto
+
+Para abrir un proyecto existente desde 4D:
+
+1. Haga una de las siguientes cosas:
+
+ - Seleccione **Abrir/Proyecto local...** desde el menú **Archivo** o del botón**Abrir** de la barra de herramientas.
+ - Seleccione **Abrir un proyecto de aplicación local** en el diálogo del Asistente de Bienvenida
+
+Aparece la caja de diálogo estándar de apertura de archivos.
+
+2. Seleccione el archivo `.4dproject` del proyecto (situado dentro de la carpeta ["Project" del proyecto](../Project/architecture.md#project-folder)) y haga clic en **Abrir**.
+
+ Por defecto, el proyecto se abre con su archivo de datos actual. Se sugieren otros tipos de archivos:
+
+ - *Archivos de proyectos empaquetados*: extensión `.4dz` - proyectos de despliegue
+ - *Archivos de acceso directo*: extensión `.4DLink` - almacenan los parámetros adicionales necesarios para abrir proyectos o aplicaciones (direcciones, identificadores, etc.)
+ - *Archivos binarios*: extensión `.4db` o `.4dc` - formatos de base de datos 4D heredados
+
+### Opciones
+
+Además de las opciones sistema estándar, la caja de diálogo *Abrir* de 4D ofrece dos menús con opciones específicas disponibles utilizando el botón **Abrir** y el menú **Archivo de datos**.
+
+- **Abrir** - modo de apertura del proyecto:
+ - **Interpretado** o **Compilado**: estas opciones están disponibles cuando el proyecto seleccionado contiene [código interpretado y compilado](Concepts/interpreted.md).
+ - **[Centro de seguridad y de mantenimiento](MSC/overview.md)**: apertura en modo seguro que permite el acceso a los proyectos dañados para realizar las reparaciones necesarias.
+
+- **Archivo de datos** - especifica el archivo de datos a utilizar con el proyecto. Por defecto, está seleccionada la opción **Archivo de datos actual**.
+
+## Atajos de apertura de los proyectos
+
+4D ofrece varias formas de abrir proyectos directamente y evitar el diálogo de apertura:
+
+- mediante las opciones de menú:
+ - *Barra de menús* - **Archivo** > **Abrir proyectos recientes / {project name}**
+ - *Barra de herramientas 4D* - Seleccione el proyecto en el menú asociado al botón **Abrir**
+
+- vía las preferencias:
+ - Fije la preferencia general **Al inicio** en **Abrir el último proyecto utilizado**.
+
+- utilizando un archivo `.4DLink`.
+
+### Abrir un proyecto con un archivo 4DLink
+
+Puede utilizar un archivo [`.4DLink`](#about-4dlink-files) para lanzar la aplicación 4D y abrir el proyecto 4D objetivo. Hay dos maneras de hacer esto:
+
+- haga doble clic o arrastre y suelte el archivo `.4DLink` en la aplicación 4D
+- vaya a **Archivo** > **Abrir los proyectos recientes** y seleccione un proyecto
+
+
+
+Un archivo .4DLink de tipo "proyecto remoto" puede copiarse y utilizarse en varias máquinas.
+
+> También es posible seleccionar un archivo 4DLink en la caja de diálogo de apertura de 4D y 4D Server (abriendo sólo el proyecto local).
+
+## Sobre 4DLink Files
+
+Los archivos con la extensión `.4DLink` son archivos XML que contienen parámetros destinados a automatizar y a simplificar la apertura de proyectos 4D locales o remotos.
+
+Los archivos `.4DLink` pueden guardar la dirección de un proyecto 4D, así como sus identificadores de conexión y el modo de apertura, lo que permite ahorrar tiempo al abrir los proyectos.
+
+4D genera automáticamente un archivo `.4DLink` cuando se abre un proyecto local por primera vez o cuando se conecta a un servidor por primera vez. El archivo se almacena en la carpeta de preferencias locales en la siguiente ubicación:
+
+- Windows: C:\Users\UserName\AppData\Roaming\4D\Favorites vXX\
+- macOS: Users/UserName/Library/Application Support/4D/Favorites vXX/
+
+XX representa el número de versión de la aplicación. Por ejemplo, "Favoritos v19" para 4D v19.
+
+Esa carpeta está dividida en dos subcarpetas:
+
+- la carpeta **Local** contiene los archivos `.4DLink` que pueden utilizarse para abrir proyectos locales
+- la carpeta **Remote** contiene los archivos `.4DLink` de proyectos remotos recientes
+
+Los archivos `.4DLink` también pueden crearse con un editor XML.
+
+4D ofrece un DTD que describe las llaves XML que pueden utilizarse para crear un archivo `.4DLink`. Este DTD se llama database_link.dtd y se encuentra en la subcarpeta `\Resources\DTD\` de la aplicación 4D.
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/analysis.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/analysis.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/analysis.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/analysis.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/backup.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/backup.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/backup.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/backup.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/compact.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/compact.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/compact.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/compact.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/encrypt.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/encrypt.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/encrypt.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/encrypt.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/information.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/information.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/information.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/information.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/repair.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/repair.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/repair.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/repair.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/restore.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/restore.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/restore.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/restore.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/rollback.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/rollback.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/rollback.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/rollback.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/verify.md b/i18n/es/docusaurus-plugin-content-docs/version-21/MSC/verify.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/MSC/verify.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/MSC/verify.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/bars.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Menus/bars.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/bars.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Menus/bars.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/creating.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Menus/creating.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/creating.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Menus/creating.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/overview.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Menus/overview.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/overview.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Menus/overview.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/properties.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Menus/properties.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/properties.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Menus/properties.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/sdi.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Menus/sdi.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/Menus/sdi.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/Menus/sdi.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/Notes/updates.md b/i18n/es/docusaurus-plugin-content-docs/version-21/Notes/updates.md
new file mode 100644
index 00000000000000..b730b0bbfb1492
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/Notes/updates.md
@@ -0,0 +1,313 @@
+---
+id: updates
+title: Notas del lanzamiento
+---
+
+## 4D 21
+
+Lea [**Novedades en 4D 21**](https://blog.4d.com/en-whats-new-in-4d-21/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 21.
+
+#### Lo más destacado
+
+- Support of AI Vector Searches in the [`query()`](../API/DataClassClass.md#query-by-vector-similarity) function and in the [`$filter`](../REST/$filter.md#vector-similarity) REST API.
+- Support of TLS encryption for the [4D.TCPConnection](../API/TCPConnectionClass.md#4dtcpconnectionnew) class.
+- Servidor Web:
+ - new [HTTP rules](../WebServer/http-rules.md) to customize HTTP response headers,
+ - ability to set [HTTP request handlers](../WebServer/http-request-handler.md) using a `handlers` property in the *settings* parameter of the Web server [`start()`](../API/WebServerClass.md#start) function,
+ - the Web server object contains new [`rules`](../API/WebServerClass.md#rules) and [`handlers`](../API/WebServerClass.md#handlers) properties.
+- New [ORDA events on data](../ORDA/orda-events.md): validateSave, saving, afterSave, validateDrop, dropping, afterDrop.
+- New option allowing to use certificates from Windows Certificate Store instead of a local certificates folder in [`HTTPRequest`](../API/HTTPRequestClass.md#4dhttprequestnew) and [`HTTPAgent`](../API/HTTPAgentClass.md#4dhttpagentnew) classes.
+- Cliente/servidor:
+ - You can display Qodly pages in Web areas and [share the remote client session](../Desktop/clientServer.md#sharing-the-session-with-qodly-pages-in-web-areas).
+ - The [QUIC network layer](../settings/client-server.md#network-layer) has been enhanced to handle network interface changes transparently, for example when you travel with your laptop. See [this blog post](https://blog.4d.com/work-and-move-with-quic-and-network-switching).
+- You can now [create components directly from the host project](../Extensions/develop-components.md#creating-components) and [edit their code from a dedicated tab](../Extensions/develop-components.md#editing-all-component-code) in the 4D Explorer without leaving or restarting the project.
+- The 4D product activation step has been simplified and automated during [sign-in](../GettingStarted/Installation.md#sign-in).
+- 4D AIKit component: new features to [invoke a specific tool automatically](../aikit/Classes/OpenAIChatHelper.md#registertool) and [specify a response format](../aikit/Classes/OpenAIChatCompletionsParameters.md#response-format).
+- Lenguaje 4D:
+ - New "trim" commands to remove leading and trailing spaces from a string: [`Trim`](../commands/trim.md), [`Trim start`](../commands/trim-start.md), and [`Trim end`](../commands/trim-end.md).
+ - Los comandos [`Num`](../commands/num.md) y [`String`](../commands/string.md) han sido actualizados para soportar conversiones en diferentes bases (radix).
+
+#### Vista previa para desarrolladores
+
+[**Fluent UI** rendering for 4D forms](../FormEditor/forms.md#fluent-ui-rendering-developer-preview) is proposed in Developer Preview during the beta test program.
+
+#### Cambios de comportamiento
+
+:::caution Index rebuild
+
+4D 21 includes an ICU library update ([see below](#library-table)) which will force an automatic rebuild of indexes of type alpha, text, and object. Dependiendo del tamaño del archivo de datos, esta operación puede llevar un tiempo y puede ser necesario planificarla.
+
+:::
+
+- Web services (SOAP): when [scalable sessions](../WebServer/sessions.md#enabling-web-sessions) are enabled, web services now run in [**preemptive processes**](../Develop/preemptive.md) in compiled mode. Make sure your SOAP code is thread-safe.
+- Web server: the support of deprecated `4DSYNC/` and `4DCGI/` URLs is removed. Ya no se realiza ningún tratamiento específico en estas URL.
+- Web user sessions are now returned by [`Process activity`](../commands/process-activity.md).
+- The [`HIGHLIGHT TEXT`](../commands/highlight-text) command is now supported in the context of subforms.
+- **Components no longer embedded**: starting with 4D 21, components developed by 4D (4D NetKit, 4D SVG..., see [this list](../Extensions/overview-old.md)) are no longer embedded in the 4D application. When upgrading a project to 4D 21 or higher, a dialog box is displayed:
+ 
+ \- **Import**: import automatically 4D components as dependencies to the project
+ \- **Ignore**: do not import components and let you [manage components manually](../Project/components.md)
+ \- **Ask later**: do not import components and display the dialog at the next project opening.
+
+:::note
+
+In binary databases, you need to select the required components in the 4D installer or download them from the [4D Product Download portal](https://product-download.4d.com/?type=components).
+
+:::
+
+## 4D 20 R10
+
+Lea las [**Novedades en 4D 20 R10**](https://blog.4d.com/en-whats-new-in-4d-20-R10/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R10.
+
+#### Lo más destacado
+
+- Gestión de [eventos ORDA en datos](../ORDA/orda-events.md).
+- Nueva opción `connectionTimeout` en el parámetro [`options`](../API/TCPConnectionClass.md#options-parameter) de la función [`4D.TCPConnection.new()`](../API/TCPConnectionClass.md#4dtcpconnectionnew).
+- Nueva clase [`4D.Vector`](../API/VectorClass.md) para procesar y comparar vectores, normalmente calculados por IAs.
+- Nuevas opciones para generar UUIDs en **versión 7** para el comando [4D automatic fields](../settings/database.md#auto-uuid-version) y [`Generate UUID`](../commands/generate-uuid).
+- Nuevas clases [`UDPSocket`](../API/UDPSocketClass.md) y [`UDPEvent`](../API/UDPEventClass.md) para enviar datos utilizando sockets UDP. Soporte de registro detallado para eventos UDP en el archivo de registro [`4DTCPUDPLog.txt`](../Debugging/debugLogFiles.md#4dtcpudplogtxt) (renombrado de `4DTCPLog.txt`).
+- New [`.promote()`](../API/SessionClass.md#promote) and [`.demote()`](../API/SessionClass.md#demote) functions in the [Session class](../API/SessionClass.md) to dynamically add/remove privileges in a web process.
+- [Automatic selection of licenses to embed](../Desktop/building.md#application-automatically-embedding-available-licenses) in the Build application dialog box, modified [`Create deployment license`](../commands/create-deployment-license.md) command, new [`AutomaticLicenseIntegration`](https://doc.4d.com/4Dv20R10/4D/20-R10/AutomaticLicenseIntegration.300-7611090.en.html) BuildApplication xml key.
+- Seguridad mejorada para copiar/pegar fórmulas en [4D Write Pro](../WritePro/managing-formulas.md) y [áreas de texto con estilo](../FormObjects/input_overview.md): las fórmulas copiadas desde fuera de la aplicación 4D actual se pegan ahora siempre sólo como valores.
+- 4D AIKit component: new [OpenAIEmbeddingsAPI class](../aikit/Classes/OpenAIEmbeddingsAPI.md) to create embeddings using OpenAI's API.
+- You can now [associate a class](../Develop/field-properties.md) to an object field in the structure editor.
+- Automatic handling of [recursive dependencies](../Project/components.md#automatic-dependency-resolution).
+- Lenguaje 4D:
+ - Por coherencia, los comandos [`Create entity selection`](../commands/create-entity-selection.md) y [`USE ENTITY SELECTION`](../commands/use-entity-selection.md) han sido movidos del tema ["4D Environment"](../commands/theme/4D_Environment.md) al ["Selection"](../commands/theme/Selection.md).
+ - Nuevos comandos [`OBJECT SET DATA SOURCE FORMULA`](../commands/object-set-data-source-formula.md) y [`OBJECT Get data source formula`](../commands/object-get-data-source-formula.md) para asignar y leer los objetos `Formula` como fuentes de datos para los objetos de formulario.
+ - [`LISTBOX SET PROPERTY`](../commands/listbox-set-property.md) y [`LISTBOX Get property`](../commands/listbox-get-property.md) soportan tres nuevas constantes: `lk current item`, `lk current item position` y `lk selected items expression`.
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R10): lista de todos los bugs que se han corregido en 4D 20 R10.
+
+#### Cambios de comportamiento
+
+- En Windows, las fuentes de impresora actuales destinadas únicamente a la impresión (es decir, no se pueden utilizar en pantalla) ya no son cargadas al inicio por 4D.
+- Se ha eliminado la biblioteca *MeCab*. Este cambio sólo afecta al tratamiento del texto en japonés.
+- Cuando una variable o parámetro objeto se declara con un tipo ["cs" class](../Concepts/classes.md#cs), asignarlo con una instancia de objeto de una clase diferente genera ahora un error de sintaxis.
+- [`.hasPrivilege()`](../API/SessionClass.md#hasprivilege) devuelve True para privilegios promovidos en el proceso web.
+- The [`Time`](../commands/time) command now returns a negative time expression when the *timeValue* parameter is negative. Por ejemplo, `Time("-01:02:03")` devolverá **-01:02:03**. In previous releases, the negative sign was ignored.
+
+## 4D 20 R9
+
+Lea [**Novedades en 4D 20 R9**](https://blog.4d.com/en-whats-new-in-4d-20-R9/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R9.
+
+#### Lo más destacado
+
+- La biblioteca [*MeCab*](../settings/database.md#support-of-mecab-japanese-version) está obsoleta y se eliminará en la próxima versión.
+- Soporte de [token de sesión](../WebServer/sessions.md#session-token-otp) manejado con las nuevas funciones [`Session.createOTP()`](../API/SessionClass.md#createotp) y [`Session.restore()`](../API/SessionClass.md#restore).
+- El asistente de etiqueta ahora utiliza el editor de Fórmula para añadir o editar fórmulas en el [área de diseño de etiquetas](../Desktop/labels.md#label-preview).
+- New [`TCPListener`](../API/TCPListenerClass.md) class to create TCP server connections; new properties in related classes: `address`, `listener` and `port` in [`TCPConnection`](../API/TCPConnectionClass.md) class, `address` and `port` in [`TCPEvent`](../API/TCPEventClass.md) class.
+- Comandos y constantes obsoletos ahora generan advertencias específicas en el [Live checker y el compilador](../code-editor/write-class-method.md#warnings-and-errors). Puede saber si un comando está obsoleto utilizando el comando [`Command name`](../commands/command-name.md).
+- Nuevos comandos [WA SET CONTEXT](../commands/wa-set-context.md) y [WA Get context](../commands/wa-get-context.md) para controlar los contenidos [$4d](../FormObjects/webArea_overview.md#4d-object) en áreas web.
+- Nuevo [parámetro de base de datos `RDP optimization`](../commands-legacy/set-database-parameter.md#rdp-optimization-133) para optimizar por ejemplo el portapapeles compartidos cuando se usa el protocolo de escritorio remoto con 4D.
+- Los componentes interpretados pueden ahora [editarse desde el proyecto local](../Extensions/develop-components.md#editing-components-from-the-host).
+- [Licencias](../Admin/licenses.md) ahora se actualizan automáticamente al iniciar.
+- Nuevo [componente AIKit 4D](../aikit/overview.md) que permite la interacción con las API IA de terceros.
+- Los siguientes retrollamadas del comando VP ahora esperan que todas las funciones personalizadas de 4D completen sus cálculos: [VP IMPORT DOCUMENT](../ViewPro/commands/vp-import-document.md), [VP IMPORT FORM BLOB](../ViewPro/commands/vp-import-from-blob.md), [VP IMPORT FROM OBJECT](../ViewPro/commands/vp-import-from-object.md), y [VP FLUSH COMMANDS](../ViewPro/commands/vp-flush-commands.md).
+- Nuevas funcionalidades [4D Netkit](https://developer.4d.com/4D-NetKit/) para administrar los calendarios Google y Microsoft 365; capacidad para usar el servidor web local para autenticación OAuth 2.0.
+- Interfaz 4D Write Pro: Nueva [IA integrada](../WritePro/writeprointerface.md#integrated-ai) para interactuar con **chatGTP** desde sus documentos 4D Write Pro.
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R9): lista de todos los bugs que se han corregido en 4D 20 R9.
+
+## 4D 20 R8
+
+Lea [**Novedades en 4D 20 R8**](https://blog.4d.com/en-whats-new-in-4d-20-R8/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R8.
+
+#### Lo más destacado
+
+- Implemente sus propios [**HTTP request handlers**](../WebServer/http-request-handler.md) utilizando la nueva clase [`4D.IncomingMessage`](../API/IncomingMessageClass.md).
+- Las expresiones utilizadas en [propiedades de objetos de formulario](../FormObjects/properties_Reference.md) ahora se benefician de la comprobación de sintaxis en la [Lista de propiedades](../FormEditor/formEditor.md#property-list) y en el [Compilador](../Project/compiler.md#check-syntax).
+- Puede [asociar una clase a un formulario](../FormEditor/properties_FormProperties.md#form-class) para habilitar la anticipación del tipo de código y la instanciación automática de los datos del formulario cuando utilice el comando [`Form`](../commands/form.md).
+- Soporte de [sesiones autónomas](../API/SessionClass.md) para simplificar la codificación local de aplicaciones cliente/servidor.
+- [Depurador 4D](../Debugging/debugger.md): nuevo diseño y autoguardado, funciones de modo de visualización.
+- [Nueva arquitectura de componentes construidos](../Desktop/building.md#build-component) para un mejor cumplimiento de las pautas de notarización de Apple.
+- Ahora puede [crear fácilmente aplicaciones de evaluación](../Desktop/building.md#evaluation-application) en el cuadro de diálogo de Build App.
+- Dependencias: use el administrador de Dependencias para [buscar nuevas versiones](../Project/components.md#checking-for-new-versions) y [actualizar](../Project/components.md#updating-dependencies) componentes GitHub.
+- Nuevas clases [`TCPConnection`](../API/TCPConnectionClass.md) y [`TCPEvent`](../API/TCPEventClass.md) para gestionar conexiones cliente TCP, manejar eventos y mejorar el control sobre la transmisión de datos. Añadido [`4DTCPLog.txt`](../Debugging/debugLogFiles.md#4dtcpudplogtxt) para un registro detallado de eventos TCP.
+- Nuevas opciones en [VP EXPORT DOCUMENT](../ViewPro/commands/vp-export-document.md) y [VP IMPORT DOCUMENT](../ViewPro/commands/vp-import-document.md) para controlar estilos, fórmulas, integridad de datos y protección por contraseña.
+- 4D Write Pro:
+ - Los siguientes comandos permiten ahora parámetros como objetos o colecciones: [WP SET ATTRIBUTES](../WritePro/commands/wp-set-attributes.md), [WP Get attributes](../WritePro/commands/wp-get-attributes.md), [WP RESET ATTRIBUTES](../WritePro/commands/wp-reset-attributes.md), [WP Table append row](../WritePro/commands/wp-table-append-row.md), [WP Import document](../WritePro/commands/wp-import-document.md), [WP EXPORT DOCUMENT](../WritePro/commands/wp-export-document.md), [WP Add picture](../WritePro/commands/wp-add-picture.md), y [WP Insert picture](../WritePro/commands/wp-insert-picture.md).
+ - [WP Insert formula](../WritePro/commands/wp-insert-formula.md), [WP Insert document body](../WritePro/commands/wp-insert-document-body.md), y [WP Insert break](../WritePro/commands/wp-insert-break.md), son ahora funciones que devuelven rangos.
+ - New expressions related to document attributes: [This.sectionIndex](../WritePro/managing-formulas.md), [his.sectionName](../WritePro/managing-formulas.md) and [This.pageIndex](../WritePro/managing-formulas.md).
+- Lenguaje 4D:
+ - Comandos modificados: [`FORM EDIT`](../commands/form-edit.md)
+ - Las funciones [`.sign()`](../API/CryptoKeyClass.md#sign) y [`.verify()`](../API/CryptoKeyClass.md#verify) de la clase [4D.CryptoKey](../API/CryptoKeyClass.md) soportan Blob en el parámetro *message*.
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R8): lista de todos los bugs que se han corregido en 4D 20 R8.
+
+#### Cambios de comportamiento
+
+- Después de una modificación del archivo de registro usando [`SELECT LOG FILE`](../commands/select-log-file.md) o la [Configuración de copia de seguridad](../Backup/settings.md#log-management), el comando [`New log file`](../commands/new-log-file.md) ahora valida el cambio, sin esperar una copia de seguridad. Ya no se produce el error -4447 (copia de seguridad necesaria).
+- Debido a su [nueva arquitectura](../Desktop/building.md#build-component), los componentes creados con 4D 20 R8 y superiores no pueden ser instalados en versiones anteriores 4D.
+
+## 4D 20 R7
+
+Lea [**Novedades en 4D 20 R7**](https://blog.4d.com/en-whats-new-in-4d-20-R7/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R7.
+
+#### Lo más destacado
+
+- Las columnas de los list box y de los encabezados de tipo hora ahora soportan la opción ["blankIfNull"](../FormObjects/properties_Display.md#time-format).
+- Nuevas propiedades en [`.getBoxInfo()`](../API/IMAPTransporterClass.md#getboxinfo) y [`.getBoxList()`](../API/IMAPTransporterClass.md#getboxlist).
+- Ahora puede [añadir y eliminar componentes utilizando la interfaz del gestor de componentes](../Project/components.md#monitoring-project-dependencies).
+- Nuevo [**modo de tipado directo**](../Project/compiler.md#enabling-direct-typing) en el que declara todas las variables y parámetros en su código usando las palabras clave `var` y `#DECLARE`/`Function` (sólo modo soportado en nuevos proyectos). [La función de verificación de sintaxis](../Project/compiler.md#check-syntax) se ha mejorado en consecuencia.
+- Soporte de [singletones de sesión](../Concepts/classes.md#singleton-classes) y nueva propiedad de clase [`.isSessionSingleton`](../API/ClassClass.md#issessionsingleton).
+- Nueva [palabra clave función `onHttpGet`](../ORDA/ordaClasses.md#onhttpget-keyword) para definir funciones singleton u ORDA que pueden ser llamadas a través de [peticiones HTTP REST GET](../REST/ClassFunctions.md#function-calls).
+- Nueva clase [`4D.OutgoingMessage`](../API/OutgoingMessageClass.md) para que el servidor REST devuelva cualquier contenido web.
+- Qodly Studio: ahora puede [adjuntar el depurador Qodly a 4D Server](../WebServer/qodly-studio.md#using-qodly-debugger-on-4d-server).
+- Nuevas llaves Build Application para que las aplicaciones 4D remotas validen las [signatures](https://doc.4d.com/4Dv20R7/4D/20-R7/CertificateAuthoritiesCertificates.300-7425900.en.html) y/o los [dominios](https://doc.4d.com/4Dv20R7/4D/20-R7/CertificateDomainName.300-7425906.en.html).
+- Posibilidad de [crear aplicaciones autónomas sin licencias integradas](../Desktop/building.md#licenses).
+- Lenguaje 4D:
+ - Nuevos comandos: [Process info](../commands/process-info.md), [Session info](../commands/session-info.md), [SET WINDOW DOCUMENT ICON](../commands/set-window-document-icon.md)
+ - Comandos modificados: [Process activity](../commands/process-activity.md), [Process number](../commands/process-number.md)
+ - Deprecated commands (replacement): `GET LAST ERROR STACK` ([Last errors](../commands/last-errors.md)), `GET SERIAL INFORMATION` ([License info](../commands/license-info.md)), `PROCESS PROPERTIES` ([Process info](../commands/process-info.md)), `SET SCREEN DEPTH`, `C_XXX` commands ([var](../Concepts/variables.md#declaring-variables) and [#DECLARE/Function](../Concepts/parameters.md#declaring-parameters) declarations). Los comandos obsoletos llevan el prefijo "\*o\*".
+- 4D Write Pro:
+ - Nuevo comando: [WP DELETE SECTION](../WritePro/commands/wp-delete-section.md)
+ - Comandos modificados: [WP DELETE SUBSECTION](../WritePro/commands/wp-delete-subsection.md) y [WP RESET ATTRIBUTES](../WritePro/commands/wp-reset-attributes.md)
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R7): lista de todos los bugs que se han corregido en 4D 20 R7.
+
+#### Cambios de comportamiento
+
+- La documentación del [Lenguaje 4D](../commands/command-index.md) y del [Lenguaje 4D Write Pro](../WritePro/commands/command-index.md) ya está disponible en developer.4d.com. Descubra todas las novedades y cambios relativos a estas documentaciones en esta nota de la versión.
+- El comando [`File`](../commands/file.md) (así como [`4D.File.new()`](../API/FileClass.md#4dfilenew)) es más estricto a la hora de comprobar la sintaxis de *path* suministrada como parámetro.
+- La acción de [permission](../ORDA/privileges.md#permission-actions) ha sido eliminada de las acciones disponibles. El acceso a las urls [`/rest/$catalog`](../REST/$catalog.md) ya no está controlado. Session *describe* privileges are now ignored.
+
+## 4D 20 R6
+
+Lea [**Novedades en 4D 20 R6**](https://blog.4d.com/en-whats-new-in-4d-20-R6/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R6.
+
+#### Lo más destacado
+
+- Soporte de operadores de comparación en las [referencias de objeto](../Concepts/dt_object.md#object-operators) y las [referencias de colección](../Concepts/dt_collection.md#collection-operators). [`collection.query()`](../API/CollectionClass.md#query) ahora soporta las [referencias de objeto y de colección como valores de consulta](../API/CollectionClass.md#object-or-collection-reference-as-value).
+- Cuando un componente tiene un [espacio de nombres declarado](../Extensions/develop-components.md#declarar-el-espacio-de-nombres-del-componente), sus clases ahora se comparten automáticamente entre todos los componentes cargados en el proyecto del host por [`cs.`](../Concepts/classes.md#cs).
+- Gestión de componentes: soporte de [componentes almacenados en GitHub](../Project/components.md#components-stored-on-github).
+- Nueva función [`entitySelection.clean()`](../API/EntitySelectionClass.md#clean) y API REST [`$clean`](../REST/$clean.md) para obtener una nueva entity selection basada en la entity selection original pero sin sus entidades eliminadas.
+- Nueva función [`session.getPrivileges()`](../API/SessionClass.md#getprivileges) y API REST [`$info/privileges`](../REST/$info.md) para inspeccionar los privilegios de sesión más fácilmente durante la depuración.
+- Nuevo archivo [4DCEFParameters.json](../FormObjects/webArea_overview.md#4dcefparametersjson) para personalizar las áreas web anidadas de 4D.
+- Nueva clase [HTTPAgent](../API/HTTPAgentClass.md) y nueva propiedad [`agent`](../API/HTTPRequestClass.md#options-parameter) para la clase HTTPRequest.
+- Nuevas funciones [`enableState()`](../API/WebFormClass.md) y [`disableState()`](../API/WebFormClass.md) para controlar los estados de las páginas Qodly desde el servidor.
+- Nueva [\`API$singleton](../REST/$singleton.md) para llamar las funciones singleton expuestas desde REST y nuevos [privilegios asociados](../ORDA/privileges.md).
+- Un [nuevo botón de parámetros](../settings/web.md#activate-rest-authentication-through-dsauthentify-function) le ayuda a actualizar su proyecto para utilizar el modo REST "conexión forzada" (el método base `On REST Authentication` es ahora obsoleto).
+- Una [nueva pestaña de parámetros](../Project/compiler.md#warnings) permite definir la generación de advertencias de forma global.
+- Varios comandos, principalmente del tema "entorno 4D", son ahora hilo seguro, así como algunos selectores de los comandos [`SET DATABASE PARAMETER`](../commands-legacy/set-database-parameter.md)/[`Get database parameter`](../commands-legacy/get-database-parameter.md).
+- Nuevo [componente 4D-QPDF](https://github.com/4d/4D-QPDF) que ofrece el comando `PDF Get attachments` para extraer los archivos adjuntos de un documento PDF/A3.
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R6): lista de todos los bugs que se han corregido en 4D 20 R6.
+
+#### Cambios de comportamiento
+
+- Soporte de encadenamiento de desplazamiento en los formularios: los subformularios principales ahora se desplazan automáticamente cuando los objetos integrados deslizables ([verticalmente](../FormObjects/properties_Appearance.md#vertical-scroll-bar) u [horizontalmente](. /FormObjects/properties_Appearance.md#horizontal-scroll-bar)) han llegado a sus límites y el usuario sigue desplazándose utilizando el ratón o el trackpad (desplazamiento excesivo).
+- La API REST [`$catalog`](../REST/$catalog.md) ahora devuelve singletons (si los hay).
+
+## 4D 20 R5
+
+Lea [**Novedades en 4D 20 R5**](https://blog.4d.com/en-whats-new-in-4d-20-R5/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R5.
+
+#### Lo más destacado
+
+- Nuevo [Gestor de componentes](../Project/components.md) para gestionar componentes a través de un archivo `dependencies.json`.
+- Soporte de estructuras de gestión de errores [`Try...Catch...End try`](../Concepts/error-handling.md#trycatchend-try).
+- La capa de red QUIC ahora soporta [broadcasting](../Desktop/clientServer.md#opening-a-remote-project), [SSO](https://doc.4d.com/4Dv20R5/4D/20-R5/Single-Sign-On-SSO-on-Windows.300-6932709.en.html), e [IPv6](https://doc.4d.com/4Dv20R5/4D/20-R5/IP-Settings.300-6932707.en.html).
+- Soporte de [selecciones de entidades restringidas](../ORDA/entities.md#restricting-entity-selections).
+- Soporte de [clases compartidas](../Concepts/classes.md#shared-classes) y de [clases singleton](../Concepts/classes.md#singleton-classes). Nuevas propiedades de clase: [`isShared`](../API/ClassClass.md#isshared), [`isSingleton`](../API/ClassClass.md#issingleton), [`me`](../API/ClassClass.md#me).
+- Soporte para [inicializar una propiedad de clase en su línea de declaración](../Concepts/classes.md#initializing-the-property-in-the-declaration-line).
+- Nuevo modo [forzar login para peticiones REST](../REST/authUsers.md#force-login-mode) con un [soporte específico en Qodly Studio for 4D](../WebServer/qodly-studio.md#force-login).
+- Nuevo parámetro REST [$format](../REST/$format.md).
+- El objeto [`Session`](../commands/session.md) está ahora disponible en sesiones de usuario remotas y en sesiones de procedimientos almacenados.
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R5): lista de todos los bugs que se han corregido en 4D 20 R5.
+
+#### Cambios de comportamiento
+
+- Los plug-ins *4D Internet Commands* y *4D for OCI* ya no se incluyen en los instaladores de 4D. Para obtener estos plug-ins, necesita conectarse al [**portal de descarga de productos 4D**](https://product-download.4d.com/).
+- Los cambios realizados en el editor de estructura en relación con el aspecto gráfico de las tablas y de los campos (color, posición, orden...) ahora se guardan en un archivo separado llamado `catalog_editor.json` almacenado en la carpeta [`Sources`](../Project/architecture.md#sources) del proyecto.
+
+## 4D 20 R4
+
+Lea [**Novedades en 4D 20 R4**](https://blog.4d.com/en-whats-new-in-4d-v20-R4/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R4.
+
+#### Lo más destacado
+
+- Soporte de [formato de cifrado ECDSA\`](../Admin/tls.md#encryption) para certificados TLS.
+- Las conexiones TLS cliente/servidor y servidor SQL ahora se [configuran dinámicamente](../Admin/tls.md#enabling-tls-with-the-other-servers) (no se requieren archivos de certificado).
+- Formato HTML directo para [exportaciones de definición de estructura](https://doc.4d.com/4Dv20R4/4D/20-R4/Exporting-and-importing-structure-definitions.300-6654851.en.html).
+- Nuevo [Code Live Checker](../code-editor/write-class-method.md#warnings-and-errors) que mejora el control del código durante los pasos de declaración, comprobación de sintaxis y compilación para evitar errores de ejecución.
+- Los parámetros de métodos declarados en prototipos `#DECLARE` [ya no son necesarios en métodos "Compiler_"](../Concepts/parameters.md).
+- Soporte de [formatos personalizados de fecha y hora](../Project/date-time-formats.md)
+- Nueva [palabra clave `Try(expression)`](../Concepts/error-handling.md#tryexpression) para tratar casos de error simples.
+- Nuevo comando [`HTTP Parse message`](../commands/http-parse-message.md).
+- Nueva opción de compatibilidad [Impresión no bloqueante](../settings/compatibility.md).
+- Nuevo [modo de edición](../Admin/dataExplorer.md#editing-data) en el Explorador de datos.
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R4): lista de todos los bugs que se han corregido en 4D 20 R4.
+
+#### Cambios de comportamiento
+
+- El uso de una sintaxis heredada para declarar parámetros (por ejemplo, `C_TEXT($1)` o `var $1 : Text`) es obsoleto y genera advertencias en los pasos de escritura de código, verificación de sintaxis y compilación.
+- La coherencia de las selecciones ahora se mantiene después de que se hayan eliminado algunos registros y se hayan creado otros (ver [esta entrada de blog](https://blog.4d.com/4d-keeps-your-selections-of-records-consistent-regarding-deletion-of-records/)).
+- En la actualización de [la librería OpenSSL](#library-table), el nivel de seguridad SSL/TLS por defecto se ha cambiado de 1 a 2. Las llaves RSA, DSA y DH de 1024 bits o más y menos de 2048 bits, así como las llaves ECC de 160 bits o más y menos de 224 bits, ya no están permitidas. Por defecto, la compresión TLS ya estaba desactivada en versiones anteriores de OpenSSL. En el nivel de seguridad 2 no se puede activar.
+- Asegúrese de que su método base "On REST authentication" puede manejar contraseñas en claro (el tercer parámetro es entonces **False**) y que `Open datastore` encripta su conexión pasando la opción "tls" a **True** en *connectionInfo*. Asegúrese de que su método base "On REST authentication" puede manejar contraseñas en claro (el tercer parámetro es entonces **False**) y que `Open datastore` encripta su conexión pasando la opción "tls" a **True** en *connectionInfo*. En casos concretos, también se puede utilizar una nueva opción "passwordAlgorithm" por compatibilidad (ver el comando [`Open datastore`](../commands/open-datastore.md)).
+
+## 4D 20 R3
+
+Lea [**Novedades en 4D 20 R3**](https://blog.4d.com/en-whats-new-in-4d-20-vR3/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R3.
+
+#### Lo más destacado
+
+- Nueva función [`collection.multiSort`](../API/CollectionClass.md#multisort).
+- Soporte del parámetro *context* en [`Formula from string`](../commands/formula-from-string.md).
+- Soporte de la propiedad `headers` en el parámetro *connectionHandler* de [4D.WebSocket.new](../API/WebSocketClass.md#4dwebsocketnew).
+- [Sello de modificación global](../ORDA/global-stamp.md) para ayudar a implementar módulos de sincronización de datos. Nuevas funciones: [`ds.getGlobalStamp`](../API/DataStoreClass.md#getglobalstamp) y [`ds.setGlobalStamp`](../API/DataStoreClass.md#setglobalstamp).
+- La asignación de referencias de archivo a atributos imagen/blob está [soportada en ORDA](../ORDA/entities.md#assigning-files-to-picture-or-blob-attributes).
+- Soporte para [inicializar el valor de la variable y el tipo de datos en la línea de declaración](../Concepts/variables/#initializing-variables-in-the-declaration-line).
+- Los parámetros del archivo de registro se guardan ahora [con el archivo de datos actual](../Backup/settings.md#log-management)
+- Nueva sintaxis para [declarar parámetros variádicos](../Concepts/parameters.md#declaring-variadic-parameters)
+- 4D View Pro: soporte de la [importación](../ViewPro/commands/vp-import-from-blob) y de la [exportación](../ViewPro/commands/vp-export-to-blob) de documentos 4D View Pro al formato Blob.
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R3): lista de todos los bugs que se han corregido en 4D 20 R3.
+
+#### Cambios de comportamiento
+
+- Algunos errores eran detectables por su [método de gestión de errores](../Concepts/error-handling.md) solo en modo interpretado. Se ha realizado una corrección para que los siguientes errores se detecten también en modo compilado: *Indice fuera de rango*, *Tipo incompatible* y *Derreferenciación de un puntero Null*. Sin embargo, para tales errores en los procesadores Intel, el procedimiento se sigue interrumpiendo como antes, mientras que en los procesadores Apple Silicon el procedimiento solo se interrumpe si se llama al comando [`ABORT`](../commands-legacy/abort.md).
+- 4D ya no incluye un intérprete PHP interno. Necesita [configurar y ejecutar su propio intérprete PHP](https://blog.4d.com/deprecation-of-php-commands-and-removal-of-4d-built-in-php-interpreter) para utilizar comandos PHP.
+
+## 4D 20 R2
+
+Lea [**Novedades en 4D 20 R2**](https://blog.4d.com/en-whats-new-in-4d-v20-R2/), la entrada del blog que muestra todas las nuevas funcionalidades y mejoras en 4D 20 R2.
+
+:::warning Nota de seguridad
+
+Si sus aplicaciones 4D utilizan conexiones TLS, se recomienda actualizar a 4D 20 R2 HF1 build 100440 o superior. Para más información, consulte este [Boletín de seguridad](https://blog.4d.com/security-bulletin-two-cves-and-how-to-stay-secure/).
+
+:::
+
+#### Lo más destacado
+
+- Nueva [clase WebSocket](../API/WebSocketClass.md) para crear y gestionar conexiones WebSocket cliente desde 4D.
+- Nueva capa de red QUIC [configuración de interfaz](../settings/client-server.md#network-layer).
+- 4D View Pro: soporte del formato de archivo **.sjs** para [la importación](../ViewPro/commands/vp-import-document) y la [exportación](../ViewPro/commands/vp-export-document) de documentos.
+- Interfaz Write Pro 4D: nuevo [Asistente de tablas](../WritePro/writeprointerface.md).
+- [**Lista de bugs corregidos**](https://bugs.4d.fr/fixedbugslist?version=20_R2): lista de todos los bugs que se han corregido en 4D 20 R2.
+
+#### Cambios de comportamiento
+
+- **Atención**: el valor inicial [`offset`](../API/FileHandleClass.md#offset) de los objetos [4D.FileHandle](../API/FileHandleClass.md) estaba incorrectamente definido en 1 en lugar de 0. Se ha hecho una corrección en 4D a partir de las versiones **20.1 HF1** y **20 R2** y el valor ahora es 0.
+
+## 4D 20.x LTS
+
+Ver [**Notas de lanzamiento para LTS 4D 20.x**](../../versioned_docs/version-20/Notes/updates.md).
+
+## Tabla de la librería
+
+| Librería | Versión actual | Actualizado en 4D | Comentario |
+| --------- | -------------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
+| BoringSSL | fa47b1d | **21** | Utilizado para QUIC |
+| CEF | 7258 | **21** | Chromium 139 |
+| Hunspell | 1.7.2 | 20 | Utilizado para la corrección ortográfica en formularios 4D y 4D Write Pro |
+| ICU | 77.1 | **21** | This upgrade forces an automatic rebuild of alphanumeric, text and object indexes. |
+| libldap | 2.6.10 | **21** | |
+| libsasl | 2.1.28 | 20 | |
+| Liblsquic | 4.2.0 | 20 R10 | Utilizado para QUIC |
+| Libuv | 1.51.0 | **21** | Utilizado para QUIC |
+| libZip | 1.11.4 | **21** | Utilizado por los componentes zip class, 4D Write Pro, svg y serverNet |
+| LZMA | 5.8.1 | **21** | |
+| ngtcp2 | 1.16.0 | **21** | Utilizado para QUIC |
+| OpenSSL | 3.5.2 | **21** | |
+| PDFWriter | 4.7.0 | **21** | Used for [`WP Export document`](../WritePro/commands/wp-export-document.md) and [`WP Export variable`](../WritePro/commands/wp-export-variable.md) |
+| PHP | 8.2.4 | 20 | |
+| SpreadJS | 17.1.0 | 20 R7 | Consulte [esta entrada de blog](https://blog.4d.com/4d-view-pro-whats-new-in-4d-20-r7/) para obtener una visión general de las nuevas funciones |
+| webKit | WKWebView | 19 | |
+| Xerces | 3.3.0 | **21** | Utilizado para comandos XML |
+| Zlib | 1.3.1 | **21** | |
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/client-server-optimization.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/client-server-optimization.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/client-server-optimization.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/client-server-optimization.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/dsMapping.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/dsMapping.md
new file mode 100644
index 00000000000000..0498218a82d11a
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/dsMapping.md
@@ -0,0 +1,254 @@
+---
+id: dsmapping
+title: Objeto del modelo de datos
+---
+
+La tecnología ORDA se basa en un mapeo automático de una [estructura de base de datos] subyacente(https://doc.4d.com/4Dv20/4D/20.2/Creating-a-database-structure.200-6750097.en.html). También ofrece acceso a los datos a través de los objetos selección de entidades (entity selection) y entidad (entity). Como resultado, ORDA expone toda la base de datos como un conjunto de objetos del modelo de datos.
+
+## Mapeo de la estructura
+
+Cuando llama a un datastore usando los comandos [`ds`](commands/ds.md) u [`Open datastore`](commands/open-datastore.md), 4D hace referencia automáticamente a tablas y campos de la estructura 4D correspondiente como propiedades del objeto devuelto [datastore](#datastore):
+
+- Las tablas se asignan a [dataclasses](#dataclass).
+- Los campos se asignan a [atributos de almacenamiento](#storage-and-relation-attributes).
+- Relations are mapped to [relation attributes](#storage-and-relation-attributes) - relation names, defined in the [Structure editor](https://doc.4d.com/4Dv20/4D/20.2/Creating-and-modifying-relations.300-6750296.en.html), are used as relation attribute names.
+
+
+
+### Reglas generales
+
+Se aplican las siguientes reglas para todas las conversiones:
+
+- Los nombres de tabla, campo y relación se mapean a los nombres de propiedad de objeto. Asegúrese de que dichos nombres cumplen con las reglas generales de denominación de objetos, como se explica en la sección [Convenciones de denominación de objetos](Concepts/identifiers.md).
+- Un datastore sólo hace referencia a las tablas con una sola llave primaria. Las siguientes tablas no están referenciadas:
+ - Tablas sin llave primaria
+ - Tablas con llaves primarias compuestas.
+- Los campos BLOB están disponibles automáticamente como atributos del tipo [objeto Blob](Concepts/dt_blob.md#blob-types).
+
+> El mapeo ORDA no tiene en cuenta:
+>
+> - la opción "Invisible" para las tablas o los campos,
+> - the virtual structure defined through [`SET TABLE TITLES`](../commands-legacy/set-table-titles.md) or [`SET FIELD TITLES`](../commands-legacy/set-field-titles.md),
+> - la propiedad "Manual" o "Automática" de las relaciones.
+
+### Normas de control de acceso remoto
+
+Cuando se accede a un datastore remoto a través del comando `Abrir datastore` o [peticiones REST](REST/gettingStarted.md), sólo las tablas y los campos con la propiedad **Exponer como recurso REST** están disponibles de forma remota.
+
+Esta opción debe seleccionarse al nivel de la estructura 4D para cada tabla y cada campo que desee exponer como dataclass y atributo en el datastore:
+
+
+
+### Actualización del modelo de datos
+
+Toda modificación aplicada a la estructura de la base invalida la capa actual del modelo ORDA. Estas modificaciones incluyen:
+
+- la adición o la eliminación de una tabla, de un campo, o de una relación
+- el cambio de nombre de una tabla, de un campo o de una relación
+- la modificación de una propiedad principal de un campo (tipo, único, índice, autoincremento, valor null)
+
+Cuando la capa actual del modelo ORDA ha sido invalidada, es automáticamente recargada y actualizada en llamadas posteriores del datastore local `ds` en 4D y 4D Server. Tenga en cuenta que las referencias existentes a objetos ORDA, tales como entidades o selecciones de entidades, seguirán utilizando el modelo a partir del cual se han creado, hasta que se regeneren.
+
+Sin embargo, la capa actualizada del modelo ORDA no está disponible automáticamente en los siguientes contextos:
+
+- una aplicación 4D remota conectada a 4D Server -- la aplicación remota debe reconectarse al servidor.
+- un datastore remoto abierto mediante `Open datastore` o a través de [llamadas REST](REST/gettingStarted.md) -- debe abrirse una nueva sesión.
+
+## Definiciones de los objetos
+
+### Datastore
+
+El datastore es el objeto de interfaz de una base de datos. Crea una representación de toda la base como objeto. Un datastore está formado por un **modelo** y **datos**:
+
+- El modelo contiene y describe todas las dataclasses que componen el datastore. Es independiente de la propia base de datos subyacente.
+- Los datos se refieren a la información que se va a utilizar y almacenar en este modelo. Por ejemplo, los nombres, direcciones y fechas de nacimiento de los empleados son datos con los que se puede trabajar en un datastore.
+
+Un objeto datastore se maneja a través de funciones y propiedades de la clase [**DataStore**](../API/DataStoreClass.md).
+
+Cuando se maneja a través del código, el datastore es un objeto cuyas propiedades son todas las [dataclasses](#dataclass) que se han expuesto específicamente.
+
+4D le permite gestionar los siguientes datastores:
+
+- el datastore local, basado en la base 4D actual, devuelta por el comando `ds` (el datastore principal).
+- uno o más datastores remotos expuestos como recursos REST en las bases 4D remotas, devueltos por el comando `Open datastore`.
+
+Un datastore hace referencia sólo a una base de datos local o remota.
+
+El objeto datastore en sí no puede ser copiado como un objeto:
+
+```4d
+$mydatastore:=OB Copy(ds) //devuelve null
+```
+
+Las propiedades del datastore son sin embargo enumerables:
+
+```4d
+ ARRAY TEXT($prop;0)
+ OB GET PROPERTY NAMES(ds;$prop)
+ //$prop contiene los nombres de todas las dataclasses
+```
+
+El datastore principal (por defecto) siempre está disponible a través del comando `ds`, pero el comando `Open datastore` permite hacer referencia a todo datastore remoto.
+
+### Dataclass
+
+Una dataclass es el equivalente de una tabla. Se utiliza como modelo de objetos y hace referencia a todos los campos como atributos, incluidos los atributos relacionales (atributos construidos a partir de relaciones entre las dataclasses). Los atributos relacionales pueden utilizarse en las peticiones como cualquier otro atributo.
+
+Un objeto dataclass se maneja a través de funciones y propiedades de la clase [**DataClass**](../API/DataClassClass.md).
+
+Todas las dataclasses de un proyecto 4D están disponibles como propiedad del datastore `ds`. Para los datastores remotos a los que se accede a través de `Open datastore` o [peticiones REST](REST/gettingStarted.md), se debe seleccionar la opción **Exponer como recurso REST** al nivel de la estructura 4D para cada tabla expuesta que se desee exponer como dataclass en el datastore.
+
+Por ejemplo, considere la siguiente tabla en la estructura 4D:
+
+
+
+La tabla `Company` está disponible automáticamente como dataclass en el datastore `ds`. Puede escribir:
+
+```4d
+var $compClass : cs.Empresa //declara una variable objeto $compClass de la clase Company
+$compClass:=ds.Company //asigna la referencia de la dataclass Company a $compClass
+```
+
+Un objeto dataclass puede contener:
+
+- attributes
+- atributos relacionales
+
+La dataclass ofrece una abstracción de la base de datos física y permite manejar un modelo de datos conceptual. El dataclass es el único medio para consultar al datastore. Una consulta se hace desde una única dataclass. Las consultas se crean en torno a los atributos y a los nombres de atributos relacionales de las dataclasses. Así pues, los atributos relacionales son el medio para implicar varias tablas vinculadas en una consulta.
+
+El objeto dataclass mismo no puede copiarse como un objeto:
+
+```4d
+$mydataclass:=OB Copy(ds.Employee) //devuelve null
+```
+
+Las propiedades de la dataclass son sin embargo enumerables:
+
+```code4d
+ARRAY TEXT($prop;0)
+OB GET PROPERTY NAMES(ds.Employee;$prop)
+//$prop contiene los nombres de todos los atributos de dataclass
+```
+
+### Atributo
+
+Las propiedades de dataclass son objetos atributo que describen los campos o relaciones subyacentes. Por ejemplo:
+
+```4d
+ $nameAttribute:=ds.Company.name ///referencia a un atributo de clase
+ $revenuesAttribute:=ds.Company["revenues"] //forma alternativa
+```
+
+Este código asigna a `$nameAttribute` y `$revenuesAttribute` las referencias a los atributos name y revenues de la clase `Company`. Esta sintaxis NO devuelve valores contenidos dentro del atributo, sino que devuelve referencias a los propios atributos [con sus **propiedades de atributo**](../API/DataClassClass.md#attributename).
+Para manejar los valores, es necesario pasar por [Entidades](#entity).
+
+Todos los campos elegibles de una tabla están disponibles como atributos de su [dataclass](#dataclass) padre. Para los datastores remotos a los que se accede a través de `Open datastore` o [peticiones REST](REST/gettingStarted.md), se debe seleccionar la opción **Exponer como recurso REST** al nivel de la estructura 4D para cada campo que se desee exponer como at
+
+#### Atributos de almacenamiento y relacionales
+
+Los atributos de la Dataclass son de varios tipos: almacenamiento, relatedEntity y relatedEntities. Los atributos escalares (*es decir*, ofrecen un único valor) soportan todos los tipos de datos estándar 4D (entero, texto, objeto, etc.).
+
+- Un **atributo de almacenamiento** equivale a un campo en la base de datos 4D y puede indexarse. Los valores asignados a un atributo de almacenamiento se almacenan como parte de la entidad cuando se guarda. Cuando se accede a un atributo de almacenamiento, su valor procede directamente del datastore. Los atributos de almacenamiento son el bloque de construcción más básico de una entidad y se definen por nombre y tipo de datos.
+- Un **atributo relacional** ofrece acceso a otras entidades. Los atributos relacionales pueden dar como resultado una entidad única (o ninguna entidad), o una selección de entidades (de 0 a N entidades). Los atributos relacionales se basan en las relaciones "clásicas" en la estructura relacional para ofrecer acceso directo a una entidad o a entidades relacionadas. Los atributos relacionales están disponibles directamente en ORDA utilizando sus nombres.
+
+Por ejemplo, considere la siguiente estructura de base de datos parcial y las propiedades relacionales:
+
+
+
+Todos los atributos de almacenamiento estarán disponibles automáticamente:
+
+- en la dataclass Project: "ID", "name", y "companyID"
+- en la dataclasss Company: "ID", "name" y "discount"
+
+Además, los siguientes atributos relacionales también estarán disponibles automáticamente:
+
+- en la dataclass Project: el atributo **theClient**, del tipo "relatedEntity"; hay como máximo una Empresa para cada Proyecto (el cliente)
+- en la dataclass Company: el atributo **companyProjects**, del tipo "relatedEntities"; para cada empresa existe un cierto número de proyectos relacionados.
+
+> La propiedad Manual o Automática de una relación de base de datos no tiene efecto en ORDA.
+
+Todos los atributos de la dataclass se exponen como propiedades de la dataclass:
+
+
+
+Tenga en cuenta que estos objetos describen los atributos, pero no dan acceso a los datos. La lectura o escritura de los datos se realiza a través de los [objetos entidad](entities.md#using-entity-attributes).
+
+#### Atributos calculados y alias
+
+Los [atributos calculados](ordaClasses.md#computed-attributes) y [alias](ordaClasses.md#alias-attributes) son atributos "virtuales". Su valor no se guarda, sino que se evalúa cada vez que se accede a ellos. No pertenecen a la estructura subyacente de la base, sino que se construyen sobre ella y pueden utilizarse como cualquier atributo del modelo de datos.
+
+### Entity
+
+Una entidad es el equivalente a un registro. En realidad es un objeto que hace referencia a un registro de la base de datos. Puede verse como una instancia de una [dataclass](#dataclass), como un registro de la tabla correspondiente a la dataclass. Sin embargo, una entidad también contiene datos correlacionados a la base de datos relacionados con el datastore.
+
+La finalidad de la entidad es gestionar los datos (crear, actualizar, eliminar). Cuando se obtiene una referencia de entidad mediante una selección de entidad, también conserva información sobre la selección de entidad que permite la iteración a través de la selección.
+
+Un objeto de entidad es manejado a través de funciones y propiedades de la clase [**Entity**](../API/EntityClass.md).
+
+El objeto entidad en sí no puede ser copiado como un objeto:
+
+```4d
+ $myentity:=OB Copy(ds.Employee.get(1)) //devuelve null
+```
+
+Sin embargo, las propiedades de la entidad son enumerables:
+
+```4d
+ ARRAY TEXT($prop;0)
+ OB GET PROPERTY NAMES(ds.Employee.get(1);$prop)
+ //$prop contiene los nombres de todos los atributos de la entidad
+```
+
+### Entity selection
+
+Una selección de entidades es un objeto que contiene una o varias referencias a entidades pertenecientes a la misma dataclass. Suele crearse como resultado de una consulta o devolverse a partir de un atributo relacional. Una entity selection puede contener 0, 1 o X entidades de la dataclass -- donde X puede representar el número total de entidades contenidas en la dataclass.
+
+Un objeto de selección de entidades se maneja a través de funciones y propiedades de la clase [**EntitySelection**](../API/EntitySelectionClass.md).
+
+Ejemplo:
+
+```4d
+var $e : cs.EmployeeSelection //declara una variable objeto $e del tipo de clase EmployeeSelection
+$e:=ds.Employee.all() //asigna la referencia de la selección de entidad resultante a la variable $e
+```
+
+Las entity selections pueden estar "ordenadas" o "sin ordenar" ([ver abajo](#ordered-or-unordered-entity-selection)).
+
+> Las entity selections también pueden ser "compartibles" o "no compartibles", dependiendo de [cómo se hayan creado](entities.md#shareable-or-alterable-entity-selections).
+
+El objeto selección de entidades en sí no puede ser copiado como un objeto:
+
+```4d
+ $myentitysel:=OB Copy(ds.Employee.all()) //devuelve null
+```
+
+Las propiedades de las selecciones de entidades son sin embargo enumerables:
+
+```4d
+ ARRAY TEXT($prop;0)
+ OB GET PROPERTY NAMES(ds.Employee.all();$prop)
+ //$prop contiene los nombres de las propiedades de la selección de entidades
+ //("length", 00", "01"...)
+```
+
+#### Entity selections ordenadas o no ordenadas
+
+Por razones de optimización, por defecto, 4D ORDA normalmente crea selecciones de entidades no ordenadas, excepto cuando utiliza el método `orderBy( )` o utiliza opciones específicas. En esta documentación, a menos que se especifique, "selección de entidades" suele referirse a una "selección de entidades no ordenada".
+
+Las selecciones de entidades ordenadas sólo se crean cuando es necesario o cuando se solicitan específicamente mediante opciones, es decir, en los siguientes casos:
+
+- resultado de un `orderBy()` sobre una selección (de cualquier tipo) o de un `orderBy()` sobre una dataclass
+- resultado del método `newSelection()` con la opción `dk keep ordered`
+
+Las selecciones de entidades desordenadas se crean en los siguientes casos:
+
+- resultado de un `query()` estándar sobre una selección (de cualquier tipo) o de un `query()` sobre una dataclass,
+- resultado del método `newSelection()` sin opción,
+- resultado de uno de los métodos de comparación, sean cuales sean los tipos de selección de entrada: `or()`, `and()`, `minus()`.
+
+> Las siguientes selecciones de entidades son siempre **ordenadas**:
+>
+> - selecciones de entidades devueltas por 4D Server a un cliente remoto
+> - selecciones de entidades basadas en datastores remotos.
+
+Tenga en cuenta que cuando una selección de entidades ordenada se convierte en una selección de entidades no ordenada, se elimina toda referencia de entidad repetida.
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/entities.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/entities.md
new file mode 100644
index 00000000000000..2ac6f5af37a028
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/entities.md
@@ -0,0 +1,617 @@
+---
+id: entities
+title: Trabajar con los datos
+---
+
+En ORDA, se accede a los datos a través de [entidades](dsMapping.md#entity) y [selecciones de entidades](dsMapping.md#entity-selection). Estos objetos permiten crear, actualizar, buscar u ordenar los datos del datastore.
+
+## Crear una entidad
+
+Hay dos maneras de crear una nueva entidad en una dataclass:
+
+- Como las entidades son referencias a registros de la base de datos, se pueden crear entidades creando registros utilizando el lenguaje 4D y luego referenciarlos con funciones ORDA como [`entity.next()`](../API/EntityClass.md#next) o [`entitySelection.first()`](../API/EntitySelectionClass.md#first).
+- También puede crear una entidad utilizando la función [`dataClass.new()`](../API/DataClassClass.md#new).
+
+Tenga en cuenta que la entidad sólo se crea en la memoria. Si desea añadirla al datastore, debe llamar a la función [`entity.save()`](../API/EntityClass.md#save).
+
+Los atributos de la entidad están disponibles directamente como propiedades del objeto entidad. Para más información, consulte [Uso de los atributos de entidad](#using-entity-attributes).
+
+Por ejemplo, queremos crear una nueva entidad en la dataclass "Employee" en el datastore actual con "John" y "Dupont" asignados a los atributos firstname y name:
+
+```4d
+var $myEntity : cs.EmployeeEntity
+$myEntity:=ds.Employee.new() //Crear un nuevo objeto de tipo entidad
+$myEntity.name:="Dupont" //asignar 'Dupont' al atributo 'name'
+$myEntity.firstname:="John" //asignar 'John' al atributo 'firstname'
+$myEntity.save() //guardar la entidad
+```
+
+> Una entidad se define sólo en el proceso en el que fue creada. No se puede, por ejemplo, almacenar una referencia a una entidad en una variable interproceso y utilizarla en otro proceso.
+
+## Entidades y referencias
+
+Una entidad contiene una referencia a un registro 4D. Diferentes entidades pueden referenciar el mismo registro 4D. Además, como una entidad puede almacenarse en una variable objeto 4D, diferentes variables pueden contener una referencia a la misma entidad.
+
+Si ejecuta el siguiente código:
+
+```4d
+ var $e1; $e2 : cs.EmployeeEntity
+ $e1:=ds.Employee.get(1) //accede al empleado con ID 1
+ $e2:=$e1
+ $e1.name:="Hammer"
+ //ambas variables $e1 y $e2 comparten la referencia a la misma entidad
+ //$e2.name contiene "Hammer"
+ If($e1=$e2) //True
+```
+
+Esto es ilustrado por el siguiente gráfico:
+
+
+
+Ahora, si se ejecuta:
+
+```4d
+ var $e1; $e2 : cs.EmployeeEntity
+ $e1:=ds.Employee.get(1)
+ $e2:=ds.Employee.get(1)
+ $e1.name:="Hammer"
+ //variable $e1 contiene una referencia a una entidad
+ //variable $e2 contiene otra referencia a otra entidad
+ //$e2.name contiene "smith"
+ If($e1=$e2) //False
+```
+
+Esto es ilustrado por el siguiente gráfico:
+
+
+
+Sin embargo, hay que tener en cuenta que las entidades se refieren al mismo registro. En todos los casos, si se llama al método `entity.save( )`, el registro se actualizará (excepto en caso de conflicto, ver [Entity locking](#entity-locking)).
+
+De hecho, `$e1` y `$e2` no son la entidad misma, sino referencias a la entidad. Significa que puede pasarlos directamente a cualquier función o método, y actuará como un puntero, y más rápido que un puntero 4D. Por ejemplo:
+
+```4d
+ For each($entity;$selection)
+ do_Capitalize($entity)
+ End for each
+```
+
+Y el método es:
+
+```4d
+ $entity:=$1
+ $name:=$entity.lastname
+ If(Not($name=Null))
+ $name:=Uppercase(Substring($name;1;1))+Lowercase(Substring($name;2))
+ End if
+ $entity.lastname:=$name
+```
+
+Puede manejar las entidades como cualquier otro objeto en 4D y pasar sus referencias directamente como [parámetros](Concepts/parameters.md).
+
+:::info
+
+Con las entidades, no existe el concepto de "registro actual" como en el lenguaje 4D. Puede utilizar tantas entidades como necesite al mismo tiempo. Tampoco existe un bloqueo automático de una entidad (ver [Bloqueo de una entidad](#entity-locking)). Cuando se carga una entidad, se utiliza el mecanismo de [lazy loading](glossary.md#lazy-loading), lo que significa que sólo se carga la información necesaria. No obstante, en cliente/servidor, la entidad puede cargarse directamente de forma automática si es necesario.
+
+:::
+
+## Uso de los atributos de entidades
+
+Los atributos de entidad almacenan los datos y mapean los campos correspondientes en la tabla correspondiente.
+
+- los atributos de tipo **storage** pueden definirse u obtenerse como propiedades simples del objeto de la entidad,
+- los atributos del tipo **RelatedEntity** devolverán una entidad,
+- los atributos de tipo **relatedEntities** devolverán una selección de entidad,
+- los atributos de tipo **computed** y **alias** pueden devolver todo tipo de datos, dependiendo de cómo estén configurados.
+
+:::info
+
+Para más información sobre el tipo de atributo, consulte el párrafo [Atributos de almacenamiento y de relación](dsMapping.md#storage-and-relation-attributes).
+
+:::
+
+Por ejemplo, para obtener y definir un valor de atributo de almacenamiento de tipo cadena:
+
+```4d
+ $entity:=ds.Employee.get(1) //obtener el atributo de Employee con ID 1
+ $name:=$entity.lastname //obtener el nombre del empleado, por ejemplo "Smith"
+$entity.lastname:="Jones" //definir el nombr del empleado
+$entity.save() //guardar los cambios
+```
+
+:::note Notas
+
+- Database Object fields can be [associated with classes](../Develop/field-properties.md), in which case only objects of the defined class can be assigned to the entity attribute.
+- Los campos Blob de las bases de datos ([blobs escalares](Concepts/dt_blob.md) se convierten automáticamente a y desde atributos de objetos blob ([`4D.Blob`](Concepts/dt_blob.md)) cuando se manejan a través de ORDA. Cuando guarde un atributo de objeto blob, tenga en cuenta que, a diferencia del tamaño del objeto blob, que sólo está limitado por la memoria disponible, el tamaño del campo blob está limitado a 2 GB.
+
+:::
+
+El acceso a un atributo relacionado depende del tipo de atributo. Por ejemplo, con la siguiente estructura:
+
+
+
+Puede acceder a los datos a través del objeto(s) relacionado(s):
+
+```4d
+ $entity:=ds.Project.all().first().theClient //obtener la entidad Company asociada al proyecto
+ $EntitySel:=ds.Company.all().first().companyProjects //obtener la selección de proyectos de la empresa
+```
+
+Observe que tanto *theClient* como *companyProjects* en el ejemplo anterior son atributos de relación primaria y representan una relación directa entre las dos dataclasses. Sin embargo, los atributos de relación también pueden crearse a partir de rutas vía las relaciones de varios niveles, incluidas las referencias circulares. Por ejemplo, consideremos la siguiente estructura:
+
+
+
+Cada empleado puede ser gerente y puede tener un gerente. Para obtener el gerente del gerente de un empleado, puede simplemente escribir:
+
+```4d
+ $myEmp:=ds.Employee.get(50)
+ $manLev2:=$myEmp.manager.manager.lastname
+```
+
+### Asignación de archivos a atributos imagen o blob
+
+Puede almacenar imágenes en atributos imagen; de forma similar, puede almacenar cualquier dato binario en atributos blob.
+
+ORDA permite asignar al atributo los datos en sí, es decir, una imagen o un objeto blob, o una **referencia a un archivo** que contenga los datos. Sólo se guarda la ruta del archivo dentro de la entidad.
+
+Gracias a esta funcionalidad, puede reutilizar la misma imagen en varias entidades sin duplicarla, organizar los archivos como desee o utilizarlos fuera de 4D. Además, puede controlar el tamaño del archivo de datos.
+
+La referencia del archivo puede ser:
+
+- un objeto 4D.File
+- una ruta en formato POSIX
+
+Ejemplo:
+
+```4d
+Function createCompany($name : Texto; $logo : 4D.Fichero)
+
+ var $company : cs.CompanyEntity
+ $company:=ds.Company.new()
+
+ $company.name:=$name
+ //asignación utilizando un objeto file
+ $company.logo:=$logo
+ //asignación utilizando una ruta
+ $company.datablob:="/RESOURCES/"+$name+"/data.bin"
+ $company.save()
+```
+
+Independientemente de cómo se asigne el atributo (datos propiamente dichos o referencia a un archivo), el acceso de lectura al atributo es transparente desde el punto de vista del usuario.
+
+El archivo no tiene que existir en el disco en el momento de la asignación (no se devuelve ningún error en este caso). Si el archivo de referencia no se encuentra cuando se lee el atributo, se devuelve un valor null.
+
+:::tip
+
+4D carga imágenes y datos en una caché local. Si el archivo referenciado es modificado después de haber sido cargado, debe reasignar el archivo para que la modificación se tenga en cuenta en la aplicación.
+
+:::
+
+:::note
+
+La asignación de referencia de archivos solo se admite en modo local (4D Server o 4D mono usuario). Se genera un error si la asignación se realiza de forma remota o a través de una petición REST.
+
+:::
+
+### Asignar los valores a los atributos de relación
+
+En la arquitectura ORDA, los atributos de relación contienen directamente los datos relacionados con las entidades:
+
+- Un atributo de relación de tipo N->1 (**relatedEntity** kind) contiene una entidad
+- Un atributo de relación de tipo 1->N (**relatedEntities** kind) contiene una selección de entidades
+
+Veamos la siguiente estructura (simplificada):
+
+
+
+En este ejemplo, una entidad de la dataclass "Employee" contiene un objeto de tipo Entity en el atributo "employer" (o un valor nulo). Una entidad de la dataclass "Company" contiene un objeto de tipo EntitySelection en el atributo "staff" (o un valor nulo).
+
+> En ORDA, la propiedad Automática o Manual de las relaciones no tiene ningún efecto.
+
+Para asignar un valor directamente al atributo "employer", debe pasar una entidad existente de la dataclass "Company". Por ejemplo:
+
+```4d
+ $emp:=ds.Employee.new() //crear un empleado
+ $emp.lastname:="Smith" //asignar un valor a un atributo
+ $emp.employer:=ds.Company.query("name =:1"; "4D")[0] //asignar una entidad de empresa
+ $emp.save()
+```
+
+También puede obtener directamente la entidad relacionada "uno" a través de su valor de llave primaria (Number o Text). Por ejemplo:
+
+```4d
+ $emp:=ds.Employee.new()
+ $emp.lastname:="Wesson"
+ $emp.employer:=ds.Company.get(2)
+ //obtiene la entidad Company con valor de llave primaria 2
+ //se la asigna al empleado
+ $emp.save()
+```
+
+Esto resulta especialmente útil cuando se importan grandes cantidades de datos de una base de datos relacional. Este tipo de importación suele contener una columna "ID", que hace referencia a una llave primaria que puede asignarse directamente a un atributo de relación.
+
+Puede asignar o modificar el valor de un atributo de entidad asociado "1" a partir de la dataclass "N" directamente vía el atributo relacionado. Por ejemplo, si desea modificar el atributo de nombre de una entidad Company asociada de una entidad Employee, puede escribir:
+
+```code4d
+ $emp:=ds.Employee.get(2) //cargar la entidad Employee con la llave primaria 2
+ $emp.employer.name:="4D, Inc." //modificar el atributo name de la empresa relacionada
+ $emp.employer.save() //guardar el atributo relacionado
+ //se actualiza la entidad relacionada
+```
+
+## Crear una entity selection
+
+Puede crear un objeto de tipo [entity selection](dsMapping.md#entity-selection) de la siguiente manera:
+
+- Lance una búsqueda en las entidades [en una dataclass](API/DataClassClass.md#query) o en una [selección de entidades existente](API/EntitySelectionClass.md#query);
+- Uso de la función dataclass [`.all()`](API/DataClassClass.md#all) para seleccionar todas las entidades de una dataclass;
+- Usando el comando [`Create entity selection`](../commands/create-entity-selection.md) o la función [`.newSelection()`](API/DataClassClass.md#newselection) de la dataclass para crear una selección de entidades en blanco;
+- Utilizando la función [`.copy()`](API/EntitySelectionClass.md#copy) para duplicar una entity selection existente;
+- Utilizando una de las diversas funciones de la [clase Entity selection](API/EntitySelectionClass.md) que devuelve una nueva selección de entidades, como [`.or()`](API/EntitySelectionClass.md#or);
+- Utilizando un atributo de relación de tipo "related entities" (ver abajo).
+
+:::note
+
+Puede filtrar qué entidades deben incluirse en las selecciones de entidades para una clase de datos en función de toda regla de negocio, gracias a la funcionalidad [selección de entidad restringida](#restricting-entity-selections).
+
+:::
+
+Puede crear y utilizar simultáneamente tantas selecciones de entidades diferentes como desee para una dataclass. Tenga en cuenta que una selección de entidades sólo contiene referencias a entidades. Diferentes selecciones de entidades pueden contener las referencias a las mismas entidades.
+
+:::note
+
+Cuando se eliminan entidades, sus referencias permanecen en la selección de entidades con un valor *undefined*. En este caso, puede llamar a la función [`.clean()`](API/EntitySelectionClass.md#clean) para obtener una nueva selección de entidades pero sin las referencias de entidades eliminadas.
+
+:::
+
+### Entity selections compartibles o modificables
+
+Una entity selection puede ser **compartible** (legible por múltiples procesos, pero no alterable tras su creación) o **modificable** (soporta la función [`.add()`](API/EntitySelectionClass.md#add), pero sólo utilizable por el proceso actual).
+
+#### Propiedades
+
+Una entity selection **compartible** tiene las siguientes características:
+
+- puede almacenarse en un objeto compartido o en una colección compartida, y puede pasarse como parámetro entre varios procesos o workers;
+- puede almacenarse en varios objetos o colecciones compartidos, o en un objeto o colección compartido que ya pertenezca a un grupo;
+- no permite la adición de nuevas entidades. Al intentar añadir una entidad a una entity selection compartibles se producirá un error (1637 - Esta entity selection no puede modificarse). Para añadir una entidad a unaentity selection compartible, primero debe transformarla en una entity selection no compartible utilizando la función [`.copy()`](API/EntitySelectionClass.md#copy), antes de llamar a [`.add()`](API/EntitySelectionClass.md#add).
+
+> La mayoría de las funciones de selección de entidades (como [`.slice()`](API/EntitySelectionClass.md#slice), [`.and()`](API/EntitySelectionClass.md#and)...) soportar selecciones de entidades compartibles ya que no es necesario modificar la selección de entidades original (devuelven una nueva).
+
+Una entity selection **modificable** tiene las siguientes características:
+
+- no puede compartirse entre los procesos, ni almacenarse en un objeto o colección compartido. Si se intenta almacenar una entity selection no compartible en un objeto o colección compartido, se producirá un error (-10721 - Tipo de valor no soportado en un objeto o colección compartido);
+- acepta la adición de nuevas entidades, es decir, soporta la función [`.add()`](API/EntitySelectionClass.md#add).
+
+#### ¿Cómo se definen?
+
+La naturaleza **compartible** o **modificable** de una entity selection se define cuando se crea (no puede modificarse posteriormente). Puede conocer la naturaleza de una entity selection utilizando la función [.isAlterable()](API/EntitySelectionClass.md#isalterable) o el comando `OB Is shared`.
+
+Una nueva entity selection es **compartible** en los siguientes casos:
+
+- la nueva entity selection resulta de una función de clase ORDA aplicada a una dataClass: [dataClass.all()](API/DataClassClass.md#all), [dataClass.fromCollection()](API/DataClassClass.md#fromcollection), [dataClass.query()](API/DataClassClass.md#query),
+- la nueva entity selection se basa en una relación [entity.*attributeName*](API/EntityClass.md#attributename) (por ejemplo, "company.employees") cuando *attributeName* es un atributo relacionado uno a muchos pero la entidad no pertenece a una entity selection.
+- la nueva entity selection se copia explícitamente como compartible con [entitySelection.copy()](API/EntitySelectionClass.md#copy) o `OB Copy` (es decir, con la opción `ck shared`).
+
+Ejemplo:
+
+```4d
+var $myComp : cs.CompanyEntity
+var $employees : cs.EmployeeSelection
+$myComp:=ds.Company.get(2) //$myComp no pertenece a una selección de entidades
+$employees:=$myComp.employees //$employees es compartible
+```
+
+Una nueva entity selection es **compartible** en los siguientes casos:
+
+- la nueva entity selection creada en un espacio vacío utilizando la función [dataClass.newSelection()](API/DataClassClass.md#newselection) o el comando `Create entity selection`,
+- la nueva entity selection se copia explícitamente como modificable con [entitySelection.copy()](API/EntitySelectionClass.md#copy) o `OB Copy` (es decir, sin la opción `ck shared`).
+
+Ejemplo:
+
+```4d
+var $toModify : cs.CompanySelection
+$toModify:=ds.Company.all().copy() //$toModify es alterable
+```
+
+Una nueva entity selection **hereda** de la naturaleza de la entity selection original en los siguientes casos:
+
+- la nueva entity selection resulta de una de las varias funciones de clase ORDA aplicadas a una entity selection existente ([.query()](API/EntitySelectionClass.md#query), [.slice()](API/EntitySelectionClass.md#slice), etc.) .
+- la nueva entity selection se basa en una relación:
+ - [entity.*attributeName*](API/EntityClass.md#attributename) (por ejemplo, "company.employees") cuando *attributeName* es un atributo relacionado uno a muchos y la entidad pertenece a una entity selection (misma naturaleza que [.getSelection()](API/EntityClass.md#getselection)),
+ - [entitySelection.*attributeName*](API/EntitySelectionClass.md#attributename) (por ejemplo, "employees.employer") cuando *attributeName* es un atributo relacionado (misma naturaleza que la entity selection),
+ - [.extract()](API/EntitySelectionClass.md#extract) cuando la colección resultante contiene selecciones de entidades (de la misma naturaleza que la entity selection).
+
+Ejemplos:
+
+```4d
+var $highSal; $lowSal : cs.EmployeeSelection
+var $comp; $comp2 : cs.Company
+
+$highSal:=ds.Employee.query("salary >= :1"; 1000000)
+
+ //$highSal es compartible debido a la consulta a la dataClass
+$comp:=$highSal.employer //$comp es compartible porque $highSal es compartible
+
+$lowSal:=ds.Employee.query("salary <= :1"; 10000).copy()
+ //$lowSal es alterable debido a copy()
+$comp2:=$lowSal.employer //$comp2 es alterable porque $lowSal es alterable
+```
+
+:::note Entity selections devueltas por el servidor
+
+En la arquitectura cliente/servidor, las entity selections devueltas por el servidor son siempre compartibles en el cliente, incluso si [`copy()`](API/EntitySelectionClass.md#copy) fue llamada en el servidor. Para que dicha selección de entidades sea modificable en el cliente, es necesario ejecutar [`copy()`](API/EntitySelectionClass.md#copy) del lado del cliente. Ejemplo:
+
+```4d
+/una función se ejecuta siempre en el servidor
+exposed Function getSome() : cs.MembersSelection
+ devuelve This.query("ID >= :1"; 15).orderBy("ID ASC")
+
+ //en un método, se ejecuta en el lado remoto
+var $result : cs.MembersSelection
+var $alterable : Boolean
+$result:=ds.Members.getSome() //$result es compartible
+$alterable:=$result.isAlterable() //False
+
+$result:=ds.Members.getSome().copy() // $result es ahora alterable
+$alterable:=$result.isAlterable() // True
+```
+
+:::
+
+#### Compartir una selección de entidades entre procesos (ejemplo)
+
+Se trabaja con dos selecciones de entidades que se quieren pasar a un proceso worker para que envíe correos a las personas adecuadas:
+
+```4d
+
+var $paid; $unpaid : cs.InvoicesSelection
+//Obtenemos selecciones de entidades para facturas pagadas y no pagadas
+$paid:=ds.Invoices.query("status=:1"; "Paid")
+$unpaid:=ds.Invoices.query("status=:1"; "Unpaid")
+
+//Pasamos referencias de selección de entidades como parámetros al worker
+CALL WORKER("mailing"; "sendMails"; $paid; $unpaid)
+
+```
+
+El método `sendMails`:
+
+```4d
+
+#DECLARE ($paid : cs.InvoicesSelection; $unpaid : cs.InvoicesSelection)
+ var $invoice : cs.InvoicesEntity
+
+ var $server; $transporter; $email; $status : Object
+
+ //Preparar emails
+ $server:=New object()
+ $server.host:="exchange.company.com"
+ $server.user:="myName@company.com"
+ $server.password:="my!!password"
+ $transporter:=SMTP New transporter($server)
+ $email:=New object()
+ $email.from:="myName@company.com"
+
+ //Bucles en selecciones de entidades
+ For each($invoice;$paid)
+ $email.to:=$invoice.customer.address // dirección de correo electrónico del cliente
+ $email.subject:="Payment OK for invoice # "+String($invoice.number)
+ $status:=$transporter.send($email)
+ End for each
+
+ For each($invoice;$unpaid)
+ $email.to:=$invoice.customer.address // dirección de correo electrónico del cliente
+ $email.subject:="Please pay invoice # "+String($invoice.number)
+ $status:=$transporter.send($email)
+ End for each
+```
+
+### Selecciones de entidades y atributos de almacenamiento
+
+Todos los atributos de almacenamiento (texto, número, booleano, fecha) están disponibles como propiedades de las selecciones de entidades, así como de las entidades. Cuando se utiliza junto con una selección de entidad, un atributo escalar devuelve una colección de valores escalares. Por ejemplo:
+
+```4d
+var $locals : cs.PersonSelection
+var $localEmails : Collection
+$locals:=ds.Person.query("city = :1"; "San Jose") //selección de entidades de personas
+$localEmails:=$locals.emailAddress //colección de direcciones de correo electrónico (cadenas)
+```
+
+Este código devuelve en *$localEmails* una colección de direcciones de correo electrónico como cadenas.
+
+### Selecciones de entidades y atributos de relación
+
+Además de la variedad de formas en que puede consultar, también puede utilizar los atributos de relación como propiedades de selecciones de entidades para devolver nuevas selecciones de entidades. Por ejemplo, consideremos la siguiente estructura:
+
+
+
+```4d
+var $myParts : cs.PartSelection
+var $myInvoices : cs.InvoiceSelection
+$myParts:=ds.Part.query("ID < 100") //Retorna las piezas con ID inferior a 100
+$myInvoices:=$myParts.invoiceItems.invoice
+ //Todas las facturas con al menos una partida relacionada con una pieza en $myParts
+```
+
+La última línea devolverá en *$myInvoices* una selección de entidades de todas las facturas que tengan al menos una partida de factura relacionada con una parte en la selección de entidades myParts. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades, el resultado es siempre otra selección de entidades, aunque sólo se devuelva una entidad. Cuando se utiliza un atributo de relación como propiedad de una selección de entidades y no se devuelve ninguna entidad, el resultado es una selección de entidades vacía, no nula.
+
+## Restringir la selección de entidades
+
+En ORDA, puede crear filtros para restringir el acceso a entidades de cualquiera de sus clases de datos. Una vez implementado, se aplica automáticamente un filtro siempre que se accede a las entidades de la dataclass, ya sea mediante **funciones de clase ORDA** como [`all()`](../API/DataClassClass.md#all) o [`query()`](../API/EntitySelectionClass.md#query), o por la [**API REST**](../category/api-dataclass) (que implica el [Explorador de datos](../Admin/dataExplorer.md) y [remote datastores](remoteDatastores.md)).
+
+Un filtro crea una vista restringida de los datos, basada en cualquier regla de negocio, como el usuario de la sesión actual. Por ejemplo, en una aplicación utilizada por vendedores para hacer tratos con sus clientes, puede restringir los clientes leídos a los gestionados por el vendedor autenticado.
+
+:::info
+
+Los filtros se aplican a las **entidades**. Si desea restringir el acceso a una **clase de datos** o a uno o varios de sus **atributos**, puede utilizar los [privilegios de sesión](privileges.md), que son más apropiados en este caso.
+
+:::
+
+### Cómo definir un filtro de restricción
+
+Se crea un filtro para una dataclass definiendo una función `event restrict` en la [**clase dataclass**](dsMapping.md#dataclass) de la dataclass. El filtro se activa automáticamente.
+
+### `Function event restrict`
+
+#### Sintaxis
+
+```4d
+Function event restrict() -> $result : cs.*DataClassName*Selection
+// código
+```
+
+Esta función se llama cada vez que se solicita una selección de entidades o una entidad de la dataclass. El filtro se ejecuta una vez, cuando se crea la selección de entidades.
+
+El filtro debe devolver una selección de entidades de la clase de datos. Puede ser una selección de entidades creada a partir de una consulta, almacenada en el [`Storage`], etc.
+
+:::note
+
+Por razones de rendimiento, recomendamos utilizar **atributos indexados** en la definición del filtro.
+
+:::
+
+La función debe devolver una selección de entidades válida de la dataclass. No se aplica ningún filtro (se devuelven todas las entidades correspondientes de la solicitud inicial) si:
+
+- la función devuelve **null**,
+- la función devuelve **indefinido**,
+- la función no devuelve una selección de entidades válida.
+
+#### Ejemplo
+
+Cuando se accede desde una petición web o REST, queremos que la clase de datos Customers sólo exponga los clientes que pertenecen a la persona de ventas identificada. Durante la fase de autenticación, el vendedor se almacena en el objeto `Session`. También se gestionan otros tipos de solicitudes.
+
+```4d
+Class extends DataClass
+
+
+Function event restrict() : cs.CustomersSelection
+
+
+ //Trabajamos en un contexto web o REST
+ If (Session#Null)
+
+ Case of
+ // Sólo devuelve los clientes del vendedor autenticado almacenado en la sesión
+ : (Session.storage.salesInfo#Null)
+ return This.query("sales.internalId = :1"; Session.storage.salesInfo.internalId)
+
+ //Explorador de datos - No se aplica ningún filtro
+ : (Session.hasPrivilege("WebAdmin"))
+ return Null
+ Else
+ //No se pueden leer clientes
+ return This.newSelection()
+
+ End case
+
+ Else // Trabajamos en cliente servidor
+ return This.query("sales.userName = :1"; Current user)
+ End if
+```
+
+### Detalles de activación del filtro
+
+Los filtros se aplican a todas las peticiones ORDA o REST ejecutadas en sus proyectos 4D (arquitecturas autónomas y cliente/servidor). Un filtro se activa en cuanto se abre el proyecto, es decir, puede activarse en el método de base de datos `On Startup`.
+
+:::info
+
+Los filtros no se aplican a las selecciones heredadas de registros manejadas a través de la interfaz 4D o el lenguaje 4D (por ejemplo cuando se llama a `ALL RECORDS`).
+
+:::
+
+| Funciones | Comentario |
+| -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [dataclass.get()](../API/DataClassClass.md#get) | Si la entidad no coincide con el filtro, se devuelve `null` |
+| [entity.reload()](../API/EntityClass.md#reload) | Sólo en almacenes de datos cliente/servidor y remotos |
+| [dataclass.all()](../API/DataClassClass.md#all) | |
+| [dataclass.fromCollection()](../API/DataClassClass.md#fromcollection) |
En caso de actualización, sólo pueden actualizarse las entidades que coincidan con el filtro. Si la colección hace referencia a entidades que no coinciden con el filtro, se crean como nuevas entidades (si no hay error de llave primaria duplicada)
En caso de creación, las entidades que no coinciden con el filtro se crean pero no se leerán después de la creación
|
+| [entitySelection.and()](../API/EntitySelectionClass.md#and) | Sólo se devuelven las entidades que coinciden con el filtro |
+| [entitySelection.or()](../API/EntitySelectionClass.md#or) | Sólo se devuelven las entidades que coinciden con el filtro |
+| [entitySelection.minus()](../API/EntitySelectionClass.md#minus) | Sólo se devuelven las entidades que coinciden con el filtro |
+| [dataclass.query()](../API/DataClassClass.md#query) | |
+| [entitySelection.query()](../API/EntitySelectionClass.md#query) | |
+| [entitySelection.attributeName](../API/EntitySelectionClass.md#attributename) | Filtro aplicado si *attributeName* es una entidad relacionada o entidades relacionadas de una clase de datos filtrada (incluyendo alias o atributo calculado) |
+| [entity.attributeName](../API/EntityClass.md#attributename) | Filtro aplicado si *attributeName* corresponde a entidades relacionadas de una clase de datos filtrada (incluyendo alias o atributo calculado) |
+| [Create entity selection](../commands/create-entity-selection.md) | |
+
+Otras funciones ORDA que acceden a los datos no activan directamente el filtro, pero sin embargo se benefician de él. Por ejemplo, la función [`entity.next()`](../API/EntityClass.md#next) devolverá la siguiente entidad de la selección de entidades ya filtrada. Por otro lado, si la selección de entidades no está filtrada, [`entity.next()`](../API/EntityClass.md#next) funcionará en entidades no filtradas.
+
+:::note
+
+Si hay un error en el filtro en tiempo de ejecución, se lanza como si el error viniera de la propia función ORDA.
+
+:::
+
+## Bloqueo de una entidad
+
+A menudo es necesario gestionar los posibles conflictos que pueden surgir cuando varios usuarios o procesos cargan e intentan modificar las mismas entidades al mismo tiempo. El bloqueo de registros es una metodología utilizada en las bases de datos relacionales para evitar actualizaciones incoherentes de los datos. El concepto consiste en bloquear un registro al leerlo para que ningún otro proceso pueda actualizarlo o, alternativamente, comprobar al guardar un registro que ningún otro proceso lo ha modificado desde que se leyó. El primero se denomina **bloqueo de registro pesimista** y garantiza que un registro modificado pueda escribirse a expensas de bloquear los registros a otros usuarios. Este último se conoce como **bloqueo de registro optimista** y cambia la garantía de los privilegios de escritura en el registro por la flexibilidad de decidir privilegios de escritura sólo si el registro necesita ser actualizado. En el bloqueo de registros pesimista, el registro se bloquea aunque no haya necesidad de actualizarlo. En el bloqueo optimista de registros, la validez de la modificación de un registro se decide en el momento de la actualización.
+
+ORDA le ofrece dos modos de bloqueo de entidad:
+
+- un modo automático "optimista", adecuado para la mayoría de las aplicaciones,
+- un modo "pesimista" que permite bloquear las entidades antes de su acceso.
+
+### Bloqueo optimista automático
+
+Este mecanismo automático se basa en el concepto de "bloqueo optimista", especialmente adaptado a los problemas de las aplicaciones web. Este concepto se caracteriza por los siguientes principios de funcionamiento:
+
+- Todas las entidades pueden cargarse siempre en lectura-escritura; no existe el "bloqueo" *a priori* de las entidades.
+- Cada entidad tiene un sello de bloqueo interno que se incrementa cada vez que se guarda.
+- Cuando un usuario o proceso intenta guardar una entidad utilizando el método `entity.save( )`, 4D compara el valor del marcador de la entidad a guardar con el de la entidad encontrada en los datos (en el caso de modificación):
+ - Cuando los valores coinciden, se guarda la entidad y se incrementa el valor del marcador interno.
+
+ - Cuando los valores no coinciden, significa que otro usuario ha modificado esta entidad mientras tanto. No se guarda y se devuelve un error.
+
+El siguiente diagrama ilustra el bloqueo optimista:
+
+1. Dos procesos cargan la misma entidad.

+
+2. El primer proceso modifica la entidad y valida el cambio. Se llama al método `entity.save( )`. El motor 4D compara automáticamente el valor del marcador interno de la entidad modificada con el de la entidad almacenada en los datos. Dado que coinciden, la entidad se guarda y su valor de marcador se incrementa.

+
+3. El segundo proceso también modifica la entidad cargada y valida sus cambios. Se llama al método `entity.save( )`. Dado que el valor del sello de la entidad modificada no coincide con el de la entidad almacenada en los datos, no se realiza el guardado y se devuelve un error.

+
+Esto también puede ilustrarse con el siguiente código:
+
+```4d
+ $person1:=ds.Person.get(1) //Referencia a la entidad
+ $person2:=ds.Person.get(1) //Otra referencia a la misma entidad
+ $person1.name:="Bill"
+ $result:=$person1.save() //$result.success=true, cambio guardado
+ $person2.name:="William"
+ $result:=$person2.save() //$result.success=false, cambio no guardado
+```
+
+En este ejemplo, asignamos a $person1 una referencia a la entidad person con una llave de 1. A continuación, asignamos otra referencia de la misma entidad a la variable $person2. Con $person1, cambiamos el nombre de la persona y guardamos la entidad. Cuando intentamos hacer lo mismo con $person2, 4D verifica que la entidad en el disco es la misma que cuando se asignó por primera vez la referencia en $person1. Como no es lo mismo, devuelve false en la propiedad success y no guarda la segunda modificación.
+
+Cuando se produce esta situación, puede, por ejemplo, volver a cargar la entidad desde el disco utilizando el método `entity.reload()` para poder intentar realizar de nuevo la modificación. El método `entity.save()` también propone una opción "automerge" para guardar la entidad en caso de que los procesos modificaran atributos que no fueran los mismos.
+
+> Los mardadores de registro no se utilizan en las de **transacciones** porque en este contexto sólo existe una única copia de un registro. Sea cual sea el número de entidades que hacen referencia a un registro, se modifica la misma copia, por lo que las operaciones `entity.save()` nunca generarán errores de marcador.
+
+### Bloqueo pesimista
+
+Puede bloquear y desbloquear las entidades bajo pedido cuando acceda a los datos. Cuando una entidad es bloqueada por un proceso, es cargada en lectura/escritura en este proceso pero es bloqueada para todos los otros procesos. La entidad sólo puede cargarse en modo de sólo lectura en estos procesos; sus valores no pueden editarse ni guardarse.
+
+Esta funcionalidad se basa en dos funciones de la clase `Entity`:
+
+- [`entity.lock()`](../API/EntityClass.md#lock)
+- [`entity.unlock()`](../API/EntityClass.md#unlock)
+
+Para más información, consulte las descripciones de estas funciones.
+
+> Los bloqueos pesimistas también pueden gestionarse a través de la [REST API](../REST/$lock.md).
+
+### Utilización simultánea de los bloqueos clásicos 4D y de los bloqueos pesimistas ORDA
+
+El uso de comandos clásicos y ORDA para bloquear registros se basa en los siguientes principios:
+
+- Un bloqueo definido con un comando 4D clásico en un registro impide a ORDA bloquear la entidad correspondiente al registro.
+- Un bloqueo definido con ORDA en una entidad impide que los comandos 4D clásicos bloqueen el registro que coincide a la entidad.
+
+Estos principios se muestran en el siguiente diagrama:
+
+
+
+Los **bloqueos de transacciones** también se aplican tanto a los comandos clásicos como a los comandos ORDA. En una aplicación multiproceso o multiusuario, un bloqueo definido en una transacción en un registro por un comando clásico tendrá como resultado impedir que cualquier otro proceso bloquee las entidades relacionadas con este registro (o a la inversa), hasta que la transacción sea validada o cancelada.
+
+- Ejemplo con un bloqueo definido por un comando clásico:

+- Ejemplo con un bloqueo definido por una función ORDA:

diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/global-stamp.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/global-stamp.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/global-stamp.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/global-stamp.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/glossary.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/glossary.md
similarity index 100%
rename from i18n/es/docusaurus-plugin-content-docs/version-20-R9/ORDA/glossary.md
rename to i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/glossary.md
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/orda-events.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/orda-events.md
new file mode 100644
index 00000000000000..884af1066d3c9f
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/orda-events.md
@@ -0,0 +1,702 @@
+---
+id: orda-events
+title: Events
+---
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------------------------------------------------------------- |
+| 21 | Added events: validateSave / saving / afterSave / validateDrop / dropping / afterDrop |
+| 20 R10 | touched event added |
+
+
+
+ORDA events are functions that are automatically invoked by ORDA each time entities and entity attributes are manipulated (added, deleted, or modified). You can write very simple events, and then make them more sophisticated.
+
+No se puede activar directamente la ejecución de la función de evento. Events are called automatically by ORDA based on user actions or operations performed through code on entities and their attributes.
+
+:::tip Entrada de blog relacionada
+
+[ORDA – Handle an event-driven logic during data persistence actions](https://blog.4d.com/orda-handle-an-event-driven-logic-during-data-persistence-actions)
+
+:::
+
+:::info Nota de compatibilidad
+
+ORDA events in the datastore are equivalent to triggers in the 4D database. However, actions triggered at the 4D database level using the 4D classic language commands or standard actions do not trigger ORDA events.
+
+:::
+
+## Generalidades
+
+### Nivel del evento
+
+A event function is always defined in the [Entity class](../ORDA/ordaClasses.md#entity-class).
+
+It can be set at the **entity** level and/or the **attribute** level (it includes [**computed attributes**](../ORDA/ordaClasses.md#computed-attributes)). In the first case, it will be triggered for any attributes of the entity; on the other case, it will only be triggered for the targeted attribute.
+
+For the same event, you can define different functions for different attributes.
+
+You can also define the same event at both attribute and entity levels. The attribute event is called first and then the entity event.
+
+### Ejecución en configuraciones remotas
+
+Normalmente, los eventos ORDA se ejecutan en el servidor.
+
+In client/server configuration however, the `touched()` event function can be executed on the **server or the client**, depending on the use of [`local`](./ordaClasses.md#local-functions) keyword. A specific implementation on the client side allows the triggering of the event on the client.
+
+:::note
+
+ORDA [`constructor()`](./ordaClasses.md#class-constructor) functions are always executed on the client.
+
+:::
+
+Con otras configuraciones remotas (p. ej. Qodly applications, [REST API requests](../REST/REST_requests.md), or requests through [`Open datastore`](../commands/open-datastore.md)), the `touched()` event function is always executed **server-side**. It means that you have to make sure the server can "see" that an attribute has been touched to trigger the event (see below).
+
+### Tabla resumen
+
+La siguiente tabla lista los eventos ORDA junto con sus reglas.
+
+| Evento | Nivel | Nombre de la función | (C/S) Ejecutado en | Can stop action by returning an error |
+| :------------------------- | :------- | :------------------------------------------------------ | :------------------------------------------------------------------: | ------------------------------------- |
+| Instanciación de entidades | Entity | [`constructor()`](./ordaClasses.md#class-constructor-1) | client | no |
+| Atributo tocado | Atributo | `event touched ()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword | no |
+| | Entity | `event touched()` | Depends on [`local`](../ORDA/ordaClasses.md#local-functions) keyword | no |
+| Before saving an entity | Atributo | `validateSave ()` | server | sí |
+| | Entity | `validateSave()` | server | sí |
+| When saving an entity | Atributo | `saving ()` | server | sí |
+| | Entity | `saving()` | server | sí |
+| After saving an entity | Entity | `afterSave()` | server | no |
+| Before dropping an entity | Atributo | `validateDrop ()` | server | sí |
+| | Entity | `validateDrop()` | server | sí |
+| When dropping an entity | Atributo | `dropping ()` | server | sí |
+| | Entity | `dropping()` | server | sí |
+| After dropping an entity | Entity | `afterDrop()` | server | no |
+
+:::note
+
+The [`constructor()`](./ordaClasses.md#class-constructor-1) function is not actually an event function but is always called when a new entity is instantiated.
+
+:::
+
+## Parámetro *event*
+
+Event functions accept a single *event* object as parameter. When the function is called, the parameter is filled with several properties:
+
+| Nombre de propiedad | Disponibilidad | Tipo | Descripción | |
+| :------------------ | :----------------------------------------------------------------------------------------------------------------------- | :------------------- | :-------------------------------------------------------------------------------------------------------------------- | - |
+| "kind" | siempre | String | Event name: "touched", "validateSave", "saving", "afterSave", "validateDrop", "dropping", "afterDrop" | |
+| *attributeName* | Only for events implemented at attribute level ("validateSave", "saving", "validateDrop", "dropping") | String | Nombre del atributo (por ejemplo, "nombre") | |
+| *dataClassName* | siempre | String | Nombre de la Dataclass (*ej.* "Company") | |
+| "savedAttributes" | Only in [`afterSave()`](#function-event-aftersave) | Collection of String | Names of attributes properly saved | |
+| "droppedAttributes" | Only in [`afterDrop()`](#function-event-afterdrop) | Collection of String | Names of attributes properly dropped | |
+| "saveStatus" | Only in [`afterSave()`](#function-event-aftersave) | String | "success" if the save was successful, "failed" otherwise | |
+| "dropStatus" | Only in [`afterDrop()`](#function-event-afterdrop) | String | "success" if the drop was successful, "failed" otherwise | |
+
+## Error object
+
+[Some event functions](#summary-table) can return an **error object** to raise an error and stop the running action.
+
+When an error occurs in an event, the other events are stopped at the first raised error and the action (save or drop) is also stopped. This error is sent before other potential errors like [stamp has changed, entity locked](../API/EntityClass.md#save), etc.
+
+### Error object properties
+
+| Propiedad | Tipo | Descripción | Set by the developer |
+| ------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
+| errCode | Integer | Same as for [`Last errors`](../commands/last-errors.md) command | Sí |
+| message | Text | Same as for [`Last errors`](../commands/last-errors.md) command | Sí |
+| extraDescription | Object | Free information to set up | Sí |
+| seriousError | Boolean | Used only with validate events (see below). Will insert a specific `status` value in the [`save()`](../API/EntityClass.md#save) or [`drop()`](../API/EntityClass.md#drop) function:
If true: `dk status serious validation error`
If false: `dk status validation failed`
| Yes (default is false) |
+| componentSignature | Text | Always "DBEV" | No |
+
+- The errors are stacked in the `errors` collection property of the **Result object** returned by the [`save()`](../API/EntityClass.md#save) or [`drop()`](../API/EntityClass.md#drop) functions.
+- In case of an error triggered by a **validate** event, the `fatalError` property allows you to insert a specific `status` and its associated `statusText` in the **Result object** returned by the [`save()`](../API/EntityClass.md#save) or [`drop()`](../API/EntityClass.md#drop) functions:
+ - If **false**: `status` gets `dk status validation failed` and `statusText` gets "Mild Validation Error". Such errors do not require a [try catch](../Concepts/error-handling.md#trycatchend-try) and are not stacked in the errors returned by the [`Last errors`](../commands/last-errors.md) command.
+ - If **true**: `status` gets `dk status serious validation error` and `statusText` gets "Serious Validation Error". Such errors require a [try catch](../Concepts/error-handling.md#trycatchend-try) and are not stacked in the errors returned by the [`Last errors`](../commands/last-errors.md) command. They are raised at the end of the event and reach the client requesting the save/drop action (REST client for example).
+- In case of an error triggered by a **saving/dropping** event, when an error object is returned, the error is always raised as a serious error (`dk status serious error`) whatever the `seriousError` property value.
+
+## Event function description
+
+### `Function event touched`
+
+#### Sintaxis
+
+```4d
+{local} Function event touched($event : Object)
+{local} Function event touched ($event : Object)
+// code
+```
+
+This event is triggered each time a value is modified in the entity.
+
+- If you defined the function at the entity level (first syntax), it is triggered for modifications on any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is triggered only for modifications on this attribute.
+
+This event is triggered as soon as the 4D Server / 4D engine can detect a modification of attribute value which can be due to the following actions:
+
+- in **client/server with the [`local` keyword](../ORDA/ordaClasses.md#local-functions)** or in **4D single-user**:
+ - el usuario define un valor en un formulario 4D,
+ - el código 4D realiza una asignación con el operador `:=`. The event is also triggered in case of self-assignment (`$entity.attribute:=$entity.attribute`).
+- in **client/server without the `local` keyword**: some 4D code that makes an assignment with the `:=` operator is [executed on the server](../commands-legacy/execute-on-server.md).
+- in **client/server without the `local` keyword**, in **[Qodly application](https://developer.qodly.com/docs)** and **[remote datastore](../commands/open-datastore.md)**: the entity is received on 4D Server while calling an ORDA function (on the entity or with the entity as parameter). It means that you might have to implement a *refresh* or *preview* function on the remote application that sends an ORDA request to the server and triggers the event.
+- with the REST server: the value is received on the REST server with a [REST request](../REST/$method.md#methodupdate) (`$method=update`)
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+If this function [throws](../commands/throw) an error, it will not stop the undergoing action.
+
+:::note
+
+Este evento también se activa:
+
+- when attributes are assigned by the [`constructor()`](./ordaClasses.md#class-constructor-1) event,
+- when attributes are edited through the [Data Explorer](../Admin/dataExplorer.md).
+
+:::
+
+#### Ejemplo 1
+
+You want to uppercase all text attributes of an entity when it is updated.
+
+```4d
+ //ProductsEntity class
+Function event touched($event : Object)
+
+ If (Value type(This[$event.attributeName])=Is text)
+ This[$event.attributeName]:=Uppercase(This[$event.attributeName])
+ End if
+```
+
+#### Ejemplo 2
+
+The "touched" event is useful when it is not possible to write indexed query code in [`Function query()`](./ordaClasses.md#function-query-attributename) for a [computed attribute](./ordaClasses.md#computed-attributes).
+
+This is the case for example, when your [`query`](./ordaClasses.md#function-query-attributename) function has to compare the value of different attributes from the same entity with each other. You must use formulas in the returned ORDA query -- which triggers sequential queries.
+
+To fully understand this case, let's examine the following two calculated attributes:
+
+```4d
+Function get onGoing() : Boolean
+ return ((This.departureDate<=Current date) & (This.arrivalDate>=Current date))
+
+Function get sameDay() : Boolean
+ return (This.departureDate=This.arrivalDate)
+```
+
+Even though they are very similar, these functions cannot be associated with identical queries because they do not compare the same types of values. The first compares attributes to a given value, while the second compares attributes to each other.
+
+- For the *onGoing* attribute, the [`query`](./ordaClasses.md#function-query-attributename) function is simple to write and uses indexed attributes:
+
+```4d
+Function query onGoing($event : Object) : Object
+ var $operator : Text
+ var $myQuery : Text
+ var $onGoingValue : Boolean
+ var $parameters : Collection
+ $parameters:=New collection()
+
+ $operator:=$event.operator
+ Case of
+ : (($operator="=") | ($operator="==") | ($operator="==="))
+ $onGoingValue:=Bool($event.value)
+ : (($operator="!=") | ($operator="!=="))
+ $onGoingValue:=Not(Bool($event.value))
+ Else
+ return {query: ""; parameters: $parameters}
+ End case
+
+ $myQuery:=($onGoingValue) ? "departureDate <= :1 AND arrivalDate >= :1" : "departureDate > :1 OR arrivalDate < :1"
+ // the ORDA query string uses indexed attributes, it will be indexed
+ $parameters.push(Current date)
+ return {query: $myQuery; parameters: $parameters}
+```
+
+- For the *sameDay* attribute, the [`query`](./ordaClasses.md#function-query-attributename) function requires an ORDA query based on formulas and will be sequential:
+
+```4d
+Function query sameDay($event : Object) : Text
+ var $operator : Text
+ var $sameDayValue : Boolean
+
+ $operator:=$event.operator
+ Case of
+ : (($operator="=") | ($operator="==") | ($operator="==="))
+ $sameDayValue:=Bool($event.value)
+ : (($operator="!=") | ($operator="!=="))
+ $sameDayValue:=Not(Bool($event.value))
+ Else
+ return ""
+ End case
+
+ return ($sameDayValue) ? "eval(This.departureDate = This.arrivalDate)" : "eval(This.departureDate != This.arrivalDate)"
+ // the ORDA query string uses a formula, it will not be indexed
+
+```
+
+- Using a **scalar** *sameDay* attribute updated when other attributes are "touched" will save time:
+
+```4d
+ //BookingEntity class
+
+Function event touched departureDate($event : Object)
+
+ This.sameDay:=(This.departureDate = This.arrivalDate)
+//
+//
+Function event touched arrivalDate($event : Object)
+
+ This.sameDay:=(This.departureDate = This.arrivalDate)
+
+```
+
+#### Ejemplo 3 (diagrama): cliente/servidor con la palabra clave `local`:
+
+```mermaid
+
+sequenceDiagram
+
+ Client->>+Server: $people:=ds.People.all().first()
+
+ Client->>+Client: $people.lastname:="Brown"
+ Note over Client: local Function event touched lastname($event : Object) This.lastname:=Uppercase(This.lastname)
+
+Note over Client:$people.lastname is uppercased
+
+ Client->>+Server: $people.apply()
+
+ Note over Server: The $people entity is received with the lastname attribute uppercased
+
+```
+
+#### Example 4 (diagram): Client/server without the `local` keyword
+
+```mermaid
+
+sequenceDiagram
+
+ Client->>+Server: $people:=ds.People.all().first()
+
+ Client->>+Client: $people.lastname:="Brown"
+
+ Note over Client:$people.lastname is not uppercased
+
+ Client->>+Server: $people.apply()
+
+ Note over Server: Function event touched lastname($event : Object) This.lastname:=Uppercase(This.lastname)
+
+ Server-->>-Client: The $people entity is updated
+
+ Note over Client:$people.lastname is uppercased
+
+
+```
+
+#### Ejemplo 5 (diagrama): Aplicación Qodly
+
+```mermaid
+
+sequenceDiagram
+
+Qodly page->>+ Server: Get an entity into the People Qodly source
+
+Qodly page->>+Qodly page: The user updates People.lastname
+
+Note over Qodly page: The People Qodly source lastname attribute is not uppercased
+
+Qodly page->>+ Server: Function call People.apply()
+
+Note over Server: Function event touched lastname($event : Object) This.lastname:=Uppercase(This.lastname)
+
+Server-->>-Qodly page: The People Qodly source is updated
+Note over Qodly page: The People Qodly source lastname attribute is uppercased
+
+
+```
+
+### `Function event validateSave`
+
+#### Sintaxis
+
+```4d
+Function event validateSave($event : Object)
+Function event validateSave ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is about to be saved.
+
+- if you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- if you defined the function at the attribute level (second syntax), it is called only for this attribute. This function is **not** executed if the attribute has not been touched in the entity.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following functions:
+
+- [`entity.save()`](../API/EntityClass.md#save)
+- [`dataClass.fromCollection()`](../API/DataClassClass.md#fromcollection)
+
+This event is triggered **before** the entity is actually saved and lets you check data consistency so that you can stop the action if needed. For example, you can check in this event that "departure date" < "arrival date".
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+:::note
+
+It is not recommended to update the entity within this function (using `This`).
+
+:::
+
+#### Ejemplo
+
+In this example, the user is not allowed to save a product with a margin lower than the average. In case of an invalid price attribute, you return an error object and thus, stop the save action.
+
+```4d
+// ProductsEntity class
+Function event validateSave margin($event : Object) : Object
+
+var $result : Object
+var $marginAverage : Real
+
+$marginAverage:=ds.Products.query("category= :1"; This.category).average("margin")
+
+If (This.margin<$marginAverage)
+ $result:={\
+ errCode: 1; \
+ message: "The margin of this product ("+String(This.margin)+") is under the average"; \
+ extraDescription: {\
+ info: "For the "+This.category+" category the margin average is: "+String($marginAverage)};\
+ fatalError: False}
+End if
+
+return $result
+
+```
+
+### `Function event saving`
+
+#### Sintaxis
+
+```4d
+Function event saving($event : Object)
+Function event saving ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is being saved.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity. The function is executed even if no attribute has been touched in the entity (e.g. in case of sending data to an external app each time a save is done).
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute. The function is **not** executed if the attribute has not been touched in the entity.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following functions:
+
+- [`entity.save()`](../API/EntityClass.md#save)
+- [`dataClass.fromCollection()`](../API/DataClassClass.md#fromcollection)
+
+This event is triggered **while** the entity is actually saved. If a [`validateSave()`](#function-event-validatesave) event function was defined, the `saving()` event function is called if no error was triggered by `validateSave()`. For example, you can use this event to create a document on a Google Drive account.
+
+:::note
+
+The business logic should raise errors which can't be detected during the `validateSave()` events, e.g. a network error
+
+:::
+
+During the save action, 4D engine errors can be raised (index, stamp has changed, not enough space on disk).
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Ejemplo
+
+When a product is saved, some information is logged to an external system which may be unavailable.
+
+```4d
+Function event saving($event : Object) : Object
+
+var $result; $status : Object
+var $log : cs.Entity
+var $remote : 4D.DataStoreImplementation
+
+Try
+ $remote:=Open datastore({hostname: "events@acme.com"}; "logs")
+ $log:=$remote.Logs.new()
+ $log.productId:=This.ID
+ $log.stamp:=Timestamp
+ $log.event:="Created by "+Current user()
+ $status:=$log.save()
+Catch
+ $result:={\
+ errCode: Last errors.last().errCode;\
+ message: Last errors.last().message; \
+ extraDescription: {info: "The external Logs can't be reached"}}
+End try
+
+return $result
+
+
+```
+
+### `Function event afterSave`
+
+#### Sintaxis
+
+```4d
+Function event afterSave($event : Object)
+// code
+```
+
+This event is triggered just after an entity is saved in the data file, when at least one attribute was modified. It is not executed if no attribute has been touched in the entity.
+
+This event is useful after saving data to propagate the save action outside the application or to execute administration tasks. For example, it can be used to send a confirmation email after data have been saved. Or, in case of error while saving data, it can make a rollback to restore a consistent state of data.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+- To avoid infinite loops, calling a [`save()`](../API/EntityClass.md#save) on the current entity (through `This`) in this function is **not allowed**. It will raise an error.
+- Throwing an [error object](#error-object) is **not supported** by this function.
+
+#### Ejemplo 1
+
+If an error occurred in the above saving event, the product is recorded in the ProductsInFailure dataclass so an employee can review it later.
+
+```4d
+// ProductsEntity class
+Function event afterSave($event : Object)
+
+var $failure : cs.ProductsInFailureEntity
+var $status : Object
+
+ // $event.status.errors is filled if the error comes from a validateSave event
+If (($event.status.success=False) && ($event.status.errors=Null))
+ $failure:=ds.ProductsInFailure.new()
+ $failure.name:=This.name
+ $failure.category:=This.category
+ $failure.costPrice:=This.costPrice
+ $failure.retailPrice:=This.retailPrice
+ $failure.reason:="Error during the save action"
+ $failure.stamp:=Timestamp
+ $status:=$failure.save()
+End if
+
+```
+
+### `Function event validateDrop`
+
+#### Sintaxis
+
+```4d
+Function event validateDrop($event : Object)
+Function event validateDrop ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is about to be dropped.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following features:
+
+- [`entity.drop()`](../API/EntityClass.md#drop)
+- [`entitySelection.drop()`](../API/DataClassClass.md#fromcollection)
+- [deletion control rules](https://doc.4d.com/4Dv20/4D/20.2/Relation-properties.300-6750290.en.html#107320) that can be defined at the database structure level.
+
+This event is triggered **before** the entity is actually dropped, allowing you to check data consistency and if necessary, to stop the drop action.
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Ejemplo 1
+
+Products can be deleted only if they have been flagged TO DELETE.
+
+```4d
+ //ProductsEntity class
+Function event validateDrop status($event : Object) : Object
+
+If (This.status != "TO DELETE")
+
+ var $result:= New object()
+ $result.errCode:=1
+ $result.message:="The record can't be deleted"
+ $result.extraDescription:={attribute; $event.attributeName; info: "The status must be TO DELETE"}
+ $result.fatalError:=False
+ return $result
+End if
+```
+
+#### Ejemplo 2
+
+The user can delete products if they are flagged as "TO DELETE" and if their creation year is < current year -3.
+
+```4d
+ //ProductsEntity class
+Function event validateDrop($event : Object) : Object
+
+var $yearOffSet : Integer
+$yearOffSet:=Year of(Current date)-3
+
+If ((This.status != "TO DELETE") || (Year of(This.creationDate) >= $yearOffSet))
+ var $result:=New object()
+ $result.errCode:=1
+ $result.message:="The record can't be deleted"
+ $result.extraDescription:={info: "The status must be TO DELETE and the creation year must be lower than " + String($yearOffSet)}
+ $result.fatalError:=False
+ return $result
+End if
+```
+
+### `Function event dropping`
+
+#### Sintaxis
+
+```4d
+Function event dropping($event : Object)
+Function event dropping ($event : Object)
+// code
+```
+
+This event is triggered each time an entity is being dropped.
+
+- If you defined the function at the entity level (first syntax), it is called for any attribute of the entity.
+- If you defined the function at the attribute level (second syntax), it is called only for this attribute.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+This event is triggered by the following features:
+
+- [`entity.drop()`](../API/EntityClass.md#drop)
+- [`entitySelection.drop()`](../API/DataClassClass.md#fromcollection)
+- [deletion control rules](https://doc.4d.com/4Dv20/4D/20.2/Relation-properties.300-6750290.en.html#107320) that can be defined at the database structure level.
+
+This event is triggered **while** the entity is actually dropped. If a [`validateDrop()`](#function-event-validatedrop) event function was defined, the `dropping()` event function is called if no error was triggered by `validateDrop()`.
+
+:::note
+
+The business logic should raise errors which cannot be detected during the `validateDrop()` events, e.g. a network error.
+
+:::
+
+To stop the action, the code of the function must return an [error object](#error-object).
+
+#### Ejemplo 1
+
+When dropping an order with *totalPrice >= 500*, a log file is updated.
+
+```4d
+ //OrderEntity class
+Function event dropping totalPrice ($event : Object)
+
+var $log : cs.LogEntity
+var $status: Object
+
+If (This.totalPrice >= 500)
+
+ $log:=ds.Log.new()
+ $log.orderID:=This.ID
+ $log.orderPrice:=This.totalPrice
+ $log.event:="Drop"
+ $log.creationDate:=Current date()
+ $status:=$log.save()
+
+ If($status.success=False)
+ throw ({errCode: 1; message: "Error while updating the log file"})
+ End if
+End if
+
+```
+
+#### Ejemplo 2
+
+When a product is dropped, a log file is updated.
+
+```4d
+ //ProductsEntity class
+Function event dropping ($event : Object)
+
+var $log : cs.LogEntity
+var $status: Object
+
+$log:=ds.Log.new()
+$log.productID:=This.ID
+$log.productPrice:=This.price
+$log.event:="Drop"
+$log.creationDate:=Current date()
+$status:=$log.save()
+
+If($status.success=False)
+ throw ({errCode: 1; message:"Error while updating the log file"})
+End if
+```
+
+### `Function event afterDrop`
+
+#### Sintaxis
+
+```4d
+Function event afterDrop($event : Object)
+// code
+```
+
+This event is triggered just after an entity is dropped.
+
+This event is useful after dropping data to propagate the drop action outside the application or to execute administration tasks. For example, it can be used to send a cancellation email after data have been dropped. Or, in case of error while dropping data, it can log an information for the administrator to check data consistency.
+
+The function receives an [*event* object](#event-parameter) as parameter.
+
+- To avoid infinite loops, calling a [`drop()`](../API/EntityClass.md#drop) on the current entity (through `This`) in this function is **not allowed**. It will raise an error.
+- Throwing an [error object](#error-object) is **not supported** by this function.
+
+:::note
+
+The dropped entity is referenced by `This` and still exists in memory.
+
+:::
+
+#### Ejemplo 1
+
+Send a mail to the customer with the details of the dropped order.
+
+```4d
+ //OrderEntity class
+Function event afterDrop ($event : Object)
+
+var $oAuth2 : cs.NetKit.OAuth2Provider
+var $google : cs.NetKit.Google
+
+ //$param contains clientId, secretId...
+$oAuth2:=cs.NetKit.OAuth2Provider.new($param)
+$google:=cs.NetKit.Google.new($oAuth2; {mailType: "JMAP"})
+
+ //Email creation
+$email:=New object
+$email.from:="youremail@gmail.com"
+$email.to:="destinationmail@mail.com"
+$email.subject:="Your order is cancelled"
+$email.textBody:="Products numbers: " + This.products.number.join("-")
+
+ //Email sending
+$status:=$google.mail.send($email)
+```
+
+#### Ejemplo 2
+
+Create an action to do because there were errors in the [`dropping()`](#function-event-dropping) event.
+
+```4d
+ //ProductEntity class
+Function event afterDrop ($event : Object)
+
+var $action: cs.ActionEntity
+var $status: Object
+
+ // The drop action failed
+If($event.dropStatus = "failed")
+ $action:=ds.Action.new()
+ $action.label:=Last errors.first().message //message is "Error while dropping product XXX"
+ $action.status:="TO CHECK"
+ $status:=$action.save()
+End if
+
+```
+
diff --git a/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/ordaClasses.md b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/ordaClasses.md
new file mode 100644
index 00000000000000..8d48e8c9c0f133
--- /dev/null
+++ b/i18n/es/docusaurus-plugin-content-docs/version-21/ORDA/ordaClasses.md
@@ -0,0 +1,1189 @@
+---
+id: ordaClasses
+title: Clases del modelo de datos
+---
+
+ORDA permite crear funciones de clase de alto nivel sobre el [modelo de datos](https://doc.4d.com/4Dv20/4D/20.2/Creating-a-database-structure.200-6750097.en.html). Esto le permite escribir código orientado al negocio y "publicarlo" como una API. Los almacenes de datos, las clases de datos, las selecciones de entidades y las entidades están disponibles como objetos de clase que pueden contener funciones.
+
+Por ejemplo, podría crear una función `getNextWithHigherSalary()` en la clase `EmployeeEntity` para devolver los empleados con un salario superior al seleccionado. Sería tan sencillo como llamar:
+
+```4d
+$nextHigh:=ds.Employee.get(1).getNextWithHigherSalary()
+```
+
+Los desarrolladores no sólo pueden utilizar estas funciones en almacenes de datos locales, sino también en arquitecturas cliente/servidor y remotas:
+
+```4d
+ //$cityManager es la referencia de un datastore remoto
+Form.comp.city:=$cityManager.City.getCityName(Form.comp.zipcode)
+```
+
+Gracias a esta funcionalidad, toda la lógica de negocio de su aplicación 4D puede ser almacenada como una capa independiente para que pueda ser fácilmente mantenida y reutilizada con un alto nivel de seguridad:
+
+- Puede "ocultar" la complejidad global de la estructura física subyacente y exponer únicamente funciones comprensibles y listas para usar.
+
+- Si la estructura física evoluciona, basta con adaptar el código de las funciones y las aplicaciones cliente seguirán llamándolas de forma transparente.
+
+- Los atributos alias de ORDA por defecto son **no expuestos**. Debe añadir la palabra clave [`exposed`](#exposed-vs-non-exposed-functions) antes de la palabra clave `Alias` si desea que el alias esté disponible para peticiones remotas.
+
+
+
+Además, 4D [precrea automáticamente](#creating-classes) las clases para cada objeto del modelo de datos disponible.
+
+## Arquitectura
+
+ORDA ofrece **clases genéricas** expuestas a través del [class store](Concepts/classes.md#class-stores) **`4D`**, así como **clases usuario** (que extienden las clases genéricas) expuestas en el [class store](Concepts/classes.md#class-stores) **`cs`**:
+
+
+
+Todas las clases de modelo de datos ORDA se exponen como propiedades del class store **`cs`**. Las clases ORDA siguientes están disponibles:
+
+| Class | Nombre del ejemplo | Instanciado por |
+| ------------------------------------------------------------------------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| cs.DataStore | cs.DataStore | Comando [`ds`](comandos/ds.md) |
+| cs.*DataClassName* | cs.Employee | [`dataStore.DataClassName`](API/DataStoreClass.md#dataclassname), `dataStore["DataClassName"]` |
+| cs._DataClassName_Entity | cs.EmployeeEntity | [`dataClass.get()`](API/DataClassClass.md#get), [`dataClass.new()`](API/DataClassClass.md#new), [`entitySelection.first()`](API/EntitySelectionClass.md#first), [`entitySelection.last()`](API/EntitySelectionClass.md#last), [`entity.previous()`](API/EntityClass.md#previous), [`entity.next()`](API/EntityClass.md#next), [`entity.first()`](API/EntityClass.md#first), [`entity.last()`](API/EntityClass.md#last), [`entity.clone()`](API/EntityClass.md#clone) |
+| cs._DataClassName_Selection | cs.EmployeeSelection | [`dataClass.query()`](API/DataClassClass.md#query), [`entitySelection.query()`](API/EntitySelectionClass.md#query), [`dataClass.all()`](API/DataClassClass.md#all), [`dataClass.fromCollection()`](API/DataClassClass.md#fromcollection), [`dataClass.newSelection()`](API/DataClassClass.md#newselection), [`entitySelection.drop()`](API/EntitySelectionClass.md#drop), [`entity.getSelection()`](API/EntityClass.md#getselection), [`entitySelection.and()`](API/EntitySelectionClass.md#and), [`entitySelection.minus()`](API/EntitySelectionClass.md#minus), [`entitySelection.or()`](API/EntitySelectionClass.md#or), [`entitySelection.orderBy()`](API/EntitySelectionClass.md#or), [`entitySelection.orderByFormula()`](API/EntitySelectionClass.md#orderbyformula), [`entitySelection.slice()`](API/EntitySelectionClass.md#slice), `Create entity selection` |
+
+> Las clases usuario ORDA se almacenan como archivos de clase estándar (.4dm) en la subcarpeta Classes del proyecto [(ver más abajo)](#class-files).
+
+Además, las instancias de objeto de clases usuario de los modelos de datos ORDA se benefician de las propiedades y funciones de sus padres:
+
+- un objeto de clase Datastore puede llamar las funciones de la [clase genérica ORDA Datastore](API/DataStoreClass.md).
+- un objeto de clase Dataclass puede llamar las funciones de la [clase genérica ORDA Dataclass](API/DataClassClass.md).
+- un objeto de clase Entity selection puede llamar las funciones de la [clase genérica ORDA Entity selection](API/EntitySelectionClass.md).
+- un objeto de clase Entity puede llamar las funciones de la [clase genérica ORDA Entity](API/EntityClass.md).
+
+## Descripción de la clase
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 19 R4 | Atributos alias en la Entity Class |
+| 19 R3 | Atributos calculados en la Entity Class |
+| 18 R5 | Las funciones de clase de modelo de datos no están expuestas a REST por defecto. Nuevas palabras clave `exposed` y `local`. |
+
+
+
+### Clase DataStore
+
+Una base de datos 4D expone su propia clase DataStore en el class store `cs`.
+
+- **Extends**: 4D.DataStoreImplementation
+- **Nombre de clase**: cs.DataStore
+
+Puede crear funciones en la clase DataStore que estarán disponibles a través del objeto `ds`.
+
+#### Ejemplo
+
+```4d
+// cs.DataStore class
+
+Class extends DataStoreImplementation
+
+Function getDesc
+ $0:="Database exposing employees and their companies"
+```
+
+Esta función puede ser llamada:
+
+```4d
+$desc:=ds.getDesc() //"Database exposing..."
+```
+
+### Clase DataClass
+
+Cada tabla expuesta con ORDA ofrece una clase DataClass en el class store `cs`.
+
+- **Extends**: 4D.DataClass
+- **Nombre de clase**: cs.*DataClassName* (donde *DataClassName* es el nombre de la tabla)
+- **Ejemplo**: cs.Employee
+
+#### Ejemplo
+
+```4D
+// cs.Company class
+
+
+Class extends DataClass
+
+// Devuelve las empresas cuyos ingresos están por encima de la media
+// Devuelve una selección de entidades relacionadas con la clase de datos Company
+
+Function GetBestOnes()
+$sel:=This.query("revenues >= :1";This.all().average("revenues"));
+ $0:=$sel
+```
+
+A continuación, puede obtener una selección de entidades de las "mejores" empresas ejecutando:
+
+```4d
+ var $best : cs.CompanySelection
+ $best:=ds.Company.GetBestOnes()
+```
+
+:::info
+
+[Los atributos calculados](#computed-attributes) se definen en [la clase Entity](#entity-class).
+
+:::
+
+#### Ejemplo con un datastore remoto
+
+El catálogo *City* siguiente está expuesto en un datastore remoto (vista parcial):
+
+
+
+La clase `City` ofrece una API:
+
+```4d
+// cs.City class
+
+Class extends DataClass
+
+Function getCityName($zipcode : Integer) -> $cityName : Text
+ var $zip : 4D.Entity
+
+ $zip:=ds.ZipCode.get($zipcode)
+ $cityName:=""
+
+ If ($zip#Null)
+ $cityName:=$zip.city.name
+ End if
+```
+
+La aplicación cliente abre una sesión en el datastore remoto:
+
+```4d
+$cityManager:=Open datastore(New object("hostname";"127.0.0.1:8111");"CityManager")
+```
+
+A continuación, una aplicación cliente puede utilizar la API para obtener la ciudad correspondiente al código postal (por ejemplo) a partir de un formulario:
+
+```4d
+Form.comp.city:=$cityManager.City.getCityName(Form.comp.zipcode)
+
+```
+
+### Clase EntitySelection
+
+Cada tabla expuesta con ORDA ofrece una clase EntitySelection en el class store `cs`.
+
+- **Extends**: 4D.EntitySelection
+- **Nombre de clase**: _DataClassName_Selection (donde *DataClassName* es el nombre de la tabla)
+- **Ejemplo**: cs.EmployeeSelection
+
+#### Ejemplo
+
+```4d
+// cs.EmployeeSelection class
+
+
+Class extends EntitySelection
+
+//Extraer los empleados con un salario superior a la media de esta selección de entidades
+
+Function withSalaryGreaterThanAverage() : cs.EmployeeSelection
+ return This.query("salary > :1";This.average("salary")).orderBy("salary")
+
+```
+
+A continuación, puede obtener los empleados con un salario superior a la media en cualquier selección de entidades mediante la ejecución:
+
+```4d
+$moreThanAvg:=ds.Company.all().employees.withSalaryGreaterThanAverage()
+```
+
+:::info
+
+[Los filtros de selección de entidades restringidas](entities.md#restricting-entity-selections) se definen en la clase de datos .
+
+:::
+
+### Entity Class
+
+Cada tabla expuesta con ORDA ofrece una clase Entity en el class store `cs`.
+
+- **Extends**: 4D.Entity
+- **Nombre de clase**: _DataClassName_Entity (donde *DataClassName* es el nombre de la tabla)
+- **Ejemplo**: cs.CityEntity
+
+#### Class constructor
+
+Se puede definir un **constructor de clase** para una clase Entidad. El constructor de la clase se llama cada vez que se crea una entidad en memoria y puede utilizarse para inicializar algunos valores.
+
+Para más información, consulte la sección [Constructor de clase](#class-constructor-1).
+
+#### Atributos calculados
+
+Las clases Entity permiten definir **atributos calculados** utilizando palabras clave específicas:
+
+- `Función get` *attributeName*
+- `Función set` *attributeName*
+- `Function query` *attributeName*
+- `Función orderBy` *attributeName*
+
+Para más información, consulte la sección [Atributos calculados](#computed-attributes-1).
+
+#### Atributos de tipo alias
+
+Las clases Entity permiten definir **atributos alias**, normalmente sobre atributos relacionados, utilizando la palabra clave `Alias`:
+
+`Alias` *attributeName* *targetPath*
+
+Para más información, consulte la sección [Atributos alias](#alias-attributes-1).
+
+#### Ejemplo
+
+```4d
+// cs.CityEntity class
+
+Class extends Entity
+
+Function getPopulation() : Integer
+ return This.zips.sum("población")
+
+
+Function isBigCity(): Boolean
+// La función getPopulation() es utilizable dentro de la clase
+ devuelve This.getPopulation()>50000
+```
+
+Luego puede llamar este código:
+
+```4d
+var $cityManager; $city : Object
+
+$cityManager:=Open datastore(New object("hostname";"127.0.0.1:8111");"CityManager")
+$city:=$cityManager.City.getCity("Caguas")
+
+If ($city.isBigCity())
+ ALERT($city.name + " is a big city")
+End if
+```
+
+### Reglas específicas
+
+Al crear o editar clases de modelos de datos, debe prestar atención a las siguientes reglas:
+
+- Dado que se utilizan para definir nombres de clase DataClass automáticos en el [class store](Concepts/classes.md#class-stores) **cs**, las tablas 4D deben nombrarse para evitar todo conflicto en el espacio de nombres **cs**. En particular:
+ - No dé el mismo nombre a una tabla 4D y a una [clase de usuarios](../Concepts/classes.md#class-definition). En tal caso, el constructor de la clase usuario queda inutilizado (el compilador devuelve una advertencia).
+ - No utilice un nombre reservado para una tabla 4D (por ejemplo, "DataClass").
+
+- Al definir una clase, asegúrese de que la instrucción [`Class extends`](../Concepts/classes.md#class-extends-classname) coincida exactamente con el nombre de la clase padre (recuerde que son sensibles a mayúsculas y minúsculas). Por ejemplo, `Class extends EntitySelection` para una clase de selección de entidades.
+
+- No se puede instanciar un objeto de clase de modelo de datos con la palabra clave `new()` (se devuelve un error). Debe utilizar una función regular como se muestra en la [columna `Instantiated by` de la tabla de clases ORDA](#architecture).
+
+- No puede sobrescribir una función de clase ORDA nativa del [class store](Concepts/classes.md#class-stores) **`4D`** con una función de clase usuario de modelo de datos.
+
+### Ejecución apropiativa
+
+Cuando se compilan, las funciones de clase del modelo de datos se ejecutan:
+
+- en **procesos apropiativos o cooperativos** (dependiendo del proceso de llamada) en aplicaciones monopuesto,
+- en **procesos apropiativos** en las aplicaciones cliente/servidor (excepto si se utiliza la palabra clave [`local`](#local-functions), en cuyo caso depende del proceso llamante como en monopuesto).
+
+Si su proyecto está diseñado para ejecutarse en cliente/servidor, asegúrese de que el código de la función de clase del modelo de datos es hilo seguro. Si se llama un código thread-unsafe, se lanzará un error en tiempo de ejecución (no se lanzará ningún error al momento de la compilación ya que la ejecución cooperativa está soportada en las aplicaciones monopuesto).
+
+## `Class constructor`
+
+Historia
+
+| Lanzamiento | Modificaciones |
+| ----------- | -------------- |
+| 20 R10 | Añadidos |
+
+
+
+#### Sintaxis
+
+```4d
+// Entity class
+Class constructor()
+// código
+```
+
+:::note
+
+No hay palabra clave final para el código de función class constructor. El lenguaje 4D detecta automáticamente el final del código de una función por la siguiente palabra clave `Function` o el final del archivo de clase.
+
+:::
+
+Una función class constructor ORDA se activa justo después de que se cree una nueva entidad en memoria, [sea cual sea la forma en que se cree](#commands-that-trigger-the-class-constructor-functions). Es útil para establecer los valores iniciales para la instanciación de entidades, por ejemplo un ID personalizado.
+
+Esta función sólo puede definirse al [nivel de la entidad](#entity-class). Sólo puede haber una función constructor en una class entity (de lo contrario se devuelve un error).
+
+Esta función class constructor ORDA no recibe ni devuelve parámetros. Sin embargo, puede utilizarlo para inicializar valores de atributos utilizando [`This`](../commands/this.md). Tenga en cuenta que los valores inicializados por el constructor se anulan si el código llena los atributos correspondientes.
+
+:::note
+
+Una función class constructor ORDA es similar a una [función class constructor usuario](../Concepts/classes.md#class-constructor), con las siguientes diferencias:
+
+- no se pueden pasar parámetros al constructor,
+- no puede utilizar las palabras clave `shared`, `session` o `singleton`,
+- no puede llamar a la palabra clave [`Super`](../Concepts/classes.md#super) dentro de la función,
+- el constructor de la clase no puede ser llamado utilizando la función `new()` sobre una entidad (las entidades solo pueden ser creadas por funciones específicas, ver más abajo).
+
+:::
+
+#### Comandos que activan las funciones Class constructor
+
+La función `Class constructor` es activada por los siguientes comandos y funciones:
+
+- [`dataClass.new()`](../API/DataClassClass.md#new)
+- [`dataClass.fromCollection()`](../API/DataClassClass#fromcollection)
+- [REST API $method=update](../REST/$method.md#methodupdate) en un POST sin los parámetros `__KEY` y \`__STAMP
+- el [Explorador de datos](../Admin/dataExplorer.md#editing-data).
+
+:::note Notas
+
+- The [`entity.clone()`](../API/EntityClass.md#clone) function does not trigger the entity Class constructor.
+- Los registros creados a nivel de la base de datos 4D utilizando comandos del lenguaje clásico 4D o acciones estándar no activan el Class constructor de la entidad.
+
+:::
+
+#### Configuraciones remotas
+
+Cuando utilice configuraciones remotas, necesita prestar atención a los siguientes principios:
+
+- En **cliente/servidor** la función puede ser llamada en el cliente o en el servidor, dependiendo de la ubicación del código de llamada. Cuando se llama en el cliente, no se dispara de nuevo cuando el cliente intenta guardar la nueva entidad y envía una petición de actualización al servidor para crear en memoria en el servidor.
+
+:::warning
+
+Dado que funciones como [`dataClass.fromCollection()`](../API/DataClassClass.md#fromcollection) pueden crear un gran número de entidades y, por tanto, disparar consecuentemente el Class constructor de la entidad, es necesario asegurarse de que el código del constructor no ejecuta procesamientos que consuman demasiado tiempo, por razones de rendimiento. En configuraciones remotas (ver más abajo), el código no debe lanzar múltiples peticiones al servidor.
+
+:::
+
+#### Ejemplo 1
+
+```4d
+
+ //cs.BookingEntity class
+Class constructor()
+
+ This.departureDate:=Current date
+ This.arrivalDate:=Add to date(Current date; 0; 0; 2)
+
+```
+
+#### Ejemplo 2 (diagrama): cliente/servidor
+
+```mermaid
+
+sequenceDiagram
+
+Client->>+Client: Form.product:=ds.Products.new()
+
+Note over Client: Class constructor This.creationDate:=Current date() This.comment:="Automatic comment"
+
+Note over Client: Form.product.creationDate is "06/17/25" Form.product.comment is "Automatic comment"
+
+Client->>+Server: Form.product.save()
+
+Server-->>-Client: Success
+
+
+```
+
+#### Ejemplo 3 (diagrama): Qodly - Acción estándar
+
+```mermaid
+
+sequenceDiagram
+
+ Qodly page->>+ Qodly page: Standard action Create a new entity (product Qodly source)
+
+ Qodly page->>+Server: Function call product.apply() OR Save standard action for the product Qodly source
+
+ Note over Server: Class constructor This.creationDate:=Current date() This.comment:="Automatic comment"
+
+ Server-->>-Qodly page: The product Qodly source creationDate and comment attributes are filled
+
+ Note over Qodly page: product.creationDate is "06/17/25" and product.comment is "Automatic comment"
+
+```
+
+#### Example 4 (diagram): Qodly - Standard action and update value on the newly created entity
+
+```mermaid
+
+sequenceDiagram
+
+Qodly page->>+ Qodly page: Standard action Create a new entity (product Qodly source)
+
+Qodly page->>+ Qodly page: Update product comment with "Front end comment"
+
+Qodly page->>+Server: Function call product.apply() OR Save standard action for the product Qodly source
+
+Note over Server: Class constructor This.creationDate:=Current date() This.comment:="Automatic comment"
+
+Note over Server: The comment attribute is set with "Front end comment"
+
+Server-->>-Qodly page: The product Qodly source creationDate and comment attributes are filled
+
+Note over Qodly page: product.creationDate is "06/17/25" and product.comment is "Front end comment"
+
+```
+
+#### Ejemplo 5 (diagrama): Qodly - Entidad instanciada en una función
+
+```mermaid
+
+sequenceDiagram
+
+Qodly page->>+Server: product Qodly source := Function call Products.createNew()
+
+Note over Server: CreateNew() function on the Products class return This.new()
+
+Note over Server: Class constructor This.creationDate:=Current date() This.comment:="Automatic comment"
+
+Server-->>-Qodly page: The product entity creationDate and comment attributes are filled
+
+Note over Qodly page: product.creationDate is "06/17/25" and product.comment is "Automatic comment"
+
+```
+
+## Atributos calculados
+
+### Generalidades
+
+Un atributo calculado es un atributo de clase de datos con un tipo de datos que enmascara un cálculo. [Clases 4D estándar](Concepts/classes.md) implementa el concepto de propiedades calculadas con `get` (*getter*) y `set` (*setter*) [accessor functions](Concepts/classes.md#function-get-and-function-set). Los atributos de las clases de datos ORDA se benefician de esta funcionalidad y la extienden con dos funcionalidades adicionales: `query` y `orderBy`.
+
+Como mínimo, un atributo calculado requiere una función `get` que describa cómo se calculará su valor. Cuando se suministra una función *getter* para un atributo, 4D no crea el espacio de almacenamiento subyacente en el datastore sino que sustituye el código de la función cada vez que se accede al atributo. Si no se accede al atributo, el código nunca se ejecuta.
+
+Un atributo calculado también puede implementar una función `set`, que se ejecuta cada vez que se asigna un valor al atributo. La función *setter* describe qué hacer con el valor asignado, normalmente redirigiéndolo a uno o más atributos de almacenamiento o en algunos casos a otras entidades.
+
+Al igual que los atributos de almacenamiento, los atributos calculados pueden incluirse en **búsquedas**. Por defecto, cuando se utiliza un atributo calculado en una búsqueda ORDA, el atributo se calcula una vez por entidad examinada. En algunos casos esto es suficiente. Sin embargo, para un mejor rendimiento, especialmente en cliente/servidor, los atributos calculados pueden implementar una función `query` que se basa en los atributos reales de la clase de datos y se beneficia de sus índices.
+
+Del mismo modo, los atributos calculados pueden incluirse en **ordenaciones**. Cuando se utiliza un atributo calculado en una ordenación ORDA, el atributo se calcula una vez por entidad examinada. Cuando se utiliza un atributo calculado en una ordenación ORDA, el atributo se calcula una vez por entidad examinada.
+
+### Cómo definir los atributos calculados
+
+Se crea un atributo calculado definiendo un accesor `get` en la [**clase entity**](#entity-class) de la dataclass. El atributo calculado estará disponible automáticamente en los atributos de la dataclass y en los atributos de la entidad.
+
+También pueden definirse en la clase entity otras funciones de atributos calculados (`set`, `query` y `orderBy`). Son opcionales.
+
+Dentro de las funciones de atributos calculados, [`This`](Concepts/classes.md#this) designa la entidad. Los atributos calculados pueden utilizarse y manejarse como cualquier atributo de dataclass, es decir, serán procesados por las funciones de [clase entity](API/EntityClass.md) o [clase entity selection](API/EntitySelectionClass.md).
+
+> Los atributos calculados ORDA no están [**expuestos**](#exposed-vs-non-exposed-functions) por defecto. Para exponer un atributo calculado, añada la palabra clave `exposed` a la definición de la función \*\*get \*\*.
+
+> **Las funciones get y set** pueden tener la propiedad [**local**](#local-functions) para optimizar el procesamiento cliente/servidor.
+
+### `Function get `
+
+#### Sintaxis
+
+```4d
+{local} {exposed} Function get ({$event : Object}) -> $result : type
+// code
+```
+
+La función *getter* es obligatoria para declarar el atributo calculado *attributeName*. Cada vez que se accede al atributo *attributeName*, 4D evalúa el código `Function get` y devuelve el valor *$result*.
+
+> Un atributo calculado puede utilizar el valor de otro(s) atributo(s) calculado(s). Las llamadas recursivas generan errores.
+
+La función *getter* define el tipo de datos del atributo calculado gracias al parámetro *$result*. Se permiten los siguientes tipos resultantes:
+
+- Scalar (text, boolean, date, time, number)
+- Object
+- Imagen
+- BLOB
+- Entity (por ejemplo, cs.EmployeeEntity)
+- Entity selection (p.e. cs.EmployeeeSelection)
+
+El parámetro *$event* contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ------------- | ------- | ------------------------------------------------------------------------------------------------------------ |
+| attributeName | Text | Nombre de atributo calculado |
+| dataClassName | Text | Nombre de la clase de datos |
+| kind | Text | "get" |
+| resultado | Variant | Opcional. Añada esta propiedad con valor Null si desea que un atributo escalar devuelva Null |
+
+#### Ejemplos
+
+- El campo calculado *fullName*:
+
+```4d
+Function get fullName($event : Object)-> $fullName : Text
+
+ Case of
+ : (This.firstName=Null) & (This.lastName=Null)
+ $event.result:=Null //use result to return Null
+ : (This.firstName=Null)
+ $fullName:=This.lastName
+ : (This.lastName=Null)
+ $fullName:=This.firstName
+ Else
+ $fullName:=This.firstName+" "+This.lastName
+ End case
+```
+
+- Un atributo calculado puede basarse en un atributo relativo a una entidad:
+
+```4d
+Function get bigBoss($event : Object)-> $result: cs.EmployeeEntity
+ $result:=This.manager.manager
+
+```
+
+- Un atributo calculado puede basarse en un atributo relacionado con una entity selection:
+
+```4d
+Function get coWorkers($event : Object)-> $result: cs.EmployeeSelection
+ If (This.manager.manager=Null)
+ $result:=ds.Employee.newSelection()
+ Else
+ $result:=This.manager.directReports.minus(this)
+ End if
+```
+
+### `Function set `
+
+#### Sintaxis
+
+```4d
+
+{local} Function set ($value : type {; $event : Object})
+// code
+```
+
+La función *setter* se ejecuta cada vez que se asigna un valor al atributo. Esta función suele procesar los valores de entrada y el resultado se envía entre uno o varios atributos.
+
+El parámetro *$value* recibe el valor asignado al atributo.
+
+El parámetro *$event* contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ------------- | ------- | ---------------------------------------- |
+| attributeName | Text | Nombre de atributo calculado |
+| dataClassName | Text | Nombre de la clase de datos |
+| kind | Text | "set" |
+| value | Variant | Valor a tratar por el atributo calculado |
+
+#### Ejemplo
+
+```4d
+Function set fullName($value : Text; $event : Object)
+ var $p : Integer
+ $p:=Position(" "; $value)
+ This.firstname:=Substring($value; 1; $p-1) // "" if $p<0
+ This.lastname:=Substring($value; $p+1)
+```
+
+### `Function query `
+
+#### Sintaxis
+
+```4d
+Function query ($event : Object)
+Function query ($event : Object) -> $result : Text
+Function query ($event : Object) -> $result : Object
+// code
+```
+
+Esta función soporta tres sintaxis:
+
+- Con la primera sintaxis, se maneja toda la consulta a través de la propiedad del objeto `$event.result`.
+- Con la segunda y tercera sintaxis, la función devuelve un valor en *$result*:
+
+ - Si *$result* es un texto, debe ser una cadena de consulta válida
+ - Si *$result* es un Objeto, debe contener dos propiedades:
+
+ | Propiedad | Tipo | Descripción |
+ | ---------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------- |
+ | $result.query | Text | Cadena de búsqueda válida con marcadores de posición (:1, :2, etc.) |
+ | $result.parameters | Collection | valores para marcadores |
+
+La función `query` se ejecuta cada vez que se lanza una consulta que utiliza el atributo calculado. Resulta útil personalizar y optimizar las consultas basándose en los atributos indexados. Cuando la función `query` no está implementada para un atributo calculado, la búsqueda es siempre secuencial (basada en la evaluación de todos los valores utilizando la función `get `).
+
+> No se soportan las siguientes funcionalidades:
+>
+> - llamar a una función `query` en los atributos calculados de tipo Entity o Entity selection,
+> - utilizando la palabra clave `order by` en la cadena de consulta resultante.
+
+El parámetro *$event* contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| attributeName | Text | Nombre de atributo calculado |
+| dataClassName | Text | Nombre de la clase de datos |
+| kind | Text | "query" |
+| value | Variant | Valor a tratar por el atributo calculado |
+| operator | Text | Operador de búsqueda (ver también la [función de clase `query`](API/DataClassClass.md#query)). Valores posibles:
== (igual a, @ es un comodín)
=== (igual a, @ no es un comodín)
!= (no igual a, @ es un comodín)
!== (no igual a, @ no es un comodín)
< (menor que)
<= (menor que o igual a)
> (mayor que)
>= (mayor que o igual a)
IN (incluido en)
% (contiene la palabra clave)
|
+| resultado | Variant | Valor a tratar por el atributo calculado. Pase `Null` en esta propiedad si desea que 4D ejecute la consulta por defecto (siempre secuencialmente para los atributos calculados). |
+
+> Si la función devuelve un valor en *$result* y se asigna otro valor a la propiedad `$event.result`, se da prioridad a `$event.result`.
+
+#### Ejemplos
+
+- Búsqueda en el atributo calculado *fullName*.
+
+```4d
+Function query fullName($event : Object)->$result : Object
+
+ var $fullname; $firstname; $lastname; $query : Text
+ var $operator : Text
+ var $p : Integer
+ var $parameters : Collection
+
+ $operator:=$event.operator
+ $fullname:=$event.value
+
+ $p:=Position(" "; $fullname)
+ If ($p>0)
+ $firstname:=Substring($fullname; 1; $p-1)+"@"
+ $lastname:=Substring($fullname; $p+1)+"@"
+ $parameters:=New collection($firstname; $lastname) // two items collection
+ Else
+ $fullname:=$fullname+"@"
+ $parameters:=New collection($fullname) // single item collection
+ End if
+
+ Case of
+ : ($operator="==") | ($operator="===")
+ If ($p>0)
+ $query:="(firstName = :1 and lastName = :2) or (firstName = :2 and lastName = :1)"
+ Else
+ $query:="firstName = :1 or lastName = :1"
+ End if
+ : ($operator="!=")
+ If ($p>0)
+ $query:="firstName != :1 and lastName != :2 and firstName != :2 and lastName != :1"
+ Else
+ $query:="firstName != :1 and lastName != :1"
+ End if
+ End case
+
+ $result:=New object("query"; $query; "parameters"; $parameters)
+```
+
+> Ten en cuenta que el uso de marcadores de posición en consultas basadas en la entrada de texto del usuario es recomendado por razones de seguridad (ver la [descripción de `query()`](API/DataClassClass.md#query)).
+
+Código de llamada, por ejemplo:
+
+```4d
+$emps:=ds.Employee.query("fullName = :1"; "Flora Pionsin")
+```
+
+- Esta función gestiona las consultas sobre el atributo calculado *age* y devuelve un objeto con parámetros:
+
+```4d
+Function query age($event : Object)->$result : Object
+
+ var $operator : Text
+ var $age : Integer
+ var $_ages : Collection
+
+ $operator:=$event.operator
+
+ $age:=Num($event.value) // integer
+ $d1:=Add to date(Current date; -$age-1; 0; 0)
+ $d2:=Add to date($d1; 1; 0; 0)
+ $parameters:=New collection($d1; $d2)
+
+ Case of
+
+ : ($operator="==")
+ $query:="birthday > :1 and birthday <= :2" // after d1 and before or egal d2
+
+ : ($operator="===")
+
+ $query:="birthday = :2" // d2 = second calculated date (= birthday date)
+
+ : ($operator=">=")
+ $query:="birthday <= :2"
+
+ //... other operators
+
+
+ End case
+
+
+ If (Undefined($event.result))
+ $result:=New object
+ $result.query:=$query
+ $result.parameters:=$parameters
+ End if
+
+```
+
+Código de llamada, por ejemplo:
+
+```4d
+// personas de entre 20 y 21 años (-1 día)
+$twenty:=people.query("age = 20") // llama al case "=="
+
+// personas de 20 años hoy
+$twentyToday:=people.query("age === 20") // equivalente a people.query("age is 20")
+
+```
+
+### `Function orderBy `
+
+#### Sintaxis
+
+```4d
+Function orderBy ($event : Object)
+Function orderBy ($event : Object)-> $result : Text
+
+// code
+```
+
+La función `orderBy` se ejecuta siempre que sea necesario ordenar el atributo calculado. Permite ordenar el atributo calculado. Por ejemplo, puede ordenar *fullName* en función de los nombres y luego de los apellidos, o a la inversa.
+Cuando la función `orderBy` no está implementada para un atributo calculado, la ordenación es siempre secuencial (basada en la evaluación de todos los valores utilizando la función `get `).
+
+> **No se soporta** la llamada a una función `orderBy` sobre atributos calculados de tipo Entity class o Entity selection class.
+
+El parámetro *$event* contiene las siguientes propiedades:
+
+| Propiedad | Tipo | Descripción |
+| ------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
+| attributeName | Text | Nombre de atributo calculado |
+| dataClassName | Text | Nombre de la clase de datos |
+| kind | Text | "orderBy" |
+| value | Variant | Valor a tratar por el atributo calculado |
+| operator | Text | "desc" o "asc" (por defecto) |
+| descending | Boolean | `true` para orden descendente, `false` para orden ascendente |
+| resultado | Variant | Valor a tratar por el atributo calculado. Pase `Null` si desea que 4D ejecute la ordenación por defecto. |
+
+> Puede utilizar el `operator` o la propiedad `descending`. Es esencialmente una cuestión de estilo de programación (ver ejemplos).
+
+Puede devolver la cadena `orderBy` en la propiedad del objeto `$event.result` o en el resultado de la función *$result*. Si la función devuelve un valor en *$result* y se asigna otro valor a la propiedad `$event.result`, se da prioridad a `$event.result`.
+
+#### Ejemplo
+
+Puede escribir código condicional:
+
+```4d
+Function orderBy fullName($event : Object)-> $result : Text
+ If ($event.descending=True)
+ $result:="firstName desc, lastName desc"
+ Else
+ $result:="firstName, lastName"
+ End if
+```
+
+También puede escribir un código compacto:
+
+```4d
+Function orderBy fullName($event : Object)-> $result : Text
+ $result:="firstName "+$event.operator+", "lastName "+$event.operator
+
+```
+
+El código condicional es necesario en algunos casos:
+
+```4d
+Function orderBy age($event : Object)-> $result : Text
+
+ If ($event.descending=True)
+ $result:="birthday asc"
+ Else
+ $result:="birthday desc"
+ End if
+
+```
+
+## Atributos de tipo alias
+
+### Generalidades
+
+Un atributo **alias** se crea sobre otro atributo del modelo de datos, denominado **atributo de destino**. El atributo de destino puede pertenecer a una clase de datos relacionada (disponible a través de todo número de niveles de relación) o a la misma clase de datos. Un atributo alias no almacena ningún dato, sino la ruta a su atributo de destino. Puede definir tantos atributos de alias como desee en una clase de datos.
+
+Los atributos del alias son particularmente útiles para manejar las relaciones N a N. Aportan más legibilidad y simplicidad en el código y en las consultas al permitir basarse en conceptos de negocio en lugar de en detalles de implementación.
+
+### Cómo definir los atributos alias
+
+Se crea un atributo alias en una dataclass utilizando la palabra clave `Alias` en la [**clase Entity**](#entity-class) de la dataclass.
+
+### `Alias `
+
+#### Sintaxis
+
+```
+{exposed} Alias
+```
+
+*attributeName* debe cumplir las [reglas estándar para nombres de propiedades](../Concepts/identifiers.md#object-properties).
+
+*targetPath* es una ruta atributo que contiene uno o más niveles, como "employee.company.name". Si el atributo de destino pertenece a la misma clase de datos, *targetPath* es el nombre del atributo.
+
+Un alias puede ser utilizado como parte de una ruta de otro alias.
+
+Un [atributo calculado](#computed-attributes-1) puede utilizarse en una ruta alias, pero sólo como último nivel de la ruta; de lo contrario, se devuelve un error. Por ejemplo, si "fullName" es un atributo calculado, un alias con ruta "employee.fullName" es válido.
+
+> Los atributos alias de ORDA por defecto son **no expuestos**. Debe añadir la palabra clave [`exposed`](#exposed-vs-non-exposed-functions) antes de la palabra clave `Alias` si desea que el alias esté disponible para peticiones remotas.
+
+### Uso de los atributos alias
+
+Los atributos alias son de sólo lectura (excepto cuando se basan en un atributo escalar de la misma clase de datos, ver el último ejemplo a continuación). Pueden utilizarse en lugar de la ruta de su atributo de destino en funciones de clase como:
+
+| Function |
+| ---------------------------------------------- |
+| `dataClass.query()`, `entitySelection.query()` |
+| `entity.toObject()` |
+| `entitySelection.toCollection()` |
+| `entitySelection.extract()` |
+| `entitySelection.orderBy()` |
+| `entitySelection.orderByFormula()` |
+| `entitySelection.average()` |
+| `entitySelection.count()` |
+| `entitySelection.distinct()` |
+| `entitySelection.sum()` |
+| `entitySelection.min()` |
+| `entitySelection.max()` |
+| `entity.diff()` |
+| `entity.touchedAttributes()` |
+
+> Tenga en cuenta que los atributos alias se calculan en el servidor. En las configuraciones remotas, la actualización de los atributos alias en las entidades requiere que éstas se vuelvan a cargar desde el servidor.
+
+### Propiedades del alias
+
+El atributo alias [`kind`](../API/DataClassClass.md#attributename) es "alias".
+
+Un atributo alias hereda su propiedad de [`type`](../API/DataClassClass.md#attributename) del atributo objetivo:
+
+- si el [`kind`](../API/DataClassClass.md#attributename) del atributo objetivo es "storage", el tipo de datos del alias es del mismo tipo,
+- si el [`kind`](../API/DataClassClass.md#attributename) del atributo objetivo es "relatedEntity" o "relatedEntities", el tipo de datos del alias es de tipo `4D.Entity` o `4D.EntitySelection` ("_classname_Entity" o "_classname_Selection").
+
+Los atributos alias basados en relaciones tienen una propiedad específica [`path`](../API/DataClassClass.md#attributename), que contiene la ruta de sus atributos objetivos. Los atributos de alias basados en atributos de la misma clase de datos tienen las mismas propiedades que sus atributos de destino (y ninguna propiedad `path`).
+
+### Ejemplos
+
+Considerando el siguiente modelo:
+
+
+
+En la clase de datos Teacher, un atributo alias devuelve todos los alumnos de un profesor:
+
+```4d
+// cs.TeacherEntity class
+
+Class extends Entity
+
+Alias students courses.student //relatedEntities
+```
+
+En la clase Student, un atributo alias devuelve todos los profesores de un alumno:
+
+```4d
+// cs.StudentEntity class
+
+Class extends Entity
+
+Alias teachers courses.teacher //relatedEntities
+```
+
+En la dataclass Course:
+
+- un atributo alias devuelve otra etiqueta para el atributo "name"
+- un atributo alias devuelve el nombre del profesor
+- un atributo alias devuelve el nombre del estudiante
+
+```4d
+// cs.CourseEntity class
+
+Class extends Entity
+
+Exposed Alias courseName name //scalar
+Exposed Alias teacherName teacher.name //valor escalar
+Exposed Alias studentName student.name //valor escalar
+
+```
+
+Luego puede ejecutar las siguientes consultas:
+
+```4d
+// Encontrar curso llamado "Arqueología"
+ds.Course.query("courseName = :1"; "Arqueología")
+
+// Encontrar cursos impartidos por el profesor Smith
+ds.Course.query("teacherName = :1"; "Smith")
+
+// Encontrar cursos donde asista el Alumno "Martin"
+ds.Course.query("studentName = :1"; "Martin")
+
+// Encontrar alumnos que tengan a M. Smith como profesor
+ds.Student.query("teachers.name = :1"; "Smith")
+
+// Encontrar profesores que tienen a M. Martin como alumno
+ds.Teacher.query("students.name = :1"; "Martin")
+// Observe que esta cadena de consulta tan simple procesa una consulta compleja
+// que incluye un doble join, como puede ver en el queryPlan:
+// "Join on Table : Course : Teacher.ID = Course.teacherID,
+// subquery:[ Join on Table : Student : Course.studentID = Student.ID,
+// subquery:[ Student.name === Martin]]"
+```
+
+También puede editar el valor del alias *courseName*:
+
+```4d
+// Renombrar un curso utilizando su atributo alias
+$arch:=ds.Course.query("courseName = :1"; "Archaeology")
+$arch.courseName:="Archaeology II"
+$arch.save() //courseName y name son "Archaeology II"
+```
+
+## Funciones expuestas y no expuestas
+
+Por razones de seguridad, todas sus funciones de clase de modelo de datos y atributos de alias son **no expuestas** (es decir, privadas) por defecto a peticiones remotas.
+
+Las peticiones remotas incluyen:
+
+- Las peticiones enviadas por las aplicaciones 4D remotas conectadas a través de `Open datastore`
+- Peticiones REST
+
+> Las peticiones cliente/servidor 4D estándar no se ven afectadas. Las funciones de clase del modelo de datos están siempre disponibles en esta arquitectura.
+
+Una función que no está expuesta no está disponible en aplicaciones remotas y no se puede llamar a ninguna instancia de objeto desde una petición REST. Si una aplicación remota intenta acceder a una función no expuesta, se devuelve el error "-10729 - Método miembro desconocido".
+
+Para permitir que una función de clase de modelo de datos sea llamada por una petición remota, debe declararla explícitamente utilizando la palabra clave `exposed`. La sintaxis formal es:
+
+```4d
+// declarar una función expuesta
+exposed Function
+```
+
+> La palabra clave `exposed` sólo puede utilizarse con las funciones de clase del modelo de datos. Si se utiliza con una función de [ clase usuario estándar](Concepts/classes.md), se ignora y el compilador devuelve un error.
+
+### Ejemplo
+
+Desea que una función expuesta utilice una función privada de una clase dataclass:
+
+```4d
+Class extends DataClass
+
+//Función pública
+exposed Function registerNewStudent($student : Object) -> $status : Object
+
+var $entity : cs.StudentsEntity
+
+$entity:=ds.Students.new()
+$entity.fromObject($student)
+$entity.school:=This.query("name=:1"; $student.schoolName).first()
+$entity.serialNumber:=This.computeSerialNumber()
+$status:=$entity.save()
+
+//función (privada) no expuesta
+Function computeIDNumber() -> $id : Integer
+//calcular un nuevo número de ID
+$id:=...
+
+```
+
+Cuando se llama al código:
+
+```4d
+var $remoteDS; $student; $status : Object
+var $id : Integer
+
+$remoteDS:=Open datastore(New object("hostname"; "127.0.0.1:8044"); "students")
+$student:=New object("firstname"; "Mary"; "lastname"; "Smith"; "schoolName"; "Math school")
+
+$status:=$remoteDS.Schools.registerNewStudent($student) // OK
+$id:=$remoteDS.Schools.computeIDNumber() // Error "Unknown member method"
+```
+
+## Palabra clave onHTTPGet
+
+Utilice la palabra clave `onHTTPGet` para declarar funciones que pueden ser llamadas a través de peticiones HTTP utilizando el verbo `GET`. Estas funciones pueden devolver cualquier contenido web, por ejemplo utilizando la clase [`4D.OutgoingMessage`](../API/OutgoingMessageClass.md).
+
+La palabra clave `onHTTPGet` está disponible con:
+
+- Funciones de las clases del modelo de datos ORDA
+- [Funciones de la clase Singletons](../Concepts/classes.md#singleton-classes)
+
+La sintaxis formal es:
+
+```4d
+// declarar una función onHTTPGet
+exposed onHTTPGet Function (params) : result
+```
+
+:::info
+
+En este caso también debe añadirse la palabra clave `exposed`, de lo contrario se generará un error.
+
+:::
+
+:::caution
+
+Como este tipo de llamada es una acción que se ofrece fácilmente, el desarrollador debe asegurarse de que no se realiza ninguna acción sensible en dichas funciones.
+
+:::
+
+### params
+
+Una función con la palabra clave `onHTTPGet` acepta [parámetros](../Concepts/parameters.md).
+
+En la petición HTTP GET, los parámetros deben pasarse directamente en la URL y declararse utilizando la palabra clave `$params` (deben estar encerrados en una colección).
+
+```
+IP:port/rest//functionName?$params='[]'
+```
+
+Consulte la sección [Parámetros](../REST/classFunctions#parameters) en la documentación del servidor REST.
+
+### resultado
+
+Una función con la palabra clave `onHTTPGet` puede devolver cualquier valor de un tipo soportado (igual que para [parámetros](../REST/classFunctions#parameters) REST).
+
+:::info
+
+Puede devolver un valor del tipo de clase [`4D.OutgoingMessage`](../API/OutgoingMessageClass.md) para beneficiarse de las propiedades y funciones para definir el encabezado, el cuerpo y el estado de la respuesta.
+
+:::
+
+### Ejemplo
+
+Ha definido la siguiente función:
+
+```4d
+Class extends DataClass
+
+exposed onHTTPGet Function getThumbnail($name : Text; $width : Integer; $height : Integer) : 4D.OutgoingMessage
+
+ var $file := File("/RESOURCES/Images/"+$name+".jpg")
+ var $image; $thumbnail : Picture
+ var $response := 4D.OutgoingMessage.new()
+
+ READ PICTURE FILE($file.platformPath; $image)
+ CREATE THUMBNAIL($image; $thumbnail; $width; $height; Scaled to fit)
+ $response.setBody($thumbnail)
+ $response.setHeader("Content-Type"; "image/jpeg")
+ return $response
+```
+
+Se puede llamar mediante la siguiente petición HTTP GET:
+
+```
+IP:port/rest/Products/getThumbnail?$params='["Yellow Pack",200,200]'
+```
+
+## Funciones locales
+
+Por defecto en la arquitectura cliente/servidor, las funciones de modelo de datos ORDA se ejecutan **en el servidor**. Suele ofrecer el mejor rendimiento, ya que sólo se envían por la red la petición de función y el resultado.
+
+Sin embargo, puede ocurrir que una función sea totalmente ejecutable del lado del cliente (por ejemplo, cuando procesa los datos que ya están en la caché local). En este caso, puede ahorrar peticiones al servidor y, de este modo, mejorar el rendimiento de la aplicación insertando la palabra clave `local`. La sintaxis formal es:
+
+```4d
+// declarar una función a ejecutar localmente en cliente/servidor
+local Function