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(), "内部サーバーエラー");
}