diff --git a/android/fastlane/metadata/android/de-DE/changelogs/50.txt b/android/fastlane/metadata/android/de-DE/changelogs/50.txt new file mode 100644 index 0000000..acb5e08 --- /dev/null +++ b/android/fastlane/metadata/android/de-DE/changelogs/50.txt @@ -0,0 +1,2 @@ +* Beheben von inkorrekter Lokalisierung in der App +* Hinzufügen der Unterscheidung zwischen US und GB Englisch \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/50.txt b/android/fastlane/metadata/android/en-US/changelogs/50.txt new file mode 100644 index 0000000..4e7e5f7 --- /dev/null +++ b/android/fastlane/metadata/android/en-US/changelogs/50.txt @@ -0,0 +1,2 @@ +* Fixed incorrect localizations of dates and other texts +* Add discrimination between US and GB English (useful for date input) \ No newline at end of file diff --git a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart index 7a8cac1..aac24e4 100644 --- a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart +++ b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/extended_date_range_dialog.dart @@ -146,7 +146,7 @@ class _ExtendedDateRangeDialogState extends State { ) : null, ), - format: DateFormat.yMd(), + format: DateFormat.yMd(Localizations.localeOf(context).toString()), lastDate: _dateTimeMax(_before, DateTime.now()), inputType: InputType.date, onChanged: (after) { @@ -174,7 +174,7 @@ class _ExtendedDateRangeDialogState extends State { ) : null, ), - format: DateFormat.yMd(), + format: DateFormat.yMd(Localizations.localeOf(context).toString()), firstDate: _after, lastDate: DateTime.now(), onChanged: (before) { diff --git a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart index b8f5a64..93355a8 100644 --- a/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart +++ b/lib/core/widgets/form_builder_fields/extended_date_range_form_field/form_builder_extended_date_range_picker.dart @@ -79,7 +79,7 @@ class _FormBuilderExtendedDateRangePickerState } String _dateRangeQueryToString(DateRangeQuery query) { - final df = DateFormat.yMd(); + final df = DateFormat.yMd(Localizations.localeOf(context).toString()); if (query is UnsetDateRangeQuery) { return ''; } else if (query is AbsoluteDateRangeQuery) { diff --git a/lib/features/app_drawer/view/app_drawer.dart b/lib/features/app_drawer/view/app_drawer.dart index f328d2c..3714f4d 100644 --- a/lib/features/app_drawer/view/app_drawer.dart +++ b/lib/features/app_drawer/view/app_drawer.dart @@ -4,6 +4,7 @@ import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:paperless_mobile/constants.dart'; +import 'package:paperless_mobile/core/database/tables/local_user_account.dart'; import 'package:paperless_mobile/core/widgets/paperless_logo.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/documents/cubit/documents_cubit.dart'; @@ -22,6 +23,10 @@ class AppDrawer extends StatelessWidget { @override Widget build(BuildContext context) { + final currentAccount = context.watch(); + final username = currentAccount.paperlessUser.username; + final serverUrl = + currentAccount.serverUrl.replaceAll(RegExp(r'https?://'), ''); return SafeArea( child: Drawer( child: Column( @@ -29,13 +34,43 @@ class AppDrawer extends StatelessWidget { children: [ Row( children: [ - const PaperlessLogo.green(), + const PaperlessLogo.green( + width: 32, + height: 32, + ), Text( "Paperless Mobile", style: Theme.of(context).textTheme.titleMedium, ), ], - ).padded(), + ).paddedLTRB(8, 8, 8, 16), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + S.of(context)!.loggedInAs(username), + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.labelMedium?.copyWith( + color: Theme.of(context) + .colorScheme + .onBackground + .withOpacity(0.5), + ), + ), + Text( + serverUrl, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.labelMedium?.copyWith( + color: Theme.of(context) + .colorScheme + .onBackground + .withOpacity(0.5), + ), + ), + ], + ).paddedSymmetrically(horizontal: 16), const Divider(), ListTile( dense: true, @@ -43,6 +78,31 @@ class AppDrawer extends StatelessWidget { leading: const Icon(Icons.info_outline), onTap: () => _showAboutDialog(context), ), + ListTile( + dense: true, + leading: const Icon(Icons.favorite_outline), + title: Text(S.of(context)!.donate), + onTap: () { + showDialog( + context: context, + builder: (context) => AlertDialog( + icon: const Icon(Icons.favorite), + title: Text(S.of(context)!.donate), + content: Text( + S.of(context)!.donationDialogContent, + ), + actionsAlignment: MainAxisAlignment.spaceBetween, + actions: [ + Text("~ Anton"), + TextButton( + onPressed: Navigator.of(context).pop, + child: Text(S.of(context)!.gotIt), + ), + ], + ), + ); + }, + ), ListTile( dense: true, leading: const Icon(Icons.bug_report_outlined), @@ -63,26 +123,6 @@ class AppDrawer extends StatelessWidget { ); }, ), - ListTile( - dense: true, - leading: const Icon(Icons.favorite_outline), - title: Text(S.of(context)!.donate), - onTap: () { - showDialog( - context: context, - builder: (context) => AlertDialog( - icon: const Icon(Icons.favorite), - title: Text(S.of(context)!.donate), - content: Text( - S.of(context)!.donationDialogContent, - ), - actions: const [ - Text("~ Anton"), - ], - ), - ); - }, - ), ListTile( dense: true, leading: SvgPicture.asset( diff --git a/lib/features/document_details/view/pages/document_details_page.dart b/lib/features/document_details/view/pages/document_details_page.dart index c14d716..fa8cb07 100644 --- a/lib/features/document_details/view/pages/document_details_page.dart +++ b/lib/features/document_details/view/pages/document_details_page.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:intl/intl.dart'; import 'package:open_filex/open_filex.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/bloc/connectivity_cubit.dart'; @@ -43,6 +45,11 @@ class _DocumentDetailsPageState extends State { static const double _itemSpacing = 24; final _pagingScrollController = ScrollController(); + @override + void didChangeDependencies() { + super.didChangeDependencies(); + initializeDateFormatting(Localizations.localeOf(context).toString()); + } @override Widget build(BuildContext context) { diff --git a/lib/features/document_details/view/widgets/document_meta_data_widget.dart b/lib/features/document_details/view/widgets/document_meta_data_widget.dart index bdfcf81..3c45a44 100644 --- a/lib/features/document_details/view/widgets/document_meta_data_widget.dart +++ b/lib/features/document_details/view/widgets/document_meta_data_widget.dart @@ -44,12 +44,14 @@ class _DocumentMetaDataWidgetState extends State { document: widget.document, ).paddedOnly(bottom: widget.itemSpacing), DetailsItem.text( - DateFormat().format(widget.document.modified), + DateFormat.yMMMMd(Localizations.localeOf(context).toString()) + .format(widget.document.modified), context: context, label: S.of(context)!.modifiedAt, ).paddedOnly(bottom: widget.itemSpacing), DetailsItem.text( - DateFormat().format(widget.document.added), + DateFormat.yMMMMd(Localizations.localeOf(context).toString()) + .format(widget.document.added), context: context, label: S.of(context)!.addedAt, ).paddedOnly(bottom: widget.itemSpacing), diff --git a/lib/features/document_details/view/widgets/document_overview_widget.dart b/lib/features/document_details/view/widgets/document_overview_widget.dart index cff95dc..02bcf81 100644 --- a/lib/features/document_details/view/widgets/document_overview_widget.dart +++ b/lib/features/document_details/view/widgets/document_overview_widget.dart @@ -39,7 +39,8 @@ class DocumentOverviewWidget extends StatelessWidget { ), ).paddedOnly(bottom: itemSpacing), DetailsItem.text( - DateFormat.yMMMMd().format(document.created), + DateFormat.yMMMMd(Localizations.localeOf(context).toString()) + .format(document.created), context: context, label: S.of(context)!.createdAt, ).paddedOnly(bottom: itemSpacing), diff --git a/lib/features/document_edit/view/document_edit_page.dart b/lib/features/document_edit/view/document_edit_page.dart index d660e76..976d4bb 100644 --- a/lib/features/document_edit/view/document_edit_page.dart +++ b/lib/features/document_edit/view/document_edit_page.dart @@ -376,14 +376,16 @@ class _DocumentEditPageState extends State { label: Text(S.of(context)!.createdAt), ), initialValue: initialCreatedAtDate, - format: DateFormat.yMMMMd(), + format: DateFormat.yMMMMd(Localizations.localeOf(context).toString()), initialEntryMode: DatePickerEntryMode.calendar, ), if (filteredSuggestions?.hasSuggestedDates ?? false) _buildSuggestionsSkeleton( suggestions: filteredSuggestions!.dates, itemBuilder: (context, itemData) => ActionChip( - label: Text(DateFormat.yMMMd().format(itemData)), + label: Text( + DateFormat.yMMMMd(Localizations.localeOf(context).toString()) + .format(itemData)), onPressed: () => _formKey.currentState?.fields[fkCreatedDate] ?.didChange(itemData), ), diff --git a/lib/features/document_search/view/sliver_search_bar.dart b/lib/features/document_search/view/sliver_search_bar.dart index 8cea3d9..7d83861 100644 --- a/lib/features/document_search/view/sliver_search_bar.dart +++ b/lib/features/document_search/view/sliver_search_bar.dart @@ -10,12 +10,10 @@ import 'package:paperless_mobile/features/settings/view/widgets/user_avatar.dart import 'package:provider/provider.dart'; class SliverSearchBar extends StatelessWidget { - final bool floating; final bool pinned; final String titleText; const SliverSearchBar({ super.key, - this.floating = false, this.pinned = false, required this.titleText, }); diff --git a/lib/features/document_upload/view/document_upload_preparation_page.dart b/lib/features/document_upload/view/document_upload_preparation_page.dart index ca244d0..7f136bf 100644 --- a/lib/features/document_upload/view/document_upload_preparation_page.dart +++ b/lib/features/document_upload/view/document_upload_preparation_page.dart @@ -68,7 +68,6 @@ class _DocumentUploadPreparationPageState void initState() { super.initState(); _syncTitleAndFilename = widget.filename == null && widget.title == null; - initializeDateFormatting(); } @override @@ -219,7 +218,8 @@ class _DocumentUploadPreparationPageState // Created at FormBuilderDateTimePicker( autovalidateMode: AutovalidateMode.always, - format: DateFormat.yMMMMd(), + format: DateFormat.yMMMMd( + Localizations.localeOf(context).toString()), inputType: InputType.date, name: DocumentModel.createdKey, initialValue: null, diff --git a/lib/features/documents/view/pages/documents_page.dart b/lib/features/documents/view/pages/documents_page.dart index da66963..0f31032 100644 --- a/lib/features/documents/view/pages/documents_page.dart +++ b/lib/features/documents/view/pages/documents_page.dart @@ -177,13 +177,9 @@ class _DocumentsPageState extends State { child: _showExtendedFab ? Row( children: [ - const Icon( - Icons.filter_alt_outlined, - ), + const Icon(Icons.filter_alt_outlined), const SizedBox(width: 8), - Text( - S.of(context)!.filterDocuments, - ), + Text(S.of(context)!.filterDocuments), ], ) : const Icon(Icons.filter_alt_outlined), @@ -270,7 +266,6 @@ class _DocumentsPageState extends State { builder: (context, state) { if (state.selection.isEmpty) { return SliverSearchBar( - floating: true, titleText: S.of(context)!.documents, ); } else { diff --git a/lib/features/documents/view/widgets/items/document_detailed_item.dart b/lib/features/documents/view/widgets/items/document_detailed_item.dart index 7a7e545..4fee4e4 100644 --- a/lib/features/documents/view/widgets/items/document_detailed_item.dart +++ b/lib/features/documents/view/widgets/items/document_detailed_item.dart @@ -89,7 +89,8 @@ class DocumentDetailedItem extends DocumentItem { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - DateFormat.yMMMMd().format(document.created), + DateFormat.yMMMMd(Localizations.localeOf(context).toString()) + .format(document.created), style: Theme.of(context) .textTheme .bodySmall diff --git a/lib/features/documents/view/widgets/items/document_grid_item.dart b/lib/features/documents/view/widgets/items/document_grid_item.dart index f0772c7..7ecbafd 100644 --- a/lib/features/documents/view/widgets/items/document_grid_item.dart +++ b/lib/features/documents/view/widgets/items/document_grid_item.dart @@ -121,7 +121,9 @@ class DocumentGridItem extends DocumentItem { ), const Spacer(), Text( - DateFormat.yMMMd().format(document.created), + DateFormat.yMMMMd( + Localizations.localeOf(context).toString()) + .format(document.created), style: Theme.of(context).textTheme.bodySmall, ), ], diff --git a/lib/features/documents/view/widgets/items/document_list_item.dart b/lib/features/documents/view/widgets/items/document_list_item.dart index 3f2d79f..873e13c 100644 --- a/lib/features/documents/view/widgets/items/document_list_item.dart +++ b/lib/features/documents/view/widgets/items/document_list_item.dart @@ -81,7 +81,8 @@ class DocumentListItem extends DocumentItem { maxLines: 1, overflow: TextOverflow.ellipsis, text: TextSpan( - text: DateFormat.yMMMd().format(document.created), + text: DateFormat.yMMMMd(Localizations.localeOf(context).toString()) + .format(document.created), style: Theme.of(context) .textTheme .labelSmall diff --git a/lib/features/inbox/view/pages/inbox_page.dart b/lib/features/inbox/view/pages/inbox_page.dart index b4efa5e..e04e83e 100644 --- a/lib/features/inbox/view/pages/inbox_page.dart +++ b/lib/features/inbox/view/pages/inbox_page.dart @@ -331,7 +331,8 @@ class _InboxPageState extends State if (doc.added.isYesterday) { return S.of(context)!.yesterday; } - return DateFormat.yMMMMd().format(doc.added); + return DateFormat.yMMMMd(Localizations.localeOf(context).toString()) + .format(doc.added); }, ); } diff --git a/lib/features/landing/view/landing_page.dart b/lib/features/landing/view/landing_page.dart index 35c7cfd..b2fa93a 100644 --- a/lib/features/landing/view/landing_page.dart +++ b/lib/features/landing/view/landing_page.dart @@ -35,7 +35,6 @@ class _LandingPageState extends State { SliverOverlapAbsorber( handle: _searchBarHandle, sliver: SliverSearchBar( - floating: true, titleText: S.of(context)!.documents, ), ), diff --git a/lib/features/settings/view/widgets/language_selection_setting.dart b/lib/features/settings/view/widgets/language_selection_setting.dart index 8787acb..1a1e3cc 100644 --- a/lib/features/settings/view/widgets/language_selection_setting.dart +++ b/lib/features/settings/view/widgets/language_selection_setting.dart @@ -13,7 +13,8 @@ class LanguageSelectionSetting extends StatefulWidget { class _LanguageSelectionSettingState extends State { static const _languageOptions = { - 'en': LanguageOption('English', true), + 'en': LanguageOption('English (US)', true), + 'en_GB': LanguageOption('English (GB)', true), 'de': LanguageOption('Deutsch', true), 'es': LanguageOption("Español", true), 'fr': LanguageOption('Français', true), diff --git a/lib/features/settings/view/widgets/radio_settings_dialog.dart b/lib/features/settings/view/widgets/radio_settings_dialog.dart index ceefb29..dfcaa57 100644 --- a/lib/features/settings/view/widgets/radio_settings_dialog.dart +++ b/lib/features/settings/view/widgets/radio_settings_dialog.dart @@ -40,31 +40,34 @@ class _RadioSettingsDialogState extends State> { return AlertDialog( actions: [ const DialogCancelButton(), - widget.confirmButton ?? - DialogConfirmButton( - returnValue: _groupValue, - ), + widget.confirmButton ?? DialogConfirmButton(returnValue: _groupValue), ], title: widget.titleText != null ? Text(widget.titleText!) : null, - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - if (widget.descriptionText != null) - Text(widget.descriptionText!, - style: Theme.of(context).textTheme.bodySmall), - ...widget.options.map(_buildOptionListTile), - if (widget.footer != null) widget.footer!, - ], + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + if (widget.descriptionText != null) + Text( + widget.descriptionText!, + style: Theme.of(context).textTheme.bodySmall, + ), + ...widget.options.map(_buildOptionListTile).toList(), + if (widget.footer != null) widget.footer!, + ], + ), ), ); } - Widget _buildOptionListTile(RadioOption option) => RadioListTile( - groupValue: _groupValue, - onChanged: (value) => setState(() => _groupValue = value!), - value: option.value, - title: Text(option.label), - ); + Widget _buildOptionListTile(RadioOption option) { + return RadioListTile( + groupValue: _groupValue, + onChanged: (value) => setState(() => _groupValue = value!), + value: option.value, + title: Text(option.label), + ); + } } class RadioOption { diff --git a/lib/features/settings/view/widgets/user_avatar.dart b/lib/features/settings/view/widgets/user_avatar.dart index 19dd819..1d11cb8 100644 --- a/lib/features/settings/view/widgets/user_avatar.dart +++ b/lib/features/settings/view/widgets/user_avatar.dart @@ -15,16 +15,26 @@ class UserAvatar extends StatelessWidget { Colors.primaries[account.id.hashCode % Colors.primaries.length]; final foregroundColor = backgroundColor.computeLuminance() > 0.5 ? Colors.black : Colors.white; - return CircleAvatar( - child: Text( + return Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: backgroundColor.shade900.withOpacity(0.4), + width: 2, + ), + ), + child: CircleAvatar( + child: Text( (account.paperlessUser.fullName ?? account.paperlessUser.username) .split(" ") .take(2) .map((e) => e.substring(0, 1)) .map((e) => e.toUpperCase()) - .join("")), - backgroundColor: backgroundColor, - foregroundColor: foregroundColor, + .join(""), + ), + backgroundColor: backgroundColor, + foregroundColor: foregroundColor, + ), ); } } diff --git a/lib/main.dart b/lib/main.dart index 00f88a2..002e00d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -41,19 +41,22 @@ import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart'; import 'package:paperless_mobile/routes/typed/top_level/add_account_route.dart'; import 'package:paperless_mobile/routes/typed/top_level/logging_out_route.dart'; import 'package:paperless_mobile/routes/typed/top_level/login_route.dart'; -import 'package:paperless_mobile/routes/typed/top_level/settings_route.dart'; import 'package:paperless_mobile/theme.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -String get defaultPreferredLocaleSubtag { - String preferredLocale = Platform.localeName.split("_").first; - if (!S.supportedLocales - .any((locale) => locale.languageCode == preferredLocale)) { - preferredLocale = 'en'; +Locale get defaultPreferredLocale { + final deviceLocale = _stringToLocale(Platform.localeName); + if (S.supportedLocales.contains(deviceLocale)) { + return deviceLocale; + } else if (S.supportedLocales + .map((e) => e.languageCode) + .contains(deviceLocale.languageCode)) { + return Locale(deviceLocale.languageCode); + } else { + return const Locale('en'); } - return preferredLocale; } Map Function()> _migrations = { @@ -99,7 +102,7 @@ Future _initHive() async { if (!globalSettingsBox.hasValue) { await globalSettingsBox.setValue( - GlobalSettings(preferredLocaleSubtag: defaultPreferredLocaleSubtag), + GlobalSettings(preferredLocaleSubtag: defaultPreferredLocale.toString()), ); } } @@ -323,6 +326,7 @@ class _GoRouterShellState extends State { Widget build(BuildContext context) { return GlobalSettingsBuilder( builder: (context, settings) { + final locale = _stringToLocale(settings.preferredLocaleSubtag); return DynamicColorBuilder( builder: (lightDynamic, darkDynamic) { return MaterialApp.router( @@ -340,10 +344,41 @@ class _GoRouterShellState extends State { preferredColorScheme: settings.preferredColorSchemeOption, ), themeMode: settings.preferredThemeMode, - supportedLocales: S.supportedLocales, - locale: Locale.fromSubtags( - languageCode: settings.preferredLocaleSubtag, - ), + supportedLocales: const [ + Locale('en'), + Locale('de'), + Locale('en', 'GB'), + Locale('ca'), + Locale('cs'), + Locale('es'), + Locale('fr'), + Locale('pl'), + Locale('ru'), + Locale('tr'), + ], + localeResolutionCallback: (locale, supportedLocales) { + if (locale == null) { + return supportedLocales.first; + } + + final exactMatch = supportedLocales + .where((element) => + element.languageCode == locale.languageCode && + element.countryCode == locale.countryCode) + .toList(); + if (exactMatch.isNotEmpty) { + return exactMatch.first; + } + final superLanguageMatch = supportedLocales + .where((element) => + element.languageCode == locale.languageCode) + .toList(); + if (superLanguageMatch.isNotEmpty) { + return superLanguageMatch.first; + } + return supportedLocales.first; + }, + locale: locale, localizationsDelegates: S.localizationsDelegates, ); }, @@ -352,3 +387,10 @@ class _GoRouterShellState extends State { ); } } + +Locale _stringToLocale(String code) { + final codes = code.split("_"); + final languageCode = codes[0]; + final countryCode = codes.length > 1 ? codes[1] : null; + return Locale(languageCode, countryCode); +} diff --git a/lib/routes/typed/top_level/add_account_route.dart b/lib/routes/typed/top_level/add_account_route.dart index e0ababc..335e6b8 100644 --- a/lib/routes/typed/top_level/add_account_route.dart +++ b/lib/routes/typed/top_level/add_account_route.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; +import 'package:intl/intl.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/model/info_message_exception.dart'; import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart'; @@ -39,7 +40,7 @@ class AddAccountRoute extends GoRouteData { clientCertificate: clientCertificate, serverUrl: serverUrl, enableBiometricAuthentication: false, - locale: Localizations.localeOf(context).languageCode, + locale: Intl.getCurrentLocale(), ); final shoudSwitch = await showDialog( context: context, diff --git a/lib/translations/app_localizations_en_extensions.dart b/lib/translations/app_localizations_en_extensions.dart new file mode 100644 index 0000000..ea09f86 --- /dev/null +++ b/lib/translations/app_localizations_en_extensions.dart @@ -0,0 +1,9 @@ +import 'package:paperless_mobile/generated/l10n/app_localizations_en.dart'; + +class SEnGb extends SEn { + SEnGb() : super('en_GB'); +} + +class SEnUs extends SEn { + SEnUs() : super('en_US'); +} diff --git a/pubspec.yaml b/pubspec.yaml index 1a17367..093e6cd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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.0.2+49 +version: 3.0.3+50 environment: sdk: ">=3.0.0 <4.0.0"