diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart index 3600b2222d5f..a97533044562 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector.dart @@ -1,17 +1,15 @@ import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Listener; -import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:iso_countries/iso_countries.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; import 'package:smooth_app/data_models/preferences/user_preferences.dart'; import 'package:smooth_app/generic_lib/design_constants.dart'; import 'package:smooth_app/generic_lib/dialogs/smooth_alert_dialog.dart'; import 'package:smooth_app/helpers/provider_helper.dart'; +import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; import 'package:smooth_app/pages/prices/emoji_helper.dart'; -import 'package:smooth_app/services/smooth_services.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_list_choice.dart'; import 'package:smooth_app/widgets/selector_screen/smooth_screen_selector_provider.dart'; import 'package:smooth_app/widgets/smooth_text.dart'; @@ -48,15 +46,15 @@ class CountrySelector extends StatelessWidget { autoValidate: autoValidate, ), child: Consumer<_CountrySelectorProvider>( - builder: (BuildContext context, _CountrySelectorProvider provider, _) { + builder: (context, provider, _) { return switch (provider.value) { - PreferencesSelectorLoadingState _ => SizedBox( + PreferencesSelectorLoadingState() => SizedBox( height: loadingHeight, - child: const Center( - child: CircularProgressIndicator.adaptive(), - ), + child: + const Center(child: CircularProgressIndicator.adaptive()), ), - PreferencesSelectorLoadedState _ => _CountrySelectorButton( + PreferencesSelectorLoadedState() => + _CountrySelectorButton( icon: icon, innerPadding: padding ?? EdgeInsets.zero, textStyle: textStyle, @@ -100,41 +98,33 @@ class _CountrySelectorButton extends StatelessWidget { child: ConstrainedBox( constraints: const BoxConstraints(minHeight: 40.0), child: ConsumerValueNotifierFilter<_CountrySelectorProvider, - PreferencesSelectorState>( - buildWhen: (PreferencesSelectorState? previousValue, - PreferencesSelectorState currentValue) => - previousValue != null && - currentValue is! PreferencesSelectorEditingState && - (currentValue as PreferencesSelectorLoadedState) - .selectedItem != - (previousValue as PreferencesSelectorLoadedState) - .selectedItem, - builder: (_, PreferencesSelectorState value, __) { - final Country? country = - (value as PreferencesSelectorLoadedState) + PreferencesSelectorState>( + buildWhen: (previous, current) => + previous is PreferencesSelectorLoadedState && + current is PreferencesSelectorLoadedState && + current.selectedItem != previous.selectedItem, + builder: (_, state, __) { + final country = + (state as PreferencesSelectorLoadedState) .selectedItem; + final String displayName = country?.localizedName ?? ''; return Padding( padding: innerPadding, child: Row( - children: [ - if (country != null) - SizedBox( - width: IconTheme.of(context).size! + LARGE_SPACE, - child: AutoSizeText( - EmojiHelper.getEmojiByCountryCode( - country.countryCode)!, - textAlign: TextAlign.center, - style: - TextStyle(fontSize: IconTheme.of(context).size), - ), - ) - else - const Icon(Icons.public), + children: [ + SizedBox( + width: IconTheme.of(context).size! + LARGE_SPACE, + child: AutoSizeText( + EmojiHelper.getCountryEmoji(country?.country) ?? '', + textAlign: TextAlign.center, + style: TextStyle(fontSize: IconTheme.of(context).size), + ), + ), const SizedBox(width: SMALL_SPACE), Expanded( child: Text( - country?.name ?? AppLocalizations.of(context).loading, + displayName, style: Theme.of(context) .textTheme .displaySmall @@ -153,82 +143,51 @@ class _CountrySelectorButton extends StatelessWidget { } Future _openCountrySelector(BuildContext context) async { - final dynamic newCountry = - await Navigator.of(context, rootNavigator: true).push( - PageRouteBuilder( - pageBuilder: (_, __, ___) => _CountrySelectorScreen( - provider: context.read<_CountrySelectorProvider>(), - ), - transitionsBuilder: (BuildContext context, - Animation animation, - Animation secondaryAnimation, - Widget child) { - final Tween tween = Tween( - begin: const Offset(0.0, 1.0), - end: Offset.zero, - ); - final CurvedAnimation curvedAnimation = CurvedAnimation( - parent: animation, - curve: Curves.easeInOut, - ); - final Animation position = tween.animate(curvedAnimation); - - return SlideTransition( - position: position, - child: FadeTransition( - opacity: animation, - child: child, - ), - ); - }), + final newCountry = await Navigator.of(context, rootNavigator: true).push( + PageRouteBuilder( + pageBuilder: (_, __, ___) => _CountrySelectorScreen( + provider: context.read<_CountrySelectorProvider>(), + ), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + final offset = Tween( + begin: const Offset(0.0, 1.0), end: Offset.zero) + .animate( + CurvedAnimation(parent: animation, curve: Curves.easeInOut)); + return SlideTransition( + position: offset, + child: FadeTransition(opacity: animation, child: child), + ); + }, + ), ); - if (!context.mounted) { - return; - } + if (!context.mounted) return; - /// Ensure to restore the previous state - /// (eg: the user uses the Android back button). if (newCountry == null) { context.read<_CountrySelectorProvider>().dismissSelectedItem(); - } else if (newCountry is Country) { - _changeCurrencyIfRelevant(context, newCountry); + } else if (newCountry is LocalizedCountry) { + _changeCurrencyIfRelevant(context, newCountry.country); } } -// TODO(g123k): move this to a dedicated Provider Future _changeCurrencyIfRelevant( - final BuildContext context, - final Country country, - ) async { - final UserPreferences userPreferences = context.read(); - final OpenFoodFactsCountry? offCountry = - OpenFoodFactsCountry.fromOffTag(country.countryCode); - final String? possibleCurrencyCode = offCountry?.currency?.name; - - if (possibleCurrencyCode == null) { - return; - } + BuildContext context, OpenFoodFactsCountry country) async { + final userPreferences = context.read(); + final possibleCurrencyCode = country.currency?.name; + if (possibleCurrencyCode == null) return; bool? changeCurrency; - final String? currentCurrencyCode = userPreferences.userCurrencyCode; + final currentCurrencyCode = userPreferences.userCurrencyCode; - if (currentCurrencyCode == null) { - changeCurrency = true; - } else if (forceCurrencyChange) { - changeCurrency = true; - } else if (currentCurrencyCode != possibleCurrencyCode) { - final AppLocalizations appLocalizations = AppLocalizations.of(context); + if (currentCurrencyCode == null || + forceCurrencyChange || + currentCurrencyCode != possibleCurrencyCode) { + final appLocalizations = AppLocalizations.of(context); changeCurrency = await showDialog( context: context, - builder: (final BuildContext context) => SmoothAlertDialog( + builder: (context) => SmoothAlertDialog( body: Text( - '${appLocalizations.country_change_message}' - '\n' - '${appLocalizations.currency_auto_change_message( - currentCurrencyCode, - possibleCurrencyCode, - )}', + '${appLocalizations.country_change_message}\n${appLocalizations.currency_auto_change_message(currentCurrencyCode ?? '', possibleCurrencyCode)}', ), negativeAction: SmoothActionButton( onPressed: () => Navigator.of(context, rootNavigator: true).pop(), @@ -242,6 +201,7 @@ class _CountrySelectorButton extends StatelessWidget { ), ); } + if (changeCurrency == true) { await userPreferences.setUserCurrencyCode(possibleCurrencyCode); } @@ -249,38 +209,32 @@ class _CountrySelectorButton extends StatelessWidget { } class _CountrySelectorScreen extends StatelessWidget { - const _CountrySelectorScreen({ - required this.provider, - }); + const _CountrySelectorScreen({required this.provider}); final _CountrySelectorProvider provider; @override Widget build(BuildContext context) { - final AppLocalizations appLocalizations = AppLocalizations.of(context); + final appLocalizations = AppLocalizations.of(context); + LocalizedCountry.getLocalizedCountries(); - return SmoothSelectorScreen( + return SmoothSelectorScreen( provider: provider, title: appLocalizations.country_selector_title, - itemBuilder: ( - BuildContext context, - Country country, - bool selected, - String filter, - ) { + itemBuilder: (context, country, selected, filter) { return Row( - children: [ + children: [ Expanded( flex: 1, child: Text( - EmojiHelper.getEmojiByCountryCode(country.countryCode) ?? '', + EmojiHelper.getCountryEmoji(country.country) ?? '', style: const TextStyle(fontSize: 25.0), ), ), Expanded( flex: 2, child: Text( - country.countryCode.toUpperCase(), + country.country.iso2Code, textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis, @@ -289,47 +243,29 @@ class _CountrySelectorScreen extends StatelessWidget { Expanded( flex: 7, child: TextHighlighter( - text: country.name, + text: country.localizedName, filter: filter, - textStyle: const TextStyle( - fontWeight: FontWeight.w600, - ), + textStyle: const TextStyle(fontWeight: FontWeight.w600), ), - ) + ), ], ); }, - itemsFilter: (List list, Country? selectedItem, - Country? selectedItemOverride, String filter) => - _filterCountries( - list, - selectedItem, - selectedItemOverride, - filter, - ), - ); - } - - Iterable _filterCountries( - List countries, - Country? userCountry, - Country? selectedCountry, - String? filter, - ) { - if (filter == null || filter.isEmpty) { - return countries; - } - - return countries.where( - (Country country) => - country == userCountry || - country == selectedCountry || - country.name.toLowerCase().contains( - filter.toLowerCase(), - ) || - country.countryCode.toLowerCase().contains( - filter.toLowerCase(), - ), + itemsFilter: (list, selectedItem, selectedItemOverride, filter) { + return list.where((country) { + return country == selectedItem || + country == selectedItemOverride || + country.localizedName + .toLowerCase() + .contains(filter.toLowerCase()) || + country.country.iso2Code + .toLowerCase() + .contains(filter.toLowerCase()) || + country.preferenceCode + .toLowerCase() + .contains(filter.toLowerCase()); + }); + }, ); } } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart index 48b2e08067ba..dec090a76406 100644 --- a/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart +++ b/packages/smooth_app/lib/pages/preferences/country_selector/country_selector_provider.dart @@ -6,36 +6,38 @@ part of 'country_selector.dart'; /// * [_CountrySelectorLoadedState]: countries loaded and/or saved /// * [_CountrySelectorEditingState]: the user has selected a country /// (temporary selection) -class _CountrySelectorProvider extends PreferencesSelectorProvider { +class _CountrySelectorProvider + extends PreferencesSelectorProvider { _CountrySelectorProvider({ required super.preferences, required super.autoValidate, }); String? userCountryCode; - String? userAppLanguageCode; + OpenFoodFactsLanguage? userAppLanguage; @override Future onPreferencesChanged() async { final String? newCountryCode = preferences.userCountryCode; final String? newLanguageCode = preferences.appLanguageCode; + final OpenFoodFactsLanguage? newLanguage = + _getLanguageFromCode(newLanguageCode); - if (newLanguageCode != userAppLanguageCode) { + if (newLanguage != userAppLanguage) { userCountryCode = newCountryCode; - userAppLanguageCode = newLanguageCode; + userAppLanguage = newLanguage; return loadValues(); } else if (newCountryCode != userCountryCode) { userCountryCode = newCountryCode; - userAppLanguageCode = newLanguageCode; + userAppLanguage = newLanguage; - if (value is PreferencesSelectorInitialState) { + if (value is PreferencesSelectorInitialState) { return loadValues(); } else { - final PreferencesSelectorLoadedState state = - value as PreferencesSelectorLoadedState; + final PreferencesSelectorLoadedState state = + value as PreferencesSelectorLoadedState; - /// Reorder items - final List countries = state.items; + final List countries = state.items; _reorderCountries(countries, userCountryCode); value = state.copyWith( @@ -47,146 +49,60 @@ class _CountrySelectorProvider extends PreferencesSelectorProvider { } @override - Future> onLoadValues() async { - final List localizedCountries = await CountriesHelper.getCountries( - userAppLanguageCode, - ) ?? - []; - - final List countries = await compute( - _reformatCountries, - (localizedCountries, userCountryCode), - ); - - return countries; - } - - static Future> _reformatCountries( - (List, String?) localizedCountriesAndUserCountry, - ) async { - final List countries = - _sanitizeCountriesList(localizedCountriesAndUserCountry.$1); - _reorderCountries(countries, localizedCountriesAndUserCountry.$2); - return countries; + Future> onLoadValues() async { + return _sanitizeCountriesList(LocalizedCountry.getLocalizedCountries()); } /// Sanitizes the country list, but without reordering it. /// * by removing countries that are not in [OpenFoodFactsCountry] /// * and providing a fallback English name for countries that are in /// [OpenFoodFactsCountry] but not in [localizedCountries]. - static List _sanitizeCountriesList( - List localizedCountries, + static List _sanitizeCountriesList( + List localizedCountries, ) { - final List finalCountriesList = []; - final Map oFFIsoCodeToCountry = - {}; - final Map localizedIsoCodeToCountry = {}; - for (final OpenFoodFactsCountry c in OpenFoodFactsCountry.values) { - oFFIsoCodeToCountry[c.offTag.toLowerCase()] = c; - } - for (final Country c in localizedCountries) { - localizedIsoCodeToCountry.putIfAbsent( - c.countryCode.toLowerCase(), () => c); - } - for (final String countryCode in oFFIsoCodeToCountry.keys) { - final Country? localizedCountry = localizedIsoCodeToCountry[countryCode]; - if (localizedCountry == null) { - // No localization for the country name was found, use English name as - // default. - String countryName = oFFIsoCodeToCountry[countryCode] - .toString() - .replaceAll('OpenFoodFactsCountry.', '') - .replaceAll('_', ' '); - countryName = - '${countryName[0].toUpperCase()}${countryName.substring(1).toLowerCase()}'; - finalCountriesList.add( - Country( - name: _fixCountryName(countryName), - countryCode: _fixCountryCode(countryCode)), - ); - continue; - } - final String fixedCountryCode = _fixCountryCode(countryCode); - final Country country = fixedCountryCode == countryCode - ? localizedCountry - : Country(name: localizedCountry.name, countryCode: countryCode); - finalCountriesList.add(country); - } + final Set validCountries = + OpenFoodFactsCountry.values.toSet(); + final List sanitizedList = localizedCountries + .where((country) => validCountries.contains(country.country)) + .toList(); - return finalCountriesList; + return sanitizedList; } - /// Fix the countryCode if needed so Backend can process it. - static String _fixCountryCode(String countryCode) { - // 'gb' is handled as 'uk' in the backend. - if (countryCode == 'gb') { - countryCode = 'uk'; - } - return countryCode; - } - - /// Fix the issues where United Kingdom appears with lowercase 'k'. - static String _fixCountryName(String countryName) { - if (countryName == 'United kingdom') { - countryName = 'United Kingdom'; - } - return countryName; - } - - /// Reorder countries alphabetically, bring user's locale country to top. static void _reorderCountries( - List countries, + List countries, String? userCountryCode, ) { countries.sort( - (final Country a, final Country b) { - if (a.countryCode == userCountryCode) { - return -1; - } - if (b.countryCode == userCountryCode) { - return 1; - } - return a.name.compareTo(b.name); + (a, b) { + if (a.preferenceCode == userCountryCode) return -1; + if (b.preferenceCode == userCountryCode) return 1; + return a.localizedName.compareTo(b.localizedName); }, ); } @override - Country getSelectedValue(List countries) { + LocalizedCountry getSelectedValue(List countries) { if (userCountryCode != null) { - for (final Country country in countries) { - if (country.countryCode.toLowerCase() == - userCountryCode?.toLowerCase()) { - return country; - } - } + return countries.firstWhere( + (country) => + country.preferenceCode.toLowerCase() == + userCountryCode?.toLowerCase(), + orElse: () => countries.first, + ); } - return countries[0]; + return countries.first; } @override - Future onSaveItem(Country country) => preferences.setUserCountryCode( - country.countryCode, - ); -} - -class CountriesHelper { - const CountriesHelper._(); + Future onSaveItem(LocalizedCountry country) => + preferences.setUserCountryCode(country.preferenceCode); - static Future?> getCountries(String? userLanguageCode) async { - try { - return await IsoCountries.isoCountriesForLocale(userLanguageCode); - } on MissingPluginException catch (_) { - // Locales are not implemented on desktop and web - return [ - const Country(name: 'United States', countryCode: 'US'), - const Country(name: 'France', countryCode: 'FR'), - const Country(name: 'Germany', countryCode: 'DE'), - const Country(name: 'India', countryCode: 'IN'), - ]; - } catch (e) { - Logs.e('Failed to load countries', ex: e); + OpenFoodFactsLanguage? _getLanguageFromCode(String? code) { + if (code == null) { return null; } + return OpenFoodFactsLanguage.fromOffTag(code); } } diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart b/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart new file mode 100644 index 000000000000..0e2d66448137 --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/localized_country.dart @@ -0,0 +1,96 @@ +import 'package:l10n_countries/l10n_countries.dart'; +import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; +import 'package:smooth_app/pages/preferences/country_selector/tmp_country_iso3.dart'; +import 'package:smooth_app/query/product_query.dart'; + +class LocalizedCountry { + const LocalizedCountry({ + required this.country, + required this.localizedName, + required this.englishName, + }); + + final OpenFoodFactsCountry country; + final String localizedName; + final String englishName; + + String get preferenceCode => country.offTag; + String get iso2Code => country.iso2Code; + + static Map + getLocalizedCountriesMap() { + final OpenFoodFactsLanguage language = ProductQuery.getLanguage(); + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); + + final Set iso3Codes = tmpCountryIso3.values.toSet(); + final LocaleMap localizedMap = mapper.localize( + iso3Codes, + mainLocale: language, + fallbackLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + final LocaleMap englishMap = mapper.localize( + iso3Codes, + mainLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + final Map result = {}; + for (final OpenFoodFactsCountry country in OpenFoodFactsCountry.values) { + final String? iso3 = tmpCountryIso3[country]; + if (iso3 == null) { + continue; + } + + final String? localized = localizedMap[iso3]; + final String fallbackEnglish = + englishMap[iso3] ?? _getFallbackEnglishName(country); + + result[country] = LocalizedCountry( + country: country, + localizedName: localized ?? fallbackEnglish, + englishName: fallbackEnglish, + ); + } + + return result; + } + + static List getLocalizedCountries() => + getLocalizedCountriesMap().values.toList() + ..sort((a, b) => a.localizedName.compareTo(b.localizedName)); + + static String? getSingleLocalizedName(OpenFoodFactsCountry country) { + final String? iso3 = tmpCountryIso3[country]; + if (iso3 == null) { + return null; + } + + final CountriesLocaleMapper mapper = CountriesLocaleMapper(); + final OpenFoodFactsLanguage language = ProductQuery.getLanguage(); + + final LocaleMap map = mapper.localize( + {iso3}, + mainLocale: language, + fallbackLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + final String? localized = map[iso3]; + + if (language != OpenFoodFactsLanguage.ENGLISH || localized != null) { + return localized; + } + + final LocaleMap englishMap = mapper.localize( + {iso3}, + mainLocale: OpenFoodFactsLanguage.ENGLISH, + ); + + return englishMap[iso3] ?? _getFallbackEnglishName(country); + } + + static String _getFallbackEnglishName(OpenFoodFactsCountry country) { + final String raw = country.toString().split('.').last.replaceAll('_', ' '); + return raw[0].toUpperCase() + raw.substring(1).toLowerCase(); + } +} diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart new file mode 100644 index 000000000000..ebccfa928ee7 --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart @@ -0,0 +1,7 @@ +import 'package:openfoodfacts/openfoodfacts.dart'; + +extension OpenFoodFactsCountryIso2Extension on OpenFoodFactsCountry { + // Uses iso2Code to display the UI and emoji. + String get iso2Code => + this == OpenFoodFactsCountry.UNITED_KINGDOM ? 'GB' : offTag.toUpperCase(); +} diff --git a/packages/smooth_app/lib/pages/preferences/country_selector/tmp_country_iso3.dart b/packages/smooth_app/lib/pages/preferences/country_selector/tmp_country_iso3.dart new file mode 100644 index 000000000000..525c7c80a22b --- /dev/null +++ b/packages/smooth_app/lib/pages/preferences/country_selector/tmp_country_iso3.dart @@ -0,0 +1,255 @@ +import 'package:openfoodfacts/openfoodfacts.dart'; + +// This map should eventually move to openfoodfacts-dart as a shared utility. +const Map tmpCountryIso3 = + { + OpenFoodFactsCountry.ANDORRA: 'AND', + OpenFoodFactsCountry.UNITED_ARAB_EMIRATES: 'ARE', + OpenFoodFactsCountry.AFGHANISTAN: 'AFG', + OpenFoodFactsCountry.ANTIGUA_AND_BARBUDA: 'ATG', + OpenFoodFactsCountry.ANGUILLA: 'AIA', + OpenFoodFactsCountry.ALBANIA: 'ALB', + OpenFoodFactsCountry.ARMENIA: 'ARM', + OpenFoodFactsCountry.ANGOLA: 'AGO', + OpenFoodFactsCountry.ANTARCTICA: 'ATA', + OpenFoodFactsCountry.ARGENTINA: 'ARG', + OpenFoodFactsCountry.AMERICAN_SAMOA: 'ASM', + OpenFoodFactsCountry.AUSTRIA: 'AUT', + OpenFoodFactsCountry.AUSTRALIA: 'AUS', + OpenFoodFactsCountry.ARUBA: 'ABW', + OpenFoodFactsCountry.ALAND_ISLANDS: 'ALA', + OpenFoodFactsCountry.AZERBAIJAN: 'AZE', + OpenFoodFactsCountry.BOSNIA_AND_HERZEGOVINA: 'BIH', + OpenFoodFactsCountry.BARBADOS: 'BRB', + OpenFoodFactsCountry.BANGLADESH: 'BGD', + OpenFoodFactsCountry.BELGIUM: 'BEL', + OpenFoodFactsCountry.BURKINA_FASO: 'BFA', + OpenFoodFactsCountry.BULGARIA: 'BGR', + OpenFoodFactsCountry.BAHRAIN: 'BHR', + OpenFoodFactsCountry.BURUNDI: 'BDI', + OpenFoodFactsCountry.BENIN: 'BEN', + OpenFoodFactsCountry.SAINT_BARTHELEMY: 'BLM', + OpenFoodFactsCountry.BERMUDA: 'BMU', + OpenFoodFactsCountry.BRUNEI_DARUSSALAM: 'BRN', + OpenFoodFactsCountry.BOLIVIA: 'BOL', + OpenFoodFactsCountry.BONAIRE: 'BES', + OpenFoodFactsCountry.BRAZIL: 'BRA', + OpenFoodFactsCountry.BAHAMAS: 'BHS', + OpenFoodFactsCountry.BHUTAN: 'BTN', + OpenFoodFactsCountry.BOUVET_ISLAND: 'BVT', + OpenFoodFactsCountry.BOTSWANA: 'BWA', + OpenFoodFactsCountry.BELARUS: 'BLR', + OpenFoodFactsCountry.BELIZE: 'BLZ', + OpenFoodFactsCountry.CANADA: 'CAN', + OpenFoodFactsCountry.COCOS_ISLANDS: 'CCK', + OpenFoodFactsCountry.DEMOCRATIC_REPUBLIC_OF_THE_CONGO: 'COD', + OpenFoodFactsCountry.CENTRAL_AFRICAN_REPUBLIC: 'CAF', + OpenFoodFactsCountry.CONGO: 'COG', + OpenFoodFactsCountry.SWITZERLAND: 'CHE', + OpenFoodFactsCountry.COTE_D_IVOIRE: 'CIV', + OpenFoodFactsCountry.COOK_ISLANDS: 'COK', + OpenFoodFactsCountry.CHILE: 'CHL', + OpenFoodFactsCountry.CAMEROON: 'CMR', + OpenFoodFactsCountry.CHINA: 'CHN', + OpenFoodFactsCountry.COLOMBIA: 'COL', + OpenFoodFactsCountry.COSTA_RICA: 'CRI', + OpenFoodFactsCountry.CUBA: 'CUB', + OpenFoodFactsCountry.CABO_VERDE: 'CPV', + OpenFoodFactsCountry.CURACAO: 'CUW', + OpenFoodFactsCountry.CHRISTMAS_ISLAND: 'CXR', + OpenFoodFactsCountry.CYPRUS: 'CYP', + OpenFoodFactsCountry.CZECHIA: 'CZE', + OpenFoodFactsCountry.GERMANY: 'DEU', + OpenFoodFactsCountry.DJIBOUTI: 'DJI', + OpenFoodFactsCountry.DENMARK: 'DNK', + OpenFoodFactsCountry.DOMINICA: 'DMA', + OpenFoodFactsCountry.DOMINICAN_REPUBLIC: 'DOM', + OpenFoodFactsCountry.ALGERIA: 'DZA', + OpenFoodFactsCountry.ECUADOR: 'ECU', + OpenFoodFactsCountry.ESTONIA: 'EST', + OpenFoodFactsCountry.EGYPT: 'EGY', + OpenFoodFactsCountry.WESTERN_SAHARA: 'ESH', + OpenFoodFactsCountry.ERITREA: 'ERI', + OpenFoodFactsCountry.SPAIN: 'ESP', + OpenFoodFactsCountry.ETHIOPIA: 'ETH', + OpenFoodFactsCountry.FINLAND: 'FIN', + OpenFoodFactsCountry.FIJI: 'FJI', + OpenFoodFactsCountry.FALKLAND_ISLANDS: 'FLK', + OpenFoodFactsCountry.MICRONESIA: 'FSM', + OpenFoodFactsCountry.FAROE_ISLANDS: 'FRO', + OpenFoodFactsCountry.FRANCE: 'FRA', + OpenFoodFactsCountry.GABON: 'GAB', + OpenFoodFactsCountry.UNITED_KINGDOM: 'GBR', + OpenFoodFactsCountry.GRENADA: 'GRD', + OpenFoodFactsCountry.GEORGIA: 'GEO', + OpenFoodFactsCountry.FRENCH_GUIANA: 'GUF', + OpenFoodFactsCountry.GUERNSEY: 'GGY', + OpenFoodFactsCountry.GHANA: 'GHA', + OpenFoodFactsCountry.GIBRALTAR: 'GIB', + OpenFoodFactsCountry.GREENLAND: 'GRL', + OpenFoodFactsCountry.GAMBIA: 'GMB', + OpenFoodFactsCountry.GUINEA: 'GIN', + OpenFoodFactsCountry.GUADELOUPE: 'GLP', + OpenFoodFactsCountry.EQUATORIAL_GUINEA: 'GNQ', + OpenFoodFactsCountry.GREECE: 'GRC', + OpenFoodFactsCountry.SOUTH_GEORGIA: 'SGS', + OpenFoodFactsCountry.GUATEMALA: 'GTM', + OpenFoodFactsCountry.GUAM: 'GUM', + OpenFoodFactsCountry.GUINEA_BISSAU: 'GNB', + OpenFoodFactsCountry.GUYANA: 'GUY', + OpenFoodFactsCountry.HONG_KONG: 'HKG', + OpenFoodFactsCountry.HEARD_ISLAND: 'HMD', + OpenFoodFactsCountry.HONDURAS: 'HND', + OpenFoodFactsCountry.CROATIA: 'HRV', + OpenFoodFactsCountry.HAITI: 'HTI', + OpenFoodFactsCountry.HUNGARY: 'HUN', + OpenFoodFactsCountry.INDONESIA: 'IDN', + OpenFoodFactsCountry.IRELAND: 'IRL', + OpenFoodFactsCountry.ISRAEL: 'ISR', + OpenFoodFactsCountry.ISLE_OF_MAN: 'IMN', + OpenFoodFactsCountry.INDIA: 'IND', + OpenFoodFactsCountry.BRITISH_INDIAN_OCEAN_TERRITORY: 'IOT', + OpenFoodFactsCountry.IRAQ: 'IRQ', + OpenFoodFactsCountry.IRAN: 'IRN', + OpenFoodFactsCountry.ICELAND: 'ISL', + OpenFoodFactsCountry.ITALY: 'ITA', + OpenFoodFactsCountry.JERSEY: 'JEY', + OpenFoodFactsCountry.JAMAICA: 'JAM', + OpenFoodFactsCountry.JORDAN: 'JOR', + OpenFoodFactsCountry.JAPAN: 'JPN', + OpenFoodFactsCountry.KENYA: 'KEN', + OpenFoodFactsCountry.KYRGYZSTAN: 'KGZ', + OpenFoodFactsCountry.CAMBODIA: 'KHM', + OpenFoodFactsCountry.KIRIBATI: 'KIR', + OpenFoodFactsCountry.COMOROS: 'COM', + OpenFoodFactsCountry.SAINT_KITTS_AND_NEVIS: 'KNA', + OpenFoodFactsCountry.NORTH_KOREA: 'PRK', + OpenFoodFactsCountry.SOUTH_KOREA: 'KOR', + OpenFoodFactsCountry.KUWAIT: 'KWT', + OpenFoodFactsCountry.CAYMAN_ISLANDS: 'CYM', + OpenFoodFactsCountry.KAZAKHSTAN: 'KAZ', + OpenFoodFactsCountry.LAOS: 'LAO', + OpenFoodFactsCountry.LEBANON: 'LBN', + OpenFoodFactsCountry.SAINT_LUCIA: 'LCA', + OpenFoodFactsCountry.LIECHTENSTEIN: 'LIE', + OpenFoodFactsCountry.SRI_LANKA: 'LKA', + OpenFoodFactsCountry.LIBERIA: 'LBR', + OpenFoodFactsCountry.LESOTHO: 'LSO', + OpenFoodFactsCountry.LITHUANIA: 'LTU', + OpenFoodFactsCountry.LUXEMBOURG: 'LUX', + OpenFoodFactsCountry.LATVIA: 'LVA', + OpenFoodFactsCountry.LIBYA: 'LBY', + OpenFoodFactsCountry.MOROCCO: 'MAR', + OpenFoodFactsCountry.MONACO: 'MCO', + OpenFoodFactsCountry.MOLDOVA: 'MDA', + OpenFoodFactsCountry.MONTENEGRO: 'MNE', + OpenFoodFactsCountry.SAINT_MARTIN: 'MAF', + OpenFoodFactsCountry.MADAGASCAR: 'MDG', + OpenFoodFactsCountry.MARSHALL_ISLANDS: 'MHL', + OpenFoodFactsCountry.NORTH_MACEDONIA: 'MKD', + OpenFoodFactsCountry.MALI: 'MLI', + OpenFoodFactsCountry.MYANMAR: 'MMR', + OpenFoodFactsCountry.MONGOLIA: 'MNG', + OpenFoodFactsCountry.MACAO: 'MAC', + OpenFoodFactsCountry.NORTHERN_MARIANA_ISLANDS: 'MNP', + OpenFoodFactsCountry.MARTINIQUE: 'MTQ', + OpenFoodFactsCountry.MAURITANIA: 'MRT', + OpenFoodFactsCountry.MONTSERRAT: 'MSR', + OpenFoodFactsCountry.MALTA: 'MLT', + OpenFoodFactsCountry.MAURITIUS: 'MUS', + OpenFoodFactsCountry.MALDIVES: 'MDV', + OpenFoodFactsCountry.MALAWI: 'MWI', + OpenFoodFactsCountry.MEXICO: 'MEX', + OpenFoodFactsCountry.MALAYSIA: 'MYS', + OpenFoodFactsCountry.MOZAMBIQUE: 'MOZ', + OpenFoodFactsCountry.NAMIBIA: 'NAM', + OpenFoodFactsCountry.NEW_CALEDONIA: 'NCL', + OpenFoodFactsCountry.NIGER: 'NER', + OpenFoodFactsCountry.NORFOLK_ISLAND: 'NFK', + OpenFoodFactsCountry.NIGERIA: 'NGA', + OpenFoodFactsCountry.NICARAGUA: 'NIC', + OpenFoodFactsCountry.NETHERLANDS: 'NLD', + OpenFoodFactsCountry.NORWAY: 'NOR', + OpenFoodFactsCountry.NEPAL: 'NPL', + OpenFoodFactsCountry.NAURU: 'NRU', + OpenFoodFactsCountry.NIUE: 'NIU', + OpenFoodFactsCountry.NEW_ZEALAND: 'NZL', + OpenFoodFactsCountry.OMAN: 'OMN', + OpenFoodFactsCountry.PANAMA: 'PAN', + OpenFoodFactsCountry.PERU: 'PER', + OpenFoodFactsCountry.FRENCH_POLYNESIA: 'PYF', + OpenFoodFactsCountry.PAPUA_NEW_GUINEA: 'PNG', + OpenFoodFactsCountry.PHILIPPINES: 'PHL', + OpenFoodFactsCountry.PAKISTAN: 'PAK', + OpenFoodFactsCountry.POLAND: 'POL', + OpenFoodFactsCountry.SAINT_PIERRE_AND_MIQUELON: 'SPM', + OpenFoodFactsCountry.PITCAIRN: 'PCN', + OpenFoodFactsCountry.PUERTO_RICO: 'PRI', + OpenFoodFactsCountry.PALESTINE: 'PSE', + OpenFoodFactsCountry.PORTUGAL: 'PRT', + OpenFoodFactsCountry.PALAU: 'PLW', + OpenFoodFactsCountry.PARAGUAY: 'PRY', + OpenFoodFactsCountry.QATAR: 'QAT', + OpenFoodFactsCountry.REUNION: 'REU', + OpenFoodFactsCountry.ROMANIA: 'ROU', + OpenFoodFactsCountry.SERBIA: 'SRB', + OpenFoodFactsCountry.RUSSIA: 'RUS', + OpenFoodFactsCountry.RWANDA: 'RWA', + OpenFoodFactsCountry.SAUDI_ARABIA: 'SAU', + OpenFoodFactsCountry.SOLOMON_ISLANDS: 'SLB', + OpenFoodFactsCountry.SEYCHELLES: 'SYC', + OpenFoodFactsCountry.SUDAN: 'SDN', + OpenFoodFactsCountry.SWEDEN: 'SWE', + OpenFoodFactsCountry.SINGAPORE: 'SGP', + OpenFoodFactsCountry.SAINT_HELENA: 'SHN', + OpenFoodFactsCountry.SLOVENIA: 'SVN', + OpenFoodFactsCountry.SVALBARD_AND_JAN_MAYEN: 'SJM', + OpenFoodFactsCountry.SLOVAKIA: 'SVK', + OpenFoodFactsCountry.SIERRA_LEONE: 'SLE', + OpenFoodFactsCountry.SAN_MARINO: 'SMR', + OpenFoodFactsCountry.SENEGAL: 'SEN', + OpenFoodFactsCountry.SOMALIA: 'SOM', + OpenFoodFactsCountry.SURINAME: 'SUR', + OpenFoodFactsCountry.SOUTH_SUDAN: 'SSD', + OpenFoodFactsCountry.SAO_TOME_AND_PRINCIPE: 'STP', + OpenFoodFactsCountry.EL_SALVADOR: 'SLV', + OpenFoodFactsCountry.SINT_MAARTEN: 'SXM', + OpenFoodFactsCountry.SYRIA: 'SYR', + OpenFoodFactsCountry.ESWATINI: 'SWZ', + OpenFoodFactsCountry.TURKS_AND_CAICOS_ISLANDS: 'TCA', + OpenFoodFactsCountry.CHAD: 'TCD', + OpenFoodFactsCountry.FRENCH_SOUTHERN_TERRITORIES: 'ATF', + OpenFoodFactsCountry.TOGO: 'TGO', + OpenFoodFactsCountry.THAILAND: 'THA', + OpenFoodFactsCountry.TAJIKISTAN: 'TJK', + OpenFoodFactsCountry.TOKELAU: 'TKL', + OpenFoodFactsCountry.TIMOR_LESTE: 'TLS', + OpenFoodFactsCountry.TURKMENISTAN: 'TKM', + OpenFoodFactsCountry.TUNISIA: 'TUN', + OpenFoodFactsCountry.TONGA: 'TON', + OpenFoodFactsCountry.TURKEY: 'TUR', + OpenFoodFactsCountry.TRINIDAD_AND_TOBAGO: 'TTO', + OpenFoodFactsCountry.TUVALU: 'TUV', + OpenFoodFactsCountry.TAIWAN: 'TWN', + OpenFoodFactsCountry.TANZANIA: 'TZA', + OpenFoodFactsCountry.UKRAINE: 'UKR', + OpenFoodFactsCountry.UGANDA: 'UGA', + OpenFoodFactsCountry.UNITED_STATES_MINOR_OUTLYING_ISLANDS: 'UMI', + OpenFoodFactsCountry.USA: 'USA', + OpenFoodFactsCountry.URUGUAY: 'URY', + OpenFoodFactsCountry.UZBEKISTAN: 'UZB', + OpenFoodFactsCountry.HOLY_SEE: 'VAT', + OpenFoodFactsCountry.SAINT_VINCENT_AND_THE_GRENADINES: 'VCT', + OpenFoodFactsCountry.VENEZUELA: 'VEN', + OpenFoodFactsCountry.BRITISH_VIRGIN_ISLANDS: 'VGB', + OpenFoodFactsCountry.US_VIRGIN_ISLANDS: 'VIR', + OpenFoodFactsCountry.VIET_NAM: 'VNM', + OpenFoodFactsCountry.VANUATU: 'VUT', + OpenFoodFactsCountry.WALLIS_AND_FUTUNA: 'WLF', + OpenFoodFactsCountry.SAMOA: 'WSM', + OpenFoodFactsCountry.YEMEN: 'YEM', + OpenFoodFactsCountry.MAYOTTE: 'MYT', + OpenFoodFactsCountry.SOUTH_AFRICA: 'ZAF', + OpenFoodFactsCountry.ZAMBIA: 'ZMB', + OpenFoodFactsCountry.ZIMBABWE: 'ZWE', +}; diff --git a/packages/smooth_app/lib/pages/prices/emoji_helper.dart b/packages/smooth_app/lib/pages/prices/emoji_helper.dart index 57a5d2b6aff4..ea3deb636791 100644 --- a/packages/smooth_app/lib/pages/prices/emoji_helper.dart +++ b/packages/smooth_app/lib/pages/prices/emoji_helper.dart @@ -1,6 +1,9 @@ import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/pages/preferences/country_selector/openfoodfacts_country_iso2code_extension.dart'; /// Generic helper about emoji display. +/// +/// cf. https://emojipedia.org/flag-italy class EmojiHelper { const EmojiHelper._(); @@ -11,16 +14,13 @@ class EmojiHelper { if (country == null) { return null; } - return getEmojiByCountryCode(country.offTag); + return getEmojiByCountryCode(country.iso2Code); } static String? getEmojiByCountryCode(final String countryCode) { if (countryCode.isEmpty) { return null; - } else if (countryCode.toUpperCase() == 'UK') { - return _getCountryEmojiFromUnicode('GB'); } - return _getCountryEmojiFromUnicode(countryCode); } @@ -35,7 +35,7 @@ class EmojiHelper { if (countryLetterEmoji1 == null) { return null; } - //OpenFoodFactsCountry + final String? countryLetterEmoji2 = _getCountryLetterEmoji( unicode.substring(1, 2), ); diff --git a/packages/smooth_app/lib/pages/product/common/product_query_page.dart b/packages/smooth_app/lib/pages/product/common/product_query_page.dart index d7cb513ee821..3dcd8a691667 100644 --- a/packages/smooth_app/lib/pages/product/common/product_query_page.dart +++ b/packages/smooth_app/lib/pages/product/common/product_query_page.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:iso_countries/iso_countries.dart'; import 'package:matomo_tracker/matomo_tracker.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:provider/provider.dart'; @@ -20,6 +19,7 @@ import 'package:smooth_app/generic_lib/widgets/smooth_card.dart'; import 'package:smooth_app/generic_lib/widgets/smooth_error_card.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; import 'package:smooth_app/pages/personalized_ranking_page.dart'; +import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; import 'package:smooth_app/pages/product/common/loading_status.dart'; import 'package:smooth_app/pages/product/common/product_list_item_simple.dart'; import 'package:smooth_app/pages/product/common/product_query_page_helper.dart'; @@ -373,72 +373,63 @@ class _ProductQueryPageState extends State final PagedProductQuery pagedProductQuery = _model.supplier.productQuery; final PagedProductQuery? worldQuery = pagedProductQuery.getWorldQuery(); - return FutureBuilder( - future: _getTranslatedCountry(), - builder: ( - final BuildContext context, - final AsyncSnapshot snapshot, - ) { - final AppLocalizations appLocalizations = AppLocalizations.of(context); - final List messages = []; - String counting = appLocalizations.user_list_length( - _model.supplier.partialProductList.totalSize, - ); - if (pagedProductQuery.hasDifferentCountryWorldData()) { - if (pagedProductQuery.world) { - counting += ' (${appLocalizations.world_results_label})'; - } else { - if (snapshot.data != null) { - counting += ' (${snapshot.data})'; - } - } - } - messages.add(counting); - final int? lastUpdate = _model.supplier.timestamp; - if (lastUpdate != null) { - final String lastTime = - ProductQueryPageHelper.getDurationStringFromTimestamp( - lastUpdate, context); - messages.add('${appLocalizations.cached_results_from} $lastTime'); + final AppLocalizations appLocalizations = AppLocalizations.of(context); + final List messages = []; + + String counting = appLocalizations.user_list_length( + _model.supplier.partialProductList.totalSize, + ); + + final String? translatedCountry = _getTranslatedCountry(); + + if (pagedProductQuery.hasDifferentCountryWorldData()) { + if (pagedProductQuery.world) { + counting += ' (${appLocalizations.world_results_label})'; + } else { + if (translatedCountry != null) { + counting += ' ($translatedCountry)'; } - return SizedBox( - width: double.infinity, - child: SmoothCard( - child: Padding( - padding: const EdgeInsets.all(SMALL_SPACE), - child: Row( - children: [ - Expanded(child: Text(messages.join('\n'))), - if (pagedProductQuery.getWorldQuery() != null) - _getIconButton( - _getWorldAction( - appLocalizations, - worldQuery!, - widget.includeAppBar, - ), - ), - ], - ), - ), + } + } + + messages.add(counting); + + final int? lastUpdate = _model.supplier.timestamp; + if (lastUpdate != null) { + final String lastTime = + ProductQueryPageHelper.getDurationStringFromTimestamp( + lastUpdate, context); + messages.add('${appLocalizations.cached_results_from} $lastTime'); + } + + return SizedBox( + width: double.infinity, + child: SmoothCard( + child: Padding( + padding: const EdgeInsets.all(SMALL_SPACE), + child: Row( + children: [ + Expanded(child: Text(messages.join('\n'))), + if (pagedProductQuery.getWorldQuery() != null) + _getIconButton( + _getWorldAction( + appLocalizations, + worldQuery!, + widget.includeAppBar, + ), + ), + ], ), - ); - }, + ), + ), ); } - Future _getTranslatedCountry() async { + String? _getTranslatedCountry() { if (_country == null) { return null; } - final String locale = Localizations.localeOf(context).languageCode; - final List localizedCountries = - await IsoCountries.isoCountriesForLocale(locale); - for (final Country country in localizedCountries) { - if (country.countryCode.toLowerCase() == _country?.offTag.toLowerCase()) { - return country.name; - } - } - return null; + return LocalizedCountry.getSingleLocalizedName(_country!); } Widget _getLargeButtonWithIcon(final _Action action) => diff --git a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart index a09ac22339cb..2abe2e236f44 100644 --- a/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart +++ b/packages/smooth_app/lib/pages/product/simple_input_page_helpers.dart @@ -1,7 +1,6 @@ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:iso_countries/country.dart'; import 'package:openfoodfacts/openfoodfacts.dart'; import 'package:smooth_app/background/background_task_details.dart'; import 'package:smooth_app/data_models/preferences/user_preferences.dart'; @@ -9,7 +8,7 @@ import 'package:smooth_app/generic_lib/design_constants.dart'; import 'package:smooth_app/helpers/analytics_helper.dart'; import 'package:smooth_app/helpers/product_cards_helper.dart'; import 'package:smooth_app/pages/image_crop_page.dart'; -import 'package:smooth_app/pages/preferences/country_selector/country_selector.dart'; +import 'package:smooth_app/pages/preferences/country_selector/localized_country.dart'; import 'package:smooth_app/pages/product/multilingual_helper.dart'; import 'package:smooth_app/query/product_query.dart'; import 'package:smooth_app/resources/app_icons.dart' as icons; @@ -926,22 +925,16 @@ class SimpleInputPageCategoryNotFoodHelper /// Implementation for "Countries" of an [AbstractSimpleInputPageHelper]. class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { SimpleInputPageCountryHelper(UserPreferences userPreferences) - : _userCountryCode = userPreferences.userCountryCode ?? 'en' { - CountriesHelper.getCountries( - getLanguage().offTag, - ).then((List? countries) { - _countries = countries ?? []; - }); - } + : _userCountry = + OpenFoodFactsCountry.fromOffTag(userPreferences.userCountryCode) ?? + OpenFoodFactsCountry.FRANCE; - final String _userCountryCode; + final OpenFoodFactsCountry _userCountry; ValueNotifier _suggestionsNotifier = ValueNotifier( const SimpleInputSuggestionsLoading(), ); - List? _countries; - @override List initTerms(final Product product) => product.countriesTagsInLanguages?[getLanguage()] ?? []; @@ -991,19 +984,10 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { _suggestionsNotifier; Future _reloadSuggestions() async { - _countries ??= await CountriesHelper.getCountries( - getLanguage().offTag, - ); - if (_countries == null) { - _suggestionsNotifier.value = const SimpleInputSuggestionsNoSuggestion(); - return; - } - - final Country? country = _countries!.firstWhereOrNull( - (Country country) => country.countryCode == _userCountryCode, - ); + final String? localizedName = + LocalizedCountry.getSingleLocalizedName(_userCountry); - if (country == null || _terms.contains(country.name) == true) { + if (localizedName == null || _terms.contains(localizedName)) { _suggestionsNotifier.value = const SimpleInputSuggestionsLoaded( suggestions: [], ); @@ -1011,7 +995,7 @@ class SimpleInputPageCountryHelper extends AbstractSimpleInputPageHelper { } _suggestionsNotifier.value = SimpleInputSuggestionsLoaded( - suggestions: [country.name], + suggestions: [localizedName], ); } diff --git a/packages/smooth_app/pubspec.yaml b/packages/smooth_app/pubspec.yaml index f5acc43607e2..09518e8c29ae 100644 --- a/packages/smooth_app/pubspec.yaml +++ b/packages/smooth_app/pubspec.yaml @@ -27,7 +27,7 @@ dependencies: http: 1.3.0 http_parser: 4.1.2 image_picker: 1.1.2 - iso_countries: 2.2.0 + l10n_countries: 1.0.0 latlong2: 0.9.1 matomo_tracker: 5.1.0 package_info_plus: 8.2.1 @@ -85,11 +85,11 @@ dependencies: app_store_uri: path: ../app_store/uri_store - # We use two different scanning engines, + # We use two different scanning engines, # mobile scanner powered by ML Kit for the Play Store and Apple App Store, # but qr_code_scanner which uses the open source ZXing for F-Droid camera: 0.11.1 - + scanner_shared: path: ../scanner/shared @@ -100,7 +100,7 @@ dependencies: path: ../scanner/zxing - openfoodfacts: 3.20.0 + openfoodfacts: 3.21.0 # openfoodfacts: # path: ../../../openfoodfacts-dart