[{"data":1,"prerenderedAt":87},["ShallowReactive",2],{"YBwVQjNS6N":3,"fAodXV4WwR":19},{"data":4},[5,12],{"id":6,"title":7,"slug":8,"slugs":9,"thumbnail":10,"thumbnail_small":11},3,"Laravel","laravel",{"en":8,"fr":8},"https://app.tomjamon.com/storage/12/conversions/01JER9785TAJYWQRE60EHP67C4-cover.webp","https://app.tomjamon.com/storage/12/conversions/01JER9785TAJYWQRE60EHP67C4-card.webp",{"id":13,"title":14,"slug":15,"slugs":16,"thumbnail":17,"thumbnail_small":18},6,"Nuxt JS","nuxt-js",{"en":15,"fr":15},"https://app.tomjamon.com/storage/10/conversions/01JER91M3YJXF7EHZR75J054MT-cover.webp","https://app.tomjamon.com/storage/10/conversions/01JER91M3YJXF7EHZR75J054MT-card.webp",{"data":20,"links":72,"meta":75},[21,35,52],{"id":6,"title":22,"slug":23,"slugs":24,"summary":26,"content":27,"categories":28,"thumbnail":31,"thumbnail_small":32,"created_at":33,"updated_at":34},"Laravel 11 : envoyer ses emails avec Brevo API sans SMTP","envoyer-emails-laravel-11-brevo-api-sans-smtp",{"en":25,"fr":23},"laravel-11-send-emails-with-brevo-api-without-smtp","Découvrez comment intégrer Brevo à Laravel 11 via son API transactionnelle pour envoyer vos emails sans configuration SMTP tout en conservant les Mailables et Notifications Laravel.","Lorsque l'on utilise Laravel, la méthode la plus courante pour envoyer des emails via Brevo consiste à configurer un serveur SMTP. Cependant, Brevo propose également une API transactionnelle qui offre plusieurs avantages :\n\n- Pas de gestion SMTP\n- Meilleure fiabilité\n- Temps d'envoi réduits\n- Gestion native des templates Brevo\n- Suivi des événements (ouvertures, clics, bounces, etc.)\n\nDans cet article, nous allons voir comment intégrer Brevo comme transport d'emails dans Laravel 11 en utilisant l'API officielle.\n\n## Installation des dépendances\n\nCommencez par installer le transport Brevo pour Symfony Mailer ainsi que le client HTTP requis :\n\n```bash\ncomposer require symfony/brevo-mailer\ncomposer require symfony/http-client\n```\n\n## Création de la clé API Brevo\n\nDepuis votre interface Brevo :\n\n1. Rendez-vous dans **SMTP & API**\n2. Ouvrez l'onglet **API Keys**\n3. Créez une nouvelle clé API transactionnelle\n\nVous obtiendrez une clé ressemblant à :\n\n```text\nxkeysib-xxxxxxxxxxxxxxxxxxxxxxxx\n```\n\n## Configuration Laravel\n\nAjoutez votre clé API dans le fichier `.env` :\n\n```env\nMAIL_MAILER=brevo\n\nBREVO_API_KEY=xkeysib-xxxxxxxxxxxxxxxxxxxxxxxx\n\nMAIL_FROM_ADDRESS=noreply@votredomaine.fr\nMAIL_FROM_NAME=\"${APP_NAME}\"\n```\n\nPuis dans `config/services.php` :\n\n```php\nreturn [\n\n    // ...\n\n    'brevo' => [\n        'key' => env('BREVO_API_KEY'),\n    ],\n\n];\n```\n\n## Déclaration du transport Brevo\n\nAjoutez un nouveau mailer dans `config/mail.php` :\n\n```php\n'brevo' => [\n    'transport' => 'brevo',\n],\n```\n\nLaravel ne connaît pas nativement le transport Brevo. Il faut donc l'enregistrer dans un Service Provider.\n\nDans `AppServiceProvider.php` :\n\n```php\nuse Illuminate\\Support\\Facades\\Mail;\nuse Symfony\\Component\\Mailer\\Bridge\\Brevo\\Transport\\BrevoTransportFactory;\nuse Symfony\\Component\\Mailer\\Transport\\Dsn;\n\npublic function boot(): void\n{\n    Mail::extend('brevo', function () {\n        return (new BrevoTransportFactory())->create(\n            new Dsn(\n                'brevo+api',\n                'default',\n                config('services.brevo.key')\n            )\n        );\n    });\n}\n```\n\n## Nettoyage du cache Laravel\n\nAprès modification de la configuration :\n\n```bash\nphp artisan optimize:clear\n```\n\n## Test d'envoi\n\nVous pouvez maintenant envoyer un email normalement :\n\n```php\nuse Illuminate\\Support\\Facades\\Mail;\n\nMail::raw('Test Brevo API', function ($message) {\n    $message->to('contact@example.com')\n        ->subject('Test Brevo');\n});\n```\n\nOu via une Mailable :\n\n```php\nMail::to($user)->send(new WelcomeMail());\n```\n\nAucune modification supplémentaire n'est nécessaire dans votre code métier.\n\n## Erreurs courantes\n\n### Unsupported mail transport [brevo]\n\nLe transport n'a pas été enregistré dans le `AppServiceProvider` ou le package `symfony/brevo-mailer` n'est pas installé.\n\n### User is not set\n\nLe constructeur `Dsn` est mal configuré. La clé API doit être passée comme troisième argument.\n\n### You cannot use AbstractHttpTransport as the HttpClient component is not installed\n\nLe package suivant est manquant :\n\n```bash\ncomposer require symfony/http-client\n```\n\n## Conclusion\n\nL'utilisation de Brevo via API permet de conserver toute la puissance du système de mails Laravel tout en bénéficiant des performances et fonctionnalités de l'API transactionnelle Brevo.\n\nUne fois la configuration terminée, vos Mailables, notifications et files d'attente continuent de fonctionner exactement comme avec SMTP, sans modification du code applicatif.",[29],{"id":6,"title":7,"slug":8,"slugs":30,"thumbnail":10,"thumbnail_small":11},{"en":8,"fr":8},"https://app.tomjamon.com/storage/15/conversions/01KT6BXVWDYSYYM25N3QKAPH7C-cover.webp","https://app.tomjamon.com/storage/15/conversions/01KT6BXVWDYSYYM25N3QKAPH7C-card.webp","2026-06-03T09:02:47.000000Z","2026-06-03T09:27:15.000000Z",{"id":36,"title":37,"slug":38,"slugs":39,"summary":41,"content":42,"categories":43,"thumbnail":48,"thumbnail_small":49,"created_at":50,"updated_at":51},2,"Mise en place de l'internationalisation (i18n) dans un projet Nuxt 3","mise-en-place-de-internationalisation-i18n-dans-un-projet-nuxt-3",{"en":40,"fr":38},"internationalization-i18n-with-nuxt-3-a-step-by-step-guide","Apprenez à intégrer facilement l’internationalisation (i18n) dans votre projet Nuxt 3 grâce au module @nuxtjs/i18n. Ce guide détaille les étapes pour configurer plusieurs langues, gérer des routes personnalisées et optimiser l’expérience utilisateur multilingue.","L'internationalisation (i18n) est essentielle pour les applications web visant une audience multilingue. Nuxt 3, avec ses fonctionnalités avancées, rend l'intégration d'i18n simple et efficace. Cet article vous guide à travers la mise en place d'i18n dans un projet Nuxt 3, en utilisant des configurations spécifiques et des fichiers de routes et de langues.\n\n## Prérequis\n\nVous pouvez installer Nuxt 3 et le module i18n en utilisant npm :\n\n```bash\nnpm install nuxt@latest @nuxtjs/i18n\n```\n\n## Configuration de base\n\nNous allons configurer notre projet Nuxt 3 pour supporter plusieurs langues en modifiant le fichier `nuxt.config.ts`. Voici comment configurer le module i18n :\n\n### Étape 1 : Importer les routes\n\nCréez un fichier `routes.json` à la racine de votre projet. Ce fichier contiendra les définitions de vos routes spécifiques à chaque langue. Voici un exemple de fichier `routes.json` :\n\n```json\n{\n    \"about\": {\n        \"en\": \"/about\",\n        \"fr\": \"/a-propos\",\n        \"es\": \"/acerca-de\"\n    },\n    \"contact\": {\n        \"en\": \"/contact\",\n        \"fr\": \"/contact\",\n        \"es\": \"/contacto\"\n    }\n}\n```\n\n### Étape 2 : Modifier `nuxt.config.ts`\n\nModifiez votre fichier `nuxt.config.ts` pour inclure la configuration i18n. Voici un exemple de configuration :\n\n```tsx\nimport routes from './routes.json'\n\nexport default defineNuxtConfig({\n  modules: [\n    '@nuxtjs/i18n',\n  ],\n  i18n: {\n    locales: [\n      { code: 'en', label: 'English', iso: 'en-US', file: 'en.json' },\n      { code: 'fr', label: 'Français', iso: 'fr-FR', file: 'fr.json' },\n      { code: 'es', label: 'Español', iso: 'es-ES', file: 'es.json' },\n    ],\n    defaultLocale: 'fr',\n    strategy: 'prefix_except_default',\n    detectBrowserLanguage: {\n      useCookie: true,\n      cookieKey: 'i18n_redirected_' + process.env.NODE_ENV,\n      alwaysRedirect: true,\n      fallbackLocale: 'fr',\n    },\n    langDir: 'lang/',\n    lazy: true,\n    pages: routes,\n    customRoutes: 'config',\n  }\n})\n```\n\n### Explications des configurations\n\n- `locales` : Définit les langues supportées par votre application.\n- `defaultLocale` : Définit la langue par défaut.\n- `strategy` : Utilise `prefix_except_default` pour préfixer les routes avec les codes de langue, sauf pour la langue par défaut.\n- `detectBrowserLanguage` : Configue la détection de la langue du navigateur et l'utilisation des cookies pour stocker les préférences de langue.\n- `langDir` : Spécifie le répertoire où sont stockés les fichiers de langue.\n- `lazy` : Active le chargement paresseux des fichiers de langue.\n- `pages` : Utilise les routes définies dans `routes.json`.\n- `customRoutes` : Permet de configurer des routes personnalisées.\n\n## Création des fichiers de langue\n\nPour chaque langue, créez un fichier JSON dans le répertoire `lang/`. Par exemple, pour le français, créez `lang/fr.json` :\n\n```json\n{\n  \"welcome\": \"Bienvenue\",\n  \"about\": \"À propos de nous\",\n  \"contact\": \"Contactez-nous\"\n}\n\n```\n\nFaites de même pour `en.json` et `es.json` en traduisant les clés dans les langues respectives.\n\n## Utilisation des traductions dans les composants\n\nPour utiliser les traductions dans vos composants, utilisez le composant `\u003Cnuxt-link>` et la méthode `$t`. Par exemple :\n\n```html\n\u003Ctemplate>\n  \u003Cdiv>\n    \u003Ch1>{{ $t('welcome') }}\u003C/h1>\n    \u003CNuxtLinkLocale to=\"about\">{{ $t('about') }}r\u003C/NuxtLinkLocale>\n  \u003C/div>\n\u003C/template>\n```\n\n## Détection de la langue du navigateur\n\nLa configuration `detectBrowserLanguage` permet de détecter automatiquement la langue du navigateur de l'utilisateur et de rediriger vers la version appropriée de votre site. Cette configuration utilise des cookies pour stocker la langue préférée de l'utilisateur, assurant ainsi une expérience utilisateur cohérente.\n\n## Gestion des routes personnalisées\n\nGrâce à la configuration `customRoutes`, vous pouvez définir des routes spécifiques pour chaque langue dans votre fichier `routes.json`. Cela permet une gestion plus flexible et granulaire des chemins de votre application.\n\n## Conclusion\n\nL'internationalisation est une étape essentielle pour rendre votre application accessible à une audience mondiale. Avec Nuxt 3 et le module `@nuxtjs/i18n`, la mise en place d'i18n devient simple et efficace. En suivant les étapes décrites dans cet article, vous pouvez configurer votre projet pour supporter plusieurs langues et offrir une expérience utilisateur fluide et locale.\n\nLa flexibilité de Nuxt 3 combinée aux puissantes fonctionnalités d'i18n vous permet de gérer facilement les traductions, les détections de langue et les redirections. Maintenant, vous êtes prêt à rendre votre application Nuxt 3 multilingue et à atteindre un public plus large.\n\nN'hésitez pas à consulter la documentation officielle de Nuxt i18n pour plus de détails et de configurations avancées. Bon codage !",[44,46],{"id":13,"title":14,"slug":15,"slugs":45,"thumbnail":17,"thumbnail_small":18},{"en":15,"fr":15},{"id":6,"title":7,"slug":8,"slugs":47,"thumbnail":10,"thumbnail_small":11},{"en":8,"fr":8},"https://app.tomjamon.com/storage/6/conversions/01JENYFEHS5X3VQQ75A54QCS25-cover.webp","https://app.tomjamon.com/storage/6/conversions/01JENYFEHS5X3VQQ75A54QCS25-card.webp","2024-12-09T14:51:50.000000Z","2024-12-11T15:27:38.000000Z",{"id":53,"title":54,"slug":55,"slugs":56,"summary":58,"content":59,"categories":60,"thumbnail":68,"thumbnail_small":69,"created_at":70,"updated_at":71},1,"Mon installation solaire : 8 panneaux et 3000W sur un toit plat","mon-installation-solaire-8-panneaux-et-3000w-sur-un-toit-plat",{"en":57,"fr":55},"my-solar-installation-8-panels-and-3000w-on-a-flat-roof","Découvrez mon expérience d’installation de panneaux solaires sur un toit plat, incluant le choix d’un kit Plug&Play, des supports adaptés et des optimisations électriques. Un guide pratique pour débuter avec une installation efficace et économique à moins de 800 €.","Hello,\n\nJ’ai récemment installé des panneaux solaires sur mon toit plat, et je voulais partager mon expérience pour ceux qui hésitent à franchir le pas. Si certains d’entre vous ont des conseils d’optimisation pour l’installation, je suis preneur !\n\n**Kit solaire**\n\nJ’ai acheté le kit “Kit solaire 1520W Plug&Play - 4 panneaux solaires Honor 380W + 2 micro onduleurs Hoymiles HMS800W 2T” trouvé sur Dealabs : https://www.dealabs.com/bons-plans/kits-solaires-1520w-plugplay-2832592.\n\nL’achat d’un kit complet semblait plus intéressant pour un premier achat. Cela me permettait d’avoir un seul point de contact en cas de problème (défaut à la livraison, etc.), d’être certain que les micro-onduleurs soient bien compatibles avec les panneaux, et en plus, le prix était avantageux.\n\nMon toit fait 7x4m, donc j’ai estimé que je pouvais mettre entre 8 et 10 panneaux. J’ai dans un premier temps pris un seul kit.\n\n**Choix des composants - Dalles**\n\nJe voulais un angle faible pour que visuellement, depuis la rue, l’installation soit discrète (voire invisible si possible). Malheureusement, la hauteur de mon acrotère est de moins de 20 cm côté rue, et avec seulement 4 mètres de largeur, l’installation reste un peu visible, peu importe la disposition.\n\nLe prix des bacs était assez élevé et semblait concentrer un poids important sur un seul point. J’avais des doutes quant à la capacité de mon toit, qui n’a pas été spécifiquement conçu pour des panneaux solaires (bien que les poutres soient plus rapprochées que la normale, car j’avais anticipé peut-être un jour l’installation de panneaux).\n\nLes rails semblaient être un bon choix en termes de solidité, mais je ne voulais pas percer mon toit afin de préserver l’étanchéité.\n\nJ’ai donc opté pour une solution répartissant le poids en 4 points, en utilisant un support divisé en 4 parties avec 4 dalles, en veillant à respecter les poids recommandés.\n\nPour un panneau, il faut au moins 50-60 kilos de lest. Ces simples dalles de Leroy Merlin, à 2,5 € pièce pour 13,2 kg, étaient parfaites pour cela : https://www.leroymerlin.fr/produits/terrasse-jardin/terrasse-et-sol-exterieur/dalle-de-terrasse/dalle-de-terrasse-beton/dalle-beton-spring-au-m2-gris-l-40-x-l-40-cm-x-ep-32-a-35-mm-65965592.html\n\nJ’en ai pris 4 par panneau, pour mon kit de 4 panneaux, soit un total de ~41 €, ce qui m’a permis d’avoir environ 53 kg de lest par panneau.\n\n**Choix des composants - Support**\n\nJe voulais un angle faible et des supports pouvant se fixer simplement sur les dalles. J’ai donc choisi ce modèle : https://amzn.to/3BFgLMD, à 57 € pour 2 panneaux, soit 114 € pour mon kit.\n\nJe les ai fixés au centre de chaque dalle.\n\nPour éviter d’endommager la toiture, j’ai ajouté des mousses épaisses sous les supports. J’ai pris ces plaques en caoutchouc : https://www.leroymerlin.fr/produits/revetement-sol-et-mur/sous-couche-sol/plaque-de-sol-caoutchouc-sol-anti-vibrations-noma-rub-l-0-6-m-x-l-0-6-m-x-ep-10-66129294.html. Je les ai découpées en 4 pour qu’elles couvrent environ 70 % de la surface de chaque dalle.\n\nCes plaques servent d’interface entre les dalles et le toit (*pas de contact dalle-toit ni visserie-toit*), assurant une protection contre l’usure avec le temps.\n\n**Installation des panneaux**\n\nUne fois les supports et dalles en place, j’ai procédé à l’installation des panneaux. J’ai positionné les dalles, puis placé les panneaux par paires, avec le micro-onduleur en dessous.\n\nL’opération est simple, mais il est plus facile d’être à deux pour tenir les panneaux pendant que l’autre les fixe. C’est également plus pratique pour déplacer les panneaux si nécessaire. Mon système à 4 points d’appui est plus facile à manipuler que les bacs lourds (~60 kg), mais il vaut mieux bien choisir l’emplacement dès le début.\n\n**Raccordement électrique**\n\nJ’ai fait le choix de ne pas brancher directement à une prise. J’ai raccordé l’installation à mon coffret électrique existant, sur un disjoncteur 16A déjà présent. Si besoin, un disjoncteur coûte environ 12 €.\n\nJ’avais déjà de la gaine électrique, mais vous pouvez en acheter pour environ 30 €, selon la distance de votre installation, afin de protéger le câble électrique sur le toit.\n\n**Application mobile**\n\nJ’utilise l’application S-Miles Home pour suivre la production d’énergie en temps réel. Voici un aperçu de l’interface :\n\nCoût total\n\nKit 570€ + 40 € dalles + 52 € plaques + 114 € support = 776 €\n\nJ’avais déjà de la visserie, et les disjoncteurs. Il faut ramener le total à 800 € si je n’avais pas ça.\n\nJ’avais déjà de la visserie et un disjoncteur, donc le coût pourrait atteindre 800 € pour ceux qui n’en disposent pas.\n\n**Optimisations de l’installation**\n\nDeux semaines plus tard, j’ai décidé de doubler l’installation. J’ai repris les mêmes composants : kit, dalles, supports, et plaques de sol en caoutchouc.\n\nJ’ai également séparé l’installation électrique de mon annexe et celle des panneaux. J’ai acheté un coffret électrique étanche : Coffret Amazon https://amzn.to/3NqCYjS  (19 €), dans lequel j’ai installé un interrupteur différentiel https://amzn.to/401Hzk4 (47 €) et un parafoudre https://amzn.to/3YldRFx  (70 €). J’ai aussi ajouté les deux disjoncteurs 16A.\n\nLe parafoudre est une précaution supplémentaire, et j’ai également mis à la terre les panneaux avec du fil de 6mm², en utilisant ces clips de mise à terre : https://amzn.to/4dJbwsu \n\npour 22 €.\n\nJ’ai relié tout cela à un tableau secondaire, qui va ensuite au tableau principal de la maison.\n\n**Coût total des optimisations** : 147 € (hors câblage).\n\nEn résumé, l’installation de ces panneaux solaires a été un vrai succès, et je commence déjà à voir les premiers bénéfices sur ma facture. Si vous avez des questions ou des suggestions pour optimiser davantage, n’hésitez pas à me contacter !\n\n![](https://app.tomjamon.com/storage/attachments/dWEbhlueZvYxIdvJBRsElqxKXCiyZv9kHd7cNFnc.jpg)![](https://app.tomjamon.com/storage/attachments/25H5KE8goTY1bXi5ymK1cYCKVh0Is09zHobEj8Qd.jpg)![](https://app.tomjamon.com/storage/attachments/pFrNz8Pybzn4nouuJrSeWZ6plKd8YJ5bK6dxT7k6.jpg)",[61],{"id":62,"title":63,"slug":64,"slugs":65,"thumbnail":66,"thumbnail_small":67},5,"DIY","do-it-yourself",{"en":64,"fr":64},"https://app.tomjamon.com/storage/11/conversions/01JER93D4J9XXKT9V55N9H7GJN-cover.webp","https://app.tomjamon.com/storage/11/conversions/01JER93D4J9XXKT9V55N9H7GJN-card.webp","https://app.tomjamon.com/storage/5/conversions/01JENY6EQA3P5JWXQQ1EMPEX56-cover.webp","https://app.tomjamon.com/storage/5/conversions/01JENY6EQA3P5JWXQQ1EMPEX56-card.webp","2024-12-09T14:39:46.000000Z","2024-12-09T14:46:43.000000Z",{"first":73,"last":73,"prev":74,"next":74},"https://app.tomjamon.com/api/posts?page=1",null,{"current_page":53,"from":53,"last_page":53,"links":76,"path":85,"per_page":86,"to":6,"total":6},[77,80,83],{"url":74,"label":78,"page":74,"active":79},"&laquo; Previous",false,{"url":73,"label":81,"page":53,"active":82},"1",true,{"url":74,"label":84,"page":74,"active":79},"Next &raquo;","https://app.tomjamon.com/api/posts",7,1792846765335]