fluent_locale/accepted_languages.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
//! This function parses Accept-Language string into a list of language tags that
//! can be later passed to language negotiation functions.
//!
//! # Example:
//!
//! ```
//! use fluent_locale::negotiate_languages;
//! use fluent_locale::NegotiationStrategy;
//! use fluent_locale::parse_accepted_languages;
//! use fluent_locale::convert_vec_str_to_langids_lossy;
//! use unic_langid::LanguageIdentifier;
//!
//! let requested = parse_accepted_languages("de-AT;0.9,de-DE;0.8,de;0.7;en-US;0.5");
//! let available = convert_vec_str_to_langids_lossy(&["fr", "pl", "de", "en-US"]);
//! let default: LanguageIdentifier = "en-US".parse().expect("Failed to parse a langid.");
//!
//! let supported = negotiate_languages(
//! &requested,
//! &available,
//! Some(&default),
//! NegotiationStrategy::Filtering
//! );
//!
//! let expected = convert_vec_str_to_langids_lossy(&["de", "en-US"]);
//! assert_eq!(supported,
//! expected.iter().map(|t| t.as_ref()).collect::<Vec<&LanguageIdentifier>>());
//! ```
//!
//! This function ignores the weights associated with the locales, since Fluent Locale
//! language negotiation only uses the order of locales, not the weights.
//!
use unic_langid::LanguageIdentifier;
pub fn parse(s: &str) -> Vec<LanguageIdentifier> {
s.split(',')
.map(|t| t.trim().split(';').nth(0).unwrap())
.filter(|t| !t.is_empty())
.filter_map(|t| t.parse().ok())
.collect()
}