13-05-2026 implementation FR

This commit is contained in:
Kevin Adametz 2026-05-13 17:33:52 +02:00
parent 245c281541
commit 70240d2b6a
61 changed files with 4472 additions and 2 deletions

View file

@ -30,7 +30,8 @@
"LARAVEL_SAIL": "1" "LARAVEL_SAIL": "1"
}, },
"mounts": [ "mounts": [
"source=${localWorkspaceFolder},target=/var/www/html,type=bind,consistency=cached" "source=${localWorkspaceFolder},target=/var/www/html,type=bind,consistency=cached",
"source=/Users/pandora/Library/Mobile Documents/iCloud~md~obsidian/Documents/DEV-Vault/mivita,target=/var/www/html/docs,type=bind",
], ],
// WICHTIG: Nur noch der Vite-Port muss weitergeleitet werden, den Rest macht das Mutterschiff. // WICHTIG: Nur noch der Vite-Port muss weitergeleitet werden, den Rest macht das Mutterschiff.
"forwardPorts": [ "forwardPorts": [

5
.env
View file

@ -177,3 +177,8 @@ DHL_SENDER_PHONE="+49 123 456789"
DHL_API_TYPE=developer DHL_API_TYPE=developer
DHL_API_SECRET=OyoeePEbYmY1EuOG DHL_API_SECRET=OyoeePEbYmY1EuOG
# OpenAI API Key
OPENAI_API_KEY=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
OPENAI_API_URL=https://api.openai.com/v1/chat/completions
OPENAI_MODEL=gpt-5.4-mini
OPENAI_TIMEOUT=60

View file

@ -0,0 +1,551 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Http\Client\RequestException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;
/*
php artisan translation:backfill-french-db --dry-run
php artisan translation:backfill-french-db
php artisan translation:backfill-french-db --models=products,ingredients --limit=10 --dry-run
php artisan translation:backfill-french-db --overwrite
*/
class BackfillFrenchDatabaseTranslations extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'translation:backfill-french-db
{--driver=openai : Translation driver: openai or copy-source}
{--models= : Comma-separated models: products,ingredients,categories,shippings,user_levels,dashboard_news}
{--source=de : Source language}
{--target=fr : Target language}
{--limit= : Limit source rows per model}
{--overwrite : Replace existing non-empty target translations}
{--test-api : Translate sample texts and print them without touching the database}
{--dry-run : Show planned writes without changing the database}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Backfills French database translations for the admin translation module';
/**
* Execute the console command.
*/
public function handle(): int
{
$driver = (string) $this->option('driver');
$sourceLanguage = Str::lower((string) $this->option('source'));
$targetLanguage = Str::lower((string) $this->option('target'));
$dryRun = (bool) $this->option('dry-run');
$overwrite = (bool) $this->option('overwrite');
$limit = $this->option('limit') !== null ? (int) $this->option('limit') : null;
if (! in_array($driver, ['openai', 'copy-source'], true)) {
$this->error('Unsupported driver. Use openai or copy-source.');
return self::FAILURE;
}
if ($driver === 'openai' && blank(config('services.openai.api_key'))) {
$this->error('OPENAI_API_KEY is missing. Set it on the live server or use --driver=copy-source for a dry run.');
return self::FAILURE;
}
if ((bool) $this->option('test-api')) {
return $this->runApiTest($driver, $sourceLanguage, $targetLanguage);
}
$models = $this->selectedModels();
if ($models === []) {
$this->error('No valid models selected.');
return self::FAILURE;
}
$this->ensureTargetLanguage($targetLanguage, $dryRun);
$summary = [
'created' => 0,
'updated' => 0,
'skipped' => 0,
'empty' => 0,
];
foreach ($models as $modelName => $spec) {
$this->info("Processing {$modelName}...");
try {
$modelSummary = $this->backfillModel($modelName, $spec, $driver, $sourceLanguage, $targetLanguage, $overwrite, $dryRun, $limit);
} catch (RequestException $exception) {
$this->reportOpenAiException($exception);
return self::FAILURE;
}
foreach ($summary as $key => $value) {
$summary[$key] = $value + $modelSummary[$key];
}
}
$this->newLine();
$this->info("Created: {$summary['created']}");
$this->info("Updated: {$summary['updated']}");
$this->info("Skipped existing: {$summary['skipped']}");
$this->info("Skipped empty source: {$summary['empty']}");
return self::SUCCESS;
}
private function runApiTest(string $driver, string $sourceLanguage, string $targetLanguage): int
{
if ($driver !== 'openai') {
$this->error('The API test requires --driver=openai.');
return self::FAILURE;
}
$this->info('OpenAI translation API test');
$this->line('Model: '.config('services.openai.model'));
$this->line("Language: {$sourceLanguage} -> {$targetLanguage}");
$this->newLine();
foreach ($this->apiTestSamples() as $index => $sourceValue) {
try {
$translatedValue = $this->translateWithOpenAI($sourceValue, $sourceLanguage, $targetLanguage);
} catch (RequestException $exception) {
$this->reportOpenAiException($exception);
return self::FAILURE;
}
$this->line('['.($index + 1).'] DE: '.$sourceValue);
$this->line('['.($index + 1).'] FR: '.$translatedValue);
$this->newLine();
}
$this->info('API test completed.');
return self::SUCCESS;
}
/**
* @return array<int, string>
*/
private function apiTestSamples(): array
{
return [
'Aloe Vera Gel für die tägliche Pflege der Haut.',
'Der Berater kann seinem Kunden ein passendes Abo empfehlen.',
'MIVITA Produktbeschreibung mit :amount ml Inhalt und PayPal Zahlung.',
];
}
private function reportOpenAiException(RequestException $exception): void
{
$response = $exception->response;
$status = $response->status();
$errorCode = (string) $response->json('error.code');
$errorType = (string) $response->json('error.type');
$message = (string) ($response->json('error.message') ?: $exception->getMessage());
$this->error("OpenAI API request failed with HTTP {$status}.");
if ($errorCode !== '') {
$this->line("Code: {$errorCode}");
}
if ($errorType !== '') {
$this->line("Type: {$errorType}");
}
$this->line("Message: {$message}");
if ($status === 429 || $errorCode === 'insufficient_quota') {
$this->warn('Bitte prüfe im OpenAI Dashboard das Billing, das Projekt-Budget, Usage-Limits und ob der OPENAI_API_KEY zum richtigen Projekt gehört.');
}
}
/**
* @param array<string, mixed> $spec
* @return array{created: int, updated: int, skipped: int, empty: int}
*/
private function backfillModel(
string $modelName,
array $spec,
string $driver,
string $sourceLanguage,
string $targetLanguage,
bool $overwrite,
bool $dryRun,
?int $limit
): array {
$summary = [
'created' => 0,
'updated' => 0,
'skipped' => 0,
'empty' => 0,
];
$query = DB::table($spec['source_table'])
->select(array_merge(['id'], $spec['fields']))
->orderBy('id');
if (Schema::hasColumn($spec['source_table'], 'deleted_at')) {
$query->whereNull('deleted_at');
}
if ($limit !== null && $limit > 0) {
$query->limit($limit);
}
$totalRows = $this->countRows($spec, $limit);
$totalFields = count($spec['fields']);
$currentRow = 0;
$this->line("Status {$modelName}: {$totalRows} Datensätze, {$totalFields} Felder.");
foreach ($query->cursor() as $row) {
$currentRow++;
$this->line("Datensatz {$currentRow}/{$totalRows}: {$modelName}#{$row->id}");
foreach ($spec['fields'] as $field) {
$statusTarget = "{$modelName}#{$row->id}.{$field}";
$sourceValue = trim((string) ($row->{$field} ?? ''));
if ($sourceValue === '') {
$summary['empty']++;
$this->line(" - {$statusTarget}: Quelle leer, übersprungen.");
continue;
}
$existingValue = $this->existingTranslationValue($spec, (int) $row->id, $field, $targetLanguage);
if (! $overwrite && filled($existingValue)) {
$summary['skipped']++;
$this->line(" - {$statusTarget}: vorhandene Übersetzung, übersprungen.");
continue;
}
$this->line(" - {$statusTarget}: ".$this->translationStatusText($field, $spec, $driver).'...');
$translatedValue = $this->translateValue($sourceValue, $field, $spec, $driver, $sourceLanguage, $targetLanguage);
if ($dryRun) {
$action = $existingValue === null ? 'create' : 'update';
$this->line(" - {$statusTarget}: [dry-run] würde {$action}.");
} else {
$this->storeTranslationValue($spec, (int) $row->id, $field, $targetLanguage, $translatedValue);
$action = $existingValue === null ? 'erstellt' : 'aktualisiert';
$this->line(" - {$statusTarget}: gespeichert ({$action}).");
}
if ($existingValue === null) {
$summary['created']++;
} else {
$summary['updated']++;
}
}
}
return $summary;
}
/**
* @param array<string, mixed> $spec
*/
private function existingTranslationValue(array $spec, int $sourceId, string $field, string $targetLanguage): ?string
{
if (($spec['storage'] ?? 'table') === 'json') {
$translations = $this->jsonTranslations($spec, $sourceId, $field);
$value = $translations[$targetLanguage] ?? null;
return $value === null ? null : trim((string) $value);
}
return DB::table($spec['translation_table'])
->where([
'language' => $targetLanguage,
$spec['foreign_key'] => $sourceId,
'key' => $field,
])
->value('value');
}
/**
* @param array<string, mixed> $spec
*/
private function storeTranslationValue(array $spec, int $sourceId, string $field, string $targetLanguage, string $translatedValue): void
{
if (($spec['storage'] ?? 'table') === 'json') {
$translationColumn = 'trans_'.$field;
$translations = $this->jsonTranslations($spec, $sourceId, $field);
$translations[$targetLanguage] = $translatedValue;
$data = [
$translationColumn => json_encode($translations, JSON_UNESCAPED_UNICODE),
];
if (Schema::hasColumn($spec['source_table'], 'updated_at')) {
$data['updated_at'] = now();
}
DB::table($spec['source_table'])
->where('id', $sourceId)
->update($data);
return;
}
DB::table($spec['translation_table'])->updateOrInsert(
[
'language' => $targetLanguage,
$spec['foreign_key'] => $sourceId,
'key' => $field,
],
[
'value' => $translatedValue,
'created_at' => now(),
'updated_at' => now(),
]
);
}
/**
* @param array<string, mixed> $spec
* @return array<string, string>
*/
private function jsonTranslations(array $spec, int $sourceId, string $field): array
{
$translationColumn = 'trans_'.$field;
$value = DB::table($spec['source_table'])
->where('id', $sourceId)
->value($translationColumn);
if (is_array($value)) {
return $value;
}
$decodedValue = json_decode((string) $value, true);
return is_array($decodedValue) ? $decodedValue : [];
}
/**
* @param array<string, mixed> $spec
*/
private function countRows(array $spec, ?int $limit): int
{
$query = DB::table($spec['source_table']);
if (Schema::hasColumn($spec['source_table'], 'deleted_at')) {
$query->whereNull('deleted_at');
}
$count = $query->count();
if ($limit !== null && $limit > 0) {
return min($count, $limit);
}
return $count;
}
/**
* @param array<string, mixed> $spec
*/
private function translationStatusText(string $field, array $spec, string $driver): string
{
if ($driver === 'copy-source' || in_array($field, $spec['copy_fields'] ?? [], true)) {
return 'übernehme Quelle';
}
return 'übersetze via OpenAI';
}
/**
* @param array<string, mixed> $spec
*/
private function translateValue(string $sourceValue, string $field, array $spec, string $driver, string $sourceLanguage, string $targetLanguage): string
{
if ($driver === 'copy-source' || in_array($field, $spec['copy_fields'] ?? [], true)) {
return $sourceValue;
}
return $this->translateWithOpenAI($sourceValue, $sourceLanguage, $targetLanguage);
}
private function translateWithOpenAI(string $sourceValue, string $sourceLanguage, string $targetLanguage): string
{
[$preparedValue, $protectedValues] = $this->protectTerms($sourceValue);
$payload = [
'model' => config('services.openai.model'),
'temperature' => 0.1,
'messages' => [
[
'role' => 'system',
'content' => implode(' ', [
'You translate ecommerce and MLM CRM content for mivita.care.',
'Translate from German to French unless another source/target language is requested.',
'Return only the translated text, without quotes, notes, markdown, explanations, or alternative variants.',
'Preserve HTML tags, URLs, numbers, units, placeholders, and tokens like __MIVITA_TRANSLATION_TOKEN_0__ exactly.',
'Keep brand names and protected product terms unchanged.',
'Use consistent terminology: Berater = conseiller, Kunde = client, Abo = abonnement.',
]),
],
[
'role' => 'user',
'content' => "Source language: {$sourceLanguage}\nTarget language: {$targetLanguage}\nText:\n{$preparedValue}",
],
],
];
$response = Http::withToken((string) config('services.openai.api_key'))
->acceptJson()
->timeout((int) config('services.openai.timeout', 60))
->retry(2, 1000, function ($exception): bool {
if ($exception instanceof RequestException && $exception->response->status() === 429) {
return false;
}
return true;
})
->post((string) config('services.openai.url'), $payload)
->throw()
->json('choices.0.message.content');
return $this->restoreTerms(trim((string) $response), $protectedValues);
}
/**
* @return array{0: string, 1: array<string, string>}
*/
private function protectTerms(string $value): array
{
$protectedValues = [];
$patterns = [
'/(:[A-Za-z_][A-Za-z0-9_-]*)/u',
'/(\{\{\s*[^}]+\s*\}\})/u',
'/\b(MIVITA|PAYONE|PayPal|DHL|INCI|CBD|GRÜNE SEELE|Aloe Vera)\b/u',
];
foreach ($patterns as $pattern) {
$value = preg_replace_callback($pattern, function (array $matches) use (&$protectedValues): string {
$token = '__MIVITA_TRANSLATION_TOKEN_'.count($protectedValues).'__';
$protectedValues[$token] = $matches[1];
return $token;
}, $value);
}
return [$value, $protectedValues];
}
/**
* @param array<string, string> $protectedValues
*/
private function restoreTerms(string $value, array $protectedValues): string
{
return str_replace(array_keys($protectedValues), array_values($protectedValues), $value);
}
private function ensureTargetLanguage(string $targetLanguage, bool $dryRun): void
{
if ($dryRun) {
$this->line("[dry-run] ensure trans_languages.{$targetLanguage}");
return;
}
DB::table('trans_languages')->updateOrInsert(
['language' => $targetLanguage],
[
'name' => $targetLanguage === 'fr' ? 'Französisch' : Str::upper($targetLanguage),
'created_at' => now(),
'updated_at' => now(),
]
);
}
/**
* @return array<string, array<string, mixed>>
*/
private function selectedModels(): array
{
$availableModels = $this->translationModels();
$selectedModels = $this->option('models');
if (blank($selectedModels)) {
return $availableModels;
}
return collect(explode(',', (string) $selectedModels))
->map(fn (string $model): string => trim($model))
->filter()
->mapWithKeys(fn (string $model): array => [$model => $availableModels[$model] ?? null])
->filter()
->all();
}
/**
* @return array<string, array<string, mixed>>
*/
private function translationModels(): array
{
return [
'products' => [
'source_table' => 'products',
'translation_table' => 'trans_products',
'foreign_key' => 'product_id',
'fields' => ['name', 'copy', 'description', 'usage', 'ingredients'],
],
'ingredients' => [
'source_table' => 'ingredients',
'translation_table' => 'trans_ingredients',
'foreign_key' => 'ingredient_id',
'fields' => ['name', 'inci', 'effect'],
'copy_fields' => ['inci'],
],
'categories' => [
'source_table' => 'categories',
'translation_table' => 'trans_categories',
'foreign_key' => 'categorie_id',
'fields' => ['name', 'headline'],
],
'shippings' => [
'source_table' => 'shippings',
'translation_table' => 'trans_shippings',
'foreign_key' => 'shipping_id',
'fields' => ['name'],
],
'user_levels' => [
'source_table' => 'user_levels',
'translation_table' => 'trans_user_levels',
'foreign_key' => 'user_level_id',
'fields' => ['name'],
],
'dashboard_news' => [
'storage' => 'json',
'source_table' => 'dashboard_news',
'fields' => ['title', 'teaser', 'content'],
],
];
}
}

View file

@ -52,7 +52,7 @@ return [
// 'ewo' => ['name' => 'Ewondo', 'script' => 'Latn', 'native' => 'ewondo', 'regional' => ''], // 'ewo' => ['name' => 'Ewondo', 'script' => 'Latn', 'native' => 'ewondo', 'regional' => ''],
// 'ee' => ['name' => 'Ewe', 'script' => 'Latn', 'native' => 'eʋegbe', 'regional' => ''], // 'ee' => ['name' => 'Ewe', 'script' => 'Latn', 'native' => 'eʋegbe', 'regional' => ''],
// 'fil' => ['name' => 'Filipino', 'script' => 'Latn', 'native' => 'Filipino', 'regional' => 'fil_PH'], // 'fil' => ['name' => 'Filipino', 'script' => 'Latn', 'native' => 'Filipino', 'regional' => 'fil_PH'],
// 'fr' => ['name' => 'French', 'script' => 'Latn', 'native' => 'français', 'regional' => 'fr_FR'], 'fr' => ['name' => 'French', 'script' => 'Latn', 'native' => 'français', 'regional' => 'fr_FR'],
// 'fr-CA' => ['name' => 'Canadian French', 'script' => 'Latn', 'native' => 'français canadien', 'regional' => 'fr_CA'], // 'fr-CA' => ['name' => 'Canadian French', 'script' => 'Latn', 'native' => 'français canadien', 'regional' => 'fr_CA'],
// 'fy' => ['name' => 'Western Frisian', 'script' => 'Latn', 'native' => 'frysk', 'regional' => 'fy_DE'], // 'fy' => ['name' => 'Western Frisian', 'script' => 'Latn', 'native' => 'frysk', 'regional' => 'fy_DE'],
// 'fur' => ['name' => 'Friulian', 'script' => 'Latn', 'native' => 'furlan', 'regional' => 'fur_IT'], // 'fur' => ['name' => 'Friulian', 'script' => 'Latn', 'native' => 'furlan', 'regional' => 'fur_IT'],

View file

@ -35,4 +35,11 @@ return [
'secret' => env('STRIPE_SECRET'), 'secret' => env('STRIPE_SECRET'),
], ],
'openai' => [
'api_key' => env('OPENAI_API_KEY'),
'url' => env('OPENAI_API_URL', 'https://api.openai.com/v1/chat/completions'),
'model' => env('OPENAI_MODEL', 'gpt-5.4-mini'),
'timeout' => env('OPENAI_TIMEOUT', 60),
],
]; ];

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
DB::table('trans_languages')->updateOrInsert(
['language' => 'fr'],
[
'name' => 'Französisch',
'created_at' => now(),
'updated_at' => now(),
]
);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
DB::table('trans_languages')
->where('language', 'fr')
->delete();
}
};

View file

@ -0,0 +1,417 @@
# Entwicklungskonzept: Backoffice Dashboard & Interaktivität
Datum: 13.05.2026
Quelle: `docs/salescenter/Todos Backoffice.md`
## Zielbild
Das Partner-Backoffice soll von einer statischen Monats-Kachelansicht zu einer klickbaren, linienbasierten Statistik ausgebaut werden. Führungskräfte sollen von der Gesamtübersicht über Linien und Generationen bis zu einzelnen Kunden, Partnern und Abos navigieren können.
Kernziel ist eine einheitliche Datenbasis für:
- Dashboard-Kennzahlen pro Linie 1 bis 8 inklusive Summenzeile
- Detailansichten je Linie, Firstline und Kennzahl
- Kundenabos, Teamabos, Kundenabos im Team, Umsatz und Punkte
- neue Spezial-Kennzahl "1000 Punkte Shop"
- saubere Begrifflichkeit und rechtssichere Sichtbarkeit in Incentive-Ranglisten
## Bestandsaufnahme im System
### Dashboard
Aktueller Einstieg:
- Route: `GET /home`
- Controller: `App\Http\Controllers\HomeController@show`
- View: `resources/views/home.blade.php`
- Statistik-Partial: `resources/views/dashboard/_statistics.blade.php`
Die aktuelle Statistik wird direkt im Blade-Partial berechnet. Sie nutzt unter anderem:
- `App\Models\UserBusiness` für gespeicherte Monatswerte und Payline-Punkte
- `App\Models\UserSalesVolume` für Kunden-/Shop-Punkte
- `App\Models\UserAbo` für eigene Abos, Kundenabos und Teamabos
- rekursive Sponsor-Abfragen über `users.m_sponsor`
Bewertung:
- Die vorhandene Ansicht ist ein guter Einstieg, aber fachlich zu grob.
- Es gibt noch keine Linien 1 bis 8, keine Summenzeile und keine Drill-down-Routen.
- Die Kennzahl "Kundenabos" vermischt aktuell eigene Abos und Kundenabos.
- "Team-Abos" zählt aktuell Beraterabos im Team, aber nicht die separat geforderten Kundenabos im Team.
### Team- und Abo-Bereich
Relevante Routen und Controller:
- `User\TeamController@structure` für Strukturansicht
- `User\TeamController@show` und `datatableOptimized` für Teamliste
- `User\TeamController@showAbos` für Team-Beraterabos
- `User\TeamController@showTeamCustomerAbos` für Kundenabos im Team
- `User\TeamController@detailAbo` für Abo-Details
Relevante Daten:
- `UserAbo::is_for = 'me'` bedeutet Berater-/Eigenabo
- `UserAbo::is_for = 'ot'` bedeutet Kundenabo
- `UserAbo::user_id` ist der Bestell-/Abo-User
- `UserAbo::member_id` ist der zugeordnete Berater
- `UserAbo::next_date` liefert die nächste Abo-Ausführung
- `UserAbo::getTotalPoints()` berechnet Punkte aus Abo-Items und Produkten
- `AboHelper::getTeamUserIds()` liefert Downline-User-IDs
- `AboHelper::getMonthlyAboCounts()` kennt bereits die Scopes `team_abos` und `team_cust_abos`
Bewertung:
- Viele Datenquellen für die geforderten Listen existieren bereits.
- Die Logik ist aber auf mehrere Controller, Blades und Helper verteilt.
- Für das neue Dashboard sollte die Logik zentralisiert werden, statt weitere Berechnungen in Blade-Dateien zu ergänzen.
### Business- und Punkteberechnung
Relevante Bausteine:
- `App\Services\BusinessPlan\TreeCalcBotOptimized`
- `App\Models\UserBusiness`
- `App\Models\UserSalesVolume`
- `App\Services\BusinessPlan\SalesPointsVolume`
Bewertung:
- Für Monats- und Teamwerte sollte bevorzugt auf gespeicherte Businessdaten zurückgegriffen werden.
- Live-Berechnung über TreeCalcBot ist als Fallback sinnvoll, darf aber nicht bei jedem Seitenaufruf ungefiltert große Strukturen neu berechnen.
- Die neue Drill-down-Logik benötigt klare Regeln, ob sie Live-Daten oder gespeicherte Monats-Snapshots zeigt.
### Incentives
Relevante Dateien:
- `App\Http\Controllers\User\IncentiveController`
- `resources/views/user/incentive/show.blade.php`
- `App\Models\IncentiveParticipant`
- `App\Services\Incentive\IncentiveTracker`
Status:
- Teilnahme-Opt-in existiert über `accepted_terms_at`.
- Ranking wird aktuell mit `paginate(100)` angezeigt.
- Nicht zustimmende Teilnehmer werden für normale User anonymisiert.
- VIP-Ansicht sieht zusätzliche Hinweise zur Zustimmung.
Lücke zum Briefing:
- Es gibt noch keine separate Zustimmung "Name/Fotos/Land in Rangliste sichtbar".
- Foto und Land sind in der aktuellen Rangliste nicht als sichtbare Standardspalten umgesetzt.
- Rechtliche Freigabe muss fachlich vor der technischen Umsetzung geklärt werden.
### Checkout-Herkunft
Relevante Dateien:
- `App\Http\Controllers\Web\CheckoutController`
- `App\Repositories\CheckoutRepository`
- `App\Models\ShoppingUser`
Status:
- `CheckoutController::validateCheckoutData()` validiert Basisdaten, aber keine Pflichtfrage "Von wem hast du von Mivita erfahren?"
- `ShoppingUser` nutzt `is_from` für den technischen Ursprung wie `shopping`, `homeparty` oder `collection`.
- Ein fachliches Herkunfts-/Empfehlungsfeld existiert nicht als sauber getrennte Datenquelle.
### Storno und Punkterückführung
Relevante Dateien:
- `App\Repositories\InvoiceRepository`
- `App\Services\BusinessPlan\SalesPointsVolume`
- `App\Services\Incentive\IncentiveTracker`
Status:
- Beim Erstellen einer Stornorechnung ruft `InvoiceRepository::createCancellation()` die Punktekorrektur auf.
- `SalesPointsVolume::cancelSalesPointsVolume()` erstellt einen negativen `UserSalesVolume`-Eintrag mit Status `6`.
- Danach wird der Monat neu berechnet und `IncentiveTracker::trackStorno()` informiert.
Risiken:
- Wenn zur Originalrechnung kein `UserSalesVolume` existiert, wird nur geloggt und keine Punktekorrektur erstellt.
- Der negative Storno-Eintrag wird aktuell dem aktuellen Monat zugeordnet, nicht zwingend dem ursprünglichen Umsatzmonat.
- Fachlich muss entschieden werden, ob Stornos im Stornomonat oder im Ursprungsmonat wirken sollen.
## Fachliche Prüfung der To-dos
### 1. Überarbeitetes Dashboard & KPI-Übersicht
Umsetzung sinnvoll, aber nicht als Erweiterung des bestehenden Blade-Partials. Benötigt wird ein dedizierter Service, der die Kennzahlen pro Linie liefert.
Vorgeschlagene Tabelle Stufe 1:
- Linie
- Anzahl Berater
- Umsatz gesamt
- Eigen-/Beraterabos im Team
- eigene Kundenabos
- Kundenabos im Team
- Neupartner
- 1000 Punkte Shop
- Summe
Wichtig:
- "Teamkundenabos" sollte als Begriff für Kundenabos der Downline verwendet werden.
- "Teamabos" sollte nur für Berater-/Eigenabos im Team verwendet werden.
- Eigene Abos dürfen nicht in Kundenabos eingerechnet werden.
### 2. Interaktivität & Deep Dive
Umsetzung über eigene Backoffice-Statistik-Routen statt über große Modals im Dashboard.
Vorgeschlagene Stufen:
- Stufe 1: Linienübersicht `/user/backoffice/statistics`
- Stufe 2: Linien-/Firstline-Detail `/user/backoffice/statistics/line/{line}`
- Stufe 3: Kennzahlenliste `/user/backoffice/statistics/details?line=...&metric=...&user=...`
Jede Zahl erhält einen Link auf eine gefilterte Detailansicht. Die Detailansicht sollte die Query-Parameter sichtbar halten, damit Support und Fachbereich Ergebnisse reproduzieren können.
### 3. Spezial-Kennzahl "1000 Punkte Shop"
Definition muss vor Umsetzung final geklärt werden.
Vorschlag für Version 1:
- Zeitraum: gewählter Monat/Jahr des Dashboards
- Personenkreis: Downline des eingeloggten Users
- Schwelle: `UserSalesVolume` Shop-/KP-Summe pro Partner >= 1000 Punkte
- Sortierung: Volumen absteigend
- Detailspalten: Name, Account, Linie/Generation, Shop-Punkte, Gesamt-KP, Umsatz netto
Offene Fachfrage:
- Meint "Kundenumsatz" nur Shop-Umsatz (`month_shop_points`) oder alle Kundenpunkte inklusive Abo-/Beraterkontext?
### 4. Bestellformular: "Von wem hast du von Mivita erfahren?"
Technisch sollte ein neues fachliches Feld eingeführt werden, nicht `is_from` zweckentfremdet werden.
Vorschlag:
- Migration für `shopping_users.referral_source_name` oder ähnliches Feld
- optional zusätzlich auf `shopping_orders`, wenn die Information revisionssicher pro Bestellung eingefroren werden soll
- Pflichtvalidierung in `CheckoutController::validateCheckoutData()`
- Anzeige im Checkout-Formular und optional im Admin-/Bestelldetail
- später exportierbar für Marketingauswertung
Zu klären:
- Freitext oder Auswahl plus Freitext?
- Pflicht nur im Webshop/Bestelllink oder auch bei Salescenter-, Homeparty- und Collection-Flows?
- Soll eine konkrete Beraterzuordnung daraus entstehen oder nur Tracking?
### 5. Stornoprozess
Die Grundlogik existiert. Vor einer fachlichen Freigabe braucht es Tests und eine Periodenentscheidung.
Prüfpunkte:
- Storno einer Beraterbestellung erzeugt negative Punkte beim richtigen Berater.
- Storno einer Kunden-/Shopbestellung erzeugt negative Punkte im richtigen Umsatztyp.
- Storno einer Abo-Bestellung wirkt korrekt auf Incentive-Logs.
- Storno ohne vorhandenen `UserSalesVolume` ist sichtbar und lösbar, nicht nur ein Log-Eintrag.
- Businessdaten nach Storno werden für betroffenen Monat/Jahr aktualisiert oder als neu zu berechnen markiert.
### 6. Rechtliches & Sichtbarkeit in Incentives
Die bestehende Teilnahmezustimmung sollte nicht automatisch als Freigabe für öffentliche Namens-/Fotoanzeige interpretiert werden.
Vorschlag:
- eigenes Feld auf `incentive_participants`, z. B. `ranking_visibility_accepted_at`
- Button/Checkbox in der Incentive-Seite: "Ich stimme zu, dass mein Name, Foto und Land in der Rangliste sichtbar sind"
- Anzeige von Name, Foto und Land nur, wenn die Zustimmung vorliegt oder ein Admin/VIP die Ansicht nutzt
- nach juristischer Klärung kann die Regel angepasst werden
Technische Ergänzungen:
- Ranking um Foto und Land erweitern
- Pagination/Limit bewusst definieren: alle Teilnehmer anzeigen, aber paginiert
- Übersetzungen in `resources/lang/*/incentive.php` ergänzen
### 7. Multimedia-Bereich / Event-Archiv
Es gibt bereits Dashboard-News und ein News-Archiv. Für Events sind zwei Varianten möglich:
Variante A: `DashboardNews` um Typ "event" erweitern
- weniger Aufwand
- bestehendes Admin-Modul kann wiederverwendet werden
- geeignet, wenn Events im gleichen Format wie News funktionieren
Variante B: eigenes Event-Modul
- sauberere Trennung
- eigene Felder für Galerie, Eventdatum, Call-/Foto-Typ
- sinnvoll, wenn Uploads, mehrere Bilder pro Event oder Kategorien benötigt werden
Empfehlung: Variante A als MVP, falls keine komplexe Galerieverwaltung benötigt wird.
## Technisches Zielkonzept
### Neue zentrale Services
Empfohlen:
- `App\Services\Backoffice\BackofficeDashboardService`
- `App\Services\Backoffice\BackofficeDrilldownService`
Aufgaben `BackofficeDashboardService`:
- Zeitraum normalisieren
- Downline pro Linie aufbauen
- Summen pro Linie berechnen
- Daten für Stufe 1 und Stufe 2 liefern
- Caching-/Snapshot-Strategie kapseln
Aufgaben `BackofficeDrilldownService`:
- Kennzahlenfilter aus Request validieren
- Personen-/Abo-/Umsatzlisten erzeugen
- Berechtigungen gegen Downline prüfen
- einheitliche Summary für Listen liefern
### Controller und Views
Empfohlen:
- `App\Http\Controllers\User\BackofficeStatisticsController`
- Views unter `resources/views/user/backoffice/statistics/`
Geplante Actions:
- `index()` für Stufe 1
- `line(int $line)` für Stufe 2
- `details()` für Stufe 3
- optional `export()` für CSV/Excel später
Die vorhandenen Team-Views bleiben bestehen. Das neue Dashboard verweist für Detailseiten aber auf eigene, schlankere Statistik-Views.
### Datenmodell und Definitionen
Einheitliche Metriken:
- `consultants`: aktive Berater in Linie
- `own_abos`: eigene Beraterabos des eingeloggten Users
- `team_partner_abos`: Beraterabos im Team (`is_for = 'me'`)
- `direct_customer_abos`: Kundenabos des betrachteten Beraters (`member_id = user_id`, `is_for = 'ot'`)
- `team_customer_abos`: Kundenabos der Downline-Berater (`member_id in teamUserIds`, `is_for = 'ot'`)
- `new_partners`: neue aktive Partner im Zeitraum
- `turnover_points`: Punkte aus `UserSalesVolume`/`UserBusiness`
- `turnover_net`: Netto-Umsatz aus `UserSalesVolume`/`UserBusiness`
- `shop_1000`: Partner mit Kunden-/Shop-Punkten >= 1000
### Berechtigungen
Jede Detailansicht muss sicherstellen:
- Der eingeloggte User sieht nur eigene Downline-Daten.
- Ein direkt angefragter `user_id` muss per Sponsor-Hierarchie im Team liegen.
- Kundenabos werden nur in dem Umfang angezeigt, der fachlich für Berater vorgesehen ist.
- Datenschutzrelevante Kundendaten sollten auf das notwendige Minimum reduziert werden.
## Umsetzungsphasen
### Phase 1: Begriffe, Datenbasis und MVP Dashboard
- Fachliche Definitionen finalisieren
- `BackofficeDashboardService` erstellen
- Stufe-1-Linienübersicht mit Linien 1 bis 8 und Summenzeile bauen
- bestehende Dashboard-Kachel durch Link auf neue Statistikseite ergänzen oder neue Seite im Menü aufnehmen
- Kennzahlen noch ohne vollständigen Deep Dive, aber bereits sauber berechnet
### Phase 2: Drill-down Stufe 2 und Stufe 3
- Linien-Detailansicht pro Firstline bauen
- Detailansichten je Kennzahl bauen
- Abo-Listen mit Name, Punktewert, nächster Ausführung und Anzahl Lieferungen anzeigen
- Links aus jeder Kennzahl setzen
- leere Zustände und Summenzeilen ergänzen
### Phase 3: 1000 Punkte Shop
- fachliche Definition final bestätigen
- Query und Summary implementieren
- Widget in Übersicht ergänzen
- Detailansicht mit Sortierung nach Volumen absteigend bauen
### Phase 4: Herkunftsabfrage im Checkout
- Migration und Model-Fillable ergänzen
- Checkout-Formular erweitern
- Validierung und Speicherung ergänzen
- Admin-/Bestelldetail oder Export um Feld erweitern
### Phase 5: Storno-Qualitätssicherung
- Tests für vorhandene Storno-Punktepfade ergänzen
- Fachentscheidung zur Periodenlogik dokumentieren
- Fehlerfall ohne Original-`UserSalesVolume` sichtbar machen
- ggf. Businessdaten-Neuberechnung nach Storno anstoßen
### Phase 6: Incentive-Sichtbarkeit und Event-Archiv
- rechtliche Entscheidung einarbeiten
- separates Ranking-Sichtbarkeits-Opt-in ergänzen
- Foto/Land im Ranking anzeigen
- Event-Archiv als `DashboardNews`-Typ oder eigenes Modul umsetzen
## Teststrategie
Feature-Tests:
- Dashboard zeigt nur Daten der eigenen Downline.
- Linien 1 bis 8 werden korrekt gruppiert.
- Summenzeile entspricht Summe der Linien.
- Klick auf Teamabos zeigt nur `is_for = 'me'` in der Downline.
- Klick auf Kundenabos im Team zeigt nur `is_for = 'ot'` mit `member_id` in der Downline.
- 1000-Punkte-Shop listet nur Partner über Schwelle und sortiert absteigend.
- Checkout verlangt die Herkunftsabfrage und speichert sie.
- Storno erzeugt negativen `UserSalesVolume`-Eintrag und aktualisiert Monatswerte.
- Incentive-Ranking zeigt Name/Foto/Land nur nach passender Zustimmung.
Unit-Tests:
- Service aggregiert Linien korrekt.
- Service verhindert Zugriff auf fremde Team-User.
- Metrikdefinitionen liefern stabile Counts bei aktiven, gekündigten und zukünftigen Abos.
Regressionsprüfung:
- bestehende Teamseiten `user.team.*`
- bestehende Abo-Seiten
- bestehendes Incentive-Ranking
- Checkout für Webshop, Bestelllink und Salescenter-Flows
## Offene Fachfragen
1. Soll die neue Statistik die aktuelle Monatslogik nutzen oder standardmäßig den letzten abgeschlossenen Monat zeigen?
2. Sollen Stornos im Stornomonat oder im ursprünglichen Umsatzmonat gegengerechnet werden?
3. Wie genau wird "1000 Punkte Shop" definiert: nur Shop-Punkte, alle Kundenpunkte oder Kundenabos plus Einzelbestellungen?
4. Welche Kundendaten dürfen Berater in Deep-Dive-Listen sehen?
5. Ist die Herkunftsabfrage Freitext, Auswahlfeld oder Kombination?
6. Gilt die Herkunftsabfrage für alle Checkout-Flows oder nur für externe Kundenbestellungen?
7. Darf eine Incentive-Teilnahme bereits Name/Foto/Land freigeben oder braucht es ein separates Opt-in?
8. Soll das Event-Archiv nur Bilder und Texte enthalten oder eine echte Galerie mit Mehrfachuploads?
## Empfehlung
Die Backoffice-Statistik sollte als eigenes kleines Modul im User-Bereich umgesetzt werden, nicht als weitere Logik in `dashboard/_statistics.blade.php`. Die vorhandenen Datenquellen sind ausreichend für ein MVP, aber sie müssen zentral aggregiert, fachlich sauber benannt und über berechtigte Drill-down-Routen zugänglich gemacht werden.
Priorität für die erste Umsetzung:
1. Daten- und Begriffsdefinitionen finalisieren
2. zentrale Services und Stufe-1-Linienübersicht
3. Drill-down für Abos und Neupartner
4. 1000-Punkte-Shop
5. Checkout-Herkunft und Storno-Tests
6. Incentive-Sichtbarkeit und Event-Archiv

