From d6cd06ff32687248c20dab25ce53198a7e5b42aa Mon Sep 17 00:00:00 2001
From: Antonio Mansilla <antonio.mansilla@spryker.com>
Date: Mon, 18 Dec 2023 11:03:17 +0100
Subject: [PATCH] Initial commit

---
 .env.dist                                     |    2 +
 .github/workflows/ci.yml                      |   71 +
 .gitignore                                    |   20 +
 CONTRIBUTING.md                               |    0
 LICENSE                                       |   21 +
 README.md                                     |  139 +
 bin/spryker-toolkit                           |   32 +
 composer.json                                 |   53 +
 composer.lock                                 | 3596 +++++++++++++++++
 phpcs.xml                                     |   21 +
 phpstan-bootstrap.php                         |    3 +
 phpstan.neon                                  |   16 +
 src/Shared/Commands/ContainerDumpCommand.php  |   45 +
 src/Shared/Container/ContainerAwareTrait.php  |   27 +
 src/Shared/Output/OutputAwareTrait.php        |   27 +
 src/Translator/AbstractYvesTranslator.php     |  332 ++
 src/Translator/CategoryTranslator.php         |   29 +
 src/Translator/CmsBlockTranslator.php         |   21 +
 src/Translator/CmsPageTranslator.php          |   21 +
 .../Commands/AbstractTranslationCommand.php   |  163 +
 .../Commands/YvesTranslationCommand.php       |  110 +
 .../Commands/ZedTranslationCommand.php        |   69 +
 .../Config/YvesTranslationConfig.php          |   18 +
 src/Translator/Config/ZedTranslatorConfig.php |   38 +
 src/Translator/ContentBannerTranslator.php    |   21 +
 .../Exception/TranslatorException.php         |   16 +
 .../Finder/TranslationFinderInterface.php     |   22 +
 .../Finder/ZedTranslationFinder.php           |   28 +
 src/Translator/GlossaryTranslator.php         |  117 +
 src/Translator/MerchantProfileTranslator.php  |   29 +
 .../NavigationNodeCategoryTranslator.php      |   21 +
 src/Translator/ProductAbstractTranslator.php  |   29 +
 src/Translator/ProductConcreteTranslator.php  |   29 +
 .../ProductDiscontinuedTranslator.php         |   29 +
 src/Translator/ProductLabelTranslator.php     |   29 +
 .../ProductManagementAttributeTranslator.php  |   29 +
 src/Translator/ProductOptionTranslator.php    |   29 +
 .../ProductSearchAttributeTranslator.php      |   29 +
 src/Translator/ProductSetTranslator.php       |   29 +
 src/Translator/TranslationRequest.php         |   79 +
 src/Translator/TranslationResponse.php        |   91 +
 .../ChatGptTranslatorEngine.php               |  122 +
 .../DeepLTranslatorEngine.php                 |  102 +
 .../TranslatorEngineInterface.php             |   27 +
 src/Translator/ZedTranslator.php              |  385 ++
 src/container.php                             |   38 +
 tests/.gitkeep                                |    0
 var/cache/.gitkeep                            |    0
 var/log/.gitkeep                              |    0
 49 files changed, 6204 insertions(+)
 create mode 100644 .env.dist
 create mode 100644 .github/workflows/ci.yml
 create mode 100644 .gitignore
 create mode 100644 CONTRIBUTING.md
 create mode 100644 LICENSE
 create mode 100644 README.md
 create mode 100755 bin/spryker-toolkit
 create mode 100644 composer.json
 create mode 100644 composer.lock
 create mode 100644 phpcs.xml
 create mode 100644 phpstan-bootstrap.php
 create mode 100644 phpstan.neon
 create mode 100644 src/Shared/Commands/ContainerDumpCommand.php
 create mode 100644 src/Shared/Container/ContainerAwareTrait.php
 create mode 100644 src/Shared/Output/OutputAwareTrait.php
 create mode 100644 src/Translator/AbstractYvesTranslator.php
 create mode 100644 src/Translator/CategoryTranslator.php
 create mode 100644 src/Translator/CmsBlockTranslator.php
 create mode 100644 src/Translator/CmsPageTranslator.php
 create mode 100644 src/Translator/Commands/AbstractTranslationCommand.php
 create mode 100644 src/Translator/Commands/YvesTranslationCommand.php
 create mode 100644 src/Translator/Commands/ZedTranslationCommand.php
 create mode 100644 src/Translator/Config/YvesTranslationConfig.php
 create mode 100644 src/Translator/Config/ZedTranslatorConfig.php
 create mode 100644 src/Translator/ContentBannerTranslator.php
 create mode 100644 src/Translator/Exception/TranslatorException.php
 create mode 100644 src/Translator/Finder/TranslationFinderInterface.php
 create mode 100644 src/Translator/Finder/ZedTranslationFinder.php
 create mode 100644 src/Translator/GlossaryTranslator.php
 create mode 100644 src/Translator/MerchantProfileTranslator.php
 create mode 100644 src/Translator/NavigationNodeCategoryTranslator.php
 create mode 100644 src/Translator/ProductAbstractTranslator.php
 create mode 100644 src/Translator/ProductConcreteTranslator.php
 create mode 100644 src/Translator/ProductDiscontinuedTranslator.php
 create mode 100644 src/Translator/ProductLabelTranslator.php
 create mode 100644 src/Translator/ProductManagementAttributeTranslator.php
 create mode 100644 src/Translator/ProductOptionTranslator.php
 create mode 100644 src/Translator/ProductSearchAttributeTranslator.php
 create mode 100644 src/Translator/ProductSetTranslator.php
 create mode 100644 src/Translator/TranslationRequest.php
 create mode 100644 src/Translator/TranslationResponse.php
 create mode 100644 src/Translator/TranslatorEngine/ChatGptTranslatorEngine.php
 create mode 100644 src/Translator/TranslatorEngine/DeepLTranslatorEngine.php
 create mode 100644 src/Translator/TranslatorEngine/TranslatorEngineInterface.php
 create mode 100644 src/Translator/ZedTranslator.php
 create mode 100644 src/container.php
 create mode 100644 tests/.gitkeep
 create mode 100644 var/cache/.gitkeep
 create mode 100644 var/log/.gitkeep

