Store multiple locales in a single `Group`

finchie
Feb 22, 2024, 6:46 PM
2XQ6ZB4WZNNR4KNC3VWNTV7IRMGGAEP33JPQUVB3CVWAKHECZVRQC

Dependencies

  • [2] ROSR4HD5 Parse captured glob as locale
  • [3] XGNME3WR Move `Group::derive_enum` to new `crate::parse_macro` module
  • [4] HJMYJDC7 Simplify `fluent_embed::group` module
  • [5] OCR4YRQ2 Parse group from fluent file specified by macro attribute
  • [6] 5FIVUZYF Unify `fluent_embed` macro API as `localize()`
  • [7] QSK7JRBA Add simple `attribute_path` function
  • [8] XEEXWJLG Add simple end-to-end test for selectors
  • [9] VNSHGQYN Support using glob paths in `localize` macro
  • [10] 5TEX4MNU Split `fluent_embed` into `group` and `parse` modules

Change contents

  • edit in fluent_embed/src/parse_macro.rs at line 1
    [3.39]
    [3.40]
    use std::collections::HashMap;
  • replacement in fluent_embed/src/parse_macro.rs at line 5
    [3.103][2.0:23]()
    use icu_locid::Locale;
    [3.103]
    [3.0]
    use icu_locid::{locale, Locale};
  • edit in fluent_embed/src/parse_macro.rs at line 20
    [3.512][3.512:582](),[3.582][3.0:65](),[3.65][3.640:663](),[3.640][3.640:663]()
    let message = group
    .children
    .iter()
    .find(|message| message.id.name == kebab_case_ident)
    .unwrap();
  • replacement in fluent_embed/src/parse_macro.rs at line 37
    [3.1307][3.66:128]()
    messages.push(crate::parse_fluent::message(message));
    [3.1307]
    [3.1348]
    messages.push(crate::parse_fluent::message(
    group.canonical_message_for(&kebab_case_ident),
    ));
  • replacement in fluent_embed/src/parse_macro.rs at line 53
    [3.45][3.0:67]()
    pub fn attribute_groups(path_literal: syn::LitStr) -> Vec<Group> {
    [3.45]
    [3.353]
    pub fn attribute_groups(path_literal: syn::LitStr) -> Group {
  • replacement in fluent_embed/src/parse_macro.rs at line 58
    [3.116][3.116:149]()
    let mut groups = Vec::new();
    [3.116]
    [3.149]
    let mut resources = HashMap::new();
  • replacement in fluent_embed/src/parse_macro.rs at line 73
    [3.673][2.333:393](),[2.393][3.63:64](),[3.625][3.63:64](),[3.725][3.63:64](),[3.258][3.63:64](),[3.64][3.726:754]()
    let group = Group::from_resource(resource, locale);
    groups.push(group);
    [3.673]
    [3.754]
    resources.insert(locale, resource);
  • replacement in fluent_embed/src/parse_macro.rs at line 76
    [3.369][3.761:772]()
    groups
    [3.369]
    [3.797]
    Group::new(locale!("en-US"), resources)
  • replacement in fluent_embed/src/parse_macro.rs at line 85
    [3.814][3.814:866]()
    derive_enum(groups[0].clone(), ident, variants)
    [3.814]
    [3.1605]
    derive_enum(groups, ident, variants)
  • edit in fluent_embed/src/group.rs at line 1
    [3.3543]
    [3.3544]
    use std::collections::HashMap;
  • edit in fluent_embed/src/group.rs at line 5
    [2.417]
    [3.3690]
    #[derive(Clone, Debug)]
    struct LocalizationsForMessage {
    canonical_message: Message<String>,
    pub additional_messages: HashMap<Locale, Message<String>>,
    }
    impl LocalizationsForMessage {
    fn new(canonical_message: Message<String>) -> Self {
    Self {
    canonical_message,
    additional_messages: HashMap::new(),
    }
    }
    }
  • replacement in fluent_embed/src/group.rs at line 23
    [3.754][2.418:438](),[2.438][3.754:794](),[3.754][3.754:794]()
    locale: Locale,
    pub children: Vec<Message<String>>,
    [3.754]
    [3.4310]
    canonical_locale: Locale,
    messages: HashMap<String, LocalizationsForMessage>,
  • replacement in fluent_embed/src/group.rs at line 28
    [3.808][2.439:518](),[2.518][3.871:910](),[3.871][3.871:910]()
    pub fn from_resource(resource: Resource<String>, locale: Locale) -> Self {
    let mut children = Vec::new();
    [3.808]
    [3.4641]
    pub fn new(canonical_locale: Locale, mut resources: HashMap<Locale, Resource<String>>) -> Self {
    let canonical_resource = resources.remove(&canonical_locale).unwrap();
  • replacement in fluent_embed/src/group.rs at line 31
    [3.4642][3.911:1105]()
    for entry in resource.body {
    let matched_entry = if let Entry::Message(message) = entry {
    message
    } else {
    todo!()
    };
    [3.4642]
    [3.4798]
    let mut messages = HashMap::new();
  • replacement in fluent_embed/src/group.rs at line 33
    [3.4907][3.4907:4949]()
    children.push(matched_entry);
    [3.4799]
    [3.4949]
    for entry in canonical_resource.body {
    if let Entry::Message(message) = entry {
    messages.insert(
    message.id.name.clone(),
    LocalizationsForMessage::new(message),
    );
    }
  • replacement in fluent_embed/src/group.rs at line 42
    [3.4960][2.519:553]()
    Self { locale, children }
    [3.4960]
    [3.6608]
    for (locale, resource) in resources {
    for entry in resource.body {
    if let Entry::Message(message) = entry {
    let localizations = messages.get_mut(&message.id.name).unwrap();
    localizations
    .additional_messages
    .insert(locale.clone(), message);
    }
    }
    }
    Self {
    canonical_locale,
    messages,
    }
  • edit in fluent_embed/src/group.rs at line 58
    [3.6614]
    [3.6614]
    pub fn canonical_message_for(&self, id: &str) -> &Message<String> {
    &self.messages.get(id).unwrap().canonical_message
    }