I18n made easy, for Flutter!

Overview

flutter_i18n

All Contributors

I18n made easy, for Flutter!

Pub Package GitHub Actions


Table of contents

Why you should use flutter_i18n?

The main goal of flutter_i18n is to simplify the i18n process in Flutter. I would like to recreate the same experience that you have with the Angular i18n: simple json files, one for each language that you want to support.

Loaders

Loader is a class which loads your translations from specific source. You can easy override loader and create your own.

Available loaders:

Class name Purpose
FileTranslationLoader Loads translation files from JSON, YAML, TOML or XML format
LocalTranslationLoader Is a copy of FileTranslationLoader, but used to loads the files from the device storage instead of assets folder
NetworkFileTranslationLoader Loads translations from the remote resource
NamespaceFileTranslationLoader Loads translations from separate files
E2EFileTranslationLoader Special loader for solving isolates problem with flutter drive

FileTranslationLoader configuration

To use this library, you must create a folder in your project's root: the basePath. Some examples:

/assets/flutter_i18n (the default one)

/assets/i18n

/assets/locales

Inside this folder, you'll put the json, yaml, xml or toml files containing the translated keys. You have different options:

  • If you want to specify the country code

    basePath/{languageCode}_{countryCode}.json

  • If you want to specify the script code

    basePath/{languageCode}_{scriptCode}.json

  • If you want to specify both

    basePath/{languageCode}{scriptCode}${countryCode}_.json

  • otherwise

    basePath/{languageCode}.json

If the json file is not available, we will look for a yaml file with the same name. In case both exist, the json file will be used.

Of course, you must declare the subtree in your pubspec.yaml as assets:

flutter:
  assets:
    - {basePath}

The next step consist in the configuration of the localizationsDelegates; to use flutter_i18n, you should configure as follows:

localizationsDelegates: [
        FlutterI18nDelegate(
          translationLoader: FileTranslationLoader(...parameters...),
          missingTranslationHandler: (key, locale) {
            print("--- Missing Key: $key, languageCode: ${locale.languageCode}");
          },
        ),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
],
builder: FlutterI18n.rootAppBuilder() //If you want to support RTL.

Below you can find the name and description of the accepted parameters.

The useCountryCode parameter depends on the json configuration:

  • if you used the pattern {languageCode}_{countryCode}, useCountryCode must be true
  • if you used the pattern {languageCode}, useCountryCode must be false

The fallbackFile parameter was entroduces with the version 0.1.0 and provide a default language, used when the translation for the current running system is not provided. This should contain the name of a valid json file in assets folder.

The basePath parameter is optionally used to set the base path for translations. If this option is not set, the default path will be assets/flutter_i18n. This path must be the same path as the one defined in your pubspec.yaml.

The forcedLocale parameter is optionally used to force a locale instead finding the system one.

The decodeStrategies parameters is optionally used to choose witch kind of file you want to load. By default JSON, YAML and XML are enabled. If you use only one format, you can speed-up the bootstrap process using only the one you need.

If there isn't any translation available for the required key, even in the fallback file, the same key is returned.

NetworkFileTranslationLoader configuration

Behaviour of this loader very similar as FileTranslationLoader. The main difference that we load translations from NetworkAssetBundle instead of CachingAssetBundle.

Below you can find the name and description of the accepted parameters.

The baseUri parameter provide base Uri for your remote translations.

The useCountryCode parameter depends on the json configuration:

  • if you used the pattern {languageCode}_{countryCode}, useCountryCode must be true
  • if you used the pattern {languageCode}, useCountryCode must be false

The fallbackFile parameter provide a default language, used when the translation for the current running system is not provided.

The forcedLocale parameter is optionally used to force a locale instead finding the system one.

For example if your translation files located at https://example.com/static/en.json you should configure as follows:

localizationsDelegates: [
        FlutterI18nDelegate(translationLoader: 
          NetworkFileTranslationLoader(baseUri: Uri.https("example.com", "static")),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
],

NamespaceFileTranslationLoader configuration

Behaviour of this loader very similar as FileTranslationLoader. The main difference that we load translations from separate files per each language.

For example FileTranslationLoader format:

/assets/flutter_i18n/en.json

/assets/flutter_i18n/it.json

NamespaceFileTranslationLoader format:

/assets/flutter_i18n/en/home_screen.json

/assets/flutter_i18n/en/about_screen.json

/assets/flutter_i18n/it/home_screen.json

/assets/flutter_i18n/it/about_screen.json

Example configuration:

localizationsDelegates: [
        FlutterI18nDelegate(translationLoader: 
          NamespaceFileTranslationLoader(namespaces: ["home_screen", "about_screen"]),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate
],

Below you can find the name and description of the accepted parameters.

The namespaces provide a list of filenames for the specific language directory.

The useCountryCode parameter depends on the json configuration:

  • if you used the pattern {languageCode}_{countryCode}, useCountryCode must be true
  • if you used the pattern {languageCode}, useCountryCode must be false

The fallbackDir provide a default language directory, used when the translation for the current running system is not provided.

The basePath parameter is optionally used to set the base path for translations. If this option is not set, the default path will be assets/flutter_i18n. This path must be the same path as the one defined in your pubspec.yaml.

The forcedLocale parameter is optionally used to force a locale instead finding the system one.

E2EFileTranslationLoader configuration

The same as FileTranslationLoader configuration. This loader can be used for solving problem with flutter drive testing. It removes using separate isolate for loading translations (detailed issue described here: issues/24703).

The useE2E parameter:

  • if you are in flutter drive testing mode – must be true
  • if you are in normal mode – must be false, in this case FileTranslationLoader will be used

flutter_i18n in action

After the configuration steps, the only thing to do is invoke the following method:

FlutterI18n.translate(buildContext, "your.key")

Where:

  • buildContext is the BuildContext instance of the widget
  • your.key is the key to translate

Other examples of use:

Force a language to be loaded at run-time:

await FlutterI18n.refresh(buildContext, languageCode, {countryCode});

Plural translations:

FlutterI18n.plural(buildContext, "your.key", pluralValue);

Text widget shorthand:

I18nText("your.key", child: Text(""))
I18nText("your.key", translationParams: {"user": "Flutter lover"})
I18nPlural("clicked.times", 1)
I18nPlural("clicked.times", 2, child: Text(""))

If you need to listen the translation loading status, you can use:

  • FlutterI18n.retrieveLoadingStream method, that allows you to listen to every status change
  • FlutterI18n.retrieveLoadedStream method, that allows you to listen when the translation is loaded

For more informations and details, read the CHANGELOG.md.

Utilities

Using flutter pub run flutter_i18n inside the root of your project you can enjoy some utilities that will help you with the translations files management.

Commands

Validate

This command is used to validate all the translations files inside the project.

> flutter pub run flutter_i18n validate
[flutter_i18n DEBUG]: I've found assets/i18n/en.yaml
[flutter_i18n DEBUG]: I've found assets/i18n/it.json
[flutter_i18n DEBUG]: I've found assets/i18n/es.xml
[flutter_i18n DEBUG]: I've found assets/i18n_namespace/en/common.json
[flutter_i18n DEBUG]: I've found assets/i18n_namespace/en/home.yaml
[flutter_i18n DEBUG]: I've found assets/i18n_namespace/ua/common.json
[flutter_i18n DEBUG]: I've found assets/i18n_namespace/ua/home.json
[flutter_i18n INFO]: YAML file loaded for en
[flutter_i18n INFO]: Valid file: assets/i18n/en.yaml
[flutter_i18n INFO]: JSON file loaded for it
[flutter_i18n INFO]: Valid file: assets/i18n/it.json
[flutter_i18n INFO]: XML file loaded for es
[flutter_i18n INFO]: Valid file: assets/i18n/es.xml
[flutter_i18n INFO]: JSON file loaded for common
[flutter_i18n INFO]: Valid file: assets/i18n_namespace/en/common.json
[flutter_i18n INFO]: YAML file loaded for home
[flutter_i18n INFO]: Valid file: assets/i18n_namespace/en/home.yaml
[flutter_i18n INFO]: JSON file loaded for common
[flutter_i18n INFO]: Valid file: assets/i18n_namespace/ua/common.json
[flutter_i18n INFO]: JSON file loaded for home
[flutter_i18n INFO]: Valid file: assets/i18n_namespace/ua/home.json

Diff

This command is used to find the differences between the keys of the desired translation files.

> flutter pub run flutter_i18n diff en.yaml it.json
[flutter_i18n INFO]: [en.yaml, it.json]
[flutter_i18n INFO]: YAML file loaded for en
[flutter_i18n INFO]: JSON file loaded for it
[flutter_i18n ERROR]: The compared dictionary doesn't contain the key >title

Plugins

Plugin Description
flutter_i18n_locize Easy integration locize.io to flutter_i18n.

Contributors

Thanks goes to these wonderful people (emoji key):


Anton

🚇 ⚠️ 💻

Lucas Vienna

💻

jlcool

💻

Julian

💻 🤔

Andrey Gordeev

💻 🐛

Amir Panahandeh

🐛 💻

This project follows the all-contributors specification. Contributions of any kind welcome!

Comments
  • Can't make it work on iOS

    Can't make it work on iOS

    Hi, I'm trying to use the package and it's working OK on Android. But in iOS simulator it only gets en_US locale. I've changed the settings to another languages but no lucky. Even deploying in Release Mode for my iOS device (in Portuguese) it still uses the en locale. Any hint on what should be done?

    Here my Flutter Doctor:

    [✓] Flutter (Channel stable, v1.12.13+hotfix.5, on Mac OS X 10.15.2 19C57, locale en-BR)
        • Flutter version 1.12.13+hotfix.5 at /Users/franklin/Development/flutter
        • Framework revision 27321ebbad (3 weeks ago), 2019-12-10 18:15:01 -0800
        • Engine revision 2994f7e1e6
        • Dart version 2.7.0
    
    [✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
        • Android SDK at /Users/franklin/Library/Android/sdk
        • Android NDK location not configured (optional; useful for native profiling support)
        • Platform android-29, build-tools 29.0.2
        • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
        • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
        • All Android licenses accepted.
    
    [✓] Xcode - develop for iOS and macOS (Xcode 11.3)
        • Xcode at /Applications/Xcode.app/Contents/Developer
        • Xcode 11.3, Build version 11C29
        • CocoaPods version 1.8.4
    
    [✓] Android Studio (version 3.5)
        • Android Studio at /Applications/Android Studio.app/Contents
        • Flutter plugin version 42.1.1
        • Dart plugin version 191.8593
        • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
    
    [✓] Connected device (2 available)
        • iPhone do Franklin • 8ca28e9db21289c970d810c3625aa017c • ios • iOS 13.3
        • iPhone 11 Pro Max  • 29823942-BC97-4196-B74D-A03C680     • ios • com.apple.CoreSimulator.SimRuntime.iOS-13-3 (simulator)
    
    • No issues found!
    

    And my main.dart

    Future main() async {
      final FlutterI18nDelegate flutterI18nDelegate = FlutterI18nDelegate(
        useCountryCode: false, 
        fallbackFile: 'en',
        path: 'assets/flutter_i18n',
      );
      WidgetsFlutterBinding.ensureInitialized();
      await flutterI18nDelegate.load(null);
      SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
          .then((_) {
        runApp(new MyApp(flutterI18nDelegate));
      });
    }
    
    class MyApp extends StatelessWidget {
      FlutterI18nDelegate flutterI18nDelegate;
    
      MyApp(this.flutterI18nDelegate);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData(
            appBarTheme: AppBarTheme(brightness: Brightness.light),
            primaryColor: Colors.white,
            scaffoldBackgroundColor: Colors.white,
            accentColor: kMainBlue,
            primaryTextTheme: TextTheme(
              title: TextStyle(
                  fontFamily: 'Inter',
                  fontWeight: FontWeight.w700,
                  letterSpacing: 1.0),
            ),
          ),
          initialRoute: SplashScreen.id,
          routes: {
            LoginScreen.id: (context) => LoginScreen(),
            RegistrationScreen.id: (context) => RegistrationScreen(),
            HomeScreen.id: (context) => HomeScreen(),
            SplashScreen.id: (context) => SplashScreen(),
          },
          localizationsDelegates: [
            flutterI18nDelegate,
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate
          ],
        );
      }
    }
    

    Thanks!

    opened by franskjv 27
  • Default language is always the same if I have two selected in device

    Default language is always the same if I have two selected in device

    Hi! Thanks for all your effort with this package! Unfortunately I'm having a problem in my tests with iOS platform. My supported locales in main are 'en' and 'pt' with this delegate: FlutterI18nDelegate(useCountryCode: false, path: 'assets/i18n', fallbackFile: 'en'). I have three situations in my tests:

    1. System with only one of those languages selected brings the correct language.
    2. System with another language selected brings the correct fallback language.
    3. System with English and Portuguese language selected always brings Portuguese. I wish I could bring the default system language, not the region.

    Something I notice is that I keep getting a return of 'en_BR' (English as default) if I do print(FlutterI18n.currentLocale(context)); in situation 1, 'es_BR' (Spanish as default) if I'm in situation 2 and 'pt_BR' (English as default but Portuguese available) if I'm in situation 3.

    Sorry if I'm doing something wrong, but I read the documentation and could not find anything that could help me.

    bug 
    opened by NathanAP 19
  • Problem everytime when calling the the translate function of flutter i18n.

    Problem everytime when calling the the translate function of flutter i18n.

    The method 'getdecodedMap' was called on null.
    Receiver: null
    Tried calling: getdecodedMap()
    

    this error is invoked everytime when I call the FlutterI18n.translate(context,key) function

    Snippet of code: Screenshot 2020-01-14 at 6 15 44 PM

    Error: Screenshot 2020-01-14 at 6 16 12 PM

    opened by itsbinay 13
  • Why is the language still not switched after long press the copy and paste pop-up box after the language switch? Why is this?

    Why is the language still not switched after long press the copy and paste pop-up box after the language switch? Why is this?

    Why is the language still not switched after long press the copy and paste pop-up box after the language switch? Why is this? What can I do? thank you!

    opened by jiangqingbo 12
  • Add Fallback language to translate method

    Add Fallback language to translate method

    I just noticed u added fallback key to translate method.

    In my case i have around 15 supported languages in my app, and i know that English language/file contains all keys with translations. It would be nice to have fallback language, lets say i have some other language selected instead of English and the key is not found in "French" language file, it could use English translation as default.

    like this: FlutterI18n.translate(context, "alert_title", "english")

    "english" parameter will be fallback language if key "alert_title" is not found in lets say French language file.

    opened by dukaric1991 11
  • NoSuchMethodError:The method ‘[]’ was called on null.

    NoSuchMethodError:The method ‘[]’ was called on null.

    I found that there were two things that would happen.

    1. Ios system, zh Chinese. An error will be reported after killing the process and restart the application to translate the first string.
    2. Occasionally. Problems can occur when switching to another page. And when you get back, the entire application will be in trouble.

    Can it be solved in time?

    NoSuchMethodError:The method ‘[]’ was called on null.
    Receiver:null
    Tried calling:[](“motto”)
    
    opened by qiaoshouqing 11
  • Fixed FlutterI18nDelegate not listening properly to specified locale.

    Fixed FlutterI18nDelegate not listening properly to specified locale.

    When loading a new locale, the translationloader was never told which language to use, which meant it fell back to its 'default' locale. This in turn meant that, for the case of the FileTranslationLoader, it would use the intl package's getSystemLocale to determine locale, instead of using the locale selection flow implemented by the rest of the flutter ecosystem.

    This patch fixes it by explicitly updating the translationLoader's locale field with the value passed to the LocalizationsDelegate load function.

    opened by davidv1992 10
  • Unable to load asset

    Unable to load asset

    First of all, thanks for the great library! I use yaml files and use code from example project. The error I get is:

    FlutterError (Unable to load asset: assets/i18n/fr.json)

    on line:

    await flutterI18nDelegate.load(null);
    

    The reason of this error is this function:

      Future<void> _loadFile(final String fileName) async {
        try {
          decodedMap = await rootBundle
              .loadString('$_basePath/$fileName.json')
              .then((jsonString) => json.decode(jsonString));
        } on FlutterError catch (_) {
          var yamlNode = await rootBundle
              .loadString('$_basePath/$fileName.yaml')
              .then((yamlString) => loadYamlNode(yamlString));
          decodedMap = _convertYaml(yamlNode);
        }
      }
    

    For some reason debugger considers the exception as uncaught and therefore stops program. This is quite annoying. I think a better solution is to let the user specify which file type he uses for translation.

    opened by agordeev 9
  • Black screen after splash screen with async main

    Black screen after splash screen with async main

    Hi, thanks for your library, I had same problem than #17 #18 #28 #29. I had tried to fix it by using your example in #17 but it's not working. Here is my example, what i done wrong ? I need my main async for local storage initialize. thanks

    opened by duduf15 9
  • current locale is reset after hot reload

    current locale is reset after hot reload

    Hello! I'm using this plugin for some time now. Recently I noticed, that after every hot reload my language falls back to the default english. I reverted the version back to 5.2 with the necessary changes and there it works.

    For some reason FlutterI18n.currentLocale(context) always returns en_US on the second call or something.

    Can you have a look into it?

    Thanks!

    Cheers

    opened by grAPPfruit 9
  • Should default to fallback language if a file does not exist for the current locale

    Should default to fallback language if a file does not exist for the current locale

    I am currently seeing crashes where the package cannot resolve the file for my current locale (set phone language to Korean for testing). In these cases, the package should default to the fallback locale.

    opened by JMichaelYang 9
  • Upgrade intl package to 0.18.0

    Upgrade intl package to 0.18.0

    Hi !

    Thanks for this package, its very useful. Could you just update the intl package from 0.17.0 to 0.18.0? This causes conflicts in some projects.

    Thank you very much

    opened by romgrm 1
  • Language changes suddenly despite FlutterI18n.currentLocale(context)?.languageCode still returns desired language

    Language changes suddenly despite FlutterI18n.currentLocale(context)?.languageCode still returns desired language

    Hello,

    I observe strange behavior for some users logged by FirebaseAuth.instance.currentUser using NetworkFileTranslationLoader. For the first 3 launchs, the behavior is correct, in this case app language set to French by default and FlutterI18n.currentLocale(context)?.languageCode returns fr as well.

    But, when this logged user closes and reopens exactly 3 times his app, the app language is changing in English despite FlutterI18n.currentLocale(context)?.languageCode is still returning fr in the language menu.

    The forcedLocale is also setted on fr on his launch (thanks to debugs logs I putted) so there is no reason that the app language is suddenly setted to English.

    If this user use app version with FileTranslationLoader despite of NetworkFileTranslationLoader (so in local) OR if the user isn't logged in FirebaseAuth, the behavior is always excellent ! Only 2 users are concerned (we have more than 20k active users) and even with cache clearing and resinstalls, this strange behavior is always present, when they are logged, after the third app restarting.. The users doesn't call refresh method before the issue comes.

    This is my code implementation, where in this case Platform.localeName.split('_')[0] is returning fr (thanks to debugs logs and when we debug FlutterI18n.currentLocale(context)?.languageCode is setted to fr):

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
    
      Locale? locale;
      SharedPreferences.getInstance().then((sharePref) {
        if (sharePref.getString('savedLocale') == null)
          locale = Locale(Platform.localeName.split('_')[0]);
        else
          locale = Locale(sharePref.getString('savedLocale') as String);
    
        final FlutterI18nDelegate flutterI18nDelegate = FlutterI18nDelegate(
          translationLoader: NetworkFileTranslationLoader(
            useCountryCode: false,
            fallbackFile: 'en',
            forcedLocale: locale,
            baseUri: Uri.https("l-algo-de-paulo-8fb41.appspot.com.storage.googleapis.com", "translations"),
            decodeStrategies: [JsonDecodeStrategy()],
          ),
        );
    
        runApp(MyApp(flutterI18nDelegate));
      });
    }
    

    Then, flutterI18nDelegate is used in MaterialApp.localizationsDelegates like this:

    localizationsDelegates: [
            widget.flutterI18nDelegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalMaterialLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,
    ]
    

    As I said before, for the most part of users, everything is working well, the problem is only present when the user is logged in FirebaseAuth and using NetworkFileTranslationLoader. If he's logged but using FileTranslationLoader, everything works well. If he's not logged but using NetworkFileTranslationLoader, everythin works well also.

    I don't know how could I get more informations to help you to understand this issue better, but not hesitate to ask me something !

    Thanks a lot for your plugin and all your work !

    opened by chamartt 0
  • Enable translation without context

    Enable translation without context

    Hi, I just completed the PR that enables translation with FlutterI18n instance, and without context. Basically I made BuildContext nullable in 4 functions that required it: translate(..), plural(..), currentLocale(..) and refresh(..). I added an optional named parameter FlutterI18n? instance to all of these, and have added it to I18nText and I18nPlural widgets as well. I decided to go with this kind of implementation to avoid adding additional 4 functions to the FlutterI18n class. IMHO it would make it too bloated. I am not completely satisfied with this solution either, since you need to pass null for BuildContext each time you translate without it, but I didn't have any better ideas how to implement it.

    I have added tests as well.

    Now you can register a FlutterI18n instance, and call for translator, for instance, somewhere in your data layer, like this:

    FlutterI18n instance = GetIt.instance.get();
    String translatedText = FlutterI18n.translate(null, 'translation_key', instance: instance);  
    

    Whenever you pass an instance that is not null it will avoid trying to use the context. When instance is not passed context is used. Developers must take care not to set both BuildContext and instance to null.

    opened by MilosKarakas 7
Releases(0.32.5)
Owner
Matteo Pietro Dazzi
I'm a developer graduated at Università degli Studi di Milano, on October 2016.
Matteo Pietro Dazzi
This is not an app. I made this architecture to build robust and easy-to-maintain products but in a faster way.

simple_architecture_flutter This is not an app. I made this architecture to build robust and easy-to-maintain products but in a faster way. Info I use

Batuhan Karababa 9 Oct 28, 2022
A Flutter package that makes it easy to customize and work with your Flutter desktop app's system tray.

system_tray A Flutter package that that enables support for system tray menu for desktop flutter apps. on Windows, macOS and Linux. Features: - Modify

AnTler 140 Dec 30, 2022
A Flutter package that makes it easy to customize and work with your Flutter desktop app window.

bitsdojo_window A Flutter package that makes it easy to customize and work with your Flutter desktop app window on Windows, macOS and Linux. Watch the

Bits Dojo 606 Dec 27, 2022
A simple easy to use Flutter DApp , which keeps a track of all your day to day transactions by using Ethereum blockchain in the background which in turn increases your credit score.

Sahayog A simple easy to use Flutter DApp , which keeps a track of all your day to day transactions by using Ethereum blockchain in the background whi

Utkarsh Agarwal 15 May 21, 2022
Starter architectures for your next Flutter project in order to make it scalable and easy for maintenance and tests.

?? ?? ?? Flutter Starter Architecture (MVVM) My custom starter project for Flutter apps. I was looking for a simple way to build Flutter app in a scal

Junior Medehou 29 Dec 25, 2022
A declarative library with an easy-to-use interface for building Flutter applications on AWS.

Amplify Flutter AWS Amplify provides a declarative and easy-to-use interface across different categories of cloud operations. Our default implementati

AWS Amplify 1.1k Jan 5, 2023
Dart/Flutter package for using Elastic App Search through a simple API returning easy to handle objects

Dart/Flutter package for using Elastic App Search through a simple API returning easy to handle objects This package is a ready-to-use API for Elastic

Julien Le Bren 5 Nov 16, 2022
A simple and easy to use Redis client for Dart

redis_dart A simple and minimalist Redis client for Dart See it in pub: https://pub.dev/packages/redis_dart and GitHub: https://github.com/gabrielpach

Gabriel Pacheco 7 Dec 25, 2022
Easy to use open source Hub 🕸️ to control your smart devices from one app.

CyBear Jinni Hub Welcome! This repository is in charge of controlling smart devices and is part of the CyBear Jinni Smart Home system. The software is

CyBear Jinni 26 Nov 23, 2022
Easy to use open source Hub 🕸️ to control your smart devices from one app.

CyBear Jinni Hub Welcome! This repository is in charge of controlling smart devices and is part of the CyBear Jinni Smart Home system. The software is

CyBear Jinni 13 Jul 22, 2021
Easily scan your documents on the go with Paper. Scan those documents at ease with real-time document detection, multi paged pdfs, optimized and cleaner clicks from an easy to navigate UX

Easily scan your documents on the go with Paper. Scan those documents at ease with real-time document detection, multi paged pdfs, optimized and cleaner clicks from an easy to navigate UX

Harsh Joshi 38 Dec 16, 2022
Latest and easy-to-read news, all in your pocket 📱

Observer-flutter About Flutter app for getting live news in different categories Tools used Inshorts News API v2 This API's documentation Get the App

null 3 Jul 13, 2022
Super easy mood tracking app to demonstrate use of the Firebase Local Emulator Suite

Mood Tracker Example App in Flutter This is a simple example app showing how to use Cloud Functions and the Firebase Local Emulator inside a Flutter a

Andrea Bizzotto 8 Oct 14, 2022
Provide easy and flexible way to show SnackBar. Simple text, undo, and error style are supported.

snack_bar_presenter Provide easy and flexible way to show SnackBar. Simple text, undo, and error style are supported. . . . Usage import 'package:exam

Masayuki Ono (mono) 8 Nov 30, 2020
Easy way to store http response.

Starlight Http Cached The easiest way to store data such as http response,String,int,double,bool,map,list. Features ☑️ Set Cached ☑️ Get Cached ☑️ Del

Ye Myo Aung 3 Jan 9, 2023
Recipe-flavored markdown: make recipes easy to create and maintain

Recipe-Flavored Markdown Have you ever wanted a simpler approach to writing and

Joanna May 28 Dec 8, 2022
Feature-rich and easy-to-use Minecraft Fallout server bot.

更好的 Minecraft 廢土伺服器機器人 ?? 介紹 這是個具有許多功能的廢土機器人,且完全免費與開源 另一大特色就是具有容易操作的界面,而不是傳統的小黑窗,讓任何人都能夠輕鬆使用~ 詳細功能請看 這裡 祝您使用愉快! 立即下載 ?? 下載 本軟體支援 Windows、Linux、macOS 作

菘菘 9 Dec 23, 2022
Flutter 2.0 (Null safety) Basic, Dynamic & Silver style Staggered Grid views made using flutter staggered grid view package. 🦺

Staggered Grid View Developement Stack Getting Started This project is a starting point for a Flutter application. A few resources to get you started

Nakshatra Singh 9 Oct 28, 2022
Utility Manager Flutter Application is made with Flutter and Supabase which allows user to add task, set remainder to the task, set color to separate tasks and it allows to add URL with URL's informations.

Utility Manager Flutter Application! Utility Manager Flutter Application is made with Flutter and Supabase which allows user to add task, set remainde

Kathirvel Chandrasekaran 6 Jan 6, 2022