Skip to content

Commit 696be79

Browse files
committed
Switch to use unic_langid
1 parent 335d9e7 commit 696be79

File tree

10 files changed

+200
-290
lines changed

10 files changed

+200
-290
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ coveralls = { repository = "projectfluent/fluent-locale-rs", branch = "master",
1919
maintenance = { status = "actively-developed" }
2020

2121
[dependencies]
22-
unic-locale = "^0.1"
22+
unic-langid = { path = "../../unic-locale/unic-langid" }
2323

2424
[dev-dependencies]
2525
serde = "^1.0"

benches/lib.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,22 @@
22

33
extern crate test;
44

5+
use fluent_locale::convert_vec_str_to_langids;
56
use fluent_locale::negotiate_languages;
6-
use unic_locale::Locale;
7+
use std::convert::TryFrom;
78
use test::Bencher;
9+
use unic_langid::LanguageIdentifier;
810

911
#[bench]
1012
fn bench_locale(b: &mut Bencher) {
11-
let locales = [
13+
let langids = [
1214
"en-US", "fr", "de", "en-GB", "it", "pl", "ru", "sr-Cyrl", "sr-Latn", "zh-Hant", "zh-Hans",
1315
"ja-JP", "he-IL", "de-DE", "de-IT",
1416
];
1517

1618
b.iter(|| {
17-
for locale in &locales {
18-
let _ = Locale::from_str(*locale);
19+
for locale in &langids {
20+
let _ = LanguageIdentifier::try_from(*locale).unwrap();
1921
}
2022
});
2123
}
@@ -28,12 +30,15 @@ fn bench_negotiate(b: &mut Bencher) {
2830
"ja-JP", "he-IL", "de-DE", "de-IT",
2931
];
3032

33+
let requested = convert_vec_str_to_langids(&requested);
34+
let available = convert_vec_str_to_langids(&available);
35+
3136
b.iter(|| {
3237
negotiate_languages(
3338
&requested,
3439
&available,
3540
None,
36-
&fluent_locale::NegotiationStrategy::Filtering,
41+
fluent_locale::NegotiationStrategy::Filtering,
3742
);
3843
});
3944
}

examples/negotiate.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
use fluent_locale::negotiate::NegotiationStrategy;
2-
use fluent_locale::negotiate_languages;
2+
use fluent_locale::{convert_vec_str_to_langids, negotiate_languages};
33

44
fn main() {
5-
let supported = negotiate_languages(
6-
&["it", "pl", "ru"],
7-
&["fr", "en-GB", "en-US", "ru", "pl"],
8-
None,
9-
&NegotiationStrategy::Filtering,
10-
);
5+
let requested = convert_vec_str_to_langids(&["it", "pl", "ru"]);
6+
let available = convert_vec_str_to_langids(&["fr", "en-GB", "en-US", "ru", "pl"]);
7+
let supported =
8+
negotiate_languages(&requested, &available, None, NegotiationStrategy::Filtering);
119

1210
println!("{:?}", supported);
1311
}

src/accepted_languages.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,41 @@
44
//! # Example:
55
//!
66
//! ```
7+
//! use std::convert::TryFrom;
8+
//!
79
//! use fluent_locale::negotiate_languages;
810
//! use fluent_locale::NegotiationStrategy;
911
//! use fluent_locale::parse_accepted_languages;
12+
//! use fluent_locale::convert_vec_str_to_langids;
13+
//! use unic_langid::LanguageIdentifier;
1014
//!
1115
//! let requested = parse_accepted_languages("de-AT;0.9,de-DE;0.8,de;0.7;en-US;0.5");
16+
//! let available = convert_vec_str_to_langids(&["fr", "pl", "de", "en-US"]);
17+
//! let default = LanguageIdentifier::try_from("en-US").expect("Failed to parse a langid.");
1218
//!
1319
//! let supported = negotiate_languages(
1420
//! &requested,
15-
//! &["fr", "pl", "de", "en-US"],
16-
//! Some("en-US"),
17-
//! &NegotiationStrategy::Filtering
21+
//! &available,
22+
//! Some(&default),
23+
//! NegotiationStrategy::Filtering
1824
//! );
19-
//! assert_eq!(supported, vec!["de", "en-US"]);
25+
//!
26+
//! let expected = convert_vec_str_to_langids(&["de", "en-US"]);
27+
//! assert_eq!(supported,
28+
//! expected.iter().map(|t| t.as_ref()).collect::<Vec<&LanguageIdentifier>>());
2029
//! ```
2130
//!
2231
//! This function ignores the weights associated with the locales, since Fluent Locale
2332
//! language negotiation only uses the order of locales, not the weights.
2433
//!
25-
pub fn parse(s: &str) -> Vec<&str> {
34+
35+
use std::convert::TryFrom;
36+
use unic_langid::LanguageIdentifier;
37+
38+
pub fn parse(s: &str) -> Vec<LanguageIdentifier> {
2639
s.split(',')
2740
.map(|t| t.trim().split(';').nth(0).unwrap())
2841
.filter(|t| !t.is_empty())
42+
.filter_map(|t| LanguageIdentifier::try_from(t).ok())
2943
.collect()
3044
}

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ pub mod accepted_languages;
1919
pub mod negotiate;
2020

2121
pub use accepted_languages::parse as parse_accepted_languages;
22+
pub use negotiate::convert_vec_str_to_langids;
2223
pub use negotiate::negotiate_languages;
2324
pub use negotiate::NegotiationStrategy;

src/negotiate/likely_subtags.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
1-
use unic_locale::Locale;
1+
use std::convert::TryFrom;
2+
use unic_langid::LanguageIdentifier;
23

34
static REGION_MATCHING_KEYS: &[&str] = &[
45
"az", "bg", "cs", "de", "es", "fi", "fr", "hu", "it", "lt", "lv", "nl", "pl", "ro", "ru",
56
];
67

7-
pub fn add(loc: &str) -> Option<String> {
8-
let extended = match loc {
9-
"en" => "en-Latn-US",
10-
"fr" => "fr-Latn-FR",
11-
"sr" => "sr-Cyrl-SR",
12-
"sr-RU" => "sr-Latn-RU",
13-
"az-IR" => "az-Arab-IR",
14-
"zh-GB" => "zh-Hant-GB",
15-
"zh-US" => "zh-Hant-US",
8+
pub fn add(langid: &LanguageIdentifier) -> Option<LanguageIdentifier> {
9+
let extended = match langid.to_string().as_str() {
10+
"en" => LanguageIdentifier::try_from("en-Latn-US"),
11+
"fr" => LanguageIdentifier::try_from("fr-Latn-FR"),
12+
"sr" => LanguageIdentifier::try_from("sr-Cyrl-SR"),
13+
"sr-RU" => LanguageIdentifier::try_from("sr-Latn-SR"),
14+
"az-IR" => LanguageIdentifier::try_from("az-Aram-IR"),
15+
"zh-GB" => LanguageIdentifier::try_from("zh-Hant-GB"),
16+
"zh-US" => LanguageIdentifier::try_from("zh-Hant-US"),
1617
_ => {
17-
let mut locale = Locale::from_str(loc).unwrap();
18-
let lang = locale.get_language().to_owned();
18+
let lang = langid.get_language();
1919

2020
for subtag in REGION_MATCHING_KEYS {
21-
if lang.as_str() == *subtag {
22-
locale.set_region(Some(subtag)).unwrap();
23-
let loc = locale.to_string();
24-
return Some(loc);
21+
if lang == *subtag {
22+
let mut new_lang = langid.clone();
23+
new_lang.set_region(Some(subtag)).unwrap();
24+
return Some(new_lang);
2525
}
2626
}
2727
return None;
2828
}
2929
};
3030

31-
Some(extended.to_owned())
31+
Some(extended.expect("Failed to parse langid.").to_owned())
3232
}

0 commit comments

Comments
 (0)