Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
71f936c
created 21-R2
arnaud4d Jan 13, 2026
0959d63
New Crowdin updates (#3067)
arnaud4d Jan 14, 2026
83f2c05
New Crowdin updates (#3074)
arnaud4d Jan 16, 2026
2006f56
fix lot of links and anchors (#3078)
arnaud4d Jan 16, 2026
38de7b8
New Crowdin updates (#3080)
arnaud4d Jan 19, 2026
259d265
fix links in all pages (#3082)
arnaud4d Jan 19, 2026
0e39413
New Crowdin updates (#3083)
arnaud4d Jan 20, 2026
6b83302
New Crowdin updates (#3084)
arnaud4d Jan 20, 2026
967651a
New Crowdin updates (#3087)
arnaud4d Jan 21, 2026
777e13d
New Crowdin updates (#3095)
arnaud4d Jan 23, 2026
82cfb69
New Crowdin updates (#3097)
arnaud4d Jan 26, 2026
c4feb3f
Update sidebars.js (#3103)
arnaud4d Jan 27, 2026
d50a417
Fix/sorted sidebar (#3104)
arnaud4d Jan 27, 2026
172fa8d
Revert "Fix/sorted sidebar (#3104)"
arnaud4d Jan 27, 2026
9b6a2b6
Revert "Update sidebars.js (#3103)"
arnaud4d Jan 27, 2026
fe01b12
New Crowdin updates (#3106)
arnaud4d Jan 28, 2026
5b7e37b
New Crowdin updates (#3109)
arnaud4d Jan 29, 2026
56fa370
New Crowdin updates (#3111)
arnaud4d Jan 30, 2026
eacf2e3
New Crowdin updates (#3113)
arnaud4d Feb 2, 2026
c0e5d57
Merge de Fix/syntax check (#3118)
arnaud4d Feb 2, 2026
dbd8b52
New Crowdin updates (#3119)
arnaud4d Feb 3, 2026
eee228e
New Crowdin updates (#3120)
arnaud4d Feb 4, 2026
c823667
fixes (#3122)
arnaud4d Feb 4, 2026
2a7d101
New Crowdin updates (#3123)
arnaud4d Feb 5, 2026
dbd821c
restore *... (#3126)
arnaud4d Feb 6, 2026
8dbf32d
New Crowdin updates (#3127)
arnaud4d Feb 6, 2026
fd062df
New Crowdin updates (#3133)
arnaud4d Feb 9, 2026
7cb17e5
Fix/syntax (#3134)
arnaud4d Feb 9, 2026
f0a8082
New Crowdin updates (#3135)
arnaud4d Feb 10, 2026
b0db1ae
history (#3136)
guillaume-kotulski Feb 11, 2026
f0506d1
Fix/syntax (#3137)
arnaud4d Feb 11, 2026
02984ff
New Crowdin updates (#3138)
arnaud4d Feb 11, 2026
2709802
add prior version in history (#3140)
guillaume-kotulski Feb 12, 2026
5772037
fix XML example (#3141)
arnaud4d Feb 12, 2026
5d6584f
Fix/syntax (#3142)
arnaud4d Feb 12, 2026
1e70ba9
fix in 21/R2/current (#3144)
arnaud4d Feb 13, 2026
921bd56
Update properties_TextAndPicture.md (#3143)
mouna-elmaazouzi Feb 13, 2026
4a29e1b
New Crowdin updates (#3139)
arnaud4d Feb 16, 2026
b347bb0
Fix/syntax (#3145)
arnaud4d Feb 16, 2026
cbbf3ff
fixes up to QUERY BY EXAMPLE (#3146)
arnaud4d Feb 17, 2026
a5c25f0
New Crowdin updates (#3147)
arnaud4d Feb 17, 2026
3bf45ea
Fix/syntax (#3148)
arnaud4d Feb 17, 2026
e75f99a
New Crowdin updates (#3149)
arnaud4d Feb 18, 2026
024c11c
Fix/syntax (#3150)
arnaud4d Feb 18, 2026
39d77eb
Fix/list box split (#3151)
arnaud4d Feb 18, 2026
f1f5071
Ajout d'un commentaire sur la Pull Request #3152.
arnaud4d Feb 18, 2026
9eb2e0b
Fix/history for commands (#3152)
arnaud4d Feb 18, 2026
4f06f1f
Fix/open form window link (#3153)
arnaud4d Feb 18, 2026
a69f4bf
Update json-parse-array.md (#3154)
arnaud4d Feb 18, 2026
de21272
Fix/syntax json (#3155)
arnaud4d Feb 18, 2026
f4e5eb3
New Crowdin updates (#3156)
arnaud4d Feb 19, 2026
b485c92
Feature/use cert mac (#3157)
arnaud4d Feb 19, 2026
5baff66
New Crowdin updates (#3158)
arnaud4d Feb 20, 2026
5c91080
fix/realIntoText
arnaud4d Feb 23, 2026
34e7202
Feature/4DWP-hierarchical-lists (#3162)
mouna-elmaazouzi Feb 23, 2026
35e091f
first set (#3164)
arnaud4d Feb 24, 2026
9d7f051
Document new architecture for sorted themes
arnaud4d Feb 24, 2026
233f839
Fix formatting of folder structure in README
arnaud4d Feb 24, 2026
29f90d6
New Crowdin updates (#3163)
arnaud4d Feb 24, 2026
3dc8d92
New Crowdin updates (#3167)
arnaud4d Feb 25, 2026
129e7ce
New Crowdin updates (#3168)
arnaud4d Feb 25, 2026
830ca44
fixs (#3170)
arnaud4d Feb 26, 2026
3eaa8d2
Fix/syntax2502 (#3171)
arnaud4d Feb 26, 2026
f432f41
New Crowdin updates (#3173)
arnaud4d Feb 27, 2026
3f07971
New Crowdin updates (#3174)
arnaud4d Mar 2, 2026
f4fa61a
Fix/query param & set external (#3175)
arnaud4d Mar 2, 2026
46bf285
New Crowdin updates (#3177)
arnaud4d Mar 2, 2026
12fb041
Fix/syntax0203 (#3178)
arnaud4d Mar 2, 2026
4ef565c
Edits in legacy commands (#3176)
sandritica Mar 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"git.ignoreLimitWarning": true
}
142 changes: 142 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,148 @@ Aller dans l'interface Algolia et lancer un reindex de la doc
4. git push (fait une PR auto et pas de conflit)


## Building new architecture for sorted themes
### Edit the sidebars.js file
- replace the whole themes "Commands by themes" with
```{
"type": "category",
"label": "Commands by theme",
"items": [
{
"type": "autogenerated",
"dirName": "language-legacy",
}
],
},
```
### Edit the docusaurus.config.js
1. fix the locale for npm run start
```function getCliLocaleFromArgv() {
// supporte: "--locale fr" ou "--locale=fr"
const i = process.argv.indexOf('--locale');
if (i > -1 && process.argv[i + 1] && !process.argv[i + 1].startsWith('--')) {
return process.argv[i + 1];
}
const eq = process.argv.find((a) => a.startsWith('--locale='));
if (eq) return eq.split('=')[1];
return undefined;
}
```
2. Implement the functions to get i18n, sort, and push
```// docusaurus.config.js
const fs = require('fs');
const path = require('path');

// 1) Collator FR (tri “dictionnaire” : accents pris en compte)
const collators = {};
function getCollator(locale) {
const loc = locale || 'en';
if (!collators[loc]) {
// Sensibilité 'accent' => 'é' > 'e' (contraire de 'base' qui les considère égaux)
collators[loc] = new Intl.Collator(loc, {
usage: 'sort',
sensitivity: 'accent',
ignorePunctuation: false,
numeric: true,
});
// Log de diag : vérifie la locale réellement résolue par ICU
const resolved = collators[loc].resolvedOptions().locale;
console.log(`[sidebar-sort] requested=${loc} resolved=${resolved}`);
}
return collators[loc];
}

// 2) Charge le catalogue i18n des sidebars pour la locale
function loadSidebarTranslations(locale) {
if (!locale || typeof locale !== 'string') return {};
const base = path.join(__dirname, 'i18n', locale, 'docusaurus-plugin-content-docs');
const candidates = [
path.join(base, 'current.json'),
path.join(base, 'current', 'current.json'),
path.join(base, 'default', 'current.json'),
path.join(__dirname, 'i18n', locale, 'code.json'),
];
for (const file of candidates) {
if (fs.existsSync(file)) {
try {
return JSON.parse(fs.readFileSync(file, 'utf8'));
} catch { /* ignore */ }
}
}
return {};
}

// 3) Déduit le nom de la sidebar (docs/mainSidebar/…)
// à partir des clés présentes dans le JSON de traduction.
function guessSidebarNameFromTranslations(translations) {
for (const k of Object.keys(translations || {})) {
const m = /^sidebar\.([^.]+)\.category\./.exec(k);
if (m) return m[1];
}
return 'docs';
}

// 4) Récupère la traduction d’un label de catégorie
function getTranslatedCategoryLabel(labelSource, sidebarName, translations) {
const src = String(labelSource || '').normalize('NFC').trim();
if (!src) return '';
const directKey = `sidebar.${sidebarName}.category.${src}`;
const direct = translations[directKey]?.message;
if (direct && direct.trim()) return direct;

// Tolérance : si le nom de sidebar diffère, on scanne
for (const [k, v] of Object.entries(translations)) {
const m = /^sidebar\.([^.]+)\.category\.(.+)$/.exec(k);
if (!m) continue;
const keyLabel = String(m[2] || '').normalize('NFC').trim();
if (keyLabel.localeCompare(src, undefined, {sensitivity: 'accent'}) === 0) {
const msg = v?.message;
if (msg && msg.trim()) return msg;
}
}
// Pas de traduction → fallback source
return src;
}

// 5) Clé de tri
function sortKey(item, helpers) {
const { translations, sidebarName } = helpers;
if (item.type === 'category') {
return getTranslatedCategoryLabel(item.label, sidebarName, translations);
}
return item.label || item.title || item.id || '';
}

// 6) Tri des catégories racine.
function sortRec(items, helpers) {
const collator = getCollator(helpers.locale);
const withChildrenSorted = items.map((it) => {
if (it.type === 'category' && Array.isArray(it.items)) {
return { ...it, items: sortRec(it.items, helpers) };
}
return it;
});
return withChildrenSorted.sort((a, b) => collator.compare(sortKey(a, helpers), sortKey(b, helpers)));
}
```

### In docs/ AND in i18n/\<locale>\/docusaurus-plugin-content-docs/current folders

1. Add a "language-legacy/" folder
2. Add "language-legacy/\<theme\>" subfolders
3. "language-legacy/\<theme>\/_category_.json" files
contents of the_category_.json files:
```{
"label": "Arrays",
"link": {"type": "doc", "id": "commands/theme/Arrays_theme"},
"key": "Arrays-key"
}
```
4; Check missing slugs
4. fix links:
- ./commands/truc.md -> ./commands/truc
- ../commands/truc.md -> ../commands/truc
- ../commands-legacy/truc.md -> ../commands/truc



Expand Down
24 changes: 14 additions & 10 deletions docs/API/HTTPAgentClass.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,6 @@ Since HTTPAgent is a shareable object, you can add one to a singleton class so y

<!-- REF #4D.HTTPAgent.new().Syntax -->**4D.HTTPAgent.new**( { *options* : Object } ) : 4D.HTTPAgent<!-- END REF -->

<details><summary>History</summary>

|Release|Changes|
|---|---|
|21|Support of *storeCertificateName* property|

</details>


<!-- REF #4D.HTTPAgent.new().Params -->
<div class="no-index">
Expand All @@ -60,6 +52,17 @@ Since HTTPAgent is a shareable object, you can add one to a singleton class so y
</div>
<!-- END REF -->


<details><summary>History</summary>

|Release|Changes|
|---|---|
|21 R3|Support of *storeCertificateName* property on macOS|
|21|Support of *storeCertificateName* property on Windows|

</details>


#### Description

The `4D.HTTPAgent.new()` function <!-- REF #4D.HTTPAgent.new().Summary -->creates a shareable HTTPAgent object with the defined *options*, and returns a `4D.HTTPAgent` object<!-- END REF -->.
Expand All @@ -85,7 +88,7 @@ HTTPAgent options will be merged with [HTTPRequest options](HTTPRequestClass.md#
| maxTotalSockets |Integer| 65535 |Maximum number of sockets for the agent |
| minTLSVersion |Text| undefined (see default value in [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) |Sets the minimum version of TLS for the requests using this agent|
| protocol |Text| undefined (see default value in [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) |Protocol used for the requests using the agent |
|storeCertificateName|Text|undefined|(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. If the certificate store is not found, an error is returned. For more information, see [this blog post](https://blog.4d.com/https-requests-now-support-windows-certificate-store).|
|storeCertificateName|Text|undefined| Name of a certificate stored in the Certificate Store (Windows) or in the *keychain* (macOS) to use instead of one saved in the certificates folder. If the certificate is not found in the store, an error is returned. For more information, see [this blog post for Windows](https://blog.4d.com/https-requests-now-support-windows-certificate-store) and [this blog post for macOS](https://blog.4d.com/https-requests-macos-keychain-support-is-here).|
| timeout |Real| undefined |If defined, timeout after which an unused socket is closed |
| validateTLSCertificate |Boolean| undefined (see default value in [HTTPRequest.new()](HTTPRequestClass.md#options-parameter)) | validateTLSCertificate for the requests using the agent|

Expand All @@ -103,7 +106,8 @@ Creating the HTTPAgent:
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
$opt
ons.validateTLSCertificate:=True //To validate the server's certificate

var $myAgent:=4D.HTTPAgent.new($options)

Expand Down
31 changes: 18 additions & 13 deletions docs/API/HTTPRequestClass.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ title: HTTPRequest

The `HTTPRequest` class allows you to handle [`HTTPRequest objects`](#httprequest-object) that can be used to configure and send requests to an HTTP server, as well as to process the HTTP server responses.

The `HTTPRequest` class is available from the `4D` class store. You create and send HTTP requests using the [4D.HTTPRequest.new()](#4dhttprequestnew) function, that returns a [`HTTPRequest object`](#httprequest-object).

<details><summary>History</summary>

|Release|Changes|
Expand All @@ -15,6 +13,11 @@ The `HTTPRequest` class is available from the `4D` class store. You create and s

</details>

The `HTTPRequest` class is available from the `4D` class store. You create and send HTTP requests using the [4D.HTTPRequest.new()](#4dhttprequestnew) function, that returns a [`HTTPRequest object`](#httprequest-object).

### Aynchronous programming

This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page.

### Example

Expand Down Expand Up @@ -77,16 +80,6 @@ HTTPRequest objects provide the following properties and functions:
## 4D.HTTPRequest.new()


<details><summary>History</summary>

|Release|Changes|
|---|---|
|21|Support of *storeCertificateName* property|
|20|TLS validation by default |
|19 R7|Support of *automaticRedirections* and *decodeData* properties |

</details>

<!-- REF #4D.HTTPRequest.new().Syntax -->**4D.HTTPRequest.new**( *url* : Text { ; *options* : Object } ) : 4D.HTTPRequest<!-- END REF -->


Expand All @@ -101,6 +94,18 @@ HTTPRequest objects provide the following properties and functions:
</div>
<!-- END REF -->

<details><summary>History</summary>

|Release|Changes|
|---|---|
|21 R3|Support of *storeCertificateName* property on macOS|
|21|Support of *storeCertificateName* property on Windows|
|20|TLS validation by default |
|19 R7|Support of *automaticRedirections* and *decodeData* properties |

</details>


#### Description

The `4D.HTTPRequest.new()` function <!-- REF #4D.HTTPRequest.new().Summary -->creates and sends a HTTP request to the HTTP server defined in *url* with the defined *options*, and returns a `4D.HTTPRequest` object<!-- END REF -->.
Expand Down Expand Up @@ -154,7 +159,7 @@ In the *options* parameter, pass an object that can contain the following proper
|proxyAuthentication|[authentication object](#authentication-object)|Object handling proxy authentication|undefined|
|returnResponseBody|Boolean|If false, the response body is not returned in the [`response` object](#response). Returns an error if false and `onData` is undefined|True|
|serverAuthentication|[authentication object](#authentication-object)|Object handling server authentication|undefined|
|storeCertificateName|Text|(Windows only) Name of the OS certificate store (e.g. "LocalMachine") from where to use certificates instead of those in the certificates folder. If the certificate store is not found, an error is returned. For more information, see [this blog post](https://blog.4d.com/https-requests-now-support-windows-certificate-store).|undefined|
|storeCertificateName|Text| Name of a certificate stored in the Certificate Store (Windows) or in the *keychain* (macOS) to use instead of one saved in the certificates folder. If the certificate is not found in the store, an error is returned. For more information, see [this blog post for Windows](https://blog.4d.com/https-requests-now-support-windows-certificate-store) and [this blog post for macOS](https://blog.4d.com/https-requests-macos-keychain-support-is-here).|undefined|
|timeout|Real|Timeout in seconds. undefined = no timeout|undefined|
|validateTLSCertificate|Boolean|If false, 4D does not validate the TLS certificate and does not return an error if it is invalid (i.e. expired, self-signed...). Important: In the current implementation, the Certification Authority itself is not verified.|True|

Expand Down
5 changes: 5 additions & 0 deletions docs/API/SystemWorkerClass.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ System workers allow the 4D code to call any external process (a shell command,

The `SystemWorker` class is available from the `4D` class store.

### Aynchronous programming

This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page.


### Example

```4d
Expand Down
18 changes: 12 additions & 6 deletions docs/API/TCPConnectionClass.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ title: TCPConnection

The `TCPConnection` class allows you to manage Transmission Control Protocol (TCP) client connections to a [server](./TCPListenerClass.md), enabling you to send and receive data, and handle connection lifecycle events using callbacks.

<details><summary>History</summary>

|Release|Changes|
|---|---|
|20 R9|New `listener`, `address`, and `port` attributes|
|20 R8|Class added|

</details>

The `TCPConnection` class is available from the `4D` class store. You can create a TCP connection using the [4D.TCPConnection.new()](#4dtcpconnectionnew) function, which returns a [TCPConnection object](#tcpconnection-object).

All `TCPConnection` class functions are thread-safe.
Expand All @@ -19,14 +28,11 @@ For debugging and monitoring, you can use the [4DTCPUDPLog.txt log file](../Debu

:::

<details><summary>History</summary>

|Release|Changes|
|---|---|
|20 R9|New `listener`, `address`, and `port` attributes|
|20 R8|Class added|
### Aynchronous programming

This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page.

</details>

### Examples

Expand Down
14 changes: 10 additions & 4 deletions docs/API/TCPListenerClass.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,6 @@ title: TCPListener

The `TCPListener` class allows you to create and configure a TCP server in 4D. Once the TCP listener is instantiated, you can receive client TCP connections and communicate using any protocol supporting TCP.

The `TCPListener` class is available from the `4D` class store. You can create a TCP server using the [4D.TCPListener.new()](#4dtcplistenernew) function, which returns a [TCPListener object](#tcplistener-object).

All `TCPListener` class functions are thread-safe.


<details><summary>History</summary>

Expand All @@ -18,6 +14,16 @@ All `TCPListener` class functions are thread-safe.

</details>

The `TCPListener` class is available from the `4D` class store. You can create a TCP server using the [4D.TCPListener.new()](#4dtcplistenernew) function, which returns a [TCPListener object](#tcplistener-object).

All `TCPListener` class functions are thread-safe.


### Aynchronous programming

This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page.


### Example

```4d
Expand Down
18 changes: 11 additions & 7 deletions docs/API/UDPSocketClass.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ title: UDPSocket

The `UDPSocket` class allows you to send and receive UDP packets. UDP (User Datagram Protocol) is an easy-to-implement protocol for sending data. It is faster and simpler than TCP (only 8 bytes of header as opposed to at least 20 bytes in TCP), but it does not offer the same level of reliability. It is useful for applications where data must arrive at their destination quickly. However, it does not allow verification of delivery, nor does it allow error-checking or recovery of data that was not delivered correctly.

<details><summary>History</summary>

|Release|Changes|
|---|---|
|20 R10|Class added|

</details>


The `UDPSocket` class is available from the `4D` class store. You can create a UDP connection using the [4D.UDPSocket.new()](#4dudpsocketnew) function, which returns a [UDPSocket object](#udpsocket-object).

Thanks to the standard 4D object *refcounting*, a UDPSocket is automatically released when it is no longer referenced, i.e. when no more references to them exist in memory. This typically occurs, for example, at the end of a method execution for local variables. Consequently, the associated resources are properly cleaned up without requiring explicit closure. However, if you want to "force" the closure of a socket at any moment, [**nullify** its references by setting them to **Null**](../Concepts/dt_object.md#resources).
Expand All @@ -15,15 +24,10 @@ For debugging and monitoring, you can use the [4DTCPUDPLog.txt log file](../Debu

:::

<details><summary>History</summary>

|Release|Changes|
|---|---|
|20 R10|Class added|

</details>
### Aynchronous programming

### Example
This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page.


### UDPSocket Object
Expand Down
5 changes: 5 additions & 0 deletions docs/API/WebSocketClass.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ WebSocket client connections are useful, for example, to receive financial data

</details>

### Aynchronous programming

This class supports asynchronous programming in 4D as described in the [Asynchronous Execution](../Develop/async.md) page.



### Example

Expand Down
Loading
Loading