Compare commits
486 Commits
v0.99.0
...
kev/share-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
63c54010eb | ||
|
|
cec868459a | ||
|
|
6c106300d4 | ||
|
|
69a59f0935 | ||
|
|
fa7575ed00 | ||
|
|
b2174549c7 | ||
|
|
19f16274ab | ||
|
|
7f88ae5494 | ||
|
|
c820b5caa4 | ||
|
|
b1638e1ffc | ||
|
|
f2e60f52d2 | ||
|
|
d845343e97 | ||
|
|
ee2edc92e7 | ||
|
|
332216f5f5 | ||
|
|
4d4cd7d130 | ||
|
|
b3cc51ce63 | ||
|
|
05645d93ef | ||
|
|
a2d09efca4 | ||
|
|
1212f9a9e9 | ||
|
|
75f7986e36 | ||
|
|
2447a6fc8d | ||
|
|
38a4a3e7b6 | ||
|
|
28240d549d | ||
|
|
5da46a1678 | ||
|
|
e592a37799 | ||
|
|
15d00b61dd | ||
|
|
5d0b6f9fad | ||
|
|
2a40ffd164 | ||
|
|
8c687de3c6 | ||
|
|
27415b4e16 | ||
|
|
ce0b39765e | ||
|
|
fafc4af237 | ||
|
|
76a283ed77 | ||
|
|
99500bca8f | ||
|
|
a982fc326f | ||
|
|
b16309d01a | ||
|
|
1bfc3d450f | ||
|
|
37b63d4ea9 | ||
|
|
e7315e7d35 | ||
|
|
718dffa672 | ||
|
|
c3dd9865e7 | ||
|
|
1702ec5644 | ||
|
|
dfddf044cf | ||
|
|
24a632056a | ||
|
|
dc7f4a6cf3 | ||
|
|
cd100f37fe | ||
|
|
984e8bbba0 | ||
|
|
fcc22cc212 | ||
|
|
4101acc2e3 | ||
|
|
f30bdd54b1 | ||
|
|
62bb8ac89a | ||
|
|
33dfcb1c6e | ||
|
|
5969815ed1 | ||
|
|
2b2125c702 | ||
|
|
85a4557bb0 | ||
|
|
0d9e4a1aa2 | ||
|
|
4a01181110 | ||
|
|
89dfc480f3 | ||
|
|
c178fc2957 | ||
|
|
9d8c62caaf | ||
|
|
279f014c42 | ||
|
|
826e9c7114 | ||
|
|
384c8649b4 | ||
|
|
ecc8bc3866 | ||
|
|
bb4d723f18 | ||
|
|
e250510ab1 | ||
|
|
dc630f927f | ||
|
|
e47cb13b89 | ||
|
|
838ae315e3 | ||
|
|
58afa86a2b | ||
|
|
5b90ece12f | ||
|
|
afb2072b97 | ||
|
|
8e0ca56b85 | ||
|
|
8e4cf38840 | ||
|
|
cb872d3638 | ||
|
|
781be26833 | ||
|
|
0ad5f3493d | ||
|
|
15bb3acb31 | ||
|
|
a43ddf3f9f | ||
|
|
8417bfebb0 | ||
|
|
28e8ea2da9 | ||
|
|
393264b4a1 | ||
|
|
9306a28c87 | ||
|
|
77fef38009 | ||
|
|
c14ea42978 | ||
|
|
341cd62b13 | ||
|
|
9e6cfe7c1e | ||
|
|
9695dd404b | ||
|
|
5e6be01251 | ||
|
|
f367a1c776 | ||
|
|
bce987c67a | ||
|
|
e7a9f9c566 | ||
|
|
33150e3a98 | ||
|
|
e1aead098e | ||
|
|
9f9a276a51 | ||
|
|
873df6da6c | ||
|
|
2e353afb98 | ||
|
|
d497688d9a | ||
|
|
2cf3a04482 | ||
|
|
e50fd6f540 | ||
|
|
5096163ae3 | ||
|
|
0d6640ae14 | ||
|
|
52ac93e99c | ||
|
|
674b0a8215 | ||
|
|
ec56b297dc | ||
|
|
a477cc22e6 | ||
|
|
119278b5f5 | ||
|
|
5414fbeacb | ||
|
|
a4b01bba9b | ||
|
|
bab536751a | ||
|
|
7657e17373 | ||
|
|
30f530abdb | ||
|
|
1d373bc7d5 | ||
|
|
9d3c5d04b9 | ||
|
|
ba91fbbe6b | ||
|
|
f6898779bb | ||
|
|
dbb90bdd2b | ||
|
|
f442c56ed6 | ||
|
|
e971a9cb03 | ||
|
|
b450a4faa0 | ||
|
|
9a2440942b | ||
|
|
c3151f9afa | ||
|
|
f277612444 | ||
|
|
1b92ad2f53 | ||
|
|
f96abe0e45 | ||
|
|
142a276cc4 | ||
|
|
a52b0a45fe | ||
|
|
6df40ec80a | ||
|
|
713340a9ba | ||
|
|
ee8b41c81b | ||
|
|
dd477258a9 | ||
|
|
7c30e2b4f6 | ||
|
|
37a3c00214 | ||
|
|
d30cdadb2d | ||
|
|
58f0d01944 | ||
|
|
d4791944b0 | ||
|
|
92a052674f | ||
|
|
d49ce7c289 | ||
|
|
5f38d52f20 | ||
|
|
6286745684 | ||
|
|
4f574f8aa4 | ||
|
|
a3e27248ad | ||
|
|
e48569245d | ||
|
|
473f7a83e6 | ||
|
|
1c622fa848 | ||
|
|
409e650506 | ||
|
|
d461f5474e | ||
|
|
36e731cc2c | ||
|
|
b77fbcb7ad | ||
|
|
7b7dc346ca | ||
|
|
b4f8a02ba6 | ||
|
|
9d6a5d1bb5 | ||
|
|
fa747c5c4b | ||
|
|
bc93f40cdb | ||
|
|
a9975798d7 | ||
|
|
4ea4404aba | ||
|
|
361848b518 | ||
|
|
8c46103f63 | ||
|
|
edcdecb720 | ||
|
|
e1ef02058d | ||
|
|
d9746df16b | ||
|
|
b4c20d9683 | ||
|
|
59955b7414 | ||
|
|
95b1c82ccb | ||
|
|
7cfebbabeb | ||
|
|
f412874c73 | ||
|
|
873c4c6636 | ||
|
|
efcd54be50 | ||
|
|
ae0bb78b1c | ||
|
|
29fa335a27 | ||
|
|
3a84a78cd1 | ||
|
|
df6bb7e6bf | ||
|
|
dfcaebc613 | ||
|
|
1ece35536b | ||
|
|
1a90548622 | ||
|
|
cc7e5bdb80 | ||
|
|
5c73b21ff7 | ||
|
|
e9078107ae | ||
|
|
6c24b18bc1 | ||
|
|
be7ff73142 | ||
|
|
63ac45d369 | ||
|
|
f164a4b786 | ||
|
|
806d601115 | ||
|
|
6b3cf49398 | ||
|
|
b8851565eb | ||
|
|
888d0d1084 | ||
|
|
0a25d4db0d | ||
|
|
4a72f2c6a7 | ||
|
|
446bdd6a5e | ||
|
|
cb26fac2ea | ||
|
|
3a45440c74 | ||
|
|
e115d6e275 | ||
|
|
fc614ccf83 | ||
|
|
17c9db7698 | ||
|
|
d483b6e840 | ||
|
|
032819e812 | ||
|
|
9d7d415756 | ||
|
|
e9d432b4bf | ||
|
|
be35584f9a | ||
|
|
80be4cc6b8 | ||
|
|
c74ba44b91 | ||
|
|
28a79baa01 | ||
|
|
5279601105 | ||
|
|
c2639951a5 | ||
|
|
6bfab1387d | ||
|
|
4212d208fc | ||
|
|
9e5bded4cf | ||
|
|
ce0763f03d | ||
|
|
e860b7aa32 | ||
|
|
0be9310450 | ||
|
|
d870a260e1 | ||
|
|
2de545be1c | ||
|
|
bf04e5a15b | ||
|
|
46d2d7e160 | ||
|
|
1775b22c7a | ||
|
|
ae022b6389 | ||
|
|
d4155102c5 | ||
|
|
3b1a25230f | ||
|
|
d8639793e0 | ||
|
|
06fec88214 | ||
|
|
da93928976 | ||
|
|
2314443d19 | ||
|
|
4b34047324 | ||
|
|
bc1d4de13d | ||
|
|
6bae4c8075 | ||
|
|
84a89fd0ba | ||
|
|
1447fa6f14 | ||
|
|
bc4937f9d2 | ||
|
|
43a7b828d9 | ||
|
|
d611591e1a | ||
|
|
f7a565ec73 | ||
|
|
6b35e909ab | ||
|
|
53b9ce0f3d | ||
|
|
5e1cd7d6ac | ||
|
|
acb98061ce | ||
|
|
979ef6287f | ||
|
|
58a883797d | ||
|
|
f718e87673 | ||
|
|
4c6a742af7 | ||
|
|
848dc51a7a | ||
|
|
44541b66c4 | ||
|
|
3694018441 | ||
|
|
3874e54d76 | ||
|
|
10de141c00 | ||
|
|
806ba320a8 | ||
|
|
09ef24d27d | ||
|
|
236f3cada7 | ||
|
|
c2afef4832 | ||
|
|
b9fa7d70bb | ||
|
|
9ac31f2667 | ||
|
|
639d1befef | ||
|
|
b99c8d5cc1 | ||
|
|
0770398010 | ||
|
|
c3d24451b7 | ||
|
|
4db1a3bdec | ||
|
|
2a0410f597 | ||
|
|
7e79d907be | ||
|
|
c0ea441c59 | ||
|
|
290d134d88 | ||
|
|
517bfd2c9a | ||
|
|
31990a9992 | ||
|
|
151a2c284d | ||
|
|
614a8f177c | ||
|
|
8b5e53e579 | ||
|
|
1ad8b1bf85 | ||
|
|
a393584a2a | ||
|
|
804fc72ed8 | ||
|
|
3f8f05368c | ||
|
|
5a56ba2fd5 | ||
|
|
de7c1329f8 | ||
|
|
6fc5aa0090 | ||
|
|
2eaeccda05 | ||
|
|
56f970ab08 | ||
|
|
d1cb9e4a3f | ||
|
|
992adcab65 | ||
|
|
d3b3a83477 | ||
|
|
98ad371d01 | ||
|
|
3cdae245e1 | ||
|
|
887c78d893 | ||
|
|
e208497d71 | ||
|
|
dd744b4e0d | ||
|
|
647cbc7e7a | ||
|
|
cc93102859 | ||
|
|
5b673e753b | ||
|
|
bd2eb6fdbb | ||
|
|
c25f783980 | ||
|
|
9b37708f0c | ||
|
|
7386bb35e5 | ||
|
|
9274522877 | ||
|
|
1b444686af | ||
|
|
b3dfdacdc3 | ||
|
|
159fab41ce | ||
|
|
093f48f76a | ||
|
|
6998a3593e | ||
|
|
c3250cfd72 | ||
|
|
e52eb9bcb0 | ||
|
|
5ac2892e34 | ||
|
|
a15aab395a | ||
|
|
f991276152 | ||
|
|
1f71ceb611 | ||
|
|
92e14159b9 | ||
|
|
b8419604e5 | ||
|
|
096fd82e64 | ||
|
|
cbaae52a7e | ||
|
|
5905299331 | ||
|
|
2df0763141 | ||
|
|
fb7453f7b0 | ||
|
|
974d20b0ba | ||
|
|
c2f6d9aa07 | ||
|
|
6194386464 | ||
|
|
329ecd6894 | ||
|
|
150f470aee | ||
|
|
83b843f047 | ||
|
|
24043611c3 | ||
|
|
2c99ba64bc | ||
|
|
ffe30bed75 | ||
|
|
b6088f488f | ||
|
|
e04165a184 | ||
|
|
d7aa95ce8e | ||
|
|
28214ec9fb | ||
|
|
28952a5253 | ||
|
|
d66505e5bc | ||
|
|
c4354032b5 | ||
|
|
d23550d3ef | ||
|
|
894ec1e3c1 | ||
|
|
bdb03f8d51 | ||
|
|
61ea27c8f4 | ||
|
|
ac45617d8f | ||
|
|
35853ff988 | ||
|
|
80009f99e8 | ||
|
|
0b1d001c20 | ||
|
|
cb63e88cdc | ||
|
|
a5c7f4221b | ||
|
|
f61010a65e | ||
|
|
b99f5b2cbe | ||
|
|
9919d0cbfa | ||
|
|
fe8099d8d1 | ||
|
|
0da336c8e1 | ||
|
|
37f5d19739 | ||
|
|
2ac0d84cee | ||
|
|
e639961b68 | ||
|
|
adf29b4e6e | ||
|
|
b00cd032a3 | ||
|
|
60e8f46777 | ||
|
|
ef2860770f | ||
|
|
aa562e9c26 | ||
|
|
866ccc1696 | ||
|
|
dbe241dee7 | ||
|
|
bd32a08e11 | ||
|
|
8416dab870 | ||
|
|
6fda669307 | ||
|
|
c21a9223f5 | ||
|
|
4e4e65b462 | ||
|
|
5e07231d78 | ||
|
|
d71d1ce8b4 | ||
|
|
892e84deaa | ||
|
|
7a73af0299 | ||
|
|
65dae511e5 | ||
|
|
55c70b404c | ||
|
|
8117586548 | ||
|
|
3ce9c7ba3d | ||
|
|
ab162efab8 | ||
|
|
babfc3cfb9 | ||
|
|
3d780d7d02 | ||
|
|
5b81aff8be | ||
|
|
86b14a5763 | ||
|
|
14a2794d15 | ||
|
|
eef68aca0f | ||
|
|
f6f7445528 | ||
|
|
f7c0184a6b | ||
|
|
65bc599a16 | ||
|
|
b445bef74c | ||
|
|
93d7ba032d | ||
|
|
334e2c3949 | ||
|
|
a11797fe6e | ||
|
|
3cf0ec5740 | ||
|
|
40f578f43f | ||
|
|
428abb4591 | ||
|
|
4954fa89b5 | ||
|
|
10f7837a7f | ||
|
|
fca310cc31 | ||
|
|
cf58b511df | ||
|
|
9da1f52a71 | ||
|
|
5c8e674ddb | ||
|
|
f027b25bc2 | ||
|
|
cfe71a3426 | ||
|
|
70afb636ca | ||
|
|
818efe7fb0 | ||
|
|
3c2263db86 | ||
|
|
7c30bc9c72 | ||
|
|
ec8d719d41 | ||
|
|
5f884c4440 | ||
|
|
e6c806d462 | ||
|
|
4afceeca79 | ||
|
|
7990c60ce7 | ||
|
|
74c248bce2 | ||
|
|
2df646f80c | ||
|
|
768260782a | ||
|
|
4eff105af5 | ||
|
|
68ef6ea142 | ||
|
|
772d4ac5a1 | ||
|
|
b3e1a79d40 | ||
|
|
d7afa8526d | ||
|
|
b4a2a6c12b | ||
|
|
32c15f5e03 | ||
|
|
b5a491820c | ||
|
|
8a477c87e0 | ||
|
|
8bcae8cdb8 | ||
|
|
ea87161a91 | ||
|
|
f2bb6cb848 | ||
|
|
fecb677552 | ||
|
|
3ba9b56833 | ||
|
|
a329e7d72a | ||
|
|
2568f6bb53 | ||
|
|
23936596fa | ||
|
|
398db56fe7 | ||
|
|
423ef14ca6 | ||
|
|
9921d3e0a7 | ||
|
|
ac22fd8d60 | ||
|
|
ff065964e9 | ||
|
|
951dda50ac | ||
|
|
01bd2f1815 | ||
|
|
570f8fd155 | ||
|
|
5d348e3ad6 | ||
|
|
9573346d55 | ||
|
|
e4570a1bb0 | ||
|
|
b884aba244 | ||
|
|
9c73908560 | ||
|
|
b399d292a9 | ||
|
|
a557d9770f | ||
|
|
a11ebfeb42 | ||
|
|
4695c3726d | ||
|
|
324f79ceb9 | ||
|
|
fc5e459895 | ||
|
|
bdaba67859 | ||
|
|
2b01e2fdaf | ||
|
|
9967da6ea1 | ||
|
|
a56a00ba2f | ||
|
|
82df26031f | ||
|
|
b4af8e7339 | ||
|
|
e6180f427b | ||
|
|
9a95ec170d | ||
|
|
7be0507db5 | ||
|
|
1d324ab3b0 | ||
|
|
9e00ed7e14 | ||
|
|
02a6652b44 | ||
|
|
e19f7b286a | ||
|
|
50301a97f3 | ||
|
|
408e31079c | ||
|
|
bf81e159ca | ||
|
|
b1f89296ff | ||
|
|
1948302a64 | ||
|
|
187585b32f | ||
|
|
d351fd506a | ||
|
|
1cf29c985e | ||
|
|
04374540ad | ||
|
|
ce8f3a4f8f | ||
|
|
acb21b992d | ||
|
|
15f344fe4a | ||
|
|
120324c3f0 | ||
|
|
59ce8b912d | ||
|
|
619888847b | ||
|
|
06b782e91d | ||
|
|
1d7e0a193a | ||
|
|
2d815852e4 | ||
|
|
735a7104f1 | ||
|
|
e3e4772aab | ||
|
|
8bb65b94d0 | ||
|
|
b9edae4fc9 | ||
|
|
27aae18345 | ||
|
|
47db63d909 | ||
|
|
8ebeead32c | ||
|
|
09d43e710f | ||
|
|
7240f64a49 | ||
|
|
ab868d76db | ||
|
|
acdaf6a636 | ||
|
|
6dccef1689 | ||
|
|
f7ec726b15 | ||
|
|
781570f950 | ||
|
|
7774d41457 | ||
|
|
29c8bcaf6e | ||
|
|
2b3ae94f8d | ||
|
|
5c618abc79 | ||
|
|
220cf8aedd | ||
|
|
78f16ddc12 | ||
|
|
0048e95e0c |
103
.github/actions/deploy-to-cloudflare-pages/action.yml
vendored
Normal file
@@ -0,0 +1,103 @@
|
||||
name: "Deploy to Cloudflare Pages"
|
||||
description: "Deploys to Cloudflare Pages on either a temporary branch with preview comment, or on the production version if on the main branch."
|
||||
inputs:
|
||||
project_name:
|
||||
description: "CloudFlare Pages project name"
|
||||
comment_body:
|
||||
description: "The message to display when deployment is ready"
|
||||
default: "Deployment is ready."
|
||||
required: false
|
||||
production_url:
|
||||
description: "The URL to mention as the production URL."
|
||||
required: true
|
||||
deploy_dir:
|
||||
description: "The directory from which to deploy."
|
||||
required: true
|
||||
cloudflare_api_token:
|
||||
description: "The Cloudflare API token to use for deployment."
|
||||
required: true
|
||||
cloudflare_account_id:
|
||||
description: "The Cloudflare account ID to use for deployment."
|
||||
required: true
|
||||
github_token:
|
||||
description: "The GitHub token to use for posting PR comments."
|
||||
required: true
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
# Install wrangler globally to avoid workspace issues
|
||||
- name: Install Wrangler
|
||||
shell: bash
|
||||
run: npm install -g wrangler
|
||||
|
||||
# Deploy using Wrangler (use pre-installed wrangler)
|
||||
- name: Deploy to Cloudflare Pages
|
||||
id: deploy
|
||||
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ inputs.cloudflare_api_token }}
|
||||
accountId: ${{ inputs.cloudflare_account_id }}
|
||||
command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=${{ github.ref_name }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Deploy preview for PRs
|
||||
- name: Deploy Preview to Cloudflare Pages
|
||||
id: preview-deployment
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ inputs.cloudflare_api_token }}
|
||||
accountId: ${{ inputs.cloudflare_account_id }}
|
||||
command: pages deploy ${{ inputs.deploy_dir }} --project-name=${{ inputs.project_name}} --branch=pr-${{ github.event.pull_request.number }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Post deployment URL as PR comment
|
||||
- name: Comment PR with Preview URL
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v8
|
||||
env:
|
||||
COMMENT_BODY: ${{ inputs.comment_body }}
|
||||
PRODUCTION_URL: ${{ inputs.production_url }}
|
||||
PROJECT_NAME: ${{ inputs.project_name }}
|
||||
with:
|
||||
github-token: ${{ inputs.github_token }}
|
||||
script: |
|
||||
const prNumber = context.issue.number;
|
||||
// Construct preview URL based on Cloudflare Pages pattern
|
||||
const projectName = process.env.PROJECT_NAME;
|
||||
const previewUrl = `https://pr-${prNumber}.${projectName}.pages.dev`;
|
||||
|
||||
// Check if we already commented
|
||||
const comments = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber
|
||||
});
|
||||
|
||||
const customMessage = process.env.COMMENT_BODY;
|
||||
const botComment = comments.data.find(comment =>
|
||||
comment.user.type === 'Bot' &&
|
||||
comment.body.includes(customMessage)
|
||||
);
|
||||
|
||||
const mainUrl = process.env.PRODUCTION_URL;
|
||||
const commentBody = `${customMessage}!\n\n🔗 Preview URL: ${previewUrl}\n📖 Production URL: ${mainUrl}\n\n✅ All checks passed\n\n_This preview will be updated automatically with new commits._`;
|
||||
|
||||
if (botComment) {
|
||||
// Update existing comment
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: botComment.id,
|
||||
body: commentBody
|
||||
});
|
||||
} else {
|
||||
// Create new comment
|
||||
await github.rest.issues.createComment({
|
||||
issue_number: prNumber,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: commentBody
|
||||
});
|
||||
}
|
||||
102
.github/workflows/deploy-docs.yml
vendored
@@ -16,10 +16,10 @@ on:
|
||||
- 'requirements-docs.txt'
|
||||
- '.github/workflows/deploy-docs.yml'
|
||||
- 'scripts/fix-mkdocs-structure.ts'
|
||||
|
||||
|
||||
# Allow manual triggering from Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
|
||||
# Run on pull requests for preview deployments
|
||||
pull_request:
|
||||
branches:
|
||||
@@ -38,55 +38,55 @@ jobs:
|
||||
name: Build and Deploy MkDocs
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
|
||||
|
||||
# Required permissions for deployment
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
pull-requests: write # For PR preview comments
|
||||
id-token: write # For OIDC authentication (if needed)
|
||||
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0 # Fetch all history for git info and mkdocs-git-revision-date plugin
|
||||
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: '3.13'
|
||||
cache: 'pip'
|
||||
cache-dependency-path: 'requirements-docs.txt'
|
||||
|
||||
|
||||
- name: Install MkDocs and Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements-docs.txt
|
||||
env:
|
||||
PIP_DISABLE_PIP_VERSION_CHECK: 1
|
||||
|
||||
|
||||
# Setup pnpm before fixing docs structure
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
|
||||
|
||||
# Setup Node.js with pnpm
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: '22'
|
||||
cache: 'pnpm'
|
||||
|
||||
|
||||
# Install Node.js dependencies for the TypeScript script
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pnpm install --frozen-lockfile
|
||||
|
||||
|
||||
- name: Fix Documentation Structure
|
||||
run: |
|
||||
# Fix duplicate navigation entries by moving overview pages to index.md
|
||||
pnpm run chore:fix-mkdocs-structure
|
||||
|
||||
|
||||
- name: Build MkDocs Site
|
||||
run: |
|
||||
# Build with strict mode but allow expected warnings
|
||||
@@ -115,74 +115,14 @@ jobs:
|
||||
test -f site/sitemap.xml || (echo "ERROR: site/sitemap.xml not found" && exit 1)
|
||||
test -d site/assets || (echo "ERROR: site/assets directory not found" && exit 1)
|
||||
echo "✅ Site validation passed"
|
||||
|
||||
# Install wrangler globally to avoid workspace issues
|
||||
- name: Install Wrangler
|
||||
run: |
|
||||
npm install -g wrangler
|
||||
|
||||
# Deploy using Wrangler (use pre-installed wrangler)
|
||||
- name: Deploy to Cloudflare Pages
|
||||
id: deploy
|
||||
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
|
||||
- name: Deploy
|
||||
uses: ./.github/actions/deploy-to-cloudflare-pages
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
command: pages deploy site --project-name=trilium-docs --branch=${{ github.ref_name }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Deploy preview for PRs
|
||||
- name: Deploy Preview to Cloudflare Pages
|
||||
id: preview-deployment
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
command: pages deploy site --project-name=trilium-docs --branch=pr-${{ github.event.pull_request.number }}
|
||||
wranglerVersion: '' # Use pre-installed version
|
||||
|
||||
# Post deployment URL as PR comment
|
||||
- name: Comment PR with Preview URL
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const prNumber = context.issue.number;
|
||||
// Construct preview URL based on Cloudflare Pages pattern
|
||||
const previewUrl = `https://pr-${prNumber}.trilium-docs.pages.dev`;
|
||||
const mainUrl = 'https://docs.triliumnotes.org';
|
||||
|
||||
// Check if we already commented
|
||||
const comments = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: prNumber
|
||||
});
|
||||
|
||||
const botComment = comments.data.find(comment =>
|
||||
comment.user.type === 'Bot' &&
|
||||
comment.body.includes('Documentation preview is ready')
|
||||
);
|
||||
|
||||
const commentBody = `📚 Documentation preview is ready!\n\n🔗 Preview URL: ${previewUrl}\n📖 Production URL: ${mainUrl}\n\n✅ All checks passed\n\n_This preview will be updated automatically with new commits._`;
|
||||
|
||||
if (botComment) {
|
||||
// Update existing comment
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: botComment.id,
|
||||
body: commentBody
|
||||
});
|
||||
} else {
|
||||
// Create new comment
|
||||
await github.rest.issues.createComment({
|
||||
issue_number: prNumber,
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
body: commentBody
|
||||
});
|
||||
}
|
||||
project_name: "trilium-docs"
|
||||
comment_body: "📚 Documentation preview is ready"
|
||||
production_url: "https://docs.triliumnotes.org"
|
||||
deploy_dir: "site"
|
||||
cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
5
.github/workflows/nightly.yml
vendored
@@ -19,7 +19,6 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
GITHUB_UPLOAD_URL: https://uploads.github.com/repos/TriliumNext/Notes/releases/179589950/assets{?name,label}
|
||||
GITHUB_RELEASE_ID: 179589950
|
||||
|
||||
permissions:
|
||||
@@ -78,7 +77,7 @@ jobs:
|
||||
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
|
||||
|
||||
- name: Publish release
|
||||
uses: softprops/action-gh-release@v2.3.3
|
||||
uses: softprops/action-gh-release@v2.3.4
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
make_latest: false
|
||||
@@ -119,7 +118,7 @@ jobs:
|
||||
arch: ${{ matrix.arch }}
|
||||
|
||||
- name: Publish release
|
||||
uses: softprops/action-gh-release@v2.3.3
|
||||
uses: softprops/action-gh-release@v2.3.4
|
||||
if: ${{ github.event_name != 'pull_request' }}
|
||||
with:
|
||||
make_latest: false
|
||||
|
||||
2
.github/workflows/playwright.yml
vendored
@@ -4,6 +4,8 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths-ignore:
|
||||
- "apps/website/**"
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
|
||||
2
.github/workflows/release.yml
vendored
@@ -127,7 +127,7 @@ jobs:
|
||||
path: upload
|
||||
|
||||
- name: Publish stable release
|
||||
uses: softprops/action-gh-release@v2.3.3
|
||||
uses: softprops/action-gh-release@v2.3.4
|
||||
with:
|
||||
draft: false
|
||||
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md
|
||||
|
||||
48
.github/workflows/website.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
name: Deploy website
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- "apps/website/**"
|
||||
|
||||
pull_request:
|
||||
paths:
|
||||
- "apps/website/**"
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
runs-on: ubuntu-latest
|
||||
name: Build & deploy website
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
deployments: write
|
||||
pull-requests: write # For PR preview comments
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: pnpm/action-setup@v4
|
||||
- name: Set up node & dependencies
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: 22
|
||||
cache: "pnpm"
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --filter website --frozen-lockfile
|
||||
|
||||
- name: Build the website
|
||||
run: pnpm website:build
|
||||
|
||||
- name: Deploy
|
||||
uses: ./.github/actions/deploy-to-cloudflare-pages
|
||||
with:
|
||||
project_name: "trilium-homepage"
|
||||
comment_body: "📚 Website preview is ready"
|
||||
production_url: "https://triliumnotes.org"
|
||||
deploy_dir: "apps/website/dist"
|
||||
cloudflare_api_token: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
cloudflare_account_id: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
34
README.md
@@ -5,7 +5,7 @@
|
||||

