diff --git a/html-generators/locales.properties b/html-generators/locales.properties index 8fda697..6d861cc 100644 --- a/html-generators/locales.properties +++ b/html-generators/locales.properties @@ -3,4 +3,5 @@ en=English de=Deutsch es=Español pt-BR=Português (Brasil) +fr=Français ja=日本語 diff --git a/translations/content/fr/collections/collectors-teeing.yaml b/translations/content/fr/collections/collectors-teeing.yaml new file mode 100644 index 0000000..1397d05 --- /dev/null +++ b/translations/content/fr/collections/collectors-teeing.yaml @@ -0,0 +1,18 @@ +--- +title: "Collectors.teeing()" +oldApproach: "Deux passages" +modernApproach: "teeing()" +summary: "Calcule deux agrégations en un seul passage du stream." +explanation: "Collectors.teeing() envoie chaque élément à deux collectors aval et combine les résultats. Cela évite de parcourir les données deux fois ou d'utiliser un accumulateur mutable." +whyModernWins: +- icon: "⚡" + title: "Un seul passage" + desc: "Traite le stream une seule fois au lieu de deux." +- icon: "🧩" + title: "Composable" + desc: "Combine deux collectors quelconques avec une fonction de fusion." +- icon: "🔒" + title: "Résultat immutable" + desc: "Fusionne directement dans un record ou un objet valeur." +support: + description: "Disponible depuis JDK 12 (mars 2019)" diff --git a/translations/content/fr/collections/copying-collections-immutably.yaml b/translations/content/fr/collections/copying-collections-immutably.yaml new file mode 100644 index 0000000..4e9cf74 --- /dev/null +++ b/translations/content/fr/collections/copying-collections-immutably.yaml @@ -0,0 +1,18 @@ +--- +title: "Copie immutable de collections" +oldApproach: "Copie manuelle + wrapper" +modernApproach: "List.copyOf()" +summary: "Crée une copie immutable de n'importe quelle collection en un seul appel." +explanation: "List.copyOf(), Set.copyOf() et Map.copyOf() créent des instantanés immutables de collections existantes. Si la source est déjà une collection immutable, aucune copie n'est effectuée." +whyModernWins: +- icon: "⚡" + title: "Copie intelligente" + desc: "Ignore la copie si la source est déjà immutable." +- icon: "📏" + title: "Un seul appel" + desc: "Sans construction manuelle d'ArrayList + wrapper." +- icon: "🛡️" + title: "Copie défensive" + desc: "Les modifications de l'original n'affectent pas la copie." +support: + description: "Disponible depuis JDK 10 (mars 2018)" diff --git a/translations/content/fr/collections/immutable-list-creation.yaml b/translations/content/fr/collections/immutable-list-creation.yaml new file mode 100644 index 0000000..aee132f --- /dev/null +++ b/translations/content/fr/collections/immutable-list-creation.yaml @@ -0,0 +1,18 @@ +--- +title: "Création de listes immutables" +oldApproach: "Wrapper verbeux" +modernApproach: "List.of()" +summary: "Crée des listes immutables en une seule expression claire." +explanation: "List.of() crée une liste véritablement immutable — sans wrapper, sans copie défensive. Elle rejette les éléments null et est structurellement immutable. L'ancienne méthode nécessitait trois appels imbriqués." +whyModernWins: +- icon: "📏" + title: "Un seul appel" + desc: "Remplace trois appels imbriqués par une unique méthode factory." +- icon: "🔒" + title: "Véritablement immutable" + desc: "Ce n'est pas juste un wrapper — la liste elle-même est immutable." +- icon: "🛡️" + title: "Sûre contre null" + desc: "Rejette les éléments null à la création, échouant rapidement." +support: + description: "Disponible depuis JDK 9 (sept. 2017)" diff --git a/translations/content/fr/collections/immutable-map-creation.yaml b/translations/content/fr/collections/immutable-map-creation.yaml new file mode 100644 index 0000000..c473957 --- /dev/null +++ b/translations/content/fr/collections/immutable-map-creation.yaml @@ -0,0 +1,18 @@ +--- +title: "Création de maps immutables" +oldApproach: "Pattern builder de Map" +modernApproach: "Map.of()" +summary: "Crée des maps immutables en ligne sans avoir besoin d'un builder." +explanation: "Map.of() accepte des paires clé-valeur en ligne et retourne une map immutable. Pour plus de 10 entrées, utilisez Map.ofEntries() avec des paires Map.entry()." +whyModernWins: +- icon: "📏" + title: "Création en ligne" + desc: "Aucune map mutable temporaire nécessaire." +- icon: "🔒" + title: "Résultat immutable" + desc: "La map ne peut pas être modifiée après sa création." +- icon: "🚫" + title: "Sans clés/valeurs null" + desc: "Les entrées null sont rejetées immédiatement." +support: + description: "Disponible depuis JDK 9 (sept. 2017)" diff --git a/translations/content/fr/collections/immutable-set-creation.yaml b/translations/content/fr/collections/immutable-set-creation.yaml new file mode 100644 index 0000000..6c537fe --- /dev/null +++ b/translations/content/fr/collections/immutable-set-creation.yaml @@ -0,0 +1,18 @@ +--- +title: "Création de sets immutables" +oldApproach: "Wrapper verbeux" +modernApproach: "Set.of()" +summary: "Crée des sets immutables avec un unique appel factory." +explanation: "Set.of() crée un set véritablement immutable qui rejette les éléments null et les doublons à la création. Fini de wrapper des sets mutables." +whyModernWins: +- icon: "📏" + title: "Concis" + desc: "Une ligne au lieu de trois appels imbriqués." +- icon: "🚫" + title: "Détecte les doublons" + desc: "Lève une exception si vous passez des éléments dupliqués par accident." +- icon: "🔒" + title: "Immutable" + desc: "Impossible d'ajouter ou de supprimer après la création." +support: + description: "Disponible depuis JDK 9 (sept. 2017)" diff --git a/translations/content/fr/collections/map-entry-factory.yaml b/translations/content/fr/collections/map-entry-factory.yaml new file mode 100644 index 0000000..a4f4725 --- /dev/null +++ b/translations/content/fr/collections/map-entry-factory.yaml @@ -0,0 +1,18 @@ +--- +title: "Factory Map.entry()" +oldApproach: "SimpleEntry" +modernApproach: "Map.entry()" +summary: "Crée des entrées de map avec une méthode factory propre." +explanation: "Map.entry() remplace le constructeur verbeux de AbstractMap.SimpleEntry. Elle retourne une entrée immutable, idéale pour Map.ofEntries() et les opérations de stream." +whyModernWins: +- icon: "📏" + title: "Concis" + desc: "Une ligne au lieu de trois, avec une intention plus claire." +- icon: "🔒" + title: "Immutable" + desc: "L'entrée retournée ne peut pas être modifiée." +- icon: "🧩" + title: "Composable" + desc: "Fonctionne parfaitement avec Map.ofEntries() pour les grandes maps." +support: + description: "Disponible depuis JDK 9 (sept. 2017)" diff --git a/translations/content/fr/collections/reverse-list-iteration.yaml b/translations/content/fr/collections/reverse-list-iteration.yaml new file mode 100644 index 0000000..c6062e0 --- /dev/null +++ b/translations/content/fr/collections/reverse-list-iteration.yaml @@ -0,0 +1,18 @@ +--- +title: "Itération inverse de listes" +oldApproach: "ListIterator manuel" +modernApproach: "reversed()" +summary: "Itère sur une liste dans l'ordre inverse avec une boucle for-each propre." +explanation: "La méthode reversed() de SequencedCollection retourne une vue dans l'ordre inverse de la liste. Cette vue est soutenue par la liste originale, donc aucune copie n'est effectuée. La syntaxe de la boucle for améliorée rend l'itération inverse aussi lisible que l'itération vers l'avant." +whyModernWins: +- icon: "📖" + title: "Syntaxe naturelle" + desc: "Boucle for améliorée au lieu du verbose ListIterator." +- icon: "⚡" + title: "Sans copie" + desc: "reversed() retourne une vue — sans surcharge de performance." +- icon: "🧩" + title: "API cohérente" + desc: "Fonctionne uniformément sur List, Deque et SortedSet." +support: + description: "Disponible depuis JDK 21 LTS (sept. 2023)" diff --git a/translations/content/fr/collections/sequenced-collections.yaml b/translations/content/fr/collections/sequenced-collections.yaml new file mode 100644 index 0000000..e5d68b2 --- /dev/null +++ b/translations/content/fr/collections/sequenced-collections.yaml @@ -0,0 +1,18 @@ +--- +title: "Collections séquencées" +oldApproach: "Arithmétique d'indices" +modernApproach: "getFirst/getLast" +summary: "Accédez au premier et dernier élément et obtenez des vues inversées avec des méthodes d'API propres." +explanation: "SequencedCollection ajoute getFirst(), getLast(), reversed(), addFirst() et addLast() à List, Deque, SortedSet et LinkedHashSet. Fini l'arithmétique size-1 ou l'itération inverse manuelle." +whyModernWins: +- icon: "📖" + title: "Auto-documenté" + desc: "getLast() est plus clair que get(size()-1)." +- icon: "🔄" + title: "Vue inverse" + desc: "reversed() offre une vue — sans besoin de copier." +- icon: "🧩" + title: "API uniforme" + desc: "Fonctionne pareillement sur List, Deque et SortedSet." +support: + description: "Disponible depuis JDK 21 LTS (sept. 2023)" diff --git a/translations/content/fr/collections/stream-toarray-typed.yaml b/translations/content/fr/collections/stream-toarray-typed.yaml new file mode 100644 index 0000000..4340844 --- /dev/null +++ b/translations/content/fr/collections/stream-toarray-typed.yaml @@ -0,0 +1,18 @@ +--- +title: "toArray typé dans les streams" +oldApproach: "Copie manuelle de tableau" +modernApproach: "toArray(generator)" +summary: "Convertit des streams en tableaux typés avec une référence de méthode." +explanation: "La méthode toArray(IntFunction) crée un tableau correctement typé à partir d'un stream. Le générateur (String[]::new) indique au stream quel type de tableau créer." +whyModernWins: +- icon: "🎯" + title: "Sûr en termes de types" + desc: "Sans cast vers Object[] — le type du tableau est correct." +- icon: "🔗" + title: "Enchaînable" + desc: "Fonctionne à la fin de n'importe quel pipeline de stream." +- icon: "📏" + title: "Concis" + desc: "Une seule expression remplace la boucle manuelle." +support: + description: "Disponible depuis JDK 8 (mars 2014)" diff --git a/translations/content/fr/collections/unmodifiable-collectors.yaml b/translations/content/fr/collections/unmodifiable-collectors.yaml new file mode 100644 index 0000000..c782a68 --- /dev/null +++ b/translations/content/fr/collections/unmodifiable-collectors.yaml @@ -0,0 +1,18 @@ +--- +title: "Collectors non modifiables" +oldApproach: "collectingAndThen" +modernApproach: "stream.toList()" +summary: "Collecte directement dans une liste non modifiable avec stream.toList()." +explanation: "Java 10 a ajouté toUnmodifiableList(), toUnmodifiableSet() et toUnmodifiableMap() pour remplacer le wrapper verbose collectingAndThen. Pour les listes spécifiquement, stream.toList() de Java 16 offre une alternative encore plus simple — sans appel à collect() du tout. Utilisez toUnmodifiableSet() et toUnmodifiableMap() pour les autres types de collections." +whyModernWins: +- icon: "📏" + title: "Le plus court possible" + desc: "stream.toList() ne nécessite pas collect() ni l'import de Collectors." +- icon: "🔒" + title: "Immutable" + desc: "Le résultat ne peut pas être modifié — sans mutations accidentelles." +- icon: "📖" + title: "Lisible" + desc: "Se lit naturellement comme étape terminale de n'importe quel pipeline de stream." +support: + description: "Disponible depuis JDK 16 (mars 2021)" diff --git a/translations/content/fr/concurrency/completablefuture-chaining.yaml b/translations/content/fr/concurrency/completablefuture-chaining.yaml new file mode 100644 index 0000000..1e2224c --- /dev/null +++ b/translations/content/fr/concurrency/completablefuture-chaining.yaml @@ -0,0 +1,18 @@ +--- +title: Chaînage avec CompletableFuture +oldApproach: Future.get() bloquant +modernApproach: CompletableFuture +summary: Enchaîne des opérations asynchrones sans blocage avec CompletableFuture. +explanation: CompletableFuture permet des pipelines asynchrones non bloquants. Enchaînez les opérations avec thenApply, thenCompose, thenAccept. Gérez les erreurs avec exceptionally(). Combinez plusieurs futurs avec allOf/anyOf. +whyModernWins: +- icon: 🔗 + title: Enchaînable + desc: Composez des étapes asynchrones dans un pipeline lisible. +- icon: 🚫 + title: Sans blocage + desc: Aucun thread ne reste inactif en attendant les résultats. +- icon: 🛡️ + title: Gestion des erreurs + desc: exceptionally() et handle() pour une récupération propre des erreurs. +support: + description: Disponible depuis JDK 8 (mars 2014) diff --git a/translations/content/fr/concurrency/concurrent-http-virtual.yaml b/translations/content/fr/concurrency/concurrent-http-virtual.yaml new file mode 100644 index 0000000..6784f4d --- /dev/null +++ b/translations/content/fr/concurrency/concurrent-http-virtual.yaml @@ -0,0 +1,18 @@ +--- +title: HTTP concurrent avec les threads virtuels +oldApproach: Thread Pool + URLConnection +modernApproach: Virtual Threads + HttpClient +summary: Récupère de nombreuses URLs en parallèle avec les threads virtuels et HttpClient. +explanation: Les threads virtuels rendent pratique la création d'un thread par requête HTTP. Combiné avec HttpClient, cela remplace des patterns complexes de callbacks asynchrones par du code bloquant simple qui passe à l'échelle. +whyModernWins: +- icon: ♾️ + title: Un thread par requête + desc: Sans dimensionner les pools — un thread virtuel par URL. +- icon: 📖 + title: Code simple + desc: Écrivez du code bloquant direct et simple. +- icon: ⚡ + title: Haute performance + desc: Des milliers de requêtes concurrentes avec des ressources minimales. +support: + description: Disponible depuis JDK 21 LTS (sept. 2023) diff --git a/translations/content/fr/concurrency/executor-try-with-resources.yaml b/translations/content/fr/concurrency/executor-try-with-resources.yaml new file mode 100644 index 0000000..caa0c7e --- /dev/null +++ b/translations/content/fr/concurrency/executor-try-with-resources.yaml @@ -0,0 +1,18 @@ +--- +title: Fermeture automatique d'ExecutorService +oldApproach: Fermeture manuelle +modernApproach: try-with-resources +summary: Utilisez try-with-resources pour la fermeture automatique de l'executor. +explanation: Depuis Java 19, ExecutorService implémente AutoCloseable. La méthode close() appelle shutdown() et attend que les tâches se terminent. Fini les patterns manuels try/finally pour la fermeture. +whyModernWins: +- icon: 🧹 + title: Nettoyage automatique + desc: La fermeture se fait automatiquement à la sortie du bloc. +- icon: 🛡️ + title: Sans fuites + desc: L'executor est toujours fermé, même si des exceptions se produisent. +- icon: 📖 + title: Pattern familier + desc: Le même try-with-resources utilisé pour les fichiers, connexions, etc. +support: + description: Disponible depuis JDK 19 (sept. 2022) diff --git a/translations/content/fr/concurrency/lock-free-lazy-init.yaml b/translations/content/fr/concurrency/lock-free-lazy-init.yaml new file mode 100644 index 0000000..4d64a68 --- /dev/null +++ b/translations/content/fr/concurrency/lock-free-lazy-init.yaml @@ -0,0 +1,18 @@ +--- +title: Initialisation paresseuse sans verrous +oldApproach: synchronized + volatile +modernApproach: StableValue +summary: Remplace le double-checked locking par StableValue pour les singletons paresseux. +explanation: StableValue encapsule le pattern d'initialisation paresseuse avec une sécurité thread correcte. La JVM peut optimiser le chemin de lecture après l'initialisation, le rendant potentiellement plus rapide que les lectures volatile. +whyModernWins: +- icon: 🧹 + title: Sans code répétitif + desc: Sans volatile, synchronized ni double-null-check. +- icon: ⚡ + title: Lectures plus rapides + desc: La JVM peut plier les constantes après l'initialisation. +- icon: ✅ + title: Correction démontrable + desc: Sans erreurs subtiles d'ordonnancement — la JVM s'en charge. +support: + description: Aperçu dans JDK 25 (JEP 502, StableValue). Nécessite --enable-preview. diff --git a/translations/content/fr/concurrency/process-api.yaml b/translations/content/fr/concurrency/process-api.yaml new file mode 100644 index 0000000..d5bef5b --- /dev/null +++ b/translations/content/fr/concurrency/process-api.yaml @@ -0,0 +1,18 @@ +--- +title: API moderne des processus +oldApproach: Runtime.exec() +modernApproach: ProcessHandle +summary: Inspectez et gérez les processus du système d'exploitation avec ProcessHandle. +explanation: ProcessHandle fournit les PIDs, les informations de processus (commande, arguments, heure de démarrage, utilisation CPU), les relations parent-enfant et la destruction de processus. Fini de dépendre des parties internes non documentées de Process. +whyModernWins: +- icon: 🔍 + title: Informations complètes + desc: Accès au PID, commande, arguments, heure de démarrage, utilisation CPU. +- icon: 🌳 + title: Arbre de processus + desc: Naviguez entre parent, enfants et descendants. +- icon: 📊 + title: Surveillance + desc: onExit() retourne un CompletableFuture pour la surveillance asynchrone. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/concurrency/scoped-values.yaml b/translations/content/fr/concurrency/scoped-values.yaml new file mode 100644 index 0000000..fc21560 --- /dev/null +++ b/translations/content/fr/concurrency/scoped-values.yaml @@ -0,0 +1,18 @@ +--- +title: Valeurs à portée +oldApproach: ThreadLocal +modernApproach: ScopedValue +summary: Partagez des données le long de la pile d'appels en toute sécurité sans les problèmes de ThreadLocal. +explanation: ScopedValue fournit un contexte immutable, héritable et limité à une portée. Contrairement à ThreadLocal, les valeurs à portée sont nettoyées automatiquement, fonctionnent avec les threads virtuels et ne peuvent pas être modifiées par les méthodes appelées. +whyModernWins: +- icon: 🔒 + title: Immutable + desc: Les méthodes appelées peuvent lire mais jamais modifier la valeur à portée. +- icon: 🧹 + title: Nettoyage automatique + desc: Sans remove() manuel — la valeur est limitée au bloc. +- icon: ⚡ + title: Compatible avec les threads virtuels + desc: Fonctionne efficacement avec des millions de threads virtuels. +support: + description: Finalisé dans JDK 25 LTS (JEP 506, sept. 2025). diff --git a/translations/content/fr/concurrency/stable-values.yaml b/translations/content/fr/concurrency/stable-values.yaml new file mode 100644 index 0000000..672e5de --- /dev/null +++ b/translations/content/fr/concurrency/stable-values.yaml @@ -0,0 +1,18 @@ +--- +title: Valeurs stables +oldApproach: Double-Checked Locking +modernApproach: StableValue +summary: Initialisation paresseuse thread-safe sans volatile ni synchronized. +explanation: StableValue fournit une valeur initialisée paresseusement et immutable avec une sécurité thread intégrée. Sans double-checked locking, sans champs volatile, sans blocs synchronized. La JVM peut même optimiser le chemin de lecture après l'initialisation. +whyModernWins: +- icon: 🧹 + title: Zéro code répétitif + desc: Sans volatile, synchronized ni vérifications de null. +- icon: ⚡ + title: Optimisé par la JVM + desc: La JVM peut plier la valeur après l'initialisation. +- icon: 🛡️ + title: Exécution unique garantie + desc: Le fournisseur s'exécute exactement une fois, même sous contention. +support: + description: Aperçu dans JDK 25 (JEP 502). Nécessite --enable-preview. diff --git a/translations/content/fr/concurrency/structured-concurrency.yaml b/translations/content/fr/concurrency/structured-concurrency.yaml new file mode 100644 index 0000000..310fa71 --- /dev/null +++ b/translations/content/fr/concurrency/structured-concurrency.yaml @@ -0,0 +1,18 @@ +--- +title: Concurrence structurée +oldApproach: Cycle de vie manuel des threads +modernApproach: StructuredTaskScope +summary: Gérez le cycle de vie des tâches concurrentes comme une seule unité de travail. +explanation: La concurrence structurée traite un groupe de tâches concurrentes comme une seule opération. Si une sous-tâche échoue, les autres sont annulées. La portée garantit qu'il n'y a pas de fuites de threads et établit des relations claires parent-enfant. +whyModernWins: +- icon: 🛡️ + title: Sans fuites de threads + desc: Toutes les tâches bifurquées se terminent avant la fermeture de la portée. +- icon: ⚡ + title: Échec rapide + desc: ShutdownOnFailure annule les tâches sœurs si l'une échoue. +- icon: 📐 + title: Structure claire + desc: Le cycle de vie de la tâche correspond à la portée lexicale dans le code. +support: + description: Aperçu dans JDK 25 (cinquième aperçu, JEP 505). Nécessite --enable-preview. diff --git a/translations/content/fr/concurrency/thread-sleep-duration.yaml b/translations/content/fr/concurrency/thread-sleep-duration.yaml new file mode 100644 index 0000000..0d5c4c6 --- /dev/null +++ b/translations/content/fr/concurrency/thread-sleep-duration.yaml @@ -0,0 +1,18 @@ +--- +title: Thread.sleep avec Duration +oldApproach: Millisecondes +modernApproach: Duration +summary: Utilisez Duration pour des valeurs temporelles auto-documentées. +explanation: Thread.sleep(Duration) rend l'unité de temps explicite. Plus besoin de deviner si 5000 signifie des millisecondes ou des microsecondes. Fonctionne avec Duration.ofSeconds, ofMillis, ofMinutes, etc. +whyModernWins: +- icon: 📖 + title: Auto-documenté + desc: Duration.ofSeconds(5) est sans ambiguïté. +- icon: 🛡️ + title: Sûr en termes d'unités + desc: Sans passer accidentellement des microsecondes comme des millisecondes. +- icon: 🧩 + title: Composable + desc: "Arithmétique avec Duration : plus(), multipliedBy(), etc." +support: + description: Disponible depuis JDK 19 (sept. 2022) diff --git a/translations/content/fr/concurrency/virtual-threads.yaml b/translations/content/fr/concurrency/virtual-threads.yaml new file mode 100644 index 0000000..676f392 --- /dev/null +++ b/translations/content/fr/concurrency/virtual-threads.yaml @@ -0,0 +1,18 @@ +--- +title: Threads virtuels +oldApproach: Threads de plateforme +modernApproach: Virtual Threads +summary: Créez des millions de threads virtuels légers au lieu de lourds threads du système d'exploitation. +explanation: Les threads virtuels sont des threads légers gérés par la JVM, pas par le système d'exploitation. Vous pouvez en créer des millions sans ajuster les pools de threads. Ils sont idéaux pour les tâches avec beaucoup d'E/S comme les appels HTTP et les requêtes de bases de données. +whyModernWins: +- icon: ⚡ + title: Légers + desc: Les threads virtuels utilisent des Ko de mémoire, les threads de plateforme utilisent des Mo. +- icon: ♾️ + title: Évolutifs + desc: Créez des millions de threads — sans besoin de dimensionner les pools. +- icon: 🧹 + title: Modèle simple + desc: Écrivez du code bloquant qui passe à l'échelle comme du code asynchrone. +support: + description: Disponible depuis JDK 21 LTS (sept. 2023) diff --git a/translations/content/fr/datetime/date-formatting.yaml b/translations/content/fr/datetime/date-formatting.yaml new file mode 100644 index 0000000..54b1702 --- /dev/null +++ b/translations/content/fr/datetime/date-formatting.yaml @@ -0,0 +1,18 @@ +--- +title: Formatage de dates +oldApproach: SimpleDateFormat +modernApproach: DateTimeFormatter +summary: Formatez les dates avec DateTimeFormatter, immutable et thread-safe. +explanation: DateTimeFormatter est immutable et thread-safe, contrairement à SimpleDateFormat. Il peut être stocké comme constante et partagé. Des formateurs prédéfinis comme ISO_LOCAL_DATE sont disponibles pour les formats courants. +whyModernWins: +- icon: 🛡️ + title: Thread-safe + desc: Partagez des formateurs entre les threads sans synchronisation. +- icon: 📋 + title: Formats intégrés + desc: ISO_LOCAL_DATE, ISO_INSTANT, etc. pour les formats standard. +- icon: 🔒 + title: Immutable + desc: Peut être stocké en toute sécurité comme constante static final. +support: + description: Disponible depuis JDK 8 (mars 2014) diff --git a/translations/content/fr/datetime/duration-and-period.yaml b/translations/content/fr/datetime/duration-and-period.yaml new file mode 100644 index 0000000..7d5b8e8 --- /dev/null +++ b/translations/content/fr/datetime/duration-and-period.yaml @@ -0,0 +1,18 @@ +--- +title: Duration et Period +oldApproach: Arithmétique en millisecondes +modernApproach: Duration / Period +summary: Calculez les différences de temps avec Duration et Period de façon sûre en termes de types. +explanation: Duration est pour les quantités basées sur le temps (heures, minutes, secondes). Period est pour les quantités basées sur les dates (années, mois, jours). ChronoUnit.between() pour les différences simples. Tous gèrent correctement les cas limites. +whyModernWins: +- icon: 🎯 + title: Sûr en termes de types + desc: Duration pour le temps, Period pour les dates — sans confusion. +- icon: 🛡️ + title: Calcul correct + desc: Gère les transitions d'heure d'été, les années bissextiles et les secondes intercalaires. +- icon: 📖 + title: Lisible + desc: ChronoUnit.DAYS.between() se lit comme un langage naturel. +support: + description: Disponible depuis JDK 8 (mars 2014) diff --git a/translations/content/fr/datetime/hex-format.yaml b/translations/content/fr/datetime/hex-format.yaml new file mode 100644 index 0000000..767aa34 --- /dev/null +++ b/translations/content/fr/datetime/hex-format.yaml @@ -0,0 +1,18 @@ +--- +title: HexFormat +oldApproach: Conversion hexadécimale manuelle +modernApproach: HexFormat +summary: Convertit entre chaînes hexadécimales et tableaux d'octets avec HexFormat. +explanation: HexFormat fournit un encodage/décodage hexadécimal bidirectionnel pour les octets, entiers et tableaux. Permet de configurer les délimiteurs, préfixe, suffixe et casse. Fini le formatage ou l'analyse manuelle. +whyModernWins: +- icon: 📐 + title: Bidirectionnel + desc: Convertit octets→hex et hex→octets avec une seule API. +- icon: 🔧 + title: Configurable + desc: Délimiteurs, préfixe, suffixe, casse. +- icon: 📦 + title: Support de tableaux + desc: Encode/décode des tableaux d'octets entiers en une fois. +support: + description: Disponible depuis JDK 17 LTS (septembre 2021) diff --git a/translations/content/fr/datetime/instant-precision.yaml b/translations/content/fr/datetime/instant-precision.yaml new file mode 100644 index 0000000..ffe4400 --- /dev/null +++ b/translations/content/fr/datetime/instant-precision.yaml @@ -0,0 +1,18 @@ +--- +title: Instant avec précision en nanosecondes +oldApproach: Millisecondes +modernApproach: Nanosecondes +summary: Obtenez des horodatages avec une précision en microsecondes ou nanosecondes. +explanation: Java 9 a amélioré la résolution de l'horloge pour qu'Instant.now() capture une précision en microsecondes sur la plupart des plateformes (nanosecondes sur certaines). L'ancien currentTimeMillis() ne fournit que des millisecondes. +whyModernWins: +- icon: 🎯 + title: Précision accrue + desc: Horodatages en microsecondes/nanosecondes au lieu de millisecondes. +- icon: 📐 + title: Sûr en termes de types + desc: Instant porte sa précision — sans longs ambigus. +- icon: 🌐 + title: Basé sur UTC + desc: Instant est toujours en UTC — sans confusion de fuseau horaire. +support: + description: Disponible depuis JDK 9 (septembre 2017) diff --git a/translations/content/fr/datetime/java-time-basics.yaml b/translations/content/fr/datetime/java-time-basics.yaml new file mode 100644 index 0000000..825df0f --- /dev/null +++ b/translations/content/fr/datetime/java-time-basics.yaml @@ -0,0 +1,18 @@ +--- +title: Fondamentaux de l'API java.time +oldApproach: Date + Calendar +modernApproach: java.time.* +summary: Utilisez des types de date/heure immutables et clairs au lieu de Date et Calendar. +explanation: java.time fournit LocalDate, LocalTime, LocalDateTime, Instant, ZonedDateTime — tous immutables et thread-safe. Les mois sont indexés à partir de 1. Fini la confusion avec Calendar.JANUARY = 0. +whyModernWins: +- icon: 🔒 + title: Immutable + desc: Les valeurs de date/heure ne peuvent pas être modifiées accidentellement. +- icon: 📖 + title: API claire + desc: Month.JANUARY, pas 0. DayOfWeek.MONDAY, pas 2. +- icon: 🛡️ + title: Thread-safe + desc: Sans synchronisation nécessaire — partagé librement entre les threads. +support: + description: Disponible depuis JDK 8 (mars 2014) diff --git a/translations/content/fr/datetime/math-clamp.yaml b/translations/content/fr/datetime/math-clamp.yaml new file mode 100644 index 0000000..794295c --- /dev/null +++ b/translations/content/fr/datetime/math-clamp.yaml @@ -0,0 +1,18 @@ +--- +title: Math.clamp() +oldApproach: min/max imbriqués +modernApproach: Math.clamp() +summary: Limite une valeur entre des bornes avec un seul appel clair. +explanation: Math.clamp(value, min, max) restreint une valeur à la plage [min, max]. Plus clair qu'imbriquer Math.min/Math.max et disponible pour int, long, float et double. +whyModernWins: +- icon: 📖 + title: Auto-documenté + desc: clamp(value, min, max) est sans ambiguïté. +- icon: 🛡️ + title: Moins sujet aux erreurs + desc: Plus d'échange accidentel de l'ordre de min/max. +- icon: 🎯 + title: Tous les types numériques + desc: Fonctionne avec int, long, float et double. +support: + description: Disponible depuis JDK 21 LTS (septembre 2023) diff --git a/translations/content/fr/enterprise/ejb-timer-vs-jakarta-scheduler.yaml b/translations/content/fr/enterprise/ejb-timer-vs-jakarta-scheduler.yaml new file mode 100644 index 0000000..c29c5a0 --- /dev/null +++ b/translations/content/fr/enterprise/ejb-timer-vs-jakarta-scheduler.yaml @@ -0,0 +1,18 @@ +--- +title: "EJB Timer vs Jakarta Scheduler" +oldApproach: "EJB TimerService" +modernApproach: "ManagedScheduledExecutorService" +summary: "Remplace les minuteries lourdes d'EJB par ManagedScheduledExecutorService de Jakarta Concurrency pour une planification de tâches plus simple." +explanation: "Les minuteries EJB nécessitent un bean @Stateless ou @Singleton avec un callback @Timeout et des expressions de planification basées sur XML ou annotations. Jakarta Concurrency fournit ManagedScheduledExecutorService, qui utilise l'API de planification bien connue de java.util.concurrent. Le résultat est moins de code répétitif, des tests unitaires plus faciles et sans dépendance au conteneur EJB." +whyModernWins: +- icon: "🪶" + title: "Moins de code répétitif" + desc: "Sans callback @Timeout ni ScheduleExpression — utilise l'API standard de ScheduledExecutorService." +- icon: "🧪" + title: "Meilleure testabilité" + desc: "Des méthodes simples et des mocks d'executors rendent les tests unitaires directs sans conteneur EJB." +- icon: "☁️" + title: "Adapté au cloud" + desc: "Les executors gérés s'intègrent au cycle de vie du conteneur et fonctionnent dans des runtimes légers." +support: + description: "Disponible depuis Jakarta EE 10 / Concurrency 3.0" diff --git a/translations/content/fr/enterprise/ejb-vs-cdi.yaml b/translations/content/fr/enterprise/ejb-vs-cdi.yaml new file mode 100644 index 0000000..6aba853 --- /dev/null +++ b/translations/content/fr/enterprise/ejb-vs-cdi.yaml @@ -0,0 +1,18 @@ +--- +title: "EJB versus CDI" +oldApproach: "EJB" +modernApproach: "Bean CDI" +summary: "Remplace les lourds EJB par des beans CDI légers pour l'injection de dépendances et les transactions." +explanation: "CDI (Contexts and Dependency Injection) offre la même injection de dépendances et gestion des transactions que les EJB, mais sous forme de classes Java simples sans interfaces ni superclasses spécifiques au conteneur. Les portées comme @ApplicationScoped et @RequestScoped contrôlent le cycle de vie, et @Transactional remplace la sémantique transactionnelle obligatoire des EJB." +whyModernWins: +- icon: "🪶" + title: "Léger" + desc: "Les beans CDI sont des classes Java simples sans interfaces ni descripteurs EJB spécifiques." +- icon: "💉" + title: "Injection unifiée" + desc: "@Inject fonctionne pour n'importe quel bean géré, ressources JAX-RS et composants Jakarta EE de la même façon." +- icon: "🧪" + title: "Tests unitaires simples" + desc: "Des classes simples sans la surcharge du proxy EJB sont faciles à instancier et à simuler." +support: + description: "Disponible depuis Jakarta EE 8 / Java 11" diff --git a/translations/content/fr/enterprise/jdbc-resultset-vs-jpa-criteria.yaml b/translations/content/fr/enterprise/jdbc-resultset-vs-jpa-criteria.yaml new file mode 100644 index 0000000..7b7695b --- /dev/null +++ b/translations/content/fr/enterprise/jdbc-resultset-vs-jpa-criteria.yaml @@ -0,0 +1,18 @@ +--- +title: Mapping de JDBC ResultSet vs API Criteria de JPA +oldApproach: JDBC ResultSet +modernApproach: API Criteria de JPA +summary: Remplace le mapping manuel de JDBC ResultSet par l'API Criteria de JPA avec sécurité de types pour les requêtes dynamiques. +explanation: JDBC brut nécessite de construire des chaînes SQL, de définir des paramètres par index et de mapper chaque colonne du ResultSet manuellement — un processus sujet aux erreurs qui échoue silencieusement quand les colonnes changent. L'API Criteria de JPA construit des requêtes programmatiquement en utilisant un pattern builder avec sécurité de types. Les noms de colonnes sont validés par rapport au modèle d'entité, le mapping des résultats est automatique et les requêtes dynamiques complexes se composent proprement sans concaténation de chaînes. +whyModernWins: +- icon: 🔒 + title: Requêtes avec sécurité de types + desc: Le builder Criteria détecte les erreurs de noms de champs et les types incompatibles à la compilation. +- icon: 🗺️ + title: Mapping automatique + desc: JPA mappe les lignes de résultat en objets entité — sans extraction manuelle colonne par colonne. +- icon: 🧩 + title: Prédicats composables + desc: Les clauses where dynamiques se construisent proprement avec and(), or() et des objets Predicate réutilisables. +support: + description: Disponible depuis Jakarta EE 8 / Java 11 diff --git a/translations/content/fr/enterprise/jdbc-vs-jooq.yaml b/translations/content/fr/enterprise/jdbc-vs-jooq.yaml new file mode 100644 index 0000000..632679b --- /dev/null +++ b/translations/content/fr/enterprise/jdbc-vs-jooq.yaml @@ -0,0 +1,18 @@ +--- +title: "JDBC versus jOOQ" +oldApproach: "JDBC brut" +modernApproach: "DSL SQL de jOOQ" +summary: "Remplace le SQL basé sur des chaînes de JDBC brut par le DSL SQL avec sécurité de types et fluide de jOOQ." +explanation: "jOOQ (Java Object Oriented Querying) génère du code Java à partir du schéma de votre base de données, convertissant les noms de tables et colonnes en constantes Java avec sécurité de types. Le DSL fluide reflète la syntaxe SQL pour que les requêtes soient lisibles et composables. Tous les paramètres sont liés automatiquement, éliminant le risque d'injection SQL. Contrairement à JPA/JPQL, jOOQ embrasse pleinement SQL — les fonctions de fenêtre, les CTEs, les clauses RETURNING et les extensions spécifiques aux fournisseurs sont de première classe." +whyModernWins: +- icon: "🔒" + title: "Colonnes avec sécurité de types" + desc: "Les noms de colonnes sont des constantes Java générées — les fautes de frappe et types incompatibles deviennent des erreurs de compilation." +- icon: "📖" + title: "Fluidité SQL" + desc: "Le DSL de jOOQ reflète étroitement la syntaxe SQL, donc les JOINs complexes, sous-requêtes et CTEs restent lisibles." +- icon: "🛡️" + title: "Sans injection par conception" + desc: "Les paramètres sont toujours liés de façon sécurisée — sans concaténation de chaînes signifie sans risque d'injection SQL." +support: + description: "L'édition open-source de jOOQ supporte toutes les bases de données open-source principales ; les bases de données commerciales anciennes nécessitent une licence payante" diff --git a/translations/content/fr/enterprise/jdbc-vs-jpa.yaml b/translations/content/fr/enterprise/jdbc-vs-jpa.yaml new file mode 100644 index 0000000..cb2a4cd --- /dev/null +++ b/translations/content/fr/enterprise/jdbc-vs-jpa.yaml @@ -0,0 +1,18 @@ +--- +title: "JDBC versus JPA" +oldApproach: "JDBC" +modernApproach: "JPA EntityManager" +summary: "Remplace le vaste code répétitif de JDBC par le mapping objet-relationnel et l'EntityManager de JPA." +explanation: "JPA (Jakarta Persistence API) mappe les objets Java aux lignes de base de données, éliminant le traitement manuel de ResultSet et la concaténation de chaînes SQL. EntityManager fournit find(), persist() et des requêtes JPQL pour travailler avec des objets de domaine plutôt que du SQL brut, tandis que le conteneur gère le pool de connexions et les transactions." +whyModernWins: +- icon: "🗺️" + title: "Mapping d'objets" + desc: "Les entités sont de simples classes annotées — sans traduction manuelle de ResultSet en objet." +- icon: "🔒" + title: "Requêtes avec sécurité de types" + desc: "JPQL opère sur les types et champs d'entités plutôt que sur des chaînes de tables et colonnes brutes." +- icon: "⚡" + title: "Cache intégrée" + desc: "Les caches de premier et second niveau réduisent automatiquement les allers-retours vers la base de données." +support: + description: "Disponible depuis Jakarta EE 8 / Java 11" diff --git a/translations/content/fr/enterprise/jndi-lookup-vs-cdi-injection.yaml b/translations/content/fr/enterprise/jndi-lookup-vs-cdi-injection.yaml new file mode 100644 index 0000000..38fe1d1 --- /dev/null +++ b/translations/content/fr/enterprise/jndi-lookup-vs-cdi-injection.yaml @@ -0,0 +1,18 @@ +--- +title: "Recherche JNDI vs Injection CDI" +oldApproach: "Recherche JNDI" +modernApproach: "CDI @Inject" +summary: "Remplace les fragiles recherches JNDI par chaînes par l'injection CDI avec sécurité de types pour les ressources gérées par le conteneur." +explanation: "Le pattern JNDI traditionnel oblige à utiliser des noms de ressources basés sur des chaînes, à gérer NamingException et à gérer un InitialContext. L'injection CDI avec @Inject (ou @Resource pour les ressources du conteneur) permet au conteneur de connecter les dépendances automatiquement. Les fautes de frappe deviennent des erreurs à la compilation, et les classes sont plus faciles à tester car les dépendances peuvent être injectées directement." +whyModernWins: +- icon: "🔒" + title: "Câblage avec sécurité de types" + desc: "Les erreurs d'injection sont détectées au déploiement, pas à l'exécution via des recherches par chaîne." +- icon: "🗑️" + title: "Sans code répétitif" + desc: "Élimine la création d'InitialContext, les chaînes de noms JNDI et la gestion de NamingException." +- icon: "🧪" + title: "Testable" + desc: "Les dépendances sont des champs injectés, facilement remplaçables par des mocks dans les tests unitaires." +support: + description: "Disponible depuis Jakarta EE 8 / Java 11" diff --git a/translations/content/fr/enterprise/jpa-vs-jakarta-data.yaml b/translations/content/fr/enterprise/jpa-vs-jakarta-data.yaml new file mode 100644 index 0000000..e69d1e2 --- /dev/null +++ b/translations/content/fr/enterprise/jpa-vs-jakarta-data.yaml @@ -0,0 +1,18 @@ +--- +title: "JPA versus Jakarta Data" +oldApproach: "JPA EntityManager" +modernApproach: "Référentiel Jakarta Data" +summary: "Déclarez une interface de référentiel et laissez Jakarta Data générer automatiquement l'implémentation du DAO." +explanation: "Jakarta Data (Jakarta EE 11) transforme l'accès aux données en une pure déclaration d'interface. Annotez une interface avec @Repository et étendez un type de référentiel intégré comme CrudRepository. Le runtime génère l'implémentation — y compris les requêtes dérivées de noms de méthodes comme findByName — donc pas de code répétitif EntityManager, pas de chaînes JPQL, pas de méthodes save/find écrites à la main." +whyModernWins: +- icon: "🪄" + title: "Zéro code répétitif" + desc: "Déclarez l'interface ; le conteneur génère l'implémentation complète du DAO au déploiement." +- icon: "🔍" + title: "Requêtes dérivées" + desc: "Les noms de méthodes comme findByNameAndStatus sont analysés automatiquement — sans JPQL ni SQL." +- icon: "🔌" + title: "Portable" + desc: "N'importe quel runtime compatible Jakarta EE 11 fournit l'implémentation du référentiel sans dépendance au fournisseur." +support: + description: "Disponible depuis Jakarta EE 11 / Java 21 (2024)" diff --git a/translations/content/fr/enterprise/jsf-managed-bean-vs-cdi-named.yaml b/translations/content/fr/enterprise/jsf-managed-bean-vs-cdi-named.yaml new file mode 100644 index 0000000..61870a6 --- /dev/null +++ b/translations/content/fr/enterprise/jsf-managed-bean-vs-cdi-named.yaml @@ -0,0 +1,18 @@ +--- +title: "JSF Managed Bean vs CDI Named Bean" +oldApproach: "@ManagedBean" +modernApproach: "@Named + CDI" +summary: "Remplace le @ManagedBean obsolète de JSF par @Named de CDI pour un modèle d'injection de dépendances unifié." +explanation: "@ManagedBean et @ManagedProperty de JSF ont été dépréciés dans Jakarta Faces 2.3 et supprimés dans Jakarta EE 10. Le remplacement basé sur CDI utilise @Named pour exposer le bean aux expressions EL et @Inject pour le câblage des dépendances. Cela unifie le modèle de beans : les pages JSF, les ressources JAX-RS et les EJB partagent le même conteneur CDI." +whyModernWins: +- icon: "🔗" + title: "Modèle unifié" + desc: "Un seul conteneur CDI gère tous les beans — JSF, REST et les couches de service partagent la même injection." +- icon: "��️" + title: "Moins de code répétitif" + desc: "@Inject remplace @ManagedProperty et sa méthode setter obligatoire." +- icon: "🔮" + title: "Pérenne" + desc: "@ManagedBean a été supprimé dans Jakarta EE 10 ; @Named est le remplacement supporté." +support: + description: "CDI @Named disponible depuis Java EE 6 ; @ManagedBean supprimé dans Jakarta EE 10" diff --git a/translations/content/fr/enterprise/manual-transaction-vs-declarative.yaml b/translations/content/fr/enterprise/manual-transaction-vs-declarative.yaml new file mode 100644 index 0000000..2a90e94 --- /dev/null +++ b/translations/content/fr/enterprise/manual-transaction-vs-declarative.yaml @@ -0,0 +1,18 @@ +--- +title: "Transaction JPA manuelle vs @Transactional déclaratif" +oldApproach: "Transaction manuelle" +modernApproach: "@Transactional" +summary: "Remplace les blocs verbeux begin/commit/rollback par une seule annotation @Transactional." +explanation: "La gestion manuelle des transactions nécessite des appels explicites à begin(), commit() et rollback() enveloppés dans des blocs try-catch — chaque méthode de service répète ce code répétitif. L'annotation @Transactional délègue la gestion du cycle de vie au conteneur : démarre une transaction avant la méthode, valide en cas de succès et annule en cas de RuntimeException automatiquement." +whyModernWins: +- icon: "🗑️" + title: "Sans code répétitif" + desc: "Une seule annotation remplace les blocs répétitifs try-catch de begin/commit/rollback." +- icon: "🛡️" + title: "Rollback plus sûr" + desc: "Le conteneur garantit le rollback sur les exceptions non vérifiées — sans risque d'oublier le bloc catch." +- icon: "📐" + title: "Contrôle déclaratif" + desc: "Les règles de propagation, d'isolation et de rollback s'expriment comme attributs de l'annotation." +support: + description: "Disponible depuis Jakarta EE 8 / Java 11" diff --git a/translations/content/fr/enterprise/mdb-vs-reactive-messaging.yaml b/translations/content/fr/enterprise/mdb-vs-reactive-messaging.yaml new file mode 100644 index 0000000..92fd40f --- /dev/null +++ b/translations/content/fr/enterprise/mdb-vs-reactive-messaging.yaml @@ -0,0 +1,18 @@ +--- +title: "Message-Driven Bean vs Reactive Messaging" +oldApproach: "Message-Driven Bean" +modernApproach: "Reactive Messaging" +summary: "Remplace les Message-Driven Beans JMS par MicroProfile Reactive Messaging pour un traitement d'événements plus simple." +explanation: "Les Message-Driven Beans nécessitent d'implémenter MessageListener, de configurer les propriétés d'activation et de désérialiser manuellement les messages JMS. MicroProfile Reactive Messaging utilise une simple annotation @Incoming sur une méthode qui reçoit des objets typés directement. La configuration du canal est externalisée, rendant le code agnostique au broker et beaucoup plus facile à tester." +whyModernWins: +- icon: "🪶" + title: "Code minimal" + desc: "Une seule méthode @Incoming remplace la classe MDB, l'interface MessageListener et la configuration d'activation." +- icon: "🔌" + title: "Agnostique au broker" + desc: "Échangez les connecteurs Kafka, AMQP ou JMS via la configuration sans changer le code de l'application." +- icon: "☁️" + title: "Adapté au cloud" + desc: "La contre-pression de streams réactifs et le runtime léger le rendent idéal pour les déploiements en conteneurs." +support: + description: "Disponible depuis MicroProfile 4.0 / SmallRye Reactive Messaging" diff --git a/translations/content/fr/enterprise/servlet-vs-jaxrs.yaml b/translations/content/fr/enterprise/servlet-vs-jaxrs.yaml new file mode 100644 index 0000000..b21f00f --- /dev/null +++ b/translations/content/fr/enterprise/servlet-vs-jaxrs.yaml @@ -0,0 +1,18 @@ +--- +title: "Servlet versus JAX-RS" +oldApproach: "HttpServlet" +modernApproach: "Ressource JAX-RS" +summary: "Remplace le vaste code répétitif d'HttpServlet par des classes de ressources JAX-RS déclaratives." +explanation: "JAX-RS (Jakarta RESTful Web Services) permet d'exposer des endpoints REST en utilisant de simples annotations comme @GET, @Path et @Produces. Fini l'analyse manuelle des paramètres de requête ni la configuration des types de contenu dans la réponse — le runtime gère le marshalling et le routage automatiquement." +whyModernWins: +- icon: "📐" + title: "Routage déclaratif" + desc: "Les annotations définissent la méthode HTTP, le chemin et le type de contenu au lieu d'un dispatch impératif avec if/else." +- icon: "🔄" + title: "Marshalling automatique" + desc: "Retournez des POJOs directement ; le runtime les sérialise en JSON ou XML selon @Produces." +- icon: "🧪" + title: "Tests plus faciles" + desc: "Les classes de ressources sont de simples objets Java, testables sans conteneur de servlets." +support: + description: "Disponible depuis Jakarta EE 8 / Java 11" diff --git a/translations/content/fr/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml b/translations/content/fr/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml new file mode 100644 index 0000000..926e4b9 --- /dev/null +++ b/translations/content/fr/enterprise/singleton-ejb-vs-cdi-application-scoped.yaml @@ -0,0 +1,18 @@ +--- +title: "Singleton EJB vs CDI @ApplicationScoped" +oldApproach: "@Singleton EJB" +modernApproach: "@ApplicationScoped CDI" +summary: "Remplace les Singleton EJB par des beans CDI @ApplicationScoped pour une gestion d'état partagé plus simple." +explanation: "Les Singleton EJB regroupent la gestion de la concurrence (@Lock, @ConcurrencyManagement) et l'initialisation précoce (@Startup) dans le conteneur EJB. Un bean CDI @ApplicationScoped atteint le même cycle de vie d'instance unique avec beaucoup moins de cérémonie. Quand le contrôle de la concurrence est nécessaire, les utilitaires standard de java.util.concurrent offrent un contrôle plus granulaire que les annotations de verrouillage EJB." +whyModernWins: +- icon: "🪶" + title: "Moins de bruit d'annotations" + desc: "Sans @ConcurrencyManagement, @Lock ni @Startup — juste une seule annotation @ApplicationScoped." +- icon: "🔧" + title: "Concurrence flexible" + desc: "Utilisez les verrous de java.util.concurrent ou volatile pour exactement la sécurité thread dont vous avez besoin." +- icon: "🧪" + title: "Tests simples" + desc: "Les beans CDI simples peuvent être instanciés directement dans les tests sans conteneur EJB." +support: + description: "Disponible depuis Jakarta EE 8 / Java 11" diff --git a/translations/content/fr/enterprise/soap-vs-jakarta-rest.yaml b/translations/content/fr/enterprise/soap-vs-jakarta-rest.yaml new file mode 100644 index 0000000..62cd4a5 --- /dev/null +++ b/translations/content/fr/enterprise/soap-vs-jakarta-rest.yaml @@ -0,0 +1,18 @@ +--- +title: "Services web SOAP vs Jakarta REST" +oldApproach: "JAX-WS / SOAP" +modernApproach: "Jakarta REST / JSON" +summary: "Remplace les lourds endpoints SOAP/WSDL par des ressources Jakarta REST propres qui retournent du JSON." +explanation: "Les services web basés sur SOAP dépendent des contrats WSDL, du marshalling XML et des annotations JAX-WS qui ajoutent une surcharge significative. Jakarta REST (anciennement JAX-RS) utilise des annotations intuitives comme @GET, @Path et @Produces pour exposer des APIs RESTful en JSON. Le modèle de programmation est plus simple, les payloads sont plus petits et l'approche s'aligne avec la façon dont les microservices modernes communiquent." +whyModernWins: +- icon: "🪶" + title: "Payloads plus légers" + desc: "JSON est plus compact que les enveloppes XML SOAP, réduisant la bande passante et la surcharge d'analyse." +- icon: "📐" + title: "Annotations simples" + desc: "@GET, @Path et @Produces remplacent la cérémonie WSDL, @WebService et @WebMethod." +- icon: "🔌" + title: "Prêt pour les microservices" + desc: "REST/JSON est le standard pour la communication inter-services dans les architectures cloud-native." +support: + description: "Disponible depuis Jakarta EE 8 / Java 11" diff --git a/translations/content/fr/enterprise/spring-api-versioning.yaml b/translations/content/fr/enterprise/spring-api-versioning.yaml new file mode 100644 index 0000000..a85503f --- /dev/null +++ b/translations/content/fr/enterprise/spring-api-versioning.yaml @@ -0,0 +1,18 @@ +--- +title: "Versionnage d'API dans Spring Framework 7" +oldApproach: "Versionnage manuel par chemin URL" +modernApproach: "Versionnage natif d'API" +summary: "Remplace les contrôleurs dupliqués avec préfixe de version par le support natif de versionnage d'API de Spring Framework 7." +explanation: "Avant Spring Framework 7, le versionnage d'API nécessitait des classes de contrôleur séparées par version (par exemple /api/v1/products, /api/v2/products), dupliquant les mappings de requêtes et dispersant la logique de version dans de nombreux fichiers. Spring Framework 7 introduit le versionnage natif via un nouvel attribut version dans @RequestMapping et les annotations connexes, plus un hook configureApiVersioning dans WebMvcConfigurer. La version peut être résolue depuis un en-tête de requête, un segment de chemin URL ou un paramètre de requête — tout contrôlé en un seul endroit." +whyModernWins: +- icon: "🗂️" + title: "Sans duplication de contrôleurs" + desc: "Toutes les versions vivent dans une seule classe de contrôleur ; seules les méthodes handler individuelles portent un attribut de version." +- icon: "⚙️" + title: "Stratégie de version centralisée" + desc: "Changez d'en-tête à URL ou paramètre de requête en un seul appel à configureApiVersioning." +- icon: "📈" + title: "Évolution incrémentale" + desc: "Ajoutez une nouvelle version à une méthode sans toucher les endpoints non liés ni créer de nouveaux fichiers de contrôleur." +support: + description: "Disponible depuis Spring Framework 7.0 (nécessite Java 17+)" diff --git a/translations/content/fr/enterprise/spring-null-safety-jspecify.yaml b/translations/content/fr/enterprise/spring-null-safety-jspecify.yaml new file mode 100644 index 0000000..e1468db --- /dev/null +++ b/translations/content/fr/enterprise/spring-null-safety-jspecify.yaml @@ -0,0 +1,18 @@ +--- +title: "Sécurité contre les nuls dans Spring avec JSpecify" +oldApproach: "Spring @NonNull/@Nullable" +modernApproach: "JSpecify @NullMarked" +summary: "Spring 7 adopte les annotations JSpecify, rendant non-null la valeur par défaut et réduisant le bruit d'annotations." +explanation: "Spring 5 et 6 ont introduit leurs propres annotations de sécurité contre les nuls dans le package `org.springframework.lang`. Bien qu'utiles, elles étaient spécifiques au framework et nécessitaient d'annoter chaque élément non-null explicitement. Spring 7 migre vers JSpecify, un standard multi-écosystème pour la sécurité contre les nuls. L'annotation `@NullMarked` au niveau de la classe ou du package déclare que tous les types non annotés sont non-nuls par défaut. Seuls les types réellement nullables nécessitent l'annotation `@Nullable`, réduisant drastiquement la verbosité. Les annotations JSpecify sont reconnues par les principaux outils d'analyse statique comme NullAway, Error Prone et IntelliJ IDEA, apportant un support d'outillage plus riche." +whyModernWins: +- icon: "✂️" + title: "Non-null par défaut" + desc: "@NullMarked rend tous les types non annotés non-nuls, donc seules les exceptions nullables nécessitent une annotation." +- icon: "🌐" + title: "Standard de l'écosystème" + desc: "Les annotations JSpecify sont un standard multi-framework reconnu par NullAway, Error Prone et les IDEs." +- icon: "🔍" + title: "Outillage plus puissant" + desc: "Les analyseurs statiques modernes comprennent le modèle de nuls JSpecify et signalent les violations à la compilation." +support: + description: "Disponible depuis Spring Framework 7.0 (nécessite Java 17+)" diff --git a/translations/content/fr/enterprise/spring-xml-config-vs-annotations.yaml b/translations/content/fr/enterprise/spring-xml-config-vs-annotations.yaml new file mode 100644 index 0000000..38ebeb6 --- /dev/null +++ b/translations/content/fr/enterprise/spring-xml-config-vs-annotations.yaml @@ -0,0 +1,18 @@ +--- +title: "Configuration XML de Spring vs basée sur annotations" +oldApproach: "Définitions de beans en XML" +modernApproach: "Beans basés sur annotations" +summary: "Remplace les vastes définitions de beans XML de Spring par une configuration concise basée sur annotations avec Spring Boot." +explanation: "Les applications Spring traditionnelles câblaient les beans via des fichiers de configuration XML, déclarant chaque classe et ses dépendances comme des éléments verbeux. Bien que le support des annotations existait depuis Spring 2.5, le XML est resté l'approche dominante jusqu'à ce que Spring Boot introduise l'auto-configuration. Spring Boot détecte les beans annotés avec @Component, @Service, @Repository et @Controller via le scan du classpath, satisfait les dépendances via l'injection par constructeur automatiquement et configure l'infrastructure comme DataSource depuis le classpath — éliminant tous les fichiers de câblage XML." +whyModernWins: +- icon: "🚫" + title: "Sans XML" + desc: "@SpringBootApplication active le scan de composants et l'auto-configuration, éliminant tous les fichiers de câblage XML." +- icon: "💉" + title: "Injection par constructeur" + desc: "Spring injecte les dépendances via les constructeurs automatiquement, rendant les beans plus faciles à tester." +- icon: "⚡" + title: "Auto-configuration" + desc: "Spring Boot configure DataSource, JPA et autre infrastructure depuis le classpath sans code répétitif." +support: + description: "Disponible depuis Spring Boot 1.0 (avril 2014) ; Spring Boot 3 nécessite Java 17+" diff --git a/translations/content/fr/errors/helpful-npe.yaml b/translations/content/fr/errors/helpful-npe.yaml new file mode 100644 index 0000000..c59e435 --- /dev/null +++ b/translations/content/fr/errors/helpful-npe.yaml @@ -0,0 +1,18 @@ +--- +title: NullPointerExceptions descriptives +oldApproach: NPE cryptique +modernApproach: NPE détaillée +summary: La JVM indique automatiquement exactement quelle variable était null. +explanation: Les NPE descriptives indiquent quelle expression était null et quelle opération a échoué. Cela est activé par défaut depuis Java 14 — aucun changement de code n'est nécessaire, il suffit de mettre à jour le JDK. +whyModernWins: +- icon: 🔍 + title: Variable exacte + desc: Le message nomme la variable null dans la chaîne. +- icon: ⚡ + title: Débogage plus rapide + desc: Plus besoin de deviner lequel des 5 appels enchaînés était null. +- icon: 🆓 + title: Mise à niveau gratuite + desc: Sans changements de code — il suffit d'exécuter sur JDK 14+. +support: + description: Disponible depuis JDK 14 (mars 2020) diff --git a/translations/content/fr/errors/multi-catch.yaml b/translations/content/fr/errors/multi-catch.yaml new file mode 100644 index 0000000..f17e587 --- /dev/null +++ b/translations/content/fr/errors/multi-catch.yaml @@ -0,0 +1,18 @@ +--- +title: Gestion d'exceptions avec multi-catch +oldApproach: Blocs catch séparés +modernApproach: Multi-catch +summary: Capturez plusieurs types d'exception dans un seul bloc catch. +explanation: Multi-catch gère plusieurs types d'exception avec le même code. La variable d'exception est effectivement final, donc elle peut être relancée sans avoir besoin de l'envelopper. +whyModernWins: +- icon: 📏 + title: DRY + desc: La même logique de gestion écrite une seule fois au lieu de trois. +- icon: 🔄 + title: Relançable + desc: L'exception capturée peut être relancée avec son type précis. +- icon: 📖 + title: Lisible d'un coup d'œil + desc: Tous les types gérés sont visibles en un seul endroit. +support: + description: Disponible depuis JDK 7 (juillet 2011) diff --git a/translations/content/fr/errors/null-in-switch.yaml b/translations/content/fr/errors/null-in-switch.yaml new file mode 100644 index 0000000..922dbf7 --- /dev/null +++ b/translations/content/fr/errors/null-in-switch.yaml @@ -0,0 +1,18 @@ +--- +title: Cas null dans switch +oldApproach: Vérification avant le switch +modernApproach: case null +summary: Gérez null directement comme un cas du switch — sans vérification séparée. +explanation: Le switch avec pattern matching peut correspondre à null comme une étiquette de cas. Cela élimine le besoin d'une vérification de null avant le switch et rend la gestion de null explicite et visible. +whyModernWins: +- icon: 🎯 + title: Explicite + desc: La gestion de null est visible directement dans le switch. +- icon: 🛡️ + title: Sans NPE + desc: Faire un switch sur une valeur null ne lance pas NullPointerException. +- icon: 📐 + title: Tout en un + desc: Tous les cas, y compris null, dans une seule expression switch. +support: + description: Disponible depuis JDK 21 LTS (septembre 2023) diff --git a/translations/content/fr/errors/optional-chaining.yaml b/translations/content/fr/errors/optional-chaining.yaml new file mode 100644 index 0000000..c2df518 --- /dev/null +++ b/translations/content/fr/errors/optional-chaining.yaml @@ -0,0 +1,18 @@ +--- +title: Chaînage avec Optional +oldApproach: Vérifications de null imbriquées +modernApproach: Pipeline d'Optional +summary: Remplace les vérifications de null imbriquées par un pipeline d'Optional. +explanation: Optional.map() enchaîne des valeurs qui peuvent être null, court-circuitant au premier null. orElse() fournit la valeur par défaut. Cela élimine la pyramide de vérifications de null. +whyModernWins: +- icon: 🔗 + title: Enchaînable + desc: Chaque étape .map() gère null de façon transparente. +- icon: 📖 + title: Flux linéaire + desc: Se lit de gauche à droite au lieu de blocs if imbriqués. +- icon: 🛡️ + title: Sans risque de NPE + desc: null est géré à chaque étape — aucune possibilité d'échec. +support: + description: Disponible depuis JDK 8+ (amélioré en 9+) diff --git a/translations/content/fr/errors/optional-orelsethrow.yaml b/translations/content/fr/errors/optional-orelsethrow.yaml new file mode 100644 index 0000000..f031aa7 --- /dev/null +++ b/translations/content/fr/errors/optional-orelsethrow.yaml @@ -0,0 +1,18 @@ +--- +title: Optional.orElseThrow() sans supplier +oldApproach: get() ou orElseThrow(supplier) +modernApproach: orElseThrow() +summary: Utilisez Optional.orElseThrow() comme alternative plus claire et intentionnelle à get(). +explanation: "Optional.get() est largement considéré comme un anti-pattern car il cache la possibilité d'échec. La méthode orElseThrow() sans arguments, ajoutée dans Java 10, fait exactement la même chose mais rend l'intention claire : le développeur attend une valeur et veut une exception si elle est absente." +whyModernWins: +- icon: 📖 + title: Auto-documenté + desc: orElseThrow() signale clairement que l'absence est inattendue. +- icon: 🔒 + title: Évite get() + desc: Les outils d'analyse statique signalent get() comme risqué ; orElseThrow() est idiomatique. +- icon: ⚡ + title: Moins de code répétitif + desc: Pas besoin de passer un supplier pour la NoSuchElementException par défaut. +support: + description: Disponible depuis JDK 10 (mars 2018) diff --git a/translations/content/fr/errors/record-based-errors.yaml b/translations/content/fr/errors/record-based-errors.yaml new file mode 100644 index 0000000..7e13ff1 --- /dev/null +++ b/translations/content/fr/errors/record-based-errors.yaml @@ -0,0 +1,18 @@ +--- +title: Réponses d'erreur basées sur des records +oldApproach: Map ou classe verbose +modernApproach: Records d'erreur +summary: Utilisez des records pour des types de réponse d'erreur concis et immutables. +explanation: Les records sont parfaits pour les réponses d'erreur — ils sont immutables, ont equals/hashCode intégrés pour la comparaison, et toString pour la journalisation. Les constructeurs personnalisés permettent d'ajouter de la validation ou des valeurs par défaut. +whyModernWins: +- icon: 📏 + title: Concis + desc: Définissez des types d'erreur en 3 lignes au lieu de 30. +- icon: 🔒 + title: Immutable + desc: Les données d'erreur ne peuvent pas être modifiées accidentellement après leur création. +- icon: 📋 + title: toString automatique + desc: Parfait pour la journalisation — affiche tous les champs automatiquement. +support: + description: Disponible depuis JDK 16 (mars 2021) diff --git a/translations/content/fr/errors/require-nonnull-else.yaml b/translations/content/fr/errors/require-nonnull-else.yaml new file mode 100644 index 0000000..0140a5b --- /dev/null +++ b/translations/content/fr/errors/require-nonnull-else.yaml @@ -0,0 +1,18 @@ +--- +title: Objects.requireNonNullElse() +oldApproach: Vérification ternaire de null +modernApproach: requireNonNullElse() +summary: Obtenez une valeur non nulle avec une valeur par défaut claire, sans opérateur ternaire. +explanation: requireNonNullElse retourne le premier argument s'il n'est pas null, sinon le second. La valeur par défaut elle-même ne peut pas être null — elle lance NPE si les deux sont null, détectant les erreurs tôt. +whyModernWins: +- icon: �� + title: Intention claire + desc: Le nom de la méthode décrit exactement ce qu'elle fait. +- icon: 🛡️ + title: Valeur par défaut sûre + desc: La valeur par défaut est également vérifiée pour ne pas être null. +- icon: 📏 + title: Lisible + desc: Meilleur que l'opérateur ternaire pour la logique simple de null ou valeur par défaut. +support: + description: Disponible depuis JDK 9 (septembre 2017) diff --git a/translations/content/fr/io/deserialization-filters.yaml b/translations/content/fr/io/deserialization-filters.yaml new file mode 100644 index 0000000..c75efd5 --- /dev/null +++ b/translations/content/fr/io/deserialization-filters.yaml @@ -0,0 +1,18 @@ +--- +title: Filtres de désérialisation +oldApproach: Tout accepter +modernApproach: ObjectInputFilter +summary: Restreignez quelles classes peuvent être désérialisées pour prévenir les attaques. +explanation: ObjectInputFilter permet de créer des listes de classes autorisées et refusées, de limiter la profondeur du graphe d'objets, la taille des tableaux et le nombre de références. Cela défend contre les vulnérabilités de désérialisation sans avoir besoin de bibliothèques externes. +whyModernWins: +- icon: 🛡️ + title: Sécurité + desc: Prévient la désérialisation de classes inattendues ou malveillantes. +- icon: 📐 + title: Contrôle granulaire + desc: Contrôlez la profondeur, la taille des tableaux, les références et les patterns de classes. +- icon: 🏗️ + title: Au niveau JVM + desc: Établissez un filtre global pour toute la désérialisation dans la JVM. +support: + description: Disponible depuis JDK 9 (septembre 2017) diff --git a/translations/content/fr/io/file-memory-mapping.yaml b/translations/content/fr/io/file-memory-mapping.yaml new file mode 100644 index 0000000..fddaae0 --- /dev/null +++ b/translations/content/fr/io/file-memory-mapping.yaml @@ -0,0 +1,18 @@ +--- +title: Mapping de fichiers en mémoire +oldApproach: MappedByteBuffer +modernApproach: MemorySegment avec Arena +summary: Mappez des fichiers de plus de 2 Go avec un nettoyage déterministe en utilisant MemorySegment. +explanation: "L'API de fonctions étrangères et mémoire (JEP 454) introduit MemorySegment pour un accès mémoire sûr et efficace. Contrairement à MappedByteBuffer, MemorySegment supporte les fichiers de plus de 2 Go (Integer.MAX_VALUE), fournit un nettoyage déterministe via Arena, et offre de meilleures performances avec le matériel moderne." +whyModernWins: +- icon: 📏 + title: Sans limite de taille + desc: Mappez des fichiers de plus de 2 Go sans solutions de contournement. +- icon: 🔒 + title: Nettoyage déterministe + desc: Arena garantit que la mémoire est libérée à la sortie de la portée, pas lors du GC. +- icon: ⚡ + title: Meilleures performances + desc: Aligné avec les modèles de mémoire et le matériel modernes. +support: + description: Disponible depuis JDK 22 (mars 2024) diff --git a/translations/content/fr/io/files-mismatch.yaml b/translations/content/fr/io/files-mismatch.yaml new file mode 100644 index 0000000..e773685 --- /dev/null +++ b/translations/content/fr/io/files-mismatch.yaml @@ -0,0 +1,18 @@ +--- +title: Files.mismatch() +oldApproach: Comparaison manuelle d'octets +modernApproach: Files.mismatch() +summary: Compare deux fichiers efficacement sans les charger en mémoire. +explanation: Files.mismatch() retourne la position du premier octet qui diffère, ou -1 si les fichiers sont identiques. Lit de façon paresseuse et court-circuite à la première différence. +whyModernWins: +- icon: ⚡ + title: Efficace en mémoire + desc: Ne charge pas les fichiers entiers dans des tableaux d'octets. +- icon: 🎯 + title: Identifie la différence + desc: Retourne la position exacte de l'octet de la première divergence. +- icon: 📏 + title: Un seul appel + desc: Sans logique manuelle de comparaison de tableaux d'octets. +support: + description: Disponible depuis JDK 12 (mars 2019) diff --git a/translations/content/fr/io/http-client.yaml b/translations/content/fr/io/http-client.yaml new file mode 100644 index 0000000..ff20f50 --- /dev/null +++ b/translations/content/fr/io/http-client.yaml @@ -0,0 +1,18 @@ +--- +title: Client HTTP moderne +oldApproach: HttpURLConnection +modernApproach: HttpClient +summary: Utilisez le HttpClient intégré pour des requêtes HTTP propres et modernes. +explanation: "HttpClient supporte HTTP/1.1 et HTTP/2, les requêtes asynchrones, WebSocket, les executors personnalisés et le pooling de connexions. Fini le cast d'URLConnection ni la lecture manuelle d'InputStreams." +whyModernWins: +- icon: 📐 + title: API avec builder + desc: Builder fluide pour les requêtes, en-têtes et délais d'attente. +- icon: 🔄 + title: Support HTTP/2 + desc: HTTP/2 intégré avec multiplexage et server push. +- icon: ⚡ + title: Prêt pour l'asynchrone + desc: sendAsync() retourne un CompletableFuture. +support: + description: Disponible depuis JDK 11 (septembre 2018) diff --git a/translations/content/fr/io/inputstream-transferto.yaml b/translations/content/fr/io/inputstream-transferto.yaml new file mode 100644 index 0000000..02769a7 --- /dev/null +++ b/translations/content/fr/io/inputstream-transferto.yaml @@ -0,0 +1,18 @@ +--- +title: InputStream.transferTo() +oldApproach: Boucle de copie manuelle +modernApproach: transferTo() +summary: Copie un InputStream vers un OutputStream en un seul appel. +explanation: transferTo() lit tous les octets du flux d'entrée et les écrit dans le flux de sortie. Sans gestion de buffer, sans boucle. Utilise un buffer interne optimisé. +whyModernWins: +- icon: 📏 + title: Une ligne + desc: Remplace toute la boucle de lecture/écriture par un seul appel. +- icon: ⚡ + title: Optimisé + desc: La taille du buffer interne est ajustée pour des performances maximales. +- icon: 🛡️ + title: Sans erreurs + desc: Sans erreurs de décalage dans la gestion du buffer. +support: + description: Disponible depuis JDK 9 (septembre 2017) diff --git a/translations/content/fr/io/io-class-console-io.yaml b/translations/content/fr/io/io-class-console-io.yaml new file mode 100644 index 0000000..b1baaa0 --- /dev/null +++ b/translations/content/fr/io/io-class-console-io.yaml @@ -0,0 +1,18 @@ +--- +title: Classe IO pour les entrées/sorties console +oldApproach: System.out / Scanner +modernApproach: Classe IO +summary: La nouvelle classe IO fournit des méthodes simples et concises pour les entrées et sorties console. +explanation: Java 25 introduit la classe IO (java.io.IO) dans le cadre des fonctionnalités de classes déclarées implicitement. Elle fournit des méthodes statiques comme println(), print(), readln() et read() qui remplacent la combinaison verbose de System.out et Scanner. IO.readln(prompt) gère à la fois le message et la lecture en un seul appel. La classe est disponible automatiquement dans les fichiers source compacts et peut être utilisée dans les classes traditionnelles via import. +whyModernWins: +- icon: ✨ + title: Drastiquement plus simple + desc: Deux méthodes remplacent sept lignes de configuration, lecture et nettoyage de Scanner. +- icon: 🔒 + title: Sans fuites de ressources + desc: Sans Scanner à fermer — les méthodes d'IO gèrent les ressources en interne. +- icon: 🎓 + title: Convivial pour les débutants + desc: Les nouveaux développeurs peuvent faire des E/S console sans apprendre Scanner, System.out ni les instructions import. +support: + description: En aperçu dans JDK 25 comme partie des classes déclarées implicitement (JEP 495) diff --git a/translations/content/fr/io/path-of.yaml b/translations/content/fr/io/path-of.yaml new file mode 100644 index 0000000..c9cfa5a --- /dev/null +++ b/translations/content/fr/io/path-of.yaml @@ -0,0 +1,18 @@ +--- +title: Méthode factory Path.of() +oldApproach: Paths.get() +modernApproach: Path.of() +summary: Utilisez Path.of() — la méthode factory moderne dans l'interface Path. +explanation: Path.of() est une méthode factory ajoutée directement à l'interface Path, remplaçant la classe utilitaire Paths séparée. Elle est plus facile à découvrir et cohérente avec List.of(), Map.of(), etc. +whyModernWins: +- icon: 📐 + title: API cohérente + desc: Suit le pattern factory .of() comme List.of(), Set.of(). +- icon: 📖 + title: Facile à découvrir + desc: Se trouve dans le type Path lui-même, pas dans une classe Paths séparée. +- icon: 🧹 + title: Une classe de moins + desc: Pas besoin d'importer la classe utilitaire Paths. +support: + description: Disponible depuis JDK 11 (septembre 2018) diff --git a/translations/content/fr/io/reading-files.yaml b/translations/content/fr/io/reading-files.yaml new file mode 100644 index 0000000..8ad14a3 --- /dev/null +++ b/translations/content/fr/io/reading-files.yaml @@ -0,0 +1,18 @@ +--- +title: Lecture de fichiers +oldApproach: BufferedReader +modernApproach: Files.readString() +summary: Lit un fichier entier dans une String avec une seule ligne. +explanation: Files.readString() lit tout le contenu d'un fichier dans une String. Gère l'encodage (UTF-8 par défaut) et le nettoyage des ressources. Pour les grands fichiers, utilisez Files.lines() pour une lecture paresseuse en streaming. +whyModernWins: +- icon: 📏 + title: Une ligne + desc: Remplace 8 lignes de code répétitif avec BufferedReader. +- icon: 🧹 + title: Nettoyage automatique + desc: Le handle de fichier est fermé automatiquement. +- icon: 🌐 + title: UTF-8 par défaut + desc: Encodage correct par défaut — sans confusion de charset. +support: + description: Disponible depuis JDK 11 (septembre 2018) diff --git a/translations/content/fr/io/try-with-resources-effectively-final.yaml b/translations/content/fr/io/try-with-resources-effectively-final.yaml new file mode 100644 index 0000000..87bfff5 --- /dev/null +++ b/translations/content/fr/io/try-with-resources-effectively-final.yaml @@ -0,0 +1,18 @@ +--- +title: Amélioration de try-with-resources +oldApproach: Redéclarer la variable +modernApproach: Effectivement final +summary: Utilisez des variables effectivement finales directement dans try-with-resources. +explanation: Java 9 permet d'utiliser des variables effectivement finales directement dans try-with-resources sans avoir besoin de les redéclarer. C'est plus propre quand la ressource a été créée en dehors du bloc try. +whyModernWins: +- icon: 🧹 + title: Sans redéclaration + desc: Utilisez le nom de variable existant directement. +- icon: 📖 + title: Moins de confusion + desc: Sans nom de variable séparé à l'intérieur du bloc try. +- icon: 📏 + title: Concis + desc: Moins de lignes, la même sécurité des ressources. +support: + description: Disponible depuis JDK 9 (septembre 2017) diff --git a/translations/content/fr/io/writing-files.yaml b/translations/content/fr/io/writing-files.yaml new file mode 100644 index 0000000..7cd80dc --- /dev/null +++ b/translations/content/fr/io/writing-files.yaml @@ -0,0 +1,18 @@ +--- +title: Écriture de fichiers +oldApproach: FileWriter + BufferedWriter +modernApproach: Files.writeString() +summary: Écrit une String dans un fichier avec une seule ligne. +explanation: Files.writeString() écrit du contenu dans un fichier avec l'encodage UTF-8 par défaut. Des options peuvent être passées pour ajouter à la fin, créer, etc. +whyModernWins: +- icon: 📏 + title: Une ligne + desc: Sans besoin de wrapping de writers ni d'utilisation de try-with-resources. +- icon: 🛡️ + title: Valeurs par défaut sûres + desc: Encodage UTF-8, nettoyage approprié du handle de fichier. +- icon: 🔧 + title: Options + desc: Passez des flags OpenOption pour ajouter, créer, etc. +support: + description: Disponible depuis JDK 11 (septembre 2018) diff --git a/translations/content/fr/language/compact-canonical-constructor.yaml b/translations/content/fr/language/compact-canonical-constructor.yaml new file mode 100644 index 0000000..4d5decf --- /dev/null +++ b/translations/content/fr/language/compact-canonical-constructor.yaml @@ -0,0 +1,18 @@ +--- +title: Constructeur canonique compact +oldApproach: Validation explicite dans le constructeur +modernApproach: Constructeur compact +summary: Validez et normalisez les champs d'un record sans répéter la liste de paramètres. +explanation: "Les records peuvent déclarer un constructeur canonique compact qui omet la liste de paramètres et les affectations de champs. Le compilateur affecte automatiquement les paramètres aux champs après l'exécution de la logique de validation. Idéal pour les vérifications de préconditions, les copies défensives et la normalisation." +whyModernWins: +- icon: ✂️ + title: Moins de répétition + desc: "Pas besoin de répéter la liste de paramètres ni d'affecter chaque champ manuellement." +- icon: 🛡️ + title: Validation + desc: "Parfait pour les vérifications de null, la validation de plages et les copies défensives." +- icon: 📖 + title: Intention plus claire + desc: "La syntaxe compacte met l'accent sur la validation, pas sur le code répétitif." +support: + description: Disponible depuis JDK 16 (mars 2021) diff --git a/translations/content/fr/language/compact-source-files.yaml b/translations/content/fr/language/compact-source-files.yaml new file mode 100644 index 0000000..69b1e72 --- /dev/null +++ b/translations/content/fr/language/compact-source-files.yaml @@ -0,0 +1,18 @@ +--- +title: Fichiers source compacts +oldApproach: Cérémonie de classe Main +modernApproach: void main() +summary: "Écrivez un programme complet sans déclaration de classe ni public static void main." +explanation: "Les fichiers source compacts éliminent la cérémonie des déclarations de classe et de la signature de méthode main pour les programmes simples. Combiné avec l'import implicite de java.io.IO, même println est disponible directement." +whyModernWins: +- icon: 🚀 + title: Zéro cérémonie + desc: "Sans classe, sans public static void main, sans String[] args." +- icon: 🎓 + title: Convivial pour les débutants + desc: Les nouveaux programmeurs peuvent écrire du code utile dès la ligne 1. +- icon: 📝 + title: Style script + desc: Parfait pour les prototypes rapides, les scripts et les exemples. +support: + description: Finalisé dans JDK 25 LTS (JEP 512, sept. 2025). diff --git a/translations/content/fr/language/default-interface-methods.yaml b/translations/content/fr/language/default-interface-methods.yaml new file mode 100644 index 0000000..c3fcf3a --- /dev/null +++ b/translations/content/fr/language/default-interface-methods.yaml @@ -0,0 +1,18 @@ +--- +title: Méthodes default dans les interfaces +oldApproach: Classes abstraites pour le comportement partagé +modernApproach: Méthodes default dans les interfaces +summary: "Ajoutez des implémentations de méthodes directement dans les interfaces, permettant l'héritage multiple de comportement." +explanation: "Avant Java 8, partager du comportement entre des classes non liées nécessitait des classes abstraites, ce qui limitait à l'héritage simple. Les méthodes default permettent aux interfaces de fournir des implémentations, de sorte que les classes peuvent hériter de comportement de plusieurs interfaces. Cela était essentiel pour faire évoluer l'API Collections (ex. List.forEach, Map.getOrDefault) sans casser les implémentations existantes." +whyModernWins: +- icon: 🔀 + title: Héritage multiple + desc: "Les classes peuvent implémenter plusieurs interfaces avec des méthodes default, contrairement à l'héritage simple avec les classes abstraites." +- icon: 📦 + title: Évolution d'APIs + desc: Ajoutez de nouvelles méthodes aux interfaces sans casser les implémentations existantes. +- icon: 🧩 + title: Comportement composable + desc: Combinez librement des capacités de plusieurs interfaces. +support: + description: Disponible depuis JDK 8 (mars 2014). diff --git a/translations/content/fr/language/diamond-operator.yaml b/translations/content/fr/language/diamond-operator.yaml new file mode 100644 index 0000000..ed94748 --- /dev/null +++ b/translations/content/fr/language/diamond-operator.yaml @@ -0,0 +1,18 @@ +--- +title: Opérateur diamond avec les classes anonymes +oldApproach: Répéter les arguments de type +modernApproach: Diamond <> +summary: L'opérateur diamond fonctionne maintenant aussi avec les classes anonymes. +explanation: "Java 7 a introduit <> mais cela ne fonctionnait pas avec les classes internes anonymes. Java 9 a corrigé cela, de sorte que vous n'avez jamais besoin de répéter les arguments de type côté droit." +whyModernWins: +- icon: 📏 + title: Règles cohérentes + desc: "Diamond fonctionne partout : constructeurs et classes anonymes de la même façon." +- icon: 🧹 + title: Moins de redondance + desc: "Les arguments de type sont déclarés une fois à gauche, sans les répéter." +- icon: 🔧 + title: Principe DRY + desc: Le compilateur connaît déjà le type — pourquoi l'écrire deux fois ? +support: + description: Diamond avec classes anonymes depuis JDK 9 (sept. 2017). diff --git a/translations/content/fr/language/exhaustive-switch.yaml b/translations/content/fr/language/exhaustive-switch.yaml new file mode 100644 index 0000000..b995d0c --- /dev/null +++ b/translations/content/fr/language/exhaustive-switch.yaml @@ -0,0 +1,18 @@ +--- +title: switch exhaustif sans default +oldApproach: default obligatoire +modernApproach: Exhaustivité avec sealed +summary: "Le compilateur vérifie que tous les sous-types sealed sont couverts — pas de default nécessaire." +explanation: "En faisant un switch sur un type sealed, le compilateur connaît tous les sous-types possibles et vérifie que chaque cas est couvert. Si vous ajoutez un nouveau sous-type, le compilateur signale chaque switch incomplet." +whyModernWins: +- icon: ✅ + title: Sécurité à la compilation + desc: "Ajoutez un nouveau sous-type et le compilateur vous montre chaque endroit qui doit être mis à jour." +- icon: 🚫 + title: Sans code mort + desc: Sans branche default inaccessible qui cache des erreurs. +- icon: 📐 + title: Types algébriques + desc: sealed + records + switch exhaustif = ADTs complets en Java. +support: + description: Disponible depuis JDK 21 LTS (sept. 2023) diff --git a/translations/content/fr/language/flexible-constructor-bodies.yaml b/translations/content/fr/language/flexible-constructor-bodies.yaml new file mode 100644 index 0000000..541a9bf --- /dev/null +++ b/translations/content/fr/language/flexible-constructor-bodies.yaml @@ -0,0 +1,18 @@ +--- +title: Corps de constructeur flexibles +oldApproach: Valider après super() +modernApproach: Code avant super() +summary: Validez et calculez des valeurs avant d'appeler super() ou this(). +explanation: "Java 25 supprime la restriction selon laquelle super() doit être la première instruction. Vous pouvez maintenant valider des arguments, calculer des valeurs dérivées et préparer l'état avant de déléguer au constructeur parent." +whyModernWins: +- icon: 🛡️ + title: Échec rapide + desc: Validez les arguments avant que le constructeur de la superclasse s'exécute. +- icon: 🧮 + title: Calculer d'abord + desc: Dérivez des valeurs et préparez des données avant d'appeler super(). +- icon: 🧹 + title: Sans solutions de contournement + desc: "Plus besoin de méthodes statiques auxiliaires ni de patterns factory pour contourner la restriction." +support: + description: Finalisé dans JDK 25 LTS (JEP 513, sept. 2025). diff --git a/translations/content/fr/language/guarded-patterns.yaml b/translations/content/fr/language/guarded-patterns.yaml new file mode 100644 index 0000000..a7c6e69 --- /dev/null +++ b/translations/content/fr/language/guarded-patterns.yaml @@ -0,0 +1,18 @@ +--- +title: Patterns avec gardes when +oldApproach: if imbriqué +modernApproach: Clause when +summary: Ajoutez des conditions aux cas d'un pattern en utilisant des gardes when. +explanation: "Les patterns avec gardes permettent de raffiner une correspondance de type avec une condition booléenne supplémentaire. Cela maintient toute la logique de branchement dans le switch plutôt que d'imbriquer des instructions if dans les cas." +whyModernWins: +- icon: 🎯 + title: Correspondance précise + desc: Combine type + condition dans une seule étiquette de cas. +- icon: �� + title: Structure plate + desc: Sans if/else imbriqués à l'intérieur des cas du switch. +- icon: 📖 + title: Intention lisible + desc: La clause when se lit comme un langage naturel. +support: + description: Disponible depuis JDK 21 LTS (sept. 2023) diff --git a/translations/content/fr/language/markdown-javadoc-comments.yaml b/translations/content/fr/language/markdown-javadoc-comments.yaml new file mode 100644 index 0000000..45e613f --- /dev/null +++ b/translations/content/fr/language/markdown-javadoc-comments.yaml @@ -0,0 +1,18 @@ +--- +title: Markdown dans les commentaires Javadoc +oldApproach: Javadoc basé sur HTML +modernApproach: Javadoc en Markdown +summary: Écrivez des commentaires Javadoc en Markdown plutôt qu'en HTML pour une meilleure lisibilité. +explanation: "Java 23 introduit les commentaires Javadoc style /// en Markdown comme alternative au format traditionnel /** */ basé sur HTML. La syntaxe Markdown est plus naturelle à écrire et à lire, avec support des blocs de code, emphase, listes et liens. Le compilateur convertit le Markdown en HTML pour la sortie javadoc." +whyModernWins: +- icon: 📖 + title: Syntaxe naturelle + desc: "Utilisez des backticks pour le code inline et ``` pour les blocs au lieu des balises HTML." +- icon: ✍️ + title: Plus facile à écrire + desc: "Sans {@code},
, 

