Skip to content

Commit 2d7f7c5

Browse files
committed
Move from unic_langid to icu_locid
1 parent 7718573 commit 2d7f7c5

File tree

7 files changed

+52
-27
lines changed

7 files changed

+52
-27
lines changed

Cargo.toml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ version = "0.13.0"
77
authors = ["Zibi Braniecki <gandalf@mozilla.com>"]
88
homepage = "http://projectfluent.org/"
99
license = "Apache-2.0"
10-
license-file = "LICENSE"
1110
repository = "https://github.com/projectfluent/fluent-langneg-rs"
1211
readme = "README.md"
1312
categories = ["internationalization", "localization"]
14-
edition = "2018"
13+
edition = "2021"
1514
include = [
1615
"src/**/*",
1716
"benches/*.rs",
@@ -26,13 +25,11 @@ coveralls = { repository = "projectfluent/fluent-langneg-rs", branch = "master",
2625
maintenance = { status = "actively-developed" }
2726

2827
[dependencies]
29-
unic-langid = "0.9"
28+
icu_locid = "1.4"
3029

3130
[dev-dependencies]
3231
serde = { version = "1.0", features = ["derive"] }
3332
serde_json = "1.0"
34-
unic-langid = { version = "0.9", features = ["macros"] }
35-
unic-locale = { version = "0.9", features = ["macros"] }
3633
criterion = "0.3"
3734

3835
[[bench]]
@@ -41,4 +38,3 @@ harness = false
4138

4239
[features]
4340
default = []
44-
cldr = ["unic-langid/likelysubtags"]

benches/negotiate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use criterion::Criterion;
55
use fluent_langneg::convert_vec_str_to_langids_lossy;
66
use fluent_langneg::negotiate_languages;
77

8-
use unic_langid::LanguageIdentifier;
8+
use icu_locid::LanguageIdentifier;
99

1010
#[no_mangle]
1111
#[inline(never)]

src/accepted_languages.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
//! use fluent_langneg::NegotiationStrategy;
99
//! use fluent_langneg::parse_accepted_languages;
1010
//! use fluent_langneg::convert_vec_str_to_langids_lossy;
11-
//! use unic_langid::LanguageIdentifier;
11+
//! use icu_locid::LanguageIdentifier;
1212
//!
1313
//! let requested = parse_accepted_languages("de-AT;0.9,de-DE;0.8,de;0.7;en-US;0.5");
1414
//! let available = convert_vec_str_to_langids_lossy(&["fr", "pl", "de", "en-US"]);
@@ -30,11 +30,11 @@
3030
//! language negotiation only uses the order of locales, not the weights.
3131
//!
3232
33-
use unic_langid::LanguageIdentifier;
33+
use icu_locid::LanguageIdentifier;
3434

3535
pub fn parse(s: &str) -> Vec<LanguageIdentifier> {
3636
s.split(',')
37-
.map(|t| t.trim().split(';').nth(0).unwrap())
37+
.map(|t| t.trim().split(';').next().unwrap())
3838
.filter(|t| !t.is_empty())
3939
.filter_map(|t| t.parse().ok())
4040
.collect()

src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ pub use accepted_languages::parse as parse_accepted_languages;
2222
pub use negotiate::negotiate_languages;
2323
pub use negotiate::NegotiationStrategy;
2424

25-
use unic_langid::{LanguageIdentifier, LanguageIdentifierError};
25+
use icu_locid::{LanguageIdentifier, ParserError};
2626

2727
pub fn convert_vec_str_to_langids<'a, I, J>(
2828
input: I,
29-
) -> Result<Vec<LanguageIdentifier>, LanguageIdentifierError>
29+
) -> Result<Vec<LanguageIdentifier>, ParserError>
3030
where
3131
I: IntoIterator<Item = J>,
3232
J: AsRef<[u8]> + 'a,
3333
{
3434
input
3535
.into_iter()
36-
.map(|s| LanguageIdentifier::from_bytes(s.as_ref()))
36+
.map(|s| LanguageIdentifier::try_from_bytes(s.as_ref()))
3737
.collect()
3838
}
3939

@@ -44,6 +44,6 @@ where
4444
{
4545
input
4646
.into_iter()
47-
.filter_map(|t| LanguageIdentifier::from_bytes(t.as_ref()).ok())
47+
.filter_map(|t| LanguageIdentifier::try_from_bytes(t.as_ref()).ok())
4848
.collect()
4949
}

src/negotiate/likely_subtags.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use unic_langid::LanguageIdentifier;
1+
use icu_locid::LanguageIdentifier;
22

33
static REGION_MATCHING_KEYS: &[&str] = &[
44
"az", "bg", "cs", "de", "es", "fi", "fr", "hu", "it", "lt", "lv", "nl", "pl", "ro", "ru",
@@ -22,7 +22,7 @@ impl MockLikelySubtags for LanguageIdentifier {
2222
let lang = self.language;
2323

2424
for subtag in REGION_MATCHING_KEYS {
25-
if lang == *subtag {
25+
if lang.strict_cmp(subtag.as_bytes()).is_eq() {
2626
self.region = Some(subtag.parse().unwrap());
2727
return true;
2828
}

src/negotiate/mod.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
//! use fluent_langneg::negotiate_languages;
1515
//! use fluent_langneg::NegotiationStrategy;
1616
//! use fluent_langneg::convert_vec_str_to_langids_lossy;
17-
//! use unic_langid::LanguageIdentifier;
17+
//! use icu_locid::LanguageIdentifier;
1818
//!
1919
//! let requested = convert_vec_str_to_langids_lossy(&["pl", "fr", "en-US"]);
2020
//! let available = convert_vec_str_to_langids_lossy(&["it", "de", "fr", "en-GB", "en_US"]);
@@ -119,7 +119,7 @@
119119
//! ```
120120
//!
121121
122-
use unic_langid::LanguageIdentifier;
122+
use icu_locid::LanguageIdentifier;
123123

124124
#[cfg(not(feature = "cldr"))]
125125
mod likely_subtags;
@@ -133,6 +133,40 @@ pub enum NegotiationStrategy {
133133
Lookup,
134134
}
135135

136+
fn subtag_matches<P: PartialEq>(
137+
subtag1: &Option<P>,
138+
subtag2: &Option<P>,
139+
as_range1: bool,
140+
as_range2: bool,
141+
) -> bool {
142+
(as_range1 && subtag1.is_none()) || (as_range2 && subtag2.is_none()) || subtag1 == subtag2
143+
}
144+
145+
fn matches(
146+
lid1: &LanguageIdentifier,
147+
lid2: &LanguageIdentifier,
148+
range1: bool,
149+
range2: bool,
150+
) -> bool {
151+
let language = (range1 && lid1.language.is_empty())
152+
|| (range2 && lid2.language.is_empty())
153+
|| lid1.language == lid2.language;
154+
if !language {
155+
return false;
156+
}
157+
let script = subtag_matches(&lid1.script, &lid2.script, range1, range2);
158+
if !script {
159+
return false;
160+
}
161+
let region = subtag_matches(&lid1.region, &lid2.region, range1, range2);
162+
if !region {
163+
return false;
164+
}
165+
(range1 && lid1.variants.is_empty())
166+
|| (range2 && lid2.variants.is_empty())
167+
|| lid1.variants == lid2.variants
168+
}
169+
136170
pub fn filter_matches<'a, R: 'a + AsRef<LanguageIdentifier>, A: 'a + AsRef<LanguageIdentifier>>(
137171
requested: &[R],
138172
available: &'a [A],
@@ -152,10 +186,7 @@ pub fn filter_matches<'a, R: 'a + AsRef<LanguageIdentifier>, A: 'a + AsRef<Langu
152186
return true;
153187
}
154188

155-
if locale
156-
.as_ref()
157-
.matches(&req, $self_as_range, $other_as_range)
158-
{
189+
if matches(locale.as_ref(), &req, $self_as_range, $other_as_range) {
159190
match_found = true;
160191
supported_locales.push(*locale);
161192
return false;
@@ -191,7 +222,7 @@ pub fn filter_matches<'a, R: 'a + AsRef<LanguageIdentifier>, A: 'a + AsRef<Langu
191222
}
192223

193224
// 4) Try to match against a variant as a range
194-
req.clear_variants();
225+
req.variants.clear();
195226
test_strategy!(true, true);
196227

197228
// 5) Try to match against the likely subtag without region

tests/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ use fluent_langneg::convert_vec_str_to_langids_lossy;
77
use fluent_langneg::negotiate_languages;
88
use fluent_langneg::parse_accepted_languages;
99
use fluent_langneg::NegotiationStrategy;
10-
use unic_langid::langid;
11-
use unic_langid::LanguageIdentifier;
12-
use unic_locale::locale;
10+
use icu_locid::{langid, locale, LanguageIdentifier, Locale};
1311

1412
use serde::{Deserialize, Serialize};
1513

@@ -190,7 +188,7 @@ fn locale_matching() {
190188
let loc_de_at = locale!("de-AT-u-hc-h24");
191189
let loc_en = locale!("en-u-ca-buddhist");
192190
let loc_de = locale!("de");
193-
let loc_pl = locale!("pl-x-private");
191+
let loc_pl: Locale = "pl-x-private".parse().unwrap();
194192

195193
assert_eq!(
196194
negotiate_languages(

0 commit comments

Comments
 (0)