manager-app/lib/l10n/app_localizations_en.dart
Thomas Fransolet 762448c654 Lot F : écran d'audit log et compteur d'utilisateurs
Écran « Activité » sur GET /api/Audit, réservé au SuperAdmin comme la policy
de l'endpoint (menuId 13, conditionné à role.value == 0). Filtres instance,
type d'entité, utilisateur et plage de dates, pagination 50, clic sur une
ligne pour le détail avant/après en table plutôt que le JSON brut. Les ids
d'instance et d'utilisateur sont résolus en noms, un id absent de l'annuaire
restant affiché tel quel : le journal doit rester lisible après la
suppression de ce qu'il décrit.

manager_api_new n'est pas touché. L'écran passe par un http.get direct au
Bearer, comme _loadKnowledge / _loadInsights / _reindex du Guide IA : une
lecture seule ne justifie pas d'étendre un client qui s'édite à la main, et
le déclencheur de génération n'existe plus depuis le lot A.

Côté utilisateurs, compteur « X / 5 » et bouton d'ajout désactivé au
plafond. Le SuperAdmin en est exclu : son GET /api/User renvoie toutes les
instances, compter cette liste contre un plafond par instance n'aurait
aucun sens. Le masquage du rôle SuperAdmin pour un InstanceAdmin, resté en
question dans todo-features.md, était déjà fait — _allowedRoles filtre sur
r >= callerRole.

Trois pièges relevés en câblant :

- AuditController renvoie les entités brutes, pas un DTO — les champs sont
  ceux d'AuditLog en camelCase.
- invokeAPI ne lève pas sur un code d'erreur et son résultat était ignoré
  dans users_screen : un e-mail déjà utilisé (409) ou un rôle refusé (403)
  ne produisait aucun message. Le statut est désormais testé et le corps
  affiché, ce qui rendra visible sans retouche le futur 422 du plafond.
- DropdownButtonFormField ne relit pas initialValue sur reconstruction
  (FormField.didUpdateWidget ne traite que forceErrorText) : « Réinitialiser
  les filtres » vidait la requête sans vider l'affichage. Remplacé par un
  DropdownButton piloté.

40 clés i18n FR/EN/NL, flutter gen-l10n relancé. flutter analyze propre sur
les dossiers travaillés, flutter build web vert.

Deux dettes serveur restent ouvertes, hors périmètre de ce commit : le
plafond de 5 n'est pas appliqué par UserController (ce qui est livré ici est
un garde-fou d'interface, un POST direct passe toujours), et aucune section
n'est journalisée — AuditedTypes.Contains exige l'égalité exacte alors que
Section est abstraite. Détail dans DOCS/todo-features.md et v1-plan.md lot F.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 11:04:40 +02:00

