From 96d7a981932c1f7525cf402396ac710595a57311 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 19 Feb 2021 18:25:30 -0600 Subject: [PATCH 01/18] Very rough start to icu_decimal crate --- Cargo.lock | 42 ++++++-- Cargo.toml | 1 + components/decimal/Cargo.toml | 33 ++++++ components/decimal/src/lib.rs | 5 + components/decimal/src/provider.rs | 68 ++++++++++++ components/locale_canonicalizer/Cargo.toml | 1 + components/provider/src/resource.rs | 5 + components/provider_cldr/Cargo.toml | 3 +- components/provider_cldr/src/cldr_paths.rs | 9 ++ .../src/download/cldr_allinone.rs | 4 + components/provider_cldr/src/transform/mod.rs | 18 ++++ .../provider_cldr/src/transform/numbers.rs | 102 ++++++++++++++++++ 12 files changed, 280 insertions(+), 11 deletions(-) create mode 100644 components/decimal/Cargo.toml create mode 100644 components/decimal/src/lib.rs create mode 100644 components/decimal/src/provider.rs create mode 100644 components/provider_cldr/src/transform/numbers.rs diff --git a/Cargo.lock b/Cargo.lock index 8ca6e8355cc..9f16a80d6dc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -822,6 +822,16 @@ dependencies = [ "writeable", ] +[[package]] +name = "icu_decimal" +version = "0.1.0" +dependencies = [ + "icu_locid", + "icu_provider", + "serde", + "smallstr", +] + [[package]] name = "icu_locale_canonicalizer" version = "0.1.0" @@ -892,6 +902,7 @@ version = "0.1.0" dependencies = [ "dirs", "icu_datetime", + "icu_decimal", "icu_locale_canonicalizer", "icu_locid", "icu_locid_macros", @@ -1885,9 +1896,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.117" +version = "1.0.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a" +checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" dependencies = [ "serde_derive", ] @@ -1913,9 +1924,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.117" +version = "1.0.123" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e" +checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" dependencies = [ "proc-macro2", "quote", @@ -1964,6 +1975,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +[[package]] +name = "smallstr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e922794d168678729ffc7e07182721a14219c65814e66e91b839a272fe5ae4f" +dependencies = [ + "serde", + "smallvec", +] + [[package]] name = "smallvec" version = "1.4.2" @@ -2017,9 +2038,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.58" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" dependencies = [ "proc-macro2", "quote", @@ -2068,10 +2089,11 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "939125669d4043772e1eb2e91e25d1f933679155d961149aa181519de131439f" +checksum = "27aaed4540fcc2440c36fe3a98ca56450ee3da6d166da64369f40dc980aba459" dependencies = [ + "serde", "tinystr-macros", "tinystr-raw", ] @@ -2087,9 +2109,9 @@ dependencies = [ [[package]] name = "tinystr-raw" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17bd7d3b696677c7844bf4ce7db7492c140b0922a553b6d285fe642e6d9934b5" +checksum = "b975dd2af5824896acaeebf7336471fcafebfa417da0a290ded5509f297ccedb" [[package]] name = "tinytemplate" diff --git a/Cargo.toml b/Cargo.toml index 9199d8bdf22..7a3a2b9657f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "experimental/bies", "experimental/segmenter_lstm", "components/datetime", + "components/decimal", "components/ecma402", "components/icu", "components/icu4x", diff --git a/components/decimal/Cargo.toml b/components/decimal/Cargo.toml new file mode 100644 index 00000000000..752d21f6f28 --- /dev/null +++ b/components/decimal/Cargo.toml @@ -0,0 +1,33 @@ +# This file is part of ICU4X. For terms of use, please see the file +# called LICENSE at the top level of the ICU4X source tree +# (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + +[package] +name = "icu_decimal" +version = "0.1.0" +authors = ["The ICU4X Project Developers"] +edition = "2018" +repository = "https://github.com/unicode-org/icu4x" +license-file = "../../LICENSE" +categories = ["internationalization"] +include = [ + "src/**/*", + "benches/**/*", + "Cargo.toml", + "README.md" +] + +[package.metadata.cargo-all-features] +skip_optional_dependencies = true + +[dependencies] +smallstr = { version = "0.2", features = ["serde"] } +icu_locid = { version = "0.1", path = "../locid" } +icu_provider = { version = "0.1", path = "../provider" } +serde = { version = "1.0", features = ["derive"], optional = true } + +[features] +default = ["provider_serde"] +bench = [] +provider_serde = ["serde"] +serialize_none = [] diff --git a/components/decimal/src/lib.rs b/components/decimal/src/lib.rs new file mode 100644 index 00000000000..a17215df8f5 --- /dev/null +++ b/components/decimal/src/lib.rs @@ -0,0 +1,5 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + +pub mod provider; diff --git a/components/decimal/src/provider.rs b/components/decimal/src/provider.rs new file mode 100644 index 00000000000..ecc50f035a1 --- /dev/null +++ b/components/decimal/src/provider.rs @@ -0,0 +1,68 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + +use smallstr::SmallString; + +pub mod key { + use icu_provider::{resource::ResourceKey, resource_key}; + pub const SYMBOLS_V1: ResourceKey = resource_key!(decimal, "symbols", 1); +} + +type SmallString8 = SmallString<[u8; 8]>; + +/// A collection of strings to affix to a decimal number. +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr( + feature = "provider_serde", + derive(serde::Serialize, serde::Deserialize) +)] +pub struct AffixesV1 { + /// String to prepend before the decimal number. + pub prefix: SmallString8, + + /// String to append after the decimal number. + pub suffix: SmallString8, +} + +/// A collection of settings expressing where to put grouping separators in a decimal number. +/// For example, `1,000,000` has two grouping separators, positioned along every 3 digits. +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr( + feature = "provider_serde", + derive(serde::Serialize, serde::Deserialize) +)] +pub struct GroupingSizesV1 { + /// The size of the first group. + pub primary: u8, + + /// The size of groups after the first group. + pub secondary: u8, + + /// The minimum number of digits required before the first group. For example, if `primary=3` + /// and `min_grouping=2`, grouping separators will be present on 10,000 and above. + pub min_grouping: u8, +} + +/// Symbols and metadata required for formatting a FixedDecimal. +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr( + feature = "provider_serde", + derive(serde::Serialize, serde::Deserialize) +)] +pub struct DecimalSymbolsV1 { + /// Prefix and suffix to apply when a negative sign is needed. + pub minus_sign_affixes: AffixesV1, + + /// Prefix and suffix to apply when a plus sign is needed. + pub plus_sign_affixes: AffixesV1, + + /// Character used to separate the integer and fraction parts of the number. + pub decimal_separator: SmallString8, + + /// Character used to separate groups in the integer part of the number. + pub grouping_separator: SmallString8, + + /// Settings used to determine where to place groups in the integer part of the number. + pub grouping_sizes: GroupingSizesV1, +} diff --git a/components/locale_canonicalizer/Cargo.toml b/components/locale_canonicalizer/Cargo.toml index 2591557a07d..00cc1aaf2db 100644 --- a/components/locale_canonicalizer/Cargo.toml +++ b/components/locale_canonicalizer/Cargo.toml @@ -1,6 +1,7 @@ # This file is part of ICU4X. For terms of use, please see the file # called LICENSE at the top level of the ICU4X source tree # (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + [package] name = "icu_locale_canonicalizer" version = "0.1.0" diff --git a/components/provider/src/resource.rs b/components/provider/src/resource.rs index 15cc56a658d..12147d8352e 100644 --- a/components/provider/src/resource.rs +++ b/components/provider/src/resource.rs @@ -26,6 +26,7 @@ pub enum ResourceCategory { Plurals, Dates, Uniset, + Decimal, PrivateUse(TinyStr4), } @@ -38,6 +39,7 @@ impl ResourceCategory { Self::Plurals => Cow::Borrowed("plurals"), Self::Dates => Cow::Borrowed("dates"), Self::Uniset => Cow::Borrowed("uniset"), + Self::Decimal => Cow::Borrowed("decimal"), Self::PrivateUse(id) => { let mut result = String::from("x-"); result.push_str(id.as_str()); @@ -110,6 +112,9 @@ macro_rules! resource_key { (uniset, $sub_category:literal, $version:tt) => { $crate::resource_key!($crate::ResourceCategory::Uniset, $sub_category, $version) }; + (decimal, $sub_category:literal, $version:tt) => { + $crate::resource_key!($crate::ResourceCategory::Decimal, $sub_category, $version) + }; (x, $pu:literal, $sub_category:literal, $version:tt) => { $crate::resource_key!( $crate::ResourceCategory::PrivateUse($crate::resource::tinystr4!($pu)), diff --git a/components/provider_cldr/Cargo.toml b/components/provider_cldr/Cargo.toml index 15a48bf0b8d..ee0e6006036 100644 --- a/components/provider_cldr/Cargo.toml +++ b/components/provider_cldr/Cargo.toml @@ -32,11 +32,12 @@ icu_locid = { version = "0.1", path = "../locid" } icu_plurals = { version = "0.1", path = "../plurals" } icu_datetime = { version = "0.1", path = "../datetime" } icu_locale_canonicalizer = { version = "0.1", path = "../locale_canonicalizer" } +icu_decimal = { version = "0.1", path = "../decimal" } json = "0.12" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde-tuple-vec-map = "1.0" -tinystr = "0.4" +tinystr = { version = "0.4.3", features = ["serde"] } # Dependencies for the download feature urlencoding = { version = "1.1", optional = true } diff --git a/components/provider_cldr/src/cldr_paths.rs b/components/provider_cldr/src/cldr_paths.rs index fceac2fd015..f40da654822 100644 --- a/components/provider_cldr/src/cldr_paths.rs +++ b/components/provider_cldr/src/cldr_paths.rs @@ -15,6 +15,10 @@ pub trait CldrPaths: std::fmt::Debug { /// Path to checkout of cldr-dates: /// fn cldr_dates(&self) -> Result; + + /// Path to checkout of cldr-numbers: + /// + fn cldr_numbers(&self) -> Result; } /// Implementation of `CldrPaths` for data directories already downloaded. @@ -37,6 +41,7 @@ pub trait CldrPaths: std::fmt::Debug { pub struct CldrPathsLocal { pub cldr_core: Result, pub cldr_dates: Result, + pub cldr_numbers: Result, } impl CldrPaths for CldrPathsLocal { @@ -46,6 +51,9 @@ impl CldrPaths for CldrPathsLocal { fn cldr_dates(&self) -> Result { self.cldr_dates.clone().map_err(|e| e.into()) } + fn cldr_numbers(&self) -> Result { + self.cldr_numbers.clone().map_err(|e| e.into()) + } } impl Default for CldrPathsLocal { @@ -53,6 +61,7 @@ impl Default for CldrPathsLocal { Self { cldr_core: Err(MissingSourceError { src: "cldr-core" }), cldr_dates: Err(MissingSourceError { src: "cldr-dates" }), + cldr_numbers: Err(MissingSourceError { src: "cldr-numbers" }), } } } diff --git a/components/provider_cldr/src/download/cldr_allinone.rs b/components/provider_cldr/src/download/cldr_allinone.rs index 687edb5d357..f406adc383d 100644 --- a/components/provider_cldr/src/download/cldr_allinone.rs +++ b/components/provider_cldr/src/download/cldr_allinone.rs @@ -78,6 +78,10 @@ impl CldrPaths for CldrAllInOneDownloader { self.download_and_unzip() .map(|p| p.join(format!("cldr-dates-{}", self.suffix))) } + fn cldr_numbers(&self) -> Result { + self.download_and_unzip() + .map(|p| p.join(format!("cldr-numbers-{}", self.suffix))) + } } impl CldrAllInOneDownloader { diff --git a/components/provider_cldr/src/transform/mod.rs b/components/provider_cldr/src/transform/mod.rs index 2a97af7135e..3565550c2df 100644 --- a/components/provider_cldr/src/transform/mod.rs +++ b/components/provider_cldr/src/transform/mod.rs @@ -1,12 +1,15 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + mod dates; mod likelysubtags; +mod numbers; mod plurals; pub use dates::DatesProvider; pub use likelysubtags::LikelySubtagsProvider; +pub use numbers::NumbersProvider; pub use plurals::PluralsProvider; use crate::support::LazyCldrProvider; @@ -19,6 +22,7 @@ pub fn get_all_resc_keys() -> Vec { let mut result: Vec = vec![]; result.extend(&dates::ALL_KEYS); result.extend(&likelysubtags::ALL_KEYS); + result.extend(&numbers::ALL_KEYS); result.extend(&plurals::ALL_KEYS); result } @@ -28,6 +32,7 @@ pub struct CldrJsonDataProvider<'a, 'd> { pub cldr_paths: &'a dyn CldrPaths, dates: LazyCldrProvider>, likelysubtags: LazyCldrProvider>, + numbers: LazyCldrProvider, plurals: LazyCldrProvider>, } @@ -37,6 +42,7 @@ impl<'a, 'd> CldrJsonDataProvider<'a, 'd> { cldr_paths, dates: Default::default(), likelysubtags: Default::default(), + numbers: Default::default(), plurals: Default::default(), } } @@ -57,6 +63,12 @@ impl<'a, 'd> ErasedDataProvider<'d> for CldrJsonDataProvider<'a, 'd> { { return Ok(result); } + if let Some(result) = self + .numbers + .try_load(req, receiver, self.cldr_paths)? + { + return Ok(result); + } if let Some(result) = self.plurals.try_load(req, receiver, self.cldr_paths)? { return Ok(result); } @@ -81,6 +93,12 @@ impl<'a, 'd> IterableDataProvider<'d> for CldrJsonDataProvider<'a, 'd> { { return Ok(resp); } + if let Some(resp) = self + .numbers + .try_supported_options(resc_key, self.cldr_paths)? + { + return Ok(resp); + } if let Some(resp) = self .plurals .try_supported_options(resc_key, self.cldr_paths)? diff --git a/components/provider_cldr/src/transform/numbers.rs b/components/provider_cldr/src/transform/numbers.rs new file mode 100644 index 00000000000..05c1163c989 --- /dev/null +++ b/components/provider_cldr/src/transform/numbers.rs @@ -0,0 +1,102 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + +use crate::error::Error; +use crate::reader::{get_subdirectories, open_reader}; +use crate::CldrPaths; +use icu_decimal::provider::*; +use icu_provider::prelude::*; +use std::convert::TryFrom; + +/// All keys that this module is able to produce. +pub const ALL_KEYS: [ResourceKey; 1] = [ + key::SYMBOLS_V1, // +]; + +/// A data provider reading from CLDR JSON plural rule files. +#[derive(PartialEq, Debug)] +pub struct NumbersProvider { +} + +impl TryFrom<&dyn CldrPaths> for NumbersProvider { + type Error = Error; + fn try_from(cldr_paths: &dyn CldrPaths) -> Result { + let mut data = vec![]; + + let path = cldr_paths.cldr_numbers()?.join("main"); + + let locale_dirs = get_subdirectories(&path)?; + + for dir in locale_dirs { + let path = dir.join("numbers.json"); + + let mut resource: cldr_json::Resource = + serde_json::from_reader(open_reader(&path)?).map_err(|e| (e, path))?; + data.append(&mut resource.main.0); + } + + unimplemented!() + // Ok(Self { + // data, + // }) + } +} + +impl KeyedDataProvider for NumbersProvider { + fn supports_key(resc_key: &ResourceKey) -> Result<(), DataError> { + if resc_key.category != ResourceCategory::Decimal { + return Err((&resc_key.category).into()); + } + if resc_key.version != 1 { + return Err(resc_key.into()); + } + Ok(()) + } +} + +impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { + fn load_payload( + &self, + req: &DataRequest, + ) -> Result, DataError> { + unimplemented!() + } +} + +icu_provider::impl_erased!(NumbersProvider, 'd); + +impl<'d> IterableDataProvider<'d> for NumbersProvider { + fn supported_options_for_key( + &self, + resc_key: &ResourceKey, + ) -> Result>, DataError> { + unimplemented!() + } +} + +/// Serde structs for the CLDR JSON dates files. +pub(self) mod cldr_json { + use crate::cldr_langid::CldrLangID; + use serde::Deserialize; + use tinystr::TinyStr8; + + #[derive(PartialEq, Debug, Deserialize)] + pub struct Numbers { + pub default_numbering_system: TinyStr8, + pub minimum_grouping_dicits: TinyStr8, + + } + #[derive(PartialEq, Debug, Deserialize)] + pub struct LangNumbers { + pub numbers: Numbers, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct LangData(#[serde(with = "tuple_vec_map")] pub(crate) Vec<(CldrLangID, LangNumbers)>); + + #[derive(PartialEq, Debug, Deserialize)] + pub struct Resource { + pub main: LangData, + } +} From 196d755089d3cb3d9281a864c51f556e93893236 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 26 Feb 2021 04:10:14 -0600 Subject: [PATCH 02/18] Checkpoint --- Cargo.lock | 1 + components/decimal/src/provider.rs | 4 +- components/provider/src/error.rs | 25 ++ components/provider_cldr/Cargo.toml | 1 + components/provider_cldr/src/cldr_paths.rs | 4 +- .../provider_cldr/src/transform/dates.rs | 1 + components/provider_cldr/src/transform/mod.rs | 5 +- .../provider_cldr/src/transform/numbers.rs | 190 +++++++++++++++- .../tests/testdata/my-numbers.json | 213 ++++++++++++++++++ 9 files changed, 429 insertions(+), 15 deletions(-) create mode 100644 components/provider_cldr/tests/testdata/my-numbers.json diff --git a/Cargo.lock b/Cargo.lock index 9f16a80d6dc..dccf2bcac2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -915,6 +915,7 @@ dependencies = [ "serde", "serde-tuple-vec-map", "serde_json", + "smallstr", "tinystr", "unzip", "urlencoding", diff --git a/components/decimal/src/provider.rs b/components/decimal/src/provider.rs index ecc50f035a1..3b30dca6583 100644 --- a/components/decimal/src/provider.rs +++ b/components/decimal/src/provider.rs @@ -2,15 +2,13 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). -use smallstr::SmallString; +type SmallString8 = smallstr::SmallString<[u8; 8]>; pub mod key { use icu_provider::{resource::ResourceKey, resource_key}; pub const SYMBOLS_V1: ResourceKey = resource_key!(decimal, "symbols", 1); } -type SmallString8 = SmallString<[u8; 8]>; - /// A collection of strings to affix to a decimal number. #[derive(Debug, PartialEq, Clone)] #[cfg_attr( diff --git a/components/provider/src/error.rs b/components/provider/src/error.rs index bd74f280c0b..0a7b416d906 100644 --- a/components/provider/src/error.rs +++ b/components/provider/src/error.rs @@ -78,6 +78,31 @@ impl From> for Error { } } +struct StringResourceError(pub String); +impl std::error::Error for StringResourceError {} +impl fmt::Debug for StringResourceError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str(&self.0) + } +} +impl fmt::Display for StringResourceError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str(&self.0) + } +} + +impl From for Error { + fn from(err: String) -> Self { + Self::Resource(Box::new(StringResourceError(err))) + } +} + +impl From<&str> for Error { + fn from(err: &str) -> Self { + Self::Resource(Box::new(StringResourceError(err.to_string()))) + } +} + impl Error { pub fn new_resc_error(err: T) -> Self where diff --git a/components/provider_cldr/Cargo.toml b/components/provider_cldr/Cargo.toml index ee0e6006036..7c792674373 100644 --- a/components/provider_cldr/Cargo.toml +++ b/components/provider_cldr/Cargo.toml @@ -37,6 +37,7 @@ json = "0.12" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" serde-tuple-vec-map = "1.0" +smallstr = { version = "0.2", features = ["serde"] } tinystr = { version = "0.4.3", features = ["serde"] } # Dependencies for the download feature diff --git a/components/provider_cldr/src/cldr_paths.rs b/components/provider_cldr/src/cldr_paths.rs index f40da654822..77c2a9ede8b 100644 --- a/components/provider_cldr/src/cldr_paths.rs +++ b/components/provider_cldr/src/cldr_paths.rs @@ -61,7 +61,9 @@ impl Default for CldrPathsLocal { Self { cldr_core: Err(MissingSourceError { src: "cldr-core" }), cldr_dates: Err(MissingSourceError { src: "cldr-dates" }), - cldr_numbers: Err(MissingSourceError { src: "cldr-numbers" }), + cldr_numbers: Err(MissingSourceError { + src: "cldr-numbers", + }), } } } diff --git a/components/provider_cldr/src/transform/dates.rs b/components/provider_cldr/src/transform/dates.rs index 89f29ded04b..b73ff5ff232 100644 --- a/components/provider_cldr/src/transform/dates.rs +++ b/components/provider_cldr/src/transform/dates.rs @@ -1,6 +1,7 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + use crate::cldr_langid::CldrLangID; use crate::error::Error; use crate::reader::{get_subdirectories, open_reader}; diff --git a/components/provider_cldr/src/transform/mod.rs b/components/provider_cldr/src/transform/mod.rs index 3565550c2df..a6faf47d45d 100644 --- a/components/provider_cldr/src/transform/mod.rs +++ b/components/provider_cldr/src/transform/mod.rs @@ -63,10 +63,7 @@ impl<'a, 'd> ErasedDataProvider<'d> for CldrJsonDataProvider<'a, 'd> { { return Ok(result); } - if let Some(result) = self - .numbers - .try_load(req, receiver, self.cldr_paths)? - { + if let Some(result) = self.numbers.try_load(req, receiver, self.cldr_paths)? { return Ok(result); } if let Some(result) = self.plurals.try_load(req, receiver, self.cldr_paths)? { diff --git a/components/provider_cldr/src/transform/numbers.rs b/components/provider_cldr/src/transform/numbers.rs index 05c1163c989..b8698d7e83c 100644 --- a/components/provider_cldr/src/transform/numbers.rs +++ b/components/provider_cldr/src/transform/numbers.rs @@ -2,11 +2,13 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +use crate::cldr_langid::CldrLangID; use crate::error::Error; use crate::reader::{get_subdirectories, open_reader}; use crate::CldrPaths; use icu_decimal::provider::*; use icu_provider::prelude::*; +use std::borrow::Cow; use std::convert::TryFrom; /// All keys that this module is able to produce. @@ -17,6 +19,7 @@ pub const ALL_KEYS: [ResourceKey; 1] = [ /// A data provider reading from CLDR JSON plural rule files. #[derive(PartialEq, Debug)] pub struct NumbersProvider { + data: Vec<(CldrLangID, cldr_json::LangNumbers)>, } impl TryFrom<&dyn CldrPaths> for NumbersProvider { @@ -36,10 +39,20 @@ impl TryFrom<&dyn CldrPaths> for NumbersProvider { data.append(&mut resource.main.0); } - unimplemented!() - // Ok(Self { - // data, - // }) + Ok(Self { data }) + } +} + +impl TryFrom<&str> for NumbersProvider { + type Error = Error; + fn try_from(input: &str) -> Result { + let mut data = vec![]; + + let mut resource: cldr_json::Resource = + serde_json::from_str(input).map_err(|e| Error::Json(e, None))?; + data.append(&mut resource.main.0); + + Ok(Self { data }) } } @@ -60,7 +73,21 @@ impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { &self, req: &DataRequest, ) -> Result, DataError> { - unimplemented!() + NumbersProvider::supports_key(&req.resource_path.key)?; + let cldr_langid: CldrLangID = req.try_langid()?.clone().into(); + let numbers = match self + .data + .binary_search_by_key(&&cldr_langid, |(lid, _)| lid) + { + Ok(idx) => &self.data[idx].1.numbers, + Err(_) => return Err(DataError::UnavailableResourceOptions(req.clone())), + }; + Ok(DataResponse { + metadata: DataResponseMetadata { + data_langid: req.resource_path.options.langid.clone(), + }, + payload: Some(Cow::Owned(DecimalSymbolsV1::try_from(numbers)?)), + }) } } @@ -75,18 +102,83 @@ impl<'d> IterableDataProvider<'d> for NumbersProvider { } } +impl TryFrom<&cldr_json::Numbers> for DecimalSymbolsV1 { + type Error = DataError; + + fn try_from(other: &cldr_json::Numbers) -> Result { + // TODO(#510): Select from non-default numbering systems + let symbols: cldr_json::Symbols = serde_json::from_value( + other + .extra + .get(&format!( + "symbols-numberSystem-{}", + other.default_numbering_system + )) + .ok_or("Could not find symbols for default numbering system")? + .clone(), + ) + .map_err(DataError::new_resc_error)?; + let formats: cldr_json::DecimalFormats = serde_json::from_value( + other + .extra + .get(&format!( + "decimalFormats-numberSystem-{}", + other.default_numbering_system + )) + .ok_or("Could not find formats for default numbering system")? + .clone(), + ) + .map_err(DataError::new_resc_error)?; + let parsed_pattern: helpers::DecimalPatternParseResult = formats.standard.parse()?; + + Ok(Self { + minus_sign_affixes: parsed_pattern.localize_sign(&symbols.minus_sign), + plus_sign_affixes: parsed_pattern.localize_sign(&symbols.plus_sign), + decimal_separator: symbols.decimal.into(), + grouping_separator: symbols.group.into(), + grouping_sizes: GroupingSizesV1 { + primary: parsed_pattern.primary_grouping, + secondary: parsed_pattern.secondary_grouping, + min_grouping: other.minimum_grouping_digits, + }, + }) + } +} + /// Serde structs for the CLDR JSON dates files. pub(self) mod cldr_json { use crate::cldr_langid::CldrLangID; use serde::Deserialize; + use serde_json::Value; + use std::collections::HashMap; use tinystr::TinyStr8; + #[derive(PartialEq, Debug, Deserialize)] + pub struct Symbols { + // This list is not comprehensive; add more fields when needed + pub decimal: String, + pub group: String, + #[serde(rename = "minusSign")] + pub minus_sign: String, + #[serde(rename = "plusSign")] + pub plus_sign: String, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct DecimalFormats { + pub standard: String, + } + #[derive(PartialEq, Debug, Deserialize)] pub struct Numbers { + #[serde(rename = "defaultNumberingSystem")] pub default_numbering_system: TinyStr8, - pub minimum_grouping_dicits: TinyStr8, - + #[serde(rename = "minimumGroupingDigits")] + pub minimum_grouping_digits: u8, + #[serde(flatten)] + pub extra: HashMap, } + #[derive(PartialEq, Debug, Deserialize)] pub struct LangNumbers { pub numbers: Numbers, @@ -100,3 +192,87 @@ pub(self) mod cldr_json { pub main: LangData, } } + +/// Helper functions for the transformation +pub(self) mod helpers { + use super::*; + use std::str::FromStr; + type SmallString8 = smallstr::SmallString<[u8; 8]>; + + pub struct DecimalPatternParseResult { + pub unsigned_affixes: (SmallString8, SmallString8), + pub signed_affixes: Option<(SmallString8, SmallString8)>, + pub primary_grouping: u8, + pub secondary_grouping: u8, + pub min_fraction_digits: u8, + pub max_fraction_digits: u8, + } + + impl FromStr for DecimalPatternParseResult { + type Err = &'static str; + + fn from_str(pattern: &str) -> Result { + // Example patterns: + // #,##,##0.### + // #,##0.00;#,##0.00- + // TODO + Ok(Self { + unsigned_affixes: ("".into(), "".into()), + signed_affixes: None, + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }) + } + } + + impl DecimalPatternParseResult { + pub fn localize_sign(&self, sign_str: &str) -> AffixesV1 { + // UTS 35: the absence of a negative pattern means a single prefixed sign + let signed_affixes = self + .signed_affixes.clone() + .unwrap_or_else(|| ("-".into(), "".into())); + AffixesV1 { + prefix: signed_affixes.0.replace("-", sign_str).into(), + suffix: signed_affixes.1.replace("-", sign_str).into(), + } + } + } +} + +#[test] +fn test_basic() { + use icu_locid_macros::langid; + use std::borrow::Cow; + + let json_str = std::fs::read_to_string("tests/testdata/my-numbers.json").unwrap(); + let provider = NumbersProvider::try_from(json_str.as_str()).unwrap(); + + println!("{:?}", provider); + + let my_decimal: Cow = provider + .load_payload(&DataRequest { + resource_path: ResourcePath { + key: key::SYMBOLS_V1, + options: ResourceOptions { + variant: None, + langid: Some(langid!("my")), + }, + }, + }) + .unwrap() + .take_payload() + .unwrap(); + + /* + assert_eq!("srpna", cs_dates.symbols.months.format.wide.0[7]); + + assert_eq!( + "po", + cs_dates.symbols.weekdays.format.short.as_ref().unwrap().0[1] + ); + + assert_eq!("d. M. y", cs_dates.patterns.date.medium); + */ +} diff --git a/components/provider_cldr/tests/testdata/my-numbers.json b/components/provider_cldr/tests/testdata/my-numbers.json new file mode 100644 index 00000000000..8a96936cbcd --- /dev/null +++ b/components/provider_cldr/tests/testdata/my-numbers.json @@ -0,0 +1,213 @@ +{ + "main": { + "my": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "my" + }, + "numbers": { + "defaultNumberingSystem": "mymr", + "otherNumberingSystems": { + "native": "mymr" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "ဂဏန်းမဟုတ်သော", + "timeSeparator": ":" + }, + "symbols-numberSystem-mymr": { + "decimal": ".", + "group": ",", + "list": "၊", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "ဂဏန်းမဟုတ်သော", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0ထောင်", + "10000-count-other": "0သောင်း", + "100000-count-other": "0သိန်း", + "1000000-count-other": "0သန်း", + "10000000-count-other": "0ကုဋေ", + "100000000-count-other": "00ကုဋေ", + "1000000000-count-other": "ကုဋေ000", + "10000000000-count-other": "ကုဋေ0000", + "100000000000-count-other": "ကုဋေ0သောင်း", + "1000000000000-count-other": "ကုဋေ0သိန်း", + "10000000000000-count-other": "ကုဋေ0သန်း", + "100000000000000-count-other": "0ကောဋိ" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0ထောင်", + "10000-count-other": "0သောင်း", + "100000-count-other": "0သိန်း", + "1000000-count-other": "0သန်း", + "10000000-count-other": "0ကုဋေ", + "100000000-count-other": "00ကုဋေ", + "1000000000-count-other": "ကုဋေ000", + "10000000000-count-other": "ကုဋေ0ထ", + "100000000000-count-other": "ကုဋေ0သ", + "1000000000000-count-other": "ဋေ0သိန်း", + "10000000000000-count-other": "ဋေ0သန်း", + "100000000000000-count-other": "0ကောဋိ" + } + } + }, + "decimalFormats-numberSystem-mymr": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0ထောင်", + "10000-count-other": "0သောင်း", + "100000-count-other": "0သိန်း", + "1000000-count-other": "0သန်း", + "10000000-count-other": "0ကုဋေ", + "100000000-count-other": "00ကုဋေ", + "1000000000-count-other": "ကုဋေ000", + "10000000000-count-other": "ကုဋေ0000", + "100000000000-count-other": "ကုဋေ0သောင်း", + "1000000000000-count-other": "ကုဋေ0သိန်း", + "10000000000000-count-other": "ကုဋေ0သန်း", + "100000000000000-count-other": "0ကောဋိ" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0ထောင်", + "10000-count-other": "0သောင်း", + "100000-count-other": "0သိန်း", + "1000000-count-other": "0သန်း", + "10000000-count-other": "0ကုဋေ", + "100000000-count-other": "00ကုဋေ", + "1000000000-count-other": "ကုဋေ000", + "10000000000-count-other": "ကုဋေ0ထ", + "100000000000-count-other": "ကုဋေ0သ", + "1000000000000-count-other": "ဋေ0သိန်း", + "10000000000000-count-other": "ဋေ0သန်း", + "100000000000000-count-other": "0ကောဋိ" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "scientificFormats-numberSystem-mymr": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "percentFormats-numberSystem-mymr": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "¤ #,##0.00", + "short": { + "standard": { + "1000-count-other": "¤ 0ထောင်", + "10000-count-other": "¤ 0သောင်း", + "100000-count-other": "¤ 0သိန်း", + "1000000-count-other": "¤ 0သန်း", + "10000000-count-other": "¤ 0ကုဋေ", + "100000000-count-other": "¤ 00ကုဋေ", + "1000000000-count-other": "¤ ကုဋေ000", + "10000000000-count-other": "¤ ကုဋေ0000", + "100000000000-count-other": "¤ ကုဋေ0သောင်း", + "1000000000000-count-other": "¤ ကုဋေ0သိန်း", + "10000000000000-count-other": "¤ ကုဋေ0သန်း", + "100000000000000-count-other": "¤ 0ကောဋိ" + } + }, + "unitPattern-count-other": "{1} {0}" + }, + "currencyFormats-numberSystem-mymr": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "¤ #,##0.00", + "short": { + "standard": { + "1000-count-other": "¤ 0ထောင်", + "10000-count-other": "¤ 0သောင်း", + "100000-count-other": "¤ 0သိန်း", + "1000000-count-other": "¤ 0သန်း", + "10000000-count-other": "¤ 0ကုဋေ", + "100000000-count-other": "¤ 00ကုဋေ", + "1000000000-count-other": "¤ ကုဋေ000", + "10000000000-count-other": "¤ ကုဋေ0000", + "100000000000-count-other": "¤ ကုဋေ0သောင်း", + "1000000000000-count-other": "¤ ကုဋေ0သိန်း", + "10000000000000-count-other": "¤ ကုဋေ0သန်း", + "100000000000000-count-other": "¤ 0ကောဋိ" + } + }, + "unitPattern-count-other": "{1} {0}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0} နှင့်အထက်", + "atMost": "≤{0}", + "range": "{0} - {1}" + }, + "miscPatterns-numberSystem-mymr": { + "approximately": "~{0}", + "atLeast": "{0} နှင့်အထက်", + "atMost": "≤{0}", + "range": "{0} - {1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-other": "{0} ရက်", + "other": "{0} အုပ်မြောက်" + } + } + } + } +} From 53ec0263c6d4edda84b448938bcccf9848610315 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 26 Feb 2021 16:27:54 -0600 Subject: [PATCH 03/18] Checkpoint --- Cargo.lock | 12 + components/decimal/src/provider.rs | 5 +- components/provider_cldr/Cargo.toml | 1 + components/provider_cldr/src/error.rs | 26 +- .../provider_cldr/src/transform/numbers.rs | 278 ------------------ .../src/transform/numbers/cldr_serde.rs | 147 +++++++++ .../src/transform/numbers/decimal_pattern.rs | 45 +++ .../src/transform/numbers/mod.rs | 201 +++++++++++++ 8 files changed, 432 insertions(+), 283 deletions(-) delete mode 100644 components/provider_cldr/src/transform/numbers.rs create mode 100644 components/provider_cldr/src/transform/numbers/cldr_serde.rs create mode 100644 components/provider_cldr/src/transform/numbers/decimal_pattern.rs create mode 100644 components/provider_cldr/src/transform/numbers/mod.rs diff --git a/Cargo.lock b/Cargo.lock index dccf2bcac2f..2ca0e5f5da8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -913,6 +913,7 @@ dependencies = [ "mktemp", "reqwest", "serde", + "serde-aux", "serde-tuple-vec-map", "serde_json", "smallstr", @@ -1904,6 +1905,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-aux" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162d500b846a7b331e583abaaa9c5c63c5777aa515dda3567c410ba243ce8be" +dependencies = [ + "chrono", + "serde", + "serde_json", +] + [[package]] name = "serde-tuple-vec-map" version = "1.0.0" diff --git a/components/decimal/src/provider.rs b/components/decimal/src/provider.rs index 3b30dca6583..dc50e52958b 100644 --- a/components/decimal/src/provider.rs +++ b/components/decimal/src/provider.rs @@ -2,7 +2,7 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). -type SmallString8 = smallstr::SmallString<[u8; 8]>; +pub type SmallString8 = smallstr::SmallString<[u8; 8]>; pub mod key { use icu_provider::{resource::ResourceKey, resource_key}; @@ -63,4 +63,7 @@ pub struct DecimalSymbolsV1 { /// Settings used to determine where to place groups in the integer part of the number. pub grouping_sizes: GroupingSizesV1, + + /// Zero digit for the current numbering system. + pub zero_digit: char, } diff --git a/components/provider_cldr/Cargo.toml b/components/provider_cldr/Cargo.toml index 7c792674373..b43b565319f 100644 --- a/components/provider_cldr/Cargo.toml +++ b/components/provider_cldr/Cargo.toml @@ -35,6 +35,7 @@ icu_locale_canonicalizer = { version = "0.1", path = "../locale_canonicalizer" } icu_decimal = { version = "0.1", path = "../decimal" } json = "0.12" serde = { version = "1.0", features = ["derive"] } +serde-aux = "2.1.1" serde_json = "1.0" serde-tuple-vec-map = "1.0" smallstr = { version = "0.2", features = ["serde"] } diff --git a/components/provider_cldr/src/error.rs b/components/provider_cldr/src/error.rs index 856931a563c..7aaaa1eace5 100644 --- a/components/provider_cldr/src/error.rs +++ b/components/provider_cldr/src/error.rs @@ -1,6 +1,7 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +use icu_locid::LanguageIdentifier; use std::error; use std::fmt; use std::path::{Path, PathBuf}; @@ -13,6 +14,7 @@ use crate::download; pub enum Error { Io(std::io::Error, Option), Json(serde_json::error::Error, Option), + Custom(String, Option), MissingSource(MissingSourceError), #[cfg(feature = "download")] Download(download::Error), @@ -46,6 +48,22 @@ impl> From<(serde_json::error::Error, P)> for Error { } } +/// To help with debugging, string errors should be paired with a locale. +/// If a path is unavailable, create the error directly: `Error::Custom(err, None)` +impl> From<(String, L)> for Error { + fn from(pieces: (String, L)) -> Self { + Self::Custom(pieces.0, Some(pieces.1.as_ref().clone())) + } +} + +/// To help with debugging, string errors should be paired with a locale. +/// If a path is unavailable, create the error directly: `Error::Custom(err, None)` +impl> From<(&'static str, L)> for Error { + fn from(pieces: (&'static str, L)) -> Self { + Self::Custom(pieces.0.to_string(), Some(pieces.1.as_ref().clone())) + } +} + impl From for Error { fn from(err: MissingSourceError) -> Self { Self::MissingSource(err) @@ -67,10 +85,10 @@ impl fmt::Display for Error { match self { Self::Io(err, Some(path)) => write!(f, "{}: {:?}", err, path), Self::Io(err, None) => err.fmt(f), - Self::Json(err, Some(filename)) => { - write!(f, "JSON parse error: {}: {:?}", err, filename) - } - Self::Json(err, None) => write!(f, "JSON parse error: {}", err), + Self::Json(err, Some(path)) => write!(f, "JSON error: {}: {:?}", err, path), + Self::Json(err, None) => write!(f, "JSON error: {}", err), + Self::Custom(s, Some(langid)) => write!(f, "{}: {:?}", s, langid), + Self::Custom(s, None) => write!(f, "{}", s), Self::MissingSource(err) => err.fmt(f), #[cfg(feature = "download")] Self::Download(err) => err.fmt(f), diff --git a/components/provider_cldr/src/transform/numbers.rs b/components/provider_cldr/src/transform/numbers.rs deleted file mode 100644 index b8698d7e83c..00000000000 --- a/components/provider_cldr/src/transform/numbers.rs +++ /dev/null @@ -1,278 +0,0 @@ -// This file is part of ICU4X. For terms of use, please see the file -// called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). - -use crate::cldr_langid::CldrLangID; -use crate::error::Error; -use crate::reader::{get_subdirectories, open_reader}; -use crate::CldrPaths; -use icu_decimal::provider::*; -use icu_provider::prelude::*; -use std::borrow::Cow; -use std::convert::TryFrom; - -/// All keys that this module is able to produce. -pub const ALL_KEYS: [ResourceKey; 1] = [ - key::SYMBOLS_V1, // -]; - -/// A data provider reading from CLDR JSON plural rule files. -#[derive(PartialEq, Debug)] -pub struct NumbersProvider { - data: Vec<(CldrLangID, cldr_json::LangNumbers)>, -} - -impl TryFrom<&dyn CldrPaths> for NumbersProvider { - type Error = Error; - fn try_from(cldr_paths: &dyn CldrPaths) -> Result { - let mut data = vec![]; - - let path = cldr_paths.cldr_numbers()?.join("main"); - - let locale_dirs = get_subdirectories(&path)?; - - for dir in locale_dirs { - let path = dir.join("numbers.json"); - - let mut resource: cldr_json::Resource = - serde_json::from_reader(open_reader(&path)?).map_err(|e| (e, path))?; - data.append(&mut resource.main.0); - } - - Ok(Self { data }) - } -} - -impl TryFrom<&str> for NumbersProvider { - type Error = Error; - fn try_from(input: &str) -> Result { - let mut data = vec![]; - - let mut resource: cldr_json::Resource = - serde_json::from_str(input).map_err(|e| Error::Json(e, None))?; - data.append(&mut resource.main.0); - - Ok(Self { data }) - } -} - -impl KeyedDataProvider for NumbersProvider { - fn supports_key(resc_key: &ResourceKey) -> Result<(), DataError> { - if resc_key.category != ResourceCategory::Decimal { - return Err((&resc_key.category).into()); - } - if resc_key.version != 1 { - return Err(resc_key.into()); - } - Ok(()) - } -} - -impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { - fn load_payload( - &self, - req: &DataRequest, - ) -> Result, DataError> { - NumbersProvider::supports_key(&req.resource_path.key)?; - let cldr_langid: CldrLangID = req.try_langid()?.clone().into(); - let numbers = match self - .data - .binary_search_by_key(&&cldr_langid, |(lid, _)| lid) - { - Ok(idx) => &self.data[idx].1.numbers, - Err(_) => return Err(DataError::UnavailableResourceOptions(req.clone())), - }; - Ok(DataResponse { - metadata: DataResponseMetadata { - data_langid: req.resource_path.options.langid.clone(), - }, - payload: Some(Cow::Owned(DecimalSymbolsV1::try_from(numbers)?)), - }) - } -} - -icu_provider::impl_erased!(NumbersProvider, 'd); - -impl<'d> IterableDataProvider<'d> for NumbersProvider { - fn supported_options_for_key( - &self, - resc_key: &ResourceKey, - ) -> Result>, DataError> { - unimplemented!() - } -} - -impl TryFrom<&cldr_json::Numbers> for DecimalSymbolsV1 { - type Error = DataError; - - fn try_from(other: &cldr_json::Numbers) -> Result { - // TODO(#510): Select from non-default numbering systems - let symbols: cldr_json::Symbols = serde_json::from_value( - other - .extra - .get(&format!( - "symbols-numberSystem-{}", - other.default_numbering_system - )) - .ok_or("Could not find symbols for default numbering system")? - .clone(), - ) - .map_err(DataError::new_resc_error)?; - let formats: cldr_json::DecimalFormats = serde_json::from_value( - other - .extra - .get(&format!( - "decimalFormats-numberSystem-{}", - other.default_numbering_system - )) - .ok_or("Could not find formats for default numbering system")? - .clone(), - ) - .map_err(DataError::new_resc_error)?; - let parsed_pattern: helpers::DecimalPatternParseResult = formats.standard.parse()?; - - Ok(Self { - minus_sign_affixes: parsed_pattern.localize_sign(&symbols.minus_sign), - plus_sign_affixes: parsed_pattern.localize_sign(&symbols.plus_sign), - decimal_separator: symbols.decimal.into(), - grouping_separator: symbols.group.into(), - grouping_sizes: GroupingSizesV1 { - primary: parsed_pattern.primary_grouping, - secondary: parsed_pattern.secondary_grouping, - min_grouping: other.minimum_grouping_digits, - }, - }) - } -} - -/// Serde structs for the CLDR JSON dates files. -pub(self) mod cldr_json { - use crate::cldr_langid::CldrLangID; - use serde::Deserialize; - use serde_json::Value; - use std::collections::HashMap; - use tinystr::TinyStr8; - - #[derive(PartialEq, Debug, Deserialize)] - pub struct Symbols { - // This list is not comprehensive; add more fields when needed - pub decimal: String, - pub group: String, - #[serde(rename = "minusSign")] - pub minus_sign: String, - #[serde(rename = "plusSign")] - pub plus_sign: String, - } - - #[derive(PartialEq, Debug, Deserialize)] - pub struct DecimalFormats { - pub standard: String, - } - - #[derive(PartialEq, Debug, Deserialize)] - pub struct Numbers { - #[serde(rename = "defaultNumberingSystem")] - pub default_numbering_system: TinyStr8, - #[serde(rename = "minimumGroupingDigits")] - pub minimum_grouping_digits: u8, - #[serde(flatten)] - pub extra: HashMap, - } - - #[derive(PartialEq, Debug, Deserialize)] - pub struct LangNumbers { - pub numbers: Numbers, - } - - #[derive(PartialEq, Debug, Deserialize)] - pub struct LangData(#[serde(with = "tuple_vec_map")] pub(crate) Vec<(CldrLangID, LangNumbers)>); - - #[derive(PartialEq, Debug, Deserialize)] - pub struct Resource { - pub main: LangData, - } -} - -/// Helper functions for the transformation -pub(self) mod helpers { - use super::*; - use std::str::FromStr; - type SmallString8 = smallstr::SmallString<[u8; 8]>; - - pub struct DecimalPatternParseResult { - pub unsigned_affixes: (SmallString8, SmallString8), - pub signed_affixes: Option<(SmallString8, SmallString8)>, - pub primary_grouping: u8, - pub secondary_grouping: u8, - pub min_fraction_digits: u8, - pub max_fraction_digits: u8, - } - - impl FromStr for DecimalPatternParseResult { - type Err = &'static str; - - fn from_str(pattern: &str) -> Result { - // Example patterns: - // #,##,##0.### - // #,##0.00;#,##0.00- - // TODO - Ok(Self { - unsigned_affixes: ("".into(), "".into()), - signed_affixes: None, - primary_grouping: 3, - secondary_grouping: 3, - min_fraction_digits: 0, - max_fraction_digits: 3, - }) - } - } - - impl DecimalPatternParseResult { - pub fn localize_sign(&self, sign_str: &str) -> AffixesV1 { - // UTS 35: the absence of a negative pattern means a single prefixed sign - let signed_affixes = self - .signed_affixes.clone() - .unwrap_or_else(|| ("-".into(), "".into())); - AffixesV1 { - prefix: signed_affixes.0.replace("-", sign_str).into(), - suffix: signed_affixes.1.replace("-", sign_str).into(), - } - } - } -} - -#[test] -fn test_basic() { - use icu_locid_macros::langid; - use std::borrow::Cow; - - let json_str = std::fs::read_to_string("tests/testdata/my-numbers.json").unwrap(); - let provider = NumbersProvider::try_from(json_str.as_str()).unwrap(); - - println!("{:?}", provider); - - let my_decimal: Cow = provider - .load_payload(&DataRequest { - resource_path: ResourcePath { - key: key::SYMBOLS_V1, - options: ResourceOptions { - variant: None, - langid: Some(langid!("my")), - }, - }, - }) - .unwrap() - .take_payload() - .unwrap(); - - /* - assert_eq!("srpna", cs_dates.symbols.months.format.wide.0[7]); - - assert_eq!( - "po", - cs_dates.symbols.weekdays.format.short.as_ref().unwrap().0[1] - ); - - assert_eq!("d. M. y", cs_dates.patterns.date.medium); - */ -} diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs new file mode 100644 index 00000000000..f27599b0a93 --- /dev/null +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -0,0 +1,147 @@ +use crate::cldr_langid::CldrLangID; +use serde::Deserialize; +use serde_aux::prelude::*; +use std::collections::HashMap; +use tinystr::{TinyStr8, TinyStrAuto}; + +pub type SmallString8 = smallstr::SmallString<[u8; 8]>; + +pub mod numbers_json { + use super::*; + + use serde::de::{Deserialize, Deserializer, Error, MapAccess, Unexpected, Visitor}; + + #[derive(PartialEq, Debug, Deserialize)] + pub struct Symbols { + // This list is not comprehensive; add more fields when needed + pub decimal: SmallString8, + pub group: SmallString8, + #[serde(rename = "minusSign")] + pub minus_sign: SmallString8, + #[serde(rename = "plusSign")] + pub plus_sign: SmallString8, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct DecimalFormats { + pub standard: String, + } + + #[derive(PartialEq, Debug, Default)] + pub struct NumberingSystemData { + /// Map from numbering system to symbols + pub symbols: HashMap, + /// Map from numbering system to decimal formats + pub formats: HashMap, + } + + pub struct NumberingSystemDataVisitor; + + impl<'de> Visitor<'de> for NumberingSystemDataVisitor { + type Value = NumberingSystemData; + + // Format a message stating what data this Visitor expects to receive. + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str("formatting data by numbering system") + } + + fn visit_map(self, mut access: M) -> Result + where + M: MapAccess<'de>, + { + let mut result = NumberingSystemData::default(); + while let Some(key) = access.next_key::()? { + // Key is of the form: "symbols-numberSystem-latn" + let mut key_it = key.split('-'); + let stype = key_it.next(); + let numsys: Option> = key_it.skip(1).next().map(|s| { + s.parse().map_err(|_| { + M::Error::invalid_value( + Unexpected::Str(&key), + &"numsys to be valid TinyStr8", + ) + }) + }); + match (stype, numsys) { + (Some("symbols"), Some(numsys)) => { + let value: Symbols = access.next_value()?; + result.symbols.insert(numsys?, value); + } + (Some("decimalFormats"), Some(numsys)) => { + let value: DecimalFormats = access.next_value()?; + result.formats.insert(numsys?, value); + } + _ => { + // not symbols or decimalFormats: ignore silently + } + } + } + Ok(result) + } + } + + impl<'de> Deserialize<'de> for NumberingSystemData { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_map(NumberingSystemDataVisitor) + } + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct Numbers { + #[serde(rename = "defaultNumberingSystem")] + pub default_numbering_system: TinyStr8, + #[serde(rename = "minimumGroupingDigits")] + #[serde(deserialize_with = "deserialize_number_from_string")] + pub minimum_grouping_digits: u8, + #[serde(flatten)] + pub numsys_data: NumberingSystemData, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct LangNumbers { + pub numbers: Numbers, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct LangData(#[serde(with = "tuple_vec_map")] pub(crate) Vec<(CldrLangID, LangNumbers)>); + + #[derive(PartialEq, Debug, Deserialize)] + pub struct Resource { + pub main: LangData, + } +} + +pub mod numbering_systems_json { + use super::*; + + #[derive(PartialEq, Debug, Deserialize)] + #[serde(rename_all = "lowercase")] + pub enum NumberingSystemType { + Numeric, + Algorithmic, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct NumberingSystem { + #[serde(rename = "_type")] + pub nstype: NumberingSystemType, + #[serde(rename = "_digits")] + pub digits: Option, + #[serde(rename = "_rules")] + pub rules: Option, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct SupplementalData { + #[serde(rename = "numberingSystems")] + pub numbering_systems: HashMap, + } + + #[derive(PartialEq, Debug, Deserialize)] + pub struct Resource { + pub supplemental: SupplementalData, + } +} diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs new file mode 100644 index 00000000000..93a2073f711 --- /dev/null +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -0,0 +1,45 @@ +use std::str::FromStr; +type SmallString8 = smallstr::SmallString<[u8; 8]>; +use icu_decimal::provider::AffixesV1; + +pub struct DecimalPatternParseResult { + pub unsigned_affixes: (SmallString8, SmallString8), + pub signed_affixes: Option<(SmallString8, SmallString8)>, + pub primary_grouping: u8, + pub secondary_grouping: u8, + pub min_fraction_digits: u8, + pub max_fraction_digits: u8, +} + +impl FromStr for DecimalPatternParseResult { + type Err = &'static str; + + fn from_str(pattern: &str) -> Result { + // Example patterns: + // #,##,##0.### + // #,##0.00;#,##0.00- + // TODO + Ok(Self { + unsigned_affixes: ("".into(), "".into()), + signed_affixes: None, + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }) + } +} + +impl DecimalPatternParseResult { + pub fn localize_sign(&self, sign_str: &str) -> AffixesV1 { + // UTS 35: the absence of a negative pattern means a single prefixed sign + let signed_affixes = self + .signed_affixes + .clone() + .unwrap_or_else(|| ("-".into(), "".into())); + AffixesV1 { + prefix: signed_affixes.0.replace("-", sign_str).into(), + suffix: signed_affixes.1.replace("-", sign_str).into(), + } + } +} diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs new file mode 100644 index 00000000000..026f8f380c7 --- /dev/null +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -0,0 +1,201 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + +use crate::cldr_langid::CldrLangID; +use crate::error::Error; +use crate::reader::{get_subdirectories, open_reader}; +use crate::CldrPaths; +use icu_decimal::provider::*; +use icu_provider::prelude::*; +use std::borrow::Cow; +use std::convert::TryFrom; +use std::path::Path; + +mod cldr_serde; +mod decimal_pattern; + +/// All keys that this module is able to produce. +pub const ALL_KEYS: [ResourceKey; 1] = [ + key::SYMBOLS_V1, // +]; + +/// A data provider reading from CLDR JSON plural rule files. +#[derive(PartialEq, Debug)] +pub struct NumbersProvider { + data: Vec<(CldrLangID, cldr_serde::numbers_json::LangNumbers)>, +} + +impl TryFrom<&dyn CldrPaths> for NumbersProvider { + type Error = Error; + fn try_from(cldr_paths: &dyn CldrPaths) -> Result { + let mut data = vec![]; + + let path = cldr_paths.cldr_numbers()?.join("main"); + + let locale_dirs = get_subdirectories(&path)?; + + for dir in locale_dirs { + let path = dir.join("numbers.json"); + + let mut resource: cldr_serde::numbers_json::Resource = + serde_json::from_reader(open_reader(&path)?).map_err(|e| (e, path))?; + data.append(&mut resource.main.0); + } + + Ok(Self { data }) + } +} + +impl TryFrom<&str> for NumbersProvider { + type Error = Error; + fn try_from(input: &str) -> Result { + let mut data = vec![]; + + let mut resource: cldr_serde::numbers_json::Resource = + serde_json::from_str(input).map_err(|e| Error::Json(e, None))?; + data.append(&mut resource.main.0); + + Ok(Self { data }) + } +} + +impl KeyedDataProvider for NumbersProvider { + fn supports_key(resc_key: &ResourceKey) -> Result<(), DataError> { + if resc_key.category != ResourceCategory::Decimal { + return Err((&resc_key.category).into()); + } + if resc_key.version != 1 { + return Err(resc_key.into()); + } + Ok(()) + } +} + +impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { + fn load_payload( + &self, + req: &DataRequest, + ) -> Result, DataError> { + NumbersProvider::supports_key(&req.resource_path.key)?; + let langid = req.try_langid()?; + let cldr_langid: CldrLangID = langid.clone().into(); + let numbers = match self + .data + .binary_search_by_key(&&cldr_langid, |(lid, _)| lid) + { + Ok(idx) => &self.data[idx].1.numbers, + Err(_) => return Err(DataError::UnavailableResourceOptions(req.clone())), + }; + Ok(DataResponse { + metadata: DataResponseMetadata { + data_langid: req.resource_path.options.langid.clone(), + }, + payload: Some(Cow::Owned( + DecimalSymbolsV1::try_from(numbers) + .map_err(|s| Error::Custom(s.to_string(), Some(langid.clone()))) + .map_err(DataError::new_resc_error)?, + )), + }) + } +} + +icu_provider::impl_erased!(NumbersProvider, 'd); + +impl<'d> IterableDataProvider<'d> for NumbersProvider { + fn supported_options_for_key( + &self, + resc_key: &ResourceKey, + ) -> Result>, DataError> { + unimplemented!() + } +} + +impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { + type Error = &'static str; + + fn try_from(other: &cldr_serde::numbers_json::Numbers) -> Result { + // TODO(#510): Select from non-default numbering systems + // let symbols: cldr_serde::numbers_json::Symbols = serde_json::from_value( + // other + // .symbols_for(other.default_numbering_system) + // .ok_or("Could not find symbols for default numbering system")? + // .clone(), + // ) + // .map_err(DataError::new_resc_error)?; + // let formats: cldr_serde::numbers_json::DecimalFormats = serde_json::from_value( + // other + // .extra + // .get(&format!( + // "decimalFormats-numberSystem-{}", + // other.default_numbering_system + // )) + // .ok_or("Could not find formats for default numbering system")? + // .clone(), + // ) + // .map_err(DataError::new_resc_error)?; + let symbols = other + .numsys_data + .symbols + .get(&other.default_numbering_system) + .ok_or("Could not find symbols for default numbering system")?; + let formats = other + .numsys_data + .formats + .get(&other.default_numbering_system) + .ok_or("Could not find formats for default numbering system")?; + let parsed_pattern: decimal_pattern::DecimalPatternParseResult = + formats.standard.parse()?; + + Ok(Self { + minus_sign_affixes: parsed_pattern.localize_sign(&symbols.minus_sign), + plus_sign_affixes: parsed_pattern.localize_sign(&symbols.plus_sign), + decimal_separator: symbols.decimal.clone(), + grouping_separator: symbols.group.clone(), + grouping_sizes: GroupingSizesV1 { + primary: parsed_pattern.primary_grouping, + secondary: parsed_pattern.secondary_grouping, + min_grouping: other.minimum_grouping_digits, + }, + zero_digit: '0', // TODO + }) + } +} + +#[test] +fn test_basic() { + use icu_locid_macros::langid; + use std::borrow::Cow; + + let json_str = std::fs::read_to_string("tests/testdata/my-numbers.json").unwrap(); + let provider = NumbersProvider::try_from(json_str.as_str()).unwrap(); + + println!("{:?}", provider); + + let my_decimal: Cow = provider + .load_payload(&DataRequest { + resource_path: ResourcePath { + key: key::SYMBOLS_V1, + options: ResourceOptions { + variant: None, + langid: Some(langid!("my")), + }, + }, + }) + .unwrap() + .take_payload() + .unwrap(); + + println!("{:?}", my_decimal); + + /* + assert_eq!("srpna", cs_dates.symbols.months.format.wide.0[7]); + + assert_eq!( + "po", + cs_dates.symbols.weekdays.format.short.as_ref().unwrap().0[1] + ); + + assert_eq!("d. M. y", cs_dates.patterns.date.medium); + */ +} From ac6701ff3919dfc705fcce536f5879fcf621606c Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 26 Feb 2021 19:39:05 -0600 Subject: [PATCH 04/18] Adding CLDR JSON data to testdata --- Cargo.lock | 86 +- components/provider_cldr/src/cldr_paths.rs | 44 +- .../src/download/cldr_allinone.rs | 56 +- components/provider_cldr/src/lib.rs | 1 + .../src/transform/numbers/decimal_pattern.rs | 2 +- .../src/transform/numbers/mod.rs | 42 +- .../tests/testdata/my-numbers.json | 213 -- resources/testdata/Cargo.toml | 20 +- .../cldr-core/supplemental/likelySubtags.json | 1867 +++++++++++++++++ .../supplemental/numberingSystems.json | 350 +++ .../cldr/cldr-core/supplemental/ordinals.json | 377 ++++ .../cldr/cldr-core/supplemental/plurals.json | 911 ++++++++ .../main/ar-EG/ca-gregorian.json | 558 +++++ .../cldr-dates-full/main/ar/ca-gregorian.json | 557 +++++ .../cldr-dates-full/main/bn/ca-gregorian.json | 540 +++++ .../main/ccp/ca-gregorian.json | 540 +++++ .../main/en-ZA/ca-gregorian.json | 551 +++++ .../cldr-dates-full/main/en/ca-gregorian.json | 549 +++++ .../main/es-AR/ca-gregorian.json | 562 +++++ .../cldr-dates-full/main/es/ca-gregorian.json | 560 +++++ .../cldr-dates-full/main/fr/ca-gregorian.json | 537 +++++ .../cldr-dates-full/main/ja/ca-gregorian.json | 551 +++++ .../cldr-dates-full/main/ru/ca-gregorian.json | 546 +++++ .../main/sr-Cyrl/ca-gregorian.json | 545 +++++ .../main/sr-Latn/ca-gregorian.json | 545 +++++ .../cldr-dates-full/main/sr/ca-gregorian.json | 544 +++++ .../cldr-dates-full/main/th/ca-gregorian.json | 580 +++++ .../cldr-dates-full/main/tr/ca-gregorian.json | 552 +++++ .../json/dates/gregory@1/en-US-posix.json | 140 -- .../data/json/dates/gregory@1/und.json | 126 -- .../testdata/src/bin/icu4x-gen-testdata.rs | 131 +- resources/testdata/src/lib.rs | 2 +- resources/testdata/src/metadata.rs | 1 + resources/testdata/src/paths.rs | 15 + resources/testdata/src/test_data_provider.rs | 4 +- 35 files changed, 12626 insertions(+), 579 deletions(-) delete mode 100644 components/provider_cldr/tests/testdata/my-numbers.json create mode 100644 resources/testdata/data/cldr/cldr-core/supplemental/likelySubtags.json create mode 100644 resources/testdata/data/cldr/cldr-core/supplemental/numberingSystems.json create mode 100644 resources/testdata/data/cldr/cldr-core/supplemental/ordinals.json create mode 100644 resources/testdata/data/cldr/cldr-core/supplemental/plurals.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/ar-EG/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/ar/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/bn/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/ccp/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/en-ZA/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/en/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/es-AR/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/es/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/fr/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/ja/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/ru/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/sr-Cyrl/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/sr-Latn/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/sr/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/th/ca-gregorian.json create mode 100644 resources/testdata/data/cldr/cldr-dates-full/main/tr/ca-gregorian.json delete mode 100644 resources/testdata/data/json/dates/gregory@1/en-US-posix.json delete mode 100644 resources/testdata/data/json/dates/gregory@1/und.json create mode 100644 resources/testdata/src/paths.rs diff --git a/Cargo.lock b/Cargo.lock index 2ca0e5f5da8..988584aa3c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,6 +15,15 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "aho-corasick" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +dependencies = [ + "memchr", +] + [[package]] name = "ansi_term" version = "0.11.0" @@ -84,7 +93,7 @@ name = "bies" version = "0.1.1" dependencies = [ "criterion", - "itertools", + "itertools 0.9.0", "num-traits", "partial-min-max", "rand 0.7.3", @@ -328,7 +337,7 @@ dependencies = [ "clap", "criterion-plot", "csv", - "itertools", + "itertools 0.9.0", "lazy_static", "num-traits", "oorandom", @@ -350,7 +359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" dependencies = [ "cast", - "itertools", + "itertools 0.9.0", ] [[package]] @@ -640,6 +649,30 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +[[package]] +name = "globset" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags", + "ignore", + "walkdir", +] + [[package]] name = "h2" version = "0.2.7" @@ -970,16 +1003,20 @@ version = "0.1.0" dependencies = [ "cargo_metadata 0.11.4", "clap", + "globwalk", "icu_locid", "icu_locid_macros", "icu_plurals", "icu_provider", "icu_provider_cldr", "icu_provider_fs", + "itertools 0.10.0", "log", "serde", "serde_json", "simple_logger", + "walkdir", + "writeable", ] [[package]] @@ -1003,6 +1040,24 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "ignore" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b287fb45c60bb826a0dc68ff08742b9d88a2fea13d6e0c286b3172065aaf878c" +dependencies = [ + "crossbeam-utils 0.8.0", + "globset", + "lazy_static", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + [[package]] name = "indexmap" version = "1.6.0" @@ -1037,6 +1092,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d572918e350e82412fe766d24b15e6682fb2ed2bbe018280caa810397cb319" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.6" @@ -1292,9 +1356,9 @@ checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" [[package]] name = "once_cell" -version = "1.4.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" +checksum = "10acf907b94fc1b1a152d08ef97e7759650268cf986bf127f387e602b02c7e5a" [[package]] name = "oorandom" @@ -1703,7 +1767,10 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" dependencies = [ + "aho-corasick", + "memchr", "regex-syntax", + "thread_local", ] [[package]] @@ -2089,6 +2156,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf63baf9f5039dadc247375c29eb13706706cfde997d0330d05aa63a77d8820" +[[package]] +name = "thread_local" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" +dependencies = [ + "once_cell", +] + [[package]] name = "time" version = "0.1.44" diff --git a/components/provider_cldr/src/cldr_paths.rs b/components/provider_cldr/src/cldr_paths.rs index 77c2a9ede8b..fe3815b6f59 100644 --- a/components/provider_cldr/src/cldr_paths.rs +++ b/components/provider_cldr/src/cldr_paths.rs @@ -21,7 +21,7 @@ pub trait CldrPaths: std::fmt::Debug { fn cldr_numbers(&self) -> Result; } -/// Implementation of `CldrPaths` for data directories already downloaded. +/// Implementation of `CldrPaths` for multiple separate local CLDR JSON directories per component. /// /// # Example /// @@ -67,3 +67,45 @@ impl Default for CldrPathsLocal { } } } + +/// Implementation of `CldrPaths` for one combined local CLDR JSON directory. +/// +/// # Example +/// +/// ``` +/// use icu_provider_cldr::CldrPathsAllInOne; +/// use icu_provider_cldr::CldrJsonDataProvider; +/// use std::path::PathBuf; +/// +/// let paths = CldrPathsAllInOne { +/// cldr_json_root: PathBuf::from("/path/to/cldr-json"), +/// suffix: "full", +/// }; +/// +/// let data_provider = CldrJsonDataProvider::new(&paths); +/// ``` +#[derive(Debug, PartialEq)] +pub struct CldrPathsAllInOne { + /// Path to the CLDR JSON root directory + pub cldr_json_root: PathBuf, + /// CLDR JSON directory suffix: probably either "modern" or "full" + pub suffix: &'static str, +} + +impl CldrPaths for CldrPathsAllInOne { + fn cldr_core(&self) -> Result { + Ok(self.cldr_json_root.clone().join("cldr-core")) + } + fn cldr_dates(&self) -> Result { + Ok(self + .cldr_json_root + .clone() + .join(format!("cldr-dates-{}", self.suffix))) + } + fn cldr_numbers(&self) -> Result { + Ok(self + .cldr_json_root + .clone() + .join(format!("cldr-numbers-{}", self.suffix))) + } +} diff --git a/components/provider_cldr/src/download/cldr_allinone.rs b/components/provider_cldr/src/download/cldr_allinone.rs index f406adc383d..b3beabb649b 100644 --- a/components/provider_cldr/src/download/cldr_allinone.rs +++ b/components/provider_cldr/src/download/cldr_allinone.rs @@ -7,7 +7,7 @@ use super::error::Error; use super::io_util; -use crate::CldrPaths; +use crate::CldrPathsAllInOne; use std::path::PathBuf; /// Implementation of CldrPaths that downloads CLDR data directories on demand. @@ -26,15 +26,18 @@ use std::path::PathBuf; /// use icu_locid_macros::langid; /// use std::path::PathBuf; /// -/// let paths = CldrAllInOneDownloader::try_from_github_tag("38.1.0") +/// let downloader = CldrAllInOneDownloader::try_new_from_github_tag("38.1.0") /// .expect("Cache directory not found"); /// -/// fn demo(paths: &dyn CldrPaths) { +/// fn demo(downloader: &CldrAllInOneDownloader) { /// use std::borrow::Cow; /// use std::convert::TryFrom; /// use icu_provider::prelude::*; /// -/// let data_provider = PluralsProvider::try_from(paths) +/// let paths = downloader.download() +/// .expect("The data should download successfully"); +/// +/// let data_provider = PluralsProvider::try_from(&paths as &dyn CldrPaths) /// .expect("The data should be well-formed after downloading"); /// /// let data: Cow = data_provider @@ -53,8 +56,8 @@ use std::path::PathBuf; /// assert_eq!(data.few, Some(Cow::Borrowed("n % 10 = 3 and n % 100 != 13"))); /// } /// -/// // Calling demo(&paths) will cause the data to actually get downloaded. -/// //demo(&paths); +/// // Calling demo(&downloader) will cause the data to actually get downloaded. +/// //demo(&downloader); /// ``` #[derive(Debug)] pub struct CldrAllInOneDownloader { @@ -63,48 +66,33 @@ pub struct CldrAllInOneDownloader { /// The URL to the remote zip file pub url: String, - - /// CLDR JSON directory suffix: probably either "modern" or "full" - pub suffix: String, -} - -// TODO(#297): Implement this async. -impl CldrPaths for CldrAllInOneDownloader { - fn cldr_core(&self) -> Result { - self.download_and_unzip() - .map(|p| p.join("cldr-core".to_string())) - } - fn cldr_dates(&self) -> Result { - self.download_and_unzip() - .map(|p| p.join(format!("cldr-dates-{}", self.suffix))) - } - fn cldr_numbers(&self) -> Result { - self.download_and_unzip() - .map(|p| p.join(format!("cldr-numbers-{}", self.suffix))) - } } impl CldrAllInOneDownloader { /// Creates a CldrAllInOneDownloader that downloads files to the system cache directory /// as determined by dirs::cache_dir(). /// - /// github_tag should be a tag in the CLDR JSON repositories, such as "36.0.0": - /// https://github.com/unicode-cldr/cldr-core/tags - pub fn try_from_github_tag(github_tag: &str) -> Result { + /// github_tag should be a tag in the CLDR JSON repositories, such as "38.1.0": + /// https://github.com/unicode-cldr/cldr-json/tags + pub fn try_new_from_github_tag(github_tag: &str) -> Result { Ok(Self { cache_dir: dirs::cache_dir() - .ok_or(Error::NoCacheDir)? - .join("icu4x") - .join("cldr"), + .ok_or(Error::NoCacheDir)? + .join("icu4x") + .join("cldr"), url: format!( "https://github.com/unicode-org/cldr-json/releases/download/{}/cldr-{}-json-full.zip", github_tag, github_tag ), - suffix: "full".to_string(), }) } - fn download_and_unzip(&self) -> Result { - io_util::download_and_unzip(&self.url, &self.cache_dir).map_err(|e| e.into()) + pub fn download(&self) -> Result { + // TODO(#297): Implement this async. + let downloaded = io_util::download_and_unzip(&self.url, &self.cache_dir)?; + Ok(CldrPathsAllInOne { + cldr_json_root: downloaded, + suffix: "full", + }) } } diff --git a/components/provider_cldr/src/lib.rs b/components/provider_cldr/src/lib.rs index 2bef9aa2ead..2ae734d0f0b 100644 --- a/components/provider_cldr/src/lib.rs +++ b/components/provider_cldr/src/lib.rs @@ -32,6 +32,7 @@ pub mod transform; pub mod download; pub use cldr_paths::CldrPaths; +pub use cldr_paths::CldrPathsAllInOne; pub use cldr_paths::CldrPathsLocal; pub use error::Error as CldrError; pub use transform::get_all_resc_keys; diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs index 93a2073f711..7252e73f525 100644 --- a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -14,7 +14,7 @@ pub struct DecimalPatternParseResult { impl FromStr for DecimalPatternParseResult { type Err = &'static str; - fn from_str(pattern: &str) -> Result { + fn from_str(_pattern: &str) -> Result { // Example patterns: // #,##,##0.### // #,##0.00;#,##0.00- diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index 026f8f380c7..b460ec97d7a 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -10,14 +10,13 @@ use icu_decimal::provider::*; use icu_provider::prelude::*; use std::borrow::Cow; use std::convert::TryFrom; -use std::path::Path; mod cldr_serde; mod decimal_pattern; /// All keys that this module is able to produce. -pub const ALL_KEYS: [ResourceKey; 1] = [ - key::SYMBOLS_V1, // +pub const ALL_KEYS: [ResourceKey; 0] = [ + // key::SYMBOLS_V1, // ]; /// A data provider reading from CLDR JSON plural rule files. @@ -47,19 +46,6 @@ impl TryFrom<&dyn CldrPaths> for NumbersProvider { } } -impl TryFrom<&str> for NumbersProvider { - type Error = Error; - fn try_from(input: &str) -> Result { - let mut data = vec![]; - - let mut resource: cldr_serde::numbers_json::Resource = - serde_json::from_str(input).map_err(|e| Error::Json(e, None))?; - data.append(&mut resource.main.0); - - Ok(Self { data }) - } -} - impl KeyedDataProvider for NumbersProvider { fn supports_key(resc_key: &ResourceKey) -> Result<(), DataError> { if resc_key.category != ResourceCategory::Decimal { @@ -105,7 +91,7 @@ icu_provider::impl_erased!(NumbersProvider, 'd); impl<'d> IterableDataProvider<'d> for NumbersProvider { fn supported_options_for_key( &self, - resc_key: &ResourceKey, + _resc_key: &ResourceKey, ) -> Result>, DataError> { unimplemented!() } @@ -116,24 +102,6 @@ impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { fn try_from(other: &cldr_serde::numbers_json::Numbers) -> Result { // TODO(#510): Select from non-default numbering systems - // let symbols: cldr_serde::numbers_json::Symbols = serde_json::from_value( - // other - // .symbols_for(other.default_numbering_system) - // .ok_or("Could not find symbols for default numbering system")? - // .clone(), - // ) - // .map_err(DataError::new_resc_error)?; - // let formats: cldr_serde::numbers_json::DecimalFormats = serde_json::from_value( - // other - // .extra - // .get(&format!( - // "decimalFormats-numberSystem-{}", - // other.default_numbering_system - // )) - // .ok_or("Could not find formats for default numbering system")? - // .clone(), - // ) - // .map_err(DataError::new_resc_error)?; let symbols = other .numsys_data .symbols @@ -167,7 +135,8 @@ fn test_basic() { use icu_locid_macros::langid; use std::borrow::Cow; - let json_str = std::fs::read_to_string("tests/testdata/my-numbers.json").unwrap(); + // let json_str = std::fs::read_to_string("tests/testdata/my-numbers.json").unwrap(); + /* let provider = NumbersProvider::try_from(json_str.as_str()).unwrap(); println!("{:?}", provider); @@ -188,7 +157,6 @@ fn test_basic() { println!("{:?}", my_decimal); - /* assert_eq!("srpna", cs_dates.symbols.months.format.wide.0[7]); assert_eq!( diff --git a/components/provider_cldr/tests/testdata/my-numbers.json b/components/provider_cldr/tests/testdata/my-numbers.json deleted file mode 100644 index 8a96936cbcd..00000000000 --- a/components/provider_cldr/tests/testdata/my-numbers.json +++ /dev/null @@ -1,213 +0,0 @@ -{ - "main": { - "my": { - "identity": { - "version": { - "_cldrVersion": "38" - }, - "language": "my" - }, - "numbers": { - "defaultNumberingSystem": "mymr", - "otherNumberingSystems": { - "native": "mymr" - }, - "minimumGroupingDigits": "1", - "symbols-numberSystem-latn": { - "decimal": ".", - "group": ",", - "list": ";", - "percentSign": "%", - "plusSign": "+", - "minusSign": "-", - "approximatelySign": "~", - "exponential": "E", - "superscriptingExponent": "×", - "perMille": "‰", - "infinity": "∞", - "nan": "ဂဏန်းမဟုတ်သော", - "timeSeparator": ":" - }, - "symbols-numberSystem-mymr": { - "decimal": ".", - "group": ",", - "list": "၊", - "percentSign": "%", - "plusSign": "+", - "minusSign": "-", - "approximatelySign": "~", - "exponential": "E", - "superscriptingExponent": "×", - "perMille": "‰", - "infinity": "∞", - "nan": "ဂဏန်းမဟုတ်သော", - "timeSeparator": ":" - }, - "decimalFormats-numberSystem-latn": { - "standard": "#,##0.###", - "long": { - "decimalFormat": { - "1000-count-other": "0ထောင်", - "10000-count-other": "0သောင်း", - "100000-count-other": "0သိန်း", - "1000000-count-other": "0သန်း", - "10000000-count-other": "0ကုဋေ", - "100000000-count-other": "00ကုဋေ", - "1000000000-count-other": "ကုဋေ000", - "10000000000-count-other": "ကုဋေ0000", - "100000000000-count-other": "ကုဋေ0သောင်း", - "1000000000000-count-other": "ကုဋေ0သိန်း", - "10000000000000-count-other": "ကုဋေ0သန်း", - "100000000000000-count-other": "0ကောဋိ" - } - }, - "short": { - "decimalFormat": { - "1000-count-other": "0ထောင်", - "10000-count-other": "0သောင်း", - "100000-count-other": "0သိန်း", - "1000000-count-other": "0သန်း", - "10000000-count-other": "0ကုဋေ", - "100000000-count-other": "00ကုဋေ", - "1000000000-count-other": "ကုဋေ000", - "10000000000-count-other": "ကုဋေ0ထ", - "100000000000-count-other": "ကုဋေ0သ", - "1000000000000-count-other": "ဋေ0သိန်း", - "10000000000000-count-other": "ဋေ0သန်း", - "100000000000000-count-other": "0ကောဋိ" - } - } - }, - "decimalFormats-numberSystem-mymr": { - "standard": "#,##0.###", - "long": { - "decimalFormat": { - "1000-count-other": "0ထောင်", - "10000-count-other": "0သောင်း", - "100000-count-other": "0သိန်း", - "1000000-count-other": "0သန်း", - "10000000-count-other": "0ကုဋေ", - "100000000-count-other": "00ကုဋေ", - "1000000000-count-other": "ကုဋေ000", - "10000000000-count-other": "ကုဋေ0000", - "100000000000-count-other": "ကုဋေ0သောင်း", - "1000000000000-count-other": "ကုဋေ0သိန်း", - "10000000000000-count-other": "ကုဋေ0သန်း", - "100000000000000-count-other": "0ကောဋိ" - } - }, - "short": { - "decimalFormat": { - "1000-count-other": "0ထောင်", - "10000-count-other": "0သောင်း", - "100000-count-other": "0သိန်း", - "1000000-count-other": "0သန်း", - "10000000-count-other": "0ကုဋေ", - "100000000-count-other": "00ကုဋေ", - "1000000000-count-other": "ကုဋေ000", - "10000000000-count-other": "ကုဋေ0ထ", - "100000000000-count-other": "ကုဋေ0သ", - "1000000000000-count-other": "ဋေ0သိန်း", - "10000000000000-count-other": "ဋေ0သန်း", - "100000000000000-count-other": "0ကောဋိ" - } - } - }, - "scientificFormats-numberSystem-latn": { - "standard": "#E0" - }, - "scientificFormats-numberSystem-mymr": { - "standard": "#E0" - }, - "percentFormats-numberSystem-latn": { - "standard": "#,##0%" - }, - "percentFormats-numberSystem-mymr": { - "standard": "#,##0%" - }, - "currencyFormats-numberSystem-latn": { - "currencySpacing": { - "beforeCurrency": { - "currencyMatch": "[[:^S:]&[:^Z:]]", - "surroundingMatch": "[:digit:]", - "insertBetween": " " - }, - "afterCurrency": { - "currencyMatch": "[[:^S:]&[:^Z:]]", - "surroundingMatch": "[:digit:]", - "insertBetween": " " - } - }, - "standard": "#,##0.00 ¤", - "accounting": "¤ #,##0.00", - "short": { - "standard": { - "1000-count-other": "¤ 0ထောင်", - "10000-count-other": "¤ 0သောင်း", - "100000-count-other": "¤ 0သိန်း", - "1000000-count-other": "¤ 0သန်း", - "10000000-count-other": "¤ 0ကုဋေ", - "100000000-count-other": "¤ 00ကုဋေ", - "1000000000-count-other": "¤ ကုဋေ000", - "10000000000-count-other": "¤ ကုဋေ0000", - "100000000000-count-other": "¤ ကုဋေ0သောင်း", - "1000000000000-count-other": "¤ ကုဋေ0သိန်း", - "10000000000000-count-other": "¤ ကုဋေ0သန်း", - "100000000000000-count-other": "¤ 0ကောဋိ" - } - }, - "unitPattern-count-other": "{1} {0}" - }, - "currencyFormats-numberSystem-mymr": { - "currencySpacing": { - "beforeCurrency": { - "currencyMatch": "[[:^S:]&[:^Z:]]", - "surroundingMatch": "[:digit:]", - "insertBetween": " " - }, - "afterCurrency": { - "currencyMatch": "[[:^S:]&[:^Z:]]", - "surroundingMatch": "[:digit:]", - "insertBetween": " " - } - }, - "standard": "#,##0.00 ¤", - "accounting": "¤ #,##0.00", - "short": { - "standard": { - "1000-count-other": "¤ 0ထောင်", - "10000-count-other": "¤ 0သောင်း", - "100000-count-other": "¤ 0သိန်း", - "1000000-count-other": "¤ 0သန်း", - "10000000-count-other": "¤ 0ကုဋေ", - "100000000-count-other": "¤ 00ကုဋေ", - "1000000000-count-other": "¤ ကုဋေ000", - "10000000000-count-other": "¤ ကုဋေ0000", - "100000000000-count-other": "¤ ကုဋေ0သောင်း", - "1000000000000-count-other": "¤ ကုဋေ0သိန်း", - "10000000000000-count-other": "¤ ကုဋေ0သန်း", - "100000000000000-count-other": "¤ 0ကောဋိ" - } - }, - "unitPattern-count-other": "{1} {0}" - }, - "miscPatterns-numberSystem-latn": { - "approximately": "~{0}", - "atLeast": "{0} နှင့်အထက်", - "atMost": "≤{0}", - "range": "{0} - {1}" - }, - "miscPatterns-numberSystem-mymr": { - "approximately": "~{0}", - "atLeast": "{0} နှင့်အထက်", - "atMost": "≤{0}", - "range": "{0} - {1}" - }, - "minimalPairs": { - "pluralMinimalPairs-count-other": "{0} ရက်", - "other": "{0} အုပ်မြောက်" - } - } - } - } -} diff --git a/resources/testdata/Cargo.toml b/resources/testdata/Cargo.toml index 3dec22cf998..8c9128bf969 100644 --- a/resources/testdata/Cargo.toml +++ b/resources/testdata/Cargo.toml @@ -88,7 +88,17 @@ locales = [ "und", ] -# Git tag or sha1 for the CLDR data used to generate the testdata +# Paths from CLDR JSON to copy into testdata. Uses gitignore-like syntax. +# The variable "$LOCALES" is replaced with the list of locales from above. +cldr_json_glob = [ + "cldr-core/supplemental/likelySubtags.json", + "cldr-core/supplemental/numberingSystems.json", + "cldr-core/supplemental/ordinals.json", + "cldr-core/supplemental/plurals.json", + "cldr-dates-full/main/$LOCALES/ca-gregorian.json" +] + +# Git tag or sha1 for the CLDR data used to generate the testdata. gitref = "38.1.0" [package.metadata.cargo-all-features] @@ -113,6 +123,10 @@ clap = { version = "2.33", optional = true } icu_provider_cldr = { version = "0.1", path = "../../components/provider_cldr", optional = true, features = ["download"] } log = { version = "0.4", optional = true } simple_logger = { version = "1.11", optional = true } +globwalk = { version = "0.8", optional = true } +walkdir = { version = "2", optional = true } +itertools = { version = "0.10", optional = true } +writeable = { version = "0.2", path = "../../utils/writeable", optional = true } [dev-dependencies] icu_locid_macros = { version = "0.1", path = "../../components/locid/macros" } @@ -128,6 +142,10 @@ icu4x-gen-testdata = [ "simple_logger", "icu_provider_fs/export", "metadata", + "globwalk", + "walkdir", + "itertools", + "writeable", ] [[bin]] diff --git a/resources/testdata/data/cldr/cldr-core/supplemental/likelySubtags.json b/resources/testdata/data/cldr/cldr-core/supplemental/likelySubtags.json new file mode 100644 index 00000000000..a28bfc43470 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-core/supplemental/likelySubtags.json @@ -0,0 +1,1867 @@ +{ + "supplemental": { + "version": { + "_unicodeVersion": "13.0.0", + "_cldrVersion": "38" + }, + "likelySubtags": { + "aa": "aa-Latn-ET", + "aai": "aai-Latn-ZZ", + "aak": "aak-Latn-ZZ", + "aau": "aau-Latn-ZZ", + "ab": "ab-Cyrl-GE", + "abi": "abi-Latn-ZZ", + "abq": "abq-Cyrl-ZZ", + "abr": "abr-Latn-GH", + "abt": "abt-Latn-ZZ", + "aby": "aby-Latn-ZZ", + "acd": "acd-Latn-ZZ", + "ace": "ace-Latn-ID", + "ach": "ach-Latn-UG", + "ada": "ada-Latn-GH", + "ade": "ade-Latn-ZZ", + "adj": "adj-Latn-ZZ", + "adp": "adp-Tibt-BT", + "ady": "ady-Cyrl-RU", + "adz": "adz-Latn-ZZ", + "ae": "ae-Avst-IR", + "aeb": "aeb-Arab-TN", + "aey": "aey-Latn-ZZ", + "af": "af-Latn-ZA", + "agc": "agc-Latn-ZZ", + "agd": "agd-Latn-ZZ", + "agg": "agg-Latn-ZZ", + "agm": "agm-Latn-ZZ", + "ago": "ago-Latn-ZZ", + "agq": "agq-Latn-CM", + "aha": "aha-Latn-ZZ", + "ahl": "ahl-Latn-ZZ", + "aho": "aho-Ahom-IN", + "ajg": "ajg-Latn-ZZ", + "ak": "ak-Latn-GH", + "akk": "akk-Xsux-IQ", + "ala": "ala-Latn-ZZ", + "ali": "ali-Latn-ZZ", + "aln": "aln-Latn-XK", + "alt": "alt-Cyrl-RU", + "am": "am-Ethi-ET", + "amm": "amm-Latn-ZZ", + "amn": "amn-Latn-ZZ", + "amo": "amo-Latn-NG", + "amp": "amp-Latn-ZZ", + "an": "an-Latn-ES", + "anc": "anc-Latn-ZZ", + "ank": "ank-Latn-ZZ", + "ann": "ann-Latn-ZZ", + "any": "any-Latn-ZZ", + "aoj": "aoj-Latn-ZZ", + "aom": "aom-Latn-ZZ", + "aoz": "aoz-Latn-ID", + "apc": "apc-Arab-ZZ", + "apd": "apd-Arab-TG", + "ape": "ape-Latn-ZZ", + "apr": "apr-Latn-ZZ", + "aps": "aps-Latn-ZZ", + "apz": "apz-Latn-ZZ", + "ar": "ar-Arab-EG", + "arc": "arc-Armi-IR", + "arc-Nbat": "arc-Nbat-JO", + "arc-Palm": "arc-Palm-SY", + "arh": "arh-Latn-ZZ", + "arn": "arn-Latn-CL", + "aro": "aro-Latn-BO", + "arq": "arq-Arab-DZ", + "ars": "ars-Arab-SA", + "ary": "ary-Arab-MA", + "arz": "arz-Arab-EG", + "as": "as-Beng-IN", + "asa": "asa-Latn-TZ", + "ase": "ase-Sgnw-US", + "asg": "asg-Latn-ZZ", + "aso": "aso-Latn-ZZ", + "ast": "ast-Latn-ES", + "ata": "ata-Latn-ZZ", + "atg": "atg-Latn-ZZ", + "atj": "atj-Latn-CA", + "auy": "auy-Latn-ZZ", + "av": "av-Cyrl-RU", + "avl": "avl-Arab-ZZ", + "avn": "avn-Latn-ZZ", + "avt": "avt-Latn-ZZ", + "avu": "avu-Latn-ZZ", + "awa": "awa-Deva-IN", + "awb": "awb-Latn-ZZ", + "awo": "awo-Latn-ZZ", + "awx": "awx-Latn-ZZ", + "ay": "ay-Latn-BO", + "ayb": "ayb-Latn-ZZ", + "az": "az-Latn-AZ", + "az-Arab": "az-Arab-IR", + "az-IQ": "az-Arab-IQ", + "az-IR": "az-Arab-IR", + "az-RU": "az-Cyrl-RU", + "ba": "ba-Cyrl-RU", + "bal": "bal-Arab-PK", + "ban": "ban-Latn-ID", + "bap": "bap-Deva-NP", + "bar": "bar-Latn-AT", + "bas": "bas-Latn-CM", + "bav": "bav-Latn-ZZ", + "bax": "bax-Bamu-CM", + "bba": "bba-Latn-ZZ", + "bbb": "bbb-Latn-ZZ", + "bbc": "bbc-Latn-ID", + "bbd": "bbd-Latn-ZZ", + "bbj": "bbj-Latn-CM", + "bbp": "bbp-Latn-ZZ", + "bbr": "bbr-Latn-ZZ", + "bcf": "bcf-Latn-ZZ", + "bch": "bch-Latn-ZZ", + "bci": "bci-Latn-CI", + "bcm": "bcm-Latn-ZZ", + "bcn": "bcn-Latn-ZZ", + "bco": "bco-Latn-ZZ", + "bcq": "bcq-Ethi-ZZ", + "bcu": "bcu-Latn-ZZ", + "bdd": "bdd-Latn-ZZ", + "be": "be-Cyrl-BY", + "bef": "bef-Latn-ZZ", + "beh": "beh-Latn-ZZ", + "bej": "bej-Arab-SD", + "bem": "bem-Latn-ZM", + "bet": "bet-Latn-ZZ", + "bew": "bew-Latn-ID", + "bex": "bex-Latn-ZZ", + "bez": "bez-Latn-TZ", + "bfd": "bfd-Latn-CM", + "bfq": "bfq-Taml-IN", + "bft": "bft-Arab-PK", + "bfy": "bfy-Deva-IN", + "bg": "bg-Cyrl-BG", + "bgc": "bgc-Deva-IN", + "bgn": "bgn-Arab-PK", + "bgx": "bgx-Grek-TR", + "bhb": "bhb-Deva-IN", + "bhg": "bhg-Latn-ZZ", + "bhi": "bhi-Deva-IN", + "bhl": "bhl-Latn-ZZ", + "bho": "bho-Deva-IN", + "bhy": "bhy-Latn-ZZ", + "bi": "bi-Latn-VU", + "bib": "bib-Latn-ZZ", + "big": "big-Latn-ZZ", + "bik": "bik-Latn-PH", + "bim": "bim-Latn-ZZ", + "bin": "bin-Latn-NG", + "bio": "bio-Latn-ZZ", + "biq": "biq-Latn-ZZ", + "bjh": "bjh-Latn-ZZ", + "bji": "bji-Ethi-ZZ", + "bjj": "bjj-Deva-IN", + "bjn": "bjn-Latn-ID", + "bjo": "bjo-Latn-ZZ", + "bjr": "bjr-Latn-ZZ", + "bjt": "bjt-Latn-SN", + "bjz": "bjz-Latn-ZZ", + "bkc": "bkc-Latn-ZZ", + "bkm": "bkm-Latn-CM", + "bkq": "bkq-Latn-ZZ", + "bku": "bku-Latn-PH", + "bkv": "bkv-Latn-ZZ", + "blt": "blt-Tavt-VN", + "bm": "bm-Latn-ML", + "bmh": "bmh-Latn-ZZ", + "bmk": "bmk-Latn-ZZ", + "bmq": "bmq-Latn-ML", + "bmu": "bmu-Latn-ZZ", + "bn": "bn-Beng-BD", + "bng": "bng-Latn-ZZ", + "bnm": "bnm-Latn-ZZ", + "bnp": "bnp-Latn-ZZ", + "bo": "bo-Tibt-CN", + "boj": "boj-Latn-ZZ", + "bom": "bom-Latn-ZZ", + "bon": "bon-Latn-ZZ", + "bpy": "bpy-Beng-IN", + "bqc": "bqc-Latn-ZZ", + "bqi": "bqi-Arab-IR", + "bqp": "bqp-Latn-ZZ", + "bqv": "bqv-Latn-CI", + "br": "br-Latn-FR", + "bra": "bra-Deva-IN", + "brh": "brh-Arab-PK", + "brx": "brx-Deva-IN", + "brz": "brz-Latn-ZZ", + "bs": "bs-Latn-BA", + "bsj": "bsj-Latn-ZZ", + "bsq": "bsq-Bass-LR", + "bss": "bss-Latn-CM", + "bst": "bst-Ethi-ZZ", + "bto": "bto-Latn-PH", + "btt": "btt-Latn-ZZ", + "btv": "btv-Deva-PK", + "bua": "bua-Cyrl-RU", + "buc": "buc-Latn-YT", + "bud": "bud-Latn-ZZ", + "bug": "bug-Latn-ID", + "buk": "buk-Latn-ZZ", + "bum": "bum-Latn-CM", + "buo": "buo-Latn-ZZ", + "bus": "bus-Latn-ZZ", + "buu": "buu-Latn-ZZ", + "bvb": "bvb-Latn-GQ", + "bwd": "bwd-Latn-ZZ", + "bwr": "bwr-Latn-ZZ", + "bxh": "bxh-Latn-ZZ", + "bye": "bye-Latn-ZZ", + "byn": "byn-Ethi-ER", + "byr": "byr-Latn-ZZ", + "bys": "bys-Latn-ZZ", + "byv": "byv-Latn-CM", + "byx": "byx-Latn-ZZ", + "bza": "bza-Latn-ZZ", + "bze": "bze-Latn-ML", + "bzf": "bzf-Latn-ZZ", + "bzh": "bzh-Latn-ZZ", + "bzw": "bzw-Latn-ZZ", + "ca": "ca-Latn-ES", + "cad": "cad-Latn-US", + "can": "can-Latn-ZZ", + "cbj": "cbj-Latn-ZZ", + "cch": "cch-Latn-NG", + "ccp": "ccp-Cakm-BD", + "ce": "ce-Cyrl-RU", + "ceb": "ceb-Latn-PH", + "cfa": "cfa-Latn-ZZ", + "cgg": "cgg-Latn-UG", + "ch": "ch-Latn-GU", + "chk": "chk-Latn-FM", + "chm": "chm-Cyrl-RU", + "cho": "cho-Latn-US", + "chp": "chp-Latn-CA", + "chr": "chr-Cher-US", + "cic": "cic-Latn-US", + "cja": "cja-Arab-KH", + "cjm": "cjm-Cham-VN", + "cjv": "cjv-Latn-ZZ", + "ckb": "ckb-Arab-IQ", + "ckl": "ckl-Latn-ZZ", + "cko": "cko-Latn-ZZ", + "cky": "cky-Latn-ZZ", + "cla": "cla-Latn-ZZ", + "cme": "cme-Latn-ZZ", + "cmg": "cmg-Soyo-MN", + "co": "co-Latn-FR", + "cop": "cop-Copt-EG", + "cps": "cps-Latn-PH", + "cr": "cr-Cans-CA", + "crh": "crh-Cyrl-UA", + "crj": "crj-Cans-CA", + "crk": "crk-Cans-CA", + "crl": "crl-Cans-CA", + "crm": "crm-Cans-CA", + "crs": "crs-Latn-SC", + "cs": "cs-Latn-CZ", + "csb": "csb-Latn-PL", + "csw": "csw-Cans-CA", + "ctd": "ctd-Pauc-MM", + "cu": "cu-Cyrl-RU", + "cu-Glag": "cu-Glag-BG", + "cv": "cv-Cyrl-RU", + "cy": "cy-Latn-GB", + "da": "da-Latn-DK", + "dad": "dad-Latn-ZZ", + "daf": "daf-Latn-CI", + "dag": "dag-Latn-ZZ", + "dah": "dah-Latn-ZZ", + "dak": "dak-Latn-US", + "dar": "dar-Cyrl-RU", + "dav": "dav-Latn-KE", + "dbd": "dbd-Latn-ZZ", + "dbq": "dbq-Latn-ZZ", + "dcc": "dcc-Arab-IN", + "ddn": "ddn-Latn-ZZ", + "de": "de-Latn-DE", + "ded": "ded-Latn-ZZ", + "den": "den-Latn-CA", + "dga": "dga-Latn-ZZ", + "dgh": "dgh-Latn-ZZ", + "dgi": "dgi-Latn-ZZ", + "dgl": "dgl-Arab-ZZ", + "dgr": "dgr-Latn-CA", + "dgz": "dgz-Latn-ZZ", + "dia": "dia-Latn-ZZ", + "dje": "dje-Latn-NE", + "dnj": "dnj-Latn-CI", + "dob": "dob-Latn-ZZ", + "doi": "doi-Deva-IN", + "dop": "dop-Latn-ZZ", + "dow": "dow-Latn-ZZ", + "drh": "drh-Mong-CN", + "dri": "dri-Latn-ZZ", + "drs": "drs-Ethi-ZZ", + "dsb": "dsb-Latn-DE", + "dtm": "dtm-Latn-ML", + "dtp": "dtp-Latn-MY", + "dts": "dts-Latn-ZZ", + "dty": "dty-Deva-NP", + "dua": "dua-Latn-CM", + "duc": "duc-Latn-ZZ", + "dud": "dud-Latn-ZZ", + "dug": "dug-Latn-ZZ", + "dv": "dv-Thaa-MV", + "dva": "dva-Latn-ZZ", + "dww": "dww-Latn-ZZ", + "dyo": "dyo-Latn-SN", + "dyu": "dyu-Latn-BF", + "dz": "dz-Tibt-BT", + "dzg": "dzg-Latn-ZZ", + "ebu": "ebu-Latn-KE", + "ee": "ee-Latn-GH", + "efi": "efi-Latn-NG", + "egl": "egl-Latn-IT", + "egy": "egy-Egyp-EG", + "eka": "eka-Latn-ZZ", + "eky": "eky-Kali-MM", + "el": "el-Grek-GR", + "ema": "ema-Latn-ZZ", + "emi": "emi-Latn-ZZ", + "en": "en-Latn-US", + "en-Shaw": "en-Shaw-GB", + "enn": "enn-Latn-ZZ", + "enq": "enq-Latn-ZZ", + "eo": "eo-Latn-001", + "eri": "eri-Latn-ZZ", + "es": "es-Latn-ES", + "esg": "esg-Gonm-IN", + "esu": "esu-Latn-US", + "et": "et-Latn-EE", + "etr": "etr-Latn-ZZ", + "ett": "ett-Ital-IT", + "etu": "etu-Latn-ZZ", + "etx": "etx-Latn-ZZ", + "eu": "eu-Latn-ES", + "ewo": "ewo-Latn-CM", + "ext": "ext-Latn-ES", + "eza": "eza-Latn-ZZ", + "fa": "fa-Arab-IR", + "faa": "faa-Latn-ZZ", + "fab": "fab-Latn-ZZ", + "fag": "fag-Latn-ZZ", + "fai": "fai-Latn-ZZ", + "fan": "fan-Latn-GQ", + "ff": "ff-Latn-SN", + "ff-Adlm": "ff-Adlm-GN", + "ffi": "ffi-Latn-ZZ", + "ffm": "ffm-Latn-ML", + "fi": "fi-Latn-FI", + "fia": "fia-Arab-SD", + "fil": "fil-Latn-PH", + "fit": "fit-Latn-SE", + "fj": "fj-Latn-FJ", + "flr": "flr-Latn-ZZ", + "fmp": "fmp-Latn-ZZ", + "fo": "fo-Latn-FO", + "fod": "fod-Latn-ZZ", + "fon": "fon-Latn-BJ", + "for": "for-Latn-ZZ", + "fpe": "fpe-Latn-ZZ", + "fqs": "fqs-Latn-ZZ", + "fr": "fr-Latn-FR", + "frc": "frc-Latn-US", + "frp": "frp-Latn-FR", + "frr": "frr-Latn-DE", + "frs": "frs-Latn-DE", + "fub": "fub-Arab-CM", + "fud": "fud-Latn-WF", + "fue": "fue-Latn-ZZ", + "fuf": "fuf-Latn-GN", + "fuh": "fuh-Latn-ZZ", + "fuq": "fuq-Latn-NE", + "fur": "fur-Latn-IT", + "fuv": "fuv-Latn-NG", + "fuy": "fuy-Latn-ZZ", + "fvr": "fvr-Latn-SD", + "fy": "fy-Latn-NL", + "ga": "ga-Latn-IE", + "gaa": "gaa-Latn-GH", + "gaf": "gaf-Latn-ZZ", + "gag": "gag-Latn-MD", + "gah": "gah-Latn-ZZ", + "gaj": "gaj-Latn-ZZ", + "gam": "gam-Latn-ZZ", + "gan": "gan-Hans-CN", + "gaw": "gaw-Latn-ZZ", + "gay": "gay-Latn-ID", + "gba": "gba-Latn-ZZ", + "gbf": "gbf-Latn-ZZ", + "gbm": "gbm-Deva-IN", + "gby": "gby-Latn-ZZ", + "gbz": "gbz-Arab-IR", + "gcr": "gcr-Latn-GF", + "gd": "gd-Latn-GB", + "gde": "gde-Latn-ZZ", + "gdn": "gdn-Latn-ZZ", + "gdr": "gdr-Latn-ZZ", + "geb": "geb-Latn-ZZ", + "gej": "gej-Latn-ZZ", + "gel": "gel-Latn-ZZ", + "gez": "gez-Ethi-ET", + "gfk": "gfk-Latn-ZZ", + "ggn": "ggn-Deva-NP", + "ghs": "ghs-Latn-ZZ", + "gil": "gil-Latn-KI", + "gim": "gim-Latn-ZZ", + "gjk": "gjk-Arab-PK", + "gjn": "gjn-Latn-ZZ", + "gju": "gju-Arab-PK", + "gkn": "gkn-Latn-ZZ", + "gkp": "gkp-Latn-ZZ", + "gl": "gl-Latn-ES", + "glk": "glk-Arab-IR", + "gmm": "gmm-Latn-ZZ", + "gmv": "gmv-Ethi-ZZ", + "gn": "gn-Latn-PY", + "gnd": "gnd-Latn-ZZ", + "gng": "gng-Latn-ZZ", + "god": "god-Latn-ZZ", + "gof": "gof-Ethi-ZZ", + "goi": "goi-Latn-ZZ", + "gom": "gom-Deva-IN", + "gon": "gon-Telu-IN", + "gor": "gor-Latn-ID", + "gos": "gos-Latn-NL", + "got": "got-Goth-UA", + "grb": "grb-Latn-ZZ", + "grc": "grc-Cprt-CY", + "grc-Linb": "grc-Linb-GR", + "grt": "grt-Beng-IN", + "grw": "grw-Latn-ZZ", + "gsw": "gsw-Latn-CH", + "gu": "gu-Gujr-IN", + "gub": "gub-Latn-BR", + "guc": "guc-Latn-CO", + "gud": "gud-Latn-ZZ", + "gur": "gur-Latn-GH", + "guw": "guw-Latn-ZZ", + "gux": "gux-Latn-ZZ", + "guz": "guz-Latn-KE", + "gv": "gv-Latn-IM", + "gvf": "gvf-Latn-ZZ", + "gvr": "gvr-Deva-NP", + "gvs": "gvs-Latn-ZZ", + "gwc": "gwc-Arab-ZZ", + "gwi": "gwi-Latn-CA", + "gwt": "gwt-Arab-ZZ", + "gyi": "gyi-Latn-ZZ", + "ha": "ha-Latn-NG", + "ha-CM": "ha-Arab-CM", + "ha-SD": "ha-Arab-SD", + "hag": "hag-Latn-ZZ", + "hak": "hak-Hans-CN", + "ham": "ham-Latn-ZZ", + "haw": "haw-Latn-US", + "haz": "haz-Arab-AF", + "hbb": "hbb-Latn-ZZ", + "hdy": "hdy-Ethi-ZZ", + "he": "he-Hebr-IL", + "hhy": "hhy-Latn-ZZ", + "hi": "hi-Deva-IN", + "hia": "hia-Latn-ZZ", + "hif": "hif-Latn-FJ", + "hig": "hig-Latn-ZZ", + "hih": "hih-Latn-ZZ", + "hil": "hil-Latn-PH", + "hla": "hla-Latn-ZZ", + "hlu": "hlu-Hluw-TR", + "hmd": "hmd-Plrd-CN", + "hmt": "hmt-Latn-ZZ", + "hnd": "hnd-Arab-PK", + "hne": "hne-Deva-IN", + "hnj": "hnj-Hmng-LA", + "hnn": "hnn-Latn-PH", + "hno": "hno-Arab-PK", + "ho": "ho-Latn-PG", + "hoc": "hoc-Deva-IN", + "hoj": "hoj-Deva-IN", + "hot": "hot-Latn-ZZ", + "hr": "hr-Latn-HR", + "hsb": "hsb-Latn-DE", + "hsn": "hsn-Hans-CN", + "ht": "ht-Latn-HT", + "hu": "hu-Latn-HU", + "hui": "hui-Latn-ZZ", + "hy": "hy-Armn-AM", + "hz": "hz-Latn-NA", + "ia": "ia-Latn-001", + "ian": "ian-Latn-ZZ", + "iar": "iar-Latn-ZZ", + "iba": "iba-Latn-MY", + "ibb": "ibb-Latn-NG", + "iby": "iby-Latn-ZZ", + "ica": "ica-Latn-ZZ", + "ich": "ich-Latn-ZZ", + "id": "id-Latn-ID", + "idd": "idd-Latn-ZZ", + "idi": "idi-Latn-ZZ", + "idu": "idu-Latn-ZZ", + "ife": "ife-Latn-TG", + "ig": "ig-Latn-NG", + "igb": "igb-Latn-ZZ", + "ige": "ige-Latn-ZZ", + "ii": "ii-Yiii-CN", + "ijj": "ijj-Latn-ZZ", + "ik": "ik-Latn-US", + "ikk": "ikk-Latn-ZZ", + "ikt": "ikt-Latn-CA", + "ikw": "ikw-Latn-ZZ", + "ikx": "ikx-Latn-ZZ", + "ilo": "ilo-Latn-PH", + "imo": "imo-Latn-ZZ", + "in": "in-Latn-ID", + "inh": "inh-Cyrl-RU", + "io": "io-Latn-001", + "iou": "iou-Latn-ZZ", + "iri": "iri-Latn-ZZ", + "is": "is-Latn-IS", + "it": "it-Latn-IT", + "iu": "iu-Cans-CA", + "iw": "iw-Hebr-IL", + "iwm": "iwm-Latn-ZZ", + "iws": "iws-Latn-ZZ", + "izh": "izh-Latn-RU", + "izi": "izi-Latn-ZZ", + "ja": "ja-Jpan-JP", + "jab": "jab-Latn-ZZ", + "jam": "jam-Latn-JM", + "jar": "jar-Latn-ZZ", + "jbo": "jbo-Latn-001", + "jbu": "jbu-Latn-ZZ", + "jen": "jen-Latn-ZZ", + "jgk": "jgk-Latn-ZZ", + "jgo": "jgo-Latn-CM", + "ji": "ji-Hebr-UA", + "jib": "jib-Latn-ZZ", + "jmc": "jmc-Latn-TZ", + "jml": "jml-Deva-NP", + "jra": "jra-Latn-ZZ", + "jut": "jut-Latn-DK", + "jv": "jv-Latn-ID", + "jw": "jw-Latn-ID", + "ka": "ka-Geor-GE", + "kaa": "kaa-Cyrl-UZ", + "kab": "kab-Latn-DZ", + "kac": "kac-Latn-MM", + "kad": "kad-Latn-ZZ", + "kai": "kai-Latn-ZZ", + "kaj": "kaj-Latn-NG", + "kam": "kam-Latn-KE", + "kao": "kao-Latn-ML", + "kbd": "kbd-Cyrl-RU", + "kbm": "kbm-Latn-ZZ", + "kbp": "kbp-Latn-ZZ", + "kbq": "kbq-Latn-ZZ", + "kbx": "kbx-Latn-ZZ", + "kby": "kby-Arab-NE", + "kcg": "kcg-Latn-NG", + "kck": "kck-Latn-ZW", + "kcl": "kcl-Latn-ZZ", + "kct": "kct-Latn-ZZ", + "kde": "kde-Latn-TZ", + "kdh": "kdh-Arab-TG", + "kdl": "kdl-Latn-ZZ", + "kdt": "kdt-Thai-TH", + "kea": "kea-Latn-CV", + "ken": "ken-Latn-CM", + "kez": "kez-Latn-ZZ", + "kfo": "kfo-Latn-CI", + "kfr": "kfr-Deva-IN", + "kfy": "kfy-Deva-IN", + "kg": "kg-Latn-CD", + "kge": "kge-Latn-ID", + "kgf": "kgf-Latn-ZZ", + "kgp": "kgp-Latn-BR", + "kha": "kha-Latn-IN", + "khb": "khb-Talu-CN", + "khn": "khn-Deva-IN", + "khq": "khq-Latn-ML", + "khs": "khs-Latn-ZZ", + "kht": "kht-Mymr-IN", + "khw": "khw-Arab-PK", + "khz": "khz-Latn-ZZ", + "ki": "ki-Latn-KE", + "kij": "kij-Latn-ZZ", + "kiu": "kiu-Latn-TR", + "kiw": "kiw-Latn-ZZ", + "kj": "kj-Latn-NA", + "kjd": "kjd-Latn-ZZ", + "kjg": "kjg-Laoo-LA", + "kjs": "kjs-Latn-ZZ", + "kjy": "kjy-Latn-ZZ", + "kk": "kk-Cyrl-KZ", + "kk-AF": "kk-Arab-AF", + "kk-Arab": "kk-Arab-CN", + "kk-CN": "kk-Arab-CN", + "kk-IR": "kk-Arab-IR", + "kk-MN": "kk-Arab-MN", + "kkc": "kkc-Latn-ZZ", + "kkj": "kkj-Latn-CM", + "kl": "kl-Latn-GL", + "kln": "kln-Latn-KE", + "klq": "klq-Latn-ZZ", + "klt": "klt-Latn-ZZ", + "klx": "klx-Latn-ZZ", + "km": "km-Khmr-KH", + "kmb": "kmb-Latn-AO", + "kmh": "kmh-Latn-ZZ", + "kmo": "kmo-Latn-ZZ", + "kms": "kms-Latn-ZZ", + "kmu": "kmu-Latn-ZZ", + "kmw": "kmw-Latn-ZZ", + "kn": "kn-Knda-IN", + "knf": "knf-Latn-GW", + "knp": "knp-Latn-ZZ", + "ko": "ko-Kore-KR", + "koi": "koi-Cyrl-RU", + "kok": "kok-Deva-IN", + "kol": "kol-Latn-ZZ", + "kos": "kos-Latn-FM", + "koz": "koz-Latn-ZZ", + "kpe": "kpe-Latn-LR", + "kpf": "kpf-Latn-ZZ", + "kpo": "kpo-Latn-ZZ", + "kpr": "kpr-Latn-ZZ", + "kpx": "kpx-Latn-ZZ", + "kqb": "kqb-Latn-ZZ", + "kqf": "kqf-Latn-ZZ", + "kqs": "kqs-Latn-ZZ", + "kqy": "kqy-Ethi-ZZ", + "kr": "kr-Latn-ZZ", + "krc": "krc-Cyrl-RU", + "kri": "kri-Latn-SL", + "krj": "krj-Latn-PH", + "krl": "krl-Latn-RU", + "krs": "krs-Latn-ZZ", + "kru": "kru-Deva-IN", + "ks": "ks-Arab-IN", + "ksb": "ksb-Latn-TZ", + "ksd": "ksd-Latn-ZZ", + "ksf": "ksf-Latn-CM", + "ksh": "ksh-Latn-DE", + "ksj": "ksj-Latn-ZZ", + "ksr": "ksr-Latn-ZZ", + "ktb": "ktb-Ethi-ZZ", + "ktm": "ktm-Latn-ZZ", + "kto": "kto-Latn-ZZ", + "ktr": "ktr-Latn-MY", + "ku": "ku-Latn-TR", + "ku-Arab": "ku-Arab-IQ", + "ku-LB": "ku-Arab-LB", + "ku-Yezi": "ku-Yezi-GE", + "kub": "kub-Latn-ZZ", + "kud": "kud-Latn-ZZ", + "kue": "kue-Latn-ZZ", + "kuj": "kuj-Latn-ZZ", + "kum": "kum-Cyrl-RU", + "kun": "kun-Latn-ZZ", + "kup": "kup-Latn-ZZ", + "kus": "kus-Latn-ZZ", + "kv": "kv-Cyrl-RU", + "kvg": "kvg-Latn-ZZ", + "kvr": "kvr-Latn-ID", + "kvx": "kvx-Arab-PK", + "kw": "kw-Latn-GB", + "kwj": "kwj-Latn-ZZ", + "kwo": "kwo-Latn-ZZ", + "kwq": "kwq-Latn-ZZ", + "kxa": "kxa-Latn-ZZ", + "kxc": "kxc-Ethi-ZZ", + "kxe": "kxe-Latn-ZZ", + "kxl": "kxl-Deva-IN", + "kxm": "kxm-Thai-TH", + "kxp": "kxp-Arab-PK", + "kxw": "kxw-Latn-ZZ", + "kxz": "kxz-Latn-ZZ", + "ky": "ky-Cyrl-KG", + "ky-Arab": "ky-Arab-CN", + "ky-CN": "ky-Arab-CN", + "ky-Latn": "ky-Latn-TR", + "ky-TR": "ky-Latn-TR", + "kye": "kye-Latn-ZZ", + "kyx": "kyx-Latn-ZZ", + "kzh": "kzh-Arab-ZZ", + "kzj": "kzj-Latn-MY", + "kzr": "kzr-Latn-ZZ", + "kzt": "kzt-Latn-MY", + "la": "la-Latn-VA", + "lab": "lab-Lina-GR", + "lad": "lad-Hebr-IL", + "lag": "lag-Latn-TZ", + "lah": "lah-Arab-PK", + "laj": "laj-Latn-UG", + "las": "las-Latn-ZZ", + "lb": "lb-Latn-LU", + "lbe": "lbe-Cyrl-RU", + "lbu": "lbu-Latn-ZZ", + "lbw": "lbw-Latn-ID", + "lcm": "lcm-Latn-ZZ", + "lcp": "lcp-Thai-CN", + "ldb": "ldb-Latn-ZZ", + "led": "led-Latn-ZZ", + "lee": "lee-Latn-ZZ", + "lem": "lem-Latn-ZZ", + "lep": "lep-Lepc-IN", + "leq": "leq-Latn-ZZ", + "leu": "leu-Latn-ZZ", + "lez": "lez-Cyrl-RU", + "lg": "lg-Latn-UG", + "lgg": "lgg-Latn-ZZ", + "li": "li-Latn-NL", + "lia": "lia-Latn-ZZ", + "lid": "lid-Latn-ZZ", + "lif": "lif-Deva-NP", + "lif-Limb": "lif-Limb-IN", + "lig": "lig-Latn-ZZ", + "lih": "lih-Latn-ZZ", + "lij": "lij-Latn-IT", + "lis": "lis-Lisu-CN", + "ljp": "ljp-Latn-ID", + "lki": "lki-Arab-IR", + "lkt": "lkt-Latn-US", + "lle": "lle-Latn-ZZ", + "lln": "lln-Latn-ZZ", + "lmn": "lmn-Telu-IN", + "lmo": "lmo-Latn-IT", + "lmp": "lmp-Latn-ZZ", + "ln": "ln-Latn-CD", + "lns": "lns-Latn-ZZ", + "lnu": "lnu-Latn-ZZ", + "lo": "lo-Laoo-LA", + "loj": "loj-Latn-ZZ", + "lok": "lok-Latn-ZZ", + "lol": "lol-Latn-CD", + "lor": "lor-Latn-ZZ", + "los": "los-Latn-ZZ", + "loz": "loz-Latn-ZM", + "lrc": "lrc-Arab-IR", + "lt": "lt-Latn-LT", + "ltg": "ltg-Latn-LV", + "lu": "lu-Latn-CD", + "lua": "lua-Latn-CD", + "luo": "luo-Latn-KE", + "luy": "luy-Latn-KE", + "luz": "luz-Arab-IR", + "lv": "lv-Latn-LV", + "lwl": "lwl-Thai-TH", + "lzh": "lzh-Hans-CN", + "lzz": "lzz-Latn-TR", + "mad": "mad-Latn-ID", + "maf": "maf-Latn-CM", + "mag": "mag-Deva-IN", + "mai": "mai-Deva-IN", + "mak": "mak-Latn-ID", + "man": "man-Latn-GM", + "man-GN": "man-Nkoo-GN", + "man-Nkoo": "man-Nkoo-GN", + "mas": "mas-Latn-KE", + "maw": "maw-Latn-ZZ", + "maz": "maz-Latn-MX", + "mbh": "mbh-Latn-ZZ", + "mbo": "mbo-Latn-ZZ", + "mbq": "mbq-Latn-ZZ", + "mbu": "mbu-Latn-ZZ", + "mbw": "mbw-Latn-ZZ", + "mci": "mci-Latn-ZZ", + "mcp": "mcp-Latn-ZZ", + "mcq": "mcq-Latn-ZZ", + "mcr": "mcr-Latn-ZZ", + "mcu": "mcu-Latn-ZZ", + "mda": "mda-Latn-ZZ", + "mde": "mde-Arab-ZZ", + "mdf": "mdf-Cyrl-RU", + "mdh": "mdh-Latn-PH", + "mdj": "mdj-Latn-ZZ", + "mdr": "mdr-Latn-ID", + "mdx": "mdx-Ethi-ZZ", + "med": "med-Latn-ZZ", + "mee": "mee-Latn-ZZ", + "mek": "mek-Latn-ZZ", + "men": "men-Latn-SL", + "mer": "mer-Latn-KE", + "met": "met-Latn-ZZ", + "meu": "meu-Latn-ZZ", + "mfa": "mfa-Arab-TH", + "mfe": "mfe-Latn-MU", + "mfn": "mfn-Latn-ZZ", + "mfo": "mfo-Latn-ZZ", + "mfq": "mfq-Latn-ZZ", + "mg": "mg-Latn-MG", + "mgh": "mgh-Latn-MZ", + "mgl": "mgl-Latn-ZZ", + "mgo": "mgo-Latn-CM", + "mgp": "mgp-Deva-NP", + "mgy": "mgy-Latn-TZ", + "mh": "mh-Latn-MH", + "mhi": "mhi-Latn-ZZ", + "mhl": "mhl-Latn-ZZ", + "mi": "mi-Latn-NZ", + "mif": "mif-Latn-ZZ", + "min": "min-Latn-ID", + "mis": "mis-Hatr-IQ", + "mis-Medf": "mis-Medf-NG", + "miw": "miw-Latn-ZZ", + "mk": "mk-Cyrl-MK", + "mki": "mki-Arab-ZZ", + "mkl": "mkl-Latn-ZZ", + "mkp": "mkp-Latn-ZZ", + "mkw": "mkw-Latn-ZZ", + "ml": "ml-Mlym-IN", + "mle": "mle-Latn-ZZ", + "mlp": "mlp-Latn-ZZ", + "mls": "mls-Latn-SD", + "mmo": "mmo-Latn-ZZ", + "mmu": "mmu-Latn-ZZ", + "mmx": "mmx-Latn-ZZ", + "mn": "mn-Cyrl-MN", + "mn-CN": "mn-Mong-CN", + "mn-Mong": "mn-Mong-CN", + "mna": "mna-Latn-ZZ", + "mnf": "mnf-Latn-ZZ", + "mni": "mni-Beng-IN", + "mnw": "mnw-Mymr-MM", + "mo": "mo-Latn-RO", + "moa": "moa-Latn-ZZ", + "moe": "moe-Latn-CA", + "moh": "moh-Latn-CA", + "mos": "mos-Latn-BF", + "mox": "mox-Latn-ZZ", + "mpp": "mpp-Latn-ZZ", + "mps": "mps-Latn-ZZ", + "mpt": "mpt-Latn-ZZ", + "mpx": "mpx-Latn-ZZ", + "mql": "mql-Latn-ZZ", + "mr": "mr-Deva-IN", + "mrd": "mrd-Deva-NP", + "mrj": "mrj-Cyrl-RU", + "mro": "mro-Mroo-BD", + "ms": "ms-Latn-MY", + "ms-CC": "ms-Arab-CC", + "mt": "mt-Latn-MT", + "mtc": "mtc-Latn-ZZ", + "mtf": "mtf-Latn-ZZ", + "mti": "mti-Latn-ZZ", + "mtr": "mtr-Deva-IN", + "mua": "mua-Latn-CM", + "mur": "mur-Latn-ZZ", + "mus": "mus-Latn-US", + "mva": "mva-Latn-ZZ", + "mvn": "mvn-Latn-ZZ", + "mvy": "mvy-Arab-PK", + "mwk": "mwk-Latn-ML", + "mwr": "mwr-Deva-IN", + "mwv": "mwv-Latn-ID", + "mww": "mww-Hmnp-US", + "mxc": "mxc-Latn-ZW", + "mxm": "mxm-Latn-ZZ", + "my": "my-Mymr-MM", + "myk": "myk-Latn-ZZ", + "mym": "mym-Ethi-ZZ", + "myv": "myv-Cyrl-RU", + "myw": "myw-Latn-ZZ", + "myx": "myx-Latn-UG", + "myz": "myz-Mand-IR", + "mzk": "mzk-Latn-ZZ", + "mzm": "mzm-Latn-ZZ", + "mzn": "mzn-Arab-IR", + "mzp": "mzp-Latn-ZZ", + "mzw": "mzw-Latn-ZZ", + "mzz": "mzz-Latn-ZZ", + "na": "na-Latn-NR", + "nac": "nac-Latn-ZZ", + "naf": "naf-Latn-ZZ", + "nak": "nak-Latn-ZZ", + "nan": "nan-Hans-CN", + "nap": "nap-Latn-IT", + "naq": "naq-Latn-NA", + "nas": "nas-Latn-ZZ", + "nb": "nb-Latn-NO", + "nca": "nca-Latn-ZZ", + "nce": "nce-Latn-ZZ", + "ncf": "ncf-Latn-ZZ", + "nch": "nch-Latn-MX", + "nco": "nco-Latn-ZZ", + "ncu": "ncu-Latn-ZZ", + "nd": "nd-Latn-ZW", + "ndc": "ndc-Latn-MZ", + "nds": "nds-Latn-DE", + "ne": "ne-Deva-NP", + "neb": "neb-Latn-ZZ", + "new": "new-Deva-NP", + "nex": "nex-Latn-ZZ", + "nfr": "nfr-Latn-ZZ", + "ng": "ng-Latn-NA", + "nga": "nga-Latn-ZZ", + "ngb": "ngb-Latn-ZZ", + "ngl": "ngl-Latn-MZ", + "nhb": "nhb-Latn-ZZ", + "nhe": "nhe-Latn-MX", + "nhw": "nhw-Latn-MX", + "nif": "nif-Latn-ZZ", + "nii": "nii-Latn-ZZ", + "nij": "nij-Latn-ID", + "nin": "nin-Latn-ZZ", + "niu": "niu-Latn-NU", + "niy": "niy-Latn-ZZ", + "niz": "niz-Latn-ZZ", + "njo": "njo-Latn-IN", + "nkg": "nkg-Latn-ZZ", + "nko": "nko-Latn-ZZ", + "nl": "nl-Latn-NL", + "nmg": "nmg-Latn-CM", + "nmz": "nmz-Latn-ZZ", + "nn": "nn-Latn-NO", + "nnf": "nnf-Latn-ZZ", + "nnh": "nnh-Latn-CM", + "nnk": "nnk-Latn-ZZ", + "nnm": "nnm-Latn-ZZ", + "nnp": "nnp-Wcho-IN", + "no": "no-Latn-NO", + "nod": "nod-Lana-TH", + "noe": "noe-Deva-IN", + "non": "non-Runr-SE", + "nop": "nop-Latn-ZZ", + "nou": "nou-Latn-ZZ", + "nqo": "nqo-Nkoo-GN", + "nr": "nr-Latn-ZA", + "nrb": "nrb-Latn-ZZ", + "nsk": "nsk-Cans-CA", + "nsn": "nsn-Latn-ZZ", + "nso": "nso-Latn-ZA", + "nss": "nss-Latn-ZZ", + "ntm": "ntm-Latn-ZZ", + "ntr": "ntr-Latn-ZZ", + "nui": "nui-Latn-ZZ", + "nup": "nup-Latn-ZZ", + "nus": "nus-Latn-SS", + "nuv": "nuv-Latn-ZZ", + "nux": "nux-Latn-ZZ", + "nv": "nv-Latn-US", + "nwb": "nwb-Latn-ZZ", + "nxq": "nxq-Latn-CN", + "nxr": "nxr-Latn-ZZ", + "ny": "ny-Latn-MW", + "nym": "nym-Latn-TZ", + "nyn": "nyn-Latn-UG", + "nzi": "nzi-Latn-GH", + "oc": "oc-Latn-FR", + "ogc": "ogc-Latn-ZZ", + "okr": "okr-Latn-ZZ", + "okv": "okv-Latn-ZZ", + "om": "om-Latn-ET", + "ong": "ong-Latn-ZZ", + "onn": "onn-Latn-ZZ", + "ons": "ons-Latn-ZZ", + "opm": "opm-Latn-ZZ", + "or": "or-Orya-IN", + "oro": "oro-Latn-ZZ", + "oru": "oru-Arab-ZZ", + "os": "os-Cyrl-GE", + "osa": "osa-Osge-US", + "ota": "ota-Arab-ZZ", + "otk": "otk-Orkh-MN", + "ozm": "ozm-Latn-ZZ", + "pa": "pa-Guru-IN", + "pa-Arab": "pa-Arab-PK", + "pa-PK": "pa-Arab-PK", + "pag": "pag-Latn-PH", + "pal": "pal-Phli-IR", + "pal-Phlp": "pal-Phlp-CN", + "pam": "pam-Latn-PH", + "pap": "pap-Latn-AW", + "pau": "pau-Latn-PW", + "pbi": "pbi-Latn-ZZ", + "pcd": "pcd-Latn-FR", + "pcm": "pcm-Latn-NG", + "pdc": "pdc-Latn-US", + "pdt": "pdt-Latn-CA", + "ped": "ped-Latn-ZZ", + "peo": "peo-Xpeo-IR", + "pex": "pex-Latn-ZZ", + "pfl": "pfl-Latn-DE", + "phl": "phl-Arab-ZZ", + "phn": "phn-Phnx-LB", + "pil": "pil-Latn-ZZ", + "pip": "pip-Latn-ZZ", + "pka": "pka-Brah-IN", + "pko": "pko-Latn-KE", + "pl": "pl-Latn-PL", + "pla": "pla-Latn-ZZ", + "pms": "pms-Latn-IT", + "png": "png-Latn-ZZ", + "pnn": "pnn-Latn-ZZ", + "pnt": "pnt-Grek-GR", + "pon": "pon-Latn-FM", + "ppa": "ppa-Deva-IN", + "ppo": "ppo-Latn-ZZ", + "pra": "pra-Khar-PK", + "prd": "prd-Arab-IR", + "prg": "prg-Latn-001", + "ps": "ps-Arab-AF", + "pss": "pss-Latn-ZZ", + "pt": "pt-Latn-BR", + "ptp": "ptp-Latn-ZZ", + "puu": "puu-Latn-GA", + "pwa": "pwa-Latn-ZZ", + "qu": "qu-Latn-PE", + "quc": "quc-Latn-GT", + "qug": "qug-Latn-EC", + "rai": "rai-Latn-ZZ", + "raj": "raj-Deva-IN", + "rao": "rao-Latn-ZZ", + "rcf": "rcf-Latn-RE", + "rej": "rej-Latn-ID", + "rel": "rel-Latn-ZZ", + "res": "res-Latn-ZZ", + "rgn": "rgn-Latn-IT", + "rhg": "rhg-Arab-MM", + "ria": "ria-Latn-IN", + "rif": "rif-Tfng-MA", + "rif-NL": "rif-Latn-NL", + "rjs": "rjs-Deva-NP", + "rkt": "rkt-Beng-BD", + "rm": "rm-Latn-CH", + "rmf": "rmf-Latn-FI", + "rmo": "rmo-Latn-CH", + "rmt": "rmt-Arab-IR", + "rmu": "rmu-Latn-SE", + "rn": "rn-Latn-BI", + "rna": "rna-Latn-ZZ", + "rng": "rng-Latn-MZ", + "ro": "ro-Latn-RO", + "rob": "rob-Latn-ID", + "rof": "rof-Latn-TZ", + "roo": "roo-Latn-ZZ", + "rro": "rro-Latn-ZZ", + "rtm": "rtm-Latn-FJ", + "ru": "ru-Cyrl-RU", + "rue": "rue-Cyrl-UA", + "rug": "rug-Latn-SB", + "rw": "rw-Latn-RW", + "rwk": "rwk-Latn-TZ", + "rwo": "rwo-Latn-ZZ", + "ryu": "ryu-Kana-JP", + "sa": "sa-Deva-IN", + "saf": "saf-Latn-GH", + "sah": "sah-Cyrl-RU", + "saq": "saq-Latn-KE", + "sas": "sas-Latn-ID", + "sat": "sat-Olck-IN", + "sav": "sav-Latn-SN", + "saz": "saz-Saur-IN", + "sba": "sba-Latn-ZZ", + "sbe": "sbe-Latn-ZZ", + "sbp": "sbp-Latn-TZ", + "sc": "sc-Latn-IT", + "sck": "sck-Deva-IN", + "scl": "scl-Arab-ZZ", + "scn": "scn-Latn-IT", + "sco": "sco-Latn-GB", + "scs": "scs-Latn-CA", + "sd": "sd-Arab-PK", + "sd-Deva": "sd-Deva-IN", + "sd-Khoj": "sd-Khoj-IN", + "sd-Sind": "sd-Sind-IN", + "sdc": "sdc-Latn-IT", + "sdh": "sdh-Arab-IR", + "se": "se-Latn-NO", + "sef": "sef-Latn-CI", + "seh": "seh-Latn-MZ", + "sei": "sei-Latn-MX", + "ses": "ses-Latn-ML", + "sg": "sg-Latn-CF", + "sga": "sga-Ogam-IE", + "sgs": "sgs-Latn-LT", + "sgw": "sgw-Ethi-ZZ", + "sgz": "sgz-Latn-ZZ", + "shi": "shi-Tfng-MA", + "shk": "shk-Latn-ZZ", + "shn": "shn-Mymr-MM", + "shu": "shu-Arab-ZZ", + "si": "si-Sinh-LK", + "sid": "sid-Latn-ET", + "sig": "sig-Latn-ZZ", + "sil": "sil-Latn-ZZ", + "sim": "sim-Latn-ZZ", + "sjr": "sjr-Latn-ZZ", + "sk": "sk-Latn-SK", + "skc": "skc-Latn-ZZ", + "skr": "skr-Arab-PK", + "sks": "sks-Latn-ZZ", + "sl": "sl-Latn-SI", + "sld": "sld-Latn-ZZ", + "sli": "sli-Latn-PL", + "sll": "sll-Latn-ZZ", + "sly": "sly-Latn-ID", + "sm": "sm-Latn-WS", + "sma": "sma-Latn-SE", + "smj": "smj-Latn-SE", + "smn": "smn-Latn-FI", + "smp": "smp-Samr-IL", + "smq": "smq-Latn-ZZ", + "sms": "sms-Latn-FI", + "sn": "sn-Latn-ZW", + "snc": "snc-Latn-ZZ", + "snk": "snk-Latn-ML", + "snp": "snp-Latn-ZZ", + "snx": "snx-Latn-ZZ", + "sny": "sny-Latn-ZZ", + "so": "so-Latn-SO", + "sog": "sog-Sogd-UZ", + "sok": "sok-Latn-ZZ", + "soq": "soq-Latn-ZZ", + "sou": "sou-Thai-TH", + "soy": "soy-Latn-ZZ", + "spd": "spd-Latn-ZZ", + "spl": "spl-Latn-ZZ", + "sps": "sps-Latn-ZZ", + "sq": "sq-Latn-AL", + "sr": "sr-Cyrl-RS", + "sr-ME": "sr-Latn-ME", + "sr-RO": "sr-Latn-RO", + "sr-RU": "sr-Latn-RU", + "sr-TR": "sr-Latn-TR", + "srb": "srb-Sora-IN", + "srn": "srn-Latn-SR", + "srr": "srr-Latn-SN", + "srx": "srx-Deva-IN", + "ss": "ss-Latn-ZA", + "ssd": "ssd-Latn-ZZ", + "ssg": "ssg-Latn-ZZ", + "ssy": "ssy-Latn-ER", + "st": "st-Latn-ZA", + "stk": "stk-Latn-ZZ", + "stq": "stq-Latn-DE", + "su": "su-Latn-ID", + "sua": "sua-Latn-ZZ", + "sue": "sue-Latn-ZZ", + "suk": "suk-Latn-TZ", + "sur": "sur-Latn-ZZ", + "sus": "sus-Latn-GN", + "sv": "sv-Latn-SE", + "sw": "sw-Latn-TZ", + "swb": "swb-Arab-YT", + "swc": "swc-Latn-CD", + "swg": "swg-Latn-DE", + "swp": "swp-Latn-ZZ", + "swv": "swv-Deva-IN", + "sxn": "sxn-Latn-ID", + "sxw": "sxw-Latn-ZZ", + "syl": "syl-Beng-BD", + "syr": "syr-Syrc-IQ", + "szl": "szl-Latn-PL", + "ta": "ta-Taml-IN", + "taj": "taj-Deva-NP", + "tal": "tal-Latn-ZZ", + "tan": "tan-Latn-ZZ", + "taq": "taq-Latn-ZZ", + "tbc": "tbc-Latn-ZZ", + "tbd": "tbd-Latn-ZZ", + "tbf": "tbf-Latn-ZZ", + "tbg": "tbg-Latn-ZZ", + "tbo": "tbo-Latn-ZZ", + "tbw": "tbw-Latn-PH", + "tbz": "tbz-Latn-ZZ", + "tci": "tci-Latn-ZZ", + "tcy": "tcy-Knda-IN", + "tdd": "tdd-Tale-CN", + "tdg": "tdg-Deva-NP", + "tdh": "tdh-Deva-NP", + "tdu": "tdu-Latn-MY", + "te": "te-Telu-IN", + "ted": "ted-Latn-ZZ", + "tem": "tem-Latn-SL", + "teo": "teo-Latn-UG", + "tet": "tet-Latn-TL", + "tfi": "tfi-Latn-ZZ", + "tg": "tg-Cyrl-TJ", + "tg-Arab": "tg-Arab-PK", + "tg-PK": "tg-Arab-PK", + "tgc": "tgc-Latn-ZZ", + "tgo": "tgo-Latn-ZZ", + "tgu": "tgu-Latn-ZZ", + "th": "th-Thai-TH", + "thl": "thl-Deva-NP", + "thq": "thq-Deva-NP", + "thr": "thr-Deva-NP", + "ti": "ti-Ethi-ET", + "tif": "tif-Latn-ZZ", + "tig": "tig-Ethi-ER", + "tik": "tik-Latn-ZZ", + "tim": "tim-Latn-ZZ", + "tio": "tio-Latn-ZZ", + "tiv": "tiv-Latn-NG", + "tk": "tk-Latn-TM", + "tkl": "tkl-Latn-TK", + "tkr": "tkr-Latn-AZ", + "tkt": "tkt-Deva-NP", + "tl": "tl-Latn-PH", + "tlf": "tlf-Latn-ZZ", + "tlx": "tlx-Latn-ZZ", + "tly": "tly-Latn-AZ", + "tmh": "tmh-Latn-NE", + "tmy": "tmy-Latn-ZZ", + "tn": "tn-Latn-ZA", + "tnh": "tnh-Latn-ZZ", + "to": "to-Latn-TO", + "tof": "tof-Latn-ZZ", + "tog": "tog-Latn-MW", + "toq": "toq-Latn-ZZ", + "tpi": "tpi-Latn-PG", + "tpm": "tpm-Latn-ZZ", + "tpz": "tpz-Latn-ZZ", + "tqo": "tqo-Latn-ZZ", + "tr": "tr-Latn-TR", + "tru": "tru-Latn-TR", + "trv": "trv-Latn-TW", + "trw": "trw-Arab-PK", + "ts": "ts-Latn-ZA", + "tsd": "tsd-Grek-GR", + "tsf": "tsf-Deva-NP", + "tsg": "tsg-Latn-PH", + "tsj": "tsj-Tibt-BT", + "tsw": "tsw-Latn-ZZ", + "tt": "tt-Cyrl-RU", + "ttd": "ttd-Latn-ZZ", + "tte": "tte-Latn-ZZ", + "ttj": "ttj-Latn-UG", + "ttr": "ttr-Latn-ZZ", + "tts": "tts-Thai-TH", + "ttt": "ttt-Latn-AZ", + "tuh": "tuh-Latn-ZZ", + "tul": "tul-Latn-ZZ", + "tum": "tum-Latn-MW", + "tuq": "tuq-Latn-ZZ", + "tvd": "tvd-Latn-ZZ", + "tvl": "tvl-Latn-TV", + "tvu": "tvu-Latn-ZZ", + "twh": "twh-Latn-ZZ", + "twq": "twq-Latn-NE", + "txg": "txg-Tang-CN", + "ty": "ty-Latn-PF", + "tya": "tya-Latn-ZZ", + "tyv": "tyv-Cyrl-RU", + "tzm": "tzm-Latn-MA", + "ubu": "ubu-Latn-ZZ", + "udm": "udm-Cyrl-RU", + "ug": "ug-Arab-CN", + "ug-Cyrl": "ug-Cyrl-KZ", + "ug-KZ": "ug-Cyrl-KZ", + "ug-MN": "ug-Cyrl-MN", + "uga": "uga-Ugar-SY", + "uk": "uk-Cyrl-UA", + "uli": "uli-Latn-FM", + "umb": "umb-Latn-AO", + "und": "en-Latn-US", + "und-002": "en-Latn-NG", + "und-003": "en-Latn-US", + "und-005": "pt-Latn-BR", + "und-009": "en-Latn-AU", + "und-011": "en-Latn-NG", + "und-013": "es-Latn-MX", + "und-014": "sw-Latn-TZ", + "und-015": "ar-Arab-EG", + "und-017": "sw-Latn-CD", + "und-018": "en-Latn-ZA", + "und-019": "en-Latn-US", + "und-021": "en-Latn-US", + "und-029": "es-Latn-CU", + "und-030": "zh-Hans-CN", + "und-034": "hi-Deva-IN", + "und-035": "id-Latn-ID", + "und-039": "it-Latn-IT", + "und-053": "en-Latn-AU", + "und-054": "en-Latn-PG", + "und-057": "en-Latn-GU", + "und-061": "sm-Latn-WS", + "und-142": "zh-Hans-CN", + "und-143": "uz-Latn-UZ", + "und-145": "ar-Arab-SA", + "und-150": "ru-Cyrl-RU", + "und-151": "ru-Cyrl-RU", + "und-154": "en-Latn-GB", + "und-155": "de-Latn-DE", + "und-202": "en-Latn-NG", + "und-419": "es-Latn-419", + "und-AD": "ca-Latn-AD", + "und-Adlm": "ff-Adlm-GN", + "und-AE": "ar-Arab-AE", + "und-AF": "fa-Arab-AF", + "und-Aghb": "lez-Aghb-RU", + "und-Ahom": "aho-Ahom-IN", + "und-AL": "sq-Latn-AL", + "und-AM": "hy-Armn-AM", + "und-AO": "pt-Latn-AO", + "und-AQ": "und-Latn-AQ", + "und-AR": "es-Latn-AR", + "und-Arab": "ar-Arab-EG", + "und-Arab-CC": "ms-Arab-CC", + "und-Arab-CN": "ug-Arab-CN", + "und-Arab-GB": "ks-Arab-GB", + "und-Arab-ID": "ms-Arab-ID", + "und-Arab-IN": "ur-Arab-IN", + "und-Arab-KH": "cja-Arab-KH", + "und-Arab-MM": "rhg-Arab-MM", + "und-Arab-MN": "kk-Arab-MN", + "und-Arab-MU": "ur-Arab-MU", + "und-Arab-NG": "ha-Arab-NG", + "und-Arab-PK": "ur-Arab-PK", + "und-Arab-TG": "apd-Arab-TG", + "und-Arab-TH": "mfa-Arab-TH", + "und-Arab-TJ": "fa-Arab-TJ", + "und-Arab-TR": "az-Arab-TR", + "und-Arab-YT": "swb-Arab-YT", + "und-Armi": "arc-Armi-IR", + "und-Armn": "hy-Armn-AM", + "und-AS": "sm-Latn-AS", + "und-AT": "de-Latn-AT", + "und-Avst": "ae-Avst-IR", + "und-AW": "nl-Latn-AW", + "und-AX": "sv-Latn-AX", + "und-AZ": "az-Latn-AZ", + "und-BA": "bs-Latn-BA", + "und-Bali": "ban-Bali-ID", + "und-Bamu": "bax-Bamu-CM", + "und-Bass": "bsq-Bass-LR", + "und-Batk": "bbc-Batk-ID", + "und-BD": "bn-Beng-BD", + "und-BE": "nl-Latn-BE", + "und-Beng": "bn-Beng-BD", + "und-BF": "fr-Latn-BF", + "und-BG": "bg-Cyrl-BG", + "und-BH": "ar-Arab-BH", + "und-Bhks": "sa-Bhks-IN", + "und-BI": "rn-Latn-BI", + "und-BJ": "fr-Latn-BJ", + "und-BL": "fr-Latn-BL", + "und-BN": "ms-Latn-BN", + "und-BO": "es-Latn-BO", + "und-Bopo": "zh-Bopo-TW", + "und-BQ": "pap-Latn-BQ", + "und-BR": "pt-Latn-BR", + "und-Brah": "pka-Brah-IN", + "und-Brai": "fr-Brai-FR", + "und-BT": "dz-Tibt-BT", + "und-Bugi": "bug-Bugi-ID", + "und-Buhd": "bku-Buhd-PH", + "und-BV": "und-Latn-BV", + "und-BY": "be-Cyrl-BY", + "und-Cakm": "ccp-Cakm-BD", + "und-Cans": "cr-Cans-CA", + "und-Cari": "xcr-Cari-TR", + "und-CD": "sw-Latn-CD", + "und-CF": "fr-Latn-CF", + "und-CG": "fr-Latn-CG", + "und-CH": "de-Latn-CH", + "und-Cham": "cjm-Cham-VN", + "und-Cher": "chr-Cher-US", + "und-Chrs": "xco-Chrs-UZ", + "und-CI": "fr-Latn-CI", + "und-CL": "es-Latn-CL", + "und-CM": "fr-Latn-CM", + "und-CN": "zh-Hans-CN", + "und-CO": "es-Latn-CO", + "und-Copt": "cop-Copt-EG", + "und-CP": "und-Latn-CP", + "und-Cprt": "grc-Cprt-CY", + "und-CR": "es-Latn-CR", + "und-CU": "es-Latn-CU", + "und-CV": "pt-Latn-CV", + "und-CW": "pap-Latn-CW", + "und-CY": "el-Grek-CY", + "und-Cyrl": "ru-Cyrl-RU", + "und-Cyrl-AL": "mk-Cyrl-AL", + "und-Cyrl-BA": "sr-Cyrl-BA", + "und-Cyrl-GE": "os-Cyrl-GE", + "und-Cyrl-GR": "mk-Cyrl-GR", + "und-Cyrl-MD": "uk-Cyrl-MD", + "und-Cyrl-RO": "bg-Cyrl-RO", + "und-Cyrl-SK": "uk-Cyrl-SK", + "und-Cyrl-TR": "kbd-Cyrl-TR", + "und-Cyrl-XK": "sr-Cyrl-XK", + "und-CZ": "cs-Latn-CZ", + "und-DE": "de-Latn-DE", + "und-Deva": "hi-Deva-IN", + "und-Deva-BT": "ne-Deva-BT", + "und-Deva-FJ": "hif-Deva-FJ", + "und-Deva-MU": "bho-Deva-MU", + "und-Deva-PK": "btv-Deva-PK", + "und-Diak": "dv-Diak-MV", + "und-DJ": "aa-Latn-DJ", + "und-DK": "da-Latn-DK", + "und-DO": "es-Latn-DO", + "und-Dogr": "doi-Dogr-IN", + "und-Dupl": "fr-Dupl-FR", + "und-DZ": "ar-Arab-DZ", + "und-EA": "es-Latn-EA", + "und-EC": "es-Latn-EC", + "und-EE": "et-Latn-EE", + "und-EG": "ar-Arab-EG", + "und-Egyp": "egy-Egyp-EG", + "und-EH": "ar-Arab-EH", + "und-Elba": "sq-Elba-AL", + "und-Elym": "arc-Elym-IR", + "und-ER": "ti-Ethi-ER", + "und-ES": "es-Latn-ES", + "und-ET": "am-Ethi-ET", + "und-Ethi": "am-Ethi-ET", + "und-EU": "en-Latn-IE", + "und-EZ": "de-Latn-EZ", + "und-FI": "fi-Latn-FI", + "und-FO": "fo-Latn-FO", + "und-FR": "fr-Latn-FR", + "und-GA": "fr-Latn-GA", + "und-GE": "ka-Geor-GE", + "und-Geor": "ka-Geor-GE", + "und-GF": "fr-Latn-GF", + "und-GH": "ak-Latn-GH", + "und-GL": "kl-Latn-GL", + "und-Glag": "cu-Glag-BG", + "und-GN": "fr-Latn-GN", + "und-Gong": "wsg-Gong-IN", + "und-Gonm": "esg-Gonm-IN", + "und-Goth": "got-Goth-UA", + "und-GP": "fr-Latn-GP", + "und-GQ": "es-Latn-GQ", + "und-GR": "el-Grek-GR", + "und-Gran": "sa-Gran-IN", + "und-Grek": "el-Grek-GR", + "und-Grek-TR": "bgx-Grek-TR", + "und-GS": "und-Latn-GS", + "und-GT": "es-Latn-GT", + "und-Gujr": "gu-Gujr-IN", + "und-Guru": "pa-Guru-IN", + "und-GW": "pt-Latn-GW", + "und-Hanb": "zh-Hanb-TW", + "und-Hang": "ko-Hang-KR", + "und-Hani": "zh-Hani-CN", + "und-Hano": "hnn-Hano-PH", + "und-Hans": "zh-Hans-CN", + "und-Hant": "zh-Hant-TW", + "und-Hatr": "mis-Hatr-IQ", + "und-Hebr": "he-Hebr-IL", + "und-Hebr-CA": "yi-Hebr-CA", + "und-Hebr-GB": "yi-Hebr-GB", + "und-Hebr-SE": "yi-Hebr-SE", + "und-Hebr-UA": "yi-Hebr-UA", + "und-Hebr-US": "yi-Hebr-US", + "und-Hira": "ja-Hira-JP", + "und-HK": "zh-Hant-HK", + "und-Hluw": "hlu-Hluw-TR", + "und-HM": "und-Latn-HM", + "und-Hmng": "hnj-Hmng-LA", + "und-Hmnp": "mww-Hmnp-US", + "und-HN": "es-Latn-HN", + "und-HR": "hr-Latn-HR", + "und-HT": "ht-Latn-HT", + "und-HU": "hu-Latn-HU", + "und-Hung": "hu-Hung-HU", + "und-IC": "es-Latn-IC", + "und-ID": "id-Latn-ID", + "und-IL": "he-Hebr-IL", + "und-IN": "hi-Deva-IN", + "und-IQ": "ar-Arab-IQ", + "und-IR": "fa-Arab-IR", + "und-IS": "is-Latn-IS", + "und-IT": "it-Latn-IT", + "und-Ital": "ett-Ital-IT", + "und-Jamo": "ko-Jamo-KR", + "und-Java": "jv-Java-ID", + "und-JO": "ar-Arab-JO", + "und-JP": "ja-Jpan-JP", + "und-Jpan": "ja-Jpan-JP", + "und-Kali": "eky-Kali-MM", + "und-Kana": "ja-Kana-JP", + "und-KE": "sw-Latn-KE", + "und-KG": "ky-Cyrl-KG", + "und-KH": "km-Khmr-KH", + "und-Khar": "pra-Khar-PK", + "und-Khmr": "km-Khmr-KH", + "und-Khoj": "sd-Khoj-IN", + "und-Kits": "zkt-Kits-CN", + "und-KM": "ar-Arab-KM", + "und-Knda": "kn-Knda-IN", + "und-Kore": "ko-Kore-KR", + "und-KP": "ko-Kore-KP", + "und-KR": "ko-Kore-KR", + "und-Kthi": "bho-Kthi-IN", + "und-KW": "ar-Arab-KW", + "und-KZ": "ru-Cyrl-KZ", + "und-LA": "lo-Laoo-LA", + "und-Lana": "nod-Lana-TH", + "und-Laoo": "lo-Laoo-LA", + "und-Latn-AF": "tk-Latn-AF", + "und-Latn-AM": "ku-Latn-AM", + "und-Latn-CN": "za-Latn-CN", + "und-Latn-CY": "tr-Latn-CY", + "und-Latn-DZ": "fr-Latn-DZ", + "und-Latn-ET": "en-Latn-ET", + "und-Latn-GE": "ku-Latn-GE", + "und-Latn-IR": "tk-Latn-IR", + "und-Latn-KM": "fr-Latn-KM", + "und-Latn-MA": "fr-Latn-MA", + "und-Latn-MK": "sq-Latn-MK", + "und-Latn-MM": "kac-Latn-MM", + "und-Latn-MO": "pt-Latn-MO", + "und-Latn-MR": "fr-Latn-MR", + "und-Latn-RU": "krl-Latn-RU", + "und-Latn-SY": "fr-Latn-SY", + "und-Latn-TN": "fr-Latn-TN", + "und-Latn-TW": "trv-Latn-TW", + "und-Latn-UA": "pl-Latn-UA", + "und-LB": "ar-Arab-LB", + "und-Lepc": "lep-Lepc-IN", + "und-LI": "de-Latn-LI", + "und-Limb": "lif-Limb-IN", + "und-Lina": "lab-Lina-GR", + "und-Linb": "grc-Linb-GR", + "und-Lisu": "lis-Lisu-CN", + "und-LK": "si-Sinh-LK", + "und-LS": "st-Latn-LS", + "und-LT": "lt-Latn-LT", + "und-LU": "fr-Latn-LU", + "und-LV": "lv-Latn-LV", + "und-LY": "ar-Arab-LY", + "und-Lyci": "xlc-Lyci-TR", + "und-Lydi": "xld-Lydi-TR", + "und-MA": "ar-Arab-MA", + "und-Mahj": "hi-Mahj-IN", + "und-Maka": "mak-Maka-ID", + "und-Mand": "myz-Mand-IR", + "und-Mani": "xmn-Mani-CN", + "und-Marc": "bo-Marc-CN", + "und-MC": "fr-Latn-MC", + "und-MD": "ro-Latn-MD", + "und-ME": "sr-Latn-ME", + "und-Medf": "mis-Medf-NG", + "und-Mend": "men-Mend-SL", + "und-Merc": "xmr-Merc-SD", + "und-Mero": "xmr-Mero-SD", + "und-MF": "fr-Latn-MF", + "und-MG": "mg-Latn-MG", + "und-MK": "mk-Cyrl-MK", + "und-ML": "bm-Latn-ML", + "und-Mlym": "ml-Mlym-IN", + "und-MM": "my-Mymr-MM", + "und-MN": "mn-Cyrl-MN", + "und-MO": "zh-Hant-MO", + "und-Modi": "mr-Modi-IN", + "und-Mong": "mn-Mong-CN", + "und-MQ": "fr-Latn-MQ", + "und-MR": "ar-Arab-MR", + "und-Mroo": "mro-Mroo-BD", + "und-MT": "mt-Latn-MT", + "und-Mtei": "mni-Mtei-IN", + "und-MU": "mfe-Latn-MU", + "und-Mult": "skr-Mult-PK", + "und-MV": "dv-Thaa-MV", + "und-MX": "es-Latn-MX", + "und-MY": "ms-Latn-MY", + "und-Mymr": "my-Mymr-MM", + "und-Mymr-IN": "kht-Mymr-IN", + "und-Mymr-TH": "mnw-Mymr-TH", + "und-MZ": "pt-Latn-MZ", + "und-NA": "af-Latn-NA", + "und-Nand": "sa-Nand-IN", + "und-Narb": "xna-Narb-SA", + "und-Nbat": "arc-Nbat-JO", + "und-NC": "fr-Latn-NC", + "und-NE": "ha-Latn-NE", + "und-Newa": "new-Newa-NP", + "und-NI": "es-Latn-NI", + "und-Nkoo": "man-Nkoo-GN", + "und-NL": "nl-Latn-NL", + "und-NO": "nb-Latn-NO", + "und-NP": "ne-Deva-NP", + "und-Nshu": "zhx-Nshu-CN", + "und-Ogam": "sga-Ogam-IE", + "und-Olck": "sat-Olck-IN", + "und-OM": "ar-Arab-OM", + "und-Orkh": "otk-Orkh-MN", + "und-Orya": "or-Orya-IN", + "und-Osge": "osa-Osge-US", + "und-Osma": "so-Osma-SO", + "und-PA": "es-Latn-PA", + "und-Palm": "arc-Palm-SY", + "und-Pauc": "ctd-Pauc-MM", + "und-PE": "es-Latn-PE", + "und-Perm": "kv-Perm-RU", + "und-PF": "fr-Latn-PF", + "und-PG": "tpi-Latn-PG", + "und-PH": "fil-Latn-PH", + "und-Phag": "lzh-Phag-CN", + "und-Phli": "pal-Phli-IR", + "und-Phlp": "pal-Phlp-CN", + "und-Phnx": "phn-Phnx-LB", + "und-PK": "ur-Arab-PK", + "und-PL": "pl-Latn-PL", + "und-Plrd": "hmd-Plrd-CN", + "und-PM": "fr-Latn-PM", + "und-PR": "es-Latn-PR", + "und-Prti": "xpr-Prti-IR", + "und-PS": "ar-Arab-PS", + "und-PT": "pt-Latn-PT", + "und-PW": "pau-Latn-PW", + "und-PY": "gn-Latn-PY", + "und-QA": "ar-Arab-QA", + "und-QO": "en-Latn-DG", + "und-RE": "fr-Latn-RE", + "und-Rjng": "rej-Rjng-ID", + "und-RO": "ro-Latn-RO", + "und-Rohg": "rhg-Rohg-MM", + "und-RS": "sr-Cyrl-RS", + "und-RU": "ru-Cyrl-RU", + "und-Runr": "non-Runr-SE", + "und-RW": "rw-Latn-RW", + "und-SA": "ar-Arab-SA", + "und-Samr": "smp-Samr-IL", + "und-Sarb": "xsa-Sarb-YE", + "und-Saur": "saz-Saur-IN", + "und-SC": "fr-Latn-SC", + "und-SD": "ar-Arab-SD", + "und-SE": "sv-Latn-SE", + "und-Sgnw": "ase-Sgnw-US", + "und-Shaw": "en-Shaw-GB", + "und-Shrd": "sa-Shrd-IN", + "und-SI": "sl-Latn-SI", + "und-Sidd": "sa-Sidd-IN", + "und-Sind": "sd-Sind-IN", + "und-Sinh": "si-Sinh-LK", + "und-SJ": "nb-Latn-SJ", + "und-SK": "sk-Latn-SK", + "und-SM": "it-Latn-SM", + "und-SN": "fr-Latn-SN", + "und-SO": "so-Latn-SO", + "und-Sogd": "sog-Sogd-UZ", + "und-Sogo": "sog-Sogo-UZ", + "und-Sora": "srb-Sora-IN", + "und-Soyo": "cmg-Soyo-MN", + "und-SR": "nl-Latn-SR", + "und-ST": "pt-Latn-ST", + "und-Sund": "su-Sund-ID", + "und-SV": "es-Latn-SV", + "und-SY": "ar-Arab-SY", + "und-Sylo": "syl-Sylo-BD", + "und-Syrc": "syr-Syrc-IQ", + "und-Tagb": "tbw-Tagb-PH", + "und-Takr": "doi-Takr-IN", + "und-Tale": "tdd-Tale-CN", + "und-Talu": "khb-Talu-CN", + "und-Taml": "ta-Taml-IN", + "und-Tang": "txg-Tang-CN", + "und-Tavt": "blt-Tavt-VN", + "und-TD": "fr-Latn-TD", + "und-Telu": "te-Telu-IN", + "und-TF": "fr-Latn-TF", + "und-Tfng": "zgh-Tfng-MA", + "und-TG": "fr-Latn-TG", + "und-Tglg": "fil-Tglg-PH", + "und-TH": "th-Thai-TH", + "und-Thaa": "dv-Thaa-MV", + "und-Thai": "th-Thai-TH", + "und-Thai-CN": "lcp-Thai-CN", + "und-Thai-KH": "kdt-Thai-KH", + "und-Thai-LA": "kdt-Thai-LA", + "und-Tibt": "bo-Tibt-CN", + "und-Tirh": "mai-Tirh-IN", + "und-TJ": "tg-Cyrl-TJ", + "und-TK": "tkl-Latn-TK", + "und-TL": "pt-Latn-TL", + "und-TM": "tk-Latn-TM", + "und-TN": "ar-Arab-TN", + "und-TO": "to-Latn-TO", + "und-TR": "tr-Latn-TR", + "und-TV": "tvl-Latn-TV", + "und-TW": "zh-Hant-TW", + "und-TZ": "sw-Latn-TZ", + "und-UA": "uk-Cyrl-UA", + "und-UG": "sw-Latn-UG", + "und-Ugar": "uga-Ugar-SY", + "und-UY": "es-Latn-UY", + "und-UZ": "uz-Latn-UZ", + "und-VA": "it-Latn-VA", + "und-Vaii": "vai-Vaii-LR", + "und-VE": "es-Latn-VE", + "und-VN": "vi-Latn-VN", + "und-VU": "bi-Latn-VU", + "und-Wara": "hoc-Wara-IN", + "und-Wcho": "nnp-Wcho-IN", + "und-WF": "fr-Latn-WF", + "und-WS": "sm-Latn-WS", + "und-XK": "sq-Latn-XK", + "und-Xpeo": "peo-Xpeo-IR", + "und-Xsux": "akk-Xsux-IQ", + "und-YE": "ar-Arab-YE", + "und-Yezi": "ku-Yezi-GE", + "und-Yiii": "ii-Yiii-CN", + "und-YT": "fr-Latn-YT", + "und-Zanb": "cmg-Zanb-MN", + "und-ZW": "sn-Latn-ZW", + "unr": "unr-Beng-IN", + "unr-Deva": "unr-Deva-NP", + "unr-NP": "unr-Deva-NP", + "unx": "unx-Beng-IN", + "uok": "uok-Latn-ZZ", + "ur": "ur-Arab-PK", + "uri": "uri-Latn-ZZ", + "urt": "urt-Latn-ZZ", + "urw": "urw-Latn-ZZ", + "usa": "usa-Latn-ZZ", + "uth": "uth-Latn-ZZ", + "utr": "utr-Latn-ZZ", + "uvh": "uvh-Latn-ZZ", + "uvl": "uvl-Latn-ZZ", + "uz": "uz-Latn-UZ", + "uz-AF": "uz-Arab-AF", + "uz-Arab": "uz-Arab-AF", + "uz-CN": "uz-Cyrl-CN", + "vag": "vag-Latn-ZZ", + "vai": "vai-Vaii-LR", + "van": "van-Latn-ZZ", + "ve": "ve-Latn-ZA", + "vec": "vec-Latn-IT", + "vep": "vep-Latn-RU", + "vi": "vi-Latn-VN", + "vic": "vic-Latn-SX", + "viv": "viv-Latn-ZZ", + "vls": "vls-Latn-BE", + "vmf": "vmf-Latn-DE", + "vmw": "vmw-Latn-MZ", + "vo": "vo-Latn-001", + "vot": "vot-Latn-RU", + "vro": "vro-Latn-EE", + "vun": "vun-Latn-TZ", + "vut": "vut-Latn-ZZ", + "wa": "wa-Latn-BE", + "wae": "wae-Latn-CH", + "waj": "waj-Latn-ZZ", + "wal": "wal-Ethi-ET", + "wan": "wan-Latn-ZZ", + "war": "war-Latn-PH", + "wbp": "wbp-Latn-AU", + "wbq": "wbq-Telu-IN", + "wbr": "wbr-Deva-IN", + "wci": "wci-Latn-ZZ", + "wer": "wer-Latn-ZZ", + "wgi": "wgi-Latn-ZZ", + "whg": "whg-Latn-ZZ", + "wib": "wib-Latn-ZZ", + "wiu": "wiu-Latn-ZZ", + "wiv": "wiv-Latn-ZZ", + "wja": "wja-Latn-ZZ", + "wji": "wji-Latn-ZZ", + "wls": "wls-Latn-WF", + "wmo": "wmo-Latn-ZZ", + "wnc": "wnc-Latn-ZZ", + "wni": "wni-Arab-KM", + "wnu": "wnu-Latn-ZZ", + "wo": "wo-Latn-SN", + "wob": "wob-Latn-ZZ", + "wos": "wos-Latn-ZZ", + "wrs": "wrs-Latn-ZZ", + "wsg": "wsg-Gong-IN", + "wsk": "wsk-Latn-ZZ", + "wtm": "wtm-Deva-IN", + "wuu": "wuu-Hans-CN", + "wuv": "wuv-Latn-ZZ", + "wwa": "wwa-Latn-ZZ", + "xav": "xav-Latn-BR", + "xbi": "xbi-Latn-ZZ", + "xco": "xco-Chrs-UZ", + "xcr": "xcr-Cari-TR", + "xes": "xes-Latn-ZZ", + "xh": "xh-Latn-ZA", + "xla": "xla-Latn-ZZ", + "xlc": "xlc-Lyci-TR", + "xld": "xld-Lydi-TR", + "xmf": "xmf-Geor-GE", + "xmn": "xmn-Mani-CN", + "xmr": "xmr-Merc-SD", + "xna": "xna-Narb-SA", + "xnr": "xnr-Deva-IN", + "xog": "xog-Latn-UG", + "xon": "xon-Latn-ZZ", + "xpr": "xpr-Prti-IR", + "xrb": "xrb-Latn-ZZ", + "xsa": "xsa-Sarb-YE", + "xsi": "xsi-Latn-ZZ", + "xsm": "xsm-Latn-ZZ", + "xsr": "xsr-Deva-NP", + "xwe": "xwe-Latn-ZZ", + "yam": "yam-Latn-ZZ", + "yao": "yao-Latn-MZ", + "yap": "yap-Latn-FM", + "yas": "yas-Latn-ZZ", + "yat": "yat-Latn-ZZ", + "yav": "yav-Latn-CM", + "yay": "yay-Latn-ZZ", + "yaz": "yaz-Latn-ZZ", + "yba": "yba-Latn-ZZ", + "ybb": "ybb-Latn-CM", + "yby": "yby-Latn-ZZ", + "yer": "yer-Latn-ZZ", + "ygr": "ygr-Latn-ZZ", + "ygw": "ygw-Latn-ZZ", + "yi": "yi-Hebr-001", + "yko": "yko-Latn-ZZ", + "yle": "yle-Latn-ZZ", + "ylg": "ylg-Latn-ZZ", + "yll": "yll-Latn-ZZ", + "yml": "yml-Latn-ZZ", + "yo": "yo-Latn-NG", + "yon": "yon-Latn-ZZ", + "yrb": "yrb-Latn-ZZ", + "yre": "yre-Latn-ZZ", + "yrl": "yrl-Latn-BR", + "yss": "yss-Latn-ZZ", + "yua": "yua-Latn-MX", + "yue": "yue-Hant-HK", + "yue-CN": "yue-Hans-CN", + "yue-Hans": "yue-Hans-CN", + "yuj": "yuj-Latn-ZZ", + "yut": "yut-Latn-ZZ", + "yuw": "yuw-Latn-ZZ", + "za": "za-Latn-CN", + "zag": "zag-Latn-SD", + "zdj": "zdj-Arab-KM", + "zea": "zea-Latn-NL", + "zgh": "zgh-Tfng-MA", + "zh": "zh-Hans-CN", + "zh-AU": "zh-Hant-AU", + "zh-BN": "zh-Hant-BN", + "zh-Bopo": "zh-Bopo-TW", + "zh-GB": "zh-Hant-GB", + "zh-GF": "zh-Hant-GF", + "zh-Hanb": "zh-Hanb-TW", + "zh-Hant": "zh-Hant-TW", + "zh-HK": "zh-Hant-HK", + "zh-ID": "zh-Hant-ID", + "zh-MO": "zh-Hant-MO", + "zh-PA": "zh-Hant-PA", + "zh-PF": "zh-Hant-PF", + "zh-PH": "zh-Hant-PH", + "zh-SR": "zh-Hant-SR", + "zh-TH": "zh-Hant-TH", + "zh-TW": "zh-Hant-TW", + "zh-US": "zh-Hant-US", + "zh-VN": "zh-Hant-VN", + "zhx": "zhx-Nshu-CN", + "zia": "zia-Latn-ZZ", + "zkt": "zkt-Kits-CN", + "zlm": "zlm-Latn-TG", + "zmi": "zmi-Latn-MY", + "zne": "zne-Latn-ZZ", + "zu": "zu-Latn-ZA", + "zza": "zza-Latn-TR" + } + } +} diff --git a/resources/testdata/data/cldr/cldr-core/supplemental/numberingSystems.json b/resources/testdata/data/cldr/cldr-core/supplemental/numberingSystems.json new file mode 100644 index 00000000000..9df7ba8048f --- /dev/null +++ b/resources/testdata/data/cldr/cldr-core/supplemental/numberingSystems.json @@ -0,0 +1,350 @@ +{ + "supplemental": { + "version": { + "_unicodeVersion": "13.0.0", + "_cldrVersion": "38" + }, + "numberingSystems": { + "adlm": { + "_digits": "𞥐𞥑𞥒𞥓𞥔𞥕𞥖𞥗𞥘𞥙", + "_type": "numeric" + }, + "ahom": { + "_digits": "𑜰𑜱𑜲𑜳𑜴𑜵𑜶𑜷𑜸𑜹", + "_type": "numeric" + }, + "arab": { + "_digits": "٠١٢٣٤٥٦٧٨٩", + "_type": "numeric" + }, + "arabext": { + "_digits": "۰۱۲۳۴۵۶۷۸۹", + "_type": "numeric" + }, + "armn": { + "_rules": "armenian-upper", + "_type": "algorithmic" + }, + "armnlow": { + "_rules": "armenian-lower", + "_type": "algorithmic" + }, + "bali": { + "_digits": "᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙", + "_type": "numeric" + }, + "beng": { + "_digits": "০১২৩৪৫৬৭৮৯", + "_type": "numeric" + }, + "bhks": { + "_digits": "𑱐𑱑𑱒𑱓𑱔𑱕𑱖𑱗𑱘𑱙", + "_type": "numeric" + }, + "brah": { + "_digits": "𑁦𑁧𑁨𑁩𑁪𑁫𑁬𑁭𑁮𑁯", + "_type": "numeric" + }, + "cakm": { + "_digits": "𑄶𑄷𑄸𑄹𑄺𑄻𑄼𑄽𑄾𑄿", + "_type": "numeric" + }, + "cham": { + "_digits": "꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙", + "_type": "numeric" + }, + "cyrl": { + "_rules": "cyrillic-lower", + "_type": "algorithmic" + }, + "deva": { + "_digits": "०१२३४५६७८९", + "_type": "numeric" + }, + "diak": { + "_digits": "𑥐𑥑𑥒𑥓𑥔𑥕𑥖𑥗𑥘𑥙", + "_type": "numeric" + }, + "ethi": { + "_rules": "ethiopic", + "_type": "algorithmic" + }, + "fullwide": { + "_digits": "0123456789", + "_type": "numeric" + }, + "geor": { + "_rules": "georgian", + "_type": "algorithmic" + }, + "gong": { + "_digits": "𑶠𑶡𑶢𑶣𑶤𑶥𑶦𑶧𑶨𑶩", + "_type": "numeric" + }, + "gonm": { + "_digits": "𑵐𑵑𑵒𑵓𑵔𑵕𑵖𑵗𑵘𑵙", + "_type": "numeric" + }, + "grek": { + "_rules": "greek-upper", + "_type": "algorithmic" + }, + "greklow": { + "_rules": "greek-lower", + "_type": "algorithmic" + }, + "gujr": { + "_digits": "૦૧૨૩૪૫૬૭૮૯", + "_type": "numeric" + }, + "guru": { + "_digits": "੦੧੨੩੪੫੬੭੮੯", + "_type": "numeric" + }, + "hanidays": { + "_rules": "zh/SpelloutRules/spellout-numbering-days", + "_type": "algorithmic" + }, + "hanidec": { + "_digits": "〇一二三四五六七八九", + "_type": "numeric" + }, + "hans": { + "_rules": "zh/SpelloutRules/spellout-cardinal", + "_type": "algorithmic" + }, + "hansfin": { + "_rules": "zh/SpelloutRules/spellout-cardinal-financial", + "_type": "algorithmic" + }, + "hant": { + "_rules": "zh_Hant/SpelloutRules/spellout-cardinal", + "_type": "algorithmic" + }, + "hantfin": { + "_rules": "zh_Hant/SpelloutRules/spellout-cardinal-financial", + "_type": "algorithmic" + }, + "hebr": { + "_rules": "hebrew", + "_type": "algorithmic" + }, + "hmng": { + "_digits": "𖭐𖭑𖭒𖭓𖭔𖭕𖭖𖭗𖭘𖭙", + "_type": "numeric" + }, + "hmnp": { + "_digits": "𞅀𞅁𞅂𞅃𞅄𞅅𞅆𞅇𞅈𞅉", + "_type": "numeric" + }, + "java": { + "_digits": "꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙", + "_type": "numeric" + }, + "jpan": { + "_rules": "ja/SpelloutRules/spellout-cardinal", + "_type": "algorithmic" + }, + "jpanfin": { + "_rules": "ja/SpelloutRules/spellout-cardinal-financial", + "_type": "algorithmic" + }, + "jpanyear": { + "_rules": "ja/SpelloutRules/spellout-numbering-year-latn", + "_type": "algorithmic" + }, + "kali": { + "_digits": "꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉", + "_type": "numeric" + }, + "khmr": { + "_digits": "០១២៣៤៥៦៧៨៩", + "_type": "numeric" + }, + "knda": { + "_digits": "೦೧೨೩೪೫೬೭೮೯", + "_type": "numeric" + }, + "lana": { + "_digits": "᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉", + "_type": "numeric" + }, + "lanatham": { + "_digits": "᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙", + "_type": "numeric" + }, + "laoo": { + "_digits": "໐໑໒໓໔໕໖໗໘໙", + "_type": "numeric" + }, + "latn": { + "_digits": "0123456789", + "_type": "numeric" + }, + "lepc": { + "_digits": "᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉", + "_type": "numeric" + }, + "limb": { + "_digits": "᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏", + "_type": "numeric" + }, + "mathbold": { + "_digits": "𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗", + "_type": "numeric" + }, + "mathdbl": { + "_digits": "𝟘𝟙𝟚𝟛𝟜𝟝𝟞𝟟𝟠𝟡", + "_type": "numeric" + }, + "mathmono": { + "_digits": "𝟶𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿", + "_type": "numeric" + }, + "mathsanb": { + "_digits": "𝟬𝟭𝟮𝟯𝟰𝟱𝟲𝟳𝟴𝟵", + "_type": "numeric" + }, + "mathsans": { + "_digits": "𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫", + "_type": "numeric" + }, + "mlym": { + "_digits": "൦൧൨൩൪൫൬൭൮൯", + "_type": "numeric" + }, + "modi": { + "_digits": "𑙐𑙑𑙒𑙓𑙔𑙕𑙖𑙗𑙘𑙙", + "_type": "numeric" + }, + "mong": { + "_digits": "᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙", + "_type": "numeric" + }, + "mroo": { + "_digits": "𖩠𖩡𖩢𖩣𖩤𖩥𖩦𖩧𖩨𖩩", + "_type": "numeric" + }, + "mtei": { + "_digits": "꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹", + "_type": "numeric" + }, + "mymr": { + "_digits": "၀၁၂၃၄၅၆၇၈၉", + "_type": "numeric" + }, + "mymrshan": { + "_digits": "႐႑႒႓႔႕႖႗႘႙", + "_type": "numeric" + }, + "mymrtlng": { + "_digits": "꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹", + "_type": "numeric" + }, + "newa": { + "_digits": "𑑐𑑑𑑒𑑓𑑔𑑕𑑖𑑗𑑘𑑙", + "_type": "numeric" + }, + "nkoo": { + "_digits": "߀߁߂߃߄߅߆߇߈߉", + "_type": "numeric" + }, + "olck": { + "_digits": "᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙", + "_type": "numeric" + }, + "orya": { + "_digits": "୦୧୨୩୪୫୬୭୮୯", + "_type": "numeric" + }, + "osma": { + "_digits": "𐒠𐒡𐒢𐒣𐒤𐒥𐒦𐒧𐒨𐒩", + "_type": "numeric" + }, + "rohg": { + "_digits": "𐴰𐴱𐴲𐴳𐴴𐴵𐴶𐴷𐴸𐴹", + "_type": "numeric" + }, + "roman": { + "_rules": "roman-upper", + "_type": "algorithmic" + }, + "romanlow": { + "_rules": "roman-lower", + "_type": "algorithmic" + }, + "saur": { + "_digits": "꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙", + "_type": "numeric" + }, + "segment": { + "_digits": "🯰🯱🯲🯳🯴🯵🯶🯷🯸🯹", + "_type": "numeric" + }, + "shrd": { + "_digits": "𑇐𑇑𑇒𑇓𑇔𑇕𑇖𑇗𑇘𑇙", + "_type": "numeric" + }, + "sind": { + "_digits": "𑋰𑋱𑋲𑋳𑋴𑋵𑋶𑋷𑋸𑋹", + "_type": "numeric" + }, + "sinh": { + "_digits": "෦෧෨෩෪෫෬෭෮෯", + "_type": "numeric" + }, + "sora": { + "_digits": "𑃰𑃱𑃲𑃳𑃴𑃵𑃶𑃷𑃸𑃹", + "_type": "numeric" + }, + "sund": { + "_digits": "᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹", + "_type": "numeric" + }, + "takr": { + "_digits": "𑛀𑛁𑛂𑛃𑛄𑛅𑛆𑛇𑛈𑛉", + "_type": "numeric" + }, + "talu": { + "_digits": "᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙", + "_type": "numeric" + }, + "taml": { + "_rules": "tamil", + "_type": "algorithmic" + }, + "tamldec": { + "_digits": "௦௧௨௩௪௫௬௭௮௯", + "_type": "numeric" + }, + "telu": { + "_digits": "౦౧౨౩౪౫౬౭౮౯", + "_type": "numeric" + }, + "thai": { + "_digits": "๐๑๒๓๔๕๖๗๘๙", + "_type": "numeric" + }, + "tibt": { + "_digits": "༠༡༢༣༤༥༦༧༨༩", + "_type": "numeric" + }, + "tirh": { + "_digits": "𑓐𑓑𑓒𑓓𑓔𑓕𑓖𑓗𑓘𑓙", + "_type": "numeric" + }, + "vaii": { + "_digits": "꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩", + "_type": "numeric" + }, + "wara": { + "_digits": "𑣠𑣡𑣢𑣣𑣤𑣥𑣦𑣧𑣨𑣩", + "_type": "numeric" + }, + "wcho": { + "_digits": "𞋰𞋱𞋲𞋳𞋴𞋵𞋶𞋷𞋸𞋹", + "_type": "numeric" + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-core/supplemental/ordinals.json b/resources/testdata/data/cldr/cldr-core/supplemental/ordinals.json new file mode 100644 index 00000000000..c328bb18c6d --- /dev/null +++ b/resources/testdata/data/cldr/cldr-core/supplemental/ordinals.json @@ -0,0 +1,377 @@ +{ + "supplemental": { + "version": { + "_unicodeVersion": "13.0.0", + "_cldrVersion": "38" + }, + "plurals-type-ordinal": { + "af": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "am": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "an": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ar": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "as": { + "pluralRule-count-one": "n = 1,5,7,8,9,10 @integer 1, 5, 7~10", + "pluralRule-count-two": "n = 2,3 @integer 2, 3", + "pluralRule-count-few": "n = 4 @integer 4", + "pluralRule-count-many": "n = 6 @integer 6", + "pluralRule-count-other": " @integer 0, 11~25, 100, 1000, 10000, 100000, 1000000, …" + }, + "az": { + "pluralRule-count-one": "i % 10 = 1,2,5,7,8 or i % 100 = 20,50,70,80 @integer 1, 2, 5, 7, 8, 11, 12, 15, 17, 18, 20~22, 25, 101, 1001, …", + "pluralRule-count-few": "i % 10 = 3,4 or i % 1000 = 100,200,300,400,500,600,700,800,900 @integer 3, 4, 13, 14, 23, 24, 33, 34, 43, 44, 53, 54, 63, 64, 73, 74, 100, 1003, …", + "pluralRule-count-many": "i = 0 or i % 10 = 6 or i % 100 = 40,60,90 @integer 0, 6, 16, 26, 36, 40, 46, 56, 106, 1006, …", + "pluralRule-count-other": " @integer 9, 10, 19, 29, 30, 39, 49, 59, 69, 79, 109, 1000, 10000, 100000, 1000000, …" + }, + "be": { + "pluralRule-count-few": "n % 10 = 2,3 and n % 100 != 12,13 @integer 2, 3, 22, 23, 32, 33, 42, 43, 52, 53, 62, 63, 72, 73, 82, 83, 102, 1002, …", + "pluralRule-count-other": " @integer 0, 1, 4~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "bg": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "bn": { + "pluralRule-count-one": "n = 1,5,7,8,9,10 @integer 1, 5, 7~10", + "pluralRule-count-two": "n = 2,3 @integer 2, 3", + "pluralRule-count-few": "n = 4 @integer 4", + "pluralRule-count-many": "n = 6 @integer 6", + "pluralRule-count-other": " @integer 0, 11~25, 100, 1000, 10000, 100000, 1000000, …" + }, + "bs": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ca": { + "pluralRule-count-one": "n = 1,3 @integer 1, 3", + "pluralRule-count-two": "n = 2 @integer 2", + "pluralRule-count-few": "n = 4 @integer 4", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" + }, + "ce": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "cs": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "cy": { + "pluralRule-count-zero": "n = 0,7,8,9 @integer 0, 7~9", + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-two": "n = 2 @integer 2", + "pluralRule-count-few": "n = 3,4 @integer 3, 4", + "pluralRule-count-many": "n = 5,6 @integer 5, 6", + "pluralRule-count-other": " @integer 10~25, 100, 1000, 10000, 100000, 1000000, …" + }, + "da": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "de": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "dsb": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "el": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "en": { + "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …", + "pluralRule-count-two": "n % 10 = 2 and n % 100 != 12 @integer 2, 22, 32, 42, 52, 62, 72, 82, 102, 1002, …", + "pluralRule-count-few": "n % 10 = 3 and n % 100 != 13 @integer 3, 23, 33, 43, 53, 63, 73, 83, 103, 1003, …", + "pluralRule-count-other": " @integer 0, 4~18, 100, 1000, 10000, 100000, 1000000, …" + }, + "es": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "et": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "eu": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "fa": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "fi": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "fil": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "fr": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "fy": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ga": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "gd": { + "pluralRule-count-one": "n = 1,11 @integer 1, 11", + "pluralRule-count-two": "n = 2,12 @integer 2, 12", + "pluralRule-count-few": "n = 3,13 @integer 3, 13", + "pluralRule-count-other": " @integer 0, 4~10, 14~21, 100, 1000, 10000, 100000, 1000000, …" + }, + "gl": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "gsw": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "gu": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-two": "n = 2,3 @integer 2, 3", + "pluralRule-count-few": "n = 4 @integer 4", + "pluralRule-count-many": "n = 6 @integer 6", + "pluralRule-count-other": " @integer 0, 5, 7~20, 100, 1000, 10000, 100000, 1000000, …" + }, + "he": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "hi": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-two": "n = 2,3 @integer 2, 3", + "pluralRule-count-few": "n = 4 @integer 4", + "pluralRule-count-many": "n = 6 @integer 6", + "pluralRule-count-other": " @integer 0, 5, 7~20, 100, 1000, 10000, 100000, 1000000, …" + }, + "hr": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "hsb": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "hu": { + "pluralRule-count-one": "n = 1,5 @integer 1, 5", + "pluralRule-count-other": " @integer 0, 2~4, 6~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "hy": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "ia": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "id": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "in": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "is": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "it": { + "pluralRule-count-many": "n = 11,8,80,800 @integer 8, 11, 80, 800", + "pluralRule-count-other": " @integer 0~7, 9, 10, 12~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "iw": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ja": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ka": { + "pluralRule-count-one": "i = 1 @integer 1", + "pluralRule-count-many": "i = 0 or i % 100 = 2..20,40,60,80 @integer 0, 2~16, 102, 1002, …", + "pluralRule-count-other": " @integer 21~36, 100, 1000, 10000, 100000, 1000000, …" + }, + "kk": { + "pluralRule-count-many": "n % 10 = 6 or n % 10 = 9 or n % 10 = 0 and n != 0 @integer 6, 9, 10, 16, 19, 20, 26, 29, 30, 36, 39, 40, 100, 1000, 10000, 100000, 1000000, …", + "pluralRule-count-other": " @integer 0~5, 7, 8, 11~15, 17, 18, 21, 101, 1001, …" + }, + "km": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "kn": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ko": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "kw": { + "pluralRule-count-one": "n = 1..4 or n % 100 = 1..4,21..24,41..44,61..64,81..84 @integer 1~4, 21~24, 41~44, 61~64, 101, 1001, …", + "pluralRule-count-many": "n = 5 or n % 100 = 5 @integer 5, 105, 205, 305, 405, 505, 605, 705, 1005, …", + "pluralRule-count-other": " @integer 0, 6~20, 100, 1000, 10000, 100000, 1000000, …" + }, + "ky": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "lij": { + "pluralRule-count-many": "n = 11,8,80..89,800..899 @integer 8, 11, 80~89, 800~803", + "pluralRule-count-other": " @integer 0~7, 9, 10, 12~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "lo": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "lt": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "lv": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "mk": { + "pluralRule-count-one": "i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …", + "pluralRule-count-two": "i % 10 = 2 and i % 100 != 12 @integer 2, 22, 32, 42, 52, 62, 72, 82, 102, 1002, …", + "pluralRule-count-many": "i % 10 = 7,8 and i % 100 != 17,18 @integer 7, 8, 27, 28, 37, 38, 47, 48, 57, 58, 67, 68, 77, 78, 87, 88, 107, 1007, …", + "pluralRule-count-other": " @integer 0, 3~6, 9~19, 100, 1000, 10000, 100000, 1000000, …" + }, + "ml": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "mn": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "mo": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "mr": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-two": "n = 2,3 @integer 2, 3", + "pluralRule-count-few": "n = 4 @integer 4", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" + }, + "ms": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "my": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "nb": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ne": { + "pluralRule-count-one": "n = 1..4 @integer 1~4", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" + }, + "nl": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "or": { + "pluralRule-count-one": "n = 1,5,7..9 @integer 1, 5, 7~9", + "pluralRule-count-two": "n = 2,3 @integer 2, 3", + "pluralRule-count-few": "n = 4 @integer 4", + "pluralRule-count-many": "n = 6 @integer 6", + "pluralRule-count-other": " @integer 0, 10~24, 100, 1000, 10000, 100000, 1000000, …" + }, + "pa": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "pl": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "prg": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ps": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "pt": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ro": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "root": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ru": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "sc": { + "pluralRule-count-many": "n = 11,8,80,800 @integer 8, 11, 80, 800", + "pluralRule-count-other": " @integer 0~7, 9, 10, 12~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "scn": { + "pluralRule-count-many": "n = 11,8,80,800 @integer 8, 11, 80, 800", + "pluralRule-count-other": " @integer 0~7, 9, 10, 12~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "sd": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "sh": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "si": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "sk": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "sl": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "sq": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-many": "n % 10 = 4 and n % 100 != 14 @integer 4, 24, 34, 44, 54, 64, 74, 84, 104, 1004, …", + "pluralRule-count-other": " @integer 0, 2, 3, 5~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "sr": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "sv": { + "pluralRule-count-one": "n % 10 = 1,2 and n % 100 != 11,12 @integer 1, 2, 21, 22, 31, 32, 41, 42, 51, 52, 61, 62, 71, 72, 81, 82, 101, 1001, …", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, …" + }, + "sw": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "ta": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "te": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "th": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "tk": { + "pluralRule-count-few": "n % 10 = 6,9 or n = 10 @integer 6, 9, 10, 16, 19, 26, 29, 36, 39, 106, 1006, …", + "pluralRule-count-other": " @integer 0~5, 7, 8, 11~15, 17, 18, 20, 100, 1000, 10000, 100000, 1000000, …" + }, + "tl": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "tr": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "uk": { + "pluralRule-count-few": "n % 10 = 3 and n % 100 != 13 @integer 3, 23, 33, 43, 53, 63, 73, 83, 103, 1003, …", + "pluralRule-count-other": " @integer 0~2, 4~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "ur": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "uz": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "vi": { + "pluralRule-count-one": "n = 1 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, …" + }, + "yue": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "zh": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + }, + "zu": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, …" + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-core/supplemental/plurals.json b/resources/testdata/data/cldr/cldr-core/supplemental/plurals.json new file mode 100644 index 00000000000..2ecee486550 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-core/supplemental/plurals.json @@ -0,0 +1,911 @@ +{ + "supplemental": { + "version": { + "_unicodeVersion": "13.0.0", + "_cldrVersion": "38" + }, + "plurals-type-cardinal": { + "af": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ak": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "am": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "an": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ar": { + "pluralRule-count-zero": "n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000", + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-few": "n % 100 = 3..10 @integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …", + "pluralRule-count-many": "n % 100 = 11..99 @integer 11~26, 111, 1011, … @decimal 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …", + "pluralRule-count-other": " @integer 100~102, 200~202, 300~302, 400~402, 500~502, 600, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ars": { + "pluralRule-count-zero": "n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000", + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-few": "n % 100 = 3..10 @integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …", + "pluralRule-count-many": "n % 100 = 11..99 @integer 11~26, 111, 1011, … @decimal 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …", + "pluralRule-count-other": " @integer 100~102, 200~202, 300~302, 400~402, 500~502, 600, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "as": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "asa": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ast": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "az": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "be": { + "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …", + "pluralRule-count-few": "n % 10 = 2..4 and n % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 2.0, 3.0, 4.0, 22.0, 23.0, 24.0, 32.0, 33.0, 102.0, 1002.0, …", + "pluralRule-count-many": "n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …" + }, + "bem": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "bez": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "bg": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "bho": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "bm": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "bn": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "bo": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "br": { + "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11,71,91 @integer 1, 21, 31, 41, 51, 61, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 81.0, 101.0, 1001.0, …", + "pluralRule-count-two": "n % 10 = 2 and n % 100 != 12,72,92 @integer 2, 22, 32, 42, 52, 62, 82, 102, 1002, … @decimal 2.0, 22.0, 32.0, 42.0, 52.0, 62.0, 82.0, 102.0, 1002.0, …", + "pluralRule-count-few": "n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99 @integer 3, 4, 9, 23, 24, 29, 33, 34, 39, 43, 44, 49, 103, 1003, … @decimal 3.0, 4.0, 9.0, 23.0, 24.0, 29.0, 33.0, 34.0, 103.0, 1003.0, …", + "pluralRule-count-many": "n != 0 and n % 1000000 = 0 @integer 1000000, … @decimal 1000000.0, 1000000.00, 1000000.000, 1000000.0000, …", + "pluralRule-count-other": " @integer 0, 5~8, 10~20, 100, 1000, 10000, 100000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, …" + }, + "brx": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "bs": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 10.2, 100.2, 1000.2, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ca": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ce": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ceb": { + "pluralRule-count-one": "v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9 @integer 0~3, 5, 7, 8, 10~13, 15, 17, 18, 20, 21, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.3, 0.5, 0.7, 0.8, 1.0~1.3, 1.5, 1.7, 1.8, 2.0, 2.1, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 4, 6, 9, 14, 16, 19, 24, 26, 104, 1004, … @decimal 0.4, 0.6, 0.9, 1.4, 1.6, 1.9, 2.4, 2.6, 10.4, 100.4, 1000.4, …" + }, + "cgg": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "chr": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ckb": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "cs": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-few": "i = 2..4 and v = 0 @integer 2~4", + "pluralRule-count-many": "v != 0 @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" + }, + "cy": { + "pluralRule-count-zero": "n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000", + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-few": "n = 3 @integer 3 @decimal 3.0, 3.00, 3.000, 3.0000", + "pluralRule-count-many": "n = 6 @integer 6 @decimal 6.0, 6.00, 6.000, 6.0000", + "pluralRule-count-other": " @integer 4, 5, 7~20, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "da": { + "pluralRule-count-one": "n = 1 or t != 0 and i = 0,1 @integer 1 @decimal 0.1~1.6", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 2.0~3.4, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "de": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "doi": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "dsb": { + "pluralRule-count-one": "v = 0 and i % 100 = 1 or f % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-two": "v = 0 and i % 100 = 2 or f % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702, 1002, … @decimal 0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 7.2, 10.2, 100.2, 1000.2, …", + "pluralRule-count-few": "v = 0 and i % 100 = 3..4 or f % 100 = 3..4 @integer 3, 4, 103, 104, 203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … @decimal 0.3, 0.4, 1.3, 1.4, 2.3, 2.4, 3.3, 3.4, 4.3, 4.4, 5.3, 5.4, 6.3, 6.4, 7.3, 7.4, 10.3, 100.3, 1000.3, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "dv": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "dz": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ee": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "el": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "en": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "eo": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "es": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "et": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "eu": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "fa": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ff": { + "pluralRule-count-one": "i = 0,1 @integer 0, 1 @decimal 0.0~1.5", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "fi": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "fil": { + "pluralRule-count-one": "v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9 @integer 0~3, 5, 7, 8, 10~13, 15, 17, 18, 20, 21, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.3, 0.5, 0.7, 0.8, 1.0~1.3, 1.5, 1.7, 1.8, 2.0, 2.1, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 4, 6, 9, 14, 16, 19, 24, 26, 104, 1004, … @decimal 0.4, 0.6, 0.9, 1.4, 1.6, 1.9, 2.4, 2.6, 10.4, 100.4, 1000.4, …" + }, + "fo": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "fr": { + "pluralRule-count-one": "i = 0,1 @integer 0, 1 @decimal 0.0~1.5", + "pluralRule-count-many": "e = 0 and i != 0 and i % 1000000 = 0 and v = 0 or e != 0..5 @integer 1000000, 1e6, 2e6, 3e6, 4e6, 5e6, 6e6, … @decimal 1.0000001e6, 1.1e6, 2.0000001e6, 2.1e6, 3.0000001e6, 3.1e6, …", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1e3, 2e3, 3e3, 4e3, 5e3, 6e3, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 1.0001e3, 1.1e3, 2.0001e3, 2.1e3, 3.0001e3, 3.1e3, …" + }, + "fur": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "fy": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ga": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-few": "n = 3..6 @integer 3~6 @decimal 3.0, 4.0, 5.0, 6.0, 3.00, 4.00, 5.00, 6.00, 3.000, 4.000, 5.000, 6.000, 3.0000, 4.0000, 5.0000, 6.0000", + "pluralRule-count-many": "n = 7..10 @integer 7~10 @decimal 7.0, 8.0, 9.0, 10.0, 7.00, 8.00, 9.00, 10.00, 7.000, 8.000, 9.000, 10.000, 7.0000, 8.0000, 9.0000, 10.0000", + "pluralRule-count-other": " @integer 0, 11~25, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "gd": { + "pluralRule-count-one": "n = 1,11 @integer 1, 11 @decimal 1.0, 11.0, 1.00, 11.00, 1.000, 11.000, 1.0000", + "pluralRule-count-two": "n = 2,12 @integer 2, 12 @decimal 2.0, 12.0, 2.00, 12.00, 2.000, 12.000, 2.0000", + "pluralRule-count-few": "n = 3..10,13..19 @integer 3~10, 13~19 @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 3.00", + "pluralRule-count-other": " @integer 0, 20~34, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "gl": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "gsw": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "gu": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "guw": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "gv": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 @integer 1, 11, 21, 31, 41, 51, 61, 71, 101, 1001, …", + "pluralRule-count-two": "v = 0 and i % 10 = 2 @integer 2, 12, 22, 32, 42, 52, 62, 72, 102, 1002, …", + "pluralRule-count-few": "v = 0 and i % 100 = 0,20,40,60,80 @integer 0, 20, 40, 60, 80, 100, 120, 140, 1000, 10000, 100000, 1000000, …", + "pluralRule-count-many": "v != 0 @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 3~10, 13~19, 23, 103, 1003, …" + }, + "ha": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "haw": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "he": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-two": "i = 2 and v = 0 @integer 2", + "pluralRule-count-many": "v = 0 and n != 0..10 and n % 10 = 0 @integer 20, 30, 40, 50, 60, 70, 80, 90, 100, 1000, 10000, 100000, 1000000, …", + "pluralRule-count-other": " @integer 0, 3~17, 101, 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "hi": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "hr": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 10.2, 100.2, 1000.2, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "hsb": { + "pluralRule-count-one": "v = 0 and i % 100 = 1 or f % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-two": "v = 0 and i % 100 = 2 or f % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702, 1002, … @decimal 0.2, 1.2, 2.2, 3.2, 4.2, 5.2, 6.2, 7.2, 10.2, 100.2, 1000.2, …", + "pluralRule-count-few": "v = 0 and i % 100 = 3..4 or f % 100 = 3..4 @integer 3, 4, 103, 104, 203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … @decimal 0.3, 0.4, 1.3, 1.4, 2.3, 2.4, 3.3, 3.4, 4.3, 4.4, 5.3, 5.4, 6.3, 6.4, 7.3, 7.4, 10.3, 100.3, 1000.3, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "hu": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "hy": { + "pluralRule-count-one": "i = 0,1 @integer 0, 1 @decimal 0.0~1.5", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ia": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "id": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ig": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ii": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "in": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "io": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "is": { + "pluralRule-count-one": "t = 0 and i % 10 = 1 and i % 100 != 11 or t != 0 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1~1.6, 10.1, 100.1, 1000.1, …", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "it": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "iu": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "iw": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-two": "i = 2 and v = 0 @integer 2", + "pluralRule-count-many": "v = 0 and n != 0..10 and n % 10 = 0 @integer 20, 30, 40, 50, 60, 70, 80, 90, 100, 1000, 10000, 100000, 1000000, …", + "pluralRule-count-other": " @integer 0, 3~17, 101, 1001, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ja": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "jbo": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "jgo": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ji": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "jmc": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "jv": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "jw": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ka": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kab": { + "pluralRule-count-one": "i = 0,1 @integer 0, 1 @decimal 0.0~1.5", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kaj": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kcg": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kde": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kea": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kk": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kkj": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kl": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "km": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kn": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ko": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ks": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ksb": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ksh": { + "pluralRule-count-zero": "n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000", + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ku": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "kw": { + "pluralRule-count-zero": "n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000", + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n % 100 = 2,22,42,62,82 or n % 1000 = 0 and n % 100000 = 1000..20000,40000,60000,80000 or n != 0 and n % 1000000 = 100000 @integer 2, 22, 42, 62, 82, 102, 122, 142, 1000, 10000, 100000, … @decimal 2.0, 22.0, 42.0, 62.0, 82.0, 102.0, 122.0, 142.0, 1000.0, 10000.0, 100000.0, …", + "pluralRule-count-few": "n % 100 = 3,23,43,63,83 @integer 3, 23, 43, 63, 83, 103, 123, 143, 1003, … @decimal 3.0, 23.0, 43.0, 63.0, 83.0, 103.0, 123.0, 143.0, 1003.0, …", + "pluralRule-count-many": "n != 1 and n % 100 = 1,21,41,61,81 @integer 21, 41, 61, 81, 101, 121, 141, 161, 1001, … @decimal 21.0, 41.0, 61.0, 81.0, 101.0, 121.0, 141.0, 161.0, 1001.0, …", + "pluralRule-count-other": " @integer 4~19, 100, 1004, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.1, 1000000.0, …" + }, + "ky": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lag": { + "pluralRule-count-zero": "n = 0 @integer 0 @decimal 0.0, 0.00, 0.000, 0.0000", + "pluralRule-count-one": "i = 0,1 and n != 0 @integer 1 @decimal 0.1~1.6", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lb": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lg": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lij": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lkt": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ln": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lo": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lt": { + "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11..19 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 1.0, 21.0, 31.0, 41.0, 51.0, 61.0, 71.0, 81.0, 101.0, 1001.0, …", + "pluralRule-count-few": "n % 10 = 2..9 and n % 100 != 11..19 @integer 2~9, 22~29, 102, 1002, … @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 22.0, 102.0, 1002.0, …", + "pluralRule-count-many": "f != 0 @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.1, 1000.1, …", + "pluralRule-count-other": " @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "lv": { + "pluralRule-count-zero": "n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19 @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.0, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-other": " @integer 2~9, 22~29, 102, 1002, … @decimal 0.2~0.9, 1.2~1.9, 10.2, 100.2, 1000.2, …" + }, + "mas": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "mg": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "mgo": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "mk": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.2~1.0, 1.2~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ml": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "mn": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "mo": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-few": "v != 0 or n = 0 or n % 100 = 2..19 @integer 0, 2~16, 102, 1002, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 20~35, 100, 1000, 10000, 100000, 1000000, …" + }, + "mr": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ms": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "mt": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-few": "n = 0 or n % 100 = 2..10 @integer 0, 2~10, 102~107, 1002, … @decimal 0.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 102.0, 1002.0, …", + "pluralRule-count-many": "n % 100 = 11..19 @integer 11~19, 111~117, 1011, … @decimal 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 111.0, 1011.0, …", + "pluralRule-count-other": " @integer 20~35, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "my": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nah": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "naq": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nb": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nd": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ne": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nl": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nn": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nnh": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "no": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nqo": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nr": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nso": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ny": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "nyn": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "om": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "or": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "os": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "osa": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "pa": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "pap": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "pcm": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "pl": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, …", + "pluralRule-count-many": "v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …", + "pluralRule-count-other": " @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "prg": { + "pluralRule-count-zero": "n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19 @integer 0, 10~20, 30, 40, 50, 60, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-one": "n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.0, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-other": " @integer 2~9, 22~29, 102, 1002, … @decimal 0.2~0.9, 1.2~1.9, 10.2, 100.2, 1000.2, …" + }, + "ps": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "pt": { + "pluralRule-count-one": "i = 0..1 @integer 0, 1 @decimal 0.0~1.5", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 2.0~3.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "pt-PT": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "rm": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ro": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-few": "v != 0 or n = 0 or n % 100 = 2..19 @integer 0, 2~16, 102, 1002, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 20~35, 100, 1000, 10000, 100000, 1000000, …" + }, + "rof": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "root": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ru": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …", + "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, …", + "pluralRule-count-many": "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …", + "pluralRule-count-other": " @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "rwk": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sah": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "saq": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sat": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sc": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "scn": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sd": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sdh": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "se": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "seh": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ses": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sg": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sh": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 10.2, 100.2, 1000.2, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "shi": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-few": "n = 2..10 @integer 2~10 @decimal 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 2.00, 3.00, 4.00, 5.00, 6.00, 7.00, 8.00", + "pluralRule-count-other": " @integer 11~26, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~1.9, 2.1~2.7, 10.1, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "si": { + "pluralRule-count-one": "n = 0,1 or i = 0 and f = 1 @integer 0, 1 @decimal 0.0, 0.1, 1.0, 0.00, 0.01, 1.00, 0.000, 0.001, 1.000, 0.0000, 0.0001, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.2~0.9, 1.1~1.8, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sk": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-few": "i = 2..4 and v = 0 @integer 2~4", + "pluralRule-count-many": "v != 0 @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" + }, + "sl": { + "pluralRule-count-one": "v = 0 and i % 100 = 1 @integer 1, 101, 201, 301, 401, 501, 601, 701, 1001, …", + "pluralRule-count-two": "v = 0 and i % 100 = 2 @integer 2, 102, 202, 302, 402, 502, 602, 702, 1002, …", + "pluralRule-count-few": "v = 0 and i % 100 = 3..4 or v != 0 @integer 3, 4, 103, 104, 203, 204, 303, 304, 403, 404, 503, 504, 603, 604, 703, 704, 1003, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …" + }, + "sma": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "smi": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "smj": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "smn": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sms": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-two": "n = 2 @integer 2 @decimal 2.0, 2.00, 2.000, 2.0000", + "pluralRule-count-other": " @integer 0, 3~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sn": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "so": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sq": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sr": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, … @decimal 0.1, 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 10.1, 100.1, 1000.1, …", + "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, … @decimal 0.2~0.4, 1.2~1.4, 2.2~2.4, 3.2~3.4, 4.2~4.4, 5.2, 10.2, 100.2, 1000.2, …", + "pluralRule-count-other": " @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0, 0.5~1.0, 1.5~2.0, 2.5~2.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ss": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ssy": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "st": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "su": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sv": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "sw": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "syr": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ta": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "te": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "teo": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "th": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ti": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "tig": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "tk": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "tl": { + "pluralRule-count-one": "v = 0 and i = 1,2,3 or v = 0 and i % 10 != 4,6,9 or v != 0 and f % 10 != 4,6,9 @integer 0~3, 5, 7, 8, 10~13, 15, 17, 18, 20, 21, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.3, 0.5, 0.7, 0.8, 1.0~1.3, 1.5, 1.7, 1.8, 2.0, 2.1, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …", + "pluralRule-count-other": " @integer 4, 6, 9, 14, 16, 19, 24, 26, 104, 1004, … @decimal 0.4, 0.6, 0.9, 1.4, 1.6, 1.9, 2.4, 2.6, 10.4, 100.4, 1000.4, …" + }, + "tn": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "to": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "tr": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ts": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "tzm": { + "pluralRule-count-one": "n = 0..1 or n = 11..99 @integer 0, 1, 11~24 @decimal 0.0, 1.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0", + "pluralRule-count-other": " @integer 2~10, 100~106, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ug": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "uk": { + "pluralRule-count-one": "v = 0 and i % 10 = 1 and i % 100 != 11 @integer 1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …", + "pluralRule-count-few": "v = 0 and i % 10 = 2..4 and i % 100 != 12..14 @integer 2~4, 22~24, 32~34, 42~44, 52~54, 62, 102, 1002, …", + "pluralRule-count-many": "v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14 @integer 0, 5~19, 100, 1000, 10000, 100000, 1000000, …", + "pluralRule-count-other": " @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ur": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "uz": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "ve": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "vi": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "vo": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "vun": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "wa": { + "pluralRule-count-one": "n = 0..1 @integer 0, 1 @decimal 0.0, 1.0, 0.00, 1.00, 0.000, 1.000, 0.0000, 1.0000", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 0.1~0.9, 1.1~1.7, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "wae": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "wo": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "xh": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "xog": { + "pluralRule-count-one": "n = 1 @integer 1 @decimal 1.0, 1.00, 1.000, 1.0000", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~0.9, 1.1~1.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "yi": { + "pluralRule-count-one": "i = 1 and v = 0 @integer 1", + "pluralRule-count-other": " @integer 0, 2~16, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "yo": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "yue": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "zh": { + "pluralRule-count-other": " @integer 0~15, 100, 1000, 10000, 100000, 1000000, … @decimal 0.0~1.5, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + }, + "zu": { + "pluralRule-count-one": "i = 0 or n = 1 @integer 0, 1 @decimal 0.0~1.0, 0.00~0.04", + "pluralRule-count-other": " @integer 2~17, 100, 1000, 10000, 100000, 1000000, … @decimal 1.1~2.6, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, …" + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/ar-EG/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/ar-EG/ca-gregorian.json new file mode 100644 index 00000000000..0efb7071607 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/ar-EG/ca-gregorian.json @@ -0,0 +1,558 @@ +{ + "main": { + "ar-EG": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ar", + "territory": "EG" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + }, + "narrow": { + "1": "ي", + "2": "ف", + "3": "م", + "4": "أ", + "5": "و", + "6": "ن", + "7": "ل", + "8": "غ", + "9": "س", + "10": "ك", + "11": "ب", + "12": "د" + }, + "wide": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + } + }, + "stand-alone": { + "abbreviated": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + }, + "narrow": { + "1": "ي", + "2": "ف", + "3": "م", + "4": "أ", + "5": "و", + "6": "ن", + "7": "ل", + "8": "غ", + "9": "س", + "10": "ك", + "11": "ب", + "12": "د" + }, + "wide": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + }, + "narrow": { + "sun": "ح", + "mon": "ن", + "tue": "ث", + "wed": "ر", + "thu": "خ", + "fri": "ج", + "sat": "س" + }, + "short": { + "sun": "أحد", + "mon": "إثنين", + "tue": "ثلاثاء", + "wed": "أربعاء", + "thu": "خميس", + "fri": "جمعة", + "sat": "سبت" + }, + "wide": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + }, + "narrow": { + "sun": "ح", + "mon": "ن", + "tue": "ث", + "wed": "ر", + "thu": "خ", + "fri": "ج", + "sat": "س" + }, + "short": { + "sun": "أحد", + "mon": "إثنين", + "tue": "ثلاثاء", + "wed": "أربعاء", + "thu": "خميس", + "fri": "جمعة", + "sat": "سبت" + }, + "wide": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + }, + "narrow": { + "1": "١", + "2": "٢", + "3": "٣", + "4": "٤" + }, + "wide": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + } + }, + "stand-alone": { + "abbreviated": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + }, + "narrow": { + "1": "١", + "2": "٢", + "3": "٣", + "4": "٤" + }, + "wide": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "ص", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "في المساء", + "night2": "ليلاً" + }, + "narrow": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + }, + "wide": { + "am": "ص", + "pm": "م", + "morning1": "في الصباح", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "في المساء", + "night2": "ليلاً" + } + }, + "stand-alone": { + "abbreviated": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "ص", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + }, + "narrow": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + }, + "wide": { + "am": "صباحًا", + "pm": "مساءً", + "morning1": "فجرًا", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + } + } + }, + "eras": { + "eraNames": { + "0": "قبل الميلاد", + "0-alt-variant": "قبل الحقبة الحالية", + "1": "ميلادي", + "1-alt-variant": "بعد الميلاد" + }, + "eraAbbr": { + "0": "ق.م", + "0-alt-variant": "ق. م", + "1": "م", + "1-alt-variant": "ب.م" + }, + "eraNarrow": { + "0": "ق.م", + "0-alt-variant": "ق. م", + "1": "م", + "1-alt-variant": "ب.م" + } + }, + "dateFormats": { + "full": "EEEE، d MMMM y", + "long": "d MMMM y", + "medium": "dd‏/MM‏/y", + "short": "d‏/M‏/y" + }, + "timeFormats": { + "full": "h:mm:ss a zzzz", + "long": "h:mm:ss a z", + "medium": "h:mm:ss a", + "short": "h:mm a" + }, + "dateTimeFormats": { + "full": "{1} في {0}", + "long": "{1} في {0}", + "medium": "{1}, {0}", + "short": "{1}, {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "E، d", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM y G", + "GyMMMEd": "E، d MMM y G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d/‏M", + "MEd": "E، d/‏M", + "MMdd": "dd‏/MM", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "E، d MMM", + "MMMMd": "d MMMM", + "MMMMEd": "E، d MMMM", + "MMMMW-count-zero": "الأسبوع W من MMMM", + "MMMMW-count-one": "الأسبوع W من MMMM", + "MMMMW-count-two": "الأسبوع W من MMMM", + "MMMMW-count-few": "الأسبوع W من MMMM", + "MMMMW-count-many": "الأسبوع W من MMMM", + "MMMMW-count-other": "الأسبوع W من MMMM", + "ms": "mm:ss", + "y": "y", + "yM": "M‏/y", + "yMd": "d‏/M‏/y", + "yMEd": "E، d/‏M/‏y", + "yMM": "MM‏/y", + "yMMM": "MMM y", + "yMMMd": "d MMM y", + "yMMMEd": "E، d MMM y", + "yMMMM": "MMMM y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ y", + "yw-count-zero": "الأسبوع w من سنة Y", + "yw-count-one": "الأسبوع w من سنة Y", + "yw-count-two": "الأسبوع w من سنة Y", + "yw-count-few": "الأسبوع w من سنة Y", + "yw-count-many": "الأسبوع w من سنة Y", + "yw-count-other": "الأسبوع w من سنة Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y G – y G", + "y": "y – y G" + }, + "GyM": { + "G": "MM-y GGGG – MM-y GGGG", + "M": "MM-y – MM-y GGGG", + "y": "MM-y – MM-y GGGG" + }, + "GyMd": { + "d": "d-MM-y – d-MM-y GGGG", + "G": "dd-MM-y GGGG – dd-MM-y GGGG", + "M": "dd-MM-y – dd-MM-y GGGG", + "y": "dd-MM-y – dd-MM-y GGGG" + }, + "GyMEd": { + "d": "E, dd-MM-y – E, dd-MM-y GGGG", + "G": "E, dd-MM-y GGGG – E, dd-MM-y GGGG", + "M": "E, dd-MM-y – E, dd-MM-y GGGG", + "y": "E, dd-MM-y – E, dd-MM-y GGGG" + }, + "GyMMM": { + "G": "MMM y G – MMM y G", + "M": "MMM – MMM y G", + "y": "MMM y – MMM y G" + }, + "GyMMMd": { + "d": "d–d MMM y G", + "G": "d MMM y G – d MMM y G", + "M": "d MMM – d MMM y G", + "y": "d MMM y – d MMM y G" + }, + "GyMMMEd": { + "d": "E, d MMM – E, d MMM y G", + "G": "E, d MMM y G – E, d MMM y G", + "M": "E, d MMM – E, d MMM y G", + "y": "E, d MMM y – E, d MMM y G" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d-M – d-M", + "M": "M/d – M/d" + }, + "MEd": { + "d": "E، d/‏M –‏ E، d/‏M", + "M": "E، d/‏M – E، d/‏M" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E، d – E، d MMM", + "M": "E، d MMM – E، d MMM" + }, + "MMMM": { + "M": "LLLL–LLLL" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M‏/y – M‏/y", + "y": "M‏/y – M‏/y" + }, + "yMd": { + "d": "d‏/M‏/y – d‏/M‏/y", + "M": "d‏/M‏/y – d‏/M‏/y", + "y": "d‏/M‏/y – d‏/M‏/y" + }, + "yMEd": { + "d": "E، dd‏/MM‏/y – E، dd‏/MM‏/y", + "M": "E، d‏/M‏/y – E، d‏/M‏/y", + "y": "E، d‏/M‏/y – E، d‏/M‏/y" + }, + "yMMM": { + "M": "MMM – MMM، y", + "y": "MMM، y – MMM، y" + }, + "yMMMd": { + "d": "d–d MMM، y", + "M": "d MMM – d MMM، y", + "y": "d MMM، y – d MMM، y" + }, + "yMMMEd": { + "d": "E، d – E، d MMM، y", + "M": "E، d MMM – E، d MMM، y", + "y": "E، d MMM، y – E، d MMM، y" + }, + "yMMMM": { + "M": "MMMM – MMMM، y", + "y": "MMMM، y – MMMM، y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/ar/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/ar/ca-gregorian.json new file mode 100644 index 00000000000..ee8e17a937d --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/ar/ca-gregorian.json @@ -0,0 +1,557 @@ +{ + "main": { + "ar": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ar" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + }, + "narrow": { + "1": "ي", + "2": "ف", + "3": "م", + "4": "أ", + "5": "و", + "6": "ن", + "7": "ل", + "8": "غ", + "9": "س", + "10": "ك", + "11": "ب", + "12": "د" + }, + "wide": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + } + }, + "stand-alone": { + "abbreviated": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + }, + "narrow": { + "1": "ي", + "2": "ف", + "3": "م", + "4": "أ", + "5": "و", + "6": "ن", + "7": "ل", + "8": "غ", + "9": "س", + "10": "ك", + "11": "ب", + "12": "د" + }, + "wide": { + "1": "يناير", + "2": "فبراير", + "3": "مارس", + "4": "أبريل", + "5": "مايو", + "6": "يونيو", + "7": "يوليو", + "8": "أغسطس", + "9": "سبتمبر", + "10": "أكتوبر", + "11": "نوفمبر", + "12": "ديسمبر" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + }, + "narrow": { + "sun": "ح", + "mon": "ن", + "tue": "ث", + "wed": "ر", + "thu": "خ", + "fri": "ج", + "sat": "س" + }, + "short": { + "sun": "أحد", + "mon": "إثنين", + "tue": "ثلاثاء", + "wed": "أربعاء", + "thu": "خميس", + "fri": "جمعة", + "sat": "سبت" + }, + "wide": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + }, + "narrow": { + "sun": "ح", + "mon": "ن", + "tue": "ث", + "wed": "ر", + "thu": "خ", + "fri": "ج", + "sat": "س" + }, + "short": { + "sun": "أحد", + "mon": "إثنين", + "tue": "ثلاثاء", + "wed": "أربعاء", + "thu": "خميس", + "fri": "جمعة", + "sat": "سبت" + }, + "wide": { + "sun": "الأحد", + "mon": "الاثنين", + "tue": "الثلاثاء", + "wed": "الأربعاء", + "thu": "الخميس", + "fri": "الجمعة", + "sat": "السبت" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + }, + "narrow": { + "1": "١", + "2": "٢", + "3": "٣", + "4": "٤" + }, + "wide": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + } + }, + "stand-alone": { + "abbreviated": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + }, + "narrow": { + "1": "١", + "2": "٢", + "3": "٣", + "4": "٤" + }, + "wide": { + "1": "الربع الأول", + "2": "الربع الثاني", + "3": "الربع الثالث", + "4": "الربع الرابع" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "ص", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "في المساء", + "night2": "ليلاً" + }, + "narrow": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + }, + "wide": { + "am": "ص", + "pm": "م", + "morning1": "في الصباح", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "في المساء", + "night2": "ليلاً" + } + }, + "stand-alone": { + "abbreviated": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "ص", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + }, + "narrow": { + "am": "ص", + "pm": "م", + "morning1": "فجرًا", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + }, + "wide": { + "am": "صباحًا", + "pm": "مساءً", + "morning1": "فجرًا", + "morning2": "صباحًا", + "afternoon1": "ظهرًا", + "afternoon2": "بعد الظهر", + "evening1": "مساءً", + "night1": "منتصف الليل", + "night2": "ليلاً" + } + } + }, + "eras": { + "eraNames": { + "0": "قبل الميلاد", + "0-alt-variant": "قبل الحقبة الحالية", + "1": "ميلادي", + "1-alt-variant": "بعد الميلاد" + }, + "eraAbbr": { + "0": "ق.م", + "0-alt-variant": "ق. م", + "1": "م", + "1-alt-variant": "ب.م" + }, + "eraNarrow": { + "0": "ق.م", + "0-alt-variant": "ق. م", + "1": "م", + "1-alt-variant": "ب.م" + } + }, + "dateFormats": { + "full": "EEEE، d MMMM y", + "long": "d MMMM y", + "medium": "dd‏/MM‏/y", + "short": "d‏/M‏/y" + }, + "timeFormats": { + "full": "h:mm:ss a zzzz", + "long": "h:mm:ss a z", + "medium": "h:mm:ss a", + "short": "h:mm a" + }, + "dateTimeFormats": { + "full": "{1} في {0}", + "long": "{1} في {0}", + "medium": "{1}, {0}", + "short": "{1}, {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "E، d", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM y G", + "GyMMMEd": "E، d MMM y G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d/‏M", + "MEd": "E، d/‏M", + "MMdd": "dd‏/MM", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "E، d MMM", + "MMMMd": "d MMMM", + "MMMMEd": "E، d MMMM", + "MMMMW-count-zero": "الأسبوع W من MMMM", + "MMMMW-count-one": "الأسبوع W من MMMM", + "MMMMW-count-two": "الأسبوع W من MMMM", + "MMMMW-count-few": "الأسبوع W من MMMM", + "MMMMW-count-many": "الأسبوع W من MMMM", + "MMMMW-count-other": "الأسبوع W من MMMM", + "ms": "mm:ss", + "y": "y", + "yM": "M‏/y", + "yMd": "d‏/M‏/y", + "yMEd": "E، d/‏M/‏y", + "yMM": "MM‏/y", + "yMMM": "MMM y", + "yMMMd": "d MMM y", + "yMMMEd": "E، d MMM y", + "yMMMM": "MMMM y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ y", + "yw-count-zero": "الأسبوع w من سنة Y", + "yw-count-one": "الأسبوع w من سنة Y", + "yw-count-two": "الأسبوع w من سنة Y", + "yw-count-few": "الأسبوع w من سنة Y", + "yw-count-many": "الأسبوع w من سنة Y", + "yw-count-other": "الأسبوع w من سنة Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y G – y G", + "y": "y – y G" + }, + "GyM": { + "G": "MM-y GGGG – MM-y GGGG", + "M": "MM-y – MM-y GGGG", + "y": "MM-y – MM-y GGGG" + }, + "GyMd": { + "d": "d-MM-y – d-MM-y GGGG", + "G": "dd-MM-y GGGG – dd-MM-y GGGG", + "M": "dd-MM-y – dd-MM-y GGGG", + "y": "dd-MM-y – dd-MM-y GGGG" + }, + "GyMEd": { + "d": "E, dd-MM-y – E, dd-MM-y GGGG", + "G": "E, dd-MM-y GGGG – E, dd-MM-y GGGG", + "M": "E, dd-MM-y – E, dd-MM-y GGGG", + "y": "E, dd-MM-y – E, dd-MM-y GGGG" + }, + "GyMMM": { + "G": "MMM y G – MMM y G", + "M": "MMM – MMM y G", + "y": "MMM y – MMM y G" + }, + "GyMMMd": { + "d": "d–d MMM y G", + "G": "d MMM y G – d MMM y G", + "M": "d MMM – d MMM y G", + "y": "d MMM y – d MMM y G" + }, + "GyMMMEd": { + "d": "E, d MMM – E, d MMM y G", + "G": "E, d MMM y G – E, d MMM y G", + "M": "E, d MMM – E, d MMM y G", + "y": "E, d MMM y – E, d MMM y G" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d-M – d-M", + "M": "M/d – M/d" + }, + "MEd": { + "d": "E، d/‏M –‏ E، d/‏M", + "M": "E، d/‏M – E، d/‏M" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E، d – E، d MMM", + "M": "E، d MMM – E، d MMM" + }, + "MMMM": { + "M": "LLLL–LLLL" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M‏/y – M‏/y", + "y": "M‏/y – M‏/y" + }, + "yMd": { + "d": "d‏/M‏/y – d‏/M‏/y", + "M": "d‏/M‏/y – d‏/M‏/y", + "y": "d‏/M‏/y – d‏/M‏/y" + }, + "yMEd": { + "d": "E، dd‏/MM‏/y – E، dd‏/MM‏/y", + "M": "E، d‏/M‏/y – E، d‏/M‏/y", + "y": "E، d‏/M‏/y – E، d‏/M‏/y" + }, + "yMMM": { + "M": "MMM – MMM، y", + "y": "MMM، y – MMM، y" + }, + "yMMMd": { + "d": "d–d MMM، y", + "M": "d MMM – d MMM، y", + "y": "d MMM، y – d MMM، y" + }, + "yMMMEd": { + "d": "E، d – E، d MMM، y", + "M": "E، d MMM – E، d MMM، y", + "y": "E، d MMM، y – E، d MMM، y" + }, + "yMMMM": { + "M": "MMMM – MMMM، y", + "y": "MMMM، y – MMMM، y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/bn/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/bn/ca-gregorian.json new file mode 100644 index 00000000000..9ea49fd87cc --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/bn/ca-gregorian.json @@ -0,0 +1,540 @@ +{ + "main": { + "bn": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "bn" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "জানু", + "2": "ফেব", + "3": "মার্চ", + "4": "এপ্রিল", + "5": "মে", + "6": "জুন", + "7": "জুলাই", + "8": "আগস্ট", + "9": "সেপ্টেম্বর", + "10": "অক্টোবর", + "11": "নভেম্বর", + "12": "ডিসেম্বর" + }, + "narrow": { + "1": "জা", + "2": "ফে", + "3": "মা", + "4": "এ", + "5": "মে", + "6": "জুন", + "7": "জু", + "8": "আ", + "9": "সে", + "10": "অ", + "11": "ন", + "12": "ডি" + }, + "wide": { + "1": "জানুয়ারী", + "2": "ফেব্রুয়ারী", + "3": "মার্চ", + "4": "এপ্রিল", + "5": "মে", + "6": "জুন", + "7": "জুলাই", + "8": "আগস্ট", + "9": "সেপ্টেম্বর", + "10": "অক্টোবর", + "11": "নভেম্বর", + "12": "ডিসেম্বর" + } + }, + "stand-alone": { + "abbreviated": { + "1": "জানুয়ারী", + "2": "ফেব্রুয়ারী", + "3": "মার্চ", + "4": "এপ্রিল", + "5": "মে", + "6": "জুন", + "7": "জুলাই", + "8": "আগস্ট", + "9": "সেপ্টেম্বর", + "10": "অক্টোবর", + "11": "নভেম্বর", + "12": "ডিসেম্বর" + }, + "narrow": { + "1": "জা", + "2": "ফে", + "3": "মা", + "4": "এ", + "5": "মে", + "6": "জুন", + "7": "জু", + "8": "আ", + "9": "সে", + "10": "অ", + "11": "ন", + "12": "ডি" + }, + "wide": { + "1": "জানুয়ারী", + "2": "ফেব্রুয়ারী", + "3": "মার্চ", + "4": "এপ্রিল", + "5": "মে", + "6": "জুন", + "7": "জুলাই", + "8": "আগস্ট", + "9": "সেপ্টেম্বর", + "10": "অক্টোবর", + "11": "নভেম্বর", + "12": "ডিসেম্বর" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "রবি", + "mon": "সোম", + "tue": "মঙ্গল", + "wed": "বুধ", + "thu": "বৃহস্পতি", + "fri": "শুক্র", + "sat": "শনি" + }, + "narrow": { + "sun": "র", + "mon": "সো", + "tue": "ম", + "wed": "বু", + "thu": "বৃ", + "fri": "শু", + "sat": "শ" + }, + "short": { + "sun": "রঃ", + "mon": "সোঃ", + "tue": "মঃ", + "wed": "বুঃ", + "thu": "বৃঃ", + "fri": "শুঃ", + "sat": "শনি" + }, + "wide": { + "sun": "রবিবার", + "mon": "সোমবার", + "tue": "মঙ্গলবার", + "wed": "বুধবার", + "thu": "বৃহস্পতিবার", + "fri": "শুক্রবার", + "sat": "শনিবার" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "রবি", + "mon": "সোম", + "tue": "মঙ্গল", + "wed": "বুধ", + "thu": "বৃহস্পতি", + "fri": "শুক্র", + "sat": "শনি" + }, + "narrow": { + "sun": "র", + "mon": "সো", + "tue": "ম", + "wed": "বু", + "thu": "বৃ", + "fri": "শু", + "sat": "শ" + }, + "short": { + "sun": "রঃ", + "mon": "সোঃ", + "tue": "মঃ", + "wed": "বুঃ", + "thu": "বৃঃ", + "fri": "শুঃ", + "sat": "শনি" + }, + "wide": { + "sun": "রবিবার", + "mon": "সোমবার", + "tue": "মঙ্গলবার", + "wed": "বুধবার", + "thu": "বৃহস্পতিবার", + "fri": "শুক্রবার", + "sat": "শনিবার" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "ত্রৈমাসিক", + "2": "দ্বিতীয় ত্রৈমাসিক", + "3": "তৃতীয় ত্রৈমাসিক", + "4": "চতুর্থ ত্রৈমাসিক" + }, + "narrow": { + "1": "১", + "2": "২", + "3": "৩", + "4": "৪" + }, + "wide": { + "1": "ত্রৈমাসিক", + "2": "দ্বিতীয় ত্রৈমাসিক", + "3": "তৃতীয় ত্রৈমাসিক", + "4": "চতুর্থ ত্রৈমাসিক" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "১", + "2": "২", + "3": "৩", + "4": "৪" + }, + "wide": { + "1": "ত্রৈমাসিক", + "2": "দ্বিতীয় ত্রৈমাসিক", + "3": "তৃতীয় ত্রৈমাসিক", + "4": "চতুর্থ ত্রৈমাসিক" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "am": "AM", + "pm": "PM", + "morning1": "ভোর", + "morning2": "সকাল", + "afternoon1": "দুপুর", + "afternoon2": "বিকাল", + "evening1": "সন্ধ্যা", + "night1": "রাত্রি" + }, + "narrow": { + "am": "AM", + "pm": "PM", + "morning1": "ভোর", + "morning2": "সকাল", + "afternoon1": "দুপুর", + "afternoon2": "বিকাল", + "evening1": "সন্ধ্যা", + "night1": "রাত্রি" + }, + "wide": { + "am": "AM", + "pm": "PM", + "morning1": "ভোর", + "morning2": "সকাল", + "afternoon1": "দুপুর", + "afternoon2": "বিকাল", + "evening1": "সন্ধ্যা", + "night1": "রাত্রিতে" + } + }, + "stand-alone": { + "abbreviated": { + "am": "AM", + "pm": "PM", + "morning1": "ভোর", + "morning2": "সকাল", + "afternoon1": "দুপুর", + "afternoon2": "বিকাল", + "evening1": "সন্ধ্যা", + "night1": "রাত্রি" + }, + "narrow": { + "am": "AM", + "pm": "PM", + "morning1": "ভোর", + "morning2": "সকাল", + "afternoon1": "দুপুর", + "afternoon2": "বিকাল", + "evening1": "সন্ধ্যা", + "night1": "রাত্রি" + }, + "wide": { + "am": "AM", + "pm": "PM", + "morning1": "ভোর", + "morning2": "সকাল", + "afternoon1": "দুপুর", + "afternoon2": "বিকাল", + "evening1": "সন্ধ্যা", + "night1": "রাত্রি" + } + } + }, + "eras": { + "eraNames": { + "0": "খ্রিস্টপূর্ব", + "0-alt-variant": "খ্রিষ্টপূর্বাব্দ", + "1": "খ্রীষ্টাব্দ", + "1-alt-variant": "খ্রিষ্টাব্দ" + }, + "eraAbbr": { + "0": "খ্রিস্টপূর্ব", + "0-alt-variant": "খ্রিষ্টপূর্বাব্দ", + "1": "খৃষ্টাব্দ", + "1-alt-variant": "খ্রিষ্টাব্দ" + }, + "eraNarrow": { + "0": "খ্রিস্টপূর্ব", + "0-alt-variant": "খ্রিষ্টপূর্বাব্দ", + "1": "খৃষ্টাব্দ", + "1-alt-variant": "খ্রিষ্টাব্দ" + } + }, + "dateFormats": { + "full": "EEEE, d MMMM, y", + "long": "d MMMM, y", + "medium": "d MMM, y", + "short": "d/M/yy" + }, + "timeFormats": { + "full": "h:mm:ss a zzzz", + "long": "h:mm:ss a z", + "medium": "h:mm:ss a", + "short": "h:mm a" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "d E", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM, y G", + "GyMMMEd": "E, d MMM, y G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d/M", + "MEd": "E, d-M", + "MMdd": "dd-MM", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "E d MMM", + "MMMMd": "d MMMM", + "MMMMEd": "E d MMMM", + "MMMMW-count-one": "MMMM এর Wয় সপ্তাহ", + "MMMMW-count-other": "MMMM এর Wয় সপ্তাহ", + "ms": "mm:ss", + "y": "y", + "yM": "M/y", + "yMd": "d/M/y", + "yMEd": "E, d/M/y", + "yMM": "MM-y", + "yMMM": "MMM y", + "yMMMd": "d MMM, y", + "yMMMEd": "E, d MMM, y", + "yMMMM": "MMMM y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ y", + "yw-count-one": "Y এর wতম সপ্তাহ", + "yw-count-other": "Y এর wতম সপ্তাহ" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y G – y G", + "y": "y – y G" + }, + "GyM": { + "G": "M/y GGGGG – M/y GGGGG", + "M": "M/y – M/y GGGGG", + "y": "M/y – M/y GGGGG" + }, + "GyMd": { + "d": "d/M/y – d/M/y GGGGG", + "G": "d/M/y GGGGG – d/M/y GGGGG", + "M": "d/M/y – d/M/y GGGGG", + "y": "d/M/y – d/M/y GGGGG" + }, + "GyMEd": { + "d": "E, d/M/y – E, d/M/y GGGGG", + "G": "E, d/M/y GGGGG – E, d/M/y GGGGG", + "M": "E, d/M/y GGGGG – E, d/M/y GGGGG", + "y": "E, d/M/y – E, d/M/y GGGGG" + }, + "GyMMM": { + "G": "MMM y G – MMM y G", + "M": "MMM – MMM y G", + "y": "MMM y – MMM y G" + }, + "GyMMMd": { + "d": "d – d MMM, y G", + "G": "d MMM, y G – d MMM, y G", + "M": "d MMM – d MMM, y G", + "y": "d MMM, y – d MMM, y G" + }, + "GyMMMEd": { + "d": "E, d MMM – E, d MMM, y G", + "G": "E, d MMM, y G – E, d MMM, y G", + "M": "E, d MMM – E, d MMM, y G", + "y": "E, d MMM, y – E, d MMM, y G" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d/M – d/M", + "M": "d/M – d/M" + }, + "MEd": { + "d": "E, d/M – E, d/M", + "M": "E, d/M – E, d/M" + }, + "MMM": { + "M": "MMM – MMM" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E, d MMM – E, d MMM", + "M": "E, d MMM – E, d MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M/y – M/y", + "y": "M/y – M/y" + }, + "yMd": { + "d": "d/M/y – d/M/y", + "M": "d/M/y – d/M/y", + "y": "d/M/y – d/M/y" + }, + "yMEd": { + "d": "E, d/M/y – E, d/M/y", + "M": "E, d/M/y – E, d/M/y", + "y": "E, d/M/y – E, d/M/y" + }, + "yMMM": { + "M": "MMM–MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "d–d MMM, y", + "M": "d MMM – d MMM, y", + "y": "d MMM, y – d MMM, y" + }, + "yMMMEd": { + "d": "E, d MMM – E, d MMM, y", + "M": "E, d MMM – E, d MMM, y", + "y": "E, d MMM, y – E, d MMM, y" + }, + "yMMMM": { + "M": "MMMM–MMMM y", + "y": "MMMM y – MMMM y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/ccp/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/ccp/ca-gregorian.json new file mode 100644 index 00000000000..fc5359c9e60 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/ccp/ca-gregorian.json @@ -0,0 +1,540 @@ +{ + "main": { + "ccp": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ccp" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "𑄎𑄚𑄪", + "2": "𑄜𑄬𑄛𑄴", + "3": "𑄟𑄢𑄴𑄌𑄧", + "4": "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", + "5": "𑄟𑄬", + "6": "𑄎𑄪𑄚𑄴", + "7": "𑄎𑄪𑄣𑄭", + "8": "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", + "9": "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "10": "𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴", + "11": "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "12": "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄢𑄴" + }, + "narrow": { + "1": "𑄎", + "2": "𑄜𑄬", + "3": "𑄟", + "4": "𑄃𑄬", + "5": "𑄟𑄬", + "6": "𑄎𑄪𑄚𑄴", + "7": "𑄎𑄪", + "8": "𑄃", + "9": "𑄥𑄬", + "10": "𑄃𑄧", + "11": "𑄚𑄧", + "12": "𑄓𑄨" + }, + "wide": { + "1": "𑄎𑄚𑄪𑄠𑄢𑄨", + "2": "𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨", + "3": "𑄟𑄢𑄴𑄌𑄧", + "4": "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", + "5": "𑄟𑄬", + "6": "𑄎𑄪𑄚𑄴", + "7": "𑄎𑄪𑄣𑄭", + "8": "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", + "9": "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "10": "𑄃𑄧𑄇𑄴𑄑𑄬𑄝𑄧𑄢𑄴", + "11": "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "12": "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴" + } + }, + "stand-alone": { + "abbreviated": { + "1": "𑄎𑄚𑄪𑄠𑄢𑄨", + "2": "𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨", + "3": "𑄟𑄢𑄴𑄌𑄧", + "4": "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", + "5": "𑄟𑄬", + "6": "𑄎𑄪𑄚𑄴", + "7": "𑄎𑄪𑄣𑄭", + "8": "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", + "9": "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "10": "𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴", + "11": "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "12": "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴" + }, + "narrow": { + "1": "𑄎", + "2": "𑄜𑄬", + "3": "𑄟", + "4": "𑄃𑄬", + "5": "𑄟𑄬", + "6": "𑄎𑄪𑄚𑄴", + "7": "𑄎𑄪", + "8": "𑄃", + "9": "𑄥𑄬", + "10": "𑄃𑄧", + "11": "𑄚𑄧", + "12": "𑄓𑄨" + }, + "wide": { + "1": "𑄎𑄚𑄪𑄠𑄢𑄨", + "2": "𑄜𑄬𑄛𑄴𑄝𑄳𑄢𑄪𑄠𑄢𑄨", + "3": "𑄟𑄢𑄴𑄌𑄧", + "4": "𑄃𑄬𑄛𑄳𑄢𑄨𑄣𑄴", + "5": "𑄟𑄬", + "6": "𑄎𑄪𑄚𑄴", + "7": "𑄎𑄪𑄣𑄭", + "8": "𑄃𑄉𑄧𑄌𑄴𑄑𑄴", + "9": "𑄥𑄬𑄛𑄴𑄑𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "10": "𑄃𑄧𑄇𑄴𑄑𑄮𑄝𑄧𑄢𑄴", + "11": "𑄚𑄧𑄞𑄬𑄟𑄴𑄝𑄧𑄢𑄴", + "12": "𑄓𑄨𑄥𑄬𑄟𑄴𑄝𑄧𑄢𑄴" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "𑄢𑄧𑄝𑄨", + "mon": "𑄥𑄧𑄟𑄴", + "tue": "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", + "wed": "𑄝𑄪𑄖𑄴", + "thu": "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", + "fri": "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", + "sat": "𑄥𑄧𑄚𑄨" + }, + "narrow": { + "sun": "𑄢𑄧", + "mon": "𑄥𑄧", + "tue": "𑄟𑄧", + "wed": "𑄝𑄪", + "thu": "𑄝𑄳𑄢𑄨", + "fri": "𑄥𑄪", + "sat": "𑄥𑄧" + }, + "short": { + "sun": "𑄢𑄧𑄝𑄨", + "mon": "𑄥𑄧𑄟𑄴", + "tue": "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", + "wed": "𑄝𑄪𑄖𑄴", + "thu": "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", + "fri": "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", + "sat": "𑄥𑄧𑄚𑄨" + }, + "wide": { + "sun": "𑄢𑄧𑄝𑄨𑄝𑄢𑄴", + "mon": "𑄥𑄧𑄟𑄴𑄝𑄢𑄴", + "tue": "𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴", + "wed": "𑄝𑄪𑄖𑄴𑄝𑄢𑄴", + "thu": "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴", + "fri": "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴", + "sat": "𑄥𑄧𑄚𑄨𑄝𑄢𑄴" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "𑄢𑄧𑄝𑄨", + "mon": "𑄥𑄧𑄟𑄴", + "tue": "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", + "wed": "𑄝𑄪𑄖𑄴", + "thu": "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", + "fri": "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", + "sat": "𑄥𑄧𑄚𑄨" + }, + "narrow": { + "sun": "𑄢𑄧", + "mon": "𑄥𑄧", + "tue": "𑄟𑄧", + "wed": "𑄝𑄪", + "thu": "𑄝𑄳𑄢𑄨", + "fri": "𑄥𑄪", + "sat": "𑄥𑄧" + }, + "short": { + "sun": "𑄢𑄧𑄝𑄨", + "mon": "𑄥𑄧𑄟𑄴", + "tue": "𑄟𑄧𑄁𑄉𑄧𑄣𑄴", + "wed": "𑄝𑄪𑄖𑄴", + "thu": "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴", + "fri": "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴", + "sat": "𑄥𑄧𑄚𑄨" + }, + "wide": { + "sun": "𑄢𑄧𑄝𑄨𑄝𑄢𑄴", + "mon": "𑄥𑄧𑄟𑄴𑄝𑄢𑄴", + "tue": "𑄟𑄧𑄁𑄉𑄧𑄣𑄴𑄝𑄢𑄴", + "wed": "𑄝𑄪𑄖𑄴𑄝𑄢𑄴", + "thu": "𑄝𑄳𑄢𑄨𑄥𑄪𑄛𑄴𑄝𑄢𑄴", + "fri": "𑄥𑄪𑄇𑄴𑄇𑄮𑄢𑄴𑄝𑄢𑄴", + "sat": "𑄥𑄧𑄚𑄨𑄝𑄢𑄴" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "𑄷", + "2": "𑄸", + "3": "𑄹", + "4": "𑄺" + }, + "wide": { + "1": "𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴", + "2": "𑄘𑄨 𑄛𑄳𑄆𑄘𑄳𑄠𑄬 𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴", + "3": "𑄖𑄨𑄚𑄴 𑄛𑄳𑄆𑄘𑄳𑄠𑄬 𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴", + "4": "𑄌𑄳𑄆𑄬𑄢𑄴 𑄛𑄳𑄆𑄘𑄳𑄠𑄬 𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "𑄷", + "2": "𑄸", + "3": "𑄹", + "4": "𑄺" + }, + "wide": { + "1": "𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴", + "2": "𑄘𑄨 𑄛𑄳𑄆𑄘𑄳𑄠𑄬 𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴", + "3": "𑄖𑄨𑄚𑄴 𑄛𑄳𑄆𑄘𑄳𑄠𑄬 𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴", + "4": "𑄌𑄳𑄆𑄬𑄢𑄴 𑄛𑄳𑄆𑄘𑄳𑄠𑄬 𑄖𑄨𑄚𑄴𑄟𑄎𑄧𑄢𑄴" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "am": "AM", + "pm": "PM", + "morning1": "𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬", + "morning2": "𑄝𑄬𑄚𑄳𑄠𑄬", + "afternoon1": "𑄘𑄨𑄝𑄪𑄎𑄳𑄠", + "afternoon2": "𑄝𑄬𑄣𑄳𑄠𑄬", + "evening1": "𑄥𑄎𑄧𑄚𑄳𑄠", + "night1": "𑄢𑄬𑄖𑄴" + }, + "narrow": { + "am": "AM", + "pm": "PM", + "morning1": "𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬", + "morning2": "𑄝𑄬𑄚𑄳𑄠𑄬", + "afternoon1": "𑄘𑄨𑄝𑄪𑄎𑄳𑄠", + "afternoon2": "𑄝𑄬𑄣𑄳𑄠𑄬", + "evening1": "𑄥𑄎𑄧𑄚𑄳𑄠", + "night1": "𑄢𑄬𑄖𑄴" + }, + "wide": { + "am": "AM", + "pm": "PM", + "morning1": "𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬", + "morning2": "𑄝𑄬𑄚𑄳𑄠𑄬", + "afternoon1": "𑄘𑄨𑄝𑄪𑄎𑄳𑄠", + "afternoon2": "𑄝𑄬𑄣𑄳𑄠𑄬", + "evening1": "𑄥𑄎𑄧𑄚𑄳𑄠", + "night1": "𑄢𑄬𑄖𑄴" + } + }, + "stand-alone": { + "abbreviated": { + "am": "AM", + "pm": "PM", + "morning1": "𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬", + "morning2": "𑄝𑄬𑄚𑄳𑄠𑄬", + "afternoon1": "𑄘𑄨𑄝𑄪𑄎𑄳𑄠", + "afternoon2": "𑄝𑄬𑄣𑄳𑄠𑄬", + "evening1": "𑄥𑄎𑄧𑄚𑄳𑄠", + "night1": "𑄢𑄬𑄖𑄴" + }, + "narrow": { + "am": "AM", + "pm": "PM", + "morning1": "𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬", + "morning2": "𑄝𑄬𑄚𑄳𑄠𑄬", + "afternoon1": "𑄘𑄨𑄝𑄪𑄎𑄳𑄠", + "afternoon2": "𑄝𑄬𑄣𑄳𑄠𑄬", + "evening1": "𑄥𑄎𑄧𑄚𑄳𑄠", + "night1": "𑄢𑄬𑄖𑄴" + }, + "wide": { + "am": "AM", + "pm": "PM", + "morning1": "𑄛𑄧𑄖𑄳𑄠𑄃𑄟𑄧𑄣𑄳𑄠𑄬", + "morning2": "𑄝𑄬𑄚𑄳𑄠𑄬", + "afternoon1": "𑄘𑄨𑄝𑄪𑄎𑄳𑄠", + "afternoon2": "𑄝𑄬𑄣𑄳𑄠𑄬", + "evening1": "𑄥𑄎𑄧𑄚𑄳𑄠", + "night1": "𑄢𑄬𑄖𑄴" + } + } + }, + "eras": { + "eraNames": { + "0": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧", + "0-alt-variant": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄛𑄴𑄘𑄧", + "1": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧", + "1-alt-variant": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧" + }, + "eraAbbr": { + "0": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧", + "0-alt-variant": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄧𑄛𑄫𑄢𑄴𑄝𑄛𑄴𑄘𑄧", + "1": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧", + "1-alt-variant": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧" + }, + "eraNarrow": { + "0": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄴𑄛𑄫𑄢𑄴𑄝𑄧", + "0-alt-variant": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄧𑄛𑄫𑄢𑄴𑄝𑄛𑄴𑄘𑄧", + "1": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧", + "1-alt-variant": "𑄈𑄳𑄢𑄨𑄌𑄴𑄑𑄛𑄴𑄘𑄧" + } + }, + "dateFormats": { + "full": "EEEE, d MMMM, y", + "long": "d MMMM, y", + "medium": "d MMM, y", + "short": "d/M/yy" + }, + "timeFormats": { + "full": "h:mm:ss a zzzz", + "long": "h:mm:ss a z", + "medium": "h:mm:ss a", + "short": "h:mm a" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "d E", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM, y G", + "GyMMMEd": "E, d MMM, y G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d/M", + "MEd": "E, d-M", + "MMdd": "dd-MM", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "E d MMM", + "MMMMd": "d MMMM", + "MMMMEd": "E d MMMM", + "MMMMW-count-one": "MMMM 𑄃𑄬𑄢𑄴 𑄠𑄴 𑄥𑄛𑄴𑄖 W", + "MMMMW-count-other": "MMMM 𑄃𑄬𑄢𑄴 𑄠𑄴 𑄥𑄛𑄴𑄖 W", + "ms": "mm:ss", + "y": "y", + "yM": "M/y", + "yMd": "d/M/y", + "yMEd": "E, d/M/y", + "yMM": "MM-y", + "yMMM": "MMM y", + "yMMMd": "d MMM, y", + "yMMMEd": "E, d MMM, y", + "yMMMM": "MMMM y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ y", + "yw-count-one": "Y 𑄃𑄬𑄢𑄴 𑄖𑄧𑄟𑄴 𑄥𑄛𑄴𑄖 w", + "yw-count-other": "Y 𑄃𑄬𑄢𑄴 𑄖𑄧𑄟𑄴 𑄥𑄛𑄴𑄖 w" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "G y – G y", + "y": "G y–y" + }, + "GyM": { + "G": "GGGGG y-MM – GGGGG y-MM", + "M": "GGGGG y-MM – y-MM", + "y": "GGGGG y-MM – y-MM" + }, + "GyMd": { + "d": "GGGGG y-MM-dd – y-MM-dd", + "G": "GGGGG y-MM-dd – GGGGG y-MM-dd", + "M": "GGGGG y-MM-dd – y-MM-dd", + "y": "GGGGG y-MM-dd – y-MM-dd" + }, + "GyMEd": { + "d": "GGGGG y-MM-dd, E – y-MM-dd, E", + "G": "GGGGG y-MM-dd, E – GGGGG y-MM-dd, E", + "M": "GGGGG y-MM-dd, E – y-MM-dd, E", + "y": "GGGGG y-MM-dd, E – y-MM-dd, E" + }, + "GyMMM": { + "G": "G y MMM – G y MMM", + "M": "G y MMM–MMM", + "y": "G y MMM – y MMM" + }, + "GyMMMd": { + "d": "G y MMM d–d", + "G": "G y MMM d – G y MMM d", + "M": "G y MMM d – MMM d", + "y": "G y MMM d – y MMM d" + }, + "GyMMMEd": { + "d": "G y MMM d, E – MMM d, E", + "G": "G y MMM d, E – G y MMM d, E", + "M": "G y MMM d, E – MMM d, E", + "y": "G y MMM d, E – y MMM d, E" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d/M – d/M", + "M": "d/M – d/M" + }, + "MEd": { + "d": "E, d/M – E, d/M", + "M": "E, d/M – E, d/M" + }, + "MMM": { + "M": "MMM – MMM" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E, d MMM – E, d MMM", + "M": "E, d MMM – E, d MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M/y – M/y", + "y": "M/y – M/y" + }, + "yMd": { + "d": "d/M/y – d/M/y", + "M": "d/M/y – d/M/y", + "y": "d/M/y – d/M/y" + }, + "yMEd": { + "d": "E, d/M/y – E, d/M/y", + "M": "E, d/M/y – E, d/M/y", + "y": "E, d/M/y – E, d/M/y" + }, + "yMMM": { + "M": "MMM–MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "d–d MMM, y", + "M": "d MMM – d MMM, y", + "y": "d MMM, y – d MMM, y" + }, + "yMMMEd": { + "d": "E, d MMM – E, d MMM, y", + "M": "E, d MMM – E, d MMM, y", + "y": "E, d MMM, y – E, d MMM, y" + }, + "yMMMM": { + "M": "MMMM–MMMM y", + "y": "MMMM y – MMMM y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/en-ZA/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/en-ZA/ca-gregorian.json new file mode 100644 index 00000000000..cfee9081379 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/en-ZA/ca-gregorian.json @@ -0,0 +1,551 @@ +{ + "main": { + "en-ZA": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "en", + "territory": "ZA" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "Jan", + "2": "Feb", + "3": "Mar", + "4": "Apr", + "5": "May", + "6": "Jun", + "7": "Jul", + "8": "Aug", + "9": "Sep", + "10": "Oct", + "11": "Nov", + "12": "Dec" + }, + "narrow": { + "1": "J", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "January", + "2": "February", + "3": "March", + "4": "April", + "5": "May", + "6": "June", + "7": "July", + "8": "August", + "9": "September", + "10": "October", + "11": "November", + "12": "December" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Jan", + "2": "Feb", + "3": "Mar", + "4": "Apr", + "5": "May", + "6": "Jun", + "7": "Jul", + "8": "Aug", + "9": "Sep", + "10": "Oct", + "11": "Nov", + "12": "Dec" + }, + "narrow": { + "1": "J", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "January", + "2": "February", + "3": "March", + "4": "April", + "5": "May", + "6": "June", + "7": "July", + "8": "August", + "9": "September", + "10": "October", + "11": "November", + "12": "December" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "Sun", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat" + }, + "narrow": { + "sun": "S", + "mon": "M", + "tue": "T", + "wed": "W", + "thu": "T", + "fri": "F", + "sat": "S" + }, + "short": { + "sun": "Su", + "mon": "Mo", + "tue": "Tu", + "wed": "We", + "thu": "Th", + "fri": "Fr", + "sat": "Sa" + }, + "wide": { + "sun": "Sunday", + "mon": "Monday", + "tue": "Tuesday", + "wed": "Wednesday", + "thu": "Thursday", + "fri": "Friday", + "sat": "Saturday" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "Sun", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat" + }, + "narrow": { + "sun": "S", + "mon": "M", + "tue": "T", + "wed": "W", + "thu": "T", + "fri": "F", + "sat": "S" + }, + "short": { + "sun": "Su", + "mon": "Mo", + "tue": "Tu", + "wed": "We", + "thu": "Th", + "fri": "Fr", + "sat": "Sa" + }, + "wide": { + "sun": "Sunday", + "mon": "Monday", + "tue": "Tuesday", + "wed": "Wednesday", + "thu": "Thursday", + "fri": "Friday", + "sat": "Saturday" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1st quarter", + "2": "2nd quarter", + "3": "3rd quarter", + "4": "4th quarter" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1st quarter", + "2": "2nd quarter", + "3": "3rd quarter", + "4": "4th quarter" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "midnight", + "am": "am", + "am-alt-variant": "am", + "noon": "noon", + "pm": "pm", + "pm-alt-variant": "pm", + "morning1": "in the morning", + "afternoon1": "in the afternoon", + "evening1": "in the evening", + "night1": "at night" + }, + "narrow": { + "midnight": "mi", + "am": "a", + "am-alt-variant": "am", + "noon": "n", + "pm": "p", + "pm-alt-variant": "pm", + "morning1": "in the morning", + "afternoon1": "in the afternoon", + "evening1": "in the evening", + "night1": "at night" + }, + "wide": { + "midnight": "midnight", + "am": "am", + "am-alt-variant": "am", + "noon": "noon", + "pm": "pm", + "pm-alt-variant": "pm", + "morning1": "in the morning", + "afternoon1": "in the afternoon", + "evening1": "in the evening", + "night1": "at night" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "midnight", + "am": "am", + "am-alt-variant": "am", + "noon": "noon", + "pm": "pm", + "pm-alt-variant": "pm", + "morning1": "morning", + "afternoon1": "afternoon", + "evening1": "evening", + "night1": "night" + }, + "narrow": { + "midnight": "midnight", + "am": "am", + "am-alt-variant": "am", + "noon": "noon", + "pm": "pm", + "pm-alt-variant": "pm", + "morning1": "morning", + "afternoon1": "afternoon", + "evening1": "evening", + "night1": "night" + }, + "wide": { + "midnight": "midnight", + "am": "am", + "am-alt-variant": "am", + "noon": "noon", + "pm": "pm", + "pm-alt-variant": "pm", + "morning1": "morning", + "afternoon1": "afternoon", + "evening1": "evening", + "night1": "night" + } + } + }, + "eras": { + "eraNames": { + "0": "Before Christ", + "0-alt-variant": "Before Common Era", + "1": "Anno Domini", + "1-alt-variant": "Common Era" + }, + "eraAbbr": { + "0": "BC", + "0-alt-variant": "BCE", + "1": "AD", + "1-alt-variant": "CE" + }, + "eraNarrow": { + "0": "B", + "0-alt-variant": "BCE", + "1": "A", + "1-alt-variant": "CE" + } + }, + "dateFormats": { + "full": "EEEE, dd MMMM y", + "long": "dd MMMM y", + "medium": "dd MMM y", + "short": "y/MM/dd" + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1} 'at' {0}", + "long": "{1} 'at' {0}", + "medium": "{1}, {0}", + "short": "{1}, {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E, h:mm B", + "EBhms": "E, h:mm:ss B", + "Ed": "E d", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM y G", + "GyMMMEd": "E, d MMM y G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "MM/dd", + "MEd": "E, MM/dd", + "MMdd": "dd/MM", + "MMM": "LLL", + "MMMd": "dd MMM", + "MMMEd": "E, dd MMM", + "MMMMd": "d MMMM", + "MMMMW-count-one": "'week' W 'of' MMMM", + "MMMMW-count-other": "'week' W 'of' MMMM", + "ms": "mm:ss", + "y": "y", + "yM": "MM/y", + "yMd": "y/MM/dd", + "yMEd": "E, y/MM/dd", + "yMMM": "MMM y", + "yMMMd": "dd MMM y", + "yMMMEd": "E, dd MMM y", + "yMMMM": "MMMM y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ y", + "yw-count-one": "'week' w 'of' Y", + "yw-count-other": "'week' w 'of' Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{0} {1}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{0} {1}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h – h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm – h:mm B", + "m": "h:mm – h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y G – y G", + "y": "y – y G" + }, + "GyM": { + "G": "M/y GGGGG – M/y GGGGG", + "M": "M/y – M/y GGGGG", + "y": "M/y – M/y GGGGG" + }, + "GyMd": { + "d": "dd/MM/y – dd/MM/y GGGGG", + "G": "dd/MM/y GGGGG – dd/MM/y GGGGG", + "M": "dd/MM/y – dd/MM/y GGGGG", + "y": "dd/MM/y – dd/MM/y GGGGG" + }, + "GyMEd": { + "d": "E, dd/MM/y – E, dd/MM/y GGGGG", + "G": "E, dd/MM/y GGGGG – E, dd/MM/y GGGGG", + "M": "E, dd/MM/y – E, dd/MM/y GGGGG", + "y": "E, dd/MM/y – E, dd/MM/y GGGGG" + }, + "GyMMM": { + "G": "MMM y G – MMM y G", + "M": "MMM – MMM y G", + "y": "MMM y – MMM y G" + }, + "GyMMMd": { + "d": "d – d MMM y G", + "G": "d MMM y G – d MMM y G", + "M": "d MMM – d MMM y G", + "y": "d MMM y – d MMM y G" + }, + "GyMMMEd": { + "d": "E, d MMM – E, d MMM y G", + "G": "E, d MMM y G – E, d MMM y G", + "M": "E, d MMM – E, d MMM y G", + "y": "E, d MMM y – E, d MMM y G" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm – h:mm a", + "m": "h:mm – h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm – h:mm a v", + "m": "h:mm – h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "dd/MM – dd/MM", + "M": "dd/MM – dd/MM" + }, + "MEd": { + "d": "E dd/MM – E dd/MM", + "M": "E dd/MM – E dd/MM" + }, + "MMM": { + "M": "MMM – MMM" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E d – E d MMM", + "M": "E d MMM – E d MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "MM/y – MM/y", + "y": "MM/y – MM/y" + }, + "yMd": { + "d": "dd/MM/y – dd/MM/y", + "M": "dd/MM/y – dd/MM/y", + "y": "dd/MM/y – dd/MM/y" + }, + "yMEd": { + "d": "E, dd/MM/y – E, dd/MM/y", + "M": "E, dd/MM/y – E, dd/MM/y", + "y": "E, dd/MM/y – E, dd/MM/y" + }, + "yMMM": { + "M": "MMM – MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "d–d MMM y", + "M": "d MMM – d MMM y", + "y": "d MMM y – d MMM y" + }, + "yMMMEd": { + "d": "E, d – E, d MMM y", + "M": "E, d MMM – E, d MMM y", + "y": "E, d MMM y – E, d MMM y" + }, + "yMMMM": { + "M": "MMMM – MMMM y", + "y": "MMMM y – MMMM y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/en/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/en/ca-gregorian.json new file mode 100644 index 00000000000..ae7b6d48e3a --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/en/ca-gregorian.json @@ -0,0 +1,549 @@ +{ + "main": { + "en": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "en" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "Jan", + "2": "Feb", + "3": "Mar", + "4": "Apr", + "5": "May", + "6": "Jun", + "7": "Jul", + "8": "Aug", + "9": "Sep", + "10": "Oct", + "11": "Nov", + "12": "Dec" + }, + "narrow": { + "1": "J", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "January", + "2": "February", + "3": "March", + "4": "April", + "5": "May", + "6": "June", + "7": "July", + "8": "August", + "9": "September", + "10": "October", + "11": "November", + "12": "December" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Jan", + "2": "Feb", + "3": "Mar", + "4": "Apr", + "5": "May", + "6": "Jun", + "7": "Jul", + "8": "Aug", + "9": "Sep", + "10": "Oct", + "11": "Nov", + "12": "Dec" + }, + "narrow": { + "1": "J", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "January", + "2": "February", + "3": "March", + "4": "April", + "5": "May", + "6": "June", + "7": "July", + "8": "August", + "9": "September", + "10": "October", + "11": "November", + "12": "December" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "Sun", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat" + }, + "narrow": { + "sun": "S", + "mon": "M", + "tue": "T", + "wed": "W", + "thu": "T", + "fri": "F", + "sat": "S" + }, + "short": { + "sun": "Su", + "mon": "Mo", + "tue": "Tu", + "wed": "We", + "thu": "Th", + "fri": "Fr", + "sat": "Sa" + }, + "wide": { + "sun": "Sunday", + "mon": "Monday", + "tue": "Tuesday", + "wed": "Wednesday", + "thu": "Thursday", + "fri": "Friday", + "sat": "Saturday" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "Sun", + "mon": "Mon", + "tue": "Tue", + "wed": "Wed", + "thu": "Thu", + "fri": "Fri", + "sat": "Sat" + }, + "narrow": { + "sun": "S", + "mon": "M", + "tue": "T", + "wed": "W", + "thu": "T", + "fri": "F", + "sat": "S" + }, + "short": { + "sun": "Su", + "mon": "Mo", + "tue": "Tu", + "wed": "We", + "thu": "Th", + "fri": "Fr", + "sat": "Sa" + }, + "wide": { + "sun": "Sunday", + "mon": "Monday", + "tue": "Tuesday", + "wed": "Wednesday", + "thu": "Thursday", + "fri": "Friday", + "sat": "Saturday" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1st quarter", + "2": "2nd quarter", + "3": "3rd quarter", + "4": "4th quarter" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1st quarter", + "2": "2nd quarter", + "3": "3rd quarter", + "4": "4th quarter" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "midnight", + "am": "AM", + "am-alt-variant": "am", + "noon": "noon", + "pm": "PM", + "pm-alt-variant": "pm", + "morning1": "in the morning", + "afternoon1": "in the afternoon", + "evening1": "in the evening", + "night1": "at night" + }, + "narrow": { + "midnight": "mi", + "am": "a", + "am-alt-variant": "am", + "noon": "n", + "pm": "p", + "pm-alt-variant": "pm", + "morning1": "in the morning", + "afternoon1": "in the afternoon", + "evening1": "in the evening", + "night1": "at night" + }, + "wide": { + "midnight": "midnight", + "am": "AM", + "am-alt-variant": "am", + "noon": "noon", + "pm": "PM", + "pm-alt-variant": "pm", + "morning1": "in the morning", + "afternoon1": "in the afternoon", + "evening1": "in the evening", + "night1": "at night" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "midnight", + "am": "AM", + "am-alt-variant": "am", + "noon": "noon", + "pm": "PM", + "pm-alt-variant": "pm", + "morning1": "morning", + "afternoon1": "afternoon", + "evening1": "evening", + "night1": "night" + }, + "narrow": { + "midnight": "midnight", + "am": "AM", + "am-alt-variant": "am", + "noon": "noon", + "pm": "PM", + "pm-alt-variant": "pm", + "morning1": "morning", + "afternoon1": "afternoon", + "evening1": "evening", + "night1": "night" + }, + "wide": { + "midnight": "midnight", + "am": "AM", + "am-alt-variant": "am", + "noon": "noon", + "pm": "PM", + "pm-alt-variant": "pm", + "morning1": "morning", + "afternoon1": "afternoon", + "evening1": "evening", + "night1": "night" + } + } + }, + "eras": { + "eraNames": { + "0": "Before Christ", + "0-alt-variant": "Before Common Era", + "1": "Anno Domini", + "1-alt-variant": "Common Era" + }, + "eraAbbr": { + "0": "BC", + "0-alt-variant": "BCE", + "1": "AD", + "1-alt-variant": "CE" + }, + "eraNarrow": { + "0": "B", + "0-alt-variant": "BCE", + "1": "A", + "1-alt-variant": "CE" + } + }, + "dateFormats": { + "full": "EEEE, MMMM d, y", + "long": "MMMM d, y", + "medium": "MMM d, y", + "short": "M/d/yy" + }, + "timeFormats": { + "full": "h:mm:ss a zzzz", + "long": "h:mm:ss a z", + "medium": "h:mm:ss a", + "short": "h:mm a" + }, + "dateTimeFormats": { + "full": "{1} 'at' {0}", + "long": "{1} 'at' {0}", + "medium": "{1}, {0}", + "short": "{1}, {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "d E", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "MMM d, y G", + "GyMMMEd": "E, MMM d, y G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "M/d", + "MEd": "E, M/d", + "MMM": "LLL", + "MMMd": "MMM d", + "MMMEd": "E, MMM d", + "MMMMd": "MMMM d", + "MMMMW-count-one": "'week' W 'of' MMMM", + "MMMMW-count-other": "'week' W 'of' MMMM", + "ms": "mm:ss", + "y": "y", + "yM": "M/y", + "yMd": "M/d/y", + "yMEd": "E, M/d/y", + "yMMM": "MMM y", + "yMMMd": "MMM d, y", + "yMMMEd": "E, MMM d, y", + "yMMMM": "MMMM y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ y", + "yw-count-one": "'week' w 'of' Y", + "yw-count-other": "'week' w 'of' Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{0} {1}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{0} {1}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h – h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm – h:mm B", + "m": "h:mm – h:mm B" + }, + "d": { + "d": "d – d" + }, + "Gy": { + "G": "y G – y G", + "y": "y – y G" + }, + "GyM": { + "G": "M/y GGGGG – M/y GGGGG", + "M": "M/y – M/y GGGGG", + "y": "M/y – M/y GGGGG" + }, + "GyMd": { + "d": "M/d/y – M/d/y GGGGG", + "G": "M/d/y GGGGG – M/d/y GGGGG", + "M": "M/d/y – M/d/y GGGGG", + "y": "M/d/y – M/d/y GGGGG" + }, + "GyMEd": { + "d": "E, M/d/y – E, M/d/y GGGGG", + "G": "E, M/d/y GGGGG – E, M/d/y GGGGG", + "M": "E, M/d/y – E, M/d/y GGGGG", + "y": "E, M/d/y – E, M/d/y GGGGG" + }, + "GyMMM": { + "G": "MMM y G – MMM y G", + "M": "MMM – MMM y G", + "y": "MMM y – MMM y G" + }, + "GyMMMd": { + "d": "MMM d – d, y G", + "G": "MMM d, y G – MMM d, y G", + "M": "MMM d – MMM d, y G", + "y": "MMM d, y – MMM d, y G" + }, + "GyMMMEd": { + "d": "E, MMM d – E, MMM d, y G", + "G": "E, MMM d, y G – E, MMM d, y G", + "M": "E, MMM d – E, MMM d, y G", + "y": "E, MMM d, y – E, MMM d, y G" + }, + "h": { + "a": "h a – h a", + "h": "h – h a" + }, + "H": { + "H": "HH – HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm – h:mm a", + "m": "h:mm – h:mm a" + }, + "Hm": { + "H": "HH:mm – HH:mm", + "m": "HH:mm – HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm – h:mm a v", + "m": "h:mm – h:mm a v" + }, + "Hmv": { + "H": "HH:mm – HH:mm v", + "m": "HH:mm – HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h – h a v" + }, + "Hv": { + "H": "HH – HH v" + }, + "M": { + "M": "M – M" + }, + "Md": { + "d": "M/d – M/d", + "M": "M/d – M/d" + }, + "MEd": { + "d": "E, M/d – E, M/d", + "M": "E, M/d – E, M/d" + }, + "MMM": { + "M": "MMM – MMM" + }, + "MMMd": { + "d": "MMM d – d", + "M": "MMM d – MMM d" + }, + "MMMEd": { + "d": "E, MMM d – E, MMM d", + "M": "E, MMM d – E, MMM d" + }, + "y": { + "y": "y – y" + }, + "yM": { + "M": "M/y – M/y", + "y": "M/y – M/y" + }, + "yMd": { + "d": "M/d/y – M/d/y", + "M": "M/d/y – M/d/y", + "y": "M/d/y – M/d/y" + }, + "yMEd": { + "d": "E, M/d/y – E, M/d/y", + "M": "E, M/d/y – E, M/d/y", + "y": "E, M/d/y – E, M/d/y" + }, + "yMMM": { + "M": "MMM – MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "MMM d – d, y", + "M": "MMM d – MMM d, y", + "y": "MMM d, y – MMM d, y" + }, + "yMMMEd": { + "d": "E, MMM d – E, MMM d, y", + "M": "E, MMM d – E, MMM d, y", + "y": "E, MMM d, y – E, MMM d, y" + }, + "yMMMM": { + "M": "MMMM – MMMM y", + "y": "MMMM y – MMMM y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/es-AR/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/es-AR/ca-gregorian.json new file mode 100644 index 00000000000..7ab67b057ce --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/es-AR/ca-gregorian.json @@ -0,0 +1,562 @@ +{ + "main": { + "es-AR": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "es", + "territory": "AR" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "ene.", + "2": "feb.", + "3": "mar.", + "4": "abr.", + "5": "may.", + "6": "jun.", + "7": "jul.", + "8": "ago.", + "9": "sep.", + "10": "oct.", + "11": "nov.", + "12": "dic." + }, + "narrow": { + "1": "E", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "enero", + "2": "febrero", + "3": "marzo", + "4": "abril", + "5": "mayo", + "6": "junio", + "7": "julio", + "8": "agosto", + "9": "septiembre", + "10": "octubre", + "11": "noviembre", + "12": "diciembre" + } + }, + "stand-alone": { + "abbreviated": { + "1": "ene.", + "2": "feb.", + "3": "mar.", + "4": "abr.", + "5": "may.", + "6": "jun.", + "7": "jul.", + "8": "ago.", + "9": "sep.", + "10": "oct.", + "11": "nov.", + "12": "dic." + }, + "narrow": { + "1": "E", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "enero", + "2": "febrero", + "3": "marzo", + "4": "abril", + "5": "mayo", + "6": "junio", + "7": "julio", + "8": "agosto", + "9": "septiembre", + "10": "octubre", + "11": "noviembre", + "12": "diciembre" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "dom", + "mon": "lun", + "tue": "mar", + "wed": "mié", + "thu": "jue", + "fri": "vie", + "sat": "sáb" + }, + "narrow": { + "sun": "D", + "mon": "L", + "tue": "M", + "wed": "M", + "thu": "J", + "fri": "V", + "sat": "S" + }, + "short": { + "sun": "DO", + "mon": "LU", + "tue": "MA", + "wed": "MI", + "thu": "JU", + "fri": "VI", + "sat": "SA" + }, + "wide": { + "sun": "domingo", + "mon": "lunes", + "tue": "martes", + "wed": "miércoles", + "thu": "jueves", + "fri": "viernes", + "sat": "sábado" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "dom.", + "mon": "lun.", + "tue": "mar.", + "wed": "mié.", + "thu": "jue.", + "fri": "vie.", + "sat": "sáb." + }, + "narrow": { + "sun": "D", + "mon": "L", + "tue": "M", + "wed": "M", + "thu": "J", + "fri": "V", + "sat": "S" + }, + "short": { + "sun": "DO", + "mon": "LU", + "tue": "MA", + "wed": "MI", + "thu": "JU", + "fri": "VI", + "sat": "SA" + }, + "wide": { + "sun": "domingo", + "mon": "lunes", + "tue": "martes", + "wed": "miércoles", + "thu": "jueves", + "fri": "viernes", + "sat": "sábado" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "T1", + "2": "T2", + "3": "T3", + "4": "T4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1.er trimestre", + "2": "2.º trimestre", + "3": "3.er trimestre", + "4": "4.º trimestre" + } + }, + "stand-alone": { + "abbreviated": { + "1": "T1", + "2": "T2", + "3": "T3", + "4": "T4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1.er trimestre", + "2": "2.º trimestre", + "3": "3.er trimestre", + "4": "4.º trimestre" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "am": "a. m.", + "noon": "mediodía", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + }, + "narrow": { + "am": "a. m.", + "noon": "del mediodía", + "pm": "p. m.", + "morning1": "de la madrugada", + "morning2": "de la mañana", + "evening1": "de la tarde", + "night1": "de la noche" + }, + "wide": { + "am": "a. m.", + "noon": "mediodía", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + } + }, + "stand-alone": { + "abbreviated": { + "am": "a. m.", + "noon": "mediodía", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + }, + "narrow": { + "am": "a. m.", + "noon": "m.", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + }, + "wide": { + "am": "a. m.", + "noon": "mediodía", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + } + } + }, + "eras": { + "eraNames": { + "0": "antes de Cristo", + "0-alt-variant": "antes de la era común", + "1": "después de Cristo", + "1-alt-variant": "era común" + }, + "eraAbbr": { + "0": "a. C.", + "0-alt-variant": "a. e. c.", + "1": "d. C.", + "1-alt-variant": "e. c." + }, + "eraNarrow": { + "0": "a. C.", + "0-alt-variant": "a. e. c.", + "1": "d. C.", + "1-alt-variant": "e. c." + } + }, + "dateFormats": { + "full": "EEEE, d 'de' MMMM 'de' y", + "long": "d 'de' MMMM 'de' y", + "medium": "d MMM y", + "short": "d/M/yy" + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1}, {0}", + "long": "{1}, {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "E d", + "Ehm": "E, h:mm a", + "EHm": "E, HH:mm", + "Ehms": "E, h:mm:ss a", + "EHms": "E, HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM y G", + "GyMMMEd": "E, d 'de' MMM 'de' y G", + "GyMMMM": "MMMM 'de' y G", + "GyMMMMd": "d 'de' MMMM 'de' y G", + "GyMMMMEd": "E, d 'de' MMMM 'de' y G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "hh:mm:ss", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmsvvvv": "h:mm:ss a (vvvv)", + "Hmsvvvv": "HH:mm:ss (vvvv)", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d/M", + "MEd": "E d-M", + "MMd": "d/M", + "MMdd": "d/M", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMdd": "dd-MMM", + "MMMEd": "E, d MMM", + "MMMMd": "d 'de' MMMM", + "MMMMEd": "E, d 'de' MMMM", + "MMMMW-count-one": "'semana' W 'de' MMMM", + "MMMMW-count-other": "'semana' W 'de' MMMM", + "ms": "mm:ss", + "y": "y", + "yM": "M-y", + "yMd": "d/M/y", + "yMEd": "E, d/M/y", + "yMM": "M/y", + "yMMM": "MMM y", + "yMMMd": "d 'de' MMM 'de' y", + "yMMMEd": "E, d MMM y", + "yMMMM": "MMMM 'de' y", + "yMMMMd": "d 'de' MMMM 'de' y", + "yMMMMEd": "EEE, d 'de' MMMM 'de' y", + "yQQQ": "QQQ 'de' y", + "yQQQQ": "QQQQ 'de' y", + "yw-count-one": "'semana' w 'de' Y", + "yw-count-other": "'semana' w 'de' Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} a el {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y G – y G", + "y": "y–y G" + }, + "GyM": { + "G": "MM/y GGGGG – MM/y GGGGG", + "M": "MM/y – MM/y GGGGG", + "y": "MM/y – MM/y GGGGG" + }, + "GyMd": { + "d": "dd/MM/y – dd/MM/y GGGGG", + "G": "dd/MM/y GGGGG – dd/MM/y GGGGG", + "M": "dd/MM/y – dd/MM/y GGGGG", + "y": "dd/MM/y – dd/MM/y GGGGG" + }, + "GyMEd": { + "d": "E, dd/MM/y – E, dd/MM/y GGGGG", + "G": "E, dd/MM/y GGGGG – E, dd/MM/y GGGGG", + "M": "E, dd/MM/y – E, dd/MM/y GGGGG", + "y": "E, dd/MM/y – E, dd/MM/y GGGGG" + }, + "GyMMM": { + "G": "MMM y G – MMM y G", + "M": "MMM–MMM y G", + "y": "MMM y – MMM y G" + }, + "GyMMMd": { + "d": "d–d MMM 'de' y G", + "G": "d MMM 'de' y G – d MMM 'de' y G", + "M": "d MMM – d MMM 'de' y G", + "y": "d MMM 'de' y – d MMM 'de' y G" + }, + "GyMMMEd": { + "d": "E d MMM – E d MMM 'de' y G", + "G": "E d MMM 'de' y G – E d MMM 'de' y G", + "M": "E d MMM – E d MMM 'de' y G", + "y": "E d MMM 'de' y – E d MMM 'de' y G" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "dd/MM – dd/MM", + "M": "dd/MM – dd/MM" + }, + "MEd": { + "d": "E dd/MM – E dd/MM", + "M": "E dd/MM – E dd/MM" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "dd – dd 'de' MM", + "M": "d 'de' MMM 'al' d 'de' MMM" + }, + "MMMEd": { + "d": "E d 'al' E d 'de' MMM", + "M": "E d 'de' MMM 'al' E d 'de' MMM" + }, + "MMMMd": { + "d": "d–d 'de' MMMM", + "M": "d 'de' MMMM–d 'de' MMMM" + }, + "MMMMEd": { + "d": "E, d 'de' MMMM–E, d 'de' MMMM", + "M": "E, d 'de' MMMM–E, d 'de' MMMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "MM/y – MM/y", + "y": "MM/y – MM/y" + }, + "yMd": { + "d": "dd/MM/y – dd/MM/y", + "M": "dd/MM/y – dd/MM/y", + "y": "dd/MM/y – dd/MM/y" + }, + "yMEd": { + "d": "E, dd/MM/y – E, dd/MM/y", + "M": "E, dd/MM/y – E, dd/MM/y", + "y": "E, dd/MM/y – E, dd/MM/y" + }, + "yMMM": { + "M": "MMM–MMM y", + "y": "MMM 'de' y 'a' MMM 'de' y" + }, + "yMMMd": { + "d": "d – d 'de' MMM 'de' y", + "M": "d 'de' MMM 'al' d 'de' MMM 'de' y", + "y": "d 'de' MMM 'de' y 'al' d 'de' MMM 'de' y" + }, + "yMMMEd": { + "d": "E, d 'al' E, d 'de' MMM 'de' y", + "M": "E, d 'de' MMM 'al' E, d 'de' MMM 'de' y", + "y": "E, d 'de' MMM 'de' y 'al' E, d 'de' MMM 'de' y" + }, + "yMMMM": { + "M": "MMMM 'al' MMMM 'de' y", + "y": "MMMM 'de' y 'al' MMMM 'de' y" + }, + "yMMMMd": { + "d": "d–d 'de' MMMM 'de' y", + "M": "d 'de' MMMM–d 'de' MMMM 'de' y", + "y": "d 'de' MMMM 'de' y–d 'de' MMMM 'de' y" + }, + "yMMMMEd": { + "d": "E, d 'de' MMMM–E, d 'de' MMMM 'de' y", + "M": "E, d 'de' MMMM–E, d 'de' MMMM 'de' y", + "y": "E, d 'de' MMMM 'de' y–E, d 'de' MMMM 'de' y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/es/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/es/ca-gregorian.json new file mode 100644 index 00000000000..a142bc2f121 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/es/ca-gregorian.json @@ -0,0 +1,560 @@ +{ + "main": { + "es": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "es" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "ene", + "2": "feb", + "3": "mar", + "4": "abr", + "5": "may", + "6": "jun", + "7": "jul", + "8": "ago", + "9": "sept", + "10": "oct", + "11": "nov", + "12": "dic" + }, + "narrow": { + "1": "E", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "enero", + "2": "febrero", + "3": "marzo", + "4": "abril", + "5": "mayo", + "6": "junio", + "7": "julio", + "8": "agosto", + "9": "septiembre", + "10": "octubre", + "11": "noviembre", + "12": "diciembre" + } + }, + "stand-alone": { + "abbreviated": { + "1": "ene", + "2": "feb", + "3": "mar", + "4": "abr", + "5": "may", + "6": "jun", + "7": "jul", + "8": "ago", + "9": "sept", + "10": "oct", + "11": "nov", + "12": "dic" + }, + "narrow": { + "1": "E", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "enero", + "2": "febrero", + "3": "marzo", + "4": "abril", + "5": "mayo", + "6": "junio", + "7": "julio", + "8": "agosto", + "9": "septiembre", + "10": "octubre", + "11": "noviembre", + "12": "diciembre" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "dom", + "mon": "lun", + "tue": "mar", + "wed": "mié", + "thu": "jue", + "fri": "vie", + "sat": "sáb" + }, + "narrow": { + "sun": "D", + "mon": "L", + "tue": "M", + "wed": "X", + "thu": "J", + "fri": "V", + "sat": "S" + }, + "short": { + "sun": "DO", + "mon": "LU", + "tue": "MA", + "wed": "MI", + "thu": "JU", + "fri": "VI", + "sat": "SA" + }, + "wide": { + "sun": "domingo", + "mon": "lunes", + "tue": "martes", + "wed": "miércoles", + "thu": "jueves", + "fri": "viernes", + "sat": "sábado" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "dom", + "mon": "lun", + "tue": "mar", + "wed": "mié", + "thu": "jue", + "fri": "vie", + "sat": "sáb" + }, + "narrow": { + "sun": "D", + "mon": "L", + "tue": "M", + "wed": "X", + "thu": "J", + "fri": "V", + "sat": "S" + }, + "short": { + "sun": "DO", + "mon": "LU", + "tue": "MA", + "wed": "MI", + "thu": "JU", + "fri": "VI", + "sat": "SA" + }, + "wide": { + "sun": "domingo", + "mon": "lunes", + "tue": "martes", + "wed": "miércoles", + "thu": "jueves", + "fri": "viernes", + "sat": "sábado" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "T1", + "2": "T2", + "3": "T3", + "4": "T4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1.er trimestre", + "2": "2.º trimestre", + "3": "3.er trimestre", + "4": "4.º trimestre" + } + }, + "stand-alone": { + "abbreviated": { + "1": "T1", + "2": "T2", + "3": "T3", + "4": "T4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1.er trimestre", + "2": "2.º trimestre", + "3": "3.er trimestre", + "4": "4.º trimestre" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "am": "a. m.", + "noon": "del mediodía", + "pm": "p. m.", + "morning1": "de la madrugada", + "morning2": "de la mañana", + "evening1": "de la tarde", + "night1": "de la noche" + }, + "narrow": { + "am": "a. m.", + "noon": "del mediodía", + "pm": "p. m.", + "morning1": "de la madrugada", + "morning2": "de la mañana", + "evening1": "de la tarde", + "night1": "de la noche" + }, + "wide": { + "am": "a. m.", + "noon": "del mediodía", + "pm": "p. m.", + "morning1": "de la madrugada", + "morning2": "de la mañana", + "evening1": "de la tarde", + "night1": "de la noche" + } + }, + "stand-alone": { + "abbreviated": { + "am": "a. m.", + "noon": "mediodía", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + }, + "narrow": { + "am": "a. m.", + "noon": "mediodía", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + }, + "wide": { + "am": "a. m.", + "noon": "mediodía", + "pm": "p. m.", + "morning1": "madrugada", + "morning2": "mañana", + "evening1": "tarde", + "night1": "noche" + } + } + }, + "eras": { + "eraNames": { + "0": "antes de Cristo", + "0-alt-variant": "antes de la era común", + "1": "después de Cristo", + "1-alt-variant": "era común" + }, + "eraAbbr": { + "0": "a. C.", + "0-alt-variant": "a. e. c.", + "1": "d. C.", + "1-alt-variant": "e. c." + }, + "eraNarrow": { + "0": "a. C.", + "0-alt-variant": "a. e. c.", + "1": "d. C.", + "1-alt-variant": "e. c." + } + }, + "dateFormats": { + "full": "EEEE, d 'de' MMMM 'de' y", + "long": "d 'de' MMMM 'de' y", + "medium": "d MMM y", + "short": "d/M/yy" + }, + "timeFormats": { + "full": "H:mm:ss (zzzz)", + "long": "H:mm:ss z", + "medium": "H:mm:ss", + "short": "H:mm" + }, + "dateTimeFormats": { + "full": "{1}, {0}", + "long": "{1}, {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "E d", + "Ehm": "E, h:mm a", + "EHm": "E, H:mm", + "Ehms": "E, h:mm:ss a", + "EHms": "E, H:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM y G", + "GyMMMEd": "E, d MMM y G", + "GyMMMM": "MMMM 'de' y G", + "GyMMMMd": "d 'de' MMMM 'de' y G", + "GyMMMMEd": "E, d 'de' MMMM 'de' y G", + "h": "h a", + "H": "H", + "hm": "h:mm a", + "Hm": "H:mm", + "hms": "h:mm:ss a", + "Hms": "H:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "H:mm:ss v", + "hmsvvvv": "h:mm:ss a (vvvv)", + "Hmsvvvv": "H:mm:ss (vvvv)", + "hmv": "h:mm a v", + "Hmv": "H:mm v", + "M": "L", + "Md": "d/M", + "MEd": "E, d/M", + "MMd": "d/M", + "MMdd": "d/M", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "E, d MMM", + "MMMMd": "d 'de' MMMM", + "MMMMEd": "E, d 'de' MMMM", + "MMMMW-count-one": "'semana' W 'de' MMMM", + "MMMMW-count-other": "'semana' W 'de' MMMM", + "ms": "mm:ss", + "y": "y", + "yM": "M/y", + "yMd": "d/M/y", + "yMEd": "EEE, d/M/y", + "yMM": "M/y", + "yMMM": "MMM y", + "yMMMd": "d MMM y", + "yMMMEd": "EEE, d MMM y", + "yMMMM": "MMMM 'de' y", + "yMMMMd": "d 'de' MMMM 'de' y", + "yMMMMEd": "EEE, d 'de' MMMM 'de' y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ 'de' y", + "yw-count-one": "'semana' w 'de' Y", + "yw-count-other": "'semana' w 'de' Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0}–{1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y G – y G", + "y": "y–y G" + }, + "GyM": { + "G": "y-MM GGGGG – y-MM GGGGG", + "M": "y-MM – y-MM GGGGG", + "y": "y-MM – y-MM GGGGG" + }, + "GyMd": { + "d": "y-MM-dd – y-MM-dd GGGGG", + "G": "y-MM-dd GGGGG – y-MM-dd GGGGG", + "M": "y-MM-dd – y-MM-dd GGGGG", + "y": "y-MM-dd – y-MM-dd GGGGG" + }, + "GyMEd": { + "d": "E y-MM-dd – E y-MM-dd GGGGG", + "G": "E y-MM-dd GGGGG – E y-MM-dd GGGGG", + "M": "E y-MM-dd – E y-MM-dd GGGGG", + "y": "E y-MM-dd – E y-MM-dd GGGGG" + }, + "GyMMM": { + "G": "MMM y G – MMM y G", + "M": "MMM–MMM y G", + "y": "MMM y – MMM y G" + }, + "GyMMMd": { + "d": "MMM d–d y G", + "G": "MMM d y G – MMM d y G", + "M": "MMM d – MMM d y G", + "y": "MMM d y – MMM d y G" + }, + "GyMMMEd": { + "d": "E d MMM – E d MMM, y G", + "G": "E, MMM d, y G – E, MMM d, y G", + "M": "E d MMM – E d MMM, y G", + "y": "E d MMM, y – E d MMM, y G" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "H–H" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm – h:mm a", + "m": "h:mm – h:mm a" + }, + "Hm": { + "H": "H:mm–H:mm", + "m": "H:mm–H:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "H:mm–H:mm v", + "m": "H:mm–H:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "H–H v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d/M–d/M", + "M": "d/M–d/M" + }, + "MEd": { + "d": "E, d/M – E, d/M", + "M": "E, d/M – E, d/M" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E, d MMM – E, d MMM", + "M": "E, d MMM – E, d MMM" + }, + "MMMMd": { + "d": "d–d 'de' MMMM", + "M": "d 'de' MMMM–d 'de' MMMM" + }, + "MMMMEd": { + "d": "E, d 'de' MMMM–E, d 'de' MMMM", + "M": "E, d 'de' MMMM–E, d 'de' MMMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M/y–M/y", + "y": "M/y–M/y" + }, + "yMd": { + "d": "d/M/y–d/M/y", + "M": "d/M/y–d/M/y", + "y": "d/M/y–d/M/y" + }, + "yMEd": { + "d": "E, d/M/y – E, d/M/y", + "M": "E, d/M/y – E, d/M/y", + "y": "E, d/M/y – E, d/M/y" + }, + "yMMM": { + "M": "MMM–MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "d–d MMM y", + "M": "d MMM – d MMM y", + "y": "d MMM y – d MMM y" + }, + "yMMMEd": { + "d": "E, d MMM – E, d MMM y", + "M": "E, d MMM – E, d MMM y", + "y": "E, d MMM y – E, d MMM y" + }, + "yMMMM": { + "M": "MMMM–MMMM 'de' y", + "y": "MMMM 'de' y – MMMM 'de' y" + }, + "yMMMMd": { + "d": "d–d 'de' MMMM 'de' y", + "M": "d 'de' MMMM–d 'de' MMMM 'de' y", + "y": "d 'de' MMMM 'de' y–d 'de' MMMM 'de' y" + }, + "yMMMMEd": { + "d": "E, d 'de' MMMM–E, d 'de' MMMM 'de' y", + "M": "E, d 'de' MMMM–E, d 'de' MMMM 'de' y", + "y": "E, d 'de' MMMM 'de' y–E, d 'de' MMMM 'de' y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/fr/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/fr/ca-gregorian.json new file mode 100644 index 00000000000..a8405165bbd --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/fr/ca-gregorian.json @@ -0,0 +1,537 @@ +{ + "main": { + "fr": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "fr" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "janv.", + "2": "févr.", + "3": "mars", + "4": "avr.", + "5": "mai", + "6": "juin", + "7": "juil.", + "8": "août", + "9": "sept.", + "10": "oct.", + "11": "nov.", + "12": "déc." + }, + "narrow": { + "1": "J", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "janvier", + "2": "février", + "3": "mars", + "4": "avril", + "5": "mai", + "6": "juin", + "7": "juillet", + "8": "août", + "9": "septembre", + "10": "octobre", + "11": "novembre", + "12": "décembre" + } + }, + "stand-alone": { + "abbreviated": { + "1": "janv.", + "2": "févr.", + "3": "mars", + "4": "avr.", + "5": "mai", + "6": "juin", + "7": "juil.", + "8": "août", + "9": "sept.", + "10": "oct.", + "11": "nov.", + "12": "déc." + }, + "narrow": { + "1": "J", + "2": "F", + "3": "M", + "4": "A", + "5": "M", + "6": "J", + "7": "J", + "8": "A", + "9": "S", + "10": "O", + "11": "N", + "12": "D" + }, + "wide": { + "1": "janvier", + "2": "février", + "3": "mars", + "4": "avril", + "5": "mai", + "6": "juin", + "7": "juillet", + "8": "août", + "9": "septembre", + "10": "octobre", + "11": "novembre", + "12": "décembre" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "dim.", + "mon": "lun.", + "tue": "mar.", + "wed": "mer.", + "thu": "jeu.", + "fri": "ven.", + "sat": "sam." + }, + "narrow": { + "sun": "D", + "mon": "L", + "tue": "M", + "wed": "M", + "thu": "J", + "fri": "V", + "sat": "S" + }, + "short": { + "sun": "di", + "mon": "lu", + "tue": "ma", + "wed": "me", + "thu": "je", + "fri": "ve", + "sat": "sa" + }, + "wide": { + "sun": "dimanche", + "mon": "lundi", + "tue": "mardi", + "wed": "mercredi", + "thu": "jeudi", + "fri": "vendredi", + "sat": "samedi" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "dim.", + "mon": "lun.", + "tue": "mar.", + "wed": "mer.", + "thu": "jeu.", + "fri": "ven.", + "sat": "sam." + }, + "narrow": { + "sun": "D", + "mon": "L", + "tue": "M", + "wed": "M", + "thu": "J", + "fri": "V", + "sat": "S" + }, + "short": { + "sun": "di", + "mon": "lu", + "tue": "ma", + "wed": "me", + "thu": "je", + "fri": "ve", + "sat": "sa" + }, + "wide": { + "sun": "dimanche", + "mon": "lundi", + "tue": "mardi", + "wed": "mercredi", + "thu": "jeudi", + "fri": "vendredi", + "sat": "samedi" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "T1", + "2": "T2", + "3": "T3", + "4": "T4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1er trimestre", + "2": "2e trimestre", + "3": "3e trimestre", + "4": "4e trimestre" + } + }, + "stand-alone": { + "abbreviated": { + "1": "T1", + "2": "T2", + "3": "T3", + "4": "T4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1er trimestre", + "2": "2e trimestre", + "3": "3e trimestre", + "4": "4e trimestre" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "minuit", + "am": "AM", + "noon": "midi", + "pm": "PM", + "morning1": "mat.", + "afternoon1": "ap.m.", + "evening1": "soir", + "night1": "nuit" + }, + "narrow": { + "midnight": "minuit", + "am": "AM", + "noon": "midi", + "pm": "PM", + "morning1": "mat.", + "afternoon1": "ap.m.", + "evening1": "soir", + "night1": "nuit" + }, + "wide": { + "midnight": "minuit", + "am": "AM", + "noon": "midi", + "pm": "PM", + "morning1": "du matin", + "afternoon1": "de l’après-midi", + "evening1": "du soir", + "night1": "du matin" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "minuit", + "am": "AM", + "noon": "midi", + "pm": "PM", + "morning1": "mat.", + "afternoon1": "ap.m.", + "evening1": "soir", + "night1": "nuit" + }, + "narrow": { + "midnight": "minuit", + "am": "AM", + "noon": "midi", + "pm": "PM", + "morning1": "mat.", + "afternoon1": "ap.m.", + "evening1": "soir", + "night1": "nuit" + }, + "wide": { + "midnight": "minuit", + "am": "AM", + "noon": "midi", + "pm": "PM", + "morning1": "matin", + "afternoon1": "après-midi", + "evening1": "soir", + "night1": "nuit" + } + } + }, + "eras": { + "eraNames": { + "0": "avant Jésus-Christ", + "0-alt-variant": "avant l’ère commune", + "1": "après Jésus-Christ", + "1-alt-variant": "de l’ère commune" + }, + "eraAbbr": { + "0": "av. J.-C.", + "0-alt-variant": "AEC", + "1": "ap. J.-C.", + "1-alt-variant": "EC" + }, + "eraNarrow": { + "0": "av. J.-C.", + "0-alt-variant": "AEC", + "1": "ap. J.-C.", + "1-alt-variant": "EC" + } + }, + "dateFormats": { + "full": "EEEE d MMMM y", + "long": "d MMMM y", + "medium": "d MMM y", + "short": "dd/MM/y" + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1} 'à' {0}", + "long": "{1} 'à' {0}", + "medium": "{1}, {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "E", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "E d", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y G", + "GyMMM": "MMM y G", + "GyMMMd": "d MMM y G", + "GyMMMEd": "E d MMM y G", + "h": "h a", + "H": "HH 'h'", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "dd/MM", + "MEd": "E dd/MM", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "E d MMM", + "MMMMd": "d MMMM", + "MMMMW-count-one": "'semaine' W (MMMM)", + "MMMMW-count-other": "'semaine' W (MMMM)", + "ms": "mm:ss", + "y": "y", + "yM": "MM/y", + "yMd": "dd/MM/y", + "yMEd": "E dd/MM/y", + "yMMM": "MMM y", + "yMMMd": "d MMM y", + "yMMMEd": "E d MMM y", + "yMMMM": "MMMM y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ y", + "yw-count-one": "'semaine' w 'de' Y", + "yw-count-other": "'semaine' w 'de' Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h – h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm – h:mm B", + "m": "h:mm – h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y G 'à' y G", + "y": "y–y G" + }, + "GyM": { + "G": "M/y G 'à' M/y G", + "M": "M–M/y G", + "y": "M/y 'à' M/y G" + }, + "GyMd": { + "d": "d–d/M/y G", + "G": "d/M/y G 'à' d/M/y G", + "M": "d/M 'à' d/M/y G", + "y": "d/M/y 'à' d/M/y G" + }, + "GyMEd": { + "d": "E d 'à' E d/M/y G", + "G": "E d/M/y G 'à' E d/M/y G", + "M": "E d/M 'à' E d/M/y G", + "y": "E d/M/y 'à' E d/M/y G" + }, + "GyMMM": { + "G": "MMM y G 'à' MMM y G", + "M": "MMM 'à' MMM y G", + "y": "MMM y 'à' MMM y G" + }, + "GyMMMd": { + "d": "d–d MMM y G", + "G": "d MMM y G 'à' d MMM y G", + "M": "d MMM 'à' d MMM y G", + "y": "d MMM y 'à' d MMM y G" + }, + "GyMMMEd": { + "d": "E d 'à' E d MMM y G", + "G": "E d MMM y G 'à' E d MMM y G", + "M": "E d MMM 'à' E d MMM y G", + "y": "E d MMM y 'à' E d MMM y G" + }, + "h": { + "a": "h a – h a", + "h": "h – h a" + }, + "H": { + "H": "HH – HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm – h:mm a", + "m": "h:mm – h:mm a" + }, + "Hm": { + "H": "HH:mm – HH:mm", + "m": "HH:mm – HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm – h:mm a v", + "m": "h:mm – h:mm a v" + }, + "Hmv": { + "H": "HH:mm – HH:mm v", + "m": "HH:mm – HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h – h a v" + }, + "Hv": { + "H": "HH – HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "dd/MM – dd/MM", + "M": "dd/MM – dd/MM" + }, + "MEd": { + "d": "E dd/MM – E dd/MM", + "M": "E dd/MM – E dd/MM" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E d – E d MMM", + "M": "E d MMM – E d MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "MM/y – MM/y", + "y": "MM/y – MM/y" + }, + "yMd": { + "d": "dd/MM/y – dd/MM/y", + "M": "dd/MM/y – dd/MM/y", + "y": "dd/MM/y – dd/MM/y" + }, + "yMEd": { + "d": "E dd/MM/y – E dd/MM/y", + "M": "E dd/MM/y – E dd/MM/y", + "y": "E dd/MM/y – E dd/MM/y" + }, + "yMMM": { + "M": "MMM–MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "d–d MMM y", + "M": "d MMM – d MMM y", + "y": "d MMM y – d MMM y" + }, + "yMMMEd": { + "d": "E d – E d MMM y", + "M": "E d MMM – E d MMM y", + "y": "E d MMM y – E d MMM y" + }, + "yMMMM": { + "M": "MMMM – MMMM y", + "y": "MMMM y – MMMM y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/ja/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/ja/ca-gregorian.json new file mode 100644 index 00000000000..3c83cf9c096 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/ja/ca-gregorian.json @@ -0,0 +1,551 @@ +{ + "main": { + "ja": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ja" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "1月", + "2": "2月", + "3": "3月", + "4": "4月", + "5": "5月", + "6": "6月", + "7": "7月", + "8": "8月", + "9": "9月", + "10": "10月", + "11": "11月", + "12": "12月" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "10": "10", + "11": "11", + "12": "12" + }, + "wide": { + "1": "1月", + "2": "2月", + "3": "3月", + "4": "4月", + "5": "5月", + "6": "6月", + "7": "7月", + "8": "8月", + "9": "9月", + "10": "10月", + "11": "11月", + "12": "12月" + } + }, + "stand-alone": { + "abbreviated": { + "1": "1月", + "2": "2月", + "3": "3月", + "4": "4月", + "5": "5月", + "6": "6月", + "7": "7月", + "8": "8月", + "9": "9月", + "10": "10月", + "11": "11月", + "12": "12月" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "10": "10", + "11": "11", + "12": "12" + }, + "wide": { + "1": "1月", + "2": "2月", + "3": "3月", + "4": "4月", + "5": "5月", + "6": "6月", + "7": "7月", + "8": "8月", + "9": "9月", + "10": "10月", + "11": "11月", + "12": "12月" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "日", + "mon": "月", + "tue": "火", + "wed": "水", + "thu": "木", + "fri": "金", + "sat": "土" + }, + "narrow": { + "sun": "日", + "mon": "月", + "tue": "火", + "wed": "水", + "thu": "木", + "fri": "金", + "sat": "土" + }, + "short": { + "sun": "日", + "mon": "月", + "tue": "火", + "wed": "水", + "thu": "木", + "fri": "金", + "sat": "土" + }, + "wide": { + "sun": "日曜日", + "mon": "月曜日", + "tue": "火曜日", + "wed": "水曜日", + "thu": "木曜日", + "fri": "金曜日", + "sat": "土曜日" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "日", + "mon": "月", + "tue": "火", + "wed": "水", + "thu": "木", + "fri": "金", + "sat": "土" + }, + "narrow": { + "sun": "日", + "mon": "月", + "tue": "火", + "wed": "水", + "thu": "木", + "fri": "金", + "sat": "土" + }, + "short": { + "sun": "日", + "mon": "月", + "tue": "火", + "wed": "水", + "thu": "木", + "fri": "金", + "sat": "土" + }, + "wide": { + "sun": "日曜日", + "mon": "月曜日", + "tue": "火曜日", + "wed": "水曜日", + "thu": "木曜日", + "fri": "金曜日", + "sat": "土曜日" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "第1四半期", + "2": "第2四半期", + "3": "第3四半期", + "4": "第4四半期" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Q1", + "2": "Q2", + "3": "Q3", + "4": "Q4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "第1四半期", + "2": "第2四半期", + "3": "第3四半期", + "4": "第4四半期" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "真夜中", + "am": "午前", + "noon": "正午", + "pm": "午後", + "morning1": "朝", + "afternoon1": "昼", + "evening1": "夕方", + "night1": "夜", + "night2": "夜中" + }, + "narrow": { + "midnight": "真夜中", + "am": "午前", + "noon": "正午", + "pm": "午後", + "morning1": "朝", + "afternoon1": "昼", + "evening1": "夕方", + "night1": "夜", + "night2": "夜中" + }, + "wide": { + "midnight": "真夜中", + "am": "午前", + "noon": "正午", + "pm": "午後", + "morning1": "朝", + "afternoon1": "昼", + "evening1": "夕方", + "night1": "夜", + "night2": "夜中" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "真夜中", + "am": "午前", + "noon": "正午", + "pm": "午後", + "morning1": "朝", + "afternoon1": "昼", + "evening1": "夕方", + "night1": "夜", + "night2": "夜中" + }, + "narrow": { + "midnight": "真夜中", + "am": "午前", + "noon": "正午", + "pm": "午後", + "morning1": "朝", + "afternoon1": "昼", + "evening1": "夕方", + "night1": "夜", + "night2": "夜中" + }, + "wide": { + "midnight": "真夜中", + "am": "午前", + "noon": "正午", + "pm": "午後", + "morning1": "朝", + "afternoon1": "昼", + "evening1": "夕方", + "night1": "夜", + "night2": "夜中" + } + } + }, + "eras": { + "eraNames": { + "0": "紀元前", + "0-alt-variant": "西暦紀元前", + "1": "西暦", + "1-alt-variant": "西暦紀元" + }, + "eraAbbr": { + "0": "紀元前", + "0-alt-variant": "西暦紀元前", + "1": "西暦", + "1-alt-variant": "西暦紀元" + }, + "eraNarrow": { + "0": "BC", + "0-alt-variant": "西暦紀元前", + "1": "AD", + "1-alt-variant": "西暦紀元" + } + }, + "dateFormats": { + "full": "y年M月d日EEEE", + "long": "y年M月d日", + "medium": "y/MM/dd", + "short": "y/MM/dd" + }, + "timeFormats": { + "full": "H時mm分ss秒 zzzz", + "long": "H:mm:ss z", + "medium": "H:mm:ss", + "short": "H:mm" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "BK時", + "Bhm": "BK:mm", + "Bhms": "BK:mm:ss", + "d": "d日", + "E": "ccc", + "EBhm": "BK:mm (E)", + "EBhms": "BK:mm:ss (E)", + "Ed": "d日(E)", + "EEEEd": "d日EEEE", + "Ehm": "aK:mm (E)", + "EHm": "H:mm (E)", + "Ehms": "aK:mm:ss (E)", + "EHms": "H:mm:ss (E)", + "Gy": "Gy年", + "GyMMM": "Gy年M月", + "GyMMMd": "Gy年M月d日", + "GyMMMEd": "Gy年M月d日(E)", + "GyMMMEEEEd": "Gy年M月d日EEEE", + "h": "aK時", + "H": "H時", + "hm": "aK:mm", + "Hm": "H:mm", + "hms": "aK:mm:ss", + "Hms": "H:mm:ss", + "hmsv": "aK:mm:ss v", + "Hmsv": "H:mm:ss v", + "hmv": "aK:mm v", + "Hmv": "H:mm v", + "M": "M月", + "Md": "M/d", + "MEd": "M/d(E)", + "MEEEEd": "M/dEEEE", + "MMM": "M月", + "MMMd": "M月d日", + "MMMEd": "M月d日(E)", + "MMMEEEEd": "M月d日EEEE", + "MMMMd": "M月d日", + "MMMMW-count-other": "M月第W週", + "ms": "mm:ss", + "y": "y年", + "yM": "y/M", + "yMd": "y/M/d", + "yMEd": "y/M/d(E)", + "yMEEEEd": "y/M/dEEEE", + "yMM": "y/MM", + "yMMM": "y年M月", + "yMMMd": "y年M月d日", + "yMMMEd": "y年M月d日(E)", + "yMMMEEEEd": "y年M月d日EEEE", + "yMMMM": "y年M月", + "yQQQ": "y/QQQ", + "yQQQQ": "y年QQQQ", + "yw-count-other": "Y年第w週" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0}~{1}", + "Bh": { + "B": "BK時~BK時", + "h": "BK時~K時" + }, + "Bhm": { + "B": "BK:mm~BK:mm", + "h": "BK:mm~K:mm", + "m": "BK:mm~K:mm" + }, + "d": { + "d": "d日~d日" + }, + "Gy": { + "G": "Gy年~Gy年", + "y": "Gy年~y年" + }, + "GyM": { + "G": "Gy/MM~Gy/MM", + "M": "Gy/MM~y/MM", + "y": "Gy/MM~y/MM" + }, + "GyMd": { + "d": "Gy/MM/dd~y/MM/dd", + "G": "Gy/MM/dd~Gy/MM/dd", + "M": "Gy/MM/dd~y/MM/dd", + "y": "Gy/MM/dd~y/MM/dd" + }, + "GyMEd": { + "d": "Gy/MM/dd(E)~y/MM/dd(E)", + "G": "Gy/MM/dd(E)~Gy/MM/dd(E)", + "M": "Gy/MM/dd(E)~y/MM/dd(E)", + "y": "Gy/MM/dd(E)~y/MM/dd(E)" + }, + "GyMMM": { + "G": "Gy年M月~Gy年M月", + "M": "Gy年M月~M月", + "y": "Gy年M月~y年M月" + }, + "GyMMMd": { + "d": "Gy年M月d日~d日", + "G": "Gy年M月d日~Gy年M月d日", + "M": "Gy年M月d日~M月d日", + "y": "Gy年M月d日~y年M月d日" + }, + "GyMMMEd": { + "d": "Gy年M月d日(E)~d日(E)", + "G": "Gy年M月d日(E)~Gy年M月d日(E)", + "M": "Gy年M月d日(E)~M月d日(E)", + "y": "Gy年M月d日(E)~y年M月d日(E)" + }, + "h": { + "a": "aK時~aK時", + "h": "aK時~K時" + }, + "H": { + "H": "H時~H時" + }, + "hm": { + "a": "aK時mm分~aK時mm分", + "h": "aK時mm分~K時mm分", + "m": "aK時mm分~K時mm分" + }, + "Hm": { + "H": "H時mm分~H時mm分", + "m": "H時mm分~H時mm分" + }, + "hmv": { + "a": "aK時mm分~aK時mm分(v)", + "h": "aK時mm分~K時mm分(v)", + "m": "aK時mm分~K時mm分(v)" + }, + "Hmv": { + "H": "H時mm分~H時mm分(v)", + "m": "H時mm分~H時mm分(v)" + }, + "hv": { + "a": "aK時~aK時(v)", + "h": "aK時~K時(v)" + }, + "Hv": { + "H": "H時~H時(v)" + }, + "M": { + "M": "M月~M月" + }, + "Md": { + "d": "MM/dd~MM/dd", + "M": "MM/dd~MM/dd" + }, + "MEd": { + "d": "MM/dd(E)~MM/dd(E)", + "M": "MM/dd(E)~MM/dd(E)" + }, + "MMM": { + "M": "M月~M月" + }, + "MMMd": { + "d": "M月d日~d日", + "M": "M月d日~M月d日" + }, + "MMMEd": { + "d": "M月d日(E)~d日(E)", + "M": "M月d日(E)~M月d日(E)" + }, + "MMMM": { + "M": "M月~M月" + }, + "y": { + "y": "y年~y年" + }, + "yM": { + "M": "y/MM~y/MM", + "y": "y/MM~y/MM" + }, + "yMd": { + "d": "y/MM/dd~y/MM/dd", + "M": "y/MM/dd~y/MM/dd", + "y": "y/MM/dd~y/MM/dd" + }, + "yMEd": { + "d": "y/MM/dd(E)~y/MM/dd(E)", + "M": "y/MM/dd(E)~y/MM/dd(E)", + "y": "y/MM/dd(E)~y/MM/dd(E)" + }, + "yMMM": { + "M": "y年M月~M月", + "y": "y年M月~y年M月" + }, + "yMMMd": { + "d": "y年M月d日~d日", + "M": "y年M月d日~M月d日", + "y": "y年M月d日~y年M月d日" + }, + "yMMMEd": { + "d": "y年M月d日(E)~d日(E)", + "M": "y年M月d日(E)~M月d日(E)", + "y": "y年M月d日(E)~y年M月d日(E)" + }, + "yMMMM": { + "M": "y年M月~M月", + "y": "y年M月~y年M月" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/ru/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/ru/ca-gregorian.json new file mode 100644 index 00000000000..d6a0f6fa003 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/ru/ca-gregorian.json @@ -0,0 +1,546 @@ +{ + "main": { + "ru": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ru" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "янв.", + "2": "февр.", + "3": "мар.", + "4": "апр.", + "5": "мая", + "6": "июн.", + "7": "июл.", + "8": "авг.", + "9": "сент.", + "10": "окт.", + "11": "нояб.", + "12": "дек." + }, + "narrow": { + "1": "Я", + "2": "Ф", + "3": "М", + "4": "А", + "5": "М", + "6": "И", + "7": "И", + "8": "А", + "9": "С", + "10": "О", + "11": "Н", + "12": "Д" + }, + "wide": { + "1": "января", + "2": "февраля", + "3": "марта", + "4": "апреля", + "5": "мая", + "6": "июня", + "7": "июля", + "8": "августа", + "9": "сентября", + "10": "октября", + "11": "ноября", + "12": "декабря" + } + }, + "stand-alone": { + "abbreviated": { + "1": "янв.", + "2": "февр.", + "3": "март", + "4": "апр.", + "5": "май", + "6": "июнь", + "7": "июль", + "8": "авг.", + "9": "сент.", + "10": "окт.", + "11": "нояб.", + "12": "дек." + }, + "narrow": { + "1": "Я", + "2": "Ф", + "3": "М", + "4": "А", + "5": "М", + "6": "И", + "7": "И", + "8": "А", + "9": "С", + "10": "О", + "11": "Н", + "12": "Д" + }, + "wide": { + "1": "январь", + "2": "февраль", + "3": "март", + "4": "апрель", + "5": "май", + "6": "июнь", + "7": "июль", + "8": "август", + "9": "сентябрь", + "10": "октябрь", + "11": "ноябрь", + "12": "декабрь" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "вс", + "mon": "пн", + "tue": "вт", + "wed": "ср", + "thu": "чт", + "fri": "пт", + "sat": "сб" + }, + "narrow": { + "sun": "вс", + "mon": "пн", + "tue": "вт", + "wed": "ср", + "thu": "чт", + "fri": "пт", + "sat": "сб" + }, + "short": { + "sun": "вс", + "mon": "пн", + "tue": "вт", + "wed": "ср", + "thu": "чт", + "fri": "пт", + "sat": "сб" + }, + "wide": { + "sun": "воскресенье", + "mon": "понедельник", + "tue": "вторник", + "wed": "среда", + "thu": "четверг", + "fri": "пятница", + "sat": "суббота" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "вс", + "mon": "пн", + "tue": "вт", + "wed": "ср", + "thu": "чт", + "fri": "пт", + "sat": "сб" + }, + "narrow": { + "sun": "В", + "mon": "П", + "tue": "В", + "wed": "С", + "thu": "Ч", + "fri": "П", + "sat": "С" + }, + "short": { + "sun": "вс", + "mon": "пн", + "tue": "вт", + "wed": "ср", + "thu": "чт", + "fri": "пт", + "sat": "сб" + }, + "wide": { + "sun": "воскресенье", + "mon": "понедельник", + "tue": "вторник", + "wed": "среда", + "thu": "четверг", + "fri": "пятница", + "sat": "суббота" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "1-й кв.", + "2": "2-й кв.", + "3": "3-й кв.", + "4": "4-й кв." + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1-й квартал", + "2": "2-й квартал", + "3": "3-й квартал", + "4": "4-й квартал" + } + }, + "stand-alone": { + "abbreviated": { + "1": "1-й кв.", + "2": "2-й кв.", + "3": "3-й кв.", + "4": "4-й кв." + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "1-й квартал", + "2": "2-й квартал", + "3": "3-й квартал", + "4": "4-й квартал" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "полн.", + "am": "AM", + "noon": "полд.", + "pm": "PM", + "morning1": "утра", + "afternoon1": "дня", + "evening1": "вечера", + "night1": "ночи" + }, + "narrow": { + "midnight": "полн.", + "am": "AM", + "noon": "полд.", + "pm": "PM", + "morning1": "утра", + "afternoon1": "дня", + "evening1": "веч.", + "night1": "ночи" + }, + "wide": { + "midnight": "полночь", + "am": "AM", + "noon": "полдень", + "pm": "PM", + "morning1": "утра", + "afternoon1": "дня", + "evening1": "вечера", + "night1": "ночи" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "полн.", + "am": "AM", + "noon": "полд.", + "pm": "PM", + "morning1": "утро", + "afternoon1": "день", + "evening1": "веч.", + "night1": "ночь" + }, + "narrow": { + "midnight": "полн.", + "am": "AM", + "noon": "полд.", + "pm": "PM", + "morning1": "утро", + "afternoon1": "день", + "evening1": "веч.", + "night1": "ночь" + }, + "wide": { + "midnight": "полночь", + "am": "AM", + "noon": "полдень", + "pm": "PM", + "morning1": "утро", + "afternoon1": "день", + "evening1": "вечер", + "night1": "ночь" + } + } + }, + "eras": { + "eraNames": { + "0": "до Рождества Христова", + "0-alt-variant": "до нашей эры", + "1": "от Рождества Христова", + "1-alt-variant": "нашей эры" + }, + "eraAbbr": { + "0": "до н. э.", + "0-alt-variant": "до н. э.", + "1": "н. э.", + "1-alt-variant": "н. э." + }, + "eraNarrow": { + "0": "до н.э.", + "0-alt-variant": "до н. э.", + "1": "н.э.", + "1-alt-variant": "н. э." + } + }, + "dateFormats": { + "full": "EEEE, d MMMM y 'г'.", + "long": "d MMMM y 'г'.", + "medium": "d MMM y 'г'.", + "short": "dd.MM.y" + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1}, {0}", + "long": "{1}, {0}", + "medium": "{1}, {0}", + "short": "{1}, {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "ccc, h:mm B", + "EBhms": "ccc, h:mm:ss B", + "Ed": "ccc, d", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y 'г'. G", + "GyMMM": "LLL y G", + "GyMMMd": "d MMM y 'г'. G", + "GyMMMEd": "E, d MMM y 'г'. G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "dd.MM", + "MEd": "E, dd.MM", + "MMdd": "dd.MM", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "ccc, d MMM", + "MMMMd": "d MMMM", + "MMMMW-count-one": "W-'я' 'неделя' MMMM", + "MMMMW-count-few": "W-'я' 'неделя' MMMM", + "MMMMW-count-many": "W-'я' 'неделя' MMMM", + "MMMMW-count-other": "W-'я' 'неделя' MMMM", + "ms": "mm:ss", + "y": "y", + "yM": "MM.y", + "yMd": "dd.MM.y", + "yMEd": "ccc, dd.MM.y 'г'.", + "yMM": "MM.y", + "yMMM": "LLL y 'г'.", + "yMMMd": "d MMM y 'г'.", + "yMMMEd": "E, d MMM y 'г'.", + "yMMMM": "LLLL y 'г'.", + "yQQQ": "QQQ y 'г'.", + "yQQQQ": "QQQQ y 'г'.", + "yw-count-one": "w-'я' 'неделя' Y 'г'.", + "yw-count-few": "w-'я' 'неделя' Y 'г'.", + "yw-count-many": "w-'я' 'неделя' Y 'г'.", + "yw-count-other": "w-'я' 'неделя' Y 'г'." + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm – h:mm B", + "m": "h:mm – h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "y 'г'. G – y 'г'. G", + "y": "y–y 'гг'. G" + }, + "GyM": { + "G": "MM.y G – MM.y G", + "M": "MM.y – MM.y G", + "y": "MM.y – MM.y G" + }, + "GyMd": { + "d": "dd.MM.y – dd.MM.y G", + "G": "dd.MM.y G – dd.MM.y G", + "M": "dd.MM.y – dd.MM.y G", + "y": "dd.MM.y – dd.MM.y G" + }, + "GyMEd": { + "d": "ccc, dd.MM.y – ccc, dd.MM.y G", + "G": "ccc, dd.MM.y G – ccc, dd.MM.y G", + "M": "ccc, dd.MM.y – ccc, dd.MM.y G", + "y": "ccc, dd.MM.y – ccc, dd.MM.y G" + }, + "GyMMM": { + "G": "LLL y 'г'. G – LLL y 'г'. G", + "M": "LLL – LLL y 'г'. G", + "y": "LLL y – LLL y 'гг'. G" + }, + "GyMMMd": { + "d": "d–d MMM y 'г'. G", + "G": "d MMM y 'г'. G – d MMM y 'г'. G", + "M": "d MMM – d MMM y 'г'. G", + "y": "d MMM y – d MMM y 'гг'. G" + }, + "GyMMMEd": { + "d": "ccc, d MMM – ccc, d MMM y 'г'. G", + "G": "ccc, d MMM y 'г'. G – ccc, d MMM y 'г'. G", + "M": "ccc, d MMM – ccc, d MMM y 'г'. G", + "y": "ccc, d MMM y – ccc, d MMM y 'гг'. G" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "dd.MM – dd.MM", + "M": "dd.MM – dd.MM" + }, + "MEd": { + "d": "E, dd.MM – E, dd.MM", + "M": "E, dd.MM – E, dd.MM" + }, + "MMM": { + "M": "LLL – LLL" + }, + "MMMd": { + "d": "d–d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E, d MMM – E, d MMM", + "M": "E, d MMM – E, d MMM" + }, + "MMMM": { + "M": "LLLL – LLLL" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "MM.y – MM.y", + "y": "MM.y – MM.y" + }, + "yMd": { + "d": "dd.MM.y – dd.MM.y", + "M": "dd.MM.y – dd.MM.y", + "y": "dd.MM.y – dd.MM.y" + }, + "yMEd": { + "d": "ccc, dd.MM.y – ccc, dd.MM.y", + "M": "ccc, dd.MM.y – ccc, dd.MM.y", + "y": "ccc, dd.MM.y – ccc, dd.MM.y" + }, + "yMMM": { + "M": "LLL – LLL y 'г'.", + "y": "LLL y 'г'. – LLL y 'г'." + }, + "yMMMd": { + "d": "d–d MMM y 'г'.", + "M": "d MMM – d MMM y 'г'.", + "y": "d MMM y 'г'. – d MMM y 'г'." + }, + "yMMMEd": { + "d": "ccc, d – ccc, d MMM y 'г'.", + "M": "ccc, d MMM – ccc, d MMM y 'г'.", + "y": "ccc, d MMM y 'г'. – ccc, d MMM y 'г'." + }, + "yMMMM": { + "M": "LLLL – LLLL y 'г'.", + "y": "LLLL y 'г'. – LLLL y 'г'." + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/sr-Cyrl/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/sr-Cyrl/ca-gregorian.json new file mode 100644 index 00000000000..f0c7ad18d83 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/sr-Cyrl/ca-gregorian.json @@ -0,0 +1,545 @@ +{ + "main": { + "sr-Cyrl": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "sr", + "script": "Cyrl" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "јан", + "2": "феб", + "3": "мар", + "4": "апр", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "авг", + "9": "сеп", + "10": "окт", + "11": "нов", + "12": "дец" + }, + "narrow": { + "1": "ј", + "2": "ф", + "3": "м", + "4": "а", + "5": "м", + "6": "ј", + "7": "ј", + "8": "а", + "9": "с", + "10": "о", + "11": "н", + "12": "д" + }, + "wide": { + "1": "јануар", + "2": "фебруар", + "3": "март", + "4": "април", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "август", + "9": "септембар", + "10": "октобар", + "11": "новембар", + "12": "децембар" + } + }, + "stand-alone": { + "abbreviated": { + "1": "јан", + "2": "феб", + "3": "мар", + "4": "апр", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "авг", + "9": "сеп", + "10": "окт", + "11": "нов", + "12": "дец" + }, + "narrow": { + "1": "ј", + "2": "ф", + "3": "м", + "4": "а", + "5": "м", + "6": "ј", + "7": "ј", + "8": "а", + "9": "с", + "10": "о", + "11": "н", + "12": "д" + }, + "wide": { + "1": "јануар", + "2": "фебруар", + "3": "март", + "4": "април", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "август", + "9": "септембар", + "10": "октобар", + "11": "новембар", + "12": "децембар" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "нед", + "mon": "пон", + "tue": "уто", + "wed": "сре", + "thu": "чет", + "fri": "пет", + "sat": "суб" + }, + "narrow": { + "sun": "н", + "mon": "п", + "tue": "у", + "wed": "с", + "thu": "ч", + "fri": "п", + "sat": "с" + }, + "short": { + "sun": "не", + "mon": "по", + "tue": "ут", + "wed": "ср", + "thu": "че", + "fri": "пе", + "sat": "су" + }, + "wide": { + "sun": "недеља", + "mon": "понедељак", + "tue": "уторак", + "wed": "среда", + "thu": "четвртак", + "fri": "петак", + "sat": "субота" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "нед", + "mon": "пон", + "tue": "уто", + "wed": "сре", + "thu": "чет", + "fri": "пет", + "sat": "суб" + }, + "narrow": { + "sun": "н", + "mon": "п", + "tue": "у", + "wed": "с", + "thu": "ч", + "fri": "п", + "sat": "с" + }, + "short": { + "sun": "не", + "mon": "по", + "tue": "ут", + "wed": "ср", + "thu": "че", + "fri": "пе", + "sat": "су" + }, + "wide": { + "sun": "недеља", + "mon": "понедељак", + "tue": "уторак", + "wed": "среда", + "thu": "четвртак", + "fri": "петак", + "sat": "субота" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "К1", + "2": "К2", + "3": "К3", + "4": "К4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "први квартал", + "2": "други квартал", + "3": "трећи квартал", + "4": "четврти квартал" + } + }, + "stand-alone": { + "abbreviated": { + "1": "К1", + "2": "К2", + "3": "К3", + "4": "К4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "први квартал", + "2": "други квартал", + "3": "трећи квартал", + "4": "четврти квартал" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "ујутро", + "afternoon1": "по подне", + "evening1": "увече", + "night1": "ноћу" + }, + "narrow": { + "midnight": "поноћ", + "am": "a", + "noon": "подне", + "pm": "p", + "morning1": "ујутру", + "afternoon1": "по подне", + "evening1": "увече", + "night1": "ноћу" + }, + "wide": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "ујутро", + "afternoon1": "по подне", + "evening1": "увече", + "night1": "ноћу" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "јутро", + "afternoon1": "поподне", + "evening1": "вече", + "night1": "ноћ" + }, + "narrow": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "јутро", + "afternoon1": "поподне", + "evening1": "вече", + "night1": "ноћ" + }, + "wide": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "јутро", + "afternoon1": "поподне", + "evening1": "вече", + "night1": "ноћ" + } + } + }, + "eras": { + "eraNames": { + "0": "пре нове ере", + "0-alt-variant": "пре наше ере", + "1": "нове ере", + "1-alt-variant": "наше ере" + }, + "eraAbbr": { + "0": "п. н. е.", + "0-alt-variant": "п. н. е.", + "1": "н. е.", + "1-alt-variant": "н. е." + }, + "eraNarrow": { + "0": "п.н.е.", + "0-alt-variant": "п. н. е.", + "1": "н.е.", + "1-alt-variant": "н. е." + } + }, + "dateFormats": { + "full": "EEEE, dd. MMMM y.", + "long": "dd. MMMM y.", + "medium": "dd.MM.y.", + "short": "d.M.yy." + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "hh:mm B", + "Bhms": "hh:mm:ss B", + "d": "d", + "E": "E", + "EBhm": "E hh:mm B", + "EBhms": "E hh:mm:ss B", + "Ed": "E d.", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y. G", + "GyMMM": "MMM y. G", + "GyMMMd": "d. MMM y. G", + "GyMMMEd": "E, d. MMM y. G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d.M.", + "MEd": "E, d.M.", + "MMdd": "dd.MM.", + "MMM": "LLL", + "MMMd": "d. MMM", + "MMMdd": "dd.MMM", + "MMMEd": "E d. MMM", + "MMMMd": "d. MMMM", + "MMMMEd": "E, d. MMMM", + "MMMMW-count-one": "W. 'седмица' 'у' MMMM.", + "MMMMW-count-few": "W. 'седмица' 'у' MMMM.", + "MMMMW-count-other": "W. 'седмица' 'у' MMMM.", + "ms": "mm:ss", + "y": "y.", + "yM": "M.y.", + "yMd": "d.M.y.", + "yMEd": "E, d.M.y.", + "yMM": "MM.y.", + "yMMdd": "dd.MM.y.", + "yMMM": "MMM y.", + "yMMMd": "d. MMM y.", + "yMMMEd": "E, d. MMM y.", + "yMMMM": "MMMM y.", + "yQQQ": "QQQ y.", + "yQQQQ": "QQQQ y.", + "yw-count-one": "w. 'седмица' 'у' Y.", + "yw-count-few": "w. 'седмица' 'у' Y.", + "yw-count-other": "w. 'седмица' 'у' Y." + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "G y – G y", + "y": "G y–y" + }, + "GyM": { + "G": "GGGGG y-MM – GGGGG y-MM", + "M": "GGGGG y-MM – y-MM", + "y": "GGGGG y-MM – y-MM" + }, + "GyMd": { + "d": "GGGGG y-MM-dd – y-MM-dd", + "G": "GGGGG y-MM-dd – GGGGG y-MM-dd", + "M": "GGGGG y-MM-dd – y-MM-dd", + "y": "GGGGG y-MM-dd – y-MM-dd" + }, + "GyMEd": { + "d": "GGGGG y-MM-dd, E – y-MM-dd, E", + "G": "GGGGG y-MM-dd, E – GGGGG y-MM-dd, E", + "M": "GGGGG y-MM-dd, E – y-MM-dd, E", + "y": "GGGGG y-MM-dd, E – y-MM-dd, E" + }, + "GyMMM": { + "G": "G y MMM – G y MMM", + "M": "G y MMM–MMM", + "y": "G y MMM – y MMM" + }, + "GyMMMd": { + "d": "G y MMM d–d", + "G": "G y MMM d – G y MMM d", + "M": "G y MMM d – MMM d", + "y": "G y MMM d – y MMM d" + }, + "GyMMMEd": { + "d": "G y MMM d, E – MMM d, E", + "G": "G y MMM d, E – G y MMM d, E", + "M": "G y MMM d, E – MMM d, E", + "y": "G y MMM d, E – y MMM d, E" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d.M – d.M", + "M": "d.M – d.M" + }, + "MEd": { + "d": "E, d.M – E, d.M", + "M": "E, d.M – E, d.M" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "dd.–dd. MMM", + "M": "dd. MMM – dd. MMM" + }, + "MMMEd": { + "d": "E, dd. – E, dd. MMM", + "M": "E, dd. MMM – E, dd. MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M – M, y", + "y": "M.y. – M.y." + }, + "yMd": { + "d": "d.M.y. – d.M.y.", + "M": "d.M.y. – d.M.y.", + "y": "d.M.y. – d.M.y." + }, + "yMEd": { + "d": "E, d.M.y. – E, d.M.y.", + "M": "E, d.M.y. – E, d.M.y.", + "y": "E, d.M.y. – E, d.M.y." + }, + "yMMM": { + "M": "MMM–MMM y.", + "y": "MMM y. – MMM y." + }, + "yMMMd": { + "d": "dd.–dd. MMM y.", + "M": "dd. MMM – dd. MMM y.", + "y": "dd. MMM y. – dd. MMM y." + }, + "yMMMEd": { + "d": "E, dd. – E, dd. MMM y.", + "M": "E, dd. MMM – E, dd. MMM y.", + "y": "E, dd. MMM y. – E, dd. MMM y." + }, + "yMMMM": { + "M": "MMMM – MMMM y.", + "y": "MMMM y. – MMMM y." + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/sr-Latn/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/sr-Latn/ca-gregorian.json new file mode 100644 index 00000000000..5fcb076229a --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/sr-Latn/ca-gregorian.json @@ -0,0 +1,545 @@ +{ + "main": { + "sr-Latn": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "sr", + "script": "Latn" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "jan", + "2": "feb", + "3": "mar", + "4": "apr", + "5": "maj", + "6": "jun", + "7": "jul", + "8": "avg", + "9": "sep", + "10": "okt", + "11": "nov", + "12": "dec" + }, + "narrow": { + "1": "j", + "2": "f", + "3": "m", + "4": "a", + "5": "m", + "6": "j", + "7": "j", + "8": "a", + "9": "s", + "10": "o", + "11": "n", + "12": "d" + }, + "wide": { + "1": "januar", + "2": "februar", + "3": "mart", + "4": "april", + "5": "maj", + "6": "jun", + "7": "jul", + "8": "avgust", + "9": "septembar", + "10": "oktobar", + "11": "novembar", + "12": "decembar" + } + }, + "stand-alone": { + "abbreviated": { + "1": "jan", + "2": "feb", + "3": "mar", + "4": "apr", + "5": "maj", + "6": "jun", + "7": "jul", + "8": "avg", + "9": "sep", + "10": "okt", + "11": "nov", + "12": "dec" + }, + "narrow": { + "1": "j", + "2": "f", + "3": "m", + "4": "a", + "5": "m", + "6": "j", + "7": "j", + "8": "a", + "9": "s", + "10": "o", + "11": "n", + "12": "d" + }, + "wide": { + "1": "januar", + "2": "februar", + "3": "mart", + "4": "april", + "5": "maj", + "6": "jun", + "7": "jul", + "8": "avgust", + "9": "septembar", + "10": "oktobar", + "11": "novembar", + "12": "decembar" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "ned", + "mon": "pon", + "tue": "uto", + "wed": "sre", + "thu": "čet", + "fri": "pet", + "sat": "sub" + }, + "narrow": { + "sun": "n", + "mon": "p", + "tue": "u", + "wed": "s", + "thu": "č", + "fri": "p", + "sat": "s" + }, + "short": { + "sun": "ne", + "mon": "po", + "tue": "ut", + "wed": "sr", + "thu": "če", + "fri": "pe", + "sat": "su" + }, + "wide": { + "sun": "nedelja", + "mon": "ponedeljak", + "tue": "utorak", + "wed": "sreda", + "thu": "četvrtak", + "fri": "petak", + "sat": "subota" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "ned", + "mon": "pon", + "tue": "uto", + "wed": "sre", + "thu": "čet", + "fri": "pet", + "sat": "sub" + }, + "narrow": { + "sun": "n", + "mon": "p", + "tue": "u", + "wed": "s", + "thu": "č", + "fri": "p", + "sat": "s" + }, + "short": { + "sun": "ne", + "mon": "po", + "tue": "ut", + "wed": "sr", + "thu": "če", + "fri": "pe", + "sat": "su" + }, + "wide": { + "sun": "nedelja", + "mon": "ponedeljak", + "tue": "utorak", + "wed": "sreda", + "thu": "četvrtak", + "fri": "petak", + "sat": "subota" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "K1", + "2": "K2", + "3": "K3", + "4": "K4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "prvi kvartal", + "2": "drugi kvartal", + "3": "treći kvartal", + "4": "četvrti kvartal" + } + }, + "stand-alone": { + "abbreviated": { + "1": "K1", + "2": "K2", + "3": "K3", + "4": "K4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "prvi kvartal", + "2": "drugi kvartal", + "3": "treći kvartal", + "4": "četvrti kvartal" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "ponoć", + "am": "pre podne", + "noon": "podne", + "pm": "po podne", + "morning1": "ujutro", + "afternoon1": "po podne", + "evening1": "uveče", + "night1": "noću" + }, + "narrow": { + "midnight": "ponoć", + "am": "a", + "noon": "podne", + "pm": "p", + "morning1": "ujutru", + "afternoon1": "po podne", + "evening1": "uveče", + "night1": "noću" + }, + "wide": { + "midnight": "ponoć", + "am": "pre podne", + "noon": "podne", + "pm": "po podne", + "morning1": "ujutro", + "afternoon1": "po podne", + "evening1": "uveče", + "night1": "noću" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "ponoć", + "am": "pre podne", + "noon": "podne", + "pm": "po podne", + "morning1": "jutro", + "afternoon1": "popodne", + "evening1": "veče", + "night1": "noć" + }, + "narrow": { + "midnight": "ponoć", + "am": "pre podne", + "noon": "podne", + "pm": "po podne", + "morning1": "jutro", + "afternoon1": "popodne", + "evening1": "veče", + "night1": "noć" + }, + "wide": { + "midnight": "ponoć", + "am": "pre podne", + "noon": "podne", + "pm": "po podne", + "morning1": "jutro", + "afternoon1": "popodne", + "evening1": "veče", + "night1": "noć" + } + } + }, + "eras": { + "eraNames": { + "0": "pre nove ere", + "0-alt-variant": "pre naše ere", + "1": "nove ere", + "1-alt-variant": "naše ere" + }, + "eraAbbr": { + "0": "p. n. e.", + "0-alt-variant": "p. n. e.", + "1": "n. e.", + "1-alt-variant": "n. e." + }, + "eraNarrow": { + "0": "p.n.e.", + "0-alt-variant": "p. n. e.", + "1": "n.e.", + "1-alt-variant": "n. e." + } + }, + "dateFormats": { + "full": "EEEE, dd. MMMM y.", + "long": "dd. MMMM y.", + "medium": "dd.MM.y.", + "short": "d.M.yy." + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "hh:mm B", + "Bhms": "hh:mm:ss B", + "d": "d", + "E": "E", + "EBhm": "E hh:mm B", + "EBhms": "E hh:mm:ss B", + "Ed": "E d.", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y. G", + "GyMMM": "MMM y. G", + "GyMMMd": "d. MMM y. G", + "GyMMMEd": "E, d. MMM y. G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d.M.", + "MEd": "E, d.M.", + "MMdd": "dd.MM.", + "MMM": "LLL", + "MMMd": "d. MMM", + "MMMdd": "dd.MMM", + "MMMEd": "E d. MMM", + "MMMMd": "d. MMMM", + "MMMMEd": "E, d. MMMM", + "MMMMW-count-one": "W. 'sedmica' 'u' MMMM.", + "MMMMW-count-few": "W. 'sedmica' 'u' MMMM.", + "MMMMW-count-other": "W. 'sedmica' 'u' MMMM.", + "ms": "mm:ss", + "y": "y.", + "yM": "M.y.", + "yMd": "d.M.y.", + "yMEd": "E, d.M.y.", + "yMM": "MM.y.", + "yMMdd": "dd.MM.y.", + "yMMM": "MMM y.", + "yMMMd": "d. MMM y.", + "yMMMEd": "E, d. MMM y.", + "yMMMM": "MMMM y.", + "yQQQ": "QQQ y.", + "yQQQQ": "QQQQ y.", + "yw-count-one": "w. 'sedmica' 'u' Y.", + "yw-count-few": "w. 'sedmica' 'u' Y.", + "yw-count-other": "w. 'sedmica' 'u' Y." + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "G y – G y", + "y": "G y–y" + }, + "GyM": { + "G": "GGGGG y-MM – GGGGG y-MM", + "M": "GGGGG y-MM – y-MM", + "y": "GGGGG y-MM – y-MM" + }, + "GyMd": { + "d": "GGGGG y-MM-dd – y-MM-dd", + "G": "GGGGG y-MM-dd – GGGGG y-MM-dd", + "M": "GGGGG y-MM-dd – y-MM-dd", + "y": "GGGGG y-MM-dd – y-MM-dd" + }, + "GyMEd": { + "d": "GGGGG y-MM-dd, E – y-MM-dd, E", + "G": "GGGGG y-MM-dd, E – GGGGG y-MM-dd, E", + "M": "GGGGG y-MM-dd, E – y-MM-dd, E", + "y": "GGGGG y-MM-dd, E – y-MM-dd, E" + }, + "GyMMM": { + "G": "G y MMM – G y MMM", + "M": "G y MMM–MMM", + "y": "G y MMM – y MMM" + }, + "GyMMMd": { + "d": "G y MMM d–d", + "G": "G y MMM d – G y MMM d", + "M": "G y MMM d – MMM d", + "y": "G y MMM d – y MMM d" + }, + "GyMMMEd": { + "d": "G y MMM d, E – MMM d, E", + "G": "G y MMM d, E – G y MMM d, E", + "M": "G y MMM d, E – MMM d, E", + "y": "G y MMM d, E – y MMM d, E" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d.M – d.M", + "M": "d.M – d.M" + }, + "MEd": { + "d": "E, d.M – E, d.M", + "M": "E, d.M – E, d.M" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "dd.–dd. MMM", + "M": "dd. MMM – dd. MMM" + }, + "MMMEd": { + "d": "E, dd. – E, dd. MMM", + "M": "E, dd. MMM – E, dd. MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M – M, y", + "y": "M.y. – M.y." + }, + "yMd": { + "d": "d.M.y. – d.M.y.", + "M": "d.M.y. – d.M.y.", + "y": "d.M.y. – d.M.y." + }, + "yMEd": { + "d": "E, d.M.y. – E, d.M.y.", + "M": "E, d.M.y. – E, d.M.y.", + "y": "E, d.M.y. – E, d.M.y." + }, + "yMMM": { + "M": "MMM–MMM y.", + "y": "MMM y. – MMM y." + }, + "yMMMd": { + "d": "dd.–dd. MMM y.", + "M": "dd. MMM – dd. MMM y.", + "y": "dd. MMM y. – dd. MMM y." + }, + "yMMMEd": { + "d": "E, dd. – E, dd. MMM y.", + "M": "E, dd. MMM – E, dd. MMM y.", + "y": "E, dd. MMM y. – E, dd. MMM y." + }, + "yMMMM": { + "M": "MMMM – MMMM y.", + "y": "MMMM y. – MMMM y." + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/sr/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/sr/ca-gregorian.json new file mode 100644 index 00000000000..03388f1e8d0 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/sr/ca-gregorian.json @@ -0,0 +1,544 @@ +{ + "main": { + "sr": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "sr" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "јан", + "2": "феб", + "3": "мар", + "4": "апр", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "авг", + "9": "сеп", + "10": "окт", + "11": "нов", + "12": "дец" + }, + "narrow": { + "1": "ј", + "2": "ф", + "3": "м", + "4": "а", + "5": "м", + "6": "ј", + "7": "ј", + "8": "а", + "9": "с", + "10": "о", + "11": "н", + "12": "д" + }, + "wide": { + "1": "јануар", + "2": "фебруар", + "3": "март", + "4": "април", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "август", + "9": "септембар", + "10": "октобар", + "11": "новембар", + "12": "децембар" + } + }, + "stand-alone": { + "abbreviated": { + "1": "јан", + "2": "феб", + "3": "мар", + "4": "апр", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "авг", + "9": "сеп", + "10": "окт", + "11": "нов", + "12": "дец" + }, + "narrow": { + "1": "ј", + "2": "ф", + "3": "м", + "4": "а", + "5": "м", + "6": "ј", + "7": "ј", + "8": "а", + "9": "с", + "10": "о", + "11": "н", + "12": "д" + }, + "wide": { + "1": "јануар", + "2": "фебруар", + "3": "март", + "4": "април", + "5": "мај", + "6": "јун", + "7": "јул", + "8": "август", + "9": "септембар", + "10": "октобар", + "11": "новембар", + "12": "децембар" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "нед", + "mon": "пон", + "tue": "уто", + "wed": "сре", + "thu": "чет", + "fri": "пет", + "sat": "суб" + }, + "narrow": { + "sun": "н", + "mon": "п", + "tue": "у", + "wed": "с", + "thu": "ч", + "fri": "п", + "sat": "с" + }, + "short": { + "sun": "не", + "mon": "по", + "tue": "ут", + "wed": "ср", + "thu": "че", + "fri": "пе", + "sat": "су" + }, + "wide": { + "sun": "недеља", + "mon": "понедељак", + "tue": "уторак", + "wed": "среда", + "thu": "четвртак", + "fri": "петак", + "sat": "субота" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "нед", + "mon": "пон", + "tue": "уто", + "wed": "сре", + "thu": "чет", + "fri": "пет", + "sat": "суб" + }, + "narrow": { + "sun": "н", + "mon": "п", + "tue": "у", + "wed": "с", + "thu": "ч", + "fri": "п", + "sat": "с" + }, + "short": { + "sun": "не", + "mon": "по", + "tue": "ут", + "wed": "ср", + "thu": "че", + "fri": "пе", + "sat": "су" + }, + "wide": { + "sun": "недеља", + "mon": "понедељак", + "tue": "уторак", + "wed": "среда", + "thu": "четвртак", + "fri": "петак", + "sat": "субота" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "К1", + "2": "К2", + "3": "К3", + "4": "К4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "први квартал", + "2": "други квартал", + "3": "трећи квартал", + "4": "четврти квартал" + } + }, + "stand-alone": { + "abbreviated": { + "1": "К1", + "2": "К2", + "3": "К3", + "4": "К4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "први квартал", + "2": "други квартал", + "3": "трећи квартал", + "4": "четврти квартал" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "ујутро", + "afternoon1": "по подне", + "evening1": "увече", + "night1": "ноћу" + }, + "narrow": { + "midnight": "поноћ", + "am": "a", + "noon": "подне", + "pm": "p", + "morning1": "ујутру", + "afternoon1": "по подне", + "evening1": "увече", + "night1": "ноћу" + }, + "wide": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "ујутро", + "afternoon1": "по подне", + "evening1": "увече", + "night1": "ноћу" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "јутро", + "afternoon1": "поподне", + "evening1": "вече", + "night1": "ноћ" + }, + "narrow": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "јутро", + "afternoon1": "поподне", + "evening1": "вече", + "night1": "ноћ" + }, + "wide": { + "midnight": "поноћ", + "am": "пре подне", + "noon": "подне", + "pm": "по подне", + "morning1": "јутро", + "afternoon1": "поподне", + "evening1": "вече", + "night1": "ноћ" + } + } + }, + "eras": { + "eraNames": { + "0": "пре нове ере", + "0-alt-variant": "пре наше ере", + "1": "нове ере", + "1-alt-variant": "наше ере" + }, + "eraAbbr": { + "0": "п. н. е.", + "0-alt-variant": "п. н. е.", + "1": "н. е.", + "1-alt-variant": "н. е." + }, + "eraNarrow": { + "0": "п.н.е.", + "0-alt-variant": "п. н. е.", + "1": "н.е.", + "1-alt-variant": "н. е." + } + }, + "dateFormats": { + "full": "EEEE, dd. MMMM y.", + "long": "dd. MMMM y.", + "medium": "dd.MM.y.", + "short": "d.M.yy." + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "hh:mm B", + "Bhms": "hh:mm:ss B", + "d": "d", + "E": "E", + "EBhm": "E hh:mm B", + "EBhms": "E hh:mm:ss B", + "Ed": "E d.", + "Ehm": "E h:mm a", + "EHm": "E HH:mm", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "y. G", + "GyMMM": "MMM y. G", + "GyMMMd": "d. MMM y. G", + "GyMMMEd": "E, d. MMM y. G", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d.M.", + "MEd": "E, d.M.", + "MMdd": "dd.MM.", + "MMM": "LLL", + "MMMd": "d. MMM", + "MMMdd": "dd.MMM", + "MMMEd": "E d. MMM", + "MMMMd": "d. MMMM", + "MMMMEd": "E, d. MMMM", + "MMMMW-count-one": "W. 'седмица' 'у' MMMM.", + "MMMMW-count-few": "W. 'седмица' 'у' MMMM.", + "MMMMW-count-other": "W. 'седмица' 'у' MMMM.", + "ms": "mm:ss", + "y": "y.", + "yM": "M.y.", + "yMd": "d.M.y.", + "yMEd": "E, d.M.y.", + "yMM": "MM.y.", + "yMMdd": "dd.MM.y.", + "yMMM": "MMM y.", + "yMMMd": "d. MMM y.", + "yMMMEd": "E, d. MMM y.", + "yMMMM": "MMMM y.", + "yQQQ": "QQQ y.", + "yQQQQ": "QQQQ y.", + "yw-count-one": "w. 'седмица' 'у' Y.", + "yw-count-few": "w. 'седмица' 'у' Y.", + "yw-count-other": "w. 'седмица' 'у' Y." + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h–h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm–h:mm B", + "m": "h:mm–h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "G y – G y", + "y": "G y–y" + }, + "GyM": { + "G": "GGGGG y-MM – GGGGG y-MM", + "M": "GGGGG y-MM – y-MM", + "y": "GGGGG y-MM – y-MM" + }, + "GyMd": { + "d": "GGGGG y-MM-dd – y-MM-dd", + "G": "GGGGG y-MM-dd – GGGGG y-MM-dd", + "M": "GGGGG y-MM-dd – y-MM-dd", + "y": "GGGGG y-MM-dd – y-MM-dd" + }, + "GyMEd": { + "d": "GGGGG y-MM-dd, E – y-MM-dd, E", + "G": "GGGGG y-MM-dd, E – GGGGG y-MM-dd, E", + "M": "GGGGG y-MM-dd, E – y-MM-dd, E", + "y": "GGGGG y-MM-dd, E – y-MM-dd, E" + }, + "GyMMM": { + "G": "G y MMM – G y MMM", + "M": "G y MMM–MMM", + "y": "G y MMM – y MMM" + }, + "GyMMMd": { + "d": "G y MMM d–d", + "G": "G y MMM d – G y MMM d", + "M": "G y MMM d – MMM d", + "y": "G y MMM d – y MMM d" + }, + "GyMMMEd": { + "d": "G y MMM d, E – MMM d, E", + "G": "G y MMM d, E – G y MMM d, E", + "M": "G y MMM d, E – MMM d, E", + "y": "G y MMM d, E – y MMM d, E" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d.M – d.M", + "M": "d.M – d.M" + }, + "MEd": { + "d": "E, d.M – E, d.M", + "M": "E, d.M – E, d.M" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "dd.–dd. MMM", + "M": "dd. MMM – dd. MMM" + }, + "MMMEd": { + "d": "E, dd. – E, dd. MMM", + "M": "E, dd. MMM – E, dd. MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M – M, y", + "y": "M.y. – M.y." + }, + "yMd": { + "d": "d.M.y. – d.M.y.", + "M": "d.M.y. – d.M.y.", + "y": "d.M.y. – d.M.y." + }, + "yMEd": { + "d": "E, d.M.y. – E, d.M.y.", + "M": "E, d.M.y. – E, d.M.y.", + "y": "E, d.M.y. – E, d.M.y." + }, + "yMMM": { + "M": "MMM–MMM y.", + "y": "MMM y. – MMM y." + }, + "yMMMd": { + "d": "dd.–dd. MMM y.", + "M": "dd. MMM – dd. MMM y.", + "y": "dd. MMM y. – dd. MMM y." + }, + "yMMMEd": { + "d": "E, dd. – E, dd. MMM y.", + "M": "E, dd. MMM – E, dd. MMM y.", + "y": "E, dd. MMM y. – E, dd. MMM y." + }, + "yMMMM": { + "M": "MMMM – MMMM y.", + "y": "MMMM y. – MMMM y." + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/th/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/th/ca-gregorian.json new file mode 100644 index 00000000000..0ce2094a0fe --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/th/ca-gregorian.json @@ -0,0 +1,580 @@ +{ + "main": { + "th": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "th" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "ม.ค.", + "2": "ก.พ.", + "3": "มี.ค.", + "4": "เม.ย.", + "5": "พ.ค.", + "6": "มิ.ย.", + "7": "ก.ค.", + "8": "ส.ค.", + "9": "ก.ย.", + "10": "ต.ค.", + "11": "พ.ย.", + "12": "ธ.ค." + }, + "narrow": { + "1": "ม.ค.", + "2": "ก.พ.", + "3": "มี.ค.", + "4": "เม.ย.", + "5": "พ.ค.", + "6": "มิ.ย.", + "7": "ก.ค.", + "8": "ส.ค.", + "9": "ก.ย.", + "10": "ต.ค.", + "11": "พ.ย.", + "12": "ธ.ค." + }, + "wide": { + "1": "มกราคม", + "2": "กุมภาพันธ์", + "3": "มีนาคม", + "4": "เมษายน", + "5": "พฤษภาคม", + "6": "มิถุนายน", + "7": "กรกฎาคม", + "8": "สิงหาคม", + "9": "กันยายน", + "10": "ตุลาคม", + "11": "พฤศจิกายน", + "12": "ธันวาคม" + } + }, + "stand-alone": { + "abbreviated": { + "1": "ม.ค.", + "2": "ก.พ.", + "3": "มี.ค.", + "4": "เม.ย.", + "5": "พ.ค.", + "6": "มิ.ย.", + "7": "ก.ค.", + "8": "ส.ค.", + "9": "ก.ย.", + "10": "ต.ค.", + "11": "พ.ย.", + "12": "ธ.ค." + }, + "narrow": { + "1": "ม.ค.", + "2": "ก.พ.", + "3": "มี.ค.", + "4": "เม.ย.", + "5": "พ.ค.", + "6": "มิ.ย.", + "7": "ก.ค.", + "8": "ส.ค.", + "9": "ก.ย.", + "10": "ต.ค.", + "11": "พ.ย.", + "12": "ธ.ค." + }, + "wide": { + "1": "มกราคม", + "2": "กุมภาพันธ์", + "3": "มีนาคม", + "4": "เมษายน", + "5": "พฤษภาคม", + "6": "มิถุนายน", + "7": "กรกฎาคม", + "8": "สิงหาคม", + "9": "กันยายน", + "10": "ตุลาคม", + "11": "พฤศจิกายน", + "12": "ธันวาคม" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "อา.", + "mon": "จ.", + "tue": "อ.", + "wed": "พ.", + "thu": "พฤ.", + "fri": "ศ.", + "sat": "ส." + }, + "narrow": { + "sun": "อา", + "mon": "จ", + "tue": "อ", + "wed": "พ", + "thu": "พฤ", + "fri": "ศ", + "sat": "ส" + }, + "short": { + "sun": "อา.", + "mon": "จ.", + "tue": "อ.", + "wed": "พ.", + "thu": "พฤ.", + "fri": "ศ.", + "sat": "ส." + }, + "wide": { + "sun": "วันอาทิตย์", + "mon": "วันจันทร์", + "tue": "วันอังคาร", + "wed": "วันพุธ", + "thu": "วันพฤหัสบดี", + "fri": "วันศุกร์", + "sat": "วันเสาร์" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "อา.", + "mon": "จ.", + "tue": "อ.", + "wed": "พ.", + "thu": "พฤ.", + "fri": "ศ.", + "sat": "ส." + }, + "narrow": { + "sun": "อา", + "mon": "จ", + "tue": "อ", + "wed": "พ", + "thu": "พฤ", + "fri": "ศ", + "sat": "ส" + }, + "short": { + "sun": "อา.", + "mon": "จ.", + "tue": "อ.", + "wed": "พ.", + "thu": "พฤ.", + "fri": "ศ.", + "sat": "ส." + }, + "wide": { + "sun": "วันอาทิตย์", + "mon": "วันจันทร์", + "tue": "วันอังคาร", + "wed": "วันพุธ", + "thu": "วันพฤหัสบดี", + "fri": "วันศุกร์", + "sat": "วันเสาร์" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "ไตรมาส 1", + "2": "ไตรมาส 2", + "3": "ไตรมาส 3", + "4": "ไตรมาส 4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "ไตรมาส 1", + "2": "ไตรมาส 2", + "3": "ไตรมาส 3", + "4": "ไตรมาส 4" + } + }, + "stand-alone": { + "abbreviated": { + "1": "ไตรมาส 1", + "2": "ไตรมาส 2", + "3": "ไตรมาส 3", + "4": "ไตรมาส 4" + }, + "narrow": { + "1": "1", + "2": "2", + "3": "3", + "4": "4" + }, + "wide": { + "1": "ไตรมาส 1", + "2": "ไตรมาส 2", + "3": "ไตรมาส 3", + "4": "ไตรมาส 4" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "เที่ยงคืน", + "am": "ก่อนเที่ยง", + "noon": "เที่ยง", + "pm": "หลังเที่ยง", + "morning1": "ในตอนเช้า", + "afternoon1": "ในตอนบ่าย", + "afternoon2": "บ่าย", + "evening1": "ในตอนเย็น", + "evening2": "ค่ำ", + "night1": "กลางคืน" + }, + "narrow": { + "midnight": "เที่ยงคืน", + "am": "a", + "noon": "เที่ยง", + "pm": "p", + "morning1": "เช้า", + "afternoon1": "เที่ยง", + "afternoon2": "บ่าย", + "evening1": "เย็น", + "evening2": "ค่ำ", + "night1": "กลางคืน" + }, + "wide": { + "midnight": "เที่ยงคืน", + "am": "ก่อนเที่ยง", + "noon": "เที่ยง", + "pm": "หลังเที่ยง", + "morning1": "ในตอนเช้า", + "afternoon1": "ในตอนบ่าย", + "afternoon2": "บ่าย", + "evening1": "ในตอนเย็น", + "evening2": "ค่ำ", + "night1": "กลางคืน" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "เที่ยงคืน", + "am": "ก่อนเที่ยง", + "noon": "เที่ยง", + "pm": "หลังเที่ยง", + "morning1": "ในตอนเช้า", + "afternoon1": "ในตอนบ่าย", + "afternoon2": "บ่าย", + "evening1": "ในตอนเย็น", + "evening2": "ค่ำ", + "night1": "กลางคืน" + }, + "narrow": { + "midnight": "เที่ยงคืน", + "am": "ก่อนเที่ยง", + "noon": "เที่ยง", + "pm": "หลังเที่ยง", + "morning1": "เช้า", + "afternoon1": "ช่วงเที่ยง", + "afternoon2": "บ่าย", + "evening1": "เย็น", + "evening2": "ค่ำ", + "night1": "กลางคืน" + }, + "wide": { + "midnight": "เที่ยงคืน", + "am": "ก่อนเที่ยง", + "noon": "เที่ยง", + "pm": "หลังเที่ยง", + "morning1": "ในตอนเช้า", + "afternoon1": "ในตอนบ่าย", + "afternoon2": "บ่าย", + "evening1": "ในตอนเย็น", + "evening2": "ค่ำ", + "night1": "กลางคืน" + } + } + }, + "eras": { + "eraNames": { + "0": "ปีก่อนคริสตกาล", + "0-alt-variant": "ก่อนสามัญศักราช", + "1": "คริสต์ศักราช", + "1-alt-variant": "สามัญศักราช" + }, + "eraAbbr": { + "0": "ก่อน ค.ศ.", + "0-alt-variant": "ก่อน ส.ศ.", + "1": "ค.ศ.", + "1-alt-variant": "ส.ศ." + }, + "eraNarrow": { + "0": "ก่อน ค.ศ.", + "0-alt-variant": "ก.ส.ศ.", + "1": "ค.ศ.", + "1-alt-variant": "ส.ศ." + } + }, + "dateFormats": { + "full": "EEEEที่ d MMMM G y", + "long": "d MMMM G y", + "medium": "d MMM y", + "short": "d/M/yy" + }, + "timeFormats": { + "full": "H นาฬิกา mm นาที ss วินาที zzzz", + "long": "H นาฬิกา mm นาที ss วินาที z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "h B", + "Bhm": "h:mm B", + "Bhms": "h:mm:ss B", + "d": "d", + "E": "ccc", + "EBhm": "E h:mm B", + "EBhms": "E h:mm:ss B", + "Ed": "E d", + "Ehm": "E h:mm a", + "EHm": "E HH:mm น.", + "Ehms": "E h:mm:ss a", + "EHms": "E HH:mm:ss", + "Gy": "G y", + "GyMMM": "MMM G y", + "GyMMMd": "d MMM G y", + "GyMMMEd": "E d MMM G y", + "GyMMMEEEEd": "EEEEที่ d MMM G y", + "h": "h a", + "H": "HH", + "hm": "h:mm a", + "Hm": "HH:mm น.", + "hms": "h:mm:ss a", + "Hms": "HH:mm:ss", + "hmsv": "h:mm:ss a v", + "Hmsv": "HH:mm:ss v", + "hmv": "h:mm น. a v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d/M", + "MEd": "E d/M", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "E d MMM", + "MMMEEEEd": "EEEEที่ d MMM", + "MMMMd": "d MMMM", + "MMMMEd": "E d MMMM", + "MMMMEEEEd": "EEEEที่ d MMMM", + "MMMMW-count-other": "สัปดาห์ที่ W ของเดือนMMMM", + "mmss": "mm:ss", + "ms": "mm:ss", + "y": "y", + "yM": "M/y", + "yMd": "d/M/y", + "yMEd": "E d/M/y", + "yMMM": "MMM y", + "yMMMd": "d MMM y", + "yMMMEd": "E d MMM y", + "yMMMEEEEd": "EEEEที่ d MMM y", + "yMMMM": "MMMM G y", + "yMMMMd": "d MMMM G y", + "yMMMMEd": "E d MMMM G y", + "yMMMMEEEEd": "EEEEที่ d MMMM G y", + "yQQQ": "QQQ y", + "yQQQQ": "QQQQ G y", + "yw-count-other": "สัปดาห์ที่ w ของปี Y" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "h B – h B", + "h": "h – h B" + }, + "Bhm": { + "B": "h:mm B – h:mm B", + "h": "h:mm – h:mm B", + "m": "h:mm – h:mm B" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "G y – G y", + "y": "G y–y" + }, + "GyM": { + "G": "MM/GGGGG y – MM/GGGGG y", + "M": "MM/GGGGG y – MM/GGGGG y", + "y": "MM/GGGGG y – MM/GGGGG y" + }, + "GyMd": { + "d": "d/MM/GGGGG y – d/MM/GGGGG y", + "G": "d/MM/GGGGG y – d/MM/GGGGG y", + "M": "d/MM/GGGGG y – d/MM/GGGGG y", + "y": "d/MM/GGGGG y – d/MM/GGGGG y" + }, + "GyMEd": { + "d": "E d/MM/GGGGG y – E d/MM/GGGGG y", + "G": "E d/MM/GGGGG y – E d/MM/GGGGG y", + "M": "E d/MM/GGGGG y – E d/MM/GGGGG y", + "y": "E d/MM/GGGGG y – E d/MM/GGGGG y" + }, + "GyMMM": { + "G": "MMM G y – MMM G y", + "M": "MMM – MMM G y", + "y": "MMM G y – MMM G y" + }, + "GyMMMd": { + "d": "d – d MMM G y", + "G": "d MMM G y – d MMM G y", + "M": "d MMM – d MMM G y", + "y": "d MMM G y – d MMM y" + }, + "GyMMMEd": { + "d": "E d MMM – E d MMM G y", + "G": "E d MMM G y – E d MMM G y", + "M": "E d MMM – E d MMM G y", + "y": "E d MMM y – E d MMM y" + }, + "h": { + "a": "h a – h a", + "h": "h–h a" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "h:mm a – h:mm a", + "h": "h:mm–h:mm a", + "m": "h:mm–h:mm a" + }, + "Hm": { + "H": "HH:mm น. – HH:mm น.", + "m": "HH:mm น. – HH:mm น." + }, + "hmv": { + "a": "h:mm a – h:mm a v", + "h": "h:mm–h:mm a v", + "m": "h:mm–h:mm a v" + }, + "Hmv": { + "H": "H:mm น. – H:mm น. v", + "m": "H:mm น. – H:mm น. v" + }, + "hv": { + "a": "h a – h a v", + "h": "h–h a v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M–M" + }, + "Md": { + "d": "d/M – d/M", + "M": "d/M – d/M" + }, + "MEd": { + "d": "E d/M – E d/M/", + "M": "E d/M – E d/M" + }, + "MMM": { + "M": "MMM – MMM" + }, + "MMMd": { + "d": "MMM d–d", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "E d – E d MMM", + "M": "E d MMM – E d MMM" + }, + "MMMEEEEd": { + "d": "EEEEที่ d – EEEEที่ d MMM", + "M": "EEEEที่ d MMM – EEEEที่ d MMM" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "M/y – M/y", + "y": "M/y – M/y" + }, + "yMd": { + "d": "d/M/y – d/M/y", + "M": "d/M/y – d/M/y", + "y": "d/M/y – d/M/y" + }, + "yMEd": { + "d": "E d/M/y – E d/M/y", + "M": "E d/M/y – E d/M/y", + "y": "E d/M/y – E d/M/y" + }, + "yMMM": { + "M": "MMM–MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "d–d MMM y", + "M": "d MMM – d MMM y", + "y": "d MMM y – d MMM y" + }, + "yMMMEd": { + "d": "E d MMM – E d MMM y", + "M": "E d MMM – E d MMM y", + "y": "E d MMM y – E d MMM y" + }, + "yMMMEEEEd": { + "d": "EEEEที่ d – EEEEที่ d MMM y", + "M": "EEEEที่ d MMM – EEEEที่ d MMM y", + "y": "EEEEที่ d MMM y – EEEEที่ d MMM y" + }, + "yMMMM": { + "M": "MMMM – MMMM y", + "y": "MMMM y – MMMM y" + }, + "yMMMMd": { + "d": "d–d MMMM G y", + "M": "d MMMM – d MMMM G y", + "y": "d MMMM G y – d MMMM y" + }, + "yMMMMEd": { + "d": "E d – E d MMMM G y", + "M": "E d MMMM – E d MMMM G y", + "y": "E d MMMM G y – E d MMMM y" + }, + "yMMMMEEEEd": { + "d": "EEEEที่ d – EEEEที่ d MMMM G y", + "M": "EEEEที่ d MMMM – EEEEที่ d MMMM G y", + "y": "EEEEที่ d MMMM G y – EEEEที่ d MMMM y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-dates-full/main/tr/ca-gregorian.json b/resources/testdata/data/cldr/cldr-dates-full/main/tr/ca-gregorian.json new file mode 100644 index 00000000000..679b81cb145 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-dates-full/main/tr/ca-gregorian.json @@ -0,0 +1,552 @@ +{ + "main": { + "tr": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "tr" + }, + "dates": { + "calendars": { + "gregorian": { + "months": { + "format": { + "abbreviated": { + "1": "Oca", + "2": "Şub", + "3": "Mar", + "4": "Nis", + "5": "May", + "6": "Haz", + "7": "Tem", + "8": "Ağu", + "9": "Eyl", + "10": "Eki", + "11": "Kas", + "12": "Ara" + }, + "narrow": { + "1": "O", + "2": "Ş", + "3": "M", + "4": "N", + "5": "M", + "6": "H", + "7": "T", + "8": "A", + "9": "E", + "10": "E", + "11": "K", + "12": "A" + }, + "wide": { + "1": "Ocak", + "2": "Şubat", + "3": "Mart", + "4": "Nisan", + "5": "Mayıs", + "6": "Haziran", + "7": "Temmuz", + "8": "Ağustos", + "9": "Eylül", + "10": "Ekim", + "11": "Kasım", + "12": "Aralık" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Oca", + "2": "Şub", + "3": "Mar", + "4": "Nis", + "5": "May", + "6": "Haz", + "7": "Tem", + "8": "Ağu", + "9": "Eyl", + "10": "Eki", + "11": "Kas", + "12": "Ara" + }, + "narrow": { + "1": "O", + "2": "Ş", + "3": "M", + "4": "N", + "5": "M", + "6": "H", + "7": "T", + "8": "A", + "9": "E", + "10": "E", + "11": "K", + "12": "A" + }, + "wide": { + "1": "Ocak", + "2": "Şubat", + "3": "Mart", + "4": "Nisan", + "5": "Mayıs", + "6": "Haziran", + "7": "Temmuz", + "8": "Ağustos", + "9": "Eylül", + "10": "Ekim", + "11": "Kasım", + "12": "Aralık" + } + } + }, + "days": { + "format": { + "abbreviated": { + "sun": "Paz", + "mon": "Pzt", + "tue": "Sal", + "wed": "Çar", + "thu": "Per", + "fri": "Cum", + "sat": "Cmt" + }, + "narrow": { + "sun": "P", + "mon": "P", + "tue": "S", + "wed": "Ç", + "thu": "P", + "fri": "C", + "sat": "C" + }, + "short": { + "sun": "Pa", + "mon": "Pt", + "tue": "Sa", + "wed": "Ça", + "thu": "Pe", + "fri": "Cu", + "sat": "Ct" + }, + "wide": { + "sun": "Pazar", + "mon": "Pazartesi", + "tue": "Salı", + "wed": "Çarşamba", + "thu": "Perşembe", + "fri": "Cuma", + "sat": "Cumartesi" + } + }, + "stand-alone": { + "abbreviated": { + "sun": "Paz", + "mon": "Pzt", + "tue": "Sal", + "wed": "Çar", + "thu": "Per", + "fri": "Cum", + "sat": "Cmt" + }, + "narrow": { + "sun": "P", + "mon": "P", + "tue": "S", + "wed": "Ç", + "thu": "P", + "fri": "C", + "sat": "C" + }, + "short": { + "sun": "Pa", + "mon": "Pt", + "tue": "Sa", + "wed": "Ça", + "thu": "Pe", + "fri": "Cu", + "sat": "Ct" + }, + "wide": { + "sun": "Pazar", + "mon": "Pazartesi", + "tue": "Salı", + "wed": "Çarşamba", + "thu": "Perşembe", + "fri": "Cuma", + "sat": "Cumartesi" + } + } + }, + "quarters": { + "format": { + "abbreviated": { + "1": "Ç1", + "2": "Ç2", + "3": "Ç3", + "4": "Ç4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "1. çeyrek", + "2": "2. çeyrek", + "3": "3. çeyrek", + "4": "4. çeyrek" + } + }, + "stand-alone": { + "abbreviated": { + "1": "Ç1", + "2": "Ç2", + "3": "Ç3", + "4": "Ç4" + }, + "narrow": { + "1": "1.", + "2": "2.", + "3": "3.", + "4": "4." + }, + "wide": { + "1": "1. çeyrek", + "2": "2. çeyrek", + "3": "3. çeyrek", + "4": "4. çeyrek" + } + } + }, + "dayPeriods": { + "format": { + "abbreviated": { + "midnight": "gece yarısı", + "am": "ÖÖ", + "noon": "öğle", + "pm": "ÖS", + "morning1": "sabah", + "morning2": "öğleden önce", + "afternoon1": "öğleden sonra", + "afternoon2": "akşamüstü", + "evening1": "akşam", + "night1": "gece" + }, + "narrow": { + "midnight": "gece", + "am": "öö", + "noon": "ö", + "pm": "ös", + "morning1": "sabah", + "morning2": "öğleden önce", + "afternoon1": "öğleden sonra", + "afternoon2": "akşamüstü", + "evening1": "akşam", + "night1": "gece" + }, + "wide": { + "midnight": "gece yarısı", + "am": "ÖÖ", + "noon": "öğle", + "pm": "ÖS", + "morning1": "sabah", + "morning2": "öğleden önce", + "afternoon1": "öğleden sonra", + "afternoon2": "akşamüstü", + "evening1": "akşam", + "night1": "gece" + } + }, + "stand-alone": { + "abbreviated": { + "midnight": "gece yarısı", + "am": "ÖÖ", + "noon": "öğle", + "pm": "ÖS", + "morning1": "sabah", + "morning2": "öğleden önce", + "afternoon1": "öğleden sonra", + "afternoon2": "akşamüstü", + "evening1": "akşam", + "night1": "gece" + }, + "narrow": { + "midnight": "gece yarısı", + "am": "ÖÖ", + "noon": "öğle", + "pm": "ÖS", + "morning1": "sabah", + "morning2": "öğleden önce", + "afternoon1": "öğleden sonra", + "afternoon2": "akşamüstü", + "evening1": "akşam", + "night1": "gece" + }, + "wide": { + "midnight": "gece yarısı", + "am": "ÖÖ", + "noon": "öğle", + "pm": "ÖS", + "morning1": "sabah", + "morning2": "öğleden önce", + "afternoon1": "öğleden sonra", + "afternoon2": "akşamüstü", + "evening1": "akşam", + "night1": "gece" + } + } + }, + "eras": { + "eraNames": { + "0": "Milattan Önce", + "0-alt-variant": "İsa’dan Önce", + "1": "Milattan Sonra", + "1-alt-variant": "İsa’dan Sonra" + }, + "eraAbbr": { + "0": "MÖ", + "0-alt-variant": "İÖ", + "1": "MS", + "1-alt-variant": "İS" + }, + "eraNarrow": { + "0": "MÖ", + "0-alt-variant": "İÖ", + "1": "MS", + "1-alt-variant": "İS" + } + }, + "dateFormats": { + "full": "d MMMM y EEEE", + "long": "d MMMM y", + "medium": "d MMM y", + "short": "d.MM.y" + }, + "timeFormats": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "dateTimeFormats": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}", + "availableFormats": { + "Bh": "B h", + "Bhm": "B h:mm", + "Bhms": "B h:mm:ss", + "d": "d", + "E": "ccc", + "EBhm": "E B h:mm", + "EBhms": "E B h:mm:ss", + "Ed": "d E", + "Ehm": "E a h:mm", + "EHm": "E HH:mm", + "Ehms": "E a h:mm:ss", + "EHms": "E HH:mm:ss", + "Gy": "G y", + "GyMMM": "G MMM y", + "GyMMMd": "G d MMM y", + "GyMMMEd": "G d MMM y E", + "h": "a h", + "H": "HH", + "hm": "a h:mm", + "Hm": "HH:mm", + "hms": "a h:mm:ss", + "Hms": "HH:mm:ss", + "hmsv": "a h:mm:ss v", + "Hmsv": "HH:mm:ss v", + "hmv": "a h:mm v", + "Hmv": "HH:mm v", + "M": "L", + "Md": "d/M", + "MEd": "d/MM E", + "MMM": "LLL", + "MMMd": "d MMM", + "MMMEd": "d MMMM E", + "MMMMd": "d MMMM", + "MMMMEd": "d MMMM E", + "MMMMW-count-one": "MMMM 'ayının' W. 'haftası'", + "MMMMW-count-other": "MMMM 'ayının' W. 'haftası'", + "mmss": "mm:ss", + "ms": "mm:ss", + "y": "y", + "yM": "MM/y", + "yMd": "dd.MM.y", + "yMEd": "d.M.y E", + "yMM": "MM.y", + "yMMM": "MMM y", + "yMMMd": "d MMM y", + "yMMMEd": "d MMM y E", + "yMMMM": "MMMM y", + "yQQQ": "y QQQ", + "yQQQQ": "y QQQQ", + "yw-count-one": "Y 'yılının' w. 'haftası'", + "yw-count-other": "Y 'yılının' w. 'haftası'" + }, + "appendItems": { + "Day": "{0} ({2}: {1})", + "Day-Of-Week": "{0} {1}", + "Era": "{1} {0}", + "Hour": "{0} ({2}: {1})", + "Minute": "{0} ({2}: {1})", + "Month": "{0} ({2}: {1})", + "Quarter": "{0} ({2}: {1})", + "Second": "{0} ({2}: {1})", + "Timezone": "{0} {1}", + "Week": "{0} ({2}: {1})", + "Year": "{1} {0}" + }, + "intervalFormats": { + "intervalFormatFallback": "{0} – {1}", + "Bh": { + "B": "B h – B h", + "h": "B h–h" + }, + "Bhm": { + "B": "B h:mm – B h:mm", + "h": "B h:mm–h:mm", + "m": "B h:mm–h:mm" + }, + "d": { + "d": "d–d" + }, + "Gy": { + "G": "G y – G y", + "y": "G y–y" + }, + "GyM": { + "G": "GGGGG MM.y – GGGGG MM.y", + "M": "GGGGG MM.y – MM.y", + "y": "GGGGG MM.y – MM.y" + }, + "GyMd": { + "d": "GGGGG dd.MM.y – dd.MM.y", + "G": "GGGGG dd.MM.y – GGGGG dd.MM.y", + "M": "GGGGG dd.MM.y – dd.MM.y", + "y": "GGGGG dd.MM.y – dd.MM.y" + }, + "GyMEd": { + "d": "GGGGG dd.MM.y E – dd.MM.y E", + "G": "GGGGG dd.MM.y E – GGGGG dd.MM.y E", + "M": "GGGGG dd.MM.y E – dd.MM.y E", + "y": "GGGGG dd.MM.y E – dd.MM.y E" + }, + "GyMMM": { + "G": "G MMM y – G MMM y", + "M": "G MMM–MMM y", + "y": "G MMM y – MMM y" + }, + "GyMMMd": { + "d": "G d–d MMM y", + "G": "G d MMM y – G d MMM y", + "M": "G d MMM – d MMM y", + "y": "G d MMM y – d MMM y" + }, + "GyMMMEd": { + "d": "G d MMM E – d MMM E y", + "G": "G d MMM y E – G d MMM y E", + "M": "G d MMM E – d MMM E y", + "y": "G d MMM y E – d MMM y E" + }, + "h": { + "a": "a h – a h", + "h": "a h–h" + }, + "H": { + "H": "HH–HH" + }, + "hm": { + "a": "a h:mm – a h:mm", + "h": "a h:mm–h:mm", + "m": "a h:mm–h:mm" + }, + "Hm": { + "H": "HH:mm–HH:mm", + "m": "HH:mm–HH:mm" + }, + "hmv": { + "a": "a h:mm – a h:mm v", + "h": "a h:mm–h:mm v", + "m": "a h:mm–h:mm v" + }, + "Hmv": { + "H": "HH:mm–HH:mm v", + "m": "HH:mm–HH:mm v" + }, + "hv": { + "a": "a h – a h v", + "h": "a h–h v" + }, + "Hv": { + "H": "HH–HH v" + }, + "M": { + "M": "M – M" + }, + "Md": { + "d": "d.M – d.M", + "M": "d.M – d.M" + }, + "MEd": { + "d": "d.M E – d.M E", + "M": "d.M E – d.M E" + }, + "MMM": { + "M": "MMM–MMM" + }, + "MMMd": { + "d": "d – d MMM", + "M": "d MMM – d MMM" + }, + "MMMEd": { + "d": "d MMM E – d MMM E", + "M": "d MMM E – d MMM E" + }, + "y": { + "y": "y–y" + }, + "yM": { + "M": "MM.y – MM.y", + "y": "MM.y – MM.y" + }, + "yMd": { + "d": "dd.MM.y – dd.MM.y", + "M": "dd.MM.y – dd.MM.y", + "y": "dd.MM.y – dd.MM.y" + }, + "yMEd": { + "d": "dd.MM.y E – dd.MM.y E", + "M": "dd.MM.y E – dd.MM.y E", + "y": "dd.MM.y E – dd.MM.y E" + }, + "yMMM": { + "M": "MMM–MMM y", + "y": "MMM y – MMM y" + }, + "yMMMd": { + "d": "d–d MMM y", + "M": "d MMM – d MMM y", + "y": "d MMM y – d MMM y" + }, + "yMMMEd": { + "d": "d MMM y E – d MMM y E", + "M": "d MMM y E – d MMM y E", + "y": "d MMM y E – d MMM y E" + }, + "yMMMM": { + "M": "MMMM – MMMM y", + "y": "MMMM y – MMMM y" + } + } + } + } + } + } + } + } +} diff --git a/resources/testdata/data/json/dates/gregory@1/en-US-posix.json b/resources/testdata/data/json/dates/gregory@1/en-US-posix.json deleted file mode 100644 index 9f2d6455431..00000000000 --- a/resources/testdata/data/json/dates/gregory@1/en-US-posix.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "symbols": { - "months": { - "format": { - "abbreviated": [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ], - "narrow": [ - "J", - "F", - "M", - "A", - "M", - "J", - "J", - "A", - "S", - "O", - "N", - "D" - ], - "wide": [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" - ] - } - }, - "weekdays": { - "format": { - "abbreviated": [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ], - "narrow": [ - "S", - "M", - "T", - "W", - "T", - "F", - "S" - ], - "short": [ - "Su", - "Mo", - "Tu", - "We", - "Th", - "Fr", - "Sa" - ], - "wide": [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" - ] - } - }, - "day_periods": { - "format": { - "abbreviated": { - "am": "AM", - "pm": "PM", - "noon": "noon", - "midnight": "midnight" - }, - "narrow": { - "am": "a", - "pm": "p", - "noon": "n", - "midnight": "mi" - }, - "wide": { - "am": "AM", - "pm": "PM", - "noon": "noon", - "midnight": "midnight" - } - }, - "stand_alone": { - "narrow": { - "am": "AM", - "pm": "PM", - "noon": "noon", - "midnight": "midnight" - } - } - } - }, - "patterns": { - "date": { - "full": "EEEE, MMMM d, y", - "long": "MMMM d, y", - "medium": "MMM d, y", - "short": "M/d/yy" - }, - "time": { - "full": "h:mm:ss a zzzz", - "long": "h:mm:ss a z", - "medium": "h:mm:ss a", - "short": "h:mm a" - }, - "date_time": { - "full": "{1} 'at' {0}", - "long": "{1} 'at' {0}", - "medium": "{1}, {0}", - "short": "{1}, {0}" - } - } -} diff --git a/resources/testdata/data/json/dates/gregory@1/und.json b/resources/testdata/data/json/dates/gregory@1/und.json deleted file mode 100644 index 00074b72a6b..00000000000 --- a/resources/testdata/data/json/dates/gregory@1/und.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "symbols": { - "months": { - "format": { - "abbreviated": [ - "M01", - "M02", - "M03", - "M04", - "M05", - "M06", - "M07", - "M08", - "M09", - "M10", - "M11", - "M12" - ], - "narrow": [ - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12" - ], - "wide": [ - "M01", - "M02", - "M03", - "M04", - "M05", - "M06", - "M07", - "M08", - "M09", - "M10", - "M11", - "M12" - ] - } - }, - "weekdays": { - "format": { - "abbreviated": [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ], - "narrow": [ - "S", - "M", - "T", - "W", - "T", - "F", - "S" - ], - "short": [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ], - "wide": [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ] - } - }, - "day_periods": { - "format": { - "abbreviated": { - "am": "AM", - "pm": "PM" - }, - "narrow": { - "am": "AM", - "pm": "PM" - }, - "wide": { - "am": "AM", - "pm": "PM" - } - } - } - }, - "patterns": { - "date": { - "full": "y MMMM d, EEEE", - "long": "y MMMM d", - "medium": "y MMM d", - "short": "y-MM-dd" - }, - "time": { - "full": "HH:mm:ss zzzz", - "long": "HH:mm:ss z", - "medium": "HH:mm:ss", - "short": "HH:mm" - }, - "date_time": { - "full": "{1} {0}", - "long": "{1} {0}", - "medium": "{1} {0}", - "short": "{1} {0}" - } - } -} diff --git a/resources/testdata/src/bin/icu4x-gen-testdata.rs b/resources/testdata/src/bin/icu4x-gen-testdata.rs index 4c4a92b14d7..4bbf8fc8792 100644 --- a/resources/testdata/src/bin/icu4x-gen-testdata.rs +++ b/resources/testdata/src/bin/icu4x-gen-testdata.rs @@ -1,35 +1,46 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). -use clap::{App, Arg}; +use clap::{App, Arg, ArgMatches}; use icu_provider::iter::DataExporter; use icu_provider_cldr::download::CldrAllInOneDownloader; use icu_provider_cldr::get_all_resc_keys; -use icu_provider_cldr::CldrJsonDataProvider; +use icu_provider_cldr::{CldrJsonDataProvider, CldrPathsAllInOne}; use icu_provider_fs::export::fs_exporter; use icu_provider_fs::export::serializers; use icu_provider_fs::export::FilesystemExporter; use icu_provider_fs::manifest; +use icu_testdata::metadata::{self, PackageInfo}; +use itertools::Itertools; use simple_logger::SimpleLogger; -use std::fmt; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; +use std::{fmt, fs}; +use writeable::Writeable; enum Error { Unsupported(&'static str), + Io(std::io::Error, Option), Export(icu_provider_fs::FsDataError), DataProvider(icu_provider::DataError), Metadata(icu_testdata::metadata::Error), Download(icu_provider_cldr::download::Error), + GlobWalk(globwalk::GlobError), + Walkdir(walkdir::Error), + StripPrefix(std::path::StripPrefixError), } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Error::Unsupported(message) => write!(f, "Unsupported: {}", message), + Error::Io(error, path) => write!(f, "I/O Error: {}, {:?}", error, path), Error::Export(error) => write!(f, "{}", error), Error::DataProvider(error) => write!(f, "{}", error), Error::Metadata(error) => write!(f, "Metadata Error: {}", error), Error::Download(error) => write!(f, "Download Error: {}", error), + Error::GlobWalk(error) => write!(f, "Glob Error: {}", error), + Error::Walkdir(error) => write!(f, "Walk Error: {}", error), + Error::StripPrefix(error) => write!(f, "Strip Prefix Error: {}", error), } } } @@ -40,6 +51,14 @@ impl fmt::Debug for Error { } } +/// To help with debugging, I/O errors should be paired with a file path. +/// If a path is unavailable, create the error directly: `Error::Io(err, None)` +impl> From<(std::io::Error, P)> for Error { + fn from(pieces: (std::io::Error, P)) -> Self { + Self::Io(pieces.0, Some(pieces.1.as_ref().to_path_buf())) + } +} + impl From for Error { fn from(err: icu_provider_fs::FsDataError) -> Error { Error::Export(err) @@ -64,13 +83,31 @@ impl From for Error { } } +impl From for Error { + fn from(err: globwalk::GlobError) -> Error { + Error::GlobWalk(err) + } +} + +impl From for Error { + fn from(err: walkdir::Error) -> Error { + Error::Walkdir(err) + } +} + +impl From for Error { + fn from(err: std::path::StripPrefixError) -> Error { + Error::StripPrefix(err) + } +} + fn main() -> Result<(), Error> { let default_out_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")) .join("data") .join("json") .into_os_string(); - let matches = App::new("ICU4X Test Data Generator") + let args = App::new("ICU4X Test Data Generator") .version("0.0.1") .author("The ICU4X Project Developers") .about("Export CLDR JSON into the ICU4X data schema for test data") @@ -81,20 +118,27 @@ fn main() -> Result<(), Error> { .multiple(true) .help("Sets the level of verbosity (-v, -vv, or -vvv)"), ) + .arg( + Arg::with_name("MODE") + .short("m") + .long("mode") + .help("Tasks to perform: 'download' to download the CLDR data into the repository; 'generate' to convert the CLDR into ICU4X JSON; or 'all' to perform both tasks.") + .takes_value(true) + .default_value("all"), + ) .arg( Arg::with_name("OUTPUT") .short("o") .long("out") .help( - "Path to output data directory. The directory will be overwritten. \ - Omit this option to write data into the package tree.", + "Path to output data directory. The directory will be overwritten. Omit this option to write data into the package tree.", ) .takes_value(true) .default_value_os(&default_out_dir), ) .get_matches(); - match matches.occurrences_of("VERBOSE") { + match args.occurrences_of("VERBOSE") { 0 => SimpleLogger::from_env().init().unwrap(), 1 => SimpleLogger::new() .with_level(log::LevelFilter::Info) @@ -111,22 +155,74 @@ fn main() -> Result<(), Error> { _ => return Err(Error::Unsupported("Only -v, -vv, and -vvv are supported")), } - let keys = get_all_resc_keys(); - - let metadata = icu_testdata::metadata::load()?; + let metadata = metadata::load()?; log::info!("Package metadata: {:?}", metadata); + download(&args, &metadata)?; + generate(&args, &metadata)?; + Ok(()) +} + +/// Downloads the CLDR JSON and copies a subset of it into data/cldr +fn download(_args: &ArgMatches, metadata: &PackageInfo) -> Result<(), Error> { + let downloader = + CldrAllInOneDownloader::try_new_from_github_tag(&metadata.package_metadata.gitref)?; + let downloaded_cldr = downloader.download()?; + + let cldr_json_root = icu_testdata::paths::cldr_json_root(); + fs::remove_dir_all(&cldr_json_root).map_err(|e| (e, &cldr_json_root))?; + + let locales_glob_substitute = format!( + "{{{}}}", + metadata + .package_metadata + .locales + .iter() + .map(|l| l.writeable_to_string()) + .join(",") + ); + let glob_patterns: Vec = metadata + .package_metadata + .cldr_json_glob + .iter() + .map(|pattern| pattern.replace("$LOCALES", &locales_glob_substitute)) + .collect(); + + let walker = globwalk::GlobWalkerBuilder::from_patterns( + downloaded_cldr.cldr_json_root.clone(), + &glob_patterns, + ) + .max_depth(4) + .follow_links(true) + .build()? + .into_iter(); + + for path in walker { + let old_path = path?.into_path(); + let relative_path = old_path.strip_prefix(&downloaded_cldr.cldr_json_root)?; + let new_path = cldr_json_root.join(relative_path); + fs::create_dir_all(new_path.parent().unwrap()).map_err(|e| (e, &new_path))?; + log::trace!("Copying {:?}", &relative_path); + fs::copy(&old_path, &new_path).map_err(|e| (e, &new_path))?; + } + Ok(()) +} + +fn generate(args: &ArgMatches, metadata: &PackageInfo) -> Result<(), Error> { + let keys = get_all_resc_keys(); + let output_path = PathBuf::from( - matches - .value_of_os("OUTPUT") + args.value_of_os("OUTPUT") .expect("Option has a default value"), ); log::info!("Writing testdata to: {:?}", output_path); - let cldr_paths = - CldrAllInOneDownloader::try_from_github_tag(&metadata.package_metadata.gitref)?; + let cldr_paths = CldrPathsAllInOne { + cldr_json_root: icu_testdata::paths::cldr_json_root(), + suffix: "full", + }; let provider = CldrJsonDataProvider::new(&cldr_paths); let mut options = serializers::json::Options::default(); @@ -135,8 +231,9 @@ fn main() -> Result<(), Error> { let mut options = fs_exporter::ExporterOptions::default(); options.root = output_path; - options.locales = - manifest::LocalesOption::IncludeList(metadata.package_metadata.locales.into_boxed_slice()); + options.locales = manifest::LocalesOption::IncludeList( + metadata.package_metadata.locales.clone().into_boxed_slice(), + ); options.overwrite = fs_exporter::OverwriteOption::RemoveAndReplace; let mut exporter = FilesystemExporter::try_new(json_serializer, options)?; diff --git a/resources/testdata/src/lib.rs b/resources/testdata/src/lib.rs index 8d876767c63..50b193146da 100644 --- a/resources/testdata/src/lib.rs +++ b/resources/testdata/src/lib.rs @@ -37,7 +37,7 @@ #[cfg(feature = "metadata")] pub mod metadata; - +pub mod paths; mod test_data_provider; pub use test_data_provider::get_provider; diff --git a/resources/testdata/src/metadata.rs b/resources/testdata/src/metadata.rs index e4fd38df9cb..500b9c1be8a 100644 --- a/resources/testdata/src/metadata.rs +++ b/resources/testdata/src/metadata.rs @@ -46,6 +46,7 @@ impl fmt::Debug for Error { #[derive(Debug, Deserialize)] pub struct PackageMetadata { pub locales: Vec, + pub cldr_json_glob: Vec, pub gitref: String, } diff --git a/resources/testdata/src/paths.rs b/resources/testdata/src/paths.rs new file mode 100644 index 00000000000..b4b5cc328ca --- /dev/null +++ b/resources/testdata/src/paths.rs @@ -0,0 +1,15 @@ +use std::path::PathBuf; + +/// Returns the absolute path to the CLDR JSON root directory. +pub fn cldr_json_root() -> PathBuf { + PathBuf::from(std::env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("cldr") +} + +/// Returns the absolute path to the ICU4X JSON root directory. +pub fn icu4x_json_root() -> PathBuf { + PathBuf::from(std::env!("CARGO_MANIFEST_DIR")) + .join("data") + .join("json") +} diff --git a/resources/testdata/src/test_data_provider.rs b/resources/testdata/src/test_data_provider.rs index a28dee3301d..dbddc122de2 100644 --- a/resources/testdata/src/test_data_provider.rs +++ b/resources/testdata/src/test_data_provider.rs @@ -8,9 +8,7 @@ use std::path::PathBuf; pub fn get_provider() -> FsDataProvider { let path: PathBuf = match std::env::var_os("ICU4X_TESTDATA_DIR") { Some(val) => val.into(), - None => PathBuf::from(std::env!("CARGO_MANIFEST_DIR")) - .join("data") - .join("json"), + None => crate::paths::icu4x_json_root(), }; FsDataProvider::try_new(&path).unwrap_or_else(|err| { panic!( From e935c424c6e8eeccc63cdcbf489e7d4426a7929b Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 26 Feb 2021 19:56:00 -0600 Subject: [PATCH 05/18] Linting --- .../provider_cldr/src/transform/numbers/cldr_serde.rs | 6 +++++- .../provider_cldr/src/transform/numbers/decimal_pattern.rs | 4 ++++ components/provider_cldr/src/transform/numbers/mod.rs | 4 ++-- components/provider_fs/src/bin/icu4x-cldr-export.rs | 2 +- components/provider_fs/src/export/aliasing.rs | 1 + resources/testdata/src/bin/icu4x-gen-testdata.rs | 3 +-- resources/testdata/src/paths.rs | 4 ++++ 7 files changed, 18 insertions(+), 6 deletions(-) diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs index f27599b0a93..f6421f7e5a5 100644 --- a/components/provider_cldr/src/transform/numbers/cldr_serde.rs +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -1,3 +1,7 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + use crate::cldr_langid::CldrLangID; use serde::Deserialize; use serde_aux::prelude::*; @@ -54,7 +58,7 @@ pub mod numbers_json { // Key is of the form: "symbols-numberSystem-latn" let mut key_it = key.split('-'); let stype = key_it.next(); - let numsys: Option> = key_it.skip(1).next().map(|s| { + let numsys: Option> = key_it.nth(2).map(|s| { s.parse().map_err(|_| { M::Error::invalid_value( Unexpected::Str(&key), diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs index 7252e73f525..d80b63ac704 100644 --- a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -1,3 +1,7 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + use std::str::FromStr; type SmallString8 = smallstr::SmallString<[u8; 8]>; use icu_decimal::provider::AffixesV1; diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index b460ec97d7a..a6970e42ba9 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -132,8 +132,8 @@ impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { #[test] fn test_basic() { - use icu_locid_macros::langid; - use std::borrow::Cow; + // use icu_locid_macros::langid; + // use std::borrow::Cow; // let json_str = std::fs::read_to_string("tests/testdata/my-numbers.json").unwrap(); /* diff --git a/components/provider_fs/src/bin/icu4x-cldr-export.rs b/components/provider_fs/src/bin/icu4x-cldr-export.rs index 2bad007625c..ebd29b54b3a 100644 --- a/components/provider_fs/src/bin/icu4x-cldr-export.rs +++ b/components/provider_fs/src/bin/icu4x-cldr-export.rs @@ -231,7 +231,7 @@ fn main() -> Result<(), Error> { ); let cldr_paths: Box = if let Some(tag) = matches.value_of("CLDR_TAG") { - Box::new(CldrAllInOneDownloader::try_from_github_tag(tag)?) + Box::new(CldrAllInOneDownloader::try_new_from_github_tag(tag)?.download()?) } else { let mut cldr_paths_local = CldrPathsLocal::default(); if let Some(path) = matches.value_of("CLDR_CORE") { diff --git a/components/provider_fs/src/export/aliasing.rs b/components/provider_fs/src/export/aliasing.rs index e3bc5e2e32c..07c2b87aa5e 100644 --- a/components/provider_fs/src/export/aliasing.rs +++ b/components/provider_fs/src/export/aliasing.rs @@ -1,6 +1,7 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + use crate::error::Error; use std::collections::HashMap; use std::fmt; diff --git a/resources/testdata/src/bin/icu4x-gen-testdata.rs b/resources/testdata/src/bin/icu4x-gen-testdata.rs index 4bbf8fc8792..da5129bea55 100644 --- a/resources/testdata/src/bin/icu4x-gen-testdata.rs +++ b/resources/testdata/src/bin/icu4x-gen-testdata.rs @@ -195,8 +195,7 @@ fn download(_args: &ArgMatches, metadata: &PackageInfo) -> Result<(), Error> { ) .max_depth(4) .follow_links(true) - .build()? - .into_iter(); + .build()?; for path in walker { let old_path = path?.into_path(); diff --git a/resources/testdata/src/paths.rs b/resources/testdata/src/paths.rs index b4b5cc328ca..4a41009fb22 100644 --- a/resources/testdata/src/paths.rs +++ b/resources/testdata/src/paths.rs @@ -1,3 +1,7 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). + use std::path::PathBuf; /// Returns the absolute path to the CLDR JSON root directory. From b2c75f1e357422aa54f05c9221b83b6699503d3e Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Wed, 10 Mar 2021 20:34:31 -0600 Subject: [PATCH 06/18] master -> main on new files --- components/decimal/Cargo.toml | 2 +- components/decimal/src/lib.rs | 2 +- components/decimal/src/provider.rs | 2 +- components/provider_cldr/src/transform/numbers/cldr_serde.rs | 2 +- .../provider_cldr/src/transform/numbers/decimal_pattern.rs | 2 +- components/provider_cldr/src/transform/numbers/mod.rs | 2 +- utils/litemap/tests/serde.rs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/components/decimal/Cargo.toml b/components/decimal/Cargo.toml index 752d21f6f28..65359517eba 100644 --- a/components/decimal/Cargo.toml +++ b/components/decimal/Cargo.toml @@ -1,6 +1,6 @@ # This file is part of ICU4X. For terms of use, please see the file # called LICENSE at the top level of the ICU4X source tree -# (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +# (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). [package] name = "icu_decimal" diff --git a/components/decimal/src/lib.rs b/components/decimal/src/lib.rs index a17215df8f5..ae30b0d5a5c 100644 --- a/components/decimal/src/lib.rs +++ b/components/decimal/src/lib.rs @@ -1,5 +1,5 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). pub mod provider; diff --git a/components/decimal/src/provider.rs b/components/decimal/src/provider.rs index dc50e52958b..e328170de1c 100644 --- a/components/decimal/src/provider.rs +++ b/components/decimal/src/provider.rs @@ -1,6 +1,6 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). pub type SmallString8 = smallstr::SmallString<[u8; 8]>; diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs index f6421f7e5a5..edc16599587 100644 --- a/components/provider_cldr/src/transform/numbers/cldr_serde.rs +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -1,6 +1,6 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use crate::cldr_langid::CldrLangID; use serde::Deserialize; diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs index d80b63ac704..56b2ff5b024 100644 --- a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -1,6 +1,6 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use std::str::FromStr; type SmallString8 = smallstr::SmallString<[u8; 8]>; diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index a6970e42ba9..ab33549d6d1 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -1,6 +1,6 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use crate::cldr_langid::CldrLangID; use crate::error::Error; diff --git a/utils/litemap/tests/serde.rs b/utils/litemap/tests/serde.rs index 18324961532..a2a3bda4a4b 100644 --- a/utils/litemap/tests/serde.rs +++ b/utils/litemap/tests/serde.rs @@ -1,6 +1,6 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree -// (online at: https://github.com/unicode-org/icu4x/blob/master/LICENSE ). +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use litemap::LiteMap; use serde_json; From a255018100d480552599e8121cef4b9eb8c6271f Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 11 Mar 2021 18:43:26 -0600 Subject: [PATCH 07/18] Cleanups --- components/provider/tests/data_provider.rs | 10 ++-------- components/provider_cldr/src/error.rs | 1 + 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/components/provider/tests/data_provider.rs b/components/provider/tests/data_provider.rs index 2619713917f..7683ef4599f 100644 --- a/components/provider/tests/data_provider.rs +++ b/components/provider/tests/data_provider.rs @@ -225,10 +225,7 @@ fn test_warehouse_owned_dyn_generic() { fn test_warehouse_owned_dyn_erased_alt() { let warehouse = get_warehouse(DATA); let response = get_payload_alt(&warehouse as &dyn ErasedDataProvider); - assert!(matches!( - response, - Err(DataError::UnsupportedResourceKey { .. }) - )); + assert!(matches!(response, Err(DataError::UnsupportedResourceKey { .. }))); } #[test] @@ -286,10 +283,7 @@ fn test_warehouse_ref_dyn_generic() { fn test_warehouse_ref_dyn_erased_alt() { let warehouse = get_warehouse(DATA); let response = get_payload_alt(&&warehouse as &dyn ErasedDataProvider); - assert!(matches!( - response, - Err(DataError::UnsupportedResourceKey { .. }) - )); + assert!(matches!(response, Err(DataError::UnsupportedResourceKey { .. }))); } #[test] diff --git a/components/provider_cldr/src/error.rs b/components/provider_cldr/src/error.rs index 6bd795c545f..4e2c6f1513a 100644 --- a/components/provider_cldr/src/error.rs +++ b/components/provider_cldr/src/error.rs @@ -1,6 +1,7 @@ // This file is part of ICU4X. For terms of use, please see the file // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use icu_locid::LanguageIdentifier; use std::error; use std::fmt; use std::path::{Path, PathBuf}; From 6daa45f5e7a5c6089dfe027ae1ce4800c6331785 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 11 Mar 2021 23:08:22 -0600 Subject: [PATCH 08/18] Adding numbers.json files --- resources/testdata/Cargo.toml | 1 + .../cldr-numbers-full/main/ar-EG/numbers.json | 514 ++++++++++++++++++ .../cldr-numbers-full/main/ar/numbers.json | 513 +++++++++++++++++ .../cldr-numbers-full/main/bn/numbers.json | 292 ++++++++++ .../cldr-numbers-full/main/ccp/numbers.json | 216 ++++++++ .../main/en-US-POSIX/numbers.json | 161 ++++++ .../cldr-numbers-full/main/en-ZA/numbers.json | 160 ++++++ .../cldr-numbers-full/main/en/numbers.json | 159 ++++++ .../cldr-numbers-full/main/es-AR/numbers.json | 159 ++++++ .../cldr-numbers-full/main/es/numbers.json | 158 ++++++ .../cldr-numbers-full/main/fr/numbers.json | 161 ++++++ .../cldr-numbers-full/main/ja/numbers.json | 120 ++++ .../cldr-numbers-full/main/root/numbers.json | 118 ++++ .../cldr-numbers-full/main/ru/numbers.json | 241 ++++++++ .../main/sr-Cyrl/numbers.json | 195 +++++++ .../main/sr-Latn/numbers.json | 195 +++++++ .../cldr-numbers-full/main/sr/numbers.json | 194 +++++++ .../cldr-numbers-full/main/th/numbers.json | 213 ++++++++ .../cldr-numbers-full/main/tr/numbers.json | 156 ++++++ 19 files changed, 3926 insertions(+) create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/ar-EG/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/ar/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/bn/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/ccp/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/en-US-POSIX/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/en-ZA/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/en/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/es-AR/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/es/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/fr/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/ja/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/root/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/ru/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/sr-Cyrl/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/sr-Latn/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/sr/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/th/numbers.json create mode 100644 resources/testdata/data/cldr/cldr-numbers-full/main/tr/numbers.json diff --git a/resources/testdata/Cargo.toml b/resources/testdata/Cargo.toml index 143ccb11525..37689d3642f 100644 --- a/resources/testdata/Cargo.toml +++ b/resources/testdata/Cargo.toml @@ -97,6 +97,7 @@ cldr_json_glob = [ "cldr-core/supplemental/ordinals.json", "cldr-core/supplemental/plurals.json", "cldr-dates-full/main/$LOCALES/ca-gregorian.json", + "cldr-numbers-full/main/$LOCALES/numbers.json", # Extra data for feature coverage in provider_cldr tests: "cldr-dates-full/main/cs/ca-gregorian.json", "cldr-dates-full/main/haw/ca-gregorian.json", diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/ar-EG/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/ar-EG/numbers.json new file mode 100644 index 00000000000..cae427aa471 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/ar-EG/numbers.json @@ -0,0 +1,514 @@ +{ + "main": { + "ar-EG": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ar", + "territory": "EG" + }, + "numbers": { + "defaultNumberingSystem": "arab", + "defaultNumberingSystem-alt-latn": "latn", + "otherNumberingSystems": { + "native": "arab" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-arab": { + "decimal": "٫", + "group": "٬", + "list": "؛", + "percentSign": "٪؜", + "plusSign": "؜+", + "minusSign": "؜-", + "approximatelySign": "~", + "exponential": "اس", + "superscriptingExponent": "×", + "perMille": "؉", + "infinity": "∞", + "nan": "ليس رقم", + "timeSeparator": ":" + }, + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "‎%‎", + "plusSign": "‎+", + "minusSign": "‎-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "ليس رقمًا", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-arab": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 ملايين", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 ملايين", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + }, + "short": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 مليون", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 مليون", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + } + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 ملايين", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 ملايين", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + }, + "short": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 مليون", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 مليون", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + } + }, + "scientificFormats-numberSystem-arab": { + "standard": "#E0" + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-arab": { + "standard": "#,##0%" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-arab": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤", + "unitPattern-count-zero": "{0} {1}", + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-two": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-many": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤ #,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-zero": "0 ألف ¤", + "1000-count-one": "0 ألف ¤", + "1000-count-two": "0 ألف ¤", + "1000-count-few": "0 ألف ¤", + "1000-count-many": "0 ألف ¤", + "1000-count-other": "0 ألف ¤", + "10000-count-zero": "00 ألف ¤", + "10000-count-one": "00 ألف ¤", + "10000-count-two": "00 ألف ¤", + "10000-count-few": "00 ألف ¤", + "10000-count-many": "00 ألف ¤", + "10000-count-other": "00 ألف ¤", + "100000-count-zero": "000 ألف ¤", + "100000-count-one": "000 ألف ¤", + "100000-count-two": "000 ألف ¤", + "100000-count-few": "000 ألف ¤", + "100000-count-many": "000 ألف ¤", + "100000-count-other": "000 ألف ¤", + "1000000-count-zero": "0 مليون ¤", + "1000000-count-one": "0 مليون ¤", + "1000000-count-two": "0 مليون ¤", + "1000000-count-few": "0 مليون ¤", + "1000000-count-many": "0 مليون ¤", + "1000000-count-other": "0 مليون ¤", + "10000000-count-zero": "00 مليون ¤", + "10000000-count-one": "00 مليون ¤", + "10000000-count-two": "00 مليون ¤", + "10000000-count-few": "00 مليون ¤", + "10000000-count-many": "00 مليون ¤", + "10000000-count-other": "00 مليون ¤", + "100000000-count-zero": "000 مليون ¤", + "100000000-count-one": "000 مليون ¤", + "100000000-count-two": "000 مليون ¤", + "100000000-count-few": "000 مليون ¤", + "100000000-count-many": "000 مليون ¤", + "100000000-count-other": "000 مليون ¤", + "1000000000-count-zero": "0 مليار ¤", + "1000000000-count-one": "0 مليار ¤", + "1000000000-count-two": "0 مليار ¤", + "1000000000-count-few": "0 مليار ¤", + "1000000000-count-many": "0 مليار ¤", + "1000000000-count-other": "0 مليار ¤", + "10000000000-count-zero": "00 مليار ¤", + "10000000000-count-one": "00 مليار ¤", + "10000000000-count-two": "00 مليار ¤", + "10000000000-count-few": "00 مليار ¤", + "10000000000-count-many": "00 مليار ¤", + "10000000000-count-other": "00 مليار ¤", + "100000000000-count-zero": "000 مليار ¤", + "100000000000-count-one": "000 مليار ¤", + "100000000000-count-two": "000 مليار ¤", + "100000000000-count-few": "000 مليار ¤", + "100000000000-count-many": "000 مليار ¤", + "100000000000-count-other": "000 مليار ¤", + "1000000000000-count-zero": "0 ترليون ¤", + "1000000000000-count-one": "0 ترليون ¤", + "1000000000000-count-two": "0 ترليون ¤", + "1000000000000-count-few": "0 ترليون ¤", + "1000000000000-count-many": "0 ترليون ¤", + "1000000000000-count-other": "0 ترليون ¤", + "10000000000000-count-zero": "00 ترليون ¤", + "10000000000000-count-one": "00 ترليون ¤", + "10000000000000-count-two": "00 ترليون ¤", + "10000000000000-count-few": "00 ترليون ¤", + "10000000000000-count-many": "00 ترليون ¤", + "10000000000000-count-other": "00 ترليون ¤", + "100000000000000-count-zero": "000 ترليون ¤", + "100000000000000-count-one": "000 ترليون ¤", + "100000000000000-count-two": "000 ترليون ¤", + "100000000000000-count-few": "000 ترليون ¤", + "100000000000000-count-many": "000 ترليون ¤", + "100000000000000-count-other": "000 ترليون ¤" + } + }, + "unitPattern-count-zero": "{0} {1}", + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-two": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-many": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-arab": { + "approximately": "~{0}", + "atLeast": "+{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "+{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-zero": "{0} كتاب", + "pluralMinimalPairs-count-one": "ولد واحد حضر", + "pluralMinimalPairs-count-two": "ولدان حضرا", + "pluralMinimalPairs-count-few": "{0} أولاد حضروا", + "pluralMinimalPairs-count-many": "{0} ولدًا حضروا", + "pluralMinimalPairs-count-other": "{0} ولد حضروا", + "other": "اتجه إلى المنعطف الـ {0} يمينًا." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/ar/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/ar/numbers.json new file mode 100644 index 00000000000..d59db728c4f --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/ar/numbers.json @@ -0,0 +1,513 @@ +{ + "main": { + "ar": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ar" + }, + "numbers": { + "defaultNumberingSystem": "arab", + "defaultNumberingSystem-alt-latn": "latn", + "otherNumberingSystems": { + "native": "arab" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-arab": { + "decimal": "٫", + "group": "٬", + "list": "؛", + "percentSign": "٪؜", + "plusSign": "؜+", + "minusSign": "؜-", + "approximatelySign": "~", + "exponential": "اس", + "superscriptingExponent": "×", + "perMille": "؉", + "infinity": "∞", + "nan": "ليس رقم", + "timeSeparator": ":" + }, + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "‎%‎", + "plusSign": "‎+", + "minusSign": "‎-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "ليس رقمًا", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-arab": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 ملايين", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 ملايين", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + }, + "short": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 مليون", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 مليون", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + } + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 ملايين", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 ملايين", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + }, + "short": { + "decimalFormat": { + "1000-count-zero": "0 ألف", + "1000-count-one": "0 ألف", + "1000-count-two": "0 ألف", + "1000-count-few": "0 آلاف", + "1000-count-many": "0 ألف", + "1000-count-other": "0 ألف", + "10000-count-zero": "00 ألف", + "10000-count-one": "00 ألف", + "10000-count-two": "00 ألف", + "10000-count-few": "00 ألف", + "10000-count-many": "00 ألف", + "10000-count-other": "00 ألف", + "100000-count-zero": "000 ألف", + "100000-count-one": "000 ألف", + "100000-count-two": "000 ألف", + "100000-count-few": "000 ألف", + "100000-count-many": "000 ألف", + "100000-count-other": "000 ألف", + "1000000-count-zero": "0 مليون", + "1000000-count-one": "0 مليون", + "1000000-count-two": "0 مليون", + "1000000-count-few": "0 مليون", + "1000000-count-many": "0 مليون", + "1000000-count-other": "0 مليون", + "10000000-count-zero": "00 مليون", + "10000000-count-one": "00 مليون", + "10000000-count-two": "00 مليون", + "10000000-count-few": "00 مليون", + "10000000-count-many": "00 مليون", + "10000000-count-other": "00 مليون", + "100000000-count-zero": "000 مليون", + "100000000-count-one": "000 مليون", + "100000000-count-two": "000 مليون", + "100000000-count-few": "000 مليون", + "100000000-count-many": "000 مليون", + "100000000-count-other": "000 مليون", + "1000000000-count-zero": "0 مليار", + "1000000000-count-one": "0 مليار", + "1000000000-count-two": "0 مليار", + "1000000000-count-few": "0 مليار", + "1000000000-count-many": "0 مليار", + "1000000000-count-other": "0 مليار", + "10000000000-count-zero": "00 مليار", + "10000000000-count-one": "00 مليار", + "10000000000-count-two": "00 مليار", + "10000000000-count-few": "00 مليار", + "10000000000-count-many": "00 مليار", + "10000000000-count-other": "00 مليار", + "100000000000-count-zero": "000 مليار", + "100000000000-count-one": "000 مليار", + "100000000000-count-two": "000 مليار", + "100000000000-count-few": "000 مليار", + "100000000000-count-many": "000 مليار", + "100000000000-count-other": "000 مليار", + "1000000000000-count-zero": "0 ترليون", + "1000000000000-count-one": "0 ترليون", + "1000000000000-count-two": "0 ترليون", + "1000000000000-count-few": "0 ترليون", + "1000000000000-count-many": "0 ترليون", + "1000000000000-count-other": "0 ترليون", + "10000000000000-count-zero": "00 ترليون", + "10000000000000-count-one": "00 ترليون", + "10000000000000-count-two": "00 ترليون", + "10000000000000-count-few": "00 ترليون", + "10000000000000-count-many": "00 ترليون", + "10000000000000-count-other": "00 ترليون", + "100000000000000-count-zero": "000 ترليون", + "100000000000000-count-one": "000 ترليون", + "100000000000000-count-two": "000 ترليون", + "100000000000000-count-few": "000 ترليون", + "100000000000000-count-many": "000 ترليون", + "100000000000000-count-other": "000 ترليون" + } + } + }, + "scientificFormats-numberSystem-arab": { + "standard": "#E0" + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-arab": { + "standard": "#,##0%" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-arab": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤", + "unitPattern-count-zero": "{0} {1}", + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-two": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-many": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤ #,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-zero": "0 ألف ¤", + "1000-count-one": "0 ألف ¤", + "1000-count-two": "0 ألف ¤", + "1000-count-few": "0 ألف ¤", + "1000-count-many": "0 ألف ¤", + "1000-count-other": "0 ألف ¤", + "10000-count-zero": "00 ألف ¤", + "10000-count-one": "00 ألف ¤", + "10000-count-two": "00 ألف ¤", + "10000-count-few": "00 ألف ¤", + "10000-count-many": "00 ألف ¤", + "10000-count-other": "00 ألف ¤", + "100000-count-zero": "000 ألف ¤", + "100000-count-one": "000 ألف ¤", + "100000-count-two": "000 ألف ¤", + "100000-count-few": "000 ألف ¤", + "100000-count-many": "000 ألف ¤", + "100000-count-other": "000 ألف ¤", + "1000000-count-zero": "0 مليون ¤", + "1000000-count-one": "0 مليون ¤", + "1000000-count-two": "0 مليون ¤", + "1000000-count-few": "0 مليون ¤", + "1000000-count-many": "0 مليون ¤", + "1000000-count-other": "0 مليون ¤", + "10000000-count-zero": "00 مليون ¤", + "10000000-count-one": "00 مليون ¤", + "10000000-count-two": "00 مليون ¤", + "10000000-count-few": "00 مليون ¤", + "10000000-count-many": "00 مليون ¤", + "10000000-count-other": "00 مليون ¤", + "100000000-count-zero": "000 مليون ¤", + "100000000-count-one": "000 مليون ¤", + "100000000-count-two": "000 مليون ¤", + "100000000-count-few": "000 مليون ¤", + "100000000-count-many": "000 مليون ¤", + "100000000-count-other": "000 مليون ¤", + "1000000000-count-zero": "0 مليار ¤", + "1000000000-count-one": "0 مليار ¤", + "1000000000-count-two": "0 مليار ¤", + "1000000000-count-few": "0 مليار ¤", + "1000000000-count-many": "0 مليار ¤", + "1000000000-count-other": "0 مليار ¤", + "10000000000-count-zero": "00 مليار ¤", + "10000000000-count-one": "00 مليار ¤", + "10000000000-count-two": "00 مليار ¤", + "10000000000-count-few": "00 مليار ¤", + "10000000000-count-many": "00 مليار ¤", + "10000000000-count-other": "00 مليار ¤", + "100000000000-count-zero": "000 مليار ¤", + "100000000000-count-one": "000 مليار ¤", + "100000000000-count-two": "000 مليار ¤", + "100000000000-count-few": "000 مليار ¤", + "100000000000-count-many": "000 مليار ¤", + "100000000000-count-other": "000 مليار ¤", + "1000000000000-count-zero": "0 ترليون ¤", + "1000000000000-count-one": "0 ترليون ¤", + "1000000000000-count-two": "0 ترليون ¤", + "1000000000000-count-few": "0 ترليون ¤", + "1000000000000-count-many": "0 ترليون ¤", + "1000000000000-count-other": "0 ترليون ¤", + "10000000000000-count-zero": "00 ترليون ¤", + "10000000000000-count-one": "00 ترليون ¤", + "10000000000000-count-two": "00 ترليون ¤", + "10000000000000-count-few": "00 ترليون ¤", + "10000000000000-count-many": "00 ترليون ¤", + "10000000000000-count-other": "00 ترليون ¤", + "100000000000000-count-zero": "000 ترليون ¤", + "100000000000000-count-one": "000 ترليون ¤", + "100000000000000-count-two": "000 ترليون ¤", + "100000000000000-count-few": "000 ترليون ¤", + "100000000000000-count-many": "000 ترليون ¤", + "100000000000000-count-other": "000 ترليون ¤" + } + }, + "unitPattern-count-zero": "{0} {1}", + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-two": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-many": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-arab": { + "approximately": "~{0}", + "atLeast": "+{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "+{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-zero": "{0} كتاب", + "pluralMinimalPairs-count-one": "ولد واحد حضر", + "pluralMinimalPairs-count-two": "ولدان حضرا", + "pluralMinimalPairs-count-few": "{0} أولاد حضروا", + "pluralMinimalPairs-count-many": "{0} ولدًا حضروا", + "pluralMinimalPairs-count-other": "{0} ولد حضروا", + "other": "اتجه إلى المنعطف الـ {0} يمينًا." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/bn/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/bn/numbers.json new file mode 100644 index 00000000000..c5d5fa018e1 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/bn/numbers.json @@ -0,0 +1,292 @@ +{ + "main": { + "bn": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "bn" + }, + "numbers": { + "defaultNumberingSystem": "beng", + "otherNumberingSystems": { + "native": "beng" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-beng": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-beng": { + "standard": "#,##,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 হাজার", + "1000-count-other": "0 হাজার", + "10000-count-one": "00 হাজার", + "10000-count-other": "00 হাজার", + "100000-count-one": "0 লাখ", + "100000-count-other": "0 লাখ", + "1000000-count-one": "00 লাখ", + "1000000-count-other": "00 লাখ", + "10000000-count-one": "0 কোটি", + "10000000-count-other": "0 কোটি", + "100000000-count-one": "00 কোটি", + "100000000-count-other": "00 কোটি", + "1000000000-count-one": "000 কোটি", + "1000000000-count-other": "000 কোটি", + "10000000000-count-one": "0000 কোটি", + "10000000000-count-other": "0000 কোটি", + "100000000000-count-one": "00000 কোটি", + "100000000000-count-other": "00000 কোটি", + "1000000000000-count-one": "0 লাখ কোটি", + "1000000000000-count-other": "0 লাখ কোটি", + "10000000000000-count-one": "00 লাখ কোটি", + "10000000000000-count-other": "00 লাখ কোটি", + "100000000000000-count-one": "000 লাখ কোটি", + "100000000000000-count-other": "000 লাখ কোটি" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 হা", + "1000-count-other": "0 হা", + "10000-count-one": "00 হা", + "10000-count-other": "00 হা", + "100000-count-one": "0 লা", + "100000-count-other": "0 লা", + "1000000-count-one": "00 লা", + "1000000-count-other": "00 লা", + "10000000-count-one": "0 কো", + "10000000-count-other": "0 কো", + "100000000-count-one": "00 কো", + "100000000-count-other": "00 কো", + "1000000000-count-one": "000 কো", + "1000000000-count-other": "000 কো", + "10000000000-count-one": "00 শত কো", + "10000000000-count-other": "00শত কো", + "100000000000-count-one": "000কো", + "100000000000-count-other": "000কো", + "1000000000000-count-one": "0 লা'.'কো'.'", + "1000000000000-count-other": "0 লা'.'কো'.'", + "10000000000000-count-one": "00 লা'.'কো'.'", + "10000000000000-count-other": "00 লা'.'কো'.'", + "100000000000000-count-one": "000 লা'.'কো'.'", + "100000000000000-count-other": "000 লা'.'কো'.'" + } + } + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 হাজার", + "1000-count-other": "0 হাজার", + "10000-count-one": "00 হাজার", + "10000-count-other": "00 হাজার", + "100000-count-one": "0 লাখ", + "100000-count-other": "0 লাখ", + "1000000-count-one": "00 লাখ", + "1000000-count-other": "00 লাখ", + "10000000-count-one": "0 কোটি", + "10000000-count-other": "0 কোটি", + "100000000-count-one": "00 কোটি", + "100000000-count-other": "00 কোটি", + "1000000000-count-one": "000 কোটি", + "1000000000-count-other": "000 কোটি", + "10000000000-count-one": "0000 কোটি", + "10000000000-count-other": "0000 কোটি", + "100000000000-count-one": "00000 কোটি", + "100000000000-count-other": "00000 কোটি", + "1000000000000-count-one": "0 লাখ কোটি", + "1000000000000-count-other": "0 লাখ কোটি", + "10000000000000-count-one": "00 লাখ কোটি", + "10000000000000-count-other": "00 লাখ কোটি", + "100000000000000-count-one": "000 লাখ কোটি", + "100000000000000-count-other": "000 লাখ কোটি" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 হা", + "1000-count-other": "0 হা", + "10000-count-one": "00 হা", + "10000-count-other": "00 হা", + "100000-count-one": "0 লা", + "100000-count-other": "0 লা", + "1000000-count-one": "00 লা", + "1000000-count-other": "00 লা", + "10000000-count-one": "0 কো", + "10000000-count-other": "0 কো", + "100000000-count-one": "00 কো", + "100000000-count-other": "00 কো", + "1000000000-count-one": "000 কো", + "1000000000-count-other": "000 কো", + "10000000000-count-one": "00 শত কো", + "10000000000-count-other": "00শত কো", + "100000000000-count-one": "000কো", + "100000000000-count-other": "000কো", + "1000000000000-count-one": "0 লা'.'কো'.'", + "1000000000000-count-other": "0 লা'.'কো'.'", + "10000000000000-count-one": "00 লা'.'কো'.'", + "10000000000000-count-other": "00 লা'.'কো'.'", + "100000000000000-count-one": "000 লা'.'কো'.'", + "100000000000000-count-other": "000 লা'.'কো'.'" + } + } + }, + "scientificFormats-numberSystem-beng": { + "standard": "#E0" + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-beng": { + "standard": "#,##0%" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##,##0%" + }, + "currencyFormats-numberSystem-beng": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##,##0.00¤", + "accounting": "#,##,##0.00¤;(#,##,##0.00¤)", + "short": { + "standard": { + "1000-count-one": "0 হা¤", + "1000-count-other": "0 হা¤", + "10000-count-one": "00 হা¤", + "10000-count-other": "00 হা¤", + "100000-count-one": "0 লা¤", + "100000-count-other": "0 লা¤", + "1000000-count-one": "00 লা¤", + "1000000-count-other": "00 লা¤", + "10000000-count-one": "0 কো¤", + "10000000-count-other": "0 কো¤", + "100000000-count-one": "00 কো¤", + "100000000-count-other": "00 কো¤", + "1000000000-count-one": "000 কো¤", + "1000000000-count-other": "000 কো¤", + "10000000000-count-one": "0000 কো¤", + "10000000000-count-other": "0000 কো¤", + "100000000000-count-one": "00000 কো¤", + "100000000000-count-other": "00000 কো¤", + "1000000000000-count-one": "0 লা'.'কো'.'¤", + "1000000000000-count-other": "0 লা'.'কো'.'¤", + "10000000000000-count-one": "00 লা'.'কো'.'¤", + "10000000000000-count-other": "00 লা'.'কো'.'¤", + "100000000000000-count-one": "000 লা'.'কো'.'¤", + "100000000000000-count-other": "000 লা'.'কো'.'¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##,##0.00¤", + "accounting": "#,##,##0.00¤;(#,##,##0.00¤)", + "short": { + "standard": { + "1000-count-one": "0 হা¤", + "1000-count-other": "0 হা¤", + "10000-count-one": "00 হা¤", + "10000-count-other": "00 হা¤", + "100000-count-one": "0 লা¤", + "100000-count-other": "0 লা¤", + "1000000-count-one": "00 লা¤", + "1000000-count-other": "00 লা¤", + "10000000-count-one": "0 কো¤", + "10000000-count-other": "0 কো¤", + "100000000-count-one": "00 কো¤", + "100000000-count-other": "00 কো¤", + "1000000000-count-one": "000 কো¤", + "1000000000-count-other": "000 কো¤", + "10000000000-count-one": "0000 কো¤", + "10000000000-count-other": "0000 কো¤", + "100000000000-count-one": "00000 কো¤", + "100000000000-count-other": "00000 কো¤", + "1000000000000-count-one": "0 লা'.'কো'.'¤", + "1000000000000-count-other": "0 লা'.'কো'.'¤", + "10000000000000-count-one": "00 লা'.'কো'.'¤", + "10000000000000-count-other": "00 লা'.'কো'.'¤", + "100000000000000-count-one": "000 লা'.'কো'.'¤", + "100000000000000-count-other": "000 লা'.'কো'.'¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-beng": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "সসে {0}টি আপেল খেল, সেটা ভাল", + "pluralMinimalPairs-count-other": "সসে {0}টি আপেল খেল, সেগুলি ভাল", + "few": "ডান দিকে {0}র্থ বাঁকটি নিন।", + "many": "ডান দিকে {0}ষ্ঠ বাঁকটি নিন।", + "one": "ডান দিকে {0}ম বাঁকটি নিন।", + "other": "ডান দিকে {0}তম বাঁকটি নিন।", + "two": "ডান দিকে {0}য় বাঁকটি নিন।" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/ccp/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/ccp/numbers.json new file mode 100644 index 00000000000..f63e0de7213 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/ccp/numbers.json @@ -0,0 +1,216 @@ +{ + "main": { + "ccp": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ccp" + }, + "numbers": { + "defaultNumberingSystem": "cakm", + "otherNumberingSystems": { + "native": "cakm" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-cakm": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-cakm": { + "standard": "#,##,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0G", + "10000000000-count-other": "00G", + "100000000000-count-other": "000G", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0G", + "10000000000-count-other": "00G", + "100000000000-count-other": "000G", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + } + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0G", + "10000000000-count-other": "00G", + "100000000000-count-other": "000G", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0G", + "10000000000-count-other": "00G", + "100000000000-count-other": "000G", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + } + }, + "scientificFormats-numberSystem-cakm": { + "standard": "#E0" + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-cakm": { + "standard": "#,##0%" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##,##0%" + }, + "currencyFormats-numberSystem-cakm": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##,##0.00¤", + "accounting": "#,##,##0.00¤;(#,##,##0.00¤)", + "short": { + "standard": { + "1000-count-other": "¤ 0K", + "10000-count-other": "¤ 00K", + "100000-count-other": "¤ 000K", + "1000000-count-other": "¤ 0M", + "10000000-count-other": "¤ 00M", + "100000000-count-other": "¤ 000M", + "1000000000-count-other": "¤ 0G", + "10000000000-count-other": "¤ 00G", + "100000000000-count-other": "¤ 000G", + "1000000000000-count-other": "¤ 0T", + "10000000000000-count-other": "¤ 00T", + "100000000000000-count-other": "¤ 000T" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##,##0.00¤", + "accounting": "#,##,##0.00¤;(#,##,##0.00¤)", + "short": { + "standard": { + "1000-count-other": "¤ 0K", + "10000-count-other": "¤ 00K", + "100000-count-other": "¤ 000K", + "1000000-count-other": "¤ 0M", + "10000000-count-other": "¤ 00M", + "100000000-count-other": "¤ 000M", + "1000000000-count-other": "¤ 0G", + "10000000000-count-other": "¤ 00G", + "100000000000-count-other": "¤ 000G", + "1000000000000-count-other": "¤ 0T", + "10000000000000-count-other": "¤ 00T", + "100000000000000-count-other": "¤ 000T" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-cakm": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "𑄥𑄧𑄥𑄬{0}𑄑𑄨 𑄃𑄛𑄬𑄣𑄴 𑄈𑄬𑄣𑄧, 𑄥𑄨𑄠𑄚𑄴 𑄉𑄧𑄟𑄴", + "pluralMinimalPairs-count-other": "𑄥𑄧𑄥𑄬{0}𑄑𑄨 𑄃𑄛𑄬𑄣𑄴 𑄈𑄬𑄣𑄧, 𑄥𑄨𑄉𑄪𑄚𑄴 𑄉𑄧𑄟𑄴", + "other": "{0}?" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/en-US-POSIX/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/en-US-POSIX/numbers.json new file mode 100644 index 00000000000..cb9d3622324 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/en-US-POSIX/numbers.json @@ -0,0 +1,161 @@ +{ + "main": { + "en-US-POSIX": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "en", + "territory": "US", + "variant": "POSIX" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "0/00", + "infinity": "INF", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "0.######", + "long": { + "decimalFormat": { + "1000-count-one": "0 thousand", + "1000-count-other": "0 thousand", + "10000-count-one": "00 thousand", + "10000-count-other": "00 thousand", + "100000-count-one": "000 thousand", + "100000-count-other": "000 thousand", + "1000000-count-one": "0 million", + "1000000-count-other": "0 million", + "10000000-count-one": "00 million", + "10000000-count-other": "00 million", + "100000000-count-one": "000 million", + "100000000-count-other": "000 million", + "1000000000-count-one": "0 billion", + "1000000000-count-other": "0 billion", + "10000000000-count-one": "00 billion", + "10000000000-count-other": "00 billion", + "100000000000-count-one": "000 billion", + "100000000000-count-other": "000 billion", + "1000000000000-count-one": "0 trillion", + "1000000000000-count-other": "0 trillion", + "10000000000000-count-one": "00 trillion", + "10000000000000-count-other": "00 trillion", + "100000000000000-count-one": "000 trillion", + "100000000000000-count-other": "000 trillion" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0K", + "1000-count-other": "0K", + "10000-count-one": "00K", + "10000-count-other": "00K", + "100000-count-one": "000K", + "100000-count-other": "000K", + "1000000-count-one": "0M", + "1000000-count-other": "0M", + "10000000-count-one": "00M", + "10000000-count-other": "00M", + "100000000-count-one": "000M", + "100000000-count-other": "000M", + "1000000000-count-one": "0B", + "1000000000-count-other": "0B", + "10000000000-count-one": "00B", + "10000000000-count-other": "00B", + "100000000000-count-one": "000B", + "100000000000-count-other": "000B", + "1000000000000-count-one": "0T", + "1000000000000-count-other": "0T", + "10000000000000-count-one": "00T", + "10000000000000-count-other": "00T", + "100000000000000-count-one": "000T", + "100000000000000-count-other": "000T" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "0.000000E+000" + }, + "percentFormats-numberSystem-latn": { + "standard": "0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤ 0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-one": "¤0K", + "1000-count-other": "¤0K", + "10000-count-one": "¤00K", + "10000-count-other": "¤00K", + "100000-count-one": "¤000K", + "100000-count-other": "¤000K", + "1000000-count-one": "¤0M", + "1000000-count-other": "¤0M", + "10000000-count-one": "¤00M", + "10000000-count-other": "¤00M", + "100000000-count-one": "¤000M", + "100000000-count-other": "¤000M", + "1000000000-count-one": "¤0B", + "1000000000-count-other": "¤0B", + "10000000000-count-one": "¤00B", + "10000000000-count-other": "¤00B", + "100000000000-count-one": "¤000B", + "100000000000-count-other": "¤000B", + "1000000000000-count-one": "¤0T", + "1000000000000-count-other": "¤0T", + "10000000000000-count-one": "¤00T", + "10000000000000-count-other": "¤00T", + "100000000000000-count-one": "¤000T", + "100000000000000-count-other": "¤000T" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} day", + "pluralMinimalPairs-count-other": "{0} days", + "few": "Take the {0}rd right.", + "one": "Take the {0}st right.", + "other": "Take the {0}th right.", + "two": "Take the {0}nd right." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/en-ZA/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/en-ZA/numbers.json new file mode 100644 index 00000000000..6385240eb87 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/en-ZA/numbers.json @@ -0,0 +1,160 @@ +{ + "main": { + "en-ZA": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "en", + "territory": "ZA" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": " ", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 thousand", + "1000-count-other": "0 thousand", + "10000-count-one": "00 thousand", + "10000-count-other": "00 thousand", + "100000-count-one": "000 thousand", + "100000-count-other": "000 thousand", + "1000000-count-one": "0 million", + "1000000-count-other": "0 million", + "10000000-count-one": "00 million", + "10000000-count-other": "00 million", + "100000000-count-one": "000 million", + "100000000-count-other": "000 million", + "1000000000-count-one": "0 billion", + "1000000000-count-other": "0 billion", + "10000000000-count-one": "00 billion", + "10000000000-count-other": "00 billion", + "100000000000-count-one": "000 billion", + "100000000000-count-other": "000 billion", + "1000000000000-count-one": "0 trillion", + "1000000000000-count-other": "0 trillion", + "10000000000000-count-one": "00 trillion", + "10000000000000-count-other": "00 trillion", + "100000000000000-count-one": "000 trillion", + "100000000000000-count-other": "000 trillion" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0K", + "1000-count-other": "0K", + "10000-count-one": "00K", + "10000-count-other": "00K", + "100000-count-one": "000K", + "100000-count-other": "000K", + "1000000-count-one": "0M", + "1000000-count-other": "0M", + "10000000-count-one": "00M", + "10000000-count-other": "00M", + "100000000-count-one": "000M", + "100000000-count-other": "000M", + "1000000000-count-one": "0B", + "1000000000-count-other": "0B", + "10000000000-count-one": "00B", + "10000000000-count-other": "00B", + "100000000000-count-one": "000B", + "100000000000-count-other": "000B", + "1000000000000-count-one": "0T", + "1000000000000-count-other": "0T", + "10000000000000-count-one": "00T", + "10000000000000-count-other": "00T", + "100000000000000-count-one": "000T", + "100000000000000-count-other": "000T" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤#,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-one": "¤0K", + "1000-count-other": "¤0K", + "10000-count-one": "¤00K", + "10000-count-other": "¤00K", + "100000-count-one": "¤000K", + "100000-count-other": "¤000K", + "1000000-count-one": "¤0M", + "1000000-count-other": "¤0M", + "10000000-count-one": "¤00M", + "10000000-count-other": "¤00M", + "100000000-count-one": "¤000M", + "100000000-count-other": "¤000M", + "1000000000-count-one": "¤0B", + "1000000000-count-other": "¤0B", + "10000000000-count-one": "¤00B", + "10000000000-count-other": "¤00B", + "100000000000-count-one": "¤000B", + "100000000000-count-other": "¤000B", + "1000000000000-count-one": "¤0T", + "1000000000000-count-other": "¤0T", + "10000000000000-count-one": "¤00T", + "10000000000000-count-other": "¤00T", + "100000000000000-count-one": "¤000T", + "100000000000000-count-other": "¤000T" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} day", + "pluralMinimalPairs-count-other": "{0} days", + "few": "Take the {0}rd right.", + "one": "Take the {0}st right.", + "other": "Take the {0}th right.", + "two": "Take the {0}nd right." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/en/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/en/numbers.json new file mode 100644 index 00000000000..c359048a8fd --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/en/numbers.json @@ -0,0 +1,159 @@ +{ + "main": { + "en": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "en" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 thousand", + "1000-count-other": "0 thousand", + "10000-count-one": "00 thousand", + "10000-count-other": "00 thousand", + "100000-count-one": "000 thousand", + "100000-count-other": "000 thousand", + "1000000-count-one": "0 million", + "1000000-count-other": "0 million", + "10000000-count-one": "00 million", + "10000000-count-other": "00 million", + "100000000-count-one": "000 million", + "100000000-count-other": "000 million", + "1000000000-count-one": "0 billion", + "1000000000-count-other": "0 billion", + "10000000000-count-one": "00 billion", + "10000000000-count-other": "00 billion", + "100000000000-count-one": "000 billion", + "100000000000-count-other": "000 billion", + "1000000000000-count-one": "0 trillion", + "1000000000000-count-other": "0 trillion", + "10000000000000-count-one": "00 trillion", + "10000000000000-count-other": "00 trillion", + "100000000000000-count-one": "000 trillion", + "100000000000000-count-other": "000 trillion" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0K", + "1000-count-other": "0K", + "10000-count-one": "00K", + "10000-count-other": "00K", + "100000-count-one": "000K", + "100000-count-other": "000K", + "1000000-count-one": "0M", + "1000000-count-other": "0M", + "10000000-count-one": "00M", + "10000000-count-other": "00M", + "100000000-count-one": "000M", + "100000000-count-other": "000M", + "1000000000-count-one": "0B", + "1000000000-count-other": "0B", + "10000000000-count-one": "00B", + "10000000000-count-other": "00B", + "100000000000-count-one": "000B", + "100000000000-count-other": "000B", + "1000000000000-count-one": "0T", + "1000000000000-count-other": "0T", + "10000000000000-count-one": "00T", + "10000000000000-count-other": "00T", + "100000000000000-count-one": "000T", + "100000000000000-count-other": "000T" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤#,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-one": "¤0K", + "1000-count-other": "¤0K", + "10000-count-one": "¤00K", + "10000-count-other": "¤00K", + "100000-count-one": "¤000K", + "100000-count-other": "¤000K", + "1000000-count-one": "¤0M", + "1000000-count-other": "¤0M", + "10000000-count-one": "¤00M", + "10000000-count-other": "¤00M", + "100000000-count-one": "¤000M", + "100000000-count-other": "¤000M", + "1000000000-count-one": "¤0B", + "1000000000-count-other": "¤0B", + "10000000000-count-one": "¤00B", + "10000000000-count-other": "¤00B", + "100000000000-count-one": "¤000B", + "100000000000-count-other": "¤000B", + "1000000000000-count-one": "¤0T", + "1000000000000-count-other": "¤0T", + "10000000000000-count-one": "¤00T", + "10000000000000-count-other": "¤00T", + "100000000000000-count-one": "¤000T", + "100000000000000-count-other": "¤000T" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} day", + "pluralMinimalPairs-count-other": "{0} days", + "few": "Take the {0}rd right.", + "one": "Take the {0}st right.", + "other": "Take the {0}th right.", + "two": "Take the {0}nd right." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/es-AR/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/es-AR/numbers.json new file mode 100644 index 00000000000..8d6c009cbdb --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/es-AR/numbers.json @@ -0,0 +1,159 @@ +{ + "main": { + "es-AR": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "es", + "territory": "AR" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "2", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": ".", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 mil", + "1000-count-other": "0 mil", + "10000-count-one": "00 mil", + "10000-count-other": "00 mil", + "100000-count-one": "000 mil", + "100000-count-other": "000 mil", + "1000000-count-one": "0 millón", + "1000000-count-other": "0 millones", + "10000000-count-one": "00 millones", + "10000000-count-other": "00 millones", + "100000000-count-one": "000 millones", + "100000000-count-other": "000 millones", + "1000000000-count-one": "0 mil millones", + "1000000000-count-other": "0 mil millones", + "10000000000-count-one": "00 mil millones", + "10000000000-count-other": "00 mil millones", + "100000000000-count-one": "000 mil millones", + "100000000000-count-other": "000 mil millones", + "1000000000000-count-one": "0 billón", + "1000000000000-count-other": "0 billón", + "10000000000000-count-one": "00 billones", + "10000000000000-count-other": "00 billones", + "100000000000000-count-one": "000 billones", + "100000000000000-count-other": "000 billones" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 K", + "1000-count-other": "0 K", + "10000-count-one": "00 k", + "10000-count-other": "00 k", + "100000-count-one": "000 k", + "100000-count-other": "000 k", + "1000000-count-one": "0 M", + "1000000-count-other": "0 M", + "10000000-count-one": "00 M", + "10000000-count-other": "00 M", + "100000000-count-one": "000 M", + "100000000-count-other": "000 M", + "1000000000-count-one": "0000 M", + "1000000000-count-other": "0000 M", + "10000000000-count-one": "00 mil M", + "10000000000-count-other": "00 mil M", + "100000000000-count-one": "000 mil M", + "100000000000-count-other": "000 mil M", + "1000000000000-count-one": "0 B", + "1000000000000-count-other": "0 B", + "10000000000000-count-one": "00 B", + "10000000000000-count-other": "00 B", + "100000000000000-count-one": "000 B", + "100000000000000-count-other": "000 B" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0 %" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤ #,##0.00", + "accounting": "¤ #,##0.00;(¤ #,##0.00)", + "short": { + "standard": { + "1000-count-one": "¤0 K", + "1000-count-other": "¤0 K", + "10000-count-one": "¤00 K", + "10000-count-other": "¤00 K", + "100000-count-one": "¤000 K", + "100000-count-other": "¤000 K", + "1000000-count-one": "¤0 M", + "1000000-count-other": "¤0 M", + "10000000-count-one": "¤00 M", + "10000000-count-other": "¤00 M", + "100000000-count-one": "¤000 M", + "100000000-count-other": "¤000 M", + "1000000000-count-one": "¤0000 M", + "1000000000-count-other": "¤0000 M", + "10000000000-count-one": "¤00 MRD", + "10000000000-count-other": "¤00 MRD", + "100000000000-count-one": "¤000 MRD", + "100000000000-count-other": "¤000 MRD", + "1000000000000-count-one": "¤0 B", + "1000000000000-count-other": "¤0 B", + "10000000000000-count-one": "¤00 B", + "10000000000000-count-other": "¤00 B", + "100000000000000-count-one": "¤000 B", + "100000000000000-count-other": "¤000 B" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "Más de {0}", + "atMost": "≤{0}", + "range": "{0}-{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} día", + "pluralMinimalPairs-count-other": "{0} días", + "other": "Toma la {0}.ª a la derecha.", + "feminine": "La {0} es...", + "masculine": "El {0} es…" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/es/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/es/numbers.json new file mode 100644 index 00000000000..1b03ed38b1e --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/es/numbers.json @@ -0,0 +1,158 @@ +{ + "main": { + "es": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "es" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "2", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": ".", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 mil", + "1000-count-other": "0 mil", + "10000-count-one": "00 mil", + "10000-count-other": "00 mil", + "100000-count-one": "000 mil", + "100000-count-other": "000 mil", + "1000000-count-one": "0 millón", + "1000000-count-other": "0 millones", + "10000000-count-one": "00 millones", + "10000000-count-other": "00 millones", + "100000000-count-one": "000 millones", + "100000000-count-other": "000 millones", + "1000000000-count-one": "0 mil millones", + "1000000000-count-other": "0 mil millones", + "10000000000-count-one": "00 mil millones", + "10000000000-count-other": "00 mil millones", + "100000000000-count-one": "000 mil millones", + "100000000000-count-other": "000 mil millones", + "1000000000000-count-one": "0 billón", + "1000000000000-count-other": "0 billones", + "10000000000000-count-one": "00 billones", + "10000000000000-count-other": "00 billones", + "100000000000000-count-one": "000 billones", + "100000000000000-count-other": "000 billones" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 mil", + "1000-count-other": "0 mil", + "10000-count-one": "00 mil", + "10000-count-other": "00 mil", + "100000-count-one": "000 mil", + "100000-count-other": "000 mil", + "1000000-count-one": "0 M", + "1000000-count-other": "0 M", + "10000000-count-one": "00 M", + "10000000-count-other": "00 M", + "100000000-count-one": "000 M", + "100000000-count-other": "000 M", + "1000000000-count-one": "0000 M", + "1000000000-count-other": "0000 M", + "10000000000-count-one": "00 mil M", + "10000000000-count-other": "00 mil M", + "100000000000-count-one": "000 mil M", + "100000000000-count-other": "000 mil M", + "1000000000000-count-one": "0 B", + "1000000000000-count-other": "0 B", + "10000000000000-count-one": "00 B", + "10000000000000-count-other": "00 B", + "100000000000000-count-one": "000 B", + "100000000000000-count-other": "000 B" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0 %" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤", + "short": { + "standard": { + "1000-count-one": "0 mil ¤", + "1000-count-other": "0 mil ¤", + "10000-count-one": "00 mil ¤", + "10000-count-other": "00 mil ¤", + "100000-count-one": "000 mil ¤", + "100000-count-other": "000 mil ¤", + "1000000-count-one": "0 M¤", + "1000000-count-other": "0 M¤", + "10000000-count-one": "00 M¤", + "10000000-count-other": "00 M¤", + "100000000-count-one": "000 M¤", + "100000000-count-other": "000 M¤", + "1000000000-count-one": "0000 M¤", + "1000000000-count-other": "0000 M¤", + "10000000000-count-one": "00 mil M¤", + "10000000000-count-other": "00 mil M¤", + "100000000000-count-one": "000 mil M¤", + "100000000000-count-other": "000 mil M¤", + "1000000000000-count-one": "0 B¤", + "1000000000000-count-other": "0 B¤", + "10000000000000-count-one": "00 B¤", + "10000000000000-count-other": "00 B¤", + "100000000000000-count-one": "000 B¤", + "100000000000000-count-other": "000 B¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "Más de {0}", + "atMost": "≤{0}", + "range": "{0}-{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} día", + "pluralMinimalPairs-count-other": "{0} días", + "other": "Toma la {0}.ª a la derecha.", + "feminine": "La {0} es...", + "masculine": "El {0} es…" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/fr/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/fr/numbers.json new file mode 100644 index 00000000000..5567b2f5cb6 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/fr/numbers.json @@ -0,0 +1,161 @@ +{ + "main": { + "fr": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "fr" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": " ", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "≃", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-1": "mille", + "1000-count-one": "0 millier", + "1000-count-other": "0 mille", + "10000-count-one": "00 mille", + "10000-count-other": "00 mille", + "100000-count-one": "000 mille", + "100000-count-other": "000 mille", + "1000000-count-one": "0 million", + "1000000-count-other": "0 millions", + "10000000-count-one": "00 million", + "10000000-count-other": "00 millions", + "100000000-count-one": "000 million", + "100000000-count-other": "000 millions", + "1000000000-count-one": "0 milliard", + "1000000000-count-other": "0 milliards", + "10000000000-count-one": "00 milliard", + "10000000000-count-other": "00 milliards", + "100000000000-count-one": "000 milliard", + "100000000000-count-other": "000 milliards", + "1000000000000-count-one": "0 billion", + "1000000000000-count-other": "0 billions", + "10000000000000-count-one": "00 billion", + "10000000000000-count-other": "00 billions", + "100000000000000-count-one": "000 billion", + "100000000000000-count-other": "000 billions" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 k", + "1000-count-other": "0 k", + "10000-count-one": "00 k", + "10000-count-other": "00 k", + "100000-count-one": "000 k", + "100000-count-other": "000 k", + "1000000-count-one": "0 M", + "1000000-count-other": "0 M", + "10000000-count-one": "00 M", + "10000000-count-other": "00 M", + "100000000-count-one": "000 M", + "100000000-count-other": "000 M", + "1000000000-count-one": "0 Md", + "1000000000-count-other": "0 Md", + "10000000000-count-one": "00 Md", + "10000000000-count-other": "00 Md", + "100000000000-count-one": "000 Md", + "100000000000-count-other": "000 Md", + "1000000000000-count-one": "0 Bn", + "1000000000000-count-other": "0 Bn", + "10000000000000-count-one": "00 Bn", + "10000000000000-count-other": "00 Bn", + "100000000000000-count-one": "000 Bn", + "100000000000000-count-other": "000 Bn" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0 %" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤;(#,##0.00 ¤)", + "short": { + "standard": { + "1000-count-one": "0 k ¤", + "1000-count-other": "0 k ¤", + "10000-count-one": "00 k ¤", + "10000-count-other": "00 k ¤", + "100000-count-one": "000 k ¤", + "100000-count-other": "000 k ¤", + "1000000-count-one": "0 M ¤", + "1000000-count-other": "0 M ¤", + "10000000-count-one": "00 M ¤", + "10000000-count-other": "00 M ¤", + "100000000-count-one": "000 M ¤", + "100000000-count-other": "000 M ¤", + "1000000000-count-one": "0 Md ¤", + "1000000000-count-other": "0 Md ¤", + "10000000000-count-one": "00 Md ¤", + "10000000000-count-other": "00 Md ¤", + "100000000000-count-one": "000 Md ¤", + "100000000000-count-other": "000 Md ¤", + "1000000000000-count-one": "0 Bn ¤", + "1000000000000-count-other": "0 Bn ¤", + "10000000000000-count-one": "00 Bn ¤", + "10000000000000-count-other": "00 Bn ¤", + "100000000000000-count-one": "000 Bn ¤", + "100000000000000-count-other": "000 Bn ¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "≈{0}", + "atLeast": "≥{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} jour", + "pluralMinimalPairs-count-many": "{0} de jours", + "pluralMinimalPairs-count-other": "{0} jours", + "one": "Prenez la {0}re à droite.", + "other": "Prenez la {0}e à droite.", + "feminine": "La {0} est", + "masculine": "Le {0} est" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/ja/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/ja/numbers.json new file mode 100644 index 00000000000..6828169b5c7 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/ja/numbers.json @@ -0,0 +1,120 @@ +{ + "main": { + "ja": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ja" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn", + "traditional": "jpan", + "finance": "jpanfin" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "約 ", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0", + "10000-count-other": "0万", + "100000-count-other": "00万", + "1000000-count-other": "000万", + "10000000-count-other": "0000万", + "100000000-count-other": "0億", + "1000000000-count-other": "00億", + "10000000000-count-other": "000億", + "100000000000-count-other": "0000億", + "1000000000000-count-other": "0兆", + "10000000000000-count-other": "00兆", + "100000000000000-count-other": "000兆" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0", + "10000-count-other": "0万", + "100000-count-other": "00万", + "1000000-count-other": "000万", + "10000000-count-other": "0000万", + "100000000-count-other": "0億", + "1000000000-count-other": "00億", + "10000000000-count-other": "000億", + "100000000000-count-other": "0000億", + "1000000000000-count-other": "0兆", + "10000000000000-count-other": "00兆", + "100000000000000-count-other": "000兆" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤#,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-other": "0", + "10000-count-other": "¤0万", + "100000-count-other": "¤00万", + "1000000-count-other": "¤000万", + "10000000-count-other": "¤0000万", + "100000000-count-other": "¤0億", + "1000000000-count-other": "¤00億", + "10000000000-count-other": "¤000億", + "100000000000-count-other": "¤0000億", + "1000000000000-count-other": "¤0兆", + "10000000000000-count-other": "¤00兆", + "100000000000000-count-other": "¤000兆" + } + }, + "unitPattern-count-other": "{0}{1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "約 {0}", + "atLeast": "{0} 以上", + "atMost": "{0} 以下", + "range": "{0}~{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-other": "{0}日", + "other": "{0} 番目の角を右折します。" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/root/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/root/numbers.json new file mode 100644 index 00000000000..d987b4074b9 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/root/numbers.json @@ -0,0 +1,118 @@ +{ + "main": { + "root": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "root" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0G", + "10000000000-count-other": "00G", + "100000000000-count-other": "000G", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0G", + "10000000000-count-other": "00G", + "100000000000-count-other": "000G", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤ #,##0.00", + "accounting": "¤ #,##0.00", + "short": { + "standard": { + "1000-count-other": "¤ 0K", + "10000-count-other": "¤ 00K", + "100000-count-other": "¤ 000K", + "1000000-count-other": "¤ 0M", + "10000000-count-other": "¤ 00M", + "100000000-count-other": "¤ 000M", + "1000000000-count-other": "¤ 0G", + "10000000000-count-other": "¤ 00G", + "100000000000-count-other": "¤ 000G", + "1000000000000-count-other": "¤ 0T", + "10000000000000-count-other": "¤ 00T", + "100000000000000-count-other": "¤ 000T" + } + }, + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "≥{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-other": "{0}?", + "other": "{0}?" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/ru/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/ru/numbers.json new file mode 100644 index 00000000000..e2833bc003d --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/ru/numbers.json @@ -0,0 +1,241 @@ +{ + "main": { + "ru": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "ru" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": " ", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "≈", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "не число", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 тысяча", + "1000-count-few": "0 тысячи", + "1000-count-many": "0 тысяч", + "1000-count-other": "0 тысячи", + "10000-count-one": "00 тысяча", + "10000-count-few": "00 тысячи", + "10000-count-many": "00 тысяч", + "10000-count-other": "00 тысячи", + "100000-count-one": "000 тысяча", + "100000-count-few": "000 тысячи", + "100000-count-many": "000 тысяч", + "100000-count-other": "000 тысячи", + "1000000-count-one": "0 миллион", + "1000000-count-few": "0 миллиона", + "1000000-count-many": "0 миллионов", + "1000000-count-other": "0 миллиона", + "10000000-count-one": "00 миллион", + "10000000-count-few": "00 миллиона", + "10000000-count-many": "00 миллионов", + "10000000-count-other": "00 миллиона", + "100000000-count-one": "000 миллион", + "100000000-count-few": "000 миллиона", + "100000000-count-many": "000 миллионов", + "100000000-count-other": "000 миллиона", + "1000000000-count-one": "0 миллиард", + "1000000000-count-few": "0 миллиарда", + "1000000000-count-many": "0 миллиардов", + "1000000000-count-other": "0 миллиарда", + "10000000000-count-one": "00 миллиард", + "10000000000-count-few": "00 миллиарда", + "10000000000-count-many": "00 миллиардов", + "10000000000-count-other": "00 миллиарда", + "100000000000-count-one": "000 миллиард", + "100000000000-count-few": "000 миллиарда", + "100000000000-count-many": "000 миллиардов", + "100000000000-count-other": "000 миллиарда", + "1000000000000-count-one": "0 триллион", + "1000000000000-count-few": "0 триллиона", + "1000000000000-count-many": "0 триллионов", + "1000000000000-count-other": "0 триллиона", + "10000000000000-count-one": "00 триллион", + "10000000000000-count-few": "00 триллиона", + "10000000000000-count-many": "00 триллионов", + "10000000000000-count-other": "00 триллиона", + "100000000000000-count-one": "000 триллион", + "100000000000000-count-few": "000 триллиона", + "100000000000000-count-many": "000 триллионов", + "100000000000000-count-other": "000 триллиона" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 тыс'.'", + "1000-count-few": "0 тыс'.'", + "1000-count-many": "0 тыс'.'", + "1000-count-other": "0 тыс'.'", + "10000-count-one": "00 тыс'.'", + "10000-count-few": "00 тыс'.'", + "10000-count-many": "00 тыс'.'", + "10000-count-other": "00 тыс'.'", + "100000-count-one": "000 тыс'.'", + "100000-count-few": "000 тыс'.'", + "100000-count-many": "000 тыс'.'", + "100000-count-other": "000 тыс'.'", + "1000000-count-one": "0 млн", + "1000000-count-few": "0 млн", + "1000000-count-many": "0 млн", + "1000000-count-other": "0 млн", + "10000000-count-one": "00 млн", + "10000000-count-few": "00 млн", + "10000000-count-many": "00 млн", + "10000000-count-other": "00 млн", + "100000000-count-one": "000 млн", + "100000000-count-few": "000 млн", + "100000000-count-many": "000 млн", + "100000000-count-other": "000 млн", + "1000000000-count-one": "0 млрд", + "1000000000-count-few": "0 млрд", + "1000000000-count-many": "0 млрд", + "1000000000-count-other": "0 млрд", + "10000000000-count-one": "00 млрд", + "10000000000-count-few": "00 млрд", + "10000000000-count-many": "00 млрд", + "10000000000-count-other": "00 млрд", + "100000000000-count-one": "000 млрд", + "100000000000-count-few": "000 млрд", + "100000000000-count-many": "000 млрд", + "100000000000-count-other": "000 млрд", + "1000000000000-count-one": "0 трлн", + "1000000000000-count-few": "0 трлн", + "1000000000000-count-many": "0 трлн", + "1000000000000-count-other": "0 трлн", + "10000000000000-count-one": "00 трлн", + "10000000000000-count-few": "00 трлн", + "10000000000000-count-many": "00 трлн", + "10000000000000-count-other": "00 трлн", + "100000000000000-count-one": "000 трлн", + "100000000000000-count-few": "000 трлн", + "100000000000000-count-many": "000 трлн", + "100000000000000-count-other": "000 трлн" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0 %" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤", + "short": { + "standard": { + "1000-count-one": "0 тыс'.' ¤", + "1000-count-few": "0 тыс'.' ¤", + "1000-count-many": "0 тыс'.' ¤", + "1000-count-other": "0 тыс'.' ¤", + "10000-count-one": "00 тыс'.' ¤", + "10000-count-few": "00 тыс'.' ¤", + "10000-count-many": "00 тыс'.' ¤", + "10000-count-other": "00 тыс'.' ¤", + "100000-count-one": "000 тыс'.' ¤", + "100000-count-few": "000 тыс'.' ¤", + "100000-count-many": "000 тыс'.' ¤", + "100000-count-other": "000 тыс'.' ¤", + "1000000-count-one": "0 млн ¤", + "1000000-count-few": "0 млн ¤", + "1000000-count-many": "0 млн ¤", + "1000000-count-other": "0 млн ¤", + "10000000-count-one": "00 млн ¤", + "10000000-count-few": "00 млн ¤", + "10000000-count-many": "00 млн ¤", + "10000000-count-other": "00 млн ¤", + "100000000-count-one": "000 млн ¤", + "100000000-count-few": "000 млн ¤", + "100000000-count-many": "000 млн ¤", + "100000000-count-other": "000 млн ¤", + "1000000000-count-one": "0 млрд ¤", + "1000000000-count-few": "0 млрд ¤", + "1000000000-count-many": "0 млрд ¤", + "1000000000-count-other": "0 млрд ¤", + "10000000000-count-one": "00 млрд ¤", + "10000000000-count-few": "00 млрд ¤", + "10000000000-count-many": "00 млрд ¤", + "10000000000-count-other": "00 млрд ¤", + "100000000000-count-one": "000 млрд ¤", + "100000000000-count-few": "000 млрд ¤", + "100000000000-count-many": "000 млрд ¤", + "100000000000-count-other": "000 млрд ¤", + "1000000000000-count-one": "0 трлн ¤", + "1000000000000-count-few": "0 трлн ¤", + "1000000000000-count-many": "0 трлн ¤", + "1000000000000-count-other": "0 трлн ¤", + "10000000000000-count-one": "00 трлн ¤", + "10000000000000-count-few": "00 трлн ¤", + "10000000000000-count-many": "00 трлн ¤", + "10000000000000-count-other": "00 трлн ¤", + "100000000000000-count-one": "000 трлн ¤", + "100000000000000-count-few": "000 трлн ¤", + "100000000000000-count-many": "000 трлн ¤", + "100000000000000-count-other": "000 трлн ¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-many": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "≈{0}", + "atLeast": "≥{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "из {0} книги за {0} день", + "pluralMinimalPairs-count-few": "из {0} книг за {0} дня", + "pluralMinimalPairs-count-many": "из {0} книг за {0} дней", + "pluralMinimalPairs-count-other": "из {0} книги за {0} дня", + "other": "Сверните направо на {0}-м перекрестке.", + "accusative": "Вижу {0}", + "dative": "Верю {0}", + "genitive": "Не хватает {0}", + "instrumental": "Занимаюсь {0}", + "locative": "Сижу на {0}", + "nominative": "{0} здесь", + "vocative": "Эй, {0}", + "feminine": "эта {0}", + "masculine": "этот {0}" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/sr-Cyrl/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/sr-Cyrl/numbers.json new file mode 100644 index 00000000000..188b168f120 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/sr-Cyrl/numbers.json @@ -0,0 +1,195 @@ +{ + "main": { + "sr-Cyrl": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "sr", + "script": "Cyrl" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": ".", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 хиљада", + "1000-count-few": "0 хиљаде", + "1000-count-other": "0 хиљада", + "10000-count-one": "00 хиљада", + "10000-count-few": "00 хиљаде", + "10000-count-other": "00 хиљада", + "100000-count-one": "000 хиљада", + "100000-count-few": "000 хиљаде", + "100000-count-other": "000 хиљада", + "1000000-count-one": "0 милион", + "1000000-count-few": "0 милиона", + "1000000-count-other": "0 милиона", + "10000000-count-one": "00 милион", + "10000000-count-few": "00 милиона", + "10000000-count-other": "00 милиона", + "100000000-count-one": "000 милион", + "100000000-count-few": "000 милиона", + "100000000-count-other": "000 милиона", + "1000000000-count-one": "0 милијарда", + "1000000000-count-few": "0 милијарде", + "1000000000-count-other": "0 милијарди", + "10000000000-count-one": "00 милијарда", + "10000000000-count-few": "00 милијарде", + "10000000000-count-other": "00 милијарди", + "100000000000-count-one": "000 милијарда", + "100000000000-count-few": "000 милијарде", + "100000000000-count-other": "000 милијарди", + "1000000000000-count-one": "0 билион", + "1000000000000-count-few": "0 билиона", + "1000000000000-count-other": "0 билиона", + "10000000000000-count-one": "00 билион", + "10000000000000-count-few": "00 билиона", + "10000000000000-count-other": "00 билиона", + "100000000000000-count-one": "000 билион", + "100000000000000-count-few": "000 билиона", + "100000000000000-count-other": "000 билиона" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 хиљ'.'", + "1000-count-few": "0 хиљ'.'", + "1000-count-other": "0 хиљ'.'", + "10000-count-one": "00 хиљ'.'", + "10000-count-few": "00 хиљ'.'", + "10000-count-other": "00 хиљ'.'", + "100000-count-one": "000 хиљ'.'", + "100000-count-few": "000 хиљ'.'", + "100000-count-other": "000 хиљ'.'", + "1000000-count-one": "0 мил'.'", + "1000000-count-few": "0 мил'.'", + "1000000-count-other": "0 мил'.'", + "10000000-count-one": "00 мил'.'", + "10000000-count-few": "00 мил'.'", + "10000000-count-other": "00 мил'.'", + "100000000-count-one": "000 мил'.'", + "100000000-count-few": "000 мил'.'", + "100000000-count-other": "000 мил'.'", + "1000000000-count-one": "0 млрд'.'", + "1000000000-count-few": "0 млрд'.'", + "1000000000-count-other": "0 млрд'.'", + "10000000000-count-one": "00 млрд'.'", + "10000000000-count-few": "00 млрд'.'", + "10000000000-count-other": "00 млрд'.'", + "100000000000-count-one": "000 млрд'.'", + "100000000000-count-few": "000 млрд'.'", + "100000000000-count-other": "000 млрд'.'", + "1000000000000-count-one": "0 бил'.'", + "1000000000000-count-few": "0 бил'.'", + "1000000000000-count-other": "0 бил'.'", + "10000000000000-count-one": "00 бил'.'", + "10000000000000-count-few": "00 бил'.'", + "10000000000000-count-other": "00 бил'.'", + "100000000000000-count-one": "000 бил'.'", + "100000000000000-count-few": "000 бил'.'", + "100000000000000-count-other": "000 бил'.'" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤;(#,##0.00 ¤)", + "short": { + "standard": { + "1000-count-one": "0 хиљ'.' ¤", + "1000-count-few": "0 хиљ'.' ¤", + "1000-count-other": "0 хиљ'.' ¤", + "10000-count-one": "00 хиљ'.' ¤", + "10000-count-few": "00 хиљ'.' ¤", + "10000-count-other": "00 хиљ'.' ¤", + "100000-count-one": "000 хиљ'.' ¤", + "100000-count-few": "000 хиљ'.' ¤", + "100000-count-other": "000 хиљ'.' ¤", + "1000000-count-one": "0 мил'.' ¤", + "1000000-count-few": "0 мил'.' ¤", + "1000000-count-other": "0 мил'.' ¤", + "10000000-count-one": "00 мил'.' ¤", + "10000000-count-few": "00 мил'.' ¤", + "10000000-count-other": "00 мил'.' ¤", + "100000000-count-one": "000 мил'.' ¤", + "100000000-count-few": "000 мил'.' ¤", + "100000000-count-other": "000 мил'.' ¤", + "1000000000-count-one": "0 млрд'.' ¤", + "1000000000-count-few": "0 млрд'.' ¤", + "1000000000-count-other": "0 млрд'.' ¤", + "10000000000-count-one": "00 млрд'.' ¤", + "10000000000-count-few": "00 млрд'.' ¤", + "10000000000-count-other": "00 млрд'.' ¤", + "100000000000-count-one": "000 млрд'.' ¤", + "100000000000-count-few": "000 млрд'.' ¤", + "100000000000-count-other": "000 млрд'.' ¤", + "1000000000000-count-one": "0 бил'.' ¤", + "1000000000000-count-few": "0 бил'.' ¤", + "1000000000000-count-other": "0 бил'.' ¤", + "10000000000000-count-one": "00 бил'.' ¤", + "10000000000000-count-few": "00 бил'.' ¤", + "10000000000000-count-other": "00 бил'.' ¤", + "100000000000000-count-one": "000 бил'.' ¤", + "100000000000000-count-few": "000 бил'.' ¤", + "100000000000000-count-other": "000 бил'.' ¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "≥{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} сат", + "pluralMinimalPairs-count-few": "{0} сата", + "pluralMinimalPairs-count-other": "{0} сати", + "other": "Скрените у {0}. десно." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/sr-Latn/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/sr-Latn/numbers.json new file mode 100644 index 00000000000..2659c903fce --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/sr-Latn/numbers.json @@ -0,0 +1,195 @@ +{ + "main": { + "sr-Latn": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "sr", + "script": "Latn" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": ".", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 hiljada", + "1000-count-few": "0 hiljade", + "1000-count-other": "0 hiljada", + "10000-count-one": "00 hiljada", + "10000-count-few": "00 hiljade", + "10000-count-other": "00 hiljada", + "100000-count-one": "000 hiljada", + "100000-count-few": "000 hiljade", + "100000-count-other": "000 hiljada", + "1000000-count-one": "0 milion", + "1000000-count-few": "0 miliona", + "1000000-count-other": "0 miliona", + "10000000-count-one": "00 milion", + "10000000-count-few": "00 miliona", + "10000000-count-other": "00 miliona", + "100000000-count-one": "000 milion", + "100000000-count-few": "000 miliona", + "100000000-count-other": "000 miliona", + "1000000000-count-one": "0 milijarda", + "1000000000-count-few": "0 milijarde", + "1000000000-count-other": "0 milijardi", + "10000000000-count-one": "00 milijarda", + "10000000000-count-few": "00 milijarde", + "10000000000-count-other": "00 milijardi", + "100000000000-count-one": "000 milijarda", + "100000000000-count-few": "000 milijarde", + "100000000000-count-other": "000 milijardi", + "1000000000000-count-one": "0 bilion", + "1000000000000-count-few": "0 biliona", + "1000000000000-count-other": "0 biliona", + "10000000000000-count-one": "00 bilion", + "10000000000000-count-few": "00 biliona", + "10000000000000-count-other": "00 biliona", + "100000000000000-count-one": "000 bilion", + "100000000000000-count-few": "000 biliona", + "100000000000000-count-other": "000 biliona" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 hilj'.'", + "1000-count-few": "0 hilj'.'", + "1000-count-other": "0 hilj'.'", + "10000-count-one": "00 hilj'.'", + "10000-count-few": "00 hilj'.'", + "10000-count-other": "00 hilj'.'", + "100000-count-one": "000 hilj'.'", + "100000-count-few": "000 hilj'.'", + "100000-count-other": "000 hilj'.'", + "1000000-count-one": "0 mil'.'", + "1000000-count-few": "0 mil'.'", + "1000000-count-other": "0 mil'.'", + "10000000-count-one": "00 mil'.'", + "10000000-count-few": "00 mil'.'", + "10000000-count-other": "00 mil'.'", + "100000000-count-one": "000 mil'.'", + "100000000-count-few": "000 mil'.'", + "100000000-count-other": "000 mil'.'", + "1000000000-count-one": "0 mlrd'.'", + "1000000000-count-few": "0 mlrd'.'", + "1000000000-count-other": "0 mlrd'.'", + "10000000000-count-one": "00 mlrd'.'", + "10000000000-count-few": "00 mlrd'.'", + "10000000000-count-other": "00 mlrd'.'", + "100000000000-count-one": "000 mlrd'.'", + "100000000000-count-few": "000 mlrd'.'", + "100000000000-count-other": "000 mlrd'.'", + "1000000000000-count-one": "0 bil'.'", + "1000000000000-count-few": "0 bil'.'", + "1000000000000-count-other": "0 bil'.'", + "10000000000000-count-one": "00 bil'.'", + "10000000000000-count-few": "00 bil'.'", + "10000000000000-count-other": "00 bil'.'", + "100000000000000-count-one": "000 bil'.'", + "100000000000000-count-few": "000 bil'.'", + "100000000000000-count-other": "000 bil'.'" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤;(#,##0.00 ¤)", + "short": { + "standard": { + "1000-count-one": "0 hilj'.' ¤", + "1000-count-few": "0 hilj'.' ¤", + "1000-count-other": "0 hilj'.' ¤", + "10000-count-one": "00 hilj'.' ¤", + "10000-count-few": "00 hilj'.' ¤", + "10000-count-other": "00 hilj'.' ¤", + "100000-count-one": "000 hilj'.' ¤", + "100000-count-few": "000 hilj'.' ¤", + "100000-count-other": "000 hilj'.' ¤", + "1000000-count-one": "0 mil'.' ¤", + "1000000-count-few": "0 mil'.' ¤", + "1000000-count-other": "0 mil'.' ¤", + "10000000-count-one": "00 mil'.' ¤", + "10000000-count-few": "00 mil'.' ¤", + "10000000-count-other": "00 mil'.' ¤", + "100000000-count-one": "000 mil'.' ¤", + "100000000-count-few": "000 mil'.' ¤", + "100000000-count-other": "000 mil'.' ¤", + "1000000000-count-one": "0 mlrd'.' ¤", + "1000000000-count-few": "0 mlrd'.' ¤", + "1000000000-count-other": "0 mlrd'.' ¤", + "10000000000-count-one": "00 mlrd'.' ¤", + "10000000000-count-few": "00 mlrd'.' ¤", + "10000000000-count-other": "00 mlrd'.' ¤", + "100000000000-count-one": "000 mlrd'.' ¤", + "100000000000-count-few": "000 mlrd'.' ¤", + "100000000000-count-other": "000 mlrd'.' ¤", + "1000000000000-count-one": "0 bil'.' ¤", + "1000000000000-count-few": "0 bil'.' ¤", + "1000000000000-count-other": "0 bil'.' ¤", + "10000000000000-count-one": "00 bil'.' ¤", + "10000000000000-count-few": "00 bil'.' ¤", + "10000000000000-count-other": "00 bil'.' ¤", + "100000000000000-count-one": "000 bil'.' ¤", + "100000000000000-count-few": "000 bil'.' ¤", + "100000000000000-count-other": "000 bil'.' ¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "≥{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} sat", + "pluralMinimalPairs-count-few": "{0} sata", + "pluralMinimalPairs-count-other": "{0} sati", + "other": "Skrenite u {0}. desno." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/sr/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/sr/numbers.json new file mode 100644 index 00000000000..9455a642c65 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/sr/numbers.json @@ -0,0 +1,194 @@ +{ + "main": { + "sr": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "sr" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": ".", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 хиљада", + "1000-count-few": "0 хиљаде", + "1000-count-other": "0 хиљада", + "10000-count-one": "00 хиљада", + "10000-count-few": "00 хиљаде", + "10000-count-other": "00 хиљада", + "100000-count-one": "000 хиљада", + "100000-count-few": "000 хиљаде", + "100000-count-other": "000 хиљада", + "1000000-count-one": "0 милион", + "1000000-count-few": "0 милиона", + "1000000-count-other": "0 милиона", + "10000000-count-one": "00 милион", + "10000000-count-few": "00 милиона", + "10000000-count-other": "00 милиона", + "100000000-count-one": "000 милион", + "100000000-count-few": "000 милиона", + "100000000-count-other": "000 милиона", + "1000000000-count-one": "0 милијарда", + "1000000000-count-few": "0 милијарде", + "1000000000-count-other": "0 милијарди", + "10000000000-count-one": "00 милијарда", + "10000000000-count-few": "00 милијарде", + "10000000000-count-other": "00 милијарди", + "100000000000-count-one": "000 милијарда", + "100000000000-count-few": "000 милијарде", + "100000000000-count-other": "000 милијарди", + "1000000000000-count-one": "0 билион", + "1000000000000-count-few": "0 билиона", + "1000000000000-count-other": "0 билиона", + "10000000000000-count-one": "00 билион", + "10000000000000-count-few": "00 билиона", + "10000000000000-count-other": "00 билиона", + "100000000000000-count-one": "000 билион", + "100000000000000-count-few": "000 билиона", + "100000000000000-count-other": "000 билиона" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 хиљ'.'", + "1000-count-few": "0 хиљ'.'", + "1000-count-other": "0 хиљ'.'", + "10000-count-one": "00 хиљ'.'", + "10000-count-few": "00 хиљ'.'", + "10000-count-other": "00 хиљ'.'", + "100000-count-one": "000 хиљ'.'", + "100000-count-few": "000 хиљ'.'", + "100000-count-other": "000 хиљ'.'", + "1000000-count-one": "0 мил'.'", + "1000000-count-few": "0 мил'.'", + "1000000-count-other": "0 мил'.'", + "10000000-count-one": "00 мил'.'", + "10000000-count-few": "00 мил'.'", + "10000000-count-other": "00 мил'.'", + "100000000-count-one": "000 мил'.'", + "100000000-count-few": "000 мил'.'", + "100000000-count-other": "000 мил'.'", + "1000000000-count-one": "0 млрд'.'", + "1000000000-count-few": "0 млрд'.'", + "1000000000-count-other": "0 млрд'.'", + "10000000000-count-one": "00 млрд'.'", + "10000000000-count-few": "00 млрд'.'", + "10000000000-count-other": "00 млрд'.'", + "100000000000-count-one": "000 млрд'.'", + "100000000000-count-few": "000 млрд'.'", + "100000000000-count-other": "000 млрд'.'", + "1000000000000-count-one": "0 бил'.'", + "1000000000000-count-few": "0 бил'.'", + "1000000000000-count-other": "0 бил'.'", + "10000000000000-count-one": "00 бил'.'", + "10000000000000-count-few": "00 бил'.'", + "10000000000000-count-other": "00 бил'.'", + "100000000000000-count-one": "000 бил'.'", + "100000000000000-count-few": "000 бил'.'", + "100000000000000-count-other": "000 бил'.'" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "#,##0.00 ¤", + "accounting": "#,##0.00 ¤;(#,##0.00 ¤)", + "short": { + "standard": { + "1000-count-one": "0 хиљ'.' ¤", + "1000-count-few": "0 хиљ'.' ¤", + "1000-count-other": "0 хиљ'.' ¤", + "10000-count-one": "00 хиљ'.' ¤", + "10000-count-few": "00 хиљ'.' ¤", + "10000-count-other": "00 хиљ'.' ¤", + "100000-count-one": "000 хиљ'.' ¤", + "100000-count-few": "000 хиљ'.' ¤", + "100000-count-other": "000 хиљ'.' ¤", + "1000000-count-one": "0 мил'.' ¤", + "1000000-count-few": "0 мил'.' ¤", + "1000000-count-other": "0 мил'.' ¤", + "10000000-count-one": "00 мил'.' ¤", + "10000000-count-few": "00 мил'.' ¤", + "10000000-count-other": "00 мил'.' ¤", + "100000000-count-one": "000 мил'.' ¤", + "100000000-count-few": "000 мил'.' ¤", + "100000000-count-other": "000 мил'.' ¤", + "1000000000-count-one": "0 млрд'.' ¤", + "1000000000-count-few": "0 млрд'.' ¤", + "1000000000-count-other": "0 млрд'.' ¤", + "10000000000-count-one": "00 млрд'.' ¤", + "10000000000-count-few": "00 млрд'.' ¤", + "10000000000-count-other": "00 млрд'.' ¤", + "100000000000-count-one": "000 млрд'.' ¤", + "100000000000-count-few": "000 млрд'.' ¤", + "100000000000-count-other": "000 млрд'.' ¤", + "1000000000000-count-one": "0 бил'.' ¤", + "1000000000000-count-few": "0 бил'.' ¤", + "1000000000000-count-other": "0 бил'.' ¤", + "10000000000000-count-one": "00 бил'.' ¤", + "10000000000000-count-few": "00 бил'.' ¤", + "10000000000000-count-other": "00 бил'.' ¤", + "100000000000000-count-one": "000 бил'.' ¤", + "100000000000000-count-few": "000 бил'.' ¤", + "100000000000000-count-other": "000 бил'.' ¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-few": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "≥{0}", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "{0} сат", + "pluralMinimalPairs-count-few": "{0} сата", + "pluralMinimalPairs-count-other": "{0} сати", + "other": "Скрените у {0}. десно." + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/th/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/th/numbers.json new file mode 100644 index 00000000000..6fe54155e7d --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/th/numbers.json @@ -0,0 +1,213 @@ +{ + "main": { + "th": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "th" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "thai" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "symbols-numberSystem-thai": { + "decimal": ".", + "group": ",", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0 พัน", + "10000-count-other": "0 หมื่น", + "100000-count-other": "0 แสน", + "1000000-count-other": "0 ล้าน", + "10000000-count-other": "00 ล้าน", + "100000000-count-other": "000 ล้าน", + "1000000000-count-other": "0 พันล้าน", + "10000000000-count-other": "0 หมื่นล้าน", + "100000000000-count-other": "0 แสนล้าน", + "1000000000000-count-other": "0 ล้านล้าน", + "10000000000000-count-other": "00 ล้านล้าน", + "100000000000000-count-other": "000 ล้านล้าน" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0B", + "10000000000-count-other": "00B", + "100000000000-count-other": "000B", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + } + }, + "decimalFormats-numberSystem-thai": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-other": "0 พัน", + "10000-count-other": "0 หมื่น", + "100000-count-other": "0 แสน", + "1000000-count-other": "0 ล้าน", + "10000000-count-other": "00 ล้าน", + "100000000-count-other": "000 ล้าน", + "1000000000-count-other": "0 พันล้าน", + "10000000000-count-other": "0 หมื่นล้าน", + "100000000000-count-other": "0 แสนล้าน", + "1000000000000-count-other": "0 ล้านล้าน", + "10000000000000-count-other": "00 ล้านล้าน", + "100000000000000-count-other": "000 ล้านล้าน" + } + }, + "short": { + "decimalFormat": { + "1000-count-other": "0K", + "10000-count-other": "00K", + "100000-count-other": "000K", + "1000000-count-other": "0M", + "10000000-count-other": "00M", + "100000000-count-other": "000M", + "1000000000-count-other": "0B", + "10000000000-count-other": "00B", + "100000000000-count-other": "000B", + "1000000000000-count-other": "0T", + "10000000000000-count-other": "00T", + "100000000000000-count-other": "000T" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "scientificFormats-numberSystem-thai": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "#,##0%" + }, + "percentFormats-numberSystem-thai": { + "standard": "#,##0%" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤#,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-other": "¤0K", + "10000-count-other": "¤00K", + "100000-count-other": "¤000K", + "1000000-count-other": "¤0M", + "10000000-count-other": "¤00M", + "100000000-count-other": "¤000M", + "1000000000-count-other": "¤0B", + "10000000000-count-other": "¤00B", + "100000000000-count-other": "¤000B", + "1000000000000-count-other": "¤0T", + "10000000000000-count-other": "¤00T", + "100000000000000-count-other": "¤000T" + } + }, + "unitPattern-count-other": "{0} {1}" + }, + "currencyFormats-numberSystem-thai": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤#,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-other": "¤0K", + "10000-count-other": "¤00K", + "100000-count-other": "¤000K", + "1000000-count-other": "¤0M", + "10000000-count-other": "¤00M", + "100000000-count-other": "¤000M", + "1000000000-count-other": "¤0B", + "10000000000-count-other": "¤00B", + "100000000000-count-other": "¤000B", + "1000000000000-count-other": "¤0T", + "10000000000000-count-other": "¤00T", + "100000000000000-count-other": "¤000T" + } + }, + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}-{1}" + }, + "miscPatterns-numberSystem-thai": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}-{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-other": "{0} วัน", + "other": "เลี้ยวขวาที่ทางเลี้ยวที่ {0}" + } + } + } + } +} diff --git a/resources/testdata/data/cldr/cldr-numbers-full/main/tr/numbers.json b/resources/testdata/data/cldr/cldr-numbers-full/main/tr/numbers.json new file mode 100644 index 00000000000..7615bf86d43 --- /dev/null +++ b/resources/testdata/data/cldr/cldr-numbers-full/main/tr/numbers.json @@ -0,0 +1,156 @@ +{ + "main": { + "tr": { + "identity": { + "version": { + "_cldrVersion": "38" + }, + "language": "tr" + }, + "numbers": { + "defaultNumberingSystem": "latn", + "otherNumberingSystems": { + "native": "latn" + }, + "minimumGroupingDigits": "1", + "symbols-numberSystem-latn": { + "decimal": ",", + "group": ".", + "list": ";", + "percentSign": "%", + "plusSign": "+", + "minusSign": "-", + "approximatelySign": "~", + "exponential": "E", + "superscriptingExponent": "×", + "perMille": "‰", + "infinity": "∞", + "nan": "NaN", + "timeSeparator": ":" + }, + "decimalFormats-numberSystem-latn": { + "standard": "#,##0.###", + "long": { + "decimalFormat": { + "1000-count-one": "0 bin", + "1000-count-other": "0 bin", + "10000-count-one": "00 bin", + "10000-count-other": "00 bin", + "100000-count-one": "000 bin", + "100000-count-other": "000 bin", + "1000000-count-one": "0 milyon", + "1000000-count-other": "0 milyon", + "10000000-count-one": "00 milyon", + "10000000-count-other": "00 milyon", + "100000000-count-one": "000 milyon", + "100000000-count-other": "000 milyon", + "1000000000-count-one": "0 milyar", + "1000000000-count-other": "0 milyar", + "10000000000-count-one": "00 milyar", + "10000000000-count-other": "00 milyar", + "100000000000-count-one": "000 milyar", + "100000000000-count-other": "000 milyar", + "1000000000000-count-one": "0 trilyon", + "1000000000000-count-other": "0 trilyon", + "10000000000000-count-one": "00 trilyon", + "10000000000000-count-other": "00 trilyon", + "100000000000000-count-one": "000 trilyon", + "100000000000000-count-other": "000 trilyon" + } + }, + "short": { + "decimalFormat": { + "1000-count-one": "0 B", + "1000-count-other": "0 B", + "10000-count-one": "00 B", + "10000-count-other": "00 B", + "100000-count-one": "000 B", + "100000-count-other": "000 B", + "1000000-count-one": "0 Mn", + "1000000-count-other": "0 Mn", + "10000000-count-one": "00 Mn", + "10000000-count-other": "00 Mn", + "100000000-count-one": "000 Mn", + "100000000-count-other": "000 Mn", + "1000000000-count-one": "0 Mr", + "1000000000-count-other": "0 Mr", + "10000000000-count-one": "00 Mr", + "10000000000-count-other": "00 Mr", + "100000000000-count-one": "000 Mr", + "100000000000-count-other": "000 Mr", + "1000000000000-count-one": "0 Tn", + "1000000000000-count-other": "0 Tn", + "10000000000000-count-one": "00 Tn", + "10000000000000-count-other": "00 Tn", + "100000000000000-count-one": "000 Tn", + "100000000000000-count-other": "000 Tn" + } + } + }, + "scientificFormats-numberSystem-latn": { + "standard": "#E0" + }, + "percentFormats-numberSystem-latn": { + "standard": "%#,##0" + }, + "currencyFormats-numberSystem-latn": { + "currencySpacing": { + "beforeCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + }, + "afterCurrency": { + "currencyMatch": "[[:^S:]&[:^Z:]]", + "surroundingMatch": "[:digit:]", + "insertBetween": " " + } + }, + "standard": "¤#,##0.00", + "accounting": "¤#,##0.00;(¤#,##0.00)", + "short": { + "standard": { + "1000-count-one": "0 B ¤", + "1000-count-other": "0 B ¤", + "10000-count-one": "00 B ¤", + "10000-count-other": "00 B ¤", + "100000-count-one": "000 B ¤", + "100000-count-other": "000 B ¤", + "1000000-count-one": "0 Mn ¤", + "1000000-count-other": "0 Mn ¤", + "10000000-count-one": "00 Mn ¤", + "10000000-count-other": "00 Mn ¤", + "100000000-count-one": "000 Mn ¤", + "100000000-count-other": "000 Mn ¤", + "1000000000-count-one": "0 Mr ¤", + "1000000000-count-other": "0 Mr ¤", + "10000000000-count-one": "00 Mr ¤", + "10000000000-count-other": "00 Mr ¤", + "100000000000-count-one": "000 Mr ¤", + "100000000000-count-other": "000 Mr ¤", + "1000000000000-count-one": "0 Tn ¤", + "1000000000000-count-other": "0 Tn ¤", + "10000000000000-count-one": "00 Tn ¤", + "10000000000000-count-other": "00 Tn ¤", + "100000000000000-count-one": "000 Tn ¤", + "100000000000000-count-other": "000 Tn ¤" + } + }, + "unitPattern-count-one": "{0} {1}", + "unitPattern-count-other": "{0} {1}" + }, + "miscPatterns-numberSystem-latn": { + "approximately": "~{0}", + "atLeast": "{0}+", + "atMost": "≤{0}", + "range": "{0}–{1}" + }, + "minimalPairs": { + "pluralMinimalPairs-count-one": "Sepetinizde {0} X var. Bunu almak istiyor musunuz?", + "pluralMinimalPairs-count-other": "Sepetinizde {0} X var. Bunları almak istiyor musunuz?", + "other": "{0}. sağdan dönün." + } + } + } + } +} From 8d0f8d7b480a60e59f438d5eac99b0e9a2c9846e Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 11 Mar 2021 23:29:45 -0600 Subject: [PATCH 09/18] Checkpoint --- .../src/transform/numbers/cldr_serde.rs | 2 +- .../src/transform/numbers/mod.rs | 27 +++++-------------- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs index edc16599587..59eb67fe697 100644 --- a/components/provider_cldr/src/transform/numbers/cldr_serde.rs +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -58,7 +58,7 @@ pub mod numbers_json { // Key is of the form: "symbols-numberSystem-latn" let mut key_it = key.split('-'); let stype = key_it.next(); - let numsys: Option> = key_it.nth(2).map(|s| { + let numsys: Option> = key_it.nth(1).map(|s| { s.parse().map_err(|_| { M::Error::invalid_value( Unexpected::Str(&key), diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index ab33549d6d1..6639cc08eb5 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -132,22 +132,19 @@ impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { #[test] fn test_basic() { - // use icu_locid_macros::langid; - // use std::borrow::Cow; + use icu_locid_macros::langid; + use std::borrow::Cow; - // let json_str = std::fs::read_to_string("tests/testdata/my-numbers.json").unwrap(); - /* - let provider = NumbersProvider::try_from(json_str.as_str()).unwrap(); + let cldr_paths = crate::cldr_paths::for_test(); + let provider = NumbersProvider::try_from(&cldr_paths as &dyn CldrPaths).unwrap(); - println!("{:?}", provider); - - let my_decimal: Cow = provider + let ar_decimal: Cow = provider .load_payload(&DataRequest { resource_path: ResourcePath { key: key::SYMBOLS_V1, options: ResourceOptions { variant: None, - langid: Some(langid!("my")), + langid: Some(langid!("ar")), }, }, }) @@ -155,15 +152,5 @@ fn test_basic() { .take_payload() .unwrap(); - println!("{:?}", my_decimal); - - assert_eq!("srpna", cs_dates.symbols.months.format.wide.0[7]); - - assert_eq!( - "po", - cs_dates.symbols.weekdays.format.short.as_ref().unwrap().0[1] - ); - - assert_eq!("d. M. y", cs_dates.patterns.date.medium); - */ + assert_eq!(ar_decimal.decimal_separator, "٫"); } From 96ec23be89480f2ed56e772754136eb09ca8c273 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 12 Mar 2021 01:30:56 -0600 Subject: [PATCH 10/18] Checkpoint --- Cargo.lock | 1 + components/provider_cldr/Cargo.toml | 1 + .../src/transform/numbers/cldr_serde.rs | 33 +-- .../src/transform/numbers/decimal_pattern.rs | 193 ++++++++++++++++-- .../src/transform/numbers/mod.rs | 9 +- 5 files changed, 201 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c47334c4e0..d1967c70131 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -944,6 +944,7 @@ dependencies = [ "icu_plurals", "icu_provider", "icu_testdata", + "itertools 0.10.0", "json", "log", "mktemp", diff --git a/components/provider_cldr/Cargo.toml b/components/provider_cldr/Cargo.toml index bda00b8825a..04a3ea7e208 100644 --- a/components/provider_cldr/Cargo.toml +++ b/components/provider_cldr/Cargo.toml @@ -33,6 +33,7 @@ icu_plurals = { version = "0.1", path = "../plurals" } icu_datetime = { version = "0.1", path = "../datetime" } icu_locale_canonicalizer = { version = "0.1", path = "../locale_canonicalizer" } icu_decimal = { version = "0.1", path = "../decimal" } +itertools = "0.10" json = "0.12" serde = { version = "1.0", features = ["derive"] } serde-aux = "2.1.1" diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs index 59eb67fe697..00b6c0b6782 100644 --- a/components/provider_cldr/src/transform/numbers/cldr_serde.rs +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -7,6 +7,7 @@ use serde::Deserialize; use serde_aux::prelude::*; use std::collections::HashMap; use tinystr::{TinyStr8, TinyStrAuto}; +use itertools::Itertools; pub type SmallString8 = smallstr::SmallString<[u8; 8]>; @@ -56,27 +57,27 @@ pub mod numbers_json { let mut result = NumberingSystemData::default(); while let Some(key) = access.next_key::()? { // Key is of the form: "symbols-numberSystem-latn" - let mut key_it = key.split('-'); - let stype = key_it.next(); - let numsys: Option> = key_it.nth(1).map(|s| { - s.parse().map_err(|_| { - M::Error::invalid_value( - Unexpected::Str(&key), - &"numsys to be valid TinyStr8", - ) - }) - }); - match (stype, numsys) { - (Some("symbols"), Some(numsys)) => { + let (stype, _, numsys) = match key.split('-').next_tuple() { + Some(v) => v, + None => continue, // Not what we were looking for; ignore. + }; + let numsys: TinyStr8 = numsys.parse().map_err(|_| { + M::Error::invalid_value( + Unexpected::Str(&key), + &"numsys to be valid TinyStr8", + ) + })?; + match stype { + "symbols" => { let value: Symbols = access.next_value()?; - result.symbols.insert(numsys?, value); + result.symbols.insert(numsys, value); } - (Some("decimalFormats"), Some(numsys)) => { + "decimalFormats" => { let value: DecimalFormats = access.next_value()?; - result.formats.insert(numsys?, value); + result.formats.insert(numsys, value); } _ => { - // not symbols or decimalFormats: ignore silently + // not symbols or decimalFormats; ignore. } } } diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs index 56b2ff5b024..003eafe0008 100644 --- a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -5,41 +5,98 @@ use std::str::FromStr; type SmallString8 = smallstr::SmallString<[u8; 8]>; use icu_decimal::provider::AffixesV1; +use itertools::Itertools; -pub struct DecimalPatternParseResult { - pub unsigned_affixes: (SmallString8, SmallString8), - pub signed_affixes: Option<(SmallString8, SmallString8)>, +#[derive(Debug, PartialEq)] +pub enum DecimalPatternError { + NoBodyInSubpattern, + UnknownPatternBody(String), +} + +#[derive(Debug, PartialEq)] +pub struct DecimalSubPattern { + pub prefix: SmallString8, + pub suffix: SmallString8, pub primary_grouping: u8, pub secondary_grouping: u8, pub min_fraction_digits: u8, pub max_fraction_digits: u8, } -impl FromStr for DecimalPatternParseResult { - type Err = &'static str; +impl FromStr for DecimalSubPattern { + type Err = DecimalPatternError; - fn from_str(_pattern: &str) -> Result { + fn from_str(subpattern: &str) -> Result { + // Split the subpattern into prefix, body, and suffix. + // TODO: Handle quoted literals in prefix and suffix. + // i = boundary between prefix and body + // j = boundary between body and suffix + let i = subpattern.find(|c: char| match c { + '#' | '0' | ',' | '.' => true, + _ => false + }); + let i = match i { + Some(i) => i, + None => return Err(DecimalPatternError::NoBodyInSubpattern) + }; + let j = subpattern[i..].find(|c: char| match c { + '#' | '0' | ',' | '.' => false, + _ => true + }).unwrap_or_else(|| subpattern.len() - i) + i; + let prefix = &subpattern[..i]; + let body = &subpattern[i..j]; + let suffix = &subpattern[j..]; + + // For now, we expect one of a handful of pattern bodies. + // TODO: Generalize this to support all of UTS 35. + let (a, b, c, d) = match body { + "#,##0.###" => (3, 3, 0, 3), + _ => return Err(DecimalPatternError::UnknownPatternBody(body.to_string())) + }; + return Ok(Self { + prefix: prefix.into(), + suffix: suffix.into(), + primary_grouping: a, + secondary_grouping: b, + min_fraction_digits: c, + max_fraction_digits: d, + }); + } +} + +#[derive(Debug, PartialEq)] +pub struct DecimalPattern { + pub positive: DecimalSubPattern, + pub negative: Option, +} + +impl FromStr for DecimalPattern { + type Err = DecimalPatternError; + + fn from_str(pattern: &str) -> Result { // Example patterns: + // #,##0 // #,##,##0.### // #,##0.00;#,##0.00- - // TODO + // 0;0- + let (positive, negative) = match pattern.split(';').next_tuple() { + Some((u, s)) => (u.parse()?, Some(s.parse()?)), + None => (pattern.parse()?, None), + }; Ok(Self { - unsigned_affixes: ("".into(), "".into()), - signed_affixes: None, - primary_grouping: 3, - secondary_grouping: 3, - min_fraction_digits: 0, - max_fraction_digits: 3, + positive, + negative }) } } -impl DecimalPatternParseResult { +impl DecimalPattern { pub fn localize_sign(&self, sign_str: &str) -> AffixesV1 { // UTS 35: the absence of a negative pattern means a single prefixed sign let signed_affixes = self - .signed_affixes - .clone() + .negative + .as_ref() + .map(|subpattern| (subpattern.prefix.clone(), subpattern.suffix.clone())) .unwrap_or_else(|| ("-".into(), "".into())); AffixesV1 { prefix: signed_affixes.0.replace("-", sign_str).into(), @@ -47,3 +104,107 @@ impl DecimalPatternParseResult { } } } + +#[test] +fn test_basic() { + #[derive(Debug)] + struct TestCase<'s> { + pub pattern: &'s str, + pub expected: Result, + } + let cases = [ + TestCase { + pattern: "#,##0.###", + expected: Ok(DecimalPattern { + positive: DecimalSubPattern { + prefix: "".into(), + suffix: "".into(), + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }, + negative: None, + }) + }, + TestCase { + pattern: "a#,##0.###", + expected: Ok(DecimalPattern { + positive: DecimalSubPattern { + prefix: "a".into(), + suffix: "".into(), + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }, + negative: None, + }) + }, + TestCase { + pattern: "#,##0.###b", + expected: Ok(DecimalPattern { + positive: DecimalSubPattern { + prefix: "".into(), + suffix: "b".into(), + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }, + negative: None, + }) + }, + TestCase { + pattern: "aaa#,##0.###bbb", + expected: Ok(DecimalPattern { + positive: DecimalSubPattern { + prefix: "aaa".into(), + suffix: "bbb".into(), + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }, + negative: None, + }) + }, + TestCase { + pattern: "aaa#,##0.###bbb;ccc#,##0.###ddd", + expected: Ok(DecimalPattern { + positive: DecimalSubPattern { + prefix: "aaa".into(), + suffix: "bbb".into(), + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }, + negative: Some(DecimalSubPattern { + prefix: "ccc".into(), + suffix: "ddd".into(), + primary_grouping: 3, + secondary_grouping: 3, + min_fraction_digits: 0, + max_fraction_digits: 3, + }), + }) + }, + TestCase { + pattern: "xyz", + expected: Err(DecimalPatternError::NoBodyInSubpattern), + }, + TestCase { + pattern: "xyz;abc", + expected: Err(DecimalPatternError::NoBodyInSubpattern), + }, + TestCase { + pattern: "aaa#0#bbb", + expected: Err(DecimalPatternError::UnknownPatternBody("#0#".to_string())), + }, + ]; + for cas in &cases { + let actual = DecimalPattern::from_str(cas.pattern); + assert_eq!(cas.expected, actual, "Pattern: {}", cas.pattern); + } +} diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index 6639cc08eb5..0cf0093c6ca 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -98,6 +98,7 @@ impl<'d> IterableDataProvider<'d> for NumbersProvider { } impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { + // TODO: Use a more expressive error type type Error = &'static str; fn try_from(other: &cldr_serde::numbers_json::Numbers) -> Result { @@ -112,8 +113,8 @@ impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { .formats .get(&other.default_numbering_system) .ok_or("Could not find formats for default numbering system")?; - let parsed_pattern: decimal_pattern::DecimalPatternParseResult = - formats.standard.parse()?; + let parsed_pattern: decimal_pattern::DecimalPattern = + formats.standard.parse().map_err(|_| "Could not parse decimal pattern")?; Ok(Self { minus_sign_affixes: parsed_pattern.localize_sign(&symbols.minus_sign), @@ -121,8 +122,8 @@ impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { decimal_separator: symbols.decimal.clone(), grouping_separator: symbols.group.clone(), grouping_sizes: GroupingSizesV1 { - primary: parsed_pattern.primary_grouping, - secondary: parsed_pattern.secondary_grouping, + primary: parsed_pattern.positive.primary_grouping, + secondary: parsed_pattern.positive.secondary_grouping, min_grouping: other.minimum_grouping_digits, }, zero_digit: '0', // TODO From 66d9abce5746f1785c59b92f7029958f9e66a441 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 12 Mar 2021 02:16:39 -0600 Subject: [PATCH 11/18] Generating initial testdata for decimal/symbols@1 --- components/provider_cldr/src/error.rs | 4 +- .../src/transform/numbers/cldr_serde.rs | 9 +- .../src/transform/numbers/decimal_pattern.rs | 57 ++++--- .../src/transform/numbers/mod.rs | 91 +++++++++--- resources/testdata/README.md | 8 +- .../json/dates/gregory@1/en-US-posix.json | 140 ++++++++++++++++++ .../data/json/dates/gregory@1/und.json | 126 ++++++++++++++++ .../data/json/decimal/symbols@1/ar-EG.json | 18 +++ .../data/json/decimal/symbols@1/ar.json | 18 +++ .../data/json/decimal/symbols@1/bn.json | 18 +++ .../data/json/decimal/symbols@1/ccp.json | 18 +++ .../json/decimal/symbols@1/en-US-posix.json | 18 +++ .../data/json/decimal/symbols@1/en-ZA.json | 18 +++ .../data/json/decimal/symbols@1/en.json | 18 +++ .../data/json/decimal/symbols@1/es-AR.json | 18 +++ .../data/json/decimal/symbols@1/es.json | 18 +++ .../data/json/decimal/symbols@1/fr.json | 18 +++ .../data/json/decimal/symbols@1/ja.json | 18 +++ .../data/json/decimal/symbols@1/ru.json | 18 +++ .../data/json/decimal/symbols@1/sr-Cyrl.json | 18 +++ .../data/json/decimal/symbols@1/sr-Latn.json | 18 +++ .../data/json/decimal/symbols@1/sr.json | 18 +++ .../data/json/decimal/symbols@1/th.json | 18 +++ .../data/json/decimal/symbols@1/tr.json | 18 +++ .../data/json/decimal/symbols@1/und.json | 18 +++ 25 files changed, 701 insertions(+), 58 deletions(-) create mode 100644 resources/testdata/data/json/dates/gregory@1/en-US-posix.json create mode 100644 resources/testdata/data/json/dates/gregory@1/und.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/ar-EG.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/ar.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/bn.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/ccp.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/en-US-posix.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/en-ZA.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/en.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/es-AR.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/es.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/fr.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/ja.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/ru.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/sr-Cyrl.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/sr-Latn.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/sr.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/th.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/tr.json create mode 100644 resources/testdata/data/json/decimal/symbols@1/und.json diff --git a/components/provider_cldr/src/error.rs b/components/provider_cldr/src/error.rs index 4e2c6f1513a..37a86fe7b5e 100644 --- a/components/provider_cldr/src/error.rs +++ b/components/provider_cldr/src/error.rs @@ -49,7 +49,7 @@ impl> From<(serde_json::error::Error, P)> for Error { } /// To help with debugging, string errors should be paired with a locale. -/// If a path is unavailable, create the error directly: `Error::Custom(err, None)` +/// If a locale is unavailable, create the error directly: `Error::Custom(err, None)` impl> From<(String, L)> for Error { fn from(pieces: (String, L)) -> Self { Self::Custom(pieces.0, Some(pieces.1.as_ref().clone())) @@ -57,7 +57,7 @@ impl> From<(String, L)> for Error { } /// To help with debugging, string errors should be paired with a locale. -/// If a path is unavailable, create the error directly: `Error::Custom(err, None)` +/// If a locale is unavailable, create the error directly: `Error::Custom(err, None)` impl> From<(&'static str, L)> for Error { fn from(pieces: (&'static str, L)) -> Self { Self::Custom(pieces.0.to_string(), Some(pieces.1.as_ref().clone())) diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs index 00b6c0b6782..27a10832c67 100644 --- a/components/provider_cldr/src/transform/numbers/cldr_serde.rs +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -3,11 +3,11 @@ // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). use crate::cldr_langid::CldrLangID; +use itertools::Itertools; use serde::Deserialize; use serde_aux::prelude::*; use std::collections::HashMap; use tinystr::{TinyStr8, TinyStrAuto}; -use itertools::Itertools; pub type SmallString8 = smallstr::SmallString<[u8; 8]>; @@ -62,10 +62,7 @@ pub mod numbers_json { None => continue, // Not what we were looking for; ignore. }; let numsys: TinyStr8 = numsys.parse().map_err(|_| { - M::Error::invalid_value( - Unexpected::Str(&key), - &"numsys to be valid TinyStr8", - ) + M::Error::invalid_value(Unexpected::Str(&key), &"numsys to be valid TinyStr8") })?; match stype { "symbols" => { @@ -142,7 +139,7 @@ pub mod numbering_systems_json { #[derive(PartialEq, Debug, Deserialize)] pub struct SupplementalData { #[serde(rename = "numberingSystems")] - pub numbering_systems: HashMap, + pub numbering_systems: HashMap, } #[derive(PartialEq, Debug, Deserialize)] diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs index 003eafe0008..631a3c3955f 100644 --- a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -8,11 +8,20 @@ use icu_decimal::provider::AffixesV1; use itertools::Itertools; #[derive(Debug, PartialEq)] -pub enum DecimalPatternError { +pub enum Error { NoBodyInSubpattern, UnknownPatternBody(String), } +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Self::NoBodyInSubpattern => write!(f, "No body in decimal subpattern"), + Self::UnknownPatternBody(s) => write!(f, "Unknown decimal body: {}", s), + } + } +} + #[derive(Debug, PartialEq)] pub struct DecimalSubPattern { pub prefix: SmallString8, @@ -24,7 +33,7 @@ pub struct DecimalSubPattern { } impl FromStr for DecimalSubPattern { - type Err = DecimalPatternError; + type Err = Error; fn from_str(subpattern: &str) -> Result { // Split the subpattern into prefix, body, and suffix. @@ -33,16 +42,19 @@ impl FromStr for DecimalSubPattern { // j = boundary between body and suffix let i = subpattern.find(|c: char| match c { '#' | '0' | ',' | '.' => true, - _ => false + _ => false, }); let i = match i { Some(i) => i, - None => return Err(DecimalPatternError::NoBodyInSubpattern) + None => return Err(Error::NoBodyInSubpattern), }; - let j = subpattern[i..].find(|c: char| match c { - '#' | '0' | ',' | '.' => false, - _ => true - }).unwrap_or_else(|| subpattern.len() - i) + i; + let j = subpattern[i..] + .find(|c: char| match c { + '#' | '0' | ',' | '.' => false, + _ => true, + }) + .unwrap_or_else(|| subpattern.len() - i) + + i; let prefix = &subpattern[..i]; let body = &subpattern[i..j]; let suffix = &subpattern[j..]; @@ -51,7 +63,9 @@ impl FromStr for DecimalSubPattern { // TODO: Generalize this to support all of UTS 35. let (a, b, c, d) = match body { "#,##0.###" => (3, 3, 0, 3), - _ => return Err(DecimalPatternError::UnknownPatternBody(body.to_string())) + "#,##,##0.###" => (2, 3, 0, 3), + "0.######" => (0, 0, 0, 6), + _ => return Err(Error::UnknownPatternBody(body.to_string())), }; return Ok(Self { prefix: prefix.into(), @@ -71,7 +85,7 @@ pub struct DecimalPattern { } impl FromStr for DecimalPattern { - type Err = DecimalPatternError; + type Err = Error; fn from_str(pattern: &str) -> Result { // Example patterns: @@ -83,10 +97,7 @@ impl FromStr for DecimalPattern { Some((u, s)) => (u.parse()?, Some(s.parse()?)), None => (pattern.parse()?, None), }; - Ok(Self { - positive, - negative - }) + Ok(Self { positive, negative }) } } @@ -110,7 +121,7 @@ fn test_basic() { #[derive(Debug)] struct TestCase<'s> { pub pattern: &'s str, - pub expected: Result, + pub expected: Result, } let cases = [ TestCase { @@ -125,7 +136,7 @@ fn test_basic() { max_fraction_digits: 3, }, negative: None, - }) + }), }, TestCase { pattern: "a#,##0.###", @@ -139,7 +150,7 @@ fn test_basic() { max_fraction_digits: 3, }, negative: None, - }) + }), }, TestCase { pattern: "#,##0.###b", @@ -153,7 +164,7 @@ fn test_basic() { max_fraction_digits: 3, }, negative: None, - }) + }), }, TestCase { pattern: "aaa#,##0.###bbb", @@ -167,7 +178,7 @@ fn test_basic() { max_fraction_digits: 3, }, negative: None, - }) + }), }, TestCase { pattern: "aaa#,##0.###bbb;ccc#,##0.###ddd", @@ -188,19 +199,19 @@ fn test_basic() { min_fraction_digits: 0, max_fraction_digits: 3, }), - }) + }), }, TestCase { pattern: "xyz", - expected: Err(DecimalPatternError::NoBodyInSubpattern), + expected: Err(Error::NoBodyInSubpattern), }, TestCase { pattern: "xyz;abc", - expected: Err(DecimalPatternError::NoBodyInSubpattern), + expected: Err(Error::NoBodyInSubpattern), }, TestCase { pattern: "aaa#0#bbb", - expected: Err(DecimalPatternError::UnknownPatternBody("#0#".to_string())), + expected: Err(Error::UnknownPatternBody("#0#".to_string())), }, ]; for cas in &cases { diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index 0cf0093c6ca..b2312aeae52 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -10,39 +10,50 @@ use icu_decimal::provider::*; use icu_provider::prelude::*; use std::borrow::Cow; use std::convert::TryFrom; +use tinystr::TinyStr8; mod cldr_serde; mod decimal_pattern; /// All keys that this module is able to produce. -pub const ALL_KEYS: [ResourceKey; 0] = [ - // key::SYMBOLS_V1, // +pub const ALL_KEYS: [ResourceKey; 1] = [ + key::SYMBOLS_V1, // ]; /// A data provider reading from CLDR JSON plural rule files. #[derive(PartialEq, Debug)] pub struct NumbersProvider { - data: Vec<(CldrLangID, cldr_serde::numbers_json::LangNumbers)>, + numsys_data: cldr_serde::numbering_systems_json::Resource, + locale_data: Vec<(CldrLangID, cldr_serde::numbers_json::LangNumbers)>, } impl TryFrom<&dyn CldrPaths> for NumbersProvider { type Error = Error; fn try_from(cldr_paths: &dyn CldrPaths) -> Result { - let mut data = vec![]; + // Load common numbering system data: + let numsys_data: cldr_serde::numbering_systems_json::Resource = { + let path = cldr_paths + .cldr_core()? + .join("supplemental") + .join("numberingSystems.json"); + serde_json::from_reader(open_reader(&path)?).map_err(|e| (e, path))? + }; + // Load data for each locale: + let mut locale_data = vec![]; let path = cldr_paths.cldr_numbers()?.join("main"); - let locale_dirs = get_subdirectories(&path)?; - for dir in locale_dirs { let path = dir.join("numbers.json"); - let mut resource: cldr_serde::numbers_json::Resource = serde_json::from_reader(open_reader(&path)?).map_err(|e| (e, path))?; - data.append(&mut resource.main.0); + locale_data.append(&mut resource.main.0); } - Ok(Self { data }) + Ok(Self { + numsys_data, + locale_data, + }) } } @@ -58,6 +69,16 @@ impl KeyedDataProvider for NumbersProvider { } } +impl NumbersProvider { + /// Returns the zero digit for the given numbering system name + fn get_zero_digit_for_numbering_system(&self, nsname: TinyStr8) -> Option { + match self.numsys_data.supplemental.numbering_systems.get(&nsname) { + Some(ns) => ns.digits.as_ref().and_then(|s| s.chars().next()), + None => None, + } + } +} + impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { fn load_payload( &self, @@ -67,21 +88,32 @@ impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { let langid = req.try_langid()?; let cldr_langid: CldrLangID = langid.clone().into(); let numbers = match self - .data + .locale_data .binary_search_by_key(&&cldr_langid, |(lid, _)| lid) { - Ok(idx) => &self.data[idx].1.numbers, + Ok(idx) => &self.locale_data[idx].1.numbers, Err(_) => return Err(DataError::UnavailableResourceOptions(req.clone())), }; + let nsname = numbers.default_numbering_system; + + let mut result = DecimalSymbolsV1::try_from(numbers) + .map_err(|s| Error::Custom(s.to_string(), Some(langid.clone()))) + .map_err(DataError::new_resc_error)?; + result.zero_digit = self + .get_zero_digit_for_numbering_system(nsname) + .ok_or_else(|| { + Error::Custom( + format!("Could not process numbering system: {:?}", nsname), + Some(langid.clone()), + ) + }) + .map_err(DataError::new_resc_error)?; + Ok(DataResponse { metadata: DataResponseMetadata { data_langid: req.resource_path.options.langid.clone(), }, - payload: Some(Cow::Owned( - DecimalSymbolsV1::try_from(numbers) - .map_err(|s| Error::Custom(s.to_string(), Some(langid.clone()))) - .map_err(DataError::new_resc_error)?, - )), + payload: Some(Cow::Owned(result)), }) } } @@ -93,15 +125,23 @@ impl<'d> IterableDataProvider<'d> for NumbersProvider { &self, _resc_key: &ResourceKey, ) -> Result>, DataError> { - unimplemented!() + let list: Vec = self + .locale_data + .iter() + .map(|(l, _)| ResourceOptions { + variant: None, + // TODO: Avoid the clone + langid: Some(l.langid.clone()), + }) + .collect(); + Ok(Box::new(list.into_iter())) } } impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { - // TODO: Use a more expressive error type - type Error = &'static str; + type Error = Cow<'static, str>; - fn try_from(other: &cldr_serde::numbers_json::Numbers) -> Result { + fn try_from(other: &cldr_serde::numbers_json::Numbers) -> Result { // TODO(#510): Select from non-default numbering systems let symbols = other .numsys_data @@ -113,8 +153,10 @@ impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { .formats .get(&other.default_numbering_system) .ok_or("Could not find formats for default numbering system")?; - let parsed_pattern: decimal_pattern::DecimalPattern = - formats.standard.parse().map_err(|_| "Could not parse decimal pattern")?; + let parsed_pattern: decimal_pattern::DecimalPattern = formats + .standard + .parse() + .map_err(|s: decimal_pattern::Error| s.to_string())?; Ok(Self { minus_sign_affixes: parsed_pattern.localize_sign(&symbols.minus_sign), @@ -126,7 +168,7 @@ impl TryFrom<&cldr_serde::numbers_json::Numbers> for DecimalSymbolsV1 { secondary: parsed_pattern.positive.secondary_grouping, min_grouping: other.minimum_grouping_digits, }, - zero_digit: '0', // TODO + zero_digit: '\u{FFFD}', // to be filled in }) } } @@ -145,7 +187,7 @@ fn test_basic() { key: key::SYMBOLS_V1, options: ResourceOptions { variant: None, - langid: Some(langid!("ar")), + langid: Some(langid!("ar-EG")), }, }, }) @@ -154,4 +196,5 @@ fn test_basic() { .unwrap(); assert_eq!(ar_decimal.decimal_separator, "٫"); + assert_eq!(ar_decimal.zero_digit, '٠'); } diff --git a/resources/testdata/README.md b/resources/testdata/README.md index 5edfe024453..6c8df2fd715 100644 --- a/resources/testdata/README.md +++ b/resources/testdata/README.md @@ -19,13 +19,15 @@ $ ICU4X_TESTDATA_DIR=/path/to/custom/testdata cargo test From this directory, run: ```bash -$ cargo gen-testdata +$ cargo gen-testdata -v ``` -To monitor the progress, run with `-v`, `-vv`, or `-vvv`: +Use `-v`, `-vv`, or `-vvv` for different verbosities of logging. + +Use `-m generate` to generate the testdata without downloading it first: ```bash -$ cargo gen-testdata -vv +$ cargo gen-testdata -v -m generate ``` ## Generating the data with bincode diff --git a/resources/testdata/data/json/dates/gregory@1/en-US-posix.json b/resources/testdata/data/json/dates/gregory@1/en-US-posix.json new file mode 100644 index 00000000000..9f2d6455431 --- /dev/null +++ b/resources/testdata/data/json/dates/gregory@1/en-US-posix.json @@ -0,0 +1,140 @@ +{ + "symbols": { + "months": { + "format": { + "abbreviated": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ], + "narrow": [ + "J", + "F", + "M", + "A", + "M", + "J", + "J", + "A", + "S", + "O", + "N", + "D" + ], + "wide": [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ] + } + }, + "weekdays": { + "format": { + "abbreviated": [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ], + "narrow": [ + "S", + "M", + "T", + "W", + "T", + "F", + "S" + ], + "short": [ + "Su", + "Mo", + "Tu", + "We", + "Th", + "Fr", + "Sa" + ], + "wide": [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ] + } + }, + "day_periods": { + "format": { + "abbreviated": { + "am": "AM", + "pm": "PM", + "noon": "noon", + "midnight": "midnight" + }, + "narrow": { + "am": "a", + "pm": "p", + "noon": "n", + "midnight": "mi" + }, + "wide": { + "am": "AM", + "pm": "PM", + "noon": "noon", + "midnight": "midnight" + } + }, + "stand_alone": { + "narrow": { + "am": "AM", + "pm": "PM", + "noon": "noon", + "midnight": "midnight" + } + } + } + }, + "patterns": { + "date": { + "full": "EEEE, MMMM d, y", + "long": "MMMM d, y", + "medium": "MMM d, y", + "short": "M/d/yy" + }, + "time": { + "full": "h:mm:ss a zzzz", + "long": "h:mm:ss a z", + "medium": "h:mm:ss a", + "short": "h:mm a" + }, + "date_time": { + "full": "{1} 'at' {0}", + "long": "{1} 'at' {0}", + "medium": "{1}, {0}", + "short": "{1}, {0}" + } + } +} diff --git a/resources/testdata/data/json/dates/gregory@1/und.json b/resources/testdata/data/json/dates/gregory@1/und.json new file mode 100644 index 00000000000..00074b72a6b --- /dev/null +++ b/resources/testdata/data/json/dates/gregory@1/und.json @@ -0,0 +1,126 @@ +{ + "symbols": { + "months": { + "format": { + "abbreviated": [ + "M01", + "M02", + "M03", + "M04", + "M05", + "M06", + "M07", + "M08", + "M09", + "M10", + "M11", + "M12" + ], + "narrow": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12" + ], + "wide": [ + "M01", + "M02", + "M03", + "M04", + "M05", + "M06", + "M07", + "M08", + "M09", + "M10", + "M11", + "M12" + ] + } + }, + "weekdays": { + "format": { + "abbreviated": [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ], + "narrow": [ + "S", + "M", + "T", + "W", + "T", + "F", + "S" + ], + "short": [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ], + "wide": [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ] + } + }, + "day_periods": { + "format": { + "abbreviated": { + "am": "AM", + "pm": "PM" + }, + "narrow": { + "am": "AM", + "pm": "PM" + }, + "wide": { + "am": "AM", + "pm": "PM" + } + } + } + }, + "patterns": { + "date": { + "full": "y MMMM d, EEEE", + "long": "y MMMM d", + "medium": "y MMM d", + "short": "y-MM-dd" + }, + "time": { + "full": "HH:mm:ss zzzz", + "long": "HH:mm:ss z", + "medium": "HH:mm:ss", + "short": "HH:mm" + }, + "date_time": { + "full": "{1} {0}", + "long": "{1} {0}", + "medium": "{1} {0}", + "short": "{1} {0}" + } + } +} diff --git a/resources/testdata/data/json/decimal/symbols@1/ar-EG.json b/resources/testdata/data/json/decimal/symbols@1/ar-EG.json new file mode 100644 index 00000000000..e9df69c627c --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/ar-EG.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "؜-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "؜+", + "suffix": "" + }, + "decimal_separator": "٫", + "grouping_separator": "٬", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "٠" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/ar.json b/resources/testdata/data/json/decimal/symbols@1/ar.json new file mode 100644 index 00000000000..e9df69c627c --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/ar.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "؜-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "؜+", + "suffix": "" + }, + "decimal_separator": "٫", + "grouping_separator": "٬", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "٠" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/bn.json b/resources/testdata/data/json/decimal/symbols@1/bn.json new file mode 100644 index 00000000000..66813e9c4be --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/bn.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ".", + "grouping_separator": ",", + "grouping_sizes": { + "primary": 2, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "০" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/ccp.json b/resources/testdata/data/json/decimal/symbols@1/ccp.json new file mode 100644 index 00000000000..1c06c9489b9 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/ccp.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ".", + "grouping_separator": ",", + "grouping_sizes": { + "primary": 2, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "𑄶" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/en-US-posix.json b/resources/testdata/data/json/decimal/symbols@1/en-US-posix.json new file mode 100644 index 00000000000..d5ff489f473 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/en-US-posix.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ".", + "grouping_separator": ",", + "grouping_sizes": { + "primary": 0, + "secondary": 0, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/en-ZA.json b/resources/testdata/data/json/decimal/symbols@1/en-ZA.json new file mode 100644 index 00000000000..bd22f18fd02 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/en-ZA.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": " ", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/en.json b/resources/testdata/data/json/decimal/symbols@1/en.json new file mode 100644 index 00000000000..32fae7d5081 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/en.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ".", + "grouping_separator": ",", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/es-AR.json b/resources/testdata/data/json/decimal/symbols@1/es-AR.json new file mode 100644 index 00000000000..bedce1fe3ff --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/es-AR.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": ".", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 2 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/es.json b/resources/testdata/data/json/decimal/symbols@1/es.json new file mode 100644 index 00000000000..bedce1fe3ff --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/es.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": ".", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 2 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/fr.json b/resources/testdata/data/json/decimal/symbols@1/fr.json new file mode 100644 index 00000000000..93ab0136a01 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/fr.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": " ", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/ja.json b/resources/testdata/data/json/decimal/symbols@1/ja.json new file mode 100644 index 00000000000..32fae7d5081 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/ja.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ".", + "grouping_separator": ",", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/ru.json b/resources/testdata/data/json/decimal/symbols@1/ru.json new file mode 100644 index 00000000000..bd22f18fd02 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/ru.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": " ", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/sr-Cyrl.json b/resources/testdata/data/json/decimal/symbols@1/sr-Cyrl.json new file mode 100644 index 00000000000..987dae96aff --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/sr-Cyrl.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": ".", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/sr-Latn.json b/resources/testdata/data/json/decimal/symbols@1/sr-Latn.json new file mode 100644 index 00000000000..987dae96aff --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/sr-Latn.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": ".", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/sr.json b/resources/testdata/data/json/decimal/symbols@1/sr.json new file mode 100644 index 00000000000..987dae96aff --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/sr.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": ".", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/th.json b/resources/testdata/data/json/decimal/symbols@1/th.json new file mode 100644 index 00000000000..32fae7d5081 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/th.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ".", + "grouping_separator": ",", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/tr.json b/resources/testdata/data/json/decimal/symbols@1/tr.json new file mode 100644 index 00000000000..987dae96aff --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/tr.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ",", + "grouping_separator": ".", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} diff --git a/resources/testdata/data/json/decimal/symbols@1/und.json b/resources/testdata/data/json/decimal/symbols@1/und.json new file mode 100644 index 00000000000..32fae7d5081 --- /dev/null +++ b/resources/testdata/data/json/decimal/symbols@1/und.json @@ -0,0 +1,18 @@ +{ + "minus_sign_affixes": { + "prefix": "-", + "suffix": "" + }, + "plus_sign_affixes": { + "prefix": "+", + "suffix": "" + }, + "decimal_separator": ".", + "grouping_separator": ",", + "grouping_sizes": { + "primary": 3, + "secondary": 3, + "min_grouping": 1 + }, + "zero_digit": "0" +} From 3edb7f6ac4be470d11956a1d09f11d06163bab80 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 12 Mar 2021 02:25:35 -0600 Subject: [PATCH 12/18] Remove unused code --- components/provider/src/error.rs | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/components/provider/src/error.rs b/components/provider/src/error.rs index fb27b6a71c3..39b0e26da8d 100644 --- a/components/provider/src/error.rs +++ b/components/provider/src/error.rs @@ -78,31 +78,6 @@ impl From> for Error { } } -struct StringResourceError(pub String); -impl std::error::Error for StringResourceError {} -impl fmt::Debug for StringResourceError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str(&self.0) - } -} -impl fmt::Display for StringResourceError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str(&self.0) - } -} - -impl From for Error { - fn from(err: String) -> Self { - Self::Resource(Box::new(StringResourceError(err))) - } -} - -impl From<&str> for Error { - fn from(err: &str) -> Self { - Self::Resource(Box::new(StringResourceError(err.to_string()))) - } -} - impl Error { pub fn new_resc_error(err: T) -> Self where From 2768fa48d9b1a748386ed65b42295263a73dec52 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 12 Mar 2021 02:39:55 -0600 Subject: [PATCH 13/18] Run updated rust fmt --- components/provider/tests/data_provider.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/components/provider/tests/data_provider.rs b/components/provider/tests/data_provider.rs index 7683ef4599f..2619713917f 100644 --- a/components/provider/tests/data_provider.rs +++ b/components/provider/tests/data_provider.rs @@ -225,7 +225,10 @@ fn test_warehouse_owned_dyn_generic() { fn test_warehouse_owned_dyn_erased_alt() { let warehouse = get_warehouse(DATA); let response = get_payload_alt(&warehouse as &dyn ErasedDataProvider); - assert!(matches!(response, Err(DataError::UnsupportedResourceKey { .. }))); + assert!(matches!( + response, + Err(DataError::UnsupportedResourceKey { .. }) + )); } #[test] @@ -283,7 +286,10 @@ fn test_warehouse_ref_dyn_generic() { fn test_warehouse_ref_dyn_erased_alt() { let warehouse = get_warehouse(DATA); let response = get_payload_alt(&&warehouse as &dyn ErasedDataProvider); - assert!(matches!(response, Err(DataError::UnsupportedResourceKey { .. }))); + assert!(matches!( + response, + Err(DataError::UnsupportedResourceKey { .. }) + )); } #[test] From e43f2a5700b3e02a87b29bd507414a1f0bec336c Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Tue, 16 Mar 2021 16:32:02 -0500 Subject: [PATCH 14/18] Add cldr-numbers to icu4x-cldr-export --- Makefile.toml | 1 + components/provider_fs/src/bin/icu4x-cldr-export.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/Makefile.toml b/Makefile.toml index d56753eb723..dea0dece6eb 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -153,6 +153,7 @@ args = [ "--", "--cldr-core", "../../resources/testdata/data/cldr/cldr-core", "--cldr-dates", "../../resources/testdata/data/cldr/cldr-dates-full", + "--cldr-numbers", "../../resources/testdata/data/cldr/cldr-numbers-full", "--out", "../../resources/testdata/data/bincode", "--all-keys", "-s", "bincode", diff --git a/components/provider_fs/src/bin/icu4x-cldr-export.rs b/components/provider_fs/src/bin/icu4x-cldr-export.rs index d7bc8d54ce2..87744e53a4d 100644 --- a/components/provider_fs/src/bin/icu4x-cldr-export.rs +++ b/components/provider_fs/src/bin/icu4x-cldr-export.rs @@ -140,6 +140,16 @@ fn main() -> Result<(), Error> { ) .takes_value(true), ) + .arg( + Arg::with_name("CLDR_NUMBERS") + .long("cldr-numbers") + .value_name("PATH") + .help( + "Path to cldr-numbers. Ignored if '--cldr-tag' is present. \n\ + https://github.com/unicode-cldr/cldr-numbers-full", + ) + .takes_value(true), + ) .arg( Arg::with_name("KEYS") .short("k") @@ -240,6 +250,9 @@ fn main() -> Result<(), Error> { if let Some(path) = matches.value_of("CLDR_DATES") { cldr_paths_local.cldr_dates = Ok(path.into()); } + if let Some(path) = matches.value_of("CLDR_NUMBERS") { + cldr_paths_local.cldr_numbers = Ok(path.into()); + } Box::new(cldr_paths_local) }; From aa8edd73eb0931ca9a9e93df1d02aa4ec2deec62 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Wed, 24 Mar 2021 14:29:18 -0500 Subject: [PATCH 15/18] Build fixes after merging main --- components/decimal/src/provider.rs | 2 +- .../provider_cldr/src/transform/numbers/mod.rs | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/components/decimal/src/provider.rs b/components/decimal/src/provider.rs index e328170de1c..1acb9b2d34f 100644 --- a/components/decimal/src/provider.rs +++ b/components/decimal/src/provider.rs @@ -5,7 +5,7 @@ pub type SmallString8 = smallstr::SmallString<[u8; 8]>; pub mod key { - use icu_provider::{resource::ResourceKey, resource_key}; + use icu_provider::{resource_key, ResourceKey}; pub const SYMBOLS_V1: ResourceKey = resource_key!(decimal, "symbols", 1); } diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index b2312aeae52..5168469251f 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -7,6 +7,7 @@ use crate::error::Error; use crate::reader::{get_subdirectories, open_reader}; use crate::CldrPaths; use icu_decimal::provider::*; +use icu_provider::iter::{IterableDataProviderCore, KeyedDataProvider}; use icu_provider::prelude::*; use std::borrow::Cow; use std::convert::TryFrom; @@ -113,14 +114,17 @@ impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { metadata: DataResponseMetadata { data_langid: req.resource_path.options.langid.clone(), }, - payload: Some(Cow::Owned(result)), + payload: DataPayload { + cow: Some(Cow::Owned(result)), + }, }) } } -icu_provider::impl_erased!(NumbersProvider, 'd); +icu_provider::impl_dyn_provider!(NumbersProvider, DecimalSymbolsV1, ERASED, 'd, 's); +icu_provider::impl_dyn_provider!(NumbersProvider, DecimalSymbolsV1, SERDE_SE, 'd, 's); -impl<'d> IterableDataProvider<'d> for NumbersProvider { +impl<'d> IterableDataProviderCore for NumbersProvider { fn supported_options_for_key( &self, _resc_key: &ResourceKey, @@ -192,7 +196,8 @@ fn test_basic() { }, }) .unwrap() - .take_payload() + .payload + .take() .unwrap(); assert_eq!(ar_decimal.decimal_separator, "٫"); From 5483bd0cb0bb460f729830c3aa813c4a17cd0e96 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Wed, 24 Mar 2021 14:35:01 -0500 Subject: [PATCH 16/18] Clippy cleanup --- .../src/transform/numbers/decimal_pattern.rs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs index 631a3c3955f..b36ada81297 100644 --- a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -35,24 +35,19 @@ pub struct DecimalSubPattern { impl FromStr for DecimalSubPattern { type Err = Error; + #[allow(clippy::many_single_char_names)] fn from_str(subpattern: &str) -> Result { // Split the subpattern into prefix, body, and suffix. // TODO: Handle quoted literals in prefix and suffix. // i = boundary between prefix and body // j = boundary between body and suffix - let i = subpattern.find(|c: char| match c { - '#' | '0' | ',' | '.' => true, - _ => false, - }); + let i = subpattern.find(|c: char| matches!(c, '#' | '0' | ',' | '.')); let i = match i { Some(i) => i, None => return Err(Error::NoBodyInSubpattern), }; let j = subpattern[i..] - .find(|c: char| match c { - '#' | '0' | ',' | '.' => false, - _ => true, - }) + .find(|c: char| !matches!(c, '#' | '0' | ',' | '.')) .unwrap_or_else(|| subpattern.len() - i) + i; let prefix = &subpattern[..i]; @@ -67,14 +62,14 @@ impl FromStr for DecimalSubPattern { "0.######" => (0, 0, 0, 6), _ => return Err(Error::UnknownPatternBody(body.to_string())), }; - return Ok(Self { + Ok(Self { prefix: prefix.into(), suffix: suffix.into(), primary_grouping: a, secondary_grouping: b, min_fraction_digits: c, max_fraction_digits: d, - }); + }) } } From ea94199338d8720eb405e0196594688c0b047e6c Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Thu, 25 Mar 2021 03:31:46 -0500 Subject: [PATCH 17/18] Review feedback --- components/decimal/README.md | 12 +++++++ components/decimal/src/lib.rs | 14 ++++++++ components/decimal/src/provider.rs | 9 ++++- .../src/transform/numbers/cldr_serde.rs | 11 +++++- .../src/transform/numbers/decimal_pattern.rs | 11 ++++-- .../src/transform/numbers/mod.rs | 35 ++++++++++++------- 6 files changed, 75 insertions(+), 17 deletions(-) create mode 100644 components/decimal/README.md diff --git a/components/decimal/README.md b/components/decimal/README.md new file mode 100644 index 00000000000..f0e7c3c1c58 --- /dev/null +++ b/components/decimal/README.md @@ -0,0 +1,12 @@ +`icu_decimal` offers localized decimal number formatting. + +It will eventually support: + +- Plain decimal numbers +- Currencies +- Measurement units +- Compact notation + +Currently, the crate is a work in progress with extremely limited functionality. To track progress, follow this issue: + +https://github.com/unicode-org/icu4x/issues/275 diff --git a/components/decimal/src/lib.rs b/components/decimal/src/lib.rs index ae30b0d5a5c..76391572272 100644 --- a/components/decimal/src/lib.rs +++ b/components/decimal/src/lib.rs @@ -2,4 +2,18 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +//! `icu_decimal` offers localized decimal number formatting. +//! +//! It will eventually support: +//! +//! - Plain decimal numbers +//! - Currencies +//! - Measurement units +//! - Compact notation +//! +//! Currently, the crate is a work in progress with extremely limited functionality. To track +//! progress, follow this issue: +//! +//! https://github.com/unicode-org/icu4x/issues/275 + pub mod provider; diff --git a/components/decimal/src/provider.rs b/components/decimal/src/provider.rs index 1acb9b2d34f..7737612b5f3 100644 --- a/components/decimal/src/provider.rs +++ b/components/decimal/src/provider.rs @@ -2,10 +2,17 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +//! Data provider struct definitions for `icu_decimal`. +//! +//! Read more about data providers: [icu_provider] + pub type SmallString8 = smallstr::SmallString<[u8; 8]>; pub mod key { + //! Resource keys for `icu_decimal`. use icu_provider::{resource_key, ResourceKey}; + + /// Resource key: symbols used for basic decimal formatting. pub const SYMBOLS_V1: ResourceKey = resource_key!(decimal, "symbols", 1); } @@ -31,7 +38,7 @@ pub struct AffixesV1 { derive(serde::Serialize, serde::Deserialize) )] pub struct GroupingSizesV1 { - /// The size of the first group. + /// The size of the first (lowest-magnitude) group. pub primary: u8, /// The size of groups after the first group. diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs index 27a10832c67..d72b82945b3 100644 --- a/components/provider_cldr/src/transform/numbers/cldr_serde.rs +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -12,6 +12,10 @@ use tinystr::{TinyStr8, TinyStrAuto}; pub type SmallString8 = smallstr::SmallString<[u8; 8]>; pub mod numbers_json { + //! Serde structs representing CLDR JSON numbers.json files. + //! + //! Sample file: https://git.io/JYkQQ + use super::*; use serde::de::{Deserialize, Deserializer, Error, MapAccess, Unexpected, Visitor}; @@ -74,7 +78,8 @@ pub mod numbers_json { result.formats.insert(numsys, value); } _ => { - // not symbols or decimalFormats; ignore. + // When needed, consume "scientificFormats", "percentFormats", ... + // For now, ignore them. } } } @@ -117,6 +122,10 @@ pub mod numbers_json { } pub mod numbering_systems_json { + //! Serde structs representing CLDR JSON numberingSystem.json files. + //! + //! Sample file: https://git.io/JYk7T + use super::*; #[derive(PartialEq, Debug, Deserialize)] diff --git a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs index b36ada81297..7f89c62a3d6 100644 --- a/components/provider_cldr/src/transform/numbers/decimal_pattern.rs +++ b/components/provider_cldr/src/transform/numbers/decimal_pattern.rs @@ -2,6 +2,10 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +//! Functions for dealing with UTS 35 number patterns. +//! +//! Spec reference: https://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns + use std::str::FromStr; type SmallString8 = smallstr::SmallString<[u8; 8]>; use icu_decimal::provider::AffixesV1; @@ -22,6 +26,7 @@ impl std::fmt::Display for Error { } } +/// Representation of a UTS 35 number subpattern (part of a number pattern between ';'s). #[derive(Debug, PartialEq)] pub struct DecimalSubPattern { pub prefix: SmallString8, @@ -38,7 +43,7 @@ impl FromStr for DecimalSubPattern { #[allow(clippy::many_single_char_names)] fn from_str(subpattern: &str) -> Result { // Split the subpattern into prefix, body, and suffix. - // TODO: Handle quoted literals in prefix and suffix. + // TODO(#567): Handle quoted literals in prefix and suffix. // i = boundary between prefix and body // j = boundary between body and suffix let i = subpattern.find(|c: char| matches!(c, '#' | '0' | ',' | '.')); @@ -55,7 +60,7 @@ impl FromStr for DecimalSubPattern { let suffix = &subpattern[j..]; // For now, we expect one of a handful of pattern bodies. - // TODO: Generalize this to support all of UTS 35. + // TODO(#567): Generalize this to support all of UTS 35. let (a, b, c, d) = match body { "#,##0.###" => (3, 3, 0, 3), "#,##,##0.###" => (2, 3, 0, 3), @@ -73,6 +78,8 @@ impl FromStr for DecimalSubPattern { } } +/// Representation of a UTS 35 number pattern, including positive subpattern (required) and negative +/// subpattern (optional). #[derive(Debug, PartialEq)] pub struct DecimalPattern { pub positive: DecimalSubPattern, diff --git a/components/provider_cldr/src/transform/numbers/mod.rs b/components/provider_cldr/src/transform/numbers/mod.rs index 5168469251f..ca125a6608e 100644 --- a/components/provider_cldr/src/transform/numbers/mod.rs +++ b/components/provider_cldr/src/transform/numbers/mod.rs @@ -24,15 +24,15 @@ pub const ALL_KEYS: [ResourceKey; 1] = [ /// A data provider reading from CLDR JSON plural rule files. #[derive(PartialEq, Debug)] pub struct NumbersProvider { - numsys_data: cldr_serde::numbering_systems_json::Resource, - locale_data: Vec<(CldrLangID, cldr_serde::numbers_json::LangNumbers)>, + cldr_numbering_systems_data: cldr_serde::numbering_systems_json::Resource, + cldr_numbers_data: Vec<(CldrLangID, cldr_serde::numbers_json::LangNumbers)>, } impl TryFrom<&dyn CldrPaths> for NumbersProvider { type Error = Error; fn try_from(cldr_paths: &dyn CldrPaths) -> Result { // Load common numbering system data: - let numsys_data: cldr_serde::numbering_systems_json::Resource = { + let cldr_numbering_systems_data: cldr_serde::numbering_systems_json::Resource = { let path = cldr_paths .cldr_core()? .join("supplemental") @@ -41,19 +41,19 @@ impl TryFrom<&dyn CldrPaths> for NumbersProvider { }; // Load data for each locale: - let mut locale_data = vec![]; + let mut cldr_numbers_data = vec![]; let path = cldr_paths.cldr_numbers()?.join("main"); let locale_dirs = get_subdirectories(&path)?; for dir in locale_dirs { let path = dir.join("numbers.json"); let mut resource: cldr_serde::numbers_json::Resource = serde_json::from_reader(open_reader(&path)?).map_err(|e| (e, path))?; - locale_data.append(&mut resource.main.0); + cldr_numbers_data.append(&mut resource.main.0); } Ok(Self { - numsys_data, - locale_data, + cldr_numbering_systems_data, + cldr_numbers_data, }) } } @@ -71,9 +71,18 @@ impl KeyedDataProvider for NumbersProvider { } impl NumbersProvider { - /// Returns the zero digit for the given numbering system name + /// Returns the zero digit for the given numbering system name. + /// + /// All decimal numbering systems in Unicode have a contiguous set of 10 code points, starting + /// with the zero digit. For example, the zero digit for the Latin numbering system is "0", and + /// the zero digit for the Bengali numbering system is "০". fn get_zero_digit_for_numbering_system(&self, nsname: TinyStr8) -> Option { - match self.numsys_data.supplemental.numbering_systems.get(&nsname) { + match self + .cldr_numbering_systems_data + .supplemental + .numbering_systems + .get(&nsname) + { Some(ns) => ns.digits.as_ref().and_then(|s| s.chars().next()), None => None, } @@ -89,10 +98,10 @@ impl<'d> DataProvider<'d, DecimalSymbolsV1> for NumbersProvider { let langid = req.try_langid()?; let cldr_langid: CldrLangID = langid.clone().into(); let numbers = match self - .locale_data + .cldr_numbers_data .binary_search_by_key(&&cldr_langid, |(lid, _)| lid) { - Ok(idx) => &self.locale_data[idx].1.numbers, + Ok(idx) => &self.cldr_numbers_data[idx].1.numbers, Err(_) => return Err(DataError::UnavailableResourceOptions(req.clone())), }; let nsname = numbers.default_numbering_system; @@ -130,11 +139,11 @@ impl<'d> IterableDataProviderCore for NumbersProvider { _resc_key: &ResourceKey, ) -> Result>, DataError> { let list: Vec = self - .locale_data + .cldr_numbers_data .iter() .map(|(l, _)| ResourceOptions { variant: None, - // TODO: Avoid the clone + // TODO(#568): Avoid the clone langid: Some(l.langid.clone()), }) .collect(); From 395eaab25e95be99329dfdbe34eb3270d2b1d422 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Tue, 30 Mar 2021 22:59:14 -0500 Subject: [PATCH 18/18] Review feedback --- .../provider_cldr/src/transform/numbers/cldr_serde.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/provider_cldr/src/transform/numbers/cldr_serde.rs b/components/provider_cldr/src/transform/numbers/cldr_serde.rs index d72b82945b3..7cdb61e45a0 100644 --- a/components/provider_cldr/src/transform/numbers/cldr_serde.rs +++ b/components/provider_cldr/src/transform/numbers/cldr_serde.rs @@ -14,7 +14,8 @@ pub type SmallString8 = smallstr::SmallString<[u8; 8]>; pub mod numbers_json { //! Serde structs representing CLDR JSON numbers.json files. //! - //! Sample file: https://git.io/JYkQQ + //! Sample file: + //! https://github.com/unicode-org/cldr-json/blob/master/cldr-json/cldr-numbers-full/main/en/numbers.json use super::*; @@ -124,7 +125,8 @@ pub mod numbers_json { pub mod numbering_systems_json { //! Serde structs representing CLDR JSON numberingSystem.json files. //! - //! Sample file: https://git.io/JYk7T + //! Sample file: + //! https://github.com/unicode-org/cldr-json/blob/master/cldr-json/cldr-core/supplemental/numberingSystems.json use super::*;