Reputation: 540
I am trying to support multiple languages in my apps. I want to support two languages in my apps: English (en) and Bahasa (id). But, I want my apps to use Bahasa as the default language. I have tried to do this using the plugin easy_localization.
Here is some code from my main.app file
return EasyLocalizationProvider(
data: data,
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: APP_NAME,
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
//app-specific localization
EasylocaLizationDelegate(
locale: data.locale,
path: 'assets/strings'
),
],
navigatorKey: locator<NavigationService>().navigatorKey,
supportedLocales: [ Locale('id', 'ID'), Locale('en', 'US')],
locale: data.savedLocale,
theme: ThemeData(
primaryColor: KaskuColor.primary,
accentColor: Color(0xFFCB0E00),
fontFamily: PRIMARY_FONT_FAMILY,
textTheme: TextTheme(
headline: TextStyle(fontSize: 72.0, fontWeight: FontWeight.bold),
title: TextStyle(fontSize: 36.0, fontStyle: FontStyle.italic),
body1: TextStyle(fontSize: 14.0),
),
primarySwatch: Colors.red,
cursorColor: KaskuColor.primary,
snackBarTheme: SnackBarThemeData(
backgroundColor: KaskuColor.snackBarColor
)
),
home: Splashscreen(),
routes: {
},
),
);
Can someone help me? Thanks in advance!
Upvotes: 17
Views: 22588
Reputation: 967
I tried to improve bikrams answer. I only use the first of the devices languages, since this is the one the user uses the phone with. Also I try to match not only full locales (i.e. language AND country) but also partial matches of language only. Here's my code:
localeListResolutionCallback: (deviceLocales, supportedLocales) {
// take first locale from device locales or EN if deviceLocales is null or empty
final Locale locale = deviceLocales?.firstOrNull ?? Locale('en', '');
print("device locale selected: $locale");
if (supportedLocales.contains(locale)) {
// if we have a full match, i.e. language AND country, select this one
print("device locale match: $locale");
return locale;
} else if (supportedLocales.map((sLocales) => sLocales.languageCode).contains(locale.languageCode)) {
// if no full match is found, try to find at least a language match and select this one
print("device locale.languageCode match: $locale");
return locale;
} else {
// if no match if found at all, fall back to EN
return Locale('en', '');
}
},
Upvotes: 0
Reputation: 622
The best approach is to set your preferred locales in the i10n.yaml
config by adding preferred-supported-locales: [en]
or whatever order of locals you prefer.
Alternatively you can use the AppLocalizations.supportedLocales
and ensure that the default locale is the first in the list:
MaterialApp(
// Other properties
supportedLocales: [
Locale('en'), // Default locale
...AppLocalizations.supportedLocales,
],
// Other properties
)
This way, the default locale (en
for English) is set as the first locale in the list.
Upvotes: 1
Reputation: 1790
Only this works for me (Flutter 3.0.4
, Dart 2.17.5
):
supportedLocales: const [
Locale('id', 'ID'),
Locale('en', 'US'),
],
localeListResolutionCallback: (allLocales, supportedLocales) {
final locale = allLocales?.first.languageCode;
if (locale == 'en') {
return const Locale('en', 'US');
}
// The default locale
return const Locale('id', 'ID');
},
Upvotes: 4
Reputation: 111
add startLocale
to set the language you want as a default language
EasyLocalization(
supportedLocales: [Locale('en', 'US'),Locale('en', 'CA')],
path: 'assets', // <-- change patch to your
fallbackLocale: Locale('en', 'CA'),
saveLocale: true,
startLocale: Locale('en', 'US'),
child: MyApp(store: store,)
),
Upvotes: 1
Reputation: 7935
You need to use a callback to set a default language. In your MaterialApp widget add localeListResolutionCallback
as following:-
MaterialApp(
...
localeListResolutionCallback: (locales, supportedLocales) {
print('device locales=$locales supported locales=$supportedLocales');
for (Locale locale in locales) {
// if device language is supported by the app,
// just return it to set it as current app language
if (supportedLocales.contains(locale)) {
return locale;
}
}
// if device language is not supported by the app,
// the app will set it to english but return this to set to Bahasa instead
return Locale('id', 'ID');
},
supportedLocales: [Locale('id', 'ID'), Locale('en', 'US')],
locale: Locale('en', 'US'),
...
);
Upvotes: 23
Reputation: 540
Latest easy_localization (from version 2.2.1) package provide startLocale
which overrides device locale.
Upvotes: 5
Reputation: 721
Have you added the dependencies to use the flutter_localizations? To use the localization package, you will need to use the flutter_localizations package. To do so, you will have to add it as a dependency to your pubspec.yaml file as follows:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
Also, you can refer to the link and check it where you are having difficulties. Also, apologies for the straight forward answer as I am new to this I was not able to comment on your answer. https://www.didierboelens.com/2018/04/internationalization---make-an-flutter-application-multi-lingual/
Upvotes: 1