fajar ainul
fajar ainul

Reputation: 540

Set the default language in a Flutter application

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

Answers (7)

Richard R
Richard R

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

Welt Fahr
Welt Fahr

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

IvanPavliuk
IvanPavliuk

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

moshire
moshire

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

bikram
bikram

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

fajar ainul
fajar ainul

Reputation: 540

Latest easy_localization (from version 2.2.1) package provide startLocale which overrides device locale.

Upvotes: 5

Jaldhi Mehta
Jaldhi Mehta

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

Related Questions