View file

@ -0,0 +1,190 @@
# Entwicklungskonzept DHL Modul
Stand: 13.05.2026
## Ziel
Diese Datei ist die aktuelle Arbeitsgrundlage fuer die Weiterentwicklung des DHL Moduls. Die bisherigen Markdown-Dateien in diesem Ordner dokumentieren abgeschlossene oder ueberholte Zwischenstaende, insbesondere den frueheren SDK-Ansatz, Paketinstallation, SSL/cURL-Fixes und einzelne abgeschlossene Entwicklungsschritte.
Aktuelle Anforderungen kommen aus `docs/dhl/Anpassung DHL Modul.md`:
- Internationaler Versand ausserhalb Deutschlands, insbesondere Oesterreich und Spanien.
- Freies Feld fuer Sendungsreferenz oder interne Hinweise wie "Nachlieferung".
- Adressvalidierung vor Labelerstellung, damit fehlerhafte Labels und kostenpflichtige Stornos vermieden werden.
- Storno im DHL Cockpit pruefen und stabilisieren.
- Gewicht von Kompensationsprodukten in das DHL-Paketgewicht einrechnen.
- Tracking-Mails auf Rhythmus, Ausloeser und Mehrfachversand pruefen.
- Tracking-Codes in Admin, User-Portal und User-N-Portal sichtbar machen.
- Tracking-Mail-Versand nur bei Statusaenderung.
- DHL-Umstellung von `V62WP` Warenpost auf `V62KP` DHL Kleinpaket bis spaetestens 31.05.2026.
## Aktueller technischer Stand
Das produktive Modul basiert auf dem Paket `packages/acme-laravel-dhl` und verwendet die DHL REST API ueber `Acme\Dhl\Support\DhlClient`. Die zentrale Tabelle ist `dhl_package_shipments`.
Wichtige produktive Einstiegspunkte:
- `app/Http/Controllers/DhlShipmentController.php`
- `app/Services/DhlShipmentService.php`
- `app/Services/DhlModalService.php`
- `app/Services/DhlDataHelper.php`
- `app/Services/DhlTrackingService.php`
- `packages/acme-laravel-dhl/src/Services/ShippingService.php`
- `packages/acme-laravel-dhl/src/Services/ReturnsService.php`
- `packages/acme-laravel-dhl/src/Models/DhlShipment.php`
- `config/dhl.php`
Historische Dokumente erwaehnen teilweise alte Strukturen wie `App\Models\DhlShipment`, `dhl_shipments` oder einen konsolidierten `DhlApiService`. Diese Angaben sind nicht mehr massgeblich, ausser sie werden explizit in aktuellem Code noch referenziert. Aktuell gibt es genau dort noch Altlasten, die bereinigt werden muessen.
## Offensichtliche Befunde
### 1. Produktkuerzel `V62WP` ist veraltet
`V62WP` ist weiterhin in Konfiguration, Admin-Settings, Validierung, Produktauswahl und Sprachdateien vorhanden. DHL verlangt die Umstellung auf `V62KP`.
Betroffene Stellen:
- `config/dhl.php`
- `app/Http/Controllers/SettingController.php`
- `app/Services/DhlModalService.php`
- `packages/acme-laravel-dhl/src/Services/ShippingService.php`
- `resources/lang/*/dhl.php`
Risiko: Kleinpaket/Warenpost-Labels koennen nach der DHL-Frist abgelehnt werden.
### 2. Async Tracking verwendet veraltetes Model
`app/Jobs/TrackShipmentJob.php` importiert `App\Models\DhlShipment`, dieses Model existiert im aktuellen System nicht mehr. Die produktive DHL-Integration verwendet `Acme\Dhl\Models\DhlShipment`.
Risiko: Asynchrones Tracking bricht zur Laufzeit, sobald Queue-Tracking genutzt wird.
### 3. Statuswerte fuer Storno sind inkonsistent
Im Paket wird bei erfolgreichem Storno `canceled` gesetzt. Andere Stellen, Uebersetzungen und historische Dokumente verwenden `cancelled`.
Risiko: Filter, Badges, Terminal-Status, Uebersetzungen und Storno-Buttons verhalten sich uneinheitlich.
### 4. Storno ist technisch vorhanden, aber nicht robust genug
Storno laeuft ueber `DELETE /parcel/de/shipping/v2/orders/{shipmentNumber}`. Der Code prueft `canCancel()`, speichert aber Fehler nur begrenzt fachlich verwertbar. Produktspezifische Einschraenkungen wie Warenpost/Kleinpaket sind nicht sauber modelliert.
Risiko: Anwender sehen generische Fehler und koennen nicht erkennen, ob ein Storno produktbedingt, statusbedingt, API-bedingt oder wegen Sandbox/Production-Mismatch scheitert.
### 5. Internationaler Versand ist nur teilweise vorbereitet
`V53PAK` ist als internationales Produkt vorhanden, und einige Laender werden in 3-stellige ISO-Codes konvertiert. Dennoch gibt es keinen zentralen Produktentscheid je Zielland, keine harte Validierung nicht unterstuetzter Laender und einen gefaehrlichen Fallback auf `DEU`.
Risiko: Sendungen nach Oesterreich, Spanien oder weitere Laender koennen falsche Produktcodes, falsche Abrechnungsnummern oder falsche Laendercodes erhalten.
### 6. Adressvalidierung ist nur formal
Aktuell prueft das Modul Pflichtfelder, Hausnummern und einfache PLZ-Regeln. Eine echte Pruefung, ob Strasse, PLZ und Ort postalisch existieren, findet nicht statt.
Empfohlene Loesung: DHL/Post & DHL `DATAFACTORY AUTOCOMPLETE 2.0` fuer DE/AT/CH pruefen und integrieren. Alternativen fuer breiteren Laenderumfang: Loqate, Google Address Validation oder HERE. Wichtig ist eine harte Sperre bei nicht versandfaehigen Adressen vor Labelerstellung.
### 7. Referenzfeld ist API-seitig vorhanden, aber nicht im Cockpit nutzbar
`ShippingService` kann `reference` nach `refNo` mappen. `DhlDataHelper` setzt aktuell automatisch `Order-{id}`.
Risiko: Admins koennen Hinweise wie "Nachlieferung" nicht strukturiert am Label/API-Auftrag hinterlegen.
### 8. Gewicht von Kompensationsprodukten fehlt
Kompensationsprodukte werden im Warenkorb mit Gewicht `0` abgelegt, damit die Kompensationslogik nicht beeinflusst wird. Das DHL-Gewicht kommt aus `ShoppingOrder->weight` und enthaelt dieses Produktgewicht dadurch nicht.
Risiko: DHL-Label wird mit zu geringem Paketgewicht erstellt.
### 9. Tracking-Mail-Logik ist grundsaetzlich brauchbar, muss aber abgesichert werden
Der Scheduler ruft stuendlich `dhl:update-tracking --days=30 --send-emails` auf. Statusabhaengige Intervalle verhindern zu viele API-Calls. Automatische Mails werden nur gesendet, wenn eine Sendung neu auf `in_transit` wechselt und noch keine Mail markiert wurde.
Risiko: Statusspruenge direkt auf `out_for_delivery` oder besondere DHL-Statuscodes koennen ohne Mail bleiben. Mehrere Sendungen einer Bestellung werden teils zusammengefasst, aber die fachliche Regel muss final bestaetigt werden.
## Entwicklungskonzept
### Phase 1: Pflichtkorrekturen vor DHL-Frist
1. `V62WP` vollstaendig auf `V62KP` migrieren.
2. Neue Konfigurationskeys fuer `DHL_ACCOUNT_NUMBER_V62KP`, Admin-Setting `dhl_account_v62kp`, Dimensionen und Uebersetzungen einfuehren.
3. `ShippingService` Validierung um `V62KP` erweitern und `V62WP` entfernen oder nur noch als Legacy-Mapping fuer Altdaten anzeigen.
4. Bestehende Sendungen mit `V62WP` historisch lesbar lassen, aber neue Labelerstellung blockieren.
5. Tests fuer Produktcode-Auswahl, Validierung und Payload-Erstellung schreiben.
### Phase 2: Stabilisierung von Tracking und Storno
1. `TrackShipmentJob` auf aktuelles Model und aktuellen `DhlTrackingService` umstellen.
2. Statuswerte vereinheitlichen. Empfehlung: intern `canceled` verwenden, Uebersetzung auf Deutsch "Storniert".
3. `TERMINAL_STATUSES`, Badges, Filter und Sprachdateien entsprechend angleichen.
4. Storno-Fehler strukturiert speichern: HTTP-Status, DHL-Fehlercode, DHL-Detailtext, Zeitpunkt.
5. Admin-Feedback verbessern: nicht stornierbar wegen Status, Produkt, API-Antwort oder nicht auffindbarer DHL-Sendung.
6. Tests fuer erfolgreiche Stornierung, bereits stornierte Sendung, nicht stornierbare Sendung und API-Fehler.
### Phase 3: Internationalisierung Versand
1. Zentralen Service fuer Produkt-/Billing-Entscheidung einfuehren, z. B. `DhlProductResolver`.
2. Zielland, Produktcode, Abrechnungsnummer und erlaubte Services dort validieren.
3. Regeln initial:
- `DE`: `V01PAK` oder `V62KP`
- `AT`, `ES` und weitere aktivierte Laender: `V53PAK`
4. Fallback auf `DEU` entfernen. Unbekannte Laender muessen mit klarer Fehlermeldung abbrechen.
5. Cockpit-Formular: Produkt anhand Zielland vorschlagen, aber Admin-Korrektur erlauben.
### Phase 4: Adressvalidierung vor Labelerstellung
1. Neuen serverseitigen Validierungsendpunkt fuer DHL-Adressen schaffen.
2. Basisvalidierung behalten: Pflichtfelder, Land, PLZ-Format, Hausnummer, Packstation/Postnummer.
3. DHL DATAFACTORY AUTOCOMPLETE 2.0 fuer DE/AT/CH evaluieren.
4. Falls DHL fuer alle benoetigten Laender nicht ausreicht, externen Provider evaluieren.
5. UI-Status einfuehren:
- gueltig: Labelerstellung erlaubt
- Warnung: Admin kann bewusst fortfahren
- Fehler: Labelerstellung gesperrt
6. Validierungsergebnis optional am Shipment/Order protokollieren.
### Phase 5: Referenzfeld und Admin-UX
1. Neues Formularfeld `reference` oder `shipment_reference` im DHL Cockpit.
2. Wert an `DhlDataHelper::prepareOrderData()` uebergeben.
3. `ShippingService` nutzt vorhandenes Mapping nach `refNo`.
4. Referenz im Shipment speichern, damit spaeter nachvollziehbar ist, warum eine Sendung erstellt wurde.
5. Laengenlimit der DHL API beachten, aktuell maximal 35 Zeichen.
### Phase 6: DHL-Gewicht korrekt berechnen
1. Separaten Gewichtsdienst fuer DHL einfuehren, z. B. `DhlShipmentWeightCalculator`.
2. Basis: `ShoppingOrder->weight`.
3. Fuer `shopping_order_items` mit `comp > 0` das Produktgewicht aus `Product->weight` nachladen und addieren.
4. Nur DHL-Gewicht anpassen, nicht die bestehende Warenkorb-/Versandkostenlogik.
5. Rundung und DHL-Grenzwerte je Produkt testen.
### Phase 7: Tracking-Codes und Mails fachlich finalisieren
1. Bestehende Admin-Anzeige pruefen und bei Bedarf vereinheitlichen.
2. Tracking-Code-Anzeige in User-Portal und User-N-Portal ergaenzen.
3. Mail-Regel final definieren:
- automatisch nur einmal pro Sendung
- nur bei relevanter Statusaenderung
- mehrere Sendungen einer Bestellung sinnvoll zusammenfassen
4. Statusspruenge wie `created` direkt nach `out_for_delivery` abdecken.
5. Command `dhl:update-tracking` Tests fuer Mailausloeser und Nicht-Ausloeser ergaenzen.
## Empfohlene Reihenfolge
1. `V62WP` -> `V62KP`, Statuswerte und `TrackShipmentJob` korrigieren.
2. Storno stabilisieren und bessere Fehlermeldungen im Cockpit anzeigen.
3. Internationalen Produktresolver einbauen.
4. Referenzfeld und Gewichtskorrektur umsetzen.
5. Adressvalidierung integrieren.
6. Tracking-Anzeigen und Mailregeln final testen.
## Teststrategie
- Feature-Tests fuer Controller-Endpunkte: Label erstellen, Storno, Tracking-Mail, Tracking-Update.
- Unit-Tests fuer Produktresolver, Gewichtskalkulation und Adressvalidierung.
- HTTP-Fakes fuer DHL API Responses inklusive Fehlerfaelle.
- Regression-Test fuer `V62KP` Payload.
- Command-Test fuer `dhl:update-tracking --send-emails`.
## Legacy-Dokumentation
Die bisherigen Markdown-Dateien wurden nach `dev/dhl-modul/legacy` verschoben. Sie bleiben als Historie erhalten, sind aber nicht mehr die aktuelle Arbeitsgrundlage.

170
resources/lang/fr.json Normal file
View file

@ -0,0 +1,170 @@
{
"MR": "Monsieur",
"MS": "Madame",
"DIV": "Divers",
"please select": "Veuillez sélectionner",
"please specify": "Veuillez préciser.",
"further countries": "autres pays",
"none": "Aucun",
"no": "Non",
"yes": "OUI",
"Company data": "Données de l'entreprise",
"Company name": "Nom de l'entreprise",
"Company": "Entreprise",
"Street": "Rue",
"Addition": "Complément",
"House number": "Numéro",
"Address": "Adresse",
"no.": "N°",
"City": "Ville",
"Postcode": "Code postal",
"Country": "Pays",
"Delivery country": "Pays de livraison",
"Delivery address": "Adresse de livraison",
"Delivery addresses": "Adresses de livraison",
"Phone": "Téléphone",
"optional": "optionnel",
"Phone code": "Indicatif téléphonique",
"Country code": "Code pays",
"E-Mail": "E-mail",
"Homepage": "Page d'accueil",
"Industry": "Secteur",
"Industries": "Secteurs",
"Main Industry": "Secteur principal",
"Personal Data": "Données personnelles",
"Data": "Données",
"Function": "Fonction",
"Salutation": "Civilité",
"Title": "Titre",
"First name": "Prénom",
"Last name": "Nom",
"Mobile Phone": "Téléphone mobile",
"Name": "Nom",
"Date of birth": "Date de naissance",
"Comments": "Remarques",
"Flat Building optional": "Appartement / bâtiment (optionnel)",
"Shipping to the same address": "Livraison à la même adresse",
"Consent & Privacy": "Consentement et confidentialité",
"Product": "Produit",
"Products": "Produits",
"New Password": "Nouveau mot de passe",
"Old Password": "Ancien mot de passe",
"Create Password": "Créer un mot de passe",
"Change password": "Modifier le mot de passe",
"Confirm new Password": "Répéter le nouveau mot de passe",
"Confirm Password": "Confirmer le mot de passe",
"Confirm E-Mail": "Répéter l'e-mail",
"E-Mail Address": "Adresse e-mail",
"Confirm E-Mail Address": "Répéter l'adresse e-mail",
"Forgot your Password?": "Mot de passe oublié ?",
"Login": "Connexion",
"Logout": "Déconnexion",
"Password": "Mot de passe",
"Register": "S'inscrire",
"Remember Me": "Rester connecté",
"Reset Password": "Réinitialiser le mot de passe",
"Send Password Reset Link": "Envoyer le lien de réinitialisation du mot de passe",
"save": "enregistrer",
"save and next": "enregistrer et continuer",
"save changes": "enregistrer les modifications",
"sended": "envoyer",
"abort": "annuler",
"add": "ajouter",
"This field is required.": "Ce champ est obligatoire.",
"Please enter a valid email address.": "Veuillez saisir une adresse e-mail valide.",
"This E-mail is already in use.": "Cette adresse e-mail est déjà utilisée.",
"Please enter the same value again.": "Les adresses e-mail ne correspondent pas.",
"a valid e-mail address": "Veuillez saisir une adresse e-mail valide.",
"Already have an account?": "Vous avez déjà un compte ?",
"Login to your account": "Connectez-vous à votre compte",
"now register data": "enregistrer maintenant les données",
"Required fields": "Champs obligatoires",
"Industry sectors": "Secteurs",
"Interests": "Centres d'intérêt",
"Leads": "Contacts",
"Your Data": "Vos données",
"Edit your data": "Modifier vos données",
"saved": "Enregistré",
"The changes have been saved.": "Les modifications ont été enregistrées.",
"error": "Erreur",
"Here you can adjust your data.": "Vous pouvez adapter vos données ici.",
"Overview": "Aperçu",
"Data, Login & Security": "Données, connexion et sécurité",
"Sign in with your e-mail:": "Connexion avec votre e-mail :",
"delete": "supprimer",
"confirm_delete": "Supprimer vraiment ?",
"imprint": "Mentions légales",
"data protections": "Protection des données",
"Thank you for your registration!": "Merci pour votre inscription !",
"We have sent you an e-mail with a link to activate your data.": "Nous vous avons envoyé un e-mail avec un lien pour activer votre compte.",
"Please check your emails and confirm the link.": "Veuillez consulter vos e-mails et confirmer le lien.",
"back to the homepage": "retour à la page d'accueil",
"You have successfully verified your account!": "Votre compte a été vérifié avec succès !",
"Now check your data and release the data.": "Vérifiez maintenant vos données et validez-les.",
"Check and release data": "Vérifier et valider les données",
"Check data": "Vérifier les données",
"Page not available": "Page non disponible",
"Data released": "Données validées",
"Data released now": "Valider les données maintenant",
"E-Mail verified": "E-mail vérifié",
"E-Mail not verified": "E-mail non vérifié",
"Privacy policy approved": "Politique de confidentialité acceptée",
"Consent for further information": "Consentement pour recevoir d'autres informations",
"at": "le",
"If you have checked your data, share your data here!": "Si vous avez vérifié vos données, validez-les ici !",
"Contacts all": "tous les contacts",
"Contacts verify": "contacts vérifiés",
"Contacts active": "contacts activés",
"This website uses cookies": "Ce site utilise des cookies afin de vous garantir le meilleur service possible. En visitant cette page, vous acceptez l'utilisation de cookies.",
"OK": "OK",
"Contacts": "Contacts",
"activ": "actif",
"active": "activé",
"inactive": "désactivé",
"verified": "vérifié",
"'E-Mail": "'E-mail",
"create new Contact": "Créer un nouveau contact",
"Create/Edit Contact": "Créer/modifier un contact",
"Pos": "Pos",
"Description": "Désignation",
"Translate": "Traduction",
"Status": "Statut",
"back": "retour",
"back_to_overview": "retour à l'aperçu",
"create/edit": "créer/modifier",
"close": "fermer",
"take over": "reprendre",
"Number to move the position if necessary": "Nombre pour déplacer la position si nécessaire",
"Create new interest": "Créer un nouveau centre d'intérêt",
"Really delete entry?": "Supprimer vraiment cette entrée ?",
"Create a new industry": "Créer un nouveau secteur",
"Your e-mail has been changed.": "Votre e-mail a été modifié.",
"We sent you an activation code. Check your email!": "Nous vous avons envoyé un code d'activation. Vérifiez vos e-mails !",
"An activation code was sent to the account by e-mail!": "Un code d'activation a été envoyé au contact par e-mail !",
"New E-Mail Address": "Nouvelle adresse e-mail",
"Confirm new E-Mail": "Répéter la nouvelle adresse e-mail",
"business": "professionnel",
"private": "privé",
"business or private": "professionnel ou privé",
"use": "Utilisation",
"Contact": "Contact",
"waiting for activation since": "en attente d'activation depuis",
"edit": "modifier",
"your mivita.care team": "Votre équipe mivita.care",
"create new password": "créer un nouveau mot de passe",
"Now assign a password.": "Définissez maintenant votre mot de passe pour accéder à votre compte.",
"to your data": "vers vos données",
"Your registration has already been completed.": "Votre inscription est déjà terminée.",
"The link to register is no longer active.": "Le lien d'inscription n'est plus actif ou l'inscription est déjà terminée.",
"go to login": "aller à la connexion",
"Please confirm your data first.": "Veuillez d'abord vérifier et confirmer vos données.",
"yes, data checked and share": "Oui, données vérifiées et valider maintenant",
"Copy link": "Copier le lien",
"ml": "ml",
"g": "g",
"liter": "litre",
"kg": "kg",
"search_for": "Rechercher ....",
"show_all_filters": "Afficher tous les filtres",
"": ""
}

135
resources/lang/fr/abo.php Normal file
View file

@ -0,0 +1,135 @@
<?php
return [
'abo' => 'Abonnement',
'payment_for_abo' => 'Mode de paiement pour labonnement',
'abo_delivery' => 'Abonnement - livraison régulière',
'abo_are_for_me_and_shipped' => 'Labonnement est pour moi et sera envoyé à mon adresse',
'abo_are_for_customer_and_shipped' => 'Labonnement est pour un client et sera envoyé au client',
'abo_delivery_to_me' => 'Livraison dabonnement à moi-même',
'abo_delivery_to_the_customer' => 'Livraison dabonnement au client',
'every_week' => 'chaque semaine',
'every_weeks' => 'toutes les :num semaines',
'of_month' => 'du mois',
'delivery_intervall' => 'Adapter le jour de livraison',
'abo_order_info_check' => 'À la conclusion de labonnement, une livraison régulière est mise en place. Elle est automatiquement expédiée et facturée au jour de livraison choisi.',
'abo_order_info_check_2' => 'La première livraison et facturation a lieu le jour de la création de labonnement. Ensuite, lexpédition se fait automatiquement au jour de livraison choisi du mois suivant.',
'abo_order_info_check_3' => 'PayPal et carte de crédit sont disponibles comme modes de paiement. <strong>Labonnement a une durée minimale de :abo-min-duration mois.</strong> Ensuite, il peut être mis en pause, modifié ou résilié à tout moment.',
'abo_order_info_checkbox' => 'Oui, jai compris les conditions de labonnement !',
'abo_order_info_checkbox_required' => 'Veuillez confirmer les conditions de labonnement pour continuer.',
'abo_infos' => 'Infos abonnement',
'abo_delivery_infos' => 'Infos livraison abonnement',
'abo_start_date' => 'Début de labonnement',
'abo_delivery_intervall' => 'Jour de livraison de labonnement',
'abo_first_execution_date' => 'Première exécution',
'abo_next_execution_date' => 'Prochaine exécution',
'delivery_day' => 'Adapter le jour de livraison',
'abo_settings' => 'Paramètres abonnement',
'add_new_abo' => 'Créer un nouvel abonnement',
'abo_edit' => 'Modifier labonnement',
'abo_details' => 'Détails de labonnement',
'abo_is_active' => 'Labonnement est actif',
'abo_copy_active' => 'Si labonnement nest pas actif, aucune exécution automatique na lieu.',
'abo_copy_next_date' => 'Le prochain jour dexécution peut être fixé au plus tôt au lendemain.',
'abo_copy_abo_interval' => 'Ladaptation du jour de livraison de labonnement impacte la prochaine date dexécution si labonnement est actif.',
'admin_abo_copy_next_date' => 'Les admins peuvent définir directement la prochaine date dexécution via le mois et le jour de livraison.',
'error_abo_interval' => 'Lintervalle dabonnement est incorrect',
'error_abo_interval_in_the_past' => 'Labonnement na pas encore été exécuté ce mois-ci. Un changement vers un jour passé ferait sauter le mois en cours.',
'warning_next_date_soon' => 'Remarque : la prochaine exécution de labonnement est déjà dans :days jours (:date).',
'warning_next_date_soon_select' => 'Remarque : la prochaine exécution de labonnement est déjà dans :placeholder_days jours (:placeholder_date).',
'warning_next_date_info' => 'La prochaine exécution de labonnement est dans :days jours, le :date.',
'info_next_execution_select' => 'Prochaine exécution : dans :placeholder_days jours, le :placeholder_date.',
'error_change_locked' => 'Les modifications ne sont plus possibles. La prochaine exécution est dans :days jours. Les modifications doivent être effectuées au moins 10 jours avant.',
'error_abo_interval_too_soon' => 'Le jour de livraison choisi nest quà :days jours. Veuillez choisir un jour de livraison situé au moins 10 jours dans le futur.',
'error_cancel_locked' => 'Une résiliation nest plus possible. La prochaine exécution est dans :days jours. Les résiliations doivent être effectuées au moins 3 jours avant.',
'error_pause_locked' => 'Labonnement ne peut plus être mis en pause. La prochaine exécution est dans :days jours. La pause doit être effectuée au moins 3 jours avant.',
'error_next_date' => 'La date de la prochaine exécution est incorrecte',
'checkout_mail_abo_hl' => 'Votre abonnement / livraison régulière.',
'checkout_mail_abo_start' => 'Votre abonnement a été créé avec succès avec les paramètres suivants :',
'checkout_mail_abo_info' => 'Vous trouverez les paramètres de votre abonnement dans votre compte sous "Mes abonnements" et pourrez également les y modifier.',
'abo_new' => 'nouveau',
'abo_okay' => 'ok',
'abo_hold' => 'en pause',
'abo_cancel' => 'annulé',
'abo_finish' => 'terminé',
'abo_inactive' => 'inactif',
'abo_grace' => 'geste commercial',
'abo_info' => 'Informations abonnement',
'info_min_duration_reached' => 'Votre abonnement pourra être modifié, complété, mis en pause ou résilié au plus tôt à partir du :date.',
'info_min_duration_orders_left' => 'Labonnement ne pourra être modifié, complété, mis en pause ou résilié quaprès encore :count exécutions.',
'pros_hl' => 'Les avantages dun abonnement',
'pros_list' => ' <li><b>Conclusion dabonnement pour conseillers et clients :</b> Chaque conseiller ou client peut conclure un abonnement exécuté à un jour fixe du mois afin de garantir une livraison régulière et planifiable.</li>
<li><b>Livraison mensuelle :</b> Une nouvelle livraison est envoyée directement à votre porte une fois par mois.</li>
<li><b>Adaptable avec flexibilité :</b> Labonnement peut être adapté individuellement, p. ex. en termes de produits, quantités ou dates de livraison.</li>
<li><b>Large choix de produits :</b> Différents produits peuvent être inclus dans labonnement.</li>
<li><b>Durée :</b> Labonnement a une durée minimale de <strong>:abo-min-duration mois</strong>, puis il peut être mis en pause ou résilié.</li>
<li><b>Avantage prix :</b> Les produits dabonnement bénéficient souvent de remises ou offres spéciales.</li>
<li><b>Démarrer maintenant :</b> Choisissez vos produits, adaptez labonnement à vos besoins, payez la première commande et activez ainsi votre abonnement pour les prochaines livraisons.</li>',
'abo_pros' => 'Avantages abonnement',
'abo_order_hl' => 'Composition de labonnement',
'abo_order_info_2' => 'Vous pouvez adapter les produits de votre abonnement à tout moment ; lors de la prochaine exécution, vos produits composés vous seront envoyés.',
'abo_order_info_block' => 'Vous pouvez adapter la composition de votre abonnement après la durée minimale de <strong>:abo-min-duration mois</strong>.',
'abo_order_info_block_team' => 'La composition de labonnement pour un membre de léquipe ne peut être adaptée que par lui-même.',
'abo_order_info_block_customer' => 'Vous pouvez à tout moment ajouter de nouveaux produits à labonnement de votre client. La suppression de produits nest possible quaprès la durée minimale de <strong>:abo-min-duration mois</strong>.',
'abo_order_info_add_only' => 'Vous pouvez à tout moment ajouter de nouveaux produits à votre abonnement. La suppression de produits nest possible quaprès la durée minimale de <strong>:abo-min-duration mois</strong>.',
'error_add_only_no_remove' => 'La suppression de produits nest pas possible pendant la durée minimale.',
'confirm_add_title' => 'Confirmer lajout du produit',
'confirm_add_title_normal' => 'Ajouter le produit à labonnement',
'confirm_add_warning' => 'Pendant la durée minimale, les produits ajoutés ne peuvent pas être retirés. Veuillez vérifier soigneusement votre sélection.',
'confirm_add_warning_normal' => 'Voulez-vous vraiment ajouter ce produit à votre abonnement ?',
'confirm_add_cancel' => 'Annuler',
'confirm_add_ok' => 'Oui, ajouter',
'add_product' => 'Ajouter le produit',
'product_prices_career_level_info' => 'Les prix produits sont affichés et calculés selon votre niveau de carrière <strong>:user_level_name</strong> moins <strong>:user_level_margin %</strong> de marge.',
'product_prices_career_level_cpay_info' => 'Les prix produits sont affichés comme prix de vente client ; après finalisation du paiement client, vous recevez votre commission selon votre niveau de carrière <strong>:user_level_name</strong>, commission <strong>:user_level_margin %</strong>.',
'error_email_has_abo' => 'Un abonnement existe déjà pour ladresse e-mail :email.',
'abo_assigned' => 'Abonnement actif',
'base' => 'Base',
'upgrade' => 'Upgrade',
'abo_type_info' => 'Remarque : chaque abonnement se compose au minimum dun produit de base :base ! <br>Les produits upgrade :upgrade sont optionnels et peuvent être ajoutés à volonté.<br> <strong>Labonnement a une durée minimale de <strong>:abo-min-duration mois</strong>, puis il peut être mis en pause ou résilié.</strong>',
'abo_type_info_base' => 'Labonnement nécessite au moins un produit de base :base !',
'need_basis_product' => 'Vous devez avoir au moins un produit de base dans votre abonnement. Veuillez dabord ajouter un nouveau produit de base puis supprimer lancien !',
'abo_item_not_found' => 'Position dabonnement introuvable',
'product_not_found' => 'Produit introuvable',
'create_abo' => 'Créer un abonnement',
'info' => 'Info',
'data' => 'Données',
'check' => 'Vérifier',
'choose' => 'Sélectionner',
'order' => 'commander',
'basis_product' => 'Produit de base',
'upgrade_products' => 'Produits upgrade',
'base_product' => 'Produit de base',
'upgrade_product' => 'Produit upgrade',
'my_address' => 'Mon adresse',
'my_address_check' => 'Vérifier mon adresse',
'my_address_check_info' => 'Veuillez vérifier votre adresse afin de garantir que la marchandise sera envoyée à la bonne adresse.',
'edit' => 'modifier',
'confirm_and_next' => 'confirmer et continuer',
'understood_and_next' => 'compris et continuer',
'change_my_data_empty' => 'Vous navez pas encore enregistré dadresse de facturation et de livraison. Sans celles-ci, vous ne pouvez pas créer dabonnement ; veuillez les créer.',
'abo_error_basis_product' => 'Erreur : veuillez sélectionner au moins un produit de base.',
'cancel_abo' => 'Résilier labonnement',
'confirm_cancel' => 'Voulez-vous vraiment résilier labonnement ?',
'retry_payment' => 'Relancer le paiement',
'retry_payment_confirm_title' => 'Veuillez confirmer consciemment',
'retry_payment_confirm_copy' => 'La tentative de paiement démarre immédiatement et peut déclencher un débit PayPal ou carte de crédit. À exécuter uniquement si la cause a été vérifiée.',
'retry_payment_confirm_button' => 'Réessayer le paiement maintenant',
'retry_only_hold' => 'La nouvelle tentative de paiement nest possible que pour les abonnements en pause.',
'retry_only_active' => 'La nouvelle tentative de paiement nest possible que pour les abonnements actifs.',
'retry_already_paid_today' => 'Un paiement réussi a déjà été enregistré aujourdhui pour cet abonnement.',
'retry_error_shopping_user' => 'Le Shopping-User na pas pu être créé pour la nouvelle tentative de paiement.',
'retry_error_order' => 'La commande na pas pu être créée pour la nouvelle tentative de paiement.',
'retry_success' => 'La nouvelle tentative de paiement a réussi. Commande #:order créée.',
'retry_failed' => 'La nouvelle tentative de paiement a échoué. Commande #:order créée. Erreur : :error',
'retry_exception' => 'La nouvelle tentative de paiement na pas pu être finalisée : :error',
'team_subscriptions' => 'Abonnements équipe',
'team_customer_abos' => 'Abonnements clients de léquipe',
'chart_monthly_abos' => 'Abonnements par mois',
'chart_active_abos' => 'Abonnements actifs',
'chart_abos_label' => 'Abonnements',
'abo_count' => 'Nombre dabonnements',
'customer_privacy_info' => 'Pour des raisons de protection des données, aucune donnée personnelle client nest affichée.',
'every_month_on' => 'mensuellement le :day.',
'back' => 'retour',
];

View file

@ -0,0 +1,41 @@
<?php
return [
'initial_composition' => 'Composition initiale',
'change_history' => 'Historique des modifications',
'no_initial_data' => 'Aucune donnée initiale disponible (abonnement créé avant lactivation de lhistorique)',
'no_changes' => 'Aucune modification disponible',
'col_date' => 'Date',
'col_action' => 'Action',
'col_product' => 'Article',
'col_details' => 'Détails',
'col_changed_by' => 'Modifié par',
'col_channel' => 'Zone',
'action_initial' => 'Origine',
'action_added' => 'Ajouté',
'action_removed' => 'Supprimé',
'action_qty_changed' => 'Quantité modifiée',
'action_comp_changed' => 'Comp remplacé',
'action_comp_added' => 'Comp ajouté',
'action_comp_removed' => 'Comp supprimé',
'action_rollback' => 'Réinitialisé',
'desc_initial' => 'Quantité : :qty',
'desc_added' => 'Quantité : :qty',
'desc_removed' => 'Article supprimé',
'desc_qty_changed' => 'Quantité modifiée de :from à :to',
'desc_comp_changed' => 'Remplacé : :old',
'desc_comp_added' => 'Ajouté par le système',
'desc_comp_removed' => 'Supprimé par le système',
'desc_rollback' => 'Réinitialisé à lorigine',
'channel_admin' => 'Admin',
'channel_user_me' => 'Conseiller',
'channel_user_ot' => 'Conseiller (client)',
'channel_portal' => 'Portail client',
'channel_system' => 'Système',
'price_net' => 'net',
'price_gross' => 'brut',
'rollback_btn' => 'Réinitialiser à lorigine',
'rollback_confirm' => 'Voulez-vous vraiment réinitialiser labonnement à son état initial ? Tous les produits actuels seront remplacés par la composition initiale.',
'rollback_success' => 'Labonnement a été réinitialisé avec succès à son état initial.',
'rollback_no_data' => 'Rollback impossible : aucune donnée initiale disponible.',
];

View file

@ -0,0 +1,48 @@
<?php
return [
'' => '',
'BIC' => 'BIC',
'IBAN' => 'IBAN',
'VAT_ID_number' => 'Numéro de TVA intracommunautaire',
'VAT_copy_1' => 'Choisissez petite entreprise si votre activité ne génère pas plus de 22 000 EUR de chiffre daffaires par an.',
'VAT_liability' => 'Assujettissement à la TVA',
'account_holder' => 'Titulaire du compte',
'bank_data' => 'Coordonnées bancaires',
'delivery_address' => 'Adresse de livraison',
'firstname_lastname' => 'Prénom Nom',
'invoice_address' => 'Adresse de facturation',
'my_credit' => 'Mon crédit',
'vat_data' => 'Données fiscales',
'info_vat_numbers' => 'Remarque : veuillez indiquer le numéro fiscal et/ou le numéro de TVA !*',
'new_vat_validate' => 'Valider le nouveau numéro de TVA et activer la procédure dautoliquidation',
'btn_vat_validate' => 'Valider le numéro de TVA',
'phone_need_error' => 'Erreur : veuillez indiquer un téléphone et/ou un mobile !*',
'phone_need_note' => 'Remarque : veuillez indiquer un téléphone et/ou un mobile !*',
'required_for_commission_payments' => 'Nécessaire pour le versement des commissions',
'reverse_charge_action_1' => 'Supprimer la procédure dautoliquidation et le numéro de TVA',
'reverse_charge_action_2' => 'Valider le numéro de TVA et activer la procédure dautoliquidation',
'reverse_charge_copy_1' => 'Autoliquidation de la taxe. Dans ce cas particulier, le destinataire de la prestation (conseiller) et non le prestataire (mivita) doit acquitter la TVA.',
'reverse_charge_note_1' => 'Le numéro de TVA est nécessaire et validé lors de lactivation.',
'reverse_charge_procedure' => 'Procédure dautoliquidation',
'tax_number' => 'Numéro fiscal',
'taxable_sales_1' => 'assujetti à la TVA (je dépose une déclaration de TVA mensuelle / trimestrielle / annuelle auprès du fisc)',
'taxable_sales_2' => 'non assujetti à la TVA (petite entreprise au sens du § 19',
'validator_creditcard' => 'Veuillez saisir un numéro de carte de crédit valide',
'validator_date' => 'Veuillez saisir une date valide.',
'validator_digits' => 'Veuillez saisir uniquement des chiffres.',
'validator_email' => 'Veuillez saisir une adresse e-mail valide.',
'validator_equalTo' => 'Veuillez saisir à nouveau la même valeur.',
'validator_max' => 'Veuillez saisir une valeur inférieure ou égale à {0}.',
'validator_maxlength' => 'Veuillez saisir au maximum {0} caractères.',
'validator_min' => 'Veuillez saisir une valeur supérieure ou égale à {0}.',
'validator_minlength' => 'Veuillez saisir au moins {0} caractères.',
'validator_number' => 'Veuillez saisir un nombre.',
'validator_range' => 'Veuillez saisir une valeur entre {0} et {1}.',
'validator_rangelength' => 'Veuillez saisir entre {0} et {1} caractères.',
'validator_required' => 'Ce champ est obligatoire.',
'validator_url' => 'Veuillez saisir une URL valide.',
'language_settings' => 'Paramètres de langue',
'preferred_language' => 'Langue préférée',
'language_hint' => 'Cette langue est utilisée pour vos factures, relevés de commissions et bons de livraison.',
];

View file

@ -0,0 +1,24 @@
<?php
return [
'' => '',
'cancel' => 'annuler',
'confirm' => 'confirmer',
'file_is_too_big' => 'Le fichier est trop volumineux<br>max. $0 Mo',
'image_too_small ' => 'Image trop petite<br>min. $0 pixels',
'invalid_file' => 'Fichier invalide<br>uniquement : $0',
'really_delete_picture' => 'Supprimer vraiment limage ?',
'rotate' => 'pivoter',
'save_image' => 'Enregistrer limage',
'search_file_or_drag_drop' => 'Rechercher un fichier ou glisser-déposer',
'upload_photo' => 'Téléchargement de photo',
'dictDefaultMessage' => 'Déposez les fichiers ici pour les téléverser',
'dictFallbackMessage' => 'Votre navigateur ne prend pas en charge le téléversement par glisser-déposer.',
'dictFallbackText' => 'Veuillez utiliser le formulaire de secours ci-dessous pour téléverser vos fichiers comme auparavant.',
'dictFileTooBig' => 'Le fichier est trop volumineux ({{filesize}}MiB). Taille max. : {{maxFilesize}}MiB.',
'dictInvalidFileType' => 'Vous ne pouvez pas téléverser des fichiers de ce type.',
'dictResponseError' => 'Le serveur a répondu avec le code {{statusCode}}.',
'dictCancelUpload' => 'Annuler le téléversement',
'dictRemoveFile' => 'Supprimer le fichier',
'dictMaxFilesExceeded' => 'Vous ne pouvez plus téléverser de fichiers.',
];

View file

@ -0,0 +1,8 @@
<?php
return [
'failed' => 'Cette combinaison didentifiants est introuvable dans notre base de données.',
'not_found' => 'Cette adresse e-mail nest pas enregistrée.',
'failed_customer' => 'Cette adresse e-mail est introuvable dans notre base de données.',
'throttle' => 'Trop de tentatives de connexion. Veuillez réessayer dans :seconds secondes.',
];

View file

@ -0,0 +1,34 @@
<?php
return [
'dashboard_news' => 'Actualités du tableau de bord',
'add_news' => 'Ajouter une actualité',
'edit_news' => 'Modifier lactualité',
'title' => 'Titre',
'teaser' => 'Teaser',
'content' => 'Contenu',
'status' => 'Statut',
'active' => 'Actif',
'inactive' => 'Inactif',
'created_at' => 'Créé le',
'actions' => 'Actions',
'delete' => 'Supprimer',
'confirm_delete' => 'Supprimer vraiment ?',
'no_news_yet' => 'Aucune actualité disponible',
'cancel' => 'Annuler',
'general_settings' => 'Paramètres généraux',
'news_active' => 'Lactualité est active',
'news_active_hint' => 'Une seule actualité active est affichée dans le tableau de bord',
'news_active_single' => 'Remarque : une seule actualité peut être active à la fois. Lors de lactivation, toutes les autres sont automatiquement désactivées.',
'german' => 'Allemand',
'default_language' => 'Langue par défaut',
'teaser_hint' => 'Texte court directement visible (max. 2-3 phrases)',
'content_hint' => 'Contenu plus long affiché après "Lire la suite". Les balises HTML sont autorisées (p. ex. <strong>, <ul>, <li>, <br>, <a>).',
'display_date' => 'Date daffichage',
'display_date_hint' => 'Date affichée dans le tableau de bord (par défaut : date du jour)',
'file_links' => 'Liens de fichiers vers le centre de téléchargement',
'file_links_hint' => 'Ajoutez des liens vers des fichiers du centre de téléchargement qui seront mis en avant dans lactualité.',
'link_label' => 'Libellé du lien (p. ex. "Télécharger la liste de prix")',
'select_file' => 'Sélectionner un fichier',
'add_file_link' => 'Ajouter un lien de fichier',
];

59
resources/lang/fr/cal.php Normal file
View file

@ -0,0 +1,59 @@
<?php
return [
'months' => [
'April' => 'Avril',
'August' => 'Août',
'December' => 'Décembre',
'February' => 'Février',
'January' => 'Janvier',
'July' => 'Juillet',
'June' => 'Juin',
'March' => 'Mars',
'May' => 'Mai',
'November' => 'Novembre',
'October' => 'Octobre',
'September' => 'Septembre',
],
'months_short' => [
'Apr' => 'Avr',
'Aug' => 'Aoû',
'Dec' => 'Déc',
'Feb' => 'Fév',
'Jan' => 'Jan',
'Jul' => 'Juil',
'Jun' => 'Juin',
'Mar' => 'Mar',
'May' => 'Mai',
'Nov' => 'Nov',
'Oct' => 'Oct',
'Sep' => 'Sep',
],
'weekdays' => [
'Friday' => 'Vendredi',
'Monday' => 'Lundi',
'Saturday' => 'Samedi',
'Sunday' => 'Dimanche',
'Thursday' => 'Jeudi',
'Tuesday' => 'Mardi',
'Wednesday' => 'Mercredi',
],
'weekdays_min' => [
'Fr' => 'Ve',
'Mo' => 'Lu',
'Sa' => 'Sa',
'Su' => 'Di',
'Th' => 'Je',
'Tu' => 'Ma',
'We' => 'Me',
],
'weekdays_short' => [
'Fri' => 'Ven.',
'Mon' => 'Lun.',
'Sat' => 'Sam.',
'Sun' => 'Dim.',
'Thu' => 'Jeu.',
'Tue' => 'Mar.',
'Wed' => 'Mer.',
],
];

View file

@ -0,0 +1,38 @@
<?php
return [
'about_shop' => 'À propos de la boutique',
'add_customer_without_email' => 'Ajouter un client sans e-mail',
'add_customer_without_email_info1' => 'Remarque : Vous pouvez aussi créer vos clients sans adresse e-mail. Le système compare alors le nom et le code postal. En cas de correspondance, le support MIVITA vérifie les fiches clients et les attribue aux conseillers correspondants. Nous recommandons donc, dans la mesure du possible, dindiquer une adresse e-mail. Elle est unique et permet dattribuer clairement un client.',
'assigned' => 'attribué',
'assigned_counsellor' => 'Conseiller attribué',
'check' => 'vérifier',
'check_and_next' => 'vérifier et continuer',
'check_and_save' => 'vérifier et enregistrer',
'client_sovereignty' => 'Droit client',
'counsellor_allocate' => 'Attribuer un conseiller',
'created' => 'Créé',
'customer_add' => 'Ajouter des clients',
'customer_billing_address' => 'Adresse client / facturation',
'customer_data' => 'Numéro client',
'customer_details' => 'Détails client',
'customer_has_already_buy' => 'Je certifie que ce client a déjà acheté chez moi',
'customer_has_already_purchased' => 'Le client a déjà acheté.',
'customer_has_not_yet_purchased' => 'Le client na pas encore acheté.',
'customer_is_not_subscribed_to_newsletter' => 'Le client nest pas abonné à la newsletter.',
'customer_is_subscribed_to_newsletter' => 'Le client est abonné à la newsletter.',
'customer_sovereignty_info1' => 'Droit client : seuls les clients qui ne sont pas encore présents dans le Salescenter mivita peuvent être ajoutés.',
'date' => 'Date',
'delete_customer' => 'Supprimer le client',
'deleted_successfully' => 'Le client a été supprimé avec succès',
'delete_customer_confirm' => 'Êtes-vous sûr de vouloir supprimer ce client ?',
'edit' => 'modifier',
'edit_customer_data' => 'Modifier les données client',
'enter' => 'saisir',
'is_counsellor' => 'est conseiller',
'newsletter_subscribed_copy1' => 'Abonné à la newsletter. Vous ou MIVITA êtes autorisés à envoyer une newsletter au client si celui-ci a déjà effectué un achat actif. Si le client a explicitement indiqué ne pas souhaiter de newsletter, retirez impérativement la coche.',
'next_without_email' => 'continuer sans e-mail',
'under_review' => 'en vérification',
'select' => 'sélectionner',
'language_hint' => 'Les factures et documents sont créés dans cette langue.',
];

View file

@ -0,0 +1,192 @@
<?php
return [
'data_protect' => 'Politique de confidentialité',
'data_protect_copy1' => 'Notre site peut en principe être utilisé sans fournir de données personnelles. Si vous souhaitez utiliser certains services via notre site, le traitement de données personnelles peut toutefois être nécessaire.
<br>
Le traitement de vos données personnelles seffectue toujours conformément au Règlement général sur la protection des données (RGPD) et aux dispositions nationales applicables en matière de protection des données.
<br>
Nous avons pris des mesures techniques et organisationnelles appropriées conformément à lart. 32 RGPD afin de garantir un niveau de protection adéquat. Nous avons également mis en place des procédures permettant lexercice de vos droits, la suppression de données et la réaction aux risques pour les données. La protection de vos données personnelles a été prise en compte dès le développement et le choix du matériel et des logiciels utilisés. Nous respectons ainsi le principe de protection des données dès la conception et par défaut, art. 25 RGPD. Nos mesures de sécurité comprennent notamment la transmission chiffrée (SSL) des données entre votre navigateur et notre serveur.
<br><br>',
'data_protect_copy2' => '<strong>I. Définitions</strong>
<br>
Afin de rendre notre politique de confidentialité plus compréhensible, nous expliquons dabord certains termes utilisés. Au sens de cette politique :
<br><br>
1) « données à caractère personnel » désigne toute information se rapportant à une personne physique identifiée ou identifiable ; est réputée identifiable une personne pouvant être identifiée directement ou indirectement, notamment par un nom, un numéro didentification, des données de localisation, un identifiant en ligne ou des caractéristiques propres à son identité physique, physiologique, génétique, psychique, économique, culturelle ou sociale ;
<br><br>
2) « traitement » désigne toute opération ou tout ensemble dopérations appliquées à des données personnelles, automatisées ou non, telles que collecte, enregistrement, organisation, structuration, conservation, adaptation, consultation, utilisation, communication par transmission, diffusion, rapprochement, limitation, effacement ou destruction ;
<br><br>
3) « limitation du traitement » désigne le marquage de données personnelles conservées afin de limiter leur traitement futur ;
<br><br>
4) « profilage » désigne toute forme de traitement automatisé de données personnelles consistant à utiliser ces données pour évaluer certains aspects personnels dune personne physique, notamment concernant son rendement au travail, sa situation économique, sa santé, ses préférences, intérêts, fiabilité, comportement, localisation ou déplacements ;
<br><br>
5) « pseudonymisation » désigne le traitement de données personnelles de telle façon quelles ne puissent plus être attribuées à une personne concernée précise sans informations supplémentaires, pour autant que ces informations soient conservées séparément et protégées par des mesures techniques et organisationnelles ;
<br><br>
6) « responsable du traitement » désigne la personne physique ou morale, lautorité publique, le service ou autre organisme qui détermine seul ou conjointement les finalités et moyens du traitement ;
<br><br>
7) « sous-traitant » désigne la personne physique ou morale, lautorité publique, le service ou autre organisme qui traite des données personnelles pour le compte du responsable ;
<br><br>
8) « destinataire » désigne la personne physique ou morale, lautorité publique, le service ou autre organisme auquel des données personnelles sont communiquées ;
<br><br>
9) « tiers » désigne toute personne autre que la personne concernée, le responsable, le sous-traitant et les personnes autorisées à traiter les données sous leur autorité directe ;
<br><br>
10) « consentement » désigne toute manifestation de volonté libre, spécifique, éclairée et univoque par laquelle la personne concernée accepte le traitement de ses données personnelles ;
<br><br>
11) « violation de données personnelles » désigne une violation de sécurité entraînant destruction, perte, altération, divulgation non autorisée ou accès non autorisé à des données personnelles.
<br><br>',
'data_protect_copy3' => '<strong>II. Responsable</strong>
<br>
Le responsable au sens du RGPD, des lois applicables dans les États membres de lUnion européenne et des autres dispositions relatives à la protection des données est :
<br><br>
<strong>mivita care gmbh</strong><br>
Herr Alois Ried<br>
Leinfeld 2<br>
87755 Kirchhaslach<br>
Téléphone : +49 (0) 8333 94 61 767<br>
E-mail : info@mivita.care<br>
<br><br>',
'data_protect_copy4' => '<strong>III. Cookies</strong>',
'data_protect_copy5' => ' <br>
Notre site utilise des cookies. Les cookies sont de petits fichiers texte déposés et enregistrés sur un système informatique via un navigateur Internet.
<br>
De nombreux sites et serveurs utilisent des cookies. Beaucoup contiennent un identifiant de cookie unique permettant dassocier les sites et serveurs au navigateur dans lequel le cookie a été enregistré. Cela permet de distinguer le navigateur individuel de la personne concernée dautres navigateurs.
<br>
Les cookies nous permettent de fournir des services plus conviviaux qui ne seraient pas possibles sans leur utilisation.
<br>
Grâce aux cookies, les informations et offres de notre site peuvent être optimisées pour lutilisateur. Les cookies nous permettent notamment de reconnaître les utilisateurs de notre site afin de leur faciliter lutilisation, par exemple en évitant de devoir ressaisir les données de connexion à chaque visite.
<br>
Les données traitées par les cookies sont nécessaires aux fins mentionnées pour préserver nos intérêts légitimes selon lart. 6 al. 1 phrase 1 let. f RGPD.
<br>
Vous pouvez empêcher à tout moment linstallation de cookies par notre site en configurant votre navigateur et ainsi vous opposer durablement à leur dépôt. Les cookies déjà installés peuvent également être supprimés à tout moment via le navigateur ou dautres logiciels. Si vous désactivez les cookies, certaines fonctions de notre site peuvent ne pas être pleinement utilisables.
<br><br>
IV. Données et informations enregistrées lors de laccès à notre site
<br>
À chaque accès à notre site, des données et informations générales sont collectées et enregistrées dans les fichiers journaux du serveur.
<br><br>
<strong>Les données/informations suivantes peuvent être collectées :</strong>
<br>
- types et versions de navigateurs utilisés
- système dexploitation utilisé
- site depuis lequel vous arrivez sur notre site
- sous-pages consultées
- date et heure de laccès
- adresse IP
- fournisseur daccès Internet
- autres données similaires servant à la prévention des risques en cas dattaque de nos systèmes informatiques.
<br><br>
Nous avons besoin de ces informations pour fournir correctement les contenus du site, garantir le fonctionnement durable de notre système informatique et fournir aux autorités les informations nécessaires en cas de cyberattaque. Nous nen tirons aucune conclusion sur la personne concernée et conservons les données anonymes des logs séparément des données personnelles.
V. Contact électronique avec nous
<br><br>
Vous pouvez nous contacter par e-mail via ladresse indiquée dans les mentions légales ou par les formulaires de contact du site. Les données personnelles transmises par e-mail ou formulaire sont enregistrées automatiquement pour traiter votre demande et vous contacter.
<br><br>
En envoyant votre message, vous consentez au traitement des données transmises. Le traitement repose sur lart. 6 al. 1 let. a RGPD. Vous pouvez révoquer ce consentement à tout moment. Votre adresse e-mail est utilisée uniquement pour traiter votre demande, puis supprimée sauf consentement à un traitement ultérieur.
<br><br>',
'data_protect_copy6' => '<strong>VI. Bases juridiques du traitement</strong>
<br>
Lorsque nous obtenons votre consentement pour une finalité déterminée, lart. 6 I let. a RGPD sert de base juridique.
<br><br>
Si le traitement est nécessaire à lexécution dun contrat ou de mesures précontractuelles, il repose sur lart. 6 I let. b RGPD.
<br><br>
Si une obligation légale nécessite le traitement, par exemple des obligations fiscales, la base juridique est lart. 6 I let. c RGPD.
<br><br>
Si le traitement est nécessaire à la sauvegarde dintérêts vitaux, il repose sur lart. 6 I let. d RGPD.
<br><br>
Enfin, lart. 6 I let. f RGPD peut servir de base lorsquun intérêt légitime de notre entreprise ou dun tiers exige le traitement et que les intérêts, droits et libertés fondamentaux de la personne concernée ne prévalent pas.
<br><br>',
'data_protect_copy7' => '<strong>VII. Dispositions légales ou contractuelles relatives à la fourniture des données personnelles</strong>
<br>
La fourniture de données personnelles peut être légalement obligatoire (p. ex. règles fiscales) ou résulter de dispositions contractuelles. Si vous souhaitez conclure un contrat avec nous, certaines données personnelles doivent nous être fournies afin dêtre traitées. Sans ces données, aucun contrat ne peut être conclu.
<br><br>',
'data_protect_copy8' => ' <strong>VIII. Suppression/blocage régulier des données personnelles</strong>
<br>
Nous traitons et conservons les données personnelles uniquement pendant la durée nécessaire à la finalité de conservation ou lorsque le législateur européen ou un autre législateur le prévoit. Lorsque la finalité disparaît ou quun délai légal expire, les données sont bloquées ou supprimées conformément aux prescriptions légales.
<br><br>
Après expiration des délais légaux de conservation, les données sont supprimées régulièrement, sauf si elles restent nécessaires à lexécution ou à la préparation dun contrat. En Allemagne, les délais sont notamment de 10 ans selon les §§ 147 AO, 257 HGB et de 6 ans pour les lettres commerciales.
<br><br>',
'data_protect_copy9' => ' <strong>IX. Vos droits</strong>
<br>
<strong>1) Droit de confirmation et daccès</strong>
<br>
Vous avez le droit de nous demander confirmation que des données personnelles vous concernant sont traitées et dobtenir gratuitement des informations sur ces données ainsi quune copie.
<br><br>
Ces informations comprennent notamment les finalités du traitement, les catégories de données, les destinataires, la durée de conservation prévue, lexistence de droits de rectification, suppression, limitation ou opposition, le droit de réclamation auprès dune autorité de contrôle, lorigine des données lorsque celles-ci ne sont pas collectées auprès de vous, ainsi que lexistence dune prise de décision automatisée y compris le profilage.
<br><br>
Vous avez également le droit de savoir si des données ont été transférées vers un pays tiers ou une organisation internationale et dêtre informé des garanties appropriées.
<br><br>
<strong>2) Droit de rectification</strong>
<br>
Vous pouvez demander la rectification immédiate de données personnelles inexactes et, compte tenu des finalités du traitement, le complément de données incomplètes.
<br><br>
<strong>3) Droit à leffacement (« droit à loubli »)</strong>
<br>
Vous pouvez demander leffacement immédiat de vos données personnelles lorsque lun des motifs légaux sapplique, notamment lorsque les données ne sont plus nécessaires, lorsque vous révoquez votre consentement, lorsque vous vous opposez au traitement, lorsque les données ont été traitées illégalement ou lorsque leffacement est nécessaire au respect dune obligation légale.
<br><br>',
'data_protect_copy10' => 'Si lun des motifs ci-dessus sapplique et que vous souhaitez faire supprimer des données personnelles enregistrées chez nous, vous pouvez nous contacter à tout moment. Nous veillerons à ce que la demande soit exécutée sans délai.
<br>
Si nous avons rendu les données publiques et sommes tenus de les supprimer, nous prendrons, compte tenu de la technologie disponible et des coûts, des mesures appropriées pour informer les autres responsables traitant ces données que vous demandez la suppression de tout lien, copie ou réplication, dans la mesure le traitement nest pas nécessaire.
<br><br>
<strong>4) Droit à la limitation du traitement</strong>
<br>
Vous pouvez demander la limitation du traitement si vous contestez lexactitude des données, si le traitement est illicite et que vous refusez leffacement, si nous navons plus besoin des données mais que vous en avez besoin pour des droits en justice, ou si vous vous êtes opposé au traitement tant que la pondération des intérêts na pas été effectuée.
<br><br>
<strong>5) Droit à la portabilité des données</strong>
<br>
Vous avez le droit de recevoir les données personnelles que vous nous avez fournies dans un format structuré, courant et lisible par machine, et de les transmettre à un autre responsable lorsque les conditions légales sont réunies.
<br><br>
<strong>6) Droit dopposition</strong>
<br>
Vous avez le droit, pour des raisons tenant à votre situation particulière, de vous opposer à tout moment au traitement fondé sur lart. 6 al. 1 let. e ou f RGPD, y compris le profilage. En cas dopposition, nous ne traiterons plus les données sauf motifs légitimes impérieux ou nécessité pour faire valoir, exercer ou défendre des droits en justice. Vous pouvez également vous opposer à tout moment au traitement à des fins de publicité directe.
<br><br>',
'data_protect_copy11' => '<strong>7) Décisions automatisées individuelles, y compris le profilage</strong>
<br>
Vous avez le droit de ne pas faire lobjet dune décision fondée exclusivement sur un traitement automatisé, y compris le profilage, produisant des effets juridiques ou vous affectant de manière similaire, sauf exceptions prévues par la loi, le contrat ou votre consentement explicite.
<br><br>
<strong>8) Droit de retirer un consentement</strong>
<br>
Vous pouvez retirer à tout moment votre consentement au traitement de données personnelles.
<br><br>
<strong>9) Droit de réclamation auprès de lautorité de contrôle</strong>
<br>
Conformément à lart. 77 RGPD, vous avez le droit de déposer une réclamation auprès dune autorité de contrôle si vous estimez que le traitement de vos données nest pas conforme à la loi.
<br><br>
<strong>X. Collaboration avec des sous-traitants/tiers</strong>
<br>
Lorsque nous communiquons, transmettons ou rendons accessibles des données à des tiers, cela se fait uniquement sur la base dune autorisation légale, de votre consentement, dune obligation légale ou de nos intérêts légitimes. Les sous-traitants sont mandatés sur la base de lart. 28 RGPD.
<br><br>
<strong>XI. Transferts vers des pays tiers</strong>
<br>
Les traitements dans un pays tiers ou dans le cadre de services tiers nont lieu que si les conditions légales sont réunies, notamment les garanties spéciales des art. 44 et suivants RGPD.
<br><br>
<strong>XII. Intégration de services et contenus de tiers</strong>
<br>
Sur la base de nos intérêts légitimes, nous intégrons des offres de tiers afin dafficher leurs contenus. Ces fournisseurs peuvent prendre connaissance de votre adresse IP, nécessaire à la transmission des contenus. Des technologies telles que pixel tags ou web beacons peuvent également être utilisées à des fins statistiques ou marketing.
<br><br>
Exemples : polices externes Google Fonts et vidéos YouTube de Google LLC. Les politiques de confidentialité correspondantes sont disponibles sur https://policies.google.com/privacy.
<br><br>',
'data_protect_copy12' => '<strong>XIII. Outils danalyse et publicité Facebook Pixel</strong>
<br>
Ce site peut utiliser le pixel Facebook pour mesurer les conversions. Le fournisseur est Facebook Ireland Limited, 4 Grand Canal Square, Dublin 2, Irlande. Selon Facebook, les données peuvent également être transférées vers les États-Unis et dautres pays tiers. Le comportement des visiteurs peut ainsi être suivi après clic sur une annonce Facebook afin dévaluer et doptimiser les mesures publicitaires. Lutilisation repose sur lart. 6 al. 1 let. f RGPD ou, si un consentement est requis, sur lart. 6 al. 1 let. a RGPD.
<br><br>
Lorsque des données personnelles sont collectées et transmises à Facebook, nous sommes responsables conjointement avec Facebook Ireland Limited pour la collecte et la transmission. Les traitements ultérieurs par Facebook ne relèvent pas de cette responsabilité conjointe. Vous trouverez davantage dinformations dans la politique de confidentialité de Facebook.
<br><br>
<strong>Collecte de données via Google Analytics et cookies</strong>
<br>
Notre site peut utiliser Google Analytics, un service danalyse web de Google Inc. Google Analytics utilise des cookies et crée des profils dutilisation pseudonymisés. Les données collectées peuvent comprendre le système dexploitation, le navigateur, ladresse IP, lURL de référence ainsi que la date et lheure de la requête. Les informations sont transmises à un serveur Google et utilisées pour analyser lutilisation du site et établir des rapports.
<br>
Vous pouvez empêcher linstallation de cookies via les paramètres de votre navigateur ou en installant le module complémentaire de navigateur proposé par Google. Les données traitées par cookies sont nécessaires à nos intérêts légitimes selon lart. 6 al. 1 phrase 1 let. f RGPD.
<br><br>
<strong>Google utilise le cookie DoubleClick DART</strong>
<br>
Les utilisateurs peuvent désactiver lutilisation du cookie DART via la politique de confidentialité du réseau publicitaire et de contenu Google. Les cookies peuvent être refusés dans les paramètres du navigateur ; cela peut toutefois limiter certaines fonctions du site.
<br><br>',
'data_protect_copy13' => '<strong>Google Adwords Conversion Tracking</strong>
<br>
Nous utilisons Google Conversion Tracking pour enregistrer statistiquement lutilisation de notre site et loptimiser pour vous. Google place un cookie sur votre ordinateur si vous arrivez sur notre site via une annonce Google.<br>
Ces cookies expirent après 30 jours et ne servent pas à lidentification personnelle. Si lutilisateur visite certaines pages et que le cookie est encore valide, Google et le client peuvent reconnaître que lutilisateur a cliqué sur lannonce et a été redirigé vers cette page.<br>
Les informations collectées servent à établir des statistiques de conversion. Aucune information permettant didentifier personnellement les utilisateurs nest transmise.<br>
Vous pouvez refuser le cookie nécessaire via les paramètres de votre navigateur ou bloquer les cookies du domaine « www.googleadservices.com ».<br>
La politique de confidentialité Google relative au conversion tracking est disponible ici (https://services.google.com/sitestats/de.html)',
'data_protect_stand_shop' => 'Version : 18.02.2022',
'data_protect_stand_site' => 'Version : 05.10.2018',
'data_protect' => 'Protection des données',
];

90
resources/lang/fr/dhl.php Normal file
View file

@ -0,0 +1,90 @@
<?php
return [
'dhl' => 'DHL',
'status' => [
'pending' => 'En attente',
'created' => 'Créé',
'in_transit' => 'En cours',
'out_for_delivery' => 'En livraison',
'delivered' => 'Livré',
'exception' => 'Problème',
'returned' => 'Retourné',
'failed' => 'Erreur',
'unknown' => 'Inconnu',
'cancelled' => 'Annulé',
'shipped' => 'Expédié',
],
'type' => [
'outbound' => 'Sortant',
'return' => 'Retour',
],
'product_codes' => [
'V01PAK' => 'DHL Paket (national)',
'V53WPAK' => 'DHL Paket International',
'V54EPAK' => 'DHL Paket International',
'V55PAK' => 'DHL Paket International',
'V62WP' => 'DHL Paket International',
'V66WPI' => 'DHL Paket International',
],
'labels' => [
'shipment_info' => 'Informations dexpédition',
'recipient_info' => 'Informations du destinataire',
'order_info' => 'Informations de commande',
'tracking_info' => 'Informations de suivi',
'related_shipments' => 'Retours liés',
'additional_services' => 'Services supplémentaires',
'api_response' => 'Réponse API (debug)',
],
'actions' => [
'download_label' => 'Télécharger létiquette',
'cancel_shipment' => 'Annuler lexpédition',
'create_return' => 'Créer une étiquette de retour',
'update_tracking' => 'Mettre à jour le suivi',
'view_details' => 'Afficher les détails',
'track_at_dhl' => 'Suivre chez DHL',
'local_tracking' => 'Suivi local',
],
'fields' => [
'id' => 'ID',
'dhl_shipment_no' => 'Numéro dexpédition DHL',
'routing_code' => 'Code de routage',
'billing_number' => 'Numéro de facturation',
'type' => 'Type',
'product_code' => 'Code produit',
'label_format' => 'Format détiquette',
'weight' => 'Poids',
'status' => 'Statut',
'tracking_status' => 'Statut de suivi',
'created_at' => 'Créé',
'updated_at' => 'Dernière modification',
'last_tracked_at' => 'Dernier suivi',
'firstname' => 'Prénom',
'lastname' => 'Nom',
'company' => 'Entreprise',
'street' => 'Rue',
'postal_code' => 'Code postal',
'city' => 'Ville',
'country' => 'Pays',
'email' => 'E-mail',
'phone' => 'Téléphone',
],
'messages' => [
'shipment_created' => 'Expédition créée avec succès !',
'shipment_cancelled' => 'Expédition annulée avec succès !',
'return_label_created' => 'Étiquette de retour créée avec succès !',
'tracking_updated' => 'Informations de suivi mises à jour !',
'label_downloaded' => 'Étiquette téléchargée avec succès !',
'no_shipments_found' => 'Aucune expédition trouvée.',
'shipment_already_exists' => 'Une expédition existe déjà pour cette commande.',
'cannot_cancel_delivered' => 'Les expéditions livrées ne peuvent pas être annulées.',
'tracking_not_available' => 'Informations de suivi non disponibles.',
'label_not_available' => 'Étiquette dexpédition non disponible.',
],
];

130
resources/lang/fr/email.php Normal file
View file

@ -0,0 +1,130 @@
<?php
return [
'account_active' => 'Compte activé',
'account_active_copy1line' => 'Votre compte a été activé après vérification réussie. Vous trouverez votre contrat conseiller sur la page daccueil dans la zone de connexion de my.mivita.care. Connectez-vous avec vos identifiants pour effectuer les prochaines étapes.',
'account_incomplete_copy1line' => 'Votre compte na pas été activé, vos données ne sont pas complètes. Veuillez suivre le lien ci-dessous pour compléter vos données.',
'activate_copy' => 'Veuillez confirmer votre e-mail et activer votre compte via ce lien :',
'active_copy1line' => 'Vous recevez cet e-mail parce que nous avons reçu une demande de modification de votre adresse e-mail pour votre compte.',
'button_account' => 'vers le compte',
'change_e_mail' => 'Modifier ladresse e-mail',
'checkout_copy1line' => 'merci pour votre commande chez mivita.care. Vous trouverez ci-dessous un récapitulatif de votre commande pour contrôle.',
'checkout_copy3line' => 'Nous sommes à votre disposition pour toute question.',
'checkout_copy3line_extern' => 'Commande via conseiller :',
'checkout_mail_bank_bic' => 'BIC :',
'checkout_mail_bank_code' => 'Référence de paiement',
'checkout_mail_bank_holder' => 'Titulaire du compte :',
'checkout_mail_bank_iban' => 'IBAN :',
'checkout_mail_bank_name' => 'Banque',
'checkout_mail_bank_total' => 'Montant total',
'checkout_mail_deliver_addess' => 'Votre adresse de livraison :',
'checkout_mail_deliver_customer' => 'Adresse de livraison du client :',
'checkout_mail_hl1' => 'Vous avez commandé les articles suivants :',
'checkout_mail_invoice_addess' => 'Votre adresse de facturation :',
'checkout_mail_order_for_extern' => 'Commande client via boutique externe :',
'checkout_mail_order_for_me' => 'Commande conseiller pour vous :',
'checkout_mail_order_for_membership' => 'Commande conseiller pour votre adhésion :',
'checkout_mail_order_for_ot' => 'Commande conseiller pour votre client :',
'checkout_mail_order_for_wizard' => 'Commande conseiller pour votre inscription :',
'checkout_mail_pay_approved' => 'Votre paiement a été approuvé, une confirmation de paiement sera créée automatiquement.',
'checkout_mail_pay_error' => 'Le paiement a échoué !',
'checkout_mail_pay_info' => 'Info paiement :',
'checkout_mail_pay_invoice_open' => 'Votre paiement sur facture a été approuvé.',
'checkout_mail_pay_pre' => 'Paiement anticipé :',
'checkout_mail_pay_pre_c1' => 'Veuillez virer',
'checkout_mail_pay_pre_c2' => 'EUR sur le compte suivant afin de finaliser lachat.',
'checkout_mail_pay_ref' => 'Référence de paiement :',
'checkout_mail_pay_success' => 'Le paiement est confirmé !',
'checkout_mail_pay_with' => 'Paiement avec :',
'checkout_mail_same_address' => 'Ladresse de livraison est identique à ladresse de facturation',
'checkout_mail_shipping' => 'Frais demballage et de livraison',
'checkout_mail_status_info' => 'Info statut :',
'checkout_mail_subtotal_ws' => 'Somme hors TVA',
'checkout_mail_system_status' => 'Statut système :',
'checkout_mail_tax' => 'plus TVA',
'checkout_mail_tax_info' => 'Prix TVA incluse',
'checkout_mail_total' => 'Prix total',
'checkout_mail_your_mail' => 'Votre e-mail :',
'checkout_subject' => 'Votre commande chez',
'checkout_subject_extern' => 'Nouvelle commande',
'checkout_subject_paid' => 'Confirmation de paiement - votre commande chez',
'copy2line' => 'Ou copiez ce lien dans la barre dadresse de votre navigateur.',
'copy3line' => 'Nous restons volontiers à votre disposition pour toute question.',
'copy_to_browser' => 'Ou copiez ce lien dans la barre dadresse de votre navigateur.',
'credit_copy1line' => 'Votre avoir est arrivé et vous lavez bien mérité !
Nous transférerons le montant à verser sur votre compte dans les 5 prochains jours ouvrés. Veuillez vérifier que vos coordonnées bancaires actuelles sont enregistrées dans votre compte Salescenter (Mon compte -> Mes données). Nous vous souhaitons encore beaucoup de succès chez MIVITA.
Vous souhaitez aller encore plus loin ? Parlez-en à votre sponsor ou à dautres responsables déquipe. Ils élaboreront avec vous, sur la base de notre plan marketing, votre voie personnelle vers le succès.
Cordialement,
Votre équipe MIVITA',
'credit_title' => 'Votre avoir sur mivita.care',
'dear_mrs' => 'Bonjour',
'dear_sir' => 'Bonjour',
'email' => 'E-mail',
'email_incomplete' => 'Vos données ne sont pas complètes.',
'email_subject' => 'Message de mivita.care',
'email_verify' => 'Confirmez votre adresse e-mail',
'email_verify_copy1line' => 'Merci pour votre inscription. Veuillez suivre le lien ci-dessous pour confirmer votre adresse e-mail.',
'first_name' => 'Prénom',
'footer_copy1' => 'mivita care gmbh | Leinfeld 2 | 87755 Kirchhaslach | Téléphone : +49 (0) 8333 94 61 767 | E-mail : info@mivita.care',
'footer_copy2' => 'Gérant : Alois Ried | Tribunal denregistrement : Memmingen | Numéro denregistrement : HRB 21591 | N° TVA : DE 453867883',
'footer_copy3' => '© 2020 All Rights Reserved',
'greetings' => 'Cordialement',
'hello' => 'Bonjour',
'invoice_copy1line' => 'merci pour votre commande chez mivita.care. Vous trouverez ci-joint la facture relative à votre commande : ',
'invoice_title' => 'Facture relative à votre commande sur mivita.care',
'invoice_subject' => 'Facture relative à votre commande',
'cancellation_invoice_copy1line' => 'vous trouverez ci-joint la facture dannulation relative à votre commande : ',
'cancellation_invoice_title' => 'Facture dannulation relative à votre commande sur mivita.care',
'cancellation_invoice_subject' => 'Facture dannulation relative à votre commande',
'last_name' => 'Nom',
'mail_confirm' => 'Confirmer le-mail',
'message' => 'Message',
'phone' => 'Téléphone',
'request_from' => 'Demande de mivita.care',
'reset_pass_copy1line' => 'Vous recevez cet e-mail parce que nous avons reçu une demande de réinitialisation du mot de passe de votre compte.',
'reset_passwort' => 'Réinitialiser le mot de passe',
'sales_partnership' => 'Partenariat commercial',
'sales_partnership_message' => 'Remarque',
'salutation' => 'Civilité',
'sender' => 'Votre équipe mivita.care',
'status_copy1line' => 'Statut de votre commande sur mivita.care',
'subject' => 'Objet',
'subject_activate' => 'Activer le compte',
'subject_reset' => 'Réinitialiser le mot de passe',
'update_level_copy1line' => '<b>Félicitations !</b><br><br>Nous sommes incroyablement fiers de vous ! Le mois dernier, avec vos <b>:tp TP</b>, vous navez pas seulement atteint votre qualification, vous avez accompli quelque chose de formidable !<br><br>Votre engagement constant a porté ses fruits. À partir de maintenant, vous êtes :<br><br><h2 style="color: #6b7758; margin: 20px 0;"><b> :to </b></h2><br>Cest une étape majeure dans votre carrière chez MIVITA !',
'update_level_title' => 'Vous avez atteint votre prochain niveau de carrière !',
'update_level_copy2line' => 'Votre succès est aussi notre succès, et nous sommes ravis de pouvoir vous accompagner dans ce parcours passionnant. Avec ce nouveau niveau, encore plus de possibilités souvrent à vous :<br><br>- Commissions plus élevées et meilleures marges<br>- Possibilités étendues pour votre business<br>- Plus de reconnaissance et de statut dans léquipe',
'update_level_copy3line' => 'Ce nest que le début ! <br><br>Votre succès prouve que le travail continu et la passion mènent au but. Restez motivé, inspirez votre équipe et atteignez avec nous des objectifs encore plus grands.<br><br>Votre prochain niveau vous attend déjà, et nous savons que vous y arriverez !',
'verify_copy1line' => 'Nous avons enregistré des données vous concernant dans notre système. Veuillez suivre le lien ci-dessous pour confirmer votre adresse e-mail. Vous pouvez également modifier ou supprimer vos données.',
'verify_e_mail' => 'Confirmez vos données et votre adresse e-mail',
'your_request_from' => 'Votre demande de',
'your_custom_payout' => 'Votre conseiller mivita personnel - :name a préparé une commande individuelle pour vous. Il ne vous reste plus quà payer votre commande. Cliquez sur le lien pour accéder au checkout de mivita.care.',
'your_custom_abo_payout' => 'Votre conseiller mivita personnel - :name a préparé une commande dabonnement individuelle pour vous. Il ne vous reste plus quà payer votre commande dabonnement. Cliquez sur le lien pour accéder au checkout de mivita.care.',
'subject_custom_payout' => 'Votre commande individuelle de :name sur mivita.care',
'subject_custom_abo_payout' => 'Votre commande dabonnement individuelle de :name sur mivita.care',
'button_custom_payout' => 'vers le paiement',
'checkout_custom_payout' => 'Votre conseiller a composé les produits suivants pour vous',
'user_restore_subject' => 'Votre compte a été restauré',
'user_restore_title' => 'Restauration du compte réussie',
'user_restore_greeting' => 'Bonjour :name,',
'user_restore_copy1line' => 'nous sommes heureux de vous informer que votre compte chez mivita.care a été restauré avec succès.',
'user_restore_copy2line' => 'Comme votre mot de passe a été réinitialisé pour des raisons de sécurité lors de la suppression, vous devez définir un nouveau mot de passe. Cliquez sur le bouton suivant pour réinitialiser votre mot de passe :',
'user_restore_copy3line' => '• Votre mot de passe a été réinitialisé - veuillez définir un nouveau mot de passe via le lien ci-dessus.<br>• Si vous aviez une boutique : le nom de boutique (sous-domaine) a été libéré lors de la suppression et doit être attribué à nouveau.',
'user_restore_button' => 'Définir un nouveau mot de passe',
'user_restore_account_valid' => 'Votre adhésion conseiller est valable jusquau :',
'user_restore_important' => 'Remarques importantes :',
'dhl_tracking_subject' => 'Votre envoi est en route - mivita.care',
'dhl_tracking_subject_multiple' => 'Vos :count envois sont en route - mivita.care',
'dhl_tracking_title' => 'Votre envoi est en route !',
'dhl_tracking_preview' => 'Numéro denvoi : :number - Suivez votre colis chez DHL',
'dhl_tracking_message' => 'bonne nouvelle ! Votre commande a été expédiée et est en route vers vous.',
'dhl_tracking_message_multiple' => 'bonne nouvelle ! Votre commande a été expédiée en :count colis et est en route vers vous.',
'dhl_tracking_package_label' => 'Colis :number',
'dhl_tracking_number_label' => 'Votre numéro denvoi',
'dhl_tracking_order_ref' => 'Numéro de commande : :order',
'dhl_tracking_button' => 'Suivre lenvoi chez DHL',
'dhl_tracking_info' => 'Vous pouvez consulter à tout moment le statut actuel de votre envoi chez DHL via le bouton ci-dessus.',
];

71
resources/lang/fr/gtc.php Normal file
View file

@ -0,0 +1,71 @@
<?php
return [
'gtc' => 'Conditions générales de vente',
'gtc_copy1' => '<strong>Principes généraux</strong><br>
1) Les présentes conditions générales sappliquent à tous les contrats que vous concluez avec nous en tant que fournisseur (mivita care gmbh) via le site Internet www.mivita.care. Loffre de produits de notre boutique en ligne sadresse exclusivement aux clients majeurs. Lintégration de conditions générales de clients qui contredisent les présentes conditions est dores et déjà refusée. La langue du contrat est lallemand. Vous pouvez consulter et imprimer ces conditions générales sur notre site.
<br>
<br>
2) Nous ne conservons pas le texte complet du contrat. Avant lenvoi de votre commande, vous pouvez imprimer les données contractuelles via le système de panier en ligne ou les sauvegarder électroniquement. Après réception de votre commande, nous vous envoyons à nouveau par e-mail les données de commande, les informations légalement requises pour les contrats à distance et les conditions générales.
<br><br>',
'gtc_copy2' => '<strong>Conclusion du contrat</strong><br>
1) Nos offres de produits sur Internet sont sans engagement et ne constituent pas une offre ferme de conclusion de contrat. Vous pouvez passer une commande, cest-à-dire une offre dachat ferme, via notre système de panier en ligne. Pour cela, placez les marchandises que vous souhaitez acheter dans le « panier ». Le bouton correspondant dans la barre de navigation vous permet daccéder au panier et dy effectuer des modifications à tout moment. Après lappel de la page « Caisse » et la saisie de vos données personnelles ainsi que des conditions de paiement et de livraison, toutes les données de commande sont à nouveau affichées dans un récapitulatif. Vous pouvez alors vérifier toutes les informations avant lenvoi, les modifier (également via la fonction « retour » du navigateur) ou annuler lachat. En envoyant la commande via le bouton « Acheter », vous faites une offre ferme de conclusion du contrat. Vous recevez ensuite une confirmation automatique de réception par e-mail, qui ne constitue pas encore lacceptation du contrat.
<br><br>
(2) Nous pouvons accepter votre offre dans un délai de 2 jours par lenvoi dune confirmation de commande par e-mail. Si vous ne recevez pas de message correspondant dans ce délai, vous nêtes plus lié à votre commande. Les prestations déjà fournies vous seront alors remboursées sans délai.
<br><br>
(3) Le traitement de la commande et la transmission de toutes les informations nécessaires à la conclusion du contrat seffectuent en partie automatiquement par e-mail. Vous devez donc vous assurer que ladresse e-mail indiquée est correcte, que la réception des e-mails est techniquement garantie et quelle nest notamment pas empêchée par des filtres anti-spam.
<br><br>',
'gtc_copy3' => '<strong>§ 3 Prix/modalités de paiement</strong><br>
(1) Les prix indiqués dans nos offres ainsi que les frais de livraison sont des prix totaux. Ils comprennent tous les éléments de prix, y compris toutes les taxes applicables.
<br><br>
(2) Les frais de livraison ne sont pas inclus dans le prix dachat. Ils peuvent être consultés via un bouton identifié sur notre site ou dans la description de larticle concerné. Ils sont également indiqués séparément au cours du processus de commande et sont à votre charge en plus du prix, sauf si une livraison gratuite est promise.
<br><br>
(3) Nous vous proposons différents modes de paiement. Ceux-ci sont indiqués sous un bouton correspondant sur notre site ou dans la description de larticle concerné. Sauf indication contraire, les créances de paiement issues du contrat conclu sont immédiatement exigibles.
<br><br>',
'gtc_copy4' => '<strong>§ 4 Conditions de livraison</strong><br>
(1) Les conditions de livraison, les délais de livraison et les éventuelles restrictions de livraison peuvent être consultés via un bouton correspondant sur notre site ou dans la description de larticle concerné.
<br><br>
(2) Pour les consommateurs, le risque de perte accidentelle et de détérioration accidentelle de la chose vendue pendant lexpédition ne passe à ceux-ci quau moment de la remise de la marchandise. Cela sapplique indépendamment du fait que lexpédition soit assurée ou non. Cela ne sapplique toutefois pas si vous avez chargé de votre propre initiative un transporteur non désigné par lentrepreneur ou une autre personne chargée de lexécution de lexpédition.
<br><br>
(3) Pour les entrepreneurs, la livraison et lexpédition se font à leurs propres risques.
<br><br>',
'gtc_copy5' => '<strong>§ 5 Droit de rétention, réserve de propriété</strong><br>
(1) Vous ne pouvez exercer un droit de rétention que dans la mesure il sagit de créances issues du même rapport contractuel.
<br><br>
(2) La marchandise reste notre propriété jusquau paiement intégral du prix dachat.
<br><br>
(3) Pour les entrepreneurs, les dispositions suivantes sappliquent en complément :
<br><br>
- Nous nous réservons la propriété de la marchandise jusquau règlement complet de toutes les créances issues de la relation commerciale en cours. Avant le transfert de propriété de la marchandise réservée, tout nantissement ou transfert à titre de garantie est interdit.
<br>
- Vous pouvez revendre la marchandise dans le cadre dune activité commerciale régulière. Dans ce cas, vous nous cédez dès à présent toutes les créances à hauteur du montant de la facture issues de la revente. Nous acceptons cette cession ; vous restez toutefois autorisé à recouvrer les créances. Si vous ne remplissez pas correctement vos obligations de paiement, nous nous réservons le droit de recouvrer nous-mêmes les créances.
<br>
- En cas de combinaison ou mélange de la marchandise réservée, nous acquérons une copropriété sur la nouvelle chose proportionnellement à la valeur facturée de la marchandise réservée par rapport aux autres objets transformés au moment de la transformation.
<br>
- Nous nous engageons à libérer, à votre demande, les garanties qui nous reviennent dans la mesure leur valeur réalisable dépasse de plus de 10 % les créances à garantir. Le choix des garanties à libérer nous appartient.
<br><br>',
'gtc_copy6' => '<strong>§ 6 Garantie</strong><br>
(1) Les droits légaux en matière de défauts sappliquent.
<br><br>
(2) Pour les entrepreneurs, les dispositions suivantes dérogent à lalinéa 1 :
<br><br>
- En tant quentrepreneur, vous devez examiner la marchandise immédiatement et avec le soin requis quant aux écarts de qualité et de quantité et nous signaler par écrit les défauts apparents dans les 7 jours suivant la réception. Lenvoi dans les délais suffit. Cela vaut également pour les défauts cachés découverts ultérieurement. Si vous ne respectez pas votre obligation dexamen et de réclamation, toute revendication de droits de garantie est exclue.
<br>
- En cas de défaut, nous pouvons, à notre choix, assurer la garantie par réparation ou livraison de remplacement. Si la suppression du défaut échoue, vous pouvez à votre choix demander une réduction ou résilier le contrat. La suppression du défaut est réputée avoir échoué après une deuxième tentative infructueuse, sauf si la nature de la chose, du défaut ou dautres circonstances indiquent autre chose. En cas de réparation, nous ne supportons pas les coûts supplémentaires résultant du transport de la marchandise vers un lieu autre que le lieu dexécution, si ce transport ne correspond pas à lutilisation prévue de la marchandise.
<br>
- Le délai de garantie est dun an à compter de la livraison. Le délai raccourci ne sapplique pas aux dommages causés fautivement par nous résultant dune atteinte à la vie, au corps ou à la santé, ni aux dommages causés par négligence grave ou intentionnellement, en cas de dol, ainsi quaux recours conformément aux §§ 478, 479 BGB.
<br><br>',
'gtc_copy7' => '<strong>§ 7 Responsabilité</strong><br>
(1) Nous sommes responsables sans limitation des dommages résultant dune atteinte à la vie, au corps ou à la santé. Nous sommes également responsables sans limitation dans tous les cas de faute intentionnelle et de négligence grave, en cas de dissimulation dolosive dun défaut, en cas de prise en charge dune garantie quant à la qualité de lobjet acheté et dans tous les autres cas prévus par la loi.
<br>
(2) Si des obligations contractuelles essentielles sont concernées, notre responsabilité en cas de négligence légère est limitée au dommage prévisible typique du contrat. Les obligations contractuelles essentielles sont celles qui résultent de la nature du contrat et dont la violation compromettrait la réalisation de lobjet du contrat, ainsi que les obligations que le contrat nous impose selon son contenu pour atteindre lobjet du contrat, dont lexécution rend possible la bonne réalisation du contrat et au respect desquelles vous pouvez régulièrement vous fier.
<br><br>',
'gtc_copy8' => '<strong>§ 8 Dispositions finales</strong><br>
(1) Le droit allemand sapplique. Pour les consommateurs, ce choix de loi ne vaut que dans la mesure il ne retire pas la protection accordée par les dispositions impératives du droit de lÉtat de résidence habituelle du consommateur (principe de faveur). Les dispositions de la Convention des Nations Unies sur les contrats de vente internationale de marchandises sont expressément exclues.
<br><br>
(2) Le lieu dexécution de toutes les prestations issues des relations commerciales existant avec nous ainsi que le tribunal compétent sont ceux de notre siège, dans la mesure vous nêtes pas consommateur mais commerçant, personne morale de droit public ou patrimoine spécial de droit public. Il en va de même si vous navez pas de tribunal compétent général en Allemagne ou dans lUE ou si votre domicile ou lieu de résidence habituel nest pas connu au moment de lintroduction de laction. La faculté de saisir également le tribunal dun autre ressort légal reste inchangée.
<br><br>',
'gtc_copy9' => 'Version : 05.10.2018
<br><br>',
'' => '',
];

View file

@ -0,0 +1,61 @@
<?php
return [
'' => '',
'MIVITA_Consultancy_agreement' => 'Contrat_conseiller_MIVITA',
'active_role' => 'Rôle actif',
'activities' => 'Activités',
'adjust_data' => 'Adapter les données',
'adviser_membership_active' => 'Adhésion conseiller active',
'adviser_onlineshop_active' => 'Boutique en ligne conseiller active',
'adviser_onlineshop_inactive' => 'Boutique conseiller inactive',
'advisor_account_inactive' => 'Compte conseiller inactif',
'at' => 'le',
'change_your_email_address' => 'Modifiez votre adresse e-mail.',
'change_your_personal_data' => 'Modifiez vos données personnelles.',
'change_your_personal_password' => 'Modifiez votre mot de passe personnel.',
'create_your_personal_password' => [
'' => 'Créez votre mot de passe personnel.',
],
'current_points_for' => 'Points actuels pour',
'data' => 'Données',
'data_complete_unlocked' => 'Données complètes, activées',
'declaration_of_consent' => 'Déclaration de consentement',
'email_verified' => 'E-mail vérifié',
'expired_on' => 'expiré le',
'log_out_and_see_you_soon' => 'Se déconnecter et à bientôt.',
'login' => 'Connexion',
'manage_membership' => 'Gérer ladhésion',
'manage_membership_now_here' => 'Gérer ladhésion ici maintenant',
'membership' => 'Adhésion',
'news_updates' => 'Actualités & mises à jour',
'news_archive' => 'Archive des actualités',
'news_archive_title' => 'Toutes les actualités & mises à jour',
'news_archive_current' => 'Actualités actuelles',
'news_archive_older' => 'Messages plus anciens',
'news_archive_empty' => 'Aucun message plus ancien disponible.',
'news_archive_link' => 'Voir toutes les actualités',
'news_back_to_dashboard' => 'Retour au tableau de bord',
'open_since' => 'Ouvert depuis',
'open_your_shop' => 'Ouvrez votre propre boutique mivita',
'read_less' => 'Afficher moins',
'read_more' => 'Lire la suite',
'privacy_policy_approved' => 'Politique de confidentialité acceptée',
'security' => 'Sécurité',
'settings_your_shop' => 'Paramètres de votre boutique',
'shop_not_booked' => 'Boutique non réservée',
'today_is' => 'Nous sommes le',
'until' => 'jusquau',
'welcome_back' => 'Bon retour',
'your_shop' => 'Votre boutique',
'monthly_statistics' => 'Statistique mensuelle',
'customer_turnover_points' => 'Points chiffre daffaires clients',
'team_turnover_points' => 'Points chiffre daffaires équipe',
'direct_new_partners' => 'Nouveaux partenaires directs',
'team_new_partners' => 'Nouveaux partenaires dans léquipe',
'customer_subscriptions' => 'Abonnements clients',
'team_subscriptions' => 'Abonnements équipe',
'own' => 'Propres',
'live_calculation_hint' => 'Calcul en direct (pas encore terminé)',
'live_calculation_hint_text' => 'Ne sera calculé quà la fin du mois.',
];

View file

@ -0,0 +1,74 @@
<?php
return [
'' => '',
'acceptect_data_protection' => 'Jaccepte par la présente le traitement des données mentionné dans :datenschutz ',
'add_as_guest' => 'sinscrire comme invité',
'add_product' => 'Ajouter un produit',
'completed' => 'terminé',
'confirm_my_data_is_correct_and_complete' => 'Je confirme que mes données sont exactes et complètes. Après lenvoi, toute modification ne sera possible que via mon conseiller MIVITA personnel.*',
'copy' => 'Copié !',
'copy_link' => 'Copier le lien',
'copy_link_info' => 'Partage ce lien avec les invités (p. ex. WhatsApp ou SMS). Ils accéderont ainsi à une page où ils pourront saisir eux-mêmes leurs données. Utilise licône de copie pour copier immédiatement le lien dans ton presse-papiers.',
'country_can_no_longer_be_changed_after_created' => 'Le pays de livraison ne peut plus être modifié après la création. Toutes les adresses de livraison doivent se trouver dans ce pays.',
'create_delivery_address_host_info' => 'Ladresse de livraison et lhôte/hôtesse ne sont pas encore créés.',
'create_guest' => 'Créer un invité',
'create_guests' => 'Créer des invités',
'create_guests_info' => 'Ensuite, des invités pourront être créés et des commandes passées.',
'create_new_homeparty' => 'Créer une nouvelle Auszeitparty',
'credit_bonus' => 'Avoir bonus',
'credit_homeparty_voucher' => 'Avoir bon Auszeitparty',
'current_bonus_view' => 'Vue bonus actuelle',
'data_protection' => 'Politique de confidentialité',
'data_protection_reasons_your_personal_data_will_not_be_shown' => 'Remarque : pour des raisons de protection des données, vos données personnelles ne sont pas affichées ici aux autres participants. Après lenvoi, elles ne pourront plus être modifiées. Si vous souhaitez effectuer une modification ultérieure, veuillez vous adresser à votre conseiller MIVITA personnel.',
'deduct_points_by_voucher' => 'Déduction de points par bon',
'delivery_address_homeparty' => 'Adresse de livraison Auszeitparty',
'delivery_directly_to_the_guest' => 'Livraison directement à linvité',
'delivery_to_host' => 'Livraison à lhôte/hôtesse',
'description_welcome_text' => 'Description / texte de bienvenue',
'enter_your_personal_data_for_homeparty' => 'Saisie de vos données personnelles pour lAuszeitparty',
'event_date' => 'Date de lévénement',
'event_place' => 'Lieu de lévénement',
'from' => 'à partir de',
'general_overview' => 'Vue densemble',
'guest' => 'Invité',
'guest_delete_really' => 'Supprimer vraiment linvité ?',
'guest_lists' => 'Liste des invités',
'guest_order_sent_directly_info' => 'Si un invité souhaite que sa commande soit envoyée directement à son adresse personnelle, tu peux lindiquer séparément dans le processus de commande.',
'guests' => 'Invités',
'homeparty' => 'Auszeitparty',
'homeparty_add_host_address_info' => 'Saisis ici ladresse de lhôte/hôtesse où lAuszeitparty est organisée.',
'homeparty_delete_really' => 'Supprimer vraiment lAuszeitparty ?',
'homeparty_invoice_info' => 'La facture mivita est établie à ton adresse (conseiller/ère). Tu gères toi-même le règlement avec lhôte/hôtesse et les invités.',
'homeparty_manage' => 'Gérer lAuszeitparty',
'host' => 'Hôte/hôtesse',
'host_address_save' => 'Enregistrer ladresse de lhôte/hôtesse',
'host_can_not_delete' => 'Lhôte/hôtesse ne peut pas être supprimé(e)',
'host_homeparty' => 'Hôte/hôtesse Auszeitparty',
'host_organiser_event' => 'Hôte/hôtesse / organisateur/trice',
'invitation' => 'Invitation',
'invitation_link_for_guests' => 'Lien dinvitation pour les invités',
'invoice_address' => 'Adresse de facturation',
'let_your_guests_fill_in_their_own_details' => 'laisse tes invités remplir eux-mêmes leurs données',
'manage' => 'Gérer',
'missing' => 'manquent encore',
'next_bonus' => 'Prochain bonus',
'order' => 'Commande',
'order_can_be_send_delivery_address_info' => 'La commande ne peut être envoyée quune fois ladresse de livraison de lhôte/hôtesse créée.',
'order_create' => 'Créer une commande',
'order_host' => 'Commande hôte/hôtesse',
'order_show' => 'Afficher la commande',
'please_enter_delivery_address_info' => 'Saisis ici ladresse centrale de livraison pour les commandes de cette Auszeitparty. Il peut sagir de ta propre adresse ou de celle de lhôte, selon la manière dont tu souhaites organiser la distribution des produits avec tes invités.',
'revoke_consent_at_any_time' => 'Jai été informé(e) que je peux révoquer ce consentement à tout moment.*',
'shipping_costs_host' => 'Frais de livraison hôte/hôtesse',
'target_turnover' => 'Chiffre daffaires cible',
'voucher' => 'Bon',
'voucher_bonus' => 'Bonus bon',
'voucher_bonus_cannot_be_applied' => 'Le bon / bonus ne peut pas être appliqué, car aucun produit na été ajouté chez lhôte/hôtesse.',
'voucher_total' => 'Total bon',
'your_MIVITA_advice' => 'Votre conseil MIVITA',
'your_data_has_been_successfully_created_have_fun' => 'Vos données ont été créées avec succès. Amusez-vous bien à lAuszeitparty !',
'your_host' => 'Votre hôte',
'your_hostess' => 'Votre hôtesse',
'welcome_copy' => 'Bienvenue à notre Auszeitparty autour de lAloe Vera bio et de la cosmétique naturelle. Nous vous expliquons ce que signifie réellement la qualité premium en cosmétique naturelle, vous montrons de nombreux exemples dutilisation pour les problèmes de peau et dintestin et, bien sûr, vous pourrez tester largement nos produits. Nous nous réjouissons de votre venue !',
];

View file

@ -0,0 +1,159 @@
<?php
return [
'incentives' => 'Incentives',
'incentive' => 'Incentive',
'name' => 'Nom',
'status' => 'Statut',
'period' => 'Période',
'actions' => 'Actions',
'participants' => 'Participants',
'save' => 'Enregistrer',
'cancel' => 'Annuler',
'yes' => 'Oui',
'no' => 'Non',
'you' => 'Vous',
'status_draft' => 'Brouillon',
'status_active' => 'Actif',
'status_closed' => 'Terminé',
'create' => 'Créer un nouvel incentive',
'edit' => 'Modifier',
'created' => 'Lincentive a été créé avec succès.',
'updated' => 'Lincentive a été mis à jour avec succès.',
'configuration' => 'Configuration',
'qualification_start' => 'Début de qualification',
'qualification_end' => 'Fin de qualification',
'calculation_end' => 'Fin du calcul',
'points_partner_onetime' => 'Points uniques par partenaire',
'points_abo_onetime' => 'Points uniques par abonnement',
'min_direct_partners' => 'Min. partenaires directs',
'min_customer_abos' => 'Min. abonnements clients',
'max_winners' => 'Max. gagnants',
'image' => 'Image',
'image_help' => 'Nom du fichier image dans le dossier public/img/incentive/ (p. ex. montenegro-2026.jpg)',
'description' => 'Description / texte publicitaire',
'description_help' => 'Texte dintroduction motivant affiché sur la page teaser.',
'terms' => 'Conditions de participation',
'terms_help' => 'Texte complet des conditions de participation. Affiché comme zone dépliable sur la page.',
'name_help' => 'Nom interne de lincentive (également affiché comme titre de page).',
'subtitle' => 'Sous-titre',
'subtitle_placeholder' => 'p. ex. Votre pause exclusive sur lAdriatique !',
'subtitle_help' => 'Court slogan publicitaire affiché dans la zone hero sous le titre.',
'content_lang_de' => 'Allemand',
'default_language' => 'Standard',
'lang_fallback_hint' => 'Laisser vide = lallemand est utilisé comme fallback.',
'ranking' => 'Classement',
'rank' => 'Rang',
'consultant' => 'Conseiller',
'total_points' => 'Points totaux',
'partners' => 'Partenaires',
'abos' => 'Abonnements',
'qualified' => 'Qualifié',
'open' => 'Ouvert',
'winner' => 'Gagnant',
'no_participants' => 'Aucun participant pour le moment.',
'no_participants_with_points' => 'Aucun participant avec des points pour le moment.',
'anonymous_consultant' => 'Conseiller anonyme',
'ranking_all_active' => 'Tous les actifs',
'vip_view_notice' => 'Vue VIP : les noms réels de tous les participants sont affichés.',
'vip_terms_accepted' => 'Conditions de participation acceptées',
'vip_terms_pending' => 'Conditions de participation pas encore acceptées',
'ranking_anonymous_hint' => 'Les noms napparaissent quaprès confirmation de la participation à lincentive.',
'ranking_extended_hint' => 'La liste affiche tous les conseillers avec plus de 0 point. Les :n meilleurs conseillers qualifiés (mis en évidence) gagnent ; les places suivantes montrent qui peut encore progresser.',
'calculation_details' => 'Détails du calcul',
'close' => 'Fermer',
'recalculate' => 'Recalcul',
'recalculate_confirm' => 'Le recalcul doit-il être lancé ?',
'force_recalculate' => 'Recalculer complètement',
'force_recalculate_confirm' => 'ATTENTION : tous les logs existants seront supprimés et recalculés entièrement. Continuer ?',
'recalculated' => 'Recalcul terminé. :participants participants traités, :errors erreurs.',
'admin_terms_accepted' => 'Participation (conditions)',
'admin_terms_pending' => 'En attente',
'admin_terms_accepted_at_tooltip' => 'Moment de la confirmation',
'participate_title' => 'Participer maintenant !',
'accept_terms' => 'Jaccepte les conditions de participation',
'show_terms' => 'Afficher les conditions',
'participate_now' => 'Participer maintenant',
'not_active' => 'Cet incentive nest actuellement pas actif.',
'terms_required' => 'Veuillez accepter les conditions de participation.',
'already_participating' => 'Vous participez déjà.',
'participation_confirmed' => 'Votre participation a été confirmée !',
'teaser_hero_subtitle' => 'Votre pause exclusive sur lAdriatique vous attend !',
'teaser_intro_bold' => 'Préparez vos valises, mivita récompense vos meilleures performances !',
'teaser_intro_text' => 'Vivez des journées inoubliables sur la côte pittoresque, échangez avec les top leaders et célébrez votre succès avec nous !',
'teaser_intro_cta' => 'Faites-vous partie des :n meilleurs partenaires ? Alors vous êtes de la partie !',
'teaser_until' => 'jusquau',
'teaser_partner_onetime_text' => 'une fois par nouveau partenaire directement sponsorisé pendant la période de qualification.',
'teaser_abo_onetime_text' => 'une fois par nouvel abonnement client conclu pendant la période de qualification.',
'teaser_cta_ready' => 'Êtes-vous prêt pour le challenge ?',
'teaser_cta_text' => 'Inscrivez-vous maintenant pour être listé dans le classement officiel. Seuls les :n meilleurs conseillers qualifiés gagnent !',
'teaser_cta_button' => 'Vers le classement & participation',
'teaser_cta_to_ranking' => 'Vers le classement live',
'teaser_cta_already_in' => 'Vous êtes déjà inscrit. Suivez votre rang actuel dans le classement live.',
'teaser_pending_title' => 'Vos points sont déjà comptabilisés',
'teaser_pending_text' => 'Confirmez votre participation afin que votre nom apparaisse dans le classement et que vous puissiez utiliser la vue détaillée.',
'teaser_cta_confirm' => 'Confirmer la participation',
'teaser_cta_coming_soon' => 'Ça commence bientôt !',
'section_period' => 'La période de qualification',
'qualification_period' => 'Période de qualification',
'calculation_period' => 'Sprint final (fin du calcul)',
'calculation_period_hint' => 'Les points accumulés sont calculés jusquau :date inclus.',
'section_min_qual' => 'Votre ticket : la qualification minimale',
'min_qual_intro' => 'Pour être listé dans le classement officiel et entrer en ligne de compte pour le gain, les objectifs de base suivants doivent être atteints pendant la période de qualification :',
'min_partners_label' => 'nouveaux partenaires directs (chacun uniquement avec un pack de démarrage)',
'min_abos_label' => 'nouveaux abonnements clients conclus',
'min_qual_ranking_hint' => 'Dans le classement live, votre nom nest mis en gras quune fois cette qualification minimale atteinte avec succès.',
'section_points' => 'Comment collecter vos points incentive',
'points_partners_title' => 'Points pour nouveaux partenaires',
'points_abos_title' => 'Points pour abonnements clients',
'points_short' => 'pts',
'points_onetime_label' => 'une fois par nouveau partenaire/abonnement',
'points_starter_package_label' => 'chacun avec un pack de démarrage commandé directement ; les nouveaux partenaires avec seulement une adhésion ne comptent malheureusement pas.',
'points_partner_boost' => 'Boost supplémentaire : vous recevez tous les points de chiffre daffaires clients et personnel de votre nouveau partenaire à partir de sa date de départ, pendant la période de qualification.',
'points_abo_direct' => 'Votre propre abonnement compte également, y compris les abonnements existants.',
'points_abo_boost' => 'Boost supplémentaire : vous recevez les points mensuels dabonnement à partir du mois de conclusion, pendant la période de qualification.',
'section_ranking' => 'Le classement live',
'ranking_winners_hint' => 'Seuls les :n meilleurs conseillers qualifiés gagnent.',
'dashboard_btn_teaser' => 'Vers lincentive',
'dashboard_btn_ranking' => 'Vers le classement live',
'read_more' => 'Lire la suite',
'read_less' => 'Lire moins',
'you_participate' => 'Vous participez !',
'your_rank' => 'Votre rang actuel',
'participate_intro' => 'Êtes-vous prêt pour le challenge ? Inscrivez-vous une fois pour être listé dans le classement officiel.',
'dash_notice_unregistered_title' => 'Pas encore inscrit',
'dash_notice_unregistered_body' => 'Vous ne participez pas encore officiellement à lincentive. Sans confirmation, vos points ne seront pas pris en compte et vous napparaîtrez pas dans le classement.',
'dash_notice_unconfirmed_title' => 'Participation pas encore confirmée',
'dash_notice_unconfirmed_body' => 'Vos points sont déjà comptabilisés, mais sans confirmation des conditions de participation, vous serez affiché anonymement dans le classement et ne pourrez pas gagner.',
'dash_notice_btn' => 'Confirmer la participation maintenant',
'dash_modal_title' => 'Confirmer la participation',
'dash_modal_intro' => 'Veuillez lire attentivement les informations et conditions de participation, puis confirmez votre participation.',
'dash_modal_cancel' => 'Fermer',
'pending_confirmation_banner' => 'Vos points sont déjà comptabilisés pendant la période de qualification. Veuillez confirmer la participation afin que votre nom soit visible dans le classement et que vous puissiez utiliser toutes les fonctions.',
'details_requires_confirmation' => 'La vue détaillée nest disponible quaprès confirmation de la participation.',
'participate_abo_hint' => 'Il existe au moins un abonnement pertinent pour lévaluation (abonnement conseiller actif ou abonnement client pendant la période de qualification). En participant, les points correspondants sont repris directement selon les règles actuelles.',
'my_details' => 'Mon calcul',
'my_calculation' => 'Mon aperçu de calcul',
'back_to_ranking' => 'Retour au classement',
'section_partners' => 'A. Points nouveaux partenaires',
'section_abos' => 'B. Points abonnements clients',
'new_partner' => 'Nouveau partenaire',
'entry_date' => 'Entrée',
'customer_abo' => 'Abonnement client',
'abo_date' => 'Conclusion',
'onetime' => 'Unique',
'sum' => 'Total',
'subtotal' => 'Sous-total',
'no_partners_yet' => 'Aucun nouveau partenaire saisi.',
'no_abos_yet' => 'Aucun abonnement client saisi.',
'not_yet_qualified' => 'Pas encore qualifié',
'transaction_date' => 'Date',
'transaction_description' => 'Description',
'transaction_period' => 'Période',
'transaction_type' => 'Type',
'transaction_points' => 'Points',
'onetime_registration' => 'Unique : inscription',
'onetime_abo_activation' => 'Unique : activation abonnement',
'accumulated' => 'Chiffre daffaires',
'gallery_title' => 'Impressions',
];

View file

@ -0,0 +1,63 @@
<?php
return [
'title' => 'Plan de carrière Mivita',
'subtitle' => 'Découvrez vos possibilités dévolution et atteignez le niveau suivant',
'current_level' => 'Votre niveau actuel :',
'qualification' => 'Qualification',
'kp_points' => 'Points KU',
'tp_points' => 'Points TP',
'customer_points_full' => 'Points de chiffre daffaires clients',
'team_points_full' => 'Points équipe',
'provisions' => 'Commissions',
'standard' => 'Standard',
'shop' => 'Boutique',
'provision_rates' => 'Taux de commission',
'team_provisions' => 'Commissions déquipe',
'team_provisions_by_lines' => 'Commissions déquipe par lignes',
'growth_bonus' => 'Bonus de profondeur',
'next_level' => 'Niveau suivant :',
'your_current_level' => 'Votre niveau actuel',
'your_next_goal' => 'Votre prochain objectif',
'legend' => 'Légende',
'legend_ku_description' => 'Points de chiffre daffaires clients',
'legend_tp_description' => 'Points équipe',
'legend_lines_description' => 'Commissions déquipe par lignes',
'legend_percentage_description' => 'Taux de commission',
'no_levels_available' => 'Aucun niveau de carrière disponible',
'no_levels_configured' => 'Aucun niveau de carrière nest actuellement configuré.',
'loading_error' => 'Erreur lors du chargement du plan marketing :',
'loading_time' => 'Temps de chargement :',
'show_details' => 'Afficher les détails',
'back_to_overview' => 'Retour à laperçu',
'level_position' => 'Position',
'level_name' => 'Nom du niveau',
'level_requirements' => 'Exigences',
'level_benefits' => 'Avantages',
'paylines' => 'Paylines',
'line_1' => 'Ligne 1',
'line_2' => 'Ligne 2',
'line_3' => 'Ligne 3',
'line_4' => 'Ligne 4',
'line_5' => 'Ligne 5',
'line_6' => 'Ligne 6',
'line_7' => 'Ligne 7',
'line_8' => 'Ligne 8',
'points' => 'Points',
'percent' => 'Pourcentage',
'euro' => 'Euro',
'active' => 'Actif',
'inactive' => 'Inactif',
'achieved' => 'Atteint',
'not_achieved' => 'Non atteint',
'in_progress' => 'En cours',
'congratulations' => 'Félicitations !',
'keep_going' => 'Continuez comme ça !',
'almost_there' => 'Vous y êtes presque !',
'next_step' => 'Prochaine étape',
'goal_reached' => 'Objectif atteint',
'help_kp_points' => 'Les points KU (chiffre daffaires clients) sont générés par vos ventes directes.',
'help_tp_points' => 'Les points TP (points équipe) sont générés par les ventes de votre équipe.',
'help_provisions' => 'Les commissions sont les pourcentages que vous recevez sur les ventes.',
'help_growth_bonus' => 'Les bonus de croissance sont des récompenses supplémentaires pour la croissance de votre équipe.',
];

View file

@ -0,0 +1,60 @@
<?php
return [
'' => '',
'MIVITA_BUSINESS_Paket' => 'Package MIVITA BUSINESS',
'abo_copy_1' => 'Désactiver le renouvellement automatique et révoquer le mandat SEPA.',
'abo_copy_2' => 'Le prochain prélèvement aura lieu le : <strong> :date </strong>',
'abo_copy_3' => 'Je confirme la suppression de mon SEPA et la désactivation du renouvellement automatique.',
'active' => 'actif',
'active_package' => 'package actif',
'booked_package' => 'package réservé',
'change' => 'adapter',
'change_copy_1' => 'Vous pouvez modifier votre adhésion jusquau prochain renouvellement du contrat, le :date.',
'change_copy_2' => 'Les durées restantes sont conservées ; le package modifié ne devient actif quau renouvellement.',
'consultant_membership' => 'Adhésion conseiller',
'consultant_online_shop' => 'Boutique en ligne conseiller',
'contract_renewal' => 'Renouvellement du contrat',
'deactivate' => 'désactiver',
'details' => 'Détails',
'downgrade_membership_is_not_possible' => 'Un déclassement de votre adhésion conseiller nest plus possible.',
'end' => 'terminer',
'end_button' => 'Terminer ladhésion ici',
'end_checkbox' => 'Oui, je souhaite mettre fin à ladhésion MIVITA, je renonce à toute réclamation envers MIVITA et souhaite que mon compte soit supprimé !',
'end_copy_1' => 'Vous ne souhaitez plus être conseiller MIVITA et voulez mettre fin à votre adhésion ?',
'end_copy_2' => 'Vous renoncez ainsi à toutes les commissions possibles, avantages, accès au Salescenter et bien plus encore. En envoyant cette option, nous recevons un message et nous occupons de la suppression de votre compte. Cette opération peut prendre quelques jours.',
'end_copy_3' => 'La résiliation et suppression de votre adhésion MIVITA a été demandée.',
'expired_on' => 'expiré le',
'home_copy_SEPA_32' => 'Comme vous nous avez accordé un mandat de prélèvement SEPA, vous navez rien dautre à faire. Conformément à ce mandat, nous prélèverons le montant de la facture :price le :pay_date sur votre compte.',
'home_copy_SEPA_33' => 'Le montant de facture :price du :pay_date na pas encore pu être prélevé sur votre compte via le mandat SEPA que vous nous avez accordé.',
'home_copy_SEPA_36' => 'Malheureusement, nous navons pas pu prélever le montant dû de la cotisation par mandat SEPA sur le compte indiqué.',
'home_copy_alert_31' => 'Votre adhésion expire le :datetime',
'home_copy_alert_35' => 'Votre adhésion expire aujourdhui !',
'home_copy_alert_36' => 'Votre adhésion a expiré il y a :days jours, le :datetime !',
'home_copy_alert_36_today' => 'Votre adhésion a expiré aujourdhui à :datetime !',
'home_copy_last_31' => 'Il vous reste encore :days jours pour renouveler votre adhésion. Si vous laissez toutefois passer ce délai, votre compte sera automatiquement mis en pause jusquau renouvellement.',
'home_copy_last_33' => 'Il vous reste encore :days jours pour renouveler votre adhésion. Si vous laissez toutefois passer ce délai, votre compte sera automatiquement mis en pause jusquau renouvellement.',
'home_copy_last_34' => 'Il est vraiment temps dagir ! Votre adhésion expire déjà dans :days jours, exactement le :datetime. Si vous laissez toutefois passer ce délai, votre compte sera automatiquement mis en pause jusquau renouvellement.',
'home_copy_last_35' => 'Il est vraiment temps dagir ! Votre adhésion expire aujourdhui, exactement le :datetime. Si vous laissez toutefois passer ce délai, votre compte sera automatiquement mis en pause jusquau renouvellement.',
'home_copy_last_36' => 'Comme annoncé, nous avons mis votre compte conseiller en pause car vous navez pas renouvelé votre adhésion à temps. Si vous souhaitez profiter à nouveau des avantages et fonctionnalités de MIVITA, vous pouvez réactiver votre compte à tout moment.',
'home_hl' => 'Adhésion / cotisation annuelle',
'inactive' => 'inactif',
'is_no_longer_possible_to_change_package' => 'Il nest plus possible de modifier votre package conseiller.',
'membership' => 'Adhésion',
'membership_was_renewed' => 'Votre contrat a été renouvelé le :date.',
'open_payment_options' => 'Ouvrir les options de paiement',
'payment_copy_1' => 'Vous avez également la possibilité de payer maintenant directement votre adhésion avec dautres modes de paiement.',
'payment_copy_2' => 'Si ladhésion est payée avant le :date, le mandat SEPA ne sera pas exécuté !',
'payment_has_been_made' => 'Un paiement a été effectué.',
'renewal_is_active_membership_fee_automatic' => 'Votre renouvellement automatique est actif ; nous prélèverons automatiquement votre cotisation par mandat SEPA le <strong>:date</strong>.',
'status' => 'Statut',
'until' => 'jusquau',
'upgrade' => 'Upgrade',
'upgrade_copy_1' => 'Passez maintenant votre adhésion au package MIVITA BUSINESS !',
'upgrade_copy_2' => 'Les mois restants jusquau renouvellement de ladhésion conseiller sont calculés. Ensuite, le prix du package MIVITA BUSINESS sera facturé annuellement.',
'upgrade_package_and_proceed_payment' => 'Vous pouvez upgrader votre package : sélectionnez simplement le package étendu et passez au paiement.',
'we_do_not_collect_membership_fee' => 'Nous navons <strong>pas</strong> pu prélever automatiquement votre cotisation le <strong>:date</strong> par mandat SEPA.',
'your_booked_package' => 'Votre package réservé',
'info_contract_renewal' => 'Votre contrat est automatiquement renouvelé :days jours avant lexpiration de votre adhésion conseiller. Après le renouvellement, il nest plus possible de modifier le package conseiller et vous devez effectuer le paiement de votre adhésion.',
'alert_contract_renewal' => 'Pour renouveler votre adhésion conseiller, veuillez effectuer le paiement de votre package MIVITA réservé.',
];

40
resources/lang/fr/msg.php Normal file
View file

@ -0,0 +1,40 @@
<?php
return [
'shipping_country_was_not_found' => 'Erreur : le pays de livraison est introuvable',
'shipping_country_was_not_correctly' => 'Erreur : le pays de livraison na pas été correctement traité dans le panier',
'shopping_cart_was_shipping_free' => 'Erreur : le panier a été indiqué comme exempt de frais de livraison',
'shipping_cost_cannot_be_0' => 'Erreur : les frais de livraison ne peuvent pas être 0',
'shipping_costs_were_not_calculated_correctly' => 'Erreur : les frais de livraison nont pas été correctement calculés',
'compensation_products_cannot_be_0' => 'Erreur : les produits de compensation ne peuvent pas être 0.',
'link_for_homeparty_not_found' => 'Le lien pour lAuszeitparty est introuvable ou nest plus actif.',
'contact_delete' => 'Contact supprimé',
'error_occurred_with_order' => 'Une erreur est survenue lors de la commande',
'abo_deaktivert' => 'Option dabonnement désactivée',
'error_checkbox_not_confirm' => 'Erreur : case non confirmée',
'no_change_made' => 'aucune modification effectuée',
'booked_package_has_been_changed' => 'le package réservé a été modifié.',
'cancel_membership_is_requested' => 'La résiliation de ladhésion a été demandée',
'file_uploaded' => 'Fichier téléversé',
'file_empty' => 'Fichier vide"',
'file_deleted' => 'Fichier supprimé',
'file_not_found' => 'Fichier introuvable',
'country_account_has_been_changed__cost_has_been_reset' => 'Le pays de facturation a été modifié et le panier a été réinitialisé',
'your_shopping_cart_is_empty_please_add_products_first.' => 'Votre panier est vide, veuillez dabord ajouter des produits',
'homeparty_guest_delete' => 'Invité Auszeitparty supprimé',
'homeparty_delete' => 'Auszeitparty supprimée',
'VATID_could_not_be_validated' => 'Le numéro de TVA na pas pu être validé, veuillez vérifier la saisie',
'VATID_successfully_entered' => 'Numéro de TVA saisi avec succès',
'reverse_charge_procedure_and_VATID_deleted' => 'Procédure dautoliquidation et numéro de TVA supprimés',
'no_id_card_deposited_please_upload_first' => 'Aucune pièce didentité déposée, veuillez dabord la téléverser',
'no_trade_licence_deposited_please_upload_first' => 'Aucun extrait dactivité déposé, veuillez dabord le téléverser',
'please_enter_reason_why_you_not_need_trade_licence' => 'Veuillez indiquer pourquoi vous navez pas besoin dun extrait dactivité',
'please_select_compensation_product' => 'Veuillez sélectionner un produit de compensation',
'please_select_count_compensation_products' => 'Veuillez sélectionner :count produits de compensation',
'user_not_found' => 'Le conseiller est introuvable.<br>Le compte a été désactivé ou supprimé.',
'shopping_cart_was_not_user_shop' => 'Erreur : le conseiller na pas de boutique, la commande ne peut pas continuer',
'shopping_instance_not_found' => 'Erreur : aucune ShoppingInstance trouvée',
'shopping_user_not_found' => 'Erreur : aucun ShoppingUser trouvé',
'account_released' => 'Compte activé',
'cart_product_not_allowed_for_order_type' => 'Le panier contient des articles qui ne sont pas prévus pour ce type de commande. Veuillez vider le panier et sélectionner uniquement les produits adaptés à cette commande.',
];

View file

@ -0,0 +1,91 @@
<?php
return [
'documents' => 'Documents',
'add' => 'ajouter',
'attribute' => 'Attributs',
'business' => 'Business',
'career_level' => 'Niveau de carrière',
'categories' => 'Catégories',
'clients' => 'Clients',
'commissions' => 'Commissions',
'contents' => 'Contenus',
'countries' => 'Pays',
'credit' => 'Avoirs',
'do_order' => 'Passer une commande',
'edit' => 'modifier',
'export' => 'Export',
'general' => 'Général',
'home' => 'Accueil',
'ingredients' => 'Ingrédients',
'invoice' => 'Factures',
'language' => 'Langue',
'languages' => 'Langues',
'logout' => 'Déconnexion',
'manage' => 'gérer',
'member' => 'Conseiller',
'new_member' => 'nouveau conseiller',
'member_register' => 'Enregistrer un conseiller',
'membership' => 'Adhésion',
'modules' => 'Modules',
'my_account' => 'Mon compte',
'my_clients' => 'Mes clients',
'my_data' => 'Mes données',
'my_homeparty' => 'Mon Auszeitparty',
'my_membership' => 'Mon adhésion',
'my_orders' => 'Mes commandes',
'my_shop' => 'Ma boutique',
'my_team' => 'Mon équipe',
'order' => 'Commande',
'orders' => 'Commandes',
'overview' => 'Aperçu',
'payment_methods' => 'Modes de paiement',
'payments' => 'Finances',
'points' => 'Points',
'products' => 'Produits',
'sales_volumes' => 'Volumes de vente',
'settings' => 'Paramètres',
'shipping_costs' => 'Frais de livraison',
'start_site' => 'Page daccueil boutique',
'structure' => 'Structure',
'system_settings' => 'Param. système',
'translate' => 'Traductions',
'translation' => 'Traduction',
'trigger' => 'déclencher',
'user_roles' => 'Droits utilisateur',
'user_cleanup' => 'Nettoyage utilisateurs',
'user_restore' => 'Restaurer utilisateur',
'tax_advisor' => 'Conseiller fiscal',
'downloadcenter' => 'Centre de téléchargement',
'files' => 'Fichiers',
'tags' => 'Tags',
'myabos' => 'Mes abonnements',
'customerabos' => 'Abonnements clients',
'myabo' => 'Mon abonnement',
'customerabo' => 'Abonnement client',
'abo' => 'Abonnement',
'abos' => 'Abonnements',
'payment_links' => 'Liens de paiement',
'dashboard' => 'Tableau de bord',
'shop' => 'Boutique',
'to_shop' => 'Vers la boutique',
'marketingplan' => 'Plan marketing',
'dhl_cockpit' => 'Cockpit DHL',
'revenue' => 'Chiffre daffaires',
'level_reports' => 'Rapports de niveau',
'dashboard_news' => 'Actualités du tableau de bord',
'teamabos' => 'Abonnements équipe',
'team_customer_abos' => 'Abonnements clients de léquipe',
'customer_orders' => 'Commandes clients',
'external_orders' => 'Commandes externes',
'tools' => 'Outils',
'news_archive' => 'Archive des actualités',
'incentive' => 'Incentive',
'incentives' => 'Incentives',
'create' => 'Créer',
'my_abo' => 'Mon abonnement',
'my_subscriptions' => 'Mes abonnements',
'team_customers' => 'Clients de léquipe',
'payment_monitor' => 'Moniteur de paiement',
'payment_monitor_management' => 'Moniteur de paiement direction',
];

125
resources/lang/fr/order.php Normal file
View file

@ -0,0 +1,125 @@
<?php
return [
'add_customer' => 'Ajouter un client',
'advertising_material' => 'Matériel publicitaire',
'adviser_collective_invoice' => 'Facture collective conseiller',
'adviser_order_for_membership' => 'Commande conseiller pour adhésion',
'adviser_order_for_registration' => 'Commande conseiller pour inscription',
'art_no' => 'N° art.',
'article' => 'Article',
'article_remove' => 'Supprimer larticle',
'assigned_advisor' => 'Attribuer un conseiller',
'assigned_counsellor' => 'Conseiller attribué',
'billing_address_of_client' => 'Adresse de facturation du client',
'billing_address_of_the_advisor' => 'Adresse de facturation du conseiller',
'client_order_via_shop' => 'Commande client via boutique',
'collective_invoice' => 'Facture collective',
'collective_invoice_contains_orders' => 'La facture collective contient les commandes clients suivantes',
'compensation_product' => 'Produit de compensation',
'confirm_and_proceed_to_checkout' => 'confirmer et passer à la caisse',
'confirm_and_proceed_to_order' => 'confirmer et passer à la commande',
'consultant_order_for_home_party' => 'Commande conseiller pour une Homeparty',
'content' => 'Contenu',
'contents' => 'Contenus',
'create_invoice' => 'Créer la facture',
'date' => 'Date',
'delivery_address_of_the_client' => 'Adresse de livraison du client',
'delivery_address_of_the_consultant' => 'Adresse de livraison du conseiller',
'delivery_country_can_no_longer_be_changed' => 'Le pays de livraison ne peut plus être modifié',
'delivery_country_changed_customer_info' => 'Le pays de livraison ne peut être modifié que chez le client sous <a href=":link">Mes clients</a>.',
'delivery_country_changed_info' => 'Le pays de livraison ne peut être modifié que sous <a href=":link">Mes données</a>.',
'delivery_note' => 'Bon de livraison',
'delivery_to_me' => 'Livraison à moi-même',
'delivery_to_the_customer' => 'Livraison au client',
'deliverydata' => 'Données de livraison',
'different_delivery_address' => 'Adresse de livraison différente',
'error_no_address_data_found' => 'Erreur : aucune donnée dadresse trouvée !',
'external_orders' => 'Commandes externes',
'external_orders_info_pay' => 'payer = créer une facture collective et passer au checkout',
'external_orders_info_remove' => 'supprimer = les commandes sont déplacées vers supprimé, pour annulations etc.',
'external_orders_info_reset' => 'réinitialiser = les commandes sont seulement remises sur ouvert, les factures collectives ne sont pas modifiées',
'goods_are_for_customer_and_shipped' => 'La marchandise est destinée à un client et sera envoyée au client',
'goods_are_for_me_and_shipped' => 'La marchandise est pour moi et sera envoyée à mon adresse',
'gross' => 'brut',
'gross_price' => 'Prix brut',
'incentives' => 'Incentives',
'included_VAT' => 'TVA incluse',
'invoice' => 'Facture',
'invoice_address' => 'Adresse de facturation',
'land_can_no_longer_be_changed' => 'Le pays ne peut plus être modifié',
'email_can_not_be_changed' => 'Votre adresse e-mail ne peut plus être modifiée',
'link_to_the_invoice' => 'Lien vers la facture',
'my_delivery_address' => 'Mon adresse de livraison',
'net' => 'net',
'net_price' => 'Prix net',
'no_address_created' => 'Aucune adresse créée',
'no_career_level_info' => 'Remarque : aucun niveau de carrière ne vous a encore été attribué. Veuillez contacter info@mivita.care',
'no_delivery_address' => 'Aucune adresse de livraison créée',
'no_order' => 'Aucune commande',
'number_of_items' => 'Nombre darticles',
'order' => 'Commande',
'order_consultant' => 'Commande conseiller',
'order_date' => 'Date de commande',
'order_for_client' => 'Commande pour client',
'order_for_consultant' => 'Commande pour conseiller',
'order_number' => 'Numéro de commande',
'order_via_external_shop' => 'Commande via boutique externe',
'plus_VAT' => 'plus TVA',
'points' => 'Points',
'points_total' => 'Points total',
'points_turnover_assigned' => 'Points / chiffre daffaires attribués',
'product' => 'Produit',
'product_prices_career_level_info' => 'Les prix produits (mon prix) sont affichés et calculés selon votre niveau de carrière <strong>:user_level_name</strong> moins <strong>:user_level_margin %</strong> de marge.<br>Remarque : si vous quittez la page, le panier sera réinitialisé.',
'product_prices_career_level_cpay_info' => 'Les prix produits sont affichés comme prix de vente clients ; après finalisation du paiement client, vous recevez votre commission selon votre niveau de carrière <strong>:user_level_name</strong>, commission <strong>:user_level_margin %</strong>.<br>Remarque : si vous quittez la page, le panier sera réinitialisé.',
'purchased_from_shop' => 'Acheté dans la boutique',
'quantity' => 'Quantité',
'ship_to_existing_customer_select_customer' => 'Envoyer à un client existant | sélectionner le client',
'ship_to_new_customer' => 'Envoyer à un nouveau client',
'ship_to_this_customer' => 'Envoyer à ce client',
'ship_to_this_customer_check' => 'Je sais que ce processus de commande est uniquement destiné aux commandes clients et non à mes propres commandes.',
'ship_to_this_customer_info' => 'Si ladresse de facturation ou le pays de livraison nest pas correct, veuillez le modifier avant la commande sous',
'ship_to_this_customer_info_2' => 'Ladresse de livraison, à lexception du pays de livraison, peut aussi être adaptée dans le checkout.',
'ship_to_this_email_info' => 'Le lien de commande sera envoyé à votre client à ladresse e-mail suivante :',
'shipping' => 'Livraison',
'shipping_compensation_product' => 'Produit de compensation livraison',
'shipping_costs' => 'Frais de livraison',
'shopping_cart' => 'Panier',
'shopping_cart_delete' => 'Supprimer le panier',
'shopping_cart_update' => 'Mettre à jour le panier',
'subtotal' => 'Sous-total',
'sum' => 'Somme',
'sums' => 'Sommes',
'total' => 'Total',
'total_gross' => 'Total brut',
'total_net' => 'Total net',
'total_price' => 'Prix total',
'total_shipping_costs' => 'Frais de livraison totaux',
'total_sum' => 'Somme totale',
'total_sums' => 'Sommes totales',
'total_without_VAT' => 'Somme hors TVA',
'turnover' => 'Chiffre daffaires',
'unit_price' => 'Prix unitaire',
'weight' => 'Poids',
'you_has_article_in_shopping_cart' => 'Vous avez :num article(s) dans votre panier',
'excl' => 'plus',
'ipay' => 'je paie',
'cpay' => 'le client paie',
'ipay_text' => 'Je paie moins ma marge et je facture le prix de vente à mon client',
'cpay_text' => 'Mon client reçoit un lien de paiement et je reçois ma commission',
'sum_net' => 'Somme nette',
'confirm_and_send_order' => 'Finaliser la commande et envoyer le lien de paiement',
'confirm_send_order_info' => 'En finalisant la commande, un lien de paiement est créé et envoyé par e-mail à votre client.<br>Votre client peut alors finaliser le paiement et la marchandise sera expédiée ; votre commission sera créditée à la finalisation du paiement.',
'order_was_placed_successfully' => 'La commande a été créée avec succès.',
'order_abo_was_placed_successfully' => 'La commande dabonnement a été créée avec succès.',
'payment_link_for_your_customer' => 'Le lien de paiement pour votre client',
'delivery' => 'Livraison',
'number' => 'N° art.',
'reorder' => 'Commander à nouveau',
'reorder_info' => 'Voulez-vous commander à nouveau cet article ?<br>En cliquant sur le bouton, les articles seront à nouveau placés dans le panier et vous serez redirigé vers la page panier.',
'reorder_info_2' => 'Votre pays de livraison est : :country<br>Si vous souhaitez faire livrer votre commande dans un autre pays, modifiez votre adresse de facturation ou de livraison sous <a class="text-primary" href=":link">Mes données</a>',
'reorder_abo_not_allowed' => 'Les commandes dabonnement ne peuvent pas être répétées via « Commander à nouveau ». Veuillez utiliser votre gestion dabonnement ou la boutique pour les commandes individuelles.',
'free_shipping' => 'Livraison gratuite',
'free_shipping_reached' => 'Livraison gratuite à partir de :amount €',
'free_shipping_info' => 'Encore :missing € jusquà la livraison gratuite (à partir de :amount €)',
];

