Compare commits
	
		
			3 commits
		
	
	
		
			
				c9433d721d
			
			...
			
				9ddf9a3ac4
			
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9ddf9a3ac4 | |||
| a992495b2b | |||
| d18f175aef | 
					 11 changed files with 11559 additions and 1856 deletions
				
			
		|  | @ -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 | ||||
|  |  | |||
							
								
								
									
										5206
									
								
								notes/browse/channel_premiere.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5206
									
								
								notes/browse/channel_premiere.json
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -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 | ||||
|  |  | |||
|  | @ -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); | ||||
| } | ||||
|  |  | |||
|  | @ -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"; | ||||
|  |  | |||
|  | @ -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(); | ||||
| } | ||||
|  |  | |||
							
								
								
									
										5905
									
								
								src/dictionary.rs
									
										
									
									
									
								
							
							
						
						
									
										5905
									
								
								src/dictionary.rs
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										292
									
								
								src/timeago.rs
									
										
									
									
									
								
							
							
						
						
									
										292
									
								
								src/timeago.rs
									
										
									
									
									
								
							|  | @ -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 | ||||
|             ); | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  |  | |||
							
								
								
									
										42
									
								
								src/util.rs
									
										
									
									
									
								
							
							
						
						
									
										42
									
								
								src/util.rs
									
										
									
									
									
								
							|  | @ -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
											
										
									
								
							|  | @ -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 d’abr. 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", | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue