diff --git a/.env b/.env
index 599728c..8fe3bd5 100644
--- a/.env
+++ b/.env
@@ -61,3 +61,11 @@ VAPID_PC=BKz0kdcsG6kk9KxciPpkfP8kEDAd408inZecij5kBDbQ1ZGZSNwS4KZ8FerC28LFXvgSqpD
CLOUDFLARE_ZONE_ID=a26d2ecd33d18c984f348eeb060ed5b3
CLOUDFLARE_API_TOKEN=zhpO0bBO8wdogBrDuePbpGzMRrY6pItGhPSmhQ-h
+MARCHAND_ID=5685183792
+###> google/apiclient ###
+GOOGLE_API_KEY=
+GOOGLE_CLIENT_ID=
+GOOGLE_CLIENT_SECRET=
+GOOGLE_AUTH_CONFIG=%kernel.project_dir%/google.json
+GOOGLE_APPLICATION_CREDENTIALS=%kernel.project_dir%/google.json
+###< google/apiclient ###
diff --git a/composer.json b/composer.json
index a9b633a..238f6a5 100644
--- a/composer.json
+++ b/composer.json
@@ -19,6 +19,7 @@
"endroid/qr-code": ">=6.0.9",
"exbil/mailcow-php-api": ">=0.14.2",
"fpdf/fpdf": ">=1.86",
+ "google/apiclient": "^2.18",
"google/cloud": "^0.296.0",
"healey/robots": "^1.0",
"imagine/imagine": "^1.5",
diff --git a/composer.lock b/composer.lock
index 0d12fb7..a2bd8ee 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "fe5cfb5ef73b767b1d84ebbc20c2c1e4",
+ "content-hash": "6626dfc2cf51f3a2c17ea6288909dcb4",
"packages": [
{
"name": "async-aws/core",
@@ -2352,6 +2352,119 @@
},
"time": "2023-07-04T16:41:45+00:00"
},
+ {
+ "name": "google/apiclient",
+ "version": "v2.18.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/googleapis/google-api-php-client.git",
+ "reference": "5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b",
+ "reference": "5b51fdb2cbd2a96088e3dfc6f565bdf6fb0af94b",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "^6.0",
+ "google/apiclient-services": "~0.350",
+ "google/auth": "^1.37",
+ "guzzlehttp/guzzle": "^7.4.5",
+ "guzzlehttp/psr7": "^2.6",
+ "monolog/monolog": "^2.9||^3.0",
+ "php": "^8.1",
+ "phpseclib/phpseclib": "^3.0.36"
+ },
+ "require-dev": {
+ "cache/filesystem-adapter": "^1.1",
+ "composer/composer": "^1.10.23",
+ "phpcompatibility/php-compatibility": "^9.2",
+ "phpspec/prophecy-phpunit": "^2.1",
+ "phpunit/phpunit": "^9.6",
+ "squizlabs/php_codesniffer": "^3.8",
+ "symfony/css-selector": "~2.1",
+ "symfony/dom-crawler": "~2.1"
+ },
+ "suggest": {
+ "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/aliases.php"
+ ],
+ "psr-4": {
+ "Google\\": "src/"
+ },
+ "classmap": [
+ "src/aliases.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Client library for Google APIs",
+ "homepage": "http://developers.google.com/api-client-library/php",
+ "keywords": [
+ "google"
+ ],
+ "support": {
+ "issues": "https://github.com/googleapis/google-api-php-client/issues",
+ "source": "https://github.com/googleapis/google-api-php-client/tree/v2.18.4"
+ },
+ "time": "2025-09-30T04:23:07+00:00"
+ },
+ {
+ "name": "google/apiclient-services",
+ "version": "v0.420.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/googleapis/google-api-php-client-services.git",
+ "reference": "f1200dbf48d02dcfa36c5771f4dbc0433655a7ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/f1200dbf48d02dcfa36c5771f4dbc0433655a7ab",
+ "reference": "f1200dbf48d02dcfa36c5771f4dbc0433655a7ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "autoload.php"
+ ],
+ "psr-4": {
+ "Google\\Service\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Client library for Google APIs",
+ "homepage": "http://developers.google.com/api-client-library/php",
+ "keywords": [
+ "google"
+ ],
+ "support": {
+ "issues": "https://github.com/googleapis/google-api-php-client-services/issues",
+ "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.420.1"
+ },
+ "time": "2025-11-17T01:06:15+00:00"
+ },
{
"name": "google/auth",
"version": "v1.49.0",
@@ -6130,6 +6243,56 @@
},
"time": "2025-09-24T15:06:41+00:00"
},
+ {
+ "name": "paragonie/random_compat",
+ "version": "v9.99.100",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">= 7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*|5.*",
+ "vimeo/psalm": "^1"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "keywords": [
+ "csprng",
+ "polyfill",
+ "pseudorandom",
+ "random"
+ ],
+ "support": {
+ "email": "info@paragonie.com",
+ "issues": "https://github.com/paragonie/random_compat/issues",
+ "source": "https://github.com/paragonie/random_compat"
+ },
+ "time": "2020-10-15T08:29:30+00:00"
+ },
{
"name": "pear/net_dns2",
"version": "v2.0.6",
@@ -6474,6 +6637,116 @@
},
"time": "2025-10-26T15:54:22+00:00"
},
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "3.0.47",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/9d6ca36a6c2dd434765b1071b2644a1c683b385d",
+ "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "^1|^2|^3",
+ "paragonie/random_compat": "^1.4|^2.0|^9.99.99",
+ "php": ">=5.6.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "suggest": {
+ "ext-dom": "Install the DOM extension to load XML formatted public keys.",
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib3\\": "phpseclib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "support": {
+ "issues": "https://github.com/phpseclib/phpseclib/issues",
+ "source": "https://github.com/phpseclib/phpseclib/tree/3.0.47"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/terrafrost",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/phpseclib",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-10-06T01:07:24+00:00"
+ },
{
"name": "phpstan/phpdoc-parser",
"version": "2.3.0",
diff --git a/config/packages/google_apiclient.yaml b/config/packages/google_apiclient.yaml
new file mode 100644
index 0000000..70b4b80
--- /dev/null
+++ b/config/packages/google_apiclient.yaml
@@ -0,0 +1,11 @@
+services:
+ Google\Client:
+ class: Google\Client
+ calls:
+ # Authentication with "API key"
+ - [setDeveloperKey, ['%env(GOOGLE_API_KEY)%']]
+ # Authentication with "OAuth 2.0" using Client ID & Secret
+ - [setClientId, ['%env(GOOGLE_CLIENT_ID)%']]
+ - [setClientSecret, ['%env(GOOGLE_CLIENT_SECRET)%']]
+ # Authentication with "OAuth 2.0" or "Service account" using JSON
+ - [setAuthConfig, ['%env(resolve:GOOGLE_AUTH_CONFIG)%']]
diff --git a/google.json b/google.json
new file mode 100644
index 0000000..36e3baf
--- /dev/null
+++ b/google.json
@@ -0,0 +1,13 @@
+{
+ "type": "service_account",
+ "project_id": "smiling-gasket-478816-n2",
+ "private_key_id": "50be7ef1c73c674d110c849d70acc8b1ed5904b0",
+ "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDAiPtoiN8Dpdw0\n44dxFBIMx1+9bwiL8PXxQhMYHkhRk1GGIhd+hUkpcQn/87FqH6M2fTDq1U8BEmwb\nWznpSt0rx0JLwfPwdh2CLJ8iZ/ZieUBGg1bQITOlXwN8w4BS4jfEZ57jwjjIOO+3\neA1ib3Y4o0NOQCEjoOdw9XZgzSBKopjYtCx7ELKTzuK7FQjfxBhUeETA2ts0Qi6l\nA6psximWu+ZKvTX0wZC4CCECqKM0CuaKdKrotoysx2bKQLlTclLU60LSqUJX2JZE\nTcXT8NRRt6B58rEOoxcP2l5bJSySw5PTceRC1wbihihDazefBKbqZh/N3eMueY2C\nuN1nTdWjAgMBAAECggEANF6OE7b3AiUBKpmg448UAcnRLtOevYHDQ+Y3D15dSWMK\nz7NCNLXIWq9WivocDcOhP1b6EUYIAUCjiyVbMSud0SSX0cdltMhL6nZ8qn0gtVRJ\nuWRMHryJMbgQWMVMiD7j8FZHD6hqjXt/KKZM7bNnsqwlyIkE+o3vpff+RQJGgEYV\nBLkj81wdW1DMJI3LQoau9jKdMf5mLrDCWRDyEugLMnvAA9acNWoYiBMB6lxvCa3G\n12nPjeCRJXJf+/VT7M2mwHjWgajG8AyFECYRe8cNmvIAfH3GC1uQfyLw8kReoCBL\n1jAUNAUQAQbmGz1Z87/k20skZIkXsW4eG2W6C4+L0QKBgQDiWfXdT+78aPCFopQ0\nFtOwYQvqjwPjeMa5z0T736ZNX115MAbl4DlfyUEb0cvospOLUXTg6cVtJzWkMK0/\nrkh/i8EQ8OyyStZ/K/wFxnR4Vu+AeSpop4aOqNl/meW7bflITUt8dIs+PLjK+vLa\nQPxQoNDSlGrejPz7lEG8DR1nrQKBgQDZwRbSMQTOj4mOGtv/bsCmCQ6ctNF6sH80\nPdCsmaygLfaPWNQ9lTPdJd993Id2Fo0Itzkwy/Vb+0eFj4iBSIpskuZ7mrA7eypJ\nAR/WJGX3BYAvMKEvMn+KOwJczHzsU1083moKV73ldGMiQdfZOtmnqzWpXpgnCEki\nq0lpp/IcjwKBgEI4OVKuwOb9OGiQILWAfBvcuGS9xFB3FARmG/NoAbofDTSYFVyJ\nFZ/tO+wMm5APNlUK1pu6KHT/hJTtXLIFpdYSp7/yC/05IbmAv7Fc1tQh8t1uFTca\n06XGxiKrfmcwDD7Xxh655camcxWHBydM3cQk2BLTMtS7AIQFYpnGaHTdAoGAKkfA\nm51i9oyOQ+ZZMxaZF2QIz0qYpf7hJA6glvLbvtpN1nWD+FUhFd6Fr5WDQ92LEtco\npp3jjTGUKI2/DoM8RWqckAFwGIyIoFY0jUrR9Y2+3urNUTG36+obQlN+KhDhuLDi\n3BE/UO8xVHR+abJwkoq+x50TY/jK4o1pmrc+XmcCgYApPsls/sai1QbD6pQwQcwJ\nZtLBvFbykc79nZ8/5XHbrtsqWtCAju3RnxRZArIE3rCh2PWbPhWRq2q0sQFVSd4v\n1JLPD7OD9dLw63HG4ODD8E6Ih+xUDJuCOl9bYYJiBpXUx91tOdBFrJeB2HRWHNsH\nNnXhRIljkbVF/FFkvGxa3g==\n-----END PRIVATE KEY-----\n",
+ "client_email": "shop-api@smiling-gasket-478816-n2.iam.gserviceaccount.com",
+ "client_id": "101205257048462610951",
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+ "token_uri": "https://oauth2.googleapis.com/token",
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/shop-api%40smiling-gasket-478816-n2.iam.gserviceaccount.com",
+ "universe_domain": "googleapis.com"
+}
diff --git a/src/Command/GoogleMarchandCommand.php b/src/Command/GoogleMarchandCommand.php
new file mode 100644
index 0000000..0dff365
--- /dev/null
+++ b/src/Command/GoogleMarchandCommand.php
@@ -0,0 +1,142 @@
+httpClient = $httpClient;
+ $this->merchantId = $_ENV['MARCHAND_ID'];
+ // Construit le chemin absolu vers le fichier de clé de compte de service
+ $this->serviceAccountKeyPath = $kernel->getProjectDir() . '/google.json';
+
+ parent::__construct();
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $io = new SymfonyStyle($input, $output);
+
+ if (empty($this->merchantId) || !file_exists($this->serviceAccountKeyPath)) {
+ $io->error('Merchant ID non configuré ou le fichier de clé de compte de service est introuvable à: ' . $this->serviceAccountKeyPath);
+ return Command::FAILURE;
+ }
+
+ $io->title(sprintf('Envoi d\'un produit à Google Merchant Center (ID: %s)', $this->merchantId));
+
+ // --- 1. AUTHENTIFICATION OAuth 2.0 via Compte de Service ---
+ try {
+ $io->text('Authentification en cours...');
+
+ $client = new Client();
+ $client->setAuthConfig($this->serviceAccountKeyPath);
+ // La scope requise pour l'API Content for Shopping (RW)
+ $client->setScopes(['https://www.googleapis.com/auth/content']);
+
+ // Demande le jeton d'accès
+ $accessToken = $client->fetchAccessTokenWithAssertion()['access_token'] ?? null;
+
+ if (!$accessToken) {
+ throw new \Exception('Impossible d\'obtenir un jeton d\'accès à partir des identifiants du compte de service.');
+ }
+
+ $io->text('Jeton d\'accès obtenu.');
+
+ } catch (\Exception $e) {
+ $io->error('Échec de l\'authentification OAuth 2.0: ' . $e->getMessage());
+ return Command::FAILURE;
+ }
+
+
+ // --- 2. PRÉPARATION ET ENVOI DU PRODUIT ---
+ $endpoint = sprintf('%s%s/products', $this->apiUrl, $this->merchantId);
+
+
+ $testProduct = [
+ 'offerId' => 'OAUTH-TEST-' . time(),
+ 'title' => 'Produit Authentifié via OAuth Symfony',
+ 'description' => 'Test d\'intégration API Content for Shopping avec Compte de Service.',
+ 'link' => 'https://www.mon-site-ecommerce.com/oauth-product-' . time(),
+ 'imageLink' => 'https://placehold.co/600x400/0000FF/FFFFFF?text=OAuth+2.0',
+ 'contentLanguage' => 'fr',
+ 'targetCountry' => 'FR',
+ 'feedLabel' => 'FR',
+ 'channel' => 'online',
+ 'availability' => 'in stock',
+ 'price' => ['value' => '19.99', 'currency' => 'EUR'],
+ 'gtin' => '9000000000001',
+ 'brand' => 'Secure Acme Brand',
+ ];
+
+ $io->section('Produit à envoyer');
+ $io->text(sprintf('Offer ID: %s', $testProduct['offerId']));
+
+ try {
+ // Utilisation du jeton d'accès dans l'en-tête Authorization: Bearer
+ $response = $this->httpClient->request('POST', $endpoint, [
+ 'json' => $testProduct,
+ 'headers' => [
+ 'Content-Type' => 'application/json',
+ 'Authorization' => 'Bearer ' . $accessToken,
+ ],
+ ]);
+
+ $statusCode = $response->getStatusCode();
+ $content = $response->toArray(false);
+
+ // 3. Gestion de la réponse
+ if ($statusCode >= 200 && $statusCode < 300) {
+ $io->success(sprintf('Produit envoyé avec succès. Status: %d', $statusCode));
+ $io->text('ID Produit Google (REST ID): ' . ($content['id'] ?? 'N/A'));
+
+ return Command::SUCCESS;
+ } else {
+ $io->error(sprintf('Échec de l\'envoi du produit. Status: %d', $statusCode));
+
+ $errors = $content['error']['errors'] ?? [];
+ if (!empty($errors)) {
+ $io->text('Détails des erreurs Google:');
+ $io->listing(array_map(fn($e) => $e['reason'] . ': ' . $e['message'], $errors));
+ }
+
+ $io->comment('Réponse complète de l\'API:');
+ $io->write(json_encode($content, JSON_PRETTY_PRINT));
+
+ return Command::FAILURE;
+ }
+
+ } catch (\Exception $e) {
+ $io->error('Une erreur est survenue lors de la requête API: ' . $e->getMessage());
+ return Command::FAILURE;
+ }
+ }
+}
diff --git a/src/EventSubscriber/LocaleListener.php b/src/EventSubscriber/LocaleListener.php
index 1e9103b..673deaa 100644
--- a/src/EventSubscriber/LocaleListener.php
+++ b/src/EventSubscriber/LocaleListener.php
@@ -9,7 +9,7 @@ use Symfony\Component\HttpKernel\KernelEvents;
class LocaleListener implements EventSubscriberInterface
{
private $defaultLocale;
- private $allowedLocales = ['fr', 'en']; // Locales autorisées
+ private $allowedLocales = ['fr', 'en','cn']; // Locales autorisées
/**
* @param string $defaultLocale La locale par défaut (configurée dans services.yaml)
diff --git a/src/EventSubscriber/SitemapSubscriber.php b/src/EventSubscriber/SitemapSubscriber.php
index 25d69fb..032920c 100644
--- a/src/EventSubscriber/SitemapSubscriber.php
+++ b/src/EventSubscriber/SitemapSubscriber.php
@@ -24,7 +24,7 @@ class SitemapSubscriber
$urlContainer = $event->getUrlContainer();
$urlGenerator = $event->getUrlGenerator();
- $langs = ["fr","en"];
+ $langs = ["fr","en","cn"];
$urlHome = new UrlConcrete($urlGenerator->generate('app_about', [], UrlGeneratorInterface::ABSOLUTE_URL));
$decoratedUrlHome = new GoogleImageUrlDecorator($urlHome);
diff --git a/symfony.lock b/symfony.lock
index 0813fb1..56e1690 100644
--- a/symfony.lock
+++ b/symfony.lock
@@ -35,6 +35,18 @@
"migrations/.gitignore"
]
},
+ "google/apiclient": {
+ "version": "2.18",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "2.10",
+ "ref": "07a97ec434d43b7903c78069a04c92adb6442e52"
+ },
+ "files": [
+ "config/packages/google_apiclient.yaml"
+ ]
+ },
"knplabs/knp-paginator-bundle": {
"version": "v6.8.1"
},
diff --git a/templates/base.twig b/templates/base.twig
index 8f2de13..adc19b8 100644
--- a/templates/base.twig
+++ b/templates/base.twig
@@ -164,7 +164,7 @@
{# En attendant, nous générons l'URL manuellement #}
{% set current_query = app.request.query.all %}
- {% for lang in ['fr', 'en'] %}
+ {% for lang in ['fr', 'en','cn'] %}
{% set is_active_lang = (app.request.locale == lang) %}
{% set lang_params = current_params|merge(current_query)|merge({'lang': lang}) %}
{# Générer l'URL en conservant les paramètres existants + le paramètre 'lang' #}
diff --git a/translations/messages.cn.yaml b/translations/messages.cn.yaml
new file mode 100644
index 0000000..dd33128
--- /dev/null
+++ b/translations/messages.cn.yaml
@@ -0,0 +1,612 @@
+# Clés principales
+about_title: 关于我们
+about_description: 探索我们对角色扮演、手工艺和平等的热情!认识我们的创始人。参加我们的比赛、研讨会和 CosHospital(角色扮演医院)。
+# Section 1 : Notre Passion
+about_section_passion_title: "我们的热情:创造想象"
+about_passion_association_details: 致力于角色扮演(Cosplay)和 CosHopital 艺术的协会
+about_passion_mission_details: 创作、分享和艺术表达
+about_passion_costume_handmade: 亲手制作或购买其服装
+about_passion_equality: 平等地位
+about_passion_p1: 我们是一个由%association%爱好者为爱好者创立的。我们的使命是提供一个充满活力和包容性的平台,以%mission%为我们所有活动的核心,总部位于上法兰西大区(Hauts-de-France),地理位置优越,靠近泰尔涅(Tergnier)、圣康坦(Saint-Quentin)和拉昂(Laon)。
+about_passion_p2: "我们认为角色扮演是一门完整的艺术。因此,无论角色扮演者是%fait_main%,他们都在我们社区中处于%egalite%的地位。我们相信角色扮演不仅仅是简单的伪装:它是一种结合了缝纫、工程、表演和对虚构作品热爱的艺术形式。"
+
+# Section 2 : Fondateurs
+about_founders_title: 协会创始人
+about_email_label: 电子邮件
+about_photographer_label: 摄影师
+about_founder_shoko_role: 总裁兼角色扮演者
+about_founder_shoko_role_short: 总裁,角色扮演者
+about_founder_marta_role: 协会秘书
+about_founder_marta_role_short: 秘书
+about_shoko_cosplay_title: Shoko的角色扮演作品
+about_marta_cosplay_title: Marta的角色扮演作品
+about_shoko_instagram_aria: ShokoCosplay的Instagram
+about_shoko_tiktok_aria: ShokoCosplay的TikTok
+about_shoko_facebook_aria: ShokoCosplay的Facebook
+about_marta_facebook_aria: Marta Gator的Facebook
+about_marta_tiktok_aria: Marta Gator的TikTok
+about_marta_instagram_aria: Marta Gator的Instagram
+
+# Section 3 : Objectifs et Valeurs
+about_goals_title: 我们的目标和价值观
+about_goal1_title: 促进创作
+about_goal1_text: 鼓励制作复杂且原创的服装,重视手工艺、缝纫技术、化妆和道具(props)的创作。
+about_goal2_title: 团结社区
+about_goal2_text: 为所有水平的人,从初学者到专家,创造一个安全和友善的空间。促进成员之间的技巧和建议交流。
+about_goal3_title: 庆祝表演
+about_goal3_text: 通过高水平的活动和比赛来突出角色扮演的戏剧和舞台方面。
+about_goal4_title: 包容性和非歧视
+about_goal4_open_details: 向所有人开放,没有任何歧视
+about_goal4_friendly_details: LGBTQ+ 友好
+about_goal4_text: 我们的协会%ouverte%(性取向、出身等)。我们是一个%friendly%环境,确保每位成员都受到尊重和安全保障。
+
+# Section 4 : Activités Principales
+about_activities_title: 我们的主要活动
+about_activity1_title: 组织角色扮演比赛
+about_activity1_comp_detail: 角色扮演比赛
+about_activity1_open_detail: 向所有人开放,无论您的服装是自制还是购买
+about_activity1_craft_detail: 精湛工艺 (craftsmanship)
+about_activity1_acting_detail: 表演 (acting)
+about_activity1_text: 我们定期在大会和主题活动中组织%concours%。这些比赛%ouverts%,设有合适的评判类别。它们旨在评估制作质量(针对创作者的%craftsmanship%)和/或舞台表演(针对所有人的%acting%),从而为所有风格和技能水平提供机会。
+
+about_activity2_title: 制作和完善研讨会
+about_activity2_workshop_detail: 角色扮演研讨会
+about_activity2_text: 从铸模到 3D 打印,再到精密缝纫和涂装,我们的%ateliers%旨在向您传授基本技能。无论您是想学习处理 EVA 泡沫、操纵 LED 还是完善您的假发造型,由专家指导的课程都将帮助您实现最雄心勃勃的项目。
+
+about_activity3_title: 'CosHopital(角色扮演医院):免费维修'
+about_activity3_coshospital_detail: CosHopital
+about_activity3_repair_detail: 为访客免费维修角色扮演服装和道具
+about_activity3_text: '%coshopital%是我们的团结和重要服务。在我们的活动中,我们的专业志愿者为受损的服装提供%reparation%。无论是缝线松脱、道具破损还是假发需要重新整理,我们的“角色扮演医生”团队都会快速为您解决问题,让您充分享受您的一天!'
+# Section 5 : Appel à l'action
+about_call_to_action_text: 无论您是服装大师还是正在考虑您的第一个项目,都请加入我们,分享创造的魔力!
+about_call_to_action_button: 发现我们的活动
+
+# Clés utilisées pour le template CGU
+cgu_short_title: 使用条款
+cgu_page_title: 一般使用条款(CGU)
+cgu_intro_disclaimer: 本文件规定了对 E-Cosplay 协会网站的访问和使用。
+
+# Section 1 : Acceptation
+cgu_section1_title: 1. 接受一般使用条款
+cgu_section1_p1: 访问和使用%link%网站,即表示您无保留地接受本一般使用条款(CGU)。
+cgu_section1_p2: E-Cosplay 协会保留随时修改这些 CGU 的权利。因此,建议用户定期查阅最新的版本。
+
+# Section 2 : Services Proposés
+cgu_section2_title: 2. 服务描述
+cgu_section2_p1: 本网站旨在提供有关 E-Cosplay 协会活动(比赛管理、研讨会、Coshopital)及其活动的信息。
+cgu_section2_p2: "主要服务包括:"
+cgu_section2_list1: 查阅有关过去和未来活动的信息。
+cgu_section2_list2: 访问联系区域以与团队沟通。
+cgu_section2_list3: 报名参加活动和角色扮演比赛(根据开放时间)。
+
+# Section 3 : Accès et Utilisation
+cgu_section3_title: 3. 网站访问和用户行为
+cgu_section3_p1: 网站访问是免费的。用户承认具备访问和使用本网站所需的技能和方法。
+cgu_section3_subtitle1: "一般行为:"
+cgu_section3_p2: 用户承诺不以任何方式妨碍网站的正常运行。特别是,禁止传输非法、辱骂、诽谤或侵犯知识产权或第三方肖像权的内容。
+cgu_section3_subtitle2: "联系区域和注册:"
+cgu_section3_p3: 用户在使用联系表格或注册时提供的所有信息都必须准确和完整。协会保留拒绝明显虚假或不完整信息注册或消息的权利。
+
+# Section 4 : Responsabilité
+cgu_section4_title: 4. 责任限制
+cgu_section4_p1: E-Cosplay 协会致力于确保本网站发布信息的准确性和更新,并保留随时且不经通知地更正其内容的权利。
+cgu_section4_p2: 但是,协会对网站的任何中断或故障、任何错误的发生、网站上信息的任何不准确或遗漏不承担任何责任。
+cgu_section4_subtitle1: "外部链接:"
+cgu_section4_p3: 网站可能包含指向其他网站的超文本链接。E-Cosplay 协会对这些网站的内容不进行任何控制,并对因访问这些网站而导致的任何直接或间接损害不承担任何责任。
+
+# Section 5 : Droit Applicable
+cgu_section5_title: 5. 适用法律和管辖法院
+cgu_section5_p1: 本 CGU 受法国法律管辖。
+cgu_section5_p2: 如有争议,在任何友好解决尝试失败后,只有拉昂(Laon)的合格法院具有管辖权。
+
+# Clés utilisées pour le template CGV
+home_title: 首页
+cgv_short_title: 销售条款
+cgv_page_title: 一般销售条款(CGV)
+cgv_intro_disclaimer: 本文件规定了 E-Cosplay 协会提供的服务或产品的销售。
+cgv_legal_link_text: 法律声明
+
+# Section 1 : Objet et Champ d'Application
+cgv_section1_title: 1. 目的和范围
+cgv_section1_p1: 本一般销售条款(CGV)适用于 E-Cosplay 协会(以下简称“协会”)通过%link%网站与任何专业或非专业买家(以下简称“客户”)签订的所有产品和/或服务销售。
+cgv_section1_p2: 下订单即表示客户完全且无保留地接受本 CGV。
+
+# Section 2 : Identification de l'Association
+cgv_section2_title: 2. 卖方识别
+cgv_section2_p1: 销售由 E-Cosplay 协会保障,其法律信息可在%link%中查阅。
+cgv_section2_list1_label: 名称
+cgv_section2_list2_label: 注册地址
+cgv_section2_list3_label: 联系方式
+
+# Section 3 : Prix et Produits
+cgv_section3_title: 3. 产品/服务的价格和特点
+cgv_section3_subtitle1: 价格
+cgv_section3_p1: 产品和服务的价格以欧元(€)计价,包含所有税费(TTC)。协会保留随时修改价格的权利,但产品或服务将根据订单确认时的现行价格计费。
+cgv_section3_subtitle2: 典型销售服务
+cgv_section3_p2: "协会销售的服务包括但不限于:比赛或特定活动的报名费、培训研讨会(Coshopital),以及(如果适用)衍生产品(商品)的销售。"
+
+# Section 4 : Commande et Paiement
+cgv_section4_title: 4. 订单和支付方式
+cgv_section4_subtitle1: 订单
+cgv_section4_p1: 客户确认订单即表示最终且不可撤销地接受价格和本 CGV。协会将通过客户提供的电子邮件地址发送电子邮件确认订单。
+cgv_section4_subtitle2: 支付
+cgv_section4_p2: 支付要求在订单日期立即支付。接受的支付方式在订单过程中指定(通常是通过安全的支付服务提供商进行银行卡支付)。
+
+# Section 5 : Livraison
+cgv_section5_title: 5. 交付(实物产品)
+cgv_section5_p1: 实物产品的交付由 Colissimo 和/或 Mondial Relay 等合作运输公司提供,具体取决于客户在订购时的选择。
+cgv_section5_subtitle1: 协会的责任
+cgv_section5_p2: 根据规定,货物丢失或损坏的风险在客户或其指定第三方实际占有这些货物时转移给客户。
+cgv_section5_p3: E-Cosplay 协会对运输过程中包裹的丢失、盗窃或损坏不承担任何责任。如果出现交付问题,客户必须直接向相关运输公司(Colissimo/Mondial Relay)提出索赔。
+cgv_section5_subtitle2: 期限
+cgv_section5_p4: 订单时显示的交付时间是运输公司提供的估计时间。如果超出,客户应参考运输公司的条款。
+
+# Section 6 : Droit de Rétractation
+cgv_section6_title: 6. 撤销权和退款
+cgv_section6_subtitle1: 撤销期限和条件
+cgv_section6_p1: 协会允许客户在收到产品(对于货物)或签订合同(对于服务)后的十四(14)个工作日内行使撤销权并要求全额退款。
+cgv_section6_p2: 产品必须以原始包装退回,处于完美的转售状态且未使用。退货费用由客户承担。
+cgv_section6_subtitle2: 撤销权的例外
+cgv_section6_p3: "根据《消费者法典》第 L.221-28 条,撤销权不能用于:"
+cgv_section6_list1_personalized: 明确定制的(“定制”产品)
+cgv_section6_list1: 根据消费者规格制造或%personalized%的货物供应。
+cgv_section6_list2: "必须在特定日期或特定期间提供的住宿、运输、餐饮、休闲服务供应(例如:预定日期比赛或活动的注册)。"
+cgv_section6_subtitle3: 程序和退款
+cgv_section6_p4: 如果适用撤销权,客户必须在截止日期前通过电子邮件通知协会联系方式(%email_link%)决定。协会承诺最迟在收到退回产品(或其寄出证明)后的十四(14)天内退还所有已支付的款项,包括初始运费。
+
+# Section 7 : Garanties et Responsabilité
+cgv_section7_title: 7. 协会的保证和责任
+cgv_section7_p1: 协会受所售服务或产品的法定一致性保证以及隐藏缺陷保证的约束(《民法典》第 1641 条及后续条款)。
+cgv_section7_p2: 对于因使用互联网网络而固有的所有不便或损害,特别是服务中断、外部入侵或存在计算机病毒,协会概不负责。
+
+# Section 8 : Droit Applicable
+cgv_section8_title: 8. 适用法律和争议
+cgv_section8_p1: 本 CGV 受法国法律管辖。
+cgv_section8_p2: 如有争议,客户可诉诸消费调解,其详细信息将由协会提供。如果无法达成友好协议,只有拉昂(Laon,法国)的合格法院具有管辖权。
+
+# Clés utilisées pour le template HOSTING
+hosting_short_title: 托管信息
+hosting_page_title: 托管信息
+hosting_page_title_long: 托管和技术服务提供商详细信息
+
+# Section 1 : Hébergeur Principal
+hosting_section1_title: 1. 主要托管服务商
+hosting_section1_p1: '%site_url%网站托管在 Google 的云基础设施上。'
+hosting_label_host_name: 托管服务商名称
+hosting_label_service_used: 使用的服务
+hosting_service_compute_cloud: Compute Cloud (计算和数据基础设施)
+hosting_label_company: 公司
+hosting_label_address: 注册地址
+hosting_label_data_location: 数据托管地点(欧洲)
+hosting_data_location_details: "Google Cloud Netherlands B.V.(通常从爱尔兰管理:O'Mahony's Corner, Block R, Spencer Dock, Dublin 1, Irelande)。"
+hosting_label_contact: 联系方式
+hosting_contact_details: 通常通过 Google Cloud 支持平台以电子方式联系。
+hosting_section1_disclaimer: 根据 GDPR,用户数据的主要存储保证在欧盟内。
+
+# Section 2 : Autres Prestataires
+hosting_section2_title: 2. 其他技术服务提供商
+hosting_section2_p1: "除了主要托管服务外,本网站还使用其他服务提供商以确保其性能和功能:"
+hosting_label_role: 角色
+
+# Cloudflare
+hosting_cloudflare_title: Cloudflare(CDN、速度和安全性)
+hosting_cloudflare_role: 内容分发网络(CDN)和针对攻击(DDoS)的保护服务提供商。有助于网站加载速度和安全性。
+hosting_cloudflare_disclaimer: Cloudflare 作为静态内容分发和保护的中间人。
+
+# AWS SES
+hosting_aws_title: 亚马逊网络服务(AWS)简单邮件服务(SES)
+hosting_aws_role: 交易电子邮件发送服务(确认、密码重置、协会重要通信)。
+hosting_aws_disclaimer: 此服务仅用于发送电子邮件通信。
+
+# Clés utilisées pour le template COOKIES
+cookie_short_title: Cookie政策
+cookie_page_title: Cookie 管理政策
+
+# Section 1 : Définition et Usage
+cookie_section1_title: 1. Cookie的定义和使用
+cookie_section1_p1: Cookie 是您在访问网站时放置在您的终端(计算机、平板电脑、手机)上的一个小文本文件。它用于存储会话或身份验证信息,以方便导航。
+
+# Section 2 : Types de Cookies Utilisés et Engagement
+cookie_section2_title: 2. 使用的Cookie类型和协会的承诺
+cookie_section2_p1_commitment: E-Cosplay 协会的网站承诺不使用任何需要同意的外部(第三方)Cookie 或广告或分析跟踪器。
+cookie_section2_p2_privacy: 我们的网站旨在尊重用户的隐私,无需使用收集数据用于商业或非豁免受众分析的跟踪工具即可运行。
+cookie_section2_p3_type_intro: "网站上可能存在的 Cookie 仅限于:"
+cookie_type_functional_strong: 严格必要的功能性 Cookie
+cookie_type_functional_details: "它们对于网站的正常运行和您使用其基本功能(例如:记住您的登录会话、安全管理)是必不可少的。根据法律,这些 Cookie 不需要您的同意。"
+
+# Section 3 : Gestion
+cookie_section3_title: 3. 您的Cookie管理
+cookie_section3_p1_browser_config: 尽管我们不使用外部 Cookie,但您仍可以配置您的浏览器来管理、接受或拒绝内部 Cookie。
+cookie_section3_p2_refusal_impact: 但是,拒绝严格必要的 Cookie 可能会影响对网站某些功能(例如:连接到会员空间)的访问。
+cookie_section3_p3_instructions_intro: "您可以查阅最常用浏览器上的 Cookie 管理说明:"
+cookie_browser_chrome: Chrome
+cookie_browser_link_chrome: Chrome 上的 Cookie 管理
+cookie_browser_firefox: Firefox
+cookie_browser_link_firefox: Firefox 上的 Cookie 管理
+cookie_browser_edge: Edge
+cookie_browser_link_edge: Edge 上的 Cookie 管理
+cookie_browser_safari: Safari
+cookie_browser_link_safari: Safari 上的 Cookie 管理
+
+# Clés utilisées pour le template LEGAL NOTICE
+legal_short_title: 法律声明
+legal_page_title: 法律声明
+
+# Section 1 : Objet du Site
+legal_section1_title: 1. 网站目的和推广
+legal_section1_p1: '%site_url%网站的主要目的是介绍 E-Cosplay 协会,宣传其活动,并促进与会员和公众的交流。'
+legal_section1_p2_intro: "网站的主要任务包括:"
+legal_section1_list1: 推广 E-Cosplay 协会的工作(比赛管理、研讨会、Coshopital)。
+legal_section1_list2: 介绍协会成员和组织的活动。
+legal_section1_list3: 提供有关协会在角色扮演领域的存在和“轨迹”(历程/工作)的信息和交流。
+legal_section1_list4_strong: 活动信息
+legal_section1_list4_details: 即将组织或举行的活动预告、角色扮演比赛的报名信息,或宣布协会作为访客或合作伙伴的出席。
+
+# Section 2 : Éditeur
+legal_section2_title: 2. 网站编辑者身份
+legal_section2_p1_editor_intro: "本网站由以下机构编辑:"
+legal_label_association_name: 协会名称
+legal_label_legal_status: 法律地位
+legal_status_details: 非营利协会(1901 年法律)
+legal_label_rna: RNA 编号
+legal_label_address: 注册地址
+legal_label_email: 电子邮件地址
+legal_label_publication_director: 出版总监
+legal_section2_p2_dev_intro: "网站的设计和开发由以下公司确保:"
+legal_label_company_name: 公司名称
+legal_label_role: 角色
+legal_role_dev: 负责网站开发的公司。
+legal_label_legal_form: 法律形式
+legal_legal_form_details: 有限责任公司(SARL)
+legal_label_siren: SIREN 编号
+legal_label_rcs: 注册(RCS)
+legal_label_technical_contact: 技术联系方式
+
+# Section 3 : Hébergement
+legal_section3_title: 3. 网站托管
+legal_section3_p1_host_intro: "网站由以下机构托管:"
+legal_host_address: 1600 Amphitheatre Parkway, Mountain View, CA 94043, 美国(注册地址)
+legal_host_data_location: Google Cloud Netherlands B.V., O'Mahony's Corner, Block R, Spencer Dock, Dublin 1, 爱尔兰。
+
+# Section 4 : Propriété Intellectuelle et Droit à l'Image
+legal_section4_title: 4. 知识产权和肖像权
+legal_section4_p1_ip: E-Cosplay 协会拥有网站上所有可访问元素的知识产权或使用权。
+legal_section4_p2_ip_details: 这尤其包括文本、图像、图形、徽标、图标和软件。
+legal_section4_subtitle_image_rights: 肖像权(角色扮演比赛)
+legal_section4_list1_strong: 图像发布
+legal_section4_list1_details: 比赛期间拍摄的照片和视频只有在参与者签署了肖像权授权后才能上传。
+legal_section4_list2_strong: 删除权
+legal_section4_list2_details: 任何参与者,即使在给予同意后,也可以通过书面请求联系 DPO(第 5 节)要求删除任何代表其的照片或视频。
+legal_section4_list3_strong: 未成年人保护
+legal_section4_list3_details: 即使未成年参与者的法定监护人给予了肖像权授权,该未成年人的面部也将系统性地进行模糊处理,以确保最大程度的保护。与成年人一样,未成年人或其监护人可以根据要求删除内容。
+legal_section4_p3_visual_content: "关于视觉内容(其他照片):本网站使用的照片来自 E-Cosplay 协会本身或其官方合作伙伴。在任何情况下,协会均保证已获得必要的发布授权。"
+legal_section4_p4_reproduction: 未经 E-Cosplay 协会事先书面授权,禁止以任何方式或过程复制、表示、修改、出版、改编网站的全部或部分元素。
+
+# Section 5 : RGPD et DPO
+legal_section5_title: 5. 个人数据保护(GDPR)
+legal_section5_p1_rgpd: 根据《通用数据保护条例》(GDPR),E-Cosplay 协会承诺保护所收集个人数据的机密性。如需了解任何信息或行使您在个人数据处理方面的 IT 和自由权利,您可以联系我们的数据保护官(DPO)。
+legal_label_dpo_name: 数据保护官(DPO)
+legal_label_dpo_contact: DPO 联系方式
+legal_label_dpo_num : DPO 编号
+legal_section5_p2_privacy_link: 更详细的隐私政策可在专门的 GDPR 政策页面上查阅。
+
+# Section 6 : Partenaires
+legal_section6_title: 6. 合作伙伴关系和广告
+legal_section6_p1_partners: E-Cosplay 协会网站上合作伙伴的展示是正式合作的结果。
+legal_section6_p2_agreement: 我们合作伙伴的徽标和信息展示已获得他们的明确同意,并通过签署合作文件或合同进行正式确认。
+legal_section6_p3_promotion: 作为对协会支持或工作的回报,E-Cosplay 在本网站上宣传和推广其合作伙伴,以感谢他们的承诺和对我们活动的贡献。
+
+# Section 7 : Limitations de Responsabilité
+legal_section7_title: 7. 责任限制
+legal_section7_p1_liability: E-Cosplay 协会不对用户在访问%site_url%网站时造成的直接和间接损害负责,这些损害是由于使用了不符合第 4 点规定的设备,或由于出现错误或不兼容性而导致的。
+legal_section7_p2_interactive: 互动空间(可以在联系区域提问)可供用户使用。E-Cosplay 协会保留删除此空间中任何违反法国适用法律(特别是与数据保护相关的规定)的内容的权利,恕不事先通知。
+
+# Section 8 : Droit applicable
+legal_section8_title: 8. 适用法律和管辖权
+legal_section8_p1_law: 与使用%site_url%网站相关的所有争议均受法国法律管辖。专属管辖权赋予拉昂的合格法院。
+# Clés utilisées pour le template RGPD
+
+rgpd_short_title: GDPR政策
+rgpd_page_title: 隐私政策(GDPR)
+rgpd_page_title_long: 隐私和 GDPR 政策
+rgpd_section1_title: 1. E-Cosplay 协会的承诺
+rgpd_section1_p1: E-Cosplay 协会承诺尊重用户的隐私,并以完全透明且符合《通用数据保护条例》(GDPR)的方式处理他们的个人数据。
+rgpd_section2_title: 2. 收集的个人数据和目的
+rgpd_section2_p1_commitment: E-Cosplay 协会采用严格的最小化数据收集政策。
+rgpd_section2_p2_data_collected: "我们不收集任何多余或过剩的信息。本网站上收集的个人数据仅用于以下精确目的:"
+rgpd_contact_form_title: 联系表格
+rgpd_contact_form_details: 通过联系表格传输的信息(姓名、名字、电子邮件地址、消息内容)仅用于回复您的请求和确保您的通信跟进。
+rgpd_contest_form_title: 比赛注册表
+rgpd_contest_form_details: 在角色扮演比赛的框架内,我们收集注册所需的数据,包括参与者提交的用于评估的媒体文件(音频、图像、视频)。这些数据与所有其他个人信息都受到同等严格的处理。
+rgpd_no_other_collection_title: 缺乏其他收集
+rgpd_no_other_collection_details: 不会出于分析或跟踪目的自动或间接收集任何其他数据。
+rgpd_section3_title: 3. 数据的机密性和安全性
+rgpd_section3_subtitle1: 数据不出售
+rgpd_section3_p1_no_resale: E-Cosplay 协会不以商业或其他目的向第三方转售、出租或以任何形式提供所收集的个人数据。您的数据在内部处理并保持机密。
+rgpd_section3_subtitle2: 文件安全和高级加密
+rgpd_section3_p2_encryption: 您的浏览器和我们网站之间的所有数据传输都通过%https%协议进行加密。此加密确保了您的信息在发送时的机密性和完整性。
+rgpd_encrypted_word: 在存储前以加密(cryptée)方式存储在服务器上
+rgpd_section3_p3_contest_encryption: 此外,比赛注册文件(音频、图像、视频)是%encrypted%。此额外的安全措施旨在防止在发生安全漏洞时未经授权的访问或盗窃。
+rgpd_local_server_text: 本地安装在托管机器上的加密服务器
+rgpd_key_rotation_text: 每两小时轮换一次加密密钥
+rgpd_no_decryption_key_text: 不拥有解密密钥
+rgpd_section3_p4_advanced_security: 数据加密依赖于一个%local_server%。我们使用严格的安全协议,特别是服务器自身的 IP 验证、机器上的隔离和%key_rotation%。目标是防止在发生安全违规时数据泄露。协会%no_decryption_key%;只有网站本身允许在网站请求时实际解密数据,从而保证托管服务商的零知识(Zero Knowledge)原则。
+rgpd_section3_subtitle3: 数据泄露程序
+rgpd_section3_p5_breach_intro: "如果发生个人数据泄露或违规,E-Cosplay 协会承诺严格遵守以下程序:"
+rgpd_breach_list1_strong: 通知相关人员
+rgpd_breach_list1_details: 相关人员将在发现违规后的最长 24 小时内联系并通知。
+rgpd_breach_list2_strong: 向当局申报
+rgpd_breach_list2_details: 将在发现违规后的最长 24 小时内向 CNIL(法国国家信息与自由委员会)和 ANSSI(法国国家信息系统安全局)进行申报。
+rgpd_breach_list3_strong: 完全透明
+rgpd_breach_list3_details: 将对违规的性质、可能受影响的数据以及采取的补救措施进行透明和完整的沟通。
+rgpd_section4_title: 4. 保留期限和自动删除
+rgpd_section4_subtitle1: 比赛注册数据
+rgpd_section4_p1_contest_data_intro: "为比赛收集的特定数据(注册表、音频/图像/视频文件、通过顺序、裁判评分)保留期限有限:"
+rgpd_conservation_duration_label: 保留期限
+rgpd_conservation_duration_contest: 相关活动结束后的 3 个月。
+rgpd_auto_deletion_label: 自动删除
+rgpd_auto_deletion_contest: 一旦此期限到期,这些数据将自动从我们的服务器中删除。
+rgpd_section4_subtitle2: 照片/视频的保留期限和肖像权
+rgpd_section4_p2_image_rights_intro: "关于比赛参与者的照片和视频(受肖像权授权约束):"
+rgpd_file_conservation_label: 文件保留
+rgpd_file_conservation_details: 原始媒体文件保留到参与者要求删除或权利到期。
+rgpd_authorization_duration_label: 图像授权期限
+rgpd_authorization_duration_details: 参与者给予的肖像权授权在 1 年后自动到期。如果候选人在该期限内重新注册参加新比赛,授权将从新注册之日起自动延长一年。
+rgpd_section4_subtitle3: 一般删除规则
+rgpd_section4_p3_general_deletion: 为了确保定期清理,所有与完整比赛活动相关的数据(包括所有注册和评分数据),如果日期超过 2 年,将自动从我们的数据库中删除。
+rgpd_section4_subtitle4: 其他数据
+rgpd_section4_p4_other_data: 联系表格数据仅在处理请求期间保留,并在合理的跟进期限(最长 6 个月)后自动删除。
+rgpd_section4_p5_rights_reminder: 您始终保留要求提前删除您的数据的权利(见第 5 节)。
+rgpd_section5_title: 5. 您的权利(访问权、纠正权和删除权)
+rgpd_section5_p1_rights_intro: "根据 GDPR,您对您的数据拥有以下权利:"
+rgpd_right_access: 访问权(知道保留了哪些数据)。
+rgpd_right_rectification: 纠正权(修改错误数据)。
+rgpd_right_erasure: 删除权或“被遗忘权”(要求删除您的数据)。
+rgpd_right_opposition: 反对和限制处理的权利。
+rgpd_section5_p2_contact_dpo: "要行使这些权利,您可以联系我们的数据保护官(DPO):"
+Accueil: "首页"
+Qui sommes-nous: "关于我们"
+Nos membres: "我们的成员"
+Nos événements: "我们的活动"
+Contact: "联系我们"
+open_main_menu_sr: "打开主菜单"
+open_cart_sr: "打开购物车"
+your_cart: "您的购物车"
+close_cart_sr: "关闭购物车"
+cart_empty: "您的购物车是空的。"
+subtotal_label: "小计"
+checkout_button: "去结账"
+shipping_disclaimer: "运费将在下一步计算。"
+footer_contact_title: "联系我们"
+footer_follow_us_title: "关注我们"
+footer_mission_description: |
+ E-Cosplay 是一个致力于在法国推广和组织角色扮演活动的协会。
+ 我们的使命是为爱好者提供一个平台,并展示创造性的才能。
+all_rights_reserved: "保留所有权利"
+association_status: "1901 年法律非营利协会。"
+legal_notice_link: "法律声明"
+cookie_policy_link: "Cookie 政策"
+hosting_link: "托管信息"
+rgpd_policy_link: "GDPR 政策"
+cgu_link: "使用条款"
+cgv_link: "销售条款"
+contact_page.title: "联系我们"
+contact_page.breadcrumb: "联系我们"
+breadcrumb.home: "首页"
+flash.success.strong: "消息已发送!"
+flash.error.strong: "消息错误!"
+contact_info.title: "保持联系"
+contact_info.subtitle: "无论是技术问题、合作机会还是简单的问候,我们都在这里为您服务。"
+contact_info.email: "电子邮件"
+contact_info.address: "邮政地址"
+contact_info.join_title: "加入协会"
+contact_info.join_text: "您想加入我们或获取有关会员资格的更多信息吗?请直接给我们发送电子邮件至:"
+form.title: "给我们留言"
+form.submit_button: "发送消息"
+contact_form.name.label: "名字"
+contact_form.surname.label: "姓氏"
+contact_form.subject.label: "主题"
+contact_form.tel.label: "电话(可选)"
+contact_form.message.label: "您的消息"
+form_email_label: "电子邮件地址"
+contact_form.message.placeholder: "输入您的问题或请求..."
+contact_form.tel.placeholder: "例如:06 01 02 03 04"
+contact_form.subject.placeholder: "您的消息主题"
+contact_form.email.placeholder: "您的邮箱@example.com"
+contact_form.surname.placeholder: "您的姓氏"
+contact_form.name.placeholder: "您的名字"
+members_page.title: "我们的成员和理事会"
+members_page.breadcrumb: "成员"
+members_page.board_title: "理事会成员"
+members_page.board_empty: "理事会成员名单即将公布。"
+members_page.all_title: "所有成员"
+members_page.all_empty: "目前找不到任何成员。"
+members_title: '成员'
+member_card.role: "角色"
+member_card.cosplay_label: "角色扮演者"
+member_card.yes: "是"
+member_card.no: "否"
+member_card.specifics: "特点"
+member_card.crosscosplay: "异装角色扮演者"
+member_card.trans: "跨性别"
+member_card.orientation_label: "取向"
+member_card.not_specified: "未指定"
+orientation.asexual: "无性恋"
+orientation.bisexual: "双性恋"
+orientation.demisexual: "半性恋"
+orientation.gay: "同性恋(男)"
+orientation.heterosexual: "异性恋"
+orientation.lesbian: "女同性恋"
+orientation.pansexual: "泛性恋"
+orientation.queer: "酷儿"
+orientation.questioning: "正在探索"
+orientation.other: "其他"
+home_page.title: "首页"
+Boutiques: 商店
+home_hero.title: "角色扮演爱好者的聚会点"
+home_hero.subtitle: "加入一个包容的社区,在这里,创造力、多样性和友谊是核心。"
+home_hero.button_members: "查看我们的成员"
+home_hero.button_contact: "联系我们"
+home_about.pretitle: "我们的故事"
+home_about.title: "所有粉丝的安全空间"
+home_about.text_1: "我们的协会旨在为所有服装艺术、极客文化和角色扮演游戏的粉丝提供一个友好且结构化的环境,总部位于上法兰西大区,地理位置优越,靠近泰尔涅、圣康坦和拉昂。"
+home_about.text_2: "我们相信个人表达至关重要。无论您是初学者还是经验丰富,是异装角色扮演者、跨性别者,还是只是对某个世界充满热情,您都在这里拥有一席之地。"
+home_activities.title: "我们共同做的事情"
+home_activities.cosplay_title: "角色扮演创作与分享"
+home_activities.cosplay_text: "提高您技能的研讨会(缝纫、盔甲、化妆)和主题摄影会。"
+home_activities.community_title: "活动和社区"
+home_activities.community_text: "组织地区聚会、大会外出和围绕动漫/漫画的棋盘游戏或讨论之夜。"
+home_activities.diversity_title: "多样性与支持"
+home_activities.diversity_text: "我们是所有人的支持支柱,包括异装角色扮演和热情欢迎跨性别成员和所有取向的人。"
+home_cta.title: "准备好分享您的热情了吗?"
+home_cta.subtitle: "立即加入,成为冒险的一部分。"
+home_cta.button: "立即加入"
+home_page.description: "欢迎来到 e-cosplay 社区!您的比赛、手工研讨会和互助参考。角色扮演适合所有人,加入我们的热情!总部位于上法兰西大区,地理位置优越,靠近泰尔涅、圣康坦和拉昂。"
+members_description: '发现我们角色扮演协会的活跃成员!认识为我们的活动注入活力的志愿者、评委和组织者。'
+contact_page.description: '如有任何关于角色扮演、活动或合作的问题,请联系我们!这里提供直接联系表格和创始人的电子邮件。'
+shop.title: "商店"
+shop.description: "探索我们协会的官方商店即将推出。"
+breadcrumb.shop: "商店"
+shop.status_title: "我们的商店即将推出!"
+shop.status_message: "我们正在积极准备我们的在线商店。您将在那里找到协会的独家产品。"
+shop.button_home: "返回首页"
+shop.button_contact: "联系我们"
+shop.status_notification: "关注我们的社交网络,成为第一个知道开业消息的人!"
+events.title: "活动 | 即将推出"
+events.description: "即将查看我们下一次活动、大会和社区聚会的日历。"
+breadcrumb.events: "活动"
+events.list_main_title: 活动
+events.no_events_title: "没有计划中的活动"
+events.no_events_message: "目前似乎没有计划中的活动。请稍后回来!"
+events.button_contact: "联系我们"
+login_link: 登录
+register_link: 注册
+breadcrumb.login: 登录
+label.email: 电子邮件地址
+label.password: 密码
+label.remember_me: 记住我
+button.sign_in: 登录
+link.forgot_password: 忘记密码?
+error.login_failed: 登录失败。
+security.login: 登录您的账户
+events.forgot_password: 忘记密码
+breadcrumb.forgot_password: 忘记密码
+text.enter_email_for_reset: 请输入您的电子邮件地址以接收重置链接。
+button.send_reset_link: 发送重置链接
+link.back_to_login: 返回登录
+events.reset_email_sent: 重置电子邮件已发送
+text.check_inbox_title: 检查您的收件箱 📥
+text.check_inbox_description: 包含重置密码链接的电子邮件已发送。可能需要几分钟才能到达。
+text.spam_folder_tip: 如果您没有看到,请检查您的垃圾邮件文件夹。
+events.reset_password: 重置密码
+breadcrumb.reset_password: 重置密码
+label.new_password: 新密码
+label.confirm_password: 确认新密码
+text.enter_new_password: 请输入并确认您的新密码。
+button.reset_password: 重置密码
+open_user_menu_sr: 打开用户菜单
+logged_in_as: 登录身份
+logout_link: 登出
+page.login: 登录
+logged_admin: 管理
+
+dons.impact_title: 您的捐赠的影响
+dons.impact_text: 通过捐赠,您直接为我们所有的活动做出贡献。您的支持实际帮助我们实现
+
+dons.title: 支持我们 - 向协会捐赠
+dons.description: 您的捐赠有助于支持我们的协会、组织活动、购买设备和资助网站。
+dons.page_title: 捐赠并支持我们的协会
+dons.introduction: 您的慷慨对于我们协会的生存和发展至关重要。每一笔捐赠,无论大小,都使我们能够实现我们的项目并确保我们的使命。
+dons.support_for_title: 您的贡献用于哪些方面?
+
+dons.item.events: 组织活动、研讨会和社区聚会。
+dons.item.equipment: 购买和维护我们活动所需的设备(工具、特定设备等)。
+dons.item.website_hosting: 资助本网站的托管和维护,确保我们的在线存在。
+dons.item.other_needs: 支付协会的运营费用和意外需求。
+
+dons.item.events_title: 活动组织
+dons.item.equipment_title: 设备购买
+dons.item.website_hosting_title: 网站资助
+dons.item.other_needs_title: 运营费用
+form.name_label: 您的姓名或昵称
+form.name_placeholder: 例如:张三或一位朋友
+form.email_label: 您的电子邮件地址
+form.email_placeholder: 您的邮箱@example.com
+form.amount_label: 捐赠金额
+form.message_label: 鼓励信息
+form.message_placeholder: 给团队留个小纸条(可选)
+form.optional: 可选
+form.submit_button_dons: 捐赠并继续付款
+dons.thanks_note: 非常感谢您的宝贵支持。
+dons.make_a_donation_title: 采取行动
+dons.call_to_action_text: 点击下面的按钮,通过我们的合作平台安全地进行捐赠。
+
+thank_you.title: 非常感谢您的捐赠!
+thank_you.message_main: "您的慷慨非常宝贵,将使我们能够继续我们的使命:组织活动、购买设备并使我们的协会活跃起来。"
+thank_you.mount_received: 收到的您的支持金额
+thank_you.email_sent_title: 您的确认正在发送中
+thank_you.email_sent_info: 一旦我们的合作伙伴确认付款,您将收到一封包含您捐赠所有详细信息和收据的电子邮件。此过程通常需要几分钟。
+
+thank_you. email_recipient: 电子邮件已发送至
+thank_you.back_home_button: 返回首页
+thank_you.amount_received: 收到的您的支持金额
+
+error.not_found_title: 找不到页面
+error.not_found_description: 抱歉,您要找的页面不存在或已被移动。请检查地址或返回首页。
+error.generic_title: 糟糕,发生了一个错误
+error.generic_description: 我们遇到了一个意外的服务器问题。请稍后重试。如果错误仍然存在,请联系技术支持。
+breadcrumb.dons: 捐赠
+Dons: 捐赠
+
+shop.welcome_title: 欢迎来到 E-Cosplay 商店
+shop.categories_title: 分类
+shop.category_cosplay: 完整角色扮演服
+shop.category_wig: 假发和接发
+shop.category_props: 配件和道具
+shop.category_retouches: 修改和修补
+shop.product_name: 角色扮演物品
+shop.product_short_desc: 即穿、高品质、限量版。
+shop.button_all_products: 查看所有产品
+shop.tag_handmade: 手工制作
+shop.tag_custom: 定制
+shop.tag_promo: 促销
+shop.state_new: 全新
+shop.state_used: 二手
+home_partners.pretitle: "我们的盟友"
+home_partners.title: "合作协会"
+home_partners.subtitle: "我们与拥有共同价值观的组织携手合作,以丰富您的体验。"
+breadcrumb.who: "我们的协会在 %s"
+who_page.title: "我们的协会在 %s"
+who_page.description: "发现我们是谁,我们的价值观和我们在 %s 的活动。"
+who_page.city_pretitle: "我们位于:"
+who_page.activity_intro: "我们的主要活动包括:"
+timeline_title: "我们的时间线"
+event_creation_date: "2025年3月15日"
+event_creation_text_title: "正式成立"
+event_creation_text: "e-Cosplay 协会的正式声明和注册。"
+event_partnership_date: "2025年8月1日"
+event_partnership_text_title: "与 Miss & Mister Diamantissime 委员会合作"
+event_partnership_text: "与 Miss & Mister Diamantissime 委员会签约"
+event_first_show_date: "2025年9月14日"
+event_first_show_title: "首次参与 'House Of Geek 第四届'"
+event_first_show_text: "我们的第一个大型公共活动,设有展位、角色扮演游行和角色扮演比赛管理。"
+event_miss_tergnier_date: "2025年9月15日"
+event_miss_tergnier_title: "2025年泰尔涅小姐合作"
+event_miss_tergnier_text: "与 2025年泰尔涅小姐签约合作。"
+event_website_launch_date: "2025年11月15日"
+event_website_launch_title: "网站启动"
+event_website_launch_text: "我们的官方平台上线,用于宣传我们的活动、管理注册和分享我们的创作。"
+product_add_to_cart: "加入购物车"
+product_ref: "参考编号"
+product_state: "状态"
+product_state_new: "全新"
+product_state_used: "二手"
+product_features_title: "特点"
+product_handmade: "手工制作(手工艺品)"
+product_not_handmade: "工业/制造"
+product_custom: "独一无二(定制)"
+product_not_custom: "标准商品"
+product_short_desc_title: "快速概览"
+product_long_desc_title: "详细描述"
+product_estimated_delivery: "预计交货时间:2-5个工作日。"
+product_shipping_methods: "通过 Mondial Relay / Colissimo 交付,起价 6€ TTC"