diff --git a/.env.dist b/.env.dist
new file mode 100644
index 0000000..48540d5
--- /dev/null
+++ b/.env.dist
@@ -0,0 +1,2 @@
+SPRYKER_TOOLKIT_CHATGPT_API_AUTH_KEY=""
+SPRYKER_TOOLKIT_DEEPL_API_AUTH_KEY=""
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..133b1ec
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,71 @@
+name: CI
+
+on:
+  pull_request:
+
+  push:
+    branches:
+      - main
+
+  # Allows you to run this workflow manually from the Actions tab
+  workflow_dispatch:
+
+concurrency:
+  group: ${{ github.repository }}-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  validation:
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        php-version: [
+          '8.1',
+          '8.2',
+          '8.3'
+        ]
+
+    steps:
+      - name: Setup PHP
+        uses: shivammathur/setup-php@v2
+        with:
+          php-version: ${{ matrix.php-version }}
+          extensions: mbstring, intl
+
+      - name: Checkout
+        uses: actions/checkout@v3
+
+      - name: Composer validate
+        run: composer validate
+
+      - name: Composer get cache directory
+        id: composer-cache
+        run: |
+          echo "::set-output name=dir::$(composer config cache-files-dir)"
+
+      - name: Composer cache
+        uses: actions/cache@v2
+        with:
+          path: ${{ steps.composer-cache.outputs.dir }}
+          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-composer-
+
+      - name: Composer install
+        run: |
+          composer --version
+          if [[ ${{ matrix.php-version }} == '8.2' ]]; then
+            composer update --prefer-stable --optimize-autoloader
+          else
+            composer install --optimize-autoloader
+          fi
+
+      - name: Warmup
+        run: ./bin/spryker-toolkit container:dump
+
+      - name: PHPStan checks
+        run: composer stan
+
+      - name: CodeStyle checks
+        run: composer cs-check
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c836dfb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,20 @@
+# IDE
+.idea/
+.project/
+nbproject/
+.buildpath/
+.settings/
+*.sublime-*
+
+# app
+/.env
+/var/*
+!/var/cache
+/var/cache/*
+!/var/cache/.gitkeep
+!/var/log
+/var/log/*
+!/var/log/.gitkeep
+
+# tooling
+vendor/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..e69de29
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..987bc6a
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Spryker Community
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..275c5d5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,139 @@
+<h1 align="center">
+  Spryker CLI Toolkit
+  <br>
+</h1>
+
+<h4 align="center">A suite of utilities designed to enhance performance in your day-to-day operations with Spryker Commerce OS.</h4>
+
+<p align="center">
+  <a href="#installation">Installation</a> •
+  <a href="#usage">Usage</a> •
+  <a href="#contributing">Contributing</a>
+</p>
+
+<p align="center">
+    <a href="https://github.com/spryker-community/spryker-toolkit/actions?query=workflow%3ACI+branch%3Amain">
+        <img src="https://github.com/spryker-community/spryker-toolkit/workflows/CI/badge.svg?branch=main"/>
+    </a>
+    <a href="https://packagist.org/packages/spryker-community/sprkyer-translations">
+        <img src="https://img.shields.io/packagist/v/spryker-community/sprkyer-translations.svg?style=flat-square">
+    </a>
+    <a href="LICENSE">
+        <img src="https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square">
+    </a>
+    <a href="https://commercequest.space/">
+        <img src="https://img.shields.io/badge/join-commercequest-blue.svg?logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTYgMTYiIHhtbDpzcGFjZT0icHJlc2VydmUiPiAgPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgeD0iMCIgeT0iMCIKICAgIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBTUFBQUFvTFE5VEFBQUFCR2RCVFVFQUFMR1BDL3hoQlFBQUFDQmpTRkpOCkFBQjZKZ0FBZ0lRQUFQb0FBQUNBNkFBQWRUQUFBT3BnQUFBNm1BQUFGM0NjdWxFOEFBQUNXRkJNVkVVQUFBQUFydThBcmU0QXNQSGQKQ3BIckFJdnNBSXpxQUl2WkFJRUFpcjBBc1BEWURaTGVBb2NBcWVnQXJlMEFwdU1BU0dRQWw5Q0xmdjhBREE4QW9OeW5BRnNBWG9IRApCbndBLy84QWxNdUJRYWJvQUlyVkFINEFIeW9BZmF3QWxjMEJDUTBmQUJKQUFDWWpBQlgvQVAvL0FLY0FydThBcnUvc0FJenBBSXJoCkFJWHJBSXZzQUl3QXJlNEFydThBcnU4QXJ1OEFydThBc1BIL0FIVHNBSXpzQUl6cUFJdm9BSXJyQUl6ckFJc0FyT3dBcnU4QXJ1OEEKcCtQTkQ0L3RBSXpsQUlqc0FJd0FyZTRBck8wQW5OWUFvdDhBbHMwOVNJZm9BSXJWQUg2SEFGRFlBSURyQUlzQXJPd0FydThBbGN3QQpOa3NBVm5jQVZXL3BBSVhtQUltbEFHSUFBQURrQUlmbEFJZ0FvTndBcmUwQXBlTUFabzNyQUh6ckFJdlhBSDhTQUF2bUFJanJBSXZiCkFJSUFxZWdBcnU0QWxNc0FBQURtQUlucEFJcStBSEhhQUlIb0FJcnFBSXZJQUhjQXF1b0FxZWdBZktzQUFBRG9BSW5pQUlhcEFHVG4KQUluckFJempBSWVnQUY4QXErc0FwT0VBVW5IS0FIanBBSXJjQUlQWkFJSHJBSXZOQUhvQUFBQUFyZTBBcGVQUkFIdnBBSXJnQUlYUgpBSHppQUlhWEFGa0FydThBck8wQXJPd0FyZTRBc08zQUJIam9BSXJzQUl6b0FJcm5BSW5VQUg0QXErd0FydThBcU9aRlJJYmVBSVBtCkFJam9BSXJxQUl2WUFJQUFsTXNBcXVvQW5OY0FjNThBRmdHWEFGbkRBSFRRQUh2RkFIV1VBRmpDQUhQZ0FJVzlBSENQQUZVQU8xRUEKYkpVQWU2a0FjWnNBUkYwQUFBQUFBUUFRQUFrMUFCOFVBQXdBQUFCdUFFR0JBRXhXQURNQUFBQUFyL0FBcmU3c0FJenFBSXNBcnUvdApBSXdBcnZBQXJ1N3RBSTBBcSt2Ly8vOG0yNkNrQUFBQXZYUlNUbE1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCkFBQUFBQUFBQUFBQUFBb1lLaHdqWnlBSlliM2F0ejBDYk9TN3EvNitEcGI3czE3eSsveDkvdDdydzJmUjBXdk0rem5wdEROS05IdjAKVmdXMDV3ZWs0amdhMWJrTEplSzhQdXVPQTFyOFp4dDMvWHFPN0RzQm05azR0dXJpTTgzQ0R3N0hzbm4ybWdmeHBSL2ZzNkxtT2Y3TwpUSUJFSnVUMTZlRW85ZmpDS01mNis0OERyZnpjYUFkVnd0bkRkcWJ6bGhFamNaUjhOUVFER0NjWkFpWlhIZ1p5N2s2b0FBQUFBV0pMClIwVEhqUVZLV3dBQUFBZDBTVTFGQitjTURnb1VOM2srN0NRQUFBRWJTVVJCVkJqVEFSQUI3LzRBQUFBQUFRSUJBUUVEQkFVR0J3Z0gKQmdBQUNRRUNBU1luSmdvTERDZ3BLaXNzQUFBQkFpMHVMekF4TWpNME5UWTNPRGtBRFE0Nk96eTl2YjQ5UGorL1FNQy9RUUFQRUVMQgpRMFJGUmtkSXdrbEtTOEpNQUFGTlRzRlBVRkZTVTc5VVZWWlh2MWdBV1ZyRFcxd1JFbDFld2w5Z1lXSy9Zd0JrWmNSbVp4TUdhRUZwCmFtdHN2MjF1QUcvQmNIRVVGWEp6d25SMWRuZkNlSGtBZXNON2ZCWVhmWDdDZjRDQnY3K0Nnd0NFd1lVWUdScUdoNytJaWIvQ2lvc2IKQUl6QmpZNlBrSkdTdjVPVXY3K1ZsaHdBbDhHTW1MMlptcHZGeGNXY25jS2Vud0Nnb2NUR29xT2twYWFucUttcXE2eXRBSzZ2c0xHeQpzeDIwdGJhM3VMbTZ1d0FBSG5LOHVCOEFJQUFoSWlNQUpDUWxBR2pDWmVjTTg2dHVBQUFBSlhSRldIUmtZWFJsT21OeVpXRjBaUUF5Ck1ESXpMVEV5TFRFMFZERXdPakl3T2pVMEt6QXdPakF3RG13REFRQUFBQ1YwUlZoMFpHRjBaVHB0YjJScFpua0FNakF5TXkweE1pMHgKTkZReE1Eb3lNRG8xTkNzd01Eb3dNSDh4dTcwQUFBQW9kRVZZZEdSaGRHVTZkR2x0WlhOMFlXMXdBREl3TWpNdE1USXRNVFJVTVRBNgpNakE2TlRVck1EQTZNRENPVTVIV0FBQUFBRWxGVGtTdVFtQ0MiIC8+Cjwvc3ZnPgo=&style=flat-square"/>
+    </a>
+</p>
+
+## Installation
+
+### Git clone
+
+```bash
+git clone https://github.com/spyker-community/spryker-toolkit && cd spryker-toolkit
+bin/spryker-toolkit
+```
+
+### Composer 
+
+```bash
+composer require --dev spryker-community/spryker-toolkit
+vendor/bin/spryker-toolkit
+```
+
+## Usage
+
+You can see all the available commands by executing:
+
+```bash
+bin/spryker-toolkit --help
+```
+
+### Prerequisites
+
+Some of the commands use external services like OpenAI or DeepL that requires API credentials. In those cases you will require to add the credential to your `.env` file.
+
+1. Copy the template for the environment variables:
+
+```bash
+cp .env.dist .env
+```
+
+2. Add your own auth credentials for the service you are using:
+```
+SPRYKER_TOOLKIT_DEEPL_API_AUTH_KEY="your_deepl_api_token"
+SPRYKER_TOOLKIT_CHATGPT_API_AUTH_KEY="your_chatgpt_api_token"
+```
+
+### Generate translations for the Spryker Yves storefront
+
+```bash
+bin/spryker-toolkit translation:yves:generate
+```
+
+#### Arguments
+
+* `locales`: List of locales to which we want the Spryker glossary translated.
+
+#### Options
+
+* `--working-dir`: If specified, use the given directory as Spryker project working directory.
+* `--translation-engine`: The translation engine to be used for translation generation. Allowed values are deepl or chatgpt [default: "chatgpt"]
+
+#### Examples
+
+1. Generate missing translations Yves glossary to Spanish from Spain (es_ES) by ChatGPT.
+
+```bash
+bin/spryker-toolkit translation:yves:generate es_ES --working-dir=../b2b-demo-marketplace- --translation-engine=chatgpt
+```
+
+2. Generate missing translations Yves glossary to Spanish from Spain (es_ES) and French from France by DeepL.
+
+```bash
+bin/spryker-toolkit translation:yves:generate es_ES fr_FR --working-dir=../b2b-demo-marketplace --translation-engine=deepl
+```
+
+### Generate translations for the Spryker Zed backoffice
+
+```bash
+bin/spryker-toolkit translation:yves:generate
+```
+
+#### Arguments
+
+* `locales`: List of locales to which we want the Spryker glossary translated.
+
+#### Options
+
+* `--working-dir`: If specified, use the given directory as Spryker project working directory.
+* `--translation-engine`: The translation engine to be used for translation generation. Allowed values are `deepl` or `chatgpt` [default: `chatgpt`]
+
+#### Examples
+
+1. Generate missing translations Zed glossary to Spanish from Spain (es_ES) by ChatGPT.
+
+```bash
+bin/spryker-toolkit translation:zed:generate es_ES --working-dir=../b2b-demo-marketplace --translation-engine=chatgpt
+```
+
+2. Generate missing translations Zed glossary to Spanish from Spain (es_ES) and French from France by DeepL.
+
+```bash
+bin/spryker-toolkit translation:zed:generate es_ES fr_FR --working-dir=../b2b-demo-marketplace --translation-engine=deepl
+```
+
+## Contributing
+
+We love contributions, big or small.  Please don't forget to read the [contribution guidelines](CONTRIBUTING.md).
+
+## License
+
+This package is released under the [MIT license](LICENSE)
+
+#
+
+<p align="center">
+Supported with :heart: by the Spryker Community
+</p>
\ No newline at end of file
diff --git a/bin/spryker-toolkit b/bin/spryker-toolkit
new file mode 100755
index 0000000..a5d0477
--- /dev/null
+++ b/bin/spryker-toolkit
@@ -0,0 +1,32 @@
+#!/usr/bin/env php
+<?php
+require_once __DIR__ . '/../vendor/autoload.php';
+
+use SprykerCommunity\Toolkit\Release\Commands\PackagesReleaseCommand;
+use SprykerCommunity\Toolkit\Release\Commands\PrepareDemoCommand;
+use SprykerCommunity\Toolkit\Shared\Commands\ContainerDumpCommand;
+use SprykerCommunity\Toolkit\Translator\Commands\YvesTranslationCommand;
+use SprykerCommunity\Toolkit\Translator\Commands\ZedTranslationCommand;
+use Symfony\Component\Console\Application;
+use Symfony\Component\Dotenv\Dotenv;
+
+(new Dotenv())->bootEnv(dirname(__DIR__, 1) . '/.env');
+
+$container = include __DIR__ . '/../src/container.php';
+$container->compile(true);
+
+$commands = array(
+    new YvesTranslationCommand(),
+    new ZedTranslationCommand(),
+    new ContainerDumpCommand(),
+);
+
+$app = new Application('Spryker Toolkit');
+foreach ($commands as $command) {
+    if (method_exists($command, 'setContainer')) {
+        $command->setContainer($container);
+    }
+    $app->add($command);
+}
+
+$app->run();
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..5d082ae
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,53 @@
+{
+    "name": "spryker-community/spryker-toolkit",
+    "description": "The Spryker Toolkit",
+    "type": "library",
+    "license": "MIT",
+    "prefer-stable": true,
+    "autoload": {
+        "psr-4": {
+            "SprykerCommunity\\Toolkit\\": "src"
+        },
+        "classmap": ["src"]
+    },
+    "require": {
+        "php": ">=8.1",
+        "ext-curl": "*",
+        "ext-intl": "*",
+        "ext-json": "*",
+        "czproject/git-php": "^4.2",
+        "deeplcom/deepl-php": "^1.5",
+        "guzzlehttp/psr7": "^2.6",
+        "knplabs/github-api": "^3.0",
+        "league/csv": "^9.8",
+        "monolog/monolog": "^3.5",
+        "openai-php/client": "^0.7.7",
+        "php-http/guzzle7-adapter": "^1.0",
+        "symfony/config": "^6.4",
+        "symfony/console": "^6.3",
+        "symfony/dependency-injection": "^6.4",
+        "symfony/dotenv": "^6.3",
+        "symfony/intl": "^6.3",
+        "symfony/yaml": "^6.4"
+    },
+    "require-dev": {
+        "phpstan/phpstan": "^1.10",
+        "phpstan/phpstan-symfony": "^1.3",
+        "spryker/code-sniffer": "^0.17.19"
+    },
+    "config": {
+        "sort-packages": true,
+        "platform": {
+            "php": "8.1"
+        },
+        "allow-plugins": {
+            "php-http/discovery": true,
+            "dealerdirect/phpcodesniffer-composer-installer": true
+        }
+    },
+    "scripts": {
+        "cs-check": "phpcs",
+        "cs-fix": "phpcbf",
+        "stan": "phpstan --memory-limit=-1 analyze src/"
+    }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..ff92615
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,3596 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "1f3cde3ac9d5ae88f9e2ae14f4aeb24b",
+    "packages": [
+        {
+            "name": "clue/stream-filter",
+            "version": "v1.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/clue/stream-filter.git",
+                "reference": "d6169430c7731d8509da7aecd0af756a5747b78e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e",
+                "reference": "d6169430c7731d8509da7aecd0af756a5747b78e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "Clue\\StreamFilter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Christian Lück",
+                    "email": "christian@clue.engineering"
+                }
+            ],
+            "description": "A simple and modern approach to stream filtering in PHP",
+            "homepage": "https://github.com/clue/php-stream-filter",
+            "keywords": [
+                "bucket brigade",
+                "callback",
+                "filter",
+                "php_user_filter",
+                "stream",
+                "stream_filter_append",
+                "stream_filter_register"
+            ],
+            "support": {
+                "issues": "https://github.com/clue/stream-filter/issues",
+                "source": "https://github.com/clue/stream-filter/tree/v1.6.0"
+            },
+            "funding": [
+                {
+                    "url": "https://clue.engineering/support",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/clue",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-02-21T13:15:14+00:00"
+        },
+        {
+            "name": "czproject/git-php",
+            "version": "v4.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/czproject/git-php.git",
+                "reference": "e257f2c3b43fe8fef19ddb5727b604416b423107"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/czproject/git-php/zipball/e257f2c3b43fe8fef19ddb5727b604416b423107",
+                "reference": "e257f2c3b43fe8fef19ddb5727b604416b423107",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6.0"
+            },
+            "require-dev": {
+                "nette/tester": "^2.0"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jan Pecha",
+                    "email": "janpecha@email.cz"
+                }
+            ],
+            "description": "Library for work with Git repository in PHP.",
+            "keywords": [
+                "git"
+            ],
+            "support": {
+                "issues": "https://github.com/czproject/git-php/issues",
+                "source": "https://github.com/czproject/git-php/tree/v4.2.0"
+            },
+            "funding": [
+                {
+                    "url": "https://www.janpecha.cz/donate/git-php/",
+                    "type": "other"
+                }
+            ],
+            "time": "2023-07-12T09:14:30+00:00"
+        },
+        {
+            "name": "deeplcom/deepl-php",
+            "version": "v1.6.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/DeepLcom/deepl-php.git",
+                "reference": "2f301d555b0ef7c9dde626877e4301d0b04ba29d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/DeepLcom/deepl-php/zipball/2f301d555b0ef7c9dde626877e4301d0b04ba29d",
+                "reference": "2f301d555b0ef7c9dde626877e4301d0b04ba29d",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "php": ">=7.3.0",
+                "php-http/discovery": "^1.18",
+                "php-http/multipart-stream-builder": "^1.3",
+                "psr/http-client": "^1.0",
+                "psr/http-client-implementation": "*",
+                "psr/http-factory-implementation": "*",
+                "psr/log": "^1.1 || ^2.0 || ^3.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3",
+                "guzzlehttp/guzzle": "^7.7.0",
+                "php-mock/php-mock-phpunit": "^2.6",
+                "phpunit/phpunit": "^9",
+                "ramsey/uuid": "^4.2",
+                "squizlabs/php_codesniffer": "^3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DeepL\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "DeepL SE",
+                    "email": "open-source@deepl.com"
+                }
+            ],
+            "description": "Official DeepL API Client Library",
+            "keywords": [
+                "api",
+                "deepl",
+                "translation",
+                "translator"
+            ],
+            "support": {
+                "issues": "https://github.com/DeepLcom/deepl-php/issues",
+                "source": "https://github.com/DeepLcom/deepl-php/tree/v1.6.0"
+            },
+            "time": "2023-11-03T13:37:21+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "7.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9",
+                "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
+                "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-client": "^1.0",
+                "symfony/deprecation-contracts": "^2.2 || ^3.0"
+            },
+            "provide": {
+                "psr/http-client-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.1",
+                "ext-curl": "*",
+                "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+                "php-http/message-factory": "^1.1",
+                "phpunit/phpunit": "^8.5.29 || ^9.5.23",
+                "psr/log": "^1.1 || ^2.0 || ^3.0"
+            },
+            "suggest": {
+                "ext-curl": "Required for CURL handler support",
+                "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Jeremy Lindblom",
+                    "email": "jeremeamia@gmail.com",
+                    "homepage": "https://github.com/jeremeamia"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "psr-18",
+                "psr-7",
+                "rest",
+                "web service"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/guzzle/issues",
+                "source": "https://github.com/guzzle/guzzle/tree/7.8.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-08-27T10:20:53+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "111166291a0f8130081195ac4556a5587d7f1b5d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d",
+                "reference": "111166291a0f8130081195ac4556a5587d7f1b5d",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.1",
+                "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/promises/issues",
+                "source": "https://github.com/guzzle/promises/tree/2.0.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-08-03T15:11:55+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "2.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727",
+                "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2.5 || ^8.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.1 || ^2.0",
+                "ralouphie/getallheaders": "^3.0"
+            },
+            "provide": {
+                "psr/http-factory-implementation": "1.0",
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.8.1",
+                "http-interop/http-factory-tests": "^0.9",
+                "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+            },
+            "suggest": {
+                "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+            },
+            "type": "library",
+            "extra": {
+                "bamarni-bin": {
+                    "bin-links": true,
+                    "forward-command": false
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Graham Campbell",
+                    "email": "hello@gjcampbell.co.uk",
+                    "homepage": "https://github.com/GrahamCampbell"
+                },
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "George Mponos",
+                    "email": "gmponos@gmail.com",
+                    "homepage": "https://github.com/gmponos"
+                },
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com",
+                    "homepage": "https://github.com/Nyholm"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://github.com/sagikazarmark"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "email": "webmaster@tubo-world.de",
+                    "homepage": "https://github.com/Tobion"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "support": {
+                "issues": "https://github.com/guzzle/psr7/issues",
+                "source": "https://github.com/guzzle/psr7/tree/2.6.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/GrahamCampbell",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/Nyholm",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-08-27T10:13:57+00:00"
+        },
+        {
+            "name": "knplabs/github-api",
+            "version": "v3.12.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/KnpLabs/php-github-api.git",
+                "reference": "b50fc1f40bb5ac50957d32c5732fcde9167ac30a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/b50fc1f40bb5ac50957d32c5732fcde9167ac30a",
+                "reference": "b50fc1f40bb5ac50957d32c5732fcde9167ac30a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.2.5 || ^8.0",
+                "php-http/cache-plugin": "^1.7.1",
+                "php-http/client-common": "^2.3",
+                "php-http/discovery": "^1.12",
+                "php-http/httplug": "^2.2",
+                "php-http/multipart-stream-builder": "^1.1.2",
+                "psr/cache": "^1.0|^2.0|^3.0",
+                "psr/http-client-implementation": "^1.0",
+                "psr/http-factory-implementation": "^1.0",
+                "psr/http-message": "^1.0|^2.0",
+                "symfony/deprecation-contracts": "^2.2|^3.0",
+                "symfony/polyfill-php80": "^1.17"
+            },
+            "require-dev": {
+                "guzzlehttp/guzzle": "^7.2",
+                "guzzlehttp/psr7": "^1.7",
+                "http-interop/http-factory-guzzle": "^1.0",
+                "php-http/mock-client": "^1.4.1",
+                "phpstan/extension-installer": "^1.0.5",
+                "phpstan/phpstan": "^0.12.57",
+                "phpstan/phpstan-deprecation-rules": "^0.12.5",
+                "phpunit/phpunit": "^8.5 || ^9.4",
+                "symfony/cache": "^5.1.8",
+                "symfony/phpunit-bridge": "^5.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-2.x": "2.20.x-dev",
+                    "dev-master": "3.11.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Github\\": "lib/Github/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "KnpLabs Team",
+                    "homepage": "http://knplabs.com"
+                },
+                {
+                    "name": "Thibault Duplessis",
+                    "email": "thibault.duplessis@gmail.com",
+                    "homepage": "http://ornicar.github.com"
+                }
+            ],
+            "description": "GitHub API v3 client",
+            "homepage": "https://github.com/KnpLabs/php-github-api",
+            "keywords": [
+                "api",
+                "gh",
+                "gist",
+                "github"
+            ],
+            "support": {
+                "issues": "https://github.com/KnpLabs/php-github-api/issues",
+                "source": "https://github.com/KnpLabs/php-github-api/tree/v3.12.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/acrobat",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-09-30T16:42:04+00:00"
+        },
+        {
+            "name": "league/csv",
+            "version": "9.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/csv.git",
+                "reference": "9d2e0265c5d90f5dd601bc65ff717e05cec19b47"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/csv/zipball/9d2e0265c5d90f5dd601bc65ff717e05cec19b47",
+                "reference": "9d2e0265c5d90f5dd601bc65ff717e05cec19b47",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-mbstring": "*",
+                "php": "^7.4 || ^8.0"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "ext-dom": "*",
+                "friendsofphp/php-cs-fixer": "^v3.4.0",
+                "phpstan/phpstan": "^1.3.0",
+                "phpstan/phpstan-phpunit": "^1.0.0",
+                "phpstan/phpstan-strict-rules": "^1.1.0",
+                "phpunit/phpunit": "^9.5.11"
+            },
+            "suggest": {
+                "ext-dom": "Required to use the XMLConverter and or the HTMLConverter classes",
+                "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "9.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "League\\Csv\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ignace Nyamagana Butera",
+                    "email": "nyamsprod@gmail.com",
+                    "homepage": "https://github.com/nyamsprod/",
+                    "role": "Developer"
+                }
+            ],
+            "description": "CSV data manipulation made easy in PHP",
+            "homepage": "https://csv.thephpleague.com",
+            "keywords": [
+                "convert",
+                "csv",
+                "export",
+                "filter",
+                "import",
+                "read",
+                "transform",
+                "write"
+            ],
+            "support": {
+                "docs": "https://csv.thephpleague.com",
+                "issues": "https://github.com/thephpleague/csv/issues",
+                "rss": "https://github.com/thephpleague/csv/releases.atom",
+                "source": "https://github.com/thephpleague/csv"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sponsors/nyamsprod",
+                    "type": "github"
+                }
+            ],
+            "time": "2022-01-04T00:13:07+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "3.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448",
+                "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/log": "^2.0 || ^3.0"
+            },
+            "provide": {
+                "psr/log-implementation": "3.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "elasticsearch/elasticsearch": "^7 || ^8",
+                "ext-json": "*",
+                "graylog2/gelf-php": "^1.4.2 || ^2.0",
+                "guzzlehttp/guzzle": "^7.4.5",
+                "guzzlehttp/psr7": "^2.2",
+                "mongodb/mongodb": "^1.8",
+                "php-amqplib/php-amqplib": "~2.4 || ^3",
+                "phpstan/phpstan": "^1.9",
+                "phpstan/phpstan-deprecation-rules": "^1.0",
+                "phpstan/phpstan-strict-rules": "^1.4",
+                "phpunit/phpunit": "^10.1",
+                "predis/predis": "^1.1 || ^2",
+                "ruflin/elastica": "^7",
+                "symfony/mailer": "^5.4 || ^6",
+                "symfony/mime": "^5.4 || ^6"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+                "ext-mbstring": "Allow to work properly with unicode symbols",
+                "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+                "ext-openssl": "Required to send log messages using SSL",
+                "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "https://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "https://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "support": {
+                "issues": "https://github.com/Seldaek/monolog/issues",
+                "source": "https://github.com/Seldaek/monolog/tree/3.5.0"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-10-27T15:32:31+00:00"
+        },
+        {
+            "name": "openai-php/client",
+            "version": "v0.7.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/openai-php/client.git",
+                "reference": "f9af25d7d7bd8e58f60ada6c30f1c93d65c73833"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/openai-php/client/zipball/f9af25d7d7bd8e58f60ada6c30f1c93d65c73833",
+                "reference": "f9af25d7d7bd8e58f60ada6c30f1c93d65c73833",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^8.1.0",
+                "php-http/discovery": "^1.19.1",
+                "php-http/multipart-stream-builder": "^1.3.0",
+                "psr/http-client": "^1.0.3",
+                "psr/http-client-implementation": "^1.0.1",
+                "psr/http-factory-implementation": "*",
+                "psr/http-message": "^1.1.0|^2.0.0"
+            },
+            "require-dev": {
+                "guzzlehttp/guzzle": "^7.8.0",
+                "guzzlehttp/psr7": "^2.6.1",
+                "laravel/pint": "^1.13.2",
+                "nunomaduro/collision": "^7.9.0",
+                "pestphp/pest": "^2.19.2",
+                "pestphp/pest-plugin-arch": "^2.3.3",
+                "pestphp/pest-plugin-mock": "^2.0.0",
+                "pestphp/pest-plugin-type-coverage": "^2.2.0",
+                "phpstan/phpstan": "^1.10.35",
+                "rector/rector": "^0.16.0",
+                "symfony/var-dumper": "^6.3.4"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/OpenAI.php"
+                ],
+                "psr-4": {
+                    "OpenAI\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nuno Maduro",
+                    "email": "enunomaduro@gmail.com"
+                },
+                {
+                    "name": "Sandro Gehri"
+                }
+            ],
+            "description": "OpenAI PHP is a supercharged PHP API client that allows you to interact with the Open AI API",
+            "keywords": [
+                "GPT-3",
+                "api",
+                "client",
+                "codex",
+                "dall-e",
+                "language",
+                "natural",
+                "openai",
+                "php",
+                "processing",
+                "sdk"
+            ],
+            "support": {
+                "issues": "https://github.com/openai-php/client/issues",
+                "source": "https://github.com/openai-php/client/tree/v0.7.10"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.com/paypalme/enunomaduro",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/gehrisandro",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/nunomaduro",
+                    "type": "github"
+                }
+            ],
+            "time": "2023-11-14T13:39:26+00:00"
+        },
+        {
+            "name": "php-http/cache-plugin",
+            "version": "1.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/cache-plugin.git",
+                "reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
+                "reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/client-common": "^1.9 || ^2.0",
+                "php-http/message-factory": "^1.0",
+                "psr/cache": "^1.0 || ^2.0 || ^3.0",
+                "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Client\\Common\\Plugin\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "PSR-6 Cache plugin for HTTPlug",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "cache",
+                "http",
+                "httplug",
+                "plugin"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/cache-plugin/issues",
+                "source": "https://github.com/php-http/cache-plugin/tree/1.8.0"
+            },
+            "time": "2023-04-28T10:56:55+00:00"
+        },
+        {
+            "name": "php-http/client-common",
+            "version": "2.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/client-common.git",
+                "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b",
+                "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/httplug": "^2.0",
+                "php-http/message": "^1.6",
+                "psr/http-client": "^1.0",
+                "psr/http-factory": "^1.0",
+                "psr/http-message": "^1.0 || ^2.0",
+                "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0",
+                "symfony/polyfill-php80": "^1.17"
+            },
+            "require-dev": {
+                "doctrine/instantiator": "^1.1",
+                "guzzlehttp/psr7": "^1.4",
+                "nyholm/psr7": "^1.2",
+                "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+                "phpspec/prophecy": "^1.10.2",
+                "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+            },
+            "suggest": {
+                "ext-json": "To detect JSON responses with the ContentTypePlugin",
+                "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+                "php-http/cache-plugin": "PSR-6 Cache plugin",
+                "php-http/logger-plugin": "PSR-3 Logger plugin",
+                "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Client\\Common\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "Common HTTP Client implementations and tools for HTTPlug",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "client",
+                "common",
+                "http",
+                "httplug"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/client-common/issues",
+                "source": "https://github.com/php-http/client-common/tree/2.7.0"
+            },
+            "time": "2023-05-17T06:46:59+00:00"
+        },
+        {
+            "name": "php-http/discovery",
+            "version": "1.19.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/discovery.git",
+                "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e",
+                "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.0|^2.0",
+                "php": "^7.1 || ^8.0"
+            },
+            "conflict": {
+                "nyholm/psr7": "<1.0",
+                "zendframework/zend-diactoros": "*"
+            },
+            "provide": {
+                "php-http/async-client-implementation": "*",
+                "php-http/client-implementation": "*",
+                "psr/http-client-implementation": "*",
+                "psr/http-factory-implementation": "*",
+                "psr/http-message-implementation": "*"
+            },
+            "require-dev": {
+                "composer/composer": "^1.0.2|^2.0",
+                "graham-campbell/phpspec-skip-example-extension": "^5.0",
+                "php-http/httplug": "^1.0 || ^2.0",
+                "php-http/message-factory": "^1.0",
+                "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+                "symfony/phpunit-bridge": "^6.2"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "Http\\Discovery\\Composer\\Plugin",
+                "plugin-optional": true
+            },
+            "autoload": {
+                "psr-4": {
+                    "Http\\Discovery\\": "src/"
+                },
+                "exclude-from-classmap": [
+                    "src/Composer/Plugin.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "adapter",
+                "client",
+                "discovery",
+                "factory",
+                "http",
+                "message",
+                "psr17",
+                "psr7"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/discovery/issues",
+                "source": "https://github.com/php-http/discovery/tree/1.19.1"
+            },
+            "time": "2023-07-11T07:02:26+00:00"
+        },
+        {
+            "name": "php-http/guzzle7-adapter",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/guzzle7-adapter.git",
+                "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/guzzle7-adapter/zipball/fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01",
+                "reference": "fb075a71dbfa4847cf0c2938c4e5a9c478ef8b01",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^7.0",
+                "php": "^7.2 | ^8.0",
+                "php-http/httplug": "^2.0",
+                "psr/http-client": "^1.0"
+            },
+            "provide": {
+                "php-http/async-client-implementation": "1.0",
+                "php-http/client-implementation": "1.0",
+                "psr/http-client-implementation": "1.0"
+            },
+            "require-dev": {
+                "php-http/client-integration-tests": "^3.0",
+                "phpunit/phpunit": "^8.0|^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Http\\Adapter\\Guzzle7\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com"
+                }
+            ],
+            "description": "Guzzle 7 HTTP Adapter",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "Guzzle",
+                "http"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/guzzle7-adapter/issues",
+                "source": "https://github.com/php-http/guzzle7-adapter/tree/1.0.0"
+            },
+            "time": "2021-03-09T07:35:15+00:00"
+        },
+        {
+            "name": "php-http/httplug",
+            "version": "2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/httplug.git",
+                "reference": "625ad742c360c8ac580fcc647a1541d29e257f67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67",
+                "reference": "625ad742c360c8ac580fcc647a1541d29e257f67",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/promise": "^1.1",
+                "psr/http-client": "^1.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+                "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Eric GELOEN",
+                    "email": "geloen.eric@gmail.com"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com",
+                    "homepage": "https://sagikazarmark.hu"
+                }
+            ],
+            "description": "HTTPlug, the HTTP client abstraction for PHP",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "client",
+                "http"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/httplug/issues",
+                "source": "https://github.com/php-http/httplug/tree/2.4.0"
+            },
+            "time": "2023-04-14T15:10:03+00:00"
+        },
+        {
+            "name": "php-http/message",
+            "version": "1.16.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/message.git",
+                "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+                "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+                "shasum": ""
+            },
+            "require": {
+                "clue/stream-filter": "^1.5",
+                "php": "^7.2 || ^8.0",
+                "psr/http-message": "^1.1 || ^2.0"
+            },
+            "provide": {
+                "php-http/message-factory-implementation": "1.0"
+            },
+            "require-dev": {
+                "ergebnis/composer-normalize": "^2.6",
+                "ext-zlib": "*",
+                "guzzlehttp/psr7": "^1.0 || ^2.0",
+                "laminas/laminas-diactoros": "^2.0 || ^3.0",
+                "php-http/message-factory": "^1.0.2",
+                "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+                "slim/slim": "^3.0"
+            },
+            "suggest": {
+                "ext-zlib": "Used with compressor/decompressor streams",
+                "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+                "laminas/laminas-diactoros": "Used with Diactoros Factories",
+                "slim/slim": "Used with Slim Framework PSR-7 implementation"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/filters.php"
+                ],
+                "psr-4": {
+                    "Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "HTTP Message related tools",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "http",
+                "message",
+                "psr-7"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/message/issues",
+                "source": "https://github.com/php-http/message/tree/1.16.0"
+            },
+            "time": "2023-05-17T06:43:38+00:00"
+        },
+        {
+            "name": "php-http/message-factory",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/message-factory.git",
+                "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+                "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "Factory interfaces for PSR-7 HTTP Message",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "stream",
+                "uri"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/message-factory/issues",
+                "source": "https://github.com/php-http/message-factory/tree/1.1.0"
+            },
+            "abandoned": "psr/http-factory",
+            "time": "2023-04-14T14:16:17+00:00"
+        },
+        {
+            "name": "php-http/multipart-stream-builder",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/multipart-stream-builder.git",
+                "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a",
+                "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0",
+                "php-http/discovery": "^1.15",
+                "psr/http-factory-implementation": "^1.0"
+            },
+            "require-dev": {
+                "nyholm/psr7": "^1.0",
+                "php-http/message": "^1.5",
+                "php-http/message-factory": "^1.0.2",
+                "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Message\\MultipartStream\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tobias Nyholm",
+                    "email": "tobias.nyholm@gmail.com"
+                }
+            ],
+            "description": "A builder class that help you create a multipart stream",
+            "homepage": "http://php-http.org",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "multipart stream",
+                "stream"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/multipart-stream-builder/issues",
+                "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0"
+            },
+            "time": "2023-04-28T14:10:22+00:00"
+        },
+        {
+            "name": "php-http/promise",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-http/promise.git",
+                "reference": "44a67cb59f708f826f3bec35f22030b3edb90119"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-http/promise/zipball/44a67cb59f708f826f3bec35f22030b3edb90119",
+                "reference": "44a67cb59f708f826f3bec35f22030b3edb90119",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+                "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Http\\Promise\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Joel Wurtz",
+                    "email": "joel.wurtz@gmail.com"
+                },
+                {
+                    "name": "Márk Sági-Kazár",
+                    "email": "mark.sagikazar@gmail.com"
+                }
+            ],
+            "description": "Promise used for asynchronous HTTP requests",
+            "homepage": "http://httplug.io",
+            "keywords": [
+                "promise"
+            ],
+            "support": {
+                "issues": "https://github.com/php-http/promise/issues",
+                "source": "https://github.com/php-http/promise/tree/1.2.1"
+            },
+            "time": "2023-11-08T12:57:08+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+                "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/cache/tree/3.0.0"
+            },
+            "time": "2021-02-03T23:26:27+00:00"
+        },
+        {
+            "name": "psr/container",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/container.git",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Container\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common Container Interface (PHP FIG PSR-11)",
+            "homepage": "https://github.com/php-fig/container",
+            "keywords": [
+                "PSR-11",
+                "container",
+                "container-interface",
+                "container-interop",
+                "psr"
+            ],
+            "support": {
+                "issues": "https://github.com/php-fig/container/issues",
+                "source": "https://github.com/php-fig/container/tree/2.0.2"
+            },
+            "time": "2021-11-05T16:47:00+00:00"
+        },
+        {
+            "name": "psr/http-client",
+            "version": "1.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-client.git",
+                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+                "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0 || ^8.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Client\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP clients",
+            "homepage": "https://github.com/php-fig/http-client",
+            "keywords": [
+                "http",
+                "http-client",
+                "psr",
+                "psr-18"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-client"
+            },
+            "time": "2023-09-23T14:17:50+00:00"
+        },
+        {
+            "name": "psr/http-factory",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-factory.git",
+                "reference": "e616d01114759c4c489f93b099585439f795fe35"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+                "reference": "e616d01114759c4c489f93b099585439f795fe35",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.0.0",
+                "psr/http-message": "^1.0 || ^2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interfaces for PSR-7 HTTP message factories",
+            "keywords": [
+                "factory",
+                "http",
+                "message",
+                "psr",
+                "psr-17",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+            },
+            "time": "2023-04-10T20:10:41+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/http-message/tree/2.0"
+            },
+            "time": "2023-04-04T09:54:51+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "3.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
+                "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "https://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "support": {
+                "source": "https://github.com/php-fig/log/tree/3.0.0"
+            },
+            "time": "2021-07-14T16:46:02+00:00"
+        },
+        {
+            "name": "ralouphie/getallheaders",
+            "version": "3.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ralouphie/getallheaders.git",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+                "reference": "120b605dfeb996808c31b6477290a714d356e822",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.1",
+                "phpunit/phpunit": "^5 || ^6.5"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "src/getallheaders.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ralph Khattar",
+                    "email": "ralph.khattar@gmail.com"
+                }
+            ],
+            "description": "A polyfill for getallheaders.",
+            "support": {
+                "issues": "https://github.com/ralouphie/getallheaders/issues",
+                "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+            },
+            "time": "2019-03-08T08:55:37+00:00"
+        },
+        {
+            "name": "symfony/config",
+            "version": "v6.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/config.git",
+                "reference": "5d33e0fb707d603330e0edfd4691803a1253572e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/config/zipball/5d33e0fb707d603330e0edfd4691803a1253572e",
+                "reference": "5d33e0fb707d603330e0edfd4691803a1253572e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/filesystem": "^5.4|^6.0|^7.0",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "conflict": {
+                "symfony/finder": "<5.4",
+                "symfony/service-contracts": "<2.5"
+            },
+            "require-dev": {
+                "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+                "symfony/finder": "^5.4|^6.0|^7.0",
+                "symfony/messenger": "^5.4|^6.0|^7.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/yaml": "^5.4|^6.0|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Config\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/config/tree/v6.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-11-09T08:28:32+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v6.3.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
+                "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/polyfill-mbstring": "~1.0",
+                "symfony/service-contracts": "^2.5|^3",
+                "symfony/string": "^5.4|^6.0"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<5.4",
+                "symfony/dotenv": "<5.4",
+                "symfony/event-dispatcher": "<5.4",
+                "symfony/lock": "<5.4",
+                "symfony/process": "<5.4"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0|2.0|3.0"
+            },
+            "require-dev": {
+                "psr/log": "^1|^2|^3",
+                "symfony/config": "^5.4|^6.0",
+                "symfony/dependency-injection": "^5.4|^6.0",
+                "symfony/event-dispatcher": "^5.4|^6.0",
+                "symfony/lock": "^5.4|^6.0",
+                "symfony/process": "^5.4|^6.0",
+                "symfony/var-dumper": "^5.4|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Eases the creation of beautiful and testable command line interfaces",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "cli",
+                "command-line",
+                "console",
+                "terminal"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/console/tree/v6.3.8"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-10-31T08:09:35+00:00"
+        },
+        {
+            "name": "symfony/dependency-injection",
+            "version": "v6.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/dependency-injection.git",
+                "reference": "f88ff6428afbeb17cc648c8003bd608534750baf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f88ff6428afbeb17cc648c8003bd608534750baf",
+                "reference": "f88ff6428afbeb17cc648c8003bd608534750baf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/container": "^1.1|^2.0",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/service-contracts": "^2.5|^3.0",
+                "symfony/var-exporter": "^6.2.10|^7.0"
+            },
+            "conflict": {
+                "ext-psr": "<1.1|>=2",
+                "symfony/config": "<6.1",
+                "symfony/finder": "<5.4",
+                "symfony/proxy-manager-bridge": "<6.3",
+                "symfony/yaml": "<5.4"
+            },
+            "provide": {
+                "psr/container-implementation": "1.1|2.0",
+                "symfony/service-implementation": "1.1|2.0|3.0"
+            },
+            "require-dev": {
+                "symfony/config": "^6.1|^7.0",
+                "symfony/expression-language": "^5.4|^6.0|^7.0",
+                "symfony/yaml": "^5.4|^6.0|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\DependencyInjection\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows you to standardize and centralize the way objects are constructed in your application",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/dependency-injection/tree/v6.4.1"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-12-01T14:56:37+00:00"
+        },
+        {
+            "name": "symfony/deprecation-contracts",
+            "version": "v3.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/deprecation-contracts.git",
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
+                "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "function.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "A generic function and convention to trigger deprecation notices",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-05-23T14:45:45+00:00"
+        },
+        {
+            "name": "symfony/dotenv",
+            "version": "v6.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/dotenv.git",
+                "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/dotenv/zipball/7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e",
+                "reference": "7dfbe2976f3c1b7cfa8fac2212a050bfa9bd7d9e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "conflict": {
+                "symfony/console": "<5.4",
+                "symfony/process": "<5.4"
+            },
+            "require-dev": {
+                "symfony/console": "^5.4|^6.0",
+                "symfony/process": "^5.4|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Dotenv\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Registers environment variables from a .env file",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "dotenv",
+                "env",
+                "environment"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/dotenv/tree/v6.3.7"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-10-26T18:15:14+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v6.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/952a8cb588c3bc6ce76f6023000fb932f16a6e59",
+                "reference": "952a8cb588c3bc6ce76f6023000fb932f16a6e59",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-mbstring": "~1.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides basic utilities for the filesystem",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/filesystem/tree/v6.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-26T17:27:13+00:00"
+        },
+        {
+            "name": "symfony/intl",
+            "version": "v6.3.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/intl.git",
+                "reference": "4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/intl/zipball/4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9",
+                "reference": "4cc98c05f2c55150a6aa5b3e20667f7a6d06cca9",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1"
+            },
+            "require-dev": {
+                "symfony/filesystem": "^5.4|^6.0",
+                "symfony/finder": "^5.4|^6.0",
+                "symfony/var-exporter": "^5.4|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Intl\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                },
+                {
+                    "name": "Eriksen Costa",
+                    "email": "eriksen.costa@infranology.com.br"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides access to the localization data of the ICU library",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "i18n",
+                "icu",
+                "internationalization",
+                "intl",
+                "l10n",
+                "localization"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/intl/tree/v6.3.7"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-10-28T23:11:45+00:00"
+        },
+        {
+            "name": "symfony/options-resolver",
+            "version": "v6.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/options-resolver.git",
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd",
+                "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/deprecation-contracts": "^2.5|^3"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\OptionsResolver\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an improved replacement for the array_replace PHP function",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "config",
+                "configuration",
+                "options"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/options-resolver/tree/v6.3.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-05-12T14:21:09+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+                "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-ctype": "*"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-grapheme",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+                "reference": "875e90aeea2777b6f135677f618529449334a612"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
+                "reference": "875e90aeea2777b6f135677f618529449334a612",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's grapheme_* functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "grapheme",
+                "intl",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/polyfill-intl-normalizer",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+                "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "suggest": {
+                "ext-intl": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for intl's Normalizer class and related functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "intl",
+                "normalizer",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "42292d99c55abe617799667f454222c54c60e229"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+                "reference": "42292d99c55abe617799667f454222c54c60e229",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "provide": {
+                "ext-mbstring": "*"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-28T09:04:16+00:00"
+        },
+        {
+            "name": "symfony/polyfill-php80",
+            "version": "v1.28.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-php80.git",
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+                "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "1.28-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Polyfill\\Php80\\": ""
+                },
+                "classmap": [
+                    "Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ion Bazan",
+                    "email": "ion.bazan@gmail.com"
+                },
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-01-26T09:26:14+00:00"
+        },
+        {
+            "name": "symfony/service-contracts",
+            "version": "v3.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/service-contracts.git",
+                "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/service-contracts/zipball/b3313c2dbffaf71c8de2934e2ea56ed2291a3838",
+                "reference": "b3313c2dbffaf71c8de2934e2ea56ed2291a3838",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "psr/container": "^2.0"
+            },
+            "conflict": {
+                "ext-psr": "<1.1|>=2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-main": "3.4-dev"
+                },
+                "thanks": {
+                    "name": "symfony/contracts",
+                    "url": "https://github.com/symfony/contracts"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Contracts\\Service\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Test/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Generic abstractions related to writing services",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "abstractions",
+                "contracts",
+                "decoupling",
+                "interfaces",
+                "interoperability",
+                "standards"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/service-contracts/tree/v3.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-07-30T20:28:31+00:00"
+        },
+        {
+            "name": "symfony/string",
+            "version": "v6.3.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/string.git",
+                "reference": "13880a87790c76ef994c91e87efb96134522577a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a",
+                "reference": "13880a87790c76ef994c91e87efb96134522577a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/polyfill-ctype": "~1.8",
+                "symfony/polyfill-intl-grapheme": "~1.0",
+                "symfony/polyfill-intl-normalizer": "~1.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/translation-contracts": "<2.5"
+            },
+            "require-dev": {
+                "symfony/error-handler": "^5.4|^6.0",
+                "symfony/http-client": "^5.4|^6.0",
+                "symfony/intl": "^6.2",
+                "symfony/translation-contracts": "^2.5|^3.0",
+                "symfony/var-exporter": "^5.4|^6.0"
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "Resources/functions.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\String\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "grapheme",
+                "i18n",
+                "string",
+                "unicode",
+                "utf-8",
+                "utf8"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/string/tree/v6.3.8"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-11-09T08:28:21+00:00"
+        },
+        {
+            "name": "symfony/var-exporter",
+            "version": "v6.4.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-exporter.git",
+                "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2d08ca6b9cc704dce525615d1e6d1788734f36d9",
+                "reference": "2d08ca6b9cc704dce525615d1e6d1788734f36d9",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/deprecation-contracts": "^2.5|^3"
+            },
+            "require-dev": {
+                "symfony/var-dumper": "^5.4|^6.0|^7.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\VarExporter\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Allows exporting any serializable PHP data structure to plain PHP code",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "clone",
+                "construct",
+                "export",
+                "hydrate",
+                "instantiate",
+                "lazy-loading",
+                "proxy",
+                "serialize"
+            ],
+            "support": {
+                "source": "https://github.com/symfony/var-exporter/tree/v6.4.1"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-11-30T10:32:10+00:00"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v6.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/4f9237a1bb42455d609e6687d2613dde5b41a587",
+                "reference": "4f9237a1bb42455d609e6687d2613dde5b41a587",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.1",
+                "symfony/deprecation-contracts": "^2.5|^3",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "conflict": {
+                "symfony/console": "<5.4"
+            },
+            "require-dev": {
+                "symfony/console": "^5.4|^6.0|^7.0"
+            },
+            "bin": [
+                "Resources/bin/yaml-lint"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Loads and dumps YAML files",
+            "homepage": "https://symfony.com",
+            "support": {
+                "source": "https://github.com/symfony/yaml/tree/v6.4.0"
+            },
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-11-06T11:00:25+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "dealerdirect/phpcodesniffer-composer-installer",
+            "version": "v1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPCSStandards/composer-installer.git",
+                "reference": "4be43904336affa5c2f70744a348312336afd0da"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da",
+                "reference": "4be43904336affa5c2f70744a348312336afd0da",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.0 || ^2.0",
+                "php": ">=5.4",
+                "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
+            },
+            "require-dev": {
+                "composer/composer": "*",
+                "ext-json": "*",
+                "ext-zip": "*",
+                "php-parallel-lint/php-parallel-lint": "^1.3.1",
+                "phpcompatibility/php-compatibility": "^9.0",
+                "yoast/phpunit-polyfills": "^1.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Franck Nijhof",
+                    "email": "franck.nijhof@dealerdirect.com",
+                    "homepage": "http://www.frenck.nl",
+                    "role": "Developer / IT Manager"
+                },
+                {
+                    "name": "Contributors",
+                    "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors"
+                }
+            ],
+            "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
+            "homepage": "http://www.dealerdirect.com",
+            "keywords": [
+                "PHPCodeSniffer",
+                "PHP_CodeSniffer",
+                "code quality",
+                "codesniffer",
+                "composer",
+                "installer",
+                "phpcbf",
+                "phpcs",
+                "plugin",
+                "qa",
+                "quality",
+                "standard",
+                "standards",
+                "style guide",
+                "stylecheck",
+                "tests"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPCSStandards/composer-installer/issues",
+                "source": "https://github.com/PHPCSStandards/composer-installer"
+            },
+            "time": "2023-01-05T11:28:13+00:00"
+        },
+        {
+            "name": "phpstan/phpdoc-parser",
+            "version": "1.24.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpdoc-parser.git",
+                "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc",
+                "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "doctrine/annotations": "^2.0",
+                "nikic/php-parser": "^4.15",
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^1.5",
+                "phpstan/phpstan-phpunit": "^1.1",
+                "phpstan/phpstan-strict-rules": "^1.0",
+                "phpunit/phpunit": "^9.5",
+                "symfony/process": "^5.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\PhpDocParser\\": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPDoc parser with support for nullable, intersection and generic types",
+            "support": {
+                "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+                "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5"
+            },
+            "time": "2023-12-16T09:33:33+00:00"
+        },
+        {
+            "name": "phpstan/phpstan",
+            "version": "1.10.41",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan.git",
+                "reference": "c6174523c2a69231df55bdc65b61655e72876d76"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6174523c2a69231df55bdc65b61655e72876d76",
+                "reference": "c6174523c2a69231df55bdc65b61655e72876d76",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2|^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan-shim": "*"
+            },
+            "bin": [
+                "phpstan",
+                "phpstan.phar"
+            ],
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPStan - PHP Static Analysis Tool",
+            "keywords": [
+                "dev",
+                "static analysis"
+            ],
+            "support": {
+                "docs": "https://phpstan.org/user-guide/getting-started",
+                "forum": "https://github.com/phpstan/phpstan/discussions",
+                "issues": "https://github.com/phpstan/phpstan/issues",
+                "security": "https://github.com/phpstan/phpstan/security/policy",
+                "source": "https://github.com/phpstan/phpstan-src"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ondrejmirtes",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/phpstan",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-11-05T12:57:57+00:00"
+        },
+        {
+            "name": "phpstan/phpstan-symfony",
+            "version": "1.3.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan-symfony.git",
+                "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/27ff6339f83796a7e0dd963cf445cd3c456fc620",
+                "reference": "27ff6339f83796a7e0dd963cf445cd3c456fc620",
+                "shasum": ""
+            },
+            "require": {
+                "ext-simplexml": "*",
+                "php": "^7.2 || ^8.0",
+                "phpstan/phpstan": "^1.10.36"
+            },
+            "conflict": {
+                "symfony/framework-bundle": "<3.0"
+            },
+            "require-dev": {
+                "nikic/php-parser": "^4.13.0",
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phpstan/phpstan-phpunit": "^1.3.11",
+                "phpstan/phpstan-strict-rules": "^1.5.1",
+                "phpunit/phpunit": "^8.5.29 || ^9.5",
+                "psr/container": "1.0 || 1.1.1",
+                "symfony/config": "^5.4 || ^6.1",
+                "symfony/console": "^5.4 || ^6.1",
+                "symfony/dependency-injection": "^5.4 || ^6.1",
+                "symfony/form": "^5.4 || ^6.1",
+                "symfony/framework-bundle": "^5.4 || ^6.1",
+                "symfony/http-foundation": "^5.4 || ^6.1",
+                "symfony/messenger": "^5.4",
+                "symfony/polyfill-php80": "^1.24",
+                "symfony/serializer": "^5.4",
+                "symfony/service-contracts": "^2.2.0"
+            },
+            "type": "phpstan-extension",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "extension.neon",
+                        "rules.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Lukáš Unger",
+                    "email": "looky.msc@gmail.com",
+                    "homepage": "https://lookyman.net"
+                }
+            ],
+            "description": "Symfony Framework extensions and rules for PHPStan",
+            "support": {
+                "issues": "https://github.com/phpstan/phpstan-symfony/issues",
+                "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.5"
+            },
+            "time": "2023-10-30T14:52:15+00:00"
+        },
+        {
+            "name": "slevomat/coding-standard",
+            "version": "8.14.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/slevomat/coding-standard.git",
+                "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/fea1fd6f137cc84f9cba0ae30d549615dbc6a926",
+                "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926",
+                "shasum": ""
+            },
+            "require": {
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0",
+                "php": "^7.2 || ^8.0",
+                "phpstan/phpdoc-parser": "^1.23.1",
+                "squizlabs/php_codesniffer": "^3.7.1"
+            },
+            "require-dev": {
+                "phing/phing": "2.17.4",
+                "php-parallel-lint/php-parallel-lint": "1.3.2",
+                "phpstan/phpstan": "1.10.37",
+                "phpstan/phpstan-deprecation-rules": "1.1.4",
+                "phpstan/phpstan-phpunit": "1.3.14",
+                "phpstan/phpstan-strict-rules": "1.5.1",
+                "phpunit/phpunit": "8.5.21|9.6.8|10.3.5"
+            },
+            "type": "phpcodesniffer-standard",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "8.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "SlevomatCodingStandard\\": "SlevomatCodingStandard/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
+            "keywords": [
+                "dev",
+                "phpcs"
+            ],
+            "support": {
+                "issues": "https://github.com/slevomat/coding-standard/issues",
+                "source": "https://github.com/slevomat/coding-standard/tree/8.14.1"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/kukulich",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2023-10-08T07:28:08+00:00"
+        },
+        {
+            "name": "spryker/code-sniffer",
+            "version": "0.17.19",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/spryker/code-sniffer.git",
+                "reference": "2156a1d4d257e20dacc955872c8f6b9c7b8be3fd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/spryker/code-sniffer/zipball/2156a1d4d257e20dacc955872c8f6b9c7b8be3fd",
+                "reference": "2156a1d4d257e20dacc955872c8f6b9c7b8be3fd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=8.0",
+                "slevomat/coding-standard": "^7.2.0 || ^8.0.1",
+                "squizlabs/php_codesniffer": "^3.6.2"
+            },
+            "require-dev": {
+                "phpstan/phpstan": "^1.0.0",
+                "phpunit/phpunit": "^9.5"
+            },
+            "bin": [
+                "bin/tokenize"
+            ],
+            "type": "phpcodesniffer-standard",
+            "autoload": {
+                "psr-4": {
+                    "Spryker\\": "Spryker/",
+                    "SprykerStrict\\": "SprykerStrict/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Spryker",
+                    "homepage": "https://spryker.com"
+                }
+            ],
+            "description": "Spryker Code Sniffer Standards",
+            "homepage": "https://spryker.com",
+            "keywords": [
+                "codesniffer",
+                "framework",
+                "phpcs",
+                "standards",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/spryker/code-sniffer/issues",
+                "source": "https://github.com/spryker/code-sniffer"
+            },
+            "time": "2023-11-02T19:16:04+00:00"
+        },
+        {
+            "name": "squizlabs/php_codesniffer",
+            "version": "3.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
+                "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5805f7a4e4958dbb5e944ef1e6edae0a303765e7",
+                "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7",
+                "shasum": ""
+            },
+            "require": {
+                "ext-simplexml": "*",
+                "ext-tokenizer": "*",
+                "ext-xmlwriter": "*",
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
+            },
+            "bin": [
+                "bin/phpcs",
+                "bin/phpcbf"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Greg Sherwood",
+                    "role": "Former lead"
+                },
+                {
+                    "name": "Juliette Reinders Folmer",
+                    "role": "Current lead"
+                },
+                {
+                    "name": "Contributors",
+                    "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors"
+                }
+            ],
+            "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+            "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+            "keywords": [
+                "phpcs",
+                "standards",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues",
+                "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy",
+                "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer",
+                "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/PHPCSStandards",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/jrfnl",
+                    "type": "github"
+                },
+                {
+                    "url": "https://opencollective.com/php_codesniffer",
+                    "type": "open_collective"
+                }
+            ],
+            "time": "2023-12-08T12:32:31+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": true,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=8.1",
+        "ext-curl": "*",
+        "ext-intl": "*",
+        "ext-json": "*"
+    },
+    "platform-dev": [],
+    "platform-overrides": {
+        "php": "8.1"
+    },
+    "plugin-api-version": "2.3.0"
+}
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644
index 0000000..7e3ee85
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<ruleset name="SprykerLibrary">
+    <description>
+        Spryker Coding Standard for Project.
+
+        Extends main Spryker Coding Standard.
+        All sniffs in ./Sniffs will be auto loaded
+    </description>
+
+    <rule ref="vendor/spryker/code-sniffer/Spryker/ruleset.xml"/>
+
+    <file>src/</file>
+    <file>tests/</file>
+
+    <exclude-pattern>/tests/*</exclude-pattern>
+
+    <arg name="extensions" value="php" />
+    <arg name="colors"/>
+    <arg value="sp"/>
+
+</ruleset>
\ No newline at end of file
diff --git a/phpstan-bootstrap.php b/phpstan-bootstrap.php
new file mode 100644
index 0000000..fe66082
--- /dev/null
+++ b/phpstan-bootstrap.php
@@ -0,0 +1,3 @@
+<?php
+
+define('APPLICATION_ROOT_DIR', dirname(__DIR__, 1));
diff --git a/phpstan.neon b/phpstan.neon
new file mode 100644
index 0000000..ec189a2
--- /dev/null
+++ b/phpstan.neon
@@ -0,0 +1,16 @@
+includes:
+    - vendor/phpstan/phpstan-symfony/extension.neon
+
+parameters:
+    level: 8
+    reportUnmatchedIgnoredErrors: false
+    checkGenericClassInNonGenericObjectType: false
+    treatPhpDocTypesAsCertain: false
+    bootstrapFiles:
+        - phpstan-bootstrap.php
+    ignoreErrors:
+        - '#Call to an undefined method Codebase\\Application\\Dto\\CodebaseInterface#'
+        - '#\$nodes of method PhpParser\\NodeTraverser::traverse\(\) expects array<PhpParser\\Node>, array<PhpParser\\Node\\Stmt>\|null given.#'
+        - '#\$simpleXmlElement of method Codebase\\Infrastructure\\SourceParser\\Parser\\XmlParser::getSimpleXmlTransferElements\(\) expects SimpleXMLElement, array<SimpleXMLElement>\|SimpleXMLElement given.#'
+    symfony:
+        container_xml_path: var/cache/container.xml
diff --git a/src/Shared/Commands/ContainerDumpCommand.php b/src/Shared/Commands/ContainerDumpCommand.php
new file mode 100644
index 0000000..07b525d
--- /dev/null
+++ b/src/Shared/Commands/ContainerDumpCommand.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Shared\Commands;
+
+use SprykerCommunity\Toolkit\Shared\Container\ContainerAwareTrait;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\DependencyInjection\Dumper\XmlDumper;
+
+class ContainerDumpCommand extends Command
+{
+    use ContainerAwareTrait;
+
+    /**
+     * @return void
+     */
+    protected function configure(): void
+    {
+        $this
+            ->setName('container:dump');
+    }
+
+    /**
+     * @param \Symfony\Component\Console\Input\InputInterface $input
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     *
+     * @return int
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $dumper = new XmlDumper($this->container);
+
+        file_put_contents(__DIR__ . '/../../../var/cache/container.xml', $dumper->dump());
+
+        return static::SUCCESS;
+    }
+}
diff --git a/src/Shared/Container/ContainerAwareTrait.php b/src/Shared/Container/ContainerAwareTrait.php
new file mode 100644
index 0000000..689e80d
--- /dev/null
+++ b/src/Shared/Container/ContainerAwareTrait.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Shared\Container;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+trait ContainerAwareTrait
+{
+    protected ContainerBuilder $container;
+
+    /**
+     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+     *
+     * @return void
+     */
+    public function setContainer(ContainerBuilder $container): void
+    {
+        $this->container = $container;
+    }
+}
diff --git a/src/Shared/Output/OutputAwareTrait.php b/src/Shared/Output/OutputAwareTrait.php
new file mode 100644
index 0000000..720c93a
--- /dev/null
+++ b/src/Shared/Output/OutputAwareTrait.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Shared\Output;
+
+use Symfony\Component\Console\Output\OutputInterface;
+
+trait OutputAwareTrait
+{
+    protected OutputInterface $output;
+
+    /**
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     *
+     * @return void
+     */
+    public function setOutput(OutputInterface $output): void
+    {
+        $this->output = $output;
+    }
+}
diff --git a/src/Translator/AbstractYvesTranslator.php b/src/Translator/AbstractYvesTranslator.php
new file mode 100644
index 0000000..dbebceb
--- /dev/null
+++ b/src/Translator/AbstractYvesTranslator.php
@@ -0,0 +1,332 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+use League\Csv\Exception;
+use League\Csv\Reader;
+use League\Csv\Statement;
+use League\Csv\Writer;
+use Psr\Log\LoggerInterface;
+use SprykerCommunity\Toolkit\Shared\Output\OutputAwareTrait;
+use SprykerCommunity\Toolkit\Translator\TranslatorEngine\TranslatorEngineInterface;
+use Throwable;
+
+abstract class AbstractYvesTranslator
+{
+    use OutputAwareTrait;
+
+    /**
+     * @var \SprykerCommunity\Toolkit\Translator\TranslatorEngine\TranslatorEngineInterface
+     */
+    protected TranslatorEngineInterface $translator;
+
+    /**
+     * @var string
+     */
+    protected const SOURCE_LOCALE = 'en_US';
+
+    /**
+     * @var string
+     */
+    protected const DEFAULT_KEY = 'default';
+
+    /**
+     * @var int
+     */
+    protected const MAX_RETRIES = 360;
+
+    /**
+     * @var int
+     */
+    protected const RETRIES_WAITING_SECONDS = 30;
+
+    private LoggerInterface $logger;
+
+    /**
+     * @param \SprykerCommunity\Toolkit\Translator\TranslatorEngine\TranslatorEngineInterface $translator
+     * @param \Psr\Log\LoggerInterface $logger
+     */
+    public function __construct(TranslatorEngineInterface $translator, LoggerInterface $logger)
+    {
+        $this->translator = $translator;
+        $this->logger = $logger;
+    }
+
+    /**
+     * @param string $baseDirectory
+     * @param array<string> $locales
+     *
+     * @return void
+     */
+    public function translate(string $baseDirectory, array $locales): void
+    {
+        $this->printInfoMessage();
+
+        foreach ($locales as $targetLocale) {
+            foreach ($this->getFilePaths($baseDirectory) as $file) {
+                $this->output->writeln(sprintf(
+                    'Checking if there are %s translations to be generated to the %s locale:',
+                    $this->getType(),
+                    $targetLocale,
+                ));
+                $records = $this->getYvesRecordsForTranslation($file, $targetLocale);
+
+                if (!$records) {
+                    $this->output->writeln('No items found that require translations for the locale ' . $targetLocale);
+
+                    continue;
+                }
+
+                $this->output->writeln(sprintf(
+                    'Generating %s translations to the %s locale...',
+                    $this->getType(),
+                    $targetLocale,
+                ));
+                $this->translateRecords($records, $targetLocale, $baseDirectory);
+                foreach ($records as $key => $value) {
+                    $this->output->writeln((string)$key);
+                }
+            }
+        }
+    }
+
+    /**
+     * @param string $filePath
+     * @param string $locale
+     *
+     * @throws \League\Csv\Exception
+     *
+     * @return array<string|int, \SprykerCommunity\Toolkit\Translator\TranslationRequest>
+     */
+    public function getYvesRecordsForTranslation(string $filePath, string $locale): array
+    {
+        $recordsToBeTranslated = [];
+
+        // to optimize same text could be translated more than once in case it is repeated
+        try {
+            $csv = Reader::createFromPath($filePath, 'r');
+            // validate if it has en_US columns
+            $csv->setHeaderOffset(0); // Set the CSV header offset
+            $matches = preg_grep('/.*\.' . static::SOURCE_LOCALE . '/', $csv->getHeader());
+
+            if (!$matches) {
+                return $recordsToBeTranslated;
+            }
+
+            $stmt = Statement::create();
+            foreach ($stmt->process($csv) as $rowOffset => $row) {
+                foreach ($row as $key => $value) {
+                    // skip columns without header
+                    if (!$key) {
+                        continue;
+                    }
+                    if (!preg_match('/.*\.(' . static::SOURCE_LOCALE . ')|(' . static::DEFAULT_KEY . ')$/', $key) || !$value) {
+                        continue;
+                    }
+
+                    // if column name includes key within the name skip as keys can not be translated
+                    if ($this->getKeyBlacklistPattern() && preg_match('/' . $this->getKeyBlacklistPattern() . '/i', $key)) {
+                        continue;
+                    }
+
+                    if (preg_match('/.*\.' . static::DEFAULT_KEY . '$/', $key)) {
+                        $targetKey = str_replace(static::DEFAULT_KEY, $locale, $key);
+                    } else {
+                        $targetKey = str_replace(static::SOURCE_LOCALE, $locale, $key);
+                    }
+
+                    // skip if target field already has a value == not override
+                    if (!empty($row[$targetKey])) {
+                        continue;
+                    }
+
+                    $recordsToBeTranslated[] = new TranslationRequest(
+                        $this->getType(),
+                        $filePath,
+                        $rowOffset,
+                        $key,
+                        $value,
+                    );
+                }
+            }
+        } catch (Exception $exception) {
+            $this->logger->error($exception->getMessage());
+
+            throw new Exception($exception->getMessage());
+        }
+
+        return $recordsToBeTranslated;
+    }
+
+    /**
+     * @param \SprykerCommunity\Toolkit\Translator\TranslationRequest $value
+     * @param string $translation
+     * @param string $targetLocale
+     *
+     * @return \SprykerCommunity\Toolkit\Translator\TranslationResponse
+     */
+    protected function prepareTranslatedRecords(TranslationRequest $value, string $translation, string $targetLocale): TranslationResponse
+    {
+        return new TranslationResponse(
+            $value->getImportType(),
+            $value->getFilePath(),
+            $value->getLine(),
+            $value->getKey(),
+            $translation,
+            $targetLocale,
+        );
+    }
+
+    /**
+     * @return string
+     */
+    abstract protected function getType(): string;
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+
+    /**
+     * @param string $projectDirectory
+     *
+     * @return array<string>
+     */
+    protected function getFilePaths(string $projectDirectory): array
+    {
+        return array_merge(
+            glob($projectDirectory . '/data/import/common/*/' . $this->getType() . '.csv') ?: [],
+            glob($projectDirectory . '/data/import/common/*/*/' . $this->getType() . '.csv') ?: [],
+        );
+    }
+
+    /**
+     * @param string $directory
+     * @param iterable<\SprykerCommunity\Toolkit\Translator\TranslationResponse> $records
+     *
+     * @return void
+     */
+    public function addTranslatedRecords(string $directory, iterable $records): void
+    {
+        $newFileRecords = [];
+        $translationsByFileAndLine = [];
+        foreach ($records as $record) {
+            $translationsByFileAndLine[$record->getFilePath()][$record->getLine()][] = $record;
+            $translationsByFile[$record->getFilePath()][] = $record;
+        }
+        foreach ($translationsByFileAndLine as $filePath => $translation) {
+            $originalCsvReader = Reader::createFromPath($filePath, 'r');
+            $originalCsvReader->setHeaderOffset(0);
+            $csvHeader = $originalCsvReader->getHeader();
+            foreach ($translationsByFile[$filePath] as $modifiedValue) {
+                if (preg_match('/.*\.' . static::DEFAULT_KEY . '$/', $modifiedValue->getKey())) {
+                    $header = str_replace(static::DEFAULT_KEY, $modifiedValue->getLocale(), $modifiedValue->getKey());
+                } else {
+                    $header = str_replace(static::SOURCE_LOCALE, $modifiedValue->getLocale(), $modifiedValue->getKey());
+                }
+                if (in_array($header, $csvHeader)) {
+                    continue;
+                }
+
+                $csvHeader[] = $header;
+            }
+            $newFileRecords[] = $csvHeader;
+
+            foreach ($originalCsvReader->getRecords() as $line => $originalRecord) {
+                if (!isset($translationsByFileAndLine[$filePath][$line])) {
+                    $newFileRecords[] = $originalRecord;
+
+                    continue;
+                }
+
+                foreach ($translationsByFileAndLine[$filePath][$line] as $modifiedValue) {
+                    // no override if value is already existing
+                    if (preg_match('/.*\.' . static::DEFAULT_KEY . '$/', $modifiedValue->getKey())) {
+                        $originalRecord[str_replace(static::DEFAULT_KEY, $modifiedValue->getLocale(), $modifiedValue->getKey())] = $modifiedValue->getText();
+                    } else {
+                        $originalRecord[str_replace(static::SOURCE_LOCALE, $modifiedValue->getLocale(), $modifiedValue->getKey())] = $modifiedValue->getText();
+                    }
+                }
+                $newFileRecords[] = $originalRecord;
+            }
+
+            $newCsvWriter = Writer::createFromPath($filePath . '.tmp', 'w');
+            $newCsvWriter->insertAll($newFileRecords);
+            unlink($filePath);
+            rename($filePath . '.tmp', $filePath);
+        }
+    }
+
+    /**
+     * @param array<string|int, \SprykerCommunity\Toolkit\Translator\TranslationRequest> $records
+     * @param string $targetLocale
+     * @param string $directory
+     *
+     * @throws \Throwable
+     *
+     * @return void
+     */
+    protected function translateRecords(array $records, string $targetLocale, string $directory): void
+    {
+        foreach ($records as $record) {
+            $retry = 0;
+            do {
+                try {
+                    $translation = $this->translator->translate(
+                        $record->getText(),
+                        $targetLocale,
+                        static::SOURCE_LOCALE,
+                    );
+
+                    $translatedRecord = $this->prepareTranslatedRecords($record, $translation, $targetLocale);
+                    if (method_exists($this, 'createDirectoryIfNotExists')) {
+                        $this->createDirectoryIfNotExists($directory);
+                    }
+
+                    break;
+                } catch (Throwable $e) {
+                    $retry++;
+                    sleep(static::RETRIES_WAITING_SECONDS);
+
+                    if ($retry < static::MAX_RETRIES) {
+                        $this->logger->error($e->getMessage(), [$translation ?? '']);
+                        $this->output->writeln(sprintf(
+                            '<error>Translation unsuccessful. Retrying in %s seconds.</error>',
+                            static::RETRIES_WAITING_SECONDS,
+                        ));
+
+                        continue;
+                    }
+
+                    throw $e;
+                }
+            } while ($retry < static::MAX_RETRIES);
+            $this->addTranslatedRecords($directory, [$translatedRecord]);
+        }
+    }
+
+    /**
+     * @return void
+     */
+    protected function printInfoMessage(): void
+    {
+        $message = 'Generating translations using ' . $this->translator->getDescription();
+        $messageLength = strlen($message);
+
+        $this->output->writeln([
+            '<info>' . $message . '</>',
+            '<info>' . str_repeat('=', $messageLength) . '</>',
+            '',
+        ]);
+    }
+}
diff --git a/src/Translator/CategoryTranslator.php b/src/Translator/CategoryTranslator.php
new file mode 100644
index 0000000..71a2eac
--- /dev/null
+++ b/src/Translator/CategoryTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class CategoryTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'category';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+}
diff --git a/src/Translator/CmsBlockTranslator.php b/src/Translator/CmsBlockTranslator.php
new file mode 100644
index 0000000..9d63651
--- /dev/null
+++ b/src/Translator/CmsBlockTranslator.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class CmsBlockTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'cms_block';
+    }
+}
diff --git a/src/Translator/CmsPageTranslator.php b/src/Translator/CmsPageTranslator.php
new file mode 100644
index 0000000..3cb5356
--- /dev/null
+++ b/src/Translator/CmsPageTranslator.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class CmsPageTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'cms_page';
+    }
+}
diff --git a/src/Translator/Commands/AbstractTranslationCommand.php b/src/Translator/Commands/AbstractTranslationCommand.php
new file mode 100644
index 0000000..99c6f8f
--- /dev/null
+++ b/src/Translator/Commands/AbstractTranslationCommand.php
@@ -0,0 +1,163 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Commands;
+
+use SprykerCommunity\Toolkit\Shared\Container\ContainerAwareTrait;
+use SprykerCommunity\Toolkit\Translator\TranslatorEngine\ChatGptTranslatorEngine;
+use SprykerCommunity\Toolkit\Translator\TranslatorEngine\DeepLTranslatorEngine;
+use SprykerCommunity\Toolkit\Translator\TranslatorEngine\TranslatorEngineInterface;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Intl\Locales;
+
+abstract class AbstractTranslationCommand extends Command
+{
+    use ContainerAwareTrait;
+
+    /**
+     * @var string
+     */
+    protected const ARGUMENT_LOCALES = 'locales';
+
+    /**
+     * @var string
+     */
+    protected const WORKING_DIR = 'working-dir';
+
+    /**
+     * @var string
+     */
+    protected const TRANSLATION_ENGINE = 'translation-engine';
+
+    /**
+     * @var string
+     */
+    protected const CHATGPT_TRANSLATION_ENGINE = 'chatgpt';
+
+    /**
+     * @var string
+     */
+    protected const DEEPL_TRANSLATION_ENGINE = 'deepl';
+
+    /**
+     * @var string
+     */
+    protected string $directory;
+
+    /**
+     * @var array<string>
+     */
+    protected array $locales;
+
+    /**
+     * @var \SprykerCommunity\Toolkit\Translator\TranslatorEngine\TranslatorEngineInterface
+     */
+    protected TranslatorEngineInterface $translationEngine;
+
+    /**
+     * @return void
+     */
+    protected function configure(): void
+    {
+        $this
+            ->addArgument(static::ARGUMENT_LOCALES, InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'The locales to which we want the Spryker glossary translated.')
+            ->addOption(static::WORKING_DIR, 'd', InputOption::VALUE_OPTIONAL, 'If specified, use the given directory as Spryker project working directory.')
+            ->addOption(
+                static::TRANSLATION_ENGINE,
+                'e',
+                InputOption::VALUE_OPTIONAL,
+                sprintf(
+                    'The translation engine to be used for translation generation. Allowed values are %s or %s',
+                    static::DEEPL_TRANSLATION_ENGINE,
+                    static::CHATGPT_TRANSLATION_ENGINE,
+                ),
+                static::CHATGPT_TRANSLATION_ENGINE,
+            );
+    }
+
+    /**
+     * @param \Symfony\Component\Console\Input\InputInterface $input
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     *
+     * @return int
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        $this->directory = $this->getDirectory($input->getOption(static::WORKING_DIR));
+        $this->locales = $input->getArgument(static::ARGUMENT_LOCALES);
+        $this->validateLocale($output);
+
+        $translationEngine = $input->getOption(static::TRANSLATION_ENGINE);
+        $this->getTranslationEngine($translationEngine, $output);
+
+        return Command::SUCCESS;
+    }
+
+    /**
+     * @param string|null $directory
+     *
+     * @return string
+     */
+    abstract protected function getDirectory(?string $directory): string;
+
+    /**
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     *
+     * @return int|void
+     */
+    protected function validateLocale(OutputInterface $output)
+    {
+        foreach ($this->locales as $locale) {
+            if (!Locales::exists($locale)) {
+                $output->writeln('<error>Invalid locale. For example es_ES, fr_FR, en_GB.</error>');
+
+                return Command::FAILURE;
+            }
+        }
+
+        if (!file_exists($this->directory)) {
+            $output->writeln('<error>Directory not found!</error>');
+
+            return Command::FAILURE;
+        }
+    }
+
+    /**
+     * @param string $translationEngine
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     *
+     * @return int|void
+     */
+    protected function getTranslationEngine(string $translationEngine, OutputInterface $output)
+    {
+        switch ($translationEngine) {
+            case static::CHATGPT_TRANSLATION_ENGINE:
+                $this->translationEngine = $this->container->get(ChatGptTranslatorEngine::class);
+
+                break;
+            case static::DEEPL_TRANSLATION_ENGINE:
+                $this->translationEngine = $this->container->get(DeepLTranslatorEngine::class);
+
+                break;
+            default:
+                $output->writeln(sprintf(
+                    '%s is not a valid translation engine. Available engines are: %s and %s',
+                    $translationEngine,
+                    static::CHATGPT_TRANSLATION_ENGINE,
+                    static::DEEPL_TRANSLATION_ENGINE,
+                ));
+
+                return Command::FAILURE;
+        }
+    }
+}
diff --git a/src/Translator/Commands/YvesTranslationCommand.php b/src/Translator/Commands/YvesTranslationCommand.php
new file mode 100644
index 0000000..aa91fac
--- /dev/null
+++ b/src/Translator/Commands/YvesTranslationCommand.php
@@ -0,0 +1,110 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Commands;
+
+use Monolog\Logger;
+use SprykerCommunity\Toolkit\Translator\CategoryTranslator;
+use SprykerCommunity\Toolkit\Translator\CmsBlockTranslator;
+use SprykerCommunity\Toolkit\Translator\CmsPageTranslator;
+use SprykerCommunity\Toolkit\Translator\ContentBannerTranslator;
+use SprykerCommunity\Toolkit\Translator\Exception\TranslatorException;
+use SprykerCommunity\Toolkit\Translator\GlossaryTranslator;
+use SprykerCommunity\Toolkit\Translator\MerchantProfileTranslator;
+use SprykerCommunity\Toolkit\Translator\NavigationNodeCategoryTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductAbstractTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductConcreteTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductDiscontinuedTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductLabelTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductManagementAttributeTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductOptionTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductSearchAttributeTranslator;
+use SprykerCommunity\Toolkit\Translator\ProductSetTranslator;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class YvesTranslationCommand extends AbstractTranslationCommand
+{
+    /**
+     * @return void
+     */
+    protected function configure(): void
+    {
+        parent::configure();
+
+        $this
+            ->setName('translation:yves:generate')
+            ->setDescription('Generate Yves translations to the specified target locale');
+    }
+
+    /**
+     * @param \Symfony\Component\Console\Input\InputInterface $input
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     *
+     * @return int
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        parent::execute($input, $output);
+
+        try {
+            foreach ($this->getTranslators() as $translator) {
+                $translator->setOutput($output);
+                $translator->translate($this->directory, $this->locales);
+            }
+        } catch (TranslatorException $e) {
+            $output->writeln('<error>' . $e->getMessage() . '</error>');
+
+            return Command::FAILURE;
+        }
+
+        return Command::SUCCESS;
+    }
+
+    /**
+     * @return array<\SprykerCommunity\Toolkit\Translator\AbstractYvesTranslator>
+     */
+    protected function getTranslators(): array
+    {
+        $logger = $this->container->get(Logger::class);
+
+        return [
+            new CategoryTranslator($this->translationEngine, $logger),
+            new CmsBlockTranslator($this->translationEngine, $logger),
+            new CmsPageTranslator($this->translationEngine, $logger),
+            new ContentBannerTranslator($this->translationEngine, $logger),
+            new GlossaryTranslator($this->translationEngine, $logger),
+            new MerchantProfileTranslator($this->translationEngine, $logger),
+            new NavigationNodeCategoryTranslator($this->translationEngine, $logger),
+            new ProductAbstractTranslator($this->translationEngine, $logger),
+            new ProductConcreteTranslator($this->translationEngine, $logger),
+            new ProductDiscontinuedTranslator($this->translationEngine, $logger),
+            new ProductLabelTranslator($this->translationEngine, $logger),
+            new ProductManagementAttributeTranslator($this->translationEngine, $logger),
+            new ProductOptionTranslator($this->translationEngine, $logger),
+            new ProductSearchAttributeTranslator($this->translationEngine, $logger),
+            new ProductSetTranslator($this->translationEngine, $logger),
+        ];
+    }
+
+    /**
+     * @param string|null $directory
+     *
+     * @return string
+     */
+    protected function getDirectory(?string $directory): string
+    {
+        if (!$directory) {
+            $directory = dirname(__DIR__, 3);
+        }
+
+        return $directory;
+    }
+}
diff --git a/src/Translator/Commands/ZedTranslationCommand.php b/src/Translator/Commands/ZedTranslationCommand.php
new file mode 100644
index 0000000..3d40154
--- /dev/null
+++ b/src/Translator/Commands/ZedTranslationCommand.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Commands;
+
+use Monolog\Logger;
+use SprykerCommunity\Toolkit\Translator\Exception\TranslatorException;
+use SprykerCommunity\Toolkit\Translator\ZedTranslator;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class ZedTranslationCommand extends AbstractTranslationCommand
+{
+    /**
+     * @return void
+     */
+    protected function configure(): void
+    {
+        parent::configure();
+
+        $this
+            ->setName('translation:zed:generate')
+            ->setDescription('Generates Zed translations to the specified target locale');
+    }
+
+    /**
+     * @param \Symfony\Component\Console\Input\InputInterface $input
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     *
+     * @return int
+     */
+    protected function execute(InputInterface $input, OutputInterface $output): int
+    {
+        parent::execute($input, $output);
+
+        try {
+            $translatorService = new ZedTranslator($this->translationEngine, $this->container->get(Logger::class));
+            $translatorService->setOutput($output);
+            $translatorService->translate($this->directory, $this->locales);
+        } catch (TranslatorException $e) {
+            $output->writeln('<error>' . $e->getMessage() . '</error>');
+
+            return Command::FAILURE;
+        }
+
+        return Command::SUCCESS;
+    }
+
+    /**
+     * @param string|null $directory
+     *
+     * @return string
+     */
+    protected function getDirectory(?string $directory): string
+    {
+        if (!$directory) {
+            $directory = dirname(__DIR__, 3);
+        }
+
+        return $directory;
+    }
+}
diff --git a/src/Translator/Config/YvesTranslationConfig.php b/src/Translator/Config/YvesTranslationConfig.php
new file mode 100644
index 0000000..6f4999a
--- /dev/null
+++ b/src/Translator/Config/YvesTranslationConfig.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Config;
+
+class YvesTranslationConfig
+{
+    /**
+     * @var string
+     */
+    public const PATH_GLOSSARY = '/data/import/common/common/glossary.csv';
+}
diff --git a/src/Translator/Config/ZedTranslatorConfig.php b/src/Translator/Config/ZedTranslatorConfig.php
new file mode 100644
index 0000000..0235a75
--- /dev/null
+++ b/src/Translator/Config/ZedTranslatorConfig.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Config;
+
+class ZedTranslatorConfig
+{
+    /**
+     * @api
+     *
+     * @return array<string>
+     */
+    public function getTranslationFilePathPatterns(): array
+    {
+        return [
+            '/src/Pyz/Zed/Translator/data/*/',
+            '/vendor/spryker/*/data/translation/Zed/',
+            '/vendor/spryker/spryker-demo/Bundles/*/data/translation/Zed/',
+            '/vendor/spryker/spryker/Bundles/*/data/translation/Zed/',
+        ];
+    }
+
+    /**
+     * @api
+     *
+     * @return string
+     */
+    public function getProjectLevelPath(): string
+    {
+        return 'src/Pyz/Zed/Translator/data/';
+    }
+}
diff --git a/src/Translator/ContentBannerTranslator.php b/src/Translator/ContentBannerTranslator.php
new file mode 100644
index 0000000..878c8cb
--- /dev/null
+++ b/src/Translator/ContentBannerTranslator.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ContentBannerTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'content_banner';
+    }
+}
diff --git a/src/Translator/Exception/TranslatorException.php b/src/Translator/Exception/TranslatorException.php
new file mode 100644
index 0000000..b14feae
--- /dev/null
+++ b/src/Translator/Exception/TranslatorException.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Exception;
+
+use RuntimeException;
+
+class TranslatorException extends RuntimeException
+{
+}
diff --git a/src/Translator/Finder/TranslationFinderInterface.php b/src/Translator/Finder/TranslationFinderInterface.php
new file mode 100644
index 0000000..7cf0b24
--- /dev/null
+++ b/src/Translator/Finder/TranslationFinderInterface.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Finder;
+
+interface TranslationFinderInterface
+{
+    /**
+     * c
+     *
+     * @param array<string> $translationFilePathPatterns
+     *
+     * @return array<string>
+     */
+    public function findFilesByGlobPatterns(array $translationFilePathPatterns): array;
+}
diff --git a/src/Translator/Finder/ZedTranslationFinder.php b/src/Translator/Finder/ZedTranslationFinder.php
new file mode 100644
index 0000000..a3db5ab
--- /dev/null
+++ b/src/Translator/Finder/ZedTranslationFinder.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\Finder;
+
+class ZedTranslationFinder implements TranslationFinderInterface
+{
+    /**
+     * @param array<string> $translationFilePathPatterns
+     *
+     * @return array<string>
+     */
+    public function findFilesByGlobPatterns(array $translationFilePathPatterns): array
+    {
+        $translationFilePaths = [];
+        foreach ($translationFilePathPatterns as $translationFilePathPattern) {
+            $translationFilePaths[] = glob($translationFilePathPattern, GLOB_NOSORT) ?: [];
+        }
+
+        return array_filter(array_merge(...$translationFilePaths));
+    }
+}
diff --git a/src/Translator/GlossaryTranslator.php b/src/Translator/GlossaryTranslator.php
new file mode 100644
index 0000000..51f0c40
--- /dev/null
+++ b/src/Translator/GlossaryTranslator.php
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+use League\Csv\Exception;
+use League\Csv\Reader;
+use League\Csv\Statement;
+use League\Csv\Writer;
+
+class GlossaryTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @param string $directory
+     * @param iterable<\SprykerCommunity\Toolkit\Translator\TranslationResponse> $records
+     *
+     * @return void
+     */
+    public function addTranslatedRecords(string $directory, iterable $records): void
+    {
+        $recordsByFile = [];
+        foreach ($records as $record) {
+            $recordsByFile[$record->getFilePath()][] = $record;
+        }
+
+        foreach ($recordsByFile as $filePath => $translations) {
+            $writer = Writer::createFromPath($filePath, 'a');
+            foreach ($translations as $translation) {
+                $writer->insertOne([
+                    'key' => $translation->getKey(),
+                    'translation' => $translation->getText(),
+                    'locale' => $translation->getLocale(),
+                ]);
+            }
+        }
+    }
+
+    /**
+     * @param string $filePath
+     * @param string $locale
+     *
+     * @throws \League\Csv\Exception
+     *
+     * @return array<string|int, \SprykerCommunity\Toolkit\Translator\TranslationRequest>
+     */
+    public function getYvesRecordsForTranslation(string $filePath, string $locale): array
+    {
+        try {
+            $csv = Reader::createFromPath($filePath, 'r');
+            $recordsToBeTranslated = [];
+
+            if ($csv->count()) {
+                $csv->setHeaderOffset(0); // Set the CSV header offset
+                $stmt = Statement::create();
+
+                foreach ($stmt->process($csv) as $rowOffset => $record) {
+                    if (!isset($record['key']) || !isset($record['locale']) || !isset($record['translation'])) {
+                        continue;
+                    }
+
+                    $key = $record['key'];
+                    $recordLocale = $record['locale'];
+                    $translation = $record['translation'];
+
+                    if ($recordLocale === static::SOURCE_LOCALE && !isset($recordsToBeTranslated[$key])) {
+                        $recordsToBeTranslated[$key] = new TranslationRequest(
+                            $this->getType(),
+                            $filePath,
+                            $rowOffset,
+                            $key,
+                            $translation,
+                        );
+                    } elseif ($recordLocale === $locale && isset($recordsToBeTranslated[$key])) {
+                        unset($recordsToBeTranslated[$key]);
+                    }
+                }
+            }
+        } catch (Exception $exception) {
+            throw new Exception($exception->getMessage());
+        }
+
+        return $recordsToBeTranslated;
+    }
+
+    /**
+     * @param \SprykerCommunity\Toolkit\Translator\TranslationRequest $value
+     * @param string $translation
+     * @param string $targetLocale
+     *
+     * @return \SprykerCommunity\Toolkit\Translator\TranslationResponse
+     */
+    protected function prepareTranslatedRecords(TranslationRequest $value, string $translation, string $targetLocale): TranslationResponse
+    {
+        return new TranslationResponse(
+            $value->getImportType(),
+            $value->getFilePath(),
+            $value->getLine(),
+            $value->getKey(),
+            $translation,
+            $targetLocale,
+        );
+    }
+
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'glossary';
+    }
+}
diff --git a/src/Translator/MerchantProfileTranslator.php b/src/Translator/MerchantProfileTranslator.php
new file mode 100644
index 0000000..40be3fe
--- /dev/null
+++ b/src/Translator/MerchantProfileTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class MerchantProfileTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'merchant_profile';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+}
diff --git a/src/Translator/NavigationNodeCategoryTranslator.php b/src/Translator/NavigationNodeCategoryTranslator.php
new file mode 100644
index 0000000..1c2c16e
--- /dev/null
+++ b/src/Translator/NavigationNodeCategoryTranslator.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class NavigationNodeCategoryTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'navigation_node';
+    }
+}
diff --git a/src/Translator/ProductAbstractTranslator.php b/src/Translator/ProductAbstractTranslator.php
new file mode 100644
index 0000000..c341af0
--- /dev/null
+++ b/src/Translator/ProductAbstractTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductAbstractTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_abstract';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return 'attribute_key.*';
+    }
+}
diff --git a/src/Translator/ProductConcreteTranslator.php b/src/Translator/ProductConcreteTranslator.php
new file mode 100644
index 0000000..5dfae16
--- /dev/null
+++ b/src/Translator/ProductConcreteTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductConcreteTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_concrete';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '.*_key_.*';
+    }
+}
diff --git a/src/Translator/ProductDiscontinuedTranslator.php b/src/Translator/ProductDiscontinuedTranslator.php
new file mode 100644
index 0000000..fdac3bc
--- /dev/null
+++ b/src/Translator/ProductDiscontinuedTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductDiscontinuedTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_discontinued';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+}
diff --git a/src/Translator/ProductLabelTranslator.php b/src/Translator/ProductLabelTranslator.php
new file mode 100644
index 0000000..06d6bc7
--- /dev/null
+++ b/src/Translator/ProductLabelTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductLabelTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_label';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+}
diff --git a/src/Translator/ProductManagementAttributeTranslator.php b/src/Translator/ProductManagementAttributeTranslator.php
new file mode 100644
index 0000000..47df789
--- /dev/null
+++ b/src/Translator/ProductManagementAttributeTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductManagementAttributeTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_management_attribute';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+}
diff --git a/src/Translator/ProductOptionTranslator.php b/src/Translator/ProductOptionTranslator.php
new file mode 100644
index 0000000..8aedb31
--- /dev/null
+++ b/src/Translator/ProductOptionTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductOptionTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_option';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '.*_key.*';
+    }
+}
diff --git a/src/Translator/ProductSearchAttributeTranslator.php b/src/Translator/ProductSearchAttributeTranslator.php
new file mode 100644
index 0000000..06ec9fa
--- /dev/null
+++ b/src/Translator/ProductSearchAttributeTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductSearchAttributeTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_search_attribute';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+}
diff --git a/src/Translator/ProductSetTranslator.php b/src/Translator/ProductSetTranslator.php
new file mode 100644
index 0000000..5c182a8
--- /dev/null
+++ b/src/Translator/ProductSetTranslator.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class ProductSetTranslator extends AbstractYvesTranslator
+{
+    /**
+     * @return string
+     */
+    protected function getType(): string
+    {
+        return 'product_set';
+    }
+
+    /**
+     * @return string
+     */
+    protected function getKeyBlacklistPattern(): string
+    {
+        return '';
+    }
+}
diff --git a/src/Translator/TranslationRequest.php b/src/Translator/TranslationRequest.php
new file mode 100644
index 0000000..346f1bb
--- /dev/null
+++ b/src/Translator/TranslationRequest.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class TranslationRequest
+{
+    protected string $importType;
+
+    protected string $filePath;
+
+    protected int $line;
+
+    protected string $key;
+
+    protected string $text;
+
+    /**
+     * @param string $importType
+     * @param string $filePath
+     * @param int $line
+     * @param string $key
+     * @param string $text
+     */
+    public function __construct(string $importType, string $filePath, int $line, string $key, string $text)
+    {
+        $this->importType = $importType;
+        $this->filePath = $filePath;
+        $this->line = $line;
+        $this->key = $key;
+        $this->text = $text;
+    }
+
+    /**
+     * @return string
+     */
+    public function getFilePath(): string
+    {
+        return $this->filePath;
+    }
+
+    /**
+     * @return string
+     */
+    public function getImportType(): string
+    {
+        return $this->importType;
+    }
+
+    /**
+     * @return string
+     */
+    public function getKey(): string
+    {
+        return $this->key;
+    }
+
+    /**
+     * @return string
+     */
+    public function getText(): string
+    {
+        return $this->text;
+    }
+
+    /**
+     * @return int
+     */
+    public function getLine(): int
+    {
+        return $this->line;
+    }
+}
diff --git a/src/Translator/TranslationResponse.php b/src/Translator/TranslationResponse.php
new file mode 100644
index 0000000..761925b
--- /dev/null
+++ b/src/Translator/TranslationResponse.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+class TranslationResponse
+{
+    protected string $importType;
+
+    protected string $filePath;
+
+    protected int $line;
+
+    protected string $key;
+
+    protected string $text;
+
+    protected string $locale;
+
+    /**
+     * @param string $importType
+     * @param string $filePath
+     * @param int $line
+     * @param string $key
+     * @param string $text
+     * @param string $locale
+     */
+    public function __construct(string $importType, string $filePath, int $line, string $key, string $text, string $locale)
+    {
+        $this->filePath = $filePath;
+        $this->importType = $importType;
+        $this->line = $line;
+        $this->key = $key;
+        $this->text = $text;
+        $this->locale = $locale;
+    }
+
+    /**
+     * @return string
+     */
+    public function getFilePath(): string
+    {
+        return $this->filePath;
+    }
+
+    /**
+     * @return string
+     */
+    public function getImportType(): string
+    {
+        return $this->importType;
+    }
+
+    /**
+     * @return string
+     */
+    public function getKey(): string
+    {
+        return $this->key;
+    }
+
+    /**
+     * @return string
+     */
+    public function getText(): string
+    {
+        return $this->text;
+    }
+
+    /**
+     * @return string
+     */
+    public function getLocale(): string
+    {
+        return $this->locale;
+    }
+
+    /**
+     * @return int
+     */
+    public function getLine(): int
+    {
+        return $this->line;
+    }
+}
diff --git a/src/Translator/TranslatorEngine/ChatGptTranslatorEngine.php b/src/Translator/TranslatorEngine/ChatGptTranslatorEngine.php
new file mode 100644
index 0000000..3f4b67f
--- /dev/null
+++ b/src/Translator/TranslatorEngine/ChatGptTranslatorEngine.php
@@ -0,0 +1,122 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\TranslatorEngine;
+
+use Locale;
+use OpenAI;
+use OpenAI\Client;
+use Psr\Log\LoggerInterface;
+
+class ChatGptTranslatorEngine implements TranslatorEngineInterface
+{
+    /**
+     * @var string
+     */
+    public const SPRYKER_TOOLKIT_CHATGPT_API_AUTH_KEY = 'SPRYKER_TOOLKIT_CHATGPT_API_AUTH_KEY';
+
+    /**
+     * @var string
+     */
+    protected const PROMPT_LOCALE = 'en';
+
+    /**
+     * @var string
+     */
+    protected const CHATGPT_PROMPT = 'Support me in translating %s texts to %s within the context of an online shop as a native speaker. Provide accurate and contextually appropriate translations for an optimal user experience. The texts to be translated may contain URLs, URL paths, HTML, unicode characters or some word enclosed by the character "%%", please don\'t translate them. If the text only contains a relative URL starting by /%s/ please replace it by /%s/. A HTML <p> element does not mean you need to split the translation. If you are no able to succeed translating the text provide it as originally given between ### and ###. IMPORTANT: ONLY RETURN THE TRANSLATED TEXT AND NOTHING ELSE.';
+
+    /**
+     * @var string
+     */
+    protected const CHATGPT_MESSAGE_ROLE_KEY = 'role';
+
+    /**
+     * @var string
+     */
+    protected const CHATGPT_MESSAGE_CONTENT_KEY = 'content';
+
+    /**
+     * @var string
+     */
+    protected const CHATGPT_MESSAGE_ROLE_SYSTEM_VALUE = 'system';
+
+    /**
+     * @var string
+     */
+    protected const CHATGPT_ENGINE = 'gpt-3.5-turbo';
+
+    protected Client $client;
+
+    private LoggerInterface $logger;
+
+    /**
+     * @var array<string, array<string, string>>
+     */
+    private array $cache;
+
+    /**
+     * @param \Psr\Log\LoggerInterface $logger
+     * @param string $apiKey
+     */
+    public function __construct(LoggerInterface $logger, string $apiKey)
+    {
+        $this->logger = $logger;
+        $this->client = OpenAI::client($apiKey);
+    }
+
+    /**
+     * @param string $text
+     * @param string $targetLang
+     * @param string $sourceLang
+     *
+     * @return string
+     */
+    public function translate(string $text, string $targetLang, string $sourceLang): string
+    {
+        if (isset($this->cache[$targetLang][$text])) {
+            return $this->cache[$targetLang][$text];
+        }
+
+        $prompt = sprintf(
+            static::CHATGPT_PROMPT,
+            Locale::getDisplayName($sourceLang, static::PROMPT_LOCALE),
+            Locale::getDisplayName($targetLang, static::PROMPT_LOCALE),
+            substr($sourceLang, 0, 2),
+            substr($targetLang, 0, 2),
+        );
+        $cleanText = preg_replace('/\s+/m', ' ', $text) ?? '';
+        $message = $prompt . '\n###Text:\n ' . $cleanText . '\n###';
+
+        $this->logger->debug('New translation request', [
+            'message' => $message,
+        ]);
+        $result = $this->client->chat()->create([
+            'model' => static::CHATGPT_ENGINE,
+            'temperature' => 0,
+            'messages' => [
+                [
+                    static::CHATGPT_MESSAGE_ROLE_KEY => static::CHATGPT_MESSAGE_ROLE_SYSTEM_VALUE,
+                    static::CHATGPT_MESSAGE_CONTENT_KEY => $message,
+                ],
+            ],
+        ]);
+
+        $this->cache[$targetLang][$text] = trim($result->choices[0]->message->content ?? '');
+
+        return $this->cache[$targetLang][$text];
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription(): string
+    {
+        return static::CHATGPT_ENGINE;
+    }
+}
diff --git a/src/Translator/TranslatorEngine/DeepLTranslatorEngine.php b/src/Translator/TranslatorEngine/DeepLTranslatorEngine.php
new file mode 100644
index 0000000..d451ba5
--- /dev/null
+++ b/src/Translator/TranslatorEngine/DeepLTranslatorEngine.php
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\TranslatorEngine;
+
+use DeepL\DeepLException;
+use DeepL\Translator;
+use SprykerCommunity\Toolkit\Translator\Exception\TranslatorException;
+
+class DeepLTranslatorEngine implements TranslatorEngineInterface
+{
+    /**
+     * @var string
+     */
+    protected const LOCALE_EN = 'en';
+
+    /**
+     * @var string
+     */
+    public const SPRYKER_TOOLKIT_DEEPL_API_AUTH_KEY = 'SPRYKER_TOOLKIT_DEEPL_API_AUTH_KEY';
+
+    protected Translator $translator;
+
+    /**
+     * @param string $apiKey
+     */
+    public function __construct(string $apiKey)
+    {
+        $this->translator = new Translator($apiKey);
+    }
+
+    /**
+     * @param string $text
+     * @param string $targetLang
+     * @param string $sourceLang
+     *
+     * @throws \SprykerCommunity\Toolkit\Translator\Exception\TranslatorException
+     *
+     * @return string
+     */
+    public function translate(string $text, string $targetLang, string $sourceLang): string
+    {
+        $sourceLang = $this->getSourceLang($sourceLang);
+        $targetLang = $this->getTargetLang($targetLang);
+
+        try {
+            $translation = $this->translator->translateText($text, $sourceLang, $targetLang);
+
+            if (is_array($translation)) {
+                throw new TranslatorException('Unexpected DeepL array result');
+            }
+        } catch (DeepLException $e) {
+            throw new TranslatorException($e->getMessage());
+        }
+
+        return $translation->text;
+    }
+
+    /**
+     * @param string $targetLang
+     *
+     * @return string
+     */
+    protected function getTargetLang(string $targetLang): string
+    {
+        $lang = substr($targetLang, 0, 2);
+        if ($lang === static::LOCALE_EN) {
+            $targetLang = str_replace('_', '-', $targetLang);
+        } else {
+            $targetLang = strtoupper($lang);
+        }
+
+        return $targetLang;
+    }
+
+    /**
+     * @param string $sourceLang
+     *
+     * @return string
+     */
+    protected function getSourceLang(string $sourceLang): string
+    {
+        $lang = substr($sourceLang, 0, 2);
+        $sourceLang = strtoupper($lang);
+
+        return $sourceLang;
+    }
+
+    /**
+     * @return string
+     */
+    public function getDescription(): string
+    {
+        return 'DeepL';
+    }
+}
diff --git a/src/Translator/TranslatorEngine/TranslatorEngineInterface.php b/src/Translator/TranslatorEngine/TranslatorEngineInterface.php
new file mode 100644
index 0000000..9ae40d4
--- /dev/null
+++ b/src/Translator/TranslatorEngine/TranslatorEngineInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator\TranslatorEngine;
+
+interface TranslatorEngineInterface
+{
+    /**
+     * @param string $text
+     * @param string $targetLang
+     * @param string $sourceLang
+     *
+     * @return string
+     */
+    public function translate(string $text, string $targetLang, string $sourceLang): string;
+
+    /**
+     * @return string
+     */
+    public function getDescription(): string;
+}
diff --git a/src/Translator/ZedTranslator.php b/src/Translator/ZedTranslator.php
new file mode 100644
index 0000000..298a3a7
--- /dev/null
+++ b/src/Translator/ZedTranslator.php
@@ -0,0 +1,385 @@
+<?php
+
+/**
+ * Copyright © 2016-present Spryker Systems GmbH. All rights reserved.
+ * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
+ */
+
+declare(strict_types=1);
+
+namespace SprykerCommunity\Toolkit\Translator;
+
+use Exception;
+use League\Csv\Reader;
+use League\Csv\Statement;
+use League\Csv\SyntaxError;
+use League\Csv\Writer;
+use Psr\Log\LoggerInterface;
+use SprykerCommunity\Toolkit\Shared\Output\OutputAwareTrait;
+use SprykerCommunity\Toolkit\Translator\Config\ZedTranslatorConfig;
+use SprykerCommunity\Toolkit\Translator\Finder\TranslationFinderInterface;
+use SprykerCommunity\Toolkit\Translator\Finder\ZedTranslationFinder;
+use SprykerCommunity\Toolkit\Translator\TranslatorEngine\TranslatorEngineInterface;
+use Throwable;
+
+class ZedTranslator
+{
+    use OutputAwareTrait;
+
+    /**
+     * @var int
+     */
+    protected const MAX_RETRIES = 360;
+
+    /**
+     * @var int
+     */
+    protected const RETRIES_WAITING_SECONDS = 30;
+
+    /**
+     * @var string
+     */
+    protected const SOURCE_LOCALE = 'en_US';
+
+    /**
+     * @var \SprykerCommunity\Toolkit\Translator\Config\ZedTranslatorConfig
+     */
+    protected ZedTranslatorConfig $translatorConfig;
+
+    /**
+     * @var \SprykerCommunity\Toolkit\Translator\Finder\TranslationFinderInterface
+     */
+    protected TranslationFinderInterface $translationFinder;
+
+    private TranslatorEngineInterface $translator;
+
+    private LoggerInterface $logger;
+
+    /**
+     * @param \SprykerCommunity\Toolkit\Translator\TranslatorEngine\TranslatorEngineInterface $translator
+     * @param \Psr\Log\LoggerInterface $logger
+     */
+    public function __construct(TranslatorEngineInterface $translator, LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+        $this->translatorConfig = new ZedTranslatorConfig();
+        $this->translationFinder = new ZedTranslationFinder();
+        $this->translator = $translator;
+    }
+
+    /**
+     * @param string $baseDirectory
+     * @param array<int<0, max>, string> $locales
+     *
+     * @return void
+     */
+    public function translate(string $baseDirectory, array $locales): void
+    {
+        $this->printInfoMessage();
+
+        $directories = $this->prepareTranslationFilePaths(
+            $this->translatorConfig->getTranslationFilePathPatterns(),
+            $baseDirectory,
+        );
+        $moduleDirectories = $this->translationFinder->findFilesByGlobPatterns($directories);
+        asort($moduleDirectories);
+
+        foreach ($moduleDirectories as $moduleDirectory) {
+            foreach ($locales as $targetLocale) {
+                $projectDirectory = $baseDirectory . '/' . $this->getDirectoryToWrite($moduleDirectory, $targetLocale);
+                $moduleName = $this->getModuleName($moduleDirectory);
+                $this->output->writeln(PHP_EOL . "Checking if there are glossary translations to be generated for module $moduleName to the $targetLocale locale:");
+                $records = $this->getRecordsToBeTranslated(
+                    $baseDirectory,
+                    $targetLocale,
+                    $moduleDirectory,
+                );
+                if (!$records) {
+                    $this->output->writeln('No glossaries found that require translations for the locale ' . $targetLocale);
+
+                    continue;
+                }
+
+                $this->output->writeln("Generating glossary translations for module $moduleName in the $targetLocale locale...");
+                $this->translateRecords($records, $targetLocale, $projectDirectory);
+                foreach ($records as $record) {
+                    $this->output->writeln($record->getKey());
+                }
+            }
+        }
+    }
+
+    /**
+     * @param array<string|int, \SprykerCommunity\Toolkit\Translator\TranslationRequest> $records
+     * @param string $targetLocale
+     * @param string $directory
+     *
+     * @throws \Throwable
+     *
+     * @return void
+     */
+    protected function translateRecords(array $records, string $targetLocale, string $directory): void
+    {
+        foreach ($records as $record) {
+            $retry = 0;
+            do {
+                try {
+                    $translation = $this->translator->translate(
+                        $record->getText(),
+                        $targetLocale,
+                        static::SOURCE_LOCALE,
+                    );
+
+                    $translatedRecord = [
+                        $record->getKey(),
+                        $translation,
+                    ];
+
+                    if (method_exists($this, 'createDirectoryIfNotExists')) {
+                        $this->createDirectoryIfNotExists($directory);
+                    }
+
+                    break;
+                } catch (Throwable $e) {
+                    $this->logger->error($e->getMessage());
+                    $retry++;
+                    sleep(static::RETRIES_WAITING_SECONDS);
+
+                    if ($retry < static::MAX_RETRIES) {
+                        $this->output->writeln(sprintf(
+                            '<error>Translation unsuccessful. Retrying in %s seconds.</error>',
+                            static::RETRIES_WAITING_SECONDS,
+                        ));
+
+                        continue;
+                    }
+
+                    throw $e;
+                }
+            } while ($retry < static::MAX_RETRIES);
+            $this->addTranslatedRecords($directory, [$translatedRecord]);
+        }
+    }
+
+    /**
+     * @param string $directory
+     * @param array<int, array<int, string>> $records
+     *
+     * @return void
+     */
+    public function addTranslatedRecords(string $directory, array $records): void
+    {
+        $writer = Writer::createFromPath($directory, 'a');
+        $writer->insertAll($records);
+    }
+
+    /**
+     * @param string $directory
+     * @param array<string, string> $recordsToBeTranslated
+     *
+     * @throws \League\Csv\SyntaxError
+     *
+     * @return array<string, string>
+     */
+    protected function getZedRecordsForTranslation(
+        string $directory,
+        array $recordsToBeTranslated
+    ): array {
+        try {
+            $csv = Reader::createFromPath($directory, 'r');
+
+            if ($csv->count()) {
+                $stmt = Statement::create();
+                foreach ($stmt->process($csv) as $record) {
+                    $record = array_values($record);
+                    if (!$record[0] || !$record[1]) {
+                        continue;
+                    }
+
+                    $key = (string)$record[0];
+                    $translation = (string)$record[1];
+
+                    if (!isset($recordsToBeTranslated[$key])) {
+                        $recordsToBeTranslated[$key] = $translation;
+                    }
+                }
+            }
+        } catch (SyntaxError $exception) {
+            throw new SyntaxError($exception->getMessage());
+        }
+
+        return $recordsToBeTranslated;
+    }
+
+    /**
+     * @param string $file
+     * @param string $targetLocale
+     *
+     * @return string
+     */
+    protected function getDirectoryToWrite(string $file, string $targetLocale): string
+    {
+        $moduleName = $this->getModuleName($file);
+
+        return $this->translatorConfig->getProjectLevelPath() . $moduleName . '/' . $targetLocale . '.csv';
+    }
+
+    /**
+     * @param string $moduleDirectory
+     *
+     * @return string
+     */
+    protected function getModuleName(string $moduleDirectory): string
+    {
+        $chunks = explode('/', $moduleDirectory);
+        if (in_array('Translator', $chunks)) {
+            $moduleName = $chunks[count($chunks) - 2];
+        } else {
+            $moduleName = $chunks[count($chunks) - 5];
+        }
+
+        return str_replace('-', '', ucwords($moduleName, '-'));
+    }
+
+    /**
+     * @param string $directory
+     *
+     * @return void
+     */
+    protected function createDirectoryIfNotExists(string $directory): void
+    {
+        if (!file_exists($directory)) {
+            if (!file_exists(dirname($directory, 1))) {
+                mkdir(dirname($directory, 1), 0777, true);
+            }
+            $stream = fopen($directory, 'w'); // Create the file for writing.
+            if ($stream) {
+                fclose($stream);
+            }
+        }
+    }
+
+    /**
+     * @param array<string> $directories
+     * @param string $baseDirectory
+     *
+     * @return array<string>
+     */
+    protected function prepareTranslationFilePaths(array $directories, string $baseDirectory): array
+    {
+        $fullDirectories = [];
+        foreach ($directories as $directory) {
+            $fullDirectories[] = $baseDirectory . $directory;
+        }
+
+        return $fullDirectories;
+    }
+
+    /**
+     * @param string $baseDirectory
+     * @param string $targetLocale
+     * @param string $moduleDirectory
+     *
+     * @return array<\SprykerCommunity\Toolkit\Translator\TranslationRequest>
+     */
+    protected function getRecordsToBeTranslated(
+        string $baseDirectory,
+        string $targetLocale,
+        string $moduleDirectory
+    ): array {
+        $recordsToBeTranslated = [];
+        $targetLocaleExistingRecords = [];
+        $directory_locales = [];
+
+        if (scandir($moduleDirectory)) {
+            $directory_locales = array_slice(scandir($moduleDirectory), 2);
+        }
+
+        foreach ($directory_locales as $directory_locale) {
+            $file_locale = trim($directory_locale, '.csv');
+            if ($file_locale === static::SOURCE_LOCALE) {
+                $recordsToBeTranslated = $this->getZedRecordsForTranslation(
+                    $moduleDirectory . $directory_locale,
+                    $recordsToBeTranslated,
+                );
+            } elseif ($targetLocale === $file_locale) {
+                $targetLocaleExistingRecords = $this->getZedRecordsForTranslation(
+                    $moduleDirectory . $directory_locale,
+                    $targetLocaleExistingRecords,
+                );
+            }
+        }
+        $records = [];
+        if (count($targetLocaleExistingRecords)) {
+            foreach (array_keys($recordsToBeTranslated) as $record) {
+                if (!array_key_exists($record, $targetLocaleExistingRecords)) {
+                    $records[$record] = $recordsToBeTranslated[$record];
+                }
+            }
+        } else {
+            $records = $recordsToBeTranslated;
+        }
+
+        $moduleName = $this->getModuleName($moduleDirectory);
+        $projectDirectory = $baseDirectory . '/' . $this->translatorConfig->getProjectLevelPath() . $moduleName . '/' . $targetLocale . '.csv';
+        if (file_exists($projectDirectory)) {
+            $records = $this->excludeProjectLevelKeys($projectDirectory, $records);
+        }
+
+        $finalRecords = [];
+        foreach ($records as $key => $record) {
+            $finalRecords[$key] = new TranslationRequest(
+                '',
+                '', #$filePath,
+                0, #$rowOffset,
+                $key,
+                $record,
+            );
+        }
+
+        return $finalRecords;
+    }
+
+    /**
+     * @param string $projectDirectory
+     * @param array<string, string> $records
+     *
+     * @throws \Exception
+     *
+     * @return array<string, string>
+     */
+    protected function excludeProjectLevelKeys(string $projectDirectory, array $records): array
+    {
+        try {
+            $projectLevelTranslatedRecords = $this->getZedRecordsForTranslation(
+                $projectDirectory,
+                [],
+            );
+        } catch (SyntaxError $exception) {
+            throw new Exception($exception->getMessage());
+        }
+
+        foreach (array_keys($projectLevelTranslatedRecords) as $projectRecord) {
+            if (array_key_exists($projectRecord, $records)) {
+                unset($records[$projectRecord]);
+            }
+        }
+
+        return $records;
+    }
+
+    /**
+     * @return void
+     */
+    protected function printInfoMessage(): void
+    {
+        $message = 'Generating translations using ' . $this->translator->getDescription();
+        $messageLength = strlen($message);
+
+        $this->output->writeln([
+            '<info>' . $message . '</>',
+            '<info>' . str_repeat('=', $messageLength) . '</>',
+            '',
+        ]);
+    }
+}
diff --git a/src/container.php b/src/container.php
new file mode 100644
index 0000000..320f640
--- /dev/null
+++ b/src/container.php
@@ -0,0 +1,38 @@
+<?php
+
+use Monolog\Handler\StreamHandler;
+use Monolog\Level;
+use Monolog\Logger;
+use SprykerCommunity\Toolkit\Translator\TranslatorEngine\ChatGptTranslatorEngine;
+use SprykerCommunity\Toolkit\Translator\TranslatorEngine\DeepLTranslatorEngine;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+$container = new ContainerBuilder();
+
+// Shared
+$container->register(StreamHandler::class, StreamHandler::class)
+    ->setArguments([
+        __DIR__ . '/../var/log/dev.log',
+        Level::Debug,
+    ]);
+
+$container->register(Logger::class, Logger::class)
+    ->setArguments(['spryker-toolkit'])
+    ->addMethodCall('pushHandler', [
+        new Reference(StreamHandler::class),
+    ])->setPublic(true);
+
+// Translator
+$container->register(ChatGptTranslatorEngine::class, ChatGptTranslatorEngine::class)
+    ->setArguments([
+        new Reference(Logger::class),
+        '%env(' . ChatGptTranslatorEngine::SPRYKER_TOOLKIT_CHATGPT_API_AUTH_KEY . ')%',
+    ])->setPublic(true);
+
+$container->register(DeepLTranslatorEngine::class, DeepLTranslatorEngine::class)
+    ->setArguments([
+        '%env(' . DeepLTranslatorEngine::SPRYKER_TOOLKIT_DEEPL_API_AUTH_KEY . ')%',
+    ])->setPublic(true);
+
+return $container;
diff --git a/tests/.gitkeep b/tests/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/var/cache/.gitkeep b/var/cache/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/var/log/.gitkeep b/var/log/.gitkeep
new file mode 100644
index 0000000..e69de29