|
||||
[](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) [](https://hosted.weblate.org/engage/trilium/)
|
||||
|
||||
[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README.ru.md) | [Japanese](./docs/README.ja.md) | [Italian](./docs/README.it.md) | [Spanish](./docs/README.es.md)
|
||||
[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | [Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) | [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | [Spanish](./docs/README-es.md)
|
||||
|
||||
Trilium Notes is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.
|
||||
|
||||
@@ -166,16 +166,34 @@ Please view the [documentation guide](https://github.com/TriliumNext/Trilium/blo
|
||||
|
||||
## 👏 Shoutouts
|
||||
|
||||
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - best WYSIWYG editor on the market, very interactive and listening team
|
||||
* [FancyTree](https://github.com/mar10/fancytree) - very feature rich tree library without real competition. Trilium Notes would not be the same without it.
|
||||
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages
|
||||
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library without competition. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)
|
||||
* [zadam](https://github.com/zadam) for the original concept and implementation of the application.
|
||||
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
|
||||
* [nriver](https://github.com/nriver) for his work on internationalization.
|
||||
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
|
||||
* [antoniotejada](https://github.com/nriver) for the original syntax highlight widget.
|
||||
* [Dosu](https://dosu.dev/) for providing us with the automated responses to GitHub issues and discussions.
|
||||
* [Tabler Icons](https://tabler.io/icons) for the system tray icons.
|
||||
|
||||
Trilium would not be possible without the technologies behind it:
|
||||
|
||||
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind text notes. We are grateful for being offered a set of the premium features.
|
||||
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with support for huge amount of languages.
|
||||
* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite whiteboard used in Canvas notes.
|
||||
* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the mind map functionality.
|
||||
* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical maps.
|
||||
* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive table used in collections.
|
||||
* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library without real competition.
|
||||
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. Used in [relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)
|
||||
|
||||
## 🤝 Support
|
||||
|
||||
Support for the TriliumNext organization will be possible in the near future. For now, you can:
|
||||
- Support continued development on TriliumNext by supporting our developers: [eliandoran](https://github.com/sponsors/eliandoran) (See the [repository insights]([developers]([url](https://github.com/TriliumNext/trilium/graphs/contributors))) for a full list)
|
||||
- Show a token of gratitude to the original Trilium developer ([zadam](https://github.com/sponsors/zadam)) via [PayPal](https://paypal.me/za4am) or Bitcoin (bitcoin:bc1qv3svjn40v89mnkre5vyvs2xw6y8phaltl385d2).
|
||||
Trilium is built and maintained with [hundreds of hours of work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your support keeps it open-source, improves features, and covers costs such as hosting.
|
||||
|
||||
Consider supporting the main developer ([eliandoran](https://github.com/eliandoran)) of the application via:
|
||||
|
||||
- [GitHub Sponsors](https://github.com/sponsors/eliandoran)
|
||||
- [PayPal](https://paypal.me/eliandoran)
|
||||
- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran)
|
||||
|
||||
|
||||
## 🔑 License
|
||||
|
||||
@@ -35,13 +35,13 @@
|
||||
"chore:generate-openapi": "tsx bin/generate-openapi.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.55.0",
|
||||
"@playwright/test": "1.55.1",
|
||||
"@stylistic/eslint-plugin": "5.4.0",
|
||||
"@types/express": "5.0.3",
|
||||
"@types/node": "22.18.6",
|
||||
"@types/node": "22.18.8",
|
||||
"@types/yargs": "17.0.33",
|
||||
"@vitest/coverage-v8": "3.2.4",
|
||||
"eslint": "9.36.0",
|
||||
"eslint": "9.37.0",
|
||||
"eslint-plugin-simple-import-sort": "12.1.1",
|
||||
"esm": "3.2.25",
|
||||
"jsdoc": "4.0.4",
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"name": "@triliumnext/client",
|
||||
"version": "0.99.0",
|
||||
"version": "0.99.1",
|
||||
"description": "JQuery-based client for TriliumNext, used for both web and desktop (via Electron)",
|
||||
"private": true,
|
||||
"license": "AGPL-3.0-only",
|
||||
"author": {
|
||||
"name": "Trilium Notes Team",
|
||||
"email": "contact@eliandoran.me",
|
||||
"url": "https://github.com/TriliumNext/Notes"
|
||||
"url": "https://github.com/TriliumNext/Trilium"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 vite build",
|
||||
@@ -15,7 +15,7 @@
|
||||
"circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular"
|
||||
},
|
||||
"dependencies": {
|
||||
"@eslint/js": "9.36.0",
|
||||
"@eslint/js": "9.37.0",
|
||||
"@excalidraw/excalidraw": "0.18.0",
|
||||
"@fullcalendar/core": "6.1.19",
|
||||
"@fullcalendar/daygrid": "6.1.19",
|
||||
@@ -41,23 +41,23 @@
|
||||
"draggabilly": "3.0.0",
|
||||
"force-graph": "1.51.0",
|
||||
"globals": "16.4.0",
|
||||
"i18next": "25.5.2",
|
||||
"i18next": "25.5.3",
|
||||
"i18next-http-backend": "3.0.2",
|
||||
"jquery": "3.7.1",
|
||||
"jquery.fancytree": "2.38.5",
|
||||
"jsplumb": "2.15.6",
|
||||
"katex": "0.16.22",
|
||||
"katex": "0.16.23",
|
||||
"knockout": "3.5.1",
|
||||
"leaflet": "1.9.4",
|
||||
"leaflet-gpx": "2.2.0",
|
||||
"mark.js": "8.11.1",
|
||||
"marked": "16.3.0",
|
||||
"mermaid": "11.12.0",
|
||||
"mind-elixir": "5.2.0",
|
||||
"mind-elixir": "5.1.1",
|
||||
"normalize.css": "8.0.1",
|
||||
"panzoom": "9.4.3",
|
||||
"preact": "10.27.2",
|
||||
"react-i18next": "15.7.3",
|
||||
"react-i18next": "16.0.0",
|
||||
"split.js": "1.6.5",
|
||||
"svg-pan-zoom": "3.6.2",
|
||||
"tabulator-tables": "6.3.1",
|
||||
@@ -73,8 +73,8 @@
|
||||
"@types/mark.js": "8.11.12",
|
||||
"@types/tabulator-tables": "6.2.11",
|
||||
"copy-webpack-plugin": "13.0.1",
|
||||
"happy-dom": "18.0.1",
|
||||
"happy-dom": "19.0.2",
|
||||
"script-loader": "0.7.2",
|
||||
"vite-plugin-static-copy": "3.1.2"
|
||||
"vite-plugin-static-copy": "3.1.3"
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ import dayjs from "dayjs";
|
||||
import type NoteContext from "../components/note_context.js";
|
||||
import type NoteDetailWidget from "../widgets/note_detail.js";
|
||||
import type Component from "../components/component.js";
|
||||
import { formatLogMessage } from "@triliumnext/commons";
|
||||
|
||||
/**
|
||||
* A whole number
|
||||
@@ -455,7 +456,7 @@ export interface Api {
|
||||
/**
|
||||
* Log given message to the log pane in UI
|
||||
*/
|
||||
log(message: string): void;
|
||||
log(message: string | object): void;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -696,7 +697,7 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig
|
||||
this.log = (message) => {
|
||||
const { noteId } = this.startNote;
|
||||
|
||||
message = `${utils.now()}: ${message}`;
|
||||
message = `${utils.now()}: ${formatLogMessage(message)}`;
|
||||
|
||||
console.log(`Script ${noteId}: ${message}`);
|
||||
|
||||
|
||||
@@ -35,8 +35,7 @@ async function getLinkIcon(noteId: string, viewMode: ViewMode | undefined) {
|
||||
return icon;
|
||||
}
|
||||
|
||||
// TODO: Remove `string` once all the view modes have been mapped.
|
||||
type ViewMode = "default" | "source" | "attachments" | "contextual-help" | string;
|
||||
export type ViewMode = "default" | "source" | "attachments" | "contextual-help";
|
||||
|
||||
export interface ViewScope {
|
||||
/**
|
||||
|
||||
@@ -119,11 +119,6 @@ describe("shortcuts", () => {
|
||||
metaKey: options.metaKey || false
|
||||
} as KeyboardEvent);
|
||||
|
||||
it("should match simple key shortcuts", () => {
|
||||
const event = createKeyboardEvent({ key: "a", code: "KeyA" });
|
||||
expect(matchesShortcut(event, "a")).toBe(true);
|
||||
});
|
||||
|
||||
it("should match shortcuts with modifiers", () => {
|
||||
const event = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true });
|
||||
expect(matchesShortcut(event, "ctrl+a")).toBe(true);
|
||||
@@ -148,6 +143,28 @@ describe("shortcuts", () => {
|
||||
expect(matchesShortcut(event, "a")).toBe(false);
|
||||
});
|
||||
|
||||
it("should not match when no modifiers are used", () => {
|
||||
const event = createKeyboardEvent({ key: "a", code: "KeyA" });
|
||||
expect(matchesShortcut(event, "a")).toBe(false);
|
||||
});
|
||||
|
||||
it("should match some keys even with no modifiers", () => {
|
||||
// Bare function keys
|
||||
let event = createKeyboardEvent({ key: "F1", code: "F1" });
|
||||
expect(matchesShortcut(event, "F1")).toBeTruthy();
|
||||
expect(matchesShortcut(event, "f1")).toBeTruthy();
|
||||
|
||||
// Function keys with shift
|
||||
event = createKeyboardEvent({ key: "F1", code: "F1", shiftKey: true });
|
||||
expect(matchesShortcut(event, "Shift+F1")).toBeTruthy();
|
||||
|
||||
// Special keys
|
||||
for (const keyCode of [ "Delete", "Enter" ]) {
|
||||
event = createKeyboardEvent({ key: keyCode, code: keyCode });
|
||||
expect(matchesShortcut(event, keyCode), `Key ${keyCode}`).toBeTruthy();
|
||||
}
|
||||
});
|
||||
|
||||
it("should handle alternative modifier names", () => {
|
||||
const ctrlEvent = createKeyboardEvent({ key: "a", code: "KeyA", ctrlKey: true });
|
||||
expect(matchesShortcut(ctrlEvent, "control+a")).toBe(true);
|
||||
|
||||
@@ -36,10 +36,19 @@ const keyMap: { [key: string]: string[] } = {
|
||||
};
|
||||
|
||||
// Function keys
|
||||
const functionKeyCodes: string[] = [];
|
||||
for (let i = 1; i <= 19; i++) {
|
||||
keyMap[`f${i}`] = [`F${i}`];
|
||||
const keyCode = `F${i}`;
|
||||
functionKeyCodes.push(keyCode);
|
||||
keyMap[`f${i}`] = [ keyCode ];
|
||||
}
|
||||
|
||||
const KEYCODES_WITH_NO_MODIFIER = new Set([
|
||||
"Delete",
|
||||
"Enter",
|
||||
...functionKeyCodes
|
||||
]);
|
||||
|
||||
/**
|
||||
* Check if IME (Input Method Editor) is composing
|
||||
* This is used to prevent keyboard shortcuts from firing during IME composition
|
||||
@@ -51,7 +60,7 @@ export function isIMEComposing(e: KeyboardEvent): boolean {
|
||||
if (!e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Standard check for composition state
|
||||
// e.isComposing is true when IME is actively composing
|
||||
// e.keyCode === 229 is a fallback for older browsers where 229 indicates IME processing
|
||||
@@ -86,13 +95,13 @@ function bindElShortcut($el: JQuery<ElementType | Element>, keyboardShortcut: st
|
||||
}
|
||||
|
||||
const e = evt as KeyboardEvent;
|
||||
|
||||
|
||||
// Skip processing if IME is composing to prevent shortcuts from
|
||||
// interfering with text input in CJK languages
|
||||
if (isIMEComposing(e)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (matchesShortcut(e, keyboardShortcut)) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
@@ -162,6 +171,12 @@ export function matchesShortcut(e: KeyboardEvent, shortcut: string): boolean {
|
||||
const expectedShift = modifiers.includes('shift');
|
||||
const expectedMeta = modifiers.includes('meta') || modifiers.includes('cmd') || modifiers.includes('command');
|
||||
|
||||
// Refuse key combinations that don't include modifiers because they interfere with the normal usage of the application.
|
||||
// Some keys such as function keys are an exception.
|
||||
if (!(expectedCtrl || expectedAlt || expectedShift || expectedMeta) && !KEYCODES_WITH_NO_MODIFIER.has(e.code)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return e.ctrlKey === expectedCtrl &&
|
||||
e.altKey === expectedAlt &&
|
||||
e.shiftKey === expectedShift &&
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import ws from "./ws.js";
|
||||
import utils from "./utils.js";
|
||||
|
||||
export interface ToastOptions {
|
||||
id?: string;
|
||||
icon: string;
|
||||
title: string;
|
||||
title?: string;
|
||||
message: string;
|
||||
delay?: number;
|
||||
autohide?: boolean;
|
||||
@@ -12,20 +11,32 @@ export interface ToastOptions {
|
||||
}
|
||||
|
||||
function toast(options: ToastOptions) {
|
||||
const $toast = $(
|
||||
`<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-header">
|
||||
<strong class="me-auto">
|
||||
const $toast = $(options.title
|
||||
? `\
|
||||
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-header">
|
||||
<strong class="me-auto">
|
||||
<span class="bx bx-${options.icon}"></span>
|
||||
<span class="toast-title"></span>
|
||||
</strong>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
</div>`
|
||||
: `
|
||||
<div class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-icon">
|
||||
<span class="bx bx-${options.icon}"></span>
|
||||
<span class="toast-title"></span>
|
||||
</strong>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
</div>`
|
||||
</div>
|
||||
<div class="toast-body"></div>
|
||||
<div class="toast-header">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
|
||||
</div>
|
||||
</div>`
|
||||
);
|
||||
|
||||
$toast.find(".toast-title").text(options.title);
|
||||
$toast.toggleClass("no-title", !options.title);
|
||||
$toast.find(".toast-title").text(options.title ?? "");
|
||||
$toast.find(".toast-body").html(options.message);
|
||||
|
||||
if (options.id) {
|
||||
@@ -70,7 +81,6 @@ function showMessage(message: string, delay = 2000) {
|
||||
console.debug(utils.now(), "message:", message);
|
||||
|
||||
toast({
|
||||
title: "Info",
|
||||
icon: "check",
|
||||
message: message,
|
||||
autohide: true,
|
||||
@@ -82,7 +92,6 @@ export function showError(message: string, delay = 10000) {
|
||||
console.log(utils.now(), "error: ", message);
|
||||
|
||||
toast({
|
||||
title: "Error",
|
||||
icon: "alert",
|
||||
message: message,
|
||||
autohide: true,
|
||||
|
||||
@@ -7,6 +7,7 @@ import appContext from "../components/app_context.js";
|
||||
import { t } from "./i18n.js";
|
||||
import type { EntityChange } from "../server_types.js";
|
||||
import { WebSocketMessage } from "@triliumnext/commons";
|
||||
import toast from "./toast.js";
|
||||
|
||||
type MessageHandler = (message: WebSocketMessage) => void;
|
||||
let messageHandlers: MessageHandler[] = [];
|
||||
@@ -278,13 +279,17 @@ function connectWebSocket() {
|
||||
|
||||
async function sendPing() {
|
||||
if (Date.now() - lastPingTs > 30000) {
|
||||
console.log(
|
||||
utils.now(),
|
||||
"Lost websocket connection to the backend. If you keep having this issue repeatedly, you might want to check your reverse proxy (nginx, apache) configuration and allow/unblock WebSocket."
|
||||
);
|
||||
console.warn(utils.now(), "Lost websocket connection to the backend");
|
||||
toast.showPersistent({
|
||||
id: "lost-websocket-connection",
|
||||
title: t("ws.lost-websocket-connection-title"),
|
||||
message: t("ws.lost-websocket-connection-message"),
|
||||
icon: "no-signal"
|
||||
});
|
||||
}
|
||||
|
||||
if (ws.readyState === ws.OPEN) {
|
||||
toast.closePersistent("lost-websocket-connection");
|
||||
ws.send(
|
||||
JSON.stringify({
|
||||
type: "ping",
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
#center-pane > *:not(.split-note-container-widget),
|
||||
#right-pane,
|
||||
.title-row .note-icon-widget,
|
||||
.title-row .button-widget,
|
||||
.title-row .icon-action,
|
||||
.ribbon-container,
|
||||
.promoted-attributes-widget,
|
||||
.scroll-padding-widget,
|
||||
|
||||
@@ -1141,6 +1141,26 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.toast.no-title {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.toast.no-title .toast-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);
|
||||
}
|
||||
|
||||
.toast.no-title .toast-body {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
.toast.no-title .toast-header {
|
||||
background-color: unset !important;
|
||||
}
|
||||
|
||||
.ck-mentions .ck-button {
|
||||
font-size: var(--detail-font-size) !important;
|
||||
padding: 5px;
|
||||
@@ -1472,7 +1492,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu {
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
color: var(--launcher-pane-text-color);
|
||||
background: transparent;
|
||||
background-color: transparent;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
@@ -2005,12 +2025,16 @@ body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)),
|
||||
body.zen .ribbon-container:has(.classic-toolbar-widget.visible) .ribbon-top-row,
|
||||
body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)),
|
||||
body.zen .note-icon-widget,
|
||||
body.zen .title-row .button-widget,
|
||||
body.zen .title-row .icon-action,
|
||||
body.zen .floating-buttons-children > *:not(.bx-edit-alt),
|
||||
body.zen .action-button {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
body.zen .split-note-container-widget > .gutter {
|
||||
display: unset !important;
|
||||
}
|
||||
|
||||
body.zen #launcher-pane {
|
||||
position: absolute !important;
|
||||
top: 0 !important;
|
||||
|
||||
@@ -327,30 +327,49 @@ li.dropdown-item a.dropdown-item-button:focus-visible {
|
||||
--modal-control-button-color: var(--bs-toast-color);
|
||||
|
||||
display: flex;
|
||||
flex-direction: row-reverse;
|
||||
flex-direction: column;
|
||||
backdrop-filter: blur(6px);
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header {
|
||||
padding: 0 !important;
|
||||
background: transparent !important;
|
||||
border-bottom: none;
|
||||
color: var(--toast-text-color) !important;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header strong {
|
||||
/* The title of the toast is no longer displayed */
|
||||
display: none;
|
||||
#toast-container .toast .toast-header strong > * {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-header .btn-close {
|
||||
margin: 0 var(--bs-toast-padding-x) 0 12px;
|
||||
margin: 0 0 0 12px;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
#toast-container .toast .toast-body {
|
||||
flex-grow: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
#toast-container .toast:not(.no-title) .bx {
|
||||
margin-right: 0.5em;
|
||||
font-size: 1.1em;
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title .bx {
|
||||
margin-right: 0;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
#toast-container .toast.no-title .toast-body {
|
||||
padding-top: var(--bs-toast-padding-x);
|
||||
color: var(--toast-text-color);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1410,6 +1410,13 @@ div.promoted-attribute-cell .multiplicity:has(span) {
|
||||
margin-left: 8px;
|
||||
margin-right: calc(var(--pa-card-padding-left) - var(--pa-card-padding-right));
|
||||
font-size: 0; /* Prevent whitespaces creating a gap between buttons */
|
||||
display: flex;
|
||||
}
|
||||
|
||||
div.promoted-attribute-cell .multiplicity:has(span) span {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
"sat": "Ds",
|
||||
"sun": "Dg",
|
||||
"january": "Gener",
|
||||
"febuary": "Febrer",
|
||||
"february": "Febrer",
|
||||
"march": "Març",
|
||||
"april": "Abril",
|
||||
"may": "Maig",
|
||||
|
||||
@@ -582,7 +582,7 @@
|
||||
"cannot_find_day_note": "无法找到日记",
|
||||
"cannot_find_week_note": "无法找到周记",
|
||||
"january": "一月",
|
||||
"febuary": "二月",
|
||||
"february": "二月",
|
||||
"march": "三月",
|
||||
"april": "四月",
|
||||
"may": "五月",
|
||||
@@ -1353,7 +1353,7 @@
|
||||
"oauth_title": "OAuth/OpenID 认证",
|
||||
"oauth_description": "OpenID 是一种标准化方式,允许您使用其他服务(如 Google)的账号登录网站来验证您的身份。默认的身份提供者是 Google,但您可以更改为任何其他 OpenID 提供者。点击<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">这里</a>了解更多信息。请参阅这些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指南</a> 通过 Google 设置 OpenID 服务。",
|
||||
"oauth_description_warning": "要启用 OAuth/OpenID,您需要设置 config.ini 文件中的 OAuth/OpenID 基础 URL、客户端 ID 和客户端密钥,并重新启动应用程序。如果要从环境变量设置,请设置 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 环境变量。",
|
||||
"oauth_missing_vars": "缺少以下设置项:{{variables}}",
|
||||
"oauth_missing_vars": "缺少以下设置项:{{-variables}}",
|
||||
"oauth_user_account": "用户账号: ",
|
||||
"oauth_user_email": "用户邮箱: ",
|
||||
"oauth_user_not_logged_in": "未登录!"
|
||||
@@ -1623,7 +1623,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "同步检查失败!",
|
||||
"consistency-checks-failed": "一致性检查失败!请查看日志了解详细信息。",
|
||||
"encountered-error": "遇到错误 \"{{message}}\",请查看控制台。"
|
||||
"encountered-error": "遇到错误 \"{{message}}\",请查看控制台。",
|
||||
"lost-websocket-connection-title": "与服务器的连线中断",
|
||||
"lost-websocket-connection-message": "检查您的反向代理(如 nginx 或 Apache)设置以确保 Websocket 连线没有被阻挡。"
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "请求的笔记 '{{requestedNote}}' 位于聚焦的笔记 '{{hoistedNote}}' 的子树之外,您必须取消聚焦才能访问该笔记。是否继续取消聚焦?"
|
||||
@@ -1952,7 +1954,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "功能",
|
||||
"emoji_completion_enabled": "启用表情自动补全",
|
||||
"note_completion_enabled": "启用笔记自动补全"
|
||||
"note_completion_enabled": "启用笔记自动补全",
|
||||
"emoji_completion_description": "如果启用,表情可以轻易地经由输入 `:` 加上表情名称来插入。",
|
||||
"note_completion_description": "如果启用,导向笔记的链接可以经由输入 `@` 加上笔记标题来创建。",
|
||||
"slash_commands_enabled": "启用斜杠命令",
|
||||
"slash_commands_description": "如果启用,可以经由输入 `/` 来触发命令,如插入换行符或标题。"
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "新增行",
|
||||
|
||||
@@ -1 +1,41 @@
|
||||
{}
|
||||
{
|
||||
"about": {
|
||||
"title": "O Trilium Notes",
|
||||
"homepage": "Domovská stránka:",
|
||||
"app_version": "Verze aplikace:",
|
||||
"db_version": "Verze DB:",
|
||||
"sync_version": "Verze sync:",
|
||||
"build_date": "Datum sestavení:",
|
||||
"build_revision": "Revize sestavení:",
|
||||
"data_directory": "Datový adresář:"
|
||||
},
|
||||
"toast": {
|
||||
"critical-error": {
|
||||
"title": "Kritická chyba",
|
||||
"message": "Nastala kritická chyba která aplikaci brání ve spuštění:\n\n{{message}}\n\nPravděpodobně neočekávaným způsobem selhal skript. Pokuste se restartovat aplikaci v safe módu a problém napravit."
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Nepodařilo se inicializovat widget",
|
||||
"message-custom": "Uživatelský widget z poznámky s ID \"{{id}}\" a názvem \"{{title}}\" nemohl být inicializován z důvodu: \n\n{{message}}",
|
||||
"message-unknown": "Neznámý widget nemohl být inicializován z důvodu:\n\n{{message}}"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "Načtení uživatelského skriptu selhalo",
|
||||
"message": "Uživatelský skript z poznámky s ID \"{{id}}\" a názvem \"{{title}}\" nemohl být spuštěn z důvodu: \n\n{{message}}"
|
||||
}
|
||||
},
|
||||
"ai_llm": {
|
||||
"n_notes_queued_0": "{{ count }} poznámka ve frontě k indexaci",
|
||||
"n_notes_queued_1": "{{ count }} poznámky ve frontě k indexaci",
|
||||
"n_notes_queued_2": "{{ count }} poznámek ve frontě k indexaci",
|
||||
"notes_indexed_0": "{{ count }} poznámka indexována",
|
||||
"notes_indexed_1": "{{ count }} poznámky indexovány",
|
||||
"notes_indexed_2": "{{ count }} poznámek indexováno"
|
||||
},
|
||||
"add_link": {
|
||||
"add_link": "Přidat odkaz",
|
||||
"help_on_links": "Nápověda k odkazům",
|
||||
"note": "Poznámka",
|
||||
"search_note": "hledat poznámku podle názvu"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -581,7 +581,7 @@
|
||||
"sun": "So",
|
||||
"cannot_find_day_note": "Tagesnotiz kann nicht gefunden werden",
|
||||
"january": "Januar",
|
||||
"febuary": "Februar",
|
||||
"february": "Februar",
|
||||
"march": "März",
|
||||
"april": "April",
|
||||
"may": "Mai",
|
||||
@@ -1587,7 +1587,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Synchronisationsprüfung fehlgeschlagen!",
|
||||
"consistency-checks-failed": "Konsistenzprüfung fehlgeschlagen! Siehe Logs für Details.",
|
||||
"encountered-error": "Fehler „{{message}}“ aufgetreten, siehe Konsole für Details."
|
||||
"encountered-error": "Fehler „{{message}}“ aufgetreten, siehe Konsole für Details.",
|
||||
"lost-websocket-connection-title": "Verbindung zum Server verloren",
|
||||
"lost-websocket-connection-message": "Überprüfe die Konfiguration des Reverse-Proxys (z. B. nginx oder Apache), um sicherzustellen, dass WebSocket-Verbindungen zugelassen und nicht blockiert werden."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Die angeforderte Notiz ‚{{requestedNote}}‘ befindet sich außerhalb des hoisted Bereichs der Notiz ‚{{hoistedNote}}‘. Du musst sie unhoisten, um auf die Notiz zuzugreifen. Möchtest du mit dem Unhoisting fortfahren?"
|
||||
@@ -1901,7 +1903,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID ist ein standardisiertes Verfahren, mit dem Sie sich über ein Konto eines anderen Dienstes, beispielsweise Google, bei Websites anmelden können, um Ihre Identität zu bestätigen. Der Standardaussteller ist Google, Sie können jedoch jeden anderen OpenID-Anbieter auswählen. Weitere Informationen finden Sie <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">hier</a>. Befolgen Sie diese <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">Anweisungen</a>, um einen OpenID-Dienst über Google einzurichten.",
|
||||
"oauth_description_warning": "Um OAuth/OpenID zu aktivieren, müssen Sie die OAuth/OpenID-Basis-URL, die Client-ID und den Client-Secret in der Datei config.ini festlegen und die Anwendung neu starten. Wenn Sie die Einstellungen über Umgebungsvariablen vornehmen möchten, legen Sie bitte TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID und TRILIUM_OAUTH_CLIENT_SECRET fest.",
|
||||
"oauth_missing_vars": "Fehlende Einstellung: {{variables}}",
|
||||
"oauth_missing_vars": "Fehlende Einstellung: {{-variables}}",
|
||||
"oauth_user_account": "Benutzerkonto: ",
|
||||
"oauth_user_email": "Benutzer E-Mail: ",
|
||||
"oauth_user_not_logged_in": "Nicht eingeloggt!"
|
||||
@@ -1966,7 +1968,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "Funktionen",
|
||||
"emoji_completion_enabled": "Emoji-Autovervollständigung aktivieren",
|
||||
"note_completion_enabled": "Automatisches Vervollständigen von Notizen aktivieren"
|
||||
"note_completion_enabled": "Automatisches Vervollständigen von Notizen aktivieren",
|
||||
"emoji_completion_description": "Wenn aktiviert, können Emojis ganz einfach in den Text eingefügt werden, indem man \":\" gefolgt vom Namen eines Emojis eingibt.",
|
||||
"note_completion_description": "Wenn aktiviert, können Links zu Notizen erstellt werden, indem man \"@\" gefolgt vom Titel einer Notiz eingibt.",
|
||||
"slash_commands_enabled": "Aktiviere Slash-Befehle",
|
||||
"slash_commands_description": "Wenn aktiviert, können Bearbeitungsbefehle wie das Einfügen von Zeilenumbrüchen oder Überschriften durch Eingabe von \"/\" aktiviert werden."
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "Neue Zeile",
|
||||
|
||||
@@ -582,7 +582,7 @@
|
||||
"cannot_find_day_note": "Cannot find day note",
|
||||
"cannot_find_week_note": "Cannot find week note",
|
||||
"january": "January",
|
||||
"febuary": "February",
|
||||
"february": "February",
|
||||
"march": "March",
|
||||
"april": "April",
|
||||
"may": "May",
|
||||
@@ -1517,7 +1517,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID is a standardized way to let you log into websites using an account from another service, like Google, to verify your identity. The default issuer is Google, but you can change it to any other OpenID provider. Check <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">here</a> for more information. Follow these <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">instructions</a> to setup an OpenID service through Google.",
|
||||
"oauth_description_warning": "To enable OAuth/OpenID, you need to set the OAuth/OpenID base URL, client ID and client secret in the config.ini file and restart the application. If you want to set from environment variables, please set TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID and TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Missing settings: {{variables}}",
|
||||
"oauth_missing_vars": "Missing settings: {{-variables}}",
|
||||
"oauth_user_account": "User Account: ",
|
||||
"oauth_user_email": "User Email: ",
|
||||
"oauth_user_not_logged_in": "Not logged in!"
|
||||
@@ -1787,7 +1787,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Sync check failed!",
|
||||
"consistency-checks-failed": "Consistency checks failed! See logs for details.",
|
||||
"encountered-error": "Encountered error \"{{message}}\", check out the console."
|
||||
"encountered-error": "Encountered error \"{{message}}\", check out the console.",
|
||||
"lost-websocket-connection-title": "Lost connection to the server",
|
||||
"lost-websocket-connection-message": "Check your reverse proxy (e.g. nginx or Apache) configuration to ensure WebSocket connections are properly allowed and not being blocked."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Requested note '{{requestedNote}}' is outside of hoisted note '{{hoistedNote}}' subtree and you must unhoist to access the note. Do you want to proceed with unhoisting?"
|
||||
|
||||
@@ -276,7 +276,12 @@
|
||||
"mime": "MIME: ",
|
||||
"file_size": "Tamaño del archivo:",
|
||||
"preview": "Vista previa:",
|
||||
"preview_not_available": "La vista previa no está disponible para este tipo de notas."
|
||||
"preview_not_available": "La vista previa no está disponible para este tipo de notas.",
|
||||
"diff_off": "Mostrar contenido",
|
||||
"diff_on": "Mostrar diferencia",
|
||||
"diff_off_hint": "Haga clic para mostrar el contenido de la nota",
|
||||
"diff_not_available": "Diferencias no disponibles.",
|
||||
"diff_on_hint": "Haga clic para ver las diferencias"
|
||||
},
|
||||
"sort_child_notes": {
|
||||
"sort_children_by": "Ordenar hijos por...",
|
||||
@@ -577,7 +582,7 @@
|
||||
"cannot_find_day_note": "No se puede encontrar la nota del día",
|
||||
"cannot_find_week_note": "No se puede encontrar la nota de la semana",
|
||||
"january": "Enero",
|
||||
"febuary": "Febrero",
|
||||
"february": "Febrero",
|
||||
"march": "Marzo",
|
||||
"april": "Abril",
|
||||
"may": "Mayo",
|
||||
@@ -587,7 +592,18 @@
|
||||
"september": "Septiembre",
|
||||
"october": "Octubre",
|
||||
"november": "Noviembre",
|
||||
"december": "Diciembre"
|
||||
"december": "Diciembre",
|
||||
"week": "Semana",
|
||||
"week_previous": "Semana anterior",
|
||||
"week_next": "Semana siguiente",
|
||||
"month": "Mes",
|
||||
"month_previous": "Mes anterior",
|
||||
"month_next": "Mes siguiente",
|
||||
"year": "Año",
|
||||
"year_previous": "Año anterior",
|
||||
"year_next": "Año siguiente",
|
||||
"list": "Lista",
|
||||
"today": "Hoy"
|
||||
},
|
||||
"close_pane_button": {
|
||||
"close_this_pane": "Cerrar este panel"
|
||||
@@ -748,7 +764,8 @@
|
||||
"book_properties": "Propiedades de colección",
|
||||
"table": "Tabla",
|
||||
"geo-map": "Mapa Geo",
|
||||
"board": "Tablero"
|
||||
"board": "Tablero",
|
||||
"include_archived_notes": "Mostrar notas archivadas"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aún no hay notas editadas en este día...",
|
||||
@@ -949,7 +966,9 @@
|
||||
"no_attachments": "Esta nota no tiene archivos adjuntos."
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "Esta nota de tipo libro no tiene ninguna subnota así que no hay nada que mostrar. Véa la <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para más detalles."
|
||||
"no_children_help": "Esta nota de tipo libro no tiene ninguna subnota así que no hay nada que mostrar. Véa la <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> para más detalles.",
|
||||
"drag_locked_title": "Bloqueado para edición",
|
||||
"drag_locked_message": "No se permite Arrastrar pues la colección está bloqueada para edición."
|
||||
},
|
||||
"editable_code": {
|
||||
"placeholder": "Escriba el contenido de su nota de código aquí..."
|
||||
@@ -1490,7 +1509,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID es una forma estandarizada de permitirle iniciar sesión en sitios web utilizando una cuenta de otro servicio, como Google, para verificar su identidad. Siga estas <a href = \"https://developers.google.com/identity/openid-connect/openid-connect\">instrucciones</a> para configurar un servicio OpenID a través de Google.",
|
||||
"oauth_description_warning": "Para habilitar OAuth/OpenID, necesita establecer la URL base de OAuth/OpenID, ID de cliente y secreto de cliente en el archivo config.ini y reiniciar la aplicación. Si desea establecerlas desde variables de ambiente, por favor establezca TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID y TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Ajustes faltantes: {{variables}}",
|
||||
"oauth_missing_vars": "Ajustes faltantes: {{-variables}}",
|
||||
"oauth_user_account": "Cuenta de usuario: ",
|
||||
"oauth_user_email": "Correo electrónico de usuario: ",
|
||||
"oauth_user_not_logged_in": "¡No ha iniciado sesión!"
|
||||
@@ -1593,7 +1612,9 @@
|
||||
"apply-bulk-actions": "Aplicar acciones en lote",
|
||||
"converted-to-attachments": "{{count}} notas han sido convertidas en archivos adjuntos.",
|
||||
"convert-to-attachment-confirm": "¿Está seguro que desea convertir las notas seleccionadas en archivos adjuntos de sus notas padres?",
|
||||
"open-in-popup": "Edición rápida"
|
||||
"open-in-popup": "Edición rápida",
|
||||
"archive": "Archivar",
|
||||
"unarchive": "Desarchivar"
|
||||
},
|
||||
"shared_info": {
|
||||
"shared_publicly": "Esta nota está compartida públicamente en {{- link}}",
|
||||
@@ -1676,7 +1697,8 @@
|
||||
"hoist-this-note-workspace": "Anclar esta nota (espacio de trabajo)",
|
||||
"refresh-saved-search-results": "Refrescar resultados de búsqueda guardados",
|
||||
"create-child-note": "Crear subnota",
|
||||
"unhoist": "Desanclar"
|
||||
"unhoist": "Desanclar",
|
||||
"toggle-sidebar": "Alternar barra lateral"
|
||||
},
|
||||
"title_bar_buttons": {
|
||||
"window-on-top": "Mantener esta ventana en la parte superior"
|
||||
@@ -1751,13 +1773,15 @@
|
||||
"undeleting-notes-finished-successfully": "La recuperación de notas finalizó exitosamente."
|
||||
},
|
||||
"frontend_script_api": {
|
||||
"async_warning": "Está pasando una función asíncrona a `api.runOnBackend ()` que probablemente no funcionará como pretendía.",
|
||||
"sync_warning": "Estás pasando una función sincrónica a `api.runasynconbackendwithmanualTransactionHandling ()`, \\ n while debería usar `api.runonbackend ()` en su lugar."
|
||||
"async_warning": "Está pasando una función asíncrona a `api.runOnBackend ()` que probablemente no funcionará como pretendía.\\nO haga la función sincrónica (removiendo la palabra `async`), o use `api.runAsyncOnBackendWithManualTransactionHandling()`.",
|
||||
"sync_warning": "Estás pasando una función sincrónica a `api.runasynconbackendwithmanualTransactionHandling ()`, \\n while debería usar `api.runonbackend ()` en su lugar."
|
||||
},
|
||||
"ws": {
|
||||
"sync-check-failed": "¡La comprobación de sincronización falló!",
|
||||
"consistency-checks-failed": "¡Las comprobaciones de consistencia fallaron! Vea los registros para más detalles.",
|
||||
"encountered-error": "Error encontrado \"{{message}}\", compruebe la consola."
|
||||
"encountered-error": "Error encontrado \"{{message}}\", compruebe la consola.",
|
||||
"lost-websocket-connection-title": "Se ha perdido la conexión con el servidor",
|
||||
"lost-websocket-connection-message": "Compruebe la configuración de su proxy inverso (por ejemplo, nginx o Apache) para asegurarse de que las conexiones WebSocket están correctamente permitidas y no están bloqueadas."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "La nota requerida '{{requestedNote}}' está fuera del subárbol de la nota anclada '{{hoistedNote}}' y debe desanclarla para acceder a la nota. ¿Desea proceder con el desanclaje?"
|
||||
@@ -1833,7 +1857,7 @@
|
||||
"native-title-bar": "Barra de título nativa",
|
||||
"native-title-bar-description": "Para Windows y macOS, quitar la barra de título nativa hace que la aplicación se vea más compacta. En Linux, mantener la barra de título nativa hace que se integre mejor con el resto del sistema.",
|
||||
"background-effects": "Habilitar efectos de fondo (sólo en Windows 11)",
|
||||
"background-effects-description": "El efecto Mica agrega un fondo borroso y elegante a las ventanas de aplicaciones, creando profundidad y un aspecto moderno.",
|
||||
"background-effects-description": "El efecto Mica agrega un fondo borroso y elegante a las ventanas de la aplicación, creando profundidad y un aspecto moderno. \"Título nativo de la barra\" debe deshabilitarse.",
|
||||
"restart-app-button": "Reiniciar la aplicación para ver los cambios",
|
||||
"zoom-factor": "Factor de zoom"
|
||||
},
|
||||
@@ -1943,14 +1967,20 @@
|
||||
"delete_row": "Eliminar fila"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "Eliminar nota",
|
||||
"delete-note": "Eliminar nota...",
|
||||
"move-to": "Mover a",
|
||||
"insert-above": "Insertar arriba",
|
||||
"insert-below": "Insertar abajo",
|
||||
"delete-column": "Eliminar columna",
|
||||
"delete-column-confirmation": "¿Seguro que desea eliminar esta columna? El atributo correspondiente también se eliminará de las notas de esta columna.",
|
||||
"add-column": "Añadir columna",
|
||||
"new-item": "Nuevo elemento"
|
||||
"new-item": "Nuevo elemento",
|
||||
"archive-note": "Archivar nota",
|
||||
"unarchive-note": "Desarchivar nota",
|
||||
"new-item-placeholder": "Ingresar título de la nota...",
|
||||
"add-column-placeholder": "Ingresar título de la columna...",
|
||||
"edit-note-title": "Haga clic para editar el título de la nota",
|
||||
"edit-column-title": "Haga clic para editar el título de la columna"
|
||||
},
|
||||
"content_renderer": {
|
||||
"open_externally": "Abrir externamente"
|
||||
@@ -1978,7 +2008,11 @@
|
||||
"editorfeatures": {
|
||||
"note_completion_enabled": "Activar autocompletado de notas",
|
||||
"emoji_completion_enabled": "Activar autocompletado de emojis",
|
||||
"title": "Funciones"
|
||||
"title": "Funciones",
|
||||
"emoji_completion_description": "Si está habilitado, los emojis pueden fácilmente insertarse en el texto escribiendo `:`, seguido del nombre de un emoji.",
|
||||
"note_completion_description": "Si está habilitado, los vínculos a notas pueden crearse escribiendo `@` seguido del título de una nota.",
|
||||
"slash_commands_enabled": "Habilitar comandos de barra",
|
||||
"slash_commands_description": "Si está habilitado, editar comandos como insertar saltos de línea o títulos, puede alternarse escribiendo `/`."
|
||||
},
|
||||
"command_palette": {
|
||||
"tree-action-name": "Árbol:{{name}}",
|
||||
@@ -2012,7 +2046,9 @@
|
||||
"title": "Rendimiento",
|
||||
"enable-motion": "Habilitar transiciones y animaciones",
|
||||
"enable-shadows": "Activar sombras",
|
||||
"enable-backdrop-effects": "Habilitar efectos de fondo para menús, ventanas emergentes y paneles"
|
||||
"enable-backdrop-effects": "Habilitar efectos de fondo para menús, ventanas emergentes y paneles",
|
||||
"enable-smooth-scroll": "Habilitar desplazamiento suave",
|
||||
"app-restart-required": "(es necesario reiniciar la aplicación para que el cambio surta efecto)"
|
||||
},
|
||||
"settings": {
|
||||
"related_settings": "Configuración relacionada"
|
||||
@@ -2023,5 +2059,9 @@
|
||||
},
|
||||
"units": {
|
||||
"percentage": "%"
|
||||
},
|
||||
"pagination": {
|
||||
"total_notes": "{{count}} notas",
|
||||
"page_title": "Página de {{startIndex}} - {{endIndex}}"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
},
|
||||
"widget-error": {
|
||||
"title": "Widgetin luonti epäonnistui"
|
||||
},
|
||||
"bundle-error": {
|
||||
"title": "Mukautetun skriptin lataus epäonnistui"
|
||||
}
|
||||
},
|
||||
"add_link": {
|
||||
|
||||
@@ -576,7 +576,7 @@
|
||||
"sun": "Dim",
|
||||
"cannot_find_day_note": "Note journalière introuvable",
|
||||
"january": "Janvier",
|
||||
"febuary": "Février",
|
||||
"february": "Février",
|
||||
"march": "Mars",
|
||||
"april": "Avril",
|
||||
"may": "Mai",
|
||||
@@ -587,7 +587,18 @@
|
||||
"october": "Octobre",
|
||||
"november": "Novembre",
|
||||
"december": "Décembre",
|
||||
"cannot_find_week_note": "Impossible de trouver la note de la semaine"
|
||||
"cannot_find_week_note": "Impossible de trouver la note de la semaine",
|
||||
"week": "Semaine",
|
||||
"week_previous": "Semaine précédente",
|
||||
"week_next": "Semaine suivante",
|
||||
"month": "Mois",
|
||||
"month_previous": "Mois précédent",
|
||||
"month_next": "Mois suivant",
|
||||
"year": "Année",
|
||||
"year_previous": "Année précédente",
|
||||
"year_next": "Année suivante",
|
||||
"list": "Liste",
|
||||
"today": "Aujourd'hui"
|
||||
},
|
||||
"close_pane_button": {
|
||||
"close_this_pane": "Fermer ce volet"
|
||||
@@ -732,7 +743,8 @@
|
||||
"note_type": "Type de note",
|
||||
"editable": "Modifiable",
|
||||
"basic_properties": "Propriétés de base",
|
||||
"language": "Langage"
|
||||
"language": "Langage",
|
||||
"configure_code_notes": "Configurer les notes de code..."
|
||||
},
|
||||
"book_properties": {
|
||||
"view_type": "Type d'affichage",
|
||||
@@ -747,7 +759,8 @@
|
||||
"book_properties": "Propriétés de la collection",
|
||||
"table": "Tableau",
|
||||
"geo-map": "Carte géographique",
|
||||
"board": "Tableau de bord"
|
||||
"board": "Tableau de bord",
|
||||
"include_archived_notes": "Afficher les notes archivées"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "Aucune note modifiée ce jour-là...",
|
||||
@@ -948,7 +961,9 @@
|
||||
"no_attachments": "Cette note ne contient aucune pièce jointe."
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "Cette note de type Livre n'a aucune note enfant, donc il n'y a rien à afficher. Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pour plus de détails."
|
||||
"no_children_help": "Cette note de type Livre n'a aucune note enfant, donc il n'y a rien à afficher. Consultez le <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a> pour plus de détails.",
|
||||
"drag_locked_title": "Edition verrouillée",
|
||||
"drag_locked_message": "Le glisser-déposer n'est pas autorisé car l'édition de cette collection est verrouillé."
|
||||
},
|
||||
"editable_code": {
|
||||
"placeholder": "Saisir le contenu de votre note de code ici..."
|
||||
@@ -1690,6 +1705,72 @@
|
||||
"anthropic_configuration": "Configuration Anthropic",
|
||||
"voyage_configuration": "Configuration IA Voyage",
|
||||
"voyage_url_description": "Défaut: https://api.voyageai.com/v1",
|
||||
"ollama_configuration": "Configuration Ollama"
|
||||
"ollama_configuration": "Configuration Ollama",
|
||||
"total_notes": "Notes totales",
|
||||
"progress": "Progrès",
|
||||
"queued_notes": "Notes dans la file d'attente",
|
||||
"refresh_stats": "Rafraîchir les statistiques",
|
||||
"enable_ai_features": "Activer les fonctionnalités IA/LLM",
|
||||
"enable_ai_description": "Activer les fonctionnalités IA telles que le résumé des notes, la génération de contenu et autres fonctionnalités LLM",
|
||||
"openai_tab": "OpenAI",
|
||||
"anthropic_tab": "Anthropic",
|
||||
"voyage_tab": "Voyage AI",
|
||||
"ollama_tab": "Ollama",
|
||||
"enable_ai": "Activer les fonctionnalités IA/LLM",
|
||||
"enable_ai_desc": "Activer les fonctionnalités IA telles que le résumé des notes, la génération de contenu et autres fonctionnalités LLM",
|
||||
"provider_configuration": "Configuration du fournisseur IA",
|
||||
"provider_precedence_description": "Liste de fournisseurs séparés par virgule, par ordre de préférence (ex. 'openai,anthopic,ollama')",
|
||||
"temperature": "Température",
|
||||
"temperature_description": "Contrôle de l'aléatoirité dans les réponses (0 = déterministe, 2 = hasard maximum)",
|
||||
"system_prompt": "Prompt système",
|
||||
"system_prompt_description": "Prompt système par défaut pour toutes les intéractions IA",
|
||||
"openai_configuration": "Configuration OpenAI",
|
||||
"openai_settings": "Options OpenAI",
|
||||
"api_key": "Clef API",
|
||||
"url": "URL de base",
|
||||
"model": "Modèle",
|
||||
"openai_api_key_description": "Votre clef API OpenAI pour accéder à leurs services IA",
|
||||
"anthropic_api_key_description": "Votre clef API Anthropic pour accéder aux modèles Claude",
|
||||
"default_model": "Modèle par défaut",
|
||||
"openai_model_description": "Exemples : gpt-4o, gpt-4-turbo, gpt-3.5-turbo",
|
||||
"base_url": "URL de base",
|
||||
"openai_url_description": "Défaut : https://api.openai.com/v1",
|
||||
"anthropic_settings": "Réglages Anthropic",
|
||||
"enable_ollama": "Activer Ollama",
|
||||
"enable_ollama_description": "Activer Ollama comme modèle d'IA local",
|
||||
"ollama_url": "URL Ollama",
|
||||
"ollama_model": "Modèle Ollama",
|
||||
"refresh_models": "Rafraîchir les modèles",
|
||||
"refreshing_models": "Mise à jour...",
|
||||
"enable_automatic_indexing": "Activer l'indexage automatique",
|
||||
"rebuild_index": "Rafraîchir l'index",
|
||||
"rebuild_index_error": "Erreur dans le démarrage du rafraichissement de l'index. Veuillez consulter les logs pour plus de détails.",
|
||||
"note_title": "Titre de la note",
|
||||
"error": "Erreur",
|
||||
"last_attempt": "Dernier essai",
|
||||
"actions": "Actions",
|
||||
"retry": "Réessayer",
|
||||
"partial": "Complété à {{ percentage }}%",
|
||||
"retry_queued": "Note ajoutée à la file d'attente",
|
||||
"retry_failed": "Echec de l'ajout de la note à la file d'attente",
|
||||
"max_notes_per_llm_query": "Notes maximum par requête",
|
||||
"max_notes_per_llm_query_description": "Nombre maximum de notes similaires à inclure dans le contexte IA",
|
||||
"active_providers": "Fournisseurs actifs",
|
||||
"disabled_providers": "Fournisseurs désactivés",
|
||||
"remove_provider": "Retirer le fournisseur de la recherche",
|
||||
"similarity_threshold": "Seuil de similarité",
|
||||
"similarity_threshold_description": "Seuil de similarité minimum (0-1) pour que inclure les notes dans le contexte d'une requête IA",
|
||||
"reprocess_index": "Rafraîchir l'index de recherche",
|
||||
"reprocessing_index": "Mise à jour...",
|
||||
"reprocess_index_started": "L'optimisation de l'indice de recherche à commencer en arrière-plan",
|
||||
"reprocess_index_error": "Erreur dans le rafraichissement de l'indice de recherche"
|
||||
},
|
||||
"ui-performance": {
|
||||
"title": "Performance",
|
||||
"enable-motion": "Activer les transitions et animations",
|
||||
"enable-shadows": "Activer les ombres",
|
||||
"enable-backdrop-effects": "Activer les effets d'arrière plan pour les menus, popups et panneaux",
|
||||
"enable-smooth-scroll": "Active le défilement fluide",
|
||||
"app-restart-required": "(redémarrer l'application pour appliquer les changements)"
|
||||
}
|
||||
}
|
||||
|
||||
1
apps/client/src/translations/hr/translation.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -31,7 +31,7 @@
|
||||
"link_title_mirrors": "il titolo del collegamento rispecchia il titolo della nota corrente",
|
||||
"link_title_arbitrary": "il titolo del collegamento può essere modificato arbitrariamente",
|
||||
"link_title": "Titolo del collegamento",
|
||||
"button_add_link": "Aggiungi il collegamento <kbd>invio</kbd>",
|
||||
"button_add_link": "Aggiungi il collegamento",
|
||||
"help_on_links": "Aiuto sui collegamenti"
|
||||
},
|
||||
"branch_prefix": {
|
||||
|
||||
@@ -38,12 +38,12 @@
|
||||
"save": "保存",
|
||||
"edit_branch_prefix": "ブランチ接頭辞の編集",
|
||||
"help_on_tree_prefix": "ツリー接頭辞に関するヘルプ",
|
||||
"prefix": "接頭辞: ",
|
||||
"branch_prefix_saved": "ブランチ接頭辞が保存されました。"
|
||||
"prefix": "接頭辞: ",
|
||||
"branch_prefix_saved": "ブランチの接頭辞が保存されました。"
|
||||
},
|
||||
"global_menu": {
|
||||
"menu": "メニュー",
|
||||
"options": "オプション",
|
||||
"options": "設定",
|
||||
"open_new_window": "新しいウィンドウを開く",
|
||||
"zoom": "ズーム",
|
||||
"toggle_fullscreen": "フルスクリーンの切り替え",
|
||||
@@ -86,7 +86,7 @@
|
||||
"clone_to_selected_note": "選択したノートにクローン",
|
||||
"no_path_to_clone_to": "クローン先のパスが存在しません。",
|
||||
"note_cloned": "ノート \"{{clonedTitle}}\" は \"{{targetTitle}}\" にクローンされました",
|
||||
"clone_notes_to": "ノートをクローンして...",
|
||||
"clone_notes_to": "ノートをクローン...",
|
||||
"help_on_links": "ヘルプへのリンク"
|
||||
},
|
||||
"delete_notes": {
|
||||
@@ -111,7 +111,7 @@
|
||||
"sat": "土",
|
||||
"sun": "日",
|
||||
"january": "1月",
|
||||
"febuary": "2月",
|
||||
"february": "2月",
|
||||
"march": "3月",
|
||||
"april": "4月",
|
||||
"may": "5月",
|
||||
@@ -123,7 +123,18 @@
|
||||
"november": "11月",
|
||||
"december": "12月",
|
||||
"cannot_find_day_note": "dayノートが見つかりません",
|
||||
"cannot_find_week_note": "weekノートが見つかりません"
|
||||
"cannot_find_week_note": "weekノートが見つかりません",
|
||||
"week": "週",
|
||||
"week_previous": "前の週",
|
||||
"week_next": "次の週",
|
||||
"month": "月",
|
||||
"month_previous": "前の月",
|
||||
"month_next": "次の月",
|
||||
"year": "年",
|
||||
"year_previous": "前の年",
|
||||
"year_next": "次の年",
|
||||
"list": "リスト",
|
||||
"today": "今日"
|
||||
},
|
||||
"note_icon": {
|
||||
"change_note_icon": "ノートアイコンの変更",
|
||||
@@ -135,7 +146,8 @@
|
||||
"note_type": "ノートタイプ",
|
||||
"editable": "編集可能",
|
||||
"basic_properties": "基本プロパティ",
|
||||
"language": "言語"
|
||||
"language": "言語",
|
||||
"configure_code_notes": "コードノートを設定しています..."
|
||||
},
|
||||
"i18n": {
|
||||
"title": "ローカライゼーション",
|
||||
@@ -324,8 +336,8 @@
|
||||
},
|
||||
"recent_changes": {
|
||||
"title": "最近の変更",
|
||||
"erase_notes_button": "削除したメモを今すぐ消去する",
|
||||
"deleted_notes_message": "削除されたメモは完全に消去されました。",
|
||||
"erase_notes_button": "削除したノートを今すぐ消去",
|
||||
"deleted_notes_message": "削除されたノートは完全に消去されました。",
|
||||
"no_changes_message": "変更はまだありません...",
|
||||
"undelete_link": "削除を取り消す",
|
||||
"confirm_undelete": "このノートとサブノートを復元しますか?"
|
||||
@@ -384,9 +396,9 @@
|
||||
"protect-subtree": "サブツリーを保護",
|
||||
"unprotect-subtree": "サブツリーの保護を解除",
|
||||
"copy-clone": "コピー/クローン",
|
||||
"clone-to": "クローンして...",
|
||||
"clone-to": "クローン先...",
|
||||
"cut": "カット",
|
||||
"move-to": "移動して...",
|
||||
"move-to": "移動先...",
|
||||
"paste-into": "貼り付け",
|
||||
"paste-after": "後ろに貼り付け",
|
||||
"duplicate": "複製",
|
||||
@@ -399,7 +411,9 @@
|
||||
"open-in-popup": "クイックエディット",
|
||||
"hoist-note": "ホイストノート",
|
||||
"unhoist-note": "ノートをホイストしない",
|
||||
"edit-branch-prefix": "ブランチの接頭辞を編集"
|
||||
"edit-branch-prefix": "ブランチの接頭辞を編集",
|
||||
"archive": "アーカイブ",
|
||||
"unarchive": "アーカイブ解除"
|
||||
},
|
||||
"zen_mode": {
|
||||
"button_exit": "禅モードを退出"
|
||||
@@ -449,10 +463,12 @@
|
||||
"delete_note": {
|
||||
"delete_note": "ノートを削除",
|
||||
"delete_matched_notes": "一致したノートを削除",
|
||||
"delete_matched_notes_description": "これにより、一致したノートが削除されます。"
|
||||
"delete_matched_notes_description": "これにより、一致したノートが削除されます。",
|
||||
"undelete_notes_instruction": "削除後、「最近の変更」ダイアログから削除を取り消すことができます。",
|
||||
"erase_notes_instruction": "ノートを完全に消去するには、削除後に「設定」->「その他」に移動し、「削除したノートを今すぐ消去」ボタンをクリックします。"
|
||||
},
|
||||
"board_view": {
|
||||
"delete-note": "ノートを削除",
|
||||
"delete-note": "ノートを削除...",
|
||||
"insert-above": "上に挿入",
|
||||
"insert-below": "下に挿入",
|
||||
"delete-column": "列を削除",
|
||||
@@ -478,7 +494,8 @@
|
||||
"execute_script": {
|
||||
"execute_script": "スクリプトを実行",
|
||||
"help_text": "一致したノートに対して簡単なスクリプトを実行できます。",
|
||||
"example_2": "より複雑な例としては、一致したノートの属性をすべて削除することが挙げられます:"
|
||||
"example_2": "より複雑な例としては、一致したノートの属性をすべて削除することが挙げられます:",
|
||||
"example_1": "例えば、ノートのタイトルに文字列を追加するには、この小さなスクリプトを使用します:"
|
||||
},
|
||||
"script_executor": {
|
||||
"execute_script": "スクリプトを実行",
|
||||
@@ -533,11 +550,11 @@
|
||||
"beta-feature": "Beta",
|
||||
"ai-chat": "AI チャット",
|
||||
"task-list": "タスクリスト",
|
||||
"new-feature": "新しい",
|
||||
"new-feature": "New",
|
||||
"collections": "コレクション"
|
||||
},
|
||||
"edited_notes": {
|
||||
"no_edited_notes_found": "この日の編集されたメモはまだありません...",
|
||||
"no_edited_notes_found": "この日の編集されたノートはまだありません...",
|
||||
"title": "編集されたノート",
|
||||
"deleted": "(削除済み)"
|
||||
},
|
||||
@@ -548,7 +565,10 @@
|
||||
"download": "ダウンロード",
|
||||
"open": "開く",
|
||||
"title": "ファイル",
|
||||
"upload_new_revision": "編集履歴をアップロード"
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"original_file_name": "元のファイル名",
|
||||
"upload_success": "新しいファイルの変更がアップロードされました。",
|
||||
"upload_failed": "新しいファイルの変更のアップロードに失敗しました。"
|
||||
},
|
||||
"note_info_widget": {
|
||||
"note_id": "ノート ID",
|
||||
@@ -567,7 +587,11 @@
|
||||
"download": "ダウンロード",
|
||||
"open": "開く",
|
||||
"title": "画像",
|
||||
"upload_new_revision": "編集履歴をアップロード"
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"original_file_name": "元のファイル名",
|
||||
"copy_reference_to_clipboard": "参照をクリップボードにコピー",
|
||||
"upload_success": "新しい画像の変更がアップロードされました。",
|
||||
"upload_failed": "新しい画像の変更のアップロードに失敗しました: {{message}}"
|
||||
},
|
||||
"revisions": {
|
||||
"download_button": "ダウンロード",
|
||||
@@ -595,7 +619,8 @@
|
||||
"diff_off_hint": "クリックしてノートの内容を表示",
|
||||
"diff_not_available": "差分は利用できません。",
|
||||
"snapshot_interval": "ノートの変更履歴の記録間隔: {{seconds}} 秒。",
|
||||
"maximum_revisions": "ノートの変更履歴の記録制限: {{number}}."
|
||||
"maximum_revisions": "ノートの変更履歴の記録制限: {{number}}.",
|
||||
"mime": "MIME: "
|
||||
},
|
||||
"attachments_actions": {
|
||||
"download": "ダウンロード",
|
||||
@@ -612,7 +637,11 @@
|
||||
"delete_confirm": "本当に添付ファイル '{{title}}' を削除しますか?",
|
||||
"delete_success": "添付ファイル '{{title}}' は削除されました。",
|
||||
"enter_new_name": "新しい添付ファイルの名前を入力してください",
|
||||
"upload_new_revision": "編集履歴をアップロード"
|
||||
"upload_new_revision": "編集履歴をアップロード",
|
||||
"upload_success": "新しい添付ファイルの変更がアップロードされました。",
|
||||
"upload_failed": "新しい添付ファイルの変更のアップロードに失敗しました。",
|
||||
"convert_confirm": "添付ファイル「{{title}}」を別のノートに変換してもよろしいですか?",
|
||||
"convert_success": "添付ファイル「{{title}}」がノートに変換されました。"
|
||||
},
|
||||
"etapi": {
|
||||
"created": "作成日時",
|
||||
@@ -642,21 +671,23 @@
|
||||
"note_paths": {
|
||||
"title": "ノートパス",
|
||||
"clone_button": "ノートを新しい場所にクローン...",
|
||||
"intro_placed": "このノートは以下のパスに置かれる:",
|
||||
"intro_placed": "このノートは以下のパスに置かれています:",
|
||||
"intro_not_placed": "このノートはまだノートツリーに配置されていません。",
|
||||
"archived": "アーカイブされた",
|
||||
"search": "検索",
|
||||
"outside_hoisted": "このパスはホイストされたノートの外側にあるため、ホイストを解除する必要があります。"
|
||||
},
|
||||
"note_properties": {
|
||||
"info": "情報"
|
||||
"info": "情報",
|
||||
"this_note_was_originally_taken_from": "このノートは元々以下から引用したものです:"
|
||||
},
|
||||
"similar_notes": {
|
||||
"title": "類似ノート",
|
||||
"no_similar_notes_found": "類似したノートが見つかりません。"
|
||||
},
|
||||
"abstract_search_option": {
|
||||
"remove_this_search_option": "この検索オプションを削除"
|
||||
"remove_this_search_option": "この検索オプションを削除",
|
||||
"failed_rendering": "検索オプションのレンダリングに失敗しました: {{dto}} エラー: {{error}}{{stack}}"
|
||||
},
|
||||
"debug": {
|
||||
"debug": "デバッグ",
|
||||
@@ -690,7 +721,8 @@
|
||||
"content_and_attachments_and_revisions_size": "添付ファイルと編集履歴を含むノート内容のサイズ",
|
||||
"revision_count": "編集履歴の回数",
|
||||
"owned_label_count": "ラベルの数",
|
||||
"owned_relation_count": "関係の数"
|
||||
"owned_relation_count": "リレーションの数",
|
||||
"target_relation_count": "ノートを対象とするリレーションの数"
|
||||
},
|
||||
"table_view": {
|
||||
"sort-column-descending": "降順",
|
||||
@@ -710,7 +742,7 @@
|
||||
"delete_column_confirmation": "この列を本当に削除してもよろしいですか?対応する属性はすべてのノートから削除されます。",
|
||||
"delete-column": "列を削除",
|
||||
"new-column-label": "ラベル",
|
||||
"new-column-relation": "関係"
|
||||
"new-column-relation": "リレーション"
|
||||
},
|
||||
"search_script": {
|
||||
"title": "検索スクリプト:",
|
||||
@@ -735,7 +767,7 @@
|
||||
"placeholder": "ノート名で検索",
|
||||
"label": "祖先",
|
||||
"depth_label": "深さ",
|
||||
"depth_doesnt_matter": "関係ない",
|
||||
"depth_doesnt_matter": "関係なし",
|
||||
"depth_eq": "ちょうど {{count}} つ下の階層",
|
||||
"direct_children": "直接の子",
|
||||
"depth_gt": "{{count}} より下の階層",
|
||||
@@ -759,7 +791,14 @@
|
||||
"refresh": "リフレッシュ"
|
||||
},
|
||||
"sync": {
|
||||
"title": "同期"
|
||||
"title": "同期",
|
||||
"force_full_sync_button": "完全同期を強制する",
|
||||
"fill_entity_changes_button": "エンティティ変更レコードを入力",
|
||||
"full_sync_triggered": "完全同期がトリガーされました",
|
||||
"filling_entity_changes": "エンティティ変更行を入力中...",
|
||||
"sync_rows_filled_successfully": "同期行が正常に入力されました",
|
||||
"finished-successfully": "同期が正常に完了しました。",
|
||||
"failed": "同期に失敗しました: {{message}}"
|
||||
},
|
||||
"fonts": {
|
||||
"fonts": "フォント",
|
||||
@@ -781,7 +820,8 @@
|
||||
"serif": "セリフ",
|
||||
"sans-serif": "サンセリフ",
|
||||
"monospace": "等幅",
|
||||
"system-default": "システムのデフォルト"
|
||||
"system-default": "システムのデフォルト",
|
||||
"theme_defined": "テーマが定義されました"
|
||||
},
|
||||
"max_content_width": {
|
||||
"reload_button": "フロントエンドをリロード",
|
||||
@@ -790,7 +830,7 @@
|
||||
"max_width_label": "最大コンテンツ幅",
|
||||
"max_width_unit": "ピクセル",
|
||||
"apply_changes_description": "コンテンツ幅の変更を適用するには、クリックしてください",
|
||||
"reload_description": "外観オプションからの変更"
|
||||
"reload_description": "外観設定から変更"
|
||||
},
|
||||
"theme": {
|
||||
"title": "アプリのテーマ",
|
||||
@@ -859,14 +899,14 @@
|
||||
"bg_color": "背景色付きテキスト",
|
||||
"visibility_title": "ハイライトリスト表示",
|
||||
"visibility_description": "#hideHighlightWidget ラベルを追加することで、ノートごとにハイライトウィジェットを非表示にできます。",
|
||||
"shortcut_info": "オプション -> ショートカット('右ペイン切り替え')で、右ペイン(ハイライトを含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
"shortcut_info": "設定 -> ショートカット(右ペイン切り替え)で、右ペイン(ハイライトを含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
},
|
||||
"table_of_contents": {
|
||||
"title": "目次",
|
||||
"description": "ノートに定義された数以上の見出しがある場合、テキストノートに目次が表示されます。この数はカスタマイズできます:",
|
||||
"unit": "見出し",
|
||||
"disable_info": "このオプションに非常に大きな数値を設定することで、目次を効果的に無効にすることもできる。",
|
||||
"shortcut_info": "オプション -> ショートカット('右ペイン切り替え')で、右ペイン(目次を含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
"disable_info": "このオプションに非常に大きな数値を設定することで、目次を効果的に無効にすることもできます。",
|
||||
"shortcut_info": "設定 -> ショートカット(右ペイン切り替え)で、右ペイン(目次を含む)を素早く切り替えるキーボードショートカットを設定できます。"
|
||||
},
|
||||
"toc": {
|
||||
"table_of_contents": "目次",
|
||||
@@ -1033,7 +1073,7 @@
|
||||
"read_only": "エディターは読み取り専用モードです。テキストとコードノートのみ機能します。",
|
||||
"auto_read_only_disabled": "テキスト/コードノートは、サイズが大きすぎる場合、自動的に読み取りモードに設定されます。このラベルをノートに追加することで、ノートごとにこの動作を無効にすることができます",
|
||||
"app_css": "Trilium アプリケーションに読み込まれ、Trilium の外観を変更するために使用できる CSS ノートをマークします。",
|
||||
"app_theme": "Trilium のフルテーマである CSS ノートをマークし、Trilium オプションで利用できるようにします。",
|
||||
"app_theme": "Trilium のフルテーマである CSS ノートをマークし、Trilium の設定で利用できるようにします。",
|
||||
"app_theme_base": "「next」、「next-light」、または「next-dark」に設定すると、従来のテーマではなく、対応する TriliumNext テーマ (auto、light、または dark) がカスタム テーマのベースとして使用されます。",
|
||||
"css_class": "このラベルの値は、ツリー内の特定のノートを表すノードにCSSクラスとして追加されます。これは高度なテーマ設定に役立ちます。テンプレートノートで使用できます。",
|
||||
"icon_class": "このラベルの値は、ツリー上のアイコンにCSSクラスとして追加され、ツリー内のノートを視覚的に区別するのに役立ちます。例えば、bx bx-home のように、アイコンは boxicons から取得されます。テンプレートノートで使用できます。",
|
||||
@@ -1064,7 +1104,7 @@
|
||||
"display_relations": "表示するリレーション名をカンマで区切って指定します。それ以外のリレーション名は非表示になります。",
|
||||
"hide_relations": "非表示にするリレーション名をカンマで区切って指定します。それ以外のリレーションは表示されます。",
|
||||
"template": "このノートは、新しいノートを作成するときに利用可能なテンプレートの選択肢に表示されます",
|
||||
"toc": "<code>#toc</code> または <code>#toc=show</code><code> は目次を強制的に表示し、<code>#toc=hide</code> は目次を強制的に非表示にします。ラベルが存在しない場合は、グローバル設定が適用されます",
|
||||
"toc": "<code>#toc</code> または <code>#toc=show</code> は目次を強制的に表示し、<code>#toc=hide</code> は目次を強制的に非表示にします。ラベルが存在しない場合は、グローバル設定が適用されます",
|
||||
"color": "ノートツリー、リンクなどのノートの色を定義します。 'red' や #a13d5f などの有効な CSS カラー値を使用します",
|
||||
"keyboard_shortcut": "このノートにすぐにジャンプするキーボードショートカットを定義します。例: 「ctrl+alt+e」。変更を有効にするには、フロントエンドをリロードする必要があります。",
|
||||
"keep_current_hoisting": "このリンクを開いても、ノートが現在のホイストされたサブツリーに表示できない場合でも、ホイストは変更されません。",
|
||||
@@ -1077,7 +1117,29 @@
|
||||
"run_on_child_note_creation": "このリレーションが定義されているノートの下に新しいノートが作成されたときに実行されます",
|
||||
"render_note": "「HTMLノートをレンダリング」タイプのノートは、コードノート(HTMLまたはスクリプト)を使用してレンダリングされます。このリレーションを使用して、どのノートをレンダリングするかを指定する必要があります",
|
||||
"other_notes_with_name": "{{attributeType}} の名前が「{{attributeName}}」であるその他のノート",
|
||||
"color_type": "色"
|
||||
"color_type": "色",
|
||||
"share_description": "説明用にHTMLメタタグに追加するテキストを定義します",
|
||||
"title_template": "このノートの子として作成されるノートのデフォルトのタイトルです。値は JavaScript 文字列として評価されるため、\n 挿入された <code>now</code> および <code>parentNote</code> 変数を介して動的なコンテンツを追加できます。例: \n \n <ul> \n <li><code>${parentNote.getLabelValue('authorName')} の文学作品</code></li> \n <li><code>${now.format('YYYY-MM-DD HH:mm:ss')} のログ</code></li> \n </ul> \n \n 詳細については <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\"> Wiki の詳細 </a> 、および <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> と <a href=\"https://day.js.org/docs/en/display/format\">now</a> の API ドキュメントを参照してください。",
|
||||
"run_on_note_title_change": "ノートのタイトルが変更されたときに実行されます(ノートの作成も含む)",
|
||||
"run_on_note_content_change": "ノートの内容が変更されたときに実行されます(ノートの作成も含む)。",
|
||||
"run_on_note_change": "ノートが変更されたときに実行されます(ノートの作成も含む)。内容の変更は含まれません",
|
||||
"run_on_note_deletion": "ノートが削除されたときに実行されます",
|
||||
"run_on_branch_creation": "ブランチが作成されたときに実行されます。ブランチは親ノートと子ノート間のリンクであり、例えばノートの複製や移動の際に作成されます。",
|
||||
"run_on_branch_change": "ブランチが更新されたときに実行されます。",
|
||||
"run_on_branch_deletion": "ブランチが削除されたときに実行されます。ブランチは親ノートと子ノート間のリンクであり、ノートを移動した場合などに削除されます(古いブランチ/リンクは削除されます)。",
|
||||
"run_on_attribute_creation": "このリレーションを定義するノートに新しい属性が作成された場合に実行されます",
|
||||
"run_on_attribute_change": " このリレーションを定義するノートの属性が変更されたときに実行されます。属性が削除された場合にも実行されます",
|
||||
"relation_template": "ノートの属性は親子関係がなくても継承されます。ノートの内容とサブツリーは、空の場合はインスタンスノートに追加されます。詳細はドキュメントをご覧ください。",
|
||||
"inherit": "親子関係がなくても、ノートの属性は継承されます。同様の概念については、テンプレートリレーションを参照してください。ドキュメントの属性継承を参照してください。",
|
||||
"widget_relation": "このリレーションのターゲットが実行され、サイドバーのウィジェットとしてレンダリングされます",
|
||||
"share_css": "共有ページに挿入されるCSSノートです。CSSノートは共有サブツリーにも含まれている必要があります。「share_hidden_from_tree」と「share_omit_default_css」の使用も検討してください。",
|
||||
"share_js": "共有ページに挿入されるJavaScriptノートです。JavaScriptノートは共有サブツリー内にも存在する必要があります。「share_hidden_from_tree」の使用を検討してください。",
|
||||
"share_template": "共有ノートを表示するためのテンプレートとして使用される埋め込みJavaScriptノートです。デフォルトのテンプレートにフォールバックします。「share_hidden_from_tree」の使用を検討してください。",
|
||||
"share_favicon": "共有ページに設定するファビコンのノートです。通常は共有ルートに設定し、継承可能にします。ファビコンのノートは共有サブツリーにも設定する必要があります。「share_hidden_from_tree」の使用を検討してください。",
|
||||
"is_owned_by_note": "ノートによって所有されています",
|
||||
"and_more": "...その他 {{count}} 件。",
|
||||
"print_landscape": "PDF にエクスポートするときに、ページの向きを縦向きではなく横向きに変更します。",
|
||||
"print_page_size": "PDF にエクスポートするときに、ページのサイズを変更します。サポートされる値: <code>A0</code>, <code>A1</code>, <code>A2</code>, <code>A3</code>, <code>A4</code>, <code>A5</code>, <code>A6</code>, <code>Legal</code>, <code>Letter</code>, <code>Tabloid</code>, <code>Ledger</code>。"
|
||||
},
|
||||
"link_context_menu": {
|
||||
"open_note_in_popup": "クイックエディット",
|
||||
@@ -1104,11 +1166,14 @@
|
||||
},
|
||||
"template_switch": {
|
||||
"template": "テンプレート",
|
||||
"toggle-on-hint": "ノートをテンプレート化する"
|
||||
"toggle-on-hint": "ノートをテンプレート化する",
|
||||
"toggle-off-hint": "テンプレートとしてのノートを削除する"
|
||||
},
|
||||
"open-help-page": "ヘルプページを開く",
|
||||
"shared_info": {
|
||||
"help_link": "ヘルプについては、<a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>をご覧ください。"
|
||||
"help_link": "ヘルプについては、<a href=\"https://triliumnext.github.io/Docs/Wiki/sharing.html\">wiki</a>をご覧ください。",
|
||||
"shared_locally": "このノートは {{- link}} でローカルに共有されています。",
|
||||
"shared_publicly": "このノートは {{- link}} で一般公開されています。"
|
||||
},
|
||||
"highlights_list_2": {
|
||||
"title": "ハイライトリスト",
|
||||
@@ -1132,7 +1197,10 @@
|
||||
"auto-collapsing-notes-after-inactivity": "非アクティブ状態が続いたためノートが自動で折りたたまれます...",
|
||||
"create-child-note": "子ノートを作成",
|
||||
"hoist-this-note-workspace": "このノートをホイストする(ワークスペース)",
|
||||
"unhoist": "ホイスト解除"
|
||||
"unhoist": "ホイスト解除",
|
||||
"saved-search-note-refreshed": "保存した検索ノートが更新されました。",
|
||||
"refresh-saved-search-results": "保存した検索結果を更新",
|
||||
"toggle-sidebar": "サイドバーを切り替え"
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "一括操作",
|
||||
@@ -1143,7 +1211,7 @@
|
||||
"execute_bulk_actions": "一括操作を実行",
|
||||
"bulk_actions_executed": "一括操作が成功に実行されました。",
|
||||
"labels": "ラベル",
|
||||
"relations": "関係",
|
||||
"relations": "リレーション",
|
||||
"notes": "ノート",
|
||||
"other": "その他",
|
||||
"none_yet": "アクションを上のリストからクリックして追加。"
|
||||
@@ -1207,7 +1275,7 @@
|
||||
"editor_type": {
|
||||
"label": "書式設定ツールバー",
|
||||
"floating": {
|
||||
"description": "編集ツールがカーソル付近に表示されます;",
|
||||
"description": "編集ツールがカーソル付近に表示されます。",
|
||||
"title": "フローティング"
|
||||
},
|
||||
"fixed": {
|
||||
@@ -1272,11 +1340,17 @@
|
||||
"continue_anyway": "とにかく続ける",
|
||||
"message_windows": "TriliumNext は現在エミュレーションを実行しています。つまり、ARM版WindowsデバイスでIntel(x64)版を使用していることになります。これはパフォーマンスとバッテリー寿命に重大な影響を及ぼします。",
|
||||
"recommendation": "最適なエクスペリエンスを得るには、リリース ページから TriliumNext のネイティブ ARM64 バージョンをダウンロードしてください。",
|
||||
"download_link": "ネイティブ版をダウンロード"
|
||||
"download_link": "ネイティブ版をダウンロード",
|
||||
"message_macos": "TriliumNext は現在、Rosetta 2による翻訳環境で実行されています。つまり、Apple Silicon MacではIntel (x64)バージョンを使用していることになります。これはパフォーマンスとバッテリー寿命に重大な影響を及ぼします。"
|
||||
},
|
||||
"editorfeatures": {
|
||||
"emoji_completion_enabled": "絵文字のオートコンプリートを有効",
|
||||
"note_completion_enabled": "ノートのオートコンプリートを有効"
|
||||
"note_completion_enabled": "ノートのオートコンプリートを有効",
|
||||
"emoji_completion_description": "有効にすると、「:」に続けて絵文字の名前を入力することで、テキストに絵文字を簡単に挿入できます。",
|
||||
"note_completion_description": "有効にすると、「@」 に続けてノートのタイトルを入力することで、ノートへのリンクを作成できます。",
|
||||
"slash_commands_enabled": "スラッシュコマンドを有効",
|
||||
"slash_commands_description": "有効にすると、改行や見出しの挿入などの編集コマンドは、「/」 と入力して切り替えることができます。",
|
||||
"title": "機能"
|
||||
},
|
||||
"table_context_menu": {
|
||||
"delete_row": "行を削除"
|
||||
@@ -1344,7 +1418,8 @@
|
||||
"agent": {
|
||||
"processing": "処理中...",
|
||||
"loading": "読み込み中...",
|
||||
"generating": "生成中..."
|
||||
"generating": "生成中...",
|
||||
"thinking": "考え中..."
|
||||
},
|
||||
"name": "AI",
|
||||
"openai": "OpenAI",
|
||||
@@ -1352,7 +1427,7 @@
|
||||
"ollama_no_url": "Ollamaは設定されていません。有効なURLを入力してください。",
|
||||
"chat": {
|
||||
"root_note_title": "AIチャット",
|
||||
"root_note_content": "このメモには、保存されたAIチャットの会話が含まれています。",
|
||||
"root_note_content": "このノートには、保存されたAIチャットの会話が含まれています。",
|
||||
"new_chat_title": "新しいチャット",
|
||||
"create_new_ai_chat": "新しいAIチャットを作成"
|
||||
},
|
||||
@@ -1362,7 +1437,71 @@
|
||||
"selected_provider_description": "チャットおよび補完機能のAIプロバイダーを選択する",
|
||||
"selected_provider": "プロバイダーを選択",
|
||||
"select_model": "モデルを選択...",
|
||||
"select_provider": "プロバイダーを選択..."
|
||||
"select_provider": "プロバイダーを選択...",
|
||||
"not_started": "開始されていません",
|
||||
"processed_notes": "処理済みノート",
|
||||
"total_notes": "ノートの総数",
|
||||
"progress": "進行状況",
|
||||
"queued_notes": "キューに登録されたノート",
|
||||
"failed_notes": "失敗したノート",
|
||||
"last_processed": "最終処理日時",
|
||||
"refresh_stats": "統計情報を更新",
|
||||
"temperature": "Temperature(温度)",
|
||||
"url": "ベースURL",
|
||||
"base_url": "ベースURL",
|
||||
"enable_automatic_indexing": "自動インデックス作成を有効にする",
|
||||
"rebuild_index": "インデックスの再構築",
|
||||
"rebuild_index_error": "インデックスの再構築開始時にエラーが発生しました。詳細はログをご確認ください。",
|
||||
"note_title": "ノートのタイトル",
|
||||
"last_attempt": "最終試行日時",
|
||||
"actions": "アクション",
|
||||
"retry_queued": "ノートが再試行キューに追加されました",
|
||||
"retry_failed": "ノートを再試行キューに追加できませんでした",
|
||||
"max_notes_per_llm_query": "クエリあたりの最大ノート数",
|
||||
"max_notes_per_llm_query_description": "AIコンテキストに含める類似ノートの最大数",
|
||||
"active_providers": "アクティブなプロバイダー",
|
||||
"disabled_providers": "無効なプロバイダー",
|
||||
"remove_provider": "検索からプロバイダーを削除",
|
||||
"restore_provider": "検索にプロバイダーを復元",
|
||||
"similarity_threshold": "類似度のしきい値",
|
||||
"similarity_threshold_description": "LLMクエリのコンテキストに含めるノートの最小類似度スコア(0~1)",
|
||||
"reprocess_index": "検索インデックスを再構築",
|
||||
"reprocessing_index": "再構築中...",
|
||||
"reprocess_index_started": "検索インデックスの最適化がバックグラウンドで開始されました",
|
||||
"reprocess_index_error": "検索インデックスの再構築中にエラーが発生しました",
|
||||
"index_rebuild_progress": "インデックスの再構築の進行状況",
|
||||
"index_rebuilding": "インデックスの最適化中({{percentage}}%)",
|
||||
"index_rebuild_complete": "インデックスの最適化が完了しました",
|
||||
"index_rebuild_status_error": "インデックスの再構築ステータスの確認中にエラーが発生しました",
|
||||
"never": "なし",
|
||||
"incomplete": "未完了 ({{percentage}}%)",
|
||||
"note_queued_for_retry": "ノートが再試行キューに追加されました",
|
||||
"failed_to_retry_note": "ノートの再試行に失敗しました",
|
||||
"all_notes_queued_for_retry": "失敗したすべてのノートは再試行のためにキューに入れられました",
|
||||
"failed_to_retry_all": "ノートの再試行に失敗しました",
|
||||
"use_enhanced_context": "拡張されたコンテキストを使用する",
|
||||
"enhanced_context_description": "ノートとその関連ノートからより多くのコンテキストをAIに提供し、より良い応答を実現します",
|
||||
"show_thinking": "思考を表示",
|
||||
"show_thinking_description": "AIの思考プロセスをチェーン表示",
|
||||
"enter_message": "メッセージを入力...",
|
||||
"error_generating_response": "AI応答の生成中にエラーが発生しました",
|
||||
"index_all_notes": "すべてのノートをインデックスに登録",
|
||||
"index_status": "インデックスのステータス",
|
||||
"indexed_notes": "インデックス登録済みのノート",
|
||||
"indexing_stopped": "インデックス登録を停止しました",
|
||||
"indexing_in_progress": "インデックス登録中です...",
|
||||
"last_indexed": "最終インデックス作成日時",
|
||||
"n_notes_queued_0": "{{ count }} 件のノートがインデックス作成待ちです",
|
||||
"note_chat": "ノートチャット",
|
||||
"notes_indexed_0": "{{ count }} 件のノートをインデックスしました",
|
||||
"sources": "ソース",
|
||||
"start_indexing": "インデックス作成を開始",
|
||||
"use_advanced_context": "高度なコンテキストを使用",
|
||||
"ai_enabled": "AI 機能が有効",
|
||||
"ai_disabled": "AI 機能が無効",
|
||||
"no_models_found_online": "モデルが見つかりません。API キーと設定を確認してください。",
|
||||
"no_models_found_ollama": "Ollama モデルが見つかりません。Ollama が実行中かどうかを確認してください。",
|
||||
"error_fetching": "モデルの取得エラー: {{error}}"
|
||||
},
|
||||
"add_label": {
|
||||
"add_label": "ラベルを追加",
|
||||
@@ -1370,7 +1509,10 @@
|
||||
"label_name_title": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"new_value_placeholder": "新しい値",
|
||||
"help_text": "一致したすべてのノートに:",
|
||||
"help_text_note": "このメソッドを値なしで呼び出すこともできます。その場合、ラベルは値なしでノートに割り当てられます。"
|
||||
"help_text_note": "このメソッドを値なしで呼び出すこともできます。その場合、ラベルは値なしでノートに割り当てられます。",
|
||||
"to_value": "値",
|
||||
"help_text_item1": "ノートにまだラベルがない場合は、指定されたラベルを作成します",
|
||||
"help_text_item2": "または既存のラベルの値を変更する"
|
||||
},
|
||||
"delete_label": {
|
||||
"delete_label": "ラベルを削除",
|
||||
@@ -1391,32 +1533,39 @@
|
||||
"label_name_title": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"new_value_placeholder": "新しい値",
|
||||
"help_text_note": "このメソッドは値なしで呼び出すこともできます。その場合、値なしでラベルがノートに割り当てられます。",
|
||||
"help_text": "一致したすべてのノートで、既存のラベルの値を変更する。"
|
||||
"help_text": "一致したすべてのノートで、既存のラベルの値を変更する。",
|
||||
"to_value": "値"
|
||||
},
|
||||
"add_relation": {
|
||||
"add_relation": "関係を追加",
|
||||
"relation_name": "関係の名前",
|
||||
"add_relation": "リレーションを追加",
|
||||
"relation_name": "リレーションの名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"create_relation_on_all_matched_notes": "一致したすべてのノートに対して、指定されたリレーションを作成します。"
|
||||
"create_relation_on_all_matched_notes": "一致したすべてのノートに対して、指定されたリレーションを作成します。",
|
||||
"target_note": "対象のノート",
|
||||
"to": "を"
|
||||
},
|
||||
"delete_relation": {
|
||||
"delete_relation": "関係を削除",
|
||||
"relation_name": "関係の名前",
|
||||
"delete_relation": "リレーションを削除",
|
||||
"relation_name": "リレーションの名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。"
|
||||
},
|
||||
"rename_relation": {
|
||||
"rename_relation": "関係の名前を変更",
|
||||
"rename_relation_from": "関係の名前を",
|
||||
"rename_relation": "リレーションの名前を変更",
|
||||
"rename_relation_from": "リレーションの名前を",
|
||||
"old_name": "古い名前",
|
||||
"to": "から",
|
||||
"new_name": "新しい名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。"
|
||||
},
|
||||
"update_relation_target": {
|
||||
"update_relation": "関係の更新",
|
||||
"relation_name": "関係の名前",
|
||||
"update_relation": "リレーションの更新",
|
||||
"relation_name": "リレーションの名前",
|
||||
"allowed_characters": "英数字、アンダーバー、コロンが使用可能な文字です。",
|
||||
"on_all_matched_notes": "一致したすべてのノートに"
|
||||
"on_all_matched_notes": "一致したすべてのノートに",
|
||||
"target_note": "対象のノート",
|
||||
"change_target_note": "既存のリレーション対象のノートを変更する",
|
||||
"update_relation_target": "リレーション対象の更新",
|
||||
"to": "を"
|
||||
},
|
||||
"revisions_button": {
|
||||
"note_revisions": "ノートの変更履歴"
|
||||
@@ -1427,21 +1576,24 @@
|
||||
"zpetne_odkazy": {
|
||||
"backlink": "{{count}} バックリンク",
|
||||
"backlinks": "{{count}} バックリンク",
|
||||
"relation": "関係"
|
||||
"relation": "リレーション"
|
||||
},
|
||||
"mobile_detail_menu": {
|
||||
"delete_this_note": "このノートを削除",
|
||||
"error_unrecognized_command": "認識されないコマンド {{command}}"
|
||||
"error_unrecognized_command": "認識されないコマンド {{command}}",
|
||||
"insert_child_note": "子ノートを挿入",
|
||||
"error_cannot_get_branch_id": "ノートパス 「{{notePath}} のbranchIdを取得できません"
|
||||
},
|
||||
"inherited_attribute_list": {
|
||||
"title": "継承属性",
|
||||
"no_inherited_attributes": "継承属性ではありません。"
|
||||
"no_inherited_attributes": "継承属性はありません。"
|
||||
},
|
||||
"note_map": {
|
||||
"open_full": "拡大表示",
|
||||
"collapse": "通常サイズに折りたたむ",
|
||||
"title": "ノートマップ",
|
||||
"link-distance": "リンク距離"
|
||||
"link-distance": "リンク距離",
|
||||
"fix-nodes": "ノードを修正"
|
||||
},
|
||||
"owned_attribute_list": {
|
||||
"owned_attributes": "所有属性"
|
||||
@@ -1453,7 +1605,9 @@
|
||||
"unknown_attribute_type": "不明な属性タイプ '{{type}}'",
|
||||
"add_new_attribute": "新しい属性を追加",
|
||||
"remove_this_attribute": "この属性を削除",
|
||||
"remove_color": "このカラーラベルを削除"
|
||||
"remove_color": "このカラーラベルを削除",
|
||||
"promoted_attributes": "プロモート属性",
|
||||
"url_placeholder": "http://ウェブサイト..."
|
||||
},
|
||||
"relation_map": {
|
||||
"open_in_new_tab": "新しいタブで開く",
|
||||
@@ -1461,14 +1615,17 @@
|
||||
"edit_title": "タイトルを編集",
|
||||
"rename_note": "ノート名を変更",
|
||||
"enter_new_title": "新しいノート名を入力:",
|
||||
"remove_relation": "関係を削除",
|
||||
"confirm_remove_relation": "本当にこの関係を削除しますか?",
|
||||
"specify_new_relation_name": "新しい関係の名前(使用可能な文字: 英数字、コロン、アンダースコア)を指定:",
|
||||
"remove_relation": "リレーションを削除",
|
||||
"confirm_remove_relation": "本当にこのリレーションを削除しますか?",
|
||||
"specify_new_relation_name": "新しいリレーションの名前(使用可能な文字: 英数字、コロン、アンダースコア)を指定:",
|
||||
"note_not_found": "ノート {{noteId}} が見つかりません!",
|
||||
"enter_title_of_new_note": "新しいノートのタイトルを入力",
|
||||
"default_new_note_title": "新しいノート",
|
||||
"cannot_match_transform": "変換を一致させることができません: {{transform}}",
|
||||
"click_on_canvas_to_place_new_note": "キャンバスをクリックして新しいノートを配置"
|
||||
"click_on_canvas_to_place_new_note": "キャンバスをクリックして新しいノートを配置",
|
||||
"connection_exists": "これらのノート間の接続 '{{name}}' は既に存在します。",
|
||||
"start_dragging_relations": "ここからリレーションをドラッグして、別のノートにドロップします。",
|
||||
"note_already_in_diagram": "ノート「{{title}}」はすでに図に含まれています。"
|
||||
},
|
||||
"database_anonymization": {
|
||||
"title": "データベースの匿名化",
|
||||
@@ -1534,7 +1691,7 @@
|
||||
"native-title-bar": "ネイティブタイトルバー",
|
||||
"native-title-bar-description": "WindowsとmacOSでは、ネイティブタイトルバーをオフにしておくと、アプリケーションがよりコンパクトに見えます。Linuxでは、ネイティブタイトルバーを表示したままの方が、他のシステムとの統一性が高まります。",
|
||||
"background-effects": "背景効果を有効化(Windows 11のみ)",
|
||||
"background-effects-description": "Mica効果は、アプリのウィンドウにぼかされたスタイリッシュな背景を追加し、奥行きとモダンな外観を作り出します。",
|
||||
"background-effects-description": "Mica効果は、アプリのウィンドウにぼかされたスタイリッシュな背景を追加し、奥行きとモダンな外観を演出します。「ネイティブタイトルバー」を無効にする必要があります。",
|
||||
"restart-app-button": "アプリケーションを再起動して変更を反映",
|
||||
"zoom-factor": "ズーム倍率"
|
||||
},
|
||||
@@ -1577,10 +1734,23 @@
|
||||
"attribute_editor": {
|
||||
"help_text_body1": "ラベルを追加するには、例 <code>#rock</code> と入力します。値も追加したい場合は、例 <code>#year = 2020</code> と入力します",
|
||||
"help_text_body2": "リレーションについては、<code>~author = @</code> と入力すると、オートコンプリートが表示され、目的のノートを検索できるようになります。",
|
||||
"placeholder": "ここにラベルとリレーションを入力"
|
||||
"placeholder": "ここにラベルとリレーションを入力",
|
||||
"help_text_body3": "代わりに、右側の <code>+</code> ボタンを使用してラベルとリレーションを追加することもできます。",
|
||||
"save_attributes": "属性を保存 <enter>",
|
||||
"add_a_new_attribute": "新しい属性を追加",
|
||||
"add_new_label": "新しいラベルを追加 <kbd data-command=\"addNewLabel\"></kbd>",
|
||||
"add_new_relation": "新しいリレーションを追加 <kbd data-command=\"addNewRelation\"></kbd>",
|
||||
"add_new_label_definition": "新しいラベル定義を追加",
|
||||
"add_new_relation_definition": "新しいリレーション定義を追加"
|
||||
},
|
||||
"move_note": {
|
||||
"on_all_matched_notes": "一致したすべてのノートに"
|
||||
"on_all_matched_notes": "一致したすべてのノートに",
|
||||
"move_note": "ノートを移動",
|
||||
"target_parent_note": "対象の親ノート",
|
||||
"move_note_new_parent": "ノートに親が 1 つしかない場合は、ノートを新しい親に移動します (つまり、古いブランチが削除され、新しい親に新しいブランチが作成されます)",
|
||||
"clone_note_new_parent": "ノートに複数のクローン/ブランチがある場合、ノートを新しい親にクローンします(どのブランチを削除すべきか不明なため)",
|
||||
"nothing_will_happen": "ノートをターゲットノートに移動できない場合は何も起こりません(つまり、ツリーサイクルが生じるため)",
|
||||
"to": "次へ"
|
||||
},
|
||||
"onclick_button": {
|
||||
"no_click_handler": "ボタン ウィジェット '{{componentId}}' にはクリック ハンドラーが定義されていません"
|
||||
@@ -1596,20 +1766,35 @@
|
||||
"placeholder": "ここにノートの内容を入力..."
|
||||
},
|
||||
"empty": {
|
||||
"open_note_instruction": "以下の入力欄にノートのタイトルを入力するか、ツリー内のノートを選択してノートを開きます。"
|
||||
"open_note_instruction": "以下の入力欄にノートのタイトルを入力するか、ツリー内のノートを選択してノートを開きます。",
|
||||
"search_placeholder": "名前でノートを検索",
|
||||
"enter_workspace": "ワークスペース {{title}} に入る"
|
||||
},
|
||||
"file": {
|
||||
"too_big": "パフォーマンス上の理由により、プレビューではファイルの最初の {{maxNumChars}} 文字のみが表示されます。ファイル全体を表示するには、ファイルをダウンロードして外部で開いてください。"
|
||||
"too_big": "パフォーマンス上の理由により、プレビューではファイルの最初の {{maxNumChars}} 文字のみが表示されます。ファイル全体を表示するには、ファイルをダウンロードして外部で開いてください。",
|
||||
"file_preview_not_available": "このファイル形式ではファイルプレビューは利用できません。"
|
||||
},
|
||||
"protected_session": {
|
||||
"enter_password_instruction": "保護されたノートを表示するにはパスワードを入力する必要があります:"
|
||||
"enter_password_instruction": "保護されたノートを表示するにはパスワードを入力する必要があります:",
|
||||
"start_session_button": "保護されたセッションを開始 <kbd>enter</kbd>",
|
||||
"started": "保護されたセッションが開始されました。",
|
||||
"wrong_password": "パスワードが間違っています。",
|
||||
"protecting-finished-successfully": "保護が正常に完了しました。",
|
||||
"unprotecting-finished-successfully": "保護の解除が正常に完了しました。",
|
||||
"protecting-in-progress": "保護中: {{count}}",
|
||||
"unprotecting-in-progress-count": "保護解除中: {{count}}",
|
||||
"protecting-title": "保護の状態",
|
||||
"unprotecting-title": "保護解除の状態"
|
||||
},
|
||||
"render": {
|
||||
"note_detail_render_help_1": "このヘルプノートが表示されるのは、このノートの「HTML のレンダリング」タイプには、正常に機能するために必要なリレーションがないためです。"
|
||||
"note_detail_render_help_1": "このヘルプノートが表示されるのは、このノートの「HTML のレンダリング」タイプには、正常に機能するために必要なリレーションがないためです。",
|
||||
"note_detail_render_help_2": "レンダリングHTMLノートタイプは、<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/scripts.html\">スクリプティング</a>に使用されます。簡単に言うと、HTMLコードノート(オプションでJavaScriptを含む)があり、このノートがそれをレンダリングします。これを動作させるには、レンダリングするHTMLノートを指す「renderNote」という<a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/attributes.html\">リレーション</a>を定義する必要があります。"
|
||||
},
|
||||
"consistency_checks": {
|
||||
"find_and_fix_button": "一貫性の問題を見つけて修正する",
|
||||
"finding_and_fixing_message": "一貫性の問題を見つけて修正中…"
|
||||
"finding_and_fixing_message": "一貫性の問題を見つけて修正中…",
|
||||
"title": "一貫性をチェック",
|
||||
"issues_fixed_message": "発見された可能性のある一貫性の問題はすべて修正されました。"
|
||||
},
|
||||
"vacuum_database": {
|
||||
"title": "データベースのバキューム",
|
||||
@@ -1620,12 +1805,16 @@
|
||||
},
|
||||
"ribbon": {
|
||||
"promoted_attributes_message": "プロモート属性がノートに存在する場合、プロモート属性のリボンタブが自動的に開きます",
|
||||
"edited_notes_message": "編集したノートのリボンタブは、dayノートで自動的に開きます"
|
||||
"edited_notes_message": "編集したノートのリボンタブは、dayノートで自動的に開きます",
|
||||
"widgets": "リボンウィジェット"
|
||||
},
|
||||
"ui-performance": {
|
||||
"enable-motion": "トランジションとアニメーションを有効にする",
|
||||
"enable-shadows": "影を有効にする",
|
||||
"enable-backdrop-effects": "メニュー、ポップアップ、パネルの背景効果を有効にする"
|
||||
"enable-backdrop-effects": "メニュー、ポップアップ、パネルの背景効果を有効にする",
|
||||
"title": "パフォーマンス",
|
||||
"enable-smooth-scroll": "スムーズスクロールを有効にする",
|
||||
"app-restart-required": "(変更を有効にするにはアプリケーションの再起動が必要です)"
|
||||
},
|
||||
"code_mime_types": {
|
||||
"title": "ドロップダウンで利用可能なMIMEタイプ"
|
||||
@@ -1664,7 +1853,12 @@
|
||||
"erase_excess_revision_snapshots_prompt": "余分な変更履歴が消去されました。"
|
||||
},
|
||||
"editability_select": {
|
||||
"note_is_read_only": "ノートは読み取り専用ですが、ボタンをクリックすると編集できます。"
|
||||
"note_is_read_only": "ノートは読み取り専用ですが、ボタンをクリックすると編集できます。",
|
||||
"auto": "自動",
|
||||
"read_only": "読み取り専用",
|
||||
"always_editable": "常に編集可能",
|
||||
"note_is_editable": "ノートは長すぎなければ編集可能です。",
|
||||
"note_is_always_editable": "ノートは長さに関係なく常に編集可能です。"
|
||||
},
|
||||
"find": {
|
||||
"case_sensitive": "大文字と小文字を区別",
|
||||
@@ -1681,7 +1875,9 @@
|
||||
"could_not_find_typewidget": "タイプ {{type}} の typeWidget が見つかりませんでした"
|
||||
},
|
||||
"watched_file_update_status": {
|
||||
"ignore_this_change": "この変更を無視する"
|
||||
"ignore_this_change": "この変更を無視する",
|
||||
"file_last_modified": "ファイル <code class=\"file-path\"></code> は <span class=\"file-last-modified\"></span> に最後に変更されました。",
|
||||
"upload_modified_file": "変更したファイルをアップロード"
|
||||
},
|
||||
"image": {
|
||||
"copied-to-clipboard": "画像への参照がクリップボードにコピーされました。これは任意のテキストノートに貼り付けることができます。",
|
||||
@@ -1689,7 +1885,8 @@
|
||||
},
|
||||
"entrypoints": {
|
||||
"note-revision-created": "ノートの改訂版が作成されました。",
|
||||
"sql-error": "SQL クエリの実行中にエラーが発生しました: {{message}}"
|
||||
"sql-error": "SQL クエリの実行中にエラーが発生しました: {{message}}",
|
||||
"note-executed": "ノートが実行されました。"
|
||||
},
|
||||
"branches": {
|
||||
"cannot-move-notes-here": "ここにノートを移動することはできません。",
|
||||
@@ -1706,7 +1903,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "同期チェックに失敗しました!",
|
||||
"consistency-checks-failed": "整合性チェックに失敗しました! 詳細はログを参照してください。",
|
||||
"encountered-error": "エラー「{{message}}」が発生しました。コンソールを確認してください。"
|
||||
"encountered-error": "エラー「{{message}}」が発生しました。コンソールを確認してください。",
|
||||
"lost-websocket-connection-title": "サーバーへの接続が失われました",
|
||||
"lost-websocket-connection-message": "リバースプロキシ(例: nginx や Apache など)の設定を確認し、WebSocket 接続が適切に許可され、ブロックされていないことを確認してください。"
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "要求されたノート「{{requestedNote}}」は、ホイストされたノート「{{hoistedNote}}」サブツリーの外部にあるため、ノートにアクセスするにはホイストを解除する必要があります。ホイスト解除を続行しますか?"
|
||||
@@ -1752,7 +1951,10 @@
|
||||
"display-week-numbers": "週番号を表示",
|
||||
"map-style": "マップスタイル:",
|
||||
"max-nesting-depth": "最大階層の深さ:",
|
||||
"show-scale": "スケールを表示"
|
||||
"show-scale": "スケールを表示",
|
||||
"raster": "Raster",
|
||||
"vector_light": "Vector(ライト)",
|
||||
"vector_dark": "Vector (ダーク)"
|
||||
},
|
||||
"call_to_action": {
|
||||
"next_theme_title": "新しいTriliumテーマをお試しください",
|
||||
@@ -1779,5 +1981,89 @@
|
||||
},
|
||||
"collections": {
|
||||
"rendering_error": "エラーのためコンテンツを表示できません。"
|
||||
},
|
||||
"abstract_bulk_action": {
|
||||
"remove_this_search_action": "この検索アクションを削除"
|
||||
},
|
||||
"update_available": {
|
||||
"update_available": "アップデートが利用可能"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "画像参照をクリップボードにコピーし、テキストノートに貼り付けることができます。"
|
||||
},
|
||||
"attachment_detail": {
|
||||
"open_help_page": "添付ファイルのヘルプページを開く",
|
||||
"owning_note": "所有ノート: ",
|
||||
"you_can_also_open": "、開くこともできます ",
|
||||
"list_of_all_attachments": "すべての添付ファイルのリスト",
|
||||
"attachment_deleted": "この添付ファイルは削除されました。"
|
||||
},
|
||||
"attachment_list": {
|
||||
"open_help_page": "添付ファイルのヘルプページを開く",
|
||||
"owning_note": "所有ノート: ",
|
||||
"upload_attachments": "添付ファイルをアップロード",
|
||||
"no_attachments": "このノートには添付ファイルはありません。"
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "このコレクションには子ノートがないため、表示するものがありません。詳細は<a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>をご覧ください。",
|
||||
"drag_locked_title": "編集をロック中",
|
||||
"drag_locked_message": "コレクションは編集がロックされているため、ドラッグは許可されていません。"
|
||||
},
|
||||
"native_title_bar": {
|
||||
"title": "ネイティブタイトルバー(アプリの再起動が必要です)",
|
||||
"enabled": "有効",
|
||||
"disabled": "無効"
|
||||
},
|
||||
"options_widget": {
|
||||
"options_change_saved": "オプションの変更が保存されました。",
|
||||
"options_status": "オプションステータス"
|
||||
},
|
||||
"multi_factor_authentication": {
|
||||
"title": "多要素認証",
|
||||
"description": "多要素認証(MFA)は、アカウントのセキュリティをさらに強化します。ログイン時にパスワードを入力するだけでなく、MFAでは本人確認のために1つ以上の追加情報の入力を求められます。これにより、たとえ誰かがパスワードを入手したとしても、2つ目の情報がなければアカウントにアクセスできません。まるでドアに鍵を追加したようなもので、他人が侵入するのがはるかに困難になります。<br><br>MFAを有効にするには、以下の手順に従ってください。正しく設定しないと、ログインはパスワードのみで行われます。",
|
||||
"mfa_enabled": "多要素認証を有効にする",
|
||||
"mfa_method": "MFAメソッド",
|
||||
"electron_disabled": "現在、デスクトップ ビルドでは多要素認証はサポートされていません。",
|
||||
"totp_title": "時間ベースのワンタイムパスワード (TOTP)",
|
||||
"totp_description": "TOTP(時間ベースのワンタイムパスワード)は、30秒ごとに変化する一意の一時的なコードを生成するセキュリティ機能です。このコードとパスワードを使用してアカウントにログインすることで、他人がアクセスするのを大幅に困難にします。",
|
||||
"totp_secret_title": "TOTPシークレットを生成する",
|
||||
"totp_secret_generate": "TOTPシークレットを生成する",
|
||||
"totp_secret_regenerate": "TOTPシークレットを再生成する",
|
||||
"no_totp_secret_warning": "TOTP を有効にするには、まず TOTP シークレットを生成する必要があります。",
|
||||
"totp_secret_description_warning": "新しい TOTP シークレットを生成したら、新しい TOTP シークレットを使用して再度ログインする必要があります。",
|
||||
"totp_secret_generated": "TOTPシークレットが生成されました",
|
||||
"totp_secret_warning": "生成されたシークレットは安全な場所に保存してください。再度表示されることはありません。",
|
||||
"totp_secret_regenerate_confirm": "OTP シークレットを再生成してもよろしいですか?これにより、以前の TOTP シークレットと既存のすべての回復コードが無効になります。",
|
||||
"recovery_keys_title": "シングルサインオン回復キー",
|
||||
"recovery_keys_description": "シングル サインオン回復キーは、認証コードにアクセスできない場合でもログインするために使用されます。",
|
||||
"recovery_keys_description_warning": "回復キーはページを離れた後は再度表示されませんので、安全な場所に保管してください。<br>回復キーは一度使用すると再度使用できなくなります。",
|
||||
"recovery_keys_error": "回復コードの生成中にエラーが発生しました",
|
||||
"recovery_keys_no_key_set": "回復コードが設定されていません",
|
||||
"recovery_keys_generate": "回復コードを生成する",
|
||||
"recovery_keys_regenerate": "回復コードの再生成",
|
||||
"recovery_keys_used": "使用日: {{date}}",
|
||||
"recovery_keys_unused": "回復コード {{index}} は未使用です",
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenIDは、Googleなどの他のサービスのアカウントを使用してウェブサイトにログインし、本人確認を行うための標準化された方法です。デフォルトの発行者はGoogleですが、他のOpenIDプロバイダに変更できます。詳しくは<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">こちら</a>をご覧ください。Google経由でOpenIDサービスを設定するには、<a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">こちらの手順</a>に従ってください。",
|
||||
"oauth_description_warning": "OAuth/OpenIDを有効にするには、config.iniファイルにOAuth/OpenIDのベースURL、クライアントID、クライアントシークレットを設定し、アプリケーションを再起動する必要があります。環境変数から設定する場合は、TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID and TRILIUM_OAUTH_CLIENT_SECRET を設定してください。",
|
||||
"oauth_missing_vars": "設定がありません: {{-variables}}",
|
||||
"oauth_user_account": "ユーザーアカウント: ",
|
||||
"oauth_user_email": "ユーザーEメール: ",
|
||||
"oauth_user_not_logged_in": "ログインしていません!"
|
||||
},
|
||||
"note-map": {
|
||||
"button-link-map": "リンクマップ",
|
||||
"button-tree-map": "ツリーマップ"
|
||||
},
|
||||
"spacer": {
|
||||
"configure_launchbar": "ランチャーバーを設定"
|
||||
},
|
||||
"attachment_detail_2": {
|
||||
"will_be_deleted_in": "この添付ファイルは {{time}} 後に自動的に削除されます",
|
||||
"will_be_deleted_soon": "この添付ファイルはすぐに自動的に削除されます",
|
||||
"deletion_reason": "、添付ファイルがノートのコンテンツにリンクされていないためです。削除されないようにするには、添付ファイルのリンクをコンテンツに再度追加するか、添付ファイルをノートに変換してください。",
|
||||
"role_and_size": "ロール: {{role}},サイズ: {{size}}",
|
||||
"link_copied": "添付ファイルのリンクをクリップボードにコピーしました。",
|
||||
"unrecognized_role": "添付ファイルのロール「{{role}}」は認識されません。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,9 +29,25 @@
|
||||
"note": "노트",
|
||||
"search_note": "이름으로 노트 검색하기",
|
||||
"help_on_links": "링크 관련 도움말",
|
||||
"link_title_mirrors": "링크 제목은 노트의 현재 제목을 반영합니다"
|
||||
"link_title_mirrors": "링크 제목은 노트의 현재 제목을 반영합니다",
|
||||
"link_title_arbitrary": "링크 제목은 임의로 변경될 수 있습니다",
|
||||
"link_title": "링크 제목",
|
||||
"button_add_link": "링크 추가"
|
||||
},
|
||||
"branch_prefix": {
|
||||
"save": "저장"
|
||||
"save": "저장",
|
||||
"edit_branch_prefix": "브랜치 접두사 편집",
|
||||
"help_on_tree_prefix": "트리 접두사에 대한 도움말",
|
||||
"prefix": "접두사: ",
|
||||
"branch_prefix_saved": "브랜치 접두사가 저장되었습니다."
|
||||
},
|
||||
"bulk_actions": {
|
||||
"bulk_actions": "대량 작업",
|
||||
"affected_notes": "영향을 받은 노트들",
|
||||
"include_descendants": "선택한 노트의 자손 포함",
|
||||
"available_actions": "가능한 액션들",
|
||||
"chosen_actions": "선택한 액션들",
|
||||
"execute_bulk_actions": "대량 액션들 실행",
|
||||
"bulk_actions_executed": "대량 액션들이 성공적으로 실행되었습니다."
|
||||
}
|
||||
}
|
||||
|
||||
1
apps/client/src/translations/md/translation.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
apps/client/src/translations/nb-NO/translation.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -840,7 +840,7 @@
|
||||
"cannot_find_day_note": "Nota do dia não encontrada",
|
||||
"cannot_find_week_note": "Nota semanal não encontrada",
|
||||
"january": "Janeiro",
|
||||
"febuary": "Fevereiro",
|
||||
"february": "Fevereiro",
|
||||
"march": "Março",
|
||||
"april": "Abril",
|
||||
"may": "Maio",
|
||||
@@ -2008,7 +2008,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID é uma forma padronizada de permitir que você faça login em sites usando uma conta de outro serviço, como o Google, para verificar sua identidade. O emissor padrão é o Google, mas você pode alterá-lo para qualquer outro provedor OpenID. Consulte <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">aqui</a> para mais informações. Siga estas <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">instruções</a> para configurar um serviço OpenID através do Google.",
|
||||
"oauth_description_warning": "Para habilitar o OAuth/OpenID, você precisa definir a URL base do OAuth/OpenID, o client ID e o client secret no arquivo config.ini e reiniciar a aplicação. Se quiser configurar via variáveis de ambiente, defina TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID e TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Configurações ausentes: {{variables}}",
|
||||
"oauth_missing_vars": "Configurações ausentes: {{-variables}}",
|
||||
"oauth_user_account": "Conta do Usuário: ",
|
||||
"oauth_user_email": "E-mail do Usuário: ",
|
||||
"oauth_user_not_logged_in": "Não está logado!"
|
||||
|
||||
@@ -322,7 +322,7 @@
|
||||
"august": "August",
|
||||
"cannot_find_day_note": "Nu se poate găsi notița acelei zile",
|
||||
"december": "Decembrie",
|
||||
"febuary": "Februarie",
|
||||
"february": "Februarie",
|
||||
"fri": "Vin",
|
||||
"january": "Ianuarie",
|
||||
"july": "Iulie",
|
||||
@@ -1587,7 +1587,9 @@
|
||||
"ws": {
|
||||
"consistency-checks-failed": "Au fost identificate erori de consistență! Vedeți mai multe detalii în loguri.",
|
||||
"encountered-error": "A fost întâmpinată o eroare: „{{message}}”. Vedeți în loguri pentru mai multe detalii.",
|
||||
"sync-check-failed": "Verificările de sincronizare au eșuat!"
|
||||
"sync-check-failed": "Verificările de sincronizare au eșuat!",
|
||||
"lost-websocket-connection-title": "S-a pierdut conexiunea la server",
|
||||
"lost-websocket-connection-message": "Verificați configurația reverse proxy-ului (e.g. nginx sau Apache) astfel încât să permită comunicarea prin WebSocket."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Notița dorită „{{requestedNote}}” este în afara ierarhiei notiței focalizate „{{hoistedNote}}”. Doriți defocalizarea pentru a accesa notița?"
|
||||
@@ -1668,7 +1670,7 @@
|
||||
},
|
||||
"electron_integration": {
|
||||
"background-effects": "Activează efectele de fundal (doar pentru Windows 11)",
|
||||
"background-effects-description": "Efectul Mica adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creând profunzime și un aspect modern.",
|
||||
"background-effects-description": "Efectul Mica adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creând profunzime și un aspect modern. Opțiunea „Bară de titlu nativă” trebuie să fie dezactivată.",
|
||||
"desktop-application": "Aplicația desktop",
|
||||
"native-title-bar": "Bară de titlu nativă",
|
||||
"native-title-bar-description": "Pentru Windows și macOS, dezactivarea bării de titlu native face aplicația să pară mai compactă. Pe Linux, păstrarea bării integrează mai bine aplicația cu restul sistemului de operare.",
|
||||
@@ -1931,7 +1933,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID este o cale standardizată ce permite autentificarea într-un site folosind un cont dintr-un alt serviciu, precum Google, pentru a verifica identitatea. În mod implicit furnizorul este Google, dar se poate schimba cu orice furnizor OpenID. Pentru mai multe informații, consultați <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">ghidul</a>. Urmați <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">aceste instrucțiuni</a> pentru a putea configura OpenID prin Google.",
|
||||
"oauth_description_warning": "Pentru a activa OAuth sau OpenID, trebuie să configurați URL-ul de bază, ID-ul de client și secretul de client în fișierul config.ini și să reporniți aplicația. Dacă doriți să utilizați variabile de environment, puteți seta TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID și TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Setări lipsă: {{variables}}",
|
||||
"oauth_missing_vars": "Setări lipsă: {{-variables}}",
|
||||
"oauth_user_account": "Cont: ",
|
||||
"oauth_user_email": "Email: ",
|
||||
"oauth_user_not_logged_in": "Neautentificat!"
|
||||
@@ -1956,7 +1958,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "Funcții",
|
||||
"emoji_completion_enabled": "Activează auto-completarea pentru emoji-uri",
|
||||
"note_completion_enabled": "Activează auto-completarea pentru notițe"
|
||||
"note_completion_enabled": "Activează auto-completarea pentru notițe",
|
||||
"emoji_completion_description": "Dacă această funcție este pornită, emoji-urile pot fi inserate rapid prin tastarea caracterului „:”, urmat de denumirea emoji-ului.",
|
||||
"note_completion_description": "Dacă această funcție este pornită, se pot crea ușor legături către notițe prin tastarea „@”, urmată de titlul notiței dorite.",
|
||||
"slash_commands_enabled": "Activează comenzi rapide prin tasta slash",
|
||||
"slash_commands_description": "Dacă această funcție este pornită, se poate folosi tasta „/” pentru a rula rapid comenzi de editare precum inserarea de întreruperi de pagină sau titluri."
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "Rând nou",
|
||||
|
||||
@@ -282,13 +282,13 @@
|
||||
"editBranchPrefix": "изменить <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/tree-concepts.html#prefix\">префикс</a> клона активной заметки",
|
||||
"multiSelectNote": "множественный выбор заметки выше/ниже",
|
||||
"selectNote": "выбрать заметку",
|
||||
"copyNotes": "скопировать активную заметку (или выделение) в буфер обмер (используется для <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">клонирования</a>)",
|
||||
"copyNotes": "скопировать активную заметку (или выделение) в буфер обмена (используется для <a class=\"external\" href=\"https://triliumnext.github.io/Docs/Wiki/cloning-notes.html#cloning-notes\">клонирования</a>)",
|
||||
"createEditLink": "создать/редактировать внешнюю ссылку",
|
||||
"headings": "<code>##</code>, <code>###</code>, <code>####</code> и т. д., за которыми следует пробел для заголовков",
|
||||
"bulletList": "<code>*</code> или <code>-</code> с последующим пробелом для маркированного списка",
|
||||
"numberedList": "<code>1.</code> или <code>1)</code> с последующим пробелом для нумерованного списка",
|
||||
"blockQuote": "начните строку с <code>></code>, а затем пробела для блока цитаты",
|
||||
"quickSearch": "сфокусироваться на полее ввода быстрого поиска",
|
||||
"quickSearch": "сфокусироваться на поле ввода быстрого поиска",
|
||||
"editNoteTitle": "в области дерева переключится с области дерева на заголовок заметки. Сочетание клавиш Enter из области заголовка заметки переключит фокус на текстовый редактор. <kbd>Ctrl+.</kbd> переключит обратно с редактора на область дерева.",
|
||||
"title": "Справка"
|
||||
},
|
||||
@@ -370,7 +370,7 @@
|
||||
"confirm_delete": "Вы хотите удалить эту версию?",
|
||||
"revisions_deleted": "Версии заметки были удалены.",
|
||||
"revision_restored": "Версия заметки была восстановлена.",
|
||||
"revision_deleted": "Версия заметки были удалены.",
|
||||
"revision_deleted": "Версия заметки была удалена.",
|
||||
"download_button": "Скачать",
|
||||
"file_size": "Размер файла:",
|
||||
"preview": "Предпросмотр:",
|
||||
@@ -463,7 +463,7 @@
|
||||
"run_at_hour": "В какой час это должно выполняться? Следует использовать вместе с <code>#run=hourly</code>. Можно задать несколько раз для большего количества запусков в течение дня.",
|
||||
"disable_inclusion": "скрипты с этой меткой не будут включены в выполнение родительского скрипта.",
|
||||
"sorted": "сохраняет алфавитную сортировку дочерних заметок",
|
||||
"sort_direction": "ASC (по возрастани, по умолчанию) или DESC (по убыванию)",
|
||||
"sort_direction": "ASC (по возрастанию, по умолчанию) или DESC (по убыванию)",
|
||||
"sort_folders_first": "Папки (заметки, включая дочерние) должны быть отсортированы вверх",
|
||||
"top": "закрепить заданную заметку наверху в ее родителе (применяется только к отсортированным родительским заметкам)",
|
||||
"hide_promoted_attributes": "Скрыть продвигаемых атрибуты в этой заметке",
|
||||
@@ -479,7 +479,7 @@
|
||||
"workspace_search_home": "новые заметки поиска будут созданы как дочерние записи этой заметки при перемещении их к какому-либо предку этой заметки рабочей области",
|
||||
"workspace_calendar_root": "Определяет корень календаря для каждого рабочего пространства",
|
||||
"hide_highlight_widget": "Скрыть виджет «Выделенное»",
|
||||
"is_owned_by_note": "принадлежит записке",
|
||||
"is_owned_by_note": "принадлежит заметке",
|
||||
"and_more": "... и ещё {{count}}.",
|
||||
"app_theme": "отмечает заметки CSS, которые являются полноценными темами Trilium и, таким образом, доступны в опциях Trilium.",
|
||||
"title_template": "Заголовок по умолчанию для заметок, создаваемых как дочерние элементы данной заметки. Значение вычисляется как строка JavaScript\n и, таким образом, может быть дополнено динамическим контентом с помощью внедренных переменных <code>now</code> и <code>parentNote</code>. Примеры:\n \n <ul>\n <li><code>Литературные произведения ${parentNote.getLabelValue('authorName')}</code></li>\n <li><code>Лог для ${now.format('YYYY-MM-DD HH:mm:ss')}</code></li>\n </ul>\n \n Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/default-note-title.html\">вики</a>, документации API для <a href=\"https://zadam.github.io/trilium/backend_api/Note.html\">parentNote</a> и <a href=\"https://day.js.org/docs/en/display/format\">now</a>.",
|
||||
@@ -528,7 +528,7 @@
|
||||
"run_on_note_deletion": "выполняется при удалении заметки",
|
||||
"run_on_branch_creation": "выполняется при создании ветви. Ветвь — это связующее звено между родительской и дочерней заметками и создаётся, например, при клонировании или перемещении заметки.",
|
||||
"run_on_branch_change": "выполняется при обновлении ветки.",
|
||||
"run_on_attribute_creation": "выполняется, когда создается новый атрибут для заметка, определяющей это отношение",
|
||||
"run_on_attribute_creation": "выполняется, когда создается новый атрибут для заметки, определяющей это отношение",
|
||||
"run_on_attribute_change": " выполняется при изменении атрибута заметки, определяющей это отношение. Также срабатывает при удалении атрибута",
|
||||
"relation_template": "атрибуты заметки будут унаследованы даже без родительско-дочерних отношений. Содержимое заметки и её поддерево будут добавлены к экземпляру заметки, если оно пустое. Подробности см. в документации.",
|
||||
"inherit": "атрибуты заметки будут унаследованы даже без родительско-дочерних отношений. См. описание шаблонных отношений для получения аналогичной информации. См. раздел «Наследование атрибутов» в документации.",
|
||||
@@ -585,7 +585,11 @@
|
||||
"editorfeatures": {
|
||||
"note_completion_enabled": "Включить автодополнение",
|
||||
"emoji_completion_enabled": "Включить автодополнение эмодзи",
|
||||
"title": "Особенности"
|
||||
"title": "Особенности",
|
||||
"slash_commands_description": "Если эта опция включена, команды редактирования, такие как вставка переносов строк или заголовков, можно переключать, вводя `/`.",
|
||||
"slash_commands_enabled": "Включить слэш-команды",
|
||||
"note_completion_description": "Если эта опция включена, ссылки на заметки можно создавать, вводя `@`, а затем название заметки.",
|
||||
"emoji_completion_description": "Если эта функция включена, эмодзи можно легко вставлять в текст, набрав `:`, а затем название эмодзи."
|
||||
},
|
||||
"cpu_arch_warning": {
|
||||
"dont_show_again": "Больше не показывать это предупреждение",
|
||||
@@ -712,7 +716,7 @@
|
||||
},
|
||||
"code_block": {
|
||||
"copy_title": "Копировать в буфер обмена",
|
||||
"theme_group_dark": "Темныце темы",
|
||||
"theme_group_dark": "Темные темы",
|
||||
"theme_group_light": "Светлые темы",
|
||||
"theme_none": "Нет подсветки синтаксиса",
|
||||
"word_wrapping": "Перенос слов"
|
||||
@@ -783,7 +787,7 @@
|
||||
"beta-feature": "Бета",
|
||||
"widget": "Виджет",
|
||||
"image": "Изображение",
|
||||
"file": "Файд",
|
||||
"file": "Файл",
|
||||
"canvas": "Холст",
|
||||
"mermaid-diagram": "Диаграмма Mermaid",
|
||||
"book": "Коллекция",
|
||||
@@ -811,7 +815,7 @@
|
||||
"export": "Экспорт",
|
||||
"open-in-a-new-tab": "Открыть в новой вкладке",
|
||||
"open-in-a-new-split": "Открыть в новой панели",
|
||||
"unhoist-note": "Отрепить заметку",
|
||||
"unhoist-note": "Открепить заметку",
|
||||
"hoist-note": "Закрепить заметку",
|
||||
"protect-subtree": "Защитить поддерево",
|
||||
"unprotect-subtree": "Снять защиту с поддерева",
|
||||
@@ -864,7 +868,7 @@
|
||||
"to": "в",
|
||||
"move_note": "Переместить заметку",
|
||||
"target_parent_note": "целевая версии заметки",
|
||||
"on_all_matched_notes": "На всех совпадающих нотах",
|
||||
"on_all_matched_notes": "На всех совпадающих заметках",
|
||||
"move_note_new_parent": "переместить заметку в новый родительский элемент, если у заметки есть только один родительский элемент (т. е. старая ветвь удаляется и создается новая ветвь в новом родительском элементе)",
|
||||
"clone_note_new_parent": "клонировать заметку в новый родительский элемент, если у заметки есть несколько клонов/ветвей (неясно, какую ветвь следует удалить)",
|
||||
"nothing_will_happen": "ничего не произойдет, если эту заметку невозможно переместить в целевую заметку (т.е. это создаст цикл дерева)"
|
||||
@@ -902,7 +906,7 @@
|
||||
"delete_attachment": "Удалить вложение",
|
||||
"upload_new_revision": "Загрузить новую версию",
|
||||
"open_custom": "Открыть как...",
|
||||
"open_custom_client_only": "Иной способ открытие вложений возможен только из десктопного приложения.",
|
||||
"open_custom_client_only": "Открытие вложений другим способом возможно только в десктопном приложении.",
|
||||
"open_externally_detail_page": "Открытие вложения извне доступно только из детальной страницы. Для этого сначала нажмите на сведения о вложении и повторите действие.",
|
||||
"open_custom_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.",
|
||||
"open_externally_title": "Файл будет открыт во внешнем приложении и отслеживаться на наличие изменений. После этого вы сможете загрузить изменённую версию обратно в Trilium.",
|
||||
@@ -925,7 +929,7 @@
|
||||
"sat": "Сбт",
|
||||
"sun": "Вс",
|
||||
"january": "Январь",
|
||||
"febuary": "Февраль",
|
||||
"february": "Февраль",
|
||||
"march": "Март",
|
||||
"april": "Апрель",
|
||||
"may": "Май",
|
||||
@@ -1020,8 +1024,8 @@
|
||||
"file_properties": {
|
||||
"download": "Скачать",
|
||||
"open": "Открыть",
|
||||
"title": "Файд",
|
||||
"upload_success": "Загрузка новой версии файла не удалась.",
|
||||
"title": "Файл",
|
||||
"upload_success": "Новая версия файла успешно загружена.",
|
||||
"upload_new_revision": "Загрузить новую версию",
|
||||
"file_size": "Размер файла",
|
||||
"file_type": "Тип файла",
|
||||
@@ -1153,7 +1157,7 @@
|
||||
"label_abc": "возвращает заметки с меткой abc",
|
||||
"label_year": "ищет заметки с меткой year, имеющей значение 2019",
|
||||
"label_rock_pop": "соответствует заметкам с метками как rock, так и pop",
|
||||
"label_rock_or_pop": "должна присутствовать только одна из vtnjr",
|
||||
"label_rock_or_pop": "должна присутствовать только одна из меток",
|
||||
"label_year_comparison": "числовое сравнение (также >, >=, <).",
|
||||
"label_date_created": "заметки, созданные за последний месяц",
|
||||
"error": "Ошибка поиска: {{error}}",
|
||||
@@ -1413,7 +1417,7 @@
|
||||
"first-week-contains-first-day": "Первая неделя содержит первый день года",
|
||||
"first-week-contains-first-thursday": "Первая неделя содержит первый четверг года",
|
||||
"first-week-has-minimum-days": "Первая неделя имеет минимальное количество дней",
|
||||
"min-days-in-first-week": "Минимальное количество дней в первую неделю",
|
||||
"min-days-in-first-week": "Минимальное количество дней в первой неделе",
|
||||
"first-week-info": "Первая неделя содержит первый четверг года в соответствии со стандартом <a href=\"https://en.wikipedia.org/wiki/ISO_week_date#First_week\">ISO 8601</a>.",
|
||||
"first-week-warning": "Изменение параметров первой недели может привести к дублированию существующих недельных заметок, и существующие недельные заметки не будут обновлены соответствующим образом.",
|
||||
"formatting-locale": "Формат даты и числа"
|
||||
@@ -1475,7 +1479,7 @@
|
||||
"totp_secret_generated": "Создан секрет TOTP",
|
||||
"recovery_keys_generate": "Генерация кодов восстановления",
|
||||
"recovery_keys_regenerate": "Регенерация кодов восстановления",
|
||||
"oauth_missing_vars": "Отсутствуют настройки: {{variables}}",
|
||||
"oauth_missing_vars": "Отсутствуют настройки: {{-variables}}",
|
||||
"oauth_user_not_logged_in": "Не выполнен вход!",
|
||||
"totp_title": "Одноразовый пароль с ограничением по времени (TOTP)",
|
||||
"recovery_keys_title": "Ключи восстановления единого входа",
|
||||
@@ -1719,7 +1723,7 @@
|
||||
"database_vacuumed": "База данных была сжата"
|
||||
},
|
||||
"vim_key_bindings": {
|
||||
"use_vim_keybindings_in_code_notes": "Раскладка клавиш VIM",
|
||||
"use_vim_keybindings_in_code_notes": "Сочетания клавиш Vim",
|
||||
"enable_vim_keybindings": "Включить сочетания клавиш Vim в заметках кода (без режима ex)"
|
||||
},
|
||||
"network_connections": {
|
||||
@@ -1802,7 +1806,7 @@
|
||||
"button_title": "Экспортировать диаграмму как SVG"
|
||||
},
|
||||
"copy_image_reference_button": {
|
||||
"button_title": "Скопировать ссылку на изображение в буфер обмена, можент быть вставлена в текстовую заметку."
|
||||
"button_title": "Скопировать ссылку на изображение в буфер обмена, может быть вставлена в текстовую заметку."
|
||||
},
|
||||
"note_launcher": {
|
||||
"this_launcher_doesnt_define_target_note": "Этот лаунчер не определяет целевую заметку."
|
||||
@@ -1973,7 +1977,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Проверка синхронизации не удалась!",
|
||||
"encountered-error": "Обнаружена ошибка \"{{message}}\", проверьте консоль.",
|
||||
"consistency-checks-failed": "Проверка целостности не пройдена! Подробности смотрите в логах."
|
||||
"consistency-checks-failed": "Проверка целостности не пройдена! Подробности смотрите в логах.",
|
||||
"lost-websocket-connection-title": "Потеряно соединение с сервером",
|
||||
"lost-websocket-connection-message": "Проверьте конфигурацию обратного прокси (например, nginx или Apache), чтобы убедиться, что соединения WebSocket должным образом разрешены и не заблокированы."
|
||||
},
|
||||
"attachment_detail_2": {
|
||||
"role_and_size": "Роль: {{role}}, Размер: {{size}}",
|
||||
@@ -2045,7 +2051,7 @@
|
||||
"could_not_find_typewidget": "Не удалось найти typeWidget для типа '{{type}}'"
|
||||
},
|
||||
"book": {
|
||||
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. на <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>.",
|
||||
"no_children_help": "В этой коллекции нет дочерних заметок, поэтому отображать нечего. Подробности см. в <a href=\"https://triliumnext.github.io/Docs/Wiki/book-note.html\">wiki</a>.",
|
||||
"drag_locked_title": "Защищено от изменения",
|
||||
"drag_locked_message": "Перетаскивание не допускается, так как коллекция защищена от редактирования."
|
||||
},
|
||||
|
||||
@@ -581,7 +581,7 @@
|
||||
"sun": "日",
|
||||
"cannot_find_day_note": "無法找到日記",
|
||||
"january": "一月",
|
||||
"febuary": "二月",
|
||||
"february": "二月",
|
||||
"march": "三月",
|
||||
"april": "四月",
|
||||
"may": "五月",
|
||||
@@ -1582,7 +1582,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "同步檢查失敗!",
|
||||
"consistency-checks-failed": "一致性檢查失敗!請查看日誌以了解詳細資訊。",
|
||||
"encountered-error": "遇到錯誤 \"{{message}}\",請查看控制台。"
|
||||
"encountered-error": "遇到錯誤 \"{{message}}\",請查看控制台。",
|
||||
"lost-websocket-connection-title": "與伺服器的連線中斷",
|
||||
"lost-websocket-connection-message": "檢查您的反向代理(如 nginx 或 Apache)設定以確保 Websocket 連線沒有被阻擋。"
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "請求的筆記 '{{requestedNote}}' 位於聚焦的筆記 '{{hoistedNote}}' 的子階層之外,您必須取消聚焦才能訪問該筆記。是否繼續取消聚焦?"
|
||||
@@ -1843,7 +1845,7 @@
|
||||
"oauth_title": "OAuth / OpenID 驗證",
|
||||
"oauth_description": "OpenID 是一種標準化的方式,可讓您使用其他服務(如 Google)的帳號登入網站,以驗證您的身份。預設的提供者是 Google,但您可以將其變更為任何其他 OpenID 提供者。查看<a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">此處</a>以瞭解更多資訊。依照這些 <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">指示</a>以透過 Google 設定 OpenID 服務。",
|
||||
"oauth_description_warning": "要啟用 OAuth / OpenID,您需要設定 config.ini 文件中的 OAuth / OpenID 基礎 URL、客戶端 ID 和客戶端金鑰,並重新啟動應用程式。如果要從環境變數設置,請設定 TRILIUM_OAUTH_BASE_URL、TRILIUM_OAUTH_CLIENT_ID 和 TRILIUM_OAUTH_CLIENT_SECRET 環境變數。",
|
||||
"oauth_missing_vars": "缺少以下設定:{{variables}}",
|
||||
"oauth_missing_vars": "缺少以下設定:{{-variables}}",
|
||||
"oauth_user_account": "用戶帳號: ",
|
||||
"oauth_user_email": "用戶信箱: ",
|
||||
"oauth_user_not_logged_in": "尚未登入!"
|
||||
@@ -1952,7 +1954,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "功能",
|
||||
"emoji_completion_enabled": "啟用 Emoji 自動完成",
|
||||
"note_completion_enabled": "啟用筆記自動完成"
|
||||
"note_completion_enabled": "啟用筆記自動完成",
|
||||
"emoji_completion_description": "如果啟用,emoji 可以輕易地經由輸入 `:` 加上 emoji 名稱來插入。",
|
||||
"note_completion_description": "如果啟用,導向筆記的連結可以經由輸入 `@` 加上筆記標題來建立。",
|
||||
"slash_commands_enabled": "啟用斜線命令",
|
||||
"slash_commands_description": "如果啟用,可以經由輸入 `/` 來觸發命令,如插入換行符或標題。"
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "新增列",
|
||||
|
||||
@@ -560,7 +560,7 @@
|
||||
"oauth_title": "OAuth/OpenID",
|
||||
"oauth_description": "OpenID – це стандартизований спосіб входу на веб-сайти за допомогою облікового запису з іншого сервісу, такого як Google, для підтвердження вашої особи. Емітентом за замовчуванням є Google, але ви можете змінити його на будь-якого іншого постачальника OpenID. Перегляньте <a href=\"#root/_hidden/_help/_help_Otzi9La2YAUX/_help_WOcw2SLH6tbX/_help_7DAiwaf8Z7Rz\">тут</a> для отримання додаткової інформації. Дотримуйтесь цих <a href=\"https://developers.google.com/identity/openid-connect/openid-connect\">інструкцій</a>, щоб налаштувати сервіс OpenID через Google.",
|
||||
"oauth_description_warning": "Щоб увімкнути OAuth/OpenID, потрібно встановити базову URL-адресу OAuth/OpenID, ідентифікатор клієнта та секрет клієнта у файлі config.ini та перезапустити програму. Якщо ви хочете встановити зі змінних середовища, встановіть TRILIUM_OAUTH_BASE_URL, TRILIUM_OAUTH_CLIENT_ID та TRILIUM_OAUTH_CLIENT_SECRET.",
|
||||
"oauth_missing_vars": "Відсутні налаштування: {{variables}}",
|
||||
"oauth_missing_vars": "Відсутні налаштування: {{-variables}}",
|
||||
"oauth_user_account": "Обліковий запис користувача: ",
|
||||
"oauth_user_email": "Електронна пошта користувача: ",
|
||||
"oauth_user_not_logged_in": "Ви не ввійшли в систему!"
|
||||
@@ -722,7 +722,7 @@
|
||||
"cannot_find_day_note": "Не вдається знайти денну нотатку",
|
||||
"cannot_find_week_note": "Не вдається знайти тижневу нотатку",
|
||||
"january": "Січень",
|
||||
"febuary": "Лютий",
|
||||
"february": "Лютий",
|
||||
"march": "Березень",
|
||||
"april": "Квітень",
|
||||
"may": "Травень",
|
||||
@@ -1669,7 +1669,9 @@
|
||||
"ws": {
|
||||
"sync-check-failed": "Перевірка синхронізації не вдалася!",
|
||||
"consistency-checks-failed": "Перевірка узгодженості не вдалася! Див. logs для отримання інформації.",
|
||||
"encountered-error": "Виникла помилка \"{{message}}\", перевірте консоль."
|
||||
"encountered-error": "Виникла помилка \"{{message}}\", перевірте консоль.",
|
||||
"lost-websocket-connection-title": "Втрачено з'єднання із сервером",
|
||||
"lost-websocket-connection-message": "Перевірте конфігурацію вашого зворотного проксі-сервера (наприклад, nginx або Apache), щоб переконатися, що з’єднання WebSocket належним чином дозволені та не блокуються."
|
||||
},
|
||||
"hoisted_note": {
|
||||
"confirm_unhoisting": "Запитана нотатка '{{requestedNote}}' знаходиться поза піддеревом закріплених нотаток '{{hoistedNote}}', і вам потрібно відкріпити нотатку, щоб отримати до неї доступ. Ви хочете продовжити відкріплення?"
|
||||
@@ -1797,7 +1799,11 @@
|
||||
"editorfeatures": {
|
||||
"title": "Особливості",
|
||||
"emoji_completion_enabled": "Увімкнути автозаповнення емодзі",
|
||||
"note_completion_enabled": "Увімкнути автозаповнення нотаток"
|
||||
"note_completion_enabled": "Увімкнути автозаповнення нотаток",
|
||||
"emoji_completion_description": "Якщо цю функцію ввімкнено, емодзі можна легко вставляти в текст, ввівши `:`, а потім назву емодзі.",
|
||||
"note_completion_description": "Якщо ввімкнено, посилання на нотатки можна створювати, вводячи `@`, а потім назву нотатки.",
|
||||
"slash_commands_enabled": "Увімкнути команди зі слеш",
|
||||
"slash_commands_description": "Якщо ввімкнено, команди редагування, такі як вставка розривів рядків або заголовків, можна перемикати, натискаючи `/`."
|
||||
},
|
||||
"table_view": {
|
||||
"new-row": "Новий рядок",
|
||||
|
||||
@@ -218,8 +218,8 @@ function SaveToNoteButton({ note }: FloatingButtonContext) {
|
||||
/>
|
||||
}
|
||||
|
||||
function RelationMapButtons({ note, triggerEvent }: FloatingButtonContext) {
|
||||
const isEnabled = (note.type === "relationMap");
|
||||
function RelationMapButtons({ note, isDefaultViewMode, triggerEvent }: FloatingButtonContext) {
|
||||
const isEnabled = (note.type === "relationMap" && isDefaultViewMode);
|
||||
return isEnabled && (
|
||||
<>
|
||||
<FloatingButton
|
||||
|
||||
@@ -18,7 +18,7 @@ dayjs.extend(isSameOrAfter);
|
||||
|
||||
const MONTHS = [
|
||||
t("calendar.january"),
|
||||
t("calendar.febuary"),
|
||||
t("calendar.february"),
|
||||
t("calendar.march"),
|
||||
t("calendar.april"),
|
||||
t("calendar.may"),
|
||||
|
||||
@@ -189,6 +189,7 @@ function useViewModeConfig<T extends object>(note: FNote | null | undefined, vie
|
||||
|
||||
useEffect(() => {
|
||||
if (!note || !viewType) return;
|
||||
setViewConfig(undefined);
|
||||
const viewStorage = new ViewModeStorage<T>(note, viewType);
|
||||
viewStorage.restore().then(config => {
|
||||
const storeFn = (config: T) => {
|
||||
|
||||
@@ -63,6 +63,14 @@ export default function Card({
|
||||
setBranchIdToEdit?.(branch.branchId);
|
||||
}, [ setBranchIdToEdit, branch ]);
|
||||
|
||||
const handleKeyDown = useCallback((e: KeyboardEvent) => {
|
||||
if (e.key === "Enter") {
|
||||
api.openNote(note.noteId);
|
||||
} else if (e.key === "F2") {
|
||||
setBranchIdToEdit?.(branch.branchId);
|
||||
}
|
||||
}, [ setBranchIdToEdit, note ]);
|
||||
|
||||
useEffect(() => {
|
||||
editorRef.current?.focus();
|
||||
}, [ isEditing ]);
|
||||
@@ -83,9 +91,11 @@ export default function Card({
|
||||
onDragEnd={handleDragEnd}
|
||||
onContextMenu={handleContextMenu}
|
||||
onClick={!isEditing ? handleOpen : undefined}
|
||||
onKeyDown={handleKeyDown}
|
||||
style={{
|
||||
display: !isVisible ? "none" : undefined
|
||||
}}
|
||||
tabIndex={300}
|
||||
>
|
||||
{!isEditing ? (
|
||||
<>
|
||||
|
||||
@@ -50,6 +50,12 @@ export default function Column({
|
||||
openColumnContextMenu(api, e, column);
|
||||
}, [ api, column ]);
|
||||
|
||||
const handleTitleKeyDown = useCallback((e: KeyboardEvent) => {
|
||||
if (e.key === "F2") {
|
||||
setColumnNameToEdit?.(column);
|
||||
}
|
||||
}, [ column ]);
|
||||
|
||||
/** Allow using mouse wheel to scroll inside card, while also maintaining column horizontal scrolling. */
|
||||
const handleScroll = useCallback((event: JSX.TargetedWheelEvent<HTMLDivElement>) => {
|
||||
const el = event.currentTarget;
|
||||
@@ -82,7 +88,6 @@ export default function Column({
|
||||
onDragOver={isAnyColumnDragging ? handleColumnDragOver : handleDragOver}
|
||||
onDragLeave={handleDragLeave}
|
||||
onDrop={handleDrop}
|
||||
onWheel={handleScroll}
|
||||
style={{
|
||||
display: !isVisible ? "none" : undefined
|
||||
}}
|
||||
@@ -93,6 +98,8 @@ export default function Column({
|
||||
onDragStart={handleColumnDragStart}
|
||||
onDragEnd={handleColumnDragEnd}
|
||||
onContextMenu={handleContextMenu}
|
||||
onKeyDown={handleTitleKeyDown}
|
||||
tabIndex={300}
|
||||
>
|
||||
{!isEditing ? (
|
||||
<>
|
||||
@@ -112,33 +119,35 @@ export default function Column({
|
||||
)}
|
||||
</h3>
|
||||
|
||||
{(columnItems ?? []).map(({ note, branch }, index) => {
|
||||
const showIndicatorBefore = dropPosition?.column === column &&
|
||||
dropPosition.index === index &&
|
||||
draggedCard?.noteId !== note.noteId;
|
||||
<div className="board-column-content" onWheel={handleScroll}>
|
||||
{(columnItems ?? []).map(({ note, branch }, index) => {
|
||||
const showIndicatorBefore = dropPosition?.column === column &&
|
||||
dropPosition.index === index &&
|
||||
draggedCard?.noteId !== note.noteId;
|
||||
|
||||
return (
|
||||
<>
|
||||
{showIndicatorBefore && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
<Card
|
||||
key={note.noteId}
|
||||
api={api}
|
||||
note={note}
|
||||
branch={branch}
|
||||
column={column}
|
||||
index={index}
|
||||
isDragging={draggedCard?.noteId === note.noteId}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
})}
|
||||
{dropPosition?.column === column && dropPosition.index === (columnItems?.length ?? 0) && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
return (
|
||||
<>
|
||||
{showIndicatorBefore && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
<Card
|
||||
key={note.noteId}
|
||||
api={api}
|
||||
note={note}
|
||||
branch={branch}
|
||||
column={column}
|
||||
index={index}
|
||||
isDragging={draggedCard?.noteId === note.noteId}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
})}
|
||||
{dropPosition?.column === column && dropPosition.index === (columnItems?.length ?? 0) && (
|
||||
<div className="board-drop-placeholder show" />
|
||||
)}
|
||||
|
||||
<AddNewItem api={api} column={column} />
|
||||
<AddNewItem api={api} column={column} />
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -146,11 +155,18 @@ export default function Column({
|
||||
function AddNewItem({ column, api }: { column: string, api: BoardApi }) {
|
||||
const [ isCreatingNewItem, setIsCreatingNewItem ] = useState(false);
|
||||
const addItemCallback = useCallback(() => setIsCreatingNewItem(true), []);
|
||||
const handleKeyDown = useCallback((e: KeyboardEvent) => {
|
||||
if (!isCreatingNewItem && e.key === "Enter") {
|
||||
setIsCreatingNewItem(true);
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`board-new-item ${isCreatingNewItem ? "editing" : ""}`}
|
||||
onClick={addItemCallback}
|
||||
onKeyDown={handleKeyDown}
|
||||
tabIndex={300}
|
||||
>
|
||||
{!isCreatingNewItem ? (
|
||||
<>
|
||||
|
||||
@@ -24,10 +24,13 @@
|
||||
border: 2px solid transparent;
|
||||
border-radius: 8px;
|
||||
padding: 0.5em;
|
||||
padding-bottom: 0;
|
||||
background-color: var(--accented-background-color);
|
||||
transition: border-color 0.2s ease;
|
||||
overflow-y: auto;
|
||||
max-height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.board-view-container .board-column.drag-over {
|
||||
@@ -37,7 +40,7 @@
|
||||
|
||||
.board-view-container .board-column h3 {
|
||||
font-size: 1em;
|
||||
margin-bottom: 0.75em;
|
||||
margin: 0;
|
||||
padding: 0.5em 0.5em 0.5em 0.5em;
|
||||
border-bottom: 1px solid var(--main-border-color);
|
||||
cursor: grab;
|
||||
@@ -98,6 +101,12 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.board-view-container .board-column > .board-column-content {
|
||||
flex-grow: 1;
|
||||
overflow: scroll;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
.board-view-container .board-column h3:hover .edit-icon,
|
||||
.board-view-container .board-note:hover .edit-icon {
|
||||
opacity: 1;
|
||||
@@ -121,6 +130,11 @@
|
||||
font-size: var(--card-font-size);
|
||||
}
|
||||
|
||||
.board-view-container :focus {
|
||||
outline: 3px solid var(--input-focus-outline-color);
|
||||
outline-offset: 0;
|
||||
}
|
||||
|
||||
.board-view-container .board-note {
|
||||
transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.15s ease, margin-top 0.2s ease;
|
||||
}
|
||||
|
||||
@@ -227,10 +227,12 @@ export function TitleEditor({ currentValue, placeholder, save, dismiss, multilin
|
||||
isNewItem?: boolean;
|
||||
}) {
|
||||
const inputRef = useRef<any>(null);
|
||||
const focusElRef = useRef<Element>(null);
|
||||
const dismissOnNextRefreshRef = useRef(false);
|
||||
const shouldDismiss = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
focusElRef.current = document.activeElement;
|
||||
inputRef.current?.focus();
|
||||
inputRef.current?.select();
|
||||
}, [ inputRef ]);
|
||||
@@ -254,8 +256,11 @@ export function TitleEditor({ currentValue, placeholder, save, dismiss, multilin
|
||||
onKeyDown={(e: TargetedKeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
||||
if (e.key === "Enter" || e.key === "Escape") {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
shouldDismiss.current = (e.key === "Escape");
|
||||
e.currentTarget.blur();
|
||||
if (focusElRef.current instanceof HTMLElement) {
|
||||
focusElRef.current.focus();
|
||||
}
|
||||
}
|
||||
}}
|
||||
onBlur={(newValue) => {
|
||||
|
||||
@@ -59,8 +59,8 @@ function ListNoteCard({ note, parentNote, expand, highlightedTokens }: { note: F
|
||||
const [ isExpanded, setExpanded ] = useState(expand);
|
||||
const notePath = getNotePath(parentNote, note);
|
||||
|
||||
// Reset expand state if switching to another note.
|
||||
useEffect(() => setExpanded(expand), [ note ]);
|
||||
// Reset expand state if switching to another note, or if user manually toggled expansion state.
|
||||
useEffect(() => setExpanded(expand), [ note, expand ]);
|
||||
|
||||
return (
|
||||
<div
|
||||
|
||||
@@ -30,7 +30,8 @@ const labelTypeMappings: Record<ColumnType, Partial<ColumnDefinition>> = {
|
||||
editor: "datetime"
|
||||
},
|
||||
number: {
|
||||
editor: "number"
|
||||
editor: "number",
|
||||
sorter: "number"
|
||||
},
|
||||
time: {
|
||||
editor: "input"
|
||||
|
||||
@@ -16,9 +16,10 @@ import useColTableEditing from "./col_editing";
|
||||
import AttributeDetailWidget from "../../attribute_widgets/attribute_detail";
|
||||
import attributes from "../../../services/attributes";
|
||||
import { RefObject } from "preact";
|
||||
import SpacedUpdate from "../../../services/spaced_update";
|
||||
|
||||
interface TableConfig {
|
||||
tableData?: {
|
||||
tableData: {
|
||||
columns?: ColumnDefinition[];
|
||||
};
|
||||
}
|
||||
@@ -53,12 +54,12 @@ export default function TableView({ note, noteIds, notePath, viewConfig, saveCon
|
||||
|
||||
return (
|
||||
<div className="table-view">
|
||||
{columnDefs && (
|
||||
{rowData !== undefined && persistenceProps && (
|
||||
<>
|
||||
<Tabulator
|
||||
tabulatorRef={tabulatorRef}
|
||||
className="table-view-container"
|
||||
columns={columnDefs}
|
||||
columns={columnDefs ?? []}
|
||||
data={rowData}
|
||||
modules={[ SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule, DataTreeModule ]}
|
||||
footerElement={<TableFooter note={note} />}
|
||||
@@ -94,23 +95,31 @@ function TableFooter({ note }: { note: FNote }) {
|
||||
)
|
||||
}
|
||||
|
||||
function usePersistence(initialConfig: TableConfig | null | undefined, saveConfig: (newConfig: TableConfig) => void) {
|
||||
const config = useRef<TableConfig | null | undefined>(initialConfig);
|
||||
const spacedUpdate = useSpacedUpdate(() => {
|
||||
if (config.current) {
|
||||
saveConfig(config.current);
|
||||
}
|
||||
}, 5_000);
|
||||
const persistenceWriterFunc = useCallback((_id, type: string, data: object) => {
|
||||
if (!config.current) config.current = {};
|
||||
if (!config.current.tableData) config.current.tableData = {};
|
||||
(config.current.tableData as Record<string, {}>)[type] = data;
|
||||
spacedUpdate.scheduleUpdate();
|
||||
}, []);
|
||||
const persistenceReaderFunc = useCallback((_id, type: string) => {
|
||||
return config.current?.tableData?.[type];
|
||||
}, []);
|
||||
return { persistenceReaderFunc, persistenceWriterFunc };
|
||||
function usePersistence(viewConfig: TableConfig | null | undefined, saveConfig: (newConfig: TableConfig) => void) {
|
||||
const [ persistenceProps, setPersistenceProps ] = useState<Pick<Options, "persistenceReaderFunc" | "persistenceWriterFunc">>();
|
||||
|
||||
useEffect(() => {
|
||||
const viewConfigLocal = viewConfig ?? { tableData: {} };
|
||||
const spacedUpdate = new SpacedUpdate(() => {
|
||||
saveConfig(viewConfigLocal);
|
||||
}, 5_000);
|
||||
|
||||
setPersistenceProps({
|
||||
persistenceReaderFunc(_, type) {
|
||||
return viewConfigLocal.tableData?.[type];
|
||||
},
|
||||
persistenceWriterFunc(_, type, data) {
|
||||
(viewConfigLocal.tableData as Record<string, {}>)[type] = data;
|
||||
spacedUpdate.scheduleUpdate();
|
||||
},
|
||||
});
|
||||
|
||||
return () => {
|
||||
spacedUpdate.updateNowIfNecessary();
|
||||
};
|
||||
}, [ viewConfig, saveConfig ])
|
||||
|
||||
return persistenceProps;
|
||||
}
|
||||
|
||||
function useData(note: FNote, noteIds: string[], viewConfig: TableConfig | undefined, newAttributePosition: RefObject<number | undefined>, resetNewAttributePosition: () => void) {
|
||||
@@ -125,6 +134,7 @@ function useData(note: FNote, noteIds: string[], viewConfig: TableConfig | undef
|
||||
|
||||
function refresh() {
|
||||
const info = getAttributeDefinitionInformation(note);
|
||||
|
||||
buildRowDefinitions(note, info, includeArchived, maxDepth).then(({ definitions: rowData, hasSubtree: hasChildren, rowNumber }) => {
|
||||
const columnDefs = buildColumnDefinitions({
|
||||
info,
|
||||
|
||||
@@ -16,7 +16,7 @@ interface TableProps<T> extends Omit<Options, "data" | "footerElement" | "index"
|
||||
footerElement?: string | HTMLElement | JSX.Element;
|
||||
}
|
||||
|
||||
export default function Tabulator<T>({ className, columns, data, modules, tabulatorRef: externalTabulatorRef, footerElement, events, index, ...restProps }: TableProps<T>) {
|
||||
export default function Tabulator<T>({ className, columns, data, modules, tabulatorRef: externalTabulatorRef, footerElement, events, index, dataTree, ...restProps }: TableProps<T>) {
|
||||
const parentComponent = useContext(ParentComponent);
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const tabulatorRef = useRef<VanillaTabulator>(null);
|
||||
@@ -36,6 +36,7 @@ export default function Tabulator<T>({ className, columns, data, modules, tabula
|
||||
data,
|
||||
footerElement: (parentComponent && isValidElement(footerElement) ? renderReactWidget(parentComponent, footerElement)[0] : undefined),
|
||||
index: index as string | number | undefined,
|
||||
dataTree,
|
||||
...restProps
|
||||
});
|
||||
|
||||
@@ -45,7 +46,7 @@ export default function Tabulator<T>({ className, columns, data, modules, tabula
|
||||
});
|
||||
|
||||
return () => tabulator.destroy();
|
||||
}, []);
|
||||
}, [ dataTree ] );
|
||||
|
||||
useEffect(() => {
|
||||
const tabulator = tabulatorRef.current;
|
||||
|
||||
@@ -22,6 +22,7 @@ export default function AddLinkDialog() {
|
||||
const [ linkType, setLinkType ] = useState<LinkType>(hasSelection ? "hyper-link" : "reference-link");
|
||||
const [ suggestion, setSuggestion ] = useState<Suggestion | null>(null);
|
||||
const [ shown, setShown ] = useState(false);
|
||||
const hasSubmittedRef = useRef(false);
|
||||
|
||||
useTriliumEvent("showAddLinkDialog", ( { textTypeWidget, text }) => {
|
||||
setTextTypeWidget(textTypeWidget);
|
||||
@@ -83,14 +84,11 @@ export default function AddLinkDialog() {
|
||||
}
|
||||
|
||||
function onSubmit() {
|
||||
if (suggestion?.notePath) {
|
||||
// Handle note link
|
||||
hasSubmittedRef.current = true;
|
||||
|
||||
if (suggestion) {
|
||||
// Insertion logic in onHidden because it needs focus.
|
||||
setShown(false);
|
||||
textTypeWidget?.addLink(suggestion.notePath, linkType === "reference-link" ? null : linkTitle);
|
||||
} else if (suggestion?.externalLink) {
|
||||
// Handle external link
|
||||
setShown(false);
|
||||
textTypeWidget?.addLink(suggestion.externalLink, linkTitle, true);
|
||||
} else {
|
||||
logError("No link to add.");
|
||||
}
|
||||
@@ -109,6 +107,19 @@ export default function AddLinkDialog() {
|
||||
onSubmit={onSubmit}
|
||||
onShown={onShown}
|
||||
onHidden={() => {
|
||||
// Insert the link.
|
||||
if (hasSubmittedRef.current && suggestion && textTypeWidget) {
|
||||
hasSubmittedRef.current = false;
|
||||
|
||||
if (suggestion.notePath) {
|
||||
// Handle note link
|
||||
textTypeWidget.addLink(suggestion.notePath, linkType === "reference-link" ? null : linkTitle);
|
||||
} else if (suggestion.externalLink) {
|
||||
// Handle external link
|
||||
textTypeWidget.addLink(suggestion.externalLink, linkTitle, true);
|
||||
}
|
||||
}
|
||||
|
||||
setSuggestion(null);
|
||||
setShown(false);
|
||||
}}
|
||||
|
||||
@@ -136,7 +136,7 @@ ws.subscribeToMessages(async (message) => {
|
||||
id: id,
|
||||
title: t("export.export_status"),
|
||||
message: message,
|
||||
icon: "arrow-square-up-right"
|
||||
icon: "export"
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ export default class NoteDetailWidget extends NoteContextAwareWidget {
|
||||
// https://github.com/zadam/trilium/issues/2522
|
||||
const isBackendNote = this.noteContext?.noteId === "_backendLog";
|
||||
const isSqlNote = this.mime === "text/x-sqlite;schema=trilium";
|
||||
const isFullHeightNoteType = ["canvas", "webView", "noteMap", "mindMap", "mermaid", "file"].includes(this.type ?? "");
|
||||
const isFullHeightNoteType = ["canvas", "webView", "noteMap", "mindMap", "mermaid", "file", "aiChat"].includes(this.type ?? "");
|
||||
const isFullHeight = (!this.noteContext?.hasNoteList() && isFullHeightNoteType && !isSqlNote)
|
||||
|| this.noteContext?.viewScope?.viewMode === "attachments"
|
||||
|| isBackendNote;
|
||||
|
||||
@@ -14,17 +14,20 @@ export default function HelpRemoveButtons({ help, removeText, onRemove }: HelpRe
|
||||
{help && <>
|
||||
<Dropdown
|
||||
className="help-dropdown"
|
||||
buttonClassName="bx bx-help-circle icon-action"
|
||||
buttonClassName="bx bx-help-circle icon-action"
|
||||
hideToggleArrow
|
||||
>{help}</Dropdown>
|
||||
{" "}
|
||||
</>}
|
||||
</>}
|
||||
<ActionButton
|
||||
icon="bx bx-x"
|
||||
className="search-option-del"
|
||||
text={removeText ?? ""}
|
||||
onClick={onRemove}
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
onRemove?.();
|
||||
}}
|
||||
/>
|
||||
</td>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,9 +36,9 @@ interface ModalProps {
|
||||
onSubmit?: () => void;
|
||||
/** Called when the modal is shown. */
|
||||
onShown?: () => void;
|
||||
/**
|
||||
/**
|
||||
* Called when the modal is hidden, either via close button, backdrop click or submit.
|
||||
*
|
||||
*
|
||||
* Here it's generally a good idea to set `show` to false to reflect the actual state of the modal.
|
||||
*/
|
||||
onHidden: () => void;
|
||||
@@ -71,23 +71,25 @@ export default function Modal({ children, className, size, title, header, footer
|
||||
|
||||
useEffect(() => {
|
||||
const modalElement = modalRef.current;
|
||||
if (!modalElement) {
|
||||
return;
|
||||
}
|
||||
if (!modalElement) return;
|
||||
|
||||
if (onShown) {
|
||||
modalElement.addEventListener("shown.bs.modal", onShown);
|
||||
}
|
||||
modalElement.addEventListener("hidden.bs.modal", () => {
|
||||
|
||||
function onModalHidden() {
|
||||
onHidden();
|
||||
if (elementToFocus.current && "focus" in elementToFocus.current) {
|
||||
(elementToFocus.current as HTMLElement).focus();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
modalElement.addEventListener("hidden.bs.modal", onModalHidden);
|
||||
return () => {
|
||||
if (onShown) {
|
||||
modalElement.removeEventListener("shown.bs.modal", onShown);
|
||||
}
|
||||
modalElement.removeEventListener("hidden.bs.modal", onHidden);
|
||||
modalElement.removeEventListener("hidden.bs.modal", onModalHidden);
|
||||
};
|
||||
}, [ onShown, onHidden ]);
|
||||
|
||||
@@ -180,4 +182,4 @@ const ModalInner = memo(({ children, footer, footerAlignment, bodyStyle, footerS
|
||||
)}
|
||||
</>
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -19,6 +19,7 @@ import Mark from "mark.js";
|
||||
import { DragData } from "../note_tree";
|
||||
import Component from "../../components/component";
|
||||
import toast, { ToastOptions } from "../../services/toast";
|
||||
import { ViewMode } from "../../services/link";
|
||||
|
||||
export function useTriliumEvent<T extends EventNames>(eventName: T, handler: (data: EventData<T>) => void) {
|
||||
const parentComponent = useContext(ParentComponent);
|
||||
@@ -196,6 +197,7 @@ export function useNoteContext() {
|
||||
const [ noteContext, setNoteContext ] = useState<NoteContext>();
|
||||
const [ notePath, setNotePath ] = useState<string | null | undefined>();
|
||||
const [ note, setNote ] = useState<FNote | null | undefined>();
|
||||
const [ , setViewMode ] = useState<ViewMode>();
|
||||
const [ refreshCounter, setRefreshCounter ] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
@@ -205,6 +207,7 @@ export function useNoteContext() {
|
||||
useTriliumEvents([ "setNoteContext", "activeContextChanged", "noteSwitchedAndActivated", "noteSwitched" ], ({ noteContext }) => {
|
||||
setNoteContext(noteContext);
|
||||
setNotePath(noteContext.notePath);
|
||||
setViewMode(noteContext.viewScope?.viewMode);
|
||||
});
|
||||
useTriliumEvent("frocaReloaded", () => {
|
||||
setNote(noteContext?.note);
|
||||
|
||||
@@ -51,6 +51,7 @@ const TAB_CONFIGURATION = numberObjectsInPlace<TabConfiguration>([
|
||||
show: ({ note }) => note?.type === "text" && options.get("textNoteEditorType") === "ckeditor-classic",
|
||||
toggleCommand: "toggleRibbonTabClassicEditor",
|
||||
content: FormattingToolbar,
|
||||
activate: true,
|
||||
stayInDom: true
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import TypeWidget from "./type_widget.js";
|
||||
import appContext, { type EventData } from "../../components/app_context.js";
|
||||
import froca from "../../services/froca.js";
|
||||
import linkService from "../../services/link.js";
|
||||
import linkService, { type ViewScope } from "../../services/link.js";
|
||||
import contentRenderer from "../../services/content_renderer.js";
|
||||
import utils from "../../services/utils.js";
|
||||
import options from "../../services/options.js";
|
||||
@@ -44,14 +44,14 @@ export default class AbstractTextTypeWidget extends TypeWidget {
|
||||
async openImageInNewTab($img: JQuery<HTMLElement>, activate: boolean = false) {
|
||||
const parsedImage = await this.parseFromImage($img);
|
||||
|
||||
if (parsedImage) {
|
||||
if (parsedImage?.noteId) {
|
||||
appContext.tabManager.openTabWithNoteWithHoisting(parsedImage.noteId, { activate, viewScope: parsedImage.viewScope });
|
||||
} else {
|
||||
window.open($img.prop("src"), "_blank");
|
||||
}
|
||||
}
|
||||
|
||||
async parseFromImage($img: JQuery<HTMLElement>) {
|
||||
async parseFromImage($img: JQuery<HTMLElement>): Promise<{ noteId?: string, viewScope: ViewScope } | null> {
|
||||
const imgSrc = $img.prop("src");
|
||||
|
||||
const imageNoteMatch = imgSrc.match(/\/api\/images\/([A-Za-z0-9_]+)\//);
|
||||
|
||||
@@ -27,11 +27,11 @@
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
user-select: none;
|
||||
scrollbar-width: 0 !important;
|
||||
}
|
||||
|
||||
.classic-toolbar-widget::-webkit-scrollbar {
|
||||
.classic-toolbar-widget::-webkit-scrollbar:horizontal {
|
||||
height: 0 !important;
|
||||
width: 0 !important;
|
||||
}
|
||||
|
||||
.classic-toolbar-widget.dropdown-active {
|
||||
|
||||
@@ -90,6 +90,7 @@ export default function AppearanceSettings() {
|
||||
{isElectron() && <ElectronIntegration /> }
|
||||
<Performance />
|
||||
<MaxContentWidth />
|
||||
<RibbonOptions />
|
||||
<RelatedSettings items={[
|
||||
{
|
||||
title: t("settings_appearance.related_code_blocks"),
|
||||
@@ -305,3 +306,16 @@ function MaxContentWidth() {
|
||||
</OptionsSection>
|
||||
)
|
||||
}
|
||||
|
||||
function RibbonOptions() {
|
||||
const [ editedNotesOpenInRibbon, setEditedNotesOpenInRibbon ] = useTriliumOptionBool("editedNotesOpenInRibbon");
|
||||
|
||||
return (
|
||||
<OptionsSection title={t('ribbon.widgets')}>
|
||||
<FormCheckbox
|
||||
label={t('ribbon.edited_notes_message')}
|
||||
currentValue={editedNotesOpenInRibbon} onChange={setEditedNotesOpenInRibbon}
|
||||
/>
|
||||
</OptionsSection>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -45,14 +45,4 @@ export default class ReadOnlyCodeTypeWidget extends AbstractCodeTypeWidget {
|
||||
readOnly: true
|
||||
};
|
||||
}
|
||||
|
||||
async executeWithContentElementEvent({ resolve, ntxId }: EventData<"executeWithContentElement">) {
|
||||
if (!this.isNoteContext(ntxId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this.initialized;
|
||||
|
||||
resolve(this.$editor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,12 @@ import utils from "../../services/utils.js";
|
||||
|
||||
const TPL = /*html*/`
|
||||
<div class="note-detail-web-view note-detail-printable" style="height: 100%">
|
||||
<style>
|
||||
.note-detail-web-view-content {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
<div class="note-detail-web-view-help alert alert-warning" style="margin: 50px; padding: 20px 20px 0px 20px;">
|
||||
<h4>${t("web_view.web_view")}</h4>
|
||||
|
||||
@@ -40,8 +46,6 @@ export default class WebViewTypeWidget extends TypeWidget {
|
||||
this.$noteDetailWebViewHelp = this.$widget.find(".note-detail-web-view-help");
|
||||
this.$noteDetailWebViewContent = this.$widget.find(".note-detail-web-view-content");
|
||||
|
||||
window.addEventListener("resize", () => this.setDimensions(), false);
|
||||
|
||||
super.doRender();
|
||||
}
|
||||
|
||||
@@ -62,24 +66,12 @@ export default class WebViewTypeWidget extends TypeWidget {
|
||||
this.$noteDetailWebViewContent.hide();
|
||||
this.$noteDetailWebViewHelp.show();
|
||||
}
|
||||
|
||||
this.setDimensions();
|
||||
|
||||
setTimeout(() => this.setDimensions(), 1000);
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
this.$noteDetailWebViewContent.removeAttr("src");
|
||||
}
|
||||
|
||||
setDimensions() {
|
||||
const $parent = this.$widget;
|
||||
|
||||
this.$noteDetailWebViewContent
|
||||
.height($parent.height() ?? 0)
|
||||
.width($parent.width() ?? 0);
|
||||
}
|
||||
|
||||
entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) {
|
||||
if (loadResults.getAttributeRows().find((attr) => attr.name === "webViewSrc" && attributeService.isAffecting(attr, this.noteContext?.note))) {
|
||||
this.refresh();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"lib": [ "ESNext" ],
|
||||
"lib": [ "ESNext", "DOM.Iterable" ],
|
||||
"outDir": "dist",
|
||||
"types": [
|
||||
"node",
|
||||
|
||||
@@ -114,7 +114,7 @@ const config: ForgeConfig = {
|
||||
config: {
|
||||
name: EXECUTABLE_NAME,
|
||||
productName: PRODUCT_NAME,
|
||||
iconUrl: "https://raw.githubusercontent.com/TriliumNext/Notes/develop/images/app-icons/icon.ico",
|
||||
iconUrl: "https://raw.githubusercontent.com/TriliumNext/Trilium/refs/heads/main/apps/desktop/electron-forge/app-icon/icon.ico",
|
||||
setupIcon: path.join(ELECTRON_FORGE_DIR, "setup-icon/setup.ico"),
|
||||
loadingGif: path.join(ELECTRON_FORGE_DIR, "setup-icon/setup-banner.gif"),
|
||||
windowsSign: windowsSignConfiguration
|
||||
@@ -130,7 +130,7 @@ const config: ForgeConfig = {
|
||||
name: "@electron-forge/maker-zip",
|
||||
config: {
|
||||
options: {
|
||||
iconUrl: "https://raw.githubusercontent.com/TriliumNext/Notes/develop/images/app-icons/icon.ico",
|
||||
iconUrl: "https://raw.githubusercontent.com/TriliumNext/Trilium/refs/heads/main/apps/desktop/electron-forge/app-icon/icon.ico",
|
||||
icon: path.join(APP_ICON_PATH, "icon.ico")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/desktop",
|
||||
"version": "0.99.0",
|
||||
"version": "0.99.1",
|
||||
"description": "Build your personal knowledge base with Trilium Notes",
|
||||
"private": true,
|
||||
"main": "src/main.ts",
|
||||
@@ -8,7 +8,7 @@
|
||||
"author": {
|
||||
"name": "Trilium Notes Team",
|
||||
"email": "contact@eliandoran.me",
|
||||
"url": "https://github.com/TriliumNext/Notes"
|
||||
"url": "https://triliumnotes.org"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "cross-env TRILIUM_PORT=37742 TRILIUM_DATA_DIR=data tsx ../../scripts/electron-start.mts src/main.ts",
|
||||
@@ -22,7 +22,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@electron/remote": "2.1.3",
|
||||
"better-sqlite3": "^12.0.0",
|
||||
"better-sqlite3": "12.4.1",
|
||||
"electron-debug": "4.1.0",
|
||||
"electron-dl": "4.0.0",
|
||||
"electron-squirrel-startup": "1.0.1",
|
||||
@@ -34,7 +34,7 @@
|
||||
"@triliumnext/commons": "workspace:*",
|
||||
"@triliumnext/server": "workspace:*",
|
||||
"copy-webpack-plugin": "13.0.1",
|
||||
"electron": "37.5.1",
|
||||
"electron": "38.2.1",
|
||||
"@electron-forge/cli": "7.9.0",
|
||||
"@electron-forge/maker-deb": "7.9.0",
|
||||
"@electron-forge/maker-dmg": "7.9.0",
|
||||
@@ -43,6 +43,6 @@
|
||||
"@electron-forge/maker-squirrel": "7.9.0",
|
||||
"@electron-forge/maker-zip": "7.9.0",
|
||||
"@electron-forge/plugin-auto-unpack-natives": "7.9.0",
|
||||
"prebuild-install": "^7.1.1"
|
||||
"prebuild-install": "7.1.3"
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,6 @@ async function main() {
|
||||
|
||||
// Copy node modules dependencies
|
||||
build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path", "@electron/remote" ]);
|
||||
build.copy("/node_modules/jsdom/lib/jsdom/living/xhr/xhr-sync-worker.js", "xhr-sync-worker.js");
|
||||
build.copy("/node_modules/ckeditor5/dist/ckeditor5-content.css", "ckeditor5-content.css");
|
||||
|
||||
// Integrate the client.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"files": [],
|
||||
"include": [],
|
||||
"include": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "../server"
|
||||
|
||||
@@ -4,16 +4,16 @@
|
||||
"description": "Standalone tool to dump contents of Trilium document.db file into a directory tree of notes",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"better-sqlite3": "^12.0.0",
|
||||
"mime-types": "^3.0.0",
|
||||
"sanitize-filename": "^1.6.3",
|
||||
"tsx": "^4.19.3",
|
||||
"yargs": "^18.0.0"
|
||||
"better-sqlite3": "12.4.1",
|
||||
"mime-types": "3.0.1",
|
||||
"sanitize-filename": "1.6.3",
|
||||
"tsx": "4.20.6",
|
||||
"yargs": "18.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/better-sqlite3": "^7.6.11",
|
||||
"@types/mime-types": "^3.0.0",
|
||||
"@types/yargs": "^17.0.33"
|
||||
"@types/better-sqlite3": "7.6.13",
|
||||
"@types/mime-types": "3.0.1",
|
||||
"@types/yargs": "17.0.33"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "tsx src/main.ts",
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
"description": "Desktop version of Trilium which imports the demo database (presented to new users at start-up) or the user guide and other documentation and saves the modifications for committing.",
|
||||
"dependencies": {
|
||||
"archiver": "7.0.1",
|
||||
"better-sqlite3": "^12.0.0"
|
||||
"better-sqlite3": "12.4.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@triliumnext/client": "workspace:*",
|
||||
"@triliumnext/desktop": "workspace:*",
|
||||
"@types/fs-extra": "11.0.4",
|
||||
"copy-webpack-plugin": "13.0.1",
|
||||
"electron": "37.5.1",
|
||||
"electron": "38.2.1",
|
||||
"fs-extra": "11.3.2"
|
||||
},
|
||||
"scripts": {
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
"e2e": "playwright test"
|
||||
},
|
||||
"devDependencies": {
|
||||
"dotenv": "17.2.2"
|
||||
"dotenv": "17.2.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:22.19.0-bullseye-slim AS builder
|
||||
FROM node:22.20.0-bullseye-slim AS builder
|
||||
RUN corepack enable
|
||||
|
||||
# Install native dependencies since we might be building cross-platform.
|
||||
@@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||
|
||||
FROM node:22.19.0-bullseye-slim
|
||||
FROM node:22.20.0-bullseye-slim
|
||||
# Install only runtime dependencies
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:22.19.0-alpine AS builder
|
||||
FROM node:22.20.0-alpine AS builder
|
||||
RUN corepack enable
|
||||
|
||||
# Install native dependencies since we might be building cross-platform.
|
||||
@@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||
|
||||
FROM node:22.19.0-alpine
|
||||
FROM node:22.20.0-alpine
|
||||
# Install runtime dependencies
|
||||
RUN apk add --no-cache su-exec shadow
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:22.19.0-alpine AS builder
|
||||
FROM node:22.20.0-alpine AS builder
|
||||
RUN corepack enable
|
||||
|
||||
# Install native dependencies since we might be building cross-platform.
|
||||
@@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||
|
||||
FROM node:22.19.0-alpine
|
||||
FROM node:22.20.0-alpine
|
||||
# Create a non-root user with configurable UID/GID
|
||||
ARG USER=trilium
|
||||
ARG UID=1001
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
FROM node:22.19.0-bullseye-slim AS builder
|
||||
FROM node:22.20.0-bullseye-slim AS builder
|
||||
RUN corepack enable
|
||||
|
||||
# Install native dependencies since we might be building cross-platform.
|
||||
@@ -7,7 +7,7 @@ COPY ./docker/package.json ./docker/pnpm-workspace.yaml /usr/src/app/
|
||||
# We have to use --no-frozen-lockfile due to CKEditor patches
|
||||
RUN pnpm install --no-frozen-lockfile --prod && pnpm rebuild
|
||||
|
||||
FROM node:22.19.0-bullseye-slim
|
||||
FROM node:22.20.0-bullseye-slim
|
||||
# Create a non-root user with configurable UID/GID
|
||||
ARG USER=trilium
|
||||
ARG UID=1001
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"better-sqlite3": "12.2.0"
|
||||
"better-sqlite3": "12.4.1"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@triliumnext/server",
|
||||
"version": "0.99.0",
|
||||
"version": "0.99.1",
|
||||
"description": "The server-side component of TriliumNext, which exposes the client via the web, allows for sync and provides a REST API for both internal and external use.",
|
||||
"private": true,
|
||||
"main": "./src/main.ts",
|
||||
@@ -25,10 +25,11 @@
|
||||
"docker-start-rootless-alpine": "pnpm docker-build-rootless-alpine && docker run -p 8081:8080 triliumnext-rootless-alpine"
|
||||
},
|
||||
"dependencies": {
|
||||
"better-sqlite3": "12.2.0"
|
||||
"better-sqlite3": "12.4.1",
|
||||
"node-html-parser": "7.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@anthropic-ai/sdk": "0.63.0",
|
||||
"@anthropic-ai/sdk": "0.65.0",
|
||||
"@braintree/sanitize-url": "7.1.1",
|
||||
"@electron/remote": "2.1.3",
|
||||
"@preact/preset-vite": "2.10.2",
|
||||
@@ -49,14 +50,13 @@
|
||||
"@types/html": "1.0.4",
|
||||
"@types/ini": "4.1.1",
|
||||
"@types/js-yaml": "4.0.9",
|
||||
"@types/jsdom": "21.1.7",
|
||||
"@types/mime-types": "3.0.1",
|
||||
"@types/multer": "2.0.0",
|
||||
"@types/safe-compare": "1.1.2",
|
||||
"@types/sanitize-html": "2.16.0",
|
||||
"@types/sax": "1.2.7",
|
||||
"@types/serve-favicon": "2.5.7",
|
||||
"@types/serve-static": "1.15.8",
|
||||
"@types/serve-static": "1.15.9",
|
||||
"@types/session-file-store": "1.2.5",
|
||||
"@types/stream-throttle": "0.1.4",
|
||||
"@types/supertest": "6.0.3",
|
||||
@@ -81,13 +81,13 @@
|
||||
"debounce": "2.2.0",
|
||||
"debug": "4.4.3",
|
||||
"ejs": "3.1.10",
|
||||
"electron": "37.5.1",
|
||||
"electron": "38.2.1",
|
||||
"electron-debug": "4.1.0",
|
||||
"electron-window-state": "5.0.3",
|
||||
"escape-html": "1.0.3",
|
||||
"express": "5.1.0",
|
||||
"express-http-proxy": "2.1.2",
|
||||
"express-openid-connect": "^2.17.1",
|
||||
"express-openid-connect": "2.19.2",
|
||||
"express-rate-limit": "8.1.0",
|
||||
"express-session": "1.18.2",
|
||||
"file-uri-to-path": "2.0.0",
|
||||
@@ -97,7 +97,7 @@
|
||||
"html2plaintext": "2.1.4",
|
||||
"http-proxy-agent": "7.0.2",
|
||||
"https-proxy-agent": "7.0.6",
|
||||
"i18next": "25.5.2",
|
||||
"i18next": "25.5.3",
|
||||
"i18next-fs-backend": "2.6.0",
|
||||
"image-type": "6.0.0",
|
||||
"ini": "5.0.0",
|
||||
@@ -105,13 +105,12 @@
|
||||
"is-svg": "6.1.0",
|
||||
"jimp": "1.6.0",
|
||||
"js-yaml": "4.1.0",
|
||||
"jsdom": "26.1.0",
|
||||
"marked": "16.3.0",
|
||||
"mime-types": "3.0.1",
|
||||
"multer": "2.0.2",
|
||||
"normalize-strings": "1.1.1",
|
||||
"ollama": "0.5.18",
|
||||
"openai": "5.12.0",
|
||||
"ollama": "0.6.0",
|
||||
"openai": "6.1.0",
|
||||
"rand-token": "1.0.1",
|
||||
"safe-compare": "1.1.4",
|
||||
"sanitize-filename": "1.6.3",
|
||||
@@ -124,11 +123,11 @@
|
||||
"supertest": "7.1.4",
|
||||
"swagger-jsdoc": "6.2.8",
|
||||
"swagger-ui-express": "5.0.1",
|
||||
"time2fa": "^1.3.0",
|
||||
"time2fa": "1.4.2",
|
||||
"tmp": "0.2.5",
|
||||
"turndown": "7.2.1",
|
||||
"unescape": "1.0.1",
|
||||
"vite": "^7.1.3",
|
||||
"vite": "7.1.9",
|
||||
"ws": "8.18.3",
|
||||
"xml2js": "0.6.2",
|
||||
"yauzl": "3.2.0"
|
||||
|
||||
@@ -11,7 +11,6 @@ async function main() {
|
||||
|
||||
// Copy node modules dependencies
|
||||
build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path" ]);
|
||||
build.copy("/node_modules/jsdom/lib/jsdom/living/xhr/xhr-sync-worker.js", "xhr-sync-worker.js");
|
||||
build.copy("/node_modules/ckeditor5/dist/ckeditor5-content.css", "ckeditor5-content.css");
|
||||
|
||||
// Integrate the client.
|
||||
|
||||
2
apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json
generated
vendored
@@ -116,6 +116,13 @@ class="admonition tip">
|
||||
<td>JavaScript note which will be injected into the share page. JS note must
|
||||
be in the shared sub-tree as well. Consider using <code>share_hidden_from_tree</code>.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>shareHtml</code>
|
||||
</td>
|
||||
<td>HTML note which will be injected into the share page at locations specified
|
||||
by the <code>shareHtmlLocation</code> label. HTML note must be in the shared
|
||||
sub-tree as well. Consider using <code>share_hidden_from_tree</code>.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>shareTemplate</code>
|
||||
</td>
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
<p>Trilium supports configuration via a file named <code>config.ini</code> and
|
||||
environment variables. This document provides a comprehensive reference
|
||||
for all configuration options.</p>
|
||||
<h2>Location of the configuration file</h2>
|
||||
<p>The configuration file is not located in the same directory as the application.
|
||||
Instead, the <code>config.ini</code> is located in the <a class="reference-link"
|
||||
href="#root/_help_tAassRL4RSQL">Data directory</a>. As such, the configuration
|
||||
file is only available after starting the application and creating a database.</p>
|
||||
<h2>Configuration Precedence</h2>
|
||||
<p>Configuration values are loaded in the following order of precedence (highest
|
||||
to lowest):</p>
|
||||
|
||||
118
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html
generated
vendored
@@ -38,16 +38,17 @@ class="image">
|
||||
</th>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Table of contents.</li>
|
||||
<li>Syntax highlight of code blocks, provided a language is selected (does
|
||||
<li data-list-item-id="e26b4ce9ba4e9dfe224d04e0f341925ed">Table of contents.</li>
|
||||
<li data-list-item-id="e9707fdfa2c92d66690cf932f7e647253">Syntax highlight of code blocks, provided a language is selected (does
|
||||
not work if “Auto-detected” is enabled).</li>
|
||||
<li>Rendering for math equations.</li>
|
||||
<li data-list-item-id="e84420a10c6d64bd107edb6e867c91d4b">Rendering for math equations.</li>
|
||||
<li data-list-item-id="e10834dcd0619d77ae2e94d3695bedf58"><a href="#root/_help_nBAXQFj20hS1">Including notes</a> (only if the included
|
||||
notes are also shared).</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Including notes is not supported.</li>
|
||||
<li>Inline Mermaid diagrams are not rendered.</li>
|
||||
<li data-list-item-id="e41cc4139377f9f88d653d1eb8ca47bb4">Inline Mermaid diagrams are not rendered.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -56,12 +57,12 @@ class="image">
|
||||
</th>
|
||||
<td>
|
||||
<ul>
|
||||
<li>Basic support (displaying the contents of the note in a monospace font).</li>
|
||||
<li data-list-item-id="e291ae6d5130677b4c99f7c3bdbe974b4">Basic support (displaying the contents of the note in a monospace font).</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>No syntax highlight.</li>
|
||||
<li data-list-item-id="e0270680bbdd7a129306e61e11691e36d">No syntax highlight.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -94,12 +95,12 @@ class="image">
|
||||
</th>
|
||||
<td>
|
||||
<ul>
|
||||
<li>The child notes are displayed in a fixed format. </li>
|
||||
<li data-list-item-id="ea031e1d4149eb443ace756234490c5a4">The child notes are displayed in a fixed format. </li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>More advanced view types such as the calendar view are not supported.</li>
|
||||
<li data-list-item-id="ea4a9d424aec2afbaecc07bbf64b7bebd">More advanced view types such as the calendar view are not supported.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -108,12 +109,12 @@ class="image">
|
||||
</th>
|
||||
<td>
|
||||
<ul>
|
||||
<li>The diagram is displayed as a vector image.</li>
|
||||
<li data-list-item-id="e582d283f2b1b30cbe5ae35d8e01b2bf2">The diagram is displayed as a vector image.</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>No further interaction supported.</li>
|
||||
<li data-list-item-id="e33268686446e3c217077201bb5964364">No further interaction supported.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -122,12 +123,12 @@ class="image">
|
||||
</th>
|
||||
<td>
|
||||
<ul>
|
||||
<li>The diagram is displayed as a vector image.</li>
|
||||
<li data-list-item-id="e443dd0e97c30cb12c77e8906a71569ea">The diagram is displayed as a vector image.</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>No further interaction supported.</li>
|
||||
<li data-list-item-id="efe151ef3f3826c825416417525fb5fb2">No further interaction supported.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -143,7 +144,7 @@ class="image">
|
||||
<td>The diagram is displayed as a vector image.</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>No further interaction supported.</li>
|
||||
<li data-list-item-id="ed3b4fb473042f6e32b4502d4fa11a767">No further interaction supported.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -159,7 +160,7 @@ class="image">
|
||||
<td>Basic interaction (downloading the file).</td>
|
||||
<td>
|
||||
<ul>
|
||||
<li>No further interaction supported.</li>
|
||||
<li data-list-item-id="ed87e836a39d127ebcbb33e9e59045afb">No further interaction supported.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -178,7 +179,7 @@ class="image">
|
||||
<p>To use the sharing feature, you must have a <a class="reference-link"
|
||||
href="#root/_help_WOcw2SLH6tbX">Server Installation</a> of Trilium.
|
||||
This is necessary because the notes will be hosted from the server.</p>
|
||||
<h2>How to Share a Note</h2>
|
||||
<h2>Sharing a note</h2>
|
||||
<ol>
|
||||
<li>
|
||||
<p><strong>Enable Sharing</strong>: To share a note, toggle the <code>Shared</code> switch
|
||||
@@ -194,26 +195,27 @@ class="image">
|
||||
the URL will refer to <code>localhost (127.0.0.1)</code>.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<h2>Sharing a Note Subtree</h2>
|
||||
<h2>Sharing a note subtree</h2>
|
||||
<p>When you share a note, you actually share the entire subtree of notes
|
||||
beneath it. If the note has child notes, they will also be included in
|
||||
the shared content. For example, sharing the "Formatting" subtree will
|
||||
display a page with basic navigation for exploring all the notes within
|
||||
that subtree.</p>
|
||||
<h2>Viewing All Shared Notes</h2>
|
||||
<h2>Viewing and managing shared notes</h2>
|
||||
<p>You can view a list of all shared notes by clicking on "Show Shared Notes
|
||||
Subtree." This allows you to manage and navigate through all the notes
|
||||
you have made public.</p>
|
||||
<h2>Security Considerations</h2>
|
||||
Subtree" in the <a class="reference-link" href="#root/_help_x3i7MxGccDuM">Global menu</a>.
|
||||
This allows you to manage and navigate through all the notes you have made
|
||||
public.</p>
|
||||
<h2>Security considerations</h2>
|
||||
<p>Shared notes are published on the open internet and can be accessed by
|
||||
anyone with the URL. The URL's randomness does not provide security, so
|
||||
it is crucial not to share sensitive information through this feature.</p>
|
||||
<h3>Password Protection</h3>
|
||||
<h3>Password protection</h3>
|
||||
<p>To protect shared notes with a username and password, you can use the <code>#shareCredentials</code> attribute.
|
||||
Add this label to the note with the format <code>#shareCredentials="username:password"</code>.
|
||||
To protect an entire subtree, make sure the label is <a href="#root/_help_bwZpz2ajCEwO">inheritable</a>.</p>
|
||||
<h2>Advanced Sharing Options</h2>
|
||||
<h3>Customizing the Appearance of Shared Notes</h3>
|
||||
<h2>Advanced sharing options</h2>
|
||||
<h3>Customizing the appearance of shared notes</h3>
|
||||
<p>The default design should be a good starting point, but you can customize
|
||||
it using your own CSS:</p>
|
||||
<ul>
|
||||
@@ -232,13 +234,41 @@ class="image">
|
||||
This allows you to access note attributes or traverse the note tree using
|
||||
the <code>fetchNote()</code> API, which retrieves note data based on its
|
||||
ID.</p>
|
||||
<h3>Adding custom HTML</h3>
|
||||
<p>You can inject custom HTML snippets into specific locations of the shared
|
||||
page using the <code>~shareHtml</code> relation. The HTML note should contain
|
||||
the raw HTML content you want to inject, and you can control where it appears
|
||||
by adding the <code>#shareHtmlLocation</code> label to the HTML snippet note
|
||||
itself.</p>
|
||||
<p>The <code>#shareHtmlLocation</code> label accepts values in the format <code>location:position</code>:</p>
|
||||
<ul>
|
||||
<li><strong>Locations</strong>: <code>head</code>, <code>body</code>, <code>content</code>
|
||||
</li>
|
||||
<li><strong>Positions</strong>: <code>start</code>, <code>end</code>
|
||||
</li>
|
||||
</ul>
|
||||
<p>For example:</p>
|
||||
<ul>
|
||||
<li><code>#shareHtmlLocation=head:start</code> - Injects HTML at the beginning
|
||||
of the <code><head></code> section</li>
|
||||
<li><code>#shareHtmlLocation=head:end</code> - Injects HTML at the end of the <code><head></code> section
|
||||
(default)</li>
|
||||
<li><code>#shareHtmlLocation=body:start</code> - Injects HTML at the beginning
|
||||
of the <code><body></code> section</li>
|
||||
<li><code>#shareHtmlLocation=content:start</code> - Injects HTML at the beginning
|
||||
of the content area</li>
|
||||
<li><code>#shareHtmlLocation=content:end</code> - Injects HTML at the end of
|
||||
the content area</li>
|
||||
</ul>
|
||||
<p>If no location is specified, the HTML will be injected at <code>content:end</code> by
|
||||
default.</p>
|
||||
<p>Example:</p><pre><code class="language-application-javascript-env-backend">const currentNote = await fetchNote();
|
||||
const parentNote = await fetchNote(currentNote.parentNoteIds[0]);
|
||||
|
||||
for (const attr of parentNote.attributes) {
|
||||
console.log(attr.type, attr.name, attr.value);
|
||||
}</code></pre>
|
||||
<h3>Creating Human-Readable URL Aliases</h3>
|
||||
<h3>Creating human-readable URL aliases</h3>
|
||||
<p>Shared notes typically have URLs like <code>http://domain.tld/share/knvU8aJy4dJ7</code>,
|
||||
where the last part is the note's ID. You can make these URLs more user-friendly
|
||||
by adding the <code>#shareAlias</code> label to individual notes (e.g., <code>#shareAlias=highlighting</code>).
|
||||
@@ -249,23 +279,25 @@ for (const attr of parentNote.attributes) {
|
||||
<li>Using slashes (<code>/</code>) within aliases to create subpaths is not
|
||||
supported.</li>
|
||||
</ol>
|
||||
<h3>Viewing and Managing Shared Notes</h3>
|
||||
<p>All shared notes are grouped under an automatically managed "Shared Notes"
|
||||
section. From here, you can view, share, or unshare notes by moving or
|
||||
cloning them within this section.</p>
|
||||
<p>
|
||||
<img src="Sharing_shared-list.png" alt="Shared Notes List">
|
||||
</p>
|
||||
<h3>Setting a Custom Favicon</h3>
|
||||
<h3>Setting a custom favicon</h3>
|
||||
<p>To customize the favicon for your shared pages, create a relation <code>~shareFavicon</code> pointing
|
||||
to a file note containing the favicon (e.g., in <code>.ico</code> format).</p>
|
||||
<h3>Sharing a Note as the Root</h3>
|
||||
<h3>Sharing a note as the root</h3>
|
||||
<p>You can designate a specific note or folder as the root of your shared
|
||||
content by adding the <code>#shareRoot</code> label. This note will be linked
|
||||
when visiting <code>[http://domain.tld/share](http://domain/share)</code>,
|
||||
making it easier to use Trilium as a fully-fledged website. Consider combining
|
||||
this with the <code>#shareIndex</code> label, which will display a list of
|
||||
all shared notes.</p>
|
||||
making it easier to use Trilium as a fully-fledged website.</p>
|
||||
<aside class="admonition tip">
|
||||
<p>Consider combining this with the <code>#shareIndex</code> label, which will
|
||||
display a list of all shared notes.</p>
|
||||
</aside>
|
||||
<h3>Displaying an index of shared notes</h3>
|
||||
<p>When accessing a share, the sub-notes will be displayed in a tree on the
|
||||
left. But since multiple note trees can be shared, it might be useful to
|
||||
display a list of all the different share trees.</p>
|
||||
<p>To do so, create a shared text note and apply the <code>shareIndex</code> label.
|
||||
When viewed, the list of shared roots will be displayed at the bottom of
|
||||
the note.</p>
|
||||
<h2>Attribute reference</h2>
|
||||
<table>
|
||||
<thead>
|
||||
@@ -323,8 +355,8 @@ for (const attr of parentNote.attributes) {
|
||||
<p>Indicates to web crawlers that the page should not be indexed of this
|
||||
note by:</p>
|
||||
<ul>
|
||||
<li>Setting the <code>X-Robots-Tag: noindex</code> HTTP header.</li>
|
||||
<li>Setting the <code>noindex, follow</code> meta tag.</li>
|
||||
<li data-list-item-id="e6baa9f60bf59d085fd31aa2cce07a0e7">Setting the <code>X-Robots-Tag: noindex</code> HTTP header.</li>
|
||||
<li data-list-item-id="ec0d067db136ef9794e4f1033405880b7">Setting the <code>noindex, follow</code> meta tag.</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -340,6 +372,14 @@ for (const attr of parentNote.attributes) {
|
||||
</td>
|
||||
<td>Note with this label will list all roots of shared notes.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>shareHtmlLocation</code>
|
||||
</td>
|
||||
<td>defines where custom HTML injected via <code>~shareHtml</code> relation
|
||||
should be placed. Applied to the HTML snippet note itself. Format: <code>location:position</code> where
|
||||
location is <code>head</code>, <code>body</code>, or <code>content</code> and
|
||||
position is <code>start</code> or <code>end</code>. Defaults to <code>content:end</code>.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 8.7 KiB |
@@ -15,61 +15,74 @@
|
||||
in a hierarchy.</p>
|
||||
<h2>Interaction with columns</h2>
|
||||
<ul>
|
||||
<li>Create a new column by pressing <em>Add Column</em> near the last column.
|
||||
<li data-list-item-id="e53cd56f64ad0a087af5c123894261ff1">Create a new column by pressing <em>Add Column</em> near the last column.
|
||||
<ul>
|
||||
<li>Once pressed, a text box will be displayed to set the name of the column.
|
||||
<li data-list-item-id="eaf5a55c795e0cfe57a2a05d6b9f89761">Once pressed, a text box will be displayed to set the name of the column.
|
||||
Press <kbd>Enter</kbd> to confirm, or <kbd>Escape</kbd> to dismiss.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>To reorder a column, simply hold the mouse over the title and drag it
|
||||
<li data-list-item-id="e2d7f17b56a6a8027d26e5d30f16bd7f6">To reorder a column, simply hold the mouse over the title and drag it
|
||||
to the desired position.</li>
|
||||
<li>To delete a column, right click on its title and select <em>Delete column</em>.</li>
|
||||
<li>To rename a column, click on the note title.
|
||||
<li data-list-item-id="ef0f57de87814bf725cf846cecca01899">To delete a column, right click on its title and select <em>Delete column</em>.</li>
|
||||
<li
|
||||
data-list-item-id="e00cb99d9b34dbf63523f053a57f28fe8">To rename a column, click on the note title.
|
||||
<ul>
|
||||
<li>Press Enter to confirm.</li>
|
||||
<li>Upon renaming a column, the corresponding status attribute of all its
|
||||
<li data-list-item-id="ea86b1d902db4bbab1fe85bcf669c595c">Press Enter to confirm.</li>
|
||||
<li data-list-item-id="e6d1bc52b0a8b3d554fd4be0f1f009b04">Upon renaming a column, the corresponding status attribute of all its
|
||||
notes will be changed in bulk.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>If there are many columns, use the mouse wheel to scroll.</li>
|
||||
</li>
|
||||
<li data-list-item-id="ea1dd557786a534468e61f445aaea665f">If there are many columns, use the mouse wheel to scroll.</li>
|
||||
</ul>
|
||||
<h2>Interaction with notes</h2>
|
||||
<ul>
|
||||
<li>Create a new note in any column by pressing <em>New item</em>
|
||||
<li data-list-item-id="ec25f6e597c61e1f56422d72a91777cb8">Create a new note in any column by pressing <em>New item</em>
|
||||
<ul>
|
||||
<li>Enter the name of the note and press <kbd>Enter</kbd> or click away. To
|
||||
<li data-list-item-id="e3027de7ac16543b3a3be526c6700f22e">Enter the name of the note and press <kbd>Enter</kbd> or click away. To
|
||||
dismiss the creation of a new note, simply press <kbd>Escape</kbd> or leave
|
||||
the name empty.</li>
|
||||
<li>Once created, the new note will have an attribute (<code>status</code> label
|
||||
<li data-list-item-id="ef97c736e327952225517534711a8e329">Once created, the new note will have an attribute (<code>status</code> label
|
||||
by default) set to the name of the column.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>To open the note, simply click on it.</li>
|
||||
<li>To change the title of the note directly from the board, hover the mouse
|
||||
<li data-list-item-id="e0558241e1901ee6a5b765644c115f95c">To open the note, simply click on it.</li>
|
||||
<li data-list-item-id="e1580878e9963e2039332f9c3ff40dc9d">To change the title of the note directly from the board, hover the mouse
|
||||
over its card and press the edit button on the right.</li>
|
||||
<li>To change the state of a note, simply drag a note from one column to the
|
||||
<li data-list-item-id="e817b2e5103fd08622477663a5a8b9683">To change the state of a note, simply drag a note from one column to the
|
||||
other to change its state.</li>
|
||||
<li>The order of the notes in each column corresponds to their position in
|
||||
<li data-list-item-id="e5f86d7f2f545470451040860ca3e8890">The order of the notes in each column corresponds to their position in
|
||||
the tree.
|
||||
<ul>
|
||||
<li>It's possible to reorder notes simply by dragging them to the desired
|
||||
<li data-list-item-id="e0b47ff4af56dc7cd21a118fbc9b1808a">It's possible to reorder notes simply by dragging them to the desired
|
||||
position within the same columns.</li>
|
||||
<li>It's also possible to drag notes across columns, at the desired position.</li>
|
||||
<li data-list-item-id="e9eb4fa22b9ed927a24aee3e94d5a1b5d">It's also possible to drag notes across columns, at the desired position.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>For more options, right click on a note to display a context menu with
|
||||
<li data-list-item-id="e94ebbbe060ccfe7fbb1c67616e272b35">For more options, right click on a note to display a context menu with
|
||||
the following options:
|
||||
<ul>
|
||||
<li>Open the note in a new tab/split/window or quick edit.</li>
|
||||
<li>Move the note to any column.</li>
|
||||
<li>Insert a new note above/below the current one.</li>
|
||||
<li>Archive/unarchive the current note.</li>
|
||||
<li>Delete the current note.</li>
|
||||
<li data-list-item-id="e5516bb20b5c4534580854c6422107b1d">Open the note in a new tab/split/window or quick edit.</li>
|
||||
<li data-list-item-id="e8419784dbd01baae6c1e1e8875baa84a">Move the note to any column.</li>
|
||||
<li data-list-item-id="e6ab7181ef973bbd96e3bbbfed5e302d1">Insert a new note above/below the current one.</li>
|
||||
<li data-list-item-id="e8aae7a4c6ddb5f191d6dcd914f0c3b78">Archive/unarchive the current note.</li>
|
||||
<li data-list-item-id="e0bf5bc2c60b27a7fd0078001816d8ca4">Delete the current note.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>If there are many notes within the column, move the mouse over the column
|
||||
<li data-list-item-id="ec32b9f786e2c612fb63677c8c5089365">If there are many notes within the column, move the mouse over the column
|
||||
and use the mouse wheel to scroll.</li>
|
||||
</ul>
|
||||
<h2>Keyboard interaction</h2>
|
||||
<p>The board view has mild support for keyboard-based navigation:</p>
|
||||
<ul>
|
||||
<li data-list-item-id="e0c992a7fdac57768851c53137a2cfa64">Use <kbd>Tab</kbd> and <kbd>Shift</kbd>+<kbd>Tab</kbd> to navigate between
|
||||
column titles, notes and the “New item” button for each of the columns,
|
||||
in sequential order.</li>
|
||||
<li data-list-item-id="e4c143d1ec92d0fc5b75e850cf10f4377">To rename a column or a note, press <kbd>F2</kbd> while it is focused.</li>
|
||||
<li
|
||||
data-list-item-id="ee3008937bdfd14e06c308a5f0846addf">To open a specific note or create a new item, press <kbd>Enter</kbd> while
|
||||
it is focused.</li>
|
||||
<li data-list-item-id="e70ceff80dcd5422e2361c4fbcd805773">To dismiss a rename of a note or a column, press <kbd>Escape</kbd>.</li>
|
||||
</ul>
|
||||
<h2>Configuration</h2>
|
||||
<h3>Grouping by another attribute</h3>
|
||||
<p>By default, the label used to group the notes is <code>#status</code>.
|
||||
@@ -83,5 +96,5 @@ class="admonition note">
|
||||
<h2>Interaction</h2>
|
||||
<h2>Limitations</h2>
|
||||
<ul>
|
||||
<li>It is not possible yet to use group by a relation, only by label.</li>
|
||||
<li data-list-item-id="e61ec93de3282934fd37d302933d208b8">It is not possible yet to use group by a relation, only by label.</li>
|
||||
</ul>
|
||||
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/10_Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 160 B After Width: | Height: | Size: 8.5 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/1_Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 172 B |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/2_Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 147 B |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/4_Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 154 B |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/7_Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 154 B After Width: | Height: | Size: 158 B |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/8_Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 172 B After Width: | Height: | Size: 9.0 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/9_Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 147 B After Width: | Height: | Size: 3.9 KiB |
@@ -25,6 +25,19 @@
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Exiting out of the code block</h2>
|
||||
<ul>
|
||||
<li>To exit out of a code block and enter a normal paragraph, move the cursor
|
||||
at the end of the code block and press <kbd>Enter</kbd> twice.</li>
|
||||
<li>Similarly, to insert a paragraph above the note block, move the cursor
|
||||
at the beginning of the code block and press <kbd>Enter</kbd> twice.</li>
|
||||
</ul>
|
||||
<aside class="admonition note">
|
||||
<p>If you've pasted a code block with a more complex HTML structure, exiting
|
||||
out of the code block by pressing <kbd>Enter</kbd> multiple times might not
|
||||
work. In that case the best approach is to delete the code block entirely
|
||||
and use <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>V</kbd> (paste as plain text).</p>
|
||||
</aside>
|
||||
<h2>Syntax highlighting & color schemes</h2>
|
||||
<p>Since TriliumNext v0.90.12, Trilium will try to offer syntax highlighting
|
||||
to the code block. Note that the syntax highlighting mechanism is slightly
|
||||
|
||||
@@ -5,4 +5,11 @@
|
||||
<p>In the <a class="reference-link" href="#root/_help_nRhnJkTT8cPs">Formatting toolbar</a>,
|
||||
look for the
|
||||
<img src="Include Note_image.png">button. There is also a keyboard shortcut defined for it but it is not
|
||||
allocated by default.</p>
|
||||
allocated by default.</p>
|
||||
<h2>Included notes in the share functionality</h2>
|
||||
<p>If a <a href="#root/_help_R9pX4DGra2Vt">shared note</a> contains one or
|
||||
more included notes, they will be displayed in the content of the note
|
||||
as if they were part of the note itself.</p>
|
||||
<p>For this to work, the included notes must also be shared, otherwise they
|
||||
will not be shown. However, the included notes can still be hidden from
|
||||
the note tree via <code>#shareHiddenFromTree</code>.</p>
|
||||
27
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Lists.html
generated
vendored
@@ -1,15 +1,15 @@
|
||||
<p>There are three types of lists supported by text notes:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<img src="7_Lists_image.png" width="17" height="13">Bulleted lists (also known as unordered lists).</li>
|
||||
<img src="4_Lists_image.png" width="17" height="13">Bulleted lists (also known as unordered lists).</li>
|
||||
<li>
|
||||
<img src="8_Lists_image.png" width="18" height="16">Numbered lists (or ordered lists).</li>
|
||||
<img src="1_Lists_image.png" width="18" height="16">Numbered lists (or ordered lists).</li>
|
||||
<li>
|
||||
<img src="10_Lists_image.png" width="19" height="13">To-do lists</li>
|
||||
<img src="Lists_image.png" width="19" height="13">To-do lists</li>
|
||||
</ul>
|
||||
<p>For bulleted and numbered lists, it's possible to configure an alternative
|
||||
marker such as squares or Roman numbering by pressing the
|
||||
<img src="9_Lists_image.png"
|
||||
<img src="2_Lists_image.png"
|
||||
width="10" height="6">icon. For numbered lists, it's also possible to specify the number to
|
||||
start at or whether to count in reverse order.</p>
|
||||
<h2>Keyboard interaction</h2>
|
||||
@@ -20,7 +20,7 @@
|
||||
by a space;</li>
|
||||
<li>Numbered list: Start a line with <code>1.</code> or <code>1)</code> followed
|
||||
by a space;</li>
|
||||
<li>To-do list: Start a line with <code>[ ]</code> for an unchecked item or <code>[x]</code> for
|
||||
<li>To-do list: Start a line with <code>- [ ]</code> for an unchecked item or <code>[x]</code> for
|
||||
a checked item.</li>
|
||||
</ul>
|
||||
</li>
|
||||
@@ -29,7 +29,7 @@
|
||||
<li>To exit out of the list, press <kbd>Enter</kbd> twice.</li>
|
||||
<li>To merge two lists, simply delete the gap between them.</li>
|
||||
<li>To create nested lists, simply use the
|
||||
<img src="2_Lists_image.png" width="17"
|
||||
<img src="7_Lists_image.png" width="17"
|
||||
height="14">button (see <em>Indentation</em> in <a class="reference-link" href="#root/_help_dEHYtoWWi8ct">Other features</a>)
|
||||
or the <kbd>Tab</kbd> key. To decrease the nesting level for the current
|
||||
element, press <kbd>Shift</kbd>+<kbd>Tab</kbd>.</li>
|
||||
@@ -56,7 +56,7 @@
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>
|
||||
<img src="4_Lists_image.png">
|
||||
<img src="9_Lists_image.png">
|
||||
</td>
|
||||
<td>Press Enter to create a new list item.</td>
|
||||
</tr>
|
||||
@@ -71,7 +71,7 @@
|
||||
<td>4</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:676/112;width:98.29%;"
|
||||
src="1_Lists_image.png" width="676" height="112">
|
||||
src="10_Lists_image.png" width="676" height="112">
|
||||
</td>
|
||||
<td>At this point, insert any desired block-level item such as a code block.</td>
|
||||
</tr>
|
||||
@@ -79,7 +79,7 @@
|
||||
<td>5</td>
|
||||
<td>
|
||||
<img class="image_resized" style="aspect-ratio:675/129;width:94.22%;"
|
||||
src="Lists_image.png" width="675" height="129">
|
||||
src="8_Lists_image.png" width="675" height="129">
|
||||
</td>
|
||||
<td>To continue with a new bullet point, press Enter until the cursor moves
|
||||
to a new blank position.</td>
|
||||
@@ -95,4 +95,11 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<p>The same principle applies to all three list types (bullet, numbered and
|
||||
to-do).</p>
|
||||
to-do).</p>
|
||||
<h2>To-do lists</h2>
|
||||
<ul>
|
||||
<li>To insert a to-do list from the keyboard, type <code>- [ ]</code> for an
|
||||
unchecked item or <code>[x]</code> for a checked item while on an empty paragraph.</li>
|
||||
<li>To reorder the item under the cursor, press <kbd>Alt</kbd>+<kbd>Up</kbd> or <kbd>Alt</kbd>+<kbd>Down</kbd>.
|
||||
To reorder multiple items, select them first.</li>
|
||||
</ul>
|
||||
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Lists_image.png
generated
vendored
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 160 B |
@@ -6,12 +6,6 @@
|
||||
the
|
||||
<img src="1_Math Equations_image.png" width="20" height="15">button from the <a class="reference-link" href="#root/_help_nRhnJkTT8cPs">Formatting toolbar</a> (generally
|
||||
found under the <a class="reference-link" href="#root/_help_CohkqWQC1iBv">Insert buttons</a>).</p>
|
||||
<p>If inserting equations frequently, using the <kbd>Ctrl</kbd>+<kbd>M</kbd> keyboard
|
||||
shortcut can be more comfortable. Alternatively, type <code>$$</code> or <code>\[</code> to
|
||||
trigger the popup directly.</p>
|
||||
<p>There is currently no quick way to insert an equation, such as surrounding
|
||||
it with <code>$</code> or pressing <kbd>Ctrl</kbd>+<kbd>M</kbd> on an already
|
||||
typed-out equation.</p>
|
||||
<p>The mathematical expression must be written in the TeX format. There is
|
||||
no visual editor for the math equations, only a preview. </p>
|
||||
<p>Enabling <em>Display mode</em> will render the equation slightly bigger
|
||||
@@ -19,6 +13,12 @@
|
||||
center it. Display mode equations will act as blocks (i.e. like paragraphs,
|
||||
or tables) and can be inserted for example in lists. Non-display equations
|
||||
can be part of the text.</p>
|
||||
<h2>Keyboard shortcuts</h2>
|
||||
<p>If inserting equations frequently, using the <kbd>Ctrl</kbd>+<kbd>M</kbd> keyboard
|
||||
shortcut can be more comfortable. Alternatively, type <code>$$</code> or <code>\[</code> to
|
||||
trigger the popup directly.</p>
|
||||
<p>There is currently no quick way to turn an already typed-out equation,
|
||||
such as surrounding it with <code>$</code> or pressing <kbd>Ctrl</kbd>+<kbd>M</kbd>.</p>
|
||||
<h2>Supported math features</h2>
|
||||
<p>Technically we are using the KaTeX library which allows for a subset of
|
||||
the TeX format. To see the full list of supported features, consult the
|
||||
@@ -27,8 +27,12 @@
|
||||
the official documentation.</p>
|
||||
<h2>Markdown support</h2>
|
||||
<p>Math equations will be preserved when exporting to or importing from Markdown,
|
||||
surrounded by <code>\(</code> characters for inline math expressions, and <code>$\)</code> for
|
||||
surrounded by <code>$</code> characters for inline math expressions, and <code>$$</code> for
|
||||
display mode.</p>
|
||||
<p>If you notice any issue with the Markdown import/export for equations,
|
||||
feel free to <a href="#root/_help_wy8So3yZZlH9">report</a> it while providing
|
||||
the equation that causes issues.</p>
|
||||
the equation that causes issues.</p>
|
||||
<h2>Formatting the equation</h2>
|
||||
<p>It is possible to customize the font size and foreground color for both
|
||||
inline and display-mode equations, just like any other text. For inline
|
||||
equations, the background color/highlight can also be adjusted.</p>
|
||||
24
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Logging.html
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
<p>Both front-end and back-end notes can log messages for debugging.</p>
|
||||
<h2>UI logging via <code>api.log</code></h2>
|
||||
<figure class="image image_resized image-style-align-center" style="width:57.74%;">
|
||||
<img style="aspect-ratio:749/545;" src="Logging_image.png" width="749"
|
||||
height="545">
|
||||
</figure>
|
||||
<p>The API log feature integrates with the script editor and it displays
|
||||
all the messages logged via <code>api.log</code>. This works for both back-end
|
||||
and front-end scripts.</p>
|
||||
<p>The API log panel will appear after executing a script that uses <code>api.log</code> and
|
||||
it can be dismissed temporarily by pressing the close button in the top-right
|
||||
of the panel.</p>
|
||||
<p>Apart from strings, an object can be passed as well in which case it will
|
||||
be pretty-formatted if possible (e.g. recursive objects are not supported).</p>
|
||||
<h2>Console logging</h2>
|
||||
<p>For logs that are not directly visible to the user, the standard <code>console.log</code> can
|
||||
be used as well.</p>
|
||||
<ul>
|
||||
<li>For front-end scripts, the log will be shown in the Developer Tools (also
|
||||
known as Inspect).</li>
|
||||
<li>For back-end scripts, the log will be shown in the server output while
|
||||
running but <strong>will not</strong> be visible in the <a class="reference-link"
|
||||
href="#root/_help_bnyigUA2UK7s">Backend (server) logs</a>.</li>
|
||||
</ul>
|
||||
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Logging_image.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 3.9 KiB |
BIN
apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/3_Custom app-wide CSS_image.png
generated
vendored
Normal file
|
After Width: | Height: | Size: 5.6 KiB |