How to get the current locale text direction in Flutter using Intl
Asked Answered
S

3

10

I'm creating a new flutter UI component that contains selection and getting more info about the product.

enter image description here

I want this component to support RTL also, So I need to get the current locale language direction which will allow me to know which corners of the selection shape will be rounded.

The LTR shape code is like this

shape: RoundedRectangleBorder(
  borderRadius: BorderRadius.only(
    bottomLeft: Radius.circular(35),
    topLeft: Radius.circular(35),
    ),
  )

The RTL shape code will be like

shape: RoundedRectangleBorder(
  borderRadius: BorderRadius.only(
    bottomRight: Radius.circular(35),
    topRight: Radius.circular(35),
    ),
  )

I know that intl provides functionality to get the direction of specific text while I want to get the default direction of the current select locale, So if the current locale is Arabic, Farsi or any other right to left language I will return the RLT component. I don't know exactly how to do it.

Stelu answered 14/1, 2020 at 7:57 Comment(0)
S
11

Thanks to @chunhunghan I created a static method, this method takes the context and returns true based on the current locale of the app, because if you do not pass language code the function always returns false.

  import 'package:intl/intl.dart' as intl;
  static bool isDirectionRTL(BuildContext context){
   return intl.Bidi.isRtlLanguage( Localizations.localeOf(context).languageCode);
  }
Stelu answered 15/1, 2020 at 12:26 Comment(0)
T
35
Directionality.of(context) == TextDirection.rtl
Tellus answered 7/5, 2020 at 14:49 Comment(2)
You need import dart:ui. In case of conflict with bidi_utils, see #49648295.Ascending
It searches nearest Directionality widget and return its text direction.Mayhew
S
11

Thanks to @chunhunghan I created a static method, this method takes the context and returns true based on the current locale of the app, because if you do not pass language code the function always returns false.

  import 'package:intl/intl.dart' as intl;
  static bool isDirectionRTL(BuildContext context){
   return intl.Bidi.isRtlLanguage( Localizations.localeOf(context).languageCode);
  }
Stelu answered 15/1, 2020 at 12:26 Comment(0)
M
4

You can directly use intl.Bidi.isRtlLanguage() with import 'package:intl/intl.dart' as intl;
inside this function if you do not pass language code such as en or ar, it will use Intl.getCurrentLocale()

code snippet from bidi_util.dart

 static bool isRtlLanguage([String languageString]) {
    var language = languageString ?? Intl.getCurrentLocale();
    if (_lastLocaleCheckedForRtl != language) {
      _lastLocaleCheckedForRtl = language;
      _lastRtlCheck = _rtlLocaleRegex.hasMatch(language);
    }
    return _lastRtlCheck;
  }
Mulcahy answered 15/1, 2020 at 3:26 Comment(1)
Thanks for your help, It worked with some edits, I will write the full answerStelu

© 2022 - 2024 — McMap. All rights reserved.