Compare commits

...

3 commits

Author SHA1 Message Date
9ddf9a3ac4 fix date parsing 2022-09-07 18:09:43 +02:00
a992495b2b feat: add playlist date parser 2022-09-07 15:32:08 +02:00
d18f175aef feat: add absolute dates/months to dictionary 2022-09-06 21:27:28 +02:00
11 changed files with 11559 additions and 1856 deletions

View file

@ -12,3 +12,6 @@ indent_style = tab
[*.{json,md,rst,ini,yml,yaml,xml,html,js,jsx,ts,tsx,vue,kt}]
indent_size = 2
[*.json]
insert_final_newline = false

File diff suppressed because it is too large Load diff

View file

@ -37,7 +37,7 @@ yesterday: PLmB6td997u3kUOrfFwkULZ910ho44oQSy
5 days ago: PL3-sRm8xAzY9sDilvaWjCwCI0TkUzYdOG
7 days ago: PLHr0jWPfopte182N54r1ra7tkRJC1fmPu
Jan PL1J-6JOckZtHxTA3hN5SK7gBQaFfKzeXr 01.01.2016
Jan PL1J-6JOckZtFjcni6Xj1pLYglJp6JCpKD 03.01.2020
Feb PL1J-6JOckZtETrbzwZE7mRIIK6BzWNLAs 07.02.2016
Mar PL1J-6JOckZtG3AVdvBXhMO64mB2k3BtKi 09.03.2015
Apr PL1J-6JOckZtE_rUpK24S6X5hOE4eQoprN 02.04.2017

View file

