Internationalization and localization support

Related tags

Templates intl
Overview

Provides internationalization and localization facilities, including message translation, plurals and genders, date/number formatting and parsing, and bidirectional text.

General

The most important library is intl. It defines the Intl class, with the default locale and methods for accessing most of the internationalization mechanisms. This library also defines the DateFormat, NumberFormat, and BidiFormatter classes.

Current locale

The package has a single current locale, called defaultLocale. Operations will use that locale unless told to do otherwise.

You can explicitly set the global locale

Intl.defaultLocale = 'pt_BR';

or get it from the browser

import 'package:intl/intl_browser.dart';
...
findSystemLocale().then(runTheRestOfMyProgram);

To override the current locale for a particular operation, pass the operation to withLocale. Note that this includes async tasks spawned from that operation, and that the argument to withLocale will supercede the defaultLocale while the operation is active. If you are using different locales within an application, the withLocale operation may be preferable to setting defaultLocale.

Intl.withLocale('fr', () => print(myLocalizedMessage());

To specify the locale for an operation you can create a format object in a specific locale, pass in the locale as a parameter to methods, or set the default locale.

var format = DateFormat.yMd('ar');
var dateString = format.format(DateTime.now());

or

print(myMessage(dateString, locale: 'ar');

or

Intl.defaultLocale = 'es';
DateFormat.jm().format(DateTime.now());

Initialization

All the different types of locale data require an async initialization step to make sure the data is available. This reduces the size of the application by only loading the data that is actually required.

Each different area of internationalization (messages, dates, numbers) requires a separate initialization process. That way, if the application only needs to format dates, it doesn't need to take the time or space to load up messages, numbers, or other things it may not need.

With messages, there is also a need to import a file that won't exist until the code generation step has been run. This can be awkward, but can be worked around by creating a stub messages_all.dart file, running an empty translation step, or commenting out the import until translations are available. See "Extracting and Using Translated Messages"

Messages

Messages to be localized are written as functions that return the result of an Intl.message call.

String continueMessage() => Intl.message(
    'Hit any key to continue',
    name: 'continueMessage',
    args: [],
    desc: 'Explains that we will not proceed further until '
        'the user presses a key');
print(continueMessage());

This provides, in addition to the basic message string, a name, a description for translators, the arguments used in the message, and examples. The name and args parameters must match the name (or ClassName_methodName) and arguments list of the function respectively. For messages without parameters, both of these can be omitted.

A function with an Intl.message call can be run in the program before any translation has been done, and will just return the message string. It can also be extracted to a file and then be made to return a translated version without modifying the original program. See "Extracting Messages" below for more details.

The purpose of wrapping the message in a function is to allow it to have parameters which can be used in the result. The message string is allowed to use a restricted form of Dart string interpolation, where only the function's parameters can be used, and only in simple expressions. Local variables cannot be used, and neither can expressions with curly braces. Only the message string can have interpolation. The name, desc, args, and examples must be literals and not contain interpolations. Only the args parameter can refer to variables, and it should list exactly the function parameters. If you are passing numbers or dates and you want them formatted, you must do the formatting outside the function and pass the formatted string into the message.

greetingMessage(name) => Intl.message(
    'Hello $name!',
    name: 'greetingMessage',
    args: [name],
    desc: 'Greet the user as they first open the application',
    examples: const {'name': 'Emily'});
print(greetingMessage('Dan'));

There is one special class of complex expressions allowed in the message string, for plurals and genders.

remainingEmailsMessage(int howMany, String userName) =>
  Intl.message(
    '''${Intl.plural(howMany,
        zero: 'There are no emails left for $userName.',
        one: 'There is $howMany email left for $userName.',
        other: 'There are $howMany emails left for $userName.')}''',
  name: 'remainingEmailsMessage',
  args: [howMany, userName],
  desc: How many emails remain after archiving.',
  examples: const {'howMany': 42, 'userName': 'Fred'});

print(remainingEmailsMessage(1, 'Fred'));

However, since the typical usage for a plural or gender is for it to be at the top-level, we can also omit the Intl.message call and provide its parameters to the Intl.plural call instead.

remainingEmailsMessage(int howMany, String userName) =>
  Intl.plural(
    howMany,
    zero: 'There are no emails left for $userName.',
    one: 'There is $howMany email left for $userName.',
    other: 'There are $howMany emails left for $userName.',
    name: 'remainingEmailsMessage',
    args: [howMany, userName],
    desc: 'How many emails remain after archiving.',
    examples: const {'howMany': 42, 'userName': 'Fred'});

Similarly, there is an Intl.gender message, and plurals and genders can be nested.

notOnlineMessage(String userName, String userGender) =>
  Intl.gender(
    userGender,
    male: '$userName is unavailable because he is not online.',
    female: '$userName is unavailable because she is not online.',
    other: '$userName is unavailable because they are not online',
    name: 'notOnlineMessage',
    args: [userName, userGender],
    desc: 'The user is not available to hangout.',
    examples: const {{'userGender': 'male', 'userName': 'Fred'},
        {'userGender': 'female', 'userName' : 'Alice'}});

It's recommended to use complete sentences in the sub-messages to keep the structure as simple as possible for the translators.

Extracting And Using Translated Messages

When your program contains messages that need translation, these must be extracted from the program source, sent to human translators, and the results need to be incorporated. The code for this is in the Intl_translation package.

To extract messages, run the extract_to_arb.dart program.

> pub run intl_translation:extract_to_arb --output-dir=target/directory
    my_program.dart more_of_my_program.dart

This will produce a file intl_messages.arb with the messages from all of these programs. See ARB. The resulting translations can be used to generate a set of libraries using the generate_from_arb.dart program.

This expects to receive a series of files, one per locale.

> pub run intl_translation:generate_from_arb --generated_file_prefix=<prefix>
    <my_dart_files> <translated_ARB_files>

This will generate Dart libraries, one per locale, which contain the translated versions. Your Dart libraries can import the primary file, named <prefix>messages_all.dart, and then call the initialization for a specific locale. Once that's done, any Intl.message calls made in the context of that locale will automatically print the translated version instead of the original.

import 'my_prefix_messages_all.dart';
...
initializeMessages('dk').then(printSomeMessages);

Once the future returned from the initialization call returns, the message data is available.

Number Formatting and Parsing

To format a number, create a NumberFormat instance.

var f = NumberFormat('###.0#', 'en_US');
print(f.format(12.345));
  ==> 12.34

The locale parameter is optional. If omitted, then it will use the current locale. The format string is as described in NumberFormat

It's also possible to access the number symbol data for the current locale, which provides information as to the various separator characters, patterns, and other information used for formatting, as

f.symbols

Current known limitations are that the currency format will only print the name of the currency, and does not support currency symbols, and that the scientific format does not really agree with scientific notation. Number parsing is not yet implemented.

Date Formatting and Parsing

To format a DateTime, create a DateFormat instance. These can be created using a set of commonly used skeletons taken from ICU/CLDR or using an explicit pattern. For details on the supported skeletons and patterns see DateFormat.

DateFormat.yMMMMEEEEd().format(aDateTime);
  ==> 'Wednesday, January 10, 2012'
DateFormat('EEEEE', 'en_US').format(aDateTime);
  ==> 'Wednesday'
DateFormat('EEEEE', 'ln').format(aDateTime);
  ==> 'mokɔlɔ mwa mísáto'

You can also parse dates using the same skeletons or patterns.

DateFormat.yMd('en_US').parse('1/10/2012');
DateFormat('Hms', 'en_US').parse('14:23:01');

Skeletons can be combined, the main use being to print a full date and time, e.g.

DateFormat.yMEd().add_jms().format(DateTime.now());
  ==> 'Thu, 5/23/2013 10:21:47 AM'

Known limitations: Time zones are not yet supported. Dart DateTime objects don't have a time zone, so are either local or UTC. Formatting and parsing Durations is not yet implemented.

Note that before doing any DateTime formatting for a particular locale, you must load the appropriate data by calling.

import 'package:intl/date_symbol_data_local.dart';
...
initializeDateFormatting('de_DE', null).then(formatDates);

Once the future returned from the initialization call returns, the formatting data is available.

There are other mechanisms for loading the date formatting data implemented, but we expect to deprecate those in favor of having the data in a library as in the above, and using deferred loading to only load the portions that are needed. For the time being, this will include all of the data, which will increase code size.

Bidirectional Text

The class BidiFormatter provides utilities for working with Bidirectional text. We can wrap the string with unicode directional indicator characters or with an HTML span to indicate direction. The direction can be specified with the RTL and LTR constructors, or detected from the text.

BidiFormatter.RTL().wrapWithUnicode('xyz');
BidiFormatter.RTL().wrapWithSpan('xyz');
Comments
  • Add a mechanism for finding locale from Windows in non-browser context

    Add a mechanism for finding locale from Windows in non-browser context

    opened by DartBot 21
  • Remove non-nullable as experiment, require SDK 2.12.0 to enable it.

    Remove non-nullable as experiment, require SDK 2.12.0 to enable it.

    This causes issues in https://dart-review.googlesource.com/c/sdk/+/224520, although maybe we just need a slightly newer version pulled into the SDK. But we should enable actual null safety anyway.

    opened by scheglov 19
  • Add a parser when the date time format is without delimiter

    Add a parser when the date time format is without delimiter

    Create a way of parse date time format without delimiter without break change.

    test('No delimiter 4 digits year', () {
        final timestamp = "20190614071930";
        final result = DateFormat('yyyyMMddHHmmss').parseNoDelimiter(timestamp);
        expect(result, DateTime(2019, 06, 14, 07, 19, 30));
    

    A date time format like 'yyyyMMddHHmmss' now can be parsed calling DateFormat(String).parseNoDelimiter(String)

    close #452 close #210 close #445 close #278

    opened by jhionan 18
  • Parsing two-digit year `16` with results in `0016` and not `2016`

    Parsing two-digit year `16` with results in `0016` and not `2016`

    import 'package:intl/intl.dart';
    final dateFormat = new DateFormat("d/M/y H:m:s");
    print(dateFormat.parse("01/02/16 12:11:12").year);
    

    This code results in a year of 0016 and not 2016. Same thing happens whether I use y or yy in the format. Unfortunately it's tricky to fix this, because you can't even .add 2000 years, because the Duration class only goes up to days!

    Other languages make assumptions about two-digit years being 19/20; it probably makes sense to do the same.

    opened by DanTup 13
  • Implement DateFormat time zone formatting

    Implement DateFormat time zone formatting

    From @ajsergeev on July 21, 2015 8:28

    v,z patterns don't work because:

    String formatTimeZoneId(DateTime date) { // TODO(alanknight): implement time zone support throw new UnimplementedError(); }

    String formatTimeZone(DateTime date) { throw new UnimplementedError(); }

    String formatTimeZoneRFC(DateTime date) { throw new UnimplementedError(); }

    Copied from original issue: dart-lang/sdk#23879

    opened by kevmoo 13
  • Dateformat not parsing after a format generated string

    Dateformat not parsing after a format generated string

    Given this "yyyyMMddHHmmss" format: DateFormat("yyyyMMddHHmmss").format(DateTime.now()); gives a nice string like: "20190405140723" as I would expect.

    Now reversely parsing... DateFormat("yyyyMMddHHmmss").parse("20190405140723"); throws the message "Trying to read MM from 20190405140723 at position 14"

    It seems the parser consumes the whole string (after the 2019) while searching for some separator that I don't have in the format.

    Shouldn't parse and format be reversible?

    I've tried with parseLoose and parseStrict: same result. Using intl version: "0.15.8"

    opened by rmarau 12
  • intl_translation:extract_to_arb should support const references as name

    intl_translation:extract_to_arb should support const references as name

      String themeDisplayName(String themeName) {
        switch (themeName) {
          case 'origin':
            return Intl.message('Origin', name: AppTheme.origin.name);
          case 'purple':
            return Intl.message('Purple', name: AppTheme.purple.name);
        ...
    

    To make refactoring easier and prevent accidental mismatches.

    used constants

    class AppTheme {
      static const AppTheme origin = const AppTheme('origin');
      static const AppTheme purple = const AppTheme('purple');
      ...
    
      final String name;
    }
    

    Currently I get

    Skipping invalid Intl.message invocation
        <Intl.message('Origin', name: AppTheme.origin.name)>
        reason: The 'name' argument for Intl.message must be a string literal
        from File: 'lib/localization/localizations.dart'    line: 33, column: 16
    Skipping invalid Intl.message invocation
        <Intl.message('Purple', name: AppTheme.purple.name)>
        reason: The 'name' argument for Intl.message must be a string literal
        from File: 'lib/localization/localizations.dart'    line: 35, column: 16
    
    opened by zoechi 12
  • Intl lookup can't work without code generation

    Intl lookup can't work without code generation

    Hello,

    I wanted to have decentralized traductions instead of having them transformed/generated to dart. But I find myself totally blocked by the intl API and way of doing things.

    Take this example: String complex(String name, String name2) => Intl.message('$name2 love $name', args: [name, name2], name: 'complex');

    In ARB format it will be generated like this:

    "complex": "{name2} love {name}",
    "@complex": {
      "type": "text",
      "placeholders": {
        "name": {},
        "name2": {}
      }
    },
    

    To be able to find translations Intl is using MessageLookup under the hood, so I was trying to extends it and make my own lookup based on ARB I have downloaded.

    For that we need to implement this method:

    String? lookupMessage(String? messageText, String? locale, String? name, List<Object>? args, String? meaning, {MessageIfAbsent? ifAbsent}) {
    

    So here I'll receive the sentence "{name2} love {name}", and now I'm blocked, because I have a list of args but no way to find which one is name and which one is name2.

    I there any workaround or other way I can achieve this ?

    enhancement 
    opened by jaumard 10
  • Multiple dart translations in one project

    Multiple dart translations in one project

    hi, I have two translations.dart one for each project and another one for the commons translation, I would like to use 2 translations.dart in one project (project_translation.dart and common_translation.dart), is it possible?

    opened by samiahakmi 10
  • Cannot reuse DateFormat variable after l10n initialization

    Cannot reuse DateFormat variable after l10n initialization

    It seems that intl gets in a corrupted state if a DateFormat variable is used before localization is initialized in Flutter. This bug is making Firebase authentication fail on Flutter Web: https://github.com/FirebaseExtended/flutterfire/issues/3374 .

    A complete MWE to reproduce this bug is available at https://github.com/knuesel/dateformat_bug : it's a vanilla Flutter app (from flutter create) with a few lines of code added to enable localization using the new Flutter localization process.

    Here's the essence of the MWE:

    import 'package:flutter/material.dart';
    import 'package:intl/intl.dart';
    import 'package:flutter_gen/gen_l10n/app_localizations.dart';
    
    final format = DateFormat('EEE, d MMM yyyy HH:mm:ss', 'en_US');
    final date = 'Fri, 25 Sep 2020 12:39:53 GMT';
    
    void main() {
      print('@ Parsing date in main()...');
      print(format.parse(date)); // Commenting this makes the other parse call work
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          localizationsDelegates: AppLocalizations.localizationsDelegates,
          supportedLocales: AppLocalizations.supportedLocales,
          ...
        );
      }
    }
    
    class _MyHomePageState extends State<MyHomePage> {
    ...
      @override
      Widget build(BuildContext context) {
        print('@ Parsing date in widget build...');
        print(format.parse(date));  // This throws an exception
    
        return ...;
      }
    }
    

    This code throws an exception:

    I/flutter (28125): @ Parsing date in main()...
    I/flutter (28125): 2020-09-25 12:39:53.000
    I/flutter (28125): @ Parsing date in widget build...
    
    ════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
    The following FormatException was thrown building MyHomePage(dirty, state: _MyHomePageState#ff885):
    Trying to read EEE from Fri, 25 Sep 2020 12:39:53 GMT at position 0
    
    The relevant error-causing widget was: 
      MyHomePage file:///home/j/temp/dateformat/dateformat_bug/lib/main.dart:40:13
    When the exception was thrown, this was the stack: 
    #0      _DateFormatField.throwFormatException (package:intl/src/intl/date_format_field.dart:87:5)
    #1      _DateFormatPatternField.parseField (package:intl/src/intl/date_format_field.dart:337:7)
    #2      _DateFormatPatternField.parse (package:intl/src/intl/date_format_field.dart:250:5)
    #3      DateFormat._parse (package:intl/src/intl/date_format.dart:374:13)
    #4      DateFormat.parse (package:intl/src/intl/date_format.dart:303:7)
    

    As you can see, parsing the same date string with the same DateFormat variable works in main(), but throws when it's run after Flutter localization has been enabled.

    The second parse call works if we remove the first parse in main.

    Both calls work if we remove the line localizationsDelegates: AppLocalizations.localizationsDelegates.

    opened by knuesel 9
  • 'k' hour format does not give expected results

    'k' hour format does not give expected results

    The docs (including ICU docs) say that the k pattern should give "hour in day (1~24)".

    https://github.com/dart-lang/intl/blob/4b385517037485e3243d6915453215af315add27/lib/src/intl/date_format.dart#L154

    However I cannot seem to obtain 24; all I can get is 0:

    final date = DateTime(2019, 6, 10, 0, 30);
    print(DateFormat('k:mm').format(date)); // result: 0:30
    print(DateFormat('kk:mm').format(date)); // result: 00:30
    

    I would have expected both of these to give 24:30.

    opened by amake 8
  • Date format abbreviated month not used in es_US locale

    Date format abbreviated month not used in es_US locale

    The abbreviated month is not being used in es_US locale when using the skeleton pattern.

    Try this code:

    import 'package:intl/date_symbol_data_local.dart';
    import 'package:intl/intl.dart';
    
    void main() {
      initializeDateFormatting();
      print(DateFormat('d MMM yyyy', 'es_US').format(DateTime.now()));
      print(DateFormat.yMMMd('es_US').format(DateTime.now()));
    }
    

    It prints:

    21 dic. 2022
    21 de diciembre de 2022
    

    Note that instead using es_ES as the locale produces the expected result.

    bug cannot-reproduce 
    opened by rodcheater 3
  • 0.18.0, Version solving failed

    0.18.0, Version solving failed

    Describe the bug When upgrading to 0.18.0, I get the following error:

    [APP_NAME] flutter pub get
    Running "flutter pub get" in APP_NAME...                          
    Because APP_NAME depends on flutter_localizations from sdk which depends on intl 0.17.0, intl 0.17.0 is required.
    So, because APP_NAME depends on intl ^0.18.0, version solving failed.
    pub get failed (1; So, because APP_NAME depends on intl ^0.18.0, version solving failed.)
    exit code 1
    

    To Reproduce

    • Upgrade intl to 0.18.0.
    • Run flutter pub get

    System info Can not, because flutter pub get failed.

    Versions

    • Flutter: 3.3.10
    • environment sdk: ">=2.18.6 <3.0.0"
    • flutter_localizations: sdk: flutter
    bug Priority-High 
    opened by bilalsammour 2
  • NumberFormat.simpleCurrency vs NumberFormat.compactSimpleCurrency produces inconsistent minus sign placement.

    NumberFormat.simpleCurrency vs NumberFormat.compactSimpleCurrency produces inconsistent minus sign placement.

    NumberFormat.simpleCurrency(locale: 'en_US', decimalDigits: 2, name: 'GBP').format(-2345) Results in: -£2,345.00 (Correct)

    NumberFormat.compactSimpleCurrency(locale: 'en_US', decimalDigits: 2, name: 'GBP').format(-2345) Results in: £-2.35K (Incorrect, the minus sign should be before the pound sign)

    bug Priority-Medium 
    opened by FufferKS 0
  • Execute `DateFormat.format` on `compute` throws `LocaleDataException`.

    Execute `DateFormat.format` on `compute` throws `LocaleDataException`.

    Executing DateFormat.format on compute throws a LocaleDataException, is this expected behavior?

    repro code
    Future<void> main() async {
      await initializeDateFormatting('ja_JP');
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: const MyHomePage(),
        );
      }
    
    
    class MyHomePage extends StatelessWidget {
      const MyHomePage({super.key});
    
      static final DateFormat _formatter = DateFormat.yMd('ja');
    
      void _convert(String date) {
        print(_formatter.parse(date));
      }
    
      Future<void> _compute() async {
        // _convert('2022/01/01 00:00'); <- work correctly
        compute(_convert, '2022/01/01 00:00'); <- throw LocaleDataException
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('compute'),
          ),
          body: Center(child: Text('compute test')),
          floatingActionButton: FloatingActionButton(
            onPressed: _compute,
            child: const Icon(Icons.add),
          ), // This trailing comma makes auto-formatting nicer for build methods.
        );
      }
    
    
    % flutter --version
    Flutter 3.3.4 • channel stable • https://github.com/flutter/flutter.git
    Framework • revision eb6d86ee27 (6 weeks ago) • 2022-10-04 22:31:45 -0700
    Engine • revision c08d7d5efc
    Tools • Dart 2.18.2 • DevTools 2.15.0
    
    intl: ^0.17.0
    
    bug Priority-Medium 
    opened by keisuke-kiriyama 0
  • NumberFormat with huge format

    NumberFormat with huge format

    If you use a format like "#0.######################################" and then format the number "1" the result is "1e+38".

    NumberFormat class Line 617 power = pow(10, fractionDigits) as int;

    If fractionDigits is bigger than 20, this bug will happen. power will be anything with e+?? and as a result the _formatFractionPart just adds it back to the number, as it only excludes non zero characters.

    bug Priority-Medium 
    opened by ToniHeiss 1
Releases(0.15.1)
Owner
Dart
Dart is an open-source, scalable programming language, with robust libraries and runtimes, for building web, server, and mobile apps.
Dart
COVID-19 application made with Flutter, following Test Driven Development (TDD) and Clean Architecture along with Internationalization with JSON.

Covid App COVID-19 application made with Flutter, following Test Driven Development (TDD) and Clean Architecture along with Internationalization with

Sandip Pramanik 4 Aug 4, 2022
Flutter demo for internationalization.

Localizing your application 1. Introduction We are going to localize our application using the intl package. This guide is based on Flutter Docs - Int

Suman Adhikari 0 Dec 23, 2021
The project of the empty template with Flutter has built the basic framework to realize the functions of internationalization, theme peeling etc.

flutter-bloc-app-template ?? The project of the empty template with Flutter has built the basic framework to realize the functions of internationaliza

Oleksii Shtanko 30 Dec 31, 2022
Note provider - Note App using Provider state management, Sqflite and Localization for two language Arabic and English.

note_provider Sqflite with provider statemanagement Getting Started This project is a starting point for a Flutter application. A few resources to get

Mohanned Anwar 0 Jan 1, 2022
A tool which automatically generates Flutter localization resources from CSV and Excel files.

flappy_translator A tool which automatically generates Flutter localization resources from CSV and Excel files. This is especially useful as any team

Smart&Soft 55 Sep 15, 2022
GetX Architecture for large scale project, This project include - pagination, pull to refresh, localization, network call and advance error handling

GetX Architecture for large scale project, This project include - pagination, pull to refresh, localization, network call and advance error handling

Wai Han Ko 5 Nov 29, 2022
Generates a new Flutter app with http client, theme, routing and localization features.

Starter Template Generates a new Flutter app with http client, theme, routing and localization features. Brick Uses: dio as http client pretty_dio_log

Cem Avcı 12 Nov 3, 2022
A basic boilerplate template for starting a Flutter GetX project. GetX, Dio, MVVM, get CLI, Localization, Pagination etc are implemented.

Flutter GetX Template (GetX, Dio, MVVM) This Flutter Template using GetX package for State management, routing and Dependency Injection (bindings). We

Hasan Abdullah 214 Jan 9, 2023
Flutter localization in easy steps

localize_and_translate Flutter localization in easy steps Share your love to this ❤️ Screenshots Tutorial Video Arabic : https://www.youtube.com/watch

Mohamed Sayed 48 Aug 9, 2022
TOML localization for Flutter

toml_localizations A minimal TOML localization package for Flutter. TOML is a minimal, easy to read, configuration file format, which allows you to re

Erlend 1 Mar 8, 2022
Yet another localization approach in Flutter

Flutter Global Summit Vol.2 schedule Source code of the mobile application that displays the schedule of the Flutter Global Summit Vol.2 conference th

Anna Leushchenko 3 Mar 24, 2022
Kurdish localization for flutter

Flutter Kurdish Localization ?? This package provides unofficial localization su

Amin Samad 16 Oct 25, 2022
"FlutterMoneyFormatter" is a Flutter extension to formatting various types of currencies according to the characteristics you like, without having to be tied to any localization.

FlutterMoneyFormatter FlutterMoneyFormatter is a Flutter extension to formatting various types of currencies according to the characteristics you like

Fadhly Permata 81 Jan 1, 2023
Flutter project. The sample of Localization.

localization A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if

Aoi Umigishi 1 Jan 5, 2022
Create flutter project with all needed configuration in two minutes (theme, localization, connect to firebase, FCM, local notifications, safe API call, error handling, animation..etc)

Flutter GetX Template Flutter Getx template to make starting project fast and easy . Introduction We all face the same problem when we want to start a

Emad Beltaje 150 Jan 7, 2023
WIP: generate easy localization key code

Generates translation key code for the easy localization package. Support for json and yaml formats.You can see examples in the assets/ folder. Gettin

null 3 Oct 24, 2022
Flutter plugin, support android/ios.Support crop, flip, rotate, color martix, mix image, add text. merge multi images.

image_editor The version of readme pub and github may be inconsistent, please refer to github. Use native(objc,kotlin) code to handle image data, it i

FlutterCandies 317 Jan 3, 2023
A wrapper around our Cocoa and Java client library SDKs, providing iOS and Android support for those using Flutter and Dart.

Ably Flutter Plugin A Flutter plugin wrapping the ably-cocoa (iOS) and ably-java (Android) client library SDKs for Ably, the platform that powers sync

Ably Realtime - our client library SDKs and libraries 46 Dec 13, 2022
A Flutter Plugin for Volume Control and Monitoring, support iOS and Android

flutter_volume A flutter plugin for volume control and monitoring, support iOS and Android 手把手带你写 Flutter 系统音量插件 https://www.yuque.com/befovy/share/fl

befovy 35 Dec 9, 2022