— écrivez simplement du Markdown." +- icon: 👁 + title: Meilleur dans les éditeurs + desc: Le Markdown se rendu parfaitement dans les IDEs et éditeurs de texte modernes. +support: + description: Disponible depuis JDK 23 (sept. 2024) diff --git a/translations/content/fr/language/module-import-declarations.yaml b/translations/content/fr/language/module-import-declarations.yaml new file mode 100644 index 0000000..6081d99 --- /dev/null +++ b/translations/content/fr/language/module-import-declarations.yaml @@ -0,0 +1,18 @@ +--- +title: Déclarations d'import de modules +oldApproach: Nombreux imports +modernApproach: import module +summary: Importez tous les packages exportés d'un module avec une seule déclaration. +explanation: "Les déclarations d'import de modules permettent d'importer tout ce qu'un module exporte avec une seule ligne. C'est particulièrement utile pour java.base, qui couvre les collections, l'E/S, les streams et plus encore." +whyModernWins: +- icon: 🧹 + title: Une seule ligne + desc: Remplace une longue liste d'imports par un seul import de module. +- icon: 📦 + title: Compatible avec les modules + desc: Tire parti du système de modules pour importer des ensembles cohérents de packages. +- icon: 🚀 + title: Démarrage rapide + desc: Parfait pour les scripts et prototypes où les listes d'imports sont fastidieuses. +support: + description: Finalisé dans JDK 25 LTS (JEP 511, sept. 2025). diff --git a/translations/content/fr/language/pattern-matching-instanceof.yaml b/translations/content/fr/language/pattern-matching-instanceof.yaml new file mode 100644 index 0000000..9729a0d --- /dev/null +++ b/translations/content/fr/language/pattern-matching-instanceof.yaml @@ -0,0 +1,18 @@ +--- +title: Pattern matching pour instanceof +oldApproach: instanceof + casting +modernApproach: Variable de pattern +summary: "Combine la vérification de type et le casting en une seule étape avec le pattern matching." +explanation: "Le pattern matching pour instanceof élimine le casting redondant après une vérification de type. La variable est automatiquement limitée à la portée où le pattern correspond, rendant le code plus sûr et concis." +whyModernWins: +- icon: 🔄 + title: Sans casting redondant + desc: "La vérification de type et la liaison de variable se font en une seule expression." +- icon: 📏 + title: Moins de lignes + desc: Une ligne au lieu de deux — la ligne de casting disparaît complètement. +- icon: 🛡️ + title: Portée sûre + desc: La variable de pattern n'est dans la portée que là où le type est garanti. +support: + description: Disponible depuis JDK 16 (mars 2021) diff --git a/translations/content/fr/language/pattern-matching-switch.yaml b/translations/content/fr/language/pattern-matching-switch.yaml new file mode 100644 index 0000000..48e6203 --- /dev/null +++ b/translations/content/fr/language/pattern-matching-switch.yaml @@ -0,0 +1,18 @@ +--- +title: Pattern matching dans switch +oldApproach: Chaîne if-else +modernApproach: Patterns de types +summary: Remplace les chaînes if-else avec instanceof par des patterns de types propres dans switch. +explanation: "Le pattern matching dans switch permet de faire correspondre des types directement, combinant la vérification de type, le casting et la liaison en une seule étiquette de cas concise. Le compilateur vérifie l'exhaustivité." +whyModernWins: +- icon: 📐 + title: Dispatch structuré + desc: Le switch rend la structure de branchement explicite et lisible d'un coup d'œil. +- icon: 🎯 + title: Forme d'expression + desc: Retourne une valeur directement — sans variable mutable nécessaire. +- icon: ✅ + title: Exhaustivité + desc: Le compilateur s'assure que tous les types sont couverts. +support: + description: Disponible depuis JDK 21 LTS (sept. 2023) diff --git a/translations/content/fr/language/primitive-types-in-patterns.yaml b/translations/content/fr/language/primitive-types-in-patterns.yaml new file mode 100644 index 0000000..e8992c2 --- /dev/null +++ b/translations/content/fr/language/primitive-types-in-patterns.yaml @@ -0,0 +1,18 @@ +--- +title: Types primitifs dans les patterns +oldApproach: Vérifications de plages manuelles +modernApproach: Patterns primitifs +summary: "Le pattern matching fonctionne maintenant avec les types primitifs, pas seulement avec les objets." +explanation: "Java 25 étend le pattern matching aux types primitifs. Vous pouvez utiliser int, long, double, etc. dans des patterns switch avec des gardes when, éliminant le besoin de boxing ou de vérifications de plages manuelles." +whyModernWins: +- icon: 📦 + title: Sans boxing + desc: Correspond à des primitifs directement — sans besoin du wrapper Integer. +- icon: 🎯 + title: Cohérence des patterns + desc: La même syntaxe de patterns pour les objets et les primitifs. +- icon: ⚡ + title: Meilleures performances + desc: Évite la surcharge de l'autoboxing dans le pattern matching. +support: + description: "Aperçu dans JDK 25 (troisième aperçu, JEP 507). Nécessite --enable-preview." diff --git a/translations/content/fr/language/private-interface-methods.yaml b/translations/content/fr/language/private-interface-methods.yaml new file mode 100644 index 0000000..8c4a328 --- /dev/null +++ b/translations/content/fr/language/private-interface-methods.yaml @@ -0,0 +1,18 @@ +--- +title: Méthodes privées dans les interfaces +oldApproach: Logique dupliquée +modernApproach: Méthodes privées +summary: Extrayez la logique partagée dans les interfaces en utilisant des méthodes privées. +explanation: "Java 9 permet les méthodes privées dans les interfaces, ce qui permet de partager du code entre les méthodes default sans exposer les détails d'implémentation aux classes qui les implémentent." +whyModernWins: +- icon: 🧩 + title: Réutilisation du code + desc: Partagez la logique entre les méthodes default sans duplication. +- icon: 🔐 + title: Encapsulation + desc: Les détails d'implémentation restent cachés aux classes implémentantes. +- icon: 🧹 + title: Interfaces DRY + desc: Fini le copier-coller entre les méthodes default. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/language/record-patterns.yaml b/translations/content/fr/language/record-patterns.yaml new file mode 100644 index 0000000..740536f --- /dev/null +++ b/translations/content/fr/language/record-patterns.yaml @@ -0,0 +1,18 @@ +--- +title: Patterns de record (déstructuration) +oldApproach: Accès manuel +modernApproach: Déstructuration +summary: Déstructurez des records directement dans les patterns — extrayez les champs en une seule étape. +explanation: "Les patterns de record permettent de décomposer les composants d'un record directement dans instanceof et switch. Les patterns imbriqués sont également supportés, permettant des correspondances profondes sans variables intermédiaires." +whyModernWins: +- icon: 🎯 + title: Extraction directe + desc: Accédez aux composants du record sans appeler les accesseurs manuellement. +- icon: 🪆 + title: Imbriquable + desc: "Les patterns peuvent être imbriqués — correspondez aux records internes en une seule expression." +- icon: 📏 + title: Code compact + desc: "Cinq lignes deviennent deux — moins de cérémonie, la même clarté." +support: + description: Disponible depuis JDK 21 LTS (sept. 2023) diff --git a/translations/content/fr/language/records-for-data-classes.yaml b/translations/content/fr/language/records-for-data-classes.yaml new file mode 100644 index 0000000..62f1cff --- /dev/null +++ b/translations/content/fr/language/records-for-data-classes.yaml @@ -0,0 +1,18 @@ +--- +title: Records pour les classes de données +oldApproach: POJO verbeux +modernApproach: record +summary: "Une ligne remplace plus de 30 lignes de code répétitif pour les porteurs de données immutables." +explanation: "Les records génèrent automatiquement le constructeur, les accesseurs (x(), y()), equals(), hashCode() et toString(). Ils sont immutables par conception et idéaux pour les DTOs, objets de valeur et le pattern matching." +whyModernWins: +- icon: ⚡ + title: Définition en une ligne + desc: "Une seule ligne remplace constructeur, getters, equals, hashCode et toString." +- icon: 🔒 + title: Immutable par défaut + desc: Tous les champs sont final — sans risque de setters. +- icon: 🧩 + title: Compatible avec les patterns + desc: Les records fonctionnent avec les patterns de déstructuration dans switch et instanceof. +support: + description: Disponible depuis JDK 16 (mars 2021) diff --git a/translations/content/fr/language/sealed-classes.yaml b/translations/content/fr/language/sealed-classes.yaml new file mode 100644 index 0000000..b8a4de9 --- /dev/null +++ b/translations/content/fr/language/sealed-classes.yaml @@ -0,0 +1,18 @@ +--- +title: Classes sealed pour les hiérarchies de types +oldApproach: Hiérarchie ouverte +modernApproach: sealed permits +summary: Restreignez quelles classes peuvent étendre un type — permettant des switchs exhaustifs. +explanation: "Les classes sealed définissent un ensemble fermé de sous-types. Le compilateur connaît tous les cas possibles, ce qui permet le pattern matching exhaustif sans branche default. Combinées avec les records, elles modélisent des types de données algébriques." +whyModernWins: +- icon: 🔐 + title: Hiérarchie contrôlée + desc: Seuls les sous-types autorisés peuvent étendre — sans sous-classes surprises. +- icon: ✅ + title: Correspondance exhaustive + desc: "Le compilateur vérifie que le switch couvre tous les cas, sans default nécessaire." +- icon: 📐 + title: Types de données algébriques + desc: Modélisez naturellement les types somme — sealed + records = ADTs en Java. +support: + description: Disponible depuis JDK 17 LTS (sept. 2021) diff --git a/translations/content/fr/language/static-members-in-inner-classes.yaml b/translations/content/fr/language/static-members-in-inner-classes.yaml new file mode 100644 index 0000000..e13e11c --- /dev/null +++ b/translations/content/fr/language/static-members-in-inner-classes.yaml @@ -0,0 +1,18 @@ +--- +title: Membres statiques dans les classes internes +oldApproach: Classe statique imbriquée requise +modernApproach: Membres statiques dans les classes internes +summary: "Définissez des membres statiques dans les classes internes sans avoir besoin de classes statiques imbriquées." +explanation: "Avant Java 16, seules les classes statiques imbriquées pouvaient contenir des membres statiques. Les classes internes (non statiques) ne pouvaient pas avoir de statiques car elles nécessitaient une instance englobante. Java 16 assouplit cette restriction, permettant des champs statiques, méthodes et même des types imbriqués dans les classes internes." +whyModernWins: +- icon: 🔓 + title: Plus de flexibilité + desc: Les classes internes peuvent maintenant avoir des membres statiques quand c'est nécessaire. +- icon: 🧩 + title: État partagé + desc: Suivez l'état partagé entre les instances d'une classe interne. +- icon: 🎨 + title: Liberté de conception + desc: Pas besoin de promouvoir en classe statique imbriquée juste pour un champ statique. +support: + description: Disponible depuis JDK 16 (mars 2021) diff --git a/translations/content/fr/language/static-methods-in-interfaces.yaml b/translations/content/fr/language/static-methods-in-interfaces.yaml new file mode 100644 index 0000000..740ddac --- /dev/null +++ b/translations/content/fr/language/static-methods-in-interfaces.yaml @@ -0,0 +1,18 @@ +--- +title: Méthodes statiques dans les interfaces +oldApproach: Classes utilitaires +modernApproach: Méthodes statiques dans les interfaces +summary: "Ajoutez des méthodes utilitaires statiques directement aux interfaces au lieu de classes utilitaires séparées." +explanation: "Avant Java 8, les méthodes utilitaires liées à une interface devaient résider dans une classe séparée (ex. Collections pour Collection). Les méthodes statiques dans les interfaces permettent de garder les utilitaires liés ensemble. C'est courant dans les APIs modernes comme Comparator.comparing(), Stream.of() et List.of()." +whyModernWins: +- icon: 📦 + title: Meilleure organisation + desc: "Gardez les utilitaires liés à l'interface, pas dans une classe séparée." +- icon: 🔍 + title: Découvrabilité + desc: Les méthodes factory et auxiliaires se trouvent là où vous les attendez. +- icon: 🧩 + title: Cohésion d'API + desc: Pas besoin de classes *Utils ou *Helper séparées. +support: + description: Disponible depuis JDK 8 (mars 2014) diff --git a/translations/content/fr/language/switch-expressions.yaml b/translations/content/fr/language/switch-expressions.yaml new file mode 100644 index 0000000..caca892 --- /dev/null +++ b/translations/content/fr/language/switch-expressions.yaml @@ -0,0 +1,18 @@ +--- +title: Expressions switch +oldApproach: Instruction switch +modernApproach: Expression switch +summary: "switch comme expression qui retourne une valeur — sans break, sans fall-through." +explanation: "Les expressions switch retournent une valeur directement, utilisent la syntaxe flèche pour éviter les erreurs de fall-through, et le compilateur vérifie l'exhaustivité. Cela remplace la forme d'instruction sujette aux erreurs." +whyModernWins: +- icon: 🎯 + title: Retourne une valeur + desc: Affectez le résultat du switch directement — sans variable temporaire. +- icon: 🛡️ + title: Sans fall-through + desc: "La syntaxe flèche élimine les erreurs accidentelles de fall-through par break manquant." +- icon: ✅ + title: Vérification d'exhaustivité + desc: Le compilateur s'assure que tous les cas sont couverts. +support: + description: Disponible depuis JDK 14 (mars 2020) diff --git a/translations/content/fr/language/text-blocks-for-multiline-strings.yaml b/translations/content/fr/language/text-blocks-for-multiline-strings.yaml new file mode 100644 index 0000000..c82e0f8 --- /dev/null +++ b/translations/content/fr/language/text-blocks-for-multiline-strings.yaml @@ -0,0 +1,18 @@ +--- +title: Blocs de texte pour les chaînes multiligne +oldApproach: Concaténation de chaînes +modernApproach: Blocs de texte +summary: "Écrivez des chaînes multiligne de façon naturelle avec des blocs de texte à triple guillemets." +explanation: "Les blocs de texte permettent d'écrire des chaînes multiligne exactement comme elles apparaissent. Fini d'échapper les guillemets ou d'ajouter \n. Le compilateur supprime automatiquement l'indentation accidentelle." +whyModernWins: +- icon: 📖 + title: Lisible tel quel + desc: "JSON, SQL et HTML ressemblent à de vrais JSON, SQL et HTML dans votre code source." +- icon: 🚫 + title: Sans enfer des échappements + desc: Les guillemets intégrés n'ont pas besoin d'antislash d'échappement. +- icon: 📐 + title: Indentation intelligente + desc: "Les espaces blancs initiaux sont rognés automatiquement selon la position du délimiteur de fermeture." +support: + description: Disponible depuis JDK 15 (sept. 2020) diff --git a/translations/content/fr/language/type-inference-with-var.yaml b/translations/content/fr/language/type-inference-with-var.yaml new file mode 100644 index 0000000..95c754a --- /dev/null +++ b/translations/content/fr/language/type-inference-with-var.yaml @@ -0,0 +1,18 @@ +--- +title: Inférence de type avec var +oldApproach: Types explicites +modernApproach: Mot-clé var +summary: "Utilisez var pour l'inférence de type dans les variables locales — moins de bruit, la même sécurité." +explanation: "Depuis Java 10, le compilateur infère les types des variables locales à partir du côté droit. Cela réduit le bruit visuel sans sacrifier la sécurité des types. Utilisez var quand le type est évident par le contexte." +whyModernWins: +- icon: ⚡ + title: Moins de code répétitif + desc: "Pas besoin de répéter les types génériques complexes des deux côtés de l'affectation." +- icon: 👁 + title: Meilleure lisibilité + desc: "Concentrez-vous sur les noms de variables et les valeurs, pas sur les déclarations de types." +- icon: 🔒 + title: Toujours sûr en termes de types + desc: Le compilateur infère et applique le type exact à la compilation. +support: + description: Disponible depuis JDK 10 (mars 2018) diff --git a/translations/content/fr/language/unnamed-variables.yaml b/translations/content/fr/language/unnamed-variables.yaml new file mode 100644 index 0000000..41d7fc8 --- /dev/null +++ b/translations/content/fr/language/unnamed-variables.yaml @@ -0,0 +1,18 @@ +--- +title: Variables sans nom avec _ +oldApproach: Variable inutilisée +modernApproach: Marqueur de position _ +summary: "Utilisez _ pour indiquer l'intention quand une variable est délibérément laissée inutilisée." +explanation: "Les variables sans nom communiquent aux lecteurs et aux outils qu'une valeur est délibérément ignorée. Fini les conventions de nommage comme 'ignored' ou 'unused', ni les avertissements de l'IDE." +whyModernWins: +- icon: 📢 + title: Intention claire + desc: _ dit explicitement 'cette valeur n'est pas nécessaire ici'. +- icon: 🔇 + title: Sans avertissements + desc: Les IDEs et linters ne signaleront pas les variables intentionnellement inutilisées. +- icon: 🧹 + title: Lambdas plus propres + desc: "Les lambdas avec plusieurs paramètres sont plus propres quand vous n'en avez besoin que de certains." +support: + description: Finalisé dans JDK 22 (JEP 456, mars 2024). diff --git a/translations/content/fr/security/key-derivation-functions.yaml b/translations/content/fr/security/key-derivation-functions.yaml new file mode 100644 index 0000000..950f1e7 --- /dev/null +++ b/translations/content/fr/security/key-derivation-functions.yaml @@ -0,0 +1,18 @@ +--- +title: Fonctions de dérivation de clés +oldApproach: PBKDF2 manuel +modernApproach: API KDF +summary: Dérivez des clés cryptographiques en utilisant l'API KDF standard. +explanation: "L'API KDF fournit une interface standard pour les fonctions de dérivation de clés, y compris HKDF. Elle remplace l'encombrant pattern SecretKeyFactory + PBEKeySpec par une API propre basée sur un builder." +whyModernWins: +- icon: 📐 + title: API propre + desc: Pattern builder au lieu de constructeurs encombrants de KeySpec. +- icon: 🔧 + title: Support HKDF + desc: Algorithme HKDF moderne aux côtés de PBKDF2. +- icon: 🛡️ + title: Standard + desc: API unifiée pour tous les algorithmes de dérivation de clés. +support: + description: Finalisé dans JDK 25 LTS (JEP 510, sept. 2025). diff --git a/translations/content/fr/security/pem-encoding.yaml b/translations/content/fr/security/pem-encoding.yaml new file mode 100644 index 0000000..daee2cb --- /dev/null +++ b/translations/content/fr/security/pem-encoding.yaml @@ -0,0 +1,18 @@ +--- +title: Encodage/décodage PEM +oldApproach: Base64 manuel + en-têtes +modernApproach: API PEM +summary: Encodez et décodez des objets cryptographiques au format PEM nativement. +explanation: "L'API PEM fournit un encodage/décodage standard pour les certificats, clés et autres objets cryptographiques au format PEM. Fini l'enveloppement manuel de Base64 avec des en-têtes BEGIN/END." +whyModernWins: +- icon: 🧹 + title: Sans Base64 manuel + desc: Les en-têtes PEM, le retour à la ligne et Base64 sont gérés automatiquement. +- icon: 🔄 + title: Bidirectionnel + desc: Encodez vers PEM et décodez depuis PEM avec une seule API. +- icon: 🛡️ + title: Format standard + desc: Produit une sortie PEM compatible RFC 7468. +support: + description: Aperçu dans JDK 25 (JEP 470). Nécessite --enable-preview. diff --git a/translations/content/fr/security/random-generator.yaml b/translations/content/fr/security/random-generator.yaml new file mode 100644 index 0000000..ce1b1c3 --- /dev/null +++ b/translations/content/fr/security/random-generator.yaml @@ -0,0 +1,18 @@ +--- +title: Interface RandomGenerator +oldApproach: new Random() / ThreadLocalRandom +modernApproach: Factory RandomGenerator +summary: Utilisez l'interface RandomGenerator pour choisir des algorithmes de nombres aléatoires par nom sans se coupler à une classe spécifique. +explanation: "JDK 17 a introduit RandomGenerator comme interface commune pour toutes les implémentations de générateurs de nombres aléatoires. Au lieu de coder en dur new Random() ou ThreadLocalRandom, vous pouvez sélectionner des algorithmes par nom via une factory, facilitant le changement entre des algorithmes optimisés pour différents cas d'utilisation (vitesse, qualité statistique, divisibilité)." +whyModernWins: +- icon: 🔧 + title: Agnostique à l'algorithme + desc: Choisissez le meilleur algorithme de génération aléatoire par nom sans changer la structure du code. +- icon: ⚡ + title: Meilleurs algorithmes + desc: Accès aux générateurs LXM modernes avec des propriétés statistiques supérieures. +- icon: 🔗 + title: API unifiée + desc: Une interface couvre Random, ThreadLocalRandom, SplittableRandom et plus. +support: + description: Disponible depuis JDK 17 (septembre 2021, JEP 356). diff --git a/translations/content/fr/security/strong-random.yaml b/translations/content/fr/security/strong-random.yaml new file mode 100644 index 0000000..f084543 --- /dev/null +++ b/translations/content/fr/security/strong-random.yaml @@ -0,0 +1,18 @@ +--- +title: Génération de nombres aléatoires forts +oldApproach: new SecureRandom() +modernApproach: getInstanceStrong() +summary: Obtient l'implémentation la plus forte de SecureRandom de la plateforme. +explanation: "getInstanceStrong() retourne l'implémentation de SecureRandom configurée comme la plus forte sur la plateforme. Cela est contrôlé par la propriété de sécurité securerandom.strongAlgorithms." +whyModernWins: +- icon: 🛡️ + title: La plus forte disponible + desc: Sélectionne automatiquement le meilleur algorithme pour la plateforme. +- icon: 📖 + title: Intention explicite + desc: Communique clairement qu'une aléatoire forte est requise. +- icon: 🔧 + title: Configurable + desc: Les administrateurs peuvent changer l'algorithme fort via les propriétés de sécurité. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/security/tls-default.yaml b/translations/content/fr/security/tls-default.yaml new file mode 100644 index 0000000..10c08c2 --- /dev/null +++ b/translations/content/fr/security/tls-default.yaml @@ -0,0 +1,18 @@ +--- +title: TLS 1.3 par défaut +oldApproach: Configuration manuelle de TLS +modernApproach: TLS 1.3 par défaut +summary: TLS 1.3 est activé par défaut — aucune configuration explicite du protocole n'est nécessaire. +explanation: "Java 11 a ajouté le support de TLS 1.3 et en a fait le protocole préféré. HttpClient l'utilise automatiquement. Fini de spécifier manuellement les versions de protocole pour les connexions sécurisées." +whyModernWins: +- icon: 🛡️ + title: Plus sécurisé + desc: TLS 1.3 élimine les suites de chiffrement obsolètes et les patterns de handshake. +- icon: ⚡ + title: Handshake plus rapide + desc: TLS 1.3 se complète en un aller-retour au lieu de deux. +- icon: 🆓 + title: Sans configuration + desc: Sécurisé par défaut — aucune sélection explicite de protocole nécessaire. +support: + description: Disponible depuis JDK 11 (sept. 2018) diff --git a/translations/content/fr/streams/collectors-flatmapping.yaml b/translations/content/fr/streams/collectors-flatmapping.yaml new file mode 100644 index 0000000..d65a9fb --- /dev/null +++ b/translations/content/fr/streams/collectors-flatmapping.yaml @@ -0,0 +1,18 @@ +--- +title: Collectors.flatMapping() +oldApproach: flatMap imbriqué +modernApproach: flatMapping() +summary: Utilisez flatMapping() pour aplatir à l'intérieur d'un collector de regroupement. +explanation: "Collectors.flatMapping() applique un mapping un-à-plusieurs comme un collector descendant. C'est l'équivalent dans les collectors de Stream.flatMap() — utile à l'intérieur de groupingBy ou partitioningBy." +whyModernWins: +- icon: 🧩 + title: Composable + desc: Fonctionne comme collector descendant à l'intérieur de groupingBy. +- icon: 📐 + title: Un seul passage + desc: Aplatit et regroupe en un seul parcours du stream. +- icon: 🔗 + title: Imbriquable + desc: Se combine avec d'autres collectors descendants. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/streams/optional-ifpresentorelse.yaml b/translations/content/fr/streams/optional-ifpresentorelse.yaml new file mode 100644 index 0000000..51c6837 --- /dev/null +++ b/translations/content/fr/streams/optional-ifpresentorelse.yaml @@ -0,0 +1,18 @@ +--- +title: Optional.ifPresentOrElse() +oldApproach: if/else sur Optional +modernApproach: ifPresentOrElse() +summary: Gérez les deux cas d'Optional, présent et vide, en un seul appel. +explanation: "ifPresentOrElse() reçoit un Consumer pour le cas présent et un Runnable pour le cas vide. Évite l'anti-pattern isPresent/get." +whyModernWins: +- icon: 📏 + title: Expression unique + desc: Les deux cas sont gérés en un seul appel de méthode. +- icon: 🚫 + title: Sans get() + desc: Élimine le dangereux pattern isPresent() + get(). +- icon: 🔗 + title: Fluide + desc: S'enchaîne naturellement après findUser() ou toute méthode qui retourne Optional. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/streams/optional-or.yaml b/translations/content/fr/streams/optional-or.yaml new file mode 100644 index 0000000..359507c --- /dev/null +++ b/translations/content/fr/streams/optional-or.yaml @@ -0,0 +1,18 @@ +--- +title: Optional.or() comme alternative +oldApproach: Alternative imbriquée +modernApproach: Chaîne .or() +summary: Enchaînez des alternatives d'Optional sans vérifications imbriquées. +explanation: "Optional.or() retourne l'Optional original s'il a une valeur, sinon évalue le supplier pour obtenir un Optional alternatif. Les suppliers sont paresseux — ils ne sont invoqués que si nécessaire." +whyModernWins: +- icon: 🔗 + title: Enchaînable + desc: Empilez des alternatives dans un pipeline lisible. +- icon: ⚡ + title: Évaluation paresseuse + desc: Les suppliers alternatifs ne s'exécutent que si nécessaire. +- icon: 📖 + title: Déclaratif + desc: "Se lit comme 'essayez le primaire, ou le secondaire, ou les valeurs par défaut'." +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/streams/predicate-not.yaml b/translations/content/fr/streams/predicate-not.yaml new file mode 100644 index 0000000..3535742 --- /dev/null +++ b/translations/content/fr/streams/predicate-not.yaml @@ -0,0 +1,18 @@ +--- +title: Predicate.not() pour la négation +oldApproach: Négation avec lambda +modernApproach: Predicate.not() +summary: Utilisez Predicate.not() pour nier des références de méthodes proprement au lieu d'écrire des lambdas enveloppants. +explanation: "Avant Java 11, nier une référence de méthode nécessitait de l'envelopper dans une lambda. Predicate.not() permet de nier n'importe quel prédicat directement, gardant le code lisible et cohérent avec le style de références de méthodes dans tout le pipeline de stream." +whyModernWins: +- icon: 👁 + title: Négation plus propre + desc: Pas besoin d'envelopper les références de méthodes dans des lambdas juste pour les nier. +- icon: 🔗 + title: Composable + desc: Fonctionne avec n'importe quel Predicate, permettant des chaînes de prédicats propres. +- icon: 📖 + title: Se lit naturellement + desc: Predicate.not(String::isBlank) se lit comme un langage naturel. +support: + description: Disponible depuis JDK 11 (septembre 2018). diff --git a/translations/content/fr/streams/stream-gatherers.yaml b/translations/content/fr/streams/stream-gatherers.yaml new file mode 100644 index 0000000..b223932 --- /dev/null +++ b/translations/content/fr/streams/stream-gatherers.yaml @@ -0,0 +1,18 @@ +--- +title: Stream gatherers +oldApproach: Collector personnalisé +modernApproach: gather() +summary: Utilisez des gatherers pour des opérations intermédiaires personnalisées dans les streams. +explanation: "Les gatherers sont une nouvelle opération intermédiaire de stream qui permet d'exprimer des transformations complexes comme des fenêtres glissantes, des groupes de taille fixe et des opérations de scan qui étaient impossibles avec les opérations standard de stream." +whyModernWins: +- icon: 🧩 + title: Composable + desc: Les gatherers se composent avec d'autres opérations de stream. +- icon: 📦 + title: Opérations intégrées + desc: windowFixed, windowSliding, fold, scan disponibles nativement. +- icon: 🔧 + title: Extensible + desc: Écrivez des gatherers personnalisés pour n'importe quelle transformation intermédiaire. +support: + description: Finalisé dans JDK 24 (JEP 485, mars 2025). diff --git a/translations/content/fr/streams/stream-iterate-predicate.yaml b/translations/content/fr/streams/stream-iterate-predicate.yaml new file mode 100644 index 0000000..2ed9a3a --- /dev/null +++ b/translations/content/fr/streams/stream-iterate-predicate.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.iterate() avec prédicat +oldApproach: iterate + limit +modernApproach: iterate(seed, pred, op) +summary: "Utilisez un prédicat pour arrêter l'itération — comme une boucle for sous forme de stream." +explanation: "Stream.iterate(seed, hasNext, next) à trois arguments fonctionne comme une boucle for : seed est le début, hasNext détermine quand s'arrêter et next produit la valeur suivante." +whyModernWins: +- icon: 🎯 + title: Terminaison naturelle + desc: S'arrête selon une condition, pas une limite arbitraire. +- icon: 📐 + title: Équivalent à for + desc: Même sémantique que for(seed; hasNext; next). +- icon: 🛡️ + title: Sans risque de stream infini + desc: Le prédicat garantit la terminaison. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/streams/stream-mapmulti.yaml b/translations/content/fr/streams/stream-mapmulti.yaml new file mode 100644 index 0000000..0d5f28e --- /dev/null +++ b/translations/content/fr/streams/stream-mapmulti.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.mapMulti() +oldApproach: flatMap + List +modernApproach: mapMulti() +summary: Émet zéro ou plusieurs éléments par entrée sans créer de streams intermédiaires. +explanation: "mapMulti() est une alternative impérative à flatMap qui évite de créer des objets Stream intermédiaires pour chaque élément. C'est plus efficace quand le mapping produit un petit nombre d'éléments." +whyModernWins: +- icon: ⚡ + title: Moins d'allocations + desc: Aucun Stream intermédiaire créé par élément. +- icon: 🎯 + title: Style impératif + desc: Utilisez des boucles et des conditionnels directement. +- icon: 📐 + title: Flexible + desc: Émettez zéro, un ou plusieurs éléments avec un contrôle total. +support: + description: Disponible depuis JDK 16 (mars 2021) diff --git a/translations/content/fr/streams/stream-of-nullable.yaml b/translations/content/fr/streams/stream-of-nullable.yaml new file mode 100644 index 0000000..80fe489 --- /dev/null +++ b/translations/content/fr/streams/stream-of-nullable.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.ofNullable() +oldApproach: Vérification de null +modernApproach: ofNullable() +summary: Crée un stream de zéro ou un élément à partir d'une valeur qui peut être null. +explanation: "Stream.ofNullable() retourne un stream d'un seul élément si la valeur n'est pas null, ou un stream vide si elle est null. Élimine le pattern de vérification ternaire de null." +whyModernWins: +- icon: 📏 + title: Concis + desc: Un seul appel remplace le conditionnel ternaire. +- icon: 🔗 + title: Compatible avec flatMap + desc: Parfait à l'intérieur de flatMap pour ignorer les valeurs null. +- icon: 🛡️ + title: Sûr contre null + desc: Sans risque de NPE — null est converti en stream vide. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/streams/stream-takewhile-dropwhile.yaml b/translations/content/fr/streams/stream-takewhile-dropwhile.yaml new file mode 100644 index 0000000..5276571 --- /dev/null +++ b/translations/content/fr/streams/stream-takewhile-dropwhile.yaml @@ -0,0 +1,18 @@ +--- +title: Stream takeWhile / dropWhile +oldApproach: Boucle manuelle +modernApproach: takeWhile/dropWhile +summary: Prenez ou abandonnez des éléments d'un stream selon un prédicat. +explanation: "takeWhile() retourne des éléments tant que le prédicat est vrai et s'arrête au premier faux. dropWhile() ignore les éléments tant que c'est vrai et retourne le reste. Les deux fonctionnent mieux sur les streams ordonnés." +whyModernWins: +- icon: 🎯 + title: Court-circuit + desc: Arrête le traitement dès que le prédicat échoue. +- icon: 🔗 + title: Compatible avec les pipelines + desc: S'enchaîne avec d'autres opérations de stream naturellement. +- icon: 📖 + title: Déclaratif + desc: "takeWhile se lit comme de l'anglais : 'prend tant que inférieur à 100'." +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/streams/stream-tolist.yaml b/translations/content/fr/streams/stream-tolist.yaml new file mode 100644 index 0000000..f084dbc --- /dev/null +++ b/translations/content/fr/streams/stream-tolist.yaml @@ -0,0 +1,18 @@ +--- +title: Stream.toList() +oldApproach: Collectors.toList() +modernApproach: .toList() +summary: Le terminal toList() remplace le verbose collect(Collectors.toList()). +explanation: "Stream.toList() retourne une liste non modifiable. C'est équivalent à .collect(Collectors.toUnmodifiableList()) mais beaucoup plus court. Note : le résultat est immutable, contrairement à Collectors.toList()." +whyModernWins: +- icon: 📏 + title: 7 caractères vs 24 + desc: .toList() remplace .collect(Collectors.toList()). +- icon: 🔒 + title: Immutable + desc: La liste résultante ne peut pas être modifiée. +- icon: 📖 + title: Fluide + desc: Se lit naturellement à la fin d'un pipeline. +support: + description: Disponible depuis JDK 16 (mars 2021) diff --git a/translations/content/fr/streams/virtual-thread-executor.yaml b/translations/content/fr/streams/virtual-thread-executor.yaml new file mode 100644 index 0000000..347a8eb --- /dev/null +++ b/translations/content/fr/streams/virtual-thread-executor.yaml @@ -0,0 +1,18 @@ +--- +title: Executor avec threads virtuels +oldApproach: Pool de threads fixe +modernApproach: Executor de threads virtuels +summary: Utilisez des executors de threads virtuels pour une concurrence légère illimitée. +explanation: "L'executor de threads virtuels crée un nouveau thread virtuel pour chaque tâche. Pas besoin de dimensionner le pool — les threads virtuels sont suffisamment économiques pour en créer des millions." +whyModernWins: +- icon: ♾️ + title: Sans dimensionnement + desc: Sans taille de pool à ajuster — créez autant de threads que nécessaire. +- icon: ⚡ + title: Léger + desc: Les threads virtuels utilisent des Ko de mémoire, pas des Mo. +- icon: 🧹 + title: Auto-closeable + desc: try-with-resources gère la fermeture automatiquement. +support: + description: Disponible depuis JDK 21 LTS (sept. 2023) diff --git a/translations/content/fr/strings/string-chars-stream.yaml b/translations/content/fr/strings/string-chars-stream.yaml new file mode 100644 index 0000000..7ec5b2f --- /dev/null +++ b/translations/content/fr/strings/string-chars-stream.yaml @@ -0,0 +1,18 @@ +--- +title: Caractères de String comme stream +oldApproach: Boucle manuelle +modernApproach: Stream de chars() +summary: Traitez les caractères d'une chaîne comme un pipeline de stream. +explanation: "String.chars() retourne un IntStream de valeurs de caractères, permettant un traitement fonctionnel. Pour le support Unicode, codePoints() gère correctement les caractères supplémentaires." +whyModernWins: +- icon: 🔗 + title: Enchaînable + desc: Utilisez filter, map, collect sur des streams de caractères. +- icon: 📐 + title: Déclaratif + desc: Décrivez ce qu'il faut faire, pas comment itérer. +- icon: 🌐 + title: Prêt pour Unicode + desc: codePoints() gère correctement les emojis et les caractères supplémentaires. +support: + description: Disponible depuis JDK 8+ (amélioré en 9+) diff --git a/translations/content/fr/strings/string-formatted.yaml b/translations/content/fr/strings/string-formatted.yaml new file mode 100644 index 0000000..b5c07c6 --- /dev/null +++ b/translations/content/fr/strings/string-formatted.yaml @@ -0,0 +1,18 @@ +--- +title: String.formatted() +oldApproach: String.format() +modernApproach: formatted() +summary: Appelez formatted() directement sur la chaîne de modèle. +explanation: "String.formatted() est une méthode d'instance équivalente à String.format() mais invoquée sur la chaîne de format. Elle se lit plus naturellement dans un flux de gauche à droite." +whyModernWins: +- icon: 📖 + title: Se lit naturellement + desc: Template.formatted(args) se déroule mieux que String.format(template, args). +- icon: 🔗 + title: Enchaînable + desc: Peut être enchaîné avec d'autres méthodes de String. +- icon: 📏 + title: Moins verbeux + desc: Élimine l'appel statique redondant à String.format(). +support: + description: Disponible depuis JDK 15 (sept. 2020) diff --git a/translations/content/fr/strings/string-indent-transform.yaml b/translations/content/fr/strings/string-indent-transform.yaml new file mode 100644 index 0000000..61c7420 --- /dev/null +++ b/translations/content/fr/strings/string-indent-transform.yaml @@ -0,0 +1,18 @@ +--- +title: String.indent() et transform() +oldApproach: Indentation manuelle +modernApproach: indent() / transform() +summary: Indentez du texte et enchaînez des transformations de chaînes de façon fluide. +explanation: "indent(n) ajoute n espaces à chaque ligne. transform(fn) applique n'importe quelle fonction et retourne le résultat, permettant un enchaînement fluide d'opérations sur les chaînes." +whyModernWins: +- icon: 📏 + title: Intégré + desc: L'indentation est une opération courante — maintenant c'est un seul appel. +- icon: 🔗 + title: Enchaînable + desc: transform() permet des pipelines fluides sur les chaînes. +- icon: 🧹 + title: Code propre + desc: Sans séparation manuelle de lignes ni boucles avec StringBuilder. +support: + description: Disponible depuis JDK 12 (mars 2019) diff --git a/translations/content/fr/strings/string-isblank.yaml b/translations/content/fr/strings/string-isblank.yaml new file mode 100644 index 0000000..f19f42e --- /dev/null +++ b/translations/content/fr/strings/string-isblank.yaml @@ -0,0 +1,18 @@ +--- +title: String.isBlank() +oldApproach: trim().isEmpty() +modernApproach: isBlank() +summary: Vérifiez si une chaîne est vide avec un seul appel de méthode. +explanation: "isBlank() retourne true si la chaîne est vide ou ne contient que des espaces blancs, y compris les caractères d'espace Unicode que trim() ne détecte pas." +whyModernWins: +- icon: 📖 + title: Auto-documenté + desc: isBlank() dit exactement ce qu'il vérifie. +- icon: 🌐 + title: Compatible Unicode + desc: Gère tous les espaces blancs Unicode, pas seulement ASCII. +- icon: ⚡ + title: Sans allocation + desc: Aucune chaîne intermédiaire rognée n'est créée. +support: + description: Disponible depuis JDK 11 (sept. 2018) diff --git a/translations/content/fr/strings/string-lines.yaml b/translations/content/fr/strings/string-lines.yaml new file mode 100644 index 0000000..8653028 --- /dev/null +++ b/translations/content/fr/strings/string-lines.yaml @@ -0,0 +1,18 @@ +--- +title: String.lines() pour diviser les lignes +oldApproach: split("\\n") +modernApproach: lines() +summary: Utilisez String.lines() pour diviser du texte en un stream de lignes sans la surcharge des expressions régulières. +explanation: "String.lines() retourne un Stream de lignes divisées par \n, \r ou \r\n. C'est plus paresseux et efficace que split(), évite la compilation de regex et s'intègre naturellement avec l'API Stream pour le traitement ultérieur." +whyModernWins: +- icon: ⚡ + title: Streaming paresseux + desc: Les lignes sont produites à la demande, pas toutes à la fois comme split(). +- icon: 🔧 + title: Fins de ligne universelles + desc: "Gère \n, \r et \r\n automatiquement sans regex." +- icon: 🔗 + title: Intégration avec Stream + desc: Retourne un Stream pour utilisation directe avec filter, map, collect. +support: + description: Disponible depuis JDK 11 (septembre 2018). diff --git a/translations/content/fr/strings/string-repeat.yaml b/translations/content/fr/strings/string-repeat.yaml new file mode 100644 index 0000000..991abe0 --- /dev/null +++ b/translations/content/fr/strings/string-repeat.yaml @@ -0,0 +1,18 @@ +--- +title: String.repeat() +oldApproach: Boucle avec StringBuilder +modernApproach: repeat() +summary: Répète une chaîne n fois sans boucle. +explanation: "String.repeat(int) retourne la chaîne concaténée avec elle-même n fois. Gère les cas limites : repeat(0) retourne une chaîne vide, repeat(1) retourne la même chaîne." +whyModernWins: +- icon: 📏 + title: Une seule ligne + desc: Remplace 5 lignes de code avec StringBuilder par un seul appel. +- icon: ⚡ + title: Optimisé + desc: L'implémentation interne est optimisée pour les grandes répétitions. +- icon: 📖 + title: Intention claire + desc: repeat(3) transmet immédiatement l'objectif. +support: + description: Disponible depuis JDK 11 (sept. 2018) diff --git a/translations/content/fr/strings/string-strip.yaml b/translations/content/fr/strings/string-strip.yaml new file mode 100644 index 0000000..7678de6 --- /dev/null +++ b/translations/content/fr/strings/string-strip.yaml @@ -0,0 +1,18 @@ +--- +title: String.strip() vs trim() +oldApproach: trim() +modernApproach: strip() +summary: "Utilisez la suppression d'espaces compatible Unicode avec strip(), stripLeading(), stripTrailing()." +explanation: "trim() ne supprime que les caractères ≤ U+0020 (caractères de contrôle ASCII et espace). strip() utilise Character.isWhitespace() qui gère les espaces Unicode comme l'espace insécable, l'espace idéographique, etc." +whyModernWins: +- icon: 🌐 + title: Correct pour Unicode + desc: Gère tous les caractères d'espace de tous les scripts. +- icon: 🎯 + title: Directionnel + desc: stripLeading() et stripTrailing() pour le rognage d'un seul côté. +- icon: 🛡️ + title: Moins d'erreurs + desc: Sans espaces blancs inattendus dans le texte international. +support: + description: Disponible depuis JDK 11 (sept. 2018) diff --git a/translations/content/fr/tooling/aot-class-preloading.yaml b/translations/content/fr/tooling/aot-class-preloading.yaml new file mode 100644 index 0000000..0bcbea5 --- /dev/null +++ b/translations/content/fr/tooling/aot-class-preloading.yaml @@ -0,0 +1,18 @@ +--- +title: Préchargement de classes AOT +oldApproach: Démarrage à froid à chaque fois +modernApproach: Cache AOT +summary: Mettez en cache le chargement et la compilation des classes pour un démarrage instantané. +explanation: "Le préchargement de classes AOT met en cache les classes chargées et liées d'une exécution d'entraînement. Lors des démarrages suivants, les classes sont chargées depuis le cache, sautant la vérification et la liaison. Combiné avec la compilation AOT, cela réduit drastiquement le temps de démarrage." +whyModernWins: +- icon: ⚡ + title: Démarrage plus rapide + desc: Saute le chargement, la vérification et la liaison des classes. +- icon: 📦 + title: État en cache + desc: L'exécution d'entraînement capture l'état idéal des classes. +- icon: 🔧 + title: Sans changements de code + desc: Fonctionne avec les applications existantes — ajoutez simplement des flags JVM. +support: + description: Disponible comme fonctionnalité standard dans JDK 25 LTS (JEPs 514/515, sept. 2025). diff --git a/translations/content/fr/tooling/built-in-http-server.yaml b/translations/content/fr/tooling/built-in-http-server.yaml new file mode 100644 index 0000000..e2c9d73 --- /dev/null +++ b/translations/content/fr/tooling/built-in-http-server.yaml @@ -0,0 +1,18 @@ +--- +title: Serveur HTTP intégré +oldApproach: Serveur externe / framework +modernApproach: CLI jwebserver +summary: Java 18 inclut un serveur HTTP minimal intégré pour le prototypage et le service de fichiers. +explanation: "JDK 18 a ajouté un serveur HTTP de fichiers simple et sans dépendances, accessible via l'outil de ligne de commande jwebserver ou l'API SimpleFileServer. Il sert des fichiers statiques depuis un répertoire donné sans configuration. L'outil CLI est idéal pour le prototypage rapide, les tests et le partage de fichiers ad-hoc — sans dépendances externes ni frameworks nécessaires. L'API permet une utilisation programmatique avec des gestionnaires personnalisables et des niveaux de sortie." +whyModernWins: +- icon: 🚀 + title: Sans configuration + desc: Exécutez jwebserver dans n'importe quel répertoire — sans installation, configuration ni dépendances nécessaires. +- icon: 📦 + title: Intégré dans le JDK + desc: Distribué avec chaque installation de JDK 18+, toujours disponible sur n'importe quelle machine avec Java. +- icon: 🧪 + title: Idéal pour le prototypage + desc: Sert des fichiers statiques instantanément pour tester du HTML, des APIs ou le développement front-end. +support: + description: Disponible depuis JDK 18 (mars 2022) diff --git a/translations/content/fr/tooling/compact-object-headers.yaml b/translations/content/fr/tooling/compact-object-headers.yaml new file mode 100644 index 0000000..2d749b5 --- /dev/null +++ b/translations/content/fr/tooling/compact-object-headers.yaml @@ -0,0 +1,18 @@ +--- +title: En-têtes d'objets compacts +oldApproach: En-têtes de 128 bits +modernApproach: En-têtes de 64 bits +summary: Réduit de moitié la taille des en-têtes d'objets pour une meilleure densité mémoire et utilisation du cache. +explanation: "Les en-têtes d'objets compacts réduisent la surcharge par objet de 128 bits à 64 bits sur les plateformes 64 bits. Cela économise de la mémoire et améliore l'utilisation du cache, surtout pour les applications avec de nombreux petits objets." +whyModernWins: +- icon: 📦 + title: En-têtes 50% plus petits + desc: 8 octets au lieu de 16 par objet. +- icon: ⚡ + title: Meilleure utilisation du cache + desc: Plus d'objets tiennent dans les lignes de cache du CPU. +- icon: 📊 + title: Densité accrue + desc: Plus d'objets tiennent dans la même taille de heap. +support: + description: Finalisé dans JDK 25 LTS (JEP 519, sept. 2025). diff --git a/translations/content/fr/tooling/jfr-profiling.yaml b/translations/content/fr/tooling/jfr-profiling.yaml new file mode 100644 index 0000000..d2d0024 --- /dev/null +++ b/translations/content/fr/tooling/jfr-profiling.yaml @@ -0,0 +1,18 @@ +--- +title: JFR pour le profilage +oldApproach: Profileur externe +modernApproach: Java Flight Recorder +summary: "Profilez n'importe quelle application Java avec le Flight Recorder intégré — sans outils externes." +explanation: "Java Flight Recorder (JFR) est un outil de profilage à faible surcharge intégré dans la JVM. Il capture les événements CPU, mémoire, GC, E/S, threads et événements personnalisés avec un impact minimal sur les performances (~1%)." +whyModernWins: +- icon: 🆓 + title: Intégré + desc: Sans profileur externe à installer ou licencier. +- icon: ⚡ + title: Faible surcharge + desc: ~1% d'impact sur les performances — sûr pour la production. +- icon: 📊 + title: Événements riches + desc: CPU, mémoire, GC, threads, E/S, verrous et événements personnalisés. +support: + description: Disponible depuis JDK 9/11 (open source en 11) diff --git a/translations/content/fr/tooling/jshell-prototyping.yaml b/translations/content/fr/tooling/jshell-prototyping.yaml new file mode 100644 index 0000000..21c61aa --- /dev/null +++ b/translations/content/fr/tooling/jshell-prototyping.yaml @@ -0,0 +1,18 @@ +--- +title: JShell pour le prototypage +oldApproach: Créer un fichier + compiler + exécuter +modernApproach: REPL JShell +summary: Testez des expressions Java de façon interactive sans créer de fichiers. +explanation: "JShell est une boucle lecture-évaluation-impression pour Java. Testez des expressions, expérimentez avec des APIs et prototypez du code sans créer de fichiers, compiler ni écrire de méthode main. Inclut la complétion automatique par tabulation et la documentation en ligne." +whyModernWins: +- icon: ⚡ + title: Retour instantané + desc: Écrivez une expression et voyez le résultat immédiatement. +- icon: 📝 + title: Sans fichiers nécessaires + desc: Sans fichiers .java, sans étape de compilation. +- icon: 🔍 + title: Exploration d'APIs + desc: La complétion par tabulation aide à découvrir les méthodes et paramètres. +support: + description: Disponible depuis JDK 9 (sept. 2017) diff --git a/translations/content/fr/tooling/junit6-with-jspecify.yaml b/translations/content/fr/tooling/junit6-with-jspecify.yaml new file mode 100644 index 0000000..9decc7f --- /dev/null +++ b/translations/content/fr/tooling/junit6-with-jspecify.yaml @@ -0,0 +1,18 @@ +--- +title: JUnit 6 avec sécurité de nuls JSpecify +oldApproach: API sans annotations +modernApproach: API @NullMarked +summary: JUnit 6 adopte @NullMarked de JSpecify, rendant explicites les contrats de nuls dans toute son API d'assertions. +explanation: "JUnit 5 a été distribué sans annotations de nullabilité standardisées, laissant les développeurs deviner si les paramètres d'assertion ou les valeurs de retour pouvaient être null. JUnit 6 adopte JSpecify dans tout son module : l'annotation @NullMarked rend tous les types non annotés non-nuls par défaut, et @Nullable marque les exceptions. La classe Assertions annote explicitement les paramètres comme assertNull(@Nullable Object actual) et fail(@Nullable String message), pour que les IDEs et analyseurs statiques comme NullAway et Error Prone puissent détecter le mauvais usage de null à la compilation plutôt qu'à l'exécution." +whyModernWins: +- icon: 📜 + title: Contrats explicites + desc: "@NullMarked dans le module de JUnit 6 documente la sémantique des nuls directement dans l'API — sans besoin de lire le code source." +- icon: 🛡️ + title: Sécurité à la compilation + desc: Les IDEs et analyseurs alertent quand null est passé là où non-null est attendu, détectant les erreurs avant l'exécution des tests. +- icon: 🌐 + title: Standard de l'écosystème + desc: JSpecify est adopté par Spring, Guava et d'autres — sémantique de nuls cohérente dans toute votre pile. +support: + description: Disponible depuis JUnit 6.0 (octobre 2025, nécessite Java 17+) diff --git a/translations/content/fr/tooling/multi-file-source.yaml b/translations/content/fr/tooling/multi-file-source.yaml new file mode 100644 index 0000000..682a8fb --- /dev/null +++ b/translations/content/fr/tooling/multi-file-source.yaml @@ -0,0 +1,18 @@ +--- +title: Lanceur de code source multi-fichiers +oldApproach: Tout compiler d'abord +modernApproach: Lanceur de code source +summary: Lancez des programmes multi-fichiers sans étape de compilation explicite. +explanation: "Java 22+ peut compiler automatiquement les fichiers source référencés lors du lancement depuis un fichier .java. Cela rend les petits programmes multi-fichiers aussi faciles à exécuter que des scripts, sans besoin de Maven ou Gradle." +whyModernWins: +- icon: 🚀 + title: Sans configuration + desc: Aucun outil de build nécessaire pour les petits programmes multi-fichiers. +- icon: 🔗 + title: Résolution automatique + desc: Les classes référencées sont trouvées et compilées automatiquement. +- icon: 📝 + title: Comme un script + desc: Exécutez des programmes multi-fichiers comme des scripts. +support: + description: Disponible depuis JDK 22 (mars 2024) diff --git a/translations/content/fr/tooling/single-file-execution.yaml b/translations/content/fr/tooling/single-file-execution.yaml new file mode 100644 index 0000000..a332620 --- /dev/null +++ b/translations/content/fr/tooling/single-file-execution.yaml @@ -0,0 +1,18 @@ +--- +title: Exécution d'un fichier unique +oldApproach: Compilation en deux étapes +modernApproach: Lancement direct +summary: Exécutez des programmes Java à fichier unique directement sans javac. +explanation: "Le lanceur Java peut compiler et exécuter un fichier source unique en une seule commande. Combiné avec le support shebang sous Unix, les fichiers Java peuvent fonctionner comme des scripts. Aucune étape de compilation séparée n'est nécessaire." +whyModernWins: +- icon: ⚡ + title: Une seule commande + desc: java Fichier.java compile et exécute en une seule étape. +- icon: 📝 + title: Comme un script + desc: Ajoutez une ligne shebang pour rendre les fichiers .java exécutables comme des scripts. +- icon: 🎓 + title: Convivial pour l'apprentissage + desc: Les débutants exécutent du code immédiatement sans apprendre les outils de build. +support: + description: Disponible depuis JDK 11 (sept. 2018) diff --git a/translations/strings/fr.yaml b/translations/strings/fr.yaml new file mode 100644 index 0000000..e664bc7 --- /dev/null +++ b/translations/strings/fr.yaml @@ -0,0 +1,83 @@ +site: + title: java.evolved + tagline: Java a évolué. Votre code aussi peut. + tagline_line1: Java a évolué. + tagline_line2: Votre code aussi peut. + description: Une collection de snippets Java modernes. Chaque ancien pattern Java + à côté de son remplacement moderne et propre — côte à côte. + heroSnippetCount: ✦ {{snippetCount}} patterns modernes · Java 8 → Java 25 + heroOld: Ancien + heroModern: Moderne + allComparisons: Toutes les comparaisons + snippetsBadge: '{{snippetCount}} snippets' +nav: + allPatterns: ← Tous les patterns + toggleTheme: Changer le thème + viewOnGitHub: Voir sur GitHub + selectLanguage: Sélectionner la langue +breadcrumb: + home: Accueil +sections: + codeComparison: Comparaison de Code + whyModernWins: Pourquoi la méthode moderne gagne + oldApproach: Ancienne Approche + modernApproach: Approche Moderne + sinceJdk: Depuis JDK + difficulty: Difficulté + jdkSupport: Support JDK + howItWorks: Comment ça fonctionne + relatedDocs: Documentation Associée + relatedPatterns: Patterns associés +filters: + show: 'Afficher :' + all: Tous +difficulty: + beginner: Débutant + intermediate: Intermédiaire + advanced: Avancé +search: + placeholder: Rechercher des snippets… + noResults: Aucun résultat trouvé. + esc: ESC + searchTrigger: Rechercher… + navigate: naviguer + open: ouvrir + close: fermer +cards: + old: Ancien + modern: Moderne + hoverHint: survolez pour voir le moderne → + hoverHintRelated: Survolez pour voir le moderne ➜ + touchHint: 👆 appuyez ou glissez → +copy: + copy: Copier + copied: Copié ! +share: + label: Partager +view: + expandAll: Tout développer + collapseAll: Tout réduire +stats: + modernPatterns: Patterns Modernes + jdkVersions: Versions JDK Couvertes + categories: Catégories + linesOfPython: Lignes de Python Requises +footer: + tagline: Java a évolué. Votre code aussi peut. + madeWith: Fait avec ❤️ par + and: et + inspiredBy: Inspiré par + viewOnGitHub: Voir sur GitHub +copilot: + headline: Modernisez votre code Java avec GitHub Copilot. + description: Laissez Copilot vous aider à migrer les patterns legacy vers Java moderne + — automatiquement. + appModernization: Modernisation d'App → + javaGuide: Guide Java → +support: + available: Disponible + preview: Aperçu + experimental: Expérimental +untranslated: + notice: Cette page n'a pas encore été traduite en {{localeName}}. + viewInEnglish: Voir en Anglais