Le lot plugin B-bis (1.15.2+etm15) est sur .75 et GetLoadConfig/GetLoadTelemetry concordent : les critères 4 à 8 du brief deviennent atteignables. - models/load_telemetry.dart : vue en lecture. timestamp/budget/mechanism/lock/ faultCode nullables — omis porte un sens que zéro ne porterait pas. - services/telemetry_text.dart : rendu français des CODES (19 motifs, 3 défauts, 3 verrous, 4 mécanismes). Repli lisible sur un code inconnu ET sur un code connu privé d'un paramètre : une phrase trouée a l'air d'une donnée, le code brut a l'air de ce qu'il est. - providers/load_telemetry_provider.dart : instantané + LoadTelemetryChanged, fraîcheur à trois signaux (âge du timestamp, silence des trames, timestamp qui cesse d'avancer), machine à états de ClearLoadFault qui ne conclut JAMAIS sur l'acquittement du RPC. - load_config_provider : assignDomain() en brouillon, énumération fermée. - load_order_screen : budget, fraîcheur, mode dégradé, bloc par charge, encart défaut, menu de domaine. - nymea_service : getLoadTelemetry(), clearLoadFault(), aiguillage de la notification. Une box sans la méthode s'annonce comme telle, pas comme en panne. Seuil de fraîcheur à 180 s : le battement de cœur du plugin est de 60 s et le timestamp avance d'un cycle par minute. Un seuil plus court crierait « données anciennes » sur une installation vivante. Fixtures v3 prises sur .75 après déploiement, dont un cycle porteur d'un verrou — « lock » étant optionnel, un dump pris au mauvais moment ne l'éprouverait pas. 57 tests (30 avant), flutter analyze inchangé à 25 issues. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XPUo3RMr8SzK6qbFtfBm8H
743 lines
24 KiB
Dart
743 lines
24 KiB
Dart
import 'dart:async';
|
||
|
||
import 'package:flutter/foundation.dart';
|
||
import 'package:flutter/widgets.dart';
|
||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||
import 'package:intl/intl.dart' as intl;
|
||
|
||
import 'app_localizations_fr.dart';
|
||
|
||
// ignore_for_file: type=lint
|
||
|
||
/// Callers can lookup localized strings with an instance of L10n
|
||
/// returned by `L10n.of(context)`.
|
||
///
|
||
/// Applications need to include `L10n.delegate()` in their app's
|
||
/// `localizationDelegates` list, and the locales they support in the app's
|
||
/// `supportedLocales` list. For example:
|
||
///
|
||
/// ```dart
|
||
/// import 'l10n/app_localizations.dart';
|
||
///
|
||
/// return MaterialApp(
|
||
/// localizationsDelegates: L10n.localizationsDelegates,
|
||
/// supportedLocales: L10n.supportedLocales,
|
||
/// home: MyApplicationHome(),
|
||
/// );
|
||
/// ```
|
||
///
|
||
/// ## Update pubspec.yaml
|
||
///
|
||
/// Please make sure to update your pubspec.yaml to include the following
|
||
/// packages:
|
||
///
|
||
/// ```yaml
|
||
/// dependencies:
|
||
/// # Internationalization support.
|
||
/// flutter_localizations:
|
||
/// sdk: flutter
|
||
/// intl: any # Use the pinned version from flutter_localizations
|
||
///
|
||
/// # Rest of dependencies
|
||
/// ```
|
||
///
|
||
/// ## iOS Applications
|
||
///
|
||
/// iOS applications define key application metadata, including supported
|
||
/// locales, in an Info.plist file that is built into the application bundle.
|
||
/// To configure the locales supported by your app, you’ll need to edit this
|
||
/// file.
|
||
///
|
||
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
|
||
/// Then, in the Project Navigator, open the Info.plist file under the Runner
|
||
/// project’s Runner folder.
|
||
///
|
||
/// Next, select the Information Property List item, select Add Item from the
|
||
/// Editor menu, then select Localizations from the pop-up menu.
|
||
///
|
||
/// Select and expand the newly-created Localizations item then, for each
|
||
/// locale your application supports, add a new item and select the locale
|
||
/// you wish to add from the pop-up menu in the Value field. This list should
|
||
/// be consistent with the languages listed in the L10n.supportedLocales
|
||
/// property.
|
||
abstract class L10n {
|
||
L10n(String locale)
|
||
: localeName = intl.Intl.canonicalizedLocale(locale.toString());
|
||
|
||
final String localeName;
|
||
|
||
static L10n? of(BuildContext context) {
|
||
return Localizations.of<L10n>(context, L10n);
|
||
}
|
||
|
||
static const LocalizationsDelegate<L10n> delegate = _L10nDelegate();
|
||
|
||
/// A list of this localizations delegate along with the default localizations
|
||
/// delegates.
|
||
///
|
||
/// Returns a list of localizations delegates containing this delegate along with
|
||
/// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
|
||
/// and GlobalWidgetsLocalizations.delegate.
|
||
///
|
||
/// Additional delegates can be added by appending to this list in
|
||
/// MaterialApp. This list does not have to be used at all if a custom list
|
||
/// of delegates is preferred or required.
|
||
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
|
||
<LocalizationsDelegate<dynamic>>[
|
||
delegate,
|
||
GlobalMaterialLocalizations.delegate,
|
||
GlobalCupertinoLocalizations.delegate,
|
||
GlobalWidgetsLocalizations.delegate,
|
||
];
|
||
|
||
/// A list of this localizations delegate's supported locales.
|
||
static const List<Locale> supportedLocales = <Locale>[Locale('fr')];
|
||
|
||
/// Titre de l'écran installateur de configuration des charges pilotables
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Rôles & appareils'**
|
||
String get installerLoadsTitle;
|
||
|
||
/// No description provided for @installerLoadsSubtitle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Ordre de service des charges pilotables'**
|
||
String get installerLoadsSubtitle;
|
||
|
||
/// No description provided for @loadsEmpty.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Aucune charge pilotable déclarée sur cette installation.'**
|
||
String get loadsEmpty;
|
||
|
||
/// No description provided for @loadsLoadError.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Lecture de la configuration impossible : {error}'**
|
||
String loadsLoadError(String error);
|
||
|
||
/// Bucket des charges sans o:domain — jamais rangées d'office dans un domaine
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Non classé'**
|
||
String get sectionUnclassified;
|
||
|
||
/// No description provided for @domainEv.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Véhicule électrique'**
|
||
String get domainEv;
|
||
|
||
/// No description provided for @domainEcs.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Eau chaude sanitaire'**
|
||
String get domainEcs;
|
||
|
||
/// No description provided for @domainHvac.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Climatisation'**
|
||
String get domainHvac;
|
||
|
||
/// No description provided for @domainHeating.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Chauffage'**
|
||
String get domainHeating;
|
||
|
||
/// Repli quand la box renvoie un domaine que cette version d'app ne connaît pas
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Domaine « {code} »'**
|
||
String domainUnknown(String code);
|
||
|
||
/// No description provided for @adapterRelayRouter.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Routeur de relais'**
|
||
String get adapterRelayRouter;
|
||
|
||
/// No description provided for @adapterEtmVariableLoad.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Charge modulable'**
|
||
String get adapterEtmVariableLoad;
|
||
|
||
/// No description provided for @adapterSgReady.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'SG-Ready'**
|
||
String get adapterSgReady;
|
||
|
||
/// No description provided for @adapterEvCharger.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Borne de recharge'**
|
||
String get adapterEvCharger;
|
||
|
||
/// No description provided for @adapterUnknown.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Mécanisme « {code} »'**
|
||
String adapterUnknown(String code);
|
||
|
||
/// No description provided for @loadEnabled.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Active'**
|
||
String get loadEnabled;
|
||
|
||
/// No description provided for @loadDisabled.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Exclue de l\'arbitrage'**
|
||
String get loadDisabled;
|
||
|
||
/// No description provided for @loadPriority.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Rang {rank}'**
|
||
String loadPriority(int rank);
|
||
|
||
/// No description provided for @loadMinOn.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Maintien ON minimal : {seconds} s'**
|
||
String loadMinOn(int seconds);
|
||
|
||
/// No description provided for @loadMinOff.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Maintien OFF minimal : {seconds} s'**
|
||
String loadMinOff(int seconds);
|
||
|
||
/// No description provided for @loadRelayCount.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'{count, plural, =1{1 relais} other{{count} relais}}'**
|
||
String loadRelayCount(int count);
|
||
|
||
/// Emplacement visuel réservé — LoadConfig n'a aucun champ pour rattacher un compteur à une charge
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Compteur dédié : non rattachable'**
|
||
String get loadMeterSlot;
|
||
|
||
/// No description provided for @orderNotGroupedTitle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Ordre non groupé'**
|
||
String get orderNotGroupedTitle;
|
||
|
||
/// No description provided for @orderNotGroupedBody.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'L\'ordre en place sur la box n\'est pas groupé par domaine : les charges d\'un même domaine ne se suivent pas. L\'ordre réel est affiché ci-dessous, tel que la box l\'applique.'**
|
||
String get orderNotGroupedBody;
|
||
|
||
/// No description provided for @orderNotGroupedAction.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Normaliser l\'ordre'**
|
||
String get orderNotGroupedAction;
|
||
|
||
/// No description provided for @orderNotGroupedWarning.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Normaliser modifiera l\'ordre d\'arbitrage réel de l\'installation. Aucune écriture ne part tant que vous n\'avez pas confirmé.'**
|
||
String get orderNotGroupedWarning;
|
||
|
||
/// No description provided for @orderNormalizeConfirm.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Normaliser et enregistrer'**
|
||
String get orderNormalizeConfirm;
|
||
|
||
/// No description provided for @cancel.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Annuler'**
|
||
String get cancel;
|
||
|
||
/// No description provided for @saveOrder.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Enregistrer l\'ordre'**
|
||
String get saveOrder;
|
||
|
||
/// No description provided for @savePending.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Envoi en cours…'**
|
||
String get savePending;
|
||
|
||
/// No description provided for @saveWaitingBox.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'En attente de confirmation de la box…'**
|
||
String get saveWaitingBox;
|
||
|
||
/// No description provided for @saveConfirmed.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Configuration confirmée par la box.'**
|
||
String get saveConfirmed;
|
||
|
||
/// No description provided for @saveRejected.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'La box a refusé : {reason}'**
|
||
String saveRejected(String reason);
|
||
|
||
/// No description provided for @saveDiverged.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'La box a enregistré un état différent de celui demandé. L\'affichage montre ce que la box applique réellement.'**
|
||
String get saveDiverged;
|
||
|
||
/// No description provided for @validationDuplicateId.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'L\'identifiant de charge « {id} » apparaît deux fois.'**
|
||
String validationDuplicateId(String id);
|
||
|
||
/// No description provided for @validationThingClaimedTwice.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'L\'appareil {thingId} est commandé par deux charges actives, « {first} » et « {second} » : deux commandes contradictoires et une puissance comptée deux fois.'**
|
||
String validationThingClaimedTwice(
|
||
String thingId,
|
||
String first,
|
||
String second,
|
||
);
|
||
|
||
/// No description provided for @telemetryUnavailableTitle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Télémétrie indisponible'**
|
||
String get telemetryUnavailableTitle;
|
||
|
||
/// No description provided for @telemetryUnavailableBody.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Cette box n\'expose pas GetLoadTelemetry. Puissance allouée, verrous, disponibilité et motifs de décision ne sont pas lisibles depuis l\'app.'**
|
||
String get telemetryUnavailableBody;
|
||
|
||
/// No description provided for @telemetryStale.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Données anciennes — dernier point il y a {seconds} s'**
|
||
String telemetryStale(int seconds);
|
||
|
||
/// No description provided for @telemetryDegradedMode.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Mode dégradé L2 — compteur muet, planification suspendue'**
|
||
String get telemetryDegradedMode;
|
||
|
||
/// No description provided for @faultTitle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'En défaut'**
|
||
String get faultTitle;
|
||
|
||
/// No description provided for @faultClearAction.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Lever le défaut'**
|
||
String get faultClearAction;
|
||
|
||
/// No description provided for @faultCleared.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Défaut levé — confirmé par la télémétrie relue.'**
|
||
String get faultCleared;
|
||
|
||
/// No description provided for @faultClearNoop.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Aucun défaut à lever sur cette charge.'**
|
||
String get faultClearNoop;
|
||
|
||
/// No description provided for @faultUnknown.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Défaut « {code} »'**
|
||
String faultUnknown(String code);
|
||
|
||
/// Repli obligatoire quand la box renvoie un decision.code absent de cet ARB — box plus récente que l'app. Affiche le code brut et ses paramètres, jamais une phrase vide.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Décision « {code} »{params}'**
|
||
String decisionUnknown(String code, String params);
|
||
|
||
/// No description provided for @telemetryTitle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Arbitrage en direct'**
|
||
String get telemetryTitle;
|
||
|
||
/// timestamp absent — l'absence de cycle est une information, pas un zéro
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Aucun cycle d\'arbitrage depuis le démarrage du service.'**
|
||
String get telemetryNeverRan;
|
||
|
||
/// No description provided for @telemetryLastCycle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Dernier cycle il y a {seconds} s'**
|
||
String telemetryLastCycle(int seconds);
|
||
|
||
/// No description provided for @telemetryBudgetTitle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Budget de surplus du cycle'**
|
||
String get telemetryBudgetTitle;
|
||
|
||
/// No description provided for @telemetryBudgetAbsent.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Aucun budget publié pour ce cycle : la planification est suspendue.'**
|
||
String get telemetryBudgetAbsent;
|
||
|
||
/// No description provided for @budgetSurplus.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Surplus entrant'**
|
||
String get budgetSurplus;
|
||
|
||
/// No description provided for @budgetEvReserved.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Réservé au véhicule'**
|
||
String get budgetEvReserved;
|
||
|
||
/// No description provided for @budgetRecredited.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Recrédité'**
|
||
String get budgetRecredited;
|
||
|
||
/// No description provided for @budgetAllocated.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Alloué'**
|
||
String get budgetAllocated;
|
||
|
||
/// No description provided for @budgetRemaining.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Reliquat'**
|
||
String get budgetRemaining;
|
||
|
||
/// No description provided for @watts.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'{watts} W'**
|
||
String watts(int watts);
|
||
|
||
/// No description provided for @telemetryAllocated.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Alloué {watts} W'**
|
||
String telemetryAllocated(int watts);
|
||
|
||
/// Charge présente dans GetLoadConfig mais absente de loads[] : elle est désactivée, jamais perdue
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Non arbitrée — absente du dernier cycle publié'**
|
||
String get telemetryNotArbitrated;
|
||
|
||
/// No description provided for @lockMinOn.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Maintien ON — {seconds} s restantes'**
|
||
String lockMinOn(int seconds);
|
||
|
||
/// No description provided for @lockMinOff.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Maintien OFF — {seconds} s restantes'**
|
||
String lockMinOff(int seconds);
|
||
|
||
/// No description provided for @lockMinStateHold.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Maintien d\'état — {seconds} s restantes'**
|
||
String lockMinStateHold(int seconds);
|
||
|
||
/// No description provided for @lockUnknown.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Verrou « {kind} » — {seconds} s restantes'**
|
||
String lockUnknown(String kind, int seconds);
|
||
|
||
/// Les secondes restantes ne sont PAS décomptées côté app : elles datent du cycle publié
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'au dernier cycle'**
|
||
String get lockAsOfCycle;
|
||
|
||
/// No description provided for @mechanismRelayStage.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Palier {stage} W sur {max} W'**
|
||
String mechanismRelayStage(int stage, int max);
|
||
|
||
/// No description provided for @mechanismVariableSetpoint.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Consigne {setpoint} W ({percent} %)'**
|
||
String mechanismVariableSetpoint(int setpoint, int percent);
|
||
|
||
/// No description provided for @mechanismSgReadyState.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'État SG-Ready {state} — estimation {estimated} W'**
|
||
String mechanismSgReadyState(int state, int estimated);
|
||
|
||
/// No description provided for @mechanismEvCharger.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'{current} A sur {phases} phase(s)'**
|
||
String mechanismEvCharger(double current, int phases);
|
||
|
||
/// No description provided for @mechanismUnknown.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Mécanisme « {kind} »'**
|
||
String mechanismUnknown(String kind);
|
||
|
||
/// No description provided for @decisionEvSurplus.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Véhicule rechargé sur le surplus photovoltaïque.'**
|
||
String get decisionEvSurplus;
|
||
|
||
/// No description provided for @decisionEvSpotMarket.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Véhicule rechargé sur un créneau tarifaire favorable.'**
|
||
String get decisionEvSpotMarket;
|
||
|
||
/// No description provided for @decisionEvDeadline.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Véhicule prioritaire : l\'échéance approche.'**
|
||
String get decisionEvDeadline;
|
||
|
||
/// No description provided for @decisionEvEcoMin.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Pas de surplus : le courant minimum est maintenu.'**
|
||
String get decisionEvEcoMin;
|
||
|
||
/// No description provided for @decisionEvIdle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Pas de surplus : la recharge est suspendue.'**
|
||
String get decisionEvIdle;
|
||
|
||
/// No description provided for @decisionLoadUnavailable.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Charge en défaut : aucune commande n\'est émise, et {frozen} W restent comptés au budget.'**
|
||
String decisionLoadUnavailable(int frozen);
|
||
|
||
/// No description provided for @decisionLockMinOn.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Le maintien ON a relevé la consigne à {applied} W ; le budget en payait {budget} W.'**
|
||
String decisionLockMinOn(int applied, int budget);
|
||
|
||
/// No description provided for @decisionLockMinOff.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Le maintien OFF interdit l\'enclenchement ; le budget payait pourtant {requested} W sur {budget} W disponibles.'**
|
||
String decisionLockMinOff(int requested, int budget);
|
||
|
||
/// No description provided for @decisionLockMinOffCapped.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Le maintien OFF plafonne la consigne à {applied} W ; {requested} W étaient demandés sur {budget} W de budget.'**
|
||
String decisionLockMinOffCapped(int applied, int requested, int budget);
|
||
|
||
/// No description provided for @decisionSurplusSetpoint.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Consigne de {setpoint} W servie par le surplus ({budget} W de budget).'**
|
||
String decisionSurplusSetpoint(int setpoint, int budget);
|
||
|
||
/// No description provided for @decisionSurplusSetpointStepped.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Consigne de {setpoint} W servie par le surplus, arrondie sur un palier déclaré ({budget} W de budget).'**
|
||
String decisionSurplusSetpointStepped(int setpoint, int budget);
|
||
|
||
/// No description provided for @decisionSurplusInsufficient.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Le budget de {budget} W ne payait aucun palier — aucun verrou n\'a mordu.'**
|
||
String decisionSurplusInsufficient(int budget);
|
||
|
||
/// No description provided for @decisionLockMinStateHold.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'État {state} maintenu par protection anti court-cycle.'**
|
||
String decisionLockMinStateHold(int state);
|
||
|
||
/// No description provided for @decisionSgForced.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Pompe à chaleur en état 4 (forcé) — estimation {estimated} W sur {budget} W de budget.'**
|
||
String decisionSgForced(int estimated, int budget);
|
||
|
||
/// No description provided for @decisionSgRecommended.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Pompe à chaleur en état 3 (recommandation) — estimation {estimated} W sur {budget} W de budget.'**
|
||
String decisionSgRecommended(int estimated, int budget);
|
||
|
||
/// No description provided for @decisionSgNormal.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Pompe à chaleur en état 2 (normal, sans consigne) — {budget} W de budget.'**
|
||
String decisionSgNormal(int budget);
|
||
|
||
/// No description provided for @decisionDegradedL2.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Consigne de repli : le compteur est muet et le watchdog a suspendu la planification.'**
|
||
String get decisionDegradedL2;
|
||
|
||
/// No description provided for @decisionSafeStateRelay.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'État sûr avant retrait : tous les relais sont ouverts.'**
|
||
String get decisionSafeStateRelay;
|
||
|
||
/// No description provided for @decisionSafeStateSetpoint.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'État sûr avant retrait : consigne ramenée à 0 W.'**
|
||
String get decisionSafeStateSetpoint;
|
||
|
||
/// No description provided for @decisionSafeStateSgReady.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'État sûr avant retrait : état 2 (normal), jamais le blocage.'**
|
||
String get decisionSafeStateSgReady;
|
||
|
||
/// No description provided for @faultWriteFailed.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Échec d\'écriture : l\'échelle de commande est épuisée, plus aucune commande n\'est émise tant que le défaut n\'est pas levé.'**
|
||
String get faultWriteFailed;
|
||
|
||
/// No description provided for @faultThingMissing.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'L\'appareil commandé est absent de la configuration nymea.'**
|
||
String get faultThingMissing;
|
||
|
||
/// No description provided for @faultUnusableEncoding.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Encodage SG-Ready inexploitable : l\'état 2 ne peut pas être exprimé, cette pompe à chaleur n\'est pas pilotable.'**
|
||
String get faultUnusableEncoding;
|
||
|
||
/// No description provided for @faultClearPending.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Levée demandée — en attente de la télémétrie…'**
|
||
String get faultClearPending;
|
||
|
||
/// No description provided for @faultClearStillFaulty.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'La charge est toujours en défaut après la levée.'**
|
||
String get faultClearStillFaulty;
|
||
|
||
/// No description provided for @faultClearRejected.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'La box a refusé la levée : {reason}'**
|
||
String faultClearRejected(String reason);
|
||
|
||
/// No description provided for @faultClearHint.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'La levée est une action délibérée : le défaut ne se lève jamais tout seul.'**
|
||
String get faultClearHint;
|
||
|
||
/// No description provided for @domainBattery.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Batterie'**
|
||
String get domainBattery;
|
||
|
||
/// No description provided for @domainAssignTitle.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Classer « {label} »'**
|
||
String domainAssignTitle(String label);
|
||
|
||
/// No description provided for @domainAssignAction.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Changer de domaine'**
|
||
String get domainAssignAction;
|
||
|
||
/// No description provided for @domainAssignNone.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Retirer du classement'**
|
||
String get domainAssignNone;
|
||
|
||
/// No description provided for @domainAssignHint.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Le domaine est une intention déclarée par l\'installateur. L\'arbitre ne la lit pas : elle ne sert qu\'à grouper l\'ordre de service.'**
|
||
String get domainAssignHint;
|
||
|
||
/// No description provided for @localeRequested.
|
||
///
|
||
/// In fr, this message translates to:
|
||
/// **'Locale demandée : {requested} · retenue par la box : {effective}'**
|
||
String localeRequested(String requested, String effective);
|
||
}
|
||
|
||
class _L10nDelegate extends LocalizationsDelegate<L10n> {
|
||
const _L10nDelegate();
|
||
|
||
@override
|
||
Future<L10n> load(Locale locale) {
|
||
return SynchronousFuture<L10n>(lookupL10n(locale));
|
||
}
|
||
|
||
@override
|
||
bool isSupported(Locale locale) =>
|
||
<String>['fr'].contains(locale.languageCode);
|
||
|
||
@override
|
||
bool shouldReload(_L10nDelegate old) => false;
|
||
}
|
||
|
||
L10n lookupL10n(Locale locale) {
|
||
// Lookup logic when only language code is specified.
|
||
switch (locale.languageCode) {
|
||
case 'fr':
|
||
return L10nFr();
|
||
}
|
||
|
||
throw FlutterError(
|
||
'L10n.delegate failed to load unsupported locale "$locale". This is likely '
|
||
'an issue with the localizations generation tool. Please file an issue '
|
||
'on GitHub with a reproducible sample app and the gen-l10n configuration '
|
||
'that was used.',
|
||
);
|
||
}
|