@ -1,12 +1,20 @@
#![cfg(test)]
use std::{collections::BTreeMap, fs::File, path::Path};
use std::{
collections::{BTreeMap, HashMap},
fs::File,
hash::Hash,
io::BufReader,
path::Path,
};
use serde::{Deserialize, Serialize};
use crate::{
client::RustyTube,
model::{locale::LANGUAGES, Country, Language},
timeago::{self, TimeAgo},
util,
};
type CollectedDates = BTreeMap<Language, BTreeMap<DateCase, String>>;
@ -30,7 +38,7 @@ enum DateCase {
Dec,
}
#[test_log::test(tokio::test)]
// #[test_log::test(tokio::test)]
async fn collect_dates() {
let json_path = Path::new("testfiles/date/playlist_samples.json").to_path_buf();
if json_path.exists() {
@ -44,7 +52,7 @@ async fn collect_dates() {
),
(DateCase::Yesterday, "PLmB6td997u3kUOrfFwkULZ910ho44oQSy"),
(DateCase::Ago, "PL7zsB-C3aNu2yRY2869T0zj1FhtRIu5am"),
(DateCase::Jan, "PL1J-6JOckZtHxTA3hN5SK7gBQaFfKzeXr"),
(DateCase::Jan, "PL1J-6JOckZtFjcni6Xj1pLYglJp6JCpKD"),
(DateCase::Feb, "PL1J-6JOckZtETrbzwZE7mRIIK6BzWNLAs"),
(DateCase::Mar, "PL1J-6JOckZtG3AVdvBXhMO64mB2k3BtKi"),
(DateCase::Apr, "PL1J-6JOckZtE_rUpK24S6X5hOE4eQoprN"),
@ -75,3 +83,197 @@ async fn collect_dates() {
let file = File::create(json_path).unwrap();
serde_json::to_writer_pretty(file, &collected_dates).unwrap();
}
// #[test]
fn write_samples_to_dict() {
let json_path = Path::new("testfiles/date/playlist_samples.json").to_path_buf();
let json_file = File::open(json_path).unwrap();
let collected_dates: CollectedDates =
serde_json::from_reader(BufReader::new(json_file)).unwrap();
let mut dict = super::read_dict();
let langs = dict.keys().map(|k| k.to_owned()).collect::<Vec<_>>();
let months = [
DateCase::Jan,
DateCase::Feb,
DateCase::Mar,
DateCase::Apr,
DateCase::May,
DateCase::Jun,
DateCase::Jul,
DateCase::Aug,
DateCase::Sep,
DateCase::Oct,
DateCase::Nov,
DateCase::Dec,
];
let dates: [(u32, u32, u32); 12] = [
(2020, 1, 3),
(2016, 2, 7),
(2015, 3, 9),
(2017, 4, 2),
(2014, 5, 22),
(2014, 6, 28),
(2014, 7, 2),
(2015, 8, 23),
(2018, 9, 16),
(2014, 10, 31),
(2016, 11, 3),
(2021, 12, 24),
];
for lang in langs {
let mut datestr_tables = vec![collected_dates.get(&lang).unwrap()];
dict.get(&lang)
.unwrap()
.equivalent
.iter()
.for_each(|l| datestr_tables.push(collected_dates.get(l).unwrap()));
let dict_entry = dict.entry(lang).or_default();
let mut num_order = "".to_owned();
let collect_nd_tokens = match lang {
Language::Ja
| Language::ZhCn
| Language::ZhHk
| Language::ZhTw
| Language::Ko
| Language::Gu
| Language::Pa
| Language::Ur
| Language::Uz
| Language::Te
| Language::PtPt
// Singhalese YT translation is broken (today == tomorrow)
| Language::Si => false,
_ => true,
};
dict_entry.months = BTreeMap::new();
if collect_nd_tokens {
dict_entry.timeago_nd_tokens = BTreeMap::new();
}
for datestr_table in &datestr_tables {
let mut month_words: HashMap<String, usize> = HashMap::new();
let mut td_words: HashMap<String, i8> = HashMap::new();
// Today/Yesterday
{
let mut parse = |string: &str, n: i8| {
timeago::filter_str(string)
.split_whitespace()
.for_each(|word| {
td_words
.entry(word.to_owned())
.and_modify(|e| *e = 0)
.or_insert(n);
});
};
parse(datestr_table.get(&DateCase::Today).unwrap(), 1);
parse(datestr_table.get(&DateCase::Yesterday).unwrap(), 2);
parse(datestr_table.get(&DateCase::Ago).unwrap(), 0);
parse(datestr_table.get(&DateCase::Jan).unwrap(), 0);
}
// n days ago
{
let datestr = datestr_table.get(&DateCase::Ago).unwrap();
let tago = timeago::parse(lang, &datestr);
assert_eq!(
tago,
Some(TimeAgo {
n: 3,
unit: timeago::TimeUnit::Day
}),
"lang: {}, txt: {}",
lang,
datestr
);
}
// Absolute dates (Jan 3, 2020)
months.iter().enumerate().for_each(|(n, m)| {
let datestr = datestr_table.get(m).unwrap();
// Get order of numbers
let nums = util::parse_numeric_vec::<u32>(&datestr);
let date = dates[n];
let this_num_order = nums
.iter()
.map(|n| {
if n == &date.0 {
"Y"
} else if n == &date.1 {
"M"
} else if n == &date.2 {
"D"
} else {
panic!("invalid number {} in {}", n, datestr);
}
})
.collect::<String>();
if num_order == "" {
num_order = this_num_order;
} else {
assert_eq!(this_num_order, num_order, "lang: {}", lang);
}
// Insert words into the map
timeago::filter_str(&datestr)
.split_whitespace()
.for_each(|word| {
month_words
.entry(word.to_owned())
.and_modify(|e| *e = 0)
.or_insert(n + 1);
});
});
month_words.iter().for_each(|(word, m)| {
if *m != 0 {
dict_entry.months.insert(word.to_owned(), *m as u8);
};
});
if collect_nd_tokens {
td_words.iter().for_each(|(word, n)| {
match n {
// Today
1 => {
dict_entry
.timeago_nd_tokens
.insert(word.to_owned(), "0D".to_owned());
}
// Yesterday
2 => {
dict_entry
.timeago_nd_tokens
.insert(word.to_owned(), "1D".to_owned());
}
_ => {}
};
});
if datestr_tables.len() == 1 {
assert_eq!(
dict_entry.timeago_nd_tokens.len(),
2,
"lang: {}, nd_tokens: {:?}",
lang,
&dict_entry.timeago_nd_tokens
);
}
}
}
dict_entry.date_order = num_order;
}
super::write_dict(&dict);
}

View file

@ -1,31 +1,11 @@
#![cfg(test)]
use std::{
collections::BTreeMap,
fmt::Debug,
fs::File,
io::{BufReader},
};
use crate::{model::Language, timeago::TimeUnit};
use crate::{timeago::TimeUnit};
use fancy_regex::Regex;
use once_cell::sync::Lazy;
use serde::Deserialize;
const DICT_PATH: &str = "testfiles/date/dictionary.json";
const TARGET_FILE: &str = "src/dictionary.rs";
type Dictionary = BTreeMap<Language, DictEntry>;
#[derive(Debug, Deserialize)]
struct DictEntry {
#[serde(default)]
equivalent: Vec<Language>,
#[serde(default)]
by_char: bool,
timeago_tokens: BTreeMap<String, String>,
}
fn parse_tu(tu: &str) -> (u8, Option<TimeUnit>) {
static TU_PATTERN: Lazy<Regex> = Lazy::new(|| Regex::new(r"^(\d*)(\w?)$").unwrap());
match TU_PATTERN.captures(tu).unwrap() {
@ -47,51 +27,85 @@ fn parse_tu(tu: &str) -> (u8, Option<TimeUnit>) {
}
}
fn read_dict() -> Dictionary {
let json_file = File::open(DICT_PATH).unwrap();
serde_json::from_reader(BufReader::new(json_file)).unwrap()
}
// #[test]
fn generate_dictionary() {
let dict = read_dict();
let dict = super::read_dict();
let code_head = r#"// This file is automatically generated. DO NOT EDIT.
use crate::{
model::Language,
timeago::{TaToken, TimeUnit},
timeago::{TaToken, TimeUnit, DateCmp},
};
pub struct Entry {
pub by_char: bool,
pub timeago_tokens: phf::Map<&'static str, TaToken>,
pub date_order: &'static [DateCmp],
pub months: phf::Map<&'static str, u8>,
pub timeago_nd_tokens: phf::Map<&'static str, TaToken>,
}
"#;
let mut code_timeago_tokens = r#"#[rustfmt::skip]
pub(crate) fn get_timeago_tokens(lang: Language) -> phf::Map<&'static str, TaToken> {
pub fn entry(lang: Language) -> Entry {
match lang {
"#
.to_owned();
dict.iter().for_each(|(lang, entry)| {
// Create a map for the language
let mut map = phf_codegen::Map::<&str>::new();
entry.timeago_tokens.iter().for_each(|(txt, tu_str)| {
let (n, unit) = parse_tu(&tu_str);
match unit {
Some(unit) => map.entry(
&txt,
&format!("TaToken {{ n: {}, unit: Some(TimeUnit::{:?}) }}", n, unit),
),
None => map.entry(&txt, &format!("TaToken {{ n: {}, unit: None }}", n)),
};
});
// Match selector
let mut selector = format!("Language::{:?}", lang);
entry.equivalent.iter().for_each(|eq| {
selector += &format!(" | Language::{:?}", eq);
});
let code_map = &map.build().to_string().replace('\n', "\n ");
// Timeago tokens
let mut ta_tokens = phf_codegen::Map::<&str>::new();
entry.timeago_tokens.iter().for_each(|(txt, tu_str)| {
let (n, unit) = parse_tu(&tu_str);
match unit {
Some(unit) => ta_tokens.entry(
&txt,
&format!("TaToken {{ n: {}, unit: Some(TimeUnit::{:?}) }}", n, unit),
),
None => ta_tokens.entry(&txt, &format!("TaToken {{ n: {}, unit: None }}", n)),
};
});
code_timeago_tokens += &format!("{} => {},\n ", selector, code_map);
// Months
let mut months = phf_codegen::Map::<&str>::new();
entry.months.iter().for_each(|(txt, n_mon)| {
months.entry(&txt, &n_mon.to_string());
});
// Timeago(ND) tokens
let mut ta_nd_tokens = phf_codegen::Map::<&str>::new();
entry.timeago_nd_tokens.iter().for_each(|(txt, tu_str)| {
let (n, unit) = parse_tu(&tu_str);
match unit {
Some(unit) => ta_nd_tokens.entry(
&txt,
&format!("TaToken {{ n: {}, unit: Some(TimeUnit::{:?}) }}", n, unit),
),
None => ta_nd_tokens.entry(&txt, &format!("TaToken {{ n: {}, unit: None }}", n)),
};
});
// Date order
let mut date_order = "&[".to_owned();
entry.date_order.chars().for_each(|c| {
date_order += &format!("DateCmp::{}, ", c);
});
date_order = date_order.trim_end_matches([' ', ',']).to_owned() + "]";
let code_ta_tokens = &ta_tokens.build().to_string().replace('\n', "\n ");
let code_ta_nd_tokens = &ta_nd_tokens.build().to_string().replace('\n', "\n ");
let code_months = &months.build().to_string().replace('\n', "\n ");
code_timeago_tokens += &format!(
"{} => Entry {{\n by_char: {:?},\n timeago_tokens: {},\n date_order: {},\n months: {},\n timeago_nd_tokens: {},\n }},\n ",
selector, entry.by_char, code_ta_tokens, date_order, code_months, code_ta_nd_tokens
);
});
code_timeago_tokens = code_timeago_tokens.trim_end().to_owned() + "\n }\n}\n";

View file

@ -1,4 +1,35 @@
#![cfg(test)]
use std::{collections::BTreeMap, fs::File, io::BufReader};
use serde::{Serialize, Deserialize};
use crate::model::Language;
mod collect_playlist_dates;
mod gen_dictionary;
mod gen_locales;
const DICT_PATH: &str = "testfiles/date/dictionary.json";
type Dictionary = BTreeMap<Language, DictEntry>;
#[derive(Debug, Default, Serialize, Deserialize)]
#[serde(default)]
struct DictEntry {
equivalent: Vec<Language>,
by_char: bool,
timeago_tokens: BTreeMap<String, String>,
date_order: String,
months: BTreeMap<String, u8>,
timeago_nd_tokens: BTreeMap<String, String>,
}
fn read_dict() -> Dictionary {
let json_file = File::open(DICT_PATH).unwrap();
serde_json::from_reader(BufReader::new(json_file)).unwrap()
}
fn write_dict(dict: &Dictionary) {
let json_file = File::create(DICT_PATH).unwrap();
serde_json::to_writer_pretty(json_file, dict).unwrap();
}

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,6 @@
use std::cmp::Ordering;
use std::{cmp::Ordering, ops::Mul};
use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use crate::{dictionary, model::Language, util};
@ -11,11 +12,17 @@ pub struct TimeAgo {
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub(crate) struct TaToken {
pub struct TaToken {
pub n: u8,
pub unit: Option<TimeUnit>,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum ParsedDate {
Absolute(NaiveDate),
Relative(TimeAgo),
}
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(rename_all = "lowercase")]
pub enum TimeUnit {
@ -28,6 +35,12 @@ pub enum TimeUnit {
Year,
}
pub enum DateCmp {
Y,
M,
D,
}
impl TimeUnit {
fn seconds(&self) -> u64 {
match self {
@ -66,34 +79,56 @@ impl PartialOrd for TimeAgo {
}
}
pub fn parse(lang: Language, textual_date: &str) -> Option<TimeAgo> {
let mappings = dictionary::get_timeago_tokens(lang);
impl Mul<u8> for TimeAgo {
type Output = Self;
let filtered_str = textual_date
fn mul(self, rhs: u8) -> Self::Output {
TimeAgo {
n: self.n * rhs,
unit: self.unit,
}
}
}
pub fn filter_str(string: &str) -> String {
string
.to_lowercase()
.chars()
.filter(|c| c != &'\u{200b}' && !c.is_ascii_digit())
.collect::<String>();
.filter_map(|c| {
if c == '\u{200b}' || c.is_ascii_digit() {
None
} else if c == '-' {
Some(' ')
} else {
Some(c)
}
})
.collect()
}
let mut qu: u8 = util::parse_numeric(&textual_date).unwrap_or(1);
fn parse_ta_token(entry: &dictionary::Entry, nd: bool, filtered_str: &str) -> Option<TimeAgo> {
let tokens = match nd {
true => &entry.timeago_nd_tokens,
false => &entry.timeago_tokens,
};
let mut qu = 1;
match lang {
Language::Ja | Language::ZhCn | Language::ZhHk | Language::ZhTw => {
filtered_str.chars().find_map(|word| {
mappings
.get(&word.to_string())
.map(|t| match t.unit {
Some(unit) => Some(TimeAgo { n: t.n * qu, unit }),
None => {
qu = t.n;
None
}
})
.flatten()
})
}
_ => filtered_str.split_whitespace().find_map(|word| {
mappings
if entry.by_char {
filtered_str.chars().find_map(|word| {
tokens
.get(&word.to_string())
.map(|t| match t.unit {
Some(unit) => Some(TimeAgo { n: t.n * qu, unit }),
None => {
qu = t.n;
None
}
})
.flatten()
})
} else {
filtered_str.split_whitespace().find_map(|word| {
tokens
.get(word)
.map(|t| match t.unit {
Some(unit) => Some(TimeAgo { n: t.n * qu, unit }),
@ -103,7 +138,75 @@ pub fn parse(lang: Language, textual_date: &str) -> Option<TimeAgo> {
}
})
.flatten()
}),
})
}
}
fn parse_textual_month(entry: &dictionary::Entry, filtered_str: &str) -> Option<u8> {
if entry.by_char {
// Chinese/Japanese dont use textual months
None
} else {
filtered_str
.split_whitespace()
.find_map(|word| entry.months.get(word).map(|n| *n))
}
}
pub fn parse(lang: Language, textual_date: &str) -> Option<TimeAgo> {
let entry = dictionary::entry(lang);
let filtered_str = filter_str(textual_date);
let qu: u8 = util::parse_numeric(&textual_date).unwrap_or(1);
parse_ta_token(&entry, false, &filtered_str).map(|ta| ta * qu)
}
fn parse_date(lang: Language, textual_date: &str) -> Option<ParsedDate> {
let entry = dictionary::entry(lang);
let filtered_str = filter_str(textual_date);
let nums = util::parse_numeric_vec::<u16>(textual_date);
match nums.len() {
0 => match parse_ta_token(&entry, true, &filtered_str) {
Some(timeago) => Some(ParsedDate::Relative(timeago)),
None => parse_ta_token(&entry, false, &filtered_str)
.map(|timeago| ParsedDate::Relative(timeago)),
},
1 => parse_ta_token(&entry, false, &filtered_str)
.map(|timeago| ParsedDate::Relative(timeago * nums[0] as u8)),
2..=3 => {
if nums.len() == entry.date_order.len() {
let mut y: Option<u16> = None;
let mut m: Option<u16> = None;
let mut d: Option<u16> = None;
nums.iter()
.enumerate()
.for_each(|(i, n)| match entry.date_order[i] {
DateCmp::Y => y = Some(*n),
DateCmp::M => m = Some(*n),
DateCmp::D => d = Some(*n),
});
if m.is_none() {
m = parse_textual_month(&entry, &filtered_str).map(|n| n as u16);
}
match (y, m, d) {
(Some(y), Some(m), Some(d)) => Some(ParsedDate::Absolute(NaiveDate::from_ymd(
y.into(),
m.into(),
d.into(),
))),
_ => None,
}
} else {
None
}
}
_ => None,
}
}
@ -125,8 +228,8 @@ mod tests {
#[case] textual_date: &str,
#[case] expect: Option<TimeAgo>,
) {
let secs_ago = parse(lang, textual_date);
assert_eq!(secs_ago, expect);
let time_ago = parse(lang, textual_date);
assert_eq!(time_ago, expect);
}
#[test]
@ -339,4 +442,137 @@ mod tests {
assert_eq!(n_cases, 1065)
}
#[rstest]
#[case(Language::En, "Updated today", Some(ParsedDate::Relative(TimeAgo { n: 0, unit: TimeUnit::Day })))]
#[case(Language::En, "Updated yesterday", Some(ParsedDate::Relative(TimeAgo { n: 1, unit: TimeUnit::Day })))]
#[case(Language::En, "Updated 2 days ago", Some(ParsedDate::Relative(TimeAgo { n: 2, unit: TimeUnit::Day })))]
#[case(Language::Si, "ඊයේ යාවත්කාලීන කරන ලදී", Some(ParsedDate::Relative(TimeAgo { n: 1, unit: TimeUnit::Day })))]
#[case(
Language::En,
"Last updated on Jun 04, 2003",
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2003, 6, 4)))
)]
fn t_parse_date(
#[case] lang: Language,
#[case] textual_date: &str,
#[case] expect: Option<ParsedDate>,
) {
let parsed_date = parse_date(lang, textual_date);
assert_eq!(parsed_date, expect);
}
#[test]
fn t_parse_date_samples() {
let json_path = Path::new("testfiles/date/playlist_samples.json");
let json_file = File::open(json_path).unwrap();
let date_samples: BTreeMap<Language, BTreeMap<String, String>> =
serde_json::from_reader(BufReader::new(json_file)).unwrap();
date_samples.iter().for_each(|(lang, samples)| {
assert_eq!(
parse_date(*lang, samples.get("Today").unwrap()),
Some(ParsedDate::Relative(TimeAgo {
n: 0,
unit: TimeUnit::Day
})),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Yesterday").unwrap()),
Some(ParsedDate::Relative(TimeAgo {
// YT's Singhalese translation has an error (yesterday == today)
n: match lang {
Language::Si => 0,
_ => 1,
},
unit: TimeUnit::Day
})),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Ago").unwrap()),
Some(ParsedDate::Relative(TimeAgo {
n: 3,
unit: TimeUnit::Day
})),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Jan").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2020, 1, 3))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Feb").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2016, 2, 7))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Mar").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2015, 3, 9))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Apr").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2017, 4, 2))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("May").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2014, 5, 22))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Jun").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2014, 6, 28))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Jul").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2014, 7, 2))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Aug").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2015, 8, 23))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Sep").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2018, 9, 16))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Oct").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2014, 10, 31))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Nov").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2016, 11, 3))),
"lang: {}",
lang
);
assert_eq!(
parse_date(*lang, samples.get("Dec").unwrap()),
Some(ParsedDate::Absolute(NaiveDate::from_ymd(2021, 12, 24))),
"lang: {}",
lang
);
})
}
}

