mirror of
https://github.com/logseq/logseq.git
synced 2026-02-01 22:47:36 +00:00
Merge branch 'master' into feat/worker-sync
This commit is contained in:
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
* text=auto eol=lf
|
||||
|
||||
*.bat text eol=crlf
|
||||
@@ -1,15 +1,15 @@
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
'use strict'
|
||||
|
||||
module.exports = {
|
||||
singleQuote: true,
|
||||
trailingComma: 'es5',
|
||||
semi: false,
|
||||
}
|
||||
/**
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
*/
|
||||
|
||||
'use strict'
|
||||
|
||||
module.exports = {
|
||||
singleQuote: true,
|
||||
trailingComma: 'es5',
|
||||
semi: false,
|
||||
}
|
||||
|
||||
@@ -50,16 +50,15 @@
|
||||
(deftest block-properties-test
|
||||
(testing "block properties related apis"
|
||||
(page/new-page "test-block-properties-apis")
|
||||
(let [ret (ls-api-call! :editor.appendBlockInPage "test-block-properties-apis" "block-in-page-0" {:properties {:p1 1}})
|
||||
(let [ret (ls-api-call! :editor.appendBlockInPage "test-block-properties-apis" "block-in-page-0" {:properties {:new-p1 1}})
|
||||
uuid' (assert-api-ls-block! ret)
|
||||
prop1 (ls-api-call! :editor.getBlockProperty uuid' "p1")
|
||||
props1 (ls-api-call! :editor.getBlockProperties uuid' "p1")
|
||||
prop1 (ls-api-call! :editor.getBlockProperty uuid' "new-p1")
|
||||
props1 (ls-api-call! :editor.getBlockProperties uuid' "new-p1")
|
||||
props2 (ls-api-call! :editor.getPageProperties "test-block-properties-apis")]
|
||||
(w/wait-for ".property-k:text('p1')")
|
||||
;; FIXME: Assertions below fail
|
||||
;; (is (= 1 (get prop1 "value")))
|
||||
;; (is (= (get prop1 "ident") ":plugin.property._test_plugin/p1"))
|
||||
;; (is (= 1 (get props1 ":plugin.property._test_plugin/p1")))
|
||||
(w/wait-for ".property-k:text('new-p1')")
|
||||
(is (= 1 (get prop1 "value")))
|
||||
(is (= (get prop1 "ident") ":plugin.property._test_plugin/new-p1"))
|
||||
(is (= 1 (get props1 ":plugin.property._test_plugin/new-p1")))
|
||||
(is (= ["Page"] (get props2 ":block/tags")))
|
||||
(ls-api-call! :editor.upsertBlockProperty uuid' "p2" "p2")
|
||||
(ls-api-call! :editor.upsertBlockProperty uuid' "p3" true)
|
||||
|
||||
1
deps/db/src/logseq/db.cljs
vendored
1
deps/db/src/logseq/db.cljs
vendored
@@ -606,6 +606,7 @@
|
||||
(def get-all-properties db-db/get-all-properties)
|
||||
(def get-class-extends db-class/get-class-extends)
|
||||
(def get-classes-parents db-db/get-classes-parents)
|
||||
(def get-page-parents db-db/get-page-parents)
|
||||
(def get-title-with-parents db-db/get-title-with-parents)
|
||||
(def class-instance? db-db/class-instance?)
|
||||
(def inline-tag? db-db/inline-tag?)
|
||||
|
||||
@@ -226,6 +226,7 @@
|
||||
(subs (str k) 1)
|
||||
k)
|
||||
k (-> (string/lower-case k)
|
||||
(string/replace "/" "-")
|
||||
(string/replace " " "-")
|
||||
(string/replace "_" "-"))]
|
||||
(if (gp-property/valid-property-name? (str ":" k))
|
||||
@@ -644,7 +645,7 @@
|
||||
properties))
|
||||
|
||||
(defn- construct-block
|
||||
[block properties* timestamps body encoded-content format pos-meta {:keys [block-pattern db date-formatter remove-properties? db-graph-mode? export-to-db-graph?]}]
|
||||
[block properties* timestamps body encoded-content format pos-meta {:keys [block-pattern db date-formatter remove-properties? remove-logbook? remove-deadline-scheduled? db-graph-mode? export-to-db-graph?]}]
|
||||
(let [id (get-custom-id-or-new-id properties*)
|
||||
block-tags (and export-to-db-graph? (get-in properties* [:properties :tags]))
|
||||
;; For export, remove tags from properties as they are being converted to classes
|
||||
@@ -686,7 +687,11 @@
|
||||
block)
|
||||
title (cond->> (get-block-content encoded-content block format pos-meta block-pattern)
|
||||
remove-properties?
|
||||
(gp-property/remove-properties (get block :format :markdown)))
|
||||
(gp-property/remove-properties (get block :format :markdown))
|
||||
remove-logbook?
|
||||
(gp-property/remove-logbook)
|
||||
remove-deadline-scheduled?
|
||||
(gp-property/remove-deadline-scheduled))
|
||||
block (assoc block :block/title title)
|
||||
block (if (seq timestamps)
|
||||
(merge block (timestamps->scheduled-and-deadline timestamps))
|
||||
@@ -756,28 +761,23 @@
|
||||
block-idx 0
|
||||
timestamps {}
|
||||
properties {}
|
||||
body []]
|
||||
body []
|
||||
prev-block-num 0]
|
||||
(if (seq ast-blocks)
|
||||
(let [[ast-block pos-meta] (first ast-blocks)]
|
||||
(cond
|
||||
(paragraph-timestamp-block? ast-block)
|
||||
(let [timestamps (extract-timestamps ast-block)
|
||||
timestamps' (merge timestamps timestamps)]
|
||||
(recur headings (rest ast-blocks) (inc block-idx) timestamps' properties body))
|
||||
(let [ts (extract-timestamps ast-block)
|
||||
timestamps' (merge timestamps ts)]
|
||||
(recur headings (rest ast-blocks) (inc block-idx) timestamps' properties body (inc prev-block-num)))
|
||||
|
||||
(gp-property/properties-ast? ast-block)
|
||||
(let [properties (extract-properties (second ast-block) (assoc user-config :format format))]
|
||||
(recur headings (rest ast-blocks) (inc block-idx) timestamps properties body))
|
||||
(recur headings (rest ast-blocks) (inc block-idx) timestamps properties body (inc prev-block-num)))
|
||||
|
||||
(heading-block? ast-block)
|
||||
;; for db-graphs cut multi-line when there is property, deadline/scheduled or logbook text in :block/title
|
||||
(let [cut-multiline? (and export-to-db-graph?
|
||||
(when-let [prev-block (first (get all-blocks (dec block-idx)))]
|
||||
(or (and (gp-property/properties-ast? prev-block)
|
||||
(not= "Custom" (ffirst (get all-blocks (- block-idx 2)))))
|
||||
(= ["Drawer" "logbook"] (take 2 prev-block))
|
||||
(and (= "Paragraph" (first prev-block))
|
||||
(seq (set/intersection (set (flatten prev-block)) #{"Deadline" "Scheduled"}))))))
|
||||
(let [cut-multiline? (and export-to-db-graph? (= prev-block-num 0))
|
||||
prev-blocks (map first (subvec all-blocks (max 0 (- block-idx prev-block-num)) block-idx))
|
||||
pos-meta' (if cut-multiline?
|
||||
pos-meta
|
||||
;; fix start_pos
|
||||
@@ -785,12 +785,14 @@
|
||||
(if (seq headings)
|
||||
(get-in (last headings) [:meta :start_pos])
|
||||
nil)))
|
||||
;; Remove properties text from custom queries in db graphs
|
||||
;; Remove properties, deadline/scheduled and logbook text from title in db graphs
|
||||
options' (assoc options
|
||||
:remove-properties?
|
||||
(and export-to-db-graph?
|
||||
(and (gp-property/properties-ast? (first (get all-blocks (dec block-idx))))
|
||||
(= "Custom" (ffirst (get all-blocks (- block-idx 2)))))))
|
||||
(and export-to-db-graph? (some gp-property/properties-ast? prev-blocks))
|
||||
:remove-logbook?
|
||||
(and export-to-db-graph? (some #(= ["Drawer" "logbook"] (take 2 %)) prev-blocks))
|
||||
:remove-deadline-scheduled?
|
||||
(and export-to-db-graph? (some #(seq (set/intersection (set (flatten %)) #{"Deadline" "Scheduled"})) prev-blocks)))
|
||||
block' (construct-block ast-block properties timestamps body encoded-content format pos-meta' options')
|
||||
block'' (cond
|
||||
db-graph-mode?
|
||||
@@ -799,11 +801,10 @@
|
||||
(assoc block' :block.temp/ast-blocks (cons ast-block body))
|
||||
:else
|
||||
(assoc block' :macros (extract-macros-from-ast (cons ast-block body))))]
|
||||
|
||||
(recur (conj headings block'') (rest ast-blocks) (inc block-idx) {} {} []))
|
||||
(recur (conj headings block'') (rest ast-blocks) (inc block-idx) {} {} [] 0))
|
||||
|
||||
:else
|
||||
(recur headings (rest ast-blocks) (inc block-idx) timestamps properties (conj body ast-block))))
|
||||
(recur headings (rest ast-blocks) (inc block-idx) timestamps properties (conj body ast-block) (inc prev-block-num))))
|
||||
[(-> (reverse headings)
|
||||
sanity-blocks-data)
|
||||
body
|
||||
|
||||
@@ -133,9 +133,12 @@
|
||||
db
|
||||
(ns-util/get-last-part full-name))
|
||||
(map #(d/entity db %))
|
||||
(some #(let [parents (->> (ldb/get-class-extends %)
|
||||
(remove (fn [e] (= :logseq.class/Root (:db/ident e))))
|
||||
vec)]
|
||||
(some #(let [parent (->> (ldb/get-class-extends %)
|
||||
(remove (fn [e] (= :logseq.class/Root (:db/ident e))))
|
||||
first)
|
||||
parent-ancestors (when parent (ldb/get-page-parents parent))
|
||||
parents (cond-> (or parent-ancestors [])
|
||||
parent (conj parent))]
|
||||
(when (= full-name (string/join ns-util/namespace-char (map :block/name (conj parents %))))
|
||||
(:block/uuid %)))))
|
||||
(first
|
||||
@@ -563,6 +566,12 @@
|
||||
(translate-linked-ref-filters prop-value page-names-to-uuids)
|
||||
:ls-type
|
||||
[[:logseq.property/ls-type (keyword prop-value)]]
|
||||
:hl-color
|
||||
(let [color-text-idents
|
||||
(->> (get-in db-property/built-in-properties [:logseq.property.pdf/hl-color :closed-values])
|
||||
(map (juxt :value :db-ident))
|
||||
(into {}))]
|
||||
[[:logseq.property.pdf/hl-color (get color-text-idents prop-value)]])
|
||||
;; else
|
||||
[[(built-in-property-file-to-db-idents prop) prop-value]]))))
|
||||
(into {}))]
|
||||
@@ -1220,9 +1229,10 @@
|
||||
(defn- build-pdf-annotations-tx
|
||||
"Builds tx for pdf annotations when a pdf has an annotations EDN file under assets/"
|
||||
[parent-asset-path assets parent-asset pdf-annotation-pages opts]
|
||||
(let [asset-edn-path (node-path/join common-config/local-assets-dir
|
||||
(safe-sanitize-file-name
|
||||
(node-path/basename (string/replace-first parent-asset-path #"(?i)\.pdf$" ".edn"))))
|
||||
(let [asset-edn-path (path/path-normalize
|
||||
(node-path/join common-config/local-assets-dir
|
||||
(safe-sanitize-file-name
|
||||
(node-path/basename (string/replace-first parent-asset-path #"(?i)\.pdf$" ".edn")))))
|
||||
asset-md-name (str "hls__" (safe-sanitize-file-name
|
||||
(node-path/basename (string/replace-first parent-asset-path #"(?i)\.pdf$" ".md"))))]
|
||||
(when-let [asset-edn-map (get @assets asset-edn-path)]
|
||||
@@ -2159,8 +2169,10 @@
|
||||
(-> (select-keys options [:notify-user :default-config :<save-config-file])
|
||||
(set/rename-keys {:<save-config-file :<save-file})))]
|
||||
(let [files (common-config/remove-hidden-files *files config rpath-key)
|
||||
logseq-file? #(string/starts-with? (get % rpath-key) "logseq/")
|
||||
asset-file? #(string/starts-with? (get % rpath-key) "assets/")
|
||||
normalized-rpath (fn [f]
|
||||
(some-> (get f rpath-key) path/path-normalize))
|
||||
logseq-file? #(string/starts-with? (normalized-rpath %) "logseq/")
|
||||
asset-file? #(string/starts-with? (normalized-rpath %) "assets/")
|
||||
doc-files (->> files
|
||||
(remove #(or (logseq-file? %) (asset-file? %)))
|
||||
(filter #(contains? #{"md" "org" "markdown" "edn"} (path/file-ext (:path %)))))
|
||||
|
||||
@@ -175,4 +175,47 @@
|
||||
(string/join "\n" lines))
|
||||
|
||||
:else
|
||||
content))
|
||||
content))
|
||||
|
||||
(defn remove-logbook
|
||||
[content]
|
||||
(when (string? content)
|
||||
(let [lines (string/split-lines content)
|
||||
[result _in-logbook?]
|
||||
(reduce (fn [[acc in-logbook?] line]
|
||||
(let [trimmed (string/trim line)
|
||||
upper (string/upper-case trimmed)]
|
||||
(cond
|
||||
(string/starts-with? upper ":LOGBOOK:")
|
||||
[acc true]
|
||||
|
||||
(and in-logbook? (string/starts-with? upper ":END:"))
|
||||
[acc false]
|
||||
|
||||
in-logbook?
|
||||
[acc true]
|
||||
|
||||
:else
|
||||
[(conj acc line) in-logbook?])))
|
||||
[[] false]
|
||||
lines)]
|
||||
(string/join "\n" result))))
|
||||
|
||||
(defn remove-deadline-scheduled
|
||||
[content]
|
||||
(when (string? content)
|
||||
(let [lines (string/split-lines content)]
|
||||
(if (= 1 (count lines))
|
||||
content
|
||||
(let [first-line (first lines)
|
||||
rest-lines (rest lines)
|
||||
rest-lines (keep (fn [line]
|
||||
(let [upper (string/upper-case (string/triml line))]
|
||||
(if (or (string/starts-with? upper "DEADLINE: ")
|
||||
(string/starts-with? upper "SCHEDULED: "))
|
||||
(let [cleaned (-> line (string/replace #"(?i)(?:^|\s)(DEADLINE|SCHEDULED):\s+<[^>]*>" "") string/trim)]
|
||||
(when-not (string/blank? cleaned)
|
||||
cleaned))
|
||||
line)))
|
||||
rest-lines)]
|
||||
(string/join "\n" (cons first-line rest-lines)))))))
|
||||
|
||||
@@ -210,17 +210,17 @@
|
||||
|
||||
;; Counts
|
||||
;; Includes journals as property values e.g. :logseq.property/deadline
|
||||
(is (= 31 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Journal]] @conn))))
|
||||
(is (= 32 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Journal]] @conn))))
|
||||
|
||||
(is (= 5 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Asset]] @conn))))
|
||||
(is (= 4 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Task]] @conn))))
|
||||
(is (= 5 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Task]] @conn))))
|
||||
(is (= 4 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Query]] @conn))))
|
||||
(is (= 2 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Card]] @conn))))
|
||||
(is (= 5 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Quote-block]] @conn))))
|
||||
(is (= 2 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Pdf-annotation]] @conn))))
|
||||
|
||||
;; Properties and tags aren't included in this count as they aren't a Page
|
||||
(is (= 10
|
||||
(is (= 11
|
||||
(->> (d/q '[:find [?b ...]
|
||||
:where
|
||||
[?b :block/title]
|
||||
@@ -231,7 +231,7 @@
|
||||
#_(map #(select-keys % [:block/title :block/tags]))
|
||||
count))
|
||||
"Correct number of pages with block content")
|
||||
(is (= 14 (->> @conn
|
||||
(is (= 15 (->> @conn
|
||||
(d/q '[:find [?ident ...]
|
||||
:where [?b :block/tags :logseq.class/Tag] [?b :db/ident ?ident] (not [?b :logseq.property/built-in?])])
|
||||
count))
|
||||
@@ -589,8 +589,36 @@
|
||||
|
||||
(testing "multiline blocks"
|
||||
(is (= "|markdown| table|\n|some|thing|" (:block/title (db-test/find-block-by-content @conn #"markdown.*table"))))
|
||||
(is (= "multiline block\na 2nd\nand a 3rd" (:block/title (db-test/find-block-by-content @conn #"multiline block"))))
|
||||
(is (= "logbook block" (:block/title (db-test/find-block-by-content @conn #"logbook block")))))
|
||||
(is (= "normal multiline block\na 2nd\nand a 3rd" (:block/title (db-test/find-block-by-content @conn #"normal multiline block"))))
|
||||
(is (= "colored multiline block\nlast line" (:block/title (db-test/find-block-by-content @conn #"colored multiline block"))))
|
||||
|
||||
(let [block (db-test/find-block-by-content @conn #"multiline block with prop and deadline")]
|
||||
(is (= "multiline block with prop and deadline\nlast line" (:block/title block)))
|
||||
(is (= 20221126
|
||||
(-> (db-test/readable-properties block)
|
||||
:logseq.property/deadline
|
||||
date-time-util/ms->journal-day))
|
||||
"multiline block has correct journal as property value")
|
||||
(is (= "red"
|
||||
(-> (db-test/readable-properties block)
|
||||
:logseq.property/background-color))
|
||||
"multiline block has correct background color as property value"))
|
||||
|
||||
(let [block (db-test/find-block-by-content @conn #"multiline block with deadline and scheduled in 1 line and sth else")]
|
||||
(is (= "multiline block with deadline and scheduled in 1 line and sth else\nsomething else\nlast line" (:block/title block)))
|
||||
(is (= 20221126
|
||||
(-> (db-test/readable-properties block)
|
||||
:logseq.property/deadline
|
||||
date-time-util/ms->journal-day))
|
||||
"multiline block with deadline and scheduled has correct deadline journal as property value")
|
||||
(is (= 20221126
|
||||
(-> (db-test/readable-properties block)
|
||||
:logseq.property/scheduled
|
||||
date-time-util/ms->journal-day))
|
||||
"multiline block with deadline and scheduled has correct scheduled journal as property value"))
|
||||
|
||||
(is (= "logbook block" (:block/title (db-test/find-block-by-content @conn #"^logbook block"))))
|
||||
(is (= "multiline logbook block\nlast line" (:block/title (db-test/find-block-by-content @conn #"multiline logbook block")))))
|
||||
|
||||
(testing ":block/refs"
|
||||
(let [page (db-test/find-page-by-title @conn "chat-gpt")]
|
||||
@@ -623,7 +651,7 @@
|
||||
count))
|
||||
"Correct number of user classes")
|
||||
|
||||
(is (= 4 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Task]] @conn))))
|
||||
(is (= 5 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Task]] @conn))))
|
||||
(is (= 4 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Query]] @conn))))
|
||||
(is (= 2 (count (d/q '[:find ?b :where [?b :block/tags :logseq.class/Card]] @conn))))
|
||||
|
||||
|
||||
@@ -5,9 +5,25 @@
|
||||
|some|thing|
|
||||
- block with props
|
||||
prop-num:: 10
|
||||
- multiline block
|
||||
- normal multiline block
|
||||
a 2nd
|
||||
and a 3rd
|
||||
- colored multiline block
|
||||
background-color:: red
|
||||
last line
|
||||
- multiline block with prop and deadline
|
||||
background-color:: red
|
||||
DEADLINE: <2022-11-26 Sat>
|
||||
last line
|
||||
- multiline block with deadline and scheduled in 1 line and sth else
|
||||
DEADLINE: <2022-11-26 Sat> SCHEDULED: <2022-11-26 Sat> something else
|
||||
last line
|
||||
- DONE multiline logbook block
|
||||
:LOGBOOK:
|
||||
CLOCK: [2024-08-07 Wed 11:47:50]
|
||||
CLOCK: [2024-08-07 Wed 11:47:53]
|
||||
:END:
|
||||
last line
|
||||
- DOING logbook block
|
||||
:LOGBOOK:
|
||||
CLOCK: [2024-08-07 Wed 11:47:50]
|
||||
@@ -56,4 +72,4 @@
|
||||
|
||||
#+BEGIN_EXAMPLE
|
||||
{{query (and [[tag2]] (not [[tag1]]))}}
|
||||
#+END_EXAMPLE
|
||||
#+END_EXAMPLE
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
tags:: #diary
|
||||
- This journal has a tag to test journals with tags
|
||||
- Block tags #p1
|
||||
tags:: ai, #block-tag
|
||||
tags:: ai, #block-tag
|
||||
- block w/ longer ns tag #n1/n2/n3
|
||||
1
deps/graph-parser/test/resources/exporter-test-graph/journals/2026_01_27.md
vendored
Normal file
1
deps/graph-parser/test/resources/exporter-test-graph/journals/2026_01_27.md
vendored
Normal file
@@ -0,0 +1 @@
|
||||
- 2nd instance of block w/ longer ns tag #n1/n2/n3
|
||||
6
deps/graph-parser/test/resources/exporter-test-graph/pages/unlinked-highlights.md
vendored
Normal file
6
deps/graph-parser/test/resources/exporter-test-graph/pages/unlinked-highlights.md
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
- This is a highlights page that doesn't start with 'hls__' and isn't linked to a specific asset file
|
||||
- blarg blarg
|
||||
ls-type:: annotation
|
||||
hl-page:: 110
|
||||
hl-color:: purple
|
||||
id:: 654bafc6-f7e8-4633-b6a6-810dc41cc559
|
||||
11
deps/publish/src/logseq/publish/render.cljs
vendored
11
deps/publish/src/logseq/publish/render.cljs
vendored
@@ -259,16 +259,17 @@
|
||||
(or (get name->uuid name)
|
||||
(get name->uuid (common-util/page-name-sanity-lc name))))
|
||||
|
||||
(defn entity->link-node
|
||||
[entity ctx]
|
||||
(defn- entity->link-node
|
||||
[entity ctx prop-key]
|
||||
(let [title (publish-model/entity->title entity)
|
||||
uuid (:block/uuid entity)
|
||||
graph-uuid (:graph-uuid ctx)]
|
||||
(cond
|
||||
(and uuid graph-uuid (publish-model/page-entity? entity))
|
||||
[[:a.page-ref {:href (str "/page/" graph-uuid "/" uuid)} title]]
|
||||
[[:a.page-ref {:href (str "/page/" graph-uuid "/" uuid)}
|
||||
(str (when (= prop-key :block/tags) "#") title)]]
|
||||
(common-util/url? title)
|
||||
[:a {:href title} title]
|
||||
[[:a {:href title} title]]
|
||||
:else
|
||||
[title])))
|
||||
|
||||
@@ -313,7 +314,7 @@
|
||||
(and ref-type? (get entities value))
|
||||
(let [entity (get entities value)]
|
||||
(with-icon (:logseq.property/icon entity)
|
||||
(entity->link-node entity ctx)))
|
||||
(entity->link-node entity ctx prop-key)))
|
||||
|
||||
:else
|
||||
[(str value)])
|
||||
|
||||
@@ -26,11 +26,10 @@
|
||||
[frontend.util :as util]
|
||||
[frontend.util.page :as page-util]
|
||||
[frontend.util.text :as text-util]
|
||||
[frontend.util.ref :as ref]
|
||||
[goog.functions :as gfun]
|
||||
[goog.object :as gobj]
|
||||
[goog.userAgent]
|
||||
[logseq.common.util :as common-util]
|
||||
[logseq.common.util.block-ref :as block-ref]
|
||||
[logseq.db :as ldb]
|
||||
[logseq.shui.hooks :as hooks]
|
||||
[logseq.shui.ui :as shui]
|
||||
@@ -427,7 +426,7 @@
|
||||
|
||||
(defn- copy-block-ref [state]
|
||||
(when-let [block-uuid (some-> state state->highlighted-item :source-block :block/uuid)]
|
||||
(editor-handler/copy-block-ref! block-uuid block-ref/->block-ref)
|
||||
(editor-handler/copy-block-ref! block-uuid ref/->block-ref)
|
||||
(shui/dialog-close! :ls-dialog-cmdk)))
|
||||
|
||||
(defmulti handle-action (fn [action _state _event] action))
|
||||
@@ -916,7 +915,7 @@
|
||||
(for [key shortcut]
|
||||
[:div.ui__button-shortcut-key
|
||||
(case key
|
||||
"cmd" [:div (if goog.userAgent/MAC "⌘" "Ctrl")]
|
||||
"cmd" [:div (if util/mac? "⌘" "Ctrl")]
|
||||
"shift" [:div "⇧"]
|
||||
"return" [:div "⏎"]
|
||||
"esc" [:div.tracking-tightest {:style {:transform "scaleX(0.8) scaleY(1.2) "
|
||||
@@ -944,7 +943,7 @@
|
||||
[:<>
|
||||
(button-fn "Open" ["return"])
|
||||
(button-fn "Open in sidebar" ["shift" "return"] {:open-sidebar? true})
|
||||
(when (:source-block @(::highlighted-item state)) (button-fn "Copy ref" ["⌘" "c"]))]
|
||||
(when (:source-block @(::highlighted-item state)) (button-fn "Copy ref" ["cmd" "c"]))]
|
||||
|
||||
:search
|
||||
[:<>
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
(when (state/enable-flashcards?)
|
||||
(shui/dropdown-menu-item
|
||||
{:key "Make a Card"
|
||||
:on-click (fsrs/batch-make-cards!)}
|
||||
:on-click #(fsrs/batch-make-cards!)}
|
||||
(t :context-menu/make-a-flashcard)))
|
||||
|
||||
(shui/dropdown-menu-item
|
||||
|
||||
@@ -62,7 +62,8 @@
|
||||
:uk (edn-resource "dicts/uk.edn")
|
||||
:fa (edn-resource "dicts/fa.edn")
|
||||
:id (edn-resource "dicts/id.edn")
|
||||
:cs (edn-resource "dicts/cs.edn")})
|
||||
:cs (edn-resource "dicts/cs.edn")
|
||||
:ar (edn-resource "dicts/ar.edn")})
|
||||
|
||||
(def languages
|
||||
"List of languages presented to user"
|
||||
@@ -88,7 +89,8 @@
|
||||
{:label "Slovenčina" :value :sk}
|
||||
{:label "فارسی" :value :fa}
|
||||
{:label "Bahasa Indonesia" :value :id}
|
||||
{:label "Čeština" :value :cs}])
|
||||
{:label "Čeština" :value :cs}
|
||||
{:label "العربية" :value :ar}])
|
||||
|
||||
(assert (= (set (keys dicts)) (set (map :value languages)))
|
||||
"List of user-facing languages must match list of dictionaries")
|
||||
|
||||
@@ -257,7 +257,7 @@
|
||||
(when-let [^js dt (and id (.-dataTransfer e))]
|
||||
(reset! block/*dragging? true)
|
||||
(pdf-assets/ensure-ref-block! (state/get-current-pdf) hl nil)
|
||||
(.setData dt "text/plain" (str "((" id "))"))))]
|
||||
(.setData dt "text/plain" (str "[[" id "]]"))))]
|
||||
|
||||
[:div.extensions__pdf-hls-text-region
|
||||
{:id (str "hl_" id)
|
||||
@@ -291,7 +291,7 @@
|
||||
|
||||
dragstart-handle! (fn [^js e]
|
||||
(when-let [^js dt (and id (.-dataTransfer e))]
|
||||
(.setData dt "text/plain" (str "((" id "))"))))
|
||||
(.setData dt "text/plain" (str "[[" id "]]"))))
|
||||
update-hl! (fn [hl] (some-> (rum/deref *ops-ref) (:upd-hl!) (apply [hl])))]
|
||||
|
||||
(hooks/use-effect!
|
||||
|
||||
560
src/resources/dicts/ar.edn
Normal file
560
src/resources/dicts/ar.edn
Normal file
@@ -0,0 +1,560 @@
|
||||
{:accessibility/skip-to-main-content "تخطى إلى المحتوى الرئيسي"
|
||||
:handbook/title "المساعدة"
|
||||
:handbook/topics "المواضيع"
|
||||
:handbook/popular-topics "المواضيع الشائعة"
|
||||
:handbook/help-categories "قائمة المساعدة"
|
||||
:handbook/search "البحث"
|
||||
:handbook/home "الصفحة الرئيسية"
|
||||
:handbook/settings "الإعدادات"
|
||||
:handbook/close "إغلاق"
|
||||
:on-boarding/importing-main-title "استيراد الملاحظات الحالية"
|
||||
:on-boarding/importing-main-desc "يمكنك القيام بهذا لاحقاً في التطبيق."
|
||||
:on-boarding/importing-title "هل لديك ملاحظات لاستيرادها؟"
|
||||
:on-boarding/importing-desc "إذا كانت بتنسيق EDN أو Markdown، فإن Logseq يقبلها."
|
||||
:on-boarding/importing-sqlite-desc "استيراد ملف SQLite مٌصدر من مخططك في Logseq إلى قاعدة بيانات مخطط جديدة"
|
||||
:on-boarding/main-title (fn [] ["مرحباً بك في " [:strong "Logseq!"]])
|
||||
:on-boarding/main-desc "أولاً، عليك اختيار مجلد حيث يخزن logseq أفكارك، ملاحظاتك، وخواطرك."
|
||||
:bug-report/main-title "التبليغ عن خطأ"
|
||||
:bug-report/clipboard-inspector-title "فاحص بيانات الحافظة"
|
||||
:bug-report/main-desc "هل يمكنك مساعدتنا بالتبليغ عن خطأ؟ سنقوم بحله في أسرع ما نقدر عليه."
|
||||
:bug-report/section-clipboard-title "هل الخطأ الذي واجهته مرتبط بهذه الميزات؟"
|
||||
:bug-report/section-clipboard-desc "يمكنك استخدام هذه الأدوات المفيدة لتزويدنا بمعلومات إضافية."
|
||||
:bug-report/section-clipboard-btn-title "مساعد الحافظة"
|
||||
:bug-report/section-clipboard-btn-desc "فحص وجمع بيانات الحافظة"
|
||||
:bug-report/section-issues-title "أو..."
|
||||
:bug-report/section-issues-desc "إذا لم تتوفر لديك أدوات لجمع معلومات إضافية، فيرجى الإبلاغ عن الخطأ مباشرة."
|
||||
:bug-report/section-issues-btn-title "إرسال التقرير عن الخطأ"
|
||||
:bug-report/section-issues-btn-desc "ساعد في تحسين Logseq!"
|
||||
:bug-report/inspector-page-desc-1 "اضغط Ctrl+V / ⌘+V لفحص بيانات حافظتك"
|
||||
:bug-report/inspector-page-desc-2 "أو انقر هنا للصق إذا كنت تستخدم نسخة الهاتف"
|
||||
:bug-report/inspector-page-placeholder "اضغط مطولاً هنا للصق إذا كنت تستخدم نسخة الهاتف"
|
||||
:bug-report/inspector-page-tip "هل هناك خطأ؟ لا مشكلة، انقر هنا للعودة إلى الخطوة السابقة."
|
||||
:bug-report/inspector-page-btn-back "عد للخلف"
|
||||
:bug-report/inspector-page-btn-copy "انسخ النتيجة"
|
||||
:bug-report/inspector-page-copy-notif "تم النسخ إلى الحافظة!"
|
||||
:bug-report/inspector-page-btn-create-issue "إنشاء قضية"
|
||||
:bug-report/inspector-page-desc-clipboard "هذه هي البيانات المقروءة من الحافظة"
|
||||
:bug-report/inspector-page-desc-copy "إذا كان هذا مناسباً للمشاركة، فانقر على زر النسخ."
|
||||
:bug-report/inspector-page-desc-create-issue "يمكنك الآن عن النتيجة التي تم نسخها في الحافظة. يرجى لصق النتيجة في قسم 'Additional Context' وتحديد مصدر المحتوى الأصلي. شكراً!"
|
||||
:help/title-usage "الاستخدام"
|
||||
:help/title-community "المجتمع"
|
||||
:help/title-development "التطور"
|
||||
:help/title-about "حول"
|
||||
:help/title-terms "الشروط والأحكام"
|
||||
:help/start "البدأ"
|
||||
:help/about "حول Logseq"
|
||||
:help/roadmap "جدولة"
|
||||
:help/bug "تقرير عن خطأ"
|
||||
:help/feature "طلب ميزة"
|
||||
:help/changelog "سجل التغييرات"
|
||||
:help/blog "مدونة Logesq"
|
||||
:help/docs "الوثائق"
|
||||
:help/privacy "سياسة الخصوصية"
|
||||
:help/terms "الشروط والأحكام"
|
||||
:help/forum-community "منتدى المجتمع"
|
||||
:help/awesome-logseq "Logseq الرائع"
|
||||
:help/shortcuts "اختصارات لوحة المفاتيح"
|
||||
:help/shortcuts-triggers "المحفزات"
|
||||
:help/shortcut "الاختصارات"
|
||||
:help/search "البحث في الصفحات/الكتل/الأوامر"
|
||||
:help/slash-autocomplete "إكمال تلقائي للشرطة المائلة"
|
||||
:help/reference-autocomplete "مرجع الصفحة للإكمال التلقائي"
|
||||
:help/block-reference "مرجع الكتلة"
|
||||
:help/open-link-in-sidebar "افتح الرابط في النافذة الجانبية"
|
||||
:search-item/page "صفحة"
|
||||
:search-item/no-result "لا توجد نتيجة متطابقة"
|
||||
:help/context-menu "قائمة سياق الكتلة"
|
||||
:help/markdown-syntax "بناءالجملة في Markdown"
|
||||
:bold "عريض"
|
||||
:italics "مائل"
|
||||
:highlight "نص مظلل"
|
||||
:strikethrough "خط في المنتصف"
|
||||
:code "كود"
|
||||
:untitled "بدون عنوان"
|
||||
:right-side-bar/help "مساعدة"
|
||||
:right-side-bar/switch-theme "وضع السمة"
|
||||
:right-side-bar/contents "المحتويات"
|
||||
:right-side-bar/page-graph "مخطط الصفحة"
|
||||
:right-side-bar/block-ref "مرجع الكتلة"
|
||||
:right-side-bar/graph-view "عرض المخطط"
|
||||
:right-side-bar/all-pages "الصفحات"
|
||||
:right-side-bar/flashcards "بطاقات تعليمية"
|
||||
:right-side-bar/show-journals "عرض اليوميات"
|
||||
:right-side-bar/separator "معالج تغيير حجم النافذة الجانبية اليمنى"
|
||||
:right-side-bar/toggle-right-sidebar "تبديل النافذة الجانبية اليمنى"
|
||||
:right-side-bar/pane-close "إغلاق"
|
||||
:right-side-bar/pane-close-others "إغلاق نوافذ آخرى"
|
||||
:right-side-bar/pane-close-all "إغلاق الكل"
|
||||
:right-side-bar/pane-collapse "طي"
|
||||
:right-side-bar/pane-collapse-others "طي النوافذ الأخرى"
|
||||
:right-side-bar/pane-collapse-all "طي الجميع"
|
||||
:right-side-bar/pane-expand "توسيع"
|
||||
:right-side-bar/pane-expand-all "توسيع الكل"
|
||||
:right-side-bar/pane-open-as-page "افتح كصفحة"
|
||||
:right-side-bar/pane-more "المزيد"
|
||||
:left-side-bar/switch "التبديل إلى:"
|
||||
:left-side-bar/journals "اليوميات"
|
||||
:left-side-bar/assets "الأصول"
|
||||
:left-side-bar/tasks "المهام"
|
||||
:left-side-bar/nav-favorites "المفضلة"
|
||||
:left-side-bar/nav-recent-pages "حديث"
|
||||
:page/something-went-wrong "حدث خطأ ما"
|
||||
:page/logseq-is-having-a-problem "Logseq يواجه مشكلة. لمحاولة إعادته إلى حالة العمل، يرجى اتباع الخطوات الآمنة التالية بالترتيب:"
|
||||
:page/step "الخطوة {1}"
|
||||
:page/try "حاول"
|
||||
:page/delete-confirmation "هل أنت متأكد من رغبتك في حذف هذه الصفحة؟"
|
||||
:page/db-delete-confirmation "هل أنت متأكد من رغبتك في حذف هذه الصفحة؟"
|
||||
:page/make-public "اجعلها متاحة للنشر"
|
||||
:page/make-private "اجعله خاصاً"
|
||||
:page/delete "حذف الصفحة"
|
||||
:page/add-to-favorites "أضف إلى المفضلة"
|
||||
:page/unfavorite "إزالة من المفضلة"
|
||||
:block/name "اسم الصفحة"
|
||||
:page/copy-page-url "انسخ رابط الصفحة"
|
||||
:page/convert-to-tag "التحويل إلى وسم"
|
||||
:page/convert-tag-to-page "تحويل الوسم إلى صفحة"
|
||||
:file/name "اسم الملف"
|
||||
:file/last-modified-at "آخر تعديل في"
|
||||
:file/no-data "لا توجد بيانات"
|
||||
:file/format-not-supported "التنسيق .{1} ليس مدعوماً."
|
||||
:page/created-at "تم إنشاؤه في"
|
||||
:page/updated-at "تم التحديث في"
|
||||
:page/backlinks "الروابط الخلفية"
|
||||
:linked-references/filter-search "ابحث في الصفحات المرتبطة"
|
||||
:linked-references/filter-heading "مرشح"
|
||||
:linked-references/filter-directions "انقر للإضافة، وانقر على مفتاح shift لاستبعاده. انقر مرة أخرى لإزالته."
|
||||
:linked-references/filter-includes "يتضمن: "
|
||||
:linked-references/filter-excludes "المستبعد: "
|
||||
:editor/block-search "ابحث عن كتلة"
|
||||
:text/image "صورة"
|
||||
:asset/show-in-folder "عرض الصورة في المجلد"
|
||||
:asset/open-in-browser "افتح الصورة في المتصفح"
|
||||
:asset/delete "احذف الصورة"
|
||||
:asset/copy "انسخ الصورة"
|
||||
:asset/maximize "تكبير الصورة"
|
||||
:asset/ref-block "كتلة مرجع للمرفق"
|
||||
:asset/confirm-delete "هل أنت متأكد من رغبتك في حذف {1}؟"
|
||||
:asset/physical-delete "قم بإزالة الملف أيضاً (لا يمكن استعادته)"
|
||||
:color/gray "رمادي"
|
||||
:color/red "أحمر"
|
||||
:color/yellow "أصفر"
|
||||
:color/green "أخضر"
|
||||
:color/blue "أزرق"
|
||||
:color/purple "أرجواني"
|
||||
:color/pink "وردي"
|
||||
:editor/copy "نسخ"
|
||||
:editor/cut "قص"
|
||||
:editor/expand-block-children "توسيع الجميع"
|
||||
:editor/collapse-block-children "طي الجميع"
|
||||
:editor/delete-selection "احذف الكتل المحددة"
|
||||
:editor/cycle-todo "تدوير حالة TODO"
|
||||
:dev/show-page-data "(للمطورين) إظهار بيانات الصفحة"
|
||||
:dev/show-block-data "(للمطورين) إظهار بيانات الكتلة"
|
||||
:dev/show-block-ast "(للمطورين) إظهار شجرة البناء النحوي (AST) للكتلة"
|
||||
:content/copy-export-as "نسخ / تصدير باسم"
|
||||
:content/copy-block-url "نسخ رابط الكتلة"
|
||||
:content/copy-block-ref "نسخ مرجع الكتلة"
|
||||
:content/copy-ref "انسخ هذا المرجع"
|
||||
:content/delete-ref "احذف هذا المرجع"
|
||||
:content/replace-with-text "الاستبدال كنص"
|
||||
:content/replace-with-embed "الاستبدال بتضمين"
|
||||
:content/open-in-sidebar "افتح في النافذة الجانبية"
|
||||
:content/click-to-edit "انقر للتعديل"
|
||||
:context-menu/make-a-flashcard "اصنع بطاقة تعليمية"
|
||||
:context-menu/toggle-number-list "إظهار/إخفاء قائمة الأرقام"
|
||||
:settings-page/ai "الذكاء الاصطناعي"
|
||||
:settings-page/tab-ai "الذكاء الاصطناعي"
|
||||
:settings-page/enable-mcp-server "خادم برتوكول سياق النموذج (MCP)"
|
||||
:settings-page/enable-mcp-server-desc "تفعيل خادم برتوكول سياق النموذج (MCP) للسماح بالاتصال مع تطبيقات الذكاء الاصطناعي. يعتمد خادم برتوكول سياق النموذج (MCP) على واجهة برمجة تطبيقات HTTP (HTTP API)"
|
||||
:settings-page/edit-config-edn "تعديل ملف config.edn"
|
||||
:settings-page/edit-global-config-edn "تعديل ملف التكوين العام config.edn"
|
||||
:settings-page/edit-custom-css "تحرير ملف custom.css"
|
||||
:settings-page/edit-export-css "تحرير ملف export.css"
|
||||
:settings-page/custom-configuration "تكوين مخصص"
|
||||
:settings-page/custom-global-configuration "تكوين عام مخصص"
|
||||
:settings-page/theme-light "فاتح"
|
||||
:settings-page/theme-dark "داكن"
|
||||
:settings-page/theme-system "النظام"
|
||||
:settings-page/custom-theme "تخصيص السمة"
|
||||
:settings-page/export-theme "تصدير السمة"
|
||||
:settings-page/show-brackets "إظهار الأقواس المربعة"
|
||||
:settings-page/wide-mode "الوضع الواسع"
|
||||
:settings-page/editor-font "الخط"
|
||||
:settings-page/accent-color "لون التمييز"
|
||||
:settings-page/accent-color-alert "اختيار لون تمييز قد يؤدي إلى إلغاء أي سمة قمت باختيارها."
|
||||
:settings-page/spell-checker "المدقق الإملائي"
|
||||
:settings-page/auto-updater "تحديث تلقائي"
|
||||
:settings-page/disable-sentry "إرسال بيانات الاستخدام والتشخيصات إلى Logseq"
|
||||
:settings-page/disable-sentry-desc "لن يقوم برنامج Logseq أبداً بجمع قاعدة بيانات المخطط المحلية الخاصة بك أو يبيع بياناتك."
|
||||
:settings-page/preferred-outdenting "رفع الرتبة"
|
||||
:settings-page/preferred-outdenting-tip "يظهر الجانب الأيسر إزاحة المسافة البادئة بالإعدادات الافتراضية، ويظهر الجانب الأيمن إزاحة المسافة البادئة المنطقية، رفع/وخفض الرتبة."
|
||||
:settings-page/preferred-outdenting-tip-more "→ افهم أكثر"
|
||||
:settings-page/show-full-blocks "عرض جميع أسطر مرجع الكتلة"
|
||||
:settings-page/auto-expand-block-refs "توسيع مرجع الكتلة تلقائياً عند التكبير"
|
||||
:settings-page/auto-expand-block-refs-tip "يتحكم هذا الخيار في توسيع مرجع الكتلة تلقائياً عند التكبير"
|
||||
:settings-page/custom-date-format "تنسيق التاريخ المفضل"
|
||||
:settings-page/preferred-pasting-file-hint "عند التفعيل، سيتم تنزيل الصورة وإدراجها عند نسخها من الإنترنت. وعند التعطيل، سيتم لصق رابط الصورة."
|
||||
:settings-page/preferred-pasting-file "تفضيل لصق الملف"
|
||||
:settings-page/enable-shortcut-tooltip "تفعيل تلميحات الاختصارات"
|
||||
:settings-page/enable-tooltip "تلميحات الأدوات"
|
||||
:settings-page/enable-journals "اليوميات"
|
||||
:settings-page/enable-all-pages-public "جميع الصفحات عامة عند النشر"
|
||||
:settings-page/home-default-page "تعيين الصفحة الرئيسية الافتراضية"
|
||||
:settings-page/clear-cache "مسح ذاكرة التخزين المؤقت"
|
||||
:settings-page/clear "مسح"
|
||||
:settings-page/clear-cache-warning "سيؤدي مسح ذاكرة التخزين المؤقت إلى حذف المخططات البيانية المفتوحة. ستفقد التغييرات غير المحفوظة."
|
||||
:settings-page/developer-mode "وضع المطور"
|
||||
:settings-page/developer-mode-desc "يساعد وضع المطورين المساهمين ومطوري الإضافات على اختبار عمليات التكامل الخاصة بهم مع Logseq بكفاءة أكبر."
|
||||
:settings-page/current-version "الإصدار الحالي"
|
||||
:settings-page/tab-general "عام"
|
||||
:settings-page/tab-editor "المحرر"
|
||||
:settings-page/tab-keymap "مخطط المفاتيح"
|
||||
:settings-page/tab-account "الحساب"
|
||||
:settings-page/tab-advanced "الإعدادات المتقدمة"
|
||||
:settings-page/tab-features "الخصائص"
|
||||
:settings-page/tab-collaboration "التعاون"
|
||||
:settings-page/tab-encryption "التشفير"
|
||||
:settings-page/plugin-system "الإضافات"
|
||||
:settings-page/enable-flashcards "البطائق التعليمية"
|
||||
:settings-page/network-proxy "وكيل الشبكة (proxy)"
|
||||
:settings-page/login-prompt "للوصول إلى الميزات الجديدة قبل الجميع، يجب أن تكون راعياً أو داعماً لـ Logseq عبر منصة Open Collective، وبالتالي يجب عليك تسجيل الدخول أولاً."
|
||||
:settings-page/native-titlebar "شريط عنوان النافذة"
|
||||
:settings-page/native-titlebar-desc "تفعيل شريط عنوان النافذة الخاص بالنظام على Windows و Linux."
|
||||
:settings-page/check-for-updates "تحقق من وجود تحديثات"
|
||||
:settings-page/checking "جار التحقق..."
|
||||
:settings-page/revision "مراجعة: "
|
||||
:settings-page/changelog "ما الجديد؟"
|
||||
:settings-page/app-updated "التطبيق محدث 🎉"
|
||||
:settings-page/update-available "تم العثور على إصدار جديد "
|
||||
:settings-page/update-error-1 "⚠️ عفواً، حدث خطأ ما!"
|
||||
:settings-page/update-error-2 " الرجاء التحقق من "
|
||||
|
||||
:settings-page/auto-chmod "تغيير صلاحيات الملفات تلقائياً"
|
||||
:settings-page/auto-chmod-desc "عطل هذا الخيار للسماح للمستخدمين بالتحرير بناء على صلاحيات عضوية المجموعة."
|
||||
:yes "نعم"
|
||||
|
||||
:cancel "إلغاء"
|
||||
:close "إغلاق"
|
||||
:delete "حذف"
|
||||
:save "حفظ"
|
||||
:type "النوع"
|
||||
:host "المضيف"
|
||||
:port "المنفذ"
|
||||
:flashcards/modal-welcome-title "حان وقت إنشاء بطاقتك التعليمية الأولى!"
|
||||
:flashcards/modal-welcome-desc-1 "يمكنك إضافة \"{1}\" إلى أي كتلة لتحويلها إلى بطاقة أو تشغيل \"/cloze\" لإضافة بعض الفراغات."
|
||||
:flashcards/modal-finished "تهانينا، لقد راجعت جميع البطاقات التعليمية لهذا الاستعلام، نراك في المرة القادمة! 💯"
|
||||
:flashcards/modal-btn-show-answers "عرض الإجابات"
|
||||
:flashcards/modal-btn-hide-answers "إخفاء الإجابات"
|
||||
:flashcards/modal-btn-show-clozes "عرض ما في الفراغات"
|
||||
|
||||
:home "الصفحة الرئيسية"
|
||||
:new-page "صفحة جديدة: "
|
||||
:new-tag "وسم جديد: "
|
||||
:graph "مخطط بياني"
|
||||
:graph/all-graphs "جميع المخططات البيانية"
|
||||
:graph/local-graphs "المخططات البيانية المحلية:"
|
||||
:graph/remote-graphs "المخططات البيانية البعيدة:"
|
||||
:graph/shared-graphs "شاركها الآخرين:"
|
||||
:export "تصدير"
|
||||
:export-graph "تصدير المخطط البياني"
|
||||
:export-page "تصدير الصفحة"
|
||||
:export-markdown "تصدير كملف Markdown قياسي (بدون خصائص الكتلة)"
|
||||
:export-public-pages "تصدير الصفحات العام"
|
||||
:export-db-edn "تصدير ملف EDN"
|
||||
:export-sqlite-db "تصدير قاعدة بيانات SQlite"
|
||||
:export-zip "تصدير قاعدة بيانات SQLite و الأصول"
|
||||
:export-transparent-background "خلفية شفافة"
|
||||
:export-copy-to-clipboard "نسخ إلى الحافظة"
|
||||
:export-copied-to-clipboard "تم النسخ إلى الحافظة!"
|
||||
:export-save-to-file "حفظ في ملف"
|
||||
:all-graphs "جميع المخططات البيانية"
|
||||
:all-pages "الصفحات"
|
||||
;; E.g. 1 Page or 2 Pages
|
||||
:all-pages/table-title (fn [total] (str total (if (= total 1) " صفحة" " صفحات")))
|
||||
:all-pages/failed-to-delete-pages "تعذر حذف محتوى هذه الصفحات {1}. راجع وحدة تحكم جافا سكريبت لمزيد من التفاصيل."
|
||||
:all-files "جميع الملفات"
|
||||
:all-journals "جميع اليوميات"
|
||||
:settings "الإعدادات"
|
||||
:settings-of-plugins "الإضافات"
|
||||
:plugins "الإضافات"
|
||||
:themes "السمات"
|
||||
:appearance "المظهر"
|
||||
:relaunch-confirm-to-work "يجب إعادة تشغيل التطبيق لكي يعمل. هل تريد إعادة تشغيله الآن؟"
|
||||
:import-notes "استيراد الملاحظات الحالية"
|
||||
:import "استيراد"
|
||||
:importing "الاستيراد"
|
||||
:help-shortcut-title "انقر للاطلاع على الاختصارات والنصائح الأخرى"
|
||||
:loading "تحميل..."
|
||||
:login "تسجيل الدخول"
|
||||
:logout "تسجيل الخروج"
|
||||
:download "تنزيل"
|
||||
:language "اللغة"
|
||||
:remove-background "إزالة الخلفية"
|
||||
:remove-heading "إزالة العنوان"
|
||||
:heading "العنوان {1}"
|
||||
:auto-heading "عنوان تلقائي"
|
||||
:toggle-theme "تبديل المظهر"
|
||||
|
||||
:help/shortcut-page-title "اختصارات لوحة المفاتيح"
|
||||
|
||||
:plugin/installed "المثبت"
|
||||
:plugin/installed-plugin "الإضافات المثبتة: {1}"
|
||||
:plugin/not-installed "غير المثبتة"
|
||||
:plugin/installing "يتم التثبيت"
|
||||
:plugin/install "تثبيت"
|
||||
:plugin/reload "إعادة تحميل"
|
||||
:plugin/update "تحديث"
|
||||
:plugin/update-plugin "تحديث الإضافة: {1} - {2}"
|
||||
:plugin/check-update "تحقق من وجود التحديثات"
|
||||
:plugin/check-all-updates "تحقق من جميع التحديثات"
|
||||
:plugin/found-updates "تحديثات جديدة"
|
||||
:plugin/found-n-updates "تم العثور على {1} تحديثات"
|
||||
:plugin/update-all-selected "تحديث جميع العناصر المحددة"
|
||||
:plugin/all-updated "تم التحديث بالكامل!"
|
||||
:plugin/updates-downloading "جار تنزيل التحديثات"
|
||||
:plugin/refresh-lists "تحديث القوائم"
|
||||
:plugin/enabled "تفعيل"
|
||||
:plugin/disabled "تعطيل"
|
||||
:plugin/update-available "يتوفر تحديث"
|
||||
:plugin/updating "جار التحديث"
|
||||
:plugin/uninstall "إلغاء التثبيت"
|
||||
:plugin/marketplace "المتجر"
|
||||
:plugin/downloads "التنزيلات"
|
||||
:plugin/date-added "تمت إضافته حديثاً"
|
||||
:plugin/supports-db "يدعم مخططات قواعد البيانات"
|
||||
:plugin/popular "رائج"
|
||||
:plugin/stars "النجوم"
|
||||
:plugin/title "العنوان ({1})"
|
||||
:plugin/all "الجميع"
|
||||
:plugin/unpacked "غير مضغوطة"
|
||||
:plugin/delete-alert "هل أنت متأكد من رغبتك في إلغاء تثبيت الإضافة [{1}]؟"
|
||||
:plugin/open-settings "افتح الإعدادات"
|
||||
:plugin/open-package "افتح الحزمة"
|
||||
:plugin/report-security "الإبلاغ عن إضافة"
|
||||
:plugin/load-unpacked "تحميل الإضافة غير المضغوطة"
|
||||
:plugin/restart "إعادة تشغيل التطبيق"
|
||||
:plugin/unpacked-tips "حدد مسار الإضافة"
|
||||
:plugin/contribute "✨ برمجة وتقديم إضافة جديدة"
|
||||
:plugin/up-to-date "محدث {1}"
|
||||
:plugin/custom-js-alert "تم العثور على ملف custom.js، هل تسمح بتشغيله؟ (إذا كنت لا تفهم محتوى هذا الملف، نوصي بعدم السماح بالتشغيل، لما قد ينطوي عليه من مخاطر أمنية)."
|
||||
:plugin/security-warning "يمكن للإضافات الوصول إلى مخططك وملفاتك المحلية، وإجراء طلبات عبر الشبكة.
|
||||
كما يمكنها أن تتسبب في تلف البيانات أو فقدانها. نحن نعمل حالياً على وضع قواعد وصول مناسبة لمخططاتك.
|
||||
في هذه الأثناء، تأكد من امتلاكك لنسخ احتياطية منتظمة لمخططاتك، ولا تقم بتثبيت الإضافات إلا عندما يمكنك قراءة وفهم شفرة المصدر."
|
||||
:plugin/search-plugin "البحث في الإضافات"
|
||||
:plugin/open-preferences "فتح التفضيلات"
|
||||
:plugin/open-logseq-dir "فتح"
|
||||
:plugin/remote-error "خطأ في الاتصال الخارجي: "
|
||||
:plugin/checking-for-updates "جار التحقق من تحديثات الإضافات..."
|
||||
:plugin/list-of-updates "تحديثات الإضافة: "
|
||||
:plugin/auto-check-for-updates "التحقق التلقائي من وجود تحديثات"
|
||||
:plugin/load-from-web-url "تحميل الإضافة من رابط من الإنترنت (URL)"
|
||||
:plugin.install-from-file/menu-title "التثبيت من ملف plugins.edn"
|
||||
:plugin.install-from-file/title "تثبيت الإضافات من ملف plugins.edn"
|
||||
:plugin.install-from-file/notice "ستحل الإضافات التالية محل إضافاتك الحالية:"
|
||||
:plugin.install-from-file/success "تم تثبيت جميع الإضافات!"
|
||||
|
||||
:pdf/copy-ref "نسخ المرجع"
|
||||
:pdf/copy-text "نسخ النص"
|
||||
:pdf/linked-ref "مرجع مرتبط"
|
||||
:pdf/toggle-dashed "نمط التظليل المتقطع لمنطقة"
|
||||
:pdf/hl-block-colored "عنوان ملون لكتلة التظليل"
|
||||
:pdf/auto-open-context-menu "إظهار قائمة الخيارات تلقائياً عند التحديد"
|
||||
:pdf/doc-metadata "بيانات المستند الوصفية"
|
||||
|
||||
:updater/new-version-install "تم تنزيل نسخة جديدة."
|
||||
:updater/quit-and-install "أعد تشغيل البرنامج للتثبيت"
|
||||
|
||||
:tips/all-done "كل شيء جاهز!"
|
||||
|
||||
:select/default-prompt "اختر واحداً"
|
||||
:select/default-select-multiple "اختر واحداً أو أكثر"
|
||||
:select.graph/prompt "اختر مخطط"
|
||||
:select.graph/empty-placeholder-description "لا توجد مخططات مطابقة. هل تريد إضافة مخطط جديد؟"
|
||||
:select.graph/add-graph "نعم، أضف مخطط جديد"
|
||||
|
||||
:notification/clear-all "مسح الجميع"
|
||||
|
||||
:shortcut.category/basics "الأساسيات"
|
||||
:shortcut.category/formatting "التنسيق"
|
||||
:shortcut.category/navigating "التنقل"
|
||||
:shortcut.category/block-editing "تحرير الكتل (عام)"
|
||||
:shortcut.category/block-command-editing "تحرير أوامر الكتل"
|
||||
:shortcut.category/block-selection "تحديد الكتل (اضغط Esc للخروج من التحديد)"
|
||||
:shortcut.category/toggle "مفاتيح التبديل"
|
||||
:shortcut.category/others "أخرى"
|
||||
:shortcut.category/plugins "الإضافات"
|
||||
|
||||
:keymap/all "الجميع"
|
||||
:keymap/disabled "المعطلة"
|
||||
:keymap/unset "غير المعينة"
|
||||
:keymap/custom "مخصصة"
|
||||
:keymap/search "البحث"
|
||||
:keymap/total "إجمالي الاختصارات"
|
||||
:keymap/keystroke-filter "ترشيح ضغطات المفاتيح"
|
||||
:keymap/keystroke-record-desc "اضغط على أي تسلسل من المفاتيح لترشيح الاختصارات"
|
||||
:keymap/keystroke-record-setup-label "اضغط على أي تسلسل من المفاتيح لتعيين اختصار"
|
||||
:keymap/restore-to-default "إستعادة الإعدادات الافتراضية"
|
||||
:keymap/customize-for-label "تخصيص الاختصارات"
|
||||
:keymap/conflicts-for-label "تعارضات في الاختصارات لـ"
|
||||
|
||||
:window/minimize "تصغير"
|
||||
:window/maximize "تكبير"
|
||||
:window/restore "استعادة"
|
||||
:window/close "إغلاق"
|
||||
:window/exit-fullscreen "الخروج من وضع ملء الشاشة"
|
||||
|
||||
:header/toggle-left-sidebar "إظهار/إخفاء الشريط الجانبي الأيسر"
|
||||
:header/search "البحث"
|
||||
:header/more "المزيد"
|
||||
:header/go-back "ارجع"
|
||||
:header/go-forward "امض"
|
||||
|
||||
;; E.g. 1 node or 2 nodes
|
||||
:views.table/live-query-title (fn [total] (str "استعلام مباشر (" total ")"))
|
||||
:views.table/default-title (fn [total] (str total (if (<= total 1) " عقدة" " عقد")))
|
||||
|
||||
;; Commands are nested for now to stay in sync with the shortcuts system.
|
||||
;; Other languages should not nest keys under :commands
|
||||
|
||||
:command.pdf/previous-page "Pdf: الصفحة السابقة في المستند الحالي"
|
||||
:command.pdf/next-page "Pdf: الصفحة التالية في المستند الحالي"
|
||||
:command.pdf/close "Pdf: إغلاق المستند الحالي"
|
||||
:command.pdf/find "Pdf: بحث في النصوص في المستند الحالي"
|
||||
:command.auto-complete/complete "الإكمال-التلقائي: اختيار العنصر المحدد"
|
||||
:command.auto-complete/prev "الإكمال-التلقائي: اختيار العنصر السابق"
|
||||
:command.auto-complete/next "الإكمال-التلقائي: اختيار العنصر التالي"
|
||||
:command.auto-complete/shift-complete "الإكمال-التلقائي: فتح العنصر المحدد في النافذة الجانبية"
|
||||
:command.auto-complete/meta-complete "الإكمال-التلقائي: اضغط Cmd + Enter لاختيار العنصر المحدد"
|
||||
:command.cards/toggle-answers "البطاقات: إظهار/إخفاء الإجابات/الفراغات"
|
||||
:command.cards/again "البطاقات مجدداً"
|
||||
:command.cards/hard "البطاقات: صعبة"
|
||||
:command.cards/good "البطاقات: جيدة"
|
||||
:command.cards/easy "البطاقات: سهلة"
|
||||
:command.editor/escape-editing "الخروج من المحرر"
|
||||
:command.editor/backspace "مسح/حذف للخلف (Backspace)"
|
||||
:command.editor/delete "حذف / حذف للأمام"
|
||||
:command.editor/new-block "إنشاء كتلة جديدة"
|
||||
:command.editor/new-line "إنشاء سطر جديد في الكتلة الحالية"
|
||||
:command.editor/follow-link "اتبع الرابط تحت المؤشر"
|
||||
:command.editor/open-link-in-sidebar "افتح الرابط في النافذة الجانبية"
|
||||
:command.editor/bold "عريض"
|
||||
:command.editor/italics "مائل"
|
||||
:command.editor/highlight "مظلل"
|
||||
:command.editor/strike-through "خط في المنتصف"
|
||||
:command.editor/clear-block "حذف محتوى الكتلة بالكامل"
|
||||
:command.editor/kill-line-before "حذف السطر قبل موقع المؤشر"
|
||||
:command.editor/copy-embed "نسخ رابط تضمين يشير إلى الكتلة الحالية"
|
||||
:command.editor/kill-line-after "حذف السطر بعد موقع المؤشر"
|
||||
:command.editor/beginning-of-block "نقل المؤشر إلى بداية الكتلة"
|
||||
:command.editor/end-of-block "نقل المؤشر إلى نهاية الكتلة"
|
||||
:command.editor/forward-word "نقل المؤشر كلمة للأمام"
|
||||
:command.editor/backward-word "نقل المؤشر كلمة للخلف"
|
||||
:command.editor/forward-kill-word "حذف كلمة للأمام"
|
||||
:command.editor/backward-kill-word "حذف كلمة للخلف"
|
||||
:command.editor/paste-text-in-one-block-at-point "لصق النص في كتلة واحدة عند نقطة المؤشر"
|
||||
:command.editor/insert-youtube-timestamp "إدراج الطابع الزمني ليوتيوب"
|
||||
:command.editor/cycle-todo "تبديل حالة قائمة المهام (TODO)"
|
||||
:command.editor/up "نقل المؤشر للأعلى / تحديد للأعلى"
|
||||
:command.editor/down "نقل المؤشر للأسفل / تحديد للأسفل"
|
||||
:command.editor/left "نقل المؤشر لليسار / فتح الكتلة المحددة من بدايتها"
|
||||
:command.editor/right "نقل المؤشر لليمين / فتح الكتلة المحددة من نهايتها"
|
||||
:command.editor/select-up "تحديد المحتوى أعلاه"
|
||||
:command.editor/select-down "تحديد المحتوى أدناه"
|
||||
:command.editor/move-block-up "نقل الكتلة للأعلى"
|
||||
:command.editor/move-block-down "نقل الكتلة للأسفل"
|
||||
:command.editor/move-blocks "نقل الكتل إلى"
|
||||
:command.editor/open-edit "تحرير الكتلة المحددة"
|
||||
:command.editor/open-selected-blocks-in-sidebar "فتح الكتل/ة المحددة في النافذة الجانبية"
|
||||
:command.editor/select-block-up "تحديد الكتلة أعلاه"
|
||||
:command.editor/select-block-down "تحديد الكتلة أدناه"
|
||||
:command.editor/delete-selection "حذف الكتل المحددة"
|
||||
:command.editor/expand-block-children "توسيع"
|
||||
:command.editor/collapse-block-children "طي"
|
||||
:command.editor/toggle-block-children "تبديل التوسيع/الطي"
|
||||
:command.editor/indent "رفع رتبة الكتلة"
|
||||
:command.editor/outdent "خفض رتبة الكتلة"
|
||||
:command.editor/copy "نسخ (ينسخ النص المحدد أو مرجع الكتلة)"
|
||||
:command.editor/copy-text "نسخ المحدد كنص"
|
||||
:command.editor/cut "قص"
|
||||
:command.editor/undo "تراجع"
|
||||
:command.editor/redo "إعادة"
|
||||
:command.editor/quick-add "إضافة سريعة"
|
||||
:command.editor/insert-link "رابط HTML"
|
||||
:command.editor/select-all-blocks "تحديد جميع الكتل"
|
||||
:command.editor/select-parent "تحديد الكتلة الأم"
|
||||
:command.editor/zoom-in "التركيز على الكتلة المحررة / أو الانتقال للأمام"
|
||||
:command.editor/zoom-out "الخروج من تركيز الكتلة / أو الرجوع للخلف"
|
||||
:command.editor/toggle-number-list "تبديل حالة قائمة الأرقام"
|
||||
:command.editor/add-property "إضافة ميزة"
|
||||
:command.editor/set-tags "تعيين الوسوم للكتل/ة المحددة"
|
||||
:command.editor/add-property-deadline "إضافة موعد نهائي للمهمة في الكتلة المحددة"
|
||||
:command.editor/add-property-status "إضافة حالة للمهمة في الكتلة المحددة"
|
||||
:command.editor/add-property-priority "إضافة أولوية للمهمة في الكتلة المحددة"
|
||||
:command.editor/add-property-icon "إضافة أيقونة"
|
||||
:command.editor/jump "الانتقال إلى مفتاح أو قيمة خاصية"
|
||||
:command.ui/toggle-brackets "تبديل إظهار/إخفاء الأقواس"
|
||||
:command.go/electron-find-in-page "البحث عن نص في الصفحة"
|
||||
:command.go/electron-jump-to-the-next "الانتقال إلى النتيجة التالية في شريط البحث"
|
||||
:command.go/electron-jump-to-the-previous "الانتقال إلى النتيجة السابقة في شريط البحث"
|
||||
:command.go/search "البحث في الصفحات والكتل"
|
||||
:command.go/search-themes "البحث عن السمات"
|
||||
:command.go/search-in-page "البحث عن الكتل في الصفحة"
|
||||
:command.command-palette/toggle "بحث عن الأوامر"
|
||||
:command.go/journals "الذهاب إلى اليوميات"
|
||||
:command.go/backward "للخلف"
|
||||
:command.go/forward "للأمام"
|
||||
:command.search/re-index "إعادة بناء فهرس البحث"
|
||||
:command.sidebar/open-today-page "فتح صفحة اليوم في النافذة الجانبية اليمنى"
|
||||
:command.sidebar/close-top "إغلاق العنصر الأعلى في النافذة الجانبية اليمنى"
|
||||
:command.sidebar/clear "مسح كافة العناصر في النافذة الجانبية اليمنى"
|
||||
:command.misc/copy "نسخ"
|
||||
:command.publish/open-dialog "فتح نافذة النشر للصفحة الحالية"
|
||||
:command.graph/export-as-html "تصدير صفحات المخطط العامة بصيغة HTML"
|
||||
:command.graph/open "اختر مخطط لفتحه"
|
||||
:command.graph/remove "إزالة مخطط"
|
||||
:command.graph/add "إضافة مخطط"
|
||||
:command.graph/db-add "إضافة مخطط قاعدة بيانات"
|
||||
:command.graph/db-save "حفظ قاعدة البيانات الحلية على القرص (~/logseq/graphs/your-current-graph)"
|
||||
:command.command/run "تشغيل أمر git"
|
||||
:command.go/home "الانتقال إلى الصفحة الرئيسية"
|
||||
:command.go/all-graphs "الانتقال إلى كافة المخططات"
|
||||
:command.go/all-pages "الانتقال إلى كافة الصفحات"
|
||||
:command.go/graph-view "الانتقال إلى عرض المخطط"
|
||||
:command.go/keyboard-shortcuts "الانتقال إلى اختصارات لوحة المفاتيح"
|
||||
:command.go/tomorrow "الانتقال إلى تاريخ الغد"
|
||||
:command.go/next-journal "الانتقال إلى اليومية التالية"
|
||||
:command.go/prev-journal "الانتقال إلى اليومية السابقة"
|
||||
:command.go/flashcards "تبديل عرض البطاقات التعليمية"
|
||||
:command.ui/toggle-document-mode "تبديل وضع المستند"
|
||||
:command.ui/toggle-settings "تبديل إظهار الإعدادات"
|
||||
:command.ui/toggle-right-sidebar "إظهار/إخفاء النافذة الجانبية اليمنى"
|
||||
:command.ui/toggle-left-sidebar "إظهار/إخفاء النافذة الجانبية اليسرى"
|
||||
:command.ui/toggle-help "تبديل (مساعدة)"
|
||||
:command.ui/toggle-theme "التبديل في المظهر فاتح/داكن"
|
||||
:command.ui/toggle-contents "تبديل عرض المحتويات في النافذة الجانبية"
|
||||
:command.ui/customize-appearance "تخصيص المظهر"
|
||||
;; :ui/open-new-window "Open another window"
|
||||
:command.command/toggle-favorite "إضافة إلى/إزالة من المفضلة"
|
||||
:command.editor/copy-page-url "نسخ رابط الصفحة"
|
||||
:command.ui/toggle-wide-mode "تبديل الوضع العريض"
|
||||
:command.ui/highlight-recent-blocks "تبديل تظليل الكتل الحديثة"
|
||||
:command.editor/toggle-display-hidden-properties "تبديل عرض الخصائص المخفية"
|
||||
:command.ui/select-theme-color "اختيار ألوان السمات المتاحة"
|
||||
:command.ui/goto-plugins "الانتقال إلى لوحة الإضافات"
|
||||
:command.ui/install-plugins-from-file "تثبيت الإضافات من ملف plugins.edn"
|
||||
:command.ui/install-plugin-from-github "تثبيت إضافة من إصدارات GitHub"
|
||||
:command.editor/toggle-open-blocks "تبديل فتح الكتل (طي أو توسيع كافة الكتل)"
|
||||
:command.ui/clear-all-notifications "مسح كافة الإشعارات"
|
||||
:command.misc/export-block-data "تصدير بيانات EDN للكتلة"
|
||||
:command.misc/export-page-data "تصدير بيانات EDN للصفحة"
|
||||
:command.misc/export-graph-ontology-data "تصدير بيانات EDN لوسوم وخصائص المخطط"
|
||||
:command.misc/import-edn-data "استيراد بيانات EDN"
|
||||
:command.dev/show-block-data "(للمطورين) عرض بيانات الكتلة"
|
||||
:command.dev/show-block-ast "(للمطورين) عرض بنية الكتلة (AST)"
|
||||
:command.dev/show-page-data "(للمطورين) عرض بيانات الصفحة"
|
||||
:command.dev/replace-graph-with-db-file "(للمطورين) استبدال المخطط بملف قاعدة البيانات الخاص به db.sqlite"
|
||||
:command.dev/validate-db "(للمطورين) التحقق من صحة بيانات المخطط الحالي"
|
||||
:command.dev/gc-graph "(للمطورين) تنظيف المخطط (إزالة البيانات غير المستخدمة من SQLite)"
|
||||
:command.dev/rtc-stop "(للمطورين) إيقاف ساعة الوقت الحقيقي RTC"
|
||||
:command.dev/rtc-start "(للمطورين) تشغيل ساعة الوقت الحقيقي RTC"
|
||||
:command.window/close "إغلاق النافذة"}
|
||||
Reference in New Issue
Block a user