diff --git a/bb.edn b/bb.edn index f8fa6394c2..e151a253d4 100644 --- a/bb.edn +++ b/bb.edn @@ -1,4 +1,6 @@ -{:paths ["scripts/src"] +{:paths ["scripts/src" "src/main"] + :deps + {medley/medley {:mvn/version "1.3.0"}} :tasks {dev:watch logseq.tasks.dev/watch diff --git a/docs/contributing-to-translations.md b/docs/contributing-to-translations.md index 64bfb30734..f050bb1ab4 100644 --- a/docs/contributing-to-translations.md +++ b/docs/contributing-to-translations.md @@ -16,10 +16,7 @@ In order to run the commands in this doc, you will need to install Language translations are in two files, [frontend/dicts.cljs](https://github.com/logseq/logseq/blob/master/src/main/frontend/dicts.cljs) and -[shortcut/dict.cljs](https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/dict.cljs). -When translating `shortcut/dict.cljs` you will want to refer to -https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/config.cljs -for the English equivalent. +[shortcut/dict.cljs](https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/dicts.cljs). ## Language Overview @@ -88,4 +85,4 @@ detect this error and helpfully show you what was typoed. To add a new language, add an entry to `frontend.dicts/languages`. Then add a new locale keyword to `frontend.dicts/dicts` and to -`frontend.modules.shortcut.dict/dict` and start translating as described above. +`frontend.modules.shortcut.dicts/dicts` and start translating as described above. diff --git a/scripts/src/logseq/tasks/lang.clj b/scripts/src/logseq/tasks/lang.clj index c3e9b7bd26..919f943b4c 100644 --- a/scripts/src/logseq/tasks/lang.clj +++ b/scripts/src/logseq/tasks/lang.clj @@ -1,58 +1,28 @@ (ns logseq.tasks.lang "Tasks related to language translations" - (:require [logseq.tasks.rewrite-clj :as rewrite-clj] - [clojure.set :as set] + (:require [clojure.set :as set] + [frontend.dicts :as dicts] + [frontend.modules.shortcut.dicts :as shortcut-dicts] [logseq.tasks.util :as task-util])) (defn- get-dicts [] - (dissoc (rewrite-clj/metadata-var-sexp "src/main/frontend/dicts.cljs" "dicts") - :tongue/fallback)) + (dissoc dicts/dicts :tongue/fallback)) -(defn- get-non-en-shortcuts +(defn- get-all-dicts [] - (nth (rewrite-clj/metadata-var-sexp "src/main/frontend/modules/shortcut/dict.cljs" - "dict") - 3)) - -;; unnecessary complexity :( -(defn- decorate-namespace [k] - (let [n (name k) - ns (namespace k)] - (keyword (str "command." ns) n))) - -(defn- get-en-shortcut-dicts - [] - (->> (rewrite-clj/metadata-var-sexp - "src/main/frontend/modules/shortcut/config.cljs" - "all-default-keyboard-shortcuts") - (map (fn [[k v]] (vector (decorate-namespace k) (:desc v)))) - (into {}))) - -(defn- get-en-categories - [] - (->> (rewrite-clj/metadata-var-sexp - "src/main/frontend/modules/shortcut/config.cljs" - "category") - (map (fn [[k v]] (vector k (:doc (meta v))))) - (into {}))) - -(defn- get-shortcuts - [] - (merge {:en (merge (get-en-categories) - (get-en-shortcut-dicts))} - (get-non-en-shortcuts))) + (merge-with merge (get-dicts) shortcut-dicts/dicts)) (defn- get-languages [] - (->> (rewrite-clj/var-sexp "src/main/frontend/dicts.cljs" "languages") + (->> dicts/languages (map (juxt :value :label)) (into {}))) (defn list-langs "List translated langagues with their number of translations" [] - (let [dicts (merge-with merge (get-dicts) (get-shortcuts)) + (let [dicts (get-all-dicts) en-count (count (dicts :en)) langs (get-languages)] (->> dicts @@ -79,7 +49,7 @@ (println "Language" lang "does not have an entry in dicts.cljs") (System/exit 1)) all-dicts [[(get-dicts) "frontend/dicts.cljs"] - [(get-shortcuts) "shortcut/dict.cljs"]] + [shortcut-dicts/dicts "shortcut/dicts.cljs"]] all-missing (map (fn [[dicts file]] [(select-keys (dicts :en) (set/difference (set (keys (dicts :en))) @@ -102,7 +72,7 @@ (defn invalid-translations "Lists translation that don't exist in English" [] - (let [dicts (merge-with merge (get-dicts) (get-shortcuts)) + (let [dicts (get-all-dicts) ;; For now defined as :en but clj-kondo analysis could be more thorough valid-keys (set (keys (dicts :en))) invalid-dicts @@ -122,7 +92,7 @@ (defn list-duplicates "Lists translations that are the same as the one in English" [& args] - (let [dicts (merge-with merge (get-dicts) (get-shortcuts)) + (let [dicts (get-all-dicts) en-dicts (dicts :en) lang (or (keyword (first args)) (task-util/print-usage "LOCALE")) diff --git a/scripts/src/logseq/tasks/rewrite_clj.clj b/scripts/src/logseq/tasks/rewrite_clj.clj deleted file mode 100644 index 68cfedf134..0000000000 --- a/scripts/src/logseq/tasks/rewrite_clj.clj +++ /dev/null @@ -1,27 +0,0 @@ -(ns logseq.tasks.rewrite-clj - "Rewrite-clj fns" - (:require [rewrite-clj.zip :as z])) - -(defn- find-symbol-value-sexpr - ([zloc sym] (find-symbol-value-sexpr zloc sym z/right)) - ([zloc sym nav-fn] - ;; Returns first symbol found - (-> (z/find-value zloc z/next sym) - nav-fn - z/sexpr))) - -(defn var-sexp - "Returns value sexp to the right of var" - [file string-var] - (let [zloc (z/of-string (slurp file)) - sexp (find-symbol-value-sexpr zloc (symbol string-var))] - (or sexp - (throw (ex-info "var-sexp must not return nil" {:file file :string-var string-var}))))) - -(defn metadata-var-sexp - "Returns value sexp to the right of var with metadata" - [file string-var] - (let [zloc (z/of-string (slurp file)) - sexp (find-symbol-value-sexpr zloc (symbol string-var) (comp z/right z/up))] - (or sexp - (throw (ex-info "sexp must not return nil" {:file file :string-var string-var}))))) diff --git a/src/main/frontend/components/search.cljs b/src/main/frontend/components/search.cljs index 4409911f15..b3bb078d2f 100644 --- a/src/main/frontend/components/search.cljs +++ b/src/main/frontend/components/search.cljs @@ -339,6 +339,9 @@ (search-result-item "Page" original-name)) nil))}))]) +(def default-placeholder + (if config/publishing? (t :search/publishing) (t :search))) + (rum/defcs search-modal < rum/reactive (shortcut/disable-all-shortcuts) (mixins/event-mixin @@ -366,7 +369,7 @@ (t :graph-search) :page (t :page-search) - (t :search)) + default-placeholder) :auto-complete (if (util/chrome?) "chrome-off" "off") ; off not working here :value search-q :on-change (fn [e] diff --git a/src/main/frontend/context/i18n.cljs b/src/main/frontend/context/i18n.cljs index 6a01cbc5b1..571a9c686f 100644 --- a/src/main/frontend/context/i18n.cljs +++ b/src/main/frontend/context/i18n.cljs @@ -1,7 +1,8 @@ (ns frontend.context.i18n (:require [frontend.dicts :as dicts] - [frontend.modules.shortcut.dict :as shortcut-dict] + [frontend.modules.shortcut.dicts :as shortcut-dicts] [medley.core :refer [deep-merge]] + [tongue.core :as tongue] [frontend.state :as state])) ;; TODO @@ -16,14 +17,17 @@ (defonce translate-dicts (atom {})) +(defn- translate [dicts] + (tongue/build-translate dicts)) + (defn t [& args] (let [preferred-language (keyword (state/sub :preferred-language)) _ (when (nil? preferred-language) (state/set-preferred-language! (fetch-local-language))) dicts (or (get @translate-dicts preferred-language) - (let [result (some-> (deep-merge dicts/dicts shortcut-dict/dicts) - dicts/translate)] + (let [result (some-> (deep-merge dicts/dicts shortcut-dicts/dicts) + translate)] (swap! translate-dicts assoc preferred-language result) result))] (apply (partial dicts preferred-language) args))) diff --git a/src/main/frontend/dicts.cljs b/src/main/frontend/dicts.cljc similarity index 99% rename from src/main/frontend/dicts.cljs rename to src/main/frontend/dicts.cljc index 53f19cd50e..a1dc500a08 100644 --- a/src/main/frontend/dicts.cljs +++ b/src/main/frontend/dicts.cljc @@ -1,12 +1,12 @@ -(ns frontend.dicts +(ns ^:bb-compatible frontend.dicts "Provides dictionary entries for most of the application" - (:require [frontend.config :as config] - [shadow.resource :as rc] - [tongue.core :as tongue])) + #?(:cljs (:require [shadow.resource :as rc]))) (def ^:large-vars/data-var dicts - {:en {:tutorial/text (rc/inline "tutorial-en.md") - :tutorial/dummy-notes (rc/inline "dummy-notes-en.md") + {:en {:tutorial/text #?(:cljs (rc/inline "tutorial-en.md") + :default "tutorial-en.md") + :tutorial/dummy-notes #?(:cljs (rc/inline "dummy-notes-en.md") + :default "dummy-notes-en.md") :on-boarding/title "Hi, welcome to Logseq!" :on-boarding/sharing "sharing" :on-boarding/is-a " is a " @@ -296,9 +296,8 @@ :sync-from-local-changes-detected "Refresh detects and processes files modified on your disk and diverged from the actual Logseq page content. Continue?" :unlink "unlink" - :search (if config/publishing? - "Search" - "Search or create page") + :search/publishing "Search" + :search "Search or create page" :page-search "Search in the current page" :graph-search "Search graph" :new-page "New page" @@ -596,9 +595,8 @@ :re-index "Neu indizieren" :export-json "Als JSON exportieren" :unlink "Verknüpfung aufheben" - :search (if config/publishing? - "Suchen" - "Suchen oder Seite erstellen") + :search/publishing "Suchen" + :search "Suchen oder Seite erstellen" :new-page "Neue Seite" :new-file "Neue Datei" :graph "Graph" @@ -881,9 +879,8 @@ :re-index "Ré-indexer" :export-json "Exporter au format JSON" :unlink "délier" - :search (if config/publishing? - "Rechercher" - "Rechercher ou Créer la Page") + :search/publishing "Rechercher" + :search "Rechercher ou Créer la Page" :new-page "Nouvelle page" :new-file "Nouveau fichier" :graph "Graphe" @@ -1197,9 +1194,8 @@ :export-opml "以 OPML 格式导出" :convert-markdown "转换 Markdown 格式(Unordered list 或 Heading)" :unlink "解除绑定" - :search (if config/publishing? - "搜索" - "搜索或者创建新页面") + :search/publishing "搜索" + :search "搜索或者创建新页面" :page-search "在当前页面搜索" :graph-search "搜索图谱" :new-page "新页面" @@ -1526,9 +1522,8 @@ :export-opml "以 OPML 格式導出" :convert-markdown "轉換 Markdown 格式(Unordered list 或 Heading)" :unlink "解除綁定" - :search (if config/publishing? - "搜索" - "搜索或者創建新頁面") + :search/publishing "搜索" + :search "搜索或者創建新頁面" :new-page "新頁面" :graph "圖譜" :publishing "發布/下載 HTML 文件" @@ -2019,9 +2014,8 @@ :close "Cerrar" :re-index "Reindexar" :unlink "desenlazar" - :search (if config/publishing? - "Buscar" - "Buscar o Crear Página") + :search/publishing "Buscar" + :search "Buscar o Crear Página" :page-search "Buscar en la página actual" :new-page "Nueva página" :new-file "Nuevo archivo" @@ -2358,9 +2352,8 @@ :sync-from-local-files "Oppfrisk" :sync-from-local-files-detail "Importer endringer fra lokale filer" :unlink "koble fra" - :search (if config/publishing? - "Søk" - "Søk eller Opprett Side") + :search/publishing "Søk" + :search "Søk eller Opprett Side" :page-search "Søk i denne siden" :graph-search "Søk graf" :new-page "Ny side" @@ -2731,9 +2724,8 @@ :delete "Apagar" :re-index "Re-indexar" :unlink "remover ligação" - :search (if config/publishing? - "Pesquisar" - "Pesquisar ou Criar Página") + :search/publishing "Pesquisar" + :search "Pesquisar ou Criar Página" :page-search "Pesquisar na página atual" :graph-search "Pesquisar grafo" :new-page "Nova página" @@ -3132,9 +3124,8 @@ :sync-from-local-files "Atualizar" :sync-from-local-files-detail "Importar alterações de ficheiros locais" :unlink "remover ligação" - :search (if config/publishing? - "Pesquisar" - "Pesquisar ou Criar Página") + :search/publishing "Pesquisar" + :search "Pesquisar ou Criar Página" :page-search "Pesquisar na página atual" :graph-search "Pesquisar grafo" :new-page "Nova página" @@ -3515,9 +3506,8 @@ :re-index "Переиндексировать (перестроить граф)" :sync-from-local-files "Обновить (импортировать изменния из локальных файлов)" :unlink "отвязать" - :search (if config/publishing? - "Искать" - "Искать или создать страницу") + :search/publishing "Искать" + :search "Искать или создать страницу" :page-search "Искать на текущей странице" :graph-search "Искать граф" :new-page "Новая страница" @@ -3614,7 +3604,6 @@ :tongue/fallback :en}) - (def languages [{:label "English" :value :en} {:label "Français" :value :fr} {:label "Deutsch" :value :de} @@ -3626,6 +3615,3 @@ {:label "Português (Brasileiro)" :value :pt-BR} {:label "Português (Europeu)" :value :pt-PT} {:label "Русский" :value :ru}]) - -(defn translate [dicts] - (tongue/build-translate dicts)) diff --git a/src/main/frontend/modules/shortcut/config.cljs b/src/main/frontend/modules/shortcut/config.cljs index f3507a1acb..dbd9d96f10 100644 --- a/src/main/frontend/modules/shortcut/config.cljs +++ b/src/main/frontend/modules/shortcut/config.cljs @@ -11,7 +11,7 @@ [frontend.handler.search :as search-handler] [frontend.handler.ui :as ui-handler] [frontend.handler.plugin :as plugin-handler] - [frontend.modules.shortcut.dict :as dict] + [frontend.modules.shortcut.dicts :as dicts] [frontend.modules.shortcut.before :as m] [frontend.state :as state] [frontend.util :refer [mac?] :as util] @@ -19,8 +19,13 @@ [clojure.data :as data] [medley.core :as medley])) +;; TODO: Namespace all-default-keyboard-shortcuts keys with `:command` e.g. +;; `:command.date-picker/complete`. They are namespaced in translation but +;; almost everywhere else they are not which could cause needless conflicts +;; with other config keys + ;; To add a new entry to this map, first add it here and then -;; a description for it in frontend.modules.shortcut.dict/all-default-keyboard-shortcuts +;; a description for it in frontend.modules.shortcut.dicts/all-default-keyboard-shortcuts (def ^:large-vars/data-var all-default-keyboard-shortcuts {:date-picker/complete {:binding "enter" :fn ui-handler/shortcut-complete} @@ -364,10 +369,10 @@ (let [keyboard-shortcuts {::keyboard-shortcuts (set (keys all-default-keyboard-shortcuts)) - ::dict/keyboard-shortcuts (set (keys dict/all-default-keyboard-shortcuts))}] - (assert (= (::keyboard-shortcuts keyboard-shortcuts) (::dict/keyboard-shortcuts keyboard-shortcuts)) + ::dicts/keyboard-shortcuts (set (keys dicts/all-default-keyboard-shortcuts))}] + (assert (= (::keyboard-shortcuts keyboard-shortcuts) (::dicts/keyboard-shortcuts keyboard-shortcuts)) (str "Keys for keyboard shortcuts must be the same " - (data/diff (::keyboard-shortcuts keyboard-shortcuts) (::dict/keyboard-shortcuts keyboard-shortcuts))))) + (data/diff (::keyboard-shortcuts keyboard-shortcuts) (::dicts/keyboard-shortcuts keyboard-shortcuts))))) (defn build-category-map [symbols] (reduce into {} @@ -511,7 +516,7 @@ (with-meta {:before m/enable-when-not-editing-mode!}))})) ;; To add a new entry to this map, first add it here and then -;; a description for it in frontend.modules.shortcut.dict/category +;; a description for it in frontend.modules.shortcut.dicts/category (def ^:large-vars/data-var category "Categories for docs purpose" {:shortcut.category/basics @@ -632,10 +637,10 @@ :date-picker/complete]}) (let [category-maps {::category (set (keys category)) - ::dict/category (set (keys dict/category))}] - (assert (= (::category category-maps) (::dict/category category-maps)) + ::dicts/category (set (keys dicts/category))}] + (assert (= (::category category-maps) (::dicts/category category-maps)) (str "Keys for category maps must be the same " - (data/diff (::category category-maps) (::dict/category category-maps))))) + (data/diff (::category category-maps) (::dicts/category category-maps))))) (defn add-shortcut! diff --git a/src/main/frontend/modules/shortcut/dict.cljs b/src/main/frontend/modules/shortcut/dicts.cljc similarity index 99% rename from src/main/frontend/modules/shortcut/dict.cljs rename to src/main/frontend/modules/shortcut/dicts.cljc index c19649ff9c..8c6cc87629 100644 --- a/src/main/frontend/modules/shortcut/dict.cljs +++ b/src/main/frontend/modules/shortcut/dicts.cljc @@ -1,4 +1,4 @@ -(ns ^:bb-compatible frontend.modules.shortcut.dict +(ns ^:bb-compatible frontend.modules.shortcut.dicts "Provides dictionary entries for shortcuts" (:require [medley.core :as medley])) @@ -126,6 +126,9 @@ (def ^:large-vars/data-var dicts {:en (merge + ;; Dynamically add this ns since command descriptions have to + ;; stay in sync with shortcut.config command ids which do not + ;; have a namespce (medley/map-keys decorate-namespace all-default-keyboard-shortcuts) category) :zh-CN {:shortcut.category/formatting "格式化"