burgerlingual 2.2.0

burger utility library for web localisation
Documentation
use std::sync::Arc;
use language_tags::LanguageTag;
use crate::translations::Translation;

#[derive(Debug, Clone)]
pub struct TranslationView {
    translations: Vec<Arc<Translation>>,
    canonical: Arc<Translation>
}

impl TranslationView {
    pub fn get_translation(&self, key: &str) -> Option<&str> {
        Some(self.translations.iter().rev().find_map(|translation| {
            translation.get_translation(key)
        }).unwrap_or(self.canonical.get_translation(key)?))
    }

    pub fn get_translation_and_language(&self, key: &str) -> Option<(&LanguageTag, &str)> {
        Some(self.translations.iter().rev().find_map(|translation| {
            translation.get_translation(key).map(|value| {
                (translation.language(), value)
            })
        }).unwrap_or(self.canonical.get_translation(key).map(|value| {
            (self.canonical.language(), value)
        })?))
    }

    pub fn primary_language(&self) -> Option<&LanguageTag> {
        self.translations.last().map(|value| value.language())
    }

    pub fn new(canonical: Arc<Translation>, translations: Vec<Arc<Translation>>) -> Self {
        Self { canonical, translations }
    }
}

#[test]
pub fn test_translation_view() {
    use crate::accept_language::parse_accept_language_header;
    use crate::registry::get_dummy_registry;

    let (registry, _, _, _, _) = get_dummy_registry();
    let weighted_languages = parse_accept_language_header("ja-JP;q=1, fr-FR;q=1, en-GB;q=0.2, en-US;q=0.2").unwrap();
    let view = registry.get_translation_view(&weighted_languages).unwrap();
    assert_eq!(view.get_translation("spelling_of_gray").unwrap(), "Grey");
    assert_eq!(view.get_translation("internal_server_error").unwrap(), "内部サーバーエラー");
}