Generate simple locale matching code in `localize()`

finchie
Mar 18, 2024, 1:35 PM
4MRF5E76QSW3EPICI6TNEGJ2KSBWODWMIDQPLYALDWBYWKAV5LJAC

Dependencies

  • [2] BQ6N55O7 Refactor how `Group` stores messages
  • [3] XGNME3WR Move `Group::derive_enum` to new `crate::parse_macro` module
  • [4] 5FIVUZYF Unify `fluent_embed` macro API as `localize()`
  • [5] QSK7JRBA Add simple `attribute_path` function
  • [6] HJMYJDC7 Simplify `fluent_embed::group` module
  • [7] XEEXWJLG Add simple end-to-end test for selectors
  • [8] 2XQ6ZB4W Store multiple locales in a single `Group`
  • [9] 3WEPY3OX Add `locale` parameter to derived `localize()` function
  • [*] 5TEX4MNU Split `fluent_embed` into `group` and `parse` modules

Change contents

  • replacement in fluent_embed/src/parse_macro.rs at line 16
    [3.200][3.200:259]()
    let mut messages = Vec::with_capacity(variants.len());
    [3.200]
    [3.397]
    let mut extra_messages = Vec::with_capacity(variants.len());
    let mut canonical_messages = Vec::with_capacity(variants.len());
  • replacement in fluent_embed/src/parse_macro.rs at line 38
    [3.1307][3.0:57]()
    messages.push(group.message(&kebab_case_ident));
    [3.1307]
    [3.1348]
    extra_messages.push(group.message(&kebab_case_ident));
    canonical_messages.push(group.canonical_message(&kebab_case_ident));
  • edit in fluent_embed/src/parse_macro.rs at line 42
    [3.1355]
    [3.1355]
    // TODO: locale matching should use a better algorithm
  • replacement in fluent_embed/src/parse_macro.rs at line 45
    [3.1390][3.58:174]()
    fn localize(&self, locale: &::icu_locid::Locale, plural_rules: &::icu_plurals::PluralRules) -> String {
    [3.1390]
    [3.1476]
    fn localize(&self, locales: &[&::icu_locid::Locale], plural_rules: &::icu_plurals::PluralRules) -> String {
    // Check each locale to see if it's implemented for this message
    for locale in locales {
    match self {
    #(Self::#idents => #extra_messages),*
    }
    }
    // Fall back to default locale
  • replacement in fluent_embed/src/parse_macro.rs at line 55
    [3.1505][3.1505:1557]()
    #(Self::#idents => #messages),*
    [3.1505]
    [3.1557]
    #(Self::#idents => #canonical_messages),*
  • edit in fluent_embed/src/group.rs at line 84
    [3.1171][2.1741:1893]()
    let canonical_locale = syn::LitStr::new(
    &self.canonical_locale.to_string(),
    proc_macro2::Span::call_site(),
    );
  • edit in fluent_embed/src/group.rs at line 89
    [2.2083][2.2083:2199]()
    let canonical_message =
    crate::parse_fluent::message(&self.canonical_messages[message_column]);
  • edit in fluent_embed/src/group.rs at line 101
    [2.2757][2.2757:2852]()
    assert!(locale.normalizing_eq(#canonical_locale));
    #canonical_message
  • edit in fluent_embed/src/group.rs at line 103
    [3.2034]
    [11.6614]
    pub fn canonical_message(&self, id: &str) -> syn::Expr {
    let message_column = self
    .canonical_messages
    .iter()
    .position(|message| message.id.name == id)
    .expect("Message id must be valid");
    crate::parse_fluent::message(&self.canonical_messages[message_column])
    }
  • replacement in cli_macros/tests/selectors.rs at line 31
    [3.956][3.1418:1472]()
    message.localize(&locale, &plural_rules),
    [3.956]
    [3.1001]
    message.localize(&[&locale], &plural_rules),