View file

@ -2,7 +2,6 @@ use std::{collections::BTreeMap, str::FromStr};
use anyhow::Result;
use fancy_regex::Regex;
use once_cell::sync::Lazy;
use rand::Rng;
use url::Url;
@ -59,8 +58,36 @@ pub fn parse_numeric<F>(string: &str) -> Result<F, F::Err>
where
F: FromStr,
{
static NUM_PATTERN: Lazy<Regex> = Lazy::new(|| Regex::new("\\D+").unwrap());
NUM_PATTERN.replace_all(string, "").parse()
let mut buf = String::new();
for c in string.chars() {
if c.is_ascii_digit() {
buf.push(c);
}
}
buf.parse()
}
/// Parse all numbers occurring in a string and reurn them as a vec
pub fn parse_numeric_vec<F>(string: &str) -> Vec<F>
where
F: FromStr,
{
let mut numbers = vec![];
let mut buf = String::new();
for c in string.chars() {
if c.is_ascii_digit() {
buf.push(c);
} else if !buf.is_empty() {
buf.parse::<F>().map_or((), |n| numbers.push(n));
buf.clear();
}
}
if !buf.is_empty() {
buf.parse::<F>().map_or((), |n| numbers.push(n));
}
numbers
}
#[cfg(test)]
@ -76,4 +103,13 @@ mod tests {
let n = parse_numeric::<u32>(string).unwrap();
assert_eq!(n, expect);
}
#[rstest]
#[case("15.03.2022", vec![15, 3, 2022])]
#[case("4 Hello World 2", vec![4, 2])]
#[case("最后更新时间2020年1月3日", vec![2020, 1, 3])]
fn t_parse_numeric_vec(#[case] string: &str, #[case] expect: Vec<u32>) {
let n = parse_numeric_vec::<u32>(string);
assert_eq!(n, expect);
}
}

File diff suppressed because it is too large Load diff

View file

@ -3,7 +3,7 @@
"Today": "Vandag opgedateer",
"Yesterday": "Gister opgedateer",
"Ago": "3 dae gelede opgedateer",
"Jan": "Laas opgedateer op 01 Jan. 2016",
"Jan": "Laas opgedateer op 03 Jan. 2020",
"Feb": "Laas opgedateer op 07 Feb. 2016",
"Mar": "Laas opgedateer op 09 Mrt. 2015",
"Apr": "Laas opgedateer op 02 Apr. 2017",
@ -20,7 +20,7 @@
"Today": "ዛሬ ዘምኗል",
"Yesterday": "ትላንት ዘምኗል",
"Ago": "ከ3 ቀናት በፊት ዘምኗል",
"Jan": "ለመጨረሻ ጊዜ የዘመነው 1 ጃንዩ 2016",
"Jan": "ለመጨረሻ ጊዜ የዘመነው 3 ጃንዩ 2020",
"Feb": "ለመጨረሻ ጊዜ የዘመነው 7 ፌብሩ 2016",
"Mar": "ለመጨረሻ ጊዜ የዘመነው 9 ማርች 2015",
"Apr": "ለመጨረሻ ጊዜ የዘመነው 2 ኤፕሪ 2017",
@ -37,7 +37,7 @@
"Today": "تم التحديث اليوم",
"Yesterday": "تم التحديث بالأمس",
"Ago": "تم التحديث منذ 3 أيام",
"Jan": "تم إجراء التعديل الأخير في 01/01/2016",
"Jan": "تم إجراء التعديل الأخير في 03/01/2020",
"Feb": "تم إجراء التعديل الأخير في 07/02/2016",
"Mar": "تم إجراء التعديل الأخير في 09/03/2015",
"Apr": "تم إجراء التعديل الأخير في 02/04/2017",
@ -54,7 +54,7 @@
"Today": "আজি আপডে’ট কৰা হৈছে",
"Yesterday": "কালি আপডে’ট কৰা হৈছে",
"Ago": "3 দিন আগতে আপডে’ট কৰা হৈছে",
"Jan": "অন্তিমবাৰ 01-01-2016ত আপডে’ট কৰা হৈছিল",
"Jan": "অন্তিমবাৰ 03-01-2020ত আপডে’ট কৰা হৈছিল",
"Feb": "অন্তিমবাৰ 07-02-2016ত আপডে’ট কৰা হৈছিল",
"Mar": "অন্তিমবাৰ 09-03-2015ত আপডে’ট কৰা হৈছিল",
"Apr": "অন্তিমবাৰ 02-04-2017ত আপডে’ট কৰা হৈছিল",
@ -71,7 +71,7 @@
"Today": "Bugün güncəlləşdirildi",
"Yesterday": "Dünən güncəlləşdirildi",
"Ago": "3 gün əvvəl güncəlləşdirildi",
"Jan": "Son güncəllənmə: 1 yan 2016",
"Jan": "Son güncəllənmə: 3 yan 2020",
"Feb": "Son güncəllənmə: 7 fev 2016",
"Mar": "Son güncəllənmə: 9 mar 2015",
"Apr": "Son güncəllənmə: 2 apr 2017",
@ -88,7 +88,7 @@
"Today": "Абноўлена сёння",
"Yesterday": "Абноўлена ўчора",
"Ago": "Абноўлена 3 дні таму",
"Jan": "Дата апошняга абнаўлення: 1 сту 2016 г.",
"Jan": "Дата апошняга абнаўлення: 3 сту 2020 г.",
"Feb": "Дата апошняга абнаўлення: 7 лют 2016 г.",
"Mar": "Дата апошняга абнаўлення: 9 сак 2015 г.",
"Apr": "Дата апошняга абнаўлення: 2 кра 2017 г.",
@ -105,7 +105,7 @@
"Today": "Актуализирани днес",
"Yesterday": "Актуализиран вчера",
"Ago": "Актуализирани преди 3 дни",
"Jan": "Последно актуализиран на 1.01.2016 г.",
"Jan": "Последно актуализиран на 3.01.2020 г.",
"Feb": "Последно актуализиран на 7.02.2016 г.",
"Mar": "Последно актуализиран на 9.03.2015 г.",
"Apr": "Последно актуализиран на 2.04.2017 г.",
@ -122,7 +122,7 @@
"Today": "আজ আপডেট হয়েছে",
"Yesterday": "গতকাল আপডেট হয়েছে",
"Ago": "3 দিন আগে আপডেট হয়েছে",
"Jan": "1 জানু, 2016 এ সর্বশেষ আপডেট হয়েছে",
"Jan": "3 জানু, 2020 এ সর্বশেষ আপডেট হয়েছে",
"Feb": "7 ফেব, 2016 এ সর্বশেষ আপডেট হয়েছে",
"Mar": "9 মার্চ, 2015 এ সর্বশেষ আপডেট হয়েছে",
"Apr": "2 এপ্রিল, 2017 এ সর্বশেষ আপডেট হয়েছে",
@ -139,7 +139,7 @@
"Today": "Ažurirano danas",
"Yesterday": "Ažurirano jučer",
"Ago": "Ažurirano prije 3 dana",
"Jan": "Zadnje ažuriranje 1. jan 2016.",
"Jan": "Zadnje ažuriranje 3. jan 2020.",
"Feb": "Zadnje ažuriranje 7. feb 2016.",
"Mar": "Zadnje ažuriranje 9. mar 2015.",
"Apr": "Zadnje ažuriranje 2. apr 2017.",
@ -156,7 +156,7 @@
"Today": "Actualitzada avui",
"Yesterday": "Actualitzada ahir",
"Ago": "Actualitzada fa 3 dies",
"Jan": "Darrera actualització: 1 de gen. 2016",
"Jan": "Darrera actualització: 3 de gen. 2020",
"Feb": "Darrera actualització: 7 de febr. 2016",
"Mar": "Darrera actualització: 9 de març 2015",
"Apr": "Darrera actualització: 2 dabr. 2017",
@ -173,7 +173,7 @@
"Today": "Aktualizováno dnes",
"Yesterday": "Aktualizováno včera",
"Ago": "Aktualizováno před 3 dny",
"Jan": "Poslední aktualizace: 1. 1. 2016",
"Jan": "Poslední aktualizace: 3. 1. 2020",
"Feb": "Poslední aktualizace: 7. 2. 2016",
"Mar": "Poslední aktualizace: 9. 3. 2015",
"Apr": "Poslední aktualizace: 2. 4. 2017",
@ -190,7 +190,7 @@
"Today": "Opdateret i dag",
"Yesterday": "Opdateret i går",
"Ago": "Opdateret for 3 dage siden",
"Jan": "Sidst opdateret d. 1. jan. 2016",
"Jan": "Sidst opdateret d. 3. jan. 2020",
"Feb": "Sidst opdateret d. 7. feb. 2016",
"Mar": "Sidst opdateret d. 9. mar. 2015",
"Apr": "Sidst opdateret d. 2. apr. 2017",
@ -207,7 +207,7 @@
"Today": "Heute aktualisiert",
"Yesterday": "Gestern aktualisiert",
"Ago": "Vor 3 Tagen aktualisiert",
"Jan": "Zuletzt am 01.01.2016 aktualisiert",
"Jan": "Zuletzt am 03.01.2020 aktualisiert",
"Feb": "Zuletzt am 07.02.2016 aktualisiert",
"Mar": "Zuletzt am 09.03.2015 aktualisiert",
"Apr": "Zuletzt am 02.04.2017 aktualisiert",
@ -224,7 +224,7 @@
"Today": "Ενημερώθηκε σήμερα",
"Yesterday": "Ενημερώθηκε χτες",
"Ago": "Ενημερώθηκε πριν 3 ημέρες",
"Jan": "Τελευταία ενημέρωση στις 1 Ιαν 2016",
"Jan": "Τελευταία ενημέρωση στις 3 Ιαν 2020",
"Feb": "Τελευταία ενημέρωση στις 7 Φεβ 2016",
"Mar": "Τελευταία ενημέρωση στις 9 Μαρ 2015",
"Apr": "Τελευταία ενημέρωση στις 2 Απρ 2017",
@ -241,7 +241,7 @@
"Today": "Updated today",
"Yesterday": "Updated yesterday",
"Ago": "Updated 3 days ago",
"Jan": "Last updated on Jan 1, 2016",
"Jan": "Last updated on Jan 3, 2020",
"Feb": "Last updated on Feb 7, 2016",
"Mar": "Last updated on Mar 9, 2015",
"Apr": "Last updated on Apr 2, 2017",
@ -258,7 +258,7 @@
"Today": "Updated today",
"Yesterday": "Updated yesterday",
"Ago": "Updated 3 days ago",
"Jan": "Last updated on 1 Jan 2016",
"Jan": "Last updated on 3 Jan 2020",
"Feb": "Last updated on 7 Feb 2016",
"Mar": "Last updated on 9 Mar 2015",
"Apr": "Last updated on 2 Apr 2017",
@ -275,7 +275,7 @@
"Today": "Updated today",
"Yesterday": "Updated yesterday",
"Ago": "Updated 3 days ago",
"Jan": "Last updated on 01-Jan-2016",
"Jan": "Last updated on 03-Jan-2020",
"Feb": "Last updated on 07-Feb-2016",
"Mar": "Last updated on 09-Mar-2015",
"Apr": "Last updated on 02-Apr-2017",
@ -292,7 +292,7 @@
"Today": "Actualizado hoy",
"Yesterday": "Actualizado ayer",
"Ago": "Actualizado hace 3 días",
"Jan": "Actualizado por última vez el 1 ene 2016",
"Jan": "Actualizado por última vez el 3 ene 2020",
"Feb": "Actualizado por última vez el 7 feb 2016",
"Mar": "Actualizado por última vez el 9 mar 2015",
"Apr": "Actualizado por última vez el 2 abr 2017",
@ -309,7 +309,7 @@
"Today": "Actualizada hoy",
"Yesterday": "Actualizada ayer",
"Ago": "Actualizada hace 3 días",
"Jan": "Se actualizó por última vez el 1 ene 2016",
"Jan": "Se actualizó por última vez el 3 ene 2020",
"Feb": "Se actualizó por última vez el 7 feb 2016",
"Mar": "Se actualizó por última vez el 9 mar 2015",
"Apr": "Se actualizó por última vez el 2 abr 2017",
@ -326,7 +326,7 @@
"Today": "Actualizada hoy",
"Yesterday": "Actualizada ayer",
"Ago": "Actualizada hace 3 días",
"Jan": "Se actualizó por última vez el 1 ene 2016",
"Jan": "Se actualizó por última vez el 3 ene 2020",
"Feb": "Se actualizó por última vez el 7 feb 2016",
"Mar": "Se actualizó por última vez el 9 mar 2015",
"Apr": "Se actualizó por última vez el 2 abr 2017",
@ -343,7 +343,7 @@
"Today": "Täna värskendatud",
"Yesterday": "Eile värskendatud",
"Ago": "Värskendatud 3 päeva tagasi",
"Jan": "Viimati värskendatud 1. jaan 2016",
"Jan": "Viimati värskendatud 3. jaan 2020",
"Feb": "Viimati värskendatud 7. veebr 2016",
"Mar": "Viimati värskendatud 9. märts 2015",
"Apr": "Viimati värskendatud 2. apr 2017",
@ -360,7 +360,7 @@
"Today": "Gaur eguneratua",
"Yesterday": "Atzo eguneratua",
"Ago": "Duela 3 egun eguneratua",
"Jan": "Azken eguneratze-data: 2016(e)ko urt. 1(a)",
"Jan": "Azken eguneratze-data: 2020(e)ko urt. 3(a)",
"Feb": "Azken eguneratze-data: 2016(e)ko ots. 7(a)",
"Mar": "Azken eguneratze-data: 2015(e)ko mar. 9(a)",
"Apr": "Azken eguneratze-data: 2017(e)ko api. 2(a)",
@ -377,7 +377,7 @@
"Today": "امروز به‌روزرسانی شده",
"Yesterday": "دیروز به‌روزرسانی شده",
"Ago": "3 روز پیش به‌روزرسانی شده",
"Jan": "آخرین تاریخ به‌روزرسانی 1 ژانویه 2016",
"Jan": "آخرین تاریخ به‌روزرسانی 3 ژانویه 2020",
"Feb": "آخرین تاریخ به‌روزرسانی 7 فوریه 2016",
"Mar": "آخرین تاریخ به‌روزرسانی 9 مارس 2015",
"Apr": "آخرین تاریخ به‌روزرسانی 2 آوریل 2017",
@ -394,7 +394,7 @@
"Today": "Päivitetty tänään",
"Yesterday": "Päivitetty eilen",
"Ago": "Päivitetty 3 päivää sitten",
"Jan": "Viimeksi päivitetty 1.1.2016",
"Jan": "Viimeksi päivitetty 3.1.2020",
"Feb": "Viimeksi päivitetty 7.2.2016",
"Mar": "Viimeksi päivitetty 9.3.2015",
"Apr": "Viimeksi päivitetty 2.4.2017",
@ -411,7 +411,7 @@
"Today": "Na-update ngayong araw",
"Yesterday": "Na-update kahapon",
"Ago": "Na-update 3 araw ang nakalipas",
"Jan": "Huling na-update noong Ene 1, 2016",
"Jan": "Huling na-update noong Ene 3, 2020",
"Feb": "Huling na-update noong Peb 7, 2016",
"Mar": "Huling na-update noong Mar 9, 2015",
"Apr": "Huling na-update noong Abr 2, 2017",
@ -428,7 +428,7 @@
"Today": "Mise à jour aujourd'hui",
"Yesterday": "Mise à jour hier",
"Ago": "Mise à jour il y a 3 jours",
"Jan": "Dernière modification le 1 janv. 2016",
"Jan": "Dernière modification le 3 janv. 2020",
"Feb": "Dernière modification le 7 févr. 2016",
"Mar": "Dernière modification le 9 mars 2015",
"Apr": "Dernière modification le 2 avr. 2017",
@ -445,7 +445,7 @@
"Today": "Mise à jour aujourd'hui",
"Yesterday": "Mise à jour hier",
"Ago": "Mise à jour il y a 3 jours",
"Jan": "Dernière mise à jour le 1 janv. 2016",
"Jan": "Dernière mise à jour le 3 janv. 2020",
"Feb": "Dernière mise à jour le 7 févr. 2016",
"Mar": "Dernière mise à jour le 9 mars 2015",
"Apr": "Dernière mise à jour le 2 avr. 2017",
@ -462,7 +462,7 @@
"Today": "Actualizáronse hoxe",
"Yesterday": "Actualizáronse onte",
"Ago": "Actualizáronse hai 3 días",
"Jan": "Última actualización: 1 de xan. de 2016",
"Jan": "Última actualización: 3 de xan. de 2020",
"Feb": "Última actualización: 7 de feb. de 2016",
"Mar": "Última actualización: 9 de mar. de 2015",
"Apr": "Última actualización: 2 de abr. de 2017",
@ -479,7 +479,7 @@
"Today": "આજે અપડેટ થયેલ",
"Yesterday": "ગઈ કાલે અપડેટ થયેલ",
"Ago": "3 દિવસ પહેલાં અપડેટ થયેલ",
"Jan": "1 જાન્યુ, 2016 ના રોજ છેલ્લે અપડેટ કરાયેલ",
"Jan": "3 જાન્યુ, 2020 ના રોજ છેલ્લે અપડેટ કરાયેલ",
"Feb": "7 ફેબ્રુ, 2016 ના રોજ છેલ્લે અપડેટ કરાયેલ",
"Mar": "9 માર્ચ, 2015 ના રોજ છેલ્લે અપડેટ કરાયેલ",
"Apr": "2 એપ્રિલ, 2017 ના રોજ છેલ્લે અપડેટ કરાયેલ",
@ -496,7 +496,7 @@
"Today": "आज अपडेट किया गया",
"Yesterday": "कल अपडेट किया गया",
"Ago": "3 दिन पहले अपडेट किया गया",
"Jan": "पिछली बार 1 जन॰ 2016 को अपडेट किया गया",
"Jan": "पिछली बार 3 जन॰ 2020 को अपडेट किया गया",
"Feb": "पिछली बार 7 फ़र॰ 2016 को अपडेट किया गया",
"Mar": "पिछली बार 9 मार्च 2015 को अपडेट किया गया",
"Apr": "पिछली बार 2 अप्रैल 2017 को अपडेट किया गया",
@ -513,7 +513,7 @@
"Today": "Ažurirano danas",
"Yesterday": "Ažurirano jučer",
"Ago": "Ažurirano prije 3 dana",
"Jan": "Posljednje ažuriranje: 1. sij 2016.",
"Jan": "Posljednje ažuriranje: 3. sij 2020.",
"Feb": "Posljednje ažuriranje: 7. velj 2016.",
"Mar": "Posljednje ažuriranje: 9. ožu 2015.",
"Apr": "Posljednje ažuriranje: 2. tra 2017.",
@ -530,7 +530,7 @@
"Today": "Ma frissítve",
"Yesterday": "Tegnap frissítve",
"Ago": "3 napja frissítve",
"Jan": "Utolsó frissítés: 2016. jan. 1.",
"Jan": "Utolsó frissítés: 2020. jan. 3.",
"Feb": "Utolsó frissítés: 2016. febr. 7.",
"Mar": "Utolsó frissítés: 2015. márc. 9.",
"Apr": "Utolsó frissítés: 2017. ápr. 2.",
@ -547,7 +547,7 @@
"Today": "Թարմացվել է այսօր",
"Yesterday": "Թարմացվել է երեկ",
"Ago": "Թարմացվել է 3 օր առաջ",
"Jan": "Վերջին թարմացումը՝ 01 հնվ, 2016 թ.",
"Jan": "Վերջին թարմացումը՝ 03 հնվ, 2020 թ.",
"Feb": "Վերջին թարմացումը՝ 07 փտվ, 2016 թ.",
"Mar": "Վերջին թարմացումը՝ 09 մրտ, 2015 թ.",
"Apr": "Վերջին թարմացումը՝ 02 ապր, 2017 թ.",
@ -564,7 +564,7 @@
"Today": "Diperbarui hari ini",
"Yesterday": "Diperbarui kemarin",
"Ago": "Diperbarui 3 hari lalu",
"Jan": "Terakhir diperbarui pada 1 Jan 2016",
"Jan": "Terakhir diperbarui pada 3 Jan 2020",
"Feb": "Terakhir diperbarui pada 7 Feb 2016",
"Mar": "Terakhir diperbarui pada 9 Mar 2015",
"Apr": "Terakhir diperbarui pada 2 Apr 2017",
@ -581,7 +581,7 @@
"Today": "Uppfært í dag",
"Yesterday": "Uppfært í gær",
"Ago": "Uppfært fyrir 3 dögum",
"Jan": "Síðast uppfært þann 1. jan. 2016",
"Jan": "Síðast uppfært þann 3. jan. 2020",
"Feb": "Síðast uppfært þann 7. feb. 2016",
"Mar": "Síðast uppfært þann 9. mar. 2015",
"Apr": "Síðast uppfært þann 2. apr. 2017",
@ -598,7 +598,7 @@
"Today": "Aggiornata oggi",
"Yesterday": "Aggiornata ieri",
"Ago": "Aggiornata 3 giorni fa",
"Jan": "Ultimo aggiornamento in data 1 gen 2016",
"Jan": "Ultimo aggiornamento in data 3 gen 2020",
"Feb": "Ultimo aggiornamento in data 7 feb 2016",
"Mar": "Ultimo aggiornamento in data 9 mar 2015",
"Apr": "Ultimo aggiornamento in data 2 apr 2017",
@ -615,7 +615,7 @@
"Today": "עודכן היום",
"Yesterday": "עודכן אתמול",
"Ago": "עודכן לפני 3 ימים",
"Jan": "עודכן לאחרונה ב-1 בינו׳ 2016",
"Jan": "עודכן לאחרונה ב-3 בינו׳ 2020",
"Feb": "עודכן לאחרונה ב-7 בפבר׳ 2016",
"Mar": "עודכן לאחרונה ב-9 במרץ 2015",
"Apr": "עודכן לאחרונה ב-2 באפר׳ 2017",
@ -632,7 +632,7 @@
"Today": "本日更新",
"Yesterday": "昨日更新",
"Ago": "3 日前に更新",
"Jan": "最終更新日: 2016/01/01",
"Jan": "最終更新日: 2020/01/03",
"Feb": "最終更新日: 2016/02/07",
"Mar": "最終更新日: 2015/03/09",
"Apr": "最終更新日: 2017/04/02",
@ -649,7 +649,7 @@
"Today": "განახლდა დღეს",
"Yesterday": "განახლდა გუშინ",
"Ago": "განახლდა 3 დღის წინ",
"Jan": "ბოლოს განახლდა 1 იან. 2016-ში",
"Jan": "ბოლოს განახლდა 3 იან. 2020-ში",
"Feb": "ბოლოს განახლდა 7 თებ. 2016-ში",
"Mar": "ბოლოს განახლდა 9 მარ. 2015-ში",
"Apr": "ბოლოს განახლდა 2 აპრ. 2017-ში",
@ -666,7 +666,7 @@
"Today": "Бүгін жаңартылған",
"Yesterday": "Кеше жаңартылған",
"Ago": "3 күн бұрын жаңартылған",
"Jan": "Соңғы рет 2016 ж. 01 қаң. күні жаңартылды",
"Jan": "Соңғы рет 2020 ж. 03 қаң. күні жаңартылды",
"Feb": "Соңғы рет 2016 ж. 07 ақп. күні жаңартылды",
"Mar": "Соңғы рет 2015 ж. 09 нау. күні жаңартылды",
"Apr": "Соңғы рет 2017 ж. 02 сәу. күні жаңартылды",
@ -683,7 +683,7 @@
"Today": "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ថ្ងៃ​នេះ",
"Yesterday": "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ម្សិលមិញ",
"Ago": "បាន​ធ្វើ​បច្ចុប្បន្នភាព 3 ថ្ងៃ​មុន",
"Jan": "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ចុង​ក្រោយ​នៅ 1 មករា 2016",
"Jan": "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ចុង​ក្រោយ​នៅ 3 មករា 2020",
"Feb": "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ចុង​ក្រោយ​នៅ 7 កុម្ភៈ 2016",
"Mar": "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ចុង​ក្រោយ​នៅ 9 មីនា 2015",
"Apr": "បាន​ធ្វើ​បច្ចុប្បន្នភាព​ចុង​ក្រោយ​នៅ 2 មេសា 2017",
@ -700,7 +700,7 @@
"Today": "ಇಂದು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲಾಗಿದೆ",
"Yesterday": "ನಿನ್ನೆ ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲಾಗಿದೆ",
"Ago": "3 ದಿನಗಳ ಹಿಂದೆ ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲಾಗಿದೆ",
"Jan": "ಕೊನೆಯದಾಗಿ ಅಪ್‌ಡೇಟ್ ಮಾಡಿದ್ದು ಜನವರಿ 1, 2016",
"Jan": "ಕೊನೆಯದಾಗಿ ಅಪ್‌ಡೇಟ್ ಮಾಡಿದ್ದು ಜನವರಿ 3, 2020",
"Feb": "ಕೊನೆಯದಾಗಿ ಅಪ್‌ಡೇಟ್ ಮಾಡಿದ್ದು ಫೆಬ್ರವರಿ 7, 2016",
"Mar": "ಕೊನೆಯದಾಗಿ ಅಪ್‌ಡೇಟ್ ಮಾಡಿದ್ದು ಮಾರ್ಚ್ 9, 2015",
"Apr": "ಕೊನೆಯದಾಗಿ ಅಪ್‌ಡೇಟ್ ಮಾಡಿದ್ದು ಏಪ್ರಿ 2, 2017",
@ -717,7 +717,7 @@
"Today": "업데이트: 오늘",
"Yesterday": "업데이트: 1일 전",
"Ago": "업데이트: 3일 전",
"Jan": "최종 업데이트: 2016. 1. 1.",
"Jan": "최종 업데이트: 2020. 1. 3.",
"Feb": "최종 업데이트: 2016. 2. 7.",
"Mar": "최종 업데이트: 2015. 3. 9.",
"Apr": "최종 업데이트: 2017. 4. 2.",
@ -734,7 +734,7 @@
"Today": "Бүгүн жаңырды",
"Yesterday": "Кечээ жаңырды",
"Ago": "3 күн мурун жаңырды",
"Jan": "Акыркы жолу 2016-ж., 1-янв. күнү жаңырган",
"Jan": "Акыркы жолу 2020-ж., 3-янв. күнү жаңырган",
"Feb": "Акыркы жолу 2016-ж., 7-фев. күнү жаңырган",
"Mar": "Акыркы жолу 2015-ж., 9-мар. күнү жаңырган",
"Apr": "Акыркы жолу 2017-ж., 2-апр. күнү жаңырган",
@ -751,7 +751,7 @@
"Today": "ອັບເດດມື້ນີ້",
"Yesterday": "ອັບເດດມື້ວານນີ້",
"Ago": "ອັບເດດ 3 ມື້ກ່ອນ",
"Jan": "ອັບເດດຫຼ້າສຸດເມື່ອ 1 ມ.ກ. 2016",
"Jan": "ອັບເດດຫຼ້າສຸດເມື່ອ 3 ມ.ກ. 2020",
"Feb": "ອັບເດດຫຼ້າສຸດເມື່ອ 7 ກ.ພ. 2016",
"Mar": "ອັບເດດຫຼ້າສຸດເມື່ອ 9 ມ.ນ. 2015",
"Apr": "ອັບເດດຫຼ້າສຸດເມື່ອ 2 ມ.ສ. 2017",
@ -768,7 +768,7 @@
"Today": "Atnaujinta šiandien",
"Yesterday": "Atnaujinta vakar",
"Ago": "Atnaujinta prieš 3 d.",
"Jan": "Paskutinį kartą atnaujinta 2016-01-01",
"Jan": "Paskutinį kartą atnaujinta 2020-01-03",
"Feb": "Paskutinį kartą atnaujinta 2016-02-07",
"Mar": "Paskutinį kartą atnaujinta 2015-03-09",
"Apr": "Paskutinį kartą atnaujinta 2017-04-02",
@ -785,7 +785,7 @@
"Today": "Atjaunināts šodien",
"Yesterday": "Atjaunināts vakar",
"Ago": "Atjaunināts pirms 3 dienām",
"Jan": "Pēdējo reizi atjaunināts: 2016. gada 1. janv.",
"Jan": "Pēdējo reizi atjaunināts: 2020. gada 3. janv.",
"Feb": "Pēdējo reizi atjaunināts: 2016. gada 7. febr.",
"Mar": "Pēdējo reizi atjaunināts: 2015. gada 9. marts",
"Apr": "Pēdējo reizi atjaunināts: 2017. gada 2. apr.",
@ -802,7 +802,7 @@
"Today": "Ажурирано денес",
"Yesterday": "Ажурирано вчера",
"Ago": "Ажурирано пред 3 дена",
"Jan": "Последно ажурирано на 1.1.2016",
"Jan": "Последно ажурирано на 3.1.2020",
"Feb": "Последно ажурирано на 7.2.2016",
"Mar": "Последно ажурирано на 9.3.2015",
"Apr": "Последно ажурирано на 2.4.2017",
@ -819,7 +819,7 @@
"Today": "ഇന്ന് അപ്‌ഡേറ്റ് ചെയ്തത്",
"Yesterday": "ഇന്നലെ അപ്‌ഡേറ്റ് ചെയ്തത്",
"Ago": "3 ദിവസം മുമ്പ് അപ്‌ഡേറ്റ് ചെയ്തത്",
"Jan": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത തീയതി 2016, ജനു 1",
"Jan": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത തീയതി 2020, ജനു 3",
"Feb": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത തീയതി 2016, ഫെബ്രു 7",
"Mar": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത തീയതി 2015, മാർ 9",
"Apr": "അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത തീയതി 2017, ഏപ്രി 2",
@ -836,7 +836,7 @@
"Today": "өнөөдөр шинэчлэгдсэн",
"Yesterday": "өчигдөр шинэчлэгдсэн",
"Ago": "3 өдрийн өмнө шинэчлэгдсэн",
"Jan": "Сүүлд 2016 оны 1-р сарын 1-нд шинэчилсэн",
"Jan": "Сүүлд 2020 оны 1-р сарын 3-нд шинэчилсэн",
"Feb": "Сүүлд 2016 оны 2-р сарын 7-нд шинэчилсэн",
"Mar": "Сүүлд 2015 оны 3-р сарын 9-нд шинэчилсэн",
"Apr": "Сүүлд 2017 оны 4-р сарын 2-нд шинэчилсэн",
@ -853,7 +853,7 @@
"Today": "आज अपडेट केले",
"Yesterday": "काल अपडेट केले",
"Ago": "3 दिवसांपूर्वी अपडेट केले",
"Jan": "1 जाने, 2016 रोजी अंतिम अपडेट",
"Jan": "3 जाने, 2020 रोजी अंतिम अपडेट",
"Feb": "7 फेब्रु, 2016 रोजी अंतिम अपडेट",
"Mar": "9 मार्च, 2015 रोजी अंतिम अपडेट",
"Apr": "2 एप्रि, 2017 रोजी अंतिम अपडेट",
@ -870,7 +870,7 @@
"Today": "Dikemas kini hari ini",
"Yesterday": "Dikemas kini semalam",
"Ago": "Dikemas kini 3 hari yang lalu",
"Jan": "Terakhir dikemas kini pada 1 Jan 2016",
"Jan": "Terakhir dikemas kini pada 3 Jan 2020",
"Feb": "Terakhir dikemas kini pada 7 Feb 2016",
"Mar": "Terakhir dikemas kini pada 9 Mac 2015",
"Apr": "Terakhir dikemas kini pada 2 Apr 2017",
@ -887,7 +887,7 @@
"Today": "ယနေ့ အပ်ဒိတ်လုပ်ခဲ့သည်",
"Yesterday": "မနေ့က အပ်ဒိတ်လုပ်ခဲ့သည်",
"Ago": "ပြီးခဲ့သော 3 ရက်က အပ်ဒိတ်လုပ်ခဲ့သည်",
"Jan": "2016- ဇန် 1 ရက်က နောက်ဆုံး အပ်ဒိတ်လုပ်ခဲ့ပါသည်",
"Jan": "2020- ဇန် 3 ရက်က နောက်ဆုံး အပ်ဒိတ်လုပ်ခဲ့ပါသည်",
"Feb": "2016- ဖေ 7 ရက်က နောက်ဆုံး အပ်ဒိတ်လုပ်ခဲ့ပါသည်",
"Mar": "2015- မတ် 9 ရက်က နောက်ဆုံး အပ်ဒိတ်လုပ်ခဲ့ပါသည်",
"Apr": "2017- ဧ 2 ရက်က နောက်ဆုံး အပ်ဒိတ်လုပ်ခဲ့ပါသည်",
@ -904,7 +904,7 @@
"Today": "आज अद्यावधिक गरिएको",
"Yesterday": "हिजो अद्यावधिक गरिएको",
"Ago": "3 दिन अघि अद्यावधिक गरिएको",
"Jan": "2016 जनवरी 1 मा पछिल्लो पटक अद्यावधिक गरिएको",
"Jan": "2020 जनवरी 3 मा पछिल्लो पटक अद्यावधिक गरिएको",
"Feb": "2016 फेब्रुअरी 7 मा पछिल्लो पटक अद्यावधिक गरिएको",
"Mar": "2015 मार्च 9 मा पछिल्लो पटक अद्यावधिक गरिएको",
"Apr": "2017 अप्रिल 2 मा पछिल्लो पटक अद्यावधिक गरिएको",
@ -921,7 +921,7 @@
"Today": "Vandaag geüpdatet",
"Yesterday": "Gisteren geüpdatet",
"Ago": "3 dagen geleden geüpdatet",
"Jan": "Laatst geüpdatet op 1 jan. 2016",
"Jan": "Laatst geüpdatet op 3 jan. 2020",
"Feb": "Laatst geüpdatet op 7 feb. 2016",
"Mar": "Laatst geüpdatet op 9 mrt. 2015",
"Apr": "Laatst geüpdatet op 2 apr. 2017",
@ -938,7 +938,7 @@
"Today": "Oppdatert i dag",
"Yesterday": "Oppdatert i går",
"Ago": "Oppdatert for 3 dager siden",
"Jan": "Sist oppdatert 1. jan. 2016",
"Jan": "Sist oppdatert 3. jan. 2020",
"Feb": "Sist oppdatert 7. feb. 2016",
"Mar": "Sist oppdatert 9. mar. 2015",
"Apr": "Sist oppdatert 2. apr. 2017",
@ -955,7 +955,7 @@
"Today": "ଆଜି ଅପ୍‍ଡେଟ୍‍ ହୋ‍ଇଛି",
"Yesterday": "ଗତକାଲି ଅପ୍‍ଡେଟ୍‍ ହୋ‍ଇଥିଲା",
"Ago": "3 ଦିନ ପୂର୍ବରୁ ଅପ୍‍ଡେଟ୍‍ ହୋ‍ଇଥିଲା",
"Jan": "ଜାନୁଆରୀ 1, 2016ରେ ଶେଷଥର ପାଇଁ ଅପଡେଟ୍ ହୋ‍ଇଛି",
"Jan": "ଜାନୁଆରୀ 3, 2020ରେ ଶେଷଥର ପାଇଁ ଅପଡେଟ୍ ହୋ‍ଇଛି",
"Feb": "ଫେବୃଆରୀ 7, 2016ରେ ଶେଷଥର ପାଇଁ ଅପଡେଟ୍ ହୋ‍ଇଛି",
"Mar": "ମାର୍ଚ୍ଚ 9, 2015ରେ ଶେଷଥର ପାଇଁ ଅପଡେଟ୍ ହୋ‍ଇଛି",
"Apr": "ଅପ୍ରେଲ 2, 2017ରେ ଶେଷଥର ପାଇଁ ଅପଡେଟ୍ ହୋ‍ଇଛି",
@ -972,7 +972,7 @@
"Today": "ਅੱਜ ਅੱਪਡੇਟ ਕੀਤਾ",
"Yesterday": "ਬੀੇਤੇ ਕੱਲ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ",
"Ago": "3 ਦਿਨ ਪਹਿਲੇ ਅੱਪਡੇਟ ਕੀਤਾ",
"Jan": "ਆਖਰੀ ਵਾਰ 1 ਜਨ 2016 ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
"Jan": "ਆਖਰੀ ਵਾਰ 3 ਜਨ 2020 ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
"Feb": "ਆਖਰੀ ਵਾਰ 7 ਫ਼ਰ 2016 ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
"Mar": "ਆਖਰੀ ਵਾਰ 9 ਮਾਰਚ 2015 ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
"Apr": "ਆਖਰੀ ਵਾਰ 2 ਅਪ੍ਰੈ 2017 ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
@ -989,7 +989,7 @@
"Today": "Zaktualizowano dzisiaj",
"Yesterday": "Zaktualizowano wczoraj",
"Ago": "Zaktualizowano 3 dni temu",
"Jan": "Ostatnia aktualizacja: 1 sty 2016",
"Jan": "Ostatnia aktualizacja: 3 sty 2020",
"Feb": "Ostatnia aktualizacja: 7 lut 2016",
"Mar": "Ostatnia aktualizacja: 9 mar 2015",
"Apr": "Ostatnia aktualizacja: 2 kwi 2017",
@ -1006,7 +1006,7 @@
"Today": "Atualizada hoje",
"Yesterday": "Atualizada ontem",
"Ago": "Atualizada há 3 dias",
"Jan": "Última atualização em 1 de jan. de 2016",
"Jan": "Última atualização em 3 de jan. de 2020",
"Feb": "Última atualização em 7 de fev. de 2016",
"Mar": "Última atualização em 9 de mar. de 2015",
"Apr": "Última atualização em 2 de abr. de 2017",
@ -1023,7 +1023,7 @@
"Today": "Atualizados hoje",
"Yesterday": "Atualizado ontem",
"Ago": "Atualizado(s) há 3 dias",
"Jan": "Última atualização a 01/01/2016",
"Jan": "Última atualização a 03/01/2020",
"Feb": "Última atualização a 07/02/2016",
"Mar": "Última atualização a 09/03/2015",
"Apr": "Última atualização a 02/04/2017",
@ -1040,7 +1040,7 @@
"Today": "Actualizat astăzi",
"Yesterday": "Actualizat ieri",
"Ago": "Actualizat acum 3 zile",
"Jan": "Ultima actualizare pe 1 ian. 2016",
"Jan": "Ultima actualizare pe 3 ian. 2020",
"Feb": "Ultima actualizare pe 7 feb. 2016",
"Mar": "Ultima actualizare pe 9 mar. 2015",
"Apr": "Ultima actualizare pe 2 apr. 2017",
@ -1057,7 +1057,7 @@
"Today": "Обновлено сегодня",
"Yesterday": "Обновлено вчера",
"Ago": "Обновлено 3 дня назад",
"Jan": "Обновлен 1 янв. 2016 г.",
"Jan": "Обновлен 3 янв. 2020 г.",
"Feb": "Обновлен 7 февр. 2016 г.",
"Mar": "Обновлен 9 мар. 2015 г.",
"Apr": "Обновлен 2 апр. 2017 г.",
@ -1074,7 +1074,7 @@
"Today": "අද යාවත්කාලීන කෙරිණි",
"Yesterday": "අද යාවත්කාලීන කෙරිණි",
"Ago": "දින 3කට පෙර යාවත්කාලීන කෙරිණි",
"Jan": "අවසන් වරට යාවත්කාලීන කළේ 2016 ජන 1",
"Jan": "අවසන් වරට යාවත්කාලීන කළේ 2020 ජන 3",
"Feb": "අවසන් වරට යාවත්කාලීන කළේ 2016 පෙබ 7",
"Mar": "අවසන් වරට යාවත්කාලීන කළේ 2015 මාර්තු 9",
"Apr": "අවසන් වරට යාවත්කාලීන කළේ 2017 අප්‍රේල් 2",
@ -1091,7 +1091,7 @@
"Today": "Aktualizované dnes",
"Yesterday": "Aktualizované včera",
"Ago": "Aktualizované pred 3 dňami",
"Jan": "Naposledy aktualizované 1. 1. 2016",
"Jan": "Naposledy aktualizované 3. 1. 2020",
"Feb": "Naposledy aktualizované 7. 2. 2016",
"Mar": "Naposledy aktualizované 9. 3. 2015",
"Apr": "Naposledy aktualizované 2. 4. 2017",
@ -1108,7 +1108,7 @@
"Today": "Posodobljeno danes",
"Yesterday": "Posodobljeno včeraj",
"Ago": "Posodobljeno pred 3 dnevi",
"Jan": "Datum zadnje posodobitve 1. jan. 2016",
"Jan": "Datum zadnje posodobitve 3. jan. 2020",
"Feb": "Datum zadnje posodobitve 7. feb. 2016",
"Mar": "Datum zadnje posodobitve 9. mar. 2015",
"Apr": "Datum zadnje posodobitve 2. apr. 2017",
@ -1125,7 +1125,7 @@
"Today": "Përditësuar sot",
"Yesterday": "Përditësuar dje",
"Ago": "Përditësuar 3 ditë më parë",
"Jan": "Përditësuar së fundi më 1 jan 2016",
"Jan": "Përditësuar së fundi më 3 jan 2020",
"Feb": "Përditësuar së fundi më 7 shk 2016",
"Mar": "Përditësuar së fundi më 9 mar 2015",
"Apr": "Përditësuar së fundi më 2 pri 2017",
@ -1142,7 +1142,7 @@
"Today": "Ажурирано данас",
"Yesterday": "Ажурирано јуче",
"Ago": "Ажурирано пре 3 дана",
"Jan": "Последњи пут ажурирано 1. 1. 2016.",
"Jan": "Последњи пут ажурирано 3. 1. 2020.",
"Feb": "Последњи пут ажурирано 7. 2. 2016.",
"Mar": "Последњи пут ажурирано 9. 3. 2015.",
"Apr": "Последњи пут ажурирано 2. 4. 2017.",
@ -1159,7 +1159,7 @@
"Today": "Ažurirano danas",
"Yesterday": "Ažurirano juče",
"Ago": "Ažurirano pre 3 dana",
"Jan": "Poslednji put ažurirano 1. 1. 2016.",
"Jan": "Poslednji put ažurirano 3. 1. 2020.",
"Feb": "Poslednji put ažurirano 7. 2. 2016.",
"Mar": "Poslednji put ažurirano 9. 3. 2015.",
"Apr": "Poslednji put ažurirano 2. 4. 2017.",
@ -1176,7 +1176,7 @@
"Today": "Uppdaterades idag",
"Yesterday": "Uppdaterades igår",
"Ago": "Uppdaterades för 3 dagar sedan",
"Jan": "Uppdaterades senast 1 jan. 2016",
"Jan": "Uppdaterades senast 3 jan. 2020",
"Feb": "Uppdaterades senast 7 feb. 2016",
"Mar": "Uppdaterades senast 9 mars 2015",
"Apr": "Uppdaterades senast 2 apr. 2017",
@ -1193,7 +1193,7 @@
"Today": "Zilizosasishwa leo",
"Yesterday": "Zilizosasishwa jana",
"Ago": "Zilizosasishwa siku 3 zilizopita",
"Jan": "Ilisasishwa mara ya mwisho tarehe 1 Jan 2016",
"Jan": "Ilisasishwa mara ya mwisho tarehe 3 Jan 2020",
"Feb": "Ilisasishwa mara ya mwisho tarehe 7 Feb 2016",
"Mar": "Ilisasishwa mara ya mwisho tarehe 9 Mac 2015",
"Apr": "Ilisasishwa mara ya mwisho tarehe 2 Apr 2017",
@ -1210,7 +1210,7 @@
"Today": "இன்று புதுப்பிக்கப்பட்டது",
"Yesterday": "நேற்று புதுப்பிக்கப்பட்டது",
"Ago": "3 நாட்களுக்கு முன்பு புதுப்பிக்கப்பட்டது",
"Jan": "1 ஜன., 2016 அன்று கடைசியாக புதுப்பிக்கப்பட்டது",
"Jan": "3 ஜன., 2020 அன்று கடைசியாக புதுப்பிக்கப்பட்டது",
"Feb": "7 பிப்., 2016 அன்று கடைசியாக புதுப்பிக்கப்பட்டது",
"Mar": "9 மார்., 2015 அன்று கடைசியாக புதுப்பிக்கப்பட்டது",
"Apr": "2 ஏப்., 2017 அன்று கடைசியாக புதுப்பிக்கப்பட்டது",
@ -1227,7 +1227,7 @@
"Today": "ఈ రోజు అప్‌డేట్ చేయబడింది",
"Yesterday": "నిన్న అప్‌డేట్ చేయబడింది",
"Ago": "3 రోజుల క్రితం అప్‌డేట్ చేయబడింది",
"Jan": "చివరిగా 1 జన, 2016న అప్‌డేట్ చేయబడింది",
"Jan": "చివరిగా 3 జన, 2020న అప్‌డేట్ చేయబడింది",
"Feb": "చివరిగా 7 ఫిబ్ర, 2016న అప్‌డేట్ చేయబడింది",
"Mar": "చివరిగా 9 మార్చి, 2015న అప్‌డేట్ చేయబడింది",
"Apr": "చివరిగా 2 ఏప్రి, 2017న అప్‌డేట్ చేయబడింది",
@ -1244,7 +1244,7 @@
"Today": "อัปเดตแล้ววันนี้",
"Yesterday": "อัปเดตแล้วเมื่อวาน",
"Ago": "อัปเดตแล้วเมื่อ 3 วันที่ผ่านมา",
"Jan": "อัปเดตล่าสุดเมื่อ 1 ม.ค. 2016",
"Jan": "อัปเดตล่าสุดเมื่อ 3 ม.ค. 2020",
"Feb": "อัปเดตล่าสุดเมื่อ 7 ก.พ. 2016",
"Mar": "อัปเดตล่าสุดเมื่อ 9 มี.ค. 2015",
"Apr": "อัปเดตล่าสุดเมื่อ 2 เม.ย. 2017",
@ -1261,7 +1261,7 @@
"Today": "Bugün güncellendi",
"Yesterday": "Dün güncellendi",
"Ago": "3 gün önce güncellendi",
"Jan": "En son 1 Oca 2016 tarihinde güncellendi",
"Jan": "En son 3 Oca 2020 tarihinde güncellendi",
"Feb": "En son 7 Şub 2016 tarihinde güncellendi",
"Mar": "En son 9 Mar 2015 tarihinde güncellendi",
"Apr": "En son 2 Nis 2017 tarihinde güncellendi",
@ -1278,7 +1278,7 @@
"Today": "Оновлено сьогодні",
"Yesterday": "Оновлено вчора",
"Ago": "Оновлено 3 дні тому",
"Jan": "Останнє оновлення: 1 січ. 2016 р.",
"Jan": "Останнє оновлення: 3 січ. 2020 р.",
"Feb": "Останнє оновлення: 7 лют. 2016 р.",
"Mar": "Останнє оновлення: 9 бер. 2015 р.",
"Apr": "Останнє оновлення: 2 квіт. 2017 р.",
@ -1295,7 +1295,7 @@
"Today": "آج اپ ڈیٹ کیا گیا",
"Yesterday": "گزشتہ کل اپ ڈیٹ کیا گیا",
"Ago": "3 دن پہلے اپ ڈیٹ کیا گیا",
"Jan": "آخری بار 1 جنوری، 2016 کو اپ ڈیٹ کیا گیا",
"Jan": "آخری بار 3 جنوری، 2020 کو اپ ڈیٹ کیا گیا",
"Feb": "آخری بار 7 فروری، 2016 کو اپ ڈیٹ کیا گیا",
"Mar": "آخری بار 9 مارچ، 2015 کو اپ ڈیٹ کیا گیا",
"Apr": "آخری بار 2 اپریل، 2017 کو اپ ڈیٹ کیا گیا",
@ -1312,7 +1312,7 @@
"Today": "Bugun yangilandi",
"Yesterday": "Kecha yangilangan",
"Ago": "3 kun oldin yangilangan",
"Jan": "Oxirgi yangilanish: 1-yan, 2016",
"Jan": "Oxirgi yangilanish: 3-yan, 2020",
"Feb": "Oxirgi yangilanish: 7-fev, 2016",
"Mar": "Oxirgi yangilanish: 9-mar, 2015",
"Apr": "Oxirgi yangilanish: 2-apr, 2017",
@ -1329,7 +1329,7 @@
"Today": "Cập nhật hôm nay",
"Yesterday": "Cập nhật hôm qua",
"Ago": "Cập nhật 3 ngày trước",
"Jan": "Cập nhật lần cuối vào 1 thg 1, 2016",
"Jan": "Cập nhật lần cuối vào 3 thg 1, 2020",
"Feb": "Cập nhật lần cuối vào 7 thg 2, 2016",
"Mar": "Cập nhật lần cuối vào 9 thg 3, 2015",
"Apr": "Cập nhật lần cuối vào 2 thg 4, 2017",
@ -1346,7 +1346,7 @@
"Today": "今日更新",
"Yesterday": "昨日更新",
"Ago": "3 天前更新",
"Jan": "最后更新时间2016年1月1日",
"Jan": "最后更新时间2020年1月3日",
"Feb": "最后更新时间2016年2月7日",
"Mar": "最后更新时间2015年3月9日",
"Apr": "最后更新时间2017年4月2日",
@ -1363,7 +1363,7 @@
"Today": "今日更新",
"Yesterday": "昨天更新",
"Ago": "3 天前更新",
"Jan": "上次更新時間2016年1月1日",
"Jan": "上次更新時間2020年1月3日",
"Feb": "上次更新時間2016年2月7日",
"Mar": "上次更新時間2015年3月9日",
"Apr": "上次更新時間2017年4月2日",
@ -1380,7 +1380,7 @@
"Today": "今天更新",
"Yesterday": "昨天更新",
"Ago": "3 天前更新",
"Jan": "上次更新日期2016年1月1日",
"Jan": "上次更新日期2020年1月3日",
"Feb": "上次更新日期2016年2月7日",
"Mar": "上次更新日期2015年3月9日",
"Apr": "上次更新日期2017年4月2日",
@ -1397,7 +1397,7 @@
"Today": "Ibuyekezwe namuhla",
"Yesterday": "Ibuyekezwe izolo",
"Ago": "Ibuyekezwe ezinsukwini ezingu-3 ezidlule",
"Jan": "Yagcina ibuyekezwe ngomhla ka-Jan 1, 2016",
"Jan": "Yagcina ibuyekezwe ngomhla ka-Jan 3, 2020",
"Feb": "Yagcina ibuyekezwe ngomhla ka-Feb 7, 2016",
"Mar": "Yagcina ibuyekezwe ngomhla ka-Mas 9, 2015",
"Apr": "Yagcina ibuyekezwe ngomhla ka-Eph 2, 2017",