View file

@ -0,0 +1,6 @@
<?php
return [
'previous' => '&laquo; Précédent',
'next' => 'Suivant &raquo;',
];

View file

@ -0,0 +1,9 @@
<?php
return [
'password' => 'Les mots de passe doivent contenir au moins 6 caractères et être correctement confirmés.',
'reset' => 'Le mot de passe a été réinitialisé !',
'sent' => 'Le-mail de réinitialisation de votre mot de passe a été envoyé.',
'token' => 'La clé de récupération du mot de passe est invalide ou a expiré.',
'user' => 'Aucun utilisateur avec cette adresse e-mail na pu être trouvé.',
];

View file

@ -0,0 +1,192 @@
<?php
return [
'' => '',
'BIC' => 'BIC',
'IBAN' => 'IBAN',
'Mastercard' => 'Mastercard',
'American Express' => 'American Express',
'VAT' => 'TVA',
'VISA' => 'VISA',
'accepted_data_checkbox_customer' => 'En cliquant sur "Acheter maintenant", jaccepte les :gtc, la :c_policy et la :p_policy afin que mes données puissent être traitées pour la commande.',
'accepted_data_checkbox_user' => 'En cliquant sur "Acheter maintenant", jaccepte les conditions générales et la politique de confidentialité afin que mes données puissent être traitées pour la commande.',
'account_holder' => 'Titulaire du compte',
'agree_SEPA_complete_purchase' => 'Accepter le mandat de prélèvement SEPA et finaliser lachat',
'auto_renewal_hl' => 'Renouvellement automatique',
'auto_renewal_line_1' => 'Mieux vaut prévenir ! Nous recommandons dactiver cette option si vous souhaitez maintenir durablement votre adhésion annuelle. Si un paiement manuel narrive pas à temps après lexpiration de ladhésion annuelle, le système désactive votre boutique en ligne ou votre accès au Salescenter. Vous ne pourrez alors plus passer de commandes ni consulter vos statistiques jusquà ce quun nouveau paiement réactive votre compte. Nous vous conseillons donc de payer par prélèvement SEPA. Nous enregistrons ce mandat et débitons automatiquement votre cotisation annuelle 14 jours avant lexpiration. Vous profitez ainsi dun processus fluide, sans devoir y penser.',
'auto_renewal_line_2' => 'Vous pouvez bien entendu annuler cette option à tout moment dans votre compte ou résilier votre compte / partenariat commercial chez MIVITA.',
'automatic_SEPA_mandate_type_was_selected' => 'Le renouvellement automatique a été sélectionné. Votre mandat SEPA sera enregistré et le paiement annuel sera exécuté automatiquement.',
'back_to_shop' => 'retour à la boutique',
'back_to_shop_shopping_cart' => 'retour au panier',
'bank' => 'Banque',
'billing_address' => 'Adresse de facturation',
'billing_address_can_only_changed_in_salescentre' => 'Votre adresse de facturation ne peut être modifiée que dans le Salescenter.',
'buy_now' => 'Acheter maintenant',
'buy_now_copy' => 'Lorsque toutes vos informations sont complètes, cliquez sur "Acheter maintenant". Vous serez redirigé vers notre prestataire de paiement ; la connexion est chiffrée SSL.',
'c_policy' => 'Politique de rétractation',
'checkout_ssl_server' => 'Vous serez redirigé vers notre serveur de checkout, la connexion est chiffrée SSL.',
'country_of_delivery' => 'Pays de livraison',
'credit_card' => 'Carte de crédit',
'credit_card_number' => 'Numéro de carte de crédit',
'delivery_country_can_only_changed_in_salescentre' => 'Le pays de livraison ne peut être modifié que dans le Salescenter.',
'delivery_country_cannot_change' => 'Le pays de livraison ne peut pas être modifié.',
'excl' => 'plus',
'firstname_lastname' => 'Prénom Nom',
'gtc' => 'conditions générales',
'month' => 'Mois',
'months' => 'Mois',
'ordering_country' => 'Pays de commande',
'owner' => 'Titulaire',
'p_policy' => 'Politique de confidentialité',
'payment_by_SEPA' => 'Paiement par SEPA',
'payment_by_SEPA_info' => 'Votre paiement est en cours de traitement, une confirmation du traitement de paiement sera créée automatiquement.',
'payment_by_credit_card' => 'Paiement par carte de crédit :',
'payment_by_credit_card_info' => 'Votre paiement a été approuvé, une confirmation de paiement sera créée automatiquement.',
'payment_by_invoice' => 'Paiement sur facture',
'payment_by_invoice_info' => 'Votre commande est en cours de traitement, une confirmation du traitement de commande sera créée automatiquement',
'payment_in_advance' => 'Paiement anticipé',
'payment_method' => 'Mode de paiement',
'payment_method_not_enabled_please_contact' => 'Mode de paiement non activé, veuillez contacter',
'paypal' => 'PayPal',
'please_check_form_and_complete' => 'Veuillez vérifier le formulaire et compléter toutes les informations.',
'please_transfer_amount_following_account' => 'Veuillez virer :amount EUR sur le compte suivant afin de finaliser lachat.',
'prepayment' => 'Paiement anticipé',
'purchase_on_account' => 'Achat sur facture',
'reason_for_payment' => 'Référence de paiement',
'remaining_time' => 'Durée restante',
'reverse_charge_procedure' => 'Procédure dautoliquidation',
'select_and_proceed_to_checkout' => 'sélectionner et passer à la caisse',
'select_and_save' => 'sélectionner et enregistrer',
'sepa_direct_debit' => 'Prélèvement SEPA',
'sofort_bank_transfer' => 'Virement SOFORT',
'status' => [
'checkout_cancel' => 'Paiement annulé',
'checkout_error' => 'Erreur de paiement',
'checkout_payment' => 'Checkout',
'payment_approved' => 'Paiement approuvé - veuillez attendre le-mail',
'payment_error' => 'Erreur de paiement',
'payment_not_found' => 'Paiement introuvable',
'payment_redirect' => 'Paiement en cours - veuillez attendre le-mail',
'store_payment' => 'Paiement enregistré',
'success' => 'Exécuté avec succès',
'success_payment' => 'Paiement réussi',
'txaction_appointed' => 'Paiement approuvé - e-mail envoyé, veuillez attendre la confirmation',
'txaction_failed' => 'Paiement échoué - e-mail envoyé',
'txaction_paid' => 'Paiement confirmé - e-mail envoyé',
],
'thank_you_very_much' => 'Merci beaucoup,',
'total_amount' => 'Montant total',
'valid until' => 'Valable jusquau',
'valid' => 'Valable',
'verification_no' => 'N° de vérification',
'we_have_received_your_order_get_email' => 'Votre commande nous est parvenue. Vous recevrez prochainement une confirmation de commande par e-mail.',
'your_mivita_team' => 'Votre équipe mivita.care',
'your_order_number_is' => 'Votre numéro de commande est',
'open' => 'ouvert',
'openly' => 'ouvert',
'paid' => 'payé',
'check' => 'vérifier',
'cancelled' => 'annulé',
'link_sent' => 'Lien de paiement envoyé',
'link_openly' => 'Lien de paiement ouvert',
'link_check' => 'Paiement en vérification',
'link_pending' => 'Paiement en cours',
'link_failed' => 'Paiement échoué',
'link_canceled' => 'Paiement annulé',
'link_appointed' => 'Paiement ordonné',
'link_paid' => 'Paiement réussi',
'alert_link_sent' => 'Lien de paiement envoyé',
'alert_link_openly' => 'Lien de paiement ouvert',
'alert_link_check' => 'Paiement en vérification',
'alert_link_pending' => 'Paiement en cours',
'alert_link_failed' => 'Paiement échoué',
'alert_link_canceled' => 'Paiement annulé',
'alert_link_appointed' => 'Paiement ordonné',
'alert_link_paid' => 'Le paiement a réussi',
'failed' => 'annulation',
'no_payment' => 'aucun paiement',
'link_was_paid' => 'Le paiement a été finalisé avec succès.',
'paymend_paid' => 'Paiement payé',
'paymend_open' => 'Paiement ouvert',
'paymend_failed' => 'Paiement annulé',
'extern_open' => 'Externe ouvert',
'extern_paid' => 'Externe payé',
'invoice_open' => 'Facture ouverte',
'invoice_paid' => 'Facture payée',
'invoice_no_payment' => 'Facture sans paiement',
'to_sales_tax_de' => 'assujetti à la TVA / DE',
'not_to_sales_tax_de' => 'non assujetti à la TVA / DE',
'not_to_sales_tax_foreign' => 'non assujetti à la TVA / étranger',
'ordered' => 'commandé',
'removed' => 'supprimé',
'registration' => 'Inscription',
'not_assigned' => 'non attribué',
'advisor_order' => 'Commande conseiller',
'credit' => 'Avoir',
'shoporder' => 'Commande boutique',
'shoporder_pending' => 'Commande boutique / pending',
'membership' => 'Adhésion',
'order' => 'Commande',
'customer_order' => 'Commande client',
'homeparty' => 'Auszeitparty',
'shop' => 'Boutique',
'external' => 'externe',
'collective_invoice' => 'Facture collective',
'in_process' => 'en cours',
'shipped' => 'expédié',
'completed' => 'terminé',
'trade_fair' => 'Salon',
'commission_shop' => 'Commission boutique',
'commission_payline' => 'Commission Payline',
'commission_growth_bonus' => 'Commission bonus de profondeur',
'commission_team' => 'Commission équipe',
'credit_added' => 'Crédit ajouté',
'commission' => 'Commission',
'unknown' => 'inconnu',
'prepayment_important_notice' => 'Remarque importante concernant le paiement anticipé',
'prepayment_reference_notice' => 'IMPORTANT : veuillez indiquer exclusivement le numéro suivant comme référence de paiement :',
'prepayment_reference_only' => 'Cest la seule manière dattribuer automatiquement votre paiement.',
'prepayment_bank_details' => 'Coordonnées bancaires pour paiement anticipé',
'prepayment_waiting_payment' => 'Nous attendons la réception de votre paiement. Après réception, votre commande sera traitée.',
'prepayment_txid' => 'Référence de paiement',
'payment_not_found' => 'Paiement introuvable',
'payment_not_found_description' => 'Le paiement avec la référence :reference est introuvable. Veuillez nous contacter si vous avez déjà payé.',
'payment_canceled' => 'Paiement annulé',
'payment_canceled_description' => 'Vous avez annulé le processus de paiement. Votre commande na pas été exécutée et rien na été débité.',
'payment_canceled_hint' => 'Vous pouvez lancer une nouvelle tentative de paiement à tout moment.',
'payment_error' => 'Paiement échoué',
'payment_error_description' => 'Le paiement na malheureusement pas pu être finalisé.',
'payment_error_hint' => 'Veuillez vérifier vos données de paiement et réessayer, ou choisir un autre mode de paiement.',
'payment_error_retry' => 'Réessayer',
'payment_error_code' => 'Code derreur',
'payment_error_what_to_do' => 'Que puis-je faire ?',
'payment_unknown_status' => 'Statut de paiement inconnu',
'payment_unknown_status_description' => 'Le statut de paiement na pas pu être déterminé. Veuillez nous contacter pour plus dinformations.',
'contact_support_if_needed' => 'Pour toute autre question, veuillez contacter notre service client.',
'try_again' => 'Réessayer',
'choose_different_payment' => 'Choisir un autre mode de paiement',
'nothing_was_charged' => 'Aucun montant na été débité de votre compte.',
'payment_error_reasons' => [
'card_expired' => 'Votre carte a expiré. Veuillez utiliser une carte valide ou choisir un autre mode de paiement.',
'card_blocked' => 'Votre carte est bloquée. Veuillez contacter votre banque ou choisir un autre mode de paiement.',
'card_invalid' => 'Les données de la carte sont invalides. Veuillez vérifier votre saisie.',
'card_declined' => 'Votre banque a refusé le paiement. Veuillez contacter votre banque ou choisir un autre mode de paiement.',
'insufficient_funds' => 'La limite de la carte a été dépassée. Veuillez contacter votre banque ou choisir un autre mode de paiement.',
'cvv_invalid' => 'Le cryptogramme (CVV) est incorrect. Veuillez vérifier les 3 chiffres au dos de votre carte.',
'3ds_failed' => 'Lauthentification 3D Secure a échoué. Veuillez réessayer ou choisir un autre mode de paiement.',
'timeout' => 'La connexion à la banque a été interrompue (timeout). Veuillez réessayer dans quelques minutes.',
'fraud' => 'Le paiement a été refusé pour des raisons de sécurité. Veuillez contacter votre banque.',
'general' => 'Veuillez vérifier vos données de paiement et réessayer. Si le problème persiste, choisissez un autre mode de paiement.',
],
'packstation_delivery' => 'Livraison en Packstation/Paketbox',
'packstation_info' => 'Pour une livraison dans une DHL Packstation ou Paketbox, nous avons besoin de votre numéro postal DHL.',
'dhl_postnumber' => 'Numéro postal DHL',
'packstation_address_hint' => 'Saisissez le numéro de Packstation dans le champ dadresse (rue n° *) (p. ex. "Packstation 145"). Le code postal et la ville se réfèrent à lemplacement de la Packstation.',
'packstation_alert_title' => 'Important : livraison en Packstation',
'packstation_alert_intro' => 'Si vous indiquez un numéro postal DHL, ladresse de livraison doit être renseignée comme suit :',
'packstation_alert_street' => 'Packstation [numéro à 3 chiffres]',
'packstation_alert_street_example' => 'p. ex. "Packstation 145" - PAS "12345" !',
'packstation_alert_location' => 'Emplacement de la Packstation',
'packstation_alert_not_home' => 'pas votre adresse personnelle !',
'packstation_alert_footer' => 'Le NUMÉRO de Packstation comporte 3 chiffres (100-999, indiqué sur le panneau jaune). Le numéro postal DHL comporte 6 à 10 chiffres et doit être saisi dans le champ séparé ci-dessus.',
];

65
resources/lang/fr/pdf.php Normal file
View file

@ -0,0 +1,65 @@
<?php
return [
'address_top' => 'mivita care gmbh • Leinfeld 2 • 87755 Kirchhaslach',
'adviser_id' => 'ID conseiller',
'date' => 'Date',
'credit_no' => 'N° davoir',
'tax_no' => 'N° fiscal',
'vat_no' => 'N° TVA',
'credit_note' => 'AVOIR',
'credit_note_from' => 'Avoir de',
'amount' => 'Montant',
'vat_text' => 'TVA',
'amount_paid_out_gross' => 'Montant versé (brut)',
'net_amount' => 'Montants nets',
'as_a_small_entrepreneur_info' => 'En tant que petite entreprise au sens du § 19 al. 1 UStG, aucune TVA nest facturée.',
'reverse_charge_procedure_info' => 'Procédure dautoliquidation, inversion de la dette fiscale.',
'delivery_note_no' => 'N° bon de livraison',
'order_no' => 'N° commande',
'delivery_note' => 'BON DE LIVRAISON',
'we_are_always_there_for_questions' => 'Nous sommes toujours à votre disposition pour toute question.',
'your_advisor' => 'Votre conseiller',
'eprice' => 'Prix unitaire',
'off' => 'de',
'net' => 'net',
'total_incl_VAT' => 'Total TTC légal',
'ek' => 'PA',
'invoice_nr' => 'N° facture',
'points' => 'Points',
'points_order' => 'Points commande',
'points_shop' => 'Points boutique',
'invoice' => 'FACTURE',
'payment_type' => 'Mode de paiement',
'status_of_invoice' => 'Statut de la facture',
'delivery_date_is_invoice_date' => 'La date de livraison correspond à la date de facture.',
'prices_net' => 'Prix nets',
'vat_id_of_the_recipient_of_the_service' => 'N° TVA du bénéficiaire de la prestation',
'invoice_does_not_include_vat' => 'La facture est émise sans TVA, car la procédure dautoliquidation sapplique.',
'vat_is_declared_and_paid_by_recipient' => 'La TVA doit être déclarée et acquittée par le bénéficiaire de la prestation.',
'tax_free_export_delivery' => 'Livraison à lexportation exonérée de taxe',
'invoice_copy' => 'Copie de facture',
'delivery_copy' => 'Copie de bon de livraison',
'credit_copy' => 'Copie davoir',
'contract_filename' => 'Contrat conseiller',
'cancellation_invoice' => 'FACTURE DANNULATION',
'cancellation_nr' => 'N° annulation',
'cancellation_for' => 'Annulation pour facture',
'from' => 'du',
'attention' => 'ATTENTION',
'cancellation_invoice_info' => 'Cette facture dannulation annule la facture initiale avec des montants négatifs. Les points ont été corrigés en conséquence.',
'cancelled' => 'Annulé',
'cancellation_delivery' => 'BON DE LIVRAISON DANNULATION',
'cancellation_delivery_info' => 'Ce bon de livraison dannulation annule le bon de livraison initial.',
'cancellation_delivery_note' => 'Remarque : les marchandises ne doivent pas être retournées sauf accord contraire.',
'pos' => 'Pos.',
'article' => 'Article',
'quantity' => 'Quantité',
'single_price' => 'Prix unitaire',
'total_price' => 'Prix total',
'plus' => 'plus',
'vat' => 'TVA',
'subtotal_net' => 'Sous-total (net)',
'shipping_costs' => 'Frais de livraison',
'total_amount' => 'Montant total',
];

View file

@ -0,0 +1,39 @@
<?php
return [
'login' => 'Connexion',
'login_title' => 'Connexion à votre compte client',
'login_email' => 'Votre adresse e-mail',
'login_password' => 'Mot de passe',
'login_button' => 'Connexion',
'login_forgot_password' => 'Mot de passe oublié ?',
'login_register' => 'Sinscrire',
'mail_subject' => 'Votre mot de passe à usage unique pour votre compte client mivita.care',
'mail_hello' => 'Bonjour !',
'mail_otp' => 'Votre mot de passe à usage unique est : ',
'mail_otp_valid' => 'Ce mot de passe est valable 10 minutes.',
'mail_otp_not_requested' => 'Si vous navez pas demandé de mot de passe, vous pouvez ignorer cet e-mail.',
'mail_greetings' => 'Cordialement',
'mail_sender' => 'mivita.care',
'verify_otp_title' => 'Connexion à deux facteurs',
'verify_otp_description' => 'Veuillez saisir le code que nous vous avons envoyé par e-mail.',
'verify_otp_resend' => 'Si vous ne recevez aucun e-mail dans les prochaines minutes, vous pouvez demander un nouveau code. Vérifiez également votre dossier spam.',
'verify_otp_resend_link' => 'Demander un nouveau code',
'login_send_otp_description' => 'Veuillez saisir votre adresse e-mail. Nous vous enverrons à létape suivante un mot de passe à usage unique à cette adresse.',
'login_send_otp_description2' => 'Pour créer un compte client, utilisez tout de même cette connexion ; vous pourrez ensuite renseigner vos données dans le portail.',
'back_to_shop' => 'Retour à la boutique',
'guest' => 'Invité',
'change_login_title' => 'Passer au compte client ?',
'change_login_title2' => 'Passer au compte conseiller ?',
'logout_button' => 'Se déconnecter et passer à la connexion',
'change_login_description' => 'Vous êtes connecté en tant que conseiller. Voulez-vous passer au compte client ?',
'change_login_description2' => 'Vous êtes connecté en tant que client. Voulez-vous passer au compte conseiller ?',
'change_login_description3' => 'Vous pouvez vous déconnecter ici puis vous reconnecter avec votre e-mail client.',
'change_my_data' => 'Modifiez ici votre adresse de facturation et de livraison.',
'change_my_data_empty' => 'Vous navez pas encore enregistré dadresse de facturation ni de livraison. Renseignez vos données maintenant.',
'my_orders_empty' => 'Vous navez encore passé aucune commande.',
'my_orders_info' => 'Vous pouvez consulter et gérer vos commandes ici.',
'change_my_data_empty_button' => 'Créer une adresse de facturation et de livraison',
'my_subscriptions_empty' => 'Vous navez pas encore créé dabonnement.',
'my_subscriptions_info' => 'Vous pouvez créer et gérer votre abonnement ici.',
];

View file

@ -0,0 +1,70 @@
<?php
return [
'accept-contract' => 'Jai lu le contrat présenté ici et je laccepte.',
'account_deleted' => 'Compte supprimé',
'adjust' => 'adapter',
'advisor_invite' => 'Inviter un conseiller',
'agree' => 'accepter',
'agree_and_continue' => 'accepter et continuer',
'assigned' => 'attribué',
'badge' => 'Badge',
'business_license_later' => 'Je fournirai mon extrait dactivité dans les 4 prochaines semaines',
'business_license_non' => 'Je nai pas besoin dextrait dactivité',
'business_license_non_text' => 'En dehors de lAllemagne, les règles relatives à lextrait dactivité diffèrent (p. ex. Autriche ou Suisse). Si vous navez pas besoin dextrait dactivité pour cette activité ou actuellement, veuillez le justifier brièvement ici :',
'business_license_now' => 'Téléverser lextrait dactivité maintenant',
'business_license_release' => 'Envoyer lextrait dactivité pour validation',
'business_license_deposited' => 'Lextrait dactivité a été déposé',
'change_documents' => 'Modifier les documents',
'change_email' => 'Modifier ladresse e-mail',
'change_email_address_verify_it_info' => 'Modifiez ici votre adresse e-mail. Nous vous enverrons un nouveau lien dactivation à votre nouvelle adresse e-mail afin de la vérifier.',
'change_email_contact_address_verify_it_info' => 'Modifiez ici ladresse e-mail du contact. Nous enverrons au contact un nouveau lien dactivation à la nouvelle adresse e-mail afin de la vérifier.',
'complete' => 'terminer',
'complete_registration' => 'Terminer linscription',
'confirm_your_identity' => 'Confirmez votre identité avec votre mot de passe avant de continuer.',
'contract' => 'Contrat',
'contract_data_protection' => 'Contrat & protection des données',
'create_advisor_send_email_to_invite' => 'Créer un conseiller et envoyer une invitation par e-mail !',
'create_and_next' => 'créer et continuer',
'data' => 'Données',
'data_protection' => 'Protection des données',
'declaration-of-consent' => 'Déclaration de consentement : jaccepte par la présente le traitement des données personnelles fournies volontairement. Jai été informé(e) que je peux révoquer ce consentement à tout moment.',
'delete_account' => 'Supprimer le compte',
'i_have_read_and_accept_it' => 'Jai lu :link et laccepte.*',
'next' => 'continuer',
'open_payment_options' => 'Ouvrir les options de paiement',
'package' => 'Package',
'password' => 'Mot de passe',
'password_has_already_been_created' => 'Le mot de passe a déjà été créé.',
'really_delete_the_file' => 'Supprimer vraiment le fichier ?',
'reg_checked' => 'Jaccepte par la présente le traitement des données mentionné dans la <a target="_blank" href=":link">politique de confidentialité</a>. Jai été informé(e) que je peux révoquer ce consentement à tout moment',
'reg_finisch_hl' => 'Merci pour votre inscription !',
'reg_finisch_line_1' => 'Nous vous avons envoyé un e-mail avec un lien pour activer votre compte.',
'reg_finisch_line_2' => 'Veuillez consulter vos e-mails et confirmer le lien.',
'reg_hl' => 'Inscription',
'reg_line_1' => 'Ce formulaire est destiné à linscription de nouveaux partenaires commerciaux. Après lenvoi du formulaire, vous recevrez un e-mail avec de plus amples informations ainsi que le lien dactivation.',
'registration' => 'Inscription',
'registration_completed' => 'Inscription terminée',
'required_fields' => 'Champs obligatoires',
'save_and_continue' => 'enregistrer et continuer',
'select' => 'sélectionner',
'sender' => 'Votre équipe mivita.care',
'trade_licence' => 'Extrait dactivité',
'upload' => 'téléverser',
'wizard_business_license_hl' => 'Téléverser lextrait dactivité (PDF, JPG, PNG uniquement)',
'wizard_business_license_line_1' => 'Un extrait dactivité valide est légalement obligatoire pour participer en tant que partenaire commercial chez MIVITA. Veuillez téléverser ici une copie de votre extrait dactivité actuel afin que nous puissions activer votre compte.',
'wizard_create_release_hl' => 'Merci',
'wizard_create_release_line_1' => 'Votre inscription et réservation de ladhésion sont terminées !<br>Dès réception de votre paiement, vous recevrez automatiquement un e-mail et votre adhésion sera automatiquement activée.',
'wizard_finish_hl' => 'Terminer linscription',
'wizard_finish_line_1' => 'Toutes les données sont-elles correctes et complètes ? Sinon, vous pouvez cliquer sur les différents points ci-dessus et effectuer encore des modifications. Si tout convient, cliquez maintenant sur le bouton « Terminer linscription ». Nous vérifierons ensuite vos données et vous contacterons si nécessaire. Dès que nous aurons activé votre compte, vous recevrez un autre e-mail.',
'wizard_reg_release_hl' => 'En attente de vérification',
'wizard_reg_release_line_1' => 'Votre inscription est terminée, vos données sont en cours de vérification.<br>Après vérification réussie, votre compte sera activé et vous recevrez un e-mail.',
'wizard_verification_hl' => 'Vérification (carte didentité ou passeport ; PDF, JPG, PNG)',
'wizard_verification_line_1' => 'Veuillez téléverser un scan / une photo de votre carte didentité ou de votre passeport. La face avant suffit. Nous avons besoin de la pièce didentité comme justificatif pour activer votre compte.',
'starter_warning_title' => 'Attention',
'starter_warning_text' => '<strong>Bienvenue chez Mivita !</strong><br><br>Vous pouvez maintenant vous inscrire pour une cotisation annuelle de <strong>69,90 €</strong> et recevoir votre boutique Mivita personnalisée.<br><br><strong>Veuillez noter :</strong><br>Les packs de démarrage sont une offre exclusive et unique lors de linscription et ne peuvent pas être achetés ultérieurement.<br><br><strong>Vos options :</strong><br><br><strong>• Avec pack de démarrage :</strong><br>Vous bénéficiez immédiatement de <strong>30 % de remise</strong>, y compris sur tous les autres achats de cette année.<br><br><strong>• Sans pack de démarrage</strong> (inscription &amp; boutique personnalisée uniquement) :<br>Vous bénéficiez durablement de <strong>20 % de remise</strong>.<br><br><strong>Important pour plus tard :</strong><br>Si vous démarrez maintenant sans pack de démarrage, vous ne pourrez obtenir les 30 % de remise plus tard que par votre propre qualification (→ 1 350 points de chiffre daffaires personnel en un mois selon le plan marketing).',
'starter_warning_back' => 'Non veuillez me montrer à nouveau les packs de démarrage',
'starter_warning_confirm' => 'Oui jai compris (continuer sans pack de démarrage)',
'wizard_package_info' => 'Veuillez choisir votre package. Vous avez le choix entre ladhésion annuelle seule et un <strong>pack de démarrage</strong>, qui vous offre une remise attractive et laccès direct au rang suivant. Le pack de démarrage nest disponible quune seule fois lors de linscription. Choisissez votre produit et cliquez sur continuer.',
'wizard_no_selection' => 'Veuillez sélectionner un produit pour continuer.',
];

View file

@ -0,0 +1,62 @@
<?php
return [
'button_31' => 'RENOUVELER LADHÉSION',
'button_32' => 'GÉRER LADHÉSION',
'button_33' => 'RENOUVELER LADHÉSION',
'button_34' => 'RENOUVELER LADHÉSION',
'button_35' => 'GÉRER LADHÉSION',
'button_36' => 'GÉRER LADHÉSION',
'button_37' => 'GÉRER LADHÉSION',
'copy_first_31' => '<p>nous voulions vous informer à temps que votre adhésion expire le :datetime. Vous devriez donc agir maintenant et la renouveler à temps afin de continuer à</p>
<ul>
<li>commander des produits MIVITA</li>
<li>permettre à vos clients dacheter via votre boutique en ligne (optionnel)</li>
<li>participer aux chiffres daffaires des partenaires commerciaux</li>
</ul>
<p>Pas dinquiétude : il vous reste encore :days jours pour renouveler votre adhésion. Si vous laissez toutefois passer ce délai, votre compte sera automatiquement mis en pause jusquà ce que vous renouveliez votre adhésion.</p>
<p>Nous vous enverrons bientôt un autre rappel, mais vous lavez déjà en tête. Si vous souhaitez prolonger dès maintenant pour une année supplémentaire, cliquez sur le bouton ci-dessous.</p>',
'copy_first_32' => '<p>nous voulions vous informer à temps que votre adhésion sera automatiquement renouvelée le :datetime. Comme vous nous avez accordé un mandat de prélèvement SEPA, vous navez rien dautre à faire. Conformément à ce mandat, nous prélèverons le montant de la facture :price le :pay_date sur votre compte.</p>
<p>Votre adhésion sera ensuite prolongée dune année supplémentaire afin que vous puissiez continuer à</p>
<ul>
<li>commander des produits MIVITA</li>
<li>permettre à vos clients dacheter via votre boutique en ligne (optionnel)</li>
<li>participer aux chiffres daffaires des partenaires commerciaux</li>
</ul>
<p>Si vous souhaitez toutefois mettre fin à ladhésion ou la suspendre pour linstant, vous pouvez le régler vous-même dans votre espace membre. Suivez simplement le bouton vert ci-dessous.</p>
<p>Si vous ne souhaitez pas renouveler pour le moment, votre compte sera mis en pause jusquà ce que vous renouveliez votre adhésion. Veuillez noter que tous les avantages et fonctions, de lachat à prix réduit jusquau décompte des commissions, seront également mis en pause.</p>',
'copy_first_33' => '<p>voici un bref rappel : votre adhésion expire le :datetime. Vous devriez donc agir maintenant et la renouveler à temps afin de continuer à</p>
<ul>
<li>commander des produits MIVITA</li>
<li>permettre à vos clients dacheter via votre boutique en ligne (optionnel)</li>
<li>participer aux chiffres daffaires des partenaires commerciaux</li>
</ul>
<p>Pas dinquiétude : il vous reste encore :days jours pour renouveler votre adhésion. Si vous laissez toutefois passer ce délai, votre compte sera automatiquement mis en pause jusquau renouvellement.</p>
<p>Nous vous enverrons bientôt un autre rappel. Si vous souhaitez prolonger dès maintenant pour une année supplémentaire, cliquez sur le bouton ci-dessous.</p>',
'copy_first_34' => '<p>il est vraiment temps dagir ! Votre adhésion expire déjà dans :days jours, exactement le :datetime. Vous devriez donc renouveler votre adhésion maintenant, sinon votre compte sera mis en pause.</p>
<p>Si vous souhaitez continuer à</p>
<ul>
<li>commander des produits MIVITA</li>
<li>utiliser une boutique en ligne (optionnel)</li>
<li>et participer aux chiffres daffaires des partenaires commerciaux</li>
</ul>
<p>vous devriez agir rapidement et renouveler votre adhésion :</p>',
'copy_first_35' => '<p>comme annoncé, nous avons mis votre compte conseiller en pause car vous navez pas renouvelé votre adhésion à temps. Si vous souhaitez profiter à nouveau des avantages et fonctionnalités de MIVITA, vous pouvez réactiver votre compte à tout moment.</p>
<p>Cliquez sur le bouton si vous souhaitez modifier votre adhésion :</p>',
'copy_first_36' => '<p>malheureusement, nous navons pas pu prélever le montant de la cotisation sur le compte indiqué.</p>
<p>Comme annoncé, nous avons donc mis aujourdhui votre compte conseiller en pause, car votre adhésion na pas pu être renouvelée à temps. Si vous souhaitez profiter à nouveau des avantages et fonctionnalités de MIVITA, vous pouvez réactiver votre compte à tout moment via un autre mode de paiement (p. ex. PayPal, carte de crédit, virement SOFORT ou paiement anticipé).</p>
<p>Cliquez simplement sur le bouton suivant et effectuez les réglages correspondants dans votre compte conseiller :</p>',
'copy_first_37' => '<p>comme annoncé, nous avons lancé aujourdhui, conformément à votre mandat de prélèvement SEPA, le prélèvement de :price pour une année supplémentaire dadhésion chez MIVITA. Ce montant sera débité de votre compte dans les prochains jours. Veuillez noter que le renouvellement ne devient actif quaprès réception du paiement.</p>
<p>Si vous souhaitez effectuer des modifications à lavenir, vous pouvez régler toutes les fonctions ainsi que ladhésion dans votre compte conseiller.</p>
<p>Suivez simplement le bouton ci-dessous :</p>',
'copy_last_31' => '',
'copy_last_32' => '',
'copy_last_33' => '',
'copy_last_34' => '',
'copy_last_35' => '<p><b>Remarque :</b><br>Même si votre compte est mis en pause, les commissions passées ou encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement. Si vous souhaitez supprimer complètement votre compte, veuillez écrire un e-mail à info@mivita.care. Notre service conseiller sen occupera rapidement.</p>
<p>Nous espérons vous revoir très bientôt comme membre actif de la famille MIVITA.</p>',
'copy_last_36' => '<p><b>Remarque :</b><br>Même si votre compte est mis en pause, les commissions passées ou encore ouvertes vous seront bien entendu versées lors du prochain cycle de paiement. Si vous souhaitez supprimer complètement votre compte, veuillez écrire un e-mail à info@mivita.care. Notre service conseiller sen occupera rapidement.</p>
<p>Nous espérons vous revoir très bientôt comme membre actif de la famille MIVITA.</p>',
'copy_last_37' => '',
'subject' => 'Votre adhésion chez mivita.care',
];

View file

@ -0,0 +1,57 @@
<?php
return [
'' => '',
'Choose Your Shop Name' => 'Choisissez un nom de boutique mémorable qui vous correspond.',
'Shop details' => 'Détails de la boutique',
'Terms of Use' => 'Conditions dutilisation',
'Your Shop' => 'Votre boutique',
'Your Shop Name' => 'Donnez un nom à votre boutique',
'accept_and_next' => 'accepter et continuer',
'accept_and_change' => 'accepter et modifier',
'active_since' => 'Actif depuis',
'available' => 'accessible',
'check' => 'vérifier',
'declaration_of_shop' => 'Je confirme et accepte les conditions dutilisation de ma boutique mivita.',
'domain' => 'Domaine',
'name' => 'Nom',
'not_available' => 'non accessible',
'not_available_copy' => 'Pour les boutiques nouvellement créées, quelques minutes peuvent être nécessaires avant que le domaine soit accessible. Veuillez réessayer dans quelques minutes.',
'open_copy_1' => 'Choisissez le préfixe du nom de votre boutique - p. ex. prenom(.mivita.care).<br>Vous navez pas besoin de saisir "mivita.care".<br><br>Veillez à choisir un nom court et clair afin que votre adresse Internet tienne aussi sur de petits supports publicitaires. Assurez-vous également de ne pas porter atteinte aux droits de marque de tiers, MIVITA ne pouvant en assumer la responsabilité. Évitez donc autant que possible les termes fantaisistes, sauf si vous les avez déjà déposés comme marque.',
'open_copy_2' => 'Votre adresse Internet sera appelée sans « www. » : https://nomdevotreboutique.mivita.care',
'open_note_1' => 'Vous pouvez modifier le nom de votre boutique à tout moment. Lancien nom de boutique expire toutefois immédiatement et irrévocablement. Si vous avez déjà diffusé lancienne adresse (p. ex. flyers, cartes de visite ou réseaux sociaux), elle ne sera ensuite plus accessible.',
'open_note_hl' => 'REMARQUE IMPORTANTE :',
'open_your_shop' => 'Ouvrez maintenant votre propre boutique mivita !',
'edit_your_shop' => 'Adapter le nom de votre boutique',
'order_customer' => 'Commande client',
'orders_customers' => 'Commandes clients',
'preview_shop_internet_address' => 'Aperçu de ladresse Internet de la boutique',
'save and continue' => 'enregistrer et continuer',
'shop_about' => 'Texte personnel de la boutique',
'shop_about_help' => 'Indiquez votre texte personnel à propos de vous. (max. 190 caractères)',
'shop_accessibility' => 'Disponibilité de la boutique',
'shop_accessibility_help' => 'Indiquez vos horaires de disponibilité.',
'shop_contact' => 'Contact boutique',
'shop_contact_help' => 'Complétez les coordonnées affichées dans la boutique.',
'shop_image' => 'Image de votre boutique',
'shop_image_copy' => 'Téléversez ici une photo / image / logo de vous.',
'shop_name_description' => 'Le nom de votre boutique est affiché dans votre boutique. Ladresse Internet (domaine) permettant dappeler votre boutique est créée à partir du nom de boutique. Choisissez-le avec soin ; il ne pourra être modifié ultérieurement que moyennant des frais de 59,50 EUR.',
'shop_name_error_1' => 'Le nom de votre boutique ne peut contenir que des lettres latines sans accent et des chiffres, sans espaces.',
'shop_name_error_2' => 'Les noms de boutique doivent contenir entre 4 et 20 caractères.',
'shop_on_site' => 'Pour vous sur place :',
'shop_on_site_copy' => 'Étiez-vous à la ferme Aloe Vera à Majorque ? Téléversez ici jusquà 6 photos de vous.',
'shop_title' => 'Propriétaire de la boutique',
'shop_title_help' => 'Indiquez votre nom pour la boutique.',
'your_shop_name' => 'Nom de votre boutique',
'shop_contact_text' => 'Votre rue/n° • Votre code postal ville\nFixe : votre numéro fixe\nMobile : votre numéro mobile\nVotre adresse e-mail',
'shop_accessibility_text' => 'Lun-ven : 9h00 - 19h00\nSam-dim : 11h00 - 18h00',
'phone' => 'Téléphone fixe',
'mobil' => 'Mobile',
'your_street_number' => 'Votre rue/n°',
'your_zip_code' => 'Votre code postal',
'your_city' => 'Votre ville',
'your_phone_number' => 'Votre numéro fixe',
'your_mobile_number' => 'Votre numéro mobile',
'error_subdomain_exists' => 'Erreur : la sous-domaine existe déjà, veuillez choisir un nouveau nom',
'your_current_shop_name' => 'Votre nom de boutique actuel est :',
];

View file

@ -0,0 +1,95 @@
<?php
return [
'' => '',
'VAT' => 'TVA',
'account' => 'Compte',
'account_to' => 'Compte jusquau',
'activ' => 'Actif',
'addition' => 'Complément',
'address' => 'Adresse',
'adviser_no' => 'N° conseiller',
'amount' => 'Montant',
'art' => 'Type',
'article_no' => 'N° article',
'assigned_advisor' => 'Conseiller attribué',
'birthday' => 'Date de naissance',
'c_no' => 'N° client',
'city' => 'Ville',
'commission' => 'Commission',
'contents' => 'Contenu',
'country' => 'Pays',
'created' => 'créé',
'credit_note' => 'Avoir',
'customer' => 'Client',
'date' => 'Date',
'detail' => 'Détail',
'earnings' => 'Gain',
'ek_price' => 'Prix achat',
'email' => 'E-mail',
'firstname' => 'Prénom',
'from_credit_balance' => 'depuis le crédit',
'gross' => 'brut',
'image' => 'Image',
'in_no' => 'N° facture',
'info' => 'Info',
'invoice' => 'Facture',
'label' => 'Désignation',
'lastname' => 'Nom',
'level' => 'Niveau',
'line' => 'Ligne',
'margin' => 'Marge',
'mobil' => 'Mobile',
'my_price_gross' => 'Mon prix brut',
'my_price_net' => 'Mon prix net',
'net' => 'net',
'net_price' => 'Prix net',
'net_sales' => 'Chiffre daffaires net',
'net_sum' => 'Somme nette',
'newsletter' => 'Newsletter',
'note' => 'Note',
'number' => 'Numéro',
'order' => 'Commande',
'payline_qualification' => 'Qualification Payline',
'payment' => 'Paiement',
'payment_type' => 'Mode de paiement',
'phone' => 'Tél.',
'points' => 'Points',
'postcode' => 'Code postal',
'price' => 'Prix',
'product' => 'Produit',
'products' => 'Produits',
'purchased_in_the_shop' => 'Acheté dans la boutique',
'purchases' => 'Achats',
'qualification' => 'Qualification',
'quantity' => 'Quantité',
'reference_number' => 'Numéro de référence',
'rf_no' => 'N° réf.',
'shipping' => 'Livraison',
'shop' => 'Boutique',
'shop_commission' => 'Commission boutique',
'sponsor' => 'Sponsor',
'status' => 'Statut',
'subject' => 'Objet',
'sum' => 'Somme',
'total' => 'Total',
'type' => 'Type',
've' => 'UE',
'vk_price' => 'Prix vente',
'my_commission' => 'Ma commission',
'start_date' => 'Date de début',
'next_date' => 'Prochaine exécution',
'last_date' => 'Dernière exécution',
'abo_delivery_day' => 'Jour de livraison de labonnement',
'abo_delivery' => 'Livraisons dabonnement',
'active' => 'Actif',
'is_for' => 'Est pour',
'count' => 'Nombre',
'member' => 'Membre',
'adviser' => 'Conseiller',
'exc' => 'Exéc.',
'executions' => 'Exécutions',
'previous_orders' => 'commandes clients précédentes',
'partner_since' => 'Partenaire depuis',
'no_data_available' => 'Aucune donnée disponible',
];

134
resources/lang/fr/team.php Normal file
View file

@ -0,0 +1,134 @@
<?php
return [
'' => '',
'KU' => 'KU',
'PP' => 'PP',
'TP' => 'TP',
'WB' => 'WB',
'account' => 'Compte',
'account_to' => 'Compte jusquau',
'active' => 'actif',
'business' => 'Business',
'career_level' => 'Niveau de carrière',
'collapse_all' => 'Tout replier',
'commission_WB' => 'Commission bonus de profondeur',
'commission_payline' => 'Commission Payline',
'commission_shop' => 'Commission boutique',
'commission_team' => 'Commission équipe',
'commission_total' => 'Commission totale',
'completed' => 'Terminé',
'open' => 'Ouvert',
'create_new_consultant' => 'Créer un nouveau conseiller',
'current_commission_level' => 'niveau de commission actuel',
'customer_commission' => 'Commission client',
'consultant_margin' => 'Marge conseiller',
'consultant_margin_info' => 'Remarque : la marge a déjà été déduite lors de la commande et donc déjà versée.',
'customer_points' => 'Points clients',
'date' => 'Date',
'e' => 'E',
'expand_all' => 'Tout déplier',
'export' => 'Export',
'export_as_xls' => 'Export en xls',
'link_for_consultant_registration' => 'Lien pour linscription du conseiller',
'net_turnover' => 'Chiffre daffaires net',
'new_consultant_copy1' => 'Vous souhaitez inscrire un nouveau conseiller ? Parfait, nous nous en réjouissons. Envoyez-lui simplement le lien ci-dessous par e-mail, WhatsApp ou SMS. Il accédera ainsi à la page dinscription de www.mivita.care. Important : ne modifiez pas ce lien, car lID conseiller ajouté vous identifie comme sponsor du nouveau conseiller. Cest le seul moyen dattribuer à votre compte les futures commissions issues de ses ventes. Utilisez licône de copie pour copier immédiatement le lien dans votre presse-papiers.',
'next_career_level' => 'prochain niveau de carrière',
'next_commission_level' => 'prochain niveau de commission',
'no_sponsor_assigned' => 'Aucun sponsor attribué',
'not_active' => 'inactif',
'last_login' => 'Dernière connexion',
'registered_at' => 'Inscrit le',
'own' => 'Propres',
'payline_points' => 'Points Payline',
'points' => 'Points',
'qualification' => 'Qualification',
'qualification_commission' => 'Commission de qualification',
'qualification_points' => 'Points de qualification',
'register_new_consultant' => 'Inscrire un nouveau conseiller',
's' => 'S',
'shop' => 'Boutique',
'shop_commission' => 'Commission boutique',
'sponsor' => 'Sponsor',
'structure' => 'Structure',
'total_points' => 'Points totaux',
'total_turnover' => 'Chiffre daffaires total',
'until' => 'jusquau',
'volume_KU' => 'Volume KU',
'your_sponsor' => 'Votre sponsor',
'your_team' => 'Votre équipe',
'sales_store_net' => 'Chiffre daffaires boutique net',
'filename_export' => 'mivita-mon-equipe-export-',
'payout_details' => 'Détails des versements',
'filter_active' => 'actif',
'filter_not_active' => 'inactif',
'filter_all' => 'tous',
'all_status' => 'Tous les statuts',
'qualified_green' => 'Qualifié (vert)',
'in_progress_yellow' => 'En cours (jaune)',
'no_level_red' => 'Aucun niveau (rouge)',
'optimized' => 'OPTIMISÉ',
'standard_monitoring' => 'STANDARD + MONITORING',
'fallback' => 'FALLBACK',
'loading_time' => 'Temps de chargement :',
'memory' => 'Mémoire :',
'memory_usage' => 'Consommation mémoire :',
'team_size' => 'Taille de léquipe :',
'team_members' => 'Membres de léquipe :',
'execution_time' => 'Temps dexécution :',
'user_id' => 'User ID :',
'performance_details' => 'Détails de performance',
'team_structure' => 'Structure de léquipe',
'new_member' => 'Nouveau membre',
'optimized_action' => 'Optimisé',
'standard_action' => 'Standard',
'close' => 'Fermer',
'show_details' => 'Afficher les détails',
'test_optimized' => 'Tester optimisé',
'standard_version' => 'Version standard',
'performance_metrics_team_overview' => 'Métriques de performance - aperçu équipe',
'performance_metrics_my_team' => 'Métriques de performance - mon équipe',
'performance_monitoring' => 'Monitoring performance',
'fallback_support' => 'Support fallback',
'optimized_with_cache' => 'Optimisé avec cache',
'datatable_mode_switched' => 'Mode DataTable basculé sur ":mode"',
'error_loading_optimized_overview' => 'Erreur lors du chargement de laperçu équipe optimisé : ',
'live_not_supported_fallback' => 'Live (non pris en charge en fallback)',
'optimized_performance_features' => 'Cette page utilise des fonctionnalités de performance optimisées.',
'next_level' => 'Niveau suivant',
'calculation_type' => 'Type de calcul',
'version' => 'Version',
'cache' => 'Cache',
'live' => 'Live',
'ID' => 'ID',
'Ebene' => 'Niveau',
'Level' => 'Level',
'KD' => 'KD',
'bis' => 'jusquà',
'level_reports_title' => 'Rapports de progression de niveau - mon équipe',
'level_reports_month' => 'Mois',
'level_reports_year' => 'Année',
'level_reports_filter_not_updated' => 'Uniquement les utilisateurs non modifiés',
'level_reports_filter_button' => 'Filtre',
'level_reports_csv_export' => 'Export CSV',
'level_reports_total_promotions' => 'Total progressions',
'level_reports_by_level' => 'Progressions par niveau',
'level_reports_table_date' => 'Date',
'level_reports_table_user' => 'Utilisateur',
'level_reports_table_from_level' => 'Du niveau',
'level_reports_table_to_level' => 'Au niveau',
'level_reports_table_current_level' => 'Niveau actuel',
'level_reports_table_kp_quali' => 'Quali KP',
'level_reports_table_user_kp' => 'KP utilisateur',
'level_reports_table_pp_quali' => 'Quali PP',
'level_reports_table_user_pp' => 'PP utilisateur',
'level_reports_table_update' => 'Update',
'level_reports_table_active' => 'Actif',
'level_reports_by_period' => 'Progressions par période',
'level_reports_no_data' => 'Aucune progression de niveau trouvée',
'level_reports_no_data_description' => 'Aucune entrée trouvée avec les filtres actuels.',
'yes' => 'Oui',
'no' => 'Non',
'not_available' => 'N/A',
'growth_bonus_details_description' => 'L1 = partenaires directs (reçoit toujours le bonus de profondeur), L2 = membres (à partir dici, le bonus de profondeur est partagé si le membre est qualifié), etc. | Affiche la commission (€) et le volume (pts) par niveau.',
];

View file

@ -0,0 +1,182 @@
<?php
return [
'accepted' => ':attribute doit être accepté.',
'active_url' => ':attribute nest pas une URL valide.',
'after' => ':attribute doit être une date postérieure au :date.',
'after_or_equal' => ':attribute doit être une date postérieure ou égale au :date.',
'alpha' => ':attribute ne peut contenir que des lettres.',
'alpha_dash' => ':attribute ne peut contenir que des lettres, chiffres, tirets et underscores.',
'alpha_num' => ':attribute ne peut contenir que des lettres et des chiffres.',
'array' => ':attribute doit être un tableau.',
'attributes' => [
'accepted_data_checkbox' => 'Consentement',
'accepted_data_protection' => 'Consentement à la politique de confidentialité',
'address' => 'Adresse',
'age' => 'Âge',
'available' => 'disponible',
'billing_address' => 'Adresse',
'billing_city' => 'Ville',
'billing_country_code' => 'Code pays',
'billing_email' => 'Adresse e-mail',
'billing_firstname' => 'Prénom',
'billing_lastname' => 'Nom',
'billing_salutation' => 'Civilité',
'billing_zipcode' => 'Code postal',
'birthday' => 'Date de naissance',
'city' => 'Ville',
'content' => 'Contenu',
'country' => 'Pays',
'date' => 'Date',
'day' => 'Jour',
'description' => 'Description',
'email' => 'Adresse e-mail',
'email-confirm' => 'Répéter ladresse e-mail',
'excerpt' => 'Extrait',
'first_name' => 'Prénom',
'g-recaptcha-response' => 'google reCaptcha',
'gender' => 'Genre',
'has_customer_buyed' => 'Lindication',
'hour' => 'Heure',
'last_name' => 'Nom',
'm_account' => 'ID conseiller',
'message' => 'Message',
'minute' => 'Minute',
'mobil' => 'Téléphone mobile',
'mobile' => 'Numéro mobile',
'month' => 'Mois',
'name' => 'Nom',
'password' => 'Mot de passe',
'password-confirm' => 'Confirmation du mot de passe',
'password_confirmation' => 'Confirmation du mot de passe',
'phone' => 'Numéro de téléphone',
'place' => 'Lieu',
'reverse_charge' => 'Procédure dautoliquidation',
'sales_partnership' => 'Partenariat commercial',
'sales_partnership_message' => 'Remarque partenariat commercial',
'salutation' => 'Civilité',
'second' => 'Seconde',
'sex' => 'Genre',
'shipping_address' => 'Adresse',
'shipping_city' => 'Ville',
'shipping_firstname' => 'Prénom',
'shipping_lastname' => 'Nom',
'shipping_salutation' => 'Civilité',
'shipping_zipcode' => 'Code postal',
'size' => 'Taille',
'tax_identification_number' => 'Numéro de TVA',
'tax_number' => 'Numéro fiscal',
'time' => 'Heure',
'title' => 'Titre',
'user_shop_active' => 'Conditions dutilisation',
'user_shop_name' => 'Nom de boutique',
'username' => 'Nom dutilisateur',
'year' => 'Année',
],
'before' => ':attribute doit être une date antérieure au :date.',
'before_or_equal' => ':attribute doit être une date antérieure ou égale au :date.',
'between' => [
'array' => ':attribute doit contenir entre :min et :max éléments.',
'file' => ':attribute doit faire entre :min et :max kilo-octets.',
'numeric' => ':attribute doit être compris entre :min et :max.',
'string' => ':attribute doit contenir entre :min et :max caractères.',
],
'boolean' => ':attribute doit être vrai ou faux.',
'confirmed' => ':attribute ne correspond pas à la confirmation.',
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
'match_found' => 'Droit client : une correspondance avec un client existant a été trouvée ; ce conflit sera dabord vérifié. Dici là, le client a le statut "en vérification". Si vous souhaitez passer une commande pour le client, vous pouvez aussi commander les produits à votre adresse.',
'no_email' => 'Le champ E-mail doit être indiqué',
'shipping_not_found' => 'Le pays de livraison nest pas encore enregistré dans le système. Veuillez contacter info@mivita.care afin de le faire ajouter.',
'unique_email_client' => 'Un client avec cette adresse e-mail existe déjà dans le Salescenter mivita',
'unique_email_member' => 'Un conseiller avec cette adresse e-mail existe déjà dans le Salescenter mivita',
],
'date' => ':attribute doit être une date valide.',
'date_format' => ':attribute ne correspond pas au format valide :format.',
'different' => ':attribute et :other doivent être différents.',
'digits' => ':attribute doit contenir :digits chiffres.',
'digits_between' => ':attribute doit contenir entre :min et :max chiffres.',
'dimensions' => ':attribute a des dimensions dimage invalides.',
'distinct' => ':attribute contient une valeur déjà présente.',
'email' => ':attribute doit être une adresse e-mail valide.',
'exists' => 'La valeur sélectionnée pour :attribute est invalide.',
'file' => ':attribute doit être un fichier.',
'filled' => ':attribute doit être rempli.',
'full_word_check' => ':attribute est déjà utilisé',
'gt' => [
'array' => ':attribute doit contenir plus de :min éléments.',
'file' => ':attribute doit être supérieur à :min kilo-octets.',
'numeric' => ':attribute doit être supérieur à :min.',
'string' => ':attribute doit contenir plus de :min caractères.',
],
'gte' => [
'array' => ':attribute doit contenir au moins :min éléments.',
'file' => ':attribute doit être supérieur ou égal à :min kilo-octets.',
'numeric' => ':attribute doit être supérieur ou égal à :min.',
'string' => ':attribute doit contenir au moins :min caractères.',
],
'image' => ':attribute doit être une image.',
'in' => 'La valeur sélectionnée pour :attribute est invalide.',
'in_array' => 'La valeur sélectionnée pour :attribute nexiste pas dans :other.',
'integer' => ':attribute doit être un nombre entier.',
'ip' => ':attribute doit être une adresse IP valide.',
'ipv4' => ':attribute doit être une adresse IPv4 valide.',
'ipv6' => ':attribute doit être une adresse IPv6 valide.',
'json' => ':attribute doit être une chaîne JSON valide.',
'lt' => [
'array' => ':attribute doit contenir moins de :min éléments.',
'file' => ':attribute doit être inférieur à :min kilo-octets.',
'numeric' => ':attribute doit être inférieur à :min.',
'string' => ':attribute doit contenir moins de :min caractères.',
],
'lte' => [
'array' => ':attribute doit contenir au maximum :min éléments.',
'file' => ':attribute doit être inférieur ou égal à :min kilo-octets.',
'numeric' => ':attribute doit être inférieur ou égal à :min.',
'string' => ':attribute doit contenir au maximum :min caractères.',
],
'max' => [
'array' => ':attribute ne peut pas contenir plus de :max éléments.',
'file' => ':attribute ne peut pas dépasser :max kilo-octets.',
'numeric' => ':attribute ne peut pas être supérieur à :max.',
'string' => ':attribute ne peut pas dépasser :max caractères.',
],
'mimes' => ':attribute doit être un fichier de type :values.',
'mimetypes' => ':attribute doit être un fichier de type :values.',
'min' => [
'array' => ':attribute doit contenir au moins :min éléments.',
'file' => ':attribute doit faire au moins :min kilo-octets.',
'numeric' => ':attribute doit être au moins :min.',
'string' => ':attribute doit contenir au moins :min caractères.',
],
'not_in' => 'La valeur sélectionnée pour :attribute est invalide.',
'not_regex' => ':attribute a un format invalide.',
'numeric' => ':attribute doit être un nombre.',
'old_password' => 'Le mot de passe nest pas valide',
'present' => ':attribute doit être présent.',
'profanity' => ':attribute nest pas autorisé',
'recaptcha' => 'Erreur google reCaptcha, veuillez réessayer !',
'regex' => 'Le format de :attribute est invalide.',
'required' => ':attribute doit être rempli.',
'required_if' => ':attribute doit être rempli lorsque :other vaut :value.',
'required_unless' => ':attribute doit être rempli sauf si :other vaut :values.',
'required_with' => ':attribute doit être indiqué lorsque :values est rempli.',
'required_with_all' => ':attribute doit être indiqué lorsque :values est rempli.',
'required_without' => ':attribute doit être indiqué lorsque :values nest pas rempli.',
'required_without_all' => ':attribute doit être indiqué lorsquaucun des champs :values nest rempli.',
'same' => ':attribute et :other doivent correspondre.',
'size' => [
'array' => ':attribute doit contenir exactement :size éléments.',
'file' => ':attribute doit faire :size kilo-octets.',
'numeric' => ':attribute doit être égal à :size.',
'string' => ':attribute doit contenir :size caractères.',
],
'string' => ':attribute doit être une chaîne de caractères.',
'timezone' => ':attribute doit être un fuseau horaire valide.',
'unique' => ':attribute est déjà utilisé.',
'uploaded' => ':attribute na pas pu être téléversé.',
'url' => ':attribute doit être une URL.',
'users_update_email' => 'Le-mail est déjà enregistré pour modification',
];

View file

