diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ecec8c..fa797fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 3.3.1 - August 19 2025 +- Fix French translation accent display issue +- Correct French country name translations (Biélorussie, Koweït, Grenade, etc.) +- Preserve accents in displayed names while maintaining search functionality +- Update search logic to handle both accented and non-accented input + ## 3.3.0 - March 26 2025 - Fix localization, typo, and flag issue #51 thanks to @MrRoy121 diff --git a/lib/src/country_code.dart b/lib/src/country_code.dart index cf10c9a..069f0e8 100644 --- a/lib/src/country_code.dart +++ b/lib/src/country_code.dart @@ -1,5 +1,4 @@ import 'package:collection/collection.dart' show IterableExtension; -import 'package:diacritic/diacritic.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart' show kDebugMode; @@ -45,7 +44,9 @@ class CountryCode { try { return CountryCode.fromCountryCode(countryCode); } catch (e) { - if (kDebugMode) print('Failed to recognize country from countryCode: $countryCode'); + if (kDebugMode) { + print('Failed to recognize country from countryCode: $countryCode'); + } return null; } } @@ -61,20 +62,21 @@ class CountryCode { try { return CountryCode.fromDialCode(dialCode); } catch (e) { - if (kDebugMode) print('Failed to recognize country from dialCode: $dialCode'); + if (kDebugMode) { + print('Failed to recognize country from dialCode: $dialCode'); + } return null; } } CountryCode localize(BuildContext context) { final nam = CountryLocalizations.of(context)?.translate(code) ?? name; - return this - ..name = nam == null? name : removeDiacritics(nam); + return this..name = nam ?? name; } factory CountryCode.fromJson(Map json) { return CountryCode( - name: removeDiacritics(json['name']), + name: json['name'], code: json['code'], dialCode: json['dial_code'], flagUri: 'flags/${json['code'].toLowerCase()}.png', diff --git a/lib/src/i18n/fr.json b/lib/src/i18n/fr.json index e7ea4d0..fbabac9 100644 --- a/lib/src/i18n/fr.json +++ b/lib/src/i18n/fr.json @@ -18,7 +18,7 @@ "BH": "Bahrein", "BD": "Bangladesh", "BB": "Barbade", - "BY": "Bielorussie", + "BY": "Biélorussie", "BE": "Belgique", "BZ": "Belize", "BJ": "Bénin", @@ -38,7 +38,7 @@ "CM": "Cameroun", "CA": "Canada", "CV": "Cap-Vert", - "KY": "Caïmanes", + "KY": "Îles Caïmans", "CF": "Centrafricaine, République", "TD": "Tchad", "CL": "Chili", @@ -83,7 +83,7 @@ "GI": "Gibraltar", "GR": "Grèce", "GL": "Groenland", - "GD": "Grenada", + "GD": "Grenade", "GP": "Guadeloupe", "GU": "Guam", "GT": "Guatemala", @@ -110,9 +110,9 @@ "KZ": "Kazakhstan", "KE": "Kenya", "KI": "Kiribati", - "KP": "Corée du Nord, République populaire démocratique", - "KR": "Corée du Sud, République", - "KW": "Koweit", + "KP": "Corée du Nord", + "KR": "Corée du Sud", + "KW": "Koweït", "KG": "Kirghistan", "LA": "Laos", "LV": "Lettonie", @@ -179,7 +179,7 @@ "SH": "Sainte-Hélène", "KN": "Saint-Christophe-et-Niévès", "LC": "Sainte-Lucie", - "PM": "Saint Pierre and Miquelon", + "PM": "Saint-Pierre-et-Miquelon", "VC": "Saint-Vincent et les Grenadines", "WS": "Samoa", "SM": "Saint-Marin", @@ -200,15 +200,15 @@ "SD": "Soudan", "SR": "Suriname", "SJ": "Svalbard et Île Jan Mayen", - "SZ": "Ngwane, Royaume d'Eswatini", + "SZ": "Eswatini", "SE": "Suède", "CH": "Suisse", "SY": "Syrie", "TW": "Taïwan", "TJ": "Tadjikistan", - "TZ": "Tanzanie, République unie", + "TZ": "Tanzanie", "TH": "Thaïlande", - "TL": "Timor Leste", + "TL": "Timor-Leste", "TG": "Togo", "TK": "Tokelau", "TO": "Tonga", diff --git a/lib/src/selection_dialog.dart b/lib/src/selection_dialog.dart index 46cc466..050d359 100644 --- a/lib/src/selection_dialog.dart +++ b/lib/src/selection_dialog.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:diacritic/diacritic.dart'; import 'country_code.dart'; import 'country_localizations.dart'; @@ -50,7 +51,7 @@ class SelectionDialog extends StatefulWidget { InputDecoration searchDecoration = const InputDecoration(), this.searchStyle, this.textStyle, - required this.topBarPadding, + required this.topBarPadding, this.headerText, this.boxDecoration, this.showFlag, @@ -62,9 +63,12 @@ class SelectionDialog extends StatefulWidget { this.hideSearch = false, this.hideCloseIcon = false, this.closeIcon, - this.dialogItemPadding = const EdgeInsets.symmetric(horizontal: 24, vertical: 8), + this.dialogItemPadding = + const EdgeInsets.symmetric(horizontal: 24, vertical: 8), this.searchPadding = const EdgeInsets.symmetric(horizontal: 24), - }) : searchDecoration = searchDecoration.prefixIcon == null ? searchDecoration.copyWith(prefixIcon: const Icon(Icons.search)) : searchDecoration, + }) : searchDecoration = searchDecoration.prefixIcon == null + ? searchDecoration.copyWith(prefixIcon: const Icon(Icons.search)) + : searchDecoration, super(key: key); @override @@ -81,7 +85,8 @@ class _SelectionDialogState extends State { child: Container( clipBehavior: Clip.hardEdge, width: widget.size?.width ?? MediaQuery.of(context).size.width, - height: widget.size?.height ?? MediaQuery.of(context).size.height * 0.85, + height: + widget.size?.height ?? MediaQuery.of(context).size.height * 0.85, decoration: widget.boxDecoration ?? BoxDecoration( color: widget.backgroundColor ?? Colors.white, @@ -100,7 +105,9 @@ class _SelectionDialogState extends State { crossAxisAlignment: CrossAxisAlignment.end, children: [ Padding( - padding:!widget.hideHeaderText? widget.topBarPadding: EdgeInsets.zero, + padding: !widget.hideHeaderText + ? widget.topBarPadding + : EdgeInsets.zero, child: Row( mainAxisAlignment: widget.headerAlignment, children: [ @@ -177,11 +184,14 @@ class _SelectionDialogState extends State { if (widget.showFlag!) Flexible( child: Container( - margin: Directionality.of(context) == TextDirection.ltr // Here Adding padding depending on the locale language direction + margin: Directionality.of(context) == + TextDirection + .ltr // Here Adding padding depending on the locale language direction ? const EdgeInsets.only(right: 16.0) : const EdgeInsets.only(left: 16.0), decoration: widget.flagDecoration, - clipBehavior: widget.flagDecoration == null ? Clip.none : Clip.hardEdge, + clipBehavior: + widget.flagDecoration == null ? Clip.none : Clip.hardEdge, child: Image.asset( e.flagUri!, package: 'country_code_picker', @@ -192,7 +202,9 @@ class _SelectionDialogState extends State { Expanded( flex: 4, child: Text( - widget.showCountryOnly! ? e.toCountryStringOnly() : e.toLongString(), + widget.showCountryOnly! + ? e.toCountryStringOnly() + : e.toLongString(), overflow: TextOverflow.fade, style: widget.textStyle, ), @@ -208,7 +220,8 @@ class _SelectionDialogState extends State { } return Center( - child: Text(CountryLocalizations.of(context)?.translate('no_country') ?? 'No country found'), + child: Text(CountryLocalizations.of(context)?.translate('no_country') ?? + 'No country found'), ); } @@ -219,9 +232,15 @@ class _SelectionDialogState extends State { } void _filterElements(String s) { - s = s.toUpperCase(); + final normalizedSearch = removeDiacritics(s.toUpperCase()); setState(() { - filteredElements = widget.elements.where((e) => e.code!.contains(s) || e.dialCode!.contains(s) || e.name!.toUpperCase().contains(s)).toList(); + filteredElements = widget.elements + .where((e) => + e.code!.contains(normalizedSearch) || + e.dialCode!.contains(normalizedSearch) || + removeDiacritics(e.name!.toUpperCase()) + .contains(normalizedSearch)) + .toList(); }); } diff --git a/pubspec.yaml b/pubspec.yaml index c274e60..56d3407 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: country_code_picker description: A flutter package for showing a country code selector. In addition it gives the possibility to select a list of favorites countries, as well as to search using a simple searchbox -version: 3.3.0 +version: 3.3.1 homepage: https://github.com/chandrabezzo/CountryCodePicker repository: https://github.com/chandrabezzo/CountryCodePicker issue_tracker: https://github.com/imtoori/CountryCodePicker/issues