fix: parsing history dates

This commit is contained in:
ThetaDev 2025-01-18 05:51:41 +01:00
parent ff91fc0f72
commit b78adfcbc1
10 changed files with 2084 additions and 429 deletions

View file

@ -5,26 +5,25 @@ use rustypipe::{
client::RustyPipe, client::RustyPipe,
param::{Language, LANGUAGES}, param::{Language, LANGUAGES},
}; };
use serde::{Deserialize, Serialize};
use crate::util::{self, DICT_DIR}; use crate::util::{self, DICT_DIR};
type CollectedDates = BTreeMap<Language, HistoryDates>; type CollectedDates = BTreeMap<Language, BTreeMap<String, String>>;
#[derive(Debug, Serialize, Deserialize)] const THIS_WEEK: &str = "this_week";
struct HistoryDates { const LAST_WEEK: &str = "last_week";
this_week: String,
last_week: String,
}
pub async fn collect_dates() { pub async fn collect_dates_music() {
let json_path = path!(*DICT_DIR / "history_date_samples.json"); let json_path = path!(*DICT_DIR / "history_date_samples.json");
let rp = RustyPipe::builder() let rp = RustyPipe::builder()
.storage_dir("/home/thetadev/Documents/Programmieren/Rust/rustypipe") .storage_dir(path!(env!("CARGO_MANIFEST_DIR") / ".."))
.build() .build()
.unwrap(); .unwrap();
let mut res: CollectedDates = BTreeMap::new(); let mut res: CollectedDates = {
let json_file = File::open(&json_path).unwrap();
serde_json::from_reader(BufReader::new(json_file)).unwrap()
};
for lang in LANGUAGES { for lang in LANGUAGES {
println!("{lang}"); println!("{lang}");
@ -34,14 +33,56 @@ pub async fn collect_dates() {
} }
// The indexes have to be adapted before running // The indexes have to be adapted before running
let d = HistoryDates { let entry = res.entry(lang).or_default();
this_week: history.items[0].playback_date_txt.clone().unwrap(), entry.insert(
last_week: history.items[18].playback_date_txt.clone().unwrap(), THIS_WEEK.to_owned(),
}; history.items[0].playback_date_txt.clone().unwrap(),
res.insert(lang, d); );
entry.insert(
LAST_WEEK.to_owned(),
history.items[18].playback_date_txt.clone().unwrap(),
);
} }
let file = File::create(json_path).unwrap(); let file = File::create(&json_path).unwrap();
serde_json::to_writer_pretty(file, &res).unwrap();
}
pub async fn collect_dates() {
let json_path = path!(*DICT_DIR / "history_date_samples.json");
let rp = RustyPipe::builder()
.storage_dir(path!(env!("CARGO_MANIFEST_DIR") / ".."))
.build()
.unwrap();
let mut res: CollectedDates = {
let json_file = File::open(&json_path).unwrap();
serde_json::from_reader(BufReader::new(json_file)).unwrap()
};
for lang in LANGUAGES {
println!("{lang}");
let history = rp.query().lang(lang).history().await.unwrap();
if history.items.len() < 3 {
panic!("{lang} empty history")
}
let entry = res.entry(lang).or_default();
entry.insert(
"tuesday".to_owned(),
history.items[0].playback_date_txt.clone().unwrap(),
);
entry.insert(
"0000-01-06".to_owned(),
history.items[1].playback_date_txt.clone().unwrap(),
);
entry.insert(
"2024-12-28".to_owned(),
history.items[15].playback_date_txt.clone().unwrap(),
);
}
let file = File::create(&json_path).unwrap();
serde_json::to_writer_pretty(file, &res).unwrap(); serde_json::to_writer_pretty(file, &res).unwrap();
} }
@ -59,10 +100,10 @@ pub fn write_samples_to_dict() {
let cd = &collected_dates[&lang]; let cd = &collected_dates[&lang];
dict_entry dict_entry
.timeago_nd_tokens .timeago_nd_tokens
.insert(util::filter_datestr(&cd.this_week), "0Wl".to_owned()); .insert(util::filter_datestr(&cd[THIS_WEEK]), "0Wl".to_owned());
dict_entry dict_entry
.timeago_nd_tokens .timeago_nd_tokens
.insert(util::filter_datestr(&cd.last_week), "1Wl".to_owned()); .insert(util::filter_datestr(&cd[LAST_WEEK]), "1Wl".to_owned());
} }
util::write_dict(dict); util::write_dict(dict);

View file

@ -45,7 +45,7 @@ pub fn generate_dictionary() {
use crate::{ use crate::{
model::AlbumType, model::AlbumType,
param::Language, param::Language,
util::timeago::{DateCmp, TaToken, TimeUnit}, util::timeago::{TaToken, TimeUnit},
}; };
/// Dictionary entry containing language-specific parsing information /// Dictionary entry containing language-specific parsing information
@ -57,14 +57,13 @@ pub(crate) struct Entry {
/// Identifiers: `Y`(ear), `M`(month), `W`(eek), `D`(ay), /// Identifiers: `Y`(ear), `M`(month), `W`(eek), `D`(ay),
/// `h`(our), `m`(inute), `s`(econd) /// `h`(our), `m`(inute), `s`(econd)
pub timeago_tokens: phf::Map<&'static str, TaToken>, pub timeago_tokens: phf::Map<&'static str, TaToken>,
/// Order in which to parse numeric date components. Formatted as /// True if the month has to be parsed before the day
/// a string of date identifiers (Y, M, D).
/// ///
/// Examples: /// Examples:
/// ///
/// - 03.01.2020 => `"DMY"` /// - 03.01.2020 => DMY => false
/// - Jan 3, 2020 => `"DY"` /// - 01/03/2020 => MDY => true
pub date_order: &'static [DateCmp], pub month_before_day: bool,
/// Tokens for parsing month names. /// Tokens for parsing month names.
/// ///
/// Format: Parsed token -> Month number (starting from 1) /// Format: Parsed token -> Month number (starting from 1)
@ -139,13 +138,6 @@ pub(crate) fn entry(lang: Language) -> Entry {
}; };
}); });
// Date order
let mut date_order = "&[".to_owned();
entry.date_order.chars().for_each(|c| {
write!(date_order, "DateCmp::{c}, ").unwrap();
});
date_order = date_order.trim_end_matches([' ', ',']).to_owned() + "]";
// Number tokens // Number tokens
let mut number_tokens = phf_codegen::Map::<&str>::new(); let mut number_tokens = phf_codegen::Map::<&str>::new();
entry.number_tokens.iter().for_each(|(txt, mag)| { entry.number_tokens.iter().for_each(|(txt, mag)| {
@ -186,8 +178,8 @@ pub(crate) fn entry(lang: Language) -> Entry {
.to_string() .to_string()
.replace('\n', "\n "); .replace('\n', "\n ");
write!(code_timeago_tokens, "{} => Entry {{\n timeago_tokens: {},\n date_order: {},\n months: {},\n timeago_nd_tokens: {},\n comma_decimal: {:?},\n number_tokens: {},\n number_nd_tokens: {},\n album_types: {},\n chan_prefix: {:?},\n chan_suffix: {:?},\n }},\n ", write!(code_timeago_tokens, "{} => Entry {{\n timeago_tokens: {},\n month_before_day: {:?},\n months: {},\n timeago_nd_tokens: {},\n comma_decimal: {:?},\n number_tokens: {},\n number_nd_tokens: {},\n album_types: {},\n chan_prefix: {:?},\n chan_suffix: {:?},\n }},\n ",
selector, code_ta_tokens, date_order, code_months, code_ta_nd_tokens, entry.comma_decimal, code_number_tokens, code_number_nd_tokens, code_album_types, entry.chan_prefix, entry.chan_suffix).unwrap(); selector, code_ta_tokens, entry.month_before_day, code_months, code_ta_nd_tokens, entry.comma_decimal, code_number_tokens, code_number_nd_tokens, code_album_types, entry.chan_prefix, entry.chan_suffix).unwrap();
} }
code_timeago_tokens = code_timeago_tokens.trim_end().to_owned() + "\n }\n}\n"; code_timeago_tokens = code_timeago_tokens.trim_end().to_owned() + "\n }\n}\n";

View file

@ -32,6 +32,7 @@ enum Commands {
CollectVideoDurations, CollectVideoDurations,
CollectVideoDates, CollectVideoDates,
CollectHistoryDates, CollectHistoryDates,
CollectMusicHistoryDates,
CollectChanPrefixes, CollectChanPrefixes,
ParsePlaylistDates, ParsePlaylistDates,
ParseHistoryDates, ParseHistoryDates,
@ -74,6 +75,9 @@ async fn main() {
Commands::CollectHistoryDates => { Commands::CollectHistoryDates => {
collect_history_dates::collect_dates().await; collect_history_dates::collect_dates().await;
} }
Commands::CollectMusicHistoryDates => {
collect_history_dates::collect_dates_music().await;
}
Commands::CollectChanPrefixes => { Commands::CollectChanPrefixes => {
collect_chan_prefixes::collect_chan_prefixes().await; collect_chan_prefixes::collect_chan_prefixes().await;
} }

View file

@ -13,6 +13,13 @@ pub struct DictEntry {
/// Should the language be parsed by character instead of by word? /// Should the language be parsed by character instead of by word?
/// (e.g. Chinese/Japanese) /// (e.g. Chinese/Japanese)
pub by_char: bool, pub by_char: bool,
/// True if the month has to be parsed before the day
///
/// Examples:
///
/// - 03.01.2020 => DMY => false
/// - 01/03/2020 => MDY => true
pub month_before_day: bool,
/// Tokens for parsing timeago strings. /// Tokens for parsing timeago strings.
/// ///
/// Format: Parsed token -> \[Quantity\] Identifier /// Format: Parsed token -> \[Quantity\] Identifier

View file

@ -8,7 +8,7 @@
use crate::{ use crate::{
model::AlbumType, model::AlbumType,
param::Language, param::Language,
util::timeago::{DateCmp, TaToken, TimeUnit}, util::timeago::{TaToken, TimeUnit},
}; };
/// Dictionary entry containing language-specific parsing information /// Dictionary entry containing language-specific parsing information
@ -20,14 +20,13 @@ pub(crate) struct Entry {
/// Identifiers: `Y`(ear), `M`(month), `W`(eek), `D`(ay), /// Identifiers: `Y`(ear), `M`(month), `W`(eek), `D`(ay),
/// `h`(our), `m`(inute), `s`(econd) /// `h`(our), `m`(inute), `s`(econd)
pub timeago_tokens: phf::Map<&'static str, TaToken>, pub timeago_tokens: phf::Map<&'static str, TaToken>,
/// Order in which to parse numeric date components. Formatted as /// True if the month has to be parsed before the day
/// a string of date identifiers (Y, M, D).
/// ///
/// Examples: /// Examples:
/// ///
/// - 03.01.2020 => `"DMY"` /// - 03.01.2020 => DMY => false
/// - Jan 3, 2020 => `"DY"` /// - 01/03/2020 => MDY => true
pub date_order: &'static [DateCmp], pub month_before_day: bool,
/// Tokens for parsing month names. /// Tokens for parsing month names.
/// ///
/// Format: Parsed token -> Month number (starting from 1) /// Format: Parsed token -> Month number (starting from 1)
@ -89,7 +88,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("jaar", TaToken { n: 1, unit: Some(TimeUnit::Year) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 12213676231523076107, key: 12213676231523076107,
disps: &[ disps: &[
@ -216,7 +215,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ቀናት", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("ቀናት", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -360,7 +359,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("دقائق", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("دقائق", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -464,27 +463,35 @@ pub(crate) fn entry(lang: Language) -> Entry {
("মিনিট", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("মিনিট", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
(3, 11), (1, 0),
(2, 2), (13, 15),
(0, 0), (3, 15),
(0, 15),
], ],
entries: &[ entries: &[
("ছেপ\u{9cd}তেম\u{9cd}বৰ", 9), ("ফেব\u{9cd}\u{9c1}", 2),
("\u{9be}\u{9c1}\u{9be}ৰী", 1),
("আগষ\u{9cd}", 8),
("মে’", 5),
("অক\u{9cd}টোবৰ", 10),
("এপ\u{9cd}ৰিল", 4),
("ডিচেম\u{9cd}বৰ", 12),
("ফেব\u{9cd}\u{9c1}\u{9be}ৰী", 2),
("\u{9c1}", 6),
("\u{9be}\u{9cd}", 3), ("\u{9be}\u{9cd}", 3),
("\u{9c1}\u{9be}", 7), ("ডিচেম\u{9cd}বৰ", 12),
("নৱেম\u{9cd}বৰ", 11), ("নৱেম\u{9cd}বৰ", 11),
("ডিচে", 12),
("নৱে", 11),
("এপ\u{9cd}ৰিল", 4),
("\u{9c1}\u{9be}", 7),
("ফেব\u{9cd}\u{9c1}\u{9be}ৰী", 2),
("মে’", 5),
("\u{9be}\u{9c1}\u{9be}ৰী", 1),
("ছেপ\u{9cd}তে", 9),
("আগ", 8),
("আগষ\u{9cd}", 8),
("ছেপ\u{9cd}তেম\u{9cd}বৰ", 9),
("\u{9c1}", 6),
("অক\u{9cd}টো", 10),
("\u{9be}\u{9c1}", 1),
("অক\u{9cd}টোবৰ", 10),
], ],
}, },
timeago_nd_tokens: ::phf::Map { timeago_nd_tokens: ::phf::Map {
@ -580,7 +587,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ay", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ay", TaToken { n: 1, unit: Some(TimeUnit::Month) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -724,7 +731,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("хвіліна", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("хвіліна", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -855,7 +862,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("седмици", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -956,7 +963,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("সেকেন\u{9cd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("সেকেন\u{9cd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -1097,7 +1104,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("sedmice", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("sedmice", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -1225,7 +1232,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("setmana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("setmana", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -1367,7 +1374,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("minuta", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -1478,7 +1485,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("dage", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dage", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -1602,27 +1609,36 @@ pub(crate) fn entry(lang: Language) -> Entry {
("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sek", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 12913932095322966823,
disps: &[ disps: &[
(0, 0), (0, 0),
(1, 8), (17, 15),
(0, 3), (3, 6),
(5, 10),
], ],
entries: &[ entries: &[
("januar", 1), ("sept", 9),
("august", 8),
("februar", 2),
("dezember", 12),
("oktober", 10),
("september", 9),
("november", 11),
("juli", 7),
("juni", 6),
("april", 4),
("mai", 5),
("märz", 3), ("märz", 3),
("mai", 5),
("september", 9),
("dez", 12),
("apr", 4),
("august", 8),
("april", 4),
("oktober", 10),
("aug", 8),
("februar", 2),
("juli", 7),
("dezember", 12),
("nov", 11),
("feb", 2),
("okt", 10),
("juni", 6),
("november", 11),
("januar", 1),
("jan", 1),
], ],
}, },
timeago_nd_tokens: ::phf::Map { timeago_nd_tokens: ::phf::Map {
@ -1717,7 +1733,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("λεπτά", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("λεπτά", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -1857,7 +1873,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("second", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 351906021642186605, key: 351906021642186605,
disps: &[ disps: &[
@ -1988,7 +2004,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("meses", TaToken { n: 1, unit: Some(TimeUnit::Month) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 8602556344903797927, key: 8602556344903797927,
disps: &[ disps: &[
@ -2114,7 +2130,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("sem", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 8602556344903797927, key: 8602556344903797927,
disps: &[ disps: &[
@ -2243,7 +2259,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("päeva", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("päeva", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 11210181029210336526, key: 11210181029210336526,
disps: &[ disps: &[
@ -2356,7 +2372,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 4594751852016600049, key: 4594751852016600049,
disps: &[ disps: &[
@ -2469,7 +2485,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("دقیقه", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("دقیقه", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -2593,7 +2609,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("viikko", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("viikko", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -2697,7 +2713,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("linggo", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("linggo", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 345707026197253659, key: 345707026197253659,
disps: &[ disps: &[
@ -2826,7 +2842,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("jour", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("jour", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -2956,7 +2972,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("semana", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -3068,7 +3084,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("કલાક", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("કલાક", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -3175,7 +3191,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("\u{947}\u{902}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("\u{947}\u{902}", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -3312,7 +3328,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("g", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("g", TaToken { n: 1, unit: Some(TimeUnit::Year) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 8694567506910003252, key: 8694567506910003252,
disps: &[ disps: &[
@ -3441,7 +3457,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("órával", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("órával", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -3562,7 +3578,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ամիս", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ամիս", TaToken { n: 1, unit: Some(TimeUnit::Month) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 8694567506910003252, key: 8694567506910003252,
disps: &[ disps: &[
@ -3685,7 +3701,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("menit", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("menit", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -3814,7 +3830,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("mán", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("mán", TaToken { n: 1, unit: Some(TimeUnit::Month) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -3947,7 +3963,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("secondo", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 5516568623150984925, key: 5516568623150984925,
disps: &[ disps: &[
@ -4085,7 +4101,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("דקות", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("דקות", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -4200,7 +4216,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -4287,7 +4303,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("წმ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("წმ", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 14108922650502679131, key: 14108922650502679131,
disps: &[ disps: &[
@ -4409,7 +4425,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("мин", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 42584678569483946, key: 42584678569483946,
disps: &[ disps: &[
@ -4527,7 +4543,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("នាទ\u{17b8}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("នាទ\u{17b8}", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -4642,7 +4658,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("\u{cc6}\u{cc6}ಂಡ\u{ccd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("\u{cc6}\u{cc6}ಂಡ\u{ccd}", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 8602556344903797927, key: 8602556344903797927,
disps: &[ disps: &[
@ -4751,7 +4767,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -4837,7 +4853,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("ай", TaToken { n: 1, unit: Some(TimeUnit::Month) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 8694567506910003252, key: 8694567506910003252,
disps: &[ disps: &[
@ -4960,7 +4976,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ຊມ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("ຊມ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -5111,7 +5127,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("dieną", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dieną", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -5233,7 +5249,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ned", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("ned", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 10121458955350035957, key: 10121458955350035957,
disps: &[ disps: &[
@ -5358,27 +5374,40 @@ pub(crate) fn entry(lang: Language) -> Entry {
("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("секунди", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
(5, 0),
(4, 10), (4, 10),
(0, 10), (1, 0),
(5, 1),
(2, 0),
(20, 19),
], ],
entries: &[ entries: &[
("јул", 7),
("апр", 4),
("февруари", 2),
("јануари", 1),
("мар", 3),
("јан", 1),
("септември", 9),
("јун", 6),
("август", 8),
("сеп", 9),
("фев", 2),
("јули", 7),
("април", 4),
("ное", 11),
("окт", 10),
("ноември", 11), ("ноември", 11),
("март", 3), ("март", 3),
("декември", 12), ("авг", 8),
("октомври", 10),
("мај", 5), ("мај", 5),
("октомври", 10),
("јуни", 6), ("јуни", 6),
("август", 8), ("дек", 12),
("април", 4), ("декември", 12),
("јануари", 1),
("јули", 7),
("септември", 9),
("февруари", 2),
], ],
}, },
timeago_nd_tokens: ::phf::Map { timeago_nd_tokens: ::phf::Map {
@ -5463,7 +5492,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("സെക\u{d4d}കൻഡ\u{d4d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("സെക\u{d4d}കൻഡ\u{d4d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -5581,7 +5610,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("секундын", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("секундын", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 14108922650502679131, key: 14108922650502679131,
disps: &[ disps: &[
@ -5594,10 +5623,10 @@ pub(crate) fn entry(lang: Language) -> Entry {
("долоодугаар", 7), ("долоодугаар", 7),
("тавдугаар", 5), ("тавдугаар", 5),
("аравдугаар", 10), ("аравдугаар", 10),
("хоёрдугаар", 12), ("хоёрдугаар", 2),
("дөрөвдүгээр", 4), ("дөрөвдүгээр", 4),
("зургаадугаар", 6), ("зургаадугаар", 6),
("нэгдүгээр", 11), ("нэгдүгээр", 1),
("гуравдугаар", 3), ("гуравдугаар", 3),
], ],
}, },
@ -5693,7 +5722,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("\u{947}", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -5807,7 +5836,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("hari", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("hari", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -5918,7 +5947,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("\u{103e}\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("\u{103e}\u{103a}", TaToken { n: 1, unit: Some(TimeUnit::Year) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -6036,7 +6065,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("\u{947}\u{947}\u{94d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("\u{947}\u{947}\u{94d}", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -6147,7 +6176,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("dagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dagen", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -6275,7 +6304,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("d", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -6396,7 +6425,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ସେ", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("ସେ", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -6506,7 +6535,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("\u{a70}ਟਾ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("\u{a70}ਟਾ", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -6648,7 +6677,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("roku", TaToken { n: 1, unit: Some(TimeUnit::Year) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -6777,7 +6806,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("s", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -6905,7 +6934,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dia", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -7018,7 +7047,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("ani", TaToken { n: 1, unit: Some(TimeUnit::Year) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -7162,7 +7191,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("секунда", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -7277,7 +7306,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("\u{dd2}", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("\u{dd2}", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -7415,7 +7444,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("dňa", TaToken { n: 1, unit: Some(TimeUnit::Day) }), ("dňa", TaToken { n: 1, unit: Some(TimeUnit::Day) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 10121458955350035957, key: 10121458955350035957,
disps: &[ disps: &[
@ -7551,7 +7580,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("meseci", TaToken { n: 1, unit: Some(TimeUnit::Month) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 15467950696543387533,
disps: &[ disps: &[
@ -7671,7 +7700,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("orë", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("orë", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -7803,27 +7832,38 @@ pub(crate) fn entry(lang: Language) -> Entry {
("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("сек", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 10121458955350035957, key: 15467950696543387533,
disps: &[ disps: &[
(2, 8), (0, 18),
(1, 0), (0, 4),
(0, 0), (2, 0),
(2, 0),
(3, 16),
], ],
entries: &[ entries: &[
("мај", 5), ("мај", 5),
("феб", 2),
("мар", 3),
("јануар", 1), ("јануар", 1),
("окт", 10),
("дец", 12),
("август", 8), ("август", 8),
("март", 3), ("март", 3),
("фебруар", 2),
("новембар", 11),
("јун", 6), ("јун", 6),
("октобар", 10),
("април", 4),
("децембар", 12),
("јул", 7), ("јул", 7),
("нов", 11),
("сеп", 9),
("април", 4),
("јан", 1),
("октобар", 10),
("септембар", 9), ("септембар", 9),
("апр", 4),
("авг", 8),
("новембар", 11),
("децембар", 12),
("фебруар", 2),
], ],
}, },
timeago_nd_tokens: ::phf::Map { timeago_nd_tokens: ::phf::Map {
@ -7922,27 +7962,38 @@ pub(crate) fn entry(lang: Language) -> Entry {
("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("sati", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 15467950696543387533, key: 10121458955350035957,
disps: &[ disps: &[
(1, 3), (9, 16),
(5, 11), (0, 6),
(5, 10),
(2, 5),
(0, 0), (0, 0),
], ],
entries: &[ entries: &[
("decembar", 12), ("jan", 1),
("april", 4), ("okt", 10),
("februar", 2),
("jul", 7),
("novembar", 11), ("novembar", 11),
("maj", 5),
("jun", 6),
("avgust", 8), ("avgust", 8),
("januar", 1), ("feb", 2),
("septembar", 9), ("februar", 2),
("decembar", 12),
("sep", 9),
("april", 4),
("jul", 7),
("dec", 12),
("mar", 3),
("jun", 6),
("nov", 11),
("oktobar", 10), ("oktobar", 10),
("avg", 8),
("apr", 4),
("septembar", 9),
("mart", 3), ("mart", 3),
("maj", 5),
("januar", 1),
], ],
}, },
timeago_nd_tokens: ::phf::Map { timeago_nd_tokens: ::phf::Map {
@ -8037,7 +8088,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("sekund", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 10121458955350035957, key: 10121458955350035957,
disps: &[ disps: &[
@ -8147,7 +8198,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("miaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("miaka", TaToken { n: 1, unit: Some(TimeUnit::Year) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -8277,7 +8328,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("நிமிடத\u{bcd}திற\u{bcd}கு", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -8403,7 +8454,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("సంవత\u{c4d}సర\u{c3e}", TaToken { n: 1, unit: Some(TimeUnit::Year) }), ("సంవత\u{c4d}సర\u{c3e}", TaToken { n: 1, unit: Some(TimeUnit::Year) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -8526,7 +8577,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("เด\u{e37}อนท\u{e35}\u{e48}แล\u{e49}", TaToken { n: 1, unit: Some(TimeUnit::Month) }), ("เด\u{e37}อนท\u{e35}\u{e48}แล\u{e49}", TaToken { n: 1, unit: Some(TimeUnit::Month) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -8649,7 +8700,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("sa", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("sa", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 3599879742736855518, key: 3599879742736855518,
disps: &[ disps: &[
@ -8796,7 +8847,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("хвилина", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("хвилина", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 7485420634051515786, key: 7485420634051515786,
disps: &[ disps: &[
@ -8921,7 +8972,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("سیکنڈز", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("سیکنڈز", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 10121458955350035957, key: 10121458955350035957,
disps: &[ disps: &[
@ -9039,7 +9090,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("son", TaToken { n: 1, unit: Some(TimeUnit::Second) }), ("son", TaToken { n: 1, unit: Some(TimeUnit::Second) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -9151,7 +9202,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("tuần", TaToken { n: 1, unit: Some(TimeUnit::Week) }), ("tuần", TaToken { n: 1, unit: Some(TimeUnit::Week) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::M, DateCmp::Y], month_before_day: false,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -9232,7 +9283,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 106375038446233661, key: 106375038446233661,
disps: &[ disps: &[
@ -9330,7 +9381,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -9410,7 +9461,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("", TaToken { n: 1, unit: Some(TimeUnit::Minute) }), ("", TaToken { n: 1, unit: Some(TimeUnit::Minute) }),
], ],
}, },
date_order: &[DateCmp::Y, DateCmp::M, DateCmp::D], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 12913932095322966823, key: 12913932095322966823,
disps: &[ disps: &[
@ -9510,7 +9561,7 @@ pub(crate) fn entry(lang: Language) -> Entry {
("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }), ("emahoreni", TaToken { n: 1, unit: Some(TimeUnit::Hour) }),
], ],
}, },
date_order: &[DateCmp::D, DateCmp::Y], month_before_day: true,
months: ::phf::Map { months: ::phf::Map {
key: 2126027241312876569, key: 2126027241312876569,
disps: &[ disps: &[

View file

@ -72,12 +72,6 @@ pub struct TaToken {
pub unit: Option<TimeUnit>, pub unit: Option<TimeUnit>,
} }
pub enum DateCmp {
Y,
M,
D,
}
impl TimeUnit { impl TimeUnit {
pub fn secs(self) -> u32 { pub fn secs(self) -> u32 {
match self { match self {
@ -207,10 +201,19 @@ impl Iterator for TaTokenParser<'_> {
} }
} }
fn parse_textual_month(entry: &dictionary::Entry, filtered_str: &str) -> Option<u8> { fn parse_textual_month(lang: Language, filtered_str: &str) -> Option<u8> {
let entry = dictionary::entry(lang);
filtered_str filtered_str
.split_whitespace() .split_whitespace()
.find_map(|word| entry.months.get(word).copied()) .find_map(|word| entry.months.get(word).copied())
.map(|mon| {
// Mongolian has an extra number word that adds 10 to a month
if lang == Language::Mn && filtered_str.split_whitespace().any(|s| s == "арван") {
mon + 10
} else {
mon
}
})
} }
/// Parse a TimeAgo string (e.g. "29 minutes ago") into a TimeAgo object. /// Parse a TimeAgo string (e.g. "29 minutes ago") into a TimeAgo object.
@ -278,53 +281,49 @@ pub fn parse_textual_date(lang: Language, textual_date: &str) -> Option<ParsedDa
.or_else(|| TaTokenParser::new(&entry, by_char, false, &filtered_str).next()) .or_else(|| TaTokenParser::new(&entry, by_char, false, &filtered_str).next())
.map(ParsedDate::Relative) .map(ParsedDate::Relative)
} else { } else {
if nums.len() == 1 { if nums.len() == 1 && nums[0] < 2000 {
if let Some(timeago) = TaTokenParser::new(&entry, by_char, false, &filtered_str).next() if let Some(timeago) = TaTokenParser::new(&entry, by_char, false, &filtered_str).next()
{ {
return Some(ParsedDate::Relative(timeago * nums[0] as u8)); return Some(ParsedDate::Relative(timeago * nums[0] as u8));
} }
} }
let mut date_order = entry.date_order;
let with_day = if entry.date_order.len() == nums.len() {
true
} else if entry.date_order.len() - 1 == nums.len() {
false
} else if nums.len() == 1 {
date_order = &[DateCmp::Y];
false
} else {
return None;
};
let mut y: Option<u16> = None; let mut y: Option<u16> = None;
let mut m: Option<u16> = None; let mut m = parse_textual_month(lang, &filtered_str).map(u16::from);
let mut d: Option<u16> = None; let mut d: Option<u16> = None;
let mut i = 0; for num in nums {
for dc in date_order.iter() { if num > 31 {
match dc { if y.is_none() {
DateCmp::Y => y = Some(nums[i]), y = Some(num);
DateCmp::M => m = Some(nums[i]), } else {
DateCmp::D => { return None;
if with_day {
d = Some(nums[i]);
} else {
continue;
}
} }
} else if m.is_none() && (entry.month_before_day || d.is_some()) {
m = Some(num);
} else if d.is_none() {
d = Some(num);
} else {
return None;
} }
i += 1;
} }
if m.is_none() && d.is_some() {
if m.is_none() { m = d;
m = parse_textual_month(&entry, &filtered_str).map(u16::from); d = None;
} }
match (y, m, d) { match (y, m, d) {
(Some(y), Some(m), d) => Month::try_from(m as u8) (y, Some(m), d) => Month::try_from(m as u8)
.ok() .ok()
.and_then(|m| Date::from_calendar_date(y.into(), m, d.unwrap_or(1) as u8).ok()) .and_then(|m| {
Date::from_calendar_date(
y.map(i32::from)
.unwrap_or_else(|| OffsetDateTime::now_utc().year()),
m,
d.unwrap_or(1) as u8,
)
.ok()
})
.map(ParsedDate::Absolute), .map(ParsedDate::Absolute),
_ => None, _ => None,
} }
@ -460,7 +459,7 @@ fn split_duration_txt(txt: &str, start_word: bool) -> Vec<DurationTxtSegment> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::{collections::BTreeMap, fs::File, io::BufReader}; use std::{collections::BTreeMap, fs::File, io::BufReader, str::FromStr};
use path_macro::path; use path_macro::path;
use rstest::rstest; use rstest::rstest;
@ -911,6 +910,20 @@ mod tests {
assert_eq!(parsed_date, expect); assert_eq!(parsed_date, expect);
} }
#[rstest]
#[case(Language::En, "Jan 5", date!(0000-01-05))]
fn t_parse_date_this_year(
#[case] lang: Language,
#[case] textual_date: &str,
#[case] expect: Date,
) {
let parsed_date = parse_textual_date(lang, textual_date);
let expected_date = expect
.replace_year(OffsetDateTime::now_utc().year())
.unwrap();
assert_eq!(parsed_date, Some(ParsedDate::Absolute(expected_date)));
}
#[test] #[test]
fn t_parse_date_samples() { fn t_parse_date_samples() {
let json_path = path!(*TESTFILES / "dict" / "playlist_samples.json"); let json_path = path!(*TESTFILES / "dict" / "playlist_samples.json");
@ -1008,34 +1021,48 @@ mod tests {
#[test] #[test]
fn t_parse_history_date_samples() { fn t_parse_history_date_samples() {
#[derive(Deserialize)]
struct HistoryDates {
this_week: String,
last_week: String,
}
let json_path = path!(*TESTFILES / "dict" / "history_date_samples.json"); let json_path = path!(*TESTFILES / "dict" / "history_date_samples.json");
let json_file = File::open(json_path).unwrap(); let json_file = File::open(json_path).unwrap();
let date_samples: BTreeMap<Language, HistoryDates> = let date_samples: BTreeMap<Language, BTreeMap<String, String>> =
serde_json::from_reader(BufReader::new(json_file)).unwrap(); serde_json::from_reader(BufReader::new(json_file)).unwrap();
for (lang, samples) in date_samples { for (lang, samples) in date_samples {
assert_eq!( for (k, v) in samples {
parse_textual_date(lang, &samples.this_week), let expected = match k.as_str() {
Some(ParsedDate::Relative(TimeAgo { "this_week" => ParsedDate::Relative(TimeAgo {
n: 0, n: 0,
unit: TimeUnit::LastWeek unit: TimeUnit::LastWeek,
})), }),
"lang: {lang}" "last_week" => ParsedDate::Relative(TimeAgo {
); n: 1,
assert_eq!( unit: TimeUnit::LastWeek,
parse_textual_date(lang, &samples.last_week), }),
Some(ParsedDate::Relative(TimeAgo { _ => {
n: 1, if let Ok(wd) = time::Weekday::from_str(&k) {
unit: TimeUnit::LastWeek ParsedDate::Relative(TimeAgo {
})), n: wd.number_days_from_monday(),
"lang: {lang}" unit: TimeUnit::LastWeekday,
); })
} else {
let mut date_nums = k.split('-');
let mut y = date_nums.next().unwrap().parse::<i32>().unwrap();
if y == 0 {
y = OffsetDateTime::now_utc().date().year();
}
let m = date_nums.next().unwrap().parse::<u8>().unwrap();
let d = date_nums.next().unwrap().parse::<u8>().unwrap();
ParsedDate::Absolute(
Date::from_calendar_date(y, m.try_into().unwrap(), d).unwrap(),
)
}
}
};
assert_eq!(
parse_textual_date(lang, &v),
Some(expected),
"lang={lang}; {k}"
);
}
} }
} }

View file

@ -0,0 +1,59 @@
const fs = require("fs");
const DICT_PATH = "../dictionary.json";
function translateLang(lang) {
switch (lang) {
case "iw": // Hebrew
return "he";
case "zh-CN": // Simplified Chinese
return "zh-Hans";
case "zh-HK":
return "zh-Hant-HK";
case "zh-TW":
return "zh-Hant";
default:
return lang;
}
}
function isMonthBeforeDay(lang) {
const cldrLang = translateLang(lang);
const dates = require(`cldr-dates-modern/main/${cldrLang}/ca-gregorian.json`);
const dateFields = dates.main[cldrLang].dates.calendars.gregorian;
const dateFmt = dateFields.dateFormats.short;
const mPos = dateFmt.indexOf("M");
const dPos = dateFmt.indexOf("d");
if (mPos < 0 || dPos < 0) throw new Error(`invalid fmt for ${lang}: ${dateFmt}`);
return dPos > mPos;
}
const dict = JSON.parse(fs.readFileSync(DICT_PATH));
for (const [mainLang, entry] of Object.entries(dict)) {
const langs = [mainLang, ...entry["equivalent"]];
const dateOrder = entry["date_order"];
const mPos = dateOrder.indexOf("M");
const dPos = dateOrder.indexOf("D");
let expectMbd = mPos < 0 || dPos < 0 ? null : dPos > mPos;
if (mainLang === "en" || mainLang.startsWith("zh-")) {
expectMbd = true;
} else if (mainLang === "fr")
expectMbd = false;
else {
for (lang of langs) {
const mbd = isMonthBeforeDay(lang)
if (expectMbd === null) {
expectMbd = mbd;
} else if (mbd !== expectMbd) {
throw new Error(`unexpected mbd for ${lang}`);
}
}
}
dict[mainLang]["month_before_day"] = expectMbd;
}
fs.writeFileSync(DICT_PATH, JSON.stringify(dict, null, 2));

View file

@ -17,27 +17,46 @@ function translateLang(lang) {
} }
} }
function collectMonthNames(lang, by_char, monthNames, weekdayNames) { function collectMonthNames(lang, by_char, monthNames, monthShortNames, weekdayNames) {
const cldrLang = translateLang(lang); const cldrLang = translateLang(lang);
const dates = require(`cldr-dates-modern/main/${cldrLang}/ca-gregorian.json`); const dates = require(`cldr-dates-modern/main/${cldrLang}/ca-gregorian.json`);
const dateFields = dates.main[cldrLang].dates.calendars.gregorian; const dateFields = dates.main[cldrLang].dates.calendars.gregorian;
const months = dateFields.months["stand-alone"].wide; const months = dateFields.months["stand-alone"].wide;
for (const [n, name] of Object.entries(months)) { // Mongolian dates have the extra numbe арван and have to be handled manually
let name2 = name.toLowerCase(); if (!["mn"].includes(lang)) {
if (name2.includes(n)) { for (const [n, name] of Object.entries(months)) {
// Some languages dont have named months let name2 = name.toLowerCase();
console.log(`${lang}: month name '${name2}' includes number; skipped`); if (name2.includes(n)) {
continue; // Some languages dont have named months
console.log(`${lang}: month name '${name2}' includes number; skipped`);
continue;
}
if (/\s/g.test(name2)) {
throw new Error(`${lang}: month name '${name2}' contains whitespace`);
}
monthNames[name2] = parseInt(n);
} }
if (lang === "mn") { }
name2 = name2.replace(" сар", "").replace("арван ", "");
if (!["bg", "fi", "cs", "iw", "lt", "pt-PT", "sk"].includes(lang)) {
const monthsShort = dateFields.months.format.abbreviated;
for (const [n, name] of Object.entries(monthsShort)) {
let name2 = name.toLowerCase().replaceAll(".", "");
if (name2.includes(n)) {
// Some languages dont have named months
console.log(`${lang}: month name '${name2}' includes number; skipped`);
continue;
}
if (lang === "ca") {
name2 = name2.replace("de ", "");
}
if (/\s/g.test(name2)) {
throw new Error(`${lang}: month name '${name2}' contains whitespace`);
}
monthShortNames[name2] = parseInt(n);
} }
if (/\s/g.test(name2)) {
throw new Error(`${lang}: month name '${name2}' contains whitespace`);
}
monthNames[name2.toLowerCase()] = parseInt(n);
} }
const weekdays = dateFields.days["stand-alone"].wide; const weekdays = dateFields.days["stand-alone"].wide;
@ -72,12 +91,23 @@ const dict = JSON.parse(fs.readFileSync(DICT_PATH));
for (const [mainLang, entry] of Object.entries(dict)) { for (const [mainLang, entry] of Object.entries(dict)) {
const langs = [mainLang, ...entry["equivalent"]]; const langs = [mainLang, ...entry["equivalent"]];
let monthNames = {}; let monthNames = {};
let monthShortNames = {};
let weekdayNames = {}; let weekdayNames = {};
for (lang of langs) { for (lang of langs) {
collectMonthNames(lang, entry["by_char"], monthNames, weekdayNames); collectMonthNames(
lang,
entry["by_char"],
monthNames,
monthShortNames,
weekdayNames
);
} }
dict[mainLang]["months"] = { ...dict[mainLang]["months"], ...monthNames }; dict[mainLang]["months"] = {
...dict[mainLang]["months"],
...monthNames,
...monthShortNames,
};
dict[mainLang]["timeago_nd_tokens"] = { dict[mainLang]["timeago_nd_tokens"] = {
...dict[mainLang]["timeago_nd_tokens"], ...dict[mainLang]["timeago_nd_tokens"],
...weekdayNames, ...weekdayNames,

View file

@ -79,7 +79,8 @@
"enkelsnitte": "single" "enkelsnitte": "single"
}, },
"chan_prefix": "deur", "chan_prefix": "deur",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"am": { "am": {
"equivalent": [], "equivalent": [],
@ -162,7 +163,8 @@
"ነጠላዎች": "single" "ነጠላዎች": "single"
}, },
"chan_prefix": "በ", "chan_prefix": "በ",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ar": { "ar": {
"equivalent": [], "equivalent": [],
@ -252,7 +254,8 @@
"أغنية منفردة": "single" "أغنية منفردة": "single"
}, },
"chan_prefix": "بواسطة", "chan_prefix": "بواسطة",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"as": { "as": {
"equivalent": [], "equivalent": [],
@ -268,17 +271,24 @@
}, },
"date_order": "DMY", "date_order": "DMY",
"months": { "months": {
"জানু": 1,
"জানুৱাৰী": 1, "জানুৱাৰী": 1,
"ফেব্ৰু": 2,
"ফেব্ৰুৱাৰী": 2, "ফেব্ৰুৱাৰী": 2,
"মাৰ্চ": 3, "মাৰ্চ": 3,
"এপ্ৰিল": 4, "এপ্ৰিল": 4,
"মে’": 5, "মে’": 5,
"জুন": 6, "জুন": 6,
"জুলাই": 7, "জুলাই": 7,
"আগ": 8,
"আগষ্ট": 8, "আগষ্ট": 8,
"ছেপ্তে": 9,
"ছেপ্তেম্বৰ": 9, "ছেপ্তেম্বৰ": 9,
"অক্টো": 10,
"অক্টোবৰ": 10, "অক্টোবৰ": 10,
"নৱে": 11,
"নৱেম্বৰ": 11, "নৱেম্বৰ": 11,
"ডিচে": 12,
"ডিচেম্বৰ": 12 "ডিচেম্বৰ": 12
}, },
"timeago_nd_tokens": { "timeago_nd_tokens": {
@ -324,7 +334,8 @@
"এককসমূহ": "single" "এককসমূহ": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "ৰ দ্বাৰা" "chan_suffix": "ৰ দ্বাৰা",
"month_before_day": false
}, },
"az": { "az": {
"equivalent": [], "equivalent": [],
@ -397,7 +408,8 @@
"tək": "single" "tək": "single"
}, },
"chan_prefix": "by", "chan_prefix": "by",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"be": { "be": {
"equivalent": [], "equivalent": [],
@ -497,7 +509,8 @@
"сінглы": "single" "сінглы": "single"
}, },
"chan_prefix": "ад", "chan_prefix": "ад",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"bg": { "bg": {
"equivalent": [], "equivalent": [],
@ -571,7 +584,8 @@
"сингъл": "single" "сингъл": "single"
}, },
"chan_prefix": "от", "chan_prefix": "от",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"bn": { "bn": {
"equivalent": [], "equivalent": [],
@ -645,7 +659,8 @@
"সিঙ্গেলস": "single" "সিঙ্গেলস": "single"
}, },
"chan_prefix": ",", "chan_prefix": ",",
"chan_suffix": "দ্বারা" "chan_suffix": "দ্বারা",
"month_before_day": false
}, },
"bs": { "bs": {
"equivalent": [], "equivalent": [],
@ -738,7 +753,8 @@
"singlovi": "single" "singlovi": "single"
}, },
"chan_prefix": "od", "chan_prefix": "od",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ca": { "ca": {
"equivalent": [], "equivalent": [],
@ -818,7 +834,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "de:", "chan_prefix": "de:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"cs": { "cs": {
"equivalent": [], "equivalent": [],
@ -903,7 +920,8 @@
"singly": "single" "singly": "single"
}, },
"chan_prefix": "autor:", "chan_prefix": "autor:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"da": { "da": {
"equivalent": [], "equivalent": [],
@ -983,7 +1001,8 @@
"singler": "single" "singler": "single"
}, },
"chan_prefix": "af", "chan_prefix": "af",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"de": { "de": {
"equivalent": [], "equivalent": [],
@ -1009,17 +1028,25 @@
}, },
"date_order": "DMY", "date_order": "DMY",
"months": { "months": {
"jan": 1,
"januar": 1, "januar": 1,
"feb": 2,
"februar": 2, "februar": 2,
"märz": 3, "märz": 3,
"apr": 4,
"april": 4, "april": 4,
"mai": 5, "mai": 5,
"juni": 6, "juni": 6,
"juli": 7, "juli": 7,
"aug": 8,
"august": 8, "august": 8,
"sept": 9,
"september": 9, "september": 9,
"okt": 10,
"oktober": 10, "oktober": 10,
"nov": 11,
"november": 11, "november": 11,
"dez": 12,
"dezember": 12 "dezember": 12
}, },
"timeago_nd_tokens": { "timeago_nd_tokens": {
@ -1053,7 +1080,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "von", "chan_prefix": "von",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"el": { "el": {
"equivalent": [], "equivalent": [],
@ -1139,13 +1167,11 @@
"σινγκλ": "single" "σινγκλ": "single"
}, },
"chan_prefix": "από το χρήστη", "chan_prefix": "από το χρήστη",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"en": { "en": {
"equivalent": [ "equivalent": ["en-GB", "en-IN"],
"en-GB",
"en-IN"
],
"by_char": false, "by_char": false,
"timeago_tokens": { "timeago_tokens": {
"s": "s", "s": "s",
@ -1237,7 +1263,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "by", "chan_prefix": "by",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"es": { "es": {
"equivalent": [], "equivalent": [],
@ -1320,12 +1347,11 @@
"single": "single" "single": "single"
}, },
"chan_prefix": "de", "chan_prefix": "de",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"es-US": { "es-US": {
"equivalent": [ "equivalent": ["es-419"],
"es-419"
],
"by_char": false, "by_char": false,
"timeago_tokens": { "timeago_tokens": {
"s": "s", "s": "s",
@ -1406,7 +1432,8 @@
"sencillos": "single" "sencillos": "single"
}, },
"chan_prefix": "de", "chan_prefix": "de",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"et": { "et": {
"equivalent": [], "equivalent": [],
@ -1488,7 +1515,8 @@
"singlid": "single" "singlid": "single"
}, },
"chan_prefix": "kanalilt", "chan_prefix": "kanalilt",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"eu": { "eu": {
"equivalent": [], "equivalent": [],
@ -1562,7 +1590,8 @@
"singleak": "single" "singleak": "single"
}, },
"chan_prefix": "egilea:", "chan_prefix": "egilea:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"fa": { "fa": {
"equivalent": [], "equivalent": [],
@ -1628,7 +1657,8 @@
"تک‌آهنگ‌ها": "single" "تک‌آهنگ‌ها": "single"
}, },
"chan_prefix": "توسط", "chan_prefix": "توسط",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"fi": { "fi": {
"equivalent": [], "equivalent": [],
@ -1704,7 +1734,8 @@
"singlet": "single" "singlet": "single"
}, },
"chan_prefix": "tekijä:", "chan_prefix": "tekijä:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"fil": { "fil": {
"equivalent": [], "equivalent": [],
@ -1779,12 +1810,11 @@
"single": "single" "single": "single"
}, },
"chan_prefix": "ni/ng", "chan_prefix": "ni/ng",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"fr": { "fr": {
"equivalent": [ "equivalent": ["fr-CA"],
"fr-CA"
],
"by_char": false, "by_char": false,
"timeago_tokens": { "timeago_tokens": {
"s": "s", "s": "s",
@ -1868,7 +1898,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "de", "chan_prefix": "de",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"gl": { "gl": {
"equivalent": [], "equivalent": [],
@ -1948,7 +1979,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "de", "chan_prefix": "de",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"gu": { "gu": {
"equivalent": [], "equivalent": [],
@ -2013,7 +2045,8 @@
"સિંગલ": "single" "સિંગલ": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "દ્વારા" "chan_suffix": "દ્વારા",
"month_before_day": false
}, },
"hi": { "hi": {
"equivalent": [], "equivalent": [],
@ -2087,7 +2120,8 @@
"सिंगल": "single" "सिंगल": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "के ज़रिए" "chan_suffix": "के ज़रिए",
"month_before_day": false
}, },
"hr": { "hr": {
"equivalent": [], "equivalent": [],
@ -2180,7 +2214,8 @@
"singlovi": "single" "singlovi": "single"
}, },
"chan_prefix": "omogućio kanal", "chan_prefix": "omogućio kanal",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"hu": { "hu": {
"equivalent": [], "equivalent": [],
@ -2265,7 +2300,8 @@
"kislemezek": "single" "kislemezek": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "csatornától" "chan_suffix": "csatornától",
"month_before_day": true
}, },
"hy": { "hy": {
"equivalent": [], "equivalent": [],
@ -2344,7 +2380,8 @@
"սինգլներ": "single" "սինգլներ": "single"
}, },
"chan_prefix": "հեղինակ՝", "chan_prefix": "հեղինակ՝",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"id": { "id": {
"equivalent": [], "equivalent": [],
@ -2420,7 +2457,8 @@
"single": "single" "single": "single"
}, },
"chan_prefix": "oleh", "chan_prefix": "oleh",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"is": { "is": {
"equivalent": [], "equivalent": [],
@ -2509,7 +2547,8 @@
"smáskífur": "single" "smáskífur": "single"
}, },
"chan_prefix": "eftir", "chan_prefix": "eftir",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"it": { "it": {
"equivalent": [], "equivalent": [],
@ -2596,7 +2635,8 @@
"singolo": "single" "singolo": "single"
}, },
"chan_prefix": "di", "chan_prefix": "di",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"iw": { "iw": {
"equivalent": [], "equivalent": [],
@ -2688,7 +2728,8 @@
"סינגלים": "single" "סינגלים": "single"
}, },
"chan_prefix": "מאת", "chan_prefix": "מאת",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ja": { "ja": {
"equivalent": [], "equivalent": [],
@ -2731,7 +2772,8 @@
"シングル": "single" "シングル": "single"
}, },
"chan_prefix": "作成者:", "chan_prefix": "作成者:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"ka": { "ka": {
"equivalent": [], "equivalent": [],
@ -2810,7 +2852,8 @@
"სინგლი": "single" "სინგლი": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "-ის მიერ" "chan_suffix": "-ის მიერ",
"month_before_day": false
}, },
"kk": { "kk": {
"equivalent": [], "equivalent": [],
@ -2890,7 +2933,8 @@
"синглдер": "single" "синглдер": "single"
}, },
"chan_prefix": "қосқан", "chan_prefix": "қосқан",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"km": { "km": {
"equivalent": [], "equivalent": [],
@ -2951,7 +2995,8 @@
"ចម្រៀងទោល": "single" "ចម្រៀងទោល": "single"
}, },
"chan_prefix": "ដោយ", "chan_prefix": "ដោយ",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"kn": { "kn": {
"equivalent": [], "equivalent": [],
@ -3033,7 +3078,8 @@
"ಸಿಂಗಲ್ಸ್": "single" "ಸಿಂಗಲ್ಸ್": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "ಚಾನಲ್‌ನಿಂದ" "chan_suffix": "ಚಾನಲ್‌ನಿಂದ",
"month_before_day": false
}, },
"ko": { "ko": {
"equivalent": [], "equivalent": [],
@ -3079,7 +3125,8 @@
"싱글": "single" "싱글": "single"
}, },
"chan_prefix": "게시자:", "chan_prefix": "게시자:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"ky": { "ky": {
"equivalent": [], "equivalent": [],
@ -3155,7 +3202,8 @@
"синглдар": "single" "синглдар": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "каналы аркылуу" "chan_suffix": "каналы аркылуу",
"month_before_day": false
}, },
"lo": { "lo": {
"equivalent": [], "equivalent": [],
@ -3238,7 +3286,8 @@
"ຜົນງານເພງ": "single" "ຜົນງານເພງ": "single"
}, },
"chan_prefix": "ໂດຍ", "chan_prefix": "ໂດຍ",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"lt": { "lt": {
"equivalent": [], "equivalent": [],
@ -3327,7 +3376,8 @@
"singlas": "single" "singlas": "single"
}, },
"chan_prefix": "pridėjo", "chan_prefix": "pridėjo",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"lv": { "lv": {
"equivalent": [], "equivalent": [],
@ -3416,7 +3466,8 @@
"singls": "single" "singls": "single"
}, },
"chan_prefix": "autors:", "chan_prefix": "autors:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"mk": { "mk": {
"equivalent": [], "equivalent": [],
@ -3442,17 +3493,28 @@
}, },
"date_order": "DMY", "date_order": "DMY",
"months": { "months": {
"јан": 1,
"јануари": 1, "јануари": 1,
"фев": 2,
"февруари": 2, "февруари": 2,
"мар": 3,
"март": 3, "март": 3,
"апр": 4,
"април": 4, "април": 4,
"мај": 5, "мај": 5,
"јун": 6,
"јуни": 6, "јуни": 6,
"јул": 7,
"јули": 7, "јули": 7,
"авг": 8,
"август": 8, "август": 8,
"сеп": 9,
"септември": 9, "септември": 9,
"окт": 10,
"октомври": 10, "октомври": 10,
"ное": 11,
"ноември": 11, "ноември": 11,
"дек": 12,
"декември": 12 "декември": 12
}, },
"timeago_nd_tokens": { "timeago_nd_tokens": {
@ -3488,7 +3550,8 @@
"синглови": "single" "синглови": "single"
}, },
"chan_prefix": "од", "chan_prefix": "од",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ml": { "ml": {
"equivalent": [], "equivalent": [],
@ -3560,7 +3623,8 @@
"സിംഗിൾസ്": "single" "സിംഗിൾസ്": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "മുഖേന" "chan_suffix": "മുഖേന",
"month_before_day": false
}, },
"mn": { "mn": {
"equivalent": [], "equivalent": [],
@ -3582,6 +3646,8 @@
}, },
"date_order": "YMD", "date_order": "YMD",
"months": { "months": {
"нэгдүгээр": 1,
"хоёрдугаар": 2,
"гуравдугаар": 3, "гуравдугаар": 3,
"дөрөвдүгээр": 4, "дөрөвдүгээр": 4,
"тавдугаар": 5, "тавдугаар": 5,
@ -3589,9 +3655,7 @@
"долоодугаар": 7, "долоодугаар": 7,
"наймдугаар": 8, "наймдугаар": 8,
"есдүгээр": 9, "есдүгээр": 9,
"аравдугаар": 10, "аравдугаар": 10
"нэгдүгээр": 11,
"хоёрдугаар": 12
}, },
"timeago_nd_tokens": { "timeago_nd_tokens": {
"өнөөдөр": "0D", "өнөөдөр": "0D",
@ -3624,7 +3688,8 @@
"синглүүд": "single" "синглүүд": "single"
}, },
"chan_prefix": "сувгийн нэр:", "chan_prefix": "сувгийн нэр:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"mr": { "mr": {
"equivalent": [], "equivalent": [],
@ -3706,7 +3771,8 @@
"सिंगल": "single" "सिंगल": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "द्वारे" "chan_suffix": "द्वारे",
"month_before_day": false
}, },
"ms": { "ms": {
"equivalent": [], "equivalent": [],
@ -3777,7 +3843,8 @@
"rekod single": "single" "rekod single": "single"
}, },
"chan_prefix": "oleh", "chan_prefix": "oleh",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"my": { "my": {
"equivalent": [], "equivalent": [],
@ -3854,7 +3921,8 @@
"တစ်ပုဒ်ချင်းများ": "single" "တစ်ပုဒ်ချင်းများ": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "မှ" "chan_suffix": "မှ",
"month_before_day": false
}, },
"ne": { "ne": {
"equivalent": [], "equivalent": [],
@ -3917,7 +3985,8 @@
"एकल एल्बमहरू": "single" "एकल एल्बमहरू": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "द्वारा" "chan_suffix": "द्वारा",
"month_before_day": true
}, },
"nl": { "nl": {
"equivalent": [], "equivalent": [],
@ -3996,7 +4065,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "door", "chan_prefix": "door",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"no": { "no": {
"equivalent": [], "equivalent": [],
@ -4080,7 +4150,8 @@
"singler": "single" "singler": "single"
}, },
"chan_prefix": "av", "chan_prefix": "av",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"or": { "or": {
"equivalent": [], "equivalent": [],
@ -4153,7 +4224,8 @@
"ସିଙ୍ଗଲ୍": "single" "ସିଙ୍ଗଲ୍": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "ଦ୍ଵାରା" "chan_suffix": "ଦ୍ଵାରା",
"month_before_day": true
}, },
"pa": { "pa": {
"equivalent": [], "equivalent": [],
@ -4226,7 +4298,8 @@
"ਸਿੰਗਲ": "single" "ਸਿੰਗਲ": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "ਵੱਲੋਂ" "chan_suffix": "ਵੱਲੋਂ",
"month_before_day": false
}, },
"pl": { "pl": {
"equivalent": [], "equivalent": [],
@ -4324,7 +4397,8 @@
"single": "single" "single": "single"
}, },
"chan_prefix": "autor:", "chan_prefix": "autor:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"pt": { "pt": {
"equivalent": [], "equivalent": [],
@ -4409,7 +4483,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "por", "chan_prefix": "por",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"pt-PT": { "pt-PT": {
"equivalent": [], "equivalent": [],
@ -4479,7 +4554,8 @@
"singles": "single" "singles": "single"
}, },
"chan_prefix": "de", "chan_prefix": "de",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ro": { "ro": {
"equivalent": [], "equivalent": [],
@ -4563,7 +4639,8 @@
"single-uri": "single" "single-uri": "single"
}, },
"chan_prefix": "de", "chan_prefix": "de",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ru": { "ru": {
"equivalent": [], "equivalent": [],
@ -4659,7 +4736,8 @@
"синглы": "single" "синглы": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"si": { "si": {
"equivalent": [], "equivalent": [],
@ -4729,7 +4807,8 @@
"තනි": "single" "තනි": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "විසින්" "chan_suffix": "විසින්",
"month_before_day": true
}, },
"sk": { "sk": {
"equivalent": [], "equivalent": [],
@ -4814,7 +4893,8 @@
"single": "single" "single": "single"
}, },
"chan_prefix": "Autori:", "chan_prefix": "Autori:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"sl": { "sl": {
"equivalent": [], "equivalent": [],
@ -4915,7 +4995,8 @@
"singli": "single" "singli": "single"
}, },
"chan_prefix": "kanal", "chan_prefix": "kanal",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"sq": { "sq": {
"equivalent": [], "equivalent": [],
@ -4992,7 +5073,8 @@
"single": "single" "single": "single"
}, },
"chan_prefix": "nga", "chan_prefix": "nga",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"sr": { "sr": {
"equivalent": [], "equivalent": [],
@ -5023,17 +5105,26 @@
}, },
"date_order": "DMY", "date_order": "DMY",
"months": { "months": {
"јан": 1,
"јануар": 1, "јануар": 1,
"феб": 2,
"фебруар": 2, "фебруар": 2,
"мар": 3,
"март": 3, "март": 3,
"апр": 4,
"април": 4, "април": 4,
"мај": 5, "мај": 5,
"јун": 6, "јун": 6,
"јул": 7, "јул": 7,
"авг": 8,
"август": 8, "август": 8,
"сеп": 9,
"септембар": 9, "септембар": 9,
"окт": 10,
"октобар": 10, "октобар": 10,
"нов": 11,
"новембар": 11, "новембар": 11,
"дец": 12,
"децембар": 12 "децембар": 12
}, },
"timeago_nd_tokens": { "timeago_nd_tokens": {
@ -5068,7 +5159,8 @@
"синглови": "single" "синглови": "single"
}, },
"chan_prefix": "са канала", "chan_prefix": "са канала",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"sr-Latn": { "sr-Latn": {
"equivalent": [], "equivalent": [],
@ -5099,17 +5191,26 @@
}, },
"date_order": "DMY", "date_order": "DMY",
"months": { "months": {
"jan": 1,
"januar": 1, "januar": 1,
"feb": 2,
"februar": 2, "februar": 2,
"mar": 3,
"mart": 3, "mart": 3,
"apr": 4,
"april": 4, "april": 4,
"maj": 5, "maj": 5,
"jun": 6, "jun": 6,
"jul": 7, "jul": 7,
"avg": 8,
"avgust": 8, "avgust": 8,
"sep": 9,
"septembar": 9, "septembar": 9,
"okt": 10,
"oktobar": 10, "oktobar": 10,
"nov": 11,
"novembar": 11, "novembar": 11,
"dec": 12,
"decembar": 12 "decembar": 12
}, },
"timeago_nd_tokens": { "timeago_nd_tokens": {
@ -5144,7 +5245,8 @@
"singlovi": "single" "singlovi": "single"
}, },
"chan_prefix": "sa kanala", "chan_prefix": "sa kanala",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"sv": { "sv": {
"equivalent": [], "equivalent": [],
@ -5223,7 +5325,8 @@
"singlar": "single" "singlar": "single"
}, },
"chan_prefix": "från", "chan_prefix": "från",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"sw": { "sw": {
"equivalent": [], "equivalent": [],
@ -5295,7 +5398,8 @@
"singo": "single" "singo": "single"
}, },
"chan_prefix": "kutoka", "chan_prefix": "kutoka",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ta": { "ta": {
"equivalent": [], "equivalent": [],
@ -5380,7 +5484,8 @@
"சிங்கிள்ஸ்": "single" "சிங்கிள்ஸ்": "single"
}, },
"chan_prefix": "வழங்கியவர்:", "chan_prefix": "வழங்கியவர்:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"te": { "te": {
"equivalent": [], "equivalent": [],
@ -5463,7 +5568,8 @@
"సింగిల్స్": "single" "సింగిల్స్": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "ఛానెల్ ద్వారా" "chan_suffix": "ఛానెల్ ద్వారా",
"month_before_day": false
}, },
"th": { "th": {
"equivalent": [], "equivalent": [],
@ -5549,7 +5655,8 @@
"ซิงเกิล": "single" "ซิงเกิล": "single"
}, },
"chan_prefix": "โดย", "chan_prefix": "โดย",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"tr": { "tr": {
"equivalent": [], "equivalent": [],
@ -5626,7 +5733,8 @@
"single'lar": "single" "single'lar": "single"
}, },
"chan_prefix": "", "chan_prefix": "",
"chan_suffix": "tarafından" "chan_suffix": "tarafından",
"month_before_day": false
}, },
"uk": { "uk": {
"equivalent": [], "equivalent": [],
@ -5727,7 +5835,8 @@
"сингли": "single" "сингли": "single"
}, },
"chan_prefix": "власник:", "chan_prefix": "власник:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"ur": { "ur": {
"equivalent": [], "equivalent": [],
@ -5809,7 +5918,8 @@
"واحد": "single" "واحد": "single"
}, },
"chan_prefix": "منجانب", "chan_prefix": "منجانب",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"uz": { "uz": {
"equivalent": [], "equivalent": [],
@ -5881,7 +5991,8 @@
"singllar": "single" "singllar": "single"
}, },
"chan_prefix": "muallif:", "chan_prefix": "muallif:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"vi": { "vi": {
"equivalent": [], "equivalent": [],
@ -5925,7 +6036,8 @@
"đĩa đơn": "single" "đĩa đơn": "single"
}, },
"chan_prefix": "của", "chan_prefix": "của",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": false
}, },
"zh-CN": { "zh-CN": {
"equivalent": [], "equivalent": [],
@ -5983,7 +6095,8 @@
"单曲": "single" "单曲": "single"
}, },
"chan_prefix": "创建者:", "chan_prefix": "创建者:",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"zh-HK": { "zh-HK": {
"equivalent": [], "equivalent": [],
@ -6027,7 +6140,8 @@
"單曲": "single" "單曲": "single"
}, },
"chan_prefix": "來自", "chan_prefix": "來自",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
}, },
"zh-TW": { "zh-TW": {
"equivalent": [], "equivalent": [],
@ -6070,7 +6184,8 @@
"單曲": "single" "單曲": "single"
}, },
"chan_prefix": "由", "chan_prefix": "由",
"chan_suffix": "建立" "chan_suffix": "建立",
"month_before_day": true
}, },
"zu": { "zu": {
"equivalent": [], "equivalent": [],
@ -6160,6 +6275,7 @@
"i-single": "single" "i-single": "single"
}, },
"chan_prefix": "ka-", "chan_prefix": "ka-",
"chan_suffix": "" "chan_suffix": "",
"month_before_day": true
} }
} }

File diff suppressed because it is too large Load diff