rerune 0.14.4 copy "rerune: ^0.14.4" to clipboard
rerune: ^0.14.4 copied to clipboard

Over-the-air localization for Flutter: update translations and add languages without an app release while keeping generated AppLocalizations APIs.

0.14.4 #

  • Added a synthetic pub.dev product-flow screenshot and a reusable social-preview image built from a privacy-safe dashboard crop.

0.14.3 #

  • Reworked the public README around release-independent Flutter localization outcomes and moved transport protocol details back to internal documentation.
  • Added one local release-validation script covering package and example generation, analysis, tests, code-generation parity, and the pub.dev dry run.

0.14.2 #

  • Improved pub.dev discovery metadata with an outcome-focused description and localization, translation, OTA, and code-generation topics.

0.14.1 #

  • Changed the package license from proprietary terms to the MIT License.

0.14.0 #

  • BREAKING: locale transport now consumes the backend's generic per-locale JSON array instead of Flutter ARB documents. Plain value messages and structured cardinal-plural variants are decoded and rendered directly while generated AppLocalizations getters and methods remain the consumer API.
  • BREAKING: the manifest request no longer sends platform=flutter. The manifest response schema and per-locale version-addressed full/delta request protocol remain unchanged.
  • BREAKING: replaced ReRuneCachedArb with ReRuneCachedLocaleBundle. Custom ReRuneCacheStore implementations must replace readArb, writeArb, and deleteArb with readLocaleBundle, writeLocaleBundle, and deleteLocaleBundle.
  • BREAKING: default persistence moved to the rerune_locale_cache_v1 namespace and stores locale_<locale>.json entries on IO platforms. Existing ota_localizations ARB caches are ignored without migration or deletion.
  • Generic full responses are authoritative complete locale documents. Generic deltas replace complete records by translation key while retaining omitted cached records, then persist a deterministic complete canonical JSON snapshot.
  • Locale records may contain values: [] to indicate that the key has no translation for the requested locale. ReRune keeps the opaque record in the canonical cache but omits its runtime message so existing locale, main-language, and bundled fallback continues. In a delta, this also clears a previously cached runtime override for that locale.
  • Records whose visible {{placeholder}} tokens do not match their declarations are also accepted and preserved in canonical cache but omitted from the runtime overlay. Other keys and synchronization metadata still commit; a delta mismatch clears any older runtime override for that key.
  • Locale payload validation is atomic. Invalid structures preserve the last committed locale, while missing or incompatible runtime plural/placeholder arguments fall back only the affected message to its bundled Flutter value.
  • Structured plurals use the six lowercase cardinal categories and require other. Rendering selects through the supplying locale's Intl.pluralLogic rules before interpolating declared {{placeholder}} tokens.

0.13.0 #

  • BREAKING: locale requests now use explicit version addressing. Full requests send target_version; delta requests send the successfully applied locale version and manifest target_version. The timestamp-based updated_at protocol is removed.
  • BREAKING: removed ReRuneCachedArb.updatedAt and the serialized updated_at cache field. ReRuneCachedArb now requires and persists complete data plus the successfully applied manifest locale name, version, minimumDeltaBaseVersion, and url.
  • Locale HTTP 409, or an applied locale version newer than its manifest target, stops the current locale pass and triggers one unconditional manifest refresh. A second stale signal stops the check and clears the cached manifest ETag; later checks receive their own single recovery attempt.
  • Successful locale commits survive a stale-manifest restart. Final update lists are deduplicated, final manifest membership wins, and the check emits at most one fetched-text update event.
  • Manifest locale entries now store and expose name. Applied locale caches retain the matching name and URL, and ReRune.localeName(locale) resolves the successfully applied cached name through normalized locale fallbacks.
  • ReRuneUpdateResult.updatedLocaleNames reports name-only manifest changes. These changes count toward hasUpdates and advance the general localization revision without emitting ReRune.onFetchedTextsApplied.

