Skip to main content

Crate day_localization

Crate day_localization 

Source
Expand description

day-localization: the core localization engine (DESIGN.md §12), low enough in the crate graph that even the central crates (day-pieces’ dialogs, menu-role labels) can localize their own UI strings.

Two tiers of global Fluent bundles:

  • core: a built-in catalog (catalog/*.ftl) of the standard strings the framework itself emits (dialog OK/Cancel, standard menu commands), shipped in several languages. Always present.
  • app: the locales an app registers with install. These take precedence over core, so an app can override any day_* string, and core is the fallback for keys the app didn’t define.

Private Catalog namespaces live alongside these tiers. They share the locale signal, but never merge their messages into app/core or each other.

The current locale is a Signal, so every format/binding re-runs on a locale switch. The piece-facing reactive tr() wrapper lives one layer up in day-localization-ui (which re-exports this).

Modules§

key
The core catalog’s keys, one constant per message, named as the key itself (key::day_ok is "day_ok"): what the framework’s own crates pass to t. Generated from catalog/en.ftl by this crate’s build script.

Structs§

Catalog
An embedded, private Fluent namespace. Generated by day_build::generate_locales. Catalog identity is its static address, so identical keys in different crates never collide. name is only the qualified lookup name used by scripting (crate::file::key).
SigM
ValM

Enums§

DateFields
Which parts of an instant to write. The locale decides their order, words and punctuation.
FArg

Traits§

IntoFArg
Disjoint-marker conversion for .arg values (the same E0119 dodge as IntoText).
IntoNumberFArg
Marker for IntoFArg values that carry a number, required for a Fluent variable used as a plural / select selector, where CLDR plural rules select on a number (so a string can’t be passed there by mistake). Implemented for the numeric IntoFArg types only (i64, f64, and their Signals); the generated res::str::<key>(…) functions (§18.5) type such parameters as impl IntoNumberFArg instead of impl IntoFArg.

Functions§

add_launch_locales
Append the host’s ordered preference after anything already recorded.
compare
Compare two strings in the current locale’s collation order. Reads the locale signal (tracked), so a sort inside a reactive closure re-runs when the locale switches.
compare_in
Compare two strings in locale’s collation order (untracked; accepts -u-co- extensions, e.g. "zh-u-co-stroke"). Falls back to code-point order if the locale has no collation data.
format_catalog
Format within one private namespace; missing keys fall back only to this catalog’s default. App/core catalogs cannot accidentally supply a similarly named key from another component.
format_date
format_date_in in the current locale (tracked, like crate::format_decimal), so a label inside a reactive closure re-renders when the locale switches.
format_date_in
Write the instant epoch_seconds (seconds since 1970-01-01T00:00:00Z, read as UTC civil time, the convention of the Fluent DATETIME() builtin and of chart time axes) in locale, showing fields (untracked).
format_decimal
Render v in the current locale (tracked, like crate::compare), so a label inside a reactive closure re-renders when the locale switches.
format_decimal_in
Render v in locale, rounded to fraction_digits and grouped by that locale’s own rule (untracked). 1234.5 is 1,234.5 in en, 1 234,5 in fr, 1.234,5 in de.
format_in
Resolve key: app bundle for the locale, then app-default, then the built-in core catalog for the locale, then core English. A pseudo-locale (en-XA, fr-XA: any locale with the -XA suffix) resolves against the locale under the suffix and accents the result. Signal args are tracked reads.
format_percent
format_percent_in in the current locale (tracked), so a label inside a reactive closure re-renders when the locale switches.
format_percent_in
Render the fraction v as a percentage in locale (0.5 is 50% in en, 50 % in fr, %50 in tr), rounded to fraction_digits places of the percentage and grouped by the locale’s rule (untracked).
install
Register an app’s locales from .ftl sources and set the current locale from (1) the DAY_LOCALE launch override, (2) the platform’s set_launch_locale hint, (3) default. Call once, before building the root piece. The built-in core catalog is preserved (and remains the fallback); the app’s strings take precedence over it, and re-registering reuses the existing locale Signal so bindings created earlier keep working.
locale
The current locale (a tracked read inside bindings).
matches_search
matches_search_in against the current locale. Reads the locale signal (tracked), so a filtered list inside a reactive closure re-filters when the language changes, the same contract crate::compare has.
matches_search_in
Whether text matches query under locale’s rules (untracked: pass the locale explicitly).
register_catalog
Make a catalog available for qualified scripting lookups. Generated accessors call this automatically. Registration never changes the app locale or its default catalog.
set_launch_locale
Record the host’s launch locale before install runs. Platform glue only; apps pick locales with set_locale. No-op once install has resolved the initial locale.
set_launch_locales
Record the host’s ordered locale preference (["fr-CA", "fr", "en"]) before install runs.
set_locale
Switch the locale at runtime; every tr/binding re-runs.
sort_localized
Sort a slice in place in the current locale’s collation order (tracked, like compare).
strip_isolates
Strip Fluent’s FSI/PDI isolation marks (dayscript text comparison, §14.3).
t
Resolve key in the current locale (no args): the one-shot form the framework’s own strings use (dialog buttons, menu-role labels), which are resolved once at present/build time. The key is always a generated name, t(key::day_cancel), never a string literal.