rerune 0.14.3
rerune: ^0.14.3 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.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
valuemessages and structured cardinal-plural variants are decoded and rendered directly while generatedAppLocalizationsgetters 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
ReRuneCachedArbwithReRuneCachedLocaleBundle. CustomReRuneCacheStoreimplementations must replacereadArb,writeArb, anddeleteArbwithreadLocaleBundle,writeLocaleBundle, anddeleteLocaleBundle. - BREAKING: default persistence moved to the
rerune_locale_cache_v1namespace and storeslocale_<locale>.jsonentries on IO platforms. Existingota_localizationsARB 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'sIntl.pluralLogicrules 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 localeversionand manifesttarget_version. The timestamp-basedupdated_atprotocol is removed. - BREAKING: removed
ReRuneCachedArb.updatedAtand the serializedupdated_atcache field.ReRuneCachedArbnow requires and persists completedataplus the successfully applied manifest localename,version,minimumDeltaBaseVersion, andurl. - 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, andReRune.localeName(locale)resolves the successfully applied cached name through normalized locale fallbacks. ReRuneUpdateResult.updatedLocaleNamesreports name-only manifest changes. These changes count towardhasUpdatesand advance the general localization revision without emittingReRune.onFetchedTextsApplied.
0.12.0 #
- BREAKING: locale endpoints now support incremental updates through the
optional RFC 3339
updated_atquery parameter. ReRune tracks the cursor and successfully applied manifest version independently for every locale. - BREAKING:
ReRuneCachedArbnow requiresversionandupdatedAt; the previous locale cache format is invalidated and refetched in full. - BREAKING: every manifest locale and
ReRuneCachedArbnow requiresminimumDeltaBaseVersion. When its manifest value differs from the cached locale value, ReRune fetches withoutupdated_atand fully replaces the cached locale before committing the new metadata. - BREAKING: removed locale-response ETag support,
ReRuneManifestLocale.sha256, andReRuneErrorType.checksum. Manifest ETags remain supported. - BREAKING: custom
ReRuneCacheStoreimplementations must implementdeleteArb(...)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
304responses now require and reuse complete cached manifest state; a cacheless304reports a network error and stops the check. Unexpected locale304responses 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()andreadArb(...)must returnnullonly for absent entries and throw for existing unreadable or malformed state.- Locale request, ARB parse/merge, and cache commit failures now report
network,parse, andstorageerror 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
ReRuneLogLeveldiagnostics throughReRune.setup(logLevel: ...). Logging defaults tooff;errorandinfoexclude request headers and response bodies. ReRuneLogLevel.verboseis 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
ReRuneBuilderor listen toReRune.localizationsRevisionListenable. Newly built widgets continue resolving generated localization getters against the latest loaded OTA bundles without that wrapper. - BREAKING:
ReRuneUpdateResultnow requiresremovedLocales.updatedLocalescontains only locales whose fetched OTA values changed, whileremovedLocalesreports locales removed from the published manifest.hasUpdatesis true when either list is non-empty. - Unpublishing no longer emits
ReRune.onFetchedTextsAppliedor 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-infrastructureReRuneOverlayLocalizationsDelegateandReRuneOverlayFactory, and the accidentally publicReRune.composeLocalizationsDelegates(...). - BREAKING: generated
ReRuneLocalizationsConfigconstruction now suppliesbaseDelegateandoverlayFactorydirectly. Regenerate checked-in*.rerune.g.dartfiles before compiling against this release. - Localization delegate construction and delegate-list composition are now
private SDK implementation details. The typed
ReRuneCacheStore,ReRuneCachedManifest,ReRuneCachedArb,ReRuneManifest, andReRuneManifestLocalecustom-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
IoCacheStoreagainst 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_languagenow 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_languagethat resolves to an entry inlocales; legacy manifests without it are rejected. - BREAKING:
ReRuneManifest(...)now requiresmainLanguage. - Removed the legacy missing-
main_languageresolution 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.localeis 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
LocaleNotifierstate.
0.9.1 #
- Clarified the recommended language-picker docs with an app-owned
LocaleNotifierexample and anullsystem-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(...), andReRune.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 toMaterialApp.locale. ReRuneBuilderagain 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(...), andReRune.clearLocale(). ReRuneBuildernow rebuilds for selected-locale changes as well as localization bundle revisions.- Documented the optional language-picker flow using
ReRune.supportedLocalesplusMaterialApp.locale: ReRune.locale.
0.8.3 #
- Highlighted remote language delivery in the package documentation.
- Documented
ReRune.supportedLocalesas 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.supportedLocalesnow 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;ReRuneBuildernow rebuilds on all localization revisions so rootMaterialAppwidgets can re-resolve newly available dashboard locales. ReRune.setup(...)now returns aFuture<void>that completes after cached manifest/ARB bundles are loaded;checkOnStartrefreshes 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:
ReRuneUpdatePolicynow configures periodic refresh withperiodicIntervalInHoursand/orperiodicIntervalInDays; minute- and second-level intervals are no longer accepted. - BREAKING: runtime now requires manifest locale entries to provide absolute
urlvalues. - BREAKING: removed runtime ARB URL fallback synthesis; ARB fetch uses manifest
urlonly. - 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
ReRuneOverlayBuildertoReRuneBuilder.
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_runnernow generates ReRune config directly fromapp_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>, andReRuneOverlayBuilder. - BREAKING:
ReRune.setup(...)now requires supported locales either viasupportedLocales:or by callingReRune.configureLocalizationsOverlay(...)first. - Added macro migration scaffolding APIs:
ReRuneLocalizationsOverlayandReRuneLocalizationsOverlayMacro. - Migrated example app away from generated
rerune_app_localizations.dartto app-owned overlay wiring.
0.1.3 #
- Lowered package SDK constraints to
dart >=3.4.0 <4.0.0andflutter >=3.22.0to avoid unnecessarily requiring Dart 3.9+.
0.1.2 #
- BREAKING: removed generated
ReRune.fetchedRevisionListenable; useReRune.onFetchedTextsAppliedas the single fetched-update event handle. - BREAKING: simplified generated
ReRuneBuilderto a singlebuilder:callback; removedReRuneRefreshModeand refresh mode options. - Updated generator output and example pages/docs to use the single event-stream + builder model.
0.1.1 #
- Added generated
ReRuneBuilderwidget for app-side redraws after OTA changes. ReRuneBuildernow usesbuilder:(Flutter convention) instead ofchild:.ReRuneBuildersupportsReRuneRefreshMode.fetchedUpdatesOnly(default) andReRuneRefreshMode.anyControllerChange.- Updated generated wrapper template and example
BuilderPageto useReRuneBuilderinstead of manualValueListenableBuilderwiring.
0.1.0 #
- BREAKING: removed all
rerune.jsonruntime config support. - BREAKING: removed
projectId,apiKey, andmanifestUrlsetup/constructor inputs. - BREAKING:
ReRuneLocalizationControllernow requiresotaPublishIdand sends it asX-OTA-Publish-Id. - BREAKING:
ReRuneLocalizationControllerand typed builder APIs are no longer exported publicly; use generatedReRune.setup(...)andReRunestatic 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 (
seedBundlesandtranslations_path). - Fallback now follows Flutter defaults only: OTA/cache first, then bundled
AppLocalizationsstrings. - BREAKING: runtime config now uses strict precedence
rerune.jsonasset -> constructor (projectId,apiKey). - BREAKING: removed runtime
--dart-definefallback for config resolution. platformis fixed toflutterand is no longer configurable in controller/runtime config.- Added explicit
StateErrorwith debug log when required credentials are missing. - Docs/examples now use
ReRune.setup(...),ReRune.localizationsDelegates, andReRune.supportedLocales. - Clarified that
ReRuneUpdatePolicydefaults tocheckOnStart: 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; useflutter pub run reruneonly. - BREAKING: renamed
OtaLocalizationControllertoReRuneLocalizationController. - BREAKING: renamed
OtaUpdatePolicytoReRuneUpdatePolicy. - BREAKING: renamed
OtaUpdateResulttoReRuneUpdateResult. - BREAKING: renamed
OtaErrorType/OtaErrortoReRuneErrorType/ReRuneError. - BREAKING: renamed
Manifest/ManifestLocaletoReRuneManifest/ReRuneManifestLocale. - BREAKING: renamed
CachedManifest/CachedArbtoReRuneCachedManifest/ReRuneCachedArb. - BREAKING: renamed
CacheStoretoReRuneCacheStoreandcreateDefaultCacheStore()toreRuneCreateDefaultCacheStore(). - BREAKING: renamed
OtaTypedLocalizationBuildertoReRuneBuilder. - BREAKING: renamed typed builder typedefs to
ReRuneDelegateFactory<T>andReRuneLocalizationWidgetBuilder<T>. - Added
ReRuneTextUpdateEventand exported it frompackage:rerune/rerune.dart. - Added optional fetched-only refresh APIs for immediate UI updates after applied OTA text changes:
reRuneFetchedRevision,reRuneFetchedRevisionListenable, andonReRuneFetchedTextsApplied. - Added
ReRuneLocalizationRefreshMode.fetchedUpdatesOnlytoReRuneBuilder. - Existing refresh behavior remains default; fetched-only refresh is opt-in.
- Updated generator output (
rerune_app_localizations.dart) to use renamedReRune*public APIs. - Expanded tests:
- controller tests for fetched-only revision/event behavior,
- new
test/ota_typed_localization_builder_test.dartfor 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, ReRuneBuilderpage 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.mdnaming 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 rerunefor localization wrapper generation. - Added standard Flutter localization auto-detect from
l10n.yamland defaultgen-l10npaths. - Added
--dart-defineconfig fallback (RERUNE_PROJECT_ID,RERUNE_API_KEY,RERUNE_PLATFORM) sorerune.jsonasset setup is optional.
0.0.2 #
- BREAKING: removed legacy key-based APIs (
OtaLocalizations,OtaLocalizationsDelegate,OtaLocalizationBuilder). - BREAKING:
OtaLocalizationControllerno longer acceptsbaseUrl; API host is fixed tohttps://rerune.io/api. - Added typed
AppLocalizationsoverlay flow withOtaTypedLocalizationBuilder<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.