@ -0,0 +1,170 @@
<?php
return [
'career_opportunities_at_mivita' => 'Opportunités de carrière chez mivita',
'requirement_profile' => 'Profil requis',
'advantages_of_direct_sales' => 'Avantages de la vente directe',
'compatibility_with_family_private_life' => 'Compatibilité avec la famille et la vie privée',
'start_up' => 'Création dentreprise',
'that_sounds_exciting_to_you' => 'Cela vous semble passionnant ?',
'then_get_in_touch_with_us_today' => 'Alors contactez-nous dès aujourdhui - nous serons ravis de vous connaître.',
'to_the_registration' => 'vers linscription',
'to_the_contact_form' => 'vers le formulaire de contact',
'aloe_vera_word_copy' => 'Les propriétés uniques et remarquables de lAloe Vera sont dues à linteraction et à la symbiose uniques de ses différents composants et principes actifs. Aucune autre plante connue à ce jour noffre des possibilités aussi variées dutilisation bienfaisante et soignante. La littérature médicale connaît actuellement plus de 200 substances actives, et de nouvelles sont régulièrement découvertes. Le décryptage de linteraction complexe de toutes ces substances nen est quà ses débuts, mais les effets sont déjà très bien documentés.',
'origin_aloe_hl' => 'Origine de notre aloe',
'origin_aloe_subl' => 'De lîle de vacances préférée des Allemands',
'origin_aloe_copy' => 'La ferme de Majorque couvre environ 40 hectares. Les plants dAloe Vera y sont cultivés et entretenus. Les 200 000 plants doivent avoir au moins 5 ans avant que leurs feuilles puissent être récoltées. Une plante a besoin dau moins 2 000 heures de soleil par an pour développer les précieux nutriments contenus dans le jus.',
'bio_quality_hl' => 'Qualité 100 % BIO',
'bio_quality_subl' => 'Travail manuel certifié bio à Majorque',
'bio_quality_copy' => 'Nous garantissons la meilleure qualité grâce à une production manuelle et à des ingrédients biologiques. Le climat typique de Majorque met les plantes au défi. Des tests ont montré que ce climat est justement optimal pour un développement parfait de la plante.',
'shop_at_the_aloe_vera_farm' => 'Boutique à la ferme Aloe Vera',
'aloe_high_quality_hl' => 'Quest-ce qui rend nos produits Aloe Vera si haut de gamme ?',
'aloe_high_quality_subl' => 'Lun des meilleurs jus dAloe Vera au monde comme base de produits aloe haut de gamme',
'aloe_high_quality_copy' => 'Le gel des feuilles dAloe Vera est un véritable trésor et un cadeau de la nature. Mais de la culture à la transformation, beaucoup de points doivent être respectés pour que ces précieux ingrédients soient préservés et arrivent chez le client. Malheureusement, de nombreux fabricants ne respectent pas les règles fondamentales de la fabrication de lAloe Vera ; le marché compte donc beaucoup de produits à leffet faible ou nul. Quest-ce qui rend donc nos produits si haut de gamme ?',
'aloe_high_quality_li1' => 'Les plants daloe ont plus de 5 ans',
'aloe_high_quality_li2' => 'Ils bénéficient de plus de 2 000 heures de soleil par an',
'aloe_high_quality_li3' => 'Culture biologique contrôlée',
'aloe_high_quality_li4' => 'Aucune (!) irrigation artificielle',
'aloe_high_quality_li5' => 'Aucun pesticide ni herbicide',
'aloe_high_quality_li6' => 'Récolte et filetage des feuilles à la main',
'aloe_high_quality_li7' => 'Transformation en produits directement après la récolte',
'aloe_high_quality_li8' => 'Uniquement le gel pur : pas de poudre ni dextrait',
'aloe_high_quality_li9' => 'Teneur certifiée en aloverose supérieure à 1 600 mg/l',
'aloe_high_quality_li10' => 'Forte proportion daloe pur dans chaque produit',
'pillars_best_aloe_vera_quality' => 'Les 5 piliers de la meilleure qualité Aloe Vera',
'pillars_best_aloe_vera_quality_1_hl' => 'Certifié BIO',
'pillars_best_aloe_vera_quality_1_subl' => 'Aloe vera issu de lagriculture biologique - sans substances nocives',
'pillars_best_aloe_vera_quality_2_hl' => 'Gel daloe pur',
'pillars_best_aloe_vera_quality_2_subl' => 'Transformation du gel daloe pur - pas de mélange poudre-eau',
'pillars_best_aloe_vera_quality_3_hl' => 'Production sur place',
'pillars_best_aloe_vera_quality_3_subl' => 'Les feuilles daloe récoltées sont immédiatement transformées sur place - les principes actifs sont préservés',
'pillars_best_aloe_vera_quality_4_hl' => 'Forte proportion daloe',
'pillars_best_aloe_vera_quality_4_subl' => 'Tous les produits ont une forte proportion dAloe vera BIO pur',
'pillars_best_aloe_vera_quality_5_hl' => 'Teneur élevée en aloverose',
'pillars_best_aloe_vera_quality_5_subl' => 'Avec 1 600-1 700 mg/l, une teneur en aloverose nettement supérieure à la moyenne - LE facteur qualité pour la teneur en principes actifs de laloe',
'requirement_profile_at_mivita' => 'Profil requis',
'requirement_profile_at_mivita_copy' => ' <p>Chez MIVITA, toute personne qui souhaite construire quelque chose de personnel avec joie et engagement est la bienvenue. Parmi nos partenaires commerciaux, on trouve surtout des personnes comme ...</p>
<ul class="small">
<li>salariés à temps plein</li>
<li>salariés à temps partiel</li>
<li>jeunes familles ou parents isolés</li>
<li>entrepreneurs indépendants</li>
<li>étudiants et apprentis</li>
<li>génération 50+, qui veut encore se lancer</li>
</ul>
<p>
Si vous vous reconnaissez dans ce profil, vous êtes au bon endroit. Nous proposons volontiers un premier entretien sans engagement aux personnes qui sentent quil y a encore plus à atteindre, qui stagnent peut-être professionnellement ou qui souhaitent travailler de façon plus libre et indépendante.
</p>',
'trade_licence_hl' => 'Extrait dactivité',
'trade_licence_copy' => '<p>Si vous souhaitez vous lancer dans cette activité, vous avez besoin dun extrait dactivité. Ce nest rien de compliqué et cela peut être demandé auprès du bureau compétent de votre ville. Des frais modérés denviron 20-25 EUR sappliquent selon la ville ou commune. Réfléchissez à une activité concrète à indiquer, p. ex. « distribution de produits de bien-être et de soins ». Dans la fiche Inscription dactivité, création dentreprise et formalités, vous trouverez des informations utiles sur :</p>
<ul>
<li>Inscription dactivité</li>
<li>Déclaration auprès du fisc</li>
<li>Adhésion à la chambre de commerce et dindustrie</li>
</ul>',
'funding_opportunities_hl' => 'Possibilités de financement',
'funding_opportunities_copy' => ' <p>Celles et ceux qui souhaitent se lancer dans une indépendance complète disposent de différentes possibilités de financement. Veuillez consulter les sites suivants, vous pouvez demander un premier capital de départ :</p>
<p>
<a href="https://www.existenzgruender.de" rel="nofollow" target="_blank">www.existenzgruender.de</a><br>
<a href="http://www.foerderdatenbank.de" rel="nofollow" target="_blank">www.foerderdatenbank.de</a><br>
<a href="https://www.kfw.de" rel="nofollow" target="_blank">www.kfw.de</a><br>
<a href="http://www.mikrofinanz.net" rel="nofollow" target="_blank">www.mikrofinanz.net</a><br>
</p>',
'social_security_hl' => 'Protection sociale',
'social_security_copy' => '<p>Presque tous commencent dans la vente directe comme activité secondaire. Le succès professionnel avec un bon revenu financier ne se construit pas du jour au lendemain. Si vous optez toutefois pour une indépendance complète, prenez en compte les points suivants concernant votre protection sociale :</p>
<p>
<ul class="small">
<li>Les indépendants peuvent souscrire une prévoyance retraite privée ou adhérer à lassurance retraite légale. Des exceptions existent pour certains indépendants assimilés à des salariés.</li>
<li>Les indépendants peuvent souscrire une assurance maladie privée ou, sous certaines conditions, rester volontairement dans une caisse légale. Une assurance maladie est obligatoire.</li>
<li>Vous devez souscrire une assurance dépendance auprès de lorganisme vous êtes assuré maladie.</li>
<li>Il nexiste pas dobligation dadhésion à lassurance chômage légale. Après la création dentreprise, une assurance volontaire peut être possible sous conditions.</li>
</ul>',
'training_aloe_farm_mallorca' => 'Formation à la ferme Aloe Vera à Majorque.',
'training_aloe_farm_mallorca_copy' => 'Deux fois par an, MIVITA organise une formation pour les conseillers. Outre votre visite de la ferme et du site de production, lexploitant Werner Telwest vous initie aux secrets du « lys du désert ». Et le mieux : chaque formation fait lobjet dun concours. Ceux qui réalisent le chiffre daffaires correspondant sont récompensés par MIVITA et senvolent GRATUITEMENT vers lîle de vacances préférée des Allemands.',
'career_opportunitie_point_1' => 'Distribuez des produits adaptés à une vie saine et pleine de vitalité, qui offrent à vous et à vos proches une belle expérience de bien-être.',
'career_opportunitie_point_2' => 'Dans des groupes WhatsApp et des appels vidéo, nous restons informés ensemble et nous nous soutenons mutuellement. Vous nêtes pas seul !',
'career_opportunitie_point_3' => 'Nous partageons notre savoir-faire, nos outils marketing éprouvés et nos supports publicitaires avec vous, car nous ne réussissons que si VOUS réussissez.',
'career_opportunitie_point_4' => 'Profitez de mesures de soutien comme les formations, événements déquipe ou actions de vente communes. Ensemble, nous réussissons !',
'career_opportunitie_point_5' => 'Utilisez les réseaux sociaux, parlez des produits et de vos expériences. Gagnez de nouveaux clients et partenaires via Facebook & Co.',
'make_people_happy_hl' => 'Rendez les gens heureux ...',
'make_people_happy_copy' => 'Nos produits aident les personnes confrontées à différents problèmes de peau et sont volontiers utilisés pour le soin en cas de dermatite atopique, psoriasis, acné et bien dautres affections cutanées. Le jus pur dAloe Vera bio est un excellent biorégulateur, a un effet anti-inflammatoire et aide le corps à maintenir la flore intestinale. Aidez vous aussi dautres personnes de façon naturelle à préserver leur santé.',
'how_to_sell_exactly_hl' => 'Et comment vendre exactement ?',
'how_to_sell_exactly_copy' => 'Il existe de nombreuses possibilités de vendre des produits ou de gagner des partenaires commerciaux. Nous vous en présentons quelques-unes. La règle la plus importante : utilisez les produits et parlez-en. Les clients viendront alors deux-mêmes vers vous.',
'private_environment_hl' => 'Dans lenvironnement privé',
'private_environment_list' => 'ul class="small">
<li>Famille</li>
<li>Amis</li>
<li>Collègues</li>
<li>Voisins</li>
<li>Homepartys</li>
<li>Club sportif</li>
<li>Famille</li>
<li>Propriétaires danimaux</li>
<li>etc.</li>
</ul>',
'business_environment_hl' => 'Environnement professionnel',
'business_environment_list' => '<ul class="small">
<li>Cosmétique / cosmétique naturelle</li>
<li>Coiffure</li>
<li>Nutrition</li>
<li>Soin des ongles et des pieds</li>
<li>Naturopathes & médecine alternative</li>
<li>Médecine (peau, physiothérapie, général, etc.)</li>
<li>Autour des animaux</li>
<li>Yoga & méditation</li>
<li>Gastronomie</li>
<li>Sport & fitness</li>
<li>etc.</li>
</ul>',
'social_environment_hl' => 'Dans les réseaux sociaux',
'social_environment_list' => ' <ul class="small">
<li>Facebook</li>
<li>Youtube</li>
<li>Instagram</li>
<li>Snapchat</li>
<li>Famille</li>
<li>entre autres ...</li>
</ul>',
'direct_sales_advantages_hl' => 'La vente directe et ses avantages',
'direct_sales_advantages_copy' => '<p>La vente directe sest depuis longtemps imposée dans le monde comme une forme dactivité à part entière et est représentée dans de nombreux secteurs. La vente directe, aussi appelée network marketing, décrit la vente <b>personnelle</b> de biens ou services à des consommateurs de lenvironnement direct : famille, amis, collègues, etc. Le contact personnel et la fonction de conseil sont décisifs - un service client par excellence ! Cest là la grande force de la vente directe : le service au client, que les vastes espaces anonymes dInternet ne peuvent plus offrir de la même manière, nous le créons avec personnalité et transparence.</p>',
'direct_sales_exactly_hl' => 'Vente directe - comment cela fonctionne-t-il exactement ?',
'direct_sales_exactly_copy' => '<p>Imaginez que vous êtes fan des produits dune entreprise. Vous vous dites : « Super, il faut que jen parle à ma meilleure amie, à mon ami, à ma famille et au monde entier. » Et ils achètent le produit sur votre recommandation. Cela arrive tous les jours.</p>
<p>La différence est que vous ne vous contentez pas de recommander : vous êtes vous-même vendeur, construisez votre clientèle et réalisez ainsi une marge de 30-40 %. De nouveaux clients gagnés - parfait !</p>
<p>Imaginez maintenant que votre ami ou amie devienne aussi partenaire commercial, construise sa propre clientèle et que vous gagniez aussi sur son activité. Et cela continue jusquà 3 niveaux + bonus !</p>',
'advantages_MIVITA_hl' => 'Avantages chez MIVITA :',
'advantages_MIVITA_subl' => 'Il y a beaucoup de bonnes raisons de devenir indépendant avec mivita. À la question de savoir pourquoi elles ont choisi la vente directe chez mivita, de nombreuses conseillères et de nombreux conseillers répondent :',
'advantages_MIVITA_list' => '<ul class="small">
<li>20-40 % de marge de vente</li>
<li>Bonus et actions attractifs</li>
<li>Gains jusquà 3 niveaux</li>
<li>Aucun chiffre daffaires minimum</li>
<li>Organisation libre du temps</li>
<li>Travail en équipe</li>
<li>Supports publicitaires & boutique en ligne sur demande</li>
<li>Expédition et gestion des retours par MIVITA</li>
<li>Formations à Majorque</li>
</ul>',
'advantages_MIVITA_botl' => '... construisez un avenir autodéterminé dans lequel vous êtes votre propre chef.',
'advantages_direct_sales_hl' => 'Avantages de la vente directe',
'advantages_direct_sales_subl' => 'La vente directe offre les avantages suivants',
'advantages_direct_sales_list' => '<ul class="small">
<li>Gagner un revenu supplémentaire ou améliorer la qualité de vie de la famille</li>
<li>Être son propre chef avec un faible risque et de faibles investissements</li>
<li>Travailler de façon flexible avec une organisation libre du temps</li>
<li>Ne pas avoir dobligation dachat</li>
<li>Pouvoir démarrer sans limite dâge, sans connaissances préalables ni qualifications particulières</li>
<li>Faible risque et faibles coûts fixes</li>
<li>Grâce à la haute qualité des produits</li>
</ul>',
'compatibility_with_family_copy1' => 'Qui ne connaît pas cela ? Largent manque partout et le chef fait déjà la grimace quand lenfant est malade. Beaucoup de familles dépendent dun deuxième emploi ou dun temps partiel de la mère ou du père. Et cela ne saccorde souvent pas avec les attentes de lemployeur. Mais que se passerait-il si vous pouviez construire vous-même facilement votre revenu mensuel complémentaire tout en ayant plus de temps pour votre enfant ?',
'compatibility_with_family_copy2' => 'Surtout dans la vente directe, avec ses possibilités dorganisation libre du temps et de revenu passif, vous obtenez à moyen terme une liberté quun emploi fixe ne peut pas offrir. En tant que conseillère MIVITA indépendante, vous décidez vous-même quand et où vous travaillez. Et cela ne concerne pas seulement les jeunes parents. Pour les personnes qui doivent soccuper de proches ou qui souhaitent tout simplement plus de temps et de soulagement financier, la vente directe est également une solution idéale :',
'compatibility_with_family_list' => ' <ul class="small">
<li>Travailler de chez soi ou en déplacement</li>
<li>Pas de loyer de bureau</li>
<li>Pas dinvestissements importants dans le développement</li>
<li>Aucune infrastructure coûteuse nécessaire</li>
</ul>',
'women_direct_sales_hl' => 'Les femmes dans la vente directe',
'women_direct_sales_copy' => 'Selon lAssociation fédérale allemande de la vente directe (BDD), 82 % des cadres étaient des femmes. Cest le résultat dune enquête menée auprès des entreprises membres du BDD. La part des femmes est donc nettement plus élevée que dans léconomie globale. Et ce nest pas un hasard. Traditionnellement, de nombreuses femmes travaillent dans la vente directe et y trouvent leur vocation en raison de conditions familiales ou dun manque dégalité des chances sur le marché, afin dexprimer leur énergie, leurs idées et leur engagement et de devenir des femmes daffaires prospères.',
'' => '',
];

View file

@ -0,0 +1,45 @@
<?php
return [
'product_details' => 'Détails du produit',
'description' => 'Description',
'application' => 'Utilisation',
'ingredients' => 'Ingrédients',
'to_shopping_cart' => 'vers le panier ',
'shopping_cart' => 'Panier',
'excl_VAT_plus_shipping_costs' => 'hors TVA, plus frais de livraison',
'incl_VAT_plus_shipping_costs' => 'TVA incluse, plus frais de livraison',
'free_shipping_costs_from' => 'Livraison offerte à partir de',
'only_missing_free_shipping_costs_from' => 'Il ne manque plus que :value € pour votre livraison gratuite.',
'add_shopping_cart' => 'Ajouter au panier',
'details' => 'Détails',
'to_product' => 'vers le produit',
'price_net' => 'Prix nets',
'incl' => 'incl.',
'VAT' => 'TVA',
'plus_shipping_cost' => 'plus frais de livraison',
'delivery_time_1_3' => 'Délai de livraison : 1-3 jours ouvrés',
'payment_methods' => 'Modes de paiement',
'payment_method_paypal' => 'Paiement avec PayPal',
'payment_method_paypal_copy' => 'Après vérification réussie, vous serez redirigé vers la page de paiement sécurisée de PayPal afin de poursuivre le paiement. Veuillez ne pas fermer le navigateur après le paiement réussi avant dêtre redirigé vers la boutique.',
'payment_method_direct' => 'Virement immédiat',
'payment_method_direct_copy' => 'Après vérification réussie, vous serez redirigé vers la page de paiement sécurisée de PAYONE pour les virements SOFORT afin de poursuivre le paiement. Veuillez ne pas fermer le navigateur après le paiement réussi avant dêtre redirigé vers la boutique.',
'payment_method_sepa' => 'Prélèvement SEPA',
'payment_method_sepa_copy' => 'Votre compte sera débité pour cette commande unique après lenvoi de la commande. Le prélèvement SEPA est traité par notre prestataire de paiement PAYONE.',
'payment_method_creditcard' => 'Carte de crédit',
'payment_method_creditcard_copy' => 'Le montant sera débité de votre carte de crédit dès lenvoi de la commande. Le paiement par carte de crédit est traité par notre prestataire de paiement PAYONE.',
'payment_method_prepayment' => 'Paiement anticipé',
'payment_method_prepayment_copy' => 'Après lenvoi de la commande, vous recevrez un e-mail avec les coordonnées bancaires pour effectuer le paiement. Après réception du montant, votre marchandise sera expédiée.',
'shipping_methods_costs' => 'Modes et frais de livraison',
'free_shipping_at' => 'Livraison offerte à partir de :value €',
'only_missing_free_shipping_at' => 'Il ne manque plus que :value € pour votre livraison gratuite.',
'free_shipping' => 'livraison gratuite',
'not_free_shipping' => 'livraison non gratuite',
'shopping_cart_sum' => 'Total du panier',
'shipping_cost' => 'Frais de livraison',
'sum_net' => 'Somme nette',
'checkout_ssl_server' => 'Vous serez redirigé vers notre serveur de checkout, la connexion est chiffrée SSL.',
'to_checkout' => 'vers la caisse',
'all_price_plus_VAT_info' => 'Tous les prix incluent la TVA légale :link, sauf indication contraire',
'' => '',
];

View file

@ -0,0 +1,101 @@
<?php
return [
'start' => 'Accueil',
'aloe_vera' => 'Aloe Vera',
'productworld' => 'Univers produits',
'career_opportunities' => 'Opportunités de carrière',
'contact' => 'Contact',
'shop' => 'Boutique',
'partner' => 'Partenaire',
'register' => 'Inscription',
'contents' => 'Contenus',
'all_rights_reserved' => 'All Rights Reserved, mivita.care',
'payment_methods' => 'Modes de paiement',
'impress' => 'Mentions légales',
'cancellation_policy' => 'Politique de rétractation',
'privacy_policy' => 'Politique de confidentialité',
'gtc' => 'CGV',
'shipping_costs' => 'Frais de livraison',
'sales_partner_or_questions' => 'Vous souhaitez devenir partenaire commercial ou vous avez des questions sur nos produits ?',
'contact_now' => 'Nous contacter maintenant',
'contact_number' => '+49 (0) 8333 94 61 767',
'contact_number_link' => '+4983339461767',
'to_contact' => 'vers le contact',
'email' => 'E-mail',
'address' => 'Adresse',
'phone' => 'Téléphone',
'contact_address' => 'mivita care gmbh<br>Leinfeld 2<br>87755 Kirchhaslach<br>',
'phone_number' => 'Téléphone : +49 (0) 8333 94 61 767',
'email_address' => 'info@mivita.care',
'business_hours' => 'Heures douverture',
'business_hours_details' => 'Lun. - Ven. : 9h-12h et 13h-16h',
'language' => 'Langue',
'you_are_now_in_shop' => 'Vous êtes dans la boutique :',
'you_are_now_in_shop_notice' => 'Remarque importante : les commandes dans le pays sélectionné ne peuvent être expédiées quà lintérieur de ce pays. Si vous changez de pays, vous serez déconnecté de votre session actuelle et votre panier sera vidé.',
'change_country' => 'Changer de pays',
'start_copy_mivita' => 'MIVITA est une entreprise basée en Allemagne qui distribue des produits innovants, respectueux de lenvironnement et de haute qualité. Depuis son entrée sur le marché, MIVITA sengage pour des valeurs mettant au premier plan la satisfaction des clients ainsi que la responsabilité envers lenvironnement.',
'more' => 'Plus',
'read' => 'lire',
'NOW' => 'MAINTENANT',
'slider_subl' => 'Aloe Vera bio &amp; cosmétique naturelle',
'slider_hl' => 'Compléments alimentaires',
'start_why_hl' => 'Pourquoi MIVITA ?',
'start_why_copy' => '<p>Nos clients font à juste titre confiance aux excellentes propriétés des produits MIVITA. Chacun fait ainsi un choix intelligent pour la santé et lenvironnement.</p>
<p>Nous accordons une grande importance non seulement à la qualité de nos produits, mais aussi à un conseil complet et compétent par des conseillères et conseillers aimables et qualifiés.</p>
<p>Nous développons et distribuons exclusivement des produits de haute qualité. Utilisés et entretenus correctement, ils sont durables et très économiques. Des facteurs qui garantissent la satisfaction de nos clients.</p>',
'start_aloe_hl' => 'Aloe Vera',
'start_aloe_copy' => 'Avec les plus hautes exigences, nous collaborons avec la ferme Aloe Vera à Majorque, qui garantit une qualité de classe mondiale.',
'start_products_hl' => 'Produits',
'start_products_copy' => 'Vous trouverez ici un aperçu de toute la gamme premium de MIVITA. Du jus daloe de haute qualité à la cosmétique bienfaisante.',
'start_salespartner_hl' => 'Partenaire commercial',
'start_salespartner_copy' => 'Devenez vous aussi partenaire commercial de MIVITA et construisez votre propre activité avec des produits de qualité. Si vous le souhaitez, vous pouvez commencer tout de suite ...',
'start_mivitapartner_copy' => '<p>MIVITA est le partenaire exclusif de la ferme Aloe Vera de Mallorca pour la vente directe en Allemagne.
Deux entreprises se sont réunies ici, pour lesquelles qualité et durabilité sont des priorités absolues. Cest ainsi seulement que des clients satisfaits à long terme deviennent de véritables fans de nos produits.</p>
<blockquote>
<p><i>« Pour le bien de lhomme, de lanimal et de la nature ... la durabilité et les produits qui font vraiment du bien sont importants pour nous. »</i></p>
<p>Alois Ried - propriétaire MIVITA</p>
</blockquote>',
'youtube_accepted_copy' => 'En chargeant la vidéo YouTube, vous acceptez notre politique de confidentialité / XII. Intégration de services et contenus de tiers ',
'to_privacy_policy' => 'vers la politique de confidentialité',
'accept_youtube_load' => 'accepter et charger la vidéo YouTube',
'welcome' => 'Bienvenue',
'welcome_copy' => 'Je me réjouis de votre visite dans ma boutique en ligne MIVITA. Je suis votre conseil personnel autour des produits et de leur utilisation.',
'my_accessibility' => 'Mes disponibilités',
'for_you_on_spot' => 'Sur place pour vous',
'for_you_on_spot_copy' => 'Nous étions pour vous sur place à la ferme Aloe Vera à Majorque, car la transparence est importante pour nous. Vous savez ainsi exactement doù viennent vos produits et comment ils sont fabriqués. Une vraie qualité.',
'thank_you_for_your_request' => 'Merci pour votre demande',
'we_will_get_back_to_you' => 'Nous vous répondrons rapidement.',
'best_regards' => 'Cordialement',
'your_mivita_team' => 'Votre équipe mivita.care',
'contact_hl' => 'Écrivez-nous !',
'contact_subl' => 'Notre activité vous intéresse ou vous avez des questions sur les produits ? Nous nous réjouissons de recevoir votre message et vous répondrons dès que possible.',
'your_message_to_us' => 'Votre message',
'your_enquiry_relate_partnership' => 'Votre demande concerne-t-elle un partenariat commercial souhaité ?*',
'yes' => 'OUI',
'no' => 'NON',
'through_whom_label' => 'Par qui avez-vous entendu parler de nous (partenaire commercial, client, réseaux sociaux, etc.) ? Merci dindiquer impérativement un nom - cest important pour notre attribution interne :*',
'through_whom_placeholder' => 'Prénom et nom, site web, profil Facebook, Instagram, YouTube ou similaire',
'send_message' => 'Envoyer le message',
'register_now' => 'sinscrire maintenant',
'business_owner' => 'Gérant',
'registry_court' => 'Tribunal denregistrement',
'register_number' => 'Numéro denregistrement',
'VATID' => 'N° TVA',
'business_owner_value' => 'Alois Ried',
'registry_court_value' => 'Memmingen',
'register_number_value' => 'HRB 21591',
'VATID_value' => 'DE 453867883',
'support_mivita' => 'Support mivita',
'note_on_use' => 'Note dutilisation',
'online_dispute_resolution' => 'Règlement en ligne des litiges',
'note_on_use_copy' => 'Toute utilisation, reproduction, transmission, publication ou exploitation commerciale non autorisée des contenus présents sur ce site sans lautorisation de lauteur est interdite et fera lobjet de poursuites pénales et civiles !',
'online_dispute_resolution_copy' => 'conformément à lart. 14 al. 1 du règlement ODR : la Commission européenne met à disposition une plateforme de règlement en ligne des litiges (RLL), que vous trouverez ici',
'show_all_products' => 'Afficher tous les produits',
'to_login' => 'vers la connexion',
'to_customer_portal' => 'vers lespace client',
'to_sales_center' => 'vers le Salescenter',
'shipping_error_billing' => 'Remarque : le pays de livraison :shipping_country de votre panier ne correspond pas au pays de livraison :billing_country de votre adresse de facturation.',
'shipping_error_delivery' => 'Remarque : le pays de livraison :shipping_country de votre panier ne correspond pas au pays de livraison :billing_country de votre adresse de livraison.',
'' => '',
];

View file

@ -0,0 +1,278 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Schema;
uses(Tests\TestCase::class);
beforeEach(function () {
Schema::dropIfExists('trans_products');
Schema::dropIfExists('products');
Schema::dropIfExists('trans_ingredients');
Schema::dropIfExists('ingredients');
Schema::dropIfExists('dashboard_news');
Schema::dropIfExists('trans_languages');
Schema::create('trans_languages', function (Blueprint $table) {
$table->id();
$table->string('language');
$table->string('name')->nullable();
$table->timestamps();
});
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('copy')->nullable();
$table->text('description')->nullable();
$table->text('usage')->nullable();
$table->text('ingredients')->nullable();
});
Schema::create('trans_products', function (Blueprint $table) {
$table->id();
$table->string('language');
$table->unsignedBigInteger('product_id');
$table->string('key')->nullable();
$table->text('value')->nullable();
$table->timestamps();
});
Schema::create('ingredients', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('inci')->nullable();
$table->text('effect')->nullable();
});
Schema::create('trans_ingredients', function (Blueprint $table) {
$table->id();
$table->string('language');
$table->unsignedBigInteger('ingredient_id');
$table->string('key')->nullable();
$table->text('value')->nullable();
$table->timestamps();
});
Schema::create('dashboard_news', function (Blueprint $table) {
$table->id();
$table->string('title')->nullable();
$table->text('teaser')->nullable();
$table->text('content')->nullable();
$table->json('trans_title')->nullable();
$table->json('trans_teaser')->nullable();
$table->json('trans_content')->nullable();
$table->boolean('active')->default(true);
$table->timestamps();
});
});
it('backfills missing french product translations without overwriting existing values', function () {
DB::table('products')->insert([
'id' => 1,
'name' => 'Aloe Vera Gel',
'copy' => 'Deutsche Kurzbeschreibung',
'description' => 'Deutsche Beschreibung',
'usage' => null,
'ingredients' => 'Aloe Vera',
]);
DB::table('trans_products')->insert([
'language' => 'fr',
'product_id' => 1,
'key' => 'name',
'value' => 'Nom existant',
'created_at' => now(),
'updated_at' => now(),
]);
$this->artisan('translation:backfill-french-db', [
'--driver' => 'copy-source',
'--models' => 'products',
])
->expectsOutput('Processing products...')
->expectsOutput('Status products: 1 Datensätze, 5 Felder.')
->expectsOutput('Datensatz 1/1: products#1')
->expectsOutput(' - products#1.name: vorhandene Übersetzung, übersprungen.')
->expectsOutput(' - products#1.copy: übernehme Quelle...')
->expectsOutput(' - products#1.copy: gespeichert (erstellt).')
->expectsOutput(' - products#1.usage: Quelle leer, übersprungen.')
->assertSuccessful();
expect(DB::table('trans_languages')->where('language', 'fr')->value('name'))->toBe('Französisch')
->and(DB::table('trans_products')->where('language', 'fr')->where('product_id', 1)->where('key', 'name')->value('value'))->toBe('Nom existant')
->and(DB::table('trans_products')->where('language', 'fr')->where('product_id', 1)->where('key', 'copy')->value('value'))->toBe('Deutsche Kurzbeschreibung')
->and(DB::table('trans_products')->where('language', 'fr')->where('product_id', 1)->where('key', 'description')->value('value'))->toBe('Deutsche Beschreibung')
->and(DB::table('trans_products')->where('language', 'fr')->where('product_id', 1)->where('key', 'usage')->exists())->toBeFalse();
});
it('uses openai for translatable fields and copies inci values unchanged', function () {
config()->set('services.openai.api_key', 'test-key');
config()->set('services.openai.model', 'gpt-5.4-mini');
Http::fake(function (Request $request) {
$text = $request['messages'][1]['content'];
return Http::response([
'choices' => [
[
'message' => [
'content' => str_contains($text, 'Pflege')
? 'FR __MIVITA_TRANSLATION_TOKEN_1__ __MIVITA_TRANSLATION_TOKEN_0__ Pflege'
: 'FR Beruhigende Wirkung',
],
],
],
]);
});
DB::table('ingredients')->insert([
'id' => 1,
'name' => 'MIVITA :amount Pflege',
'inci' => 'Aloe Barbadensis Leaf Juice',
'effect' => 'Beruhigende Wirkung',
]);
$this->artisan('translation:backfill-french-db', [
'--driver' => 'openai',
'--models' => 'ingredients',
])->assertSuccessful();
expect(DB::table('trans_ingredients')->where('language', 'fr')->where('ingredient_id', 1)->where('key', 'name')->value('value'))->toBe('FR MIVITA :amount Pflege')
->and(DB::table('trans_ingredients')->where('language', 'fr')->where('ingredient_id', 1)->where('key', 'inci')->value('value'))->toBe('Aloe Barbadensis Leaf Juice')
->and(DB::table('trans_ingredients')->where('language', 'fr')->where('ingredient_id', 1)->where('key', 'effect')->value('value'))->toBe('FR Beruhigende Wirkung');
Http::assertSentCount(2);
Http::assertSent(fn (Request $request): bool => $request->hasHeader('Authorization', 'Bearer test-key')
&& $request->url() === 'https://api.openai.com/v1/chat/completions'
&& $request['model'] === 'gpt-5.4-mini');
});
it('backfills dashboard news json translations', function () {
DB::table('dashboard_news')->insert([
'id' => 1,
'title' => 'Neue Aktion',
'teaser' => 'Kurzer Hinweis für das Dashboard',
'content' => '<p>Ausführlicher Inhalt für Berater.</p>',
'trans_title' => json_encode(['en' => 'Existing English title']),
'trans_teaser' => json_encode(['fr' => 'Teaser existant']),
'trans_content' => null,
'active' => true,
'created_at' => now(),
'updated_at' => now(),
]);
$this->artisan('translation:backfill-french-db', [
'--driver' => 'copy-source',
'--models' => 'dashboard_news',
])
->expectsOutput('Processing dashboard_news...')
->expectsOutput('Status dashboard_news: 1 Datensätze, 3 Felder.')
->expectsOutput('Datensatz 1/1: dashboard_news#1')
->expectsOutput(' - dashboard_news#1.title: übernehme Quelle...')
->expectsOutput(' - dashboard_news#1.title: gespeichert (erstellt).')
->expectsOutput(' - dashboard_news#1.teaser: vorhandene Übersetzung, übersprungen.')
->expectsOutput(' - dashboard_news#1.content: übernehme Quelle...')
->expectsOutput(' - dashboard_news#1.content: gespeichert (erstellt).')
->assertSuccessful();
$news = DB::table('dashboard_news')->where('id', 1)->first();
expect(json_decode($news->trans_title, true))->toMatchArray([
'en' => 'Existing English title',
'fr' => 'Neue Aktion',
])
->and(json_decode($news->trans_teaser, true))->toMatchArray([
'fr' => 'Teaser existant',
])
->and(json_decode($news->trans_content, true))->toMatchArray([
'fr' => '<p>Ausführlicher Inhalt für Berater.</p>',
]);
});
it('updates dashboard news json translations when overwrite is enabled', function () {
DB::table('dashboard_news')->insert([
'id' => 1,
'title' => 'Aktualisierte Aktion',
'teaser' => null,
'content' => null,
'trans_title' => json_encode(['fr' => 'Ancien titre']),
'trans_teaser' => null,
'trans_content' => null,
'active' => true,
'created_at' => now(),
'updated_at' => now(),
]);
$this->artisan('translation:backfill-french-db', [
'--driver' => 'copy-source',
'--models' => 'dashboard_news',
'--overwrite' => true,
])
->expectsOutput(' - dashboard_news#1.title: gespeichert (aktualisiert).')
->assertSuccessful();
$translations = json_decode(DB::table('dashboard_news')->where('id', 1)->value('trans_title'), true);
expect($translations['fr'])->toBe('Aktualisierte Aktion');
});
it('prints sample translations for the api test mode', function () {
config()->set('services.openai.api_key', 'test-key');
config()->set('services.openai.model', 'gpt-5.4-mini');
Http::fakeSequence()
->push(['choices' => [['message' => ['content' => 'Gel dAloe Vera pour les soins quotidiens de la peau.']]]])
->push(['choices' => [['message' => ['content' => 'Le conseiller peut recommander un abonnement adapté à son client.']]]])
->push(['choices' => [['message' => ['content' => 'Description du produit MIVITA avec :amount ml de contenu et paiement PayPal.']]]]);
$this->artisan('translation:backfill-french-db', [
'--test-api' => true,
])
->expectsOutput('OpenAI translation API test')
->expectsOutput('Model: gpt-5.4-mini')
->expectsOutput('Language: de -> fr')
->expectsOutput('[1] DE: Aloe Vera Gel für die tägliche Pflege der Haut.')
->expectsOutput('[1] FR: Gel dAloe Vera pour les soins quotidiens de la peau.')
->expectsOutput('[2] DE: Der Berater kann seinem Kunden ein passendes Abo empfehlen.')
->expectsOutput('[2] FR: Le conseiller peut recommander un abonnement adapté à son client.')
->expectsOutput('[3] DE: MIVITA Produktbeschreibung mit :amount ml Inhalt und PayPal Zahlung.')
->expectsOutput('[3] FR: Description du produit MIVITA avec :amount ml de contenu et paiement PayPal.')
->expectsOutput('API test completed.')
->assertSuccessful();
Http::assertSentCount(3);
});
it('prints a helpful message when openai quota is exceeded', function () {
config()->set('services.openai.api_key', 'test-key');
config()->set('services.openai.model', 'gpt-5.4-mini');
Http::fake([
'*' => Http::response([
'error' => [
'message' => 'You exceeded your current quota, please check your plan and billing details.',
'type' => 'insufficient_quota',
'code' => 'insufficient_quota',
],
], 429),
]);
$this->artisan('translation:backfill-french-db', [
'--test-api' => true,
])
->expectsOutput('OpenAI translation API test')
->expectsOutput('Model: gpt-5.4-mini')
->expectsOutput('Language: de -> fr')
->expectsOutput('OpenAI API request failed with HTTP 429.')
->expectsOutput('Code: insufficient_quota')
->expectsOutput('Type: insufficient_quota')
->expectsOutput('Message: You exceeded your current quota, please check your plan and billing details.')
->expectsOutput('Bitte prüfe im OpenAI Dashboard das Billing, das Projekt-Budget, Usage-Limits und ob der OPENAI_API_KEY zum richtigen Projekt gehört.')
->assertFailed();
Http::assertSentCount(1);
});

View file

@ -0,0 +1,48 @@
<?php
use App\Services\LocaleGuard;
uses(Tests\TestCase::class);
it('supports french as an application locale', function () {
expect(config('localization.supportedLocales'))
->toHaveKey('fr')
->and(LocaleGuard::normalize('FR'))
->toBe('fr');
});
it('keeps french translation files in sync with the german source keys', function () {
foreach (glob(resource_path('lang/de/*.php')) as $germanFile) {
$fileName = basename($germanFile);
$frenchFile = resource_path('lang/fr/'.$fileName);
expect($frenchFile)->toBeFile();
expect(frenchLocalizationFlattenTranslationKeys(require $frenchFile))
->toEqualCanonicalizing(frenchLocalizationFlattenTranslationKeys(require $germanFile));
}
});
/**
* @return array<int, string>
*/
function frenchLocalizationFlattenTranslationKeys(array $translations, string $prefix = ''): array
{
$keys = [];
foreach ($translations as $key => $value) {
$translationKey = $prefix.(string) $key;
if (is_array($value)) {
$keys = [
...$keys,
...frenchLocalizationFlattenTranslationKeys($value, $translationKey.'.'),
];
continue;
}
$keys[] = $translationKey;
}
return $keys;
}

View file

@ -8,6 +8,7 @@ uses(TestCase::class);
it('normalizes supported locales', function () { it('normalizes supported locales', function () {
expect(LocaleGuard::normalize('DE'))->toBe('de'); expect(LocaleGuard::normalize('DE'))->toBe('de');
expect(LocaleGuard::normalize('en'))->toBe('en'); expect(LocaleGuard::normalize('en'))->toBe('en');
expect(LocaleGuard::normalize('FR'))->toBe('fr');
}); });
it('returns null for unsupported or invalid locale strings', function () { it('returns null for unsupported or invalid locale strings', function () {