I'm follow Flutter docs to show CupertinoDatePicker. But language alway is English. Please show me how to change this.
Here my code:
void _showDatePicker(BuildContext context, bool isYou) {
showModalBottomSheet(
context: context,
builder: (context) {
return CupertinoDatePicker(
onDateTimeChanged: (DateTime value) {
setState(() {
if (isYou) {
_dateOfBirth = value;
} else {
_dateOfBirthAnother = value;
}
});
},
initialDateTime: DateTime.now(),
mode: CupertinoDatePickerMode.date,
maximumYear: 2018,
minimumYear: 1950,
);
});
}
Add your required languages to your MaterialApp (or CupertinoApp) configuration. Like this:
return MaterialApp(
localizationsDelegates: [
// ... app-specific localization delegate[s] here
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
DefaultCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('de', 'DE'), // German
// ... other locales the app supports
], <the rest of your configuration> );
This should do it.
Don't forget the imports:
import 'package:toothscout/GermanCupertinoLocalizations.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
Also, Cupertino Widgets are not fully localized (yet). But you can write your own localization configuration classes and add them below the line "DefaultCupertinoLocalizations.delegate" in my code.
For example, my custom german localization that i had to create to use CupertinoDatePicker in german language looks like this:
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
class _CupertinoLocalizationsDelegate extends LocalizationsDelegate<CupertinoLocalizations> {
const _CupertinoLocalizationsDelegate();
@override
bool isSupported(Locale locale) => locale.languageCode == 'de';
@override
Future<CupertinoLocalizations> load(Locale locale) => GermanCupertinoLocalizations.load(locale);
@override
bool shouldReload(_CupertinoLocalizationsDelegate old) => false;
@override
String toString() => 'DefaultCupertinoLocalizations.delegate(de_DE)';
}
/// US English strings for the cupertino widgets.
class GermanCupertinoLocalizations implements CupertinoLocalizations {
/// Constructs an object that defines the cupertino widgets' localized strings
/// for US English (only).
///
/// [LocalizationsDelegate] implementations typically call the static [load]
/// function, rather than constructing this class directly.
const GermanCupertinoLocalizations();
static const List<String> _shortWeekdays = <String>[
'Mo',
'Di',
'Mi',
'Do',
'Fr',
'Sa',
'So',
];
static const List<String> _shortMonths = <String>[
'Jan',
'Feb',
'Mär',
'Apr',
'Mai',
'Jun',
'Jul',
'Aug',
'Sep',
'Okt',
'Nov',
'Dez',
];
static const List<String> _months = <String>[
'Januar',
'Februar',
'März',
'April',
'Mai',
'Juni',
'Juli',
'August',
'September',
'Oktober',
'November',
'Dezember',
];
@override
String datePickerYear(int yearIndex) => yearIndex.toString();
@override
String datePickerMonth(int monthIndex) => _months[monthIndex - 1];
@override
String datePickerDayOfMonth(int dayIndex) => dayIndex.toString();
@override
String datePickerHour(int hour) => hour.toString();
@override
String datePickerHourSemanticsLabel(int hour) => hour.toString() + " Uhr";
@override
String datePickerMinute(int minute) => minute.toString().padLeft(2, '0');
@override
String datePickerMinuteSemanticsLabel(int minute) {
if (minute == 1)
return '1 Minute';
return minute.toString() + ' Minuten';
}
@override
String datePickerMediumDate(DateTime date) {
return '${_shortWeekdays[date.weekday - DateTime.monday]} '
'${_shortMonths[date.month - DateTime.january]} '
'${date.day.toString().padRight(2)}';
}
@override
DatePickerDateOrder get datePickerDateOrder => DatePickerDateOrder.mdy;
@override
DatePickerDateTimeOrder get datePickerDateTimeOrder => DatePickerDateTimeOrder.date_time_dayPeriod;
@override
String get anteMeridiemAbbreviation => 'AM';
@override
String get postMeridiemAbbreviation => 'PM';
@override
String get alertDialogLabel => 'Info';
@override
String timerPickerHour(int hour) => hour.toString();
@override
String timerPickerMinute(int minute) => minute.toString();
@override
String timerPickerSecond(int second) => second.toString();
@override
String timerPickerHourLabel(int hour) => hour == 1 ? 'Stunde' : 'Stunden';
@override
String timerPickerMinuteLabel(int minute) => 'Min';
@override
String timerPickerSecondLabel(int second) => 'Sek';
@override
String get cutButtonLabel => 'Ausschneiden';
@override
String get copyButtonLabel => 'Kopieren';
@override
String get pasteButtonLabel => 'Einfügen';
@override
String get selectAllButtonLabel => 'Alles auswählen';
/// Creates an object that provides US English resource values for the
/// cupertino library widgets.
///
/// The [locale] parameter is ignored.
///
/// This method is typically used to create a [LocalizationsDelegate].
static Future<CupertinoLocalizations> load(Locale locale) {
return SynchronousFuture<CupertinoLocalizations>(const GermanCupertinoLocalizations());
}
/// A [LocalizationsDelegate] that uses [DefaultCupertinoLocalizations.load]
/// to create an instance of this class.
static const LocalizationsDelegate<CupertinoLocalizations> delegate = _CupertinoLocalizationsDelegate();
}
firstly you should add this to pubspec.yaml
flutter_cupertino_localizations: ^1.0.1
flutter_localizations:
sdk: flutter
I've found a solution to the problem, had to add fallback to localizationsDelegates, as follows:
localizationsDelegates: [ ..... const FallbackCupertinoLocalisationsDelegate(), ]
And the delegate:
class FallbackCupertinoLocalisationsDelegate extends LocalizationsDelegate {
const FallbackCupertinoLocalisationsDelegate();
@override
bool isSupported(Locale locale) => true;
@override
Future load(Locale locale) =>
DefaultCupertinoLocalizations.load(locale);
@override
bool shouldReload(FallbackCupertinoLocalisationsDelegate old) => false;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With