浏览代码

Enhance: Convert more of the UI to be translatable - settings, onboarding, bug-report, whiteboard, flashcards and search (#9680)

* Enhance: add translation strings

* Add search/command-palette strings

* add translation strings quick_tour

* FIX

* Add translation strings tour-whiteboard

* add translation strings settings-page

* add translation strings settings-page/git

* FIX

* add translation strings settings-page/sync

* FIX

* Add translation strings Flashcards

* FIX

* FIX: Add [frontend.context.i18n :refer [t]]

* Add translation strings :on-boarding/importing

* Add translation strings :on-boarding and FIX :on-boarding/importing

* Add translation strings :bug-report

* fix

* Fix link to flashcard documentation

---------

Co-authored-by: Gabriel Horner <[email protected]>
Mikhail Smelov 2 年之前
父节点
当前提交
1d932f07c4

+ 24 - 23
src/main/frontend/components/bug_report.cljs

@@ -5,7 +5,8 @@
             [frontend.util :as util]
             [frontend.util :as util]
             [reitit.frontend.easy :as rfe]
             [reitit.frontend.easy :as rfe]
             [clojure.string :as string]
             [clojure.string :as string]
-            [frontend.handler.notification :as notification]))
+            [frontend.handler.notification :as notification]
+            [frontend.context.i18n :refer [t]]))
 
 
 (defn parse-clipboard-data-transfer
 (defn parse-clipboard-data-transfer
   "parse dataTransfer
   "parse dataTransfer
@@ -42,7 +43,7 @@
 
 
         copy-result-to-clipboard! (fn [result]
         copy-result-to-clipboard! (fn [result]
                                     (util/copy-to-clipboard! result)
                                     (util/copy-to-clipboard! result)
-                                    (notification/show! "Copied to clipboard!"))
+                                    (notification/show! (t :bug-report/inspector-page-copy-notif)))
 
 
         reset-step! (fn []
         reset-step! (fn []
                       (set-step! 0)
                       (set-step! 0)
@@ -56,26 +57,26 @@
 
 
     [:div.flex.flex-col
     [:div.flex.flex-col
      (when (= step 0)
      (when (= step 0)
-       (list [:div.mx-auto "Press Ctrl+V / ⌘+V to inspect your clipboard data"]
-             [:div.mx-auto "or click here to paste if you are using the mobile version"]
+       (list [:div.mx-auto (t :bug-report/inspector-page-desc-1)]
+             [:div.mx-auto (t :bug-report/inspector-page-desc-2)]
              ;; for mobile
              ;; for mobile
-             [:input.form-input.is-large.transition.duration-150.ease-in-out {:type "text" :placeholder "Long press here to paste if you are on mobile"}]
+             [:input.form-input.is-large.transition.duration-150.ease-in-out {:type "text" :placeholder (t :bug-report/inspector-page-placeholder)}]
              [:div.flex.justify-between.items-center.mt-2
              [:div.flex.justify-between.items-center.mt-2
-              [:div "Something wrong? No problem, click to go back to the previous step."]
-              (ui/button "Go back" :on-click #(util/open-url (rfe/href :bug-report)))]))
+              [:div (t :bug-report/inspector-page-tip)]
+              (ui/button (t :bug-report/inspector-page-btn-back) :on-click #(util/open-url (rfe/href :bug-report)))]))
 
 
      (when (= step 1)
      (when (= step 1)
        (list
        (list
-        [:div "Here is the data read from clipboard."]
+        [:div (t :bug-report/inspector-page-desc-clipboard)]
         [:div.flex.justify-between.items-center.mt-2
         [:div.flex.justify-between.items-center.mt-2
-         [:div "If this is okay to share, click the copy button."]
-         (ui/button "Copy the result" :on-click #(copy-result-to-clipboard! (js/JSON.stringify (clj->js result) nil 2)))]
+         [:div (t :bug-report/inspector-page-desc-copy)]
+         (ui/button (t :bug-report/inspector-page-btn-copy) :on-click #(copy-result-to-clipboard! (js/JSON.stringify (clj->js result) nil 2)))]
         [:div.flex.justify-between.items-center.mt-2
         [:div.flex.justify-between.items-center.mt-2
-         [:div "Now you can report the result pasted to your clipboard. Please paste the result in the 'Additional Context' section and state where you copied the original content from. Thanks!"]
-         (ui/button "Create an issue" :href header/bug-report-url)]
+         [:div (t :bug-report/inspector-page-desc-create-issue)]
+         (ui/button (t :bug-report/inspector-page-btn-create-issue) :href header/bug-report-url)]
         [:div.flex.justify-between.items-center.mt-2
         [:div.flex.justify-between.items-center.mt-2
-         [:div "Something wrong? No problem, click to go back to the previous step."]
-         (ui/button "Go back" :on-click reset-step!)]
+         [:div (t :bug-report/inspector-page-tip)]
+         (ui/button (t :bug-report/inspector-page-btn-back) :on-click reset-step!)]
 
 
         [:pre.whitespace-pre-wrap [:code (js/JSON.stringify (clj->js result) nil 2)]]))]))
         [:pre.whitespace-pre-wrap [:code (js/JSON.stringify (clj->js result) nil 2)]]))]))
 
 
@@ -102,17 +103,17 @@
    [:div.flex.flex-col.items-center
    [:div.flex.flex-col.items-center
     [:div.flex.items-center.mb-2
     [:div.flex.items-center.mb-2
      (ui/icon "bug")
      (ui/icon "bug")
-     [:h1.text-3xl.ml-2 "Bug report"]]
-    [:div.opacity-60 "Can you help us out by submitting a bug report? We'll get it sorted out as soon as we can."]]
+     [:h1.text-3xl.ml-2 (t :bug-report/main-title)]]
+    [:div.opacity-60 (t :bug-report/main-desc)]]
    [:div.cp__bug-report-reporter.rounded-lg.p-8.mt-8
    [:div.cp__bug-report-reporter.rounded-lg.p-8.mt-8
-    [:h1.text-2xl "Is the bug you encountered related to these features?"]
-    [:div.opacity-60 "You can use these handy tools to give us additional information."]
-    (report-item-button "Clipboard helper"
-                 "Inspect and collect clipboard data"
+    [:h1.text-2xl (t :bug-report/section-clipboard-title)]
+    [:div.opacity-60 (t :bug-report/section-clipboard-desc)]
+    (report-item-button (t :bug-report/section-clipboard-btn-title)
+                 (t :bug-report/section-clipboard-btn-desc)
                  "clipboard"
                  "clipboard"
                  {:on-click #(util/open-url (rfe/href :bug-report-tools {:tool "clipboard-data-inspector"}))})
                  {:on-click #(util/open-url (rfe/href :bug-report-tools {:tool "clipboard-data-inspector"}))})
     [:div.py-2] ;; divider
     [:div.py-2] ;; divider
     [:div.flex.flex-col
     [:div.flex.flex-col
-     [:h1.text-2xl "Or..."]
-     [:div.opacity-60 "If there are no tools available for you to gather additional information, please report the bug directly."]
-     (report-item-button "Submit a bug report" "Help Make Logseq Better!" "message-report" {:on-click #(util/open-url header/bug-report-url)})]]])
+     [:h1.text-2xl (t :bug-report/section-issues-title)]
+     [:div.opacity-60 (t :bug-report/section-issues-desc)]
+     (report-item-button (t :bug-report/section-issues-btn-title) (t :bug-report/section-issues-btn-desc) "message-report" {:on-click #(util/open-url header/bug-report-url)})]]])

+ 24 - 24
src/main/frontend/components/onboarding/quick_tour.cljs

@@ -18,7 +18,7 @@
   [^js jsTour]
   [^js jsTour]
   (let [^js el (js/document.createElement "button")]
   (let [^js el (js/document.createElement "button")]
     (.add (.-classList el) "cp__onboarding-skip-quick-tour")
     (.add (.-classList el) "cp__onboarding-skip-quick-tour")
-    (set! (.-innerHTML el) (h/render-html [:span [:i.ti.ti-player-skip-forward] "Skip Quick Tour"]))
+    (set! (.-innerHTML el) (h/render-html [:span [:i.ti.ti-player-skip-forward] (t :on-boarding/quick-tour-btn-skip)]))
     (.addEventListener el "click" #(.cancel jsTour))
     (.addEventListener el "click" #(.cancel jsTour))
     [#(.appendChild js/document.body el)
     [#(.appendChild js/document.body el)
      #(.removeChild js/document.body el)]))
      #(.removeChild js/document.body el)]))
@@ -36,21 +36,21 @@
 
 
   (h/render-html
   (h/render-html
    [:div.steps
    [:div.steps
-    [:strong (str "STEP " current)]
+    [:strong (str (t :on-boarding/quick-tour-steps) current)]
     [:ul (for [i (range total)] [:li {:class (when (= current (inc i)) "active")} i])]]))
     [:ul (for [i (range total)] [:li {:class (when (= current (inc i)) "active")} i])]]))
 
 
 (defn- create-steps! [^js jsTour]
 (defn- create-steps! [^js jsTour]
   [
   [
    ;; step 1
    ;; step 1
    {:id                "nav-help"
    {:id                "nav-help"
-    :text              (h/render-html [:section [:h2 "❓ Help"]
-                                       [:p "You can always click here for help and other information about Logseq."]])
+    :text              (h/render-html [:section [:h2 (t :on-boarding/quick-tour-help-title)]
+                                       [:p (t :on-boarding/quick-tour-help-desc)]])
     :attachTo          {:element ".cp__sidebar-help-btn" :on "top"}
     :attachTo          {:element ".cp__sidebar-help-btn" :on "top"}
     :beforeShowPromise #(if (state/sub :ui/sidebar-open?)
     :beforeShowPromise #(if (state/sub :ui/sidebar-open?)
                           (wait-target state/hide-right-sidebar! 700)
                           (wait-target state/hide-right-sidebar! 700)
                           (p/resolved true))
                           (p/resolved true))
     :canClickTarget    true
     :canClickTarget    true
-    :buttons           [{:text "Next" :action (.-next jsTour)}]
+    :buttons           [{:text (t :on-boarding/quick-tour-btn-next) :action (.-next jsTour)}]
     :popperOptions     {:modifiers [{:name    "preventOverflow"
     :popperOptions     {:modifiers [{:name    "preventOverflow"
                                      :options {:padding 20}}
                                      :options {:padding 20}}
                                     {:name    "offset"
                                     {:name    "offset"
@@ -58,11 +58,11 @@
 
 
    ;; step 2
    ;; step 2
    {:id                "nav-journal-page"
    {:id                "nav-journal-page"
-    :text              (h/render-html [:section [:h2 "📆 Daily Journal Page"]
+    :text              (h/render-html [:section [:h2 (t :on-boarding/quick-tour-journal-page-title)]
                                        [:p
                                        [:p
-                                        [:span "This is today’s daily journal page. Here you can dump your thoughts, learnings and ideas. Don’t worry about organizing. Just write and"]
-                                        [:a "[[link]]"]
-                                        [:span "your thoughts."]]])
+                                        [:span (t :on-boarding/quick-tour-journal-page-desc-1)]
+                                        [:a (t :on-boarding/quick-tour-journal-page-desc-2)]
+                                        [:span (t :on-boarding/quick-tour-journal-page-desc-3)]]])
 
 
     :attachTo          {:element ".page.is-journals .page-title" :on "top-end"}
     :attachTo          {:element ".page.is-journals .page-title" :on "top-end"}
     :beforeShowPromise #(if-not (= (util/safe-lower-case (state/get-current-page))
     :beforeShowPromise #(if-not (= (util/safe-lower-case (state/get-current-page))
@@ -71,8 +71,8 @@
                                          (route-handler/redirect-to-page! (date/today))
                                          (route-handler/redirect-to-page! (date/today))
                                          (util/scroll-to-top)) 200)
                                          (util/scroll-to-top)) 200)
                           (p/resolved true))
                           (p/resolved true))
-    :buttons           [{:text "Back" :classes "back" :action (.-back jsTour)}
-                        {:text "Next" :action (.-next jsTour)}]
+    :buttons           [{:text (t :on-boarding/quick-tour-btn-back) :classes "back" :action (.-back jsTour)}
+                        {:text (t :on-boarding/quick-tour-btn-next) :action (.-next jsTour)}]
     :popperOptions     {:modifiers [{:name    "preventOverflow"
     :popperOptions     {:modifiers [{:name    "preventOverflow"
                                      :options {:padding 63}}
                                      :options {:padding 63}}
                                     {:name    "offset"
                                     {:name    "offset"
@@ -80,13 +80,13 @@
 
 
    ;; step 3
    ;; step 3
    {:id                "nav-left-sidebar"
    {:id                "nav-left-sidebar"
-    :text              (h/render-html [:section [:h2 "👀 Left Sidebar"]
-                                       [:p [:span "Open the left sidebar to explore important menu items in Logseq."]]])
+    :text              (h/render-html [:section [:h2 (t :on-boarding/quick-tour-left-sidebar-title)]
+                                       [:p [:span (t :on-boarding/quick-tour-left-sidebar-desc)]]])
 
 
     :attachTo          {:element "#left-menu" :on "top"}
     :attachTo          {:element "#left-menu" :on "top"}
     :beforeShowPromise #(p/resolved true)
     :beforeShowPromise #(p/resolved true)
-    :buttons           [{:text "Back" :classes "back" :action (.-back jsTour)}
-                        {:text "Next" :action (.-next jsTour)}]
+    :buttons           [{:text (t :on-boarding/quick-tour-btn-back) :classes "back" :action (.-back jsTour)}
+                        {:text (t :on-boarding/quick-tour-btn-next) :action (.-next jsTour)}]
     :popperOptions     {:modifiers [{:name    "preventOverflow"
     :popperOptions     {:modifiers [{:name    "preventOverflow"
                                      :options {:padding 20}}
                                      :options {:padding 20}}
                                     {:name    "offset"
                                     {:name    "offset"
@@ -94,15 +94,15 @@
 
 
    ;; step 4
    ;; step 4
    {:id                "nav-favorites"
    {:id                "nav-favorites"
-    :text              (h/render-html [:section [:h2 "⭐️ Favorites"]
-                                       [:p "Pin your favorite pages via the `... `menu on any page."]
-                                       [:p "We’ve also added some template pages here to help you get started. You can remove these once you start writing your own notes."]])
+    :text              (h/render-html [:section [:h2 (t :on-boarding/quick-tour-favorites-title)]
+                                       [:p (t :on-boarding/quick-tour-favorites-desc-1)]
+                                       [:p (t :on-boarding/quick-tour-favorites-desc-2)]])
     :beforeShowPromise #(if-not (state/sub :ui/left-sidebar-open?)
     :beforeShowPromise #(if-not (state/sub :ui/left-sidebar-open?)
                           (wait-target state/toggle-left-sidebar! 500)
                           (wait-target state/toggle-left-sidebar! 500)
                           (p/resolved true))
                           (p/resolved true))
     :attachTo          {:element ".nav-content-item.favorites" :on "right"}
     :attachTo          {:element ".nav-content-item.favorites" :on "right"}
-    :buttons           [{:text "Back" :classes "back" :action (.-back jsTour)}
-                        {:text "Finish" :action (.-complete jsTour)}]}
+    :buttons           [{:text (t :on-boarding/quick-tour-btn-back) :classes "back" :action (.-back jsTour)}
+                        {:text (t :on-boarding/quick-tour-btn-finish) :action (.-complete jsTour)}]}
    ])
    ])
 
 
 (defn- create-steps-file-sync! [^js jsTour]
 (defn- create-steps-file-sync! [^js jsTour]
@@ -164,7 +164,7 @@
                          (wait-target ".nav-header .whiteboard" 500)
                          (wait-target ".nav-header .whiteboard" 500)
                          (util/scroll-to-top))
                          (util/scroll-to-top))
     :canClickTarget    true
     :canClickTarget    true
-    :buttons           [{:text "Next" :action (.-next jsTour)}]
+    :buttons           [{:text (t :on-boarding/tour-whiteboard-btn-next) :action (.-next jsTour)}]
     :popperOptions     {:modifiers [{:name    "preventOverflow"
     :popperOptions     {:modifiers [{:name    "preventOverflow"
                                      :options {:padding 20}}
                                      :options {:padding 20}}
                                     {:name    "offset"
                                     {:name    "offset"
@@ -178,8 +178,8 @@
                          (route-handler/redirect-to-whiteboard-dashboard!)
                          (route-handler/redirect-to-whiteboard-dashboard!)
                          (wait-target ".dashboard-create-card" 500))
                          (wait-target ".dashboard-create-card" 500))
     :attachTo          {:element ".dashboard-create-card" :on "bottom"}
     :attachTo          {:element ".dashboard-create-card" :on "bottom"}
-    :buttons           [{:text "Back" :classes "back" :action (.-back jsTour)}
-                        {:text "Finish" :action (.-complete jsTour)}]
+    :buttons           [{:text (t :on-boarding/tour-whiteboard-btn-back) :classes "back" :action (.-back jsTour)}
+                        {:text (t :on-boarding/tour-whiteboard-btn-finish) :action (.-complete jsTour)}]
     :popperOptions     {:modifiers [{:name    "preventOverflow"
     :popperOptions     {:modifiers [{:name    "preventOverflow"
                                      :options {:padding 20}}
                                      :options {:padding 20}}
                                     {:name    "offset"
                                     {:name    "offset"
@@ -277,7 +277,7 @@
 
 
 (defn init []
 (defn init []
   (command-palette/register {:id     :document/quick-tour
   (command-palette/register {:id     :document/quick-tour
-                             :desc   "Quick tour for onboarding"
+                             :desc   (t :on-boarding/command-palette-quick-tour)
                              :action #(ready start)})
                              :action #(ready start)})
 
 
   ;; TODO: fix logic
   ;; TODO: fix logic

+ 23 - 23
src/main/frontend/components/onboarding/setups.cljs

@@ -30,13 +30,13 @@
 
 
       [:h1.text-xl
       [:h1.text-xl
        (if picker?
        (if picker?
-         [:span [:strong (ui/icon "heart")] "Welcome to " [:strong "Logseq!"]]
-         [:span [:strong (ui/icon "file-import")] "Import existing notes"])]
+         [:span [:strong (ui/icon "heart")] (t :on-boarding/main-title) [:strong "Logseq!"]]
+         [:span [:strong (ui/icon "file-import")] (t :on-boarding/importing-main-title)])]
 
 
       [:h2
       [:h2
        (if picker?
        (if picker?
-         "First you need to choose a folder where Logseq will store your thoughts, ideas, notes."
-         "You can also do this later in the app.")]
+         (t :on-boarding/main-desc)
+         (t :on-boarding/importing-main-desc))]
 
 
       content])])
       content])])
 
 
@@ -93,8 +93,8 @@
 
 
               (if parsing?
               (if parsing?
                 (ui/loading "")
                 (ui/loading "")
-                [[:strong "Choose a folder"]
-                 [:small "Open existing directory or Create a new one"]])]]]
+                [[:strong (t :on-boarding/section-btn-title)]
+                 [:small (t :on-boarding/section-btn-desc)]])]]]
            [:div.px-5
            [:div.px-5
             (ui/admonition :warning
             (ui/admonition :warning
                            (widgets/native-fs-api-alert))]))]
                            (widgets/native-fs-api-alert))]))]
@@ -102,22 +102,22 @@
        [:p.flex
        [:p.flex
         [:i.as-flex-center (ui/icon "zoom-question" {:style {:fontSize "22px"}})]
         [:i.as-flex-center (ui/icon "zoom-question" {:style {:fontSize "22px"}})]
         [:span.flex-1.flex.flex-col
         [:span.flex-1.flex.flex-col
-         [:strong "How Logseq saves your work"]
-         [:small.opacity-60 "Inside the directory you choose, Logseq will create 4 folders."]]]
+         [:strong (t :on-boarding/section-title)]
+         [:small.opacity-60 (t :on-boarding/section-desc)]]]
 
 
        [:p.text-sm.pt-5.tracking-wide
        [:p.text-sm.pt-5.tracking-wide
-        [:span (str "Each page is a file stored only on your " DEVICE ".")]
+        [:span (str (t :on-boarding/section-tip-1) DEVICE ".")]
         [:br]
         [:br]
-        [:span "You may choose to sync it later."]]
+        [:span (t :on-boarding/section-tip-2)]]
 
 
        [:ul
        [:ul
         (for [[title label icon]
         (for [[title label icon]
-              [["Graphics & Documents" "/assets" "whiteboard"]
-               ["Daily notes" "/journals" "calendar-plus"]
-               ["PAGES" "/pages" "page"]
+              [[(t :on-boarding/section-assets) "/assets" "whiteboard"]
+               [(t :on-boarding/section-journals) "/journals" "calendar-plus"]
+               [(t :on-boarding/section-pages) "/pages" "page"]
                []
                []
-               ["APP Internal" "/logseq" "tool"]
-               ["Config File" "/logseq/config.edn"]]]
+               [(t :on-boarding/section-app) "/logseq" "tool"]
+               [(t :on-boarding/section-config) "/logseq/config.edn"]]]
           (if-not title
           (if-not title
             [:li.hr]
             [:li.hr]
             [:li
             [:li
@@ -221,14 +221,14 @@
      :importer
      :importer
      [:article.flex.flex-col.items-center.importer.py-16.px-8
      [:article.flex.flex-col.items-center.importer.py-16.px-8
       [:section.c.text-center
       [:section.c.text-center
-       [:h1 "Do you already have notes that you want to import?"]
-       [:h2 "If they are in a JSON, EDN or Markdown format Logseq can work with them."]]
+       [:h1 (t :on-boarding/importing-title)]
+       [:h2 (t :on-boarding/importing-desc)]]
       [:section.d.md:flex
       [:section.d.md:flex
        [:label.action-input.flex.items-center.mx-2.my-2
        [:label.action-input.flex.items-center.mx-2.my-2
         [:span.as-flex-center [:i (svg/roam-research 28)]]
         [:span.as-flex-center [:i (svg/roam-research 28)]]
         [:div.flex.flex-col
         [:div.flex.flex-col
-         [[:strong "RoamResearch"]
-          [:small "Import a JSON Export of your Roam graph"]]]
+         [[:strong (t :on-boarding/importing-roam-title)]
+          [:small (t :on-boarding/importing-roam-desc)]]]
         [:input.absolute.hidden
         [:input.absolute.hidden
          {:id        "import-roam"
          {:id        "import-roam"
           :type      "file"
           :type      "file"
@@ -237,8 +237,8 @@
        [:label.action-input.flex.items-center.mx-2.my-2
        [:label.action-input.flex.items-center.mx-2.my-2
         [:span.as-flex-center [:i (svg/logo 28)]]
         [:span.as-flex-center [:i (svg/logo 28)]]
         [:span.flex.flex-col
         [:span.flex.flex-col
-         [[:strong "EDN / JSON"]
-          [:small "Import an EDN or a JSON Export of your Logseq graph"]]]
+         [[:strong (t :on-boarding/importing-lsq-title)]
+          [:small (t :on-boarding/importing-lsq-desc)]]]
         [:input.absolute.hidden
         [:input.absolute.hidden
          {:id        "import-lsq"
          {:id        "import-lsq"
           :type      "file"
           :type      "file"
@@ -247,8 +247,8 @@
        [:label.action-input.flex.items-center.mx-2.my-2
        [:label.action-input.flex.items-center.mx-2.my-2
         [:span.as-flex-center (ui/icon "sitemap" {:style {:fontSize "26px"}})]
         [:span.as-flex-center (ui/icon "sitemap" {:style {:fontSize "26px"}})]
         [:span.flex.flex-col
         [:span.flex.flex-col
-         [[:strong "OPML"]
-          [:small " Import OPML files"]]]
+         [[:strong (t :on-boarding/importing-opml-title)]
+          [:small (t :on-boarding/importing-opml-desc)]]]
 
 
         [:input.absolute.hidden
         [:input.absolute.hidden
          {:id        "import-opml"
          {:id        "import-opml"

+ 1 - 1
src/main/frontend/components/search.cljs

@@ -408,7 +408,7 @@
                     true)]
                     true)]
         (ui/tippy {:html [:div
         (ui/tippy {:html [:div
                           ;; TODO: fetch from config
                           ;; TODO: fetch from config
-                          "Tip: " [:code (util/->platform-shortcut "Ctrl + Shift + p")] " to open the commands palette"]
+                          (t :search/command-palette-tip-1) [:code (util/->platform-shortcut "Ctrl + Shift + p")] (t :search/command-palette-tip-2)]
                    :interactive     true
                    :interactive     true
                    :arrow           true
                    :arrow           true
                    :theme       "monospace"}
                    :theme       "monospace"}

+ 16 - 18
src/main/frontend/components/settings.cljs

@@ -104,7 +104,7 @@
 
 
           "update-available"
           "update-available"
           (let [{:keys [name url]} payload]
           (let [{:keys [name url]} payload]
-            [:p (str "Found new release ")
+            [:p (str (t :settings-page/update-available))
              [:a.link
              [:a.link
               {:on-click
               {:on-click
                (fn [e]
                (fn [e]
@@ -113,7 +113,7 @@
               svg/external-link name " 🎉"]])
               svg/external-link name " 🎉"]])
 
 
           "error"
           "error"
-          [:p "⚠️ Oops, Something Went Wrong!" [:br] " Please check out the "
+          [:p (t :settings-page/update-error-1) [:br] (t :settings-page/update-error-2)
            [:a.link
            [:a.link
             {:on-click
             {:on-click
              (fn [e]
              (fn [e]
@@ -295,12 +295,12 @@
 
 
 (defn theme-modes-row [t switch-theme system-theme? dark?]
 (defn theme-modes-row [t switch-theme system-theme? dark?]
   (let [pick-theme [:ul.theme-modes-options
   (let [pick-theme [:ul.theme-modes-options
-                    [:li {:on-click (partial state/use-theme-mode! "light")
-                          :class    (classnames [{:active (and (not system-theme?) (not dark?))}])} [:i.mode-light] [:strong "light"]]
-                    [:li {:on-click (partial state/use-theme-mode! "dark")
-                          :class    (classnames [{:active (and (not system-theme?) dark?)}])} [:i.mode-dark] [:strong "dark"]]
-                    [:li {:on-click (partial state/use-theme-mode! "system")
-                          :class    (classnames [{:active system-theme?}])} [:i.mode-system] [:strong "system"]]]]
+                    [:li {:on-click (partial state/use-theme-mode! (t :settings-page/theme-light))
+                          :class    (classnames [{:active (and (not system-theme?) (not dark?))}])} [:i.mode-light] [:strong (t :settings-page/theme-light)]]
+                    [:li {:on-click (partial state/use-theme-mode! (t :settings-page/theme-dark))
+                          :class    (classnames [{:active (and (not system-theme?) dark?)}])} [:i.mode-dark] [:strong (t :settings-page/theme-dark)]]
+                    [:li {:on-click (partial state/use-theme-mode! (t :settings-page/theme-system))
+                          :class    (classnames [{:active system-theme?}])} [:i.mode-system] [:strong (t :settings-page/theme-system)]]]]
     (row-with-button-action {:left-label (t :right-side-bar/switch-theme (string/capitalize switch-theme))
     (row-with-button-action {:left-label (t :right-side-bar/switch-theme (string/capitalize switch-theme))
                              :-for       "toggle_theme"
                              :-for       "toggle_theme"
                              :action     pick-theme
                              :action     pick-theme
@@ -342,7 +342,7 @@
                       (when-not (string/blank? format)
                       (when-not (string/blank? format)
                         (config-handler/set-config! :journal/page-title-format format)
                         (config-handler/set-config! :journal/page-title-format format)
                         (notification/show!
                         (notification/show!
-                          [:div "You must re-index your graph for this change to take effect"]
+                          [:div (t :settings-page/custom-date-format-notification)]
                           :warning false)
                           :warning false)
                         (state/close-modal!)
                         (state/close-modal!)
                         (route-handler/redirect! {:to :repos}))))}
                         (route-handler/redirect! {:to :repos}))))}
@@ -690,18 +690,16 @@
    [:div.text-sm.my-4
    [:div.text-sm.my-4
     (ui/admonition
     (ui/admonition
      :tip
      :tip
-     [:p "If you have Logseq Sync enabled, you can view a page's edit history directly. This section is for tech-savvy only."])
+     [:p (t :settings-page/git-tip)])
     [:span.text-sm.opacity-50.my-4 
     [:span.text-sm.opacity-50.my-4 
-     "To view page's edit history, click the three horizontal dots in the top-right corner and select \"View page history\"."]
+     (t :settings-page/git-desc-1)]
     [:br][:br]
     [:br][:br]
     [:span.text-sm.opacity-50.my-4
     [:span.text-sm.opacity-50.my-4
-     "For professional users, Logseq also supports using "]
+     (t :settings-page/git-desc-2)]
     [:a {:href "https://git-scm.com/" :target "_blank"}
     [:a {:href "https://git-scm.com/" :target "_blank"}
      "Git"]
      "Git"]
     [:span.text-sm.opacity-50.my-4
     [:span.text-sm.opacity-50.my-4
-     " for version control."]
-    [:span.text-sm.opacity-50.my-4
-     "Use Git at your own risk as general Git issues are not supported by the Logseq team"]]
+     (t :settings-page/git-desc-3)]]
    [:br]
    [:br]
    (switch-git-auto-commit-row t)
    (switch-git-auto-commit-row t)
    (git-auto-commit-seconds t)
    (git-auto-commit-seconds t)
@@ -997,11 +995,11 @@
          {:class (when-not user-handler/alpha-or-beta-user? "opacity-50 pointer-events-none cursor-not-allowed")}
          {:class (when-not user-handler/alpha-or-beta-user? "opacity-50 pointer-events-none cursor-not-allowed")}
          (sync-switcher-row enable-sync?)
          (sync-switcher-row enable-sync?)
          [:div.text-sm
          [:div.text-sm
-          "Click"
+          (t :settings-page/sync-desc-1)
           [:a.mx-1 {:href "https://blog.logseq.com/how-to-setup-and-use-logseq-sync/"
           [:a.mx-1 {:href "https://blog.logseq.com/how-to-setup-and-use-logseq-sync/"
                     :target "_blank"}
                     :target "_blank"}
-           "here"]
-          "for instructions on how to set up and use Sync."]]])]))
+           (t :settings-page/sync-desc-2)]
+          (t :settings-page/sync-desc-3)]]])]))
 
 
      ;; (when-not web-platform?
      ;; (when-not web-platform?
      ;;   [:<>
      ;;   [:<>

+ 2 - 2
src/main/frontend/components/whiteboard.cljs

@@ -146,7 +146,7 @@
   [page-name]
   [page-name]
   (let [page-entity (model/get-page page-name)
   (let [page-entity (model/get-page page-name)
         {:block/keys [updated-at created-at]} page-entity]
         {:block/keys [updated-at created-at]} page-entity]
-    (str (if (= created-at updated-at) "Created " "Edited ")
+    (str (if (= created-at updated-at) (t :whiteboard/dashboard-card-created) (t :whiteboard/dashboard-card-edited))
          (util/time-ago (js/Date. updated-at)))))
          (util/time-ago (js/Date. updated-at)))))
 
 
 (rum/defc dashboard-preview-card
 (rum/defc dashboard-preview-card
@@ -190,7 +190,7 @@
       (whiteboard-handler/create-new-whiteboard-and-redirect!))}
       (whiteboard-handler/create-new-whiteboard-and-redirect!))}
    (ui/icon "plus")
    (ui/icon "plus")
    [:span.dashboard-create-card-caption.select-none
    [:span.dashboard-create-card-caption.select-none
-    "New whiteboard"]])
+    (t :whiteboard/dashboard-card-new-whiteboard)]])
 
 
 (rum/defc whiteboard-dashboard
 (rum/defc whiteboard-dashboard
   []
   []

+ 27 - 26
src/main/frontend/extensions/srs.cljs

@@ -28,7 +28,8 @@
             [clojure.string :as string]
             [clojure.string :as string]
             [rum.core :as rum]
             [rum.core :as rum]
             [frontend.modules.shortcut.core :as shortcut]
             [frontend.modules.shortcut.core :as shortcut]
-            [medley.core :as medley]))
+            [medley.core :as medley]
+            [frontend.context.i18n :refer [t]]))
 
 
 ;;; ================================================================
 ;;; ================================================================
 ;;; Commentary
 ;;; Commentary
@@ -409,7 +410,7 @@
     (reset! *phase 1)))
     (reset! *phase 1)))
 
 
 (def review-finished
 (def review-finished
-  [:p.p-2 "Congrats, you've reviewed all the cards for this query, see you next time! 💯"])
+  [:p.p-2 (t :flashcards/modal-finished)])
 
 
 (defn- btn-with-shortcut [{:keys [shortcut id btn-text background on-click class]}]
 (defn- btn-with-shortcut [{:keys [shortcut id btn-text background on-click class]}]
   (ui/button
   (ui/button
@@ -457,9 +458,9 @@
            [:div.flex.my-4.justify-between
            [:div.flex.my-4.justify-between
             (when-not (and (not preview?) (= next-phase 1))
             (when-not (and (not preview?) (= next-phase 1))
               (btn-with-shortcut {:btn-text (case next-phase
               (btn-with-shortcut {:btn-text (case next-phase
-                                              1 "Hide answers"
-                                              2 "Show answers"
-                                              3 "Show clozes")
+                                              1 (t :flashcards/modal-btn-hide-answers)
+                                              2 (t :flashcards/modal-btn-show-answers)
+                                              3 (t :flashcards/modal-btn-show-clozes))
                                   :shortcut  "s"
                                   :shortcut  "s"
                                   :id "card-answers"
                                   :id "card-answers"
                                   :class "mr-2"
                                   :class "mr-2"
@@ -467,7 +468,7 @@
             (when (and (not= @card-index (count blocks))
             (when (and (not= @card-index (count blocks))
                        cards?
                        cards?
                        preview?)
                        preview?)
-              (btn-with-shortcut {:btn-text "Next"
+              (btn-with-shortcut {:btn-text (t :flashcards/modal-btn-next-card)
                                   :shortcut "n"
                                   :shortcut "n"
                                   :id       "card-next"
                                   :id       "card-next"
                                   :class    "mr-2"
                                   :class    "mr-2"
@@ -477,7 +478,7 @@
 
 
             (when (and (not preview?) (= 1 next-phase))
             (when (and (not preview?) (= 1 next-phase))
               [:<>
               [:<>
-               (btn-with-shortcut {:btn-text   "Forgotten"
+               (btn-with-shortcut {:btn-text   (t :flashcards/modal-btn-forgotten)
                                    :shortcut   "f"
                                    :shortcut   "f"
                                    :id         "card-forgotten"
                                    :id         "card-forgotten"
                                    :background "red"
                                    :background "red"
@@ -486,12 +487,12 @@
                                                  (let [tomorrow (tc/to-string (t/plus (t/today) (t/days 1)))]
                                                  (let [tomorrow (tc/to-string (t/plus (t/today) (t/days 1)))]
                                                    (editor-property/set-block-property! root-block-id card-next-schedule-property tomorrow)))})
                                                    (editor-property/set-block-property! root-block-id card-next-schedule-property tomorrow)))})
 
 
-               (btn-with-shortcut {:btn-text (if (util/mobile?) "Hard" "Took a while to recall")
+               (btn-with-shortcut {:btn-text (if (util/mobile?) "Hard" (t :flashcards/modal-btn-recall))
                                    :shortcut "t"
                                    :shortcut "t"
                                    :id       "card-recall"
                                    :id       "card-recall"
                                    :on-click #(score-and-next-card 3 card card-index finished? phase review-records cb)})
                                    :on-click #(score-and-next-card 3 card card-index finished? phase review-records cb)})
 
 
-               (btn-with-shortcut {:btn-text   "Remembered"
+               (btn-with-shortcut {:btn-text   (t :flashcards/modal-btn-remembered)
                                    :shortcut   "r"
                                    :shortcut   "r"
                                    :id         "card-remembered"
                                    :id         "card-remembered"
                                    :background "green"
                                    :background "green"
@@ -499,10 +500,10 @@
 
 
             (when preview?
             (when preview?
               (ui/tippy {:html [:div.text-sm
               (ui/tippy {:html [:div.text-sm
-                                "Reset this card so that you can review it immediately."]
+                                (t :flashcards/modal-btn-reset-tip)]
                          :class "tippy-hover"
                          :class "tippy-hover"
                          :interactive true}
                          :interactive true}
-                        (ui/button [:span "Reset"]
+                        (ui/button [:span (t :flashcards/modal-btn-reset)]
                                    :id "card-reset"
                                    :id "card-reset"
                                    :class (util/hiccup->class "opacity-60.hover:opacity-100.card-reset")
                                    :class (util/hiccup->class "opacity-60.hover:opacity-100.card-reset")
                                    :on-click (fn [e]
                                    :on-click (fn [e]
@@ -590,11 +591,11 @@
   (let [cards (db-model/get-macro-blocks (state/get-current-repo) "cards")
   (let [cards (db-model/get-macro-blocks (state/get-current-repo) "cards")
         items (->> (map (comp :logseq.macro-arguments :block/properties) cards)
         items (->> (map (comp :logseq.macro-arguments :block/properties) cards)
                    (map (fn [col] (string/join " " col))))
                    (map (fn [col] (string/join " " col))))
-        items (concat items ["All"])]
+        items (concat items [(t :flashcards/modal-select-all)])]
     (component-select/select {:items items
     (component-select/select {:items items
                               :on-chosen on-chosen
                               :on-chosen on-chosen
                               :close-modal? false
                               :close-modal? false
-                              :input-default-placeholder "Switch to"
+                              :input-default-placeholder (t :flashcards/modal-select-switch)
                               :extract-fn nil})))
                               :extract-fn nil})))
 
 
 ;;; register cards macro
 ;;; register cards macro
@@ -627,12 +628,12 @@
                {:on-mouse-down (fn [e]
                {:on-mouse-down (fn [e]
                                  (util/stop e)
                                  (util/stop e)
                                  (toggle-fn))}
                                  (toggle-fn))}
-               [:span.flex (if (string/blank? query-string) "All" query-string)
+               [:span.flex (if (string/blank? query-string) (t :flashcards/modal-select-all) query-string)
                 [:span {:style {:margin-top 2}}
                 [:span {:style {:margin-top 2}}
                  (svg/caret-down)]]])
                  (svg/caret-down)]]])
             (fn [{:keys [toggle-fn]}]
             (fn [{:keys [toggle-fn]}]
               (cards-select {:on-chosen (fn [query]
               (cards-select {:on-chosen (fn [query]
-                                          (let [query' (if (= query "All") "" query)]
+                                          (let [query' (if (= query (t :flashcards/modal-select-all)) "" query)]
                                             (reset! query-atom query')
                                             (reset! query-atom query')
                                             (toggle-fn)))}))
                                             (toggle-fn)))}))
             {:modal-class (util/hiccup->class
             {:modal-class (util/hiccup->class
@@ -642,13 +643,13 @@
 
 
            ;; FIXME: CSS issue
            ;; FIXME: CSS issue
            (if @*preview-mode?
            (if @*preview-mode?
-             (ui/tippy {:html [:div.text-sm "current/total"]
+             (ui/tippy {:html [:div.text-sm (t :flashcards/modal-current-total)]
                         :interactive true}
                         :interactive true}
                        [:div.opacity-60.text-sm.mr-3
                        [:div.opacity-60.text-sm.mr-3
                         @*card-index
                         @*card-index
                         [:span "/"]
                         [:span "/"]
                         total])
                         total])
-             (ui/tippy {:html [:div.text-sm "overdue/total"]
+             (ui/tippy {:html [:div.text-sm (t :flashcards/modal-overdue-total)]
                         ;; :class "tippy-hover"
                         ;; :class "tippy-hover"
                         :interactive true}
                         :interactive true}
                        [:div.opacity-60.text-sm.mr-3
                        [:div.opacity-60.text-sm.mr-3
@@ -657,7 +658,7 @@
                         total]))
                         total]))
 
 
            (ui/tippy
            (ui/tippy
-            {:html [:div.text-sm "Toggle preview mode"]
+            {:html [:div.text-sm (t :flashcards/modal-toggle-preview-mode)]
              :delay [1000, 100]
              :delay [1000, 100]
              :class "tippy-hover"
              :class "tippy-hover"
              :interactive true
              :interactive true
@@ -672,7 +673,7 @@
              "A"])
              "A"])
 
 
            (ui/tippy
            (ui/tippy
-            {:html [:div.text-sm "Toggle random mode"]
+            {:html [:div.text-sm (t :flashcards/modal-toggle-random-mode)]
              :delay [1000, 100]
              :delay [1000, 100]
              :class "tippy-hover"
              :class "tippy-hover"
              :interactive true}
              :interactive true}
@@ -702,15 +703,15 @@
                      *card-index))]])
                      *card-index))]])
       (if (:global? config)
       (if (:global? config)
         [:div.ls-card.content
         [:div.ls-card.content
-         [:h1.title "Time to create a card!"]
+         [:h1.title (t :flashcards/modal-welcome-title)]
 
 
          [:div
          [:div
-          [:p "You can add \"#card\" to any block to turn it into a card or trigger \"/cloze\" to add some clozes."]
+          [:p (t :flashcards/modal-welcome-desc-1)]
           [:img.my-4 {:src "https://docs.logseq.com/assets/2021-07-22_22.28.02_1626964258528_0.gif"}]
           [:img.my-4 {:src "https://docs.logseq.com/assets/2021-07-22_22.28.02_1626964258528_0.gif"}]
-          [:p "You can "
-           [:a {:href "https://docs.logseq.com/#/page/cards" :target "_blank"}
-            "click this link"]
-           " to check the documentation."]]]
+          [:p (t :flashcards/modal-welcome-desc-2)
+           [:a {:href "https://docs.logseq.com/#/page/Flashcards" :target "_blank"}
+            (t :flashcards/modal-welcome-desc-3)]
+           (t :flashcards/modal-welcome-desc-4)]]]
         [:div.opacity-60.custom-query-title.ls-card.content
         [:div.opacity-60.custom-query-title.ls-card.content
          [:div.w-full.flex-1
          [:div.w-full.flex-1
           [:code.p-1 (str "Cards: " query-string)]]
           [:code.p-1 (str "Cards: " query-string)]]
@@ -808,4 +809,4 @@
       (when (nil? @*due-cards-interval)
       (when (nil? @*due-cards-interval)
         ;; refresh every hour
         ;; refresh every hour
         (let [interval (js/setInterval f (* 3600 1000))]
         (let [interval (js/setInterval f (* 3600 1000))]
-          (reset! *due-cards-interval interval))))))
+          (reset! *due-cards-interval interval))))))

+ 106 - 1
src/resources/dicts/en.edn

@@ -17,6 +17,70 @@
  :on-boarding/tour-whiteboard-home-description "Whiteboards have their own section in the app where you can see them at a glance, create new ones or delete them easily."
  :on-boarding/tour-whiteboard-home-description "Whiteboards have their own section in the app where you can see them at a glance, create new ones or delete them easily."
  :on-boarding/tour-whiteboard-new "{1} Create new whiteboard"
  :on-boarding/tour-whiteboard-new "{1} Create new whiteboard"
  :on-boarding/tour-whiteboard-new-description "There are multiple ways of creating a new whiteboard. One of them is always right here in the dashboard."
  :on-boarding/tour-whiteboard-new-description "There are multiple ways of creating a new whiteboard. One of them is always right here in the dashboard."
+ :on-boarding/tour-whiteboard-btn-next "Next"
+ :on-boarding/tour-whiteboard-btn-back "Back"
+ :on-boarding/tour-whiteboard-btn-finish "Finish"
+ :on-boarding/quick-tour-btn-next "Next"
+ :on-boarding/quick-tour-btn-back "Back"
+ :on-boarding/quick-tour-btn-finish "Finish"
+ :on-boarding/quick-tour-btn-skip "Skip Quick Tour"
+ :on-boarding/quick-tour-steps "STEP "
+ :on-boarding/quick-tour-help-title "❓ Help"
+ :on-boarding/quick-tour-help-desc "You can always click here for help and other information about Logseq."
+ :on-boarding/quick-tour-journal-page-title "📆 Daily Journal Page"
+ :on-boarding/quick-tour-journal-page-desc-1 "This is today’s daily journal page. Here you can dump your thoughts, learnings and ideas. Don’t worry about organizing. Just write and"
+ :on-boarding/quick-tour-journal-page-desc-2 "[[link]]"
+ :on-boarding/quick-tour-journal-page-desc-3 "your thoughts."
+ :on-boarding/quick-tour-left-sidebar-title "👀 Left Sidebar"
+ :on-boarding/quick-tour-left-sidebar-desc "Open the left sidebar to explore important menu items in Logseq."
+ :on-boarding/quick-tour-favorites-title "⭐️ Favorites"
+ :on-boarding/quick-tour-favorites-desc-1 "Pin your favorite pages via the `... `menu on any page."
+ :on-boarding/quick-tour-favorites-desc-2 "We’ve also added some template pages here to help you get started. You can remove these once you start writing your own notes."
+ :on-boarding/command-palette-quick-tour "Quick tour for onboarding"
+ :on-boarding/importing-main-title "Import existing notes"
+ :on-boarding/importing-main-desc "You can also do this later in the app."
+ :on-boarding/importing-title "Do you already have notes that you want to import?"
+ :on-boarding/importing-desc "If they are in a JSON, EDN or Markdown format Logseq can work with them."
+ :on-boarding/importing-roam-title "RoamResearch"
+ :on-boarding/importing-roam-desc "Import a JSON Export of your Roam graph"
+ :on-boarding/importing-lsq-title "EDN / JSON"
+ :on-boarding/importing-lsq-desc "Import an EDN or a JSON Export of your Logseq graph"
+ :on-boarding/importing-opml-title "OPML"
+ :on-boarding/importing-opml-desc " Import OPML files"
+ :on-boarding/main-title "Welcome to "
+ :on-boarding/main-desc "First you need to choose a folder where Logseq will store your thoughts, ideas, notes."
+ :on-boarding/section-btn-title "Choose a folder"
+ :on-boarding/section-btn-desc "Open existing directory or Create a new one"
+ :on-boarding/section-title "How Logseq saves your work"
+ :on-boarding/section-desc "Inside the directory you choose, Logseq will create 4 folders."
+ :on-boarding/section-tip-1 "Each page is a file stored only on your "
+ :on-boarding/section-tip-2 "You may choose to sync it later."
+ :on-boarding/section-assets "Graphics & Documents"
+ :on-boarding/section-journals "Daily notes"
+ :on-boarding/section-pages "PAGES"
+ :on-boarding/section-app "APP Internal"
+ :on-boarding/section-config "Config File"
+ :bug-report/main-title "Bug report"
+ :bug-report/main-desc "Can you help us out by submitting a bug report? We'll get it sorted out as soon as we can."
+ :bug-report/section-clipboard-title "Is the bug you encountered related to these features?"
+ :bug-report/section-clipboard-desc "You can use these handy tools to give us additional information."
+ :bug-report/section-clipboard-btn-title "Clipboard helper"
+ :bug-report/section-clipboard-btn-desc "Inspect and collect clipboard data"
+ :bug-report/section-issues-title "Or..."
+ :bug-report/section-issues-desc "If there are no tools available for you to gather additional information, please report the bug directly."
+ :bug-report/section-issues-btn-title "Submit a bug report"
+ :bug-report/section-issues-btn-desc "Help Make Logseq Better!"
+ :bug-report/inspector-page-desc-1 "Press Ctrl+V / ⌘+V to inspect your clipboard data"
+ :bug-report/inspector-page-desc-2 "or click here to paste if you are using the mobile version"
+ :bug-report/inspector-page-placeholder "Long press here to paste if you are on mobile"
+ :bug-report/inspector-page-tip "Something wrong? No problem, click to go back to the previous step."
+ :bug-report/inspector-page-btn-back "Go back"
+ :bug-report/inspector-page-btn-copy "Copy the result"
+ :bug-report/inspector-page-copy-notif "Copied to clipboard!"
+ :bug-report/inspector-page-btn-create-issue "Create an issue"
+ :bug-report/inspector-page-desc-clipboard "Here is the data read from clipboard."
+ :bug-report/inspector-page-desc-copy "If this is okay to share, click the copy button."
+ :bug-report/inspector-page-desc-create-issue "Now you can report the result pasted to your clipboard. Please paste the result in the 'Additional Context' section and state where you copied the original content from. Thanks!"
  :help/title-usage "Usage"
  :help/title-usage "Usage"
  :help/title-community "Community"
  :help/title-community "Community"
  :help/title-development "Development"
  :help/title-development "Development"
@@ -48,6 +112,8 @@
  :search/page-names "Search page names"
  :search/page-names "Search page names"
  :search/recent "Recent search:"
  :search/recent "Recent search:"
  :search/blocks-in-page "Search blocks in page:"
  :search/blocks-in-page "Search blocks in page:"
+ :search/command-palette-tip-1 "Tip: "
+ :search/command-palette-tip-2 " to open the commands palette"
  :search/cache-outdated "Cache is outdated. Please click the 'Re-index' button in the graph's dropdown menu."
  :search/cache-outdated "Cache is outdated. Please click the 'Re-index' button in the graph's dropdown menu."
  :search-item/whiteboard "Whiteboard"
  :search-item/whiteboard "Whiteboard"
  :search-item/page "Page"
  :search-item/page "Page"
@@ -182,9 +248,13 @@
  :context-menu/input-template-name "What's the template's name?"
  :context-menu/input-template-name "What's the template's name?"
  :context-menu/template-include-parent-block "Including the parent block in the template?"
  :context-menu/template-include-parent-block "Including the parent block in the template?"
  :context-menu/template-exists-warning "Template already exists!"
  :context-menu/template-exists-warning "Template already exists!"
- :settings-page/git-confirm "You need to restart the app after updating the Git settings."
+ :settings-page/git-tip "If you have Logseq Sync enabled, you can view a page's edit history directly. This section is for tech-savvy only."
+ :settings-page/git-desc-1 "To view page's edit history, click the three horizontal dots in the top-right corner and select \"View page history\"."
+ :settings-page/git-desc-2 "For professional users, Logseq also supports using "
+ :settings-page/git-desc-3 " for version control. Use Git at your own risk as general Git issues are not supported by the Logseq team."
  :settings-page/git-switcher-label "Enable Git auto commit"
  :settings-page/git-switcher-label "Enable Git auto commit"
  :settings-page/git-commit-delay "Git auto commit seconds"
  :settings-page/git-commit-delay "Git auto commit seconds"
+ :settings-page/git-confirm "You need to restart the app after updating the Git settings."
  :settings-page/edit-config-edn "Edit config.edn"
  :settings-page/edit-config-edn "Edit config.edn"
  :settings-page/edit-global-config-edn "Edit global config.edn"
  :settings-page/edit-global-config-edn "Edit global config.edn"
  :settings-page/edit-custom-css "Edit custom.css"
  :settings-page/edit-custom-css "Edit custom.css"
@@ -192,6 +262,9 @@
  :settings-page/edit-setting "Edit"
  :settings-page/edit-setting "Edit"
  :settings-page/custom-configuration "Custom configuration"
  :settings-page/custom-configuration "Custom configuration"
  :settings-page/custom-global-configuration "Custom global configuration"
  :settings-page/custom-global-configuration "Custom global configuration"
+ :settings-page/theme-light "light"
+ :settings-page/theme-dark "dark"
+ :settings-page/theme-system "system"
  :settings-page/custom-theme "Custom theme"
  :settings-page/custom-theme "Custom theme"
  :settings-page/export-theme "Export theme"
  :settings-page/export-theme "Export theme"
  :settings-page/show-brackets "Show brackets"
  :settings-page/show-brackets "Show brackets"
@@ -207,6 +280,7 @@
  :settings-page/auto-expand-block-refs-tip "This option controls whether to expand the block references automatically when zoom-in."
  :settings-page/auto-expand-block-refs-tip "This option controls whether to expand the block references automatically when zoom-in."
  :settings-page/custom-date-format "Preferred date format"
  :settings-page/custom-date-format "Preferred date format"
  :settings-page/custom-date-format-warning "Re-index required! Existing journal references would be broken!"
  :settings-page/custom-date-format-warning "Re-index required! Existing journal references would be broken!"
+ :settings-page/custom-date-format-notification "You must re-index your graph for this change to take effect"
  :settings-page/preferred-pasting-file-hint "When enabled, pasting an image from the internet will download and insert the image. When disabled, it will paste the link to the image."
  :settings-page/preferred-pasting-file-hint "When enabled, pasting an image from the internet will download and insert the image. When disabled, it will paste the link to the image."
  :settings-page/preferred-file-format "Preferred file format"
  :settings-page/preferred-file-format "Preferred file format"
  :settings-page/preferred-workflow "Preferred workflow"
  :settings-page/preferred-workflow "Preferred workflow"
@@ -241,6 +315,9 @@
  :settings-page/beta-features "Beta features"
  :settings-page/beta-features "Beta features"
  :settings-page/login-prompt "To access new features before anyone else you must be an Open Collective Sponsor or Backer of Logseq and therefore log in first."
  :settings-page/login-prompt "To access new features before anyone else you must be an Open Collective Sponsor or Backer of Logseq and therefore log in first."
  :settings-page/sync "Sync"
  :settings-page/sync "Sync"
+ :settings-page/sync-desc-1 "Click"
+ :settings-page/sync-desc-2 "here"
+ :settings-page/sync-desc-3 "for instructions on how to set up and use Sync."
  :settings-page/enable-whiteboards "Whiteboards"
  :settings-page/enable-whiteboards "Whiteboards"
  :settings-page/native-titlebar "Native title bar"
  :settings-page/native-titlebar "Native title bar"
  :settings-page/native-titlebar-desc "Enables the native window title bar on Windows and Linux."
  :settings-page/native-titlebar-desc "Enables the native window title bar on Windows and Linux."
@@ -249,6 +326,9 @@
  :settings-page/revision "Revision: "
  :settings-page/revision "Revision: "
  :settings-page/changelog "What's new?"
  :settings-page/changelog "What's new?"
  :settings-page/app-updated "Your app is up-to-date 🎉"
  :settings-page/app-updated "Your app is up-to-date 🎉"
+ :settings-page/update-available "Found new release "
+ :settings-page/update-error-1 "⚠️ Oops, Something Went Wrong!"
+ :settings-page/update-error-2 " Please check out the "
  :yes "Yes"
  :yes "Yes"
 
 
  :submit "Submit"
  :submit "Submit"
@@ -354,8 +434,33 @@
  :whiteboard/search-only-pages "Search only pages"
  :whiteboard/search-only-pages "Search only pages"
  :whiteboard/cache-outdated "Cache is outdated. Please click the 'Re-index' button in the graph's dropdown menu."
  :whiteboard/cache-outdated "Cache is outdated. Please click the 'Re-index' button in the graph's dropdown menu."
  :whiteboard/shape-quick-links "Shape Quick Links"
  :whiteboard/shape-quick-links "Shape Quick Links"
+ :whiteboard/dashboard-card-new-whiteboard "New whiteboard"
+ :whiteboard/dashboard-card-created "Created "
+ :whiteboard/dashboard-card-edited "Edited "
  :whiteboard/toggle-grid "Toggle grid"
  :whiteboard/toggle-grid "Toggle grid"
  :whiteboard/snap-to-grid "Snap to grid"
  :whiteboard/snap-to-grid "Snap to grid"
+ :flashcards/modal-welcome-title "Time to create a card!"
+ :flashcards/modal-welcome-desc-1 "You can add \"#card\" to any block to turn it into a card or trigger \"/cloze\" to add some clozes."
+ :flashcards/modal-welcome-desc-2 "You can "
+ :flashcards/modal-welcome-desc-3 "click this link"
+ :flashcards/modal-welcome-desc-4 " to check the documentation."
+ :flashcards/modal-btn-show-answers "Show answers"
+ :flashcards/modal-btn-hide-answers "Hide answers"
+ :flashcards/modal-btn-show-clozes "Show clozes"
+ :flashcards/modal-btn-next-card "Next"
+ :flashcards/modal-btn-reset "Reset"
+ :flashcards/modal-btn-reset-tip "Reset this card so that you can review it immediately." 
+ :flashcards/modal-btn-forgotten "Forgotten"
+ :flashcards/modal-btn-remembered "Remembered"
+ :flashcards/modal-btn-recall "Took a while to recall"
+ :flashcards/modal-finished "Congrats, you've reviewed all the cards for this query, see you next time! 💯"
+ :flashcards/modal-select-all "All"
+ :flashcards/modal-select-switch "Switch to"
+ :flashcards/modal-current-total "Current/Total"
+ :flashcards/modal-overdue-total "Overdue/Total"
+ :flashcards/modal-toggle-preview-mode "Toggle preview mode"
+ :flashcards/modal-toggle-random-mode "Toggle random mode"
+
  :page-search "Search in the current page"
  :page-search "Search in the current page"
  :graph-search "Search graph"
  :graph-search "Search graph"
  :home "Home"
  :home "Home"