Skip to content
CAI
Software that uses CAICheck a score

aissat/easy_localization

63.2

Adequate · 19 September 2026

2.4k

lines of production code

Dart

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a Flutter localization library that manages multi-language support through extensible asset loaders and context-based translation functions. It provides tooling for developers, including a CLI for auditing translation key consistency and a separate logging package for configurable console output. The system supports a wide range of platforms and data formats, enabling type-safe access to strings with features like pluralization and fallback handling.

How it got here

2018 — v2.0.0 release and null safety migration

9 changes.

This period focused on releasing EasyLocalization v2.0.0, which introduced a refactored modular architecture, support for multiple asset loaders, and advanced localization features like pluralization and gender-based translations. The work also included migrating the library and example apps to Dart null safety, updating platform embeddings, and expanding test coverage to ensure stability.

2020 — EasyLocalization v3.0 rewrite and platform expansion

7 changes.

The project underwent a major architectural rewrite to version 3.0, introducing a new controller-based state management system and extensible asset loader abstraction. This release was accompanied by expanded platform support for the example app, adding macOS and web capabilities, alongside new CLI tools for auditing translations and generating type-safe code.

2021–2025 — EasyLogger release and tooling expansion

5 changes.

This period focused on the initial release and stabilization of the EasyLogger package, including its core logging features, configuration options, and comprehensive unit tests. It also expanded the project's capabilities by adding Linux desktop support to the example application and introducing a new CLI audit command to detect unused translation keys.

Features

Add Linux desktop platform support to the example app

The example application now includes a complete Linux desktop implementation, enabling users to build and run the app on Linux systems. This change adds the necessary CMake build configuration, GTK-based application entry points, and Flutter plugin registration infrastructure required for the Linux target.

example/linux · high confidence

Added macOS desktop platform support to the example app

The example application now includes a complete macOS desktop project, enabling users to build and run the app on macOS. This addition introduces the standard Flutter macOS runner structure, including the Xcode project configuration, Swift application entry points (AppDelegate and MainFlutterWindow), and necessary build assets like the app icon and menu bar. It also configures the \shared\_preferences\_foundation\ plugin for macOS, allowing the example to demonstrate platform-specific storage capabilities on the desktop.

example/macos · high confidence

Added web platform support for the example app

The example application now includes the necessary files to run as a web application, specifically an HTML entry point and a web manifest. This enables the app to be served in a browser and supports Progressive Web App (PWA) features, such as service worker registration for offline capabilities and proper icon handling for mobile home screens.

example/web · high confidence

Expanded example localization assets with new languages and formats

The example application's localization resources in \example/resources/langs\ have been significantly expanded. New language packs for German (de-DE) and Russian (ru-RU) have been added alongside existing English and Arabic content. These resources are now provided in multiple formats (JSON, XML, YAML, and CSV) to support various loading strategies. The translation keys have also been enriched with support for named arguments, nested paths (e.g., \profile.reset\_password\), pluralization rules, and gender-specific strings, providing a more comprehensive demonstration of the localization capabilities.

example/resources/langs · high confidence

Initial release of the EasyLogger package

The EasyLogger package is now available for Flutter projects, providing a configurable logging solution. Users can install it via pubspec.yaml and configure it with a name, default log level, enabled build modes, and specific message levels. The logger supports custom printer functions, stack trace dumping for exceptions, and helper methods for common log levels (debug, info, warning, error).

_packages/easy\logger · high confidence

Introduce EasyLogger for customizable, level-aware console logging

The \easy\_logger\ package is now available, providing a callable \EasyLogger\ class that allows developers to log messages with specific levels (debug, info, warning, error) and filter them by build mode (debug, profile, release). The logger supports custom name prefixes, configurable enabled levels and build modes, and a pluggable printer interface for custom output formatting. By default, it uses ANSI color codes to distinguish log levels in the console output.

_packages/easy\logger/lib · high confidence

New audit command and enhanced code generation options

The CLI now includes a new \audit\ command (bin/audit.dart) that checks for translation inconsistencies by comparing a translations directory against source code. The existing code generation command (bin/generate.dart) has been updated to support a \--format\ flag allowing users to choose between 'json' and 'keys' output modes, and a new \--skip-unnecessary-keys\ flag to omit redundant keys from nested objects during generation.