1930 lines
43 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';
// ignore_for_file: type=lint
/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
AppLocalizationsEn([String locale = 'en']) : super(locale);
@override
String get cancel => 'Cancel';
@override
String get save => 'Save';
@override
String get create => 'Create';
@override
String get delete => 'Delete';
@override
String get close => 'Close';
@override
String get edit => 'Edit';
@override
String get actions => 'Actions';
@override
String get status => 'Status';
@override
String get no => 'No';
@override
String get name => 'Name';
@override
String get type => 'Type';
@override
String get date => 'Date';
@override
String get loginSuccess => 'Login successful';
@override
String get loginError => 'An error occurred during login';
@override
String get rememberMe => 'Remember me';
@override
String get connect => 'LOG IN';
@override
String get forgotPasswordLink => 'Forgot your password?';
@override
String get forgotPasswordTitle => 'Forgot password';
@override
String get forgotPasswordDesc =>
'Enter your email and we\'ll send you a link to set a new password.';
@override
String get forgotPasswordSubmit => 'SEND LINK';
@override
String get forgotPasswordSuccess =>
'If this email exists, a reset link has just been sent.';
@override
String get backToLogin => 'Back to login';
@override
String get setPasswordTitle => 'Set your password';
@override
String get setPasswordDesc => 'Choose a password to access your workspace.';
@override
String get setPasswordNewLabel => 'New password';
@override
String get setPasswordSubmit => 'SET PASSWORD';
@override
String get setPasswordSuccess => 'Password set — you can now log in.';
@override
String get setPasswordError => 'This link is invalid or has expired';
@override
String get setPasswordTooShort => 'Password must be at least 8 characters';
@override
String get setPasswordMissingToken => 'Invalid link — no token provided';
@override
String get inviteUserHint =>
'An invitation email will be sent to set the password.';
@override
String get menuSubscription => 'Subscription';
@override
String get subscriptionTitle => 'Subscription';
@override
String get subscriptionTrialActive => 'Free trial in progress';
@override
String subscriptionTrialEndsAt(Object date) {
return 'Your trial ends on $date';
}
@override
String get subscriptionTrialNoDate => 'Your free trial is active.';
@override
String get subscriptionPlanActive => 'Essentiel plan active';
@override
String get subscriptionPlanActiveDesc =>
'Your subscription is active and renews automatically.';
@override
String get subscriptionIncludedTitle => 'What\'s included';
@override
String get subscriptionUpgradeBtn => 'Upgrade to a paid subscription';
@override
String get subscriptionCheckoutError =>
'Could not start checkout, please try again later.';
@override
String get subscriptionAddonsTitle => 'Add-ons';
@override
String get subscriptionAddonsComingSoon =>
'Coming soon: extra AI requests and other options.';
@override
String get menuApplications => 'Applications';
@override
String get menuConfigurations => 'Configurations';
@override
String get menuResources => 'Resources';
@override
String get menuStatistics => 'Statistics';
@override
String get menuGuideIa => 'AI Guide';
@override
String get guideIaSubtitle =>
'Your guide answers visitor questions using your own content. It never answers from anything else.';
@override
String get guideIaUsageTitle => 'This month\'s usage';
@override
String guideIaUsageQuestions(Object count) {
return '$count questions asked';
}
@override
String get guideIaUsageNoQuota => 'No cap set on your plan.';
@override
String get guideIaChannelsTitle => 'Where the guide is available';
@override
String get guideIaChannelsSub =>
'Enabled per channel, from each application\'s settings.';
@override
String get guideIaChannelOn => 'Enabled';
@override
String get guideIaChannelOff => 'Disabled';
@override
String get guideIaIdentityTitle => 'Guide identity';
@override
String get guideIaIdentitySub => 'This is what gives the answers their tone';
@override
String get guideIaNameLabel => 'Guide name';
@override
String get guideIaNameHint => 'The name visitors see and hear. E.g. Leon';
@override
String get guideIaPersonaLabel => 'Personality';
@override
String get guideIaPersonaHint =>
'Describe it the way you would introduce a guide to a new colleague. To get started, pick an example:';
@override
String get guideIaExampleWarden => 'Passionate warden';
@override
String get guideIaExampleWardenText =>
'Your name is Leon, you are the site\'s former warden. You speak plainly and warmly, and you happily slip in an anecdote. Address visitors politely.';
@override
String get guideIaExampleSober => 'Measured mediator';
@override
String get guideIaExampleSoberText =>
'You are a calm, precise cultural mediator. You answer in two or three sentences, without familiarity, citing established facts. If something is uncertain, you say so.';
@override
String get guideIaExampleKids => 'For children';
@override
String get guideIaExampleKidsText =>
'You are an enthusiastic explorer speaking to children aged 7 to 12. Use informal language, ask questions, use simple comparisons and short words. Tell stories.';
@override
String get guideIaFallbackLabel => 'When the guide doesn\'t know';
@override
String get guideIaFallbackHint =>
'The guide picks one at random. With a single sentence it repeats it word for word, and that shows immediately.';
@override
String get guideIaFallbackAdd => 'Add a wording';
@override
String get guideIaFallbackTranslated =>
'Visitors see these sentences: they will be translated into their language, like the rest of your content.';
@override
String get guideIaVoiceTitle => 'Your guide out loud';
@override
String get guideIaVoiceSub =>
'Visitors ask out loud and hear the answer — in the app, or in their connected glasses.';
@override
String get guideIaVoiceFemale => 'Female voice, warm';
@override
String get guideIaVoiceMale => 'Male voice, steady';
@override
String guideIaVoiceWakeword(Object word) {
return 'Wake word: \"$word\"';
}
@override
String guideIaVoiceInfoName(Object word) {
return 'Visitors say \"$word\" to wake the guide, even if it goes by another name. A voice and wake word of your own are available as an option.';
}
@override
String get guideIaVoiceInfoGlasses =>
'Connected glasses work with the mobile app installed on the visitor\'s phone.';
@override
String get guideIaVoiceInfoMultilang =>
'The same voice speaks all your languages: your guide keeps one identity across them.';
@override
String get guideIaSave => 'Save';
@override
String get guideIaSaved => 'Guide saved';
@override
String get guideIaSaveError => 'Saving failed. Please try again.';
@override
String get guideIaTabConfig => 'Configuration';
@override
String get guideIaTabQuestions => 'What your visitors ask';
@override
String get guideIaPreviewTitle => 'Try your guide';
@override
String get guideIaPreviewSub =>
'Test the tone and the answers without reaching for a phone';
@override
String get guideIaPreviewPlaceholder =>
'Ask a question, the way a visitor would';
@override
String get guideIaPreviewSources => 'Where does this answer come from?';
@override
String get guideIaPreviewSourcesInfo =>
'This source indicator only appears on this screen. Your visitors see the answer alone.';
@override
String get guideIaPreviewError =>
'The guide did not answer. Try again in a moment.';
@override
String get guideIaPreviewUnsaved =>
'Save your changes before testing them: the preview queries the guide as published.';
@override
String get guideIaKnowledgeTitle => 'What your guide knows';
@override
String get guideIaKnowledgeSub =>
'Measured on what is actually indexed, not on what is published';
@override
String get guideIaKnowledgeSections => 'Indexed sections';
@override
String get guideIaKnowledgeChunks => 'Content chunks';
@override
String get guideIaKnowledgeLanguages => 'Languages covered';
@override
String get guideIaKnowledgeLastIndexed => 'Last indexed';
@override
String get guideIaKnowledgeHint =>
'An unpublished section drops out of the guide\'s answers within the minute.';
@override
String guideIaKnowledgeMinutesAgo(Object count) {
return '$count min ago';
}
@override
String guideIaKnowledgeHoursAgo(Object count) {
return '$count h ago';
}
@override
String guideIaKnowledgeDaysAgo(Object count) {
return '$count d ago';
}
@override
String get guideIaKpiQuestions => 'Questions this month';
@override
String get guideIaKpiUnanswered => 'Unanswered';
@override
String get guideIaKpiThemes => 'Themes';
@override
String get guideIaKpiLanguages => 'Languages';
@override
String get guideIaGapTitle => 'What your visitors look for and don\'t find';
@override
String guideIaGapSub(Object count) {
return '$count questions found no answer in your content. Add it and your guide will answer from the next visit on.';
}
@override
String get guideIaTopicsTitle => 'Question topics';
@override
String get guideIaQuestionLanguagesTitle => 'Question languages';
@override
String get guideIaInsightsSubCount => 'Number of questions over the period';
@override
String get guideIaCitedTitle => 'Most used content';
@override
String get guideIaCitedSub => 'Sections cited in answers';
@override
String get guideIaInsightsEmpty => 'No questions yet';
@override
String get guideIaInsightsEmptyHint =>
'As soon as your visitors start asking the guide, their questions will be grouped here by topic — and the ones left unanswered will tell you what to add to your content.';
@override
String get guideIaInsightsPrivacy =>
'Questions are kept for 90 days, then deleted. Only the topic groupings are kept beyond that. No data identifying a visitor is recorded.';
@override
String get menuNotifications => 'Notifications';
@override
String get menuUsers => 'Users';
@override
String get menuApiKeys => 'API Keys';
@override
String get noPlansAvailable => 'No plans available. Create a plan first.';
@override
String get noPlan => 'No plan (unlimited)';
@override
String get unlimitedStorage => 'Unlimited storage';
@override
String get unlimitedAI => 'Unlimited AI';
@override
String aiTokensPerMonth(String amount) {
return '$amount AI tokens/month';
}
@override
String get storageLabel => 'Storage';
@override
String get aiThisMonthLabel => 'AI this month';
@override
String get unlimited => 'Unlimited';
@override
String get requestsAbbr => 'req';
@override
String get tokensAbbr => 'tokens';
@override
String get planUpdated => 'Plan updated';
@override
String errorMessage(String error) {
return 'Error: $error';
}
@override
String get switchInstance => 'Switch instance';
@override
String get noInstanceFound => 'No instance found';
@override
String get configurePlan => 'Configure plan';
@override
String get tooltipSwitchInstance => 'Switch instance';
@override
String get tooltipLogout => 'Log out';
@override
String get usersTitle => 'Users';
@override
String get createUserBtn => 'Create user';
@override
String get createUserTitle => 'Create user';
@override
String get editUserTitle => 'Edit user';
@override
String get deleteUserTitle => 'Delete user';
@override
String deleteUserConfirm(String email) {
return 'Delete $email?';
}
@override
String get noUsers => 'No users';
@override
String get email => 'Email';
@override
String get firstName => 'First name';
@override
String get lastName => 'Last name';
@override
String get password => 'Password';
@override
String get role => 'Role';
@override
String get tooltipEdit => 'Edit';
@override
String get tooltipDelete => 'Delete';
@override
String get notificationsTitle => 'Notifications';
@override
String get newMessage => 'New message';
@override
String get messageTitle => 'Title';
@override
String get messageBody => 'Message';
@override
String get schedule => 'Schedule';
@override
String get time => 'Time';
@override
String get send => 'Send';
@override
String get cancelNotification => 'Cancel notification';
@override
String cancelNotificationConfirm(String title) {
return 'Cancel « $title »?';
}
@override
String get allNotifications => 'All';
@override
String get sentNotifications => 'Sent';
@override
String get scheduledNotifications => 'Scheduled';
@override
String get failedNotifications => 'Failed';
@override
String get noNotifications => 'No notifications sent';
@override
String get noNotificationsForFilter => 'No notifications for this filter';
@override
String get topic => 'Topic';
@override
String get tooltipCancelNotification => 'Cancel';
@override
String resultsCount(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count results',
one: '$count result',
);
return '$_temp0';
}
@override
String get apiKeysTitle => 'API Keys';
@override
String get createApiKey => 'Create API key';
@override
String get createKeyBtn => 'Create key';
@override
String get appType => 'Application type';
@override
String get noExpiration => 'No expiration';
@override
String expiresOn(String date) {
return 'Expires on $date';
}
@override
String get choose => 'Choose';
@override
String get removeExpiration => 'Remove expiration';
@override
String get apiKeyCreatedTitle => 'API key created';
@override
String get copyKeyWarning => 'Copy this key now — it won\'t be shown again.';
@override
String get copy => 'Copy';
@override
String get copiedKey => 'I\'ve copied the key';
@override
String get revokeApiKeyTitle => 'Revoke API key';
@override
String revokeApiKeyConfirm(String name) {
return 'Revoke « $name »? Apps using this key will lose access.';
}
@override
String get revoke => 'Revoke';
@override
String get noApiKeys => 'No API keys';
@override
String get createdOn => 'Created on';
@override
String get expiration => 'Expiration';
@override
String get activeKey => 'Active';
@override
String get revokedKey => 'Revoked';
@override
String get tooltipRevoke => 'Revoke';
@override
String get statisticsTitle => 'Statistics';
@override
String get statsLoadError => 'Unable to load statistics';
@override
String get statsNoData => 'No data yet for this period';
@override
String statsNoDataForType(String type) {
return 'No events received for type \"$type\"';
}
@override
String get statsSessions => 'Sessions';
@override
String get statsAvgDuration => 'Avg. duration';
@override
String get statsTopApp => 'Top app';
@override
String get statsTopLang => 'Top language';
@override
String get statsVisitsByDay => 'Visits per day';
@override
String get statsAll => 'All';
@override
String get statsTopSections => 'Top sections';
@override
String get statsApps => 'Apps';
@override
String get statsLanguages => 'Languages';
@override
String get statsTopPOI => 'Top POI';
@override
String get statsPOI => 'POI';
@override
String get statsTaps => 'Taps';
@override
String get statsTopAgenda => 'Top agenda events';
@override
String get statsEvent => 'Event';
@override
String get statsQuiz => 'Quiz';
@override
String get statsSection => 'Section';
@override
String get statsAvgScore => 'Avg. score';
@override
String get statsCompletions => 'Completions';
@override
String get statsGames => 'Games';
@override
String get statsGameType => 'Type';
@override
String get statsArticles => 'Articles read';
@override
String get statsReadings => 'Reads';
@override
String get statsMenuTitle => 'Menu';
@override
String get statsMenuItem => 'Item';
@override
String get statsQrScans => 'QR Scans';
@override
String get statsTotal => 'Total';
@override
String get statsValid => 'Valid';
@override
String get statsInvalid => 'Invalid';
@override
String get statsViews => 'Views';
@override
String get statsAttendanceTitle => 'Attendance';
@override
String statsPeriodRange(String from, String to) {
return 'From $from to $to';
}
@override
String get statsFilterPeriod => 'Period';
@override
String get statsFilterChannel => 'Channel';
@override
String statsPeriodDays(int days) {
return '$days days';
}
@override
String get statsPeriodYear => 'Year';
@override
String get statsChannelMobile => 'Mobile app';
@override
String get statsChannelTablet => 'Kiosk';
@override
String get statsChannelWeb => 'Website';
@override
String get statsChannelVR => 'VR headset';
@override
String get statsChannelVoice => 'Voice guide';
@override
String statsTakeawayUp(String percent) {
return 'Attendance is up $percent % compared to the previous period.';
}
@override
String statsTakeawayDown(String percent) {
return 'Attendance is down $percent % compared to the previous period.';
}
@override
String get statsTakeawayStable =>
'Attendance is stable compared to the previous period.';
@override
String statsTakeawayVolume(String visits, String perDay) {
return '$visits visits over the period, or $perDay a day on average.';
}
@override
String statsTakeawayVoice(String percent) {
return 'The voice guide accounts for $percent % of visits — a strong argument for your funding bodies.';
}
@override
String statsTakeawayChannel(String channel, String percent) {
return 'The « $channel » channel accounts for $percent % of visits.';
}
@override
String statsTakeawayContent(String title, String percent) {
return '« $title » alone accounts for $percent % of all views: it is your front door, keep it up to date first.';
}
@override
String get statsKpiVisits => 'Visits';
@override
String get statsKpiAvgDuration => 'Average duration';
@override
String get statsKpiContentsPerVisit => 'Contents per visit';
@override
String get statsKpiVoiceShare => 'Voice guide share';
@override
String get statsKpiTotalViews => 'Contents viewed';
@override
String get statsVsPrevious => 'vs previous period';
@override
String get statsTrendStable => 'stable';
@override
String statsDurationMinSec(String minutes, String seconds) {
return '$minutes min $seconds s';
}
@override
String statsDurationSec(String seconds) {
return '$seconds s';
}
@override
String get statsVisitsByDaySub => 'Light bands mark the weekends';
@override
String get statsWeekends => 'Saturdays and Sundays';
@override
String statsPeakDay(String date, String visits) {
return 'Peak on $date$visits visits';
}
@override
String get statsTopContents => 'Most viewed contents';
@override
String get statsTopContentsSub => 'Number of views over the period';
@override
String get statsChannels => 'Channels';
@override
String get statsChannelsSub => 'Visits per channel';
@override
String get statsLanguagesSub => 'Visits per language';
@override
String get statsReportTitle => 'Your attendance report';
@override
String get statsReportBody =>
'A document in your own colours, ready to send to your municipality, your board or your funding bodies.';
@override
String get statsReportItemAttendance =>
'Attendance, visit durations and trend';
@override
String get statsReportItemContents => 'Most viewed contents and their trend';
@override
String get statsReportItemChannels =>
'Breakdown per channel, including the voice guide, and per language';
@override
String get statsReportItemAdvanced =>
'Points of interest, quizzes, games and QR scans';
@override
String statsReportGenerated(String date) {
return 'Report generated on $date with MyInfoMate';
}
@override
String get statsReportError => 'The report could not be generated';
@override
String get statsReportDownload => 'Download the PDF';
@override
String get statsAdvancedTitle => 'Advanced statistics';
@override
String get statsAdvancedBody =>
'Detailed statistics (POI, quizzes, games, articles, QR…) are available with the Premium plan.';
@override
String get statsUnavailableTitle => 'Statistics not included';
@override
String get statsUnavailableBody =>
'Your current plan does not include attendance statistics.';
@override
String get noData => 'No data';
@override
String get errorOccurred => 'An error occurred';
@override
String get yes => 'Yes';
@override
String get newConfiguration => 'New configuration';
@override
String get configNameLabel => 'Name:';
@override
String get orText => 'or';
@override
String get importLabel => 'Import';
@override
String get configNameRequired => 'Please specify a name for the new visit';
@override
String get configCreatedSuccess => 'Configuration created successfully';
@override
String configExportSuccess(String path) {
return 'Configuration exported successfully, file is at: $path';
}
@override
String get configExportFailed => 'Configuration export failed';
@override
String get configDeletedSuccess => 'Configuration deleted successfully';
@override
String get configSavedSuccess => 'Configuration saved successfully';
@override
String get configDeleteConfirm =>
'Are you sure you want to delete this configuration?';
@override
String get newSection => 'New section';
@override
String get newSubSection => 'New sub section';
@override
String get sectionNameLabel => 'Name:';
@override
String get sectionTypeLabel => 'Type:';
@override
String get sectionNameRequired => 'Please specify a name for the new section';
@override
String get sectionCreatedSuccess => 'Section created successfully!';
@override
String get sectionDeleteConfirm =>
'Are you sure you want to delete this section?';
@override
String get sectionSavedSuccess => 'Section saved successfully';
@override
String get sectionTranslationSaved =>
'Section translations saved successfully';
@override
String get sectionLoadError => 'An error occurred while loading the section';
@override
String get qrCodeCopied => 'This QR code has been copied to the clipboard';
@override
String get beaconLabel => 'Beacon:';
@override
String get beaconIdLabel => 'Beacon ID:';
@override
String get beaconMustBeNumber => 'This must be a number';
@override
String get identifierLabel => 'Identifier:';
@override
String get displayTitleLabel => 'Display title:';
@override
String get imageLabel => 'Image:';
@override
String get backgroundImageLabel => 'Background image:';
@override
String get questionInputLabel => 'Question:';
@override
String get videoUrlLabel => 'Video URL:';
@override
String get webUrlLabel => 'Website URL:';
@override
String get subSectionUpdatedSuccess => 'Sub section updated successfully';
@override
String get subSectionUpdateError =>
'An error occurred while updating the sub section';
@override
String get subSectionDeletedSuccess => 'Sub section deleted successfully';
@override
String get subSectionDeleteError =>
'An error occurred while deleting the sub section';
@override
String get subSectionOrderUpdatedSuccess =>
'Sub section order updated successfully';
@override
String get subSectionOrderUpdateError =>
'An error occurred while updating the sub section order';
@override
String get subSectionCreatedSuccess => 'Sub section created successfully';
@override
String get subSectionCreateError =>
'An error occurred while creating the sub section';
@override
String get questionsLabel => 'Questions';
@override
String get questionLabel => 'Question';
@override
String get editQuestion => 'Edit question';
@override
String get questionDeleteConfirm =>
'Are you sure you want to delete this question?';
@override
String get questionsLoadError =>
'An error occurred while loading the questions';
@override
String get quizBadScore => 'Bad score';
@override
String get quizMediumScore => 'Medium score';
@override
String get quizGoodScore => 'Good score';
@override
String get quizExcellentScore => 'Excellent score';
@override
String get quizBadScoreMsg => 'Message for a bad score';
@override
String get quizMediumScoreMsg => 'Message for a medium score';
@override
String get quizGoodScoreMsg => 'Message for a good score';
@override
String get quizExcellentScoreMsg => 'Message for an excellent score';
@override
String get questionOrderUpdatedSuccess =>
'Question order updated successfully';
@override
String get questionOrderUpdateError =>
'An error occurred while updating the question order';
@override
String get questionCreatedSuccess => 'Question created successfully';
@override
String get questionCreateError =>
'An error occurred while creating the question';
@override
String get questionUpdatedSuccess => 'Question updated successfully';
@override
String get questionUpdateError =>
'An error occurred while updating the question';
@override
String get questionDeletedSuccess => 'Question deleted successfully';
@override
String get questionDeleteError =>
'An error occurred while deleting the question';
@override
String get translationIncomplete => 'Translation is incomplete';
@override
String get geopointCreatedSuccess => 'Point created successfully';
@override
String get geopointCreateError =>
'An error occurred while creating the point';
@override
String get geopointUpdatedSuccess => 'Point updated successfully';
@override
String get geopointUpdateError =>
'An error occurred while updating the point';
@override
String get geopointDeletedSuccess => 'Point deleted successfully';
@override
String get geopointDeleteError =>
'An error occurred while deleting the point';
@override
String get categoryCreatedSuccess => 'Category created successfully';
@override
String get categoryCreateError =>
'An error occurred while creating the category';
@override
String get categoryUpdatedSuccess => 'Category updated successfully';
@override
String get categoryUpdateError =>
'An error occurred while updating the category';
@override
String get eventCreatedSuccess => 'Event created successfully';
@override
String get eventCreateError => 'An error occurred while creating the event';
@override
String get eventUpdatedSuccess => 'Event updated successfully';
@override
String get eventUpdateError => 'An error occurred while updating the event';
@override
String get eventDeletedSuccess => 'Event deleted successfully';
@override
String get eventDeleteError => 'An error occurred while deleting the event';
@override
String get annotationCreatedSuccess => 'Annotation created successfully';
@override
String get annotationCreateError =>
'An error occurred while creating the annotation';
@override
String get annotationUpdatedSuccess => 'Annotation updated successfully';
@override
String get annotationUpdateError =>
'An error occurred while updating the annotation';
@override
String get programmeBlockCreatedSuccess => 'Block created successfully';
@override
String get programmeBlockCreateError =>
'An error occurred while creating the block';
@override
String get programmeBlockUpdatedSuccess => 'Block updated successfully';
@override
String get programmeBlockUpdateError =>
'An error occurred while updating the block';
@override
String get pathCreatedSuccess => 'Path created successfully';
@override
String get pathCreateError => 'An error occurred while creating the path';
@override
String get pathUpdatedSuccess => 'Path updated successfully';
@override
String get pathUpdateError => 'An error occurred while updating the path';
@override
String get stepCreatedSuccess => 'Step created successfully';
@override
String get stepCreateError => 'An error occurred while creating the step';
@override
String get stepUpdatedSuccess => 'Step updated successfully';
@override
String get stepUpdateError => 'An error occurred while updating the step';
@override
String get agendaEventsLabel => 'Events';
@override
String get agendaEventFallback => 'Event';
@override
String get addEvent => 'Add an event';
@override
String get noEvents => 'No events';
@override
String get noAddress => 'No address';
@override
String get agendaFilterAll => 'All';
@override
String get agendaFilterThisMonth => 'This month';
@override
String get agendaFilterThisYear => 'This year';
@override
String get agendaFilterPast => 'Past';
@override
String get agendaEventDeleteConfirm =>
'Are you sure you want to delete this event?';
@override
String get onlineLabel => 'Online:';
@override
String get mapViewLabel => 'Map view:';
@override
String get mapServiceLabel => 'Map service:';
@override
String get jsonFilesLabel => 'JSON files:';
@override
String get jsonLabel => 'JSON';
@override
String get guidedPathsLabel => 'Guided Paths';
@override
String get addPath => 'Add a path';
@override
String get noPathConfigured => 'No path configured';
@override
String get pathOrderUpdateError => 'Error updating order';
@override
String get pathNoTitle => 'Untitled path';
@override
String get pathDeletedSuccess => 'Path deleted successfully';
@override
String get pathDeleteError => 'Error deleting path';
@override
String get pathsLabel => 'Paths';
@override
String get pointsOfInterestLabel => 'Points of Interest';
@override
String get geopointsLabel => 'Geographic points';
@override
String get searchLabel => 'Search:';
@override
String get geopointsLoadError => 'Error loading geographic points';
@override
String get geopointDeleteConfirm =>
'Are you sure you want to delete this geographic point?';
@override
String get serviceLabel => 'Service:';
@override
String get centerPointLabel => 'Center point:';
@override
String get iconLabel => 'Icon:';
@override
String get listViewLabel => 'List view:';
@override
String get typeLabel => 'Type:';
@override
String get zoomLabel => 'Zoom:';
@override
String get categoriesLabel => 'Categories:';
@override
String get startDateLabel => 'Start date';
@override
String get notDefined => 'Not defined';
@override
String get endDateLabel => 'End date';
@override
String get programmeLabel => 'Programme';
@override
String get addBlock => 'Add a block';
@override
String get blockFallback => 'Block';
@override
String get noBlocks => 'No programme blocks defined';
@override
String get programmeBlockDeletedSuccess => 'Block deleted successfully';
@override
String get programmeBlockDeleteError => 'Error deleting block';
@override
String get baseMapLabel => 'Base map';
@override
String get mapLabel => 'Map:';
@override
String get globalAnnotationsLabel => 'Global annotations';
@override
String get addAnnotation => 'Add an annotation';
@override
String get noAnnotations => 'No global annotations';
@override
String get annotationFallback => 'Annotation';
@override
String get annotationDeletedSuccess => 'Annotation deleted';
@override
String get annotationDeleteError => 'Error deleting';
@override
String get agendaEventCreatedSuccess => 'Event created successfully';
@override
String get agendaEventCreateError =>
'An error occurred while creating the event';
@override
String get agendaEventUpdatedSuccess => 'Event updated successfully';
@override
String get agendaEventUpdateError =>
'An error occurred while updating the event';
@override
String get agendaEventDeletedSuccess => 'Event deleted successfully';
@override
String get agendaEventDeleteError =>
'An error occurred while deleting the event';
@override
String get newResource => 'New resource';
@override
String get resourceCreatedSuccess => 'Resource created successfully';
@override
String get resourceCreateError =>
'An error occurred while creating the resource';
@override
String get resourceUpdatedSuccess => 'Resource updated successfully';
@override
String get resourceNoFileLoaded => 'No file has been loaded';
@override
String get resourceNameRequired => 'Please give the resource a name';
@override
String get resourceTooLarge => 'Error: resource size must be under 1.5MB';
@override
String get resourceInvalidUrl => 'The URL is invalid';
@override
String get resourceUrlRequired => 'Please fill in the URL field';
@override
String get generalInfo => 'General information';
@override
String get mainImageLabel => 'Main image:';
@override
String get loaderLabel => 'Loader:';
@override
String get primaryColorLabel => 'Primary color:';
@override
String get secondaryColorLabel => 'Secondary color:';
@override
String get layoutLabel => 'Layout:';
@override
String get layoutGrid => 'Grid';
@override
String get languagesLabel => 'Languages:';
@override
String get featuredEventLabel => 'Featured event:';
@override
String get chooseEvent => 'Choose an event';
@override
String get previewWebTitle => 'Preview — Web';
@override
String get previewMobileTitle => 'Preview — Mobile';
@override
String get previewDesktop => 'Desktop';
@override
String get previewMobile => 'Mobile';
@override
String get noneOption => 'None';
@override
String get aiAssistantLabel => 'AI assistant:';
@override
String get appUpdatedSuccess => 'Mobile application updated';
@override
String get configActivatedSuccess => 'Configuration activated successfully';
@override
String get configDeactivatedSuccess =>
'Configuration deactivated successfully';
@override
String get configRemoveConfirm =>
'Are you sure you want to remove this configuration from the application?';
@override
String get configRemovedSuccess =>
'Configuration removed from application successfully';
@override
String get configRemoveError =>
'An error occurred while removing the configuration';
@override
String get phoneConfigTitle => 'Configurations per device';
@override
String get addConfig => 'Add a configuration';
@override
String get selectConfigToAdd => 'Select a configuration to add';
@override
String get noItems => 'No items to display';
@override
String get add => 'Add';
@override
String pinCode(String code) {
return 'Pin code: $code';
}
@override
String get tablets => 'Tablets';
@override
String stepsCount(int count) {
return '$count steps';
}
@override
String get displayedDescriptionLabel => 'Displayed description:';
@override
String get displayedContentLabel => 'Displayed content:';
@override
String get displayedNameLabel => 'Display name:';
@override
String get startTimeLabel => 'Start time';
@override
String get noAnnotationConfigured => 'No annotations configured.';
@override
String get newStepTitle => 'New step';
@override
String get editStepTitle => 'Edit step';
@override
String get stepTitleLabel => 'Step title';
@override
String get stepDescriptionLabel => 'Step description';
@override
String get stepLocationLabel => 'Step location:';
@override
String get initiallyHiddenLabel => 'Initially hidden';
@override
String get lockedLabel => 'Locked';
@override
String get durationSecondsLabel => 'Duration (seconds):';
@override
String get triggerGeopointLabel => 'Trigger GeoPoint (ID):';
@override
String get questionsChallengesLabel => 'Questions / Challenges';
@override
String get noQuestionsConfigured => 'No questions configured.';
@override
String get newAgendaEventTitle => 'New event';
@override
String get editAgendaEventTitle => 'Edit event';
@override
String get eventTitleLabel => 'Event title';
@override
String get eventDescriptionLabel => 'Event description';
@override
String get startDateColonLabel => 'Start date:';
@override
String get videoResourceLabel => 'Video:';
@override
String get directVideoLinkLabel => 'Direct video link:';
@override
String get phoneLabel => 'Phone:';
@override
String get locationGeometryLabel => 'Location / Geometry';
@override
String get geometryLabel => 'Geometry:';
@override
String get materialIconLabel => 'Icon (material):';
@override
String get linearLabel => 'Linear:';
@override
String get requiredSuccessLabel => 'Required success:';
@override
String get pathStepsLabel => 'Path steps';
@override
String get noStepConfigured => 'No point/step configured.';
@override
String get stepFallback => 'Step';
@override
String get questionAskedLabel => 'Question asked:';
@override
String get questionTitleLabel => 'Question title';
@override
String get expectedAnswerLabel => 'Expected answer:';
@override
String get expectedAnswerModalLabel => 'Expected answer';
@override
String get validationNote =>
'Validation is done by comparison (case-insensitive).';
@override
String get possibleAnswersLabel => 'Possible answers:';
@override
String get noAnswerDefined => 'No answer defined. Add at least one.';
@override
String get correctAnswer => 'Correct answer ✓';
@override
String get wrongAnswer => 'Wrong answer';
@override
String get answerNote => '✓ = correct answer. Multiple can be correct.';
@override
String get geopointZoneTitle => 'Geographic point / Zone';
@override
String get geometryTypeLabel => 'Geometry (Point/Line/Zone):';
@override
String get phoneModalLabel => 'Phone';
@override
String get categoryLabel => 'Category:';
@override
String get startMessageLabel => 'Start message:';
@override
String get startMessageModalLabel => 'Start message';
@override
String get createCategoryTitle => 'Create category';
@override
String get editCategoryTitle => 'Edit category';
@override
String get categoryIconLabel => 'Category icon:';
@override
String get selectResource => 'Select a resource';
@override
String get createPdfTitle => 'Create PDF';
@override
String get answersLabel => 'Answers';
@override
String get answerLabel => 'Answer';
@override
String get createAnswerTitle => 'Create answer';
@override
String get editAnswerTitle => 'Edit answer';
@override
String get answerValidNote => 'If checked, the answer is valid';
@override
String get selectConfiguration => 'Select a configuration';
@override
String get noConfigFound => 'No configuration found';
@override
String get backgroundColorLabel => 'Background color:';
@override
String get updateTabletBtn => 'Update tablet';
@override
String get kioskUpdatedSuccess => 'Kiosk updated';
@override
String get webViewError =>
'The web page cannot be displayed, the URL is incorrect or empty';
@override
String get download => 'Download';
@override
String get resourceDeleteConfirm =>
'Are you sure you want to delete this resource?';
@override
String get categoriesTitle => 'Categories';
@override
String get endTimeLabel => 'End time';
@override
String get annotationsLabel => 'Annotations';
@override
String get addStep => 'Add a step';
@override
String get addQuestion => 'Add a question';
@override
String get deleteStep => 'Delete step';
@override
String get deleteStepConfirm => 'Delete this step and its questions?';
@override
String get pathPanelTitle => 'The path';
@override
String get pathPanelSubtitle => 'Title, mood, progression';
@override
String get stepSummaryEmpty => 'No content';
@override
String mediaCount(int count) {
return '$count media';
}
@override
String questionCount(int count) {
return '$count question(s)';
}
@override
String get saveStatusIdle => 'Saved automatically';
@override
String get saveStatusSaving => 'Saving…';
@override
String get saveStatusSaved => 'Saved';
@override
String get saveStatusFailed => 'Could not save';
@override
String get retry => 'Retry';
@override
String get mapProviderMobileOnlyNote =>
'The map provider and type apply to the mobile and tablet apps. The web app always renders its own map.';
@override
String get menuAudit => 'Activity';
@override
String get auditTitle => 'Activity';
@override
String get auditSubtitle => 'Who changed what, and when';
@override
String get auditFilterInstance => 'Instance';
@override
String get auditFilterEntity => 'Item type';
@override
String get auditFilterUser => 'User';
@override
String get auditFilterFrom => 'From';
@override
String get auditFilterTo => 'To';
@override
String get auditAllInstances => 'All instances';
@override
String get auditAllEntities => 'All types';
@override
String get auditAllUsers => 'All users';
@override
String get auditReset => 'Clear filters';
@override
String get auditColDate => 'Date';
@override
String get auditColInstance => 'Instance';
@override
String get auditColEntity => 'Item';
@override
String get auditColAction => 'Action';
@override
String get auditColUser => 'User';
@override
String get auditColEntityId => 'Identifier';
@override
String get auditActionCreate => 'Created';
@override
String get auditActionUpdate => 'Updated';
@override
String get auditActionDelete => 'Deleted';
@override
String get auditEntitySection => 'Section';
@override
String get auditEntityResource => 'Resource';
@override
String get auditEntityConfiguration => 'Configuration';
@override
String get auditEntityDevice => 'Device';
@override
String get auditEntityUser => 'User';
@override
String get auditEntityInstance => 'Instance';
@override
String get auditEmpty => 'No activity for these filters';
@override
String get auditLoadError => 'The activity log could not be loaded';
@override
String auditRange(int first, int last, int total) {
return '$first $last of $total';
}
@override
String get auditPrevious => 'Previous page';
@override
String get auditNext => 'Next page';
@override
String get auditDetailTitle => 'Change detail';
@override
String get auditDetailField => 'Field';
@override
String get auditDetailBefore => 'Before';
@override
String get auditDetailAfter => 'After';
@override
String get auditDetailNoValues =>
'The log does not keep the detail of this operation.';
@override
String usersCount(int count, int max) {
return '$count / $max users';
}
@override
String usersQuotaReached(int max) {
return 'Limit of $max users reached';
}
@override
String get usersQuotaHint => 'Delete a user to invite another one.';
@override
String userCreateError(String message) {
return 'Creation failed: $message';
}
}