Commit 7381b1b9 authored by Clouard Regis's avatar Clouard Regis
Browse files

Added: italian support

parent 86714a08
......@@ -154,5 +154,6 @@
"confirm_gps_message": "Vikazimut needs location access even in background to perform. The GPS location is used to control the route, show the current track, and display statistics. No data is exported without permission.",
"result_table_distance_column_tooltip": "The length of the track in meters\n(The distance between the two checkpoints in meters)\nThe overcost of length in percentage",
"result_table_pace_column_tooltip": "The pace expressed in min/km\n(The speed expressed in km/h)",
"website_worldmap_page": "en/worldmap"
"website_worldmap_page": "en/worldmap",
"vikazimut_translator": "The translators"
}
......@@ -154,5 +154,6 @@
"confirm_gps_message": "Vikazimut nécessite la location de votre appareil y compris en arrière plan pour fonctionner. La position GPS est utilisée pour gérer le parcours, dessiner la trace et afficher des statistiques sur le parcours. Aucune donnée n'est exportée de l'appareil sans votre accord et la trace est intemporalisée.",
"result_table_distance_column_tooltip": "La longueur du trajet effectué entre les deux postes en mètres\n(La distance à vol d'oiseau entre les deux postes en mètres)\nLe surcoût de distance en pourcentage",
"result_table_pace_column_tooltip": "La réduction kilométrique en min/km\n(La vitesse en km/h)",
"website_worldmap_page": "worldmap"
"website_worldmap_page": "worldmap",
"vikazimut_translator": "Les traducteurs"
}
{
"preamble": "Lo scopo di queste condizioni generali d'uso è definire i termini e le condizioni in base ai quali VIKAZIMUT rende disponibile la sua applicazione mobile a vantaggio dell'utente. Utilizzando l'applicazione mobile VIKAZIMUT, l'utente accetta senza riserve tutte queste disposizioni.",
"articles": [
{
"title": "Articolo 1 : Descrizione dell'applicazione",
"color": "#4caf50",
"body": [
"Lo scopo dell'applicazione mobile è facilitare la pratica dell'orienteering. Sostituisce la mappa cartacea, la bussola e il punzone di convalida dei posti di controllo.",
"Un corso di orienteering consiste in una serie di posti di controllo materializzati sul campo da un tag di tipo International Orienteering Federation (IOF), che contiene anche un codice QR e un tag NFC. L'orientista utilizza l'applicazione per orientarsi dalla mappa e convalidare il suo passaggio attraverso i checkpoint con il lettore di codici QR o il lettore di tag NFC. Una modalità automatica consente di convalidare i waypoint direttamente dalla posizione GPS senza utilizzare codici QR o tag NFC. Questa modalità non richiede alcuna installazione fisica sul campo.",
"L'applicazione visualizza alla fine del percorso le statistiche sul completamento del percorso come il tempo totale, il tempo intermedio tra ciascun checkpoint e la traccia del percorso realizzato sulla mappa.",
"L'applicazione è disponibile in due modalità\u00A0: una modalità gara in cui l'orientatore non è aiutato con la sua posizione, e una modalità passegiata in cui l'orientatore è posizionato sulla mappa in tempo reale."
]
},
{
"title": "Articolo 2 : Protezione dei dati",
"color": "#2196f3",
"body": [
"In conformità alla legge Informatique et Libertés n° 78-17 del 6 gennaio 1978, nessuna informazione personale diversa dalla data e dal luogo sarrà utilizzata da questa applicazione.",
"In applicazione della legge sulla protezione dei dati n ° 78-17 del 6 gennaio 1978 e successive modifiche, l'utente ha il diritto di accedere, modificare, rettificare, opporsi e cancellare i dati che lo riguardano. Tali diritti sono strettamente personali e possono essere esercitati dall'utente solo per i dati che lo riguardano, o di un altro utente di cui sia il legale rappresentante."
]
},
{
"title": "Articolo 3 : Responsabilità",
"color": "#f44336",
"body": [
"Utilizzando l'applicazione VIKAZIMUT, l'utente dichiara di sollevare l'applicazione VIKAZIMUT da qualsiasi responsabilità in caso di incidenti di qualsiasi tipo che si verificano sui percorsi presenti e future cronometrate o no, offerte dall'applicazione, e questo, nei confronti di se stesso o di un terzo. "
]
},
{
"title": "Articolo 4 : Conformità agli standard esistenti",
"color": "#f0932b",
"body": [
"L’utente si impegna a rispettare il codice della strada e tutte le altre normative vigenti su tutti i percorsi."
]
},
{
"title": "Articolo 5 : Controindicazione medica",
"color": "#e056fd",
"body": [
"L'utente dichiara di non avere controindicazioni mediche alla pratica dell'orienteering."
]
},
{
"title": "Articolo 6 : Disposizione specifica per le minore",
"color": "#ff7979",
"body": [
"L'utente minore (di età inferiore ai 18 anni) certifica di avere l'autorizzazione del suo tutore legale per utilizzare questa applicazione e di essere accompagnato da un adulto durante l'utilizzo."
]
}
]
}
\ No newline at end of file
{
"continue_route": "Continua il percorso",
"sport_course": "Modalità gara di orientamento",
"walk_course": "Modalità passeggiata",
"course_type": "Typo della gara",
"ok": "OK",
"validation_mode": "Modalità di convalida",
"preset_order": "Ordine imposto",
"free_order": "Ordine a sua scelta",
"walk_free_order": "Ordine libero per la convalida dei posti di controllo",
"walk_auto_validation": "Convalida automatica per il GPS",
"auto_validation": "Convalida per il GPS",
"manual_validation": "Convalida per codici QR o NFC",
"cancel": "Cancellare",
"allow_gps_service": "Consenti",
"deny_gps_service": "Vietare",
"enable_gps_service": "Attivare",
"disable_gps_service": "Disattivare",
"nfc_unavailable_message": "Non puo convalidare i posti con il NFC perché l'NFC non è attivato o il suo dispositivo non ha un lettore NFC",
"gps_disabled_message": "La funzione di localizzazione del suo dispositivo è disabilitata.\nVuole abilitarla\u00A0?",
"gps_denied_message": "L'app non dispone dell'autorizzazione per utilizzare il GPS..\nVuole consentirlo\u00A0?",
"no_network_and_no_stored_map_error_message": "Nessuna connessione di rete e nessuna scheda registrata in precedenza.\nImpossible continuare.",
"qr_code_menu_item": "Flash il codice QR",
"qrcode_scanner_title": "Lettore di Codici QR",
"course_state_message": "Stato dello percorso",
"control_point_number": "N°",
"course_not_started_message": "Non ha convalidato il checkpoint di partenza.",
"show_detailed_times": "Dettaglio",
"total_time_message": "Durata del percorso",
"control_point_error_title": "Errore di puntamento",
"unknown_control_point_message": "Questo checkpoint non appartiene allo percorso",
"wrong_control_point_message": "Deve prima convalidare il checkpoint %s.\nVuole evitare questo checkpoint\u00A0?",
"scanned_control_point": "Checkpoint %s convalidato",
"quit_course": "Abbandonare il percorso",
"validate_missing_control_point": "Segnalare il checkpoint mancante",
"skip_missing_control_point": "Convalida forzata del checkpoint",
"send_result_title": "Pubilcare la traccia GPS sul sito per confrontarla",
"enter_nickname": "Entrare un nickname",
"error_no_nickname": "Per favore inserisci un nickname",
"history_activity_title": "Gare precedenti",
"user_map_name": "Mappa\u00A0:",
"course_date": "Percorso del",
"walk_date": "Passegiato del",
"course_time": "Tempo\u00A0:",
"with_chronometer": "Con cronometro e statistiche",
"without_chronometer": "Senza cronometro ne statistiche",
"without_gps": "Senza assistenza GPS",
"with_gps": "Con assistenza GPS",
"vikazimut_presentation_ensicaen": "L'app mobile è un projeto degli studienti in informatico dell' ENSICAEN\n(Scuola Nationale Superieure d’Ingenieri di Caen, Normandie)",
"vikazimut_presentation_unicaen": "e studienti in informatica dell'università di Caen, Normandie",
"vikazimut_student": "Gli studienti",
"vikazimut_supervisors": "I mentori",
"sport_mode": "Modo sport",
"walk_mode": "Modo passeggiata",
"map_downloading_error_message": "Impossible di caricare la mappa. Nessuna connessione di rete.",
"error_download_map": "Erreure durante il caricamento della mappa\u00A0:",
"cp_start": "Partenza",
"cp_finish": "Arrivo",
"history_help_message": "Trascina il risultato per eliminarlo",
"course_length": "lunghezza\u00A0: %s m",
"map_distance": "Distanza al sito\u00A0: %s km",
"course_creator": "Creazione :",
"credits_menu_item": "Chi siamo",
"settings_menu_item": "Ripristina parametri",
"delete_history_item": "1 risultato cancellato",
"undo_label": "PER CANCELLARE",
"tester_team": "Il team di test",
"send_results_to_server": "Confrontare",
"already_scanned_control_point_message": "Il checkpoint %s è già validato.",
"course_already_started_message": "Il percorso è già comenciato.",
"quit_course_confirmation_title": "Cancellare il percorso\u00A0?",
"stop_course_confirmation_title": "Fermare il percorso prima della fine\u00A0?",
"quit_course_confirmation_message": "Confermare disegnando una Z con i quattro punti",
"aid_dialog_title": "Bisogno di aiuto\u00A0?",
"aid_dialog_message": "Un avatar apparirà per 15 secondi dove si trove sulla mappa.\nMa, serà penalizzato da 5 minuti.",
"yes_aid": "Si, aiutame",
"no_aid": "No, non ho bisogno",
"send": "Mandare",
"yes": "Sì",
"no": "No",
"force_validation_cp_detailed": "Convalida forzata del checkpoint n°%s (%s)\u00A0?",
"force_validation_cp_simple": "Convalida forzata del checkpoint n°%s\u00A0?",
"missing_cp_notification_plus_report": "Segnala e convalida il checkpoint mancante n°%s (%s)\u00A0?",
"missing_cp_error_no_location": "Impossibile individuare la sua posizione per verificare di essere vicino allo checkpoint.",
"missing_cp_error_distance": "Per forzare la convalida di un checkpoint mancante, deve essere entro %1$dm dalla sua posizione.\nCerca encora\u00A0!",
"missing_cp_error_title": "Azione negata",
"validating_cp_error_title": "Forzare la convalidazione",
"validating_cp_error_no_location": "Impossibile individuare la sua posizione per determinare il checkpoint da convalidare.",
"success_validating_control_point": "Convalidation del checkpoint %s confirmato",
"server_connection_error_use_memorized_map": "Nessuna connessione di rete.\nUtilizzo delle mappa in memoria.",
"error_title": "Errore",
"error_prefix": "Errore :",
"warning_title": "Avvertimento",
"never_display_again": "Non mostrare più questo messaggio",
"show_route_on_map": "Traccia",
"reduction_to_kilometer_message": "Riduzione chilometrica",
"route_length_message": "Distanza percorsa",
"theoretical_length_message": "Lunghezza teorica totale\u00A0:",
"back_pressed_error": "Per abbandonare il percorso, utilizzare il menu e selezionare",
"impossible_without_location_provider": "Spiacenti, l'app Vikazimut non può essere utilizzata senza geolocalizzazione.",
"display_help_menu_item": "Manuale d'uso",
"map_choice_title": "%s percorso",
"general_conditions_of_use_item": "Termini di servizio",
"memory_map_usage": "Spazio utilizzato dalle mappe\u00A0: %.1f %s (vuoto: %.1f %s)",
"qrcode_start_button_message": "Premere il pulsante per scannerizzare il codice QR del checkpoint di partenza o usa il lettore NFC",
"auto_start_button_message_sport_mode": "Preme il pulsante.\n\nLo parcorso inizierà quando attraversera il checkpoint di partenza.",
"auto_start_button_message_walk_mode": "Premere il pulsante per iniziare il percorso.",
"penalty_message": "inclusi penaliti\u00A0:",
"panic": "Sono perso\u00A0!",
"map_list_downloading_message": "Trova l'elenco delle mappe disponibili sul server",
"control_point_index": "Numero\ncheckpoint",
"interval_time": "Tempo\ninter.",
"interval_distance": "lunghezza\n(Distanzia)",
"interval_pace": "RK\n(Velocità)",
"cumulative_time": "Tempo\ncumulativo",
"really_exit": "Uscire della pagina dei risultati",
"result_exit_message": "Vuole uscire della pagina di risultati\u00A0?",
"missing_map_message": "Non è possible visualizzare i resultati perché la mappa è stata cancellata dal suo cellulare. È necessario scaricare nuovamente la mappa prima di poter visualizzare nuovamente i risultati.",
"data_protection": "PRIVACY E PROTEZIONE DEI DATI: Nessun dato privato altre allo nickname e la traccia GPS (riportata al 1 gennaio 1970) sarà inviato al server.",
"yes_bypass": "Sì, Vuol evitare questo checkpoint",
"no_continue": "No, continuo a cercare",
"altitude_message": "Elevazione positiva",
"course_success": "Percorso completo",
"course_failure_missing": "Percorso incompleto",
"start_stop_course_menu_item": "Iniziare / fermare il percorso",
"open_site_web": "Sito web dei percorsi",
"scanned_start_control_point": "Inizio del percorso",
"scanned_end_control_point": "Fino del percorso",
"wait_validation_for_start": "Dove passare per il checkpoint di partenza per attivare il segnale di inizio.",
"send_result_error_no_connection": "Erreur\u00A0: Impossible per connettersi a internet... Controle la sua connessione",
"last_punched_display_with_name": "Convalidato : %1d (%2s)",
"last_punched_display": "Convalidata : %1d",
"location_required_tile": "Impossible andare oltre",
"average_speed_message": "Velocità media",
"Total": "Somma",
"assistance_message_one": "(assistenza\u00A0: %1$d)",
"assistance_message_other": "(assistenze\u00A0: %1$d)",
"megabyte": "Mb",
"gigabyte": "Gb",
"search_map_hint_message": "Ricerca mappa o @club",
"general_conditions_of_use_title": "Termini di servizio",
"manual_title": "Manuale d'uso",
"history_menu_item": "Percorsi salvati",
"no_web_navigator": "Impossible d'aprire un browser web sul suo dispositivo",
"quit_result": "Sì, lascia la pagina",
"dont_quit_result": "No, rimanere",
"control_point_title": "Posto",
"visited_time_title": "Tempo di\npassaggioX",
"out_of_bounds": "È fuori mappa",
"confirm_title": "Conferma",
"walk_started": "Andiamo !",
"developer_mode": "Modalità sviluppatore",
"confirm_gps_title": "Funzione GPS",
"confirm_gps_message": "Vikazimut richiede il noleggio del suo dispositivo, anche in background per funzionare. La posizione GPS è utilizzata per gestire il percorso, disegnare la traccia e visualizzare le statistiche sul percorso. Nessun dato sarà esportato dal dispositivo senza il suo consenso e la traccia è senza data.",
"result_table_distance_column_tooltip": "La lunghezza del viaggio tra le due posti in metri\n(La distanza in linea d'aria tra le due postii in metri)\nL'aumento della distanza in percentuale",
"result_table_pace_column_tooltip": "La riduzione dei chilometri in min/km\n(La velocità in km/h)",
"website_worldmap_page": "worldmap",
"vikazimut_translator": "Traduttori"
}
{
"image": "menu_course.png",
"sections": [
{
"menu_icon": "qr_code.png",
"title": "Scannerizzare un checkpoint con il lettore di codici QR",
"actions": [
"1. Premere il bottone del codice QR sulla barra degli strumenti.",
"2. Passa la fotocamera del cellulare davanti al codice QR (non troppo vicino).",
"3. Aspettare la notifica."
]
},
{
"title": "Scannerizzare un checkpoint con il lettore di tag NFC",
"actions": [
"1. Posiziona il telefono direttamente sul beacon.",
"2. Aspettare la notifica."
]
},
{
"menu_icon": "kebab.png",
"title": "Abbandonare il percorso",
"actions": [
"1. Premere il bottone verticale a tre punti sulla barra degli strumenti per apprire il menu.",
"2. Seleziona l'opzione di menu \"Abandonare il percorso\"."
]
},
{
"menu_icon": "kebab.png",
"title": "Segnalare lo checkpoint mancante",
"preamble": "In modalità di convalida tramite codice QR o tag NFC, quando manca il tag dello checkpoint.",
"actions": [
"1. Premere il bottone verticale a tre punti sulla barra degli strumenti per apprire il menu.",
"2. Seleziona l'opzione di menu \"Segnalare il checkpoint mancante\".",
"3. Viene inviato un messaggio al sito e la posizione è considerata convalidata."
]
},
{
"menu_icon": "kebab.png",
"title": "Forzare la convalida di un checkpoint mancante",
"preamble": "In modalità di convalida tramite codice QR o tag NFC, quando manca il beacon del checkpoint.",
"actions": [
"1. Premere il bottone verticale a tre punti sulla barra degli strumenti per apprire il menu.",
"2. Seleziona l'opzione di menu \"Forza la convalidata del checkpoint mancante\"",
"3. Il checkpoint è quindi considerato convalidato."
]
},
{
"menu_icon": "kebab.png",
"title": "Forzare la convalida del checkpoint corrente",
"preamble": "In modalità di convalida automatica tramite GPS, quando la stazione non è rilevata automaticamente dal GPS.",
"actions": [
"1. Premere il bottone verticale a tre punti sulla barra degli strumenti per apprire il menu.",
"2. Seleziona l'opzione di menu \"Forzare la convalida del checkpoint corrente.\"",
"3. Il checkpoint è quindi considerato convalidato."
]
},
{
"menu_icon": "kebab.png",
"title": "Assistance de localisation (mode sport)",
"actions": [
"1. Premere il bottone verticale a tre punti sulla barra degli strumenti per apprire il menu.",
"2. Seleziona l'opzione di menu \"Sono perso !\".",
"3. Un avatar apparirà sulla mappa per 15 secondi indicando la posizione corrente.",
"4. Ogni ricorso all'assistenza penalizza il tempo di percorrenza di 5 minuti."
]
},
{
"menu_icon": "search.png",
"title": "Ricerca delle mappe",
"preamble": "Selezionare le mappe in base al nome della mappa o al nome del club.",
"actions": [
"1. Premere il bottone Ricerca della barra degli strumenti per apprire un campo di ricerca.",
"2. Nel campo di testo, digitare il nome della mappaa o comminciare con @ per cercare per club."
]
}
]
}
\ No newline at end of file
......@@ -5,7 +5,7 @@ import 'package:location/location.dart';
import 'package:vikazimut/course/abstract_course_view.dart';
import 'package:vikazimut/course/course.dart';
import 'package:vikazimut/course/subview/course_settings_view.dart';
import 'package:vikazimut/help/user_guide_view.dart';
import 'package:vikazimut/help/manual_view.dart';
import 'package:vikazimut/map/orienteering_map.dart';
import 'package:vikazimut/map/view/location_layer.dart';
import 'package:vikazimut/map/view/map_view.dart';
......@@ -201,7 +201,7 @@ class SportModeCourseWidgetState extends AbstractModeCourseWidgetState {
closeMenuTooltip();
switch (value) {
case 1:
Navigator.push(context, MaterialPageRoute(builder: (context) => UserGuideView()));
Navigator.push(context, MaterialPageRoute(builder: (context) => ManualView()));
break;
case 2:
if (validationFormat == ValidationMode.MANUAL_MODE) {
......
......@@ -3,7 +3,7 @@ import 'package:location/location.dart';
import 'package:vikazimut/course/abstract_course_view.dart';
import 'package:vikazimut/course/course.dart';
import 'package:vikazimut/course/subview/course_settings_view.dart';
import 'package:vikazimut/help/user_guide_view.dart';
import 'package:vikazimut/help/manual_view.dart';
import 'package:vikazimut/map/geodesic_point.dart';
import 'package:vikazimut/map/orienteering_map.dart';
import 'package:vikazimut/map/view/flat_route_layer.dart';
......@@ -149,7 +149,7 @@ class WalkModeCourseWidgetState extends AbstractModeCourseWidgetState {
onSelected: (value) async {
switch (value) {
case 1:
Navigator.push(context, MaterialPageRoute(builder: (context) => UserGuideView()));
Navigator.push(context, MaterialPageRoute(builder: (context) => ManualView()));
break;
case 2:
forceValidationGPSControlPoint(detailed : false);
......
......@@ -44,7 +44,9 @@ class CreditsViewState extends State<CreditsView> with TickerProviderStateMixin
"Régis CLOUARD (ENSICAEN)",
"Alain LEBRET (ENSICAEN)",
"Eric PIGEON (UNICAEN & Vik'Azim)",
"",
];
static const List<String> TRANSLATORS = [
"Olivier PATTUS (Italien)",
];
static const TextStyle TEXT_STYLE = const TextStyle(
color: Colors.black,
......@@ -101,6 +103,7 @@ class CreditsViewState extends State<CreditsView> with TickerProviderStateMixin
final ensicaenStudents = _formatNames(ENSICAEN_STUDENTS);
final unicaenStudents = _formatNames(UNICAEN_STUDENTS);
final supervisors = _formatNames(SUPERVISORS);
final translators = _formatNames(TRANSLATORS);
return Scaffold(
backgroundColor: Theme.of(context).backgroundColor,
body: Container(
......@@ -172,6 +175,15 @@ class CreditsViewState extends State<CreditsView> with TickerProviderStateMixin
textAlign: TextAlign.center,
style: TEXT_STYLE,
),
Text(
Translations.getString('vikazimut_translator'),
style: TILE_TEXT_STYLE,
),
Text(
translators,
textAlign: TextAlign.center,
style: TEXT_STYLE,
),
const SizedBox(
height: 10,
),
......@@ -184,7 +196,7 @@ class CreditsViewState extends State<CreditsView> with TickerProviderStateMixin
fit: BoxFit.fitWidth,
),
Container(
height: max(screenHeight! - 20, 0),
height: max(screenHeight! - 25, 0),
),
],
),
......
......@@ -5,9 +5,9 @@ import 'package:flutter/services.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:vikazimut/utils/translations.dart';
class UserGuidePresenter {
class ManualPresenter {
Future<Manual> loadCGUArticles() async {
String jsonContent = await rootBundle.loadString('i18n/manual/${Translations.currentLanguage}.json');
String jsonContent = await rootBundle.loadString('i18n/manual/manual-${Translations.currentLanguage}.json');
var parsedJson = jsonDecode(jsonContent);
return Manual.fromJson(parsedJson);
}
......
......@@ -2,17 +2,17 @@ import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:vikazimut/utils/translations.dart';
import 'user_guide_presenter.dart';
import 'manual_presenter.dart';
class UserGuideView extends StatefulWidget {
class ManualView extends StatefulWidget {
@override
UserGuideViewState createState() => UserGuideViewState();
ManualViewState createState() => ManualViewState();
}
class UserGuideViewState extends State<UserGuideView> {
class ManualViewState extends State<ManualView> {
static const double BODY_FONT_SIZE = 16;
static const double TITLE_FONT_SIZE = 18;
final UserGuidePresenter presenter = new UserGuidePresenter();
final ManualPresenter presenter = new ManualPresenter();
@override
Widget build(BuildContext context) {
......
......@@ -28,6 +28,7 @@ class VikazimutApplication extends StatelessWidget {
supportedLocales: [
Locale('en', ''),
Locale('fr', ''),
Locale('it', ''),
],
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
......
......@@ -5,7 +5,7 @@ import 'package:url_launcher/url_launcher.dart' as navigator;
import 'package:vikazimut/constants.dart';
import 'package:vikazimut/help/credits.dart';
import 'package:vikazimut/help/general_conditions_of_use_view.dart';
import 'package:vikazimut/help/user_guide_view.dart';
import 'package:vikazimut/help/manual_view.dart';
import 'package:vikazimut/history/history_view.dart';
import 'package:vikazimut/map_choice/map_choice_view.dart';
import 'package:vikazimut/theme.dart';
......@@ -113,7 +113,7 @@ class _ModeChoiceViewState extends State<ModeChoiceView> with WidgetsBindingObse
NfcHelper.resetParameters();
break;
case 2:
Navigator.push(context, TransferRightPageRouteTransition(page: UserGuideView()));
Navigator.push(context, TransferRightPageRouteTransition(page: ManualView()));
break;
case 3:
Navigator.push(context, TransferRightPageRouteTransition(page: GeneralConditionsOfUseView()));
......
......@@ -63,7 +63,7 @@ class TranslationsDelegate extends LocalizationsDelegate<Translations> {
const TranslationsDelegate();
@override
bool isSupported(Locale locale) => ['en', 'fr'].contains(locale.languageCode);
bool isSupported(Locale locale) => ['en', 'fr', 'it'].contains(locale.languageCode);
@override
Future<Translations> load(Locale locale) => Translations.load(locale);
......
......@@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 3.1.0+90
version: 3.1.1+91
environment:
sdk: ">=2.12.0 <3.0.0"
......
import 'dart:convert';
import 'package:flutter_test/flutter_test.dart';
import 'package:vikazimut/help/user_guide_presenter.dart';
import 'package:vikazimut/help/manual_presenter.dart';
void main() {
test('Parse gcu json file', () async {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment