From 83493237a59e22a61edde0f4a80450592135b403 Mon Sep 17 00:00:00 2001
From: Omar Roth 
Date: Wed, 20 Feb 2019 08:49:39 -0600
Subject: [PATCH] Add support for translating time intervals
---
 src/invidious.cr                        | 20 +++++++++++---------
 src/invidious/comments.cr               |  6 +++---
 src/invidious/helpers/utils.cr          | 23 +++++++++--------------
 src/invidious/views/components/item.ecr |  4 ++--
 4 files changed, 25 insertions(+), 28 deletions(-)
diff --git a/src/invidious.cr b/src/invidious.cr
index 1ff949293..19b924c28 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -2558,7 +2558,7 @@ get "/api/v1/videos/:id" do |env|
       json.field "description", description
       json.field "descriptionHtml", video.description
       json.field "published", video.published.to_unix
-      json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published))
+      json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published, locale))
       json.field "keywords", video.keywords
 
       json.field "viewCount", video.views
@@ -2766,7 +2766,7 @@ get "/api/v1/trending" do |env|
           json.field "authorUrl", "/channel/#{video.ucid}"
 
           json.field "published", video.published.to_unix
-          json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published))
+          json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published, locale))
           json.field "description", video.description
           json.field "descriptionHtml", video.description_html
           json.field "liveNow", video.live_now
@@ -2805,7 +2805,7 @@ get "/api/v1/popular" do |env|
           json.field "authorId", video.ucid
           json.field "authorUrl", "/channel/#{video.ucid}"
           json.field "published", video.published.to_unix
-          json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published))
+          json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published, locale))
         end
       end
     end
@@ -2840,7 +2840,7 @@ get "/api/v1/top" do |env|
           json.field "authorId", video.ucid
           json.field "authorUrl", "/channel/#{video.ucid}"
           json.field "published", video.published.to_unix
-          json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published))
+          json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published, locale))
 
           description = video.description.gsub("
", "\n")
           description = description.gsub("
", "\n")
@@ -3015,7 +3015,7 @@ get "/api/v1/channels/:ucid" do |env|
 
               json.field "viewCount", video.views
               json.field "published", video.published.to_unix
-              json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published))
+              json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published, locale))
               json.field "lengthSeconds", video.length_seconds
               json.field "liveNow", video.live_now
               json.field "paid", video.paid
@@ -3113,7 +3113,7 @@ end
 
             json.field "viewCount", video.views
             json.field "published", video.published.to_unix
-            json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published))
+            json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published, locale))
             json.field "lengthSeconds", video.length_seconds
             json.field "liveNow", video.live_now
             json.field "paid", video.paid
@@ -3133,6 +3133,8 @@ end
 
 ["/api/v1/channels/:ucid/latest", "/api/v1/channels/latest/:ucid"].each do |route|
   get route do |env|
+    locale = LOCALES[env.get("locale").as(String)]?
+
     env.response.content_type = "application/json"
 
     ucid = env.params.url["ucid"]
@@ -3163,7 +3165,7 @@ end
 
             json.field "viewCount", video.views
             json.field "published", video.published.to_unix
-            json.field "publishedText", "#{recode_date(video.published)} ago"
+            json.field "publishedText", translate(locale, "`x` ago", recode_date(video.published, locale))
             json.field "lengthSeconds", video.length_seconds
             json.field "liveNow", video.live_now
             json.field "paid", video.paid
@@ -3351,7 +3353,7 @@ get "/api/v1/channels/search/:ucid" do |env|
 
             json.field "viewCount", item.views
             json.field "published", item.published.to_unix
-            json.field "publishedText", translate(locale, "`x` ago", recode_date(item.published))
+            json.field "publishedText", translate(locale, "`x` ago", recode_date(item.published, locale))
             json.field "lengthSeconds", item.length_seconds
             json.field "liveNow", item.live_now
             json.field "paid", item.paid
@@ -3480,7 +3482,7 @@ get "/api/v1/search" do |env|
 
             json.field "viewCount", item.views
             json.field "published", item.published.to_unix
-            json.field "publishedText", translate(locale, "`x` ago", recode_date(item.published))
+            json.field "publishedText", translate(locale, "`x` ago", recode_date(item.published, locale))
             json.field "lengthSeconds", item.length_seconds
             json.field "liveNow", item.live_now
             json.field "paid", item.paid
diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr
index 5f1108aa3..87cd42942 100644
--- a/src/invidious/comments.cr
+++ b/src/invidious/comments.cr
@@ -184,7 +184,7 @@ def fetch_youtube_comments(id, db, continuation, proxies, format, locale, region
               json.field "content", content
               json.field "contentHtml", content_html
               json.field "published", published.to_unix
-              json.field "publishedText", translate(locale, "`x` ago", recode_date(published))
+              json.field "publishedText", translate(locale, "`x` ago", recode_date(published, locale))
               json.field "likeCount", node_comment["likeCount"]
               json.field "commentId", node_comment["commentId"]
               json.field "authorIsChannelOwner", node_comment["authorIsChannelOwner"]
@@ -310,7 +310,7 @@ def template_youtube_comments(comments, locale)
             #{child["author"]}
            
           #{child["contentHtml"]}
-          #{translate(locale, "`x` ago", recode_date(Time.unix(child["published"].as_i64)))} #{child["isEdited"] == true ? translate(locale, "(edited)") : ""}
+          #{translate(locale, "`x` ago", recode_date(Time.unix(child["published"].as_i64), locale))} #{child["isEdited"] == true ? translate(locale, "(edited)") : ""}
           |
           [YT]
           | 
@@ -375,7 +375,7 @@ def template_reddit_comments(root, locale)
         [ - ] 
         #{author} 
         #{translate(locale, "`x` points", number_with_separator(score))}
-        #{translate(locale, "`x` ago", recode_date(child.created_utc))}
+        #{translate(locale, "`x` ago", recode_date(child.created_utc, locale))}
       
       
       #{body_html}
diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr
index ef2e35ddb..dcf162e2b 100644
--- a/src/invidious/helpers/utils.cr
+++ b/src/invidious/helpers/utils.cr
@@ -136,31 +136,26 @@ def decode_date(string : String)
   return Time.now - delta
 end
 
-def recode_date(time : Time)
+def recode_date(time : Time, locale)
   span = Time.now - time
 
   if span.total_days > 365.0
-    span = {span.total_days / 365, "year"}
+    span = translate(locale, "`x` years", (span.total_days.to_i / 365).to_s)
   elsif span.total_days > 30.0
-    span = {span.total_days / 30, "month"}
+    span = translate(locale, "`x` months", (span.total_days.to_i / 30).to_s)
   elsif span.total_days > 7.0
-    span = {span.total_days / 7, "week"}
+    span = translate(locale, "`x` weeks", (span.total_days.to_i / 7).to_s)
   elsif span.total_hours > 24.0
-    span = {span.total_days, "day"}
+    span = translate(locale, "`x` days", (span.total_days).to_s)
   elsif span.total_minutes > 60.0
-    span = {span.total_hours, "hour"}
+    span = translate(locale, "`x` hours", (span.total_hours).to_s)
   elsif span.total_seconds > 60.0
-    span = {span.total_minutes, "minute"}
+    span = translate(locale, "`x` minutes", (span.total_minutes).to_s)
   else
-    span = {span.total_seconds, "second"}
+    span = translate(locale, "`x` seconds", (span.total_seconds).to_s)
   end
 
-  span = {span[0].to_i, span[1]}
-  if span[0] > 1
-    span = {span[0], span[1] + "s"}
-  end
-
-  return span.join(" ")
+  return span
 end
 
 def number_with_separator(number)
diff --git a/src/invidious/views/components/item.ecr b/src/invidious/views/components/item.ecr
index 8b0139070..de1c82eea 100644
--- a/src/invidious/views/components/item.ecr
+++ b/src/invidious/views/components/item.ecr
@@ -66,7 +66,7 @@
         
         
         <% if Time.now - item.published > 1.minute %>
-        
<%= translate(locale, "Shared `x` ago", recode_date(item.published)) %>
+        <%= translate(locale, "Shared `x` ago", recode_date(item.published, locale)) %>
         <% end %>
     <% else %>
         <% if env.get?("user") && env.get("user").as(User).preferences.thin_mode %>
@@ -100,7 +100,7 @@
         
         
         <% if Time.now - item.published > 1.minute %>
-        <%= translate(locale, "Shared `x` ago", recode_date(item.published)) %>
+        <%= translate(locale, "Shared `x` ago", recode_date(item.published, locale)) %>
         <% end %>
     <% end %>