0.12.0 #

  • BREAKING: locale endpoints now support incremental updates through the optional RFC 3339 updated_at query parameter. ReRune tracks the cursor and successfully applied manifest version independently for every locale.
  • BREAKING: ReRuneCachedArb now requires version and updatedAt; the previous locale cache format is invalidated and refetched in full.
  • BREAKING: every manifest locale and ReRuneCachedArb now requires minimumDeltaBaseVersion. When its manifest value differs from the cached locale value, ReRune fetches without updated_at and fully replaces the cached locale before committing the new metadata.
  • BREAKING: removed locale-response ETag support, ReRuneManifestLocale.sha256, and ReRuneErrorType.checksum. Manifest ETags remain supported.
  • BREAKING: custom ReRuneCacheStore implementations must implement deleteArb(...) for unpublished-locale cleanup.
  • Newly fetched manifests are authoritative for published languages. ReRune removes cached and in-memory locale bundles that are no longer listed.
  • Locale requests are skipped when that locale's manifest version and minimum delta base version match its successfully applied cache metadata; a changed top-level manifest version alone does not download any language.
  • Incremental locale responses are merged into the complete cached ARB, with incoming keys overriding cached values. Missing delta keys are retained; incremental deletion is not supported. Full locale responses replace the cache and remove keys absent from the response.
  • Successful identical or empty deltas and identical full replacements advance the locale cursor/version/minimum-base metadata without emitting a text-update event or localization rebuild.
  • Manifest 304 responses now require and reuse complete cached manifest state; a cacheless 304 reports a network error and stops the check. Unexpected locale 304 responses report a network error without changing locale state.
  • Ordinary manifest network and validation failures now report the error and stop the synchronization attempt even when cached manifest state exists. Cached translations remain available for offline lookup.
  • Overlapping update checks now share one in-flight operation.
  • Valid cache envelopes containing invalid ARB data now report a parse error and force a full request without updated_at, allowing valid backend content to repair the cache even when stored metadata matches the manifest.
  • Existing cache envelopes that cannot be read or decoded report a storage error and force the same full repair request. Default IO and web stores now reject non-object persisted envelopes instead of silently treating them as missing.
  • ReRuneCacheStore.readManifest() and readArb(...) must return null only for absent entries and throw for existing unreadable or malformed state.
  • Locale request, ARB parse/merge, and cache commit failures now report network, parse, and storage error types respectively.
  • Default IO cache writes now use flushed temporary-file replacement. Web cache writes and deletions reject unsuccessful preferences operations and restore the last persistent cache view.
  • Added regression coverage proving one failed language does not stop remaining published languages and covering manifest writes, locale writes, cleanup deletion failures, corrupt-cache recovery, and default cache commits.
  • Added consumer-configurable ReRuneLogLevel diagnostics through ReRune.setup(logLevel: ...). Logging defaults to off; error and info exclude request headers and response bodies.
  • ReRuneLogLevel.verbose is an explicit sensitive-data opt-in that includes raw headers, response bodies, failure causes, and stack traces.
  • Fixed the CI drift guard to execute the standalone code-generation parity checks through dart run.
  • BREAKING: removed the unreliable root-element rebuild attempt. Consumers that need immediate same-run UI updates must wrap the relevant app subtree in ReRuneBuilder or listen to ReRune.localizationsRevisionListenable. Newly built widgets continue resolving generated localization getters against the latest loaded OTA bundles without that wrapper.
  • BREAKING: ReRuneUpdateResult now requires removedLocales. updatedLocales contains only locales whose fetched OTA values changed, while removedLocales reports locales removed from the published manifest. hasUpdates is true when either list is non-empty.
  • Unpublishing no longer emits ReRune.onFetchedTextsApplied or advances the fetched-text revision. It advances the general localization revision when loaded translations or runtime locale availability changed.
  • BREAKING: removed the obsolete ReRuneLocalizationsOverlay, the generated-infrastructure ReRuneOverlayLocalizationsDelegate and ReRuneOverlayFactory, and the accidentally public ReRune.composeLocalizationsDelegates(...).
  • BREAKING: generated ReRuneLocalizationsConfig construction now supplies baseDelegate and overlayFactory directly. Regenerate checked-in *.rerune.g.dart files before compiling against this release.
  • Localization delegate construction and delegate-list composition are now private SDK implementation details. The typed ReRuneCacheStore, ReRuneCachedManifest, ReRuneCachedArb, ReRuneManifest, and ReRuneManifestLocale custom-storage contract remains public.
  • Added deterministic web restart coverage that persists manifest and locale records through WebCacheStore, resets the SharedPreferences singleton, and verifies offline bootstrap, dashboard locales, main-language fallback, and per-locale synchronization metadata.
  • Added deterministic native-cache lifecycle coverage that recreates IoCacheStore against the same filesystem directory and verifies persisted replacement, idempotent locale deletion, offline controller bootstrap, main-language fallback, and complete per-locale synchronization metadata.
  • Superseded or disposed controllers now finish pending initialization silently, do not start automatic refresh work, and ignore in-flight manifest or locale responses before they can update persistent or runtime state.
  • ReRune.setup(...) now stages replacement delegates, compiled locales, and controller state before changing the global facade. A failed initial or replacement setup leaves the previous complete configuration untouched.
  • BREAKING: manifest locale identifiers and main_language now accept only Flutter-compatible language, language-region, language-script, and language-script-region shapes. Separators and subtag casing are canonicalized; malformed identifiers and canonical duplicates reject the complete manifest.

0.11.0 #

  • BREAKING: backend manifests must include a non-empty main_language that resolves to an entry in locales; legacy manifests without it are rejected.
  • BREAKING: ReRuneManifest(...) now requires mainLanguage.
  • Removed the legacy missing-main_language resolution path. OTA lookup always resolves requested locale variants, then main-language variants, then the bundled Flutter fallback.

0.10.0 #

  • Added OTA missing-key fallback through the manifest's main_language: requested OTA locale variants -> OTA main-language variants -> bundled Flutter localization.
  • ICU placeholders, plurals, and selects resolved from the OTA main language now use that supplying locale's formatting rules.
  • Manifest parsing and caching now preserve the normalized main_language.
  • Excluded the repository's private test app from pub.dev release archives.

0.9.3 #

  • Clarified that MaterialApp.locale is optional and only needed for app-owned language-picker overrides.
  • Updated the README install snippet to the latest published version.

0.9.2 #

  • Added a locale picker to the example app's current-locale status row using app-owned LocaleNotifier state.

0.9.1 #

  • Clarified the recommended language-picker docs with an app-owned LocaleNotifier example and a null system-default picker option.

0.9.0 #

  • BREAKING: removed the SDK-owned locale override APIs introduced in 0.8.4: ReRune.locale, ReRune.localeListenable, ReRune.setLocale(...), and ReRune.clearLocale().
  • ReRune now documents app-owned locale state as the recommended language-picker integration. Build picker options from ReRune.supportedLocales, store the selected locale in the app, and pass that value to MaterialApp.locale.
  • ReRuneBuilder again rebuilds only on localization bundle revisions.
  • The example welcome screen now displays the resolved locale tag instead of a localized hardcoded language name.

0.8.4 #

  • Added SDK-owned locale override state with ReRune.locale, ReRune.localeListenable, ReRune.setLocale(...), and ReRune.clearLocale().
  • ReRuneBuilder now rebuilds for selected-locale changes as well as localization bundle revisions.
  • Documented the optional language-picker flow using ReRune.supportedLocales plus MaterialApp.locale: ReRune.locale.

0.8.3 #

  • Highlighted remote language delivery in the package documentation.
  • Documented ReRune.supportedLocales as the source of truth for language pickers that include fetched/cached dashboard-only locales.

0.8.2 #

  • Added support for dashboard-only locale additions after a successful manifest and ARB fetch, allowing new languages to become available without an app-store release.
  • ReRune.supportedLocales now includes compiled app locales plus fetched/cached dashboard locales.
  • Generated localization overlays now preserve the requested locale name when falling back through a compiled base locale.
  • Manifest locale keys are normalized to Flutter-style locale keys such as pt_BR.
  • Added ReRune.localizationsRevisionListenable; ReRuneBuilder now rebuilds on all localization revisions so root MaterialApp widgets can re-resolve newly available dashboard locales.
  • ReRune.setup(...) now returns a Future<void> that completes after cached manifest/ARB bundles are loaded; checkOnStart refreshes continue in the background instead of blocking setup.

0.8.1 #

  • Clamp oversized periodic refresh intervals on web to the maximum supported timer delay instead of throwing.
  • Document the web timer fallback limit in the public update policy API and README.

0.8.0 #

  • BREAKING: ReRuneUpdatePolicy now configures periodic refresh with periodicIntervalInHours and/or periodicIntervalInDays; minute- and second-level intervals are no longer accepted.
  • BREAKING: runtime now requires manifest locale entries to provide absolute url values.
  • BREAKING: removed runtime ARB URL fallback synthesis; ARB fetch uses manifest url only.
  • Tightened ARB parsing to enforce string message values for non-metadata keys.
  • Refactored OTA update workflow and network fetch internals to reduce cyclomatic complexity.

0.6.0 #

  • BREAKING: renamed ReRuneOverlayBuilder to ReRuneBuilder.

0.5.0 #

  • Added fast CLI codegen command: dart run rerune.
  • Added parity guard coverage to ensure CLI and builder generation stay byte-identical.

0.4.1 #

  • Excluded internal docs/ session notes from publish artifacts via .pubignore.
  • Excluded local build/ artifacts from publish artifacts via .pubignore.

0.4.0 #

  • BREAKING: removed manual annotation-anchor setup for codegen.
  • build_runner now generates ReRune config directly from app_localizations.dart.

0.3.0 #

  • BREAKING: collapsed repository back to a single package rerune.
  • BREAKING: removed split packages (rerune_core, rerune_gen) and workspace tooling.
  • Added build_runner codegen directly in rerune (build.yaml, lib/builder.dart).
  • BREAKING: removed macro scaffolding APIs; generation is codegen-only.
  • BREAKING: setup now accepts generated localizations config via ReRune.setup(..., localizations: reRuneAppLocalizationsConfig).
  • Removed macro example and retained one codegen-based example app.

0.2.0 #

  • BREAKING: removed CLI wrapper generation workflow (dart run rerune / flutter pub run rerune).
  • Added package-owned integration runtime APIs: ReRune, ReRuneOverlayLocalizationsDelegate<T>, and ReRuneOverlayBuilder.
  • BREAKING: ReRune.setup(...) now requires supported locales either via supportedLocales: or by calling ReRune.configureLocalizationsOverlay(...) first.
  • Added macro migration scaffolding APIs: ReRuneLocalizationsOverlay and ReRuneLocalizationsOverlayMacro.
  • Migrated example app away from generated rerune_app_localizations.dart to app-owned overlay wiring.

0.1.3 #

  • Lowered package SDK constraints to dart >=3.4.0 <4.0.0 and flutter >=3.22.0 to avoid unnecessarily requiring Dart 3.9+.

0.1.2 #

  • BREAKING: removed generated ReRune.fetchedRevisionListenable; use ReRune.onFetchedTextsApplied as the single fetched-update event handle.
  • BREAKING: simplified generated ReRuneBuilder to a single builder: callback; removed ReRuneRefreshMode and refresh mode options.
  • Updated generator output and example pages/docs to use the single event-stream + builder model.

0.1.1 #

  • Added generated ReRuneBuilder widget for app-side redraws after OTA changes.
  • ReRuneBuilder now uses builder: (Flutter convention) instead of child:.
  • ReRuneBuilder supports ReRuneRefreshMode.fetchedUpdatesOnly (default) and ReRuneRefreshMode.anyControllerChange.
  • Updated generated wrapper template and example BuilderPage to use ReRuneBuilder instead of manual ValueListenableBuilder wiring.

0.1.0 #

  • BREAKING: removed all rerune.json runtime config support.
  • BREAKING: removed projectId, apiKey, and manifestUrl setup/constructor inputs.
  • BREAKING: ReRuneLocalizationController now requires otaPublishId and sends it as X-OTA-Publish-Id.
  • BREAKING: ReRuneLocalizationController and typed builder APIs are no longer exported publicly; use generated ReRune.setup(...) and ReRune static APIs.
  • Manifest endpoint is now fixed to https://rerune.io/api/sdk/translations/manifest?platform=flutter.
  • ARB fallback endpoint is now https://rerune.io/api/sdk/translations/flutter/{locale} when manifest locale URL is omitted.
  • Example app now uses setup-only integration (no direct controller construction).

0.0.4 #

  • BREAKING: removed seed ARB support (seedBundles and translations_path).
  • Fallback now follows Flutter defaults only: OTA/cache first, then bundled AppLocalizations strings.
  • BREAKING: runtime config now uses strict precedence rerune.json asset -> constructor (projectId, apiKey).
  • BREAKING: removed runtime --dart-define fallback for config resolution.
  • platform is fixed to flutter and is no longer configurable in controller/runtime config.
  • Added explicit StateError with debug log when required credentials are missing.
  • Docs/examples now use ReRune.setup(...), ReRune.localizationsDelegates, and ReRune.supportedLocales.
  • Clarified that ReRuneUpdatePolicy defaults to checkOnStart: true.
  • Generated ReRune.setup(...) helper now auto-wires supported locales and initializes OTA.
  • BREAKING: removed deprecated generated compatibility aliases (Rerune...Setup, createRerune...Controller).
  • BREAKING: removed CLI executable alias generate; use flutter pub run rerune only.
  • BREAKING: renamed OtaLocalizationController to ReRuneLocalizationController.
  • BREAKING: renamed OtaUpdatePolicy to ReRuneUpdatePolicy.
  • BREAKING: renamed OtaUpdateResult to ReRuneUpdateResult.
  • BREAKING: renamed OtaErrorType/OtaError to ReRuneErrorType/ReRuneError.
  • BREAKING: renamed Manifest/ManifestLocale to ReRuneManifest/ReRuneManifestLocale.
  • BREAKING: renamed CachedManifest/CachedArb to ReRuneCachedManifest/ReRuneCachedArb.
  • BREAKING: renamed CacheStore to ReRuneCacheStore and createDefaultCacheStore() to reRuneCreateDefaultCacheStore().
  • BREAKING: renamed OtaTypedLocalizationBuilder to ReRuneBuilder.
  • BREAKING: renamed typed builder typedefs to ReRuneDelegateFactory<T> and ReRuneLocalizationWidgetBuilder<T>.
  • Added ReRuneTextUpdateEvent and exported it from package:rerune/rerune.dart.
  • Added optional fetched-only refresh APIs for immediate UI updates after applied OTA text changes: reRuneFetchedRevision, reRuneFetchedRevisionListenable, and onReRuneFetchedTextsApplied.
  • Added ReRuneLocalizationRefreshMode.fetchedUpdatesOnly to ReRuneBuilder.
  • Existing refresh behavior remains default; fetched-only refresh is opt-in.
  • Updated generator output (rerune_app_localizations.dart) to use renamed ReRune* public APIs.
  • Expanded tests:
    • controller tests for fetched-only revision/event behavior,
    • new test/ota_typed_localization_builder_test.dart for builder refresh modes,
    • updated example widget test coverage for menu navigation.
  • Example app now has a 3-page demo menu:
    • manual refresh page,
    • event-listener (onReRuneFetchedTextsApplied) page,
    • ReRuneBuilder page with fetched-updates-only mode.
  • Example manual refresh flow now separates update check from UI refresh and shows update-check results via SnackBar.
  • Example pages are split into dedicated files under example/lib/pages/.
  • Updated README and example README for renamed APIs and fetched-only refresh usage.
  • Updated AGENTS.md naming rules and applied them across the codebase.
  • Updated license copyright holder to BasalBit GmbH.

0.0.3 #

  • BREAKING: package identity is now rerune.
  • BREAKING: public import changed to package:rerune/rerune.dart.
  • Added canonical CLI command flutter pub run rerune for localization wrapper generation.
  • Added standard Flutter localization auto-detect from l10n.yaml and default gen-l10n paths.
  • Added --dart-define config fallback (RERUNE_PROJECT_ID, RERUNE_API_KEY, RERUNE_PLATFORM) so rerune.json asset setup is optional.

0.0.2 #

  • BREAKING: removed legacy key-based APIs (OtaLocalizations, OtaLocalizationsDelegate, OtaLocalizationBuilder).
  • BREAKING: OtaLocalizationController no longer accepts baseUrl; API host is fixed to https://rerune.io/api.
  • Added typed AppLocalizations overlay flow with OtaTypedLocalizationBuilder<T>.
  • Added generator entrypoint for producing typed OTA wrappers.

0.0.1 #

  • Initial release of the OTA localization SDK.
  • Manifest-based ARB updates with ETag support and local caching.
  • Hot-swap localization delegate with Rerune-hosted manifest URLs.
0
likes
0
points
1.03k
downloads

Publisher

unverified uploader

Weekly Downloads

Over-the-air localization for Flutter: update translations and add languages without an app release while keeping generated AppLocalizations APIs.

Homepage
View/report issues

Topics

#localization #i18n #translations #ota #code-generation

License

unknown (license)

Dependencies

analyzer, build, flutter, glob, http, intl, path_provider, shared_preferences, source_gen, yaml

More

Packages that depend on rerune