From 44c6bc7dd0c796a2c28136ab5574c39a8941c20c Mon Sep 17 00:00:00 2001 From: cutestnekoaqua Date: Sun, 5 Feb 2023 12:38:40 +0100 Subject: [PATCH 001/722] fixing a git merge error. --- packages/backend/src/misc/reaction-lib.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/backend/src/misc/reaction-lib.ts b/packages/backend/src/misc/reaction-lib.ts index 5fd47aab7..babebfb62 100644 --- a/packages/backend/src/misc/reaction-lib.ts +++ b/packages/backend/src/misc/reaction-lib.ts @@ -71,6 +71,12 @@ export async function toDbReaction( if (Object.keys(legacies).includes(reaction)) return legacies[reaction]; // Convert old heart to new if (reaction === "♥️") return "❤️"; + // Allow unicode reactions + const match = emojiRegex.exec(reaction); + if (match) { + const unicode = match[0]; + return unicode; + } const custom = reaction.match(/^:([\w+-]+)(?:@\.)?:$/); if (custom) { From 2ae58c1c629dcd6d2d0e8f8f48d5dc80e26923fb Mon Sep 17 00:00:00 2001 From: cutestnekoaqua Date: Sun, 5 Feb 2023 12:39:57 +0100 Subject: [PATCH 002/722] fix: docker tags --- .woodpecker/dockerHubTag.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.woodpecker/dockerHubTag.yml b/.woodpecker/dockerHubTag.yml index 4294e1a58..5543ae234 100644 --- a/.woodpecker/dockerHubTag.yml +++ b/.woodpecker/dockerHubTag.yml @@ -16,6 +16,3 @@ pipeline: # Push new version when version tag is created event: tag tag: v* - -depends_on: - - prSecurityCheck From a6e1669d608a1518be6e5b8c48b97770dcd6c33e Mon Sep 17 00:00:00 2001 From: Cleo Date: Fri, 10 Feb 2023 07:10:42 +0000 Subject: [PATCH 003/722] Nya --- cypress/e2e/widgets.cy.js | 1 - 1 file changed, 1 deletion(-) diff --git a/cypress/e2e/widgets.cy.js b/cypress/e2e/widgets.cy.js index db35a60b5..9eea010bd 100644 --- a/cypress/e2e/widgets.cy.js +++ b/cypress/e2e/widgets.cy.js @@ -2,7 +2,6 @@ describe('After user signed in', () => { beforeEach(() => { cy.resetState(); cy.viewport('macbook-16'); - // インスタンス初期セットアップ cy.registerUser('admin', 'pass', true); From 234315dacd415567e0c7381b601bcfb94857c3d9 Mon Sep 17 00:00:00 2001 From: Cleo Date: Fri, 10 Feb 2023 10:04:32 +0000 Subject: [PATCH 004/722] Fix build --- packages/backend/src/misc/reaction-lib.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/backend/src/misc/reaction-lib.ts b/packages/backend/src/misc/reaction-lib.ts index 41036489a..babebfb62 100644 --- a/packages/backend/src/misc/reaction-lib.ts +++ b/packages/backend/src/misc/reaction-lib.ts @@ -78,13 +78,6 @@ export async function toDbReaction( return unicode; } - // Allow unicode reactions - const match = emojiRegex.exec(reaction); - if (match) { - const unicode = match[0]; - return unicode; - } - const custom = reaction.match(/^:([\w+-]+)(?:@\.)?:$/); if (custom) { const name = custom[1]; From 424fdd4f267d1f8630588a2d540e3102f0c3ba45 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Sat, 11 Feb 2023 06:02:08 +0000 Subject: [PATCH 005/722] Upload files to 'packages/backend/assets' --- packages/backend/assets/favicon.svg | Bin 0 -> 4285 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/backend/assets/favicon.svg diff --git a/packages/backend/assets/favicon.svg b/packages/backend/assets/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..a77c6e22bbd6a1a0142e667bf938e57ee5aa97ba GIT binary patch literal 4285 zcmb7I+m74F5q-~BG-L$pMZ{*`FN$O!fs@6)B*3nLJO(t`nqfu~1(IXU%-82sla%CL zC)sFVh}DA>M!)oCb~@n!Q8*LCwUz=!U+uhSm;6F;S~{P^i(xl9&tC!+5yj!xU>+80#C|7t1ley$!6%AxCbt9SeSS+UPu-=uyS1ycAdqaA2!$JgCTaAof_ zF+6q`@-;kGO?TO?)ZHA7-|d61h2>2?{xQ{0ssG$nJ=A$W+oa)X38Rtp2chDihn{r2 zuMR`H^Yzws$E;>6ycgzfrUp{V3GSka_kq>OLkh+1{o+e|LI%a9ZN^7TJIehU?>zaK z+K0z+w~87O{c;kAePatj_UpCB>ZLulZwcw#d#a!N9&{In>NSCxsbb4a>M@N~Q;k)o zaxtXKjDvINZ}Zc~ztU3rZ0maSkFI}WG+uq~o)PrCG*3761{HLy#t-cgEKy1P0Tr<= zZxgd8_`=xudQRC_pQie|>iS--O?`w$&Z+!)Y!8PY$@3~lpJSRFQFpnHZOb{%Dei4~ zm&UeSvdsA(+Ec3fANs0kfzX7)>te3h!#we+uTBG{wp;bxSdHm@6yGl(4P$p^-F`nL zz+rz6QDLB1losoH-vn?)y%H0U`7pj7&=QNHsrn}rFv_E7PZUZ)EAq|_d#9ZBPW*Aj zh@k(r79`BMZ@-Eq{wf$Py$SnUF#fj(<89;B{}If#{2JQ~ca!!*MuHxsnZn*qFOmm< zv1sH?Xp^j2v9kj4?X-4E?MhW{6OcIW5d{Y zPpKfR|JAj4|MrwE(VE9mIjKLODL|Ukt8#eunkV8rSK}kY@R1cp@}Q+!d(UNLH7hg^ zF6gyj1x9>OYst0sffbRXSIM>E!sn>Dmu{`Nx5~mz9$h;woWk1KoVGB_h1GE_xG>R2 zhDC4-OKKBX$R5ZPQsPAo2XxbjN zaX45RE7!&J%_KKcd!(kgQwk5USVRYOqQ{I1N@1N;_G)2J z*^s>{=N-jll!r2CnT9>@%AR758IB#^v+$-7WcKZ@=H#7;yiqv_gB%7GC_9{>S@uXf z^9hh(MnBJcX&ob!jKRqZN0A5bkpFDIF%S+cEJ($Wa1-CgSopNu0yE;@I7irs0Mb}7 z^K(UfJqZM1Ya7hk<48E76TnmC9wGt0P(>hdP*_ZtDzn;h zAlB3is4s3zX?%9}p05ZaXxk1z;?qzP4Ik%3CmoY!}zKrxVpv=o-Q3x_lze4<`s zJxSOpq6zb$dM*@P=2C(BBNHV?!Ch@fRZN^K$EAfYa21^;(orrx672A&EpSJWN`QTj zTmYm-9m|ZKGbDLje2kX)*yxNfSda01?qn-;GOr+B+$5D2=$Kq92`x(Q(Gp4d!we!4bCQyVFKa>F@{ky4juS_Asnglt`N|< zA(+gU$~}yPkbf{Zazib3VwWuNhF*Z`BgW7JbCBo=xloA+8kn6!*yx`$U~LGQQ`8|X zK?{Hg$;q5L$zfvoiUmLd6nQQBGcq?3=pz6T!7r5@@;}gv2)`=nrG@@YiNGlmKyS+5 z8CD207cGhybw^4fo6Zd3Drm|Pg2qOYAl(S=*5!VLb7?XvuxX$poC-}ul)eYDsD#;4 zJPME3A6`y68la3|HA(=L=QPMe3xiyc2!JI-(O&5d1yKPbycQw3#qwMS6fN+coDv); zW9XZFTi|h93FnXq+_{inm)R}(!#j@-o$CD-M7H1l=bhx#o!(O4{inOfd?T5E3DK_? z+&bv?AvLxv|6zcePNK{Huv^vBXQ+qU!~BS$>5pdeg2lYMd6f^#{Xai!$==d$k`Mm| D`KnNH literal 0 HcmV?d00001 From a1592dad907736c3afe1f8d44f9a9188d0348da3 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Sat, 11 Feb 2023 06:10:15 +0000 Subject: [PATCH 006/722] Delete 'packages/backend/assets/favicon.svg' --- packages/backend/assets/favicon.svg | Bin 4285 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/backend/assets/favicon.svg diff --git a/packages/backend/assets/favicon.svg b/packages/backend/assets/favicon.svg deleted file mode 100644 index a77c6e22bbd6a1a0142e667bf938e57ee5aa97ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4285 zcmb7I+m74F5q-~BG-L$pMZ{*`FN$O!fs@6)B*3nLJO(t`nqfu~1(IXU%-82sla%CL zC)sFVh}DA>M!)oCb~@n!Q8*LCwUz=!U+uhSm;6F;S~{P^i(xl9&tC!+5yj!xU>+80#C|7t1ley$!6%AxCbt9SeSS+UPu-=uyS1ycAdqaA2!$JgCTaAof_ zF+6q`@-;kGO?TO?)ZHA7-|d61h2>2?{xQ{0ssG$nJ=A$W+oa)X38Rtp2chDihn{r2 zuMR`H^Yzws$E;>6ycgzfrUp{V3GSka_kq>OLkh+1{o+e|LI%a9ZN^7TJIehU?>zaK z+K0z+w~87O{c;kAePatj_UpCB>ZLulZwcw#d#a!N9&{In>NSCxsbb4a>M@N~Q;k)o zaxtXKjDvINZ}Zc~ztU3rZ0maSkFI}WG+uq~o)PrCG*3761{HLy#t-cgEKy1P0Tr<= zZxgd8_`=xudQRC_pQie|>iS--O?`w$&Z+!)Y!8PY$@3~lpJSRFQFpnHZOb{%Dei4~ zm&UeSvdsA(+Ec3fANs0kfzX7)>te3h!#we+uTBG{wp;bxSdHm@6yGl(4P$p^-F`nL zz+rz6QDLB1losoH-vn?)y%H0U`7pj7&=QNHsrn}rFv_E7PZUZ)EAq|_d#9ZBPW*Aj zh@k(r79`BMZ@-Eq{wf$Py$SnUF#fj(<89;B{}If#{2JQ~ca!!*MuHxsnZn*qFOmm< zv1sH?Xp^j2v9kj4?X-4E?MhW{6OcIW5d{Y zPpKfR|JAj4|MrwE(VE9mIjKLODL|Ukt8#eunkV8rSK}kY@R1cp@}Q+!d(UNLH7hg^ zF6gyj1x9>OYst0sffbRXSIM>E!sn>Dmu{`Nx5~mz9$h;woWk1KoVGB_h1GE_xG>R2 zhDC4-OKKBX$R5ZPQsPAo2XxbjN zaX45RE7!&J%_KKcd!(kgQwk5USVRYOqQ{I1N@1N;_G)2J z*^s>{=N-jll!r2CnT9>@%AR758IB#^v+$-7WcKZ@=H#7;yiqv_gB%7GC_9{>S@uXf z^9hh(MnBJcX&ob!jKRqZN0A5bkpFDIF%S+cEJ($Wa1-CgSopNu0yE;@I7irs0Mb}7 z^K(UfJqZM1Ya7hk<48E76TnmC9wGt0P(>hdP*_ZtDzn;h zAlB3is4s3zX?%9}p05ZaXxk1z;?qzP4Ik%3CmoY!}zKrxVpv=o-Q3x_lze4<`s zJxSOpq6zb$dM*@P=2C(BBNHV?!Ch@fRZN^K$EAfYa21^;(orrx672A&EpSJWN`QTj zTmYm-9m|ZKGbDLje2kX)*yxNfSda01?qn-;GOr+B+$5D2=$Kq92`x(Q(Gp4d!we!4bCQyVFKa>F@{ky4juS_Asnglt`N|< zA(+gU$~}yPkbf{Zazib3VwWuNhF*Z`BgW7JbCBo=xloA+8kn6!*yx`$U~LGQQ`8|X zK?{Hg$;q5L$zfvoiUmLd6nQQBGcq?3=pz6T!7r5@@;}gv2)`=nrG@@YiNGlmKyS+5 z8CD207cGhybw^4fo6Zd3Drm|Pg2qOYAl(S=*5!VLb7?XvuxX$poC-}ul)eYDsD#;4 zJPME3A6`y68la3|HA(=L=QPMe3xiyc2!JI-(O&5d1yKPbycQw3#qwMS6fN+coDv); zW9XZFTi|h93FnXq+_{inm)R}(!#j@-o$CD-M7H1l=bhx#o!(O4{inOfd?T5E3DK_? z+&bv?AvLxv|6zcePNK{Huv^vBXQ+qU!~BS$>5pdeg2lYMd6f^#{Xai!$==d$k`Mm| D`KnNH From 00bcaeaa47ef48d1fd13f190b21a6ceda619235a Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Mon, 13 Feb 2023 03:35:21 +0000 Subject: [PATCH 007/722] Update 'CALCKEY.md' --- CALCKEY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CALCKEY.md b/CALCKEY.md index 015232f70..1186277e2 100644 --- a/CALCKEY.md +++ b/CALCKEY.md @@ -108,6 +108,7 @@ - Allows custom emoji - Fix lint errors - Use Rome instead of ESLint +- Keyboard accesibility - MissV: [fix Misskey Forkbomb](https://code.vtopia.live/Vtopia/MissV/commit/40b23c070bd4adbb3188c73546c6c625138fb3c1) - [Make showing ads optional](https://github.com/misskey-dev/misskey/pull/8996) - [Tapping avatar in mobile opens account modal](https://github.com/misskey-dev/misskey/pull/9056) From 94b9db451ec9121e1494adbc7e0ca92bfa2f2231 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Mon, 20 Feb 2023 12:20:47 -0800 Subject: [PATCH 008/722] update readme --- README.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index bc4141a8e..fd6b14c25 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ If you have access to a server that supports one of the sources below, I recomme ### 🐋 Docker -[How to run Calckey with Docker](./docker-README.md). +[How to run Calckey with Docker](./docs/docker.md). ## 🧑‍💻 Dependencies @@ -97,9 +97,10 @@ If you have access to a server that supports one of the sources below, I recomme ```sh git clone --depth 1 https://codeberg.org/calckey/calckey.git cd calckey/ -# git checkout main # if you want only stable versions ``` +By default, you're on the development branch. Run `git checkout beta` or `git checkout main` to switch to the Beta/Main branches. + ## 📩 Install dependencies ```sh @@ -123,6 +124,8 @@ psql postgres -c "create database calckey with encoding = 'UTF8';" - To add custom CSS for all users, edit `./custom/assets/instance.css`. - To add static assets (such as images for the splash screen), place them in the `./custom/assets/` directory. They'll then be available on `https://yourinstance.tld/static-assets/filename.ext`. - To add custom locales, place them in the `./custom/locales/` directory. If you name your custom locale the same as an existing locale, it will overwrite it. If you give it a unique name, it will be added to the list. Also make sure that the first part of the filename matches the locale you're basing it on. (Example: `en-FOO.yml`) +- To add custom error images, place them in the `./custom/assets/badges` directory, replacing the files already there. +- To add custom sounds, place only mp3 files in the `./custom/assets/sounds` directory. - To update custom assets without rebuilding, just run `pnpm run gulp`. ## 🧑‍🔬 Configuring a new instance @@ -133,12 +136,7 @@ psql postgres -c "create database calckey with encoding = 'UTF8';" ## 🚚 Migrating from Misskey to Calckey -> ⚠️ Because of their changes, migrating from Foundkey is not supported. - -```sh -cp ../misskey/.config/default.yml ./.config/default.yml # replace `../misskey/` with misskey path, add `docker.env` if you use Docker -cp -r ../misskey/files . -``` +For migrating from Misskey v13, Misskey v12, and Foundkey, read [this document](https://codeberg.org/calckey/calckey/src/branch/develop/docs/migrate.md). ## 🍀 NGINX From 0270211d05cc82ea36efd4a73fc53fd862e68738 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Tue, 14 Mar 2023 16:27:31 -0700 Subject: [PATCH 009/722] =?UTF-8?q?feat:=20=F0=9F=94=96=2013.1.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 180d2d4cf..4619b6773 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.1.3-rc2", + "version": "13.1.3", "codename": "aqua", "repository": { "type": "git", From 5731bf4ee5ccb996d306eecfce46d83d5b91d84b Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Tue, 14 Mar 2023 16:29:27 -0700 Subject: [PATCH 010/722] reaction lib from dev --- packages/backend/src/misc/reaction-lib.ts | 33 ++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/packages/backend/src/misc/reaction-lib.ts b/packages/backend/src/misc/reaction-lib.ts index 7d78904bb..e25b2d661 100644 --- a/packages/backend/src/misc/reaction-lib.ts +++ b/packages/backend/src/misc/reaction-lib.ts @@ -5,17 +5,17 @@ import { toPunyNullable } from "./convert-host.js"; import { IsNull } from "typeorm"; const legacies = new Map([ - ['like', '👍'], - ['love', '❤️'], - ['laugh', '😆'], - ['hmm', '🤔'], - ['surprise', '😮'], - ['congrats', '🎉'], - ['angry', '💢'], - ['confused', '😥'], - ['rip', '😇'], - ['pudding', '🍮'], - ['star', '⭐'], + ["like", "👍"], + ["love", "❤️"], + ["laugh", "😆"], + ["hmm", "🤔"], + ["surprise", "😮"], + ["congrats", "🎉"], + ["angry", "💢"], + ["confused", "😥"], + ["rip", "😇"], + ["pudding", "🍮"], + ["star", "⭐"], ]); export async function getFallbackReaction() { @@ -42,7 +42,10 @@ export function convertLegacyReactions(reactions: Record) { if (emoji) { _reactions.set(emoji, (_reactions.get(emoji) || 0) + reactions[reaction]); } else { - _reactions.set(reaction, (_reactions.get(reaction) || 0) + reactions[reaction]); + _reactions.set( + reaction, + (_reactions.get(reaction) || 0) + reactions[reaction], + ); } } @@ -127,7 +130,7 @@ export function decodeReaction(str: string): DecodedReaction { } export function convertLegacyReaction(reaction: string): string { - const decoded = decodeReaction(reaction).reaction; - if (legacies.has(decoded)) return legacies.get(decoded)!; - return decoded; + const decoded = decodeReaction(reaction).reaction; + if (legacies.has(decoded)) return legacies.get(decoded)!; + return decoded; } From 8ad5ffa7da421b8ba2f82f0a966391d747a3dd26 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Thu, 16 Mar 2023 00:15:48 +0000 Subject: [PATCH 011/722] Hotfix Closes #9709 --- packages/client/src/pages/miauth.vue | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/client/src/pages/miauth.vue b/packages/client/src/pages/miauth.vue index 292b47338..d1f616ea0 100644 --- a/packages/client/src/pages/miauth.vue +++ b/packages/client/src/pages/miauth.vue @@ -78,9 +78,6 @@ async function accept(): Promise { } } - state = 'denied'; -} - function onLogin(res): void { login(res.i); } From 459dec47490948a3c7c0e99a1192ee3d232cedcb Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Thu, 16 Mar 2023 00:16:12 +0000 Subject: [PATCH 012/722] Hotfix: 13.1.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4619b6773..166ba1917 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.1.3", + "version": "13.1.4", "codename": "aqua", "repository": { "type": "git", From b03e65584383ceafe2d85e08055e9ab249fbe765 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 15 Mar 2023 17:20:31 -0700 Subject: [PATCH 013/722] hotfix: v13.1.4.1 --- package.json | 2 +- packages/client/src/pages/miauth.vue | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 166ba1917..84749866d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calckey", - "version": "13.1.4", + "version": "13.1.4.1", "codename": "aqua", "repository": { "type": "git", diff --git a/packages/client/src/pages/miauth.vue b/packages/client/src/pages/miauth.vue index d1f616ea0..59ff4b23d 100644 --- a/packages/client/src/pages/miauth.vue +++ b/packages/client/src/pages/miauth.vue @@ -78,6 +78,10 @@ async function accept(): Promise { } } +function deny(): void { + state = 'denied'; +} + function onLogin(res): void { login(res.i); } From 11cae5560ae3f5a298527a8c03176be3b1627e0e Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 15 Mar 2023 18:28:53 -0700 Subject: [PATCH 014/722] docs: :memo: accurate update instructions Closes #9709 --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fd6b14c25..efeade7da 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,8 @@ For migrating from Misskey v13, Misskey v12, and Foundkey, read [this document]( ```sh # git pull -NODE_ENV=production pnpm install && pnpm run build && pnpm run migrate +pnpm install +NODE_ENV=production pnpm run build && pnpm run migrate pm2 start "NODE_ENV=production pnpm run start" --name Calckey ``` From d438deccd2ee35894ebbc8da9a513e5ade0d70e8 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 29 Mar 2023 14:10:01 -0700 Subject: [PATCH 015/722] fix doc link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index efeade7da..71af9f943 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ If you have access to a server that supports one of the sources below, I recomme ### 🐋 Docker -[How to run Calckey with Docker](./docs/docker.md). +[How to run Calckey with Docker](https://codeberg.org/calckey/calckey/src/branch/develop/docs/migrate.md). ## 🧑‍💻 Dependencies From 589744f78db72a1ee8b80c998a46e0fe477df1e9 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 29 Mar 2023 20:13:31 -0700 Subject: [PATCH 016/722] chore: :globe_with_meridians: locale changes Closes #9781 #9773 --- locales/en-US.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index f43f01fb7..7a2bb70fe 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1363,7 +1363,7 @@ _poll: _visibility: public: "Public" publicDescription: "Your post will be visible for all users" - home: "Home" + home: "Unlisted" homeDescription: "Post to home timeline only" followers: "Followers" followersDescription: "Make visible to your followers only" @@ -1771,9 +1771,9 @@ _deck: swapDown: "Swap with the below column" stackLeft: "Stack with the left column" popRight: "Pop column to the right" - profile: "Profile" - newProfile: "New profile" - deleteProfile: "Delete profile" + profile: "Workspace" + newProfile: "New workspace" + deleteProfile: "Delete workspace" introduction: "Create the perfect interface for you by arranging columns freely!" introduction2: "Click on the + on the right of the screen to add new colums whenever you want." widgetsIntroduction: "Please select \"Edit widgets\" in the column menu and add a widget." From 14baee717c2b470ca970b58379e661181b3b0113 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Sun, 9 Apr 2023 20:28:29 -0700 Subject: [PATCH 017/722] docs: hyperlink foundkey commits --- CALCKEY.md | 57 +++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/CALCKEY.md b/CALCKEY.md index 1186277e2..67d317f43 100644 --- a/CALCKEY.md +++ b/CALCKEY.md @@ -122,32 +122,31 @@ - [Add additional background for acrylic popups if backdrop-filter is unsupported](https://github.com/misskey-dev/misskey/pull/8671) - [Add parameters to MFM rotate](https://github.com/misskey-dev/misskey/pull/8549) - Many changes from [Foundkey](https://akkoma.dev/FoundKeyGang/Foundkey) - - 0ece67b04c3f0365057624c1068808276ccab981: refactor pages/auth.form.vue to composition API - - 0ece67b04c3f0365057624c1068808276ccab981: refactor pages/auth.form.vue to composition API - - 4bc9610d8bf5af736b5e89e4782395705de45d7d: remove unnecessary joins - - 9ee609d70082f7a6dc119a5d83c0e7c5e1208676: enhance privacy of notes - - 0fec6e10477b1c1b95d9469fbaf4e249a3722f12: remove ms dependency - - 46fff77accbe8bf0fd3cc88170d67b997bf2bdc3: client uses new API for child notes depth - - c35372a20d22cddb75e93a0b407f2b652cd7faf0: pack children without detail - - aca724e0bfff3e58b4d273f3ee744e3f3aa9c39b: enable to fetch replies recursively - - 2fe64c11502fd8d89c126558cd715e095c83754e: Refactor components/page/page.textarea.vue to composition API - - 6d3181f9835955e5b79bde5484c74bd70e7f9535: Refactor components/page/page.text.vue to composition API - - b630cd7eacd695bb705e6748c87f38425ec4ed45: refactor: add NoteReactions.packMany - - 3fe351df6d4e21f7748c46adfa6ca165abd030c0: fix: catch errors from packing with detail - - 63591da33e233b2ed0ab331ae6bb3c9eff5020ae: refactor: colours in queue chart - - 0f6d94f1e7e1f58cfbf8d07e5f835f8de626842e: backend: improve mutes and blocks - - e2bf2715a6462ed377b033956d65260157f042ea: fix spelling error - - 09a7eabda137e77f81ab31f65d69329670693c8d: backend: fix lint "no-throw-literal" - - 4fbe2e065e75ed3e5b4dfdfd4be3baa03cc447c3: client: fix lint "quotes" - - 585e4f5c42cfafb6cdf7eb601ab435d6a4d85a96: fix textarea not updating properly - - 30d8bc9259cb6b72ed76d67b21dbb4cdceca8327: refactor: welcome.setup.vue to composition api - - 751921e24f37ed707fe44a40d88eebb1299efa35: make emoji picker case insensitive - - 298febeb9c9501e3e3df16982c08657d1da474e0: enhance: add re-collapsing to quoted notes - - b0fdedb264db87575063abed45e52ad71ce4a6af: fix lints in folder.vue - - 6fed87f85d132304eb84b0a59b84dce299a1822f: fix pagination.vue lints - - Tosti's security fixes - - 384e8c49b738f576ba8843296de6cebf01c1b247: server: allow to like own gallery posts - - 4c5aa9e53887cca5561fcec6ab0754e018f589a5: server: allow to like own pages - - 923c93da1228458dd65be47483c198a1a9191bcf: use await for notes.countBy - - ca90cedba0a0704b503c2778694230f5a7dfbace: server: reduce dead instance detection to 7 days - - e9ab42c10afb4e27516c2d2b5e3e06630efe9edd: Alt text in image viewer + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/0ece67b04c3f0365057624c1068808276ccab981: refactor pages/auth.form.vue to composition API + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/4bc9610d8bf5af736b5e89e4782395705de45d7d: remove unnecessary joins + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/9ee609d70082f7a6dc119a5d83c0e7c5e1208676: enhance privacy of notes + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/0fec6e10477b1c1b95d9469fbaf4e249a3722f12: remove ms dependency + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/46fff77accbe8bf0fd3cc88170d67b997bf2bdc3: client uses new API for child notes depth + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/c35372a20d22cddb75e93a0b407f2b652cd7faf0: pack children without detail + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/aca724e0bfff3e58b4d273f3ee744e3f3aa9c39b: enable to fetch replies recursively + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/2fe64c11502fd8d89c126558cd715e095c83754e: Refactor components/page/page.textarea.vue to composition API + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/6d3181f9835955e5b79bde5484c74bd70e7f9535: Refactor components/page/page.text.vue to composition API + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/b630cd7eacd695bb705e6748c87f38425ec4ed45: refactor: add NoteReactions.packMany + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/3fe351df6d4e21f7748c46adfa6ca165abd030c0: fix: catch errors from packing with detail + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/63591da33e233b2ed0ab331ae6bb3c9eff5020ae: refactor: colours in queue chart + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/0f6d94f1e7e1f58cfbf8d07e5f835f8de626842e: backend: improve mutes and blocks + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/e2bf2715a6462ed377b033956d65260157f042ea: fix spelling error + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/09a7eabda137e77f81ab31f65d69329670693c8d: backend: fix lint "no-throw-literal" + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/4fbe2e065e75ed3e5b4dfdfd4be3baa03cc447c3: client: fix lint "quotes" + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/585e4f5c42cfafb6cdf7eb601ab435d6a4d85a96: fix textarea not updating properly + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/30d8bc9259cb6b72ed76d67b21dbb4cdceca8327: refactor: welcome.setup.vue to composition api + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/751921e24f37ed707fe44a40d88eebb1299efa35: make emoji picker case insensitive + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/298febeb9c9501e3e3df16982c08657d1da474e0: enhance: add re-collapsing to quoted notes + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/b0fdedb264db87575063abed45e52ad71ce4a6af: fix lints in folder.vue + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/6fed87f85d132304eb84b0a59b84dce299a1822f: fix pagination.vue lints + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/384e8c49b738f576ba8843296de6cebf01c1b247: server: allow to like own gallery posts + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/4c5aa9e53887cca5561fcec6ab0754e018f589a5: server: allow to like own pages + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/923c93da1228458dd65be47483c198a1a9191bcf: use await for notes.countBy + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/ca90cedba0a0704b503c2778694230f5a7dfbace: server: reduce dead instance detection to 7 days + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/e9ab42c10afb4e27516c2d2b5e3e06630efe9edd: Alt text in image viewer + - https://akkoma.dev/FoundKeyGang/FoundKey/commit/ed9d4023d41bba7c4ac53a1a3422246feed37de2: add argon2 support From 8c057fb1e444a2e061a47c4f9fa2664dd114d258 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Sat, 15 Apr 2023 21:54:40 +0000 Subject: [PATCH 018/722] Update 'patrons.json' --- patrons.json | 1 + 1 file changed, 1 insertion(+) diff --git a/patrons.json b/patrons.json index ee849a5bd..a196a49b2 100644 --- a/patrons.json +++ b/patrons.json @@ -14,6 +14,7 @@ "@effy@social.effy.space", "@Kio@kitsunes.club", "@twann@tech.lgbt", + "@mkk@calckey.jp", "$[sparkle Interkosmos Link]" ] } From c398acc9e5d9674b7a861b037bd195a5eceb7199 Mon Sep 17 00:00:00 2001 From: Kainoa Kanter Date: Tue, 18 Apr 2023 19:21:43 +0000 Subject: [PATCH 019/722] Update 'CONTRIBUTING.md' --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f824432e2..4e143c411 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,8 @@ # Contribution guide We're glad you're interested in contributing Calckey! In this document you will find the information you need to contribute to the project. -## Localization (l10n) -Calckey uses [Weblate](hhttps://hosted.weblate.org/engage/calckey/) for localization management. +## Translation (i18n) +Calckey uses [Weblate](hhttps://hosted.weblate.org/engage/calckey/) for translation and internationalization management. If your language is not listed in Weblate, please open an issue. From 93101ff7af58c98f16100e267e6411aa592498af Mon Sep 17 00:00:00 2001 From: warrows Date: Thu, 27 Apr 2023 14:09:37 +0000 Subject: [PATCH 020/722] Fix readme link to docker doc page --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71af9f943..d8fd28467 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ If you have access to a server that supports one of the sources below, I recomme ### 🐋 Docker -[How to run Calckey with Docker](https://codeberg.org/calckey/calckey/src/branch/develop/docs/migrate.md). +[How to run Calckey with Docker](https://codeberg.org/calckey/calckey/src/branch/develop/docs/docker.md). ## 🧑‍💻 Dependencies From 627a71701ffc17215e3906f56322681a5ddb6bb5 Mon Sep 17 00:00:00 2001 From: Kaity A Date: Mon, 1 May 2023 02:29:50 +1000 Subject: [PATCH 021/722] Implement inbound note edit federation --- locales/en-US.yml | 3 + .../migration/1682753227899-NoteEdit.js | 53 ++++ packages/backend/src/db/postgre.ts | 2 + packages/backend/src/misc/schema.ts | 2 + .../backend/src/models/entities/note-edit.ts | 51 ++++ packages/backend/src/models/entities/note.ts | 6 + packages/backend/src/models/index.ts | 2 + .../backend/src/models/repositories/note.ts | 3 +- .../backend/src/models/schema/note-edit.ts | 49 ++++ .../remote/activitypub/kernel/update/index.ts | 24 +- .../src/remote/activitypub/models/note.ts | 226 +++++++++++++++++- .../backend/src/server/api/stream/types.ts | 3 + packages/backend/src/services/note/create.ts | 2 +- packages/calckey-js/src/streaming.types.ts | 9 +- .../client/src/components/MkNoteDetailed.vue | 91 +++++-- .../client/src/components/MkNoteHeader.vue | 11 +- packages/client/src/components/MkNoteSub.vue | 18 +- .../client/src/components/global/MkTime.vue | 3 +- packages/client/src/scripts/get-note-menu.ts | 18 +- 19 files changed, 513 insertions(+), 63 deletions(-) create mode 100644 packages/backend/migration/1682753227899-NoteEdit.js create mode 100644 packages/backend/src/models/entities/note-edit.ts create mode 100644 packages/backend/src/models/schema/note-edit.ts diff --git a/locales/en-US.yml b/locales/en-US.yml index f9d4d23f0..6385f464a 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -46,9 +46,12 @@ unpin: "Unpin from profile" copyContent: "Copy contents" copyLink: "Copy link" delete: "Delete" +deleted: "Deleted" deleteAndEdit: "Delete and edit" deleteAndEditConfirm: "Are you sure you want to delete this post and edit it? You\ \ will lose all reactions, boosts and replies to it." +editNote: "Edit note" +edited: "Edited" addToList: "Add to list" sendMessage: "Send a message" copyUsername: "Copy username" diff --git a/packages/backend/migration/1682753227899-NoteEdit.js b/packages/backend/migration/1682753227899-NoteEdit.js new file mode 100644 index 000000000..55a0de020 --- /dev/null +++ b/packages/backend/migration/1682753227899-NoteEdit.js @@ -0,0 +1,53 @@ +export class NoteEdit1682753227899 { + name = "NoteEdit1682753227899"; + + async up(queryRunner) { + await queryRunner.query(` + CREATE TABLE "note_edit" ( + "id" character varying(32) NOT NULL, + "noteId" character varying(32) NOT NULL, + "text" text, + "cw" character varying(512), + "fileIds" character varying(32) array NOT NULL DEFAULT '{}', + "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, + CONSTRAINT "PK_736fc6e0d4e222ecc6f82058e08" PRIMARY KEY ("id") + ) + `); + await queryRunner.query(` + COMMENT ON COLUMN "note_edit"."noteId" IS 'The ID of note.' + `); + await queryRunner.query(` + COMMENT ON COLUMN "note_edit"."updatedAt" IS 'The updated date of the Note.' + `); + await queryRunner.query(` + CREATE INDEX "IDX_702ad5ae993a672e4fbffbcd38" ON "note_edit" ("noteId") + `); + await queryRunner.query(` + ALTER TABLE "note" + ADD "updatedAt" TIMESTAMP WITH TIME ZONE + `); + await queryRunner.query(` + COMMENT ON COLUMN "note"."updatedAt" IS 'The updated date of the Note.' + `); + await queryRunner.query(` + ALTER TABLE "note_edit" + ADD CONSTRAINT "FK_702ad5ae993a672e4fbffbcd38c" + FOREIGN KEY ("noteId") + REFERENCES "note"("id") + ON DELETE CASCADE + ON UPDATE NO ACTION + `); + } + + async down(queryRunner) { + await queryRunner.query(` + ALTER TABLE "note_edit" DROP CONSTRAINT "FK_702ad5ae993a672e4fbffbcd38c" + `); + await queryRunner.query(` + ALTER TABLE "note" DROP COLUMN "updatedAt" + `); + await queryRunner.query(` + DROP TABLE "note_edit" + `); + } +} diff --git a/packages/backend/src/db/postgre.ts b/packages/backend/src/db/postgre.ts index bdeb910e8..dd202b3de 100644 --- a/packages/backend/src/db/postgre.ts +++ b/packages/backend/src/db/postgre.ts @@ -72,6 +72,7 @@ import { PasswordResetRequest } from "@/models/entities/password-reset-request.j import { UserPending } from "@/models/entities/user-pending.js"; import { Webhook } from "@/models/entities/webhook.js"; import { UserIp } from "@/models/entities/user-ip.js"; +import { NoteEdit } from "@/models/entities/note-edit.js"; import { entities as charts } from "@/services/chart/entities.js"; import { envOption } from "../env.js"; @@ -140,6 +141,7 @@ export const entities = [ RenoteMuting, Blocking, Note, + NoteEdit, NoteFavorite, NoteReaction, NoteWatching, diff --git a/packages/backend/src/misc/schema.ts b/packages/backend/src/misc/schema.ts index 7eaeb92e0..6e03d30d9 100644 --- a/packages/backend/src/misc/schema.ts +++ b/packages/backend/src/misc/schema.ts @@ -30,6 +30,7 @@ import { packedFederationInstanceSchema } from "@/models/schema/federation-insta import { packedQueueCountSchema } from "@/models/schema/queue.js"; import { packedGalleryPostSchema } from "@/models/schema/gallery-post.js"; import { packedEmojiSchema } from "@/models/schema/emoji.js"; +import { packedNoteEdit } from "@/models/schema/note-edit.js"; export const refs = { UserLite: packedUserLiteSchema, @@ -45,6 +46,7 @@ export const refs = { App: packedAppSchema, MessagingMessage: packedMessagingMessageSchema, Note: packedNoteSchema, + NoteEdit: packedNoteEdit, NoteReaction: packedNoteReactionSchema, NoteFavorite: packedNoteFavoriteSchema, Notification: packedNotificationSchema, diff --git a/packages/backend/src/models/entities/note-edit.ts b/packages/backend/src/models/entities/note-edit.ts new file mode 100644 index 000000000..a65375efb --- /dev/null +++ b/packages/backend/src/models/entities/note-edit.ts @@ -0,0 +1,51 @@ +import { + Entity, + JoinColumn, + Column, + ManyToOne, + PrimaryColumn, + Index, +} from "typeorm"; +import { Note } from "./note.js"; +import { id } from "../id.js"; +import { DriveFile } from "./drive-file.js"; + +@Entity() +export class NoteEdit { + @PrimaryColumn(id()) + public id: string; + + @Index() + @Column({ + ...id(), + comment: 'The ID of note.', + }) + public noteId: Note["id"]; + + @ManyToOne(type => Note, { + onDelete: 'CASCADE', + }) + @JoinColumn() + public note: Note | null; + + @Column('text', { + nullable: true, + }) + public text: string | null; + + @Column('varchar', { + length: 512, nullable: true, + }) + public cw: string | null; + + @Column({ + ...id(), + array: true, default: '{}', + }) + public fileIds: DriveFile["id"][]; + + @Column('timestamp with time zone', { + comment: 'The updated date of the Note.', + }) + public updatedAt: Date; +} diff --git a/packages/backend/src/models/entities/note.ts b/packages/backend/src/models/entities/note.ts index fd6b170c0..10449bb6d 100644 --- a/packages/backend/src/models/entities/note.ts +++ b/packages/backend/src/models/entities/note.ts @@ -230,6 +230,12 @@ export class Note { comment: '[Denormalized]', }) public renoteUserHost: string | null; + + @Column('timestamp with time zone', { + nullable: true, + comment: 'The updated date of the Note.', + }) + public updatedAt: Date; //#endregion constructor(data: Partial) { diff --git a/packages/backend/src/models/index.ts b/packages/backend/src/models/index.ts index f68166c17..cfc3b01c5 100644 --- a/packages/backend/src/models/index.ts +++ b/packages/backend/src/models/index.ts @@ -67,11 +67,13 @@ import { UserPending } from "./entities/user-pending.js"; import { InstanceRepository } from "./repositories/instance.js"; import { Webhook } from "./entities/webhook.js"; import { UserIp } from "./entities/user-ip.js"; +import { NoteEdit } from "./entities/note-edit.js"; export const Announcements = db.getRepository(Announcement); export const AnnouncementReads = db.getRepository(AnnouncementRead); export const Apps = AppRepository; export const Notes = NoteRepository; +export const NoteEdits = db.getRepository(NoteEdit); export const NoteFavorites = NoteFavoriteRepository; export const NoteWatchings = db.getRepository(NoteWatching); export const NoteThreadMutings = db.getRepository(NoteThreadMuting); diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts index 5e56a817b..74696f851 100644 --- a/packages/backend/src/models/repositories/note.ts +++ b/packages/backend/src/models/repositories/note.ts @@ -235,10 +235,11 @@ export const NoteRepository = db.getRepository(Note).extend({ mentions: note.mentions.length > 0 ? note.mentions : undefined, uri: note.uri || undefined, url: note.url || undefined, + updatedAt: note.updatedAt?.toISOString() || undefined, ...(opts.detail ? { - reply: note.replyId + reply: note.replyId ? this.pack(note.reply || note.replyId, me, { detail: false, _hint_: options?._hint_, diff --git a/packages/backend/src/models/schema/note-edit.ts b/packages/backend/src/models/schema/note-edit.ts new file mode 100644 index 000000000..e877f3f94 --- /dev/null +++ b/packages/backend/src/models/schema/note-edit.ts @@ -0,0 +1,49 @@ +export const packedNoteEdit = { + type: "object", + properties: { + id: { + type: "string", + optional: false, + nullable: false, + format: "id", + example: "xxxxxxxxxx", + }, + updatedAt: { + type: "string", + optional: false, + nullable: false, + format: "date-time", + }, + note: { + type: "object", + optional: false, + nullable: false, + ref: "Note", + }, + noteId: { + type: "string", + optional: false, + nullable: false, + format: "id", + }, + text: { + type: "string", + optional: true, + nullable: true, + }, + cw: { + type: "string", + optional: true, + nullable: true, + }, + fileIds: { + type: "array", + optional: true, + nullable: true, + items: { + type: "string", + format: "id", + }, + }, + }, +} as const; diff --git a/packages/backend/src/remote/activitypub/kernel/update/index.ts b/packages/backend/src/remote/activitypub/kernel/update/index.ts index 4f1514ddd..558a20ce0 100644 --- a/packages/backend/src/remote/activitypub/kernel/update/index.ts +++ b/packages/backend/src/remote/activitypub/kernel/update/index.ts @@ -2,7 +2,7 @@ import type { CacheableRemoteUser } from "@/models/entities/user.js"; import type { IUpdate } from "../../type.js"; import { getApType, isActor } from "../../type.js"; import { apLogger } from "../../logger.js"; -import { updateQuestion } from "../../models/question.js"; +import { updateNote } from "../../models/note.js"; import Resolver from "../../resolver.js"; import { updatePerson } from "../../models/person.js"; @@ -29,10 +29,22 @@ export default async ( if (isActor(object)) { await updatePerson(actor.uri!, resolver, object); return "ok: Person updated"; - } else if (getApType(object) === "Question") { - await updateQuestion(object, resolver).catch((e) => console.log(e)); - return "ok: Question updated"; - } else { - return `skip: Unknown type: ${getApType(object)}`; + } + + const objectType = getApType(object); + switch (objectType) { + case "Question": + case "Note": + case "Article": + case "Document": + case "Page": + let failed = false; + await updateNote(object, resolver).catch((e: Error) => { + failed = true; + }); + return failed ? "skip: Note update failed" : "ok: Note updated"; + + default: + return `skip: Unknown type: ${objectType}`; } }; diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 033157b08..6508d01e9 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -1,22 +1,32 @@ import promiseLimit from "promise-limit"; - +import * as mfm from "mfm-js"; import config from "@/config/index.js"; import Resolver from "../resolver.js"; import post from "@/services/note/create.js"; +import { extractMentionedUsers } from "@/services/note/create.js"; import { resolvePerson } from "./person.js"; import { resolveImage } from "./image.js"; -import type { CacheableRemoteUser } from "@/models/entities/user.js"; +import type { + ILocalUser, + CacheableRemoteUser, +} from "@/models/entities/user.js"; import { htmlToMfm } from "../misc/html-to-mfm.js"; import { extractApHashtags } from "./tag.js"; import { unique, toArray, toSingle } from "@/prelude/array.js"; -import { extractPollFromQuestion } from "./question.js"; +import { extractPollFromQuestion, updateQuestion } from "./question.js"; import vote from "@/services/note/polls/vote.js"; import { apLogger } from "../logger.js"; import type { DriveFile } from "@/models/entities/drive-file.js"; import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { extractDbHost, toPuny } from "@/misc/convert-host.js"; -import { Emojis, Polls, MessagingMessages } from "@/models/index.js"; -import type { Note } from "@/models/entities/note.js"; +import { + Emojis, + Polls, + MessagingMessages, + Notes, + NoteEdits, +} from "@/models/index.js"; +import type { IMentionedRemoteUsers, Note } from "@/models/entities/note.js"; import type { IObject, IPost } from "../type.js"; import { getOneApId, @@ -28,7 +38,6 @@ import { } from "../type.js"; import type { Emoji } from "@/models/entities/emoji.js"; import { genId } from "@/misc/gen-id.js"; -import { fetchMeta } from "@/misc/fetch-meta.js"; import { getApLock } from "@/misc/app-lock.js"; import { createMessage } from "@/services/messages/create.js"; import { parseAudience } from "../audience.js"; @@ -36,6 +45,10 @@ import { extractApMentions } from "./mention.js"; import DbResolver from "../db-resolver.js"; import { StatusError } from "@/misc/fetch.js"; import { shouldBlockInstance } from "@/misc/should-block-instance.js"; +import { publishNoteStream } from "@/services/stream.js"; +import { extractHashtags } from "@/misc/extract-hashtags.js"; +import { UserProfiles } from "@/models/index.js"; +import { In } from "typeorm"; const logger = apLogger; @@ -497,3 +510,204 @@ export async function extractEmojis( }), ); } + +type TagDetail = { + type: string; + name: string; +}; + +export async function updateNote(value: string | IObject, resolver?: Resolver) { + const uri = typeof value === "string" ? value : value.id; + if (!uri) throw new Error("Missing note uri"); + + // Skip if URI points to this server + if (uri.startsWith(`${config.url}/`)) throw new Error("uri points local"); + + // A new resolver is created if not specified + if (resolver == null) resolver = new Resolver(); + + // Resolve the updated Note object + const post = (await resolver.resolve(value)) as IPost; + + const actor = (await resolvePerson( + getOneApId(post.attributedTo), + resolver, + )) as CacheableRemoteUser; + + // Already registered with this server? + const note = await Notes.findOneBy({ uri }); + if (note == null) { + return await createNote(post, resolver); + } + + // Text parsing + let text: string | null = null; + if ( + post.source?.mediaType === "text/x.misskeymarkdown" && + typeof post.source?.content === "string" + ) { + text = post.source.content; + } else if (typeof post._misskey_content !== "undefined") { + text = post._misskey_content; + } else if (typeof post.content === "string") { + text = htmlToMfm(post.content, post.tag); + } + + const cw = post.sensitive && post.summary; + + // File parsing + const fileList = post.attachment + ? Array.isArray(post.attachment) + ? post.attachment + : [post.attachment] + : []; + const files = fileList.map((f) => (f.sensitive = post.sensitive)); + + // Fetch files + const limit = promiseLimit(2); + + const driveFiles = ( + await Promise.all( + fileList.map( + (x) => limit(() => resolveImage(actor, x)) as Promise, + ), + ) + ).filter((file) => file != null); + const fileIds = driveFiles.map((file) => file.id); + const fileTypes = driveFiles.map((file) => file.type); + + const apEmojis = ( + await extractEmojis(post.tag || [], actor.host).catch((e) => []) + ).map((emoji) => emoji.name); + const apMentions = await extractApMentions(post.tag); + const apHashtags = await extractApHashtags(post.tag); + + const poll = await extractPollFromQuestion(post, resolver).catch( + () => undefined, + ); + + const choices = poll?.choices.map((choice) => mfm.parse(choice)).flat() ?? []; + + const tokens = mfm + .parse(text || "") + .concat(mfm.parse(cw || "")) + .concat(choices); + + const hashTags: string[] = apHashtags || extractHashtags(tokens); + + const mentionUsers = + apMentions || (await extractMentionedUsers(actor, tokens)); + + const mentionUserIds = mentionUsers.map((user) => user.id); + const remoteUsers = mentionUsers.filter((user) => user.host != null); + const remoteUserIds = remoteUsers.map((user) => user.id); + const remoteProfiles = await UserProfiles.findBy({ + userId: In(remoteUserIds), + }); + const mentionedRemoteUsers = remoteUsers.map((user) => { + const profile = remoteProfiles.find( + (profile) => profile.userId === user.id, + ); + return { + username: user.username, + host: user.host ?? null, + uri: user.uri, + url: profile ? profile.url : undefined, + } as IMentionedRemoteUsers[0]; + }); + + let updating = false; + const update = {} as Partial; + if (text && text !== note.text) { + update.text = text; + updating = true; + } + if (cw !== note.cw) { + update.cw = cw ? cw : null; + updating = true; + } + if (fileIds.sort().join(",") !== note.fileIds.sort().join(",")) { + update.fileIds = fileIds; + update.attachedFileTypes = fileTypes; + updating = true; + } + + if (hashTags.sort().join(",") !== note.tags.sort().join(",")) { + update.tags = hashTags; + updating = true; + } + + if (mentionUserIds.sort().join(",") !== note.mentions.sort().join(",")) { + update.mentions = mentionUserIds; + update.mentionedRemoteUsers = JSON.stringify(mentionedRemoteUsers); + updating = true; + } + + if (apEmojis.sort().join(",") !== note.emojis.sort().join(",")) { + update.emojis = apEmojis; + updating = true; + } + + if (note.hasPoll !== !!poll) { + update.hasPoll = !!poll; + updating = true; + } + + if (poll) { + const dbPoll = await Polls.findOneBy({ noteId: note.id }); + if (dbPoll == null) { + await Polls.insert({ + noteId: note.id, + choices: poll?.choices, + multiple: poll?.multiple, + votes: poll?.votes, + expiresAt: poll?.expiresAt, + noteVisibility: note.visibility, + userId: actor.id, + userHost: actor.host, + }); + updating = true; + } else if ( + dbPoll.multiple !== poll.multiple || + dbPoll.expiresAt !== poll.expiresAt || + dbPoll.noteVisibility !== note.visibility || + dbPoll.votes.length !== poll.votes?.length || + JSON.stringify(dbPoll.choices) !== JSON.stringify(poll.choices) + ) { + await Polls.update( + { noteId: note.id }, + { + choices: poll?.choices, + multiple: poll?.multiple, + votes: poll?.votes, + expiresAt: poll?.expiresAt, + noteVisibility: note.visibility, + }, + ); + updating = true; + } + } + + // Update Note + if (updating) { + update.updatedAt = new Date(); + + // Save updated note to the database + await Notes.update({ uri }, update); + + // Save an edit history for the previous note + await NoteEdits.insert({ + id: genId(), + noteId: note.id, + text: note.text, + cw: note.cw, + fileIds: note.fileIds, + updatedAt: update.updatedAt, + }); + + // Publish update event for the updated note details + publishNoteStream(note.id, "updated", { + updatedAt: update.updatedAt, + }); + } +} diff --git a/packages/backend/src/server/api/stream/types.ts b/packages/backend/src/server/api/stream/types.ts index 9becf9f64..2c59d51d1 100644 --- a/packages/backend/src/server/api/stream/types.ts +++ b/packages/backend/src/server/api/stream/types.ts @@ -145,6 +145,9 @@ export interface NoteStreamTypes { replied: { id: Note["id"]; }; + updated: { + updatedAt: Note["updatedAt"]; + }; } type NoteStreamEventTypes = { [key in keyof NoteStreamTypes]: { diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index 5dd324d89..a3d784cba 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -846,7 +846,7 @@ function incNotesCountOfUser(user: { id: User["id"] }) { .execute(); } -async function extractMentionedUsers( +export async function extractMentionedUsers( user: { host: User["host"] }, tokens: mfm.MfmNode[], ): Promise { diff --git a/packages/calckey-js/src/streaming.types.ts b/packages/calckey-js/src/streaming.types.ts index 44ef647bc..7f1edc87d 100644 --- a/packages/calckey-js/src/streaming.types.ts +++ b/packages/calckey-js/src/streaming.types.ts @@ -1,4 +1,4 @@ -import { +import type { Antenna, CustomEmoji, DriveFile, @@ -171,6 +171,13 @@ export type NoteUpdatedEvent = body: { id: Note["id"]; }; + } + | { + id: Note["id"]; + type: "updated"; + body: { + updatedAt: string; + }; }; export type BroadcastEvents = { diff --git a/packages/client/src/components/MkNoteDetailed.vue b/packages/client/src/components/MkNoteDetailed.vue index de9cfd0bc..aed5c61ae 100644 --- a/packages/client/src/components/MkNoteDetailed.vue +++ b/packages/client/src/components/MkNoteDetailed.vue @@ -108,7 +108,7 @@ const props = defineProps<{ const inChannel = inject("inChannel", null); -let note = $ref(deepClone(props.note)); +let note = $ref(props.note); const enableEmojiReactions = defaultStore.state.enableEmojiReactions; @@ -174,15 +174,12 @@ useNoteCapture({ function reply(viaKeyboard = false): void { pleaseLogin(); - os.post( - { - reply: appearNote, - animation: !viaKeyboard, - }, - () => { - focus(); - } - ); + os.post({ + reply: appearNote, + animation: !viaKeyboard, + }).then(() => { + focus(); + }); } function react(viaKeyboard = false): void { @@ -309,19 +306,65 @@ if (appearNote.replyId) { }); } -function onNoteReplied(noteData: NoteUpdatedEvent): void { +async function onNoteUpdated(noteData: NoteUpdatedEvent): Promise { const { type, id, body } = noteData; - if (type === "replied" && id === appearNote.id) { - const { id: createdId } = body; - os.api("notes/show", { - noteId: createdId, - }).then((note) => { - if (note.replyId === appearNote.id) { - replies.value.unshift(note); - directReplies.value.unshift(note); + let found = -1; + if (id === appearNote.id) { + found = 0; + } else { + for (let i = 0; i < replies.value.length; i++) { + const reply = replies.value[i]; + if (reply.id === id) { + found = i + 1; + break; } - }); + } + } + + if (found === -1) { + return; + } + + switch (type) { + case "replied": + const { id: createdId } = body; + const replyNote = await os.api("notes/show", { + noteId: createdId, + }); + + replies.value.splice(found, 0, replyNote); + if (found === 0) { + directReplies.value.unshift(replyNote); + } + break; + + case "updated": + let updatedNote = appearNote; + if (found > 0) { + updatedNote = replies.value[found - 1]; + } + + const editedNote = await os.api("notes/show", { + noteId: id, + }); + + const keys = new Set(); + Object.keys(editedNote) + .concat(Object.keys(updatedNote)) + .forEach((key) => keys.add(key)); + keys.forEach((key) => { + updatedNote[key] = editedNote[key]; + }); + break; + + case "deleted": + if (found === 0) { + isDeleted.value = true; + } else { + replies.value.splice(found - 1, 1); + } + break; } } @@ -330,19 +373,19 @@ document.addEventListener("wheel", () => { }); onMounted(() => { - stream.on("noteUpdated", onNoteReplied); + stream.on("noteUpdated", onNoteUpdated); isScrolling = false; - noteEl.scrollIntoView(); + noteEl?.scrollIntoView(); }); onUpdated(() => { if (!isScrolling) { - noteEl.scrollIntoView(); + noteEl?.scrollIntoView(); } }); onUnmounted(() => { - stream.off("noteUpdated", onNoteReplied); + stream.off("noteUpdated", onNoteUpdated); }); diff --git a/packages/client/src/components/MkNoteHeader.vue b/packages/client/src/components/MkNoteHeader.vue index c4443141b..65f9a336f 100644 --- a/packages/client/src/components/MkNoteHeader.vue +++ b/packages/client/src/components/MkNoteHeader.vue @@ -18,6 +18,13 @@
+ ({{ i18n.ts.edited }})
@@ -39,14 +46,14 @@ import MkVisibility from "@/components/MkVisibility.vue"; import MkInstanceTicker from "@/components/MkInstanceTicker.vue"; import { notePage } from "@/filters/note"; import { userPage } from "@/filters/user"; -import { deepClone } from "@/scripts/clone"; +import { i18n } from "@/i18n"; const props = defineProps<{ note: misskey.entities.Note; pinned?: boolean; }>(); -let note = $ref(deepClone(props.note)); +let note = $ref(props.note); const showTicker = defaultStore.state.instanceTicker === "always" || diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue index f5e70891f..b124912b1 100644 --- a/packages/client/src/components/MkNoteSub.vue +++ b/packages/client/src/components/MkNoteSub.vue @@ -180,7 +180,6 @@ import { useRouter } from "@/router"; import * as os from "@/os"; import { reactionPicker } from "@/scripts/reaction-picker"; import { i18n } from "@/i18n"; -import { deepClone } from "@/scripts/clone"; import { useNoteCapture } from "@/scripts/use-note-capture"; import { defaultStore } from "@/store"; @@ -203,7 +202,7 @@ const props = withDefaults( } ); -let note = $ref(deepClone(props.note)); +let note = $ref(props.note); const isRenote = note.renote != null && @@ -239,15 +238,12 @@ useNoteCapture({ function reply(viaKeyboard = false): void { pleaseLogin(); - os.post( - { - reply: appearNote, - animation: !viaKeyboard, - }, - () => { - focus(); - } - ); + os.post({ + reply: appearNote, + animation: !viaKeyboard, + }).then(() => { + focus(); + }); } function react(viaKeyboard = false): void { diff --git a/packages/client/src/components/global/MkTime.vue b/packages/client/src/components/global/MkTime.vue index 66a6416e8..db53248bb 100644 --- a/packages/client/src/components/global/MkTime.vue +++ b/packages/client/src/components/global/MkTime.vue @@ -5,6 +5,7 @@ + @@ -15,7 +16,7 @@ import { i18n } from "@/i18n"; const props = withDefaults( defineProps<{ time: Date | string; - mode?: "relative" | "absolute" | "detail"; + mode?: "relative" | "absolute" | "detail" | "none"; }>(), { mode: "relative", diff --git a/packages/client/src/scripts/get-note-menu.ts b/packages/client/src/scripts/get-note-menu.ts index 0c8d517e5..03c35e132 100644 --- a/packages/client/src/scripts/get-note-menu.ts +++ b/packages/client/src/scripts/get-note-menu.ts @@ -105,16 +105,14 @@ export function getNoteMenu(props: { noteId: appearNote.id, }, undefined, - null, - (res) => { - if (res.id === "72dab508-c64d-498f-8740-a8eec1ba385a") { - os.alert({ - type: "error", - text: i18n.ts.pinLimitExceeded, - }); - } - }, - ); + ).catch((res) => { + if (res.id === "72dab508-c64d-498f-8740-a8eec1ba385a") { + os.alert({ + type: "error", + text: i18n.ts.pinLimitExceeded, + }); + } + }); } async function clip(): Promise { From 6eed0380280f7a89b4ef42c3bb587bffd5a89dc6 Mon Sep 17 00:00:00 2001 From: Kaity A Date: Mon, 1 May 2023 03:17:38 +1000 Subject: [PATCH 022/722] fix poll voting causing edit revisions. --- packages/backend/src/models/repositories/note.ts | 2 +- .../src/remote/activitypub/models/note.ts | 16 ++++++++++++++-- packages/backend/src/server/api/stream/types.ts | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/backend/src/models/repositories/note.ts b/packages/backend/src/models/repositories/note.ts index 74696f851..1310c14b0 100644 --- a/packages/backend/src/models/repositories/note.ts +++ b/packages/backend/src/models/repositories/note.ts @@ -239,7 +239,7 @@ export const NoteRepository = db.getRepository(Note).extend({ ...(opts.detail ? { - reply: note.replyId + reply: note.replyId ? this.pack(note.reply || note.replyId, me, { detail: false, _hint_: options?._hint_, diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 6508d01e9..5464c8a89 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -586,7 +586,7 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { () => undefined, ); - const choices = poll?.choices.map((choice) => mfm.parse(choice)).flat() ?? []; + const choices = poll?.choices.flatMap((choice) => mfm.parse(choice)) ?? []; const tokens = mfm .parse(text || "") @@ -617,6 +617,7 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { }); let updating = false; + let publishing = false; const update = {} as Partial; if (text && text !== note.text) { update.text = text; @@ -671,7 +672,6 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { dbPoll.multiple !== poll.multiple || dbPoll.expiresAt !== poll.expiresAt || dbPoll.noteVisibility !== note.visibility || - dbPoll.votes.length !== poll.votes?.length || JSON.stringify(dbPoll.choices) !== JSON.stringify(poll.choices) ) { await Polls.update( @@ -685,6 +685,14 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { }, ); updating = true; + } else { + for (let i = 0; i < poll.choices.length; i++) { + if (dbPoll.votes[i] !== poll.votes?.[i]) { + await Polls.update({ noteId: note.id }, { votes: poll?.votes }); + publishing = true; + break; + } + } } } @@ -705,6 +713,10 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { updatedAt: update.updatedAt, }); + publishing = true; + } + + if (publishing) { // Publish update event for the updated note details publishNoteStream(note.id, "updated", { updatedAt: update.updatedAt, diff --git a/packages/backend/src/server/api/stream/types.ts b/packages/backend/src/server/api/stream/types.ts index 2c59d51d1..91095a46d 100644 --- a/packages/backend/src/server/api/stream/types.ts +++ b/packages/backend/src/server/api/stream/types.ts @@ -146,7 +146,7 @@ export interface NoteStreamTypes { id: Note["id"]; }; updated: { - updatedAt: Note["updatedAt"]; + updatedAt?: Note["updatedAt"]; }; } type NoteStreamEventTypes = { From 61dde4c0b05aba67ba2f68bca3dbf3e558bedf07 Mon Sep 17 00:00:00 2001 From: Kaitlyn Allan Date: Tue, 2 May 2023 17:37:48 +1000 Subject: [PATCH 023/722] updates to include alt text editing --- .../src/remote/activitypub/models/note.ts | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index 5464c8a89..f699497d5 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -16,7 +16,7 @@ import { unique, toArray, toSingle } from "@/prelude/array.js"; import { extractPollFromQuestion, updateQuestion } from "./question.js"; import vote from "@/services/note/polls/vote.js"; import { apLogger } from "../logger.js"; -import type { DriveFile } from "@/models/entities/drive-file.js"; +import { DriveFile } from "@/models/entities/drive-file.js"; import { deliverQuestionUpdate } from "@/services/note/polls/update.js"; import { extractDbHost, toPuny } from "@/misc/convert-host.js"; import { @@ -25,6 +25,7 @@ import { MessagingMessages, Notes, NoteEdits, + DriveFiles, } from "@/models/index.js"; import type { IMentionedRemoteUsers, Note } from "@/models/entities/note.js"; import type { IObject, IPost } from "../type.js"; @@ -49,6 +50,8 @@ import { publishNoteStream } from "@/services/stream.js"; import { extractHashtags } from "@/misc/extract-hashtags.js"; import { UserProfiles } from "@/models/index.js"; import { In } from "typeorm"; +import { DB_MAX_IMAGE_COMMENT_LENGTH } from "@/misc/hard-limits.js"; +import { truncate } from "@/misc/truncate.js"; const logger = apLogger; @@ -516,6 +519,10 @@ type TagDetail = { name: string; }; +function notEmpty(partial: Partial) { + return Object.keys(partial).length > 0; +} + export async function updateNote(value: string | IObject, resolver?: Resolver) { const uri = typeof value === "string" ? value : value.id; if (!uri) throw new Error("Missing note uri"); @@ -540,6 +547,9 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { return await createNote(post, resolver); } + // Whether to tell clients the note has been updated and requires refresh. + let publishing = false; + // Text parsing let text: string | null = null; if ( @@ -569,7 +579,23 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { const driveFiles = ( await Promise.all( fileList.map( - (x) => limit(() => resolveImage(actor, x)) as Promise, + (x) => + limit(async () => { + const file = await resolveImage(actor, x); + const update: Partial = {}; + + const altText = truncate(x.name, DB_MAX_IMAGE_COMMENT_LENGTH); + if (file.comment !== altText) { + update.comment = altText; + } + + if (notEmpty(update)) { + await DriveFiles.update(file.id, update); + publishing = true; + } + + return file; + }) as Promise, ), ) ).filter((file) => file != null); @@ -616,42 +642,33 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { } as IMentionedRemoteUsers[0]; }); - let updating = false; - let publishing = false; const update = {} as Partial; if (text && text !== note.text) { update.text = text; - updating = true; } if (cw !== note.cw) { update.cw = cw ? cw : null; - updating = true; } if (fileIds.sort().join(",") !== note.fileIds.sort().join(",")) { update.fileIds = fileIds; update.attachedFileTypes = fileTypes; - updating = true; } if (hashTags.sort().join(",") !== note.tags.sort().join(",")) { update.tags = hashTags; - updating = true; } if (mentionUserIds.sort().join(",") !== note.mentions.sort().join(",")) { update.mentions = mentionUserIds; update.mentionedRemoteUsers = JSON.stringify(mentionedRemoteUsers); - updating = true; } if (apEmojis.sort().join(",") !== note.emojis.sort().join(",")) { update.emojis = apEmojis; - updating = true; } if (note.hasPoll !== !!poll) { update.hasPoll = !!poll; - updating = true; } if (poll) { @@ -697,7 +714,7 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { } // Update Note - if (updating) { + if (notEmpty(update)) { update.updatedAt = new Date(); // Save updated note to the database From 389c531b2cbe8fafb5535cf4722512d4a99573f3 Mon Sep 17 00:00:00 2001 From: Kaity A Date: Tue, 2 May 2023 18:22:42 +1000 Subject: [PATCH 024/722] update file sensitivity on note edit --- packages/backend/src/remote/activitypub/models/note.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/backend/src/remote/activitypub/models/note.ts b/packages/backend/src/remote/activitypub/models/note.ts index f699497d5..7b41de670 100644 --- a/packages/backend/src/remote/activitypub/models/note.ts +++ b/packages/backend/src/remote/activitypub/models/note.ts @@ -589,6 +589,12 @@ export async function updateNote(value: string | IObject, resolver?: Resolver) { update.comment = altText; } + // Don't unmark previously marked sensitive files, + // but if edited post contains sensitive marker, update it. + if (post.sensitive && !file.isSensitive) { + update.isSensitive = post.sensitive; + } + if (notEmpty(update)) { await DriveFiles.update(file.id, update); publishing = true; From 3e2c8f490e3bbd4234b62948fe644ac00ebd54de Mon Sep 17 00:00:00 2001 From: Kaity A Date: Tue, 2 May 2023 19:30:05 +1000 Subject: [PATCH 025/722] allow upstream note updates to propogate --- packages/client/src/components/MkNote.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 7e3fd6be5..d943cb921 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -259,8 +259,8 @@ const props = defineProps<{ const inChannel = inject("inChannel", null); -let note = $ref(deepClone(props.note)); - +let note = $ref(props.note); +`` // plugin if (noteViewInterruptors.length > 0) { onMounted(async () => { From 69bf975b58c075d0d247186c8d22ee51ab000a42 Mon Sep 17 00:00:00 2001 From: Kaity A Date: Tue, 2 May 2023 19:32:36 +1000 Subject: [PATCH 026/722] allow upstream note updates to propogate --- packages/client/src/components/MkNote.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index d943cb921..b809ba8a1 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -260,7 +260,7 @@ const props = defineProps<{ const inChannel = inject("inChannel", null); let note = $ref(props.note); -`` + // plugin if (noteViewInterruptors.length > 0) { onMounted(async () => { From ad181a10c301697f2d08e28499f17106053900bd Mon Sep 17 00:00:00 2001 From: Kaity A Date: Tue, 2 May 2023 22:42:33 +1000 Subject: [PATCH 027/722] Readd deepClone and move updated into note capture --- packages/client/src/components/MkNote.vue | 2 +- .../client/src/components/MkNoteDetailed.vue | 21 +-------- packages/client/src/components/MkNoteSub.vue | 4 +- .../client/src/scripts/use-note-capture.ts | 44 +++++++++++++------ 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index b809ba8a1..7e3fd6be5 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -259,7 +259,7 @@ const props = defineProps<{ const inChannel = inject("inChannel", null); -let note = $ref(props.note); +let note = $ref(deepClone(props.note)); // plugin if (noteViewInterruptors.length > 0) { diff --git a/packages/client/src/components/MkNoteDetailed.vue b/packages/client/src/components/MkNoteDetailed.vue index aed5c61ae..62b12a909 100644 --- a/packages/client/src/components/MkNoteDetailed.vue +++ b/packages/client/src/components/MkNoteDetailed.vue @@ -108,7 +108,7 @@ const props = defineProps<{ const inChannel = inject("inChannel", null); -let note = $ref(props.note); +let note = $ref(deepClone(props.note)); const enableEmojiReactions = defaultStore.state.enableEmojiReactions; @@ -339,25 +339,6 @@ async function onNoteUpdated(noteData: NoteUpdatedEvent): Promise { } break; - case "updated": - let updatedNote = appearNote; - if (found > 0) { - updatedNote = replies.value[found - 1]; - } - - const editedNote = await os.api("notes/show", { - noteId: id, - }); - - const keys = new Set(); - Object.keys(editedNote) - .concat(Object.keys(updatedNote)) - .forEach((key) => keys.add(key)); - keys.forEach((key) => { - updatedNote[key] = editedNote[key]; - }); - break; - case "deleted": if (found === 0) { isDeleted.value = true; diff --git a/packages/client/src/components/MkNoteSub.vue b/packages/client/src/components/MkNoteSub.vue index d7a43a25e..ca4267c3c 100644 --- a/packages/client/src/components/MkNoteSub.vue +++ b/packages/client/src/components/MkNoteSub.vue @@ -183,6 +183,7 @@ import { reactionPicker } from "@/scripts/reaction-picker"; import { i18n } from "@/i18n"; import { useNoteCapture } from "@/scripts/use-note-capture"; import { defaultStore } from "@/store"; +import { deepClone } from "@/scripts/clone"; const router = useRouter(); @@ -203,7 +204,7 @@ const props = withDefaults( } ); -let note = $ref(props.note); +let note = $ref(deepClone(props.note)); const isRenote = note.renote != null && @@ -236,6 +237,7 @@ const enableEmojiReactions = defaultStore.state.enableEmojiReactions; useNoteCapture({ rootEl: el, note: $$(appearNote), + isDeletedRef: isDeleted, }); function reply(viaKeyboard = false): void { diff --git a/packages/client/src/scripts/use-note-capture.ts b/packages/client/src/scripts/use-note-capture.ts index 42ddcb440..5d0ca5529 100644 --- a/packages/client/src/scripts/use-note-capture.ts +++ b/packages/client/src/scripts/use-note-capture.ts @@ -2,6 +2,7 @@ import { onUnmounted, Ref } from "vue"; import * as misskey from "calckey-js"; import { stream } from "@/stream"; import { $i } from "@/account"; +import * as os from "@/os"; export function useNoteCapture(props: { rootEl: Ref; @@ -11,7 +12,7 @@ export function useNoteCapture(props: { const note = props.note; const connection = $i ? stream : null; - function onStreamNoteUpdated(noteData): void { + async function onStreamNoteUpdated(noteData): Promise { const { type, id, body } = noteData; if (id !== note.value.id) return; @@ -47,7 +48,7 @@ export function useNoteCapture(props: { note.value.reactions[reaction] = Math.max(0, currentCount - 1); if ($i && body.userId === $i.id) { - note.value.myReaction = null; + note.value.myReaction = undefined; } break; } @@ -55,18 +56,20 @@ export function useNoteCapture(props: { case "pollVoted": { const choice = body.choice; - const choices = [...note.value.poll.choices]; - choices[choice] = { - ...choices[choice], - votes: choices[choice].votes + 1, - ...($i && body.userId === $i.id - ? { - isVoted: true, - } - : {}), - }; + if (note.value.poll) { + const choices = [...note.value.poll.choices]; + choices[choice] = { + ...choices[choice], + votes: choices[choice].votes + 1, + ...($i && body.userId === $i.id + ? { + isVoted: true, + } + : {}), + }; + note.value.poll.choices = choices; + } - note.value.poll.choices = choices; break; } @@ -74,6 +77,21 @@ export function useNoteCapture(props: { props.isDeletedRef.value = true; break; } + + case "updated": { + const editedNote = await os.api("notes/show", { + noteId: id, + }); + + const keys = new Set(); + Object.keys(editedNote) + .concat(Object.keys(note.value)) + .forEach((key) => keys.add(key)); + keys.forEach((key) => { + note.value[key] = editedNote[key]; + }); + break; + } } } From fb5cd7bd1685b16be9b71d9156109663dca3842b Mon Sep 17 00:00:00 2001 From: jolupa Date: Tue, 2 May 2023 07:16:36 +0000 Subject: [PATCH 028/722] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1739 of 1739 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 62 +++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 49069a8f2..a5e8cd859 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -14,8 +14,8 @@ ok: "OK" gotIt: "Ho he entès!" cancel: "Cancel·lar" enterUsername: "Introdueix el teu nom d'usuari" -renotedBy: "Resignat per {user}" -noNotes: "Cap publicació" +renotedBy: "Impulsat per {user}" +noNotes: "Cap nota" noNotifications: "Cap notificació" instance: "Instància" settings: "Preferències" @@ -46,7 +46,7 @@ copyLink: "Còpia l'enllaç" delete: "Esborra" deleteAndEdit: "Esborrar i edita" deleteAndEditConfirm: "Estàs segur que vols esborrar aquesta nota i editar-la? Perdràs\ - \ totes les reaccions, resignats i respostes." + \ totes les reaccions, impulsos i respostes." addToList: "Afegir a la llista" sendMessage: "Enviar un missatge" copyUsername: "Còpia nom d'usuari" @@ -73,8 +73,8 @@ exportRequested: "Has sol·licitat una exportació. Això pot trigar una estona. importRequested: "Has sol·licitat una importació. Això pot trigar una estona." lists: "Llistes" noLists: "No tens cap llista" -note: "Publicació" -notes: "Publicacions" +note: "Nota" +notes: "Notes" following: "Seguint" followers: "Seguidors" followsYou: "Et segueix" @@ -94,8 +94,8 @@ enterListName: "Introdueix un nom per a la llista" privacy: "Privadesa" makeFollowManuallyApprove: "Les sol·licituds de seguiment requereixen aprovació" defaultNoteVisibility: "Visibilitat per defecte" -follow: "Seguint" -followRequest: "Enviar la sol·licitud de seguiment" +follow: "Seguir" +followRequest: "Enviar sol·licitud de seguiment" followRequests: "Sol·licituds de seguiment" unfollow: "Deixar de seguir" followRequestPending: "Sol·licituds de seguiment pendents" @@ -116,11 +116,11 @@ reaction: "Reaccions" reactionSetting: "Reaccions a mostrar al selector de reaccions" reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem\ \ \"+\" per afegir." -rememberNoteVisibility: "Recorda la configuració de visibilitat de les publicacions" +rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes" attachCancel: "Eliminar el fitxer adjunt" markAsSensitive: "Marcar com a NSFW" -unmarkAsSensitive: "Deixar de marcar com a sensible" -enterFileName: "Defineix nom del fitxer" +unmarkAsSensitive: "Deixar de marcar com a NSFW" +enterFileName: "Introdueix un nom de fitxer" mute: "Silencia" unmute: "Deixa de silenciar" block: "Bloqueja" @@ -740,9 +740,9 @@ _deck: renameProfile: Canvia el nom de l'espai de treball nameAlreadyExists: Aquest nom d'espai de treball ja existeix. blockConfirm: Estás segur que vols bloquejar aquest compte? -unsuspendConfirm: Estás segur que vols treure la suspensió d'aquesta compte? -unblockConfirm: Estás segur que vols treure el bloqueig d'aquesta compte? -suspendConfirm: Estás segur que vols suspendre aquesta compte? +unsuspendConfirm: Estás segur que vols treure la suspensió d'aquest compte? +unblockConfirm: Estás segur que vols treure el bloqueig d'aquest compte? +suspendConfirm: Estás segur que vols suspendre aquest compte? selectList: Selecciona una llista selectAntenna: Selecciona una antena selectWidget: Selecciona un giny @@ -751,13 +751,12 @@ editWidgetsExit: Fet customEmojis: Emoji personalitzat cacheRemoteFilesDescription: Quant aquesta opció es deshabilitada, els fitxers remots es carregant directament de l'instància remota. Deshabilitar això farà que baixi - l'ús d'emmagatzematge, però incrementa el tràfic, perquè les previsualitzacions - no es generarán. + l'ús d'emmagatzematge, però incrementa el tràfic, perquè les miniatures no es generarán. flagAsBot: Marca aquest compte com un bot flagAsBotDescription: Activa aquesta opció si aquest compte és controlat per un programa. - Si s'activa, això actuarà com una bandera per a altres desenvolupadors i prevenir - cadenes de interaccions infinites amb altres bots a més d'ajustar els sistemes interns - de Calckey per tractar aquest compte com un bot. + Si s'activa, això actuarà com una bandera per a altres desenvolupadors i ajuda a + prevenir cadenes de interaccions infinites amb altres bots a més d'ajustar els sistemes + interns de Calckey per tractar aquest compte com un bot. flagAsCat: Ets un gat? 🐱 flagShowTimelineReplies: Mostrar respostes a la línea de temps flagAsCatDescription: Guanyaràs unes orelles de gat i parlares com un gat! @@ -794,7 +793,7 @@ network: Xarxa disk: Disc instanceInfo: Informació de l'instància statistics: Estadístiques -clearCachedFiles: Neteja memòria cau +clearCachedFiles: Neteja la memòria cau clearQueueConfirmText: Qualsevol nota que continuï a la cua sense entrega no será federada. Normalment aquesta operació no es necessària. clearCachedFilesConfirm: Segur que vols esborrar els fitxers remots de la memòria @@ -930,17 +929,17 @@ enableGlobalTimeline: Activa la línea de temps global disablingTimelinesInfo: Els Administradors i Moderadors sempre tenen accés a totes les líneas temporals, inclòs si hi són desactivades. showLess: Tanca -clearQueue: Neteja cua +clearQueue: Neteja la cua uploadFromUrlMayTakeTime: Pot trigar un temps fins que la pujada es completi. noThankYou: No, gràcies -addInstance: Afegeix una instància +addInstance: Afegir una instància emoji: Emoji emojis: Emoji emojiName: Nom del emoji emojiUrl: URL del emoji addEmoji: Afegir settingGuide: Configuració recomenada -searchWith: 'Buscar: {q}' +searchWith: 'Cercar: {q}' youHaveNoLists: No tens cap llista flagSpeakAsCat: Parla com un gat selectInstance: Selecciona una instància @@ -952,10 +951,9 @@ blockedInstances: Instàncies Bloquejades blockedInstancesDescription: Llista les adreces de les instàncies que vols bloquejar. Les instàncies de la llista no podrán comunicarse amb aquesta instància. hiddenTags: Etiquetes Ocultes -hiddenTagsDescription: 'Enumereu els etiquetes (sense el #) de les etiquetes que voleu - ocultar de tendències i explorar. Les etiquetes ocultes encara es poden descobrir - per altres mitjans. Les instàncies bloquejades no es veuen afectades encara que - s''enumeren aquí.' +hiddenTagsDescription: 'Enumereu les etiquetes (sense el #) que voleu ocultar de tendències + i explorar. Les etiquetes ocultes encara es poden descobrir per altres mitjans. + Les instàncies bloquejades no es veuen afectades encara que s''enumerin aquí.' noInstances: No hi han instàncies defaultValueIs: 'Per defecte: {value}' suspended: Suspès @@ -976,8 +974,8 @@ enableEmojiReactions: Activa reaccions amb emojis blockThisInstance: Bloqueja aquesta instància registration: Registre showEmojisInReactionNotifications: Mostra els emojis a les notificacions de les reaccions -renoteMute: Silencia les renotas -renoteUnmute: Treu el silenci a les renotas +renoteMute: Silencia els impulsos +renoteUnmute: Treu el silenci als impulsos cacheRemoteFiles: Fitxers remots a la memoria cau federation: Federació registeredAt: Registrat a @@ -1579,9 +1577,9 @@ driveFilesCount: Nombre de fitxers el Disk silencedInstances: Instàncies silenciades silenceThisInstance: Silencia la instància silencedInstancesDescription: Llista amb els noms de les instàncies que vols silenciar. - Les comptes en les instàncies silenciades seran tractades com "Silenciades", només - poden fer sol·licitud de seguiments, i no poden mencionar comptes locals si no les - segueixen. Això no afectarà les instàncies silenciades. + Els comptes en les instàncies silenciades seran tractades com "Silenciades", només + poden fer sol·licituds de seguiments, i no poden mencionar comptes locals si no + les segueixen. Això no afectarà les instàncies bloquejades. objectStorageEndpointDesc: Deixa això buit si fas servir AWS, S3, d'una altre manera específica un "endpoint" com a '' o ':', depend del proveïdor que facis servir. @@ -1762,7 +1760,7 @@ useDrawerReactionPickerForMobile: Mostra el selector de reaccions com a calaix a mòbil welcomeBackWithName: Benvingut de nou, {name} showLocalPosts: 'Mostra les notes locals a:' -homeTimeline: Línea de temps Local +homeTimeline: Línea de temps Inicial socialTimeline: Línea de temps Social themeColor: Color del Ticker de la instància size: Mida From 7497bb12efdd77842883f97f9f4782d252e3e064 Mon Sep 17 00:00:00 2001 From: Kenny Hui Date: Tue, 2 May 2023 06:28:19 +0000 Subject: [PATCH 029/722] chore: Translated using Weblate (Chinese (Traditional)) Currently translated at 96.8% (1685 of 1739 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hant/ --- locales/zh-TW.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index c2dfd1ce0..477b8ceb3 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -756,7 +756,7 @@ active: "最近活躍" offline: "離線" notRecommended: "不推薦" botProtection: "Bot防護" -instanceBlocking: "已封鎖的實例" +instanceBlocking: "聯邦封鎖/靜音" selectAccount: "選擇帳戶" switchAccount: "切換帳戶" enabled: "已啟用" @@ -1808,3 +1808,6 @@ logoImageUrl: 圖標網址 addInstance: 增加一個實例 noInstances: 沒有實例 flagSpeakAsCat: 像貓一樣地說話 +silenceThisInstance: 靜音此實例 +silencedInstances: 已靜音的實例 +silenced: 已靜音 From 7ca3f6ccfc3a9279fd8c772b8d0fd77a285bee9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Lepist=C3=B6?= Date: Tue, 2 May 2023 14:55:13 +0000 Subject: [PATCH 030/722] chore: Translated using Weblate (Finnish) Currently translated at 21.1% (367 of 1739 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ --- locales/fi.yml | 177 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 175 insertions(+), 2 deletions(-) diff --git a/locales/fi.yml b/locales/fi.yml index 9b4102ddc..25cf5a613 100644 --- a/locales/fi.yml +++ b/locales/fi.yml @@ -75,8 +75,8 @@ files: Tiedostot download: Lataa unfollowConfirm: Oletko varma, ettet halua seurata enää käyttäjää {name}? noLists: Sinulla ei ole listoja -note: Lähetys -notes: Lähetykset +note: Viesti +notes: Viestit following: Seuraa createList: Luo lista manageLists: Hallitse listoja @@ -221,3 +221,176 @@ clearQueueConfirmText: Mitkään välittämättömät lähetykset, jotka ovat jo federoidu. Yleensä tätä toimintoa ei tarvita. blockedInstancesDescription: Lista instanssien isäntänimistä, jotka haluat estää. Listatut instanssit eivät kykene kommunikoimaan enää tämän instanssin kanssa. +security: Turvallisuus +retypedNotMatch: Syöte ei kelpaa. +fromDrive: Asemasta +keepOriginalUploading: Säilytä alkuperäinen kuva +uploadFromUrlDescription: Tiedoston URL, jonka haluat ylösladata +themeForLightMode: Teema vaaleassa tilassa +theme: Teemat +themeForDarkMode: Teema tummassa tilassa +drive: Asema +darkThemes: Tummat teemat +copyUrl: Kopioi URL-linkki +rename: Uudelleennimeä +maintainerName: Ylläpitäjä +maintainerEmail: Ylläpitäjän sähköposti +tosUrl: Palvelun ehdot URL-linkki +thisYear: Vuosi +backgroundImageUrl: Taustakuvan URL-linkki +basicInfo: Perustiedot +pinnedPagesDescription: Kirjoita niiden sivujen polut, jotka haluat liittää tämän + instanssin yläsivulle rivinvaihdoin erotettuna. +hcaptchaSiteKey: Sivuston avain +hcaptchaSecretKey: Salausavain +silencedInstances: Hiljennetyt instanssit +muteAndBlock: Hiljennykset ja estetyt +mutedUsers: Hiljennetyt käyttäjät +blockedUsers: Estetyt käyttäjät +noUsers: Ei yhtään käyttäjää +noInstances: Ei yhtään instanssia +editProfile: Muokkaa profiilia +noteDeleteConfirm: Oletko varma, että haluat poistaa tämän viestin? +pinLimitExceeded: Et voi kiinnittää enempää viestejä +intro: Calckey -asennus valmis! Ole hyvä ja luo admin-käyttäjä. +done: Valmis +processing: Suorittaa... +preview: Esikatselu +default: Oletus +defaultValueIs: 'Oletus: {value}' +noCustomEmojis: Ei emojia +noJobs: Ei töitä +federating: Federoi +blocked: Estetty +silenced: Hiljennetty +suspended: Keskeytetty +all: Kaikki +publishing: Julkaisee +subscribing: Tilaa +notResponding: Ei vastaa +instanceFollowing: Seuraa instanssia +instanceFollowers: Instanssin seuraajat +instanceUsers: Instanssin käyttäjät +changePassword: Muuta salasana +newPasswordRetype: Uudelleensyötä uusi salasana +more: Lisää! +featured: Esillä +usernameOrUserId: Käyttäjänimi tai käyttäjä id +noSuchUser: Käyttäjää ei löydy +lookup: Hae +announcements: Tiedoitteet +imageUrl: Kuva URL-linkki +removed: Onnistuneesti poistettu +removeAreYouSure: Oletko varma, että haluat poistaa " {x}"? +resetAreYouSure: Haluatko nollata? +saved: Tallennettu +messaging: Juttele +upload: Lataa ylös +fromUrl: URL:stä +uploadFromUrl: Ylöslataa URL:stä +uploadFromUrlRequested: Ylöslataus pyydetty +uploadFromUrlMayTakeTime: Voi viedä hetki, kun ylöslataus on valmis. +explore: Selaa +messageRead: Lue +noMoreHistory: Ei lisää historiaa +startMessaging: Aloita uusi juttelu +manageGroups: Hallitse ryhmiä +nUsersRead: lukenut {n} +agreeTo: Hyväksyn {0} +tos: Palvelun ehdot +start: Aloita +home: Koti +remoteUserCaution: Etäkäyttäjän tiedot saattavat olla puutteellisia. +light: Vaalea +dark: Tumma +lightThemes: Vaaleat teemat +syncDeviceDarkMode: Synkronoi tumma tila laitteen asetuksen mukaan +fileName: Tiedostonimi +selectFile: Valitse tiedosto +selectFiles: Valitse tiedostot +selectFolder: Valitse kansio +selectFolders: Valitse kansiot +renameFile: Uudelleennimeä tiedosto +folderName: Kansionimi +createFolder: Luo kansio +renameFolder: Uudelleennimeä kansio +deleteFolder: Poista kansio +addFile: Lisää tiedosto +emptyDrive: Asemasi on tyhjä +emptyFolder: Tämä kansio on tyhjä +unableToDelete: Ei voitu poistaa +inputNewFileName: Syötä uusi tiedostonimi +inputNewDescription: Syötä uusi kuvateksti +inputNewFolderName: Syötä uusi kansionimi +hasChildFilesOrFolders: Koska kansio ei ole tyhjä, sitä ei voi poistaa. +avatar: Kuvake +banner: Banneri +nsfw: Herkkää sisältöä (NSFW) +whenServerDisconnected: Kun yhteys palvelimeen menetetään +disconnectedFromServer: Yhteys palvelimeen katkennut +reload: Päivitä +doNothing: Hylkää +reloadConfirm: Haluaisitko päivittää aikajanan? +unwatch: Lopeta katselu +watch: Katsele +accept: Hyväksy +reject: Hylkää +normal: Normaali +instanceName: Instanssin nimi +thisMonth: Kuukausi +today: Tänään +monthX: '{month}' +connectService: Yhdistä +disconnectService: Katkaise yhteys +enableLocalTimeline: Ota käyttöön paikallinen aikajana +enableGlobalTimeline: Ota käyttöön globaali aikajana +enableRecommendedTimeline: Ota käyttöön suositellut -aikajana +registration: Rekisteröinti +enableRegistration: Ota käyttöön uuden käyttäjän rekisteröinti +driveCapacityPerLocalAccount: Aseman kapasiteetti paikallista käyttäjää kohti +driveCapacityPerRemoteAccount: Aseman kapasiteetti etäkäyttäjää kohti +inMb: megatavuissa +bannerUrl: Bannerikuvan URL-linkki +pinnedUsers: Kiinnitetyt käyttäjät +pinnedPages: Kiinnitetyt sivut +pinnedClipId: Kiinnitettävän leikkeen ID +enableHcaptcha: Ota käyttöön hCaptcha-tunnistus +recaptcha: CAPTCHA uudelleen +enableRecaptcha: Ota käyttöön CAPTCHA uudelleen +recaptchaSiteKey: Sivuston avain +recaptchaSecretKey: Salausavain +silenceThisInstance: Hiljennä tämä instanssi +silencedInstancesDescription: Lista isäntänimistä, joka haluat hiljentää. Tilejä listassa + kohdellaan "hiljennettynä", ne voivat tehdä seuraajapyyntöjä ja eivät voi tehdä + mainintoja paikallistileistä jossei seurattu. Tämä ei vaikuta estettyihin instansseihin. +hiddenTagsDescription: 'Listaa aihetunnisteet (ilman #-merkkiä) aihetunnisteet, jotka + haluat piilottaa trendauksesta ja etsinnästä. Piilotetut aihetunnisteet ovat kuitenkin + löydettävissä muilla keinoilla. Estetyt instanssit eivät vaikuta, vaikka listattu + tähän.' +currentPassword: Nykyinen salasana +newPassword: Uusi salasana +attachFile: Liitetyt tiedostot +keepOriginalUploadingDescription: Tallentaa alkuperäisen kuvan sellaisenaan. Jos kytketty + päältä, webissä näytettävä versio luodaan ylöslatauksen yhteydessä. +remove: Poista +circularReferenceFolder: Kohdekansio on kansion alikansio, jonka haluat siirtää. +deleteAreYouSure: Oletko varma, että haluat poistaa kokonaan" {x}"? +yearsOld: '{age} vuotias' +activity: Aktiivisuus +images: Kuvat +birthday: Syntymäpäivä +registeredDate: Liittynyt +location: Sijainti +disablingTimelinesInfo: Järjestelmänvalvojilla ja moderaattoreilla on aina pääsy kaikille + aikajanoille, vaikka olisikin poistettu käytöstä. +dayX: '{day}' +yearX: '{year}' +pages: Sivut +integration: Integraatiot +instanceDescription: Instanssin kuvaus +invite: Kutsu +iconUrl: Ikoni URL-linkki +pinnedUsersDescription: Listaa käyttäjänimet eroteltuna rivivaihdoin kiinnittääksesi + ne "Selaa" välilehteen. +pinnedNotes: Kiinnitetyt viestit +hcaptcha: hCaptcha-tunnistus From 5b03b21ba30aa90ba28bcb93549f8b1611fd50c8 Mon Sep 17 00:00:00 2001 From: Freeplay Date: Tue, 2 May 2023 14:50:22 -0400 Subject: [PATCH 031/722] Fix line color (#9997) --- packages/client/src/components/MkNote.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index b809ba8a1..8ee829419 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -510,7 +510,7 @@ function readPromo() { display: block; margin-bottom: -10px; margin-top: 16px; - border-left: 2px solid var(--divider); + border-left: 2px solid var(--X13); margin-left: calc((var(--avatarSize) / 2) - 1px); } } From f34fd4991fd6efdc74792ba16913049a7bc227d5 Mon Sep 17 00:00:00 2001 From: Freeplay Date: Tue, 2 May 2023 14:52:05 -0400 Subject: [PATCH 032/722] fix translation box --- packages/client/src/components/MkNote.vue | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 8ee829419..372ccb0b0 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -627,14 +627,11 @@ function readPromo() { > .body { margin-top: 0.7em; - - > .content { - > .translation { - border: solid 0.5px var(--divider); - border-radius: var(--radius); - padding: 12px; - margin-top: 8px; - } + > .translation { + border: solid 0.5px var(--divider); + border-radius: var(--radius); + padding: 12px; + margin-top: 8px; } > .renote { padding-top: 8px; From 9727a03f051a74563464032510bda905a043ba99 Mon Sep 17 00:00:00 2001 From: Freeplay Date: Tue, 2 May 2023 15:07:46 -0400 Subject: [PATCH 033/722] Add tooltips to visibility icons (#9598) --- packages/client/src/components/MkVisibility.vue | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/MkVisibility.vue b/packages/client/src/components/MkVisibility.vue index 04fd6aaef..faf06668c 100644 --- a/packages/client/src/components/MkVisibility.vue +++ b/packages/client/src/components/MkVisibility.vue @@ -1,9 +1,14 @@ @@ -21,6 +29,7 @@ import { ref } from "vue"; import XDetails from "@/components/MkUsersTooltip.vue"; import * as os from "@/os"; import { useTooltip } from "@/scripts/use-tooltip"; +import { i18n } from "@/i18n"; const props = defineProps<{ note: { From 087f3aaaa2d83eb49fdb613454340d58d2279b17 Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Tue, 2 May 2023 14:45:09 -0700 Subject: [PATCH 034/722] fix: correctly display links to self instance URL Closes #9270 Co-authored-by: GitHub --- packages/client/src/components/global/MkUrl.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/components/global/MkUrl.vue b/packages/client/src/components/global/MkUrl.vue index 787119104..5f2a81ee6 100644 --- a/packages/client/src/components/global/MkUrl.vue +++ b/packages/client/src/components/global/MkUrl.vue @@ -3,7 +3,7 @@ :is="self ? 'MkA' : 'a'" ref="el" class="ieqqeuvs _link" - :[attr]="self ? url.substr(local.length) : url" + :[attr]="self ? props.url.substring(local.length) : props.url" :rel="rel" :target="target" @contextmenu.stop="() => {}" @@ -18,7 +18,7 @@ {{ hostname }} {{ - self ? pathname.substr(1) : pathname + self ? pathname.substring(1) : pathname }} {{ query }} {{ hash }} From 8a69b48351c259a75ed944341e8000140f475e0c Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Tue, 2 May 2023 15:14:12 -0700 Subject: [PATCH 035/722] Revert "chore: theme refactor" This reverts commit 6953fceade5fe8a6e0cb83a10f977c0643663b91. --- packages/client/src/themes/d-astro.json5 | 2 +- packages/client/src/themes/d-botanical.json5 | 2 +- .../src/themes/d-catppuccin-frappe.json5 | 2 +- .../src/themes/d-catppuccin-mocha.json5 | 2 +- packages/client/src/themes/d-cherry.json5 | 2 +- packages/client/src/themes/d-future.json5 | 2 +- packages/client/src/themes/d-green-lime.json5 | 2 +- .../client/src/themes/d-green-orange.json5 | 24 +++++ packages/client/src/themes/d-ice.json5 | 2 +- packages/client/src/themes/d-persimmon.json5 | 2 +- packages/client/src/themes/d-u0.json5 | 2 +- packages/client/src/themes/l-apricot.json5 | 2 +- .../src/themes/l-catppuccin-latte.json5 | 94 ------------------- packages/client/src/themes/l-cherry.json5 | 2 +- packages/client/src/themes/l-coffee.json5 | 2 +- packages/client/src/themes/l-rainy.json5 | 2 +- packages/client/src/themes/l-sushi.json5 | 2 +- packages/client/src/themes/l-u0.json5 | 2 +- packages/client/src/themes/l-vivid.json5 | 2 +- 19 files changed, 41 insertions(+), 111 deletions(-) create mode 100644 packages/client/src/themes/d-green-orange.json5 delete mode 100644 packages/client/src/themes/l-catppuccin-latte.json5 diff --git a/packages/client/src/themes/d-astro.json5 b/packages/client/src/themes/d-astro.json5 index a51ee94ae..c6a927ec3 100644 --- a/packages/client/src/themes/d-astro.json5 +++ b/packages/client/src/themes/d-astro.json5 @@ -1,7 +1,7 @@ { id: '080a01c5-377d-4fbb-88cc-6bb5d04977ea', base: 'dark', - name: 'Astro Dark', + name: 'Mi Astro Dark', author: 'syuilo', props: { bg: '#232125', diff --git a/packages/client/src/themes/d-botanical.json5 b/packages/client/src/themes/d-botanical.json5 index 08fabf86a..c03b95e2d 100644 --- a/packages/client/src/themes/d-botanical.json5 +++ b/packages/client/src/themes/d-botanical.json5 @@ -1,7 +1,7 @@ { id: '504debaf-4912-6a4c-5059-1db08a76b737', - name: 'Botanical Dark', + name: 'Mi Botanical Dark', author: 'syuilo', base: 'dark', diff --git a/packages/client/src/themes/d-catppuccin-frappe.json5 b/packages/client/src/themes/d-catppuccin-frappe.json5 index ed3aac3c5..891fe1805 100644 --- a/packages/client/src/themes/d-catppuccin-frappe.json5 +++ b/packages/client/src/themes/d-catppuccin-frappe.json5 @@ -1,7 +1,7 @@ { id: 'ffcd3328-5c57-4ca3-9dac-4580cbf7742f', base: 'dark', - name: 'Catppuccin Frappe', + name: 'Catppuccin frappe', props: { X2: ':darken<2<@panel', X3: 'rgba(255, 255, 255, 0.05)', diff --git a/packages/client/src/themes/d-catppuccin-mocha.json5 b/packages/client/src/themes/d-catppuccin-mocha.json5 index 83d464f88..94e1381c7 100644 --- a/packages/client/src/themes/d-catppuccin-mocha.json5 +++ b/packages/client/src/themes/d-catppuccin-mocha.json5 @@ -1,7 +1,7 @@ { id: 'd413f41f-a489-48be-9e20-3532ffbb4363', base: 'dark', - name: 'Catppuccin Mocha', + name: 'Catppuccin mocha', props: { X2: ':darken<2<@panel', X3: 'rgba(255, 255, 255, 0.05)', diff --git a/packages/client/src/themes/d-cherry.json5 b/packages/client/src/themes/d-cherry.json5 index e39e9ce66..a7e1ad1c8 100644 --- a/packages/client/src/themes/d-cherry.json5 +++ b/packages/client/src/themes/d-cherry.json5 @@ -1,7 +1,7 @@ { id: '679b3b87-a4e9-4789-8696-b56c15cc33b0', - name: 'Cherry Dark', + name: 'Mi Cherry Dark', author: 'syuilo', base: 'dark', diff --git a/packages/client/src/themes/d-future.json5 b/packages/client/src/themes/d-future.json5 index 8b6345708..b6fa1ab0c 100644 --- a/packages/client/src/themes/d-future.json5 +++ b/packages/client/src/themes/d-future.json5 @@ -1,7 +1,7 @@ { id: '32a637ef-b47a-4775-bb7b-bacbb823f865', - name: 'Future Dark', + name: 'Mi Future Dark', author: 'syuilo', base: 'dark', diff --git a/packages/client/src/themes/d-green-lime.json5 b/packages/client/src/themes/d-green-lime.json5 index c06e9af71..a6983b9ac 100644 --- a/packages/client/src/themes/d-green-lime.json5 +++ b/packages/client/src/themes/d-green-lime.json5 @@ -1,7 +1,7 @@ { id: '02816013-8107-440f-877e-865083ffe194', - name: 'Mi Dark', + name: 'Mi Green+Lime Dark', author: 'syuilo', base: 'dark', diff --git a/packages/client/src/themes/d-green-orange.json5 b/packages/client/src/themes/d-green-orange.json5 new file mode 100644 index 000000000..62adc39e2 --- /dev/null +++ b/packages/client/src/themes/d-green-orange.json5 @@ -0,0 +1,24 @@ +{ + id: 'dc489603-27b5-424a-9b25-1ff6aec9824a', + + name: 'Mi Green+Orange Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: '#e97f00', + bg: '#0C1210', + fg: '#dee7e4', + fgHighlighted: '#fff', + fgOnAccent: '#192320', + divider: '#e7fffb24', + panel: '#192320', + panelHeaderBg: '@panel', + panelHeaderDivider: '@divider', + popup: '#293330', + renote: '@accent', + mentionMe: '#b4e900', + link: '#24d7ce', + }, +} diff --git a/packages/client/src/themes/d-ice.json5 b/packages/client/src/themes/d-ice.json5 index c095bf287..179b060dc 100644 --- a/packages/client/src/themes/d-ice.json5 +++ b/packages/client/src/themes/d-ice.json5 @@ -1,7 +1,7 @@ { id: '66e7e5a9-cd43-42cd-837d-12f47841fa34', - name: 'Ice Dark', + name: 'Mi Ice Dark', author: 'syuilo', base: 'dark', diff --git a/packages/client/src/themes/d-persimmon.json5 b/packages/client/src/themes/d-persimmon.json5 index ec1728d07..e36265ff1 100644 --- a/packages/client/src/themes/d-persimmon.json5 +++ b/packages/client/src/themes/d-persimmon.json5 @@ -1,7 +1,7 @@ { id: 'c503d768-7c70-4db2-a4e6-08264304bc8d', - name: 'Persimmon Dark', + name: 'Mi Persimmon Dark', author: 'syuilo', base: 'dark', diff --git a/packages/client/src/themes/d-u0.json5 b/packages/client/src/themes/d-u0.json5 index b5fe92cbc..67c9235df 100644 --- a/packages/client/src/themes/d-u0.json5 +++ b/packages/client/src/themes/d-u0.json5 @@ -1,7 +1,7 @@ { id: '7a5bc13b-df8f-4d44-8e94-4452f0c634bb', base: 'dark', - name: 'U0 Dark', + name: 'Mi U0 Dark', props: { X2: ':darken<2<@panel', X3: 'rgba(255, 255, 255, 0.05)', diff --git a/packages/client/src/themes/l-apricot.json5 b/packages/client/src/themes/l-apricot.json5 index c1a8b29c0..1ed552557 100644 --- a/packages/client/src/themes/l-apricot.json5 +++ b/packages/client/src/themes/l-apricot.json5 @@ -1,7 +1,7 @@ { id: '0ff48d43-aab3-46e7-ab12-8492110d2e2b', - name: 'Apricot Light', + name: 'Mi Apricot Light', author: 'syuilo', base: 'light', diff --git a/packages/client/src/themes/l-catppuccin-latte.json5 b/packages/client/src/themes/l-catppuccin-latte.json5 deleted file mode 100644 index 085e66df6..000000000 --- a/packages/client/src/themes/l-catppuccin-latte.json5 +++ /dev/null @@ -1,94 +0,0 @@ -{ - id: "169661d2-5a17-4dfc-b71b-9938cbbbed3e", - base: "light", - name: "Catppuccin Latte", - props: { - X2: ":darken<2<@panel", - X3: "rgba(255, 255, 255, 0.05)", - X4: "rgba(255, 255, 255, 0.1)", - X5: "rgba(255, 255, 255, 0.05)", - X6: "rgba(255, 255, 255, 0.15)", - X7: "rgba(255, 255, 255, 0.05)", - X8: ":lighten<5<@accent", - X9: ":darken<5<@accent", - bg: "#dce0e8", - fg: "#4c4f69", - X10: ":alpha<0.4<@accent", - X11: "rgba(0, 0, 0, 0.3)", - X12: "rgba(255, 255, 255, 0.1)", - X13: "rgba(255, 255, 255, 0.15)", - X14: ":alpha<0.5<@navBg", - X15: ":alpha<0<@panel", - X16: ":alpha<0.7<@panel", - X17: ":alpha<0.8<@bg", - cwBg: "#bcc0cc", - cwFg: "#5c5f77", - link: "#1e66f5", - warn: "#fe640b", - badge: "#1e66f5", - error: "#d20f39", - focus: ":alpha<0.3<@accent", - navBg: "@panel", - navFg: "@fg", - panel: ":lighten<3<@bg", - popup: ":lighten<3<@panel", - accent: "#8839ef", - header: ":alpha<0.7<@panel", - infoBg: "#ccd0da", - infoFg: "#6c6f85", - renote: "#1e66f5", - shadow: "rgba(0, 0, 0, 0.3)", - divider: "rgba(255, 255, 255, 0.1)", - hashtag: "#209fb5", - mention: "@accent", - modalBg: "rgba(0, 0, 0, 0.5)", - success: "#40a02b", - buttonBg: "rgba(255, 255, 255, 0.05)", - switchBg: "rgba(255, 255, 255, 0.15)", - acrylicBg: ":alpha<0.5<@bg", - cwHoverBg: "#acb0be", - indicator: "@accent", - mentionMe: "@mention", - messageBg: "@bg", - navActive: "@accent", - accentedBg: ":alpha<0.15<@accent", - codeNumber: "#40a02b", - codeString: "#fe640b", - fgOnAccent: "#eff1f5", - infoWarnBg: "#ccd0da", - infoWarnFg: "#5c5f77", - navHoverFg: ":lighten<17<@fg", - swutchOnBg: "@accentedBg", - swutchOnFg: "@accent", - codeBoolean: "@accent", - dateLabelFg: "@fg", - deckDivider: "#9ca0b0", - inputBorder: "rgba(255, 255, 255, 0.1)", - panelBorder: "solid 1px var(--divider)", - swutchOffBg: "rgba(255, 255, 255, 0.1)", - swutchOffFg: "@fg", - accentDarken: ":darken<10<@accent", - acrylicPanel: ":alpha<0.5<@panel", - navIndicator: "@indicator", - windowHeader: ":alpha<0.85<@panel", - accentLighten: ":lighten<10<@accent", - buttonHoverBg: "rgba(255, 255, 255, 0.1)", - driveFolderBg: ":alpha<0.3<@accent", - fgHighlighted: ":lighten<3<@fg", - fgTransparent: ":alpha<0.5<@fg", - panelHeaderBg: ":lighten<3<@panel", - panelHeaderFg: "@fg", - buttonGradateA: "@accent", - buttonGradateB: ":hue<20<@accent", - htmlThemeColor: "@bg", - panelHighlight: ":lighten<3<@panel", - listItemHoverBg: "rgba(255, 255, 255, 0.03)", - scrollbarHandle: "rgba(255, 255, 255, 0.2)", - inputBorderHover: "rgba(255, 255, 255, 0.2)", - wallpaperOverlay: "rgba(0, 0, 0, 0.5)", - fgTransparentWeak: ":alpha<0.75<@fg", - panelHeaderDivider: "rgba(0, 0, 0, 0)", - scrollbarHandleHover: "rgba(255, 255, 255, 0.4)", - }, - author: "somebody ¯_(ツ)_/¯", -} diff --git a/packages/client/src/themes/l-cherry.json5 b/packages/client/src/themes/l-cherry.json5 index 9aab308fc..5ad240241 100644 --- a/packages/client/src/themes/l-cherry.json5 +++ b/packages/client/src/themes/l-cherry.json5 @@ -1,7 +1,7 @@ { id: 'ac168876-f737-4074-a3fc-a370c732ef48', - name: 'Cherry Light', + name: 'Mi Cherry Light', author: 'syuilo', base: 'light', diff --git a/packages/client/src/themes/l-coffee.json5 b/packages/client/src/themes/l-coffee.json5 index 252b5989c..fbcd4fa9e 100644 --- a/packages/client/src/themes/l-coffee.json5 +++ b/packages/client/src/themes/l-coffee.json5 @@ -1,7 +1,7 @@ { id: '6ed80faa-74f0-42c2-98e4-a64d9e138eab', - name: 'Coffee Light', + name: 'Mi Coffee Light', author: 'syuilo', base: 'light', diff --git a/packages/client/src/themes/l-rainy.json5 b/packages/client/src/themes/l-rainy.json5 index a7b871806..283dd74c6 100644 --- a/packages/client/src/themes/l-rainy.json5 +++ b/packages/client/src/themes/l-rainy.json5 @@ -1,7 +1,7 @@ { id: 'a58a0abb-ff8c-476a-8dec-0ad7837e7e96', - name: 'Rainy Light', + name: 'Mi Rainy Light', author: 'syuilo', base: 'light', diff --git a/packages/client/src/themes/l-sushi.json5 b/packages/client/src/themes/l-sushi.json5 index d14f32293..5846927d6 100644 --- a/packages/client/src/themes/l-sushi.json5 +++ b/packages/client/src/themes/l-sushi.json5 @@ -1,7 +1,7 @@ { id: '213273e5-7d20-d5f0-6e36-1b6a4f67115c', - name: 'Sushi Light', + name: 'Mi Sushi Light', author: 'syuilo', base: 'light', diff --git a/packages/client/src/themes/l-u0.json5 b/packages/client/src/themes/l-u0.json5 index 1d89e0543..03b114ba3 100644 --- a/packages/client/src/themes/l-u0.json5 +++ b/packages/client/src/themes/l-u0.json5 @@ -1,7 +1,7 @@ { id: 'e2c940b5-6e9a-4c03-b738-261c720c426d', base: 'light', - name: 'U0 Light', + name: 'Mi U0 Light', props: { X2: ':darken<2<@panel', X3: 'rgba(255, 255, 255, 0.05)', diff --git a/packages/client/src/themes/l-vivid.json5 b/packages/client/src/themes/l-vivid.json5 index cd35626a1..b3c08f38a 100644 --- a/packages/client/src/themes/l-vivid.json5 +++ b/packages/client/src/themes/l-vivid.json5 @@ -1,7 +1,7 @@ { id: '6128c2a9-5c54-43fe-a47d-17942356470b', - name: 'Vivid Light', + name: 'Mi Vivid Light', author: 'syuilo', base: 'light', From 4999b4f1a63c924bc005c4a075262cac77571a8f Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Tue, 2 May 2023 15:14:44 -0700 Subject: [PATCH 036/722] add catppuccin latte --- .../src/themes/l-catppuccin-latte.json5 | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 packages/client/src/themes/l-catppuccin-latte.json5 diff --git a/packages/client/src/themes/l-catppuccin-latte.json5 b/packages/client/src/themes/l-catppuccin-latte.json5 new file mode 100644 index 000000000..085e66df6 --- /dev/null +++ b/packages/client/src/themes/l-catppuccin-latte.json5 @@ -0,0 +1,94 @@ +{ + id: "169661d2-5a17-4dfc-b71b-9938cbbbed3e", + base: "light", + name: "Catppuccin Latte", + props: { + X2: ":darken<2<@panel", + X3: "rgba(255, 255, 255, 0.05)", + X4: "rgba(255, 255, 255, 0.1)", + X5: "rgba(255, 255, 255, 0.05)", + X6: "rgba(255, 255, 255, 0.15)", + X7: "rgba(255, 255, 255, 0.05)", + X8: ":lighten<5<@accent", + X9: ":darken<5<@accent", + bg: "#dce0e8", + fg: "#4c4f69", + X10: ":alpha<0.4<@accent", + X11: "rgba(0, 0, 0, 0.3)", + X12: "rgba(255, 255, 255, 0.1)", + X13: "rgba(255, 255, 255, 0.15)", + X14: ":alpha<0.5<@navBg", + X15: ":alpha<0<@panel", + X16: ":alpha<0.7<@panel", + X17: ":alpha<0.8<@bg", + cwBg: "#bcc0cc", + cwFg: "#5c5f77", + link: "#1e66f5", + warn: "#fe640b", + badge: "#1e66f5", + error: "#d20f39", + focus: ":alpha<0.3<@accent", + navBg: "@panel", + navFg: "@fg", + panel: ":lighten<3<@bg", + popup: ":lighten<3<@panel", + accent: "#8839ef", + header: ":alpha<0.7<@panel", + infoBg: "#ccd0da", + infoFg: "#6c6f85", + renote: "#1e66f5", + shadow: "rgba(0, 0, 0, 0.3)", + divider: "rgba(255, 255, 255, 0.1)", + hashtag: "#209fb5", + mention: "@accent", + modalBg: "rgba(0, 0, 0, 0.5)", + success: "#40a02b", + buttonBg: "rgba(255, 255, 255, 0.05)", + switchBg: "rgba(255, 255, 255, 0.15)", + acrylicBg: ":alpha<0.5<@bg", + cwHoverBg: "#acb0be", + indicator: "@accent", + mentionMe: "@mention", + messageBg: "@bg", + navActive: "@accent", + accentedBg: ":alpha<0.15<@accent", + codeNumber: "#40a02b", + codeString: "#fe640b", + fgOnAccent: "#eff1f5", + infoWarnBg: "#ccd0da", + infoWarnFg: "#5c5f77", + navHoverFg: ":lighten<17<@fg", + swutchOnBg: "@accentedBg", + swutchOnFg: "@accent", + codeBoolean: "@accent", + dateLabelFg: "@fg", + deckDivider: "#9ca0b0", + inputBorder: "rgba(255, 255, 255, 0.1)", + panelBorder: "solid 1px var(--divider)", + swutchOffBg: "rgba(255, 255, 255, 0.1)", + swutchOffFg: "@fg", + accentDarken: ":darken<10<@accent", + acrylicPanel: ":alpha<0.5<@panel", + navIndicator: "@indicator", + windowHeader: ":alpha<0.85<@panel", + accentLighten: ":lighten<10<@accent", + buttonHoverBg: "rgba(255, 255, 255, 0.1)", + driveFolderBg: ":alpha<0.3<@accent", + fgHighlighted: ":lighten<3<@fg", + fgTransparent: ":alpha<0.5<@fg", + panelHeaderBg: ":lighten<3<@panel", + panelHeaderFg: "@fg", + buttonGradateA: "@accent", + buttonGradateB: ":hue<20<@accent", + htmlThemeColor: "@bg", + panelHighlight: ":lighten<3<@panel", + listItemHoverBg: "rgba(255, 255, 255, 0.03)", + scrollbarHandle: "rgba(255, 255, 255, 0.2)", + inputBorderHover: "rgba(255, 255, 255, 0.2)", + wallpaperOverlay: "rgba(0, 0, 0, 0.5)", + fgTransparentWeak: ":alpha<0.75<@fg", + panelHeaderDivider: "rgba(0, 0, 0, 0)", + scrollbarHandleHover: "rgba(255, 255, 255, 0.4)", + }, + author: "somebody ¯_(ツ)_/¯", +} From 89325cacaf0a1116e53f73ead9792c8c4adc6685 Mon Sep 17 00:00:00 2001 From: Namekuji Date: Tue, 2 May 2023 19:53:57 -0400 Subject: [PATCH 037/722] add migration patches and fix commands --- docs/migrate.md | 41 ++++++++++--- docs/mkv13_restore.patch | 127 +++++++++++++++++++++++++++++++++++++++ docs/renote_muting.patch | 23 +++++++ 3 files changed, 181 insertions(+), 10 deletions(-) create mode 100644 docs/mkv13_restore.patch create mode 100644 docs/renote_muting.patch diff --git a/docs/migrate.md b/docs/migrate.md index 07a5fea07..152a37a7c 100644 --- a/docs/migrate.md +++ b/docs/migrate.md @@ -1,27 +1,44 @@ # 🚚 Migrating from Misskey to Calckey +The following process may not work depending on your environment and version of Misskey. + +**Make sure you** +- **stopped all master and worker processes of Misskey.** +- **have backups of the database before performing any commands.** + ## Misskey v13 and above +Tested with Misskey v13.11.3. + +If your Misskey v13 is older, we recommend updating your Misskey to v13.11.3. + ```sh wget -O mkv13.patch https://codeberg.org/calckey/calckey/raw/branch/develop/docs/mkv13.patch -git apply mkv13.patch +wget -O mkv13_restore.patch https://codeberg.org/calckey/calckey/raw/branch/develop/docs/mkv13_restore.patch +git apply mkv13.patch mkv13_restore.patch cd packages/backend -LINE_NUM="$(npx typeorm migration:show -d ormconfig.js | grep -n activeEmailValidation1657346559800 | cut -d ':' -f 1)" -NUM_MIGRATIONS="$(npx typeorm migration:show -d ormconfig.js | tail -n+"$LINE_NUM" | grep '\[X\]' | nl)" +LINE_NUM="$(pnpm typeorm migration:show -d ormconfig.js | grep -n activeEmailValidation1657346559800 | cut -d ':' -f 1)" +NUM_MIGRATIONS="$(pnpm typeorm migration:show -d ormconfig.js | tail -n+"$LINE_NUM" | grep '\[X\]' | wc -l)" -for i in $(seq 1 $NUM_MIGRAIONS); do - npx typeorm migration:revert -d ormconfig.js -done +for i in $(seq 1 $NUM_MIGRATIONS); do pnpm typeorm migration:revert -d ormconfig.js; done + +cd ../../ git remote set-url origin https://codeberg.org/calckey/calckey.git -git fetch -git checkout main # or beta or develop +git fetch origin +git stash push +rm -rf fluent-emojis misskey-assets +git switch main # or beta or develop git pull --ff +wget -O renote_muting.patch https://codeberg.org/calckey/calckey/raw/branch/develop/docs/renote_muting.patch +git apply renote_muting.patch -NODE_ENV=production pnpm run migrate -# build using prefered method +pnpm install +NODE_ENV=production pnpm run build +pnpm run migrate +git stash push ``` Depending on the version you're migrating from, you may have to open Postgres with `psql -d your_database` and run the following commands: @@ -44,6 +61,10 @@ ALTER TABLE "instance" ADD COLUMN "lastCommunicatedAt" date; then quit with `\q`, and restart Calckey. +Note: Ignore errors of `column "xxx" of relation "xxx" already exists`. + +If no other errors happened, your Calckey is ready to launch! + ## Misskey v12.119 and before ```sh diff --git a/docs/mkv13_restore.patch b/docs/mkv13_restore.patch new file mode 100644 index 000000000..9ef9934ed --- /dev/null +++ b/docs/mkv13_restore.patch @@ -0,0 +1,127 @@ +diff --git a/packages/backend/migration/1680491187535-cleanup.js b/packages/backend/migration/1680491187535-cleanup.js +index 1e609ca06..0e6accf3e 100644 +--- a/packages/backend/migration/1680491187535-cleanup.js ++++ b/packages/backend/migration/1680491187535-cleanup.js +@@ -1,10 +1,40 @@ + export class cleanup1680491187535 { +- name = 'cleanup1680491187535' ++ name = "cleanup1680491187535"; + +- async up(queryRunner) { +- await queryRunner.query(`DROP TABLE "antenna_note" `); +- } ++ async up(queryRunner) { ++ await queryRunner.query(`DROP TABLE "antenna_note" `); ++ } + +- async down(queryRunner) { +- } ++ async down(queryRunner) { ++ await queryRunner.query( ++ `CREATE TABLE antenna_note ( id character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "antennaId" character varying(32) NOT NULL, read boolean DEFAULT false NOT NULL)`, ++ ); ++ await queryRunner.query( ++ `COMMENT ON COLUMN antenna_note."noteId" IS 'The note ID.'`, ++ ); ++ await queryRunner.query( ++ `COMMENT ON COLUMN antenna_note."antennaId" IS 'The antenna ID.'`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "PK_fb28d94d0989a3872df19fd6ef8" PRIMARY KEY (id)`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_0d775946662d2575dfd2068a5f" ON antenna_note USING btree ("antennaId")`, ++ ); ++ await queryRunner.query( ++ `CREATE UNIQUE INDEX "IDX_335a0bf3f904406f9ef3dd51c2" ON antenna_note USING btree ("noteId", "antennaId")`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_9937ea48d7ae97ffb4f3f063a4" ON antenna_note USING btree (read)`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_bd0397be22147e17210940e125" ON antenna_note USING btree ("noteId")`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "FK_0d775946662d2575dfd2068a5f5" FOREIGN KEY ("antennaId") REFERENCES antenna(id) ON DELETE CASCADE`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "FK_bd0397be22147e17210940e125b" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE`, ++ ); ++ } + } +diff --git a/packages/backend/migration/1680582195041-cleanup.js b/packages/backend/migration/1680582195041-cleanup.js +index c587e456a..a91d6ff3c 100644 +--- a/packages/backend/migration/1680582195041-cleanup.js ++++ b/packages/backend/migration/1680582195041-cleanup.js +@@ -1,11 +1,64 @@ + export class cleanup1680582195041 { +- name = 'cleanup1680582195041' ++ name = "cleanup1680582195041"; + +- async up(queryRunner) { +- await queryRunner.query(`DROP TABLE "notification" `); +- } ++ async up(queryRunner) { ++ await queryRunner.query(`DROP TABLE "notification"`); ++ } + +- async down(queryRunner) { +- +- } ++ async down(queryRunner) { ++ await queryRunner.query( ++ `CREATE TABLE notification ( id character varying(32) NOT NULL, "createdAt" timestamp with time zone NOT NULL, "notifieeId" character varying(32) NOT NULL, "notifierId" character varying(32), "isRead" boolean DEFAULT false NOT NULL, "noteId" character varying(32), reaction character varying(128), choice integer, "followRequestId" character varying(32), type notification_type_enum NOT NULL, "customBody" character varying(2048), "customHeader" character varying(256), "customIcon" character varying(1024), "appAccessTokenId" character varying(32), achievement character varying(128))`, ++ ); ++ await queryRunner.query( ++ `COMMENT ON COLUMN notification."createdAt" IS 'The created date of the Notification.'`, ++ ); ++ await queryRunner.query( ++ `COMMENT ON COLUMN notification."notifieeId" IS 'The ID of recipient user of the Notification.'`, ++ ); ++ await queryRunner.query( ++ `COMMENT ON COLUMN notification."notifierId" IS 'The ID of sender user of the Notification.'`, ++ ); ++ await queryRunner.query( ++ `COMMENT ON COLUMN notification."isRead" IS 'Whether the Notification is read.'`, ++ ); ++ await queryRunner.query( ++ `COMMENT ON COLUMN notification.type IS 'The type of the Notification.'`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY notification ADD CONSTRAINT "PK_705b6c7cdf9b2c2ff7ac7872cb7" PRIMARY KEY (id)`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_080ab397c379af09b9d2169e5b" ON notification USING btree ("isRead")`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_33f33cc8ef29d805a97ff4628b" ON notification USING btree (type)`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71" ON notification USING btree ("notifierId")`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON notification USING btree ("notifieeId")`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON notification USING btree ("createdAt")`, ++ ); ++ await queryRunner.query( ++ `CREATE INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c" ON notification USING btree ("appAccessTokenId")`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"(id) ON DELETE CASCADE`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9" FOREIGN KEY ("notifieeId") REFERENCES "user"(id) ON DELETE CASCADE`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_bd7fab507621e635b32cd31892c" FOREIGN KEY ("followRequestId") REFERENCES follow_request(id) ON DELETE CASCADE`, ++ ); ++ await queryRunner.query( ++ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9" FOREIGN KEY ("appAccessTokenId") REFERENCES access_token(id) ON DELETE CASCADE`, ++ ); ++ } + } diff --git a/docs/renote_muting.patch b/docs/renote_muting.patch new file mode 100644 index 000000000..c5bd2818c --- /dev/null +++ b/docs/renote_muting.patch @@ -0,0 +1,23 @@ +diff --git a/packages/backend/migration/1665091090561-add-renote-muting.js b/packages/backend/migration/1665091090561-add-renote-muting.js +index 2c76aaff5..f8541c818 100644 +--- a/packages/backend/migration/1665091090561-add-renote-muting.js ++++ b/packages/backend/migration/1665091090561-add-renote-muting.js +@@ -4,18 +4,6 @@ export class addRenoteMuting1665091090561 { + } + + async up(queryRunner) { +- await queryRunner.query( +- `CREATE TABLE "renote_muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "muteeId" character varying(32) NOT NULL, "muterId" character varying(32) NOT NULL, CONSTRAINT "PK_renoteMuting_id" PRIMARY KEY ("id"))`, +- ); +- await queryRunner.query( +- `CREATE INDEX "IDX_renote_muting_createdAt" ON "muting" ("createdAt") `, +- ); +- await queryRunner.query( +- `CREATE INDEX "IDX_renote_muting_muteeId" ON "muting" ("muteeId") `, +- ); +- await queryRunner.query( +- `CREATE INDEX "IDX_renote_muting_muterId" ON "muting" ("muterId") `, +- ); + } + + async down(queryRunner) {} From a5581ad272bcf4247f8a58257964c7220152ffcb Mon Sep 17 00:00:00 2001 From: Namekuji Date: Tue, 2 May 2023 20:45:20 -0400 Subject: [PATCH 038/722] fix typo --- docs/migrate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/migrate.md b/docs/migrate.md index 152a37a7c..7e9653e70 100644 --- a/docs/migrate.md +++ b/docs/migrate.md @@ -1,6 +1,6 @@ # 🚚 Migrating from Misskey to Calckey -The following process may not work depending on your environment and version of Misskey. +The following procedure may not work depending on your environment and version of Misskey. **Make sure you** - **stopped all master and worker processes of Misskey.** From 16f3a6716006f8055d9153418efaf4d81d02fc28 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 3 May 2023 00:36:21 +0000 Subject: [PATCH 039/722] chore: Translated using Weblate (English) Currently translated at 100.0% (1742 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/en/ --- locales/en-US.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 1228da8fd..24f3b7552 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -71,8 +71,8 @@ import: "Import" export: "Export" files: "Files" download: "Download" -driveFileDeleteConfirm: "Are you sure you want to delete the file \"{name}\"? It\ - \ will be removed from all posts that contain it as an attachment." +driveFileDeleteConfirm: "Are you sure you want to delete the file \"{name}\"? It will\ + \ be removed from all posts that contain it as an attachment." unfollowConfirm: "Are you sure that you want to unfollow {name}?" exportRequested: "You've requested an export. This may take a while. It will be added\ \ to your Drive once completed." @@ -224,7 +224,9 @@ blockedInstancesDescription: "List the hostnames of the instances that you want \ block. Listed instances will no longer be able to communicate with this instance." silencedInstances: "Silenced Instances" silencedInstancesDescription: "List the hostnames of the instances that you want to\ - \ silence. Accounts in the listed instances are treated as \"Silenced\", can only make follow requests, and cannot mention local accounts if not followed. This will not affect the blocked instances." + \ silence. Accounts in the listed instances are treated as \"Silenced\", can only\ + \ make follow requests, and cannot mention local accounts if not followed. This\ + \ will not affect the blocked instances." hiddenTags: "Hidden Hashtags" hiddenTagsDescription: "List the hashtags (without the #) of the hashtags you wish\ \ to hide from trending and explore. Hidden hashtags are still discoverable via\ @@ -1405,12 +1407,12 @@ _tutorial: step2_1: "First, please fill out your profile." step2_2: "Providing some information about who you are will make it easier for others\ \ to tell if they want to see your posts or follow you." - step3_1: "Now time to follow some people!" + step3_1: "Now it's time to follow some people!" step3_2: "Your home and social timelines are based off of who you follow, so try\ \ following a couple accounts to get started.\nClick the plus circle on the top\ \ right of a profile to follow them." step4_1: "Let's get you out there." - step4_2: "For your first post, some people like to made a {introduction} post or\ + step4_2: "For your first post, some people like to make an {introduction} post or\ \ a simple \"Hello world!\"" step5_1: "Timelines, timelines everywhere!" step5_2: "Your instance has {timelines} different timelines enabled." From 792ccafb6398f0f9794b78497037e9264bb5c1c6 Mon Sep 17 00:00:00 2001 From: jolupa Date: Tue, 2 May 2023 17:11:59 +0000 Subject: [PATCH 040/722] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1742 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 137 +++++++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 67 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index a5e8cd859..06a80c923 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -119,14 +119,14 @@ reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, pr rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes" attachCancel: "Eliminar el fitxer adjunt" markAsSensitive: "Marcar com a NSFW" -unmarkAsSensitive: "Deixar de marcar com a NSFW" +unmarkAsSensitive: "Desmarcar com a NSFW" enterFileName: "Introdueix un nom de fitxer" mute: "Silencia" unmute: "Deixa de silenciar" block: "Bloqueja" unblock: "Desbloqueja" suspend: "Suspèn" -unsuspend: "Deixa de suspendre" +unsuspend: "Treu la suspensió" instances: "Instàncies" remove: "Eliminar" nsfw: "NSFW" @@ -134,7 +134,7 @@ pinnedNotes: "Publicació fixada" userList: "Llistes" smtpUser: "Nom d'usuari" smtpPass: "Contrasenya" -user: "Usuaris" +user: "Usuari" searchByGoogle: "Cercar" file: "Fitxers" _email: @@ -151,10 +151,9 @@ _mfm: intro: MFM és un llenguatge de marques utilitzat a Misskey, Calckey, Akkoma i més que es pot utilitzar en molts llocs. Aquí podeu veure una llista de tota la sintaxi MFM disponible. - hashtagDescription: Podeu especificar un hashtag mitjançant un signe de coixinet - i un text. + hashtagDescription: Podeu especificar una etiqueta mitjançant un coixinet i un text. url: URL - urlDescription: Es poden mostrar URL. + urlDescription: Es poden mostrar URLS. link: Enllaç linkDescription: Parts específiques del text es poden mostrar com a URL. bold: Negreta @@ -299,7 +298,7 @@ _theme: lighten: Clar install: Instal·lar un tema _sfx: - note: "Posts" + note: "Nota nova" notification: "Notificacions" antenna: Antenes channel: Notificacions del canal @@ -766,7 +765,7 @@ general: General autoAcceptFollowed: Aprova automàticament les peticions de seguiment d'usuaris que segueixes accountMoved: "L'usuari s'ha mogut a un compte nou:" -addAccount: Afegir compte +addAccount: Afegir un compte loginFailed: No s'ha pogut iniciar sessió showOnRemote: Veure a l'instància remota wallpaper: Fons de pantalla @@ -857,14 +856,14 @@ agreeTo: Estic d'acord amb {0} activity: Activitat home: Inici remoteUserCaution: L'informació d'usuaris remots pot estar incompleta. -themeForDarkMode: En Mode Fosc fes servir el tema +themeForDarkMode: Tema a fer servir en mode fosc light: Clar registeredDate: Data de registre dark: Fosc lightThemes: Temes clars location: Lloc theme: Temes -themeForLightMode: En Mode Clar fes servir el tema +themeForLightMode: Tema a fer servir en mode clar drive: Disc selectFile: Tria un fitxer selectFiles: Tria fitxers @@ -1001,7 +1000,7 @@ pages: Pàgines disconnectService: Desconnectar connectService: Connectar enableLocalTimeline: Activa la línea de temps local -enableRecommendedTimeline: Activa la línea de temps de recomanats +enableRecommendedTimeline: Activa la línea de temps de recomanacions pinnedClipId: ID del clip que vols fixar hcaptcha: hCaptcha manageAntennas: Gestiona les Antenes @@ -1032,7 +1031,7 @@ notFoundDescription: No es pot trobar cap pàgina que correspongui a aquesta adr uploadFolder: Carpeta per defecte per pujar arxius cacheClear: Netejar la memòria cau markAsReadAllNotifications: Marca totes les notificacions com llegides -markAsReadAllUnreadNotes: Marca totes les publicacions com a llegides +markAsReadAllUnreadNotes: Marca totes les notes com a llegides markAsReadAllTalkMessages: Marca tots els missatges com llegits help: Ajuda inputMessageHere: Escriu aquí el missatge @@ -1051,7 +1050,7 @@ text: Text enable: Activar next: Següent retype: Torna a entrar -noteOf: Publicat per {user} +noteOf: Nota de {user} inviteToGroup: Invitar a un grup quoteAttached: Cita quoteQuestion: Adjuntar com a cita? @@ -1076,7 +1075,7 @@ groupInvited: T'han invitat a un grup aboutX: Sobre {x} youHaveNoGroups: No tens grups disableDrawer: No facis servir els menús amb estil de calaix -noHistory: No ha historial disponible +noHistory: No hi ha historial disponible signinHistory: Historial d'inicis de sessió disableAnimatedMfm: Desactiva les animacions amb MFM doing: Processant... @@ -1101,8 +1100,8 @@ promotion: Promogut promote: Promoure numberOfDays: Nombre de dies objectStorageBaseUrl: Adreça URL base -hideThisNote: Amaga aquest article -showFeaturedNotesInTimeline: Mostra els articles destacats a la línea de temps +hideThisNote: Amaga aquesta nota +showFeaturedNotesInTimeline: Mostra les notes destacades a les líneas de temps objectStorage: Emmagatzematge d'objectes useObjectStorage: Fes servir l'emmagatzema d'objectes expandTweet: Amplia el tuit @@ -1112,7 +1111,7 @@ leaveConfirm: Hi han canvis que no s'han desat. Els vols descartar? manage: Administració plugins: Afegits preferencesBackups: Preferències de còpies de seguretat -undeck: Treure el Deck +undeck: Treure el Taulell useBlurEffectForModal: Fes servir efectes de difuminació en les finestres modals useFullReactionPicker: Fes servir el selector de reaccions a tamany complert deck: Taulell @@ -1172,14 +1171,14 @@ large: Gran notificationSetting: Preferències de notificacions makeActive: Activar notificationSettingDesc: Tria el tipus de notificació que es veure. -notifyAntenna: Notificar noves articles -withFileAntenna: Només articles amb fitxers +notifyAntenna: Notificar noves notes +withFileAntenna: Només notes amb fitxers enableServiceworker: Activa les notificacions push per al teu navegador antennaUsersDescription: Escriu un nom d'usuari per línea antennaInstancesDescription: Escriu la adreça d'una instància per línea tags: Etiquetes antennaSource: Font de la antena -antennaKeywords: Paraules claus a escolta +antennaKeywords: Paraules claus a escoltar antennaExcludeKeywords: Paraules clau a excluir antennaKeywordsDescription: Separades amb espais per fer una condició AND i amb una línea nova per fer una condició OR. @@ -1198,8 +1197,8 @@ tapSecurityKey: Escriu la teva clau de seguretat nUsersMentioned: Esmentat per {n} usuari(s) securityKey: Clau de seguretat resetPassword: Restablir contrasenya -describeFile: Afegeix un subtítol -enterFileDescription: Entra un subtítol +describeFile: Afegeix una descripció +enterFileDescription: Entra una descripció author: Autor disableAll: Desactiva tots userSaysSomethingReason: '{name} va dir {reason}' @@ -1219,7 +1218,7 @@ inboxUrl: Adreça de la safata d'entrada addedRelays: Relés afegits serviceworkerInfo: Ha de estar activat per les notificacions push. poll: Enquesta -deletedNote: Article eliminat +deletedNote: Nota esborrada disablePlayer: Tancar el reproductor de vídeo fileIdOrUrl: ID o adreça URL del fitxer behavior: Comportament @@ -1227,7 +1226,7 @@ regenerateLoginTokenDescription: Regenera el token que es fa servir de manera in durant l'inici de sessió. Normalment això no és necessari. Si es torna a genera el token, es tancarà la sessió a tots els dispositius. setMultipleBySeparatingWithSpace: Separa diferents entrades amb espais. -reportAbuseOf: Informa sobre {name} +reportAbuseOf: Informa d'un abús de {name} sample: Exemple abuseReports: Informes reportAbuse: Informe @@ -1241,13 +1240,13 @@ abuseMarkAsResolved: Marcar l'informe com a resolt visibility: Visibilitat useCw: Amaga el contingut enablePlayer: Obre el reproductor de vídeo -yourAccountSuspendedDescription: Aquest compte ha sigut suspesa per no seguir els - termes de servei del servidor o quelcom similar. Contacte amb l'administrador si - vols conèixer la raó amb més detall. Si us plau no facis un compte nou. -invisibleNote: Article ocult +yourAccountSuspendedDescription: Aquest compte ha sigut suspès per no seguir els termes + de servei d'aquest servidor o quelcom similar. Contacte amb l'administrador si vols + conèixer la raó amb més detall. Si us plau no facis un compte nou. +invisibleNote: Nota oculta enableInfiniteScroll: Carregar més de forma automàtica fillAbuseReportDescription: Si us plau omple els detalls sobre aquest informe. Si - es sobre un article en concret, si us plau inclou l'adreça URL. + es sobre una nota en concret, si us plau, inclou l'adreça URL. forwardReportIsAnonymous: Com a informador a l'instància remota no es mostrarà el teu compte, si no un compte anònim. openInNewTab: Obrir en una pestanya nova @@ -1264,7 +1263,7 @@ switchUi: Interfície d'usuari createNewClip: Crear un clip nou unclip: Treure clip public: Públic -renotesCount: Nombre de re-notes fetes +renotesCount: Nombre de impulsos fets sentReactionsCount: Nombre de reaccions fetes receivedReactionsCount: Nombre de reaccions rebudes pollVotesCount: Nombre de vots fets en enquestes @@ -1276,14 +1275,14 @@ driveUsage: Espai fet servir al Disk noCrawleDescription: No permetre que els buscadors guardin la informació de les pàgines de perfil, notes, Pàgines, etc. alwaysMarkSensitive: Marcar per defecte com a NSFW -lockedAccountInfo: Només si has configurat la visibilitat del compte per "Només seguidors" - les teves notes no serem visibles per a ningú, inclús si has d'aprovar els teus - seguiments manualment. +lockedAccountInfo: Si has configurat la visibilitat del compte per "Només seguidors" + les teves notes no seren visibles per a ningú més, inclús si has d'aprovar els teus + seguidors manualment. disableShowingAnimatedImages: No reproduir les imatges animades verificationEmailSent: S'ha enviat correu electrònic de verificació. Si us plau segueix les instruccions per completar la verificació. notSet: Sense especificar -emailVerified: Correu electrònic enviat +emailVerified: El correu electrònic s'ha verificat loadRawImages: Carregar les imatges originals en comptes de mostrar les miniatures noteFavoritesCount: Nombre de notes afegides a favorits useSystemFont: Fes servir la font per defecte del sistema @@ -1325,7 +1324,7 @@ breakFollow: Suprimeix el seguidor makeReactionsPublicDescription: Això farà que la llista de totes les vostres reaccions passades sigui visible públicament. hide: Amagar -leaveGroupConfirm: Estàs segur que vols deixar "{nom}"? +leaveGroupConfirm: Estàs segur que vols deixar "{name}"? voteConfirm: Vols confirmar el teu vot per a "{choice}"? leaveGroup: Sortir del grup rateLimitExceeded: S'ha excedit el límit proporcionat @@ -1452,7 +1451,7 @@ _registry: silenced: Silenciat objectStorageUseSSL: Fes servir SSL yourAccountSuspendedTitle: Aquest compte està suspès -i18nInfo: Calckey està sent traduïts a diversos idiomes per voluntaris. Pots ajudar +i18nInfo: Calckey està sent traduït a diversos idiomes per voluntaris. Pots ajudar {link}. manageAccessTokens: Administrar tokens d'accés accountInfo: Informació del compte @@ -1496,15 +1495,15 @@ shareWithNote: Comparteix amb una nota expiration: Data límit memo: Memo priority: Prioritat -high: Alt +high: Alta middle: Mitjana low: Baixa emailNotConfiguredWarning: L'adreça de correu electrònic no està definida. instanceSecurity: Seguretat de la instància privateMode: Mode Privat allowedInstances: Instàncies a la llista blanca -allowedInstancesDescription: Amfitrions d'instàncies a la llista blanca per a la federació, - cadascuna separat per una línia nova (només s'aplica en mode privat). +allowedInstancesDescription: Llista blanca de Hosts amb qui federar, cadascún separat + per una línia nova (només s'aplica en mode privat). previewNoteText: Mostra la vista prèvia customCss: CSS personalitzat recommended: Recomanat @@ -1548,8 +1547,8 @@ remoteOnly: Només remotes failedToUpload: S'ha produït un error en la càrrega cannotUploadBecauseInappropriate: Aquest fitxer no s'ha pogut carregar perquè s'han detectat parts d'aquest com a potencialment NSFW. -cannotUploadBecauseNoFreeSpace: La pujada ha fallat a causa de la manca de capacitat - del Disc. +cannotUploadBecauseNoFreeSpace: La pujada ha fallat a causa de la manca d'espai al + Disc. enableAutoSensitive: Marcatge automàtic NSFW moveTo: Mou el compte actual al compte nou customKaTeXMacro: Macros KaTeX personalitzats @@ -1573,7 +1572,7 @@ desktop: Escritori notesCount: Nombre de notes confirmToUnclipAlreadyClippedNote: Aquesta nota ja és al clip "{name}". Vols treure'l d'aquest clip? -driveFilesCount: Nombre de fitxers el Disk +driveFilesCount: Nombre de fitxers al Disk silencedInstances: Instàncies silenciades silenceThisInstance: Silencia la instància silencedInstancesDescription: Llista amb els noms de les instàncies que vols silenciar. @@ -1585,7 +1584,7 @@ objectStorageEndpointDesc: Deixa això buit si fas servir AWS, S3, d'una altre m que facis servir. objectStorageRegionDesc: Especifica una regió com a 'xx-east-1'. Si el teu proveïdor no distingeix entre regions, deixa això en buit o pots escriure 'us-east-1'. -userPagePinTip: Pots mostrar notes aquí escollint "Pin al perfil" dintre del menú +userPagePinTip: Pots mostrar notes aquí escollint "Fixar al perfil" dintre del menú de cada nota. userInfo: Informació d'usuari hideOnlineStatusDescription: Amagant el teu estat en línea redueix la comoditat d'ús @@ -1597,10 +1596,10 @@ secureMode: Mode segur (Recuperació Autoritzada) customCssWarn: Aquesta configuració només s'ha d'utilitzar si sabeu què fa. La introducció de valors indeguts pot provocar que el client deixi de funcionar amb normalitat. squareAvatars: Mostra avatars quadrats -secureModeInfo: Quan sol·liciteu des d'altres instàncies, no envieu de tornada sense - prova. +secureModeInfo: Quan es faci una solicitut d'altres instàncies no contestar sense + una prova. privateModeInfo: Quan està activat, només les instàncies de la llista blanca es poden - federar amb les vostres instàncies. Totes les publicacions s'amagaran al públic. + federar amb les vostres instàncies. Totes les notes s'amagaran al públic. useBlurEffect: Utilitzeu efectes de desenfocament a la interfície d'usuari accountDeletionInProgress: La supressió del compte està en curs unmuteThread: Desfés el silenci al fil @@ -1631,7 +1630,8 @@ none: Res showInPage: Mostrar a la página popout: Apareixa volume: Volum -objectStorageUseSSLDesc: Desactiva això si no fas servir HTTP per les connexions API +objectStorageUseSSLDesc: Desactiva això si no fas servir HTTPS per les connexions + API objectStorageUseProxy: Conectarse mitjançant un Proxy objectStorageUseProxyDesc: Desactiva això si no faràs servir un servidor Proxy per conexions API @@ -1666,12 +1666,12 @@ disablePagesScript: Desactivar AiScript a les pàgines updateRemoteUser: Actualitzar la informació de l'usuari remot deleteAllFiles: Esborrar tots els fitxers deleteAllFilesConfirm: Segur que vols esborrar tots els fitxers? -removeAllFollowing: Deixar de seguir a tots els usuaris +removeAllFollowing: Deixar de seguir a tots els que segueixis accentColor: Color principal textColor: Color del text value: Valor -sendErrorReportsDescription: "Quant està activat, es compartirà amb els desenvolupadors\ - \ de Calckey quant aparegui un problema quan ajudarà a millorar la qualitat.\nAixò\ +sendErrorReportsDescription: "Quant està activat quant aparegui un error, es compartirà\ + \ amb els desenvolupadors de Calckey, que ajudarà a millorar la qualitat.\nAixò\ \ inclourà informació com la versió del teu sistema operatiu, el navegador que estiguis\ \ fent servir, la teva activitat a Calckey, etc." myTheme: El meu tema @@ -1679,7 +1679,7 @@ backgroundColor: Color de fons saveAs: Desa com... advanced: Avançat invalidValue: Valor invàlid. -createdAt: Dada de creació +createdAt: Data de creació updatedAt: Data d'actualització saveConfirm: Desa canvis? deleteConfirm: De veritat ho vols esborrar? @@ -1713,15 +1713,15 @@ sendPushNotificationReadMessageCaption: Es mostrarà una notificació amb el tex showAds: Mostrar anuncis enterSendsMessage: Pren retorn al formulari del missatge per enviar (quant no s'activa es Ctrl + Return) -customMOTD: MOTD personalitzat (missatges de la pantalla d'inici) -customMOTDDescription: Missatges personalitzats per al MOTD (pantalla de presentació) - separats per salts de línia es mostraran aleatòriament cada vegada que un usuari +customMOTD: MOTD personalitzat (missatges de la pantalla de benvinguda) +customMOTDDescription: Missatges personalitzats per al MOTD (pantalla de benvinguda) + separats per salts de línia, es mostraran aleatòriament cada vegada que un usuari carrega/recarrega la pàgina. -customSplashIcons: Icones personalitzades de la pantalla d'inici (urls) -customSplashIconsDescription: La URL de les icones de pantalla de presentació personalitzades - separades per salts de línia es mostraran aleatòriament cada vegada que un usuari - carrega/recarrega la pàgina. Si us plau, assegureu-vos que les imatges estiguin - en una URL estàtica, preferiblement totes a la mida de 192 x 192. +customSplashIcons: Icones personalitzades de la pantalla de benvinguda (urls) +customSplashIconsDescription: Les URLS de les icones personalitzades a la pantalla + de benvinguda separades per salts de línia. Es mostraran aleatòriament cada vegada + que un usuari carrega/recarrega la pàgina. Si us plau, assegureu-vos que les imatges + estiguin en una URL estàtica, preferiblement amb imatges amb la de 192 x 192. moveFrom: Mou a aquest compte des d'un compte anterior moveFromLabel: 'Compte des del qual us moveu:' migrationConfirm: "Esteu absolutament segur que voleu migrar el vostre compte a {account}?\ @@ -1751,7 +1751,7 @@ showingPastTimeline: Ara es mostra un línea de temps antiga clear: Tornar markAllAsRead: Marcar tot com a llegit recentPosts: Pàgines recents -noMaintainerInformationWarning: La informació del responsable no està configurada. +noMaintainerInformationWarning: La informació de l'administrador no està configurada. resolved: Resolt unresolved: Sense resoldre filter: Filtre @@ -1767,7 +1767,7 @@ size: Mida numberOfColumn: Nombre de columnes numberOfPageCache: Nombre de pàgines emmagatzemades a la memòria cau numberOfPageCacheDescription: L'augment d'aquest nombre millorarà la comoditat dels - usuaris, però provocarà més càrrega del servidor i més memòria per utilitzar-la. + usuaris, però provocarà més càrrega del servidor i utilitzarà més memòria. logoutConfirm: Vols tancar la sessió? lastActiveDate: Data d'últim ús statusbar: Barra d'estat @@ -1789,7 +1789,7 @@ subscribePushNotification: Activar les notificacions push unsubscribePushNotification: Desactivar les notificacions push pushNotificationAlreadySubscribed: Les notificacions push ja estan activades pushNotificationNotSupported: El vostre navegador o instància no admet notificacions - automàtiques + push license: Llicència indexPosts: Índex de notes indexFrom: Índex a partir de l'identificador de notes (deixeu en blanc per indexar @@ -1867,8 +1867,8 @@ _tutorial: step3_2: "Les teves líneas de temps domèstiques i socials es basen en qui seguiu,\ \ així que proveu de seguir un parell de comptes per començar.\nFeu clic al cercle\ \ més situat a la part superior dreta d'un perfil per seguir-los." - step4_2: Per a la vostra primera nota, a algunes persones els agrada fer una nota - de {introduction} o un senzill "Hola món!" + step4_2: A algunes persones els agrada fer una nota de {introduction} o un senzill + "Hola món!" step5_1: Línies de temps, línies de temps a tot arreu! step6_2: Bé, no només t'has unit a Calckey. T'has unit a un portal al Fediverse, una xarxa interconnectada de milers de servidors, anomenats "instàncies". @@ -1886,7 +1886,7 @@ _permissions: "write:blocks": Editar la llista d'usuaris bloquejats "write:notes": Redactar o suprimir notes "write:channels": Editar els teus canals - "read:gallery-likes": Consulta la llista de notes de la galeria que t'agraden + "read:gallery-likes": Consulta la llista de notes que t'agraden de la galeria "write:drive": Editar o suprimir fitxers i carpetes del Disc "read:favorites": Consulta la teva llista d'adreces d'interès "write:favorites": Editeu la teva llista d'adreces d'interès @@ -1894,13 +1894,13 @@ _permissions: "read:mutes": Consulta la teva llista d'usuaris silenciats "write:reactions": Edita les teves reaccions "write:votes": Vota en una enquesta - "write:pages": Editeu o suprimeix la teva pàgina + "write:pages": Edita o suprimeix la teva pàgina "write:page-likes": Editar les pàgines que t'agraden "read:user-groups": Consulta els teus grups d'usuaris "read:channels": Consulta els teus canals "read:gallery": Consulta la teva galeria "write:gallery": Edita la teva galeria - "write:gallery-likes": Edita la llista de notes de la galeria que t'agraden + "write:gallery-likes": Edita la llista de notes que t'agraden de la galeria "read:following": Consulta la informació sobre a qui segueixes "read:reactions": Consulta les teves reaccions "read:pages": Consulta la teva pàgina @@ -2037,3 +2037,6 @@ _apps: paid: Pagament theDesk: TheDesk apps: Aplicacions +deleted: Esborrat +editNote: Editar nota +edited: Editat From bb7f25c59b81d44fc4e8197a017f84a5beb517fd Mon Sep 17 00:00:00 2001 From: spla Date: Wed, 3 May 2023 17:52:06 +0000 Subject: [PATCH 041/722] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1742 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 06a80c923..ab2a32633 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -100,12 +100,12 @@ followRequests: "Sol·licituds de seguiment" unfollow: "Deixar de seguir" followRequestPending: "Sol·licituds de seguiment pendents" enterEmoji: "Introduir un emoji" -renote: "Impulsà" +renote: "Impuls" unrenote: "Anul·lar impuls" renoted: "Impulsat." cantRenote: "Aquesta publicació no pot ser impulsada." cantReRenote: "No es pot impulsar un impuls." -quote: "Citar" +quote: "Cita" pinnedNote: "Publicació fixada" pinned: "Fixar al perfil" you: "Tu" From 91af3319286ec4fc43e2b758321e35d895dca4d6 Mon Sep 17 00:00:00 2001 From: JPlexer Date: Wed, 3 May 2023 17:00:33 +0000 Subject: [PATCH 042/722] chore: Translated using Weblate (German) Currently translated at 94.0% (1639 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ --- locales/de-DE.yml | 91 +++++++++++++++++++++++++---------------------- 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 81098fe3f..9f299e075 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -1,10 +1,8 @@ _lang_: "Deutsch" -headlineMisskey: "Ein durch Posts verbundenes Netzwerk" -introMisskey: "Willkommen! Calckey ist eine dezentralisierte Open-Source Microblogging-Platform.\n\ - Verfasse „Posts“ um mitzuteilen, was gerade passiert oder um Ereignisse mit anderen\ - \ zu teilen. \U0001F4E1\nMit „Reaktionen“ kannst du außerdem schnell deine Gefühle\ - \ über Posts anderer Benutzer zum Ausdruck bringen. \U0001F44D\nEine neue Welt wartet\ - \ auf dich! \U0001F680" +headlineMisskey: "Eine dezentralisierte Open-Source Social Media Plattform, die für\ + \ immer gratis bleibt! \U0001F680" +introMisskey: "Willkommen! Calckey ist eine dezentralisierte Open-Source Social Media\ + \ Plattform, die für immer gratis bleibt!\U0001F680" monthAndDay: "{day}.{month}." search: "Suchen" notifications: "Benachrichtigungen" @@ -26,9 +24,9 @@ otherSettings: "Weitere Einstellungen" openInWindow: "In einem Fenster öffnen" profile: "Profil" timeline: "Chronik" -noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt" +noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt." login: "Anmelden" -loggingIn: "Du wirst angemeldet …" +loggingIn: "Du wirst angemeldet" logout: "Abmelden" signup: "Registrieren" uploading: "Wird hochgeladen …" @@ -57,7 +55,7 @@ reply: "Antworten" loadMore: "Mehr laden" showMore: "Mehr anzeigen" showLess: "Schließen" -youGotNewFollower: "ist dir gefolgt" +youGotNewFollower: "folgt dir nun" receiveFollowRequest: "Follow-Anfrage erhalten" followRequestAccepted: "Follow-Anfrage akzeptiert" mention: "Erwähnung" @@ -68,8 +66,8 @@ import: "Import" export: "Export" files: "Dateien" download: "Herunterladen" -driveFileDeleteConfirm: "Möchtest du die Datei „{name}“ wirklich löschen? Notizen\ - \ mit dieser Datei werden ebenso verschwinden." +driveFileDeleteConfirm: "Möchtest du die Datei „{name}“ wirklich löschen? Es wird\ + \ aus allen Notizen entfernt, die es als Anhang enthalten." unfollowConfirm: "Möchtest du {name} nicht mehr folgen?" exportRequested: "Du hast einen Export angefragt. Dies kann etwas Zeit in Anspruch\ \ nehmen. Sobald der Export abgeschlossen ist, wird er deiner Drive hinzugefügt." @@ -120,11 +118,11 @@ add: "Hinzufügen" reaction: "Reaktionen" reactionSetting: "In der Reaktionsauswahl anzuzeigende Reaktionen" reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“\ - \ um hinzuzufügen" + \ um hinzuzufügen." rememberNoteVisibility: "Notizsichtbarkeit merken" attachCancel: "Anhang entfernen" markAsSensitive: "Als NSFW markieren" -accountMoved: "Benutzer hat zu einem anderen Account gewechselt." +accountMoved: "Benutzer hat zu einem anderen Account gewechselt:" unmarkAsSensitive: "Als nicht NSFW markieren" enterFileName: "Dateinamen eingeben" mute: "Stummschalten" @@ -157,7 +155,7 @@ cacheRemoteFilesDescription: "Ist diese Einstellung deaktiviert, so werden Datei flagAsBot: "Als Bot markieren" flagAsBotDescription: "Aktiviere diese Option, falls dieses Benutzerkonto durch ein\ \ Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler\ - \ zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Misskeys\ + \ zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Calckeys\ \ interne Systeme dieses Benutzerkonto als Bot behandeln." flagAsCat: "Als Katze markieren" flagAsCatDescription: "Aktiviere diese Option, um dieses Benutzerkonto als Katze zu\ @@ -228,8 +226,8 @@ blockedUsers: "Blockierte Benutzer" noUsers: "Keine Benutzer gefunden" editProfile: "Profil bearbeiten" noteDeleteConfirm: "Möchtest du diese Notiz wirklich löschen?" -pinLimitExceeded: "Du kannst nicht noch mehr Notizen anheften." -intro: "Misskey ist installiert! Lass uns nun ein Administratorkonto einrichten." +pinLimitExceeded: "Du kannst nicht noch mehr Notizen anheften" +intro: "Calckey ist installiert! Lass uns nun ein Administratorkonto einrichten." done: "Fertig" processing: "In Bearbeitung …" preview: "Vorschau" @@ -374,7 +372,7 @@ pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die Erkunden\"-Seite angeheftet werden sollen." pinnedPages: "Angeheftete Seiten" pinnedPagesDescription: "Gib durch Leerzeilen getrennte Pfäde zu Seiten an, die an\ - \ die Startseite dieser Instanz angeheftet werden sollen.\n" + \ die Startseite dieser Instanz angeheftet werden sollen." pinnedClipId: "ID des anzuheftenden Clips" pinnedNotes: "Angeheftete Notizen" hcaptcha: "hCaptcha" @@ -396,7 +394,7 @@ antennaKeywords: "Zu beobachtende Schlüsselwörter" antennaExcludeKeywords: "Zu ignorierende Schlüsselwörter" antennaKeywordsDescription: "Zum Nutzen einer \"UND\"-Verknüpfung Einträge mit Leerzeichen\ \ trennen, zum Nutzen einer \"ODER\"-Verknüpfung Einträge mit einem Zeilenumbruch\ - \ trennen" + \ trennen." notifyAntenna: "Über neue Notizen benachrichtigen" withFileAntenna: "Nur Notizen mit Dateien" enableServiceworker: "Push-Benachrichtigungen im Browser aktivieren" @@ -420,7 +418,7 @@ exploreFediverse: "Das Fediverse erkunden" popularTags: "Beliebte Schlagwörter" userList: "Liste" about: "Über" -aboutMisskey: "Über Misskey" +aboutMisskey: "Über Calckey" administrator: "Administrator" token: "Token" twoStepAuthentication: "Zwei-Faktor-Authentifizierung" @@ -477,7 +475,7 @@ checking: "Wird überprüft …" available: "Verfügbar" unavailable: "Unverfügbar" usernameInvalidFormat: "Du kannst Klein- und Großbuchstaben, Zahlen sowie Unterstriche\ - \ verwenden" + \ verwenden." tooShort: "Zu kurz" tooLong: "Zu lang" weakPassword: "Schwaches Passwort" @@ -528,7 +526,7 @@ objectStorage: "Object Storage" useObjectStorage: "Object Storage verwenden" objectStorageBaseUrl: "Basis-URL" objectStorageBaseUrlDesc: "Die als Referenz verwendete URL. Verwendest du einen CDN\ - \ oder Proxy, gib dessen URL an. Für S3 verwende 'https://.s3.amazonaws.com'.\ + \ oder Proxy, gib dessen URL an. \nFür S3 verwende 'https://.s3.amazonaws.com'.\ \ Für GCS o.ä. verwende 'https://storage.googleapis.com/'." objectStorageBucket: "Bucket" objectStorageBucketDesc: "Bitte gib den Namen des Buckets an, der bei deinem Anbieter\ @@ -576,7 +574,7 @@ ascendingOrder: "Aufsteigende Reihenfolge" descendingOrder: "Absteigende Reihenfolge" scratchpad: "Testumgebung" scratchpadDescription: "Die Testumgebung bietet einen Bereich für AiScript-Experimente.\ - \ Dort kannst du AiScript schreiben, ausführen sowie dessen Auswirkungen auf Misskey\ + \ Dort kannst du AiScript schreiben, ausführen sowie dessen Auswirkungen auf Calckey\ \ überprüfen." output: "Ausgabe" script: "Skript" @@ -652,7 +650,7 @@ smtpPass: "Passwort" emptyToDisableSmtpAuth: "Benutzername und Passwort leer lassen, um SMTP-Verifizierung\ \ zu deaktivieren" smtpSecure: "Für SMTP-Verbindungen implizit SSL/TLS verwenden" -smtpSecureInfo: "Schalte dies aus, falls du STARTTLS verwendest." +smtpSecureInfo: "Schalte dies aus, falls du STARTTLS verwendest" testEmail: "Emailversand testen" wordMute: "Wortstummschaltung" regexpError: "Fehler in einem regulären Ausdruck" @@ -705,7 +703,7 @@ defaultNavigationBehaviour: "Standardnavigationsverhalten" editTheseSettingsMayBreakAccount: "Bei Bearbeitung dieser Einstellungen besteht die\ \ Gefahr, dein Benutzerkonto zu beschädigen." instanceTicker: "Instanz-Informationen von Notizen" -waitingFor: "Warte auf {x} …" +waitingFor: "Warte auf {x}" random: "Zufällig" system: "System" switchUi: "Layout" @@ -810,7 +808,7 @@ emailNotification: "Email-Benachrichtigungen" publish: "Veröffentlichen" inChannelSearch: "In Kanal suchen" useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen" -typingUsers: "{users} ist/sind am schreiben …" +typingUsers: "{users} ist/sind am schreiben" jumpToSpecifiedDate: "Zu bestimmtem Datum springen" showingPastTimeline: "Es wird eine alte Chronik angezeigt" clear: "Zurückkehren" @@ -876,11 +874,11 @@ hashtags: "Hashtags" troubleshooting: "Problembehandlung" useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden" learnMore: "Mehr erfahren" -misskeyUpdated: "Misskey wurde aktualisiert!" +misskeyUpdated: "Calckey wurde aktualisiert!" whatIsNew: "Änderungen anzeigen" translate: "Übersetzen" translatedFrom: "Aus {x} übersetzt" -accountDeletionInProgress: "Die Löschung deines Benutzerkontos ist momentan in Bearbeitung." +accountDeletionInProgress: "Die Löschung deines Benutzerkontos ist momentan in Bearbeitung" usernameInfo: "Ein Name, durch den dein Benutzerkonto auf diesem Server identifiziert\ \ werden kann. Du kannst das Alphabet (a~z, A~Z), Ziffern (0~9) oder Unterstriche\ \ (_) verwenden. Benutzernamen können später nicht geändert werden." @@ -967,7 +965,7 @@ statusbar: "Statusleiste" pleaseSelect: "Wähle eine Option" reverse: "Umkehren" colored: "Farbig" -refreshInterval: "Aktualisierungsrate" +refreshInterval: "Aktualisierungsrate " label: "Beschriftung" type: "Art" speed: "Geschwindigkeit" @@ -1079,7 +1077,7 @@ _preferencesBackups: createdAt: "Erstellt am: {date} {time}" updatedAt: "Aktualisiert am: {date} {time}" cannotLoad: "Laden fehlgeschlagen" - invalidFile: "Ungültiges Dateiformat." + invalidFile: "Ungültiges Dateiformat" _registry: scope: "Scope" key: "Schlüssel" @@ -1087,13 +1085,13 @@ _registry: domain: "Domain" createKey: "Schlüssel erstellen" _aboutMisskey: - about: "Misskey ist Open-Source-Software, welche von syuilo seit 2014 entwickelt\ + about: "Calckey ist ein Fork von Misskey, der seit 2022 von ThatOneCalculator entwickelt\ \ wird." contributors: "Hauptmitwirkende" allContributors: "Alle Mitwirkenden" source: "Quellcode" - translation: "Misskey übersetzen" - donate: "An Misskey spenden" + translation: "Calckey übersetzen" + donate: "An Calckey spenden" morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter\ \ Personen sehr. Danke! \U0001F970" patrons: "UnterstützerInnen" @@ -1106,7 +1104,7 @@ _mfm: intro: "MFM ist eine Misskey-exklusive Markup-Sprache, die in Misskey an vielen\ \ Stellen verwendet werden kann. Hier kannst du eine Liste von verfügbarer MFM-Syntax\ \ einsehen." - dummy: "Misskey erweitert die Welt des Fediverse" + dummy: "Calckey erweitert die Welt des Fediverse" mention: "Erwähnung" mentionDescription: "Mit At-Zeichen und Benutzername kann ein individueller Nutzer\ \ angegeben werden." @@ -1128,9 +1126,9 @@ _mfm: blockCodeDescription: "Syntax-Hervorhebung für mehrzeiligen (Programm-)Code als\ \ Block anzeigen." inlineMath: "Mathe (Eingebettet)" - inlineMathDescription: "Mathematische Formeln (KaTeX) eingebettet anzeigen." + inlineMathDescription: "Mathematische Formeln (KaTeX) eingebettet anzeigen" blockMath: "Mathe (Block)" - blockMathDescription: "Mehrzeilige mathematische Formeln (KaTeX) als Block einbetten." + blockMathDescription: "Mathematische Formeln (KaTeX) als Block einbetten" quote: "Zitationen" quoteDescription: "Inhalt als Zitat anzeigen." emoji: "Benutzerdefinierte Emojis" @@ -1143,7 +1141,7 @@ _mfm: jelly: "Animation (Dehnen)" jellyDescription: "Verleiht Inhalt eine sich dehnende Animation." tada: "Animation (Tada)" - tadaDescription: "Verleiht Inhalt eine Animation mit \"Tada!\"-Gefühl" + tadaDescription: "Verleiht Inhalt eine Animation mit \"Tada!\"-Gefühl." jump: "Animation (Sprung)" jumpDescription: "Verleiht Inhalt eine springende Animation." bounce: "Animation (Federn)" @@ -1325,14 +1323,18 @@ _tutorial: \ erkennen, ob sie deine Notizen sehen oder dir folgen wollen." step3_1: "Jetzt ist es Zeit, einigen Leuten zu folgen!" step3_2: "Deine Home- und Social-Timeline basiert darauf, wem du folgst, also folge\ - \ für den Anfang ein paar Accounts." + \ für den Anfang ein paar Accounts.\nKlicke das Plus Symbol oben links in einem\ + \ Profil um es zu folgen." step4_1: "Wir bringen dich nach draußen." step4_2: "Für deinen ersten Beitrag machen manche Leute gerne einen {introduction}\ \ Beitrag oder ein einfaches \"Hallo Welt!\"" step5_1: "Timelines, Timelines überall!" step5_2: "Deine Instanz hat {Zeitleisten} verschiedene Zeitleisten aktiviert." step5_3: "Die Zeitleiste Home {icon} ist die Zeitleiste, in der du die Beiträge\ - \ deiner Follower sehen kannst." + \ der Accounts sehen kannst, denen du folgst und von jedem anderen auf dieser\ + \ Instanz. Solltest du bevorzugen, dass deine Home Zeitleiste nur Beiträge von\ + \ den Accounts enthält, denen du folgst, kannst du das ganz einfach in den Einstellungen\ + \ ändern!" step5_4: "In der lokalen {Icon} Zeitleiste kannst du die Beiträge aller anderen\ \ Mitglieder dieser Instanz sehen." step5_5: "In der Zeitleiste Empfohlen {icon} kannst du Beiträge von Instanzen sehen,\ @@ -1486,7 +1488,7 @@ _visibility: _postForm: replyPlaceholder: "Dieser Notiz antworten …" quotePlaceholder: "Diese Notiz zitieren …" - channelPlaceholder: "In einen Kanal senden" + channelPlaceholder: "In einen Kanal senden..." _placeholders: a: "Was machst du momentan?" b: "Was ist um dich herum los?" @@ -1535,7 +1537,7 @@ _instanceCharts: usersTotal: "Gesamtanzahl an Benutzern" notes: "Unterschied in der Anzahl an Notizen" notesTotal: "Gesamtanzahl an Notizen" - ff: "Unterschied in der Anzahl an gefolgten Benutzern und Followern" + ff: "Unterschied in der Anzahl an gefolgten Benutzern und Followern " ffTotal: "Gesamtanzahl an gefolgten Benutzern und Followern" cacheSize: "Unterschied in der Größe des Caches" cacheSizeTotal: "Gesamtgröße des Caches" @@ -1851,7 +1853,7 @@ _notification: youGotMessagingMessageFromUser: "{name} hat dir eine Chatnachricht gesendet" youGotMessagingMessageFromGroup: "In die Gruppe {name} wurde eine Chatnachricht\ \ gesendet" - youWereFollowed: "ist dir gefolgt" + youWereFollowed: "folgt dir nun" youReceivedFollowRequest: "Du hast eine Follow-Anfrage erhalten" yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert" youWereInvitedToGroup: "{userName} hat dich in eine Gruppe eingeladen" @@ -1914,7 +1916,8 @@ flagSpeakAsCat: Wie eine Katze sprechen showEmojisInReactionNotifications: Emojis in Reaktionsbenachrichtigungen anzeigen userSaysSomethingReason: '{name} sagte {reason}' hiddenTagsDescription: 'Liste die Hashtags (ohne #) welche du von Trending und Explore - verstecken möchtest. Versteckte Hashtags sind durch andere Wege weiterhin auffindbar.' + verstecken möchtest. Versteckte Hashtags sind durch andere Wege weiterhin auffindbar. + Blockierte Instanzen sind nicht betroffen, auch wenn sie hier aufgeführt sind.' addInstance: Instanz hinzufügen flagSpeakAsCatDescription: Deine Posts werden im Katzenmodus "nya-ifiziert" hiddenTags: Versteckte Hashtags @@ -1927,3 +1930,7 @@ privateModeInfo: Wenn diese Option aktiviert ist, können nur Instanzen auf der mit Deinen Instanzen föderieren. Alle Beiträge werden für die Öffentlichkeit verborgen. allowedInstances: Instanzen auf der Whitelist selectInstance: Wähle eine Instanz +silencedInstancesDescription: Liste die Hostnamen der Instanzen auf, die du stummschalten + möchtest. Konten in den aufgelisteten Instanzen werden als "Stumm" behandelt, können + nur Follow-Anfragen stellen und können keine lokalen Konten erwähnen, wenn sie nicht + gefolgt werden. Dies wirkt sich nicht auf die blockierten Instanzen aus. From 4768ea640fe2d5b3a0e17bac8a612a71d89b4604 Mon Sep 17 00:00:00 2001 From: Ettore Atalan Date: Wed, 3 May 2023 09:54:47 +0000 Subject: [PATCH 043/722] chore: Translated using Weblate (German) Currently translated at 94.0% (1639 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/de/ --- locales/de-DE.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 9f299e075..75ce91864 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -1934,3 +1934,9 @@ silencedInstancesDescription: Liste die Hostnamen der Instanzen auf, die du stum möchtest. Konten in den aufgelisteten Instanzen werden als "Stumm" behandelt, können nur Follow-Anfragen stellen und können keine lokalen Konten erwähnen, wenn sie nicht gefolgt werden. Dies wirkt sich nicht auf die blockierten Instanzen aus. +editNote: Notiz bearbeiten +edited: Bearbeitet +silenceThisInstance: Diese Instanz stummschalten +silencedInstances: Stummgeschaltete Instanzen +silenced: Stummgeschaltet +deleted: Gelöscht From fecee558c32e8e323c8717565964c365eb784f7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Lepist=C3=B6?= Date: Tue, 2 May 2023 16:32:30 +0000 Subject: [PATCH 044/722] chore: Translated using Weblate (Finnish) Currently translated at 43.4% (757 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ --- locales/fi.yml | 429 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 424 insertions(+), 5 deletions(-) diff --git a/locales/fi.yml b/locales/fi.yml index 25cf5a613..9cac9d712 100644 --- a/locales/fi.yml +++ b/locales/fi.yml @@ -290,7 +290,7 @@ fromUrl: URL:stä uploadFromUrl: Ylöslataa URL:stä uploadFromUrlRequested: Ylöslataus pyydetty uploadFromUrlMayTakeTime: Voi viedä hetki, kun ylöslataus on valmis. -explore: Selaa +explore: Tutustu messageRead: Lue noMoreHistory: Ei lisää historiaa startMessaging: Aloita uusi juttelu @@ -364,9 +364,9 @@ silencedInstancesDescription: Lista isäntänimistä, joka haluat hiljentää. T kohdellaan "hiljennettynä", ne voivat tehdä seuraajapyyntöjä ja eivät voi tehdä mainintoja paikallistileistä jossei seurattu. Tämä ei vaikuta estettyihin instansseihin. hiddenTagsDescription: 'Listaa aihetunnisteet (ilman #-merkkiä) aihetunnisteet, jotka - haluat piilottaa trendauksesta ja etsinnästä. Piilotetut aihetunnisteet ovat kuitenkin - löydettävissä muilla keinoilla. Estetyt instanssit eivät vaikuta, vaikka listattu - tähän.' + haluat piilottaa trendaavista ja Tutustu-osiosta. Piilotetut aihetunnisteet ovat + kuitenkin löydettävissä muilla keinoilla. Estetyt instanssit eivät vaikuta, vaikka + listattu tähän.' currentPassword: Nykyinen salasana newPassword: Uusi salasana attachFile: Liitetyt tiedostot @@ -391,6 +391,425 @@ instanceDescription: Instanssin kuvaus invite: Kutsu iconUrl: Ikoni URL-linkki pinnedUsersDescription: Listaa käyttäjänimet eroteltuna rivivaihdoin kiinnittääksesi - ne "Selaa" välilehteen. + ne "Tutustu" välilehteen. pinnedNotes: Kiinnitetyt viestit hcaptcha: hCaptcha-tunnistus +antennaSource: Antennin lähde +invitationCode: Kutsukoodi +checking: Tarkistetaan... +passwordNotMatched: Ei vastaa +doing: Käsittelee... +category: Kategoria +tags: Tagit +disableAnimatedMfm: Poista MFM -animaatiot käytöstä +openImageInNewTab: Avaa kuvat uuteen välilehteen +dashboard: Kojelauta +local: Paikallinen +remote: Etä +total: Yhteensä +weekOverWeekChanges: Muutokset viime viikkoon +objectStorageRegion: Alue +popout: Ulosvedettävä +volume: Äänenvoimakkuus +masterVolume: Master äänenvoimakkuus +details: Yksityiskohdat +chooseEmoji: Valitse emoji +descendingOrder: Laskevasti +scratchpad: Raaputusalusta +output: Ulostulo +invisibleNote: Näkymätön viesti +enableInfiniteScroll: Lataa enemmän automaattisesti +visibility: Näkyvyys +useCw: Piilota sisältö +poll: Kysely +enablePlayer: Avaa videotoistimeen +enterFileDescription: Syötä tiedostokuvaus +author: Kirjoittaja +manage: Hallinta +description: Kuvaus +describeFile: Lisää tiedostokuvaus +height: Korkeus +large: Suuri +medium: Keskikokoinen +small: Pieni +other: Muu +create: Luo +regenerateLoginTokenDescription: Luo uudelleen kirjautumisen aikana sisäisesti käytettävän + tunnuksen. Normaalisti tämä toiminto ei ole tarpeen. Jos tunniste luodaan uudelleen, + kaikki laitteet kirjautuvat ulos. +setMultipleBySeparatingWithSpace: Erottele useat merkinnät välilyönneillä. +fileIdOrUrl: Tiedosto ID tai URL-linkki +behavior: Käytös +instanceTicker: Viestejä koskevat instanssitiedot +waitingFor: Odottaa {x} +random: Satunnainen +system: Järjestelmä +switchUi: Ulkoasu +createNew: Luo uusi +followersCount: Seuraajien määrä +renotedCount: Saatujen buustausten määrä +followingCount: Seurattujen tilien määrä +notSet: Ei asetettu +nUsers: '{n} Käyttäjää' +nNotes: '{n} Viestiä' +sendErrorReports: Lähetä virheraportteja +backgroundColor: Taustaväri +accentColor: Korostusväri +textColor: Tekstin väri +advanced: Edistynyt +saveAs: Tallenna nimellä... +invalidValue: Epäkelpo arvo. +registry: Rekisteri +closeAccount: Sulje tili +currentVersion: Nykyinen versio +capacity: Kapasiteetti +clear: Palaa +_theme: + explore: Tutustu teemoihin +silenceConfirm: Oletko varma, että haluat hiljentää tämän käyttäjän? +notesAndReplies: Viestit ja vastaukset +withFiles: Tiedostot sisältyvät +silence: Hiljennä +popularTags: Suositut tagit +userList: Listat +about: Tietoja +aboutMisskey: Tietoja Calckeystä +exploreFediverse: Tutustu fediverseen +recentlyUpdatedUsers: Vastikään lisätyt käyttäjät +recentlyRegisteredUsers: Uudet liittyneet jäyttäjät +recentlyDiscoveredUsers: Vastikään löydetyt käyttäjät +exploreUsersCount: Täällä on {count} käyttäjää +share: Jaa +moderation: Sisällön valvonta +nUsersMentioned: Mainittu {n} käyttäjältä +securityKey: Turva-avain +securityKeyName: Avainnimi +registerSecurityKey: Rekisteröi turva-avain +lastUsed: Viimeksi käytetty +unregister: Poista rekisteröinti +passwordLessLogin: Salasanaton sisäänkirjautuminen +cacheClear: Tyhjennä välimuisti +markAsReadAllNotifications: Merkitse kaikki ilmoitukset luetuksi +markAsReadAllUnreadNotes: Merkitse kaikki viestit luetuiksi +uploadFolder: Oletuskansio ylöslatauksille +createGroup: Luo ryhmä +group: Ryhmä +groups: Ryhmät +ownedGroups: Omistetut ryhmät +help: Apua +inputMessageHere: Syötä viesti tähän +close: Sulje +joinedGroups: Liittyneet ryhmät +invites: Kutsut +groupName: Ryhmänimi +members: Jäsenet +language: Kieli +signinHistory: Kirjautumishistoria +docSource: Tämän dokumentin lähde +createAccount: Luo tili +existingAccount: Olemassa oleva tili +promotion: Edistetty +promote: Edistää +numberOfDays: Päivien määrä +accountSettings: Tilin asetukset +objectStorage: Objektitallennus +useObjectStorage: Käytä objektitallennusta +objectStorageBaseUrl: Perus URL-linkki +objectStorageBaseUrlDesc: "Viitteenä käytetty URL-linkki. Määritä CDN:n tai välityspalvelimen\ + \ URL-linkki, jos käytät kumpaakin.\nKäytä S3:lle 'https://.s3.amazonaws.com'\ + \ ja GCS:lle tai vastaaville palveluille 'https://storage.googleapis.com/'\ + \ jne." +objectStorageBucket: Kauha +newNoteRecived: Uusia viestejä +smtpPort: Portti +instanceMute: Instanssin mykistys +repliesCount: Lähetettyjen vastausten määrä +updatedAt: Päivitetty +notFound: Ei löydy +useOsNativeEmojis: Käytä käyttöjärjestelmän natiivi-Emojia +joinOrCreateGroup: Tule kutsutuksi ryhmään tai luo oma ryhmä. +text: Teksti +usernameInvalidFormat: Käytä isoja ja pieniä kirjaimia, numeroita ja erikoismerkkejä. +unsilenceConfirm: Oletko varma, että haluat poistaa käyttäjän hiljennyksen? +popularUsers: Suositut käyttäjät +moderator: Moderaattori +twoStepAuthentication: Kaksivaiheinen tunnistus +notFoundDescription: URL-linkkiin liittyvää sivua ei löytynyt. +antennaKeywords: Kuunneltavat avainsanat +antennaExcludeKeywords: Poislasketut avainsanat +antennaKeywordsDescription: Erottele välilyönneillä AND-ehtoa varten tai rivinvaihdolla + OR-ehtoa varten. +notifyAntenna: Ilmoita uusista viesteistä +withFileAntenna: Vain viestit tiedoston kanssa +enableServiceworker: Ota käyttöön Push-notifikaatiot selaimessasi +antennaUsersDescription: Luettele yksi käyttäjänimi rivi kohti +antennaInstancesDescription: Luettele yksi instanssi riviä kohti +caseSensitive: Isot ja pienet kirjaimet +withReplies: Sisällytä vastaukset +connectedTo: Seuraavat tili(t) on yhdistetty +unsilence: Poista hiljennys +administrator: Järjestelmänvalvoja +token: Merkki +resetPassword: Resetoi salasana +reduceUiAnimation: Vähennä käyttöliittymän animaatioita +transfer: Siirrä +messagingWithUser: Yksityisjuttelu +title: Otsikko +enable: Ota käyttöön +next: Seuraava +retype: Syötä uudelleen +noteOf: Lähettänyt {user} +inviteToGroup: Kutsu ryhmään +quoteAttached: Lainaus +quoteQuestion: Liitä lainauksena? +noMessagesYet: Ei vielä viestejä +newMessageExists: Uusia viestejä +onlyOneFileCanBeAttached: Voit liittää vain yhden tiedoston viestiin +signinRequired: Ole hyvä ja rekisteröidy tai kirjaudu sisään jatkaaksesi +invitations: Kutsut +available: Saatavilla +unavailable: Ei saatavissa +tooShort: Liian lyhyt +tooLong: Liian pitkä +weakPassword: Heikko salasana +normalPassword: Kohtalainen salasana +strongPassword: Vahva salasana +passwordMatched: Vastaa +signinWith: Kirjaudu sisään {x} +signinFailed: Ei voitu kirjautua sisään. Annettu käyttäjänimi tai salasana virheellinen. +tapSecurityKey: Napsauta turva-avaintasi +or: Tai +uiLanguage: Anna käyttöliittymän kieli +groupInvited: Sinut on kutsuttu ryhmään +aboutX: Tietoja {x} +disableDrawer: Älä käytä laatikkotyyppisiä valikoita +youHaveNoGroups: Sinulla ei ole ryhmiä +noHistory: Ei historiaa saatavilla +regenerate: Uudelleenluo +fontSize: Kirjasinkoko +dayOverDayChanges: Muutokset eiliseen +clientSettings: Asiakkaan asetukset +hideThisNote: Piilota tämä viesti +showFeaturedNotesInTimeline: Näytä esillä olevat viestit aikajanalla +objectStorageBucketDesc: Määritä palveluntarjoajasi käyttämä kauhan nimi. +objectStoragePrefix: Etuliite +objectStorageEndpoint: Päätepiste +objectStorageRegionDesc: Määritä alue, kuten "xx-east-1". Jos palvelusi ei tee eroa + alueiden välillä, jätä tämä kohta tyhjäksi tai kirjoita "us-east-1". +objectStorageUseSSL: Käytä SSL-salausta +objectStorageUseSSLDesc: Poista tämä käytöstä, jos et aio käyttää HTTPS:ää API-yhteyksissä +objectStorageUseProxy: Yhdistä välityspalvelimen kautta +objectStorageUseProxyDesc: Poista tämä käytöstä, jos et aio käyttää välityspalvelinta + API-yhteyksiä varten +objectStorageSetPublicRead: Aseta "public-read" ylöslataukseen +serverLogs: Palvelimen lokit +deleteAll: Poista kaikki +showFixedPostForm: Näytä viesti-ikkuna aikajanan yläpuolella +sounds: Äänet +listen: Kuuntele +none: Ei mitään +showInPage: Näytä sivulla +recentUsed: Vastikään käytetty +install: Asenna +uninstall: Poista asennus +installedApps: Hyväksytyt sovellukset +nothing: Ei nähtävää täällä +state: Tila +sort: Järjestä +ascendingOrder: Nousevasti +scratchpadDescription: Raaputusalusta tarjoaa ympäristön AiScript-kokeiluja varten. + Voit kirjoittaa, suorittaa ja tarkistaa sen tulokset vuorovaikutuksessa siinä olevan + Calckeyn kanssa. +script: Skripti +disablePagesScript: Poista AiScript käytöstä sivuilla +updateRemoteUser: Päivitä etäkäyttäjän tiedot +deleteAllFiles: Poista kaikki tiedostot +deleteAllFilesConfirm: Oletko varma, että haluat poistaa kaikki tiedostot? +removeAllFollowing: Poista seuraaminen kaikista seuratuista käyttäjistä +removeAllFollowingDescription: Tämän suorittaminen poistaa kaikki {host}:n tilit. + Suorita tämä, jos instanssia ei esimerkiksi enää ole olemassa. +userSuspended: Tämä käyttäjä on hyllytetty. +userSilenced: Tämä käyttäjä on hiljennetty. +yourAccountSuspendedTitle: Tämä tili on hyllytetty +yourAccountSuspendedDescription: Tämä tili on hyllytetty palvelimen palveluehtojen + tai vastaavien rikkomisen vuoksi. Ota yhteyttä ylläpitäjään, jos haluat tietää tarkemman + syyn. Älä luo uutta tiliä. +menu: Valikko +divider: Jakaja +addItem: Lisää kohde +relays: Releet +addRelay: Lisää rele +inboxUrl: Saavuneen postin URL +addedRelays: Lisätyt releet +serviceworkerInfo: Pitää ottaa käyttöön Push-notifikaatioissa. +deletedNote: Poistetut viestit +disablePlayer: Sulje videotoistin +expandTweet: Laajenna twiittiä +themeEditor: Teemaeditori +leaveConfirm: Tallentamattomia muutoksia olemassa. Hylätäänkö ne? +plugins: Liitännäiset +preferencesBackups: Asetusten varmuuskopiot +deck: Kansi +undeck: Jätä kansi +useBlurEffectForModal: Käytä blur-efektiä modaaleissa +useFullReactionPicker: Käytä täysikokoista reaktiovalitsinta +width: Leveys +generateAccessToken: Luo käyttöoikeustunniste +enableAll: Ota käyttöön kaikki +disableAll: Poista käytöstä kaikki +tokenRequested: Myönnä oikeus tiliin +notificationType: Ilmoituksen tyyppi +edit: Muokkaa +emailServer: Sähköpostipalvelin +enableEmail: Ota sähköpostin jakelu käyttöön +emailConfigInfo: Käytetään vahvistamaan sähköpostiosoitteesi rekisteröitymisen yhteydessä + tai jos unohdat salasanasi +email: Sähköposti +smtpHost: Isäntä +smtpUser: Käyttäjänimi +smtpPass: Salasana +emptyToDisableSmtpAuth: Jätä käyttäjänimi ja salasana tyhjäksi ohittaaksesi SMTP verifioinnin +smtpSecureInfo: Kytke tämä päältä kun käytät STARTTLS +testEmail: Kokeile email-lähetystä +wordMute: Sanan hiljennys +regexpError: Säännöllinen lausekevirhe +userSaysSomething: '{name} sanoi jotakin' +userSaysSomethingReason: '{name} sanoi {reason}' +makeActive: Aktivoi +display: Näyttö +copy: Kopioi +metrics: Mittarit +overview: Yleiskatsaus +logs: Lokit +delayed: Viivästynyt +database: Tietokanta +channel: Kanavat +notificationSetting: Ilmoitusasetukset +notificationSettingDesc: Valitse näytettävät ilmoitustyypit. +useGlobalSetting: Käytä globaaleja asetuksia +regenerateLoginToken: Luo kirjautumistunniste uudelleen +sample: Näyte +abuseReports: Raportit +reportAbuse: Raportti +reportAbuseOf: Raportti {name} +fillAbuseReportDescription: Täytä tätä raporttia koskevat tiedot. Jos se koskee tiettyä + viestiä, ilmoita sen URL-linkki. +abuseReported: Raporttisi on lähetetty. Kiitoksia paljon. +reporter: Raportoija +reporteeOrigin: Ilmoittajan alkuperä +reporterOrigin: Raportoijan alkuperä +forwardReport: Välitä raportti etäinstanssille +forwardReportIsAnonymous: Tilisi sijasta anonyymi järjestelmätili näytetään toimittajana + etäinstanssissa. +send: Lähetä +abuseMarkAsResolved: Merkitse raportti ratkaistuksi +openInNewTab: Avaa uuteen välilehteen +openInSideView: Avaa sivunäkymään +defaultNavigationBehaviour: Navigoinnin oletuskäyttäytyminen +editTheseSettingsMayBreakAccount: Näiden asetusten muuttaminen voi vahingoittaa tiliäsi. +desktop: Työpöytä +clip: Leike +optional: Vaihtoehtoinen +createNewClip: Luo uusi leike +unclip: Poista leike +confirmToUnclipAlreadyClippedNote: Tämä viesti on jo osa "{name}"-leikettä. Haluatko + sen sijaan poistaa sen tästä leikkeestä? +manageAccessTokens: Hallitse käyttöoikeuskoodeja +accountInfo: Tilin tiedot +notesCount: Viestien määrä +renotesCount: Lähetettyjen buustausten määrä +repliedCount: Saatujen vastausten määrä +sentReactionsCount: Lähetettyjen reaktioiden määrä +receivedReactionsCount: Saatujen reaktioiden määrä +pollVotesCount: Lähetettyjen kyselyäänien määrä +pollVotedCount: Saatujen kyselyäänien määrä +yes: Kyllä +no: Ei +driveFilesCount: Tiedostojen määrä asemalla +driveUsage: Aseman tilankäyttö +noCrawle: Hylkää hakukoneindeksointi +noCrawleDescription: Pyydä hakukoneita olemaan indeksoimatta profiilisivuasi, viestejäsi, + sivujasi jne. +alwaysMarkSensitive: Merkitse oletusarvoisesti herkäksi sisällöksi (NSFW) +loadRawImages: Alkuperäisten kuvien lataaminen pikkukuvien näyttämisen sijaan +disableShowingAnimatedImages: Älä näytä animoituja kuvia +verificationEmailSent: Vahvistussähköposti on lähetetty. Seuraa mukana olevaa linkkiä + suorittaaksesi vahvistuksen loppuun. +emailVerified: Sähköposti on vahvistettu +noteFavoritesCount: Kirjanmerkittyjen viestien määrä +pageLikedCount: Saatujen Sivu-tykkäysten määrä +pageLikesCount: Sivut-tykkäysten määrä +contact: Yhteystieto +useSystemFont: Käytä järjestelmän oletuskirjasinta +clips: Leikkeet +experimentalFeatures: Kokeiluluontoiset ominaisuudet +developer: Kehittäjä +makeExplorable: Tee tili näkyväksi osiossa "Tutustu" +makeExplorableDescription: Jos otat tämän pois käytöstä, tilisi ei näy "Tutustu"-osiossa. +showGapBetweenNotesInTimeline: Näytä väli viestien välissä aikajanalla +duplicate: Monista +left: Vasen +center: Keskellä +wide: Leveä +narrow: Kapea +reloadToApplySetting: Asetus otetaan käyttöön vain uudelleenladattaessa. Ladataanko + uudelleen nyt? +showTitlebar: Näytä otsikkorivi +clearCache: Tyhjennä välimuisti +onlineUsersCount: '{n} käyttäjää online-tilassa' +myTheme: Minun teemani +value: Arvo +saveConfirm: Tallenna muutokset? +deleteConfirm: Poistetaanko tosiaan? +latestVersion: Uusin versio +newVersionOfClientAvailable: Asiakasohjelmiston uudempi versio saatavilla. +usageAmount: Käyttö +inUse: Käytetty +editCode: Muokkaa koodia +apply: Käytä +receiveAnnouncementFromInstance: Vastaanota ilmoituksia tästä instanssista +emailNotification: Sähköposti-ilmoitukset +publish: Julkaise +inChannelSearch: Etsi kanavalta +useReactionPickerForContextMenu: Avaa reaktiovalitsin napsauttamalla oikeaa +typingUsers: '{users} kirjoittaa' +jumpToSpecifiedDate: Hyppää tiettyyn päivään +markAllAsRead: Merkitse kaikki luetuksi +goBack: Takaisin +unlikeConfirm: Poistatko todella tykkäyksesi? +fullView: Täysi koko +quitFullView: Poistu täydestä koosta +addDescription: Lisää kuvaus +markAsReadAllTalkMessages: Merkitse kaikki yksityisviestit luetuiksi +appearance: Ulkonäkö +messagingWithGroup: Ryhmäjuttelu +newPasswordIs: Uusi salasana on "{password}" +noFollowRequests: Sinulla ei ole odottavia seuraajapyyntöjä +objectStoragePrefixDesc: Tiedostot tallennetaan hakemistoihin tällä etuliitteellä. +objectStorageEndpointDesc: Jätä tämä tyhjäksi, jos käytät AWS S3:a. Muuten määritä + päätepisteeksi '' tai ':' käyttämästäsi palvelusta riippuen. +unableToProcess: Toimenpidettä ei voida suorittaa loppuun +installedDate: Hyväksynyt +lastUsedDate: Viimeksi käytetty +pluginTokenRequestedDescription: Tämä litännäinen voi käyttää tässä asetettuja käyttöoikeuksia. +permission: Oikeudet +smtpConfig: Lähtevän sähköpostin palvelimen (SMTP) asetukset +regexpErrorDescription: 'Säännöllisessä lausekkeessa tapahtui virhe rivillä {line} + sanan {tab} sanan mykistäminen rivillä {line}:' +emailAddress: Sähköpostiosoite +smtpSecure: Käytä implisiittistä SSL/TLS:ää SMTP-yhteyksissä +useGlobalSettingDesc: Jos se on päällä, käytetään tilisi ilmoitusasetuksia. Jos se + on pois päältä, voit tehdä yksilöllisiä asetuksia. +public: Julkinen +i18nInfo: Vapaaehtoiset kääntävät Calckeyta eri kielille. Voit auttaa osoitteessa + {link}. +lockedAccountInfo: Ellet aseta postauksen näkyvyydeksi "Vain seuraajille", postauksesi + näkyvät kaikille, vaikka vaatisitkin seuraajilta manuaalista hyväksyntää. +sendErrorReportsDescription: "Kun tämä on päällä, yksityiskohtaiset virhetiedot jaetaan\ + \ Calckeyn kanssa ongelman ilmetessä, mikä auttaa parantamaan Calckeyn laatua.\n\ + Näihin tietoihin sisältyy esimerkiksi käyttöjärjestelmäversio, käyttämäsi selain,\ + \ toimintasi Calckeyssä jne." +createdAt: Luotu +youAreRunningUpToDateClient: Käytössäsi on asiakasohjelman uusin versio. +needReloadToApply: Uudelleenlataus vaaditaan, jotta tämä näkyy. +showingPastTimeline: Näytetään parhaillaan vanhaa aikajanaa From 85ef06d9f4422871921905a5e90f5e39c5e3da9f Mon Sep 17 00:00:00 2001 From: spla Date: Wed, 3 May 2023 17:57:20 +0000 Subject: [PATCH 045/722] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1742 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index ab2a32633..e59601148 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -1263,7 +1263,7 @@ switchUi: Interfície d'usuari createNewClip: Crear un clip nou unclip: Treure clip public: Públic -renotesCount: Nombre de impulsos fets +renotesCount: Nombre d'impulsos fets sentReactionsCount: Nombre de reaccions fetes receivedReactionsCount: Nombre de reaccions rebudes pollVotesCount: Nombre de vots fets en enquestes From db4388d0c993cb8de3b3e410bceb74d8aa7d2af5 Mon Sep 17 00:00:00 2001 From: jolupa Date: Wed, 3 May 2023 18:05:28 +0000 Subject: [PATCH 046/722] chore: Translated using Weblate (Catalan) Currently translated at 100.0% (1742 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/ca/ --- locales/ca-ES.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index e59601148..6d2390563 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -103,7 +103,7 @@ enterEmoji: "Introduir un emoji" renote: "Impuls" unrenote: "Anul·lar impuls" renoted: "Impulsat." -cantRenote: "Aquesta publicació no pot ser impulsada." +cantRenote: "Aquesta nota no pot ser impulsada." cantReRenote: "No es pot impulsar un impuls." quote: "Cita" pinnedNote: "Publicació fixada" From a758af15131212e7b9cf1ba4bdc06d0e654ccfb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Lepist=C3=B6?= Date: Wed, 3 May 2023 18:20:05 +0000 Subject: [PATCH 047/722] chore: Translated using Weblate (Finnish) Currently translated at 43.5% (759 of 1742 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/fi/ --- locales/fi.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/locales/fi.yml b/locales/fi.yml index 9cac9d712..90872d855 100644 --- a/locales/fi.yml +++ b/locales/fi.yml @@ -813,3 +813,7 @@ createdAt: Luotu youAreRunningUpToDateClient: Käytössäsi on asiakasohjelman uusin versio. needReloadToApply: Uudelleenlataus vaaditaan, jotta tämä näkyy. showingPastTimeline: Näytetään parhaillaan vanhaa aikajanaa +userPagePinTip: Voit näyttää viestit täällä valitsemalla yksittäisten viestien valikosta + "Kiinnitä profiiliin". +notSpecifiedMentionWarning: Tämä viesti sisältää mainintoja käyttäjistä, joita ei + ole mainittu vastaanottajina From 49e9fb9001c25378aa396d2a1ccdac1e18456e14 Mon Sep 17 00:00:00 2001 From: Namekuji Date: Wed, 3 May 2023 15:50:43 -0400 Subject: [PATCH 048/722] don't update if renoted by bot --- packages/backend/src/remote/activitypub/models/person.ts | 4 ++-- packages/backend/src/services/chart/charts/notes.ts | 8 ++++++-- .../backend/src/services/chart/charts/per-user-notes.ts | 4 +++- packages/backend/src/services/note/create.ts | 6 ++++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 877f5f332..9e21fa9ff 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -191,7 +191,7 @@ export async function createPerson( .map((tag) => normalizeForSearch(tag)) .splice(0, 32); - const isBot = getApType(object) === "Service"; + const isBot = getApType(object) !== "Person"; const bday = person["vcard:bday"]?.match(/^\d{4}-\d{2}-\d{2}/); @@ -502,7 +502,7 @@ export async function updatePerson( emojis: emojiNames, name: truncate(person.name, nameLength), tags, - isBot: getApType(object) === "Service", + isBot: getApType(object) !== "Person", isCat: (person as any).isCat === true, isLocked: !!person.manuallyApprovesFollowers, movedToUri: person.movedTo || null, diff --git a/packages/backend/src/services/chart/charts/notes.ts b/packages/backend/src/services/chart/charts/notes.ts index 9ec347b47..42db60d0c 100644 --- a/packages/backend/src/services/chart/charts/notes.ts +++ b/packages/backend/src/services/chart/charts/notes.ts @@ -30,7 +30,11 @@ export default class NotesChart extends Chart { return {}; } - public async update(note: Note, isAdditional: boolean): Promise { + public async update( + note: Note, + isAdditional: boolean, + byBot = false, + ): Promise { const prefix = note.userHost === null ? "local" : "remote"; await this.commit({ @@ -44,7 +48,7 @@ export default class NotesChart extends Chart { : -1 : 0, [`${prefix}.diffs.renote`]: - note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + note.renoteId != null && !byBot ? (isAdditional ? 1 : -1) : 0, [`${prefix}.diffs.reply`]: note.replyId != null ? (isAdditional ? 1 : -1) : 0, [`${prefix}.diffs.withFile`]: diff --git a/packages/backend/src/services/chart/charts/per-user-notes.ts b/packages/backend/src/services/chart/charts/per-user-notes.ts index d0190cefd..22f3fddb7 100644 --- a/packages/backend/src/services/chart/charts/per-user-notes.ts +++ b/packages/backend/src/services/chart/charts/per-user-notes.ts @@ -32,6 +32,7 @@ export default class PerUserNotesChart extends Chart { user: { id: User["id"] }, note: Note, isAdditional: boolean, + byBot = false, ): Promise { await this.commit( { @@ -44,7 +45,8 @@ export default class PerUserNotesChart extends Chart { ? 1 : -1 : 0, - "diffs.renote": note.renoteId != null ? (isAdditional ? 1 : -1) : 0, + "diffs.renote": + note.renoteId != null && !byBot ? (isAdditional ? 1 : -1) : 0, "diffs.reply": note.replyId != null ? (isAdditional ? 1 : -1) : 0, "diffs.withFile": note.fileIds.length > 0 ? (isAdditional ? 1 : -1) : 0, }, diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index f4697b019..0c06b55ce 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -163,6 +163,7 @@ export default async ( host: User["host"]; isSilenced: User["isSilenced"]; createdAt: User["createdAt"]; + isBot: User["isBot"]; }, data: Option, silent = false, @@ -323,8 +324,8 @@ export default async ( res(note); // 統計を更新 - notesChart.update(note, true); - perUserNotesChart.update(user, note, true); + notesChart.update(note, true, user.isBot); + perUserNotesChart.update(user, note, true, user.isBot); // Register host if (Users.isRemoteUser(user)) { @@ -399,6 +400,7 @@ export default async ( // この投稿を除く指定したユーザーによる指定したノートのリノートが存在しないとき if ( data.renote && + !user.isBot && (await countSameRenotes(user.id, data.renote.id, note.id)) === 0 ) { incRenoteCount(data.renote); From eb7ccfed71dad41c7ce1b220189f90bbe6ffdecd Mon Sep 17 00:00:00 2001 From: ThatOneCalculator Date: Wed, 3 May 2023 13:51:49 -0700 Subject: [PATCH 049/722] panos --- packages/client/src/pages/about-calckey.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/src/pages/about-calckey.vue b/packages/client/src/pages/about-calckey.vue index fa0eeff0b..af5e0975c 100644 --- a/packages/client/src/pages/about-calckey.vue +++ b/packages/client/src/pages/about-calckey.vue @@ -100,9 +100,9 @@ - Date: Thu, 4 May 2023 13:17:37 +0900 Subject: [PATCH 050/722] Refactor hard word mutes --- packages/backend/src/misc/check-word-mute.ts | 94 +++++++++---------- .../src/server/api/stream/channels/antenna.ts | 7 ++ .../src/server/api/stream/channels/channel.ts | 7 ++ .../api/stream/channels/global-timeline.ts | 2 +- .../api/stream/channels/home-timeline.ts | 2 +- .../api/stream/channels/hybrid-timeline.ts | 2 +- .../api/stream/channels/local-timeline.ts | 2 +- .../stream/channels/recommended-timeline.ts | 2 +- .../server/api/stream/channels/user-list.ts | 7 ++ packages/backend/src/services/note/create.ts | 2 +- 10 files changed, 72 insertions(+), 55 deletions(-) diff --git a/packages/backend/src/misc/check-word-mute.ts b/packages/backend/src/misc/check-word-mute.ts index 53193d851..a411e46cc 100644 --- a/packages/backend/src/misc/check-word-mute.ts +++ b/packages/backend/src/misc/check-word-mute.ts @@ -12,67 +12,63 @@ type UserLike = { id: User["id"]; }; -export type Muted = { - muted: boolean; - matched: string[]; -}; - -const NotMuted = { muted: false, matched: [] }; - -function escapeRegExp(x: string) { +function escapeRegExp(x: string): string { return x.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string } +function checkWordMute(note: NoteLike): boolean { + if (note == null) return false; + + const text = ((note.cw ?? "") + " " + (note.text ?? "")).trim(); + if (text === "") return false; + + for (const mutePattern of mutedWords) { + let mute: RE2; + let matched: string[]; + if (Array.isArray(mutePattern)) { + matched = mutePattern.filter((keyword) => keyword !== ""); + + if (matched.length === 0) { + continue; + } + mute = new RE2( + `\\b${matched.map(escapeRegExp).join("\\b.*\\b")}\\b`, + "g", + ); + } else { + const regexp = mutePattern.match(/^\/(.+)\/(.*)$/); + // This should never happen due to input sanitisation. + if (!regexp) { + console.warn(`Found invalid regex in word mutes: ${mutePattern}`); + continue; + } + mute = new RE2(regexp[1], regexp[2]); + matched = [mutePattern]; + } + + try { + if (mute.test(text)) return true; + } catch (err) { + // This should never happen due to input sanitisation. + } + } + + return notMuted; +} + export async function getWordMute( note: NoteLike, me: UserLike | null | undefined, mutedWords: Array, -): Promise { +): Promise { // 自分自身 if (me && note.userId === me.id) { - return NotMuted; + return false; } if (mutedWords.length > 0) { - const text = ((note.cw ?? "") + "\n" + (note.text ?? "")).trim(); - - if (text === "") { - return NotMuted; - } - - for (const mutePattern of mutedWords) { - let mute: RE2; - let matched: string[]; - if (Array.isArray(mutePattern)) { - matched = mutePattern.filter((keyword) => keyword !== ""); - - if (matched.length === 0) { - continue; - } - mute = new RE2( - `\\b${matched.map(escapeRegExp).join("\\b.*\\b")}\\b`, - "g", - ); - } else { - const regexp = mutePattern.match(/^\/(.+)\/(.*)$/); - // This should never happen due to input sanitisation. - if (!regexp) { - console.warn(`Found invalid regex in word mutes: ${mutePattern}`); - continue; - } - mute = new RE2(regexp[1], regexp[2]); - matched = [mutePattern]; - } - - try { - if (mute.test(text)) { - return { muted: true, matched }; - } - } catch (err) { - // This should never happen due to input sanitisation. - } - } + return checkWordMute(note) || checkWordMute(reply) || checkWordMute(renote) } - return NotMuted; + return false; } diff --git a/packages/backend/src/server/api/stream/channels/antenna.ts b/packages/backend/src/server/api/stream/channels/antenna.ts index 050a8d101..65e1eb987 100644 --- a/packages/backend/src/server/api/stream/channels/antenna.ts +++ b/packages/backend/src/server/api/stream/channels/antenna.ts @@ -1,6 +1,7 @@ import Channel from "../channel.js"; import { Notes } from "@/models/index.js"; import { isUserRelated } from "@/misc/is-user-related.js"; +import { getWordMute } from "@/misc/check-word-mute.js"; import type { StreamMessages } from "../types.js"; import { IdentifiableError } from "@/misc/identifiable-error.js"; @@ -37,6 +38,12 @@ export default class extends Channel { if (note.renote && !note.text && isUserRelated(note, this.renoteMuting)) return; + if ( + this.userProfile && + (await getWordMute(note, this.user, this.userProfile.mutedWords)) + ) + return; + this.connection.cacheNote(note); this.send("note", note); diff --git a/packages/backend/src/server/api/stream/channels/channel.ts b/packages/backend/src/server/api/stream/channels/channel.ts index d046579f4..3b242bb2a 100644 --- a/packages/backend/src/server/api/stream/channels/channel.ts +++ b/packages/backend/src/server/api/stream/channels/channel.ts @@ -1,6 +1,7 @@ import Channel from "../channel.js"; import { Users } from "@/models/index.js"; import { isUserRelated } from "@/misc/is-user-related.js"; +import { getWordMute } from "@/misc/check-word-mute.js"; import type { User } from "@/models/entities/user.js"; import type { StreamMessages } from "../types.js"; import type { Packed } from "@/misc/schema.js"; @@ -39,6 +40,12 @@ export default class extends Channel { if (note.renote && !note.text && isUserRelated(note, this.renoteMuting)) return; + if ( + this.userProfile && + (await getWordMute(note, this.user, this.userProfile.mutedWords)) + ) + return; + this.connection.cacheNote(note); this.send("note", note); diff --git a/packages/backend/src/server/api/stream/channels/global-timeline.ts b/packages/backend/src/server/api/stream/channels/global-timeline.ts index aa3844c7e..fb5c458b4 100644 --- a/packages/backend/src/server/api/stream/channels/global-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/global-timeline.ts @@ -66,7 +66,7 @@ export default class extends Channel { // そのためレコードが存在するかのチェックでは不十分なので、改めてgetWordMuteを呼んでいる if ( this.userProfile && - (await getWordMute(note, this.user, this.userProfile.mutedWords)).muted + (await getWordMute(note, this.user, this.userProfile.mutedWords)) ) return; diff --git a/packages/backend/src/server/api/stream/channels/home-timeline.ts b/packages/backend/src/server/api/stream/channels/home-timeline.ts index fa4a8a390..70b2f387e 100644 --- a/packages/backend/src/server/api/stream/channels/home-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/home-timeline.ts @@ -64,7 +64,7 @@ export default class extends Channel { // そのためレコードが存在するかのチェックでは不十分なので、改めてgetWordMuteを呼んでいる if ( this.userProfile && - (await getWordMute(note, this.user, this.userProfile.mutedWords)).muted + (await getWordMute(note, this.user, this.userProfile.mutedWords)) ) return; diff --git a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts index 557bb9682..423fb461f 100644 --- a/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/hybrid-timeline.ts @@ -81,7 +81,7 @@ export default class extends Channel { // そのためレコードが存在するかのチェックでは不十分なので、改めてgetWordMuteを呼んでいる if ( this.userProfile && - (await getWordMute(note, this.user, this.userProfile.mutedWords)).muted + (await getWordMute(note, this.user, this.userProfile.mutedWords)) ) return; diff --git a/packages/backend/src/server/api/stream/channels/local-timeline.ts b/packages/backend/src/server/api/stream/channels/local-timeline.ts index dc3aab8d7..94901661b 100644 --- a/packages/backend/src/server/api/stream/channels/local-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/local-timeline.ts @@ -58,7 +58,7 @@ export default class extends Channel { // そのためレコードが存在するかのチェックでは不十分なので、改めてgetWordMuteを呼んでいる if ( this.userProfile && - (await getWordMute(note, this.user, this.userProfile.mutedWords)).muted + (await getWordMute(note, this.user, this.userProfile.mutedWords)) ) return; diff --git a/packages/backend/src/server/api/stream/channels/recommended-timeline.ts b/packages/backend/src/server/api/stream/channels/recommended-timeline.ts index 6baec7744..7eee22c32 100644 --- a/packages/backend/src/server/api/stream/channels/recommended-timeline.ts +++ b/packages/backend/src/server/api/stream/channels/recommended-timeline.ts @@ -79,7 +79,7 @@ export default class extends Channel { // そのためレコードが存在するかのチェックでは不十分なので、改めてgetWordMuteを呼んでいる if ( this.userProfile && - (await getWordMute(note, this.user, this.userProfile.mutedWords)).muted + (await getWordMute(note, this.user, this.userProfile.mutedWords)) ) return; diff --git a/packages/backend/src/server/api/stream/channels/user-list.ts b/packages/backend/src/server/api/stream/channels/user-list.ts index 105c45955..2183351e1 100644 --- a/packages/backend/src/server/api/stream/channels/user-list.ts +++ b/packages/backend/src/server/api/stream/channels/user-list.ts @@ -2,6 +2,7 @@ import Channel from "../channel.js"; import { UserListJoinings, UserLists } from "@/models/index.js"; import type { User } from "@/models/entities/user.js"; import { isUserRelated } from "@/misc/is-user-related.js"; +import { getWordMute } from "@/misc/check-word-mute.js"; import type { Packed } from "@/misc/schema.js"; export default class extends Channel { @@ -59,6 +60,12 @@ export default class extends Channel { if (note.renote && !note.text && isUserRelated(note, this.renoteMuting)) return; + if ( + this.userProfile && + (await getWordMute(note, this.user, this.userProfile.mutedWords)) + ) + return; + this.send("note", note); } diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index f1164c9c6..7c9746b73 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -356,7 +356,7 @@ export default async ( for (const u of us) { getWordMute(note, { id: u.userId }, u.mutedWords).then( (shouldMute) => { - if (shouldMute.muted) { + if (shouldMute) { MutedNotes.insert({ id: genId(), userId: u.userId, From cdd876ba03852c318f8599215a4860854d7a82ea Mon Sep 17 00:00:00 2001 From: naskya Date: Thu, 4 May 2023 14:13:13 +0900 Subject: [PATCH 051/722] Refactor soft word mutes --- locales/en-US.yml | 3 + locales/ja-JP.yml | 3 + packages/client/src/components/MkNote.vue | 16 +++- .../client/src/components/MkNoteDetailed.vue | 16 +++- packages/client/src/components/MkNoteSub.vue | 40 +++++++++ .../client/src/scripts/check-word-mute.ts | 84 ++++++++++++------- 6 files changed, 128 insertions(+), 34 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 4acb0fc5b..89c0a08e6 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -663,6 +663,9 @@ regexpErrorDescription: "An error occurred in the regular expression on line {li instanceMute: "Instance Mutes" userSaysSomething: "{name} said something" userSaysSomethingReason: "{name} said {reason}" +userSaysSomethingReasonReply: "{name} replied to a post containing {reason}" +userSaysSomethingReasonRenote: "{name} boosted a post containing {reason}" +userSaysSomethingReasonQuote: "{name} quoted a post containing {reason}" makeActive: "Activate" display: "Display" copy: "Copy" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 8ae43cdb9..cb01fb564 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -619,6 +619,9 @@ regexpErrorDescription: "{tab}ワードミュートの{line}行目の正規表 instanceMute: "インスタンスミュート" userSaysSomething: "{name}が何かを言いました" userSaysSomethingReason: "{name}が{reason}と言いました" +userSaysSomethingReasonReply: "{name}が{reason}を含む投稿に返信しました" +userSaysSomethingReasonRenote: "{name}が{reason}を含む投稿をブーストしました" +userSaysSomethingReasonQuote: "{name}が{reason}を含む投稿を引用しました" makeActive: "アクティブにする" display: "表示" copy: "コピー" diff --git a/packages/client/src/components/MkNote.vue b/packages/client/src/components/MkNote.vue index 7e3fd6be5..67eab29c7 100644 --- a/packages/client/src/components/MkNote.vue +++ b/packages/client/src/components/MkNote.vue @@ -198,7 +198,7 @@
- +