Skip to content

Commit 15f5d13

Browse files
add baked ICU4X provider to fluent-bundle
1 parent 55f6483 commit 15f5d13

File tree

9 files changed

+39
-3
lines changed

9 files changed

+39
-3
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ unic-langid = "0.9"
4545
icu_locid = "1.4"
4646
icu_provider = "1.4"
4747
icu_decimal = "1.4"
48+
icu = { version = "1.4", default-features = false }
4849
fixed_decimal = "0.5"
4950

5051
fluent-bundle = { version = "0.15.3", path = "fluent-bundle" }

fluent-bundle/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ fluent-syntax.workspace = true
3030
icu_decimal.workspace = true
3131
icu_locid.workspace = true
3232
icu_provider = { workspace = true, features = ["sync"] }
33+
icu.workspace = true
3334
intl_pluralrules.workspace = true
3435
rustc-hash.workspace = true
3536
unic-langid.workspace = true
@@ -40,7 +41,6 @@ smallvec = "1.13"
4041
[dev-dependencies]
4142
criterion.workspace = true
4243
iai.workspace = true
43-
icu_testdata = "1.4"
4444
serde = { workspace = true, features = ["derive"] }
4545
unic-langid = { workspace = true, features = ["macros"] }
4646
rand = "0.8"

fluent-bundle/src/icu4x_data/any.rs

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @generated
2+
impl_any_provider ! (BakedDataProvider) ;
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @generated
2+
# [doc = r" Marks a type as a data provider. You can then use macros like"] # [doc = r" `impl_core_helloworld_v1` to add implementations."] # [doc = r""] # [doc = r" ```ignore"] # [doc = r" struct MyProvider;"] # [doc = r" const _: () = {"] # [doc = r#" include!("path/to/generated/macros.rs");"#] # [doc = r" make_provider!(MyProvider);"] # [doc = r" impl_core_helloworld_v1!(MyProvider);"] # [doc = r" }"] # [doc = r" ```"] # [doc (hidden)] # [macro_export] macro_rules ! __make_provider { ($ name : ty) => { # [clippy :: msrv = "1.67"] impl $ name { # [doc (hidden)] # [allow (dead_code)] pub const MUST_USE_MAKE_PROVIDER_MACRO : () = () ; } } ; } # [doc (inline)] pub use __make_provider as make_provider ; # [macro_use] # [path = "macros/decimal_symbols_v1.rs.data"] mod decimal_symbols_v1 ; # [doc (inline)] pub use __impl_decimal_symbols_v1 as impl_decimal_symbols_v1 ;

fluent-bundle/src/icu4x_data/macros/decimal_symbols_v1.rs.data

+2
Large diffs are not rendered by default.

fluent-bundle/src/icu4x_data/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @generated
2+
include ! ("macros.rs") ; macro_rules ! impl_data_provider { ($ provider : ty) => { make_provider ! ($ provider) ; impl_decimal_symbols_v1 ! ($ provider) ; } ; } # [allow (unused_macros)] macro_rules ! impl_any_provider { ($ provider : ty) => { # [clippy :: msrv = "1.67"] impl icu_provider :: AnyProvider for $ provider { fn load_any (& self , key : icu_provider :: DataKey , req : icu_provider :: DataRequest) -> Result < icu_provider :: AnyResponse , icu_provider :: DataError > { match key . hashed () { h if h == < icu::decimal :: provider :: DecimalSymbolsV1Marker as icu_provider :: KeyedDataMarker > :: KEY . hashed () => icu_provider :: DataProvider :: < icu::decimal :: provider :: DecimalSymbolsV1Marker > :: load (self , req) . map (icu_provider :: DataResponse :: wrap_into_any_response) , _ => Err (icu_provider :: DataErrorKind :: MissingDataKey . with_req (key , req)) , } } } } } # [clippy :: msrv = "1.67"] pub struct BakedDataProvider ; impl_data_provider ! (BakedDataProvider) ;
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
extern crate alloc;
2+
3+
// to regerate the icu4x_data module, run from the root of the project:
4+
// cargo build --examples
5+
// rm -r fluent-bundle/src/icu4x_data
6+
// icu4x-datagen --keys-for-bin target/debug/examples/functions --format mod --locales full -o fluent-bundle/src/icu4x_data
7+
// for more information: https://github.com/unicode-org/icu4x/blob/79480dfbafdedf6cc810e4bfb0770f3268ff86ab/tutorials/data_management.md
8+
include!("./icu4x_data/mod.rs");
9+
impl_any_provider!(BakedDataProvider);
10+
11+
/// ICU data provider
12+
///
13+
/// Fluent uses ICU4X data for formatting purposes, like number formatting.
14+
/// Use FluentIcuDataProvider to add all ICU data needed by fluent-bundle.
15+
/// You can bring your own provider if you don't need all locales, or have one in your project already.
16+
///
17+
/// Example:
18+
/// ```
19+
/// use fluent_bundle::{FluentBundle, FluentIcuDataProvider, FluentResource};
20+
/// use unic_langid::langid;
21+
///
22+
/// let langid = langid!("en-US");
23+
/// let mut bundle: FluentBundle<FluentResource> = FluentBundle::new(vec![langid]);
24+
/// bundle.set_icu_data_provider(Box::new(fluent_bundle::FluentIcuDataProvider));
25+
/// ```
26+
pub use BakedDataProvider as FluentIcuDataProvider;

fluent-bundle/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ pub mod bundle;
104104
pub mod concurrent;
105105
mod entry;
106106
mod errors;
107+
mod icu_data_provider;
107108
#[doc(hidden)]
108109
pub mod memoizer;
109110
mod message;
@@ -122,6 +123,7 @@ pub use args::FluentArgs;
122123
/// [`FluentBundle::new_concurrent`](crate::concurrent::FluentBundle::new_concurrent).
123124
pub type FluentBundle<R> = bundle::FluentBundle<R, intl_memoizer::IntlLangMemoizer>;
124125
pub use errors::FluentError;
126+
pub use icu_data_provider::FluentIcuDataProvider;
125127
pub use message::{FluentAttribute, FluentMessage};
126128
pub use resource::FluentResource;
127129
#[doc(inline)]

fluent-bundle/tests/types_test.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,7 @@ fn fluent_number_to_operands() {
178178
fn fluent_number_grouping() {
179179
let langid_ars = langid!("ccp");
180180
let mut bundle: FluentBundle<FluentResource> = FluentBundle::new(vec![langid_ars]);
181-
#[allow(deprecated)]
182-
bundle.set_icu_data_provider(Box::new(icu_testdata::any_no_fallback()));
181+
bundle.set_icu_data_provider(Box::new(fluent_bundle::FluentIcuDataProvider));
183182

184183
let mut number = FluentNumber::from(1234567890.1234567);
185184

0 commit comments

Comments
 (0)