bin · high confidence

New audit command to detect unused translation keys

A new \AuditCommand\ class has been added to the \bin/audit\ directory, introducing a CLI tool that scans source code for translation key usage and compares it against translation files to identify missing keys. The command loads translations from a specified directory (supporting linked files via \LinkedFileResolver\), scans Dart source files for keys used in \tr()\, \context.tr()\, \plural()\, and \LocaleKeys\ patterns, and reports any keys present in the source but absent from the translation files, distinguishing between keys with and without variables.

bin/audit · high confidence

Behavioural changes

Android example project migrated to Flutter V2 embedding

The Android example app has been updated to use the Flutter V2 Android embedding, replacing the deprecated V1 implementation. This migration includes updating the main package name to io.aissat.example.example, switching the MainActivity to extend FlutterActivity, and modifying AndroidManifest.xml to declare the flutterEmbedding version 2 and configure the new NormalTheme and SplashScreenDrawable metadata. Additionally, the project now supports dark mode via new night-style resource files, updates the Gradle wrapper to version 5.6.2, and adds a .gitignore file for Android build artifacts.

example/android · high confidence

EasyLocalization v3.0: Complete rewrite with new architecture and features

This release introduces a major architectural overhaul of the EasyLocalization library. The core state management has been refactored from a StatefulWidget to an \EasyLocalizationController\ (ChangeNotifier), enabling better separation of concerns and supporting \ensureInitialized()\ for pre-loading saved locales. The translation loading system is now extensible via a new \AssetLoader\ abstraction (with \RootBundleAssetLoader\ and \IOFileLoader\ implementations) and supports \extraAssetLoaders\ for loading translations from other packages. New features include linked translation files (using the \:/\ syntax), fallback translations for empty resources (\useFallbackTranslationsForEmptyResources\), and improved pluralization rules based on the actual language. The API surface has been updated with \tr()\ and \plural()\ functions that no longer require a \BuildContext\ when used outside widgets, and extensions for \String\ and \Text\ widgets. Deprecated APIs like \localeFromString\ have been removed or marked for removal, and the library now requires \WidgetsFlutterBinding.ensureInitialized()\ in the app's main function.

lib/src · high confidence

Example app restructured with new language selection UI and modern localization API

The example application has been significantly updated to demonstrate the library's current capabilities. A new LanguageView screen allows users to switch between supported locales (English, German, Russian, Arabic) via a dedicated UI. The main app now uses the modern \EasyLocalization\ widget wrapper with \EasyLocalization.ensureInitialized()\ and context-based extensions (e.g., \context.locale\, \context.supportedLocales\) instead of the previous \LocaleProvider\ pattern. Localization strings are accessed using the new \tr()\ and \plural()\ methods with support for named arguments, gender, and number formatting, replacing the older \AppLocalizations\ delegate approach.

example/lib · high confidence

Example iOS project reconfigured for CocoaPods, localization, and modern iOS requirements

The example iOS project has been updated to use CocoaPods for dependency management, introducing the Pods group and build phases while removing manual framework embedding. Localization support is expanded with new Arabic (ar-DZ) and Russian (ru) string files, and the app now allows mixed localizations. The minimum deployment target is raised to iOS 11, and the Xcode project is upgraded to version 13.0 compatibility. Additionally, the app bundle includes settings to disable minimum frame duration on iPhone and support indirect input events, while the Swift code is updated to use modern API keys.

example/ios · high confidence

Generated localization code now uses a custom asset loader and typed keys

The example app's generated localization files have been updated to support linked file resolution and static key constants. The new \CodegenLoader\ class implements \AssetLoader\ using \JsonLinkedFileResolver\ and \RootBundleFileLoader\, replacing the previous loading mechanism, while \locale\_keys.g.dart\ now provides a \LocaleKeys\ class with static constants for all translation keys (e.g., \title\, \msg\, \clickMe\), enabling type-safe access to localization strings in the application.

example/lib/generated · high confidence

Refactored localization architecture and updated public API exports

The library has replaced its previous internal implementation files (locale\_provider.dart and localizations.dart) with a new modular structure under the src directory, introducing components like EasyLocalizationApp, AssetLoader, and LinkedFileResolver. This change decouples asset loading logic, allowing developers to use custom loading strategies (such as network or file I/O) rather than being restricted to the root bundle, and simplifies integration. The public API now exports these new core components along with the intl package, reflecting a shift in how localization is initialized and managed within the application.

lib · high confidence

Updated example app to demonstrate EasyLocalization v2.0.0 features

The example application has been updated to reflect the v2.0.0 release, showcasing new capabilities such as \EasyLocalization.ensureInitialized()\ for initialization, support for multiple asset loaders (including CSV, YAML, and XML), and advanced localization features like pluralization and gender-based translations. The example code and README have been revised to provide accurate usage patterns for these new features.

example · high confidence

Test coverage

Added comprehensive test coverage for EasyLocalization features; Added test asset loaders for localization unit tests; Added unit tests for EasyLogger print and configuration behavior; Added widget smoke test for the example app.

Dependencies

Upgrade to null safety and update example project dependencies

The main library has been upgraded to support Dart null safety (SDK \>=2.12.0) and updated to version 3.0.9, introducing new dependencies including \shared\_preferences\, \intl\ (0.17.0–0.21.0), \args\, \path\, and the new \easy\_logger\ package. The example application has been migrated to AndroidX, updated to compile and target SDK version 28, upgraded to Kotlin 1.3.50 and Gradle 3.5.0, and updated its own dependencies (such as \cupertino\_icons\ to 1.0.2) to align with the new null-safe environment.

(dependencies) · high confidence

Housekeeping

Initial project scaffolding and configuration

The repository is initialized with essential configuration files including a comprehensive .gitignore for Flutter and Android development, Gitpod environment setup (.gitpod.yml, .gitpod.Dockerfile) for cloud-based development, and analysis\_options.yaml configured with flutter\_lints. The project also includes a CONTRIBUTING.md outlining the release process, a LICENSE file (MIT), and an updated README.md with installation and usage instructions. The .metadata file indicates the project is a Flutter package on the dev channel.

(repo-wide) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 63.

Lenses

  • Code Health 99
  • Architecture 100
  • Maturity 54
  • Readiness 58
  • Security 65
  • Domain Modelling 100

Changes since last survey

  • 300 commits — 248 feature/other, 52 fixes

By area

  • lib/src — 90 commits
  • (root) — 79 commits
  • (repo) — 46 commits
  • packages/easy_logger — 28 commits
  • .github/workflows — 15 commits
  • bin/generate.dart — 8 commits
  • test/easy_localization_context_test.dart — 7 commits
  • example/lib — 6 commits
  • test/easy_localization_test.dart — 4 commits
  • bin/audit — 3 commits
  • .github/FUNDING.yml — 2 commits
  • example/android — 2 commits
  • example/ios — 2 commits
  • example/resources — 2 commits
  • example/linux — 1 commit
  • example/pubspec.yaml — 1 commit
  • i18n/en-US.json — 1 commit
  • i18n/en-linked — 1 commit
  • test/easy_localization_logger_test.dart — 1 commit
  • test/easy_localization_widget_test.dart — 1 commit

Notable commits

  • fix: Fix #648: allow using "old" (e.g. pre-3.0.4) plural rules evaluation (#668)
  • fix: Fix changelog and increase version (#677)
  • fix: Fix codegen loader override.
  • fix: Fix crash when a key containing periods doesn't exist. Fixed shared preferences null exception during unit tests
  • fix: Fixed analysis errors
  • fix: Fixed bug where no text was displayed even with --help flag. (#609)
  • fix: Fixed plural rules fallback
  • fix: Fixed plural rules fallback
  • fix: Fixed: i18n files appear on build: #497 #540 (#593)
  • fix: Merge pull request #765 from aissat/copilot/fix-764
  • fix: Small fixes and the formatter doing its thing.
  • fix: Updated tr() and plural() Fixed #552 #448
  • fix: [plural] fix priority of fallbacks
  • fix: [pub] Fix pipeline v2 (#587)
  • fix: bugfix request for PR #440 allow loading base language fallback to continue if base language asset does not exist
  • fix: fix [easy_logger] analysis issues
  • fix: fix analyze issues
  • fix: fix analyze issues
  • fix: fix bug empty _translations in null safety
  • fix: fix easy_logger depence
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

aissat/easy_localization was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 8fda76d14beb349cce8e9f04c23b3560f0901365 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.