Compare commits

...

351 commits

Author SHA1 Message Date
dakkar
b77c025245 link twitter names to twitter, not nitter #382
nitter seems very dead
2024-01-28 16:06:16 +00:00
Marie
e5c060eecf
fix: don't show mentions and boosts towards muted user posts in timeline
Closes #336
2024-01-26 01:59:19 +01:00
Marie
c8c505fb92
fix: allow viewing of muted users posts
This would allow admins and mods to see muted users posts as well as normal users to view them if they ever get a link sent to them.
2024-01-26 01:39:53 +01:00
Marie
47cf7f6822
fix: don't show replies to muted users in timelines
Closes #337
2024-01-26 01:39:01 +01:00
Marie
6c6ccdc1e0
fix: properly mute notifications when mentioned by muted users
Closes #339
2024-01-26 01:24:26 +01:00
Marie
1bec69df16
fix: reactions being shown on muted/blocked users
Closes #342
2024-01-26 01:00:12 +01:00
Marie
4be70a8d98
fix: boost being available on DMs on detailed view
Closes #346
2024-01-26 00:56:09 +01:00
Marie
e89f4ff3c8
fix: boosts not being muted when muting thread
Closes #347
2024-01-25 19:39:41 +01:00
Marie
c1d38b02d7 fix(ci): lint failing to build bubble game 2024-01-25 19:26:22 +01:00
Marie
610f208c57
fix: don't let user invite themself to reversi game 2024-01-25 14:23:51 +01:00
Marie
913dd581ef
merge: upstream 2024-01-25 14:21:42 +01:00
Marie
92ee0a5863
fix: notes/versions not checking visibility
Issue reported by fEmber
2024-01-25 14:17:57 +01:00
Marie
b68c358688
fix: reversi allowing you to search globally instead of just locally
Misskey used a local option in the select section but os nor userselectdialog supported this.
2024-01-25 14:11:41 +01:00
syuilo
5342692b1e 2024.2.0-beta.7 2024-01-24 20:31:05 +09:00
syuilo
ef8eaf8e89
New Crowdin updates (#13080)
* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)
2024-01-24 20:29:05 +09:00
syuilo
4553d6426b Revert "Create deploy-test-environment.yml (#13079)"
This reverts commit 4de14fb5cf.
2024-01-24 17:31:34 +09:00
syuilo
b33cfc2876 test 2024-01-24 17:13:58 +09:00
Srgr0
4de14fb5cf
Create deploy-test-environment.yml (#13079) 2024-01-24 17:11:52 +09:00
syuilo
60156a40b2 fix(reversi/backend): refactor and fixes 2024-01-24 16:44:12 +09:00
syuilo
5719a929ad enhance(reversi): 変則なしマッチングを可能に 2024-01-24 16:37:06 +09:00
syuilo
2b6bf074c6 2024.2.0-beta.6 2024-01-24 15:20:12 +09:00
syuilo
37d87854c2
New translations ja-jp.yml (Japanese, Kansai) (#13077) 2024-01-24 15:19:14 +09:00
syuilo
d27b3525cd enhance(reversi): improve matching system 2024-01-24 15:18:50 +09:00
syuilo
7beb4ed131 fix(frontend/reversi): fix game preview 2024-01-24 14:52:19 +09:00
かっこかり
177c35e321
fix(frontend/pizzax): オブジェクトにnullがある場合に正しくマージされないのを修正 (#13073)
* fix(frontend/pizzax): オブジェクトにnullがある場合に正しくマージされない

* fix types

* マージを内製
2024-01-24 14:45:27 +09:00
syuilo
ca9be872a8 2024.2.0-beta.5 2024-01-24 13:55:57 +09:00
syuilo
a97d4fa4ef fix(reversi): wait redis operation to improve stability 2024-01-24 13:53:55 +09:00
syuilo
908e0f3b8b perf(reversi): set expire matchSpecific and matchAny 2024-01-24 13:51:16 +09:00
syuilo
b68446b289 enhance(reversi): tweak MATCHING_TIMEOUT_MS 2024-01-24 13:32:08 +09:00
syuilo
608e7c1546 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-24 13:17:36 +09:00
syuilo
a3ba315dc6 enhance(reversi): improve game setting flow 2024-01-24 13:17:34 +09:00
syuilo
df5f14ca7a
New translations ja-jp.yml (Japanese, Kansai) (#13074) 2024-01-24 10:52:47 +09:00
syuilo
d060bb44e1 enhance(reversi): improve stability 2024-01-24 10:51:49 +09:00
syuilo
645f5e8633 enhance(reversi): 開始時に対局をシェアできるように 2024-01-24 10:36:02 +09:00
syuilo
547be1973d fix of 65557d5f27 2024-01-24 10:35:44 +09:00
syuilo
65557d5f27 enhance(reversi): more robust matching process 2024-01-24 10:16:05 +09:00
syuilo
cc420c245f enhance(reversi): 準備中の自分の対局も一覧に表示するように 2024-01-24 09:41:22 +09:00
syuilo
443d1b2f5c Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-24 09:31:06 +09:00
syuilo
1f8d275094 🎨 2024-01-24 09:30:38 +09:00
かっこかり
2efcb27043
fix(frontend/HorizontalSwipe): スワイプ・UIアニメーションが無効の際はトランジションを行わないように (#13076)
* fix(frontend/HorizontalSwipe): アニメーションを減らすが考慮されるように

* fix

* fix

* revert unused change

* fix
2024-01-24 09:22:51 +09:00
Marie
5f36bb6747
fix: background being funky on user profiles 2024-01-23 12:18:12 +01:00
syuilo
298bc34eaf 2024.2.0-beta.4 2024-01-23 10:54:04 +09:00
syuilo
62f6f6af02
New Crowdin updates (#13061)
* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Korean)
2024-01-23 10:53:47 +09:00
syuilo
e8ba0b3f54 enhance(reversi): improve desync handling 2024-01-23 10:51:59 +09:00
syuilo
f48f7149f8 🎨 2024-01-23 09:43:54 +09:00
まっちゃとーにゅ
d2ccce6366
fix(build): スクリプトの名前の変更漏れ (#13068)
* fix(build): スクリプトの名前の変更漏れ

* 漏れの漏れ
2024-01-23 07:57:56 +09:00
tamaina
af2d81a990
perf: (productionの)dependenciesから@typesを削除、reversi/bubble-gameをesbuildにする (#13067)
* perf: (productionの)dependenciesから@typesを削除、reversi/bubble-gameをesbuildにする

* fix

* fix
2024-01-23 06:36:44 +09:00
ikasoba
58ac8bc8e9
修正できたかも (#13066) 2024-01-23 06:35:15 +09:00
Marie
d15e4a85bb
chore: typecheck 2024-01-22 22:13:10 +01:00
Marie
55ea66127a
fix: close button not closing auto expanded notes
Closes #359
2024-01-22 20:11:26 +01:00
Marie
fd69a2fbbd
merge: upstream 2024-01-22 19:58:43 +01:00
tamaina
2ee5507d06 fix of #13014 (misskey-js publish) 2024-01-22 15:25:22 +00:00
tamaina
31a39776f5
chore: publish misskey-js automatically (#13014)
* chore: publish @misskey-dev/misskey-js

* remove @misskey-dev/

* ??

* correct version

* version
2024-01-23 00:19:43 +09:00
syuilo
5e307e472d 2024.2.0-beta.3 2024-01-22 18:33:40 +09:00
syuilo
e0ad066382 fix lint 2024-01-22 18:32:32 +09:00
syuilo
99fe03bd4d 🎨 2024-01-22 18:31:59 +09:00
おさむのひと
850d38414e
fix: 2024-01-22 10:50時点のdevelopにてCIがコケている (#13060)
* fix: バブルゲームのビルド失敗修正

* fix: api.jsonの定義誤りを修正

* fix: lint.yml(typecheck)

* fix: fix eslint error

* fix: frontend vitest version

* fix: frontend vitest version

* fix:

* fix: cypress

* fix: misskey-js test

* fix: misskey-js tsd(tsdはpakcage.jsonのexportsをサポートしない?)

* fix: conflict

* fix: 間違えて上書きしたところを修正

* fix: 再

* fix: api.json

* fix: api.json

* fix: タイムアウト延長

* Update packages/misskey-js/jest.config.cjs

Co-authored-by: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com>

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Co-authored-by: Sayamame-beans <61457993+Sayamame-beans@users.noreply.github.com>
2024-01-22 18:01:54 +09:00
syuilo
d380ed36de fix lint 2024-01-22 18:00:46 +09:00
syuilo
5c8888d6a8 enhance(reversi): render ogp 2024-01-22 17:59:12 +09:00
syuilo
4af3640bd3 fix lint 2024-01-22 17:44:03 +09:00
syuilo
94e282b612 perf(reversi): improve performance of reversi backend 2024-01-22 15:41:29 +09:00
syuilo
259992c65f enhance(reversi): some tweaks 2024-01-22 12:03:32 +09:00
syuilo
67f6157d42 2024.2.0-beta.2 2024-01-22 09:30:00 +09:00
syuilo
0cfeb42786
New Crowdin updates (#13056)
* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Lao)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Romanian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Arabic)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Czech)

* New translations ja-jp.yml (Danish)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Greek)

* New translations ja-jp.yml (Hungarian)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Dutch)

* New translations ja-jp.yml (Norwegian)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Swedish)

* New translations ja-jp.yml (Turkish)

* New translations ja-jp.yml (Ukrainian)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Vietnamese)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Bengali)

* New translations ja-jp.yml (Croatian)

* New translations ja-jp.yml (Uyghur)

* New translations ja-jp.yml (Lojban)

* New translations ja-jp.yml (Sinhala)

* New translations ja-jp.yml (Uzbek)

* New translations ja-jp.yml (Kannada)

* New translations ja-jp.yml (Haitian Creole)

* New translations ja-jp.yml (Kabyle)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)
2024-01-22 09:29:26 +09:00
syuilo
a431dde537 refactor(reversi): refactoring of reversi backend 2024-01-22 09:29:06 +09:00
かっこかり
4f95b8d9d2
fix(frontend/pizzax): デフォルト値が適用できないことがあるのを修正 (#13057)
* fix(frontend/pizzax): デフォルト値が適用できないことがあるのを修正

* fix

* いらんプロパティをけす
2024-01-22 09:20:56 +09:00
syuilo
9eb0468cd2 2024.2.0-beta.1 2024-01-22 09:14:45 +09:00
syuilo
1a01a85182 perf(reversi): improve performance of reversi backend 2024-01-22 08:39:38 +09:00
Marie
de002aecad
chore: rename "Misskey Games" to "Games"
This should fix the alignment issue in the menu due to the length and also fits better for it's future purpose.
2024-01-21 17:18:47 +01:00
Marie
0741d07190 merge: align Sk & Mk variants of components (#369) 2024-01-21 14:39:14 +01:00
Marie
89a813f11d
fix: connection import on MkTimeline 2024-01-21 14:33:19 +01:00
Marie
72f420d655
fix(ci): build reversi and bubble-game modules on backend typecheck 2024-01-21 14:22:31 +01:00
Marie
013032dd93
fix: downgrade eslint to fix bug
prefer-nullish-coalescing broke in the 6.19.0 update with a funky bug which has an open PR to be fixed https://github.com/typescript-eslint/typescript-eslint/issues/8261
2024-01-21 14:18:47 +01:00
dakkar
f87483feb7 align Sk & Mk variants of components
some whitespace, some types, a missing sound, and a probably wrong API
URL
2024-01-21 12:37:41 +00:00
Marie
9d3f34d88f
merge: upstream (2) 2024-01-21 13:15:39 +01:00
Marie
e7349144f0
fix: streaming.js module not found 2024-01-21 13:14:21 +01:00
Marie
db012fc8c3
merge: upstream (1) 2024-01-21 13:11:23 +01:00
syuilo
3ff229af6f enhance(frontend): リファクタリングなど 2024-01-21 20:26:52 +09:00
かっこかり
3784b39a5f
enhance(frontend): 季節に応じた画面の演出を南半球に対応させる (#12838)
* (enhance) 季節に応じた画面の演出を南半球に対応させる

* Update Changelog

* (add) 半球の簡易自動判定

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-21 19:08:07 +09:00
dependabot[bot]
676ee87963
chore(deps-dev): bump vite in /scripts/changelog-checker (#13040)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.11 to 5.0.12.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.0.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.0.12/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-21 19:05:02 +09:00
syuilo
b52fe6cc86
New Crowdin updates (#12845)
* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Lao)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Lao)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Lao)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Romanian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Arabic)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Czech)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Dutch)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Swedish)

* New translations ja-jp.yml (Ukrainian)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Vietnamese)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Bengali)

* New translations ja-jp.yml (Uzbek)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Arabic)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Czech)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Greek)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Ukrainian)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Vietnamese)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Bengali)

* New translations ja-jp.yml (Uzbek)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Arabic)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Czech)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Ukrainian)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Vietnamese)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Romanian)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Arabic)

* New translations ja-jp.yml (Catalan)

* New translations ja-jp.yml (Czech)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Greek)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Polish)

* New translations ja-jp.yml (Portuguese)

* New translations ja-jp.yml (Russian)

* New translations ja-jp.yml (Slovak)

* New translations ja-jp.yml (Ukrainian)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Vietnamese)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Bengali)

* New translations ja-jp.yml (Uzbek)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Thai)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (German)

* New translations ja-jp.yml (Italian)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Simplified)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Japanese, Kansai)

* New translations ja-jp.yml (Chinese Simplified)
2024-01-21 18:44:51 +09:00
syuilo
f4657eb16f update deps 2024-01-21 18:43:01 +09:00
1Step621
90e0a6e2c3
Enhance(frontend): 絵文字編集ダイアログをウィンドウにする (#13047)
* 絵文字編集ダイアログをウィンドウにする

* update CHANGELOG.md
2024-01-21 18:30:05 +09:00
かっこかり
0580ba1fb5
enhance(frontend): タイムラインフィルターの設定を保持+センシティブなノートを隠せるように (#12848)
* (enhance) タイムラインフィルターの状態を記憶するように

* fix

* (enhance) センシティブな投稿をミュート形式で表示する(TLのみ)

* fix

* Update Changelog

* Fix changelog

* Lintエラーを潰す

* Update locales/ja-JP.yml

* hideSensitive -> withSensitive

* Update CHANGELOG.md

* Update ja-JP.yml

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-21 18:29:17 +09:00
かっこかり
fb309f3d4f
return a Vary: Accept header for all dual-format endpoints #365 (#13044)
`/users/:user`, `/@:user`, `/notes/:note` return different responses
depending on the request's `Accept:` header. If we don't consistently
return a `Vary: Accept` header, browsers and caching proxies will get
confused, and return AP representations when HTML was requested, or
vice versa.

Co-authored-by: dakkar <dakkar@thenautilus.net>
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-21 18:14:42 +09:00
syuilo
4c87e98e12 fix(frontend): MkHorizontalSwipeでメニューを閉じるのに2回クリックが必要になる問題を修正
#13055
2024-01-21 18:08:49 +09:00
syuilo
b3cc17ea0d enhance(reversi): tweak reversi 2024-01-21 17:08:36 +09:00
syuilo
6039f27bd5 enhance(reversi): tweak reversi 2024-01-21 12:05:51 +09:00
かっこかり
4de77784c9
enhance(sw): オフライン表示のデザインを改善 (#13052)
* enhance(sw): オフライン表示のデザインを改善

* Update Changelog

* fix

* fix

* fix

* 言語が取得できなかった場合のフォールバックを追加

* (change) translation key
2024-01-21 11:50:05 +09:00
syuilo
a17251d913 enhance(reversi): tweak reversi 2024-01-21 10:07:43 +09:00
かっこかり
576484835e
enhance(frontend): ノート作成画面の添付メニューから直接ファイルを消せるように (#12858)
* (enhance) 添付画面から直接ファイルを消せるように

* Update Changelog

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-21 05:26:13 +09:00
syuilo
fcd7ffe956 enhance(reversi): tweak reversi 2024-01-20 21:23:33 +09:00
syuilo
7d57487026 Update Dockerfile 2024-01-20 18:14:20 +09:00
syuilo
c48d9cca0f Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-20 18:12:27 +09:00
syuilo
3cb543f75d enhance(reversi): tweak reversi
Resolve #13048
2024-01-20 18:12:24 +09:00
1Step621
c115b8e322
Fix(frontend): 日本語のUnicode絵文字追加辞書をインストールすると絵文字ピッカーでUnicode絵文字を検索できなくなるのを修正 (#13046)
* 絵文字辞書のサロゲートペアを修正

* update CHANGELOG.md

* Revert "update CHANGELOG.md"

This reverts commit 7c24fa611a533bb74ef7979a0356b83f3410a056.
2024-01-20 17:28:21 +09:00
syuilo
f6b7754fb1 🎨 2024-01-20 15:52:35 +09:00
syuilo
3bf3ba450c enhance(reversi): tweak reversi 2024-01-20 14:51:40 +09:00
syuilo
094c6e32ff add missing ext 2024-01-20 14:05:09 +09:00
syuilo
cb74b61755 fix api-extractor 2024-01-20 14:01:27 +09:00
syuilo
1de29e5566 refactor: migrate to ESM 2024-01-20 13:57:03 +09:00
syuilo
b9a81edae5 enhance(reversi): tweak reversi 2024-01-20 13:14:46 +09:00
syuilo
f86d0186d2 fix(dev): fix pnpm dev 2024-01-20 11:18:53 +09:00
syuilo
151e3bc940 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-20 11:11:23 +09:00
syuilo
44b8ac135f fix(dev): fix workspace settings 2024-01-20 11:11:20 +09:00
かっこかり
272590ef94
fix lint 2024-01-20 10:10:37 +09:00
syuilo
79eac66d39 tweak reversi map 2024-01-20 10:02:09 +09:00
syuilo
e2985cf122 lint fixes 2024-01-20 09:59:04 +09:00
syuilo
bc7b2f1876 lint fix 2024-01-20 09:56:13 +09:00
syuilo
91522381b6 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-20 09:53:29 +09:00
syuilo
952386ba8f refactor: extract bubble-game engine as independent package 2024-01-20 09:53:26 +09:00
Acid Chicken (硫酸鶏)
7881f06be0
refactor: deprecate i18n.t (#13039)
* refactor: deprecate i18n.t

* revert: deprecate i18n.t

This reverts commit 7dbf873a2f745040ee723df5db659acacff84e12.

* chore: reimpl
2024-01-20 08:11:59 +09:00
syuilo
a637b4e282 feat: reversi
Resolve #12962
2024-01-19 20:51:49 +09:00
1Step621
678dba9245
Enhance(frontend): MFMの属性にオートコンプリートが利用できるように (#12803)
* MFMのパラメータでオートコンプリートできるように

* tweak conditions & refactor

* ファイル末尾の改行忘れ

* remove console.log & refactor

* 型付けに敗北

* fix

* update CHANGELOG.md

* tweak conditions

* CHANGELOGの様式ミス

* CHANGELOGを書く場所を間違えていたので修正

* move changelog

* move changelog

* typeof MFM_TAGS[number]

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>

* $[border.noclip ]対応

* Update const.ts

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-19 18:50:26 +09:00
AsukaMari
b17eb8e537
fix: Some fixes for #12850 (#12862)
- refinement the error message when trueMail validation fails
- the settings of trueMail are not displayed after saving
- changing how `Active Email Validation` is saved
2024-01-19 18:48:30 +09:00
Korange
8be977b32b
「外部サイトからインストール」のパスを /install-extensions に変更 (#12991)
* /install-extensionsに変更

* CHANGELOG.mdに追記

* 旧パスも利用できるように
2024-01-19 18:46:53 +09:00
かっこかり
3ad2732375
fix(frontend/HorizontalSwipe): ページの要素がはみ出る問題を修正 (#13036) 2024-01-19 17:19:06 +09:00
Acid Chicken (硫酸鶏)
d85085d16f
refactor: style 2024-01-19 11:54:00 +09:00
Acid Chicken (硫酸鶏)
43401210c3
refactor: fully typed locales (#13033)
* refactor: fully typed locales

* refactor: hide parameterized locale strings from type data in ts access

* refactor: missing assertions

* docs: annotation
2024-01-19 07:58:07 +09:00
かっこかり
c1019a006b
feat(frontend): 横スワイプでタブを切り替える機能 (#13011)
* (add) 横スワイプでタブを切り替える機能

* Change Changelog

* y方向の移動が一定量を超えたらスワイプを中断するように

* Update swipe distance thresholds

* Remove console.log

* adjust threshold

* rename, use v-model

* fix

* Update MkHorizontalSwipe.vue

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>

* use css module

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-18 18:21:33 +09:00
かっこかり
67a41c09ae
fix(frontend/MediaVideo): 再生シークバーの当たり判定を調整 (#13027)
* fix(frontend/MediaVideo): 再生シークバーの当たり判定を調整

* fix
2024-01-18 14:45:11 +09:00
FineArchs
fc7cd636a3
refactor: MkCodeをブロックとインラインで別コンポーネント化する (#13026)
* Create MkCodeInline.vue

* Update MkCode.vue

* Update MkMisskeyFlavoredMarkdown.ts

* Update flash.vue

* Update MkCodeInline.vue
2024-01-18 12:16:12 +09:00
syuilo
1e237a7df5 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-18 11:19:45 +09:00
syuilo
1dcf25c24f chore(drop-and-fusion): bump version 2024-01-18 11:19:43 +09:00
FineArchs
9a40b366a3
MkCodeにコピーボタンを追加 (#12999)
* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update MkCode.vue

* Update CHANGELOG.md

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-18 10:53:29 +09:00
Marie
0d766a6310 merge: fix make sure that signToActivityPubGet defaults to true (#352)
Reviewed-on: https://git.joinsharkey.org/Sharkey/Sharkey/pulls/352
Reviewed-by: dakkar <dakkar@noreply.git.joinshakrey.org>
2024-01-17 17:01:39 +01:00
syuilo
945d6a2b09 enhance(drop-and-fusion): ゲームバランスの調整など 2024-01-17 20:11:32 +09:00
a
0283142d0e
Fix: properly handle cc followers (#13009)
* Fix: properly handle cc followers

Fix #13001

* Update CHANGELOG.md

* Fix syntax error
2024-01-17 18:19:20 +09:00
FineArchs
bcb4560f0d
$[border ...]にクリッピング機能を追加 (#13002)
* Update MkMisskeyFlavoredMarkdown.ts

* Update MkMisskeyFlavoredMarkdown.ts

* Update CHANGELOG.md

* Set clipping as default
2024-01-17 17:42:19 +09:00
かっこかり
8db800ed98
enhance(frontend): チャンネルノートの場合はその前後を見れるように (#13019)
* チャンネルノートの場合はその前後を見れるように

* Update Changelog
2024-01-17 15:22:07 +09:00
1Step621
acab9ccb81
Enhance(frontend): MkCustomEmojiDetailedDialogを調整 (#13015)
* MkEmojiDetailedDialogを調整

* 絵文字ライセンスでMFMを使えるように

* <a> -> <MkLink>

* 入力ボックスでmfmのオートコンプリートを効かせる
2024-01-17 14:29:24 +09:00
ikasoba
bc5aebe956
enhance(frontend): ページ遷移時にPlayerを閉じるように (#13013)
* なんかできた

* update changelog.md

* onDeactivatedを使うように
2024-01-17 13:26:36 +09:00
かっこかり
c971edd2dd
(style) sticky系フッターのデザイン調整 (#13005) 2024-01-17 09:32:52 +09:00
Marie
4c1f6be735
merge: upstream 2024-01-15 12:07:35 +01:00
かっこかり
8b0fdfcd69
enhance: 動画・音声周りのUIと動作改良 (#12925)
* wip

* (fix) `/files` をバイトレンジリクエストに対応させる

* video

* audio

* fix

* fix

* spdx

* fix (rangeRequest)

* fix

* Update CHANGELOG.md

* (add) ボリュームを保存できるように

* (fix) ミュート復帰時に音量が固定される

* named export

* tweak design

* Add sensitive class for audio component

* Refactor seekbar styles

* Refactor hms

* Revert "(add) ボリュームを保存できるように"

This reverts commit 6271f9493b63f96d0dd9915207e97fe120ef9037.

* Revert "(fix) ミュート復帰時に音量が固定される"

This reverts commit a65002b56ecdcb10f76bcc2debbe38593a69643f.

* revert revert changes

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-15 18:17:01 +09:00
syuilo
3d83c1aaba enhance(frontend): dedicated games page 2024-01-15 13:51:59 +09:00
YS
d92aaf81c4
refactor: noteテーブルのインデックス整理と配列カラムへのクエリでインデックスを使うように (#12993)
* Optimize note model index

* enhance(backend): ANY()をやめる (MisskeyIO#239)

* add small e2e test drive endpoint

---------

Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2024-01-15 08:19:27 +09:00
かっこかり
0ea8e0c25c
enhance(frontend) 日本語の拡張絵文字辞書を追加 (#12855)
* Create ja-JP.json

* Update general.vue

* Update ja-JP.json

* Update ja-JP.json

* Update ja-JP.json

* fix

* fix design

* (Add) ひらがな [wip]

* fix lint

* Apply suggestions from code review

Co-authored-by: 1Step621 <86859447+1STEP621@users.noreply.github.com>

* (add) ja-JP_hira

Co-authored-by: 1Step621 <86859447+1STEP621@users.noreply.github.com>

* (enhance) 言語名をちゃんと表示するように

---------

Co-authored-by: 1Step621 <86859447+1STEP621@users.noreply.github.com>
2024-01-14 16:04:48 +09:00
GrapeApple0
ec4e57bb67
fix: isPrivateIpで検証時にipバージョンが一致するかを確認するように (#12988)
* fix: isPrivateIpで検証時にipバージョンが一致するかを確認するように

* Update CHANGELOG.md

* Update CHANGELOG.md
2024-01-14 15:57:26 +09:00
かっこかり
12142a221a
enhance(frontend): Playの説明欄にMFMを使えるように (#12899)
* (enhance) Playの説明欄にMFMを使えるように

* Update Changelog

* use class for mfm component

* Update packages/frontend/src/pages/flash/flash-edit.vue

Co-authored-by: 1Step621 <86859447+1STEP621@users.noreply.github.com>

* Update flash.vue

* Update CHANGELOG.md

---------

Co-authored-by: 1Step621 <86859447+1STEP621@users.noreply.github.com>
2024-01-14 15:31:11 +09:00
ikasoba
79a9defa0c
完成 (#12980) 2024-01-14 15:30:21 +09:00
syuilo
fc4c868269 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-14 13:00:00 +09:00
syuilo
27dc0d3530 enhance(drop-and-fusion): sweets mode 2024-01-14 12:59:58 +09:00
おさむのひと
57017f2747
feat(CI): CHANGELOG.mdの追記個所をチェックするCIを追加 (#12963)
* feat(CI): CHANGELOG.mdの追記個所をチェックするCIを追加

* fix

* remove strategy

* fix

* fix
2024-01-13 21:17:30 +09:00
FineArchs
bc8a741e14
feat: 枠線をつけるMFMを追加 (#12981)
* Update MkMisskeyFlavoredMarkdown.ts

* Update const.ts

* Update MkMisskeyFlavoredMarkdown.ts

* Update MkMisskeyFlavoredMarkdown.ts

* Update CHANGELOG.md
2024-01-13 21:17:00 +09:00
ShittyKopper
de66ecbbd0 fix: actually make signToActivityPubGet default to true 2024-01-13 14:47:55 +03:00
syuilo
4846ab077b enhance(drop-and-fusion): refactor and new mode(wip) 2024-01-13 18:03:31 +09:00
syuilo
920888ed2a Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-13 17:06:43 +09:00
syuilo
c26c01c7a0 fix type 2024-01-13 17:06:41 +09:00
zyoshoka
d792f4f348
fix(backend): 虚無ノートを投稿できる問題の修正と api.json の OpenAPI Specification 3.1.0 への対応 (#12969)
* fix(backend): `text: null`だけのノートは投稿できないように

* add test

* Update CHANGELOG.md

* chore: bump OpenAPI Specification from 3.0.0 to 3.1.0

* chore: テストがすでにコメントで記述されていたのでそっちを使うことにする

* fix test

* fix(backend): prohibit posting whitespace-only notes

* Update CHANGELOG.md

* fix(backend): `renoteId`または`fileIds`(`mediaIds`)または`poll`が`null`でない場合に、`text  が空白文字のみで構成されたリクエストになることを許可して、結果は`text: null`を返すように

* test(backend): 引用renoteで空白文字のみで構成されたtextにするとレスポンスが`text: null`になることをチェックするテストを追加

* fix(frontend): `text`が`null`であって`renoteId`と`replyId`が`null`でないようなノートは引用リノートとして表示するように

* fix(misskey-js): OpenAPI 3.1に対応

* fix(misskey-js): 型生成をOpenAPI Specification 3.1.0に対応

* fix(ci): `validate-api.json`をOpenAPI Specification 3.1.0に対応

* fix(ci): スキーマ書き換えの際のミスを修正

* Revert "fix(frontend): `text`が`null`であって`renoteId`と`replyId`が`null`でないようなノートは引用リノートとして表示するように"

This reverts commit a9ca55343df6ea1679599acbc4801f78aa3a242b.

* fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように

* Revert "fix(misskey-js): `build-misskey-js-with-types`時は`api.json`のGETをスキップするように"

This reverts commit 865458989f9ddacc38d1bb3743a41ea828dbf324.

* fix(misskey-js): `openapi-parser`で`validate`のかわりに`parse`を用いるように

* Update CHANGELOG.md
2024-01-13 16:54:25 +09:00
syuilo
79370aaee2 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-13 15:45:25 +09:00
syuilo
18a5e377f4 tweak 2024-01-13 15:45:23 +09:00
1Step621
19fe32bd7e
Feat(frontend): リアクション・ノート内絵文字・/about#emojisで絵文字詳細が見られるように (#12984)
* リアクション・ノート内絵文字・/about#emojisで絵文字詳細が見られるように

* update CHANGELOG.md

* fix locale & type errors

* fix locale etc

* fix

* fix type

* lint fixes

* lint fixes(2)
2024-01-13 15:25:11 +09:00
syuilo
d246f6c360 enhance(drop-and-fusion): some tweaks 2024-01-13 14:57:06 +09:00
syuilo
5503ad9d1a clean up 2024-01-13 12:01:18 +09:00
syuilo
7b0f5b50fc refactor(drop-and-fusion): some refactors 2024-01-13 12:00:12 +09:00
syuilo
6177fcb2f5 perf(drop-and-fusion): remove root Transition component for improve performance 2024-01-13 11:49:47 +09:00
syuilo
c33f56e3ed refactor(drop-and-fusion): レンダリングや効果音に関する関心をエンジンから分離 2024-01-13 11:43:13 +09:00
syuilo
b13410df02 enhance(drop-and-fusion): some tweaks 2024-01-13 09:08:44 +09:00
Marie
9cb1bc367d merge: correct some japanese translations (#350)
Reviewed-on: https://git.joinsharkey.org/Sharkey/Sharkey/pulls/350
2024-01-12 20:28:31 +01:00
Marie
b20425b736 merge: emoji search show closest match first (#351)
Fixes #338
2024-01-12 20:27:01 +01:00
dakkar
d2d75b25bf emoji search: show closest match first #338 2024-01-12 16:58:21 +00:00
Etone Sabasappugawa
812da64e06 Merge branch 'develop' into develop 2024-01-12 14:20:26 +01:00
syuilo
87ffc672dd enhance(drop-and-fusion): yenモードで生涯で稼いだ額を記録するように 2024-01-12 21:01:38 +09:00
syuilo
5672ead957 Update 10000yen.png 2024-01-12 20:45:57 +09:00
syuilo
0aefebf02a enhance(drop-and-fusion): some tweaks 2024-01-12 20:38:04 +09:00
syuilo
271407312e chore(drop-and-fusion): tweak sounds 2024-01-12 17:55:27 +09:00
syuilo
c2a9a7b69e enhance(drop-and-fusion): tweak sounds 2024-01-12 17:34:24 +09:00
syuilo
b920435068 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-12 15:29:22 +09:00
zyoshoka
1aeede97f5
refactor(frontend): activity.heatmap.vueをコンポーネントに置換 (#12967) 2024-01-12 15:29:06 +09:00
syuilo
a5ea7c976b chore(drop-and-fusion): bump version 2024-01-12 15:28:41 +09:00
syuilo
d2063df78d enhance(drop-and-fusion): add new mode, some tweaks 2024-01-12 14:48:44 +09:00
かっこかり
be57ff4985
run pnpm build-misskey-js-with-types (#12972) 2024-01-11 23:41:22 +09:00
Marie
bbdc4e7789
merge: upstream 2024-01-11 11:43:20 +01:00
syuilo
cf54c2ba47 feat: ranking system of bubble game
Resolve #12961
2024-01-11 18:13:39 +09:00
syuilo
762fa6a8d8 enhance(drop-and-fusion): make game engine headless for server-side running 2024-01-11 12:34:03 +09:00
Marie
4df3145993
merge: upstream 2024-01-11 00:57:57 +01:00
syuilo
36fd7d17cf enhance(drop-and-fusion): some tweaks 2024-01-10 19:54:59 +09:00
morotesovtannu
a62898bcb7 chore: fix ja-KS locale 2024-01-10 18:54:22 +09:00
morotesovtannu
9c52e67490 chore: fix ja-JP locale 2024-01-10 18:46:32 +09:00
syuilo
5c786cace8 enhance(drop-and-fusion): add game description 2024-01-10 17:31:59 +09:00
Etone Sabasappugawa
59f00a87cf Merge pull request 'develop' (#1) from Sharkey/Sharkey:develop into develop
Reviewed-on: https://git.joinsharkey.org/morotesovtannu/Sharkey/pulls/1
2024-01-10 09:30:37 +01:00
1Step621
c1c363bf08
Enhance(frontend): 絵文字ピッカー/オートコンプリートで完全一致の絵文字を優先するように (#12928)
* 絵文字ピッカー/オートコンプリートで完全一致の絵文字を優先するように

* update CHANGELOG.md

* improve performance
2024-01-10 15:06:04 +09:00
syuilo
4bd9f664d7 enhance(drop-and-fusion): some tweaks 2024-01-10 13:44:00 +09:00
syuilo
3d9e42efca enhance(drop-and-fusion): リプレイの倍速再生対応 2024-01-10 11:38:49 +09:00
まっちゃとーにゅ
138a248a6c
fix(drop-and-fusion): バブルゲームのリトライボタンでリトライができない問題を修正 (#12957)
ゲーム中なら諦める、ゲームオーバー画面の表示中はリスタートになるように
2024-01-10 10:40:09 +09:00
FineArchs
6bae440f39
bump aiscript version to 0.17.0 (#12955)
* bump aiscript version to 0.17.0

* Update CHANGELOG.md
2024-01-10 09:47:47 +09:00
Marie
91969623bd
merge: upstream 2024-01-10 00:25:19 +01:00
syuilo
f5b864df7b
fix(frontend): fix game replay 2024-01-10 07:26:16 +09:00
Marie
3877b74858 merge: Implement Donation URL (#343)
Reviewed-on: https://git.joinsharkey.org/Sharkey/Sharkey/pulls/343
Reviewed-by: dakkar <dakkar@noreply.git.joinshakrey.org>
Reviewed-by: Amelia Yukii <admin@transfem.org>
Reviewed-by: Marie <marie@kaifa.ch>
2024-01-09 22:59:24 +01:00
Nila The Dragon
f3aeb4c351
Add missing quotes in ja-JP 2024-01-09 22:27:15 +01:00
Nila The Dragon
e0e5236864
Revert auto-formatted change in NodeinfoServerService 2024-01-09 22:25:46 +01:00
Nila The Dragon
e74cd2f6ee
Move donation link on about page 2024-01-09 22:02:28 +01:00
Nila The Dragon
9ceb74b98d
feat: Implement Donation URL 2024-01-09 21:32:47 +01:00
FineArchs
7e52ea4818
Update CHANGELOG.md (#12953) 2024-01-10 00:44:13 +09:00
Camilla Ett
358dc6289b
Enhance(frontend): 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように (#12944)
* Enhance(frontend): 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように

* update CHANGELOG.md

* tweak style

* (refactor) remove unnecessary imports

* fix lint

---------

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
Co-authored-by: kakkokari-gtyih <daisho7308+f@gmail.com>
2024-01-09 21:18:09 +09:00
syuilo
1063d39de8 enhnace(frontend): tweak game 2024-01-09 21:15:56 +09:00
Marie
d974b30e56
merge: upstream 2024-01-09 10:35:10 +01:00
Marie
fbddcc559a
fix: icons 2024-01-09 10:32:42 +01:00
syuilo
14aedc17ae update sound 2024-01-09 16:06:22 +09:00
かっこかり
0d7f9308cc
enhance(frontend): バブルゲームの諸々を修正・改良2 (#12948)
* (fix) ゲームが正常に終了するように

* (enhance) 効果音の音量を設定可能に

* (add) store

* (add) スクショにロゴの透かしを入れる

* Update packages/frontend/src/pages/drop-and-fusion.vue

Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>

* tweak

* tweak

* tweak

* tweak

* Update drop-and-fusion.vue

* tweak

* tweak

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2024-01-09 13:25:33 +09:00
Marie
3c2c72539a
chore: update sfm dep 2024-01-09 04:11:41 +01:00
Marie
8009e73741
chore: typecheck 2024-01-09 04:10:31 +01:00
Marie
7552cea69a
merge: upstream 2024-01-09 02:57:57 +01:00
おさむのひと
34088ecd27
feat(ci): api.jsonのバリデーションチェックCIを追加 (#12950)
* feat(ci): api.jsonのバリデーションチェックCIを追加

* fix name
2024-01-09 08:34:23 +09:00
Marie
94fee180b9 merge: additional authorised fetch logging (#328) 2024-01-08 22:25:46 +01:00
Marie
9d9ca6d67a merge: hide preview for quote renote 2024-01-08 22:02:28 +01:00
dakkar
9d939bcc49 authorised fetch: log more details
this will help debugging problems in the implementation; thanks to
@ShittyKopper for the suggestion
2024-01-08 18:54:01 +00:00
おさむのひと
0f9e3bccef
refactor(CI): 修正範囲と関係ないActionsが走るのを抑止する (#12918)
* refactor?: 修正範囲と関係ないActionsが走るのを抑止する

* fix

* バックエンドの対象にmisskey-jsを追加&フロントエンドの対象にmisskey-jsとbackendを追加
2024-01-08 23:51:31 +09:00
dakkar
3b75e93706 remove extraneous renoteUr[il] filters 2024-01-08 13:59:15 +00:00
ShittyKopper
ca3770470e re-re-fix: hide preview of quote-renote 2024-01-08 13:55:14 +00:00
FineArchs
64de87438e
Update CHANGELOG.md (#12949) 2024-01-08 18:51:08 +09:00
かっこかり
5dcd8c827b
Update CHANGELOG.md (項目の順番の修正) 2024-01-08 17:56:41 +09:00
おさむのひと
35ec41fc1e
enhance(backend): テストの高速化 (#12939)
* enhance(backend): テストの高速化

* add ls

* 自動的にマージされるようなので不要

* 起動方法を揃える

* fix test
2024-01-08 17:43:52 +09:00
zyoshoka
618e2ba1d2
fix(backend): drive/files/updateにおけるファイル名のバリデーションが機能していない問題を修正 (#12923)
* fix(backend): `drive/files/update`におけるファイル名のバリデーションが機能していない問題を修正

* Update CHANGELOG.md

* refactor: `!== undefined` -> `!= null`

* add test
2024-01-08 17:40:37 +09:00
おさむのひと
04f9147db6
refactor(frontend): router.ts解きほぐし (#12907)
* refactor(frontend): router.ts解きほぐし

* add debug hmr option

* fix comment

* fix not working

* add comment

* fix name

* Update definition.ts

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-08 14:44:43 +09:00
syuilo
0ed2a220f4 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-08 12:46:23 +09:00
syuilo
e9c3fe1228 enhance(frontend): add game bgm and refactor sound system 2024-01-08 12:46:20 +09:00
Kagami Sascha Rosylight
0c2118e963
refactor: make sure promises are settled before app shutdown (#12942)
👍
2024-01-08 12:28:13 +09:00
syuilo
145d28a8e4 refactor(frontend): extract game engine from vue component 2024-01-08 11:13:20 +09:00
かっこかり
6a02dfdd3b
enhance(frontend): バブルゲームの諸々を修正・改良 (#12938)
* enhance(frontend): バブルゲームのテクスチャをゲーム開始時にキャッシュするように

* (fix) カーソルが枠線内を動くように

* (add) 最大コンボ数を表示するように

* (add) 実績を追加

* Update ja-JP.yml

* tweak

* tweak flavor

* perf tweak

* refactor

* perf tweak

* lint

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-08 11:02:05 +09:00
syuilo
831131864f Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-08 10:23:05 +09:00
syuilo
1bd7693416 Update logo.png 2024-01-08 10:23:03 +09:00
かっこかり
5251cd3aad
(refactor) api呼び出し関数のレスポンス型を必要に応じてオーバーライドできるように (#12936) 2024-01-08 08:13:36 +09:00
zyoshoka
0e536bdd86
refactor(frontend): widgets/server-metric内の型エラーを除去 (#12937) 2024-01-07 23:56:46 +09:00
syuilo
fd519f5def update game logo 2024-01-07 20:26:37 +09:00
syuilo
0d830d720a enhance(frontend): tweak ui 2024-01-07 16:32:52 +09:00
syuilo
0d49e94982 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-07 16:03:36 +09:00
syuilo
e6022c0d51 enhance(frontend): tweak game 2024-01-07 16:03:23 +09:00
Kagami Sascha Rosylight
5e71418d5c
fix(frontend/emoji) restore U+FE0F for simple emojis (#12866)
* fix(frontend/emoji) restore U+FE0F for simple emojis

* Update CHANGELOG.md

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-07 16:02:53 +09:00
syuilo
c6a4caa8be refactor 2024-01-07 14:32:57 +09:00
syuilo
1d1780081e enhance(frontend): ゲームのシェア機能 2024-01-07 14:21:19 +09:00
FineArchs
622a09f8ed
Fix: Mk:C:mfmonClickEvが正常に呼び出されない問題を修正 (#12831)
* fix clickable api

* Update CHANGELOG.md

* revert CHANGELOG.md

* Update CHANGELOG.md
2024-01-07 13:29:17 +09:00
syuilo
00e195f50b tweak game 2024-01-07 13:19:10 +09:00
syuilo
8bf6d31334 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-07 10:36:08 +09:00
Kagami Sascha Rosylight
2a9db983fc
feat: export clips (#12931)
* feat: export clips

* Update CHANGELOG.md
2024-01-07 10:35:58 +09:00
syuilo
4ea030d669 tweak game 2024-01-07 10:35:39 +09:00
_
f2dee7b25e
Fix: リストライムラインの「リノートを表示」が正しく機能しない問題を修正 (#12932)
* fix: list timeline withRenotes

* add CHANGELOG
2024-01-07 09:57:01 +09:00
Marie
d3fbef20f4 fix: hard mutes not working on SkNote component
Closes #305
2024-01-07 01:50:58 +01:00
syuilo
a0976772b3 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-07 09:24:07 +09:00
syuilo
0815a5235d tweak game 2024-01-07 09:24:04 +09:00
Kagami Sascha Rosylight
9eae82de1d
chore(dependabot) open-pull-requests-limit=10?
Somehow it's not opening any PR, so try higher count
2024-01-06 13:33:56 +01:00
syuilo
746367004e feat(frontend): add new game 2024-01-06 20:15:28 +09:00
Chocolate Pie
072f67d6e7
feat: Add support for mCaptcha (#12905)
* feat: Add support for mCaptcha

* fix: Fix docker compose configuration

* chore(frontend/docs): update changelog & fix eslint errors

* `@mcaptcha/vanilla-glue`をダイナミックインポートするように

* chore: Add missing prefix to CHANGELOG

* refactor(backend): 適当につけた変数の名前を変更
2024-01-06 20:14:33 +09:00
zyoshoka
b55a6a80e1
refactor(frontend): scripts/form.tsの型定義を修正してTS2344/TS2345エラーを削減 (#12913) 2024-01-06 18:43:28 +09:00
riku6460
24645e3d3d
enhance(backend): ActivityPub 周りで連合先から HTTP 429 Too Many Requests を受け取った際にジョブをリトライするように (#12917)
* enhance(backend): ActivityPub 周りで HTTP 429 Too Many Requests を受け取った際にリトライするように

* add to changelog

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-06 09:40:08 +09:00
MeiMei
d415fd29a3
enhance(backend): ActivityPub Deliver queueでBodyを事前処理するように (#12916)
* Pre-processing deliver body

* CHANGELOG

* ループ内で計算されると意味がないので

* 同じ処理を同じ形に

---------

Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
2024-01-06 09:07:48 +09:00
Marie
560aedb469 chore(docker ci): remove tagging for year
having a tag for the year while there already is year.month and year.month.rel seems kinda redundant
2024-01-06 01:07:05 +01:00
Marie
e99ac04ab2 merge: fix Important Notes file missing
Closes #313
2024-01-05 10:38:29 +01:00
dracoling
62c913ad96 Move IMPORTANT_NOTES.md link to stable branch 2024-01-05 10:15:48 +01:00
syuilo
7768385be2 refactor(frontend): reduce type errors 2024-01-05 15:25:26 +09:00
dracoling
c9fb172556 Change url for IMPORTANT_NOTES.md to correct repository 2024-01-05 05:28:37 +01:00
dracoling
23136c6bed Add missing IMPORTANT_NOTES.md from Sharkey/OldJoinSharkey 2024-01-05 05:24:54 +01:00
syuilo
2177792a3c refactor(frontend): reduce type errors 2024-01-05 12:52:24 +09:00
syuilo
9e20065496 refactor(frontend): reduce type errors 2024-01-05 12:38:06 +09:00
syuilo
2cd32b2248 refactor(frontend): reduce type errors 2024-01-05 12:33:47 +09:00
Marie
3c3c5e190a
upd: add tossface emojis as an option 2024-01-04 20:42:25 +01:00
おさむのひと
fa9c4a19b9
refactor(frontend): os.tsに引き込んだscripts/api.tsの再exportをやめる (#12694)
* refactor(frontend): os.tsに引き込んだscripts/api.tsの再exportをやめる

* fix

* fix

* renate to "misskeyApi"

* rename file
2024-01-04 18:32:46 +09:00
syuilo
ea41cc6ec0 refactor(frontend): reduce type errors 2024-01-04 15:30:40 +09:00
syuilo
9716ea0324 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2024-01-04 15:20:25 +09:00
syuilo
02978d0247 lint 2024-01-04 15:20:23 +09:00
MeiMei
6598d320d6
enhance: Use SI prefixes for job queue widget, extends bytes (#12896)
* Use SI prefixes for job queue widget

* a

* bytes

* lint
2024-01-04 13:04:00 +09:00
FineArchs
f8d5a46dbf
Fix: AiScriptのreadlineの修正をPlay以外にも適用 (#12841)
* add AiScriptReadline() in api.ts

* apply AiScriptReadline on flash.vue

* AiScriptReadline → aiScriptReadline

* Update flash.vue

* Update scratchpad.vue

* Update WidgetAiscript.vue

* Update WidgetAiscriptApp.vue

* Update WidgetButton.vue

* Update plugin.ts
2024-01-04 12:26:57 +09:00
syuilo
da154c8209
Update ROADMAP.md 2024-01-04 08:44:38 +09:00
Marie
c8a7e27e70 merge: fix thread line misalignment on smaller viewports (#308)
Fixes #307
2024-01-03 20:44:55 +01:00
Volpeon
bafb197b62
Fix: Thread line misalignment on smaller viewports (#307) 2024-01-03 20:38:40 +01:00
Amelia Yukii
bf5e62301a feat: Note Highlights
Reviewed-on: https://git.joinsharkey.org/Sharkey/Sharkey/pulls/304
2024-01-03 19:46:03 +01:00
Volpeon
9e089da2ed
Remove leftover console.log 2024-01-03 16:26:38 +01:00
Volpeon
8e9bf67d9a
Restore scroll position on navigation 2024-01-03 16:23:02 +01:00
Volpeon
96df8c25de
Show conversation note hover effect on focus 2024-01-03 16:22:36 +01:00
Volpeon
1ca0cd727e
Hover effect for conversation notes (like Firefish) 2024-01-03 14:42:51 +01:00
Marie
d92217e073 chore: set node version to LTS on docker 2024-01-03 14:33:34 +01:00
Volpeon
43b3b5a34b
Ported Firefish's note focus behavior 2024-01-03 13:52:46 +01:00
Volpeon
32f60f9969
Bring renote indicator closer to note (like Firefish) 2024-01-03 11:37:50 +01:00
Camilla Ett
b46f431a2e
fix(frontend): モデレーターがユーザーのアバターバナーを未設定状態に出来る機能が表示されていなかった問題を修正 (#12889)
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-03 16:41:38 +09:00
かっこかり
30c3f6a222
(fix) MkFormDialogにせっていできる項目がない場合はその旨を表示するように (#12837) 2024-01-03 13:42:09 +09:00
おさむのひと
30311aca18
fix(misskey-js): /signupと/signinの定義を作成してフロントの型エラーを抑制する (#12846)
* fix(misskey-js): /signupと/signinの定義を復活してフロントの型エラーを抑制する

* fix ci

* fix ci

* fix

* fix

---------

Co-authored-by: osamu <46447427+sam-osamu@users.noreply.github.com>
2024-01-03 13:41:28 +09:00
かっこかり
a9127e3ecd
enhance(frontend): チャンネルノートのピン留めをノートメニューからできるように (#12887)
* enhance(frontend): チャンネルノートのピン留めをノートメニューからできるように

* Update Changelog
2024-01-03 13:35:40 +09:00
Marie
714ffbf2c8 fix: reaction icon causing 2 remove pop ups
Closes #300
2024-01-03 02:27:45 +01:00
Marie
12d60ea457 upd: lower minimum wait time on reactions/delete endpoint
Closes #301
2024-01-03 02:21:49 +01:00
Camilla Ett
58469c0a69
enhance(frontend): カスタム絵文字追加画面の「タグ」の説明を追加 (#12888) 2024-01-03 08:07:04 +09:00
Marie
d412879560
fix: bubble state not working on federation page 2024-01-02 20:43:11 +01:00
Marie
c887e4cccb
fix: user profile timeline selection not working properly 2024-01-02 19:41:09 +01:00
Marie
bdd7583ff5
chore: add locales to i18n 2024-01-02 19:27:24 +01:00
Marie
5659ed24f9
upd: show menu to update or remove background and banner if set
Closes #298
2024-01-02 14:00:10 +01:00
Marie
1f0c6adc68
fix: bubble value in federation 2024-01-02 13:37:31 +01:00
Marie
a1a57889fc
upd: add bubble to instance federation page as state
Closes #296
2024-01-02 13:35:03 +01:00
Marie
81dea75eb7
upd: higher character limit for poll options
Limited to 150 to account for {}, "" and commas in DB column

Closes #297
2024-01-02 12:39:47 +01:00
Marie
0197d3354a
fix: lint 2024-01-02 12:32:49 +01:00
かっこかり
9c5559a570
(fix) MkButtonがリンクのときホバー時にunderlineが出る問題を修正 (#12849) 2024-01-02 17:48:11 +09:00
かっこかり
3187c6b28d
refactor(frontend): MkNumberのアニメーションを内製してgsapを削除 (#12859)
* (refactor) MkNumberのアニメーションを内製

* 秒数調整

* fix

* fix pnpm-lock

* Update packages/frontend/src/components/MkNumber.vue

* Update packages/frontend/src/components/MkNumber.vue

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2024-01-02 16:55:02 +09:00
Kagami Sascha Rosylight
09aba4cf16
chore(backend/logger): log data for every level if exists (#12863) 2024-01-02 16:52:51 +09:00
かっこかり
5498ec57d0
fix(frontend): MkCodeEditorのデータバインディングを修正 (#12885)
* (fix) MkCodeEditorの双方向データバインディング

* fix
2024-01-02 14:53:28 +09:00
Marie
b87142d2f7
fix: like button not playing reaction sound 2024-01-02 00:47:08 +01:00
Marie
c9ca1dd3f1
upd: add boost settings 2024-01-01 20:34:18 +01:00
Marie
b928446ddd merge: Bring note style closer to Firefish (#294)
Reviewed-on: https://git.joinsharkey.org/Sharkey/Sharkey/pulls/294
2024-01-01 18:37:25 +01:00
Volpeon
0e6d0c4f95
Update changelog 2024-01-01 17:54:47 +01:00
Volpeon
f92f474088
Bring note style closer to Firefish 2024-01-01 17:44:13 +01:00
Amelia Yukii
7c481f545a Update docker-compose_example.yml 2024-01-01 15:30:59 +01:00
Marie
9f5b404a70 merge: use misskey shadow for the sharkey ticker, prevent clipping (#291)
Closes #290
2024-01-01 01:52:09 +01:00
Marie
42be95125a chore: update dev version 2024-01-01 01:51:34 +01:00
Alice Mikhaylenko
499b2b03aa upd: use misskey shadow for the sharkey ticker, prevent clipping 2024-01-01 04:25:14 +04:00
Amelia Yukii
41e9b36bfd chore: docker compose update image 2024-01-01 00:51:23 +01:00
Kagami Sascha Rosylight
4893cce43c
chore(dependabot): try enabling again 2023-12-31 19:48:27 +01:00
syuilo
a40ededf6b
2024 2024-01-01 00:30:56 +09:00
syuilo
379079ee42 chore(frontend): update vue to 3.4 2023-12-31 17:01:56 +09:00
tamaina
1d5a0d0777
chore: use @misskey-dev/eslint-plugin (#12860)
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2023-12-31 15:26:57 +09:00
tamaina
2a33981811
chore: use summaly, browser-image-resizer, and sharp-read-bmp on registry.npmjs.org instead of git (#12856)
* chore: use @misskey-dev/summaly on registry.npmjs.org instead of git

* fix backend dependency

* fic backend dependency

* @misskey-dev/sharp-read-bmp

* fix

* use @misskey-dev/browser-image-resizer
2023-12-31 09:45:35 +09:00
woxtu
c0466d1585
Convert symbols to strings explicitly (#12844) 2023-12-31 07:51:58 +09:00
woxtu
30594dde18
Fix a typo (#12853) 2023-12-29 22:50:03 +09:00
MomentQYC
7948018e6a
feat: Add support for TrueMail (#12850)
Co-authored-by: MarryDream <2190758465@qq.com>
2023-12-29 18:23:29 +09:00
かっこかり
8fb8d7c10c
enhance(frontend): ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように (#12851)
* (enhance) ハッシュタグ入力時に、本文の末尾の行に何も書かれていないならスペースを追記しない

* Updahe Changelog
2023-12-29 18:22:40 +09:00
zyoshoka
7ca0af9e7e
chore(misskey-js): build-misskey-js-with-types時にapi-extractorを走らせるように (#12830) 2023-12-28 13:40:57 +09:00
かっこかり
ac2bace764
Update CHANGELOG.md 2023-12-28 10:27:12 +09:00
syuilo
d97924890d
2023.12.2 2023-12-28 08:05:35 +09:00
Korange
6b4f57781a
enhance(frontend): 検索画面においてEnterキー押下で検索できるように (#12752)
* enhance: 検索画面においてEnterキー押下で検索できるように

* enterイベントを使用するように
2023-12-28 07:58:32 +09:00
syuilo
c525394989
New Crowdin updates (#12820)
* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Indonesian)

* New translations ja-jp.yml (Bengali)
2023-12-28 07:58:15 +09:00
anatawa12
8753f9ef06
fix: running from docker is broken (#12824)
* fix: running from docker is broken

* fix: dependencies of misskey-js not found from backend

* docs(changelog): Dockerでサーバーを起動できない問題を修正

* Update CHANGELOG.md

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>

---------

Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>
2023-12-28 07:52:08 +09:00
anatawa12
35fd0a7fc2
Update CHANGELOG.md (#12826) 2023-12-28 00:04:22 +09:00
syuilo
f8261a1957
2023.12.1 2023-12-27 21:28:15 +09:00
YAVIIGI
47558a6648
feat(frontend): 投稿ウインドウにMFM要素を追加するボタンの追加 (#12788)
* functionPicker の追加

* Update CHANGELOG.md

* fix lint errors

* Add addMfmFunction

* add enableQuickAddMfmFunction setting

* Update CHANGELOG.md

issue 番号を追加

* Update index.d.ts

* change 'functionPicker' to 'mfmFunctionPicker'

* Change indent from 4 space to 1 tab

---------

Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2023-12-27 20:57:43 +09:00
1Step621
2a5c9e6002
Fix(frontend): MFMでfgとbgに長い単語を使うと改行されない問題を修正 (#12819)
* MFMでfgとbgに長い単語を使うと改行されない問題を修正

* update CHANGELOG.md
2023-12-27 20:41:01 +09:00
syuilo
9d5fc4ca17 refactor 2023-12-27 20:35:52 +09:00
Chocolate Pie
a598baaf01
fix(test): CIが落ちている問題を修正 (#12816)
* fix(test): CIが落ちているのを修正

* fix(ci)?: CIの`typecheck`が落ちる問題を修正

* fix(ci): コンフィグファイルのタイポを修正
2023-12-27 17:36:38 +09:00
MomentQYC
e0040f5da3
Add a prompt for Tor Browser users (#12776)
* perf: Add a prompt for Tor Browser users

* typo
2023-12-27 15:55:56 +09:00
syuilo
cc659721fb
New Crowdin updates (#12789)
* New translations ja-jp.yml (French)

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (Korean (Gyeongsang))

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (French)

* New translations ja-jp.yml (English)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Russian)
2023-12-27 15:55:27 +09:00
GrapeApple0
6439c7b64b
Revert "refactor: paginationの型を明示する (#12809)" (#12810)
This reverts commit 6855079811.
2023-12-27 15:55:09 +09:00
syuilo
8904e0a12b 🎨 2023-12-27 15:15:08 +09:00
syuilo
9410bc046b Update CHANGELOG.md 2023-12-27 15:12:43 +09:00
Kagami Sascha Rosylight
ad346b6f36
feat(backend/oauth): allow CORS for token endpoint (#12814)
* feat(backend/oauth): allow CORS for token endpoint

* no need to explicitly set origin to `*`

* Update CHANGELOG.md
2023-12-27 15:10:24 +09:00
Chocolate Pie
c96bc36fed
Merge pull request from GHSA-7pxq-6xx9-xpgm
* fix: fix improper authorization when accessing with third-party application

* refactor: refactor type definitions

* fix: get rid of unnecessary access limitation

* enhance: サードパーティアプリケーションがWebsocket APIを使えるように

* fix: add missing parentheses

* Revert "fix(backend): add missing kind definition for admin endpoints to improve security"

This reverts commit 5150053275.

* frontend: 翻訳の抜けを訂正, read:adminとwrite:adminはアクセス発行トークンのデフォルトでは非表示にする

* enhance(test): misskey-ghsa-7pxq-6xx9-xpgmに関するテストを追加

* enhance(test): Websocket APIに対するテストも追加

* enhance(refactor): `@/misc/api-permissions.ts`を`misskey-js/permissions`に統合

* fix(frontend): アクセストークン発行UIで全ての権限を有効にした際、管理者用APIへのアクセスも許可してしまう問題を修正

* enhance(backend): Websocketの接続に最低限必要な権限を変更

* fix(backend): `/api/admin/meta`をサードパーティアプリケーションからはアクセスできないように

* fix(backend): エンドポイントにアクセスするために必要な権限を変更

* fix(frontend/locale): Add missing type declaration

* chore: update `misskey-js/src/autogen`

---------

Co-authored-by: tamaina <tamaina@hotmail.co.jp>
2023-12-27 15:08:59 +09:00
syuilo
d87fecda7f chore(frontend): update team members 2023-12-27 14:21:34 +09:00
GrapeApple0
6855079811
refactor: paginationの型を明示する (#12809)
* refactor: paginationの型を明示する

* asではなくsatisfiesを使うように
2023-12-26 21:40:27 +09:00
shiosyakeyakini
9022b05fea
fix(backend): 非センシティブのみ(リモートはいいねのみ)が昨日していない問題を修正 (#12801) (#12802)
Co-authored-by: sorairo <sorairo@shiosyakeyakini.info>
Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
2023-12-26 18:42:37 +09:00
zyoshoka
75034d9240
refactor(frontend): Reactivityで型を明示するように (#12791)
* refactor(frontend): Reactivityで型を明示するように

* fix: プロパティの参照が誤っているのを修正

* fix: 初期化の値を空配列に書き換えていた部分をnullに置き換え
2023-12-26 14:19:35 +09:00
かっこかり
a9b42765f9
(dev) Issue Templateに、自分で実装してPRを出したいかの意思表明を追加 (#12799)
* Update 01_bug-report.yml

* Update 02_feature-request.yml
2023-12-26 11:40:55 +09:00
Soli
eb23798c9f
fix(frontend): ロールアサイン時の通知で,ロールアイコンが縮小されずに表示される問題を修正 (misskey-dev#12805) (#12806) 2023-12-26 11:40:31 +09:00
FineArchs
4f247a0784
Feat: クリックイベントを発生させるMFM構文を追加 (#12798)
* Update MkMisskeyFlavoredMarkdown.ts

* fix MkMisskeyFlavoredMarkdown.ts

* Update MkAsUi.vue

* Update ui.ts

* Fix MkMisskeyFlavoredMarkdown.ts

* Update CHANGELOG.md

* fix ui.ts

* revert CHANGELOG.md

* Update CHANGELOG.md
2023-12-25 18:03:06 +09:00
syuilo
95547da5a5
Update SECURITY.md 2023-12-25 16:50:41 +09:00
syuilo
b0799089cd
Update SECURITY.md 2023-12-25 16:47:26 +09:00
Sayamame-beans
8ed7c7486c
fix(frontend): モデログ表示の"logYellow"が機能していない問題を修正 (#12794)
* fix: logYellow of moderation log was not working

* docs(changelog): Fix: 一部のモデログ(logYellowでの表示対象)について、表示の色が変わらない問題を修正
2023-12-25 14:49:06 +09:00
anatawa12
fd040c50b1
fix: 自分のdirect noteがuser list timelineに追加されない (#12782)
* fix: 自分のdirect noteがuser list timelineに追加されない

* docs(changelog): Fix: 自分のdirect noteがuser list timelineに追加されない
2023-12-25 11:56:00 +09:00
anatawa12
237fe242ad
chore(misskey-js): update misskey-js with api.json (#12778)
pnpm build && pnpm build-misskey-js-with-types && pnpm --filter misskey-js api
2023-12-24 17:54:00 +09:00
zyoshoka
0009aa332b
refactor(frontend): import宣言周りのエラーを修正 (#12773) 2023-12-24 16:16:58 +09:00
syuilo
bf45c23098 Update CHANGELOG.md 2023-12-24 15:38:03 +09:00
syuilo
7167bb397e Update CHANGELOG.md 2023-12-24 15:31:48 +09:00
syuilo
0393d8f53c
New Crowdin updates (#12759)
* New translations ja-jp.yml (Spanish)

* New translations ja-jp.yml (Chinese Traditional)

* New translations ja-jp.yml (Korean)

* New translations ja-jp.yml (Korean)
2023-12-24 15:25:13 +09:00
Nya Candy
cae40e68e4
fix: lint (#12761) 2023-12-24 15:24:51 +09:00
おさむのひと
36701f8a7c
fix(backend): 1702718871541-ffVisibility.jsのdownが壊れている (#12767) 2023-12-24 15:24:26 +09:00
syuilo
6fce36374d enhance(backend): センシティブワードの設定がハッシュタグトレンドにも適用されるように 2023-12-24 15:23:56 +09:00
anatawa12
316ffcea54
ci: Get api.json from Misskeyでupload-artifact@v4で同名artifactでエラーになるのを修正 (#12770)
* ci: upload-artifact@v4で同名artifactでエラーになるのを修正

Co-authored-by: おさむのひと <46447427+samunohito@users.noreply.github.com>

* report-api-diff.ymlの最中にエラーが発生したときに分かりづらいので、PRにコメントを残すようにする

* 古いget-api-diffを使ってるactionとの互換性をもたせる

---------

Co-authored-by: おさむのひと <46447427+samunohito@users.noreply.github.com>
2023-12-24 14:20:43 +09:00
689 changed files with 34088 additions and 6265 deletions

View file

@ -2,3 +2,4 @@
POSTGRES_PASSWORD=example-misskey-pass POSTGRES_PASSWORD=example-misskey-pass
POSTGRES_USER=example-misskey-user POSTGRES_USER=example-misskey-user
POSTGRES_DB=misskey POSTGRES_DB=misskey
DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"

View file

@ -41,7 +41,6 @@ jobs:
type=ref,event=branch type=ref,event=branch
type=semver,pattern={{version}} type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=raw,value=stable type=raw,value=stable
- name: Log in to GHCR - name: Log in to GHCR
uses: https://github.com/docker/login-action@v3 uses: https://github.com/docker/login-action@v3

View file

@ -8,6 +8,12 @@ on:
paths: paths:
- packages/** - packages/**
pull_request: pull_request:
paths:
- packages/backend/**
- packages/frontend/**
- packages/sw/**
- packages/misskey-js/**
- packages/shared/.eslintrc.js
jobs: jobs:
pnpm_install: pnpm_install:
@ -82,4 +88,8 @@ jobs:
- run: pnpm i --frozen-lockfile - run: pnpm i --frozen-lockfile
- run: pnpm --filter misskey-js run build - run: pnpm --filter misskey-js run build
if: ${{ matrix.workspace == 'backend' }} if: ${{ matrix.workspace == 'backend' }}
- run: pnpm --filter misskey-reversi run build:tsc
if: ${{ matrix.workspace == 'backend' }}
- run: pnpm --filter misskey-bubble-game run build
if: ${{ matrix.workspace == 'backend' }}
- run: pnpm --filter ${{ matrix.workspace }} run typecheck - run: pnpm --filter ${{ matrix.workspace }} run typecheck

2
.gitignore vendored
View file

@ -41,6 +41,7 @@ docker-compose.yml
# misskey # misskey
/build /build
built built
built-test
/data /data
/.cache-loader /.cache-loader
/db /db
@ -57,6 +58,7 @@ api-docs.json
ormconfig.json ormconfig.json
temp temp
/packages/frontend/src/**/*.stories.ts /packages/frontend/src/**/*.stories.ts
tsdoc-metadata.json
# Sharkey # Sharkey
/packages/megalodon/lib /packages/megalodon/lib

3
.gitmodules vendored
View file

@ -4,3 +4,6 @@
[submodule "fluent-emojis"] [submodule "fluent-emojis"]
path = fluent-emojis path = fluent-emojis
url = https://github.com/misskey-dev/emojis.git url = https://github.com/misskey-dev/emojis.git
[submodule "tossface-emojis"]
path = tossface-emojis
url = https://git.joinsharkey.org/Sharkey/tossface-emojis.git

View file

@ -1,5 +1,5 @@
<!-- <!--
## 2023.x.x (unreleased) ## 202x.x.x (unreleased)
### General ### General
- -
@ -12,6 +12,60 @@
--> -->
## 202x.x.x (Unreleased)
### Note
- 外部サイトからプラグインをインストールする場合のパスが`/install-extentions`から`/install-extensions`に変わります。現時点では以前のパスも利用できますが、非推奨です。
### General
- Feat: [mCaptcha](https://github.com/mCaptcha/mCaptcha)のサポートを追加
- Fix: リストライムラインの「リノートを表示」が正しく機能しない問題を修正
- Feat: Add support for TrueMail
### Client
- Feat: 新しいゲームを追加
- Feat: 音声・映像プレイヤーを追加
- Feat: 絵文字の詳細ダイアログを追加
- Feat: 枠線をつけるMFM`$[border.width=1,style=solid,color=fff,radius=0 ...]`を追加
- デフォルトで枠線からはみ出る部分が隠されるようにしました。初期と同じ挙動にするには`$[border.noclip`が必要です
- Feat: スワイプでタブを切り替えられるように
- Enhance: MFM等のコードブロックに全文コピー用のボタンを追加
- Enhance: ハッシュタグ入力時に、本文の末尾の行に何も書かれていない場合は新たにスペースを追加しないように
- Enhance: チャンネルノートのピン留めをノートのメニューからできるように
- Enhance: 管理者の場合はAPI tokenの発行画面で管理機能に関する権限を付与できるように
- Enhance: AiScriptを0.17.0に更新 [CHANGELOG](https://github.com/aiscript-dev/aiscript/blob/bb89d132b633a622d3cb0eff0d0cc7e476c0cfdd/CHANGELOG.md)
- 配列の範囲外・非整数のインデックスへの代入が完全禁止になるので注意
- Enhance: 絵文字ピッカー・オートコンプリートで、完全一致した絵文字を優先的に表示するように
- Enhance: Playの説明欄にMFMを使えるように
- Enhance: チャンネルノートの場合は詳細ページからその前後のノートを見れるように
- Enhance: 季節に応じた画面の演出を南半球でも利用できるように
- Enhance: タイムラインフィルターの設定をすべて保持できるように
- 今までの「TLに他の人への返信を含める」設定は一旦リセットされます
- Enhance: タイムラインフィルターに「センシティブなファイルを含むノートを表示」を追加
- Enhance: ノート作成画面のファイル添付メニューから直接ファイルを削除できるように
- Enhance: MFMの属性でオートコンプリートが使用できるように #12735
- Enhance: 絵文字編集ダイアログをモーダルではなくウィンドウで表示するように
- Fix: ネイティブモードの絵文字がモノクロにならないように
- Fix: v2023.12.0で追加された「モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能」が管理画面上で正しく表示されていない問題を修正
- Fix: AiScriptの`readline`関数が不正な値を返すことがある問題のv2023.12.0時点での修正がPlay以外に適用されていないのを修正
- Fix: v2023.12.1で追加された`$[clickable ...]`および`onClickEv`が正しく機能していないのを修正
- Enhance: ページ遷移時にPlayerを閉じるように
### Server
- Enhance: 連合先のレートリミットに引っかかった際にリトライするようになりました
- Enhance: ActivityPub Deliver queueでBodyを事前処理するように (#12916)
- Enhance: クリップをエクスポートできるように
- Enhance: `/files`のファイルに対してHTTP Rangeリクエストを行えるように
- Enhance: `api.json`のOpenAPI Specificationを3.1.0に更新
- Fix: `drive/files/update`でファイル名のバリデーションが機能していない問題を修正
- Fix: `notes/create`で、`text`が空白文字のみで構成されているか`null`であって、かつ`text`だけであるリクエストに対するレスポンスが400になるように変更
- Fix: `notes/create`で、`text`が空白文字のみで構成されていてかつリノート、ファイルまたは投票を含んでいるリクエストに対するレスポンスの`text`が`""`から`null`になるように変更
- Fix: ipv4とipv6の両方が利用可能な環境でallowedPrivateNetworksが設定されていた場合プライベートipの検証ができていなかった問題を修正
- Fix: properly handle cc followers
### Service Worker
- Enhance: オフライン表示のデザインを改善・多言語対応
## 2023.12.2 ## 2023.12.2
### General ### General

View file

@ -1,5 +1,5 @@
Unless otherwise stated this repository is Unless otherwise stated this repository is
Copyright © 2014-2023 syuilo and contributers Copyright © 2014-2024 syuilo and contributors
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE. And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.

View file

@ -1,6 +1,6 @@
# syntax = docker/dockerfile:1.4 # syntax = docker/dockerfile:1.4
ARG NODE_VERSION=21.4.0-alpine3.18 ARG NODE_VERSION=20.10.0-alpine3.18
FROM node:${NODE_VERSION} as build FROM node:${NODE_VERSION} as build
@ -43,7 +43,12 @@ COPY --from=build /sharkey/packages/megalodon/lib ./packages/megalodon/lib
COPY --from=build /sharkey/packages/megalodon/node_modules ./packages/megalodon/node_modules COPY --from=build /sharkey/packages/megalodon/node_modules ./packages/megalodon/node_modules
COPY --from=build /sharkey/packages/misskey-js/built ./packages/misskey-js/built COPY --from=build /sharkey/packages/misskey-js/built ./packages/misskey-js/built
COPY --from=build /sharkey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules COPY --from=build /sharkey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
COPY --from=build /sharkey/packages/misskey-reversi/built ./packages/misskey-reversi/built
COPY --from=build /sharkey/packages/misskey-reversi/node_modules ./packages/misskey-reversi/node_modules
COPY --from=build /sharkey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
COPY --from=build /sharkey/packages/misskey-bubble-game/node_modules ./packages/misskey-bubble-game/node_modules
COPY --from=build /sharkey/fluent-emojis ./fluent-emojis COPY --from=build /sharkey/fluent-emojis ./fluent-emojis
COPY --from=build /sharkey/tossface-emojis/dist ./tossface-emojis/dist
COPY --from=build /sharkey/sharkey-assets ./packages/frontend/assets COPY --from=build /sharkey/sharkey-assets ./packages/frontend/assets
COPY package.json ./package.json COPY package.json ./package.json
@ -55,6 +60,8 @@ COPY packages/backend/migration ./packages/backend/migration
COPY packages/backend/assets ./packages/backend/assets COPY packages/backend/assets ./packages/backend/assets
COPY packages/megalodon/package.json ./packages/megalodon/package.json COPY packages/megalodon/package.json ./packages/megalodon/package.json
COPY packages/misskey-js/package.json ./packages/misskey-js/package.json COPY packages/misskey-js/package.json ./packages/misskey-js/package.json
COPY packages/misskey-reversi/package.json ./packages/misskey-reversi/package.json
COPY packages/misskey-bubble-game/package.json ./packages/misskey-bubble-game/package.json
ENV NODE_ENV=production ENV NODE_ENV=production
RUN corepack enable RUN corepack enable

13
IMPORTANT_NOTES.md Normal file
View file

@ -0,0 +1,13 @@
# Basic Precautions
When using a service with Sharkey, there are several important points to keep in mind.
1. Because it is decentralized, there is no guarantee that data you upload will be deleted from all other servers even if you delete it once. (However, this applies to the internet in general.)
2. Even for posts made in private, there is no guarantee that the recipient's server will treat them as private in the same way. Please exercise caution when posting personal or confidential information. (Again, this applies to the internet in general.)
3. Account deletion can be a resource-intensive process and may take a long time. In cases with a lot of uploaded data, it may even be impossible to delete an account.
4. Please disable ad blockers. Some servers may rely on advertising revenue to cover operating costs. Additionally, ad blockers can mistakenly block content and features unrelated to ads, potentially causing issues with the client's functionality and preventing normal use of Sharkey. Therefore, we recommend turning off ad blockers and similar features when using Sharkey.
Please understand these points and enjoy using the service.

View file

@ -6,6 +6,7 @@ Also, the later tasks are more indefinite and are subject to change as developme
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development. This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
- ~~Make the number of type errors zero (backend)~~ → Done ✔️ - ~~Make the number of type errors zero (backend)~~ → Done ✔️
- Make the number of type errors zero (frontend)
- Improve CI - Improve CI
- ~~Fix tests~~ → Done ✔️ - ~~Fix tests~~ → Done ✔️
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986 - Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986

View file

@ -161,11 +161,13 @@ describe('After user signed in', () => {
}); });
it('successfully loads', () => { it('successfully loads', () => {
cy.get('[data-cy-user-setup-continue]').should('be.visible'); // 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
cy.get('[data-cy-user-setup-continue]', { timeout: 12000 }).should('be.visible');
}); });
it('account setup wizard', () => { it('account setup wizard', () => {
cy.get('[data-cy-user-setup-continue]').click(); // 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
cy.get('[data-cy-user-setup-continue]', { timeout: 12000 }).click();
cy.get('[data-cy-user-setup-user-name] input').type('ありす'); cy.get('[data-cy-user-setup-user-name] input').type('ありす');
cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ'); cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ');
@ -202,7 +204,8 @@ describe('After user setup', () => {
cy.login('alice', 'alice1234'); cy.login('alice', 'alice1234');
// アカウント初期設定ウィザード // アカウント初期設定ウィザード
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click(); // 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 12000 }).click();
cy.get('[data-cy-modal-dialog-ok]').click(); cy.get('[data-cy-modal-dialog-ok]').click();
}); });

View file

@ -2,13 +2,13 @@ version: "3"
services: services:
web: web:
# replace image below with git.joinsharkey.org/sharkey/sharkey:stable on next release # image: git.joinsharkey.org/sharkey/sharkey:latest
# image: ghcr.io/transfem-org/sharkey:stable
build: . build: .
restart: always restart: always
links: links:
- db - db
- redis - redis
# - mcaptcha
# - meilisearch # - meilisearch
depends_on: depends_on:
db: db:
@ -49,12 +49,43 @@ services:
interval: 5s interval: 5s
retries: 20 retries: 20
# mcaptcha:
# restart: always
# image: mcaptcha/mcaptcha:latest
# networks:
# internal_network:
# external_network:
# aliases:
# - localhost
# ports:
# - 7493:7493
# env_file:
# - .config/docker.env
# environment:
# PORT: 7493
# MCAPTCHA_redis_URL: "redis://mcaptcha_redis/"
# depends_on:
# db:
# condition: service_healthy
# mcaptcha_redis:
# condition: service_healthy
#
# mcaptcha_redis:
# image: mcaptcha/cache:latest
# networks:
# - internal_network
# healthcheck:
# test: "redis-cli ping"
# interval: 5s
# retries: 20
# meilisearch: # meilisearch:
# restart: always # restart: always
# image: getmeili/meilisearch:v1.3.4 # image: getmeili/meilisearch:v1.3.4
# environment: # environment:
# - MEILI_NO_ANALYTICS=true # - MEILI_NO_ANALYTICS=true
# - MEILI_ENV=production # - MEILI_ENV=production
# - MEILI_MASTER_KEY=ChangeThis
# networks: # networks:
# - shonk # - shonk
# volumes: # volumes:

View file

@ -360,6 +360,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "فعّل hCaptcha" enableHcaptcha: "فعّل hCaptcha"
hcaptchaSiteKey: "مفتاح الموقع" hcaptchaSiteKey: "مفتاح الموقع"
hcaptchaSecretKey: "المفتاح السري" hcaptchaSecretKey: "المفتاح السري"
mcaptchaSiteKey: "مفتاح الموقع"
mcaptchaSecretKey: "المفتاح السري"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "تمكين reCAPTCHA" enableRecaptcha: "تمكين reCAPTCHA"
recaptchaSiteKey: "مفتاح الموقع" recaptchaSiteKey: "مفتاح الموقع"
@ -1010,6 +1012,7 @@ icon: "الصورة الرمزية"
replies: "رد" replies: "رد"
renotes: "أعد النشر" renotes: "أعد النشر"
flip: "اقلب" flip: "اقلب"
lastNDays: "آخر {n} أيام"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "نجح إنشاء حسابك!" accountCreated: "نجح إنشاء حسابك!"
letsStartAccountSetup: "إذا كنت جديدًا لنعدّ حسابك الشخصي." letsStartAccountSetup: "إذا كنت جديدًا لنعدّ حسابك الشخصي."
@ -1414,6 +1417,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "كل الملاحظات" allNotes: "كل الملاحظات"
favoritedNotes: " الملاحظات المفضلة" favoritedNotes: " الملاحظات المفضلة"
clips: "مِشبك"
followingList: "المتابَعون" followingList: "المتابَعون"
muteList: "المستخدمون المكتومون" muteList: "المستخدمون المكتومون"
blockingList: "المستخدمون المحجوبون" blockingList: "المستخدمون المحجوبون"
@ -1561,3 +1565,6 @@ _moderationLogTypes:
suspend: "علِق" suspend: "علِق"
resetPassword: "أعد تعيين كلمتك السرية" resetPassword: "أعد تعيين كلمتك السرية"
createInvitation: "ولِّد دعوة" createInvitation: "ولِّد دعوة"
_reversi:
total: "المجموع"

View file

@ -357,6 +357,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptcha চালু করুন" enableHcaptcha: "hCaptcha চালু করুন"
hcaptchaSiteKey: "সাইট কী" hcaptchaSiteKey: "সাইট কী"
hcaptchaSecretKey: "সিক্রেট কী" hcaptchaSecretKey: "সিক্রেট কী"
mcaptchaSiteKey: "সাইট কী"
mcaptchaSecretKey: "সিক্রেট কী"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHA চালু করুন" enableRecaptcha: "reCAPTCHA চালু করুন"
recaptchaSiteKey: "সাইট কী" recaptchaSiteKey: "সাইট কী"
@ -1190,6 +1192,7 @@ _profile:
changeBanner: "ব্যানার পরিবর্তন করুন" changeBanner: "ব্যানার পরিবর্তন করুন"
_exportOrImport: _exportOrImport:
allNotes: "সকল নোট" allNotes: "সকল নোট"
clips: "ক্লিপ"
followingList: "অনুসরণ করা হচ্ছে" followingList: "অনুসরণ করা হচ্ছে"
muteList: "মিউট" muteList: "মিউট"
blockingList: "ব্লক" blockingList: "ব্লক"
@ -1341,3 +1344,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "স্থগিত করা" suspend: "স্থগিত করা"
resetPassword: "পাসওয়ার্ড রিসেট করুন" resetPassword: "পাসওয়ার্ড রিসেট করুন"
_reversi:
total: "মোট"

View file

@ -336,8 +336,12 @@ whenServerDisconnected: "Quan es perdi la connexió al servidor"
disconnectedFromServer: "Desconnectat pel servidor" disconnectedFromServer: "Desconnectat pel servidor"
reload: "Actualitza" reload: "Actualitza"
doNothing: "Ignora" doNothing: "Ignora"
accept: "Accepta" reloadConfirm: "Vols recarregar?"
normal: "Nomal" watch: "Veure"
unwatch: "Deixar de veure"
accept: "Acceptar"
reject: "Denegar"
normal: "Normal"
instanceName: "Nom del servidor" instanceName: "Nom del servidor"
instanceDescription: "Descripció del servidor" instanceDescription: "Descripció del servidor"
maintainerName: "Nom de l'administrador" maintainerName: "Nom de l'administrador"
@ -355,25 +359,56 @@ connectService: "Connecta"
disconnectService: "Desconnecta" disconnectService: "Desconnecta"
enableLocalTimeline: "Activa la línia de temps local" enableLocalTimeline: "Activa la línia de temps local"
enableGlobalTimeline: "Activa la línia de temps global" enableGlobalTimeline: "Activa la línia de temps global"
disablingTimelinesInfo: "Fins i tot si aquestes línies de temps són desactivades, els administradors i els moderadors poden continuar visualitzant per conveniència."
registration: "Registre" registration: "Registre"
enableRegistration: "Permet els registres d'usuaris"
invite: "Convida" invite: "Convida"
driveCapacityPerLocalAccount: "Capacitat del disc per usuaris locals"
driveCapacityPerRemoteAccount: "Capacitat del disc per usuaris remots"
inMb: "En megabytes"
bannerUrl: "Adreça URL del bàner"
backgroundImageUrl: "Adreça URL de la imatge de fons"
basicInfo: "Informació bàsica" basicInfo: "Informació bàsica"
pinnedUsers: "Usuaris fixats" pinnedUsers: "Usuaris fixats"
pinnedUsersDescription: "Llista d'usuaris, separats per salts de línia, que seran fixats a la pestanya \"Explorar\"."
pinnedPages: "Pàgines fixades"
pinnedPagesDescription: "Escriu els camins de les pàgines que vols fixar a la pàgina d'inici d'aquesta instància. Separades per salts de línia."
pinnedClipId: "ID del retall fixat"
pinnedNotes: "Nota fixada" pinnedNotes: "Nota fixada"
hcaptcha: "hCaptcha"
enableHcaptcha: "Activar hCaptcha"
hcaptchaSiteKey: "Clau del lloc"
hcaptchaSecretKey: "Clau secreta"
mcaptcha: "mCaptcha"
enableMcaptcha: "Activar mCaptcha"
mcaptchaSiteKey: "Clau del lloc"
mcaptchaSecretKey: "Clau secreta"
mcaptchaInstanceUrl: "Adreça URL del servidor mCaptcha"
recaptcha: "reCAPTCHA"
enableRecaptcha: "Activar reCAPTCHA"
recaptchaSiteKey: "Clau del lloc"
recaptchaSecretKey: "Clau secreta"
turnstile: "Turnstile" turnstile: "Turnstile"
enableTurnstile: "Activar Turnstile" enableTurnstile: "Activar Turnstile"
turnstileSiteKey: "Clau del lloc" turnstileSiteKey: "Clau del lloc"
turnstileSecretKey: "Clau secreta" turnstileSecretKey: "Clau secreta"
avoidMultiCaptchaConfirm: "Fer servir diferents sistemes de Captcha a la vegada pot causar problemes entre ells. Vols desactivar els altres sistemes de Captcha activats? Si els vols mantenir actius fes clic a cancel·lar."
antennas: "Antena" antennas: "Antena"
manageAntennas: "Gestiona les antenes" manageAntennas: "Gestiona les antenes"
name: "Nom"
antennaSource: "Font de l'antena" antennaSource: "Font de l'antena"
antennaKeywords: "Paraules clau a seguir" antennaKeywords: "Paraules clau a seguir"
antennaExcludeKeywords: "Paraules clau a excloure" antennaExcludeKeywords: "Paraules clau a excloure"
antennaKeywordsDescription: "Separar amb espais per la condició AND o amb salts de línia per la condició OR." antennaKeywordsDescription: "Separar amb espais per la condició AND o amb salts de línia per la condició OR."
notifyAntenna: "Notifica'm les publicacions noves" notifyAntenna: "Notifica'm les publicacions noves"
withFileAntenna: "Només les publicacions amb fitxers" withFileAntenna: "Només les publicacions amb fitxers"
enableServiceworker: "Activar les notificacions al navegador"
antennaUsersDescription: "Llistar un nom d'usuari per línia" antennaUsersDescription: "Llistar un nom d'usuari per línia"
caseSensitive: "Sensible a majúscules i minúscules "
withReplies: "Inclou respostes"
connectedTo: "Aquests comptes hi són connectats"
notesAndReplies: "Amb respostes" notesAndReplies: "Amb respostes"
withFiles: "Incloure arxius"
silence: "Silencia" silence: "Silencia"
silenceConfirm: "Segur que vols silenciar aquest usuari?" silenceConfirm: "Segur que vols silenciar aquest usuari?"
unsilence: "Deixa de silenciar" unsilence: "Deixa de silenciar"
@ -389,20 +424,40 @@ userList: "Llistes"
about: "Informació" about: "Informació"
aboutMisskey: "Quant a Misskey" aboutMisskey: "Quant a Misskey"
administrator: "Administrador/a" administrator: "Administrador/a"
token: "Codi de verificació"
2fa: "Autenticació de doble factor"
setupOf2fa: "Configurar l'autenticació de doble factor"
totp: "Aplicació d'autenticació"
totpDescription: "Escriu una contrasenya d'un sol us fent servir l'aplicació d'autenticació"
moderator: "Moderador/a" moderator: "Moderador/a"
moderation: "Moderació" moderation: "Moderació"
moderationNote: "Nota de moderació "
addModerationNote: "Afegir una nota de moderació "
moderationLogs: "Registre de moderació "
nUsersMentioned: "{n} usuaris mencionats" nUsersMentioned: "{n} usuaris mencionats"
securityKeyAndPasskey: "Clau de seguretat / Clau de pas"
securityKey: "Clau de seguretat" securityKey: "Clau de seguretat"
lastUsed: "Fet servir per última vegada"
lastUsedAt: "Fet servir per última vegada: {t}"
unregister: "Cancel·la el registre" unregister: "Cancel·la el registre"
passwordLessLogin: "Inici de sessió sense contrasenya" passwordLessLogin: "Inici de sessió sense contrasenya"
passwordLessLoginDescription: "Permet l'inici de sessió sense contrasenya fent servir només una Clau de seguretat/Clau de pas"
resetPassword: "Restableix la contrasenya" resetPassword: "Restableix la contrasenya"
newPasswordIs: "La contrasenya nova és «{password}»" newPasswordIs: "La contrasenya nova és «{password}»"
reduceUiAnimation: "Redueix les animacions de la interfície" reduceUiAnimation: "Redueix les animacions de la interfície"
share: "Comparteix" share: "Comparteix"
notFound: "No s'ha trobat" notFound: "No s'ha trobat"
notFoundDescription: "No es troba cap pàgina que correspongui a aquesta adreça"
uploadFolder: "Carpeta per defecte per pujades"
markAsReadAllNotifications: "Marca totes les notificacions com a llegides"
markAsReadAllUnreadNotes: "Marca-ho tot com a llegit" markAsReadAllUnreadNotes: "Marca-ho tot com a llegit"
markAsReadAllTalkMessages: "Marcar tots els missatges com llegits"
help: "Ajuda" help: "Ajuda"
inputMessageHere: "Escriu aquí el teu missatge "
close: "Tancar"
invites: "Convida" invites: "Convida"
members: "Membres"
transfer: "Transferir"
title: "Títol" title: "Títol"
text: "Text" text: "Text"
enable: "Habilita" enable: "Habilita"
@ -472,12 +527,62 @@ objectStorage: "Emmagatzematge d'objectes\n"
useObjectStorage: "Utilitzar l'emmagatzematge d'objectes" useObjectStorage: "Utilitzar l'emmagatzematge d'objectes"
objectStorageBaseUrl: "Base d'enllaç" objectStorageBaseUrl: "Base d'enllaç"
objectStorageBaseUrlDesc: "Prefix d'enllaç utilitzat per a fer referencia als fitxers. Especifica l'enllaç del teu CDN o Proxy si n'estàs utilitzant qualsevol, en cas contrari, especifica l'enllaç al que es pot accedir públicament segons la guia de servei que vosté utilitza.\nPer l'ús d'S3 utilitza 'https://<bucket>.s3.amazonaws.com' I per a GCS o serveis equivalents utilitza 'https://storage.googleapis.com/<bucket>'." objectStorageBaseUrlDesc: "Prefix d'enllaç utilitzat per a fer referencia als fitxers. Especifica l'enllaç del teu CDN o Proxy si n'estàs utilitzant qualsevol, en cas contrari, especifica l'enllaç al que es pot accedir públicament segons la guia de servei que vosté utilitza.\nPer l'ús d'S3 utilitza 'https://<bucket>.s3.amazonaws.com' I per a GCS o serveis equivalents utilitza 'https://storage.googleapis.com/<bucket>'."
objectStorageBucket: "Dipòsit "
objectStorageBucketDesc: "Escriu el nom del dipòsit que fas servir al teu proveïdor d'emmagatzematge "
objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "Els fitxers es deixaren a directoris amb aquest prefix"
objectStorageEndpoint: "Endpoint"
objectStorageEndpointDesc: "Deixa'l buit si fas servir AWS S3, si no és així específica un punt d'entrada com '<host>' o '<host>:<port>', depenent del servei que facis servir."
objectStorageRegion: "Regió "
objectStorageRegionDesc: "Especifica una regió com 'xx-east-1'. Si el teu servei no diferència regions has de posar 'us-east-1'. Deixa'l buit si fas servir variables d'entorn o un arxiu de configuració d'AWS."
objectStorageUseSSL: "Fes servir SSL"
objectStorageUseSSLDesc: "Desactiva'l si no tens pensat fer servir HTTPS per les connexions de l'API"
objectStorageUseProxy: "Connectar-se mitjançant un Proxy"
objectStorageUseProxyDesc: "Desactiva'l si no faràs servir un Proxy per les connexions de l'API"
objectStorageSetPublicRead: "Configurar les pujades com públiques "
s3ForcePathStyleDesc: "Si s3ForcePathStyle es troba activat el nom del dipòsit s'ha d'incloure a l'adreça URL en comtes del nom del host. Potser que necessitis activar-ho quan facis servir, per exemple, Minio a un servidor propi."
serverLogs: "Registres del servidor"
deleteAll: "Esborrar tot"
showFixedPostForm: "Mostrar el formulari per escriure a l'inici de la línia de temps"
showFixedPostFormInChannel: "Mostrar el formulari d'escriptura al principi de la línia de temps (Canals)"
withRepliesByDefaultForNewlyFollowed: "Inclou les respostes d'usuaris nous seguits a la línia de temps per defecte."
newNoteRecived: "Hi ha publicacions noves" newNoteRecived: "Hi ha publicacions noves"
sounds: "Sons"
sound: "So"
listen: "Escoltar"
none: "Res"
showInPage: "Mostrar a la pàgina "
popout: "Finestra emergent"
volume: "Volum"
masterVolume: "Volum principal"
notUseSound: "Sense so"
useSoundOnlyWhenActive: "Reproduir sons només quan Misskey estigui actiu"
details: "Detalls"
chooseEmoji: "Tria un emoji"
unableToProcess: "L'operació no pot ser completada "
recentUsed: "Utilitzat recentment"
install: "Instal·lació "
uninstall: "Desinstal·lar "
installedApps: "Aplicacions autoritzades "
nothing: "No hi ha res per veure aquí "
installedDate: "Data d'instal·lació" installedDate: "Data d'instal·lació"
lastUsedDate: "Utilitzat per última vegada"
state: "Estat" state: "Estat"
sort: "Ordena" sort: "Ordena"
ascendingOrder: "Ascendent" ascendingOrder: "Ascendent"
descendingOrder: "Descendent" descendingOrder: "Descendent"
scratchpad: "Bloc de proves"
scratchpadDescription: "El bloc de proves proporciona un entorn experimental per AiScript. Pot escriure i verificar els resultats que interactuen amb Misskey."
output: "Sortida"
script: "Script"
disablePagesScript: "Desactivar AiScript a les pàgines "
updateRemoteUser: "Actualitzar la informació de l'usuari remot"
unsetUserAvatar: "Desactivar l'avatar "
unsetUserAvatarConfirm: "Segur que vols desactivar l'avatar?"
unsetUserBanner: "Desactivar el bàner "
unsetUserBannerConfirm: "Segur que vols desactivar el bàner?"
deleteAllFiles: "Esborrar tots els arxius"
deleteAllFilesConfirm: "Segur que vols esborrar tots els arxius?"
removeAllFollowing: "Deixar de seguir tots els usuaris seguits" removeAllFollowing: "Deixar de seguir tots els usuaris seguits"
removeAllFollowingDescription: "El fet d'executar això, et farà deixar de seguir a tots els usuaris de {host}. Si us plau, executa això si l'amfitrió, per exemple, ja no existeix." removeAllFollowingDescription: "El fet d'executar això, et farà deixar de seguir a tots els usuaris de {host}. Si us plau, executa això si l'amfitrió, per exemple, ja no existeix."
userSuspended: "Aquest usuari ha sigut suspès" userSuspended: "Aquest usuari ha sigut suspès"
@ -526,31 +631,543 @@ medium: "Mitjà"
small: "Petit" small: "Petit"
generateAccessToken: "Genera codi d'accés" generateAccessToken: "Genera codi d'accés"
permission: "Permisos" permission: "Permisos"
adminPermission: "Permisos d'administrador "
enableAll: "Habilita tot" enableAll: "Habilita tot"
disableAll: "Deshabilita tot" disableAll: "Deshabilita tot"
tokenRequested: "Donar accés al compte" tokenRequested: "Donar accés al compte"
pluginTokenRequestedDescription: "Aquest connector podrà fer servir tots els permisos configurats aquí."
notificationType: "Tipus de notificació "
edit: "Editar"
emailServer: "Servidor de correu electrònic "
enableEmail: "Activar l'enviament de correus electrònics "
emailConfigInfo: "Es fa servir per confirmar el teu correu quan et registres o oblides la contrasenya "
email: "Correu electrònic"
emailAddress: "Adreça de correu electrònic"
smtpConfig: "Configuració del servidor SMTP"
smtpHost: "Amfitrió" smtpHost: "Amfitrió"
smtpPort: "Port"
smtpUser: "Nom d'usuari" smtpUser: "Nom d'usuari"
smtpPass: "Contrasenya" smtpPass: "Contrasenya"
emptyToDisableSmtpAuth: "No omplis el nom d'usuari i la contrasenya si vols deshabilitar l'autenticació SMTP"
smtpSecure: "Fes servir SSL/TLS per connexions SMTP"
smtpSecureInfo: "Desactiva això quan facis servir connexions STARTTLS"
testEmail: "Prova l'enviament de correu "
wordMute: "Silenciar paraules "
hardWordMute: "Silenciar paraules fortes"
regexpError: "Error de l'expressió regular "
regexpErrorDescription: "S'ha produït un error a l'expressió regular a la línia {line} de les paraules silenciades {tab}:"
instanceMute: "Silenciar servidor"
userSaysSomething: "{name} n'ha dit alguna cosa"
makeActive: "Activar"
display: "Veure"
copy: "Copiar"
metrics: "Mètriques"
overview: "Visió General"
logs: "Registres"
delayed: "Endarrerits "
database: "Bases de dades"
channel: "Canals"
create: "Crear"
notificationSetting: "Paràmetres de notificacions"
notificationSettingDesc: "Selecciona els tipus de notificacions que es mostraran"
useGlobalSetting: "Fer servir la configuració global"
useGlobalSettingDesc: "Si s'activa, es farà servir la configuració de notificacions del teu comte. Si no s'activa es poden fer configuracions individuals."
other: "Altre"
regenerateLoginToken: "Regenerar clau de seguretat d'inici de sessió"
regenerateLoginTokenDescription: "Regenera la clau de seguretat que es fa servir internament durant l'inici de sessió. Normalment aquesta acció no és necessària. Si es regenera es tancarà la sessió a tots els dispositius amb una sessió activa."
theKeywordWhenSearchingForCustomEmoji: "Cercar un emoji personalitzat "
setMultipleBySeparatingWithSpace: "Separa múltiples entrades amb un espai"
fileIdOrUrl: "ID de l'arxiu o URL"
behavior: "Comportament"
sample: "Mostrar"
abuseReports: "Denúncies "
reportAbuse: "Denuncia un abús "
reportAbuseRenote: "Denuncia una renota"
reportAbuseOf: "Denuncia a {name}"
fillAbuseReportDescription: "Omple els detalls sobre aquesta denúncia. Si la denúncia és sobre una nota en concret inclou l'adreça URL."
abuseReported: "La teva denúncia s'ha enviat. Moltes gràcies."
reporter: "Denunciant "
reporteeOrigin: "Origen de la denúncia "
reporterOrigin: "Origen del denunciant"
forwardReport: "Transferir la denúncia a una instància remota"
forwardReportIsAnonymous: "En comptes del teu compte, es farà servir un compte anònim com a denunciat a la instància remota."
send: "Enviar"
abuseMarkAsResolved: "Marcar la denúncia com a resolta"
openInNewTab: "Obre a una pestanya nova"
openInSideView: "Obre a una vista lateral"
defaultNavigationBehaviour: "Navegació per defecte"
editTheseSettingsMayBreakAccount: "Editar aquestes opcions pot deixar inoperatiu el teu compte"
instanceTicker: "Informació de notes de la instància "
waitingFor: "Esperant {x}"
random: "Aleatori "
system: "Sistema"
switchUi: "Canviar interfície d'usuari "
desktop: "Escriptori"
clip: "Retalls"
createNew: "Crear"
optional: "Opcional"
createNewClip: "Crear un nou Retall"
unclip: "Treure Retall"
confirmToUnclipAlreadyClippedNote: "Aquesta nota ja és inclosa al Retall \"{name}\". Vols treure-la d'aquest retall?"
public: "Públic "
private: "Privat"
i18nInfo: "Misskey està sent traduït a diferents idiomes per voluntaris. Pots ajudar aquí {link}."
manageAccessTokens: "Administrar claus de seguretat d'accés "
accountInfo: "Informació del compte"
notesCount: "Comptador de notes"
repliesCount: "Nombre de respostes"
renotesCount: "Impulsos fets" renotesCount: "Impulsos fets"
repliedCount: "Nombre de respostes rebudes"
renotedCount: "Impulsos rebuts" renotedCount: "Impulsos rebuts"
followingCount: "Nombre de comptes seguits"
followersCount: "Nombre de seguidors"
sentReactionsCount: "Nombre de reaccions enviades"
receivedReactionsCount: "Nombre de reaccions rebudes"
pollVotesCount: "Nombre de vots enviats a enquestes"
pollVotedCount: "Nombre de vots rebuts a les enquestes"
yes: "Sí "
no: "No"
driveFilesCount: "Nombre de fitxers al Disc"
driveUsage: "Utilització de l'espai del Disc"
noCrawle: "Rebutjar la indexació dels buscadors"
noCrawleDescription: "No permetis que els buscadors indexin el teu perfil, notes, pàgines, etc."
lockedAccountInfo: "Tret que establiu la visibilitat de la nota a \"Només seguidors\", les vostres notes seran visibles per qualsevol persona, fins i tot si heu d'aprovar els seguidors manualment"
alwaysMarkSensitive: "Marcar com a sensible per defecte"
loadRawImages: "Carregar les imatges originals en comptes de miniatures "
disableShowingAnimatedImages: "No reproduir imatges animades"
highlightSensitiveMedia: "Ressalta els medis marcats com a sensibles"
verificationEmailSent: "S'ha enviat un correu electrònic de verificació. Fes clic a l'enllaç per completar la verificació."
notSet: "Sense definir"
emailVerified: "El correu electrònic s'ha verificat"
noteFavoritesCount: "Nombre de notes favorites "
pageLikesCount: "Nombre de Pàgines que t'agraden "
pageLikedCount: "Nombre d'agraïments rebuts a les Pàgines "
contact: "Contacte"
useSystemFont: "Fes servir la font per defecte del sistema"
clips: "Retalls"
experimentalFeatures: "Característiques experimentals"
experimental: "Experimental"
thisIsExperimentalFeature: "Aquesta és una característica experimental. La seva funcionalitat pot canviar, i pot ser que no funcioni degudament."
developer: "Programador"
makeExplorable: "Fes que el compte sigui visible a la secció \"Explorar\""
makeExplorableDescription: "Si desactives aquesta opció, el teu compte no sortirà a la secció \"Explorar\""
showGapBetweenNotesInTimeline: "Mostra una separació entre els articles a la línia de temps"
duplicate: "Duplicat"
left: "Esquerra"
center: "Centre"
wide: "Gran"
narrow: "Estret"
reloadToApplySetting: "Aquest ajust només s'aplicarà després de recarregar la pàgina. Vols fer-ho ara?"
needReloadToApply: "Es requereix recarregar per reflectir aquesta opció "
showTitlebar: "Mostra la barra del títol "
clearCache: "Esborra la memòria cau" clearCache: "Esborra la memòria cau"
onlineUsersCount: "{n} Usuaris es troben en línia "
nUsers: "{n} Usuaris"
nNotes: "{n} Notes"
sendErrorReports: "Enviar informes d'error "
sendErrorReportsDescription: "Quan s'activa, es compartirà amb Misskey informació detallada de l'error quan es trobi un problema això farà pujar la qualitat de Misskey.\nAixò inclourà informació com la versió del SO que fas servir, el navegador web que fas servir, la teva activitat a Misskey, etc."
myTheme: "El meu tema"
backgroundColor: "Color de fons"
accentColor: "Color principal"
textColor: "Color del text"
saveAs: "Desar com..."
advanced: "Avançat"
advancedSettings: "Configuració avançada"
value: "Valor"
createdAt: "Creat el"
updatedAt: "Actualitzat el"
saveConfirm: "Desar canvis?"
deleteConfirm: "Segur que vols esborrar?"
invalidValue: "Valor invàlid."
registry: "Registre "
closeAccount: "Tancar el compte"
currentVersion: "Versió actual"
latestVersion: "Versió nova"
youAreRunningUpToDateClient: "Ja estàs fent servir la versió més recent del client."
newVersionOfClientAvailable: "Tens disponible una versió del client més recent."
usageAmount: "Ús "
capacity: "Capacitat"
inUse: "Fet servir"
editCode: "Editar el codi"
apply: "Aplicar"
receiveAnnouncementFromInstance: "Rep notificacions d'aquesta instància "
emailNotification: "Notificacions per correu electrònic "
publish: "Publicar"
inChannelSearch: "Cerca al canal"
useReactionPickerForContextMenu: "Fes clic al botó dret del ratolí per obrir el menú de reaccions"
typingUsers: "{users} està/estàn Escrivint "
jumpToSpecifiedDate: "Ves a una data concreta"
showingPastTimeline: "Estàs veient una línia de temps antiga" showingPastTimeline: "Estàs veient una línia de temps antiga"
clear: "Tornar"
markAllAsRead: "Marcar tot com llegit"
goBack: "Tornar"
unlikeConfirm: "Vols esborrar el teu m'agrada?"
fullView: "Vista completa."
quitFullView: "Sortir de la vista completa"
addDescription: "Afegeix una descripció "
userPagePinTip: "Podeu seleccionar \"Fixar al perfil\" del menú de notes individuals per mostrar les notes aquí."
notSpecifiedMentionWarning: "Aquesta nota esmenta usuaris que no es troben com a destinataris"
info: "Informació" info: "Informació"
userInfo: "Informació de l'usuari"
unknown: "Desconegut"
onlineStatus: "Connectat"
hideOnlineStatus: "Ocultar l'estat de connexió"
hideOnlineStatusDescription: "Ocultant el teu estat de connexió redueix les funcionalitats d'algunes funcions com la cerca."
online: "Connectat"
active: "Actiu"
offline: "Desconnectat"
notRecommended: "No recomanat"
botProtection: "Protecció contra bots"
instanceBlocking: "Instàncies blocades/silenciades"
selectAccount: "Seleccionar un compte"
switchAccount: "Canviar de compte"
enabled: "Activat"
disabled: "Desactivat"
quickAction: "Accions ràpides"
user: "Usuaris" user: "Usuaris"
administration: "Administració" administration: "Administració"
accounts: "Comptes"
switch: "Canvia"
noMaintainerInformationWarning: "La informació de l'administrador no s'ha configurat"
noBotProtectionWarning: "La protecció contra bots no s'ha configurat."
configure: "Configurar"
postToGallery: "Crear una nova publicació a la galeria"
postToHashtag: "Pública a aquesta etiqueta"
gallery: "Galeria"
recentPosts: "Articles recents"
popularPosts: "Articles populars"
shareWithNote: "Comparteix amb una nota"
ads: "Anuncis"
expiration: ""
startingperiod: "Inici"
memo: "Recordatori"
priority: "Prioritat"
high: "Alta"
middle: "Mitjà" middle: "Mitjà"
low: "Baixa"
emailNotConfiguredWarning: "Adreça de correu electrònic"
ratio: "Proporció"
previewNoteText: "Mostrar vista prèvia"
customCss: "CSS personalitzat"
customCssWarn: "Aquesta configuració només hauries de configurar-la si saps que fas. Si poses valors inadequats pots fer que el client deixi de funcionar correctament."
global: "Global" global: "Global"
squareAvatars: "Mostrar avatars quadrats"
sent: "Enviar"
received: "Rebut"
searchResult: "Resultats de la cerca"
hashtags: "Etiquetes"
troubleshooting: "Solucionar problemes"
useBlurEffect: "Fes servir efectes de desenfocament a la interfície"
learnMore: "Saber més "
misskeyUpdated: "Misskey s'ha actualitzat "
whatIsNew: "Mostra canvis"
translate: "Traduir "
translatedFrom: "Traduït del {x}"
accountDeletionInProgress: "S'està produint l'eliminació del compte"
usernameInfo: "Un nom que identifiqui el teu compte d'altres en aquest servidor. Pots fer servir lletres (a~z, A~Z), números (0~9) i guions baixos (_). Els noms d'usuari no es poden canviar després."
aiChanMode: "Mode IA"
devMode: "Mode desenvolupador"
keepCw: "Mantenir els avisos de contingut"
pubSub: "Comptes Pub/Sub"
lastCommunication: "Última comunicació "
resolved: "Resolt"
unresolved: "Sense resoldre"
breakFollow: "Deixar de seguir"
breakFollowConfirm: "Vols deixar de seguir?"
itsOn: "Activat"
itsOff: "Desactivat"
on: "Activar"
off: "Desactivar"
emailRequiredForSignup: "Demanar correu electrònic per registrar-se "
unread: "Sense llegir"
filter: "Filtrar"
controlPanel: "Panel de control"
manageAccounts: "Gestionar comptes"
makeReactionsPublic: "Reaccions públiques "
makeReactionsPublicDescription: "Això fa que totes les teves reaccions siguin visibles públicament "
classic: "Clàssic "
muteThread: "Silenciar el fil"
unmuteThread: "Deixar de silenciar el fil"
followingVisibility: "Visibilitat dels seguiments"
followersVisibility: "Visibilitat dels seguidors"
continueThread: "Veure la continuació del fil"
deleteAccountConfirm: "Això eliminarà el teu compte irreversiblement. Procedir?"
incorrectPassword: "Contrasenya incorrecta."
voteConfirm: "Confirma el teu vot \"{choice}\""
hide: "Amagar"
useDrawerReactionPickerForMobile: "Mostrar el selector de reaccions com un calaix al mòbil "
welcomeBackWithName: "Benvingut de nou, {name}"
clickToFinishEmailVerification: "Si us plau, fes clic a [{ok}] per completar la verificació per correu electrònic "
overridedDeviceKind: "Tipus de dispositiu"
smartphone: "Telèfon intel·ligent"
tablet: "Tauleta"
auto: "Automàtic "
themeColor: "Color del tema"
size: "Mida"
numberOfColumn: "Nombre de columnes"
searchByGoogle: "Cercar" searchByGoogle: "Cercar"
instanceDefaultLightTheme: "Tema clar per defecte de tota la instància "
instanceDefaultDarkTheme: "Tema fosc per defecte de tota la instància "
instanceDefaultThemeDescription: "Introdueix el codi del tema en format d'objecte"
mutePeriod: "Duració del silenci"
period: "Límit de temps"
indefinitely: "Permanent"
tenMinutes: "10 minuts"
oneHour: "1 hora"
oneDay: "Un dia"
oneWeek: "Una setmana"
oneMonth: "Un mes"
reflectMayTakeTime: "Això pot trigar una estona a tenir efecte"
failedToFetchAccountInformation: "No es pot obtenir la informació del compte"
rateLimitExceeded: "S'ha arribat al màxim de peticions"
cropImage: "Retalla la imatge"
cropImageAsk: "Vols retallar la imatge?"
cropYes: "Retallar"
cropNo: "Fer servir tal qual"
file: "Fitxers" file: "Fitxers"
recentNHours: "Últimes {n} hores"
recentNDays: "Últims {n} dies"
noEmailServerWarning: "Correu electrònic del servidor sense configurar"
thereIsUnresolvedAbuseReportWarning: "Hi ha informes sense solucionar."
recommended: "Recomanat"
check: "Verificar"
driveCapOverrideLabel: "Canvia la capacitat del Disc per aquest usuari"
driveCapOverrideCaption: "Restableix la mida original posant un valor de 0 o menys."
requireAdminForView: "Has de ser administrador per poder veure això."
isSystemAccount: "Un compte creat i operat automàticament pel sistema."
typeToConfirm: "Si us plau, escriu {x} per confirmar"
deleteAccount: "Esborrar el compte"
document: "Documentació"
numberOfPageCache: "Nombre de pàgines a la memòria cau"
numberOfPageCacheDescription: "Incrementant aquest nombre farà que millori l'experiència de l'usuari, però es farà servir més memòria al dispositiu de l'usuari."
logoutConfirm: "Vols sortir?"
lastActiveDate: "Fet servir per última vegada"
statusbar: "Barra d'estat"
pleaseSelect: "Selecciona una opció"
reverse: "Invertir"
colored: "Colorit"
refreshInterval: "Interval d'actualització "
label: "Etiqueta"
type: "Tipus"
speed: "Velocitat"
slow: "Lent"
fast: "Ràpid "
sensitiveMediaDetection: "Detecció de contingut sensible"
localOnly: "Només local"
remoteOnly: "Només remot"
failedToUpload: "Ha fallat la pujada"
cannotUploadBecauseInappropriate: "Aquest fitxer no es pot pujar perquè s'ha trobat que algunes parts són inapropiades."
cannotUploadBecauseNoFreeSpace: "Ha fallat la pujada del fitxer perquè no hi ha capacitat al Disc."
cannotUploadBecauseExceedsFileSizeLimit: "Aquest fitxer no es pot pujar perquè supera la mida permesa."
beta: "Proves"
enableAutoSensitive: "Marcar com a sensible automàticament "
enableAutoSensitiveDescription: "Permet la detecció i el marcat automàtic dels mitjans sensibles fent servir aprenentatge automàtic quan sigui possible. Si aquesta opció es troba desactivada potser que estigui activada per a tota la instància. "
activeEmailValidationDescription: "Activa la validació estricta de comptes de correu electrònic, inclou la validació d'adreces d'un sol ús i si es possible comunicar-se amb aquestes. Quan es troba desactivada només es vàlida el format del correu electrònic."
navbar: "Barra de navegació "
shuffle: "Aleatori"
account: "Compte"
move: "Mou"
pushNotification: "Enviament de notificacions"
subscribePushNotification: "Activar l'enviament de notificacions"
unsubscribePushNotification: "Desactivar l'enviament de notificacions"
pushNotificationAlreadySubscribed: "L'enviament de notificacions ja és activat"
pushNotificationNotSupported: "El teu navegador o la teva instància no suporta l'enviament de notificacions "
sendPushNotificationReadMessage: "Esborrar les notificacions enviades quan s'hagin llegit"
sendPushNotificationReadMessageCaption: "Això pot fer que el teu dispositiu consumeixi més bateria"
windowMaximize: "Maximitzar "
windowMinimize: "Minimitzar"
windowRestore: "Restaurar"
caption: "Llegenda"
loggedInAsBot: "Identificat com a bot"
tools: "Eines"
cannotLoad: "No es pot carregar"
numberOfProfileView: "Visualitzacions del perfil"
like: "M'agrada "
unlike: "Treure m'agrada "
numberOfLikes: "M'agraden "
show: "Veure"
neverShow: "No mostrar més "
remindMeLater: "Recorda-m'ho més tard"
didYouLikeMisskey: "T'està agradant Misskey?"
pleaseDonate: "A {host} fem servir el software lliure Misskey. Considera fer un donatiu a Misskey perquè pugui continuar el seu desenvolupament!"
roles: "Rols"
role: "Rols"
noRole: "No s'han trobat rols"
normalUser: "Usuari normal"
undefined: "Sense definir"
assign: "Assignar "
unassign: "Treure"
color: "Color"
manageCustomEmojis: "Gestiona els emojis personalitzats"
manageAvatarDecorations: "Gestiona les decoracions dels avatars "
youCannotCreateAnymore: "Has arribat al màxim de creacions"
cannotPerformTemporary: "Temporalment no disponible"
cannotPerformTemporaryDescription: "Aquesta acció no es pot dur a terme temporalment per arribar al seu límit d'execució. Pots esperar una mica i tornar-ho a intentar."
invalidParamError: "Paràmetres incorrectes "
invalidParamErrorDescription: "Els paràmetres demanats no són correctes. Normalment això es deu a un error, però també pot ser a alguna entrada excedint els límits o similar."
permissionDeniedError: "Operació no permesa "
permissionDeniedErrorDescription: "Aquest compte no té suficients permisos per dur a terme aquesta acció "
preset: "Predefinit"
selectFromPresets: "Escull des dels predefinits"
achievements: "Assoliments"
gotInvalidResponseError: "Resposta del servidor invàlida "
gotInvalidResponseErrorDescription: "No es pot contactar amb el servidor o potser es troba fora de línia per manteniment. Provar-ho de nou més tard."
thisPostMayBeAnnoying: "Aquesta nota pot ser molesta per algú."
thisPostMayBeAnnoyingHome: "Publicar a la línia de temps d'Inici"
thisPostMayBeAnnoyingCancel: "Cancel·lar "
thisPostMayBeAnnoyingIgnore: "Publicar de totes maneres"
collapseRenotes: "Col·lapsar les renotes que ja has vist"
internalServerError: "Error intern del servidor"
internalServerErrorDescription: "El servidor ha fallat de manera inexplicable."
copyErrorInfo: "Copiar la informació de l'error "
joinThisServer: "Registra't en aquesta instància "
exploreOtherServers: "Cerca una altra instància "
letsLookAtTimeline: "Dona una ullada a la línia de temps"
disableFederationConfirm: "Vols treure la federació?"
disableFederationConfirmWarn: "Fins i tot traient la federació, les publicacions continuaren sent públiques, a no ser que es digui el contrari. Normalment no has de tocar això."
disableFederationOk: "Desactivar"
invitationRequiredToRegister: "Aquesta instància només permet el registre per invitació. Per registrar-te has d'introduir el codi d'invitació."
emailNotSupported: "Aquesta instància no suporta l'enviament de correus electrònics "
postToTheChannel: "Publicar a un Canal"
cannotBeChangedLater: "Això ja no es podrà canviar."
reactionAcceptance: "Acceptació de reaccions "
likeOnly: "Només m'agraden "
likeOnlyForRemote: "Tot (només m'agraden d'instàncies remotes)"
nonSensitiveOnly: "Només sense contingut sensible"
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Només contingut no sensible (Només m'agraden d'instàncies remotes)"
rolesAssignedToMe: "Rols assignats "
resetPasswordConfirm: "Vols canviar la teva contrasenya?"
sensitiveWords: "Paraules sensibles"
sensitiveWordsDescription: "La visibilitat de totes les notes que continguin qualsevol de les paraules configurades seran, automàticament, afegides a \"Inici\". Pots llistar diferents paraules separant les per línies noves."
myClips: "Els meus retalls"
drivecleaner: "Netejador de Disc"
retryAllQueuesNow: "Prova de nou d'executar totes les cues"
retryAllQueuesConfirmTitle: "Tornar a intentar-ho tot?"
retryAllQueuesConfirmText: "Això farà que la càrrega del servidor augmenti temporalment."
enableChartsForRemoteUser: "Generar gràfiques d'usuaris remots"
enableChartsForFederatedInstances: "Generar gràfiques d'instàncies remotes"
showClipButtonInNoteFooter: "Afegir \"Retall\" al menú d'acció de la nota"
reactionsDisplaySize: "Mida de les reaccions"
accountMoved: "Aquest usuari té un compte nou:"
accountMovedShort: "Aquest compte ha sigut migrat"
operationForbidden: "Operació no permesa "
forceShowAds: "Mostra els anuncis sempre "
addMemo: "Afegir recordatori"
editMemo: "Editar recordatori"
reactionsList: "Reaccions"
renotesList: "Impulsos"
notificationDisplay: "Notificacions"
leftTop: "Dalt a l'esquerra "
rightTop: "Dalt a la dreta "
leftBottom: "A baix a l'esquerra"
rightBottom: "A baix a la dreta"
stackAxis: "Apilar en direcció "
vertical: "Vertical"
horizontal: "Horitzontal "
position: "Posició "
serverRules: "Regles del servidor"
pleaseConfirmBelowBeforeSignup: "Per obrir un compte en aquest servidor, has de llegir i acceptar el següent."
pleaseAgreeAllToContinue: "Has d'acceptar tots els camps de dalt per poder continuar."
continue: "Continuar"
preservedUsernames: "Noms d'usuaris reservats"
preservedUsernamesDescription: "Llistat de noms d'usuaris que no es poden fer servir separats per salts de linia. Aquests noms d'usuaris no estaran disponibles quan es creï un compte d'usuari normal, però els administradors els poden fer servir per crear comptes manualment. Per altre banda els comptes ja creats amb aquests noms d'usuari no es veure'n afectats."
createNoteFromTheFile: "Compon una nota des d'aquest fitxer"
archive: "Arxiu"
channelArchiveConfirmTitle: "Vols arxivar {name}?"
channelArchiveConfirmDescription: "Un Canal arxivat no apareixerà a la llista de canals o als resultats de cerca. Tampoc es poden afegir noves entrades."
thisChannelArchived: "Aquest Canal ha sigut arxivat."
displayOfNote: "Mostrar notes"
initialAccountSetting: "Configuració del perfil"
youFollowing: "Seguit"
preventAiLearning: "Descartar l'ús d'aprenentatge automàtic (IA Generativa)"
preventAiLearningDescription: "Demanar els indexadors no fer servir els texts, imatges, etc. en cap conjunt de dades per alimentar l'aprenentatge automàtic (IA Predictiva/ Generativa). Això s'aconsegueix afegint la etiqueta \"noai\" com a resposta HTML al contingut corresponent. Prevenir aquest ús totalment pot ser que no sigui aconseguit, ja que molts indexadors poden obviar aquesta etiqueta."
options: "Opcions"
specifyUser: "Especificar usuari"
failedToPreviewUrl: "Vista prèvia no disponible"
update: "Actualitzar"
rolesThatCanBeUsedThisEmojiAsReaction: "Rols que poden fer servir aquest emoji com a reacció "
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Si cap rol es especificat tothom ho pot fer servir"
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Aquests rols han de ser públics "
cancelReactionConfirm: "Vols esborrar la teva reacció?"
changeReactionConfirm: "Vols canviar la teva reacció?"
later: "Més tard"
goToMisskey: "Ves a Misskey"
additionalEmojiDictionary: "Diccionari d'emojis adicionals"
installed: "Instal·lats "
branding: "Marca"
enableServerMachineStats: "Publicar estadístiques del maquinari del servidor"
enableIdenticonGeneration: "Activar la generació d'icones d'identificació "
turnOffToImprovePerformance: "Desactivant aquesta opció es pot millorar el rendiment."
icon: "Icona" icon: "Icona"
replies: "Respostes" replies: "Respostes"
renotes: "Impulsa" renotes: "Impulsa"
externalServices: "Serveis externs"
impressum: "Impressum"
impressumUrl: "Adreça URL impressum"
impressumDescription: "A països, com Alemanya, la inclusió de la informació de contacte de l'operador (un Impressum) és requereix de manera legal per llocs comercials."
privacyPolicy: "Política de privacitat"
privacyPolicyUrl: "Adreça URL de la política de privacitat"
tosAndPrivacyPolicy: "Termes d'ús i política de privacitat"
avatarDecorations: "Decoracions dels avatars"
attach: "Adjuntar"
detach: "Eliminar"
detachAll: "Treure tot"
angle: "Angle"
flip: "Girar"
showAvatarDecorations: "Mostrar les decoracions dels avatars"
releaseToRefresh: "Deixar anar per actualitzar"
refreshing: "Recarregant..."
pullDownToRefresh: "Llisca cap a baix per recarregar"
disableStreamingTimeline: "Desactivar l'actualització en temps real de les línies de temps"
useGroupedNotifications: "Mostrar les notificacions agrupades "
signupPendingError: "Hi ha hagut un problema verificant l'adreça de correu electrònic. L'enllaç pot haver caducat."
cwNotationRequired: "Si està activat \"Amagar contingut\" s'ha d'escriure una descripció "
doReaction: "Afegeix una reacció "
code: "Codi"
reloadRequiredToApplySettings: "És necessari recarregar la pàgina per aplicar els canvis."
remainingN: "Queden: {n}"
overwriteContentConfirm: "Vols substituir el contingut actual?"
seasonalScreenEffect: "Efectes de pantalla segons les estacions"
decorate: "Decorar"
addMfmFunction: "Afegeix funcions MFM"
enableQuickAddMfmFunction: "Activar accés ràpid per afegir funcions MFM"
lastNDays: "Últims {n} dies"
_announcement:
forExistingUsers: "Anunci per usuaris registrats"
forExistingUsersDescription: "Aquest avís només es mostrarà als usuaris existents fins al moment de la publicació. Si no també es mostrarà als usuaris que es registrin després de la publicació."
needConfirmationToRead: "Es necessita confirmació de lectura de la notificació "
needConfirmationToReadDescription: "Si s'activa es mostrarà un diàleg per confirmar la lectura d'aquesta notificació. A més aquesta notificació serà exclosa de qualsevol funcionalitat com \"Marcar tot com a llegit\"."
end: "Final de la notificació "
tooManyActiveAnnouncementDescription: "Tenir massa notificacions actives pot empitjorar l'experiència de l'usuari. Considera finalitzar els anuncis que siguin antics."
readConfirmTitle: "Marcar com llegida?"
readConfirmText: "Això marcarà el contingut de \"{title}\" com llegit."
shouldNotBeUsedToPresentPermanentInfo: "Ja que l'ús de notificacions pot impactar l'experiència dels nous usuaris, és recomanable fer servir les notificacions amb el flux d'informació en comptes de fer-les servir en un únic bloc."
dialogAnnouncementUxWarn: "Tenir dues o més notificacions amb l'estil de finestres pot impactar l'experiència de l'usuari, és per això que és recomana fer-lo servir amb cura."
silence: "Sense notificacions"
silenceDescription: "Activant aquesta opció la notificació no es mostrarà ni l'usuari l'haurà de llegir."
_initialAccountSetting:
accountCreated: "S'ha completat la creació del compte!"
letsStartAccountSetup: "Posem ràpidament la configuració inicial del compte."
letsFillYourProfile: "Comencem establint el teu perfil."
profileSetting: "Configuració del perfil"
privacySetting: "Configuració de seguretat"
theseSettingsCanEditLater: "Aquests ajustos es poden canviar més tard."
youCanEditMoreSettingsInSettingsPageLater: "A més d'això, es poden fer diferents configuracions a través de la pàgina de configuració. Assegureu-vos de comprovar-ho més tard."
_role: _role:
assignTarget: "Assignar "
priority: "Prioritat"
_priority: _priority:
low: "Baixa"
middle: "Mitjà" middle: "Mitjà"
high: "Alta"
_options: _options:
canManageCustomEmojis: "Gestiona els emojis personalitzats"
canManageAvatarDecorations: "Gestiona les decoracions dels avatars "
antennaMax: "Nombre màxim d'antenes" antennaMax: "Nombre màxim d'antenes"
_ffVisibility:
public: "Publicar"
_ad:
back: "Tornar"
_email: _email:
_follow: _follow:
title: "t'ha seguit" title: "t'ha seguit"
@ -589,9 +1206,11 @@ _visibility:
home: "Inici" home: "Inici"
followers: "Seguidors" followers: "Seguidors"
_profile: _profile:
name: "Nom"
username: "Nom d'usuari" username: "Nom d'usuari"
_exportOrImport: _exportOrImport:
allNotes: "Totes les publicacions" allNotes: "Totes les publicacions"
clips: "Retalls"
followingList: "Seguint" followingList: "Seguint"
muteList: "Silencia" muteList: "Silencia"
blockingList: "Bloqueja" blockingList: "Bloqueja"
@ -604,6 +1223,7 @@ _timelines:
social: "Social" social: "Social"
global: "Global" global: "Global"
_play: _play:
script: "Script"
summary: "Descripció" summary: "Descripció"
_pages: _pages:
contents: "Contingut" contents: "Contingut"
@ -645,8 +1265,15 @@ _deck:
tl: "Línia de temps" tl: "Línia de temps"
antenna: "Antena" antenna: "Antena"
list: "Llistes" list: "Llistes"
channel: "Canals"
mentions: "Mencions" mentions: "Mencions"
direct: "Publicacions directes" direct: "Publicacions directes"
_webhookSettings:
name: "Nom"
active: "Activat"
_moderationLogTypes: _moderationLogTypes:
suspend: "Suspèn" suspend: "Suspèn"
resetPassword: "Restableix la contrasenya" resetPassword: "Restableix la contrasenya"
_reversi:
total: "Total"

View file

@ -366,6 +366,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Aktivovat hCaptchu" enableHcaptcha: "Aktivovat hCaptchu"
hcaptchaSiteKey: "Klíč stránky" hcaptchaSiteKey: "Klíč stránky"
hcaptchaSecretKey: "Tajný Klíč (Secret Key)" hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
mcaptchaSiteKey: "Klíč stránky"
mcaptchaSecretKey: "Tajný Klíč (Secret Key)"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Zapnout ReCAPTCHu" enableRecaptcha: "Zapnout ReCAPTCHu"
recaptchaSiteKey: "Klíč stránky" recaptchaSiteKey: "Klíč stránky"
@ -1093,6 +1095,7 @@ icon: "Avatar"
replies: "Odpovědi" replies: "Odpovědi"
renotes: "Přeposlat" renotes: "Přeposlat"
flip: "Otočit" flip: "Otočit"
lastNDays: "Posledních {n} dnů"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "Váš účet byl úspěšně vytvořen!" accountCreated: "Váš účet byl úspěšně vytvořen!"
letsStartAccountSetup: "Pro začátek si nastavte svůj profil." letsStartAccountSetup: "Pro začátek si nastavte svůj profil."
@ -1825,6 +1828,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "Všechny poznámky" allNotes: "Všechny poznámky"
favoritedNotes: "Oblíbené poznámky" favoritedNotes: "Oblíbené poznámky"
clips: "Oříznout"
followingList: "Sledovaní" followingList: "Sledovaní"
muteList: "Ztlumit" muteList: "Ztlumit"
blockingList: "Zablokovat" blockingList: "Zablokovat"
@ -2016,3 +2020,6 @@ _moderationLogTypes:
suspend: "Zmrazit" suspend: "Zmrazit"
resetPassword: "Resetovat heslo" resetPassword: "Resetovat heslo"
createInvitation: "Vygenerovat pozvánku" createInvitation: "Vygenerovat pozvánku"
_reversi:
total: "Celkem"

View file

@ -1,2 +1,3 @@
--- ---
_lang_: "Dansk" _lang_: "Dansk"

View file

@ -121,9 +121,12 @@ sensitive: "Sensibel"
add: "Hinzufügen" add: "Hinzufügen"
reaction: "Reaktionen" reaction: "Reaktionen"
reactions: "Reaktionen" reactions: "Reaktionen"
emojiPicker: "Emoji auswählen"
pinnedEmojisForReactionSettingDescription: "Wähle die Emojis aus, um sie an zu pinnen"
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen" reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
rememberNoteVisibility: "Notizsichtbarkeit merken" rememberNoteVisibility: "Notizsichtbarkeit merken"
attachCancel: "Anhang entfernen" attachCancel: "Anhang entfernen"
deleteFile: "Datei gelöscht"
markAsSensitive: "Als sensibel markieren" markAsSensitive: "Als sensibel markieren"
unmarkAsSensitive: "Als nicht sensibel markieren" unmarkAsSensitive: "Als nicht sensibel markieren"
enterFileName: "Dateinamen eingeben" enterFileName: "Dateinamen eingeben"
@ -372,6 +375,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptcha aktivieren" enableHcaptcha: "hCaptcha aktivieren"
hcaptchaSiteKey: "Site key" hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key" hcaptchaSecretKey: "Secret key"
mcaptchaSiteKey: "Site key"
mcaptchaSecretKey: "Secret key"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHA aktivieren" enableRecaptcha: "reCAPTCHA aktivieren"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site key"
@ -619,6 +624,7 @@ medium: "Mittel"
small: "Klein" small: "Klein"
generateAccessToken: "Zugriffstoken generieren" generateAccessToken: "Zugriffstoken generieren"
permission: "Berechtigungen" permission: "Berechtigungen"
adminPermission: "Administratorberechtigung"
enableAll: "Alle aktivieren" enableAll: "Alle aktivieren"
disableAll: "Alle deaktivieren" disableAll: "Alle deaktivieren"
tokenRequested: "Zugriff zum Benutzerkonto gewähren" tokenRequested: "Zugriff zum Benutzerkonto gewähren"
@ -973,6 +979,7 @@ neverShow: "Nicht wieder anzeigen"
remindMeLater: "Vielleicht später" remindMeLater: "Vielleicht später"
didYouLikeMisskey: "Gefällt dir Sharkey?" didYouLikeMisskey: "Gefällt dir Sharkey?"
pleaseDonate: "Sharkey ist die kostenlose Software, die von {host} verwendet wird. Wir würden uns über Spenden freuen, damit dessen Entwicklung weitergeführt werden kann!" pleaseDonate: "Sharkey ist die kostenlose Software, die von {host} verwendet wird. Wir würden uns über Spenden freuen, damit dessen Entwicklung weitergeführt werden kann!"
pleaseDonateInstance: "Du kannst {host} auch direkt unterstützen, indem du an deine Instanz Administration spendest."
roles: "Rollen" roles: "Rollen"
role: "Rolle" role: "Rolle"
noRole: "Rolle nicht gefunden" noRole: "Rolle nicht gefunden"
@ -1150,6 +1157,8 @@ impressumDescription: "In manchen Ländern, wie Deutschland und dessen Umgebung,
privacyPolicy: "Datenschutzerklärung" privacyPolicy: "Datenschutzerklärung"
privacyPolicyUrl: "Datenschutzerklärungs-URL" privacyPolicyUrl: "Datenschutzerklärungs-URL"
tosAndPrivacyPolicy: "Nutzungsbedingungen und Datenschutzerklärung" tosAndPrivacyPolicy: "Nutzungsbedingungen und Datenschutzerklärung"
donation: "Spenden"
donationUrl: "Spenden-URL"
avatarDecorations: "Profilbilddekoration" avatarDecorations: "Profilbilddekoration"
attach: "Anbringen" attach: "Anbringen"
detach: "Entfernen" detach: "Entfernen"
@ -1165,6 +1174,7 @@ signupPendingError: "Beim Überprüfen der Mailadresse ist etwas schiefgelaufen.
cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden." cwNotationRequired: "Ist \"Inhaltswarnung verwenden\" aktiviert, muss eine Beschreibung gegeben werden."
doReaction: "Reagieren" doReaction: "Reagieren"
code: "Code" code: "Code"
lastNDays: "Letzten {n} Tage"
_announcement: _announcement:
forExistingUsers: "Nur für existierende Nutzer" forExistingUsers: "Nur für existierende Nutzer"
forExistingUsersDescription: "Ist diese Option aktiviert, wird diese Ankündigung nur Nutzern angezeigt, die zum Zeitpunkt der Ankündigung bereits registriert sind. Ist sie deaktiviert, wird sie auch Nutzern, die sich nach dessen Veröffentlichung registrieren, angezeigt." forExistingUsersDescription: "Ist diese Option aktiviert, wird diese Ankündigung nur Nutzern angezeigt, die zum Zeitpunkt der Ankündigung bereits registriert sind. Ist sie deaktiviert, wird sie auch Nutzern, die sich nach dessen Veröffentlichung registrieren, angezeigt."
@ -1952,6 +1962,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "Alle Notizen" allNotes: "Alle Notizen"
favoritedNotes: "Als Favorit markierte Notizen" favoritedNotes: "Als Favorit markierte Notizen"
clips: "Clip erstellen"
followingList: "Gefolgte Benutzer" followingList: "Gefolgte Benutzer"
muteList: "Stummschaltungen" muteList: "Stummschaltungen"
blockingList: "Blockierungen" blockingList: "Blockierungen"
@ -2234,3 +2245,6 @@ _externalResourceInstaller:
_themeInstallFailed: _themeInstallFailed:
title: "Das Farbschema konnte nicht installiert werden" title: "Das Farbschema konnte nicht installiert werden"
description: "Während der Installation des Farbschemas ist ein Problem aufgetreten. Bitte versuche es erneut. Detaillierte Fehlerinformationen können über die Javascript-Konsole abgerufen werden." description: "Während der Installation des Farbschemas ist ein Problem aufgetreten. Bitte versuche es erneut. Detaillierte Fehlerinformationen können über die Javascript-Konsole abgerufen werden."
_reversi:
total: "Gesamt"

View file

@ -356,6 +356,7 @@ _profile:
username: "Όνομα μέλους" username: "Όνομα μέλους"
_exportOrImport: _exportOrImport:
allNotes: "Όλα τα σημειώματα" allNotes: "Όλα τα σημειώματα"
clips: "Κλιπ"
followingList: "Ακολουθεί" followingList: "Ακολουθεί"
muteList: "Μέλη σε σίγαση" muteList: "Μέλη σε σίγαση"
blockingList: "Μπλοκαρισμένα μέλη" blockingList: "Μπλοκαρισμένα μέλη"
@ -395,3 +396,6 @@ _webhookSettings:
name: "Όνομα" name: "Όνομα"
_moderationLogTypes: _moderationLogTypes:
suspend: "Αποβολή" suspend: "Αποβολή"
_reversi:
total: "Σύνολο"

View file

@ -127,13 +127,14 @@ reaction: "Reactions"
reactions: "Reactions" reactions: "Reactions"
emojiPicker: "Emoji picker" emojiPicker: "Emoji picker"
pinnedEmojisForReactionSettingDescription: "Set the emojis which should be pinned and displayed immediately when reacting." pinnedEmojisForReactionSettingDescription: "Set the emojis which should be pinned and displayed immediately when reacting."
pinnedEmojisSettingDescription: "Set the emojis to be pinned and displayed when entering emojis" pinnedEmojisSettingDescription: "Set the emojis to be pinned and displayed when viewing emoji picker"
emojiPickerDisplay: "Emoji picker display" emojiPickerDisplay: "Emoji picker display"
overwriteFromPinnedEmojisForReaction: "Override from reaction settings" overwriteFromPinnedEmojisForReaction: "Override from reaction settings"
overwriteFromPinnedEmojis: "Override from general settings" overwriteFromPinnedEmojis: "Override from general settings"
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add." reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
rememberNoteVisibility: "Remember note visibility settings" rememberNoteVisibility: "Remember note visibility settings"
attachCancel: "Remove attachment" attachCancel: "Remove attachment"
deleteFile: "File deleted"
markAsSensitive: "Mark as sensitive" markAsSensitive: "Mark as sensitive"
unmarkAsSensitive: "Unmark as sensitive" unmarkAsSensitive: "Unmark as sensitive"
enterFileName: "Enter filename" enterFileName: "Enter filename"
@ -390,6 +391,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Enable hCaptcha" enableHcaptcha: "Enable hCaptcha"
hcaptchaSiteKey: "Site key" hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key" hcaptchaSecretKey: "Secret key"
mcaptchaSiteKey: "Site key"
mcaptchaSecretKey: "Secret key"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Enable reCAPTCHA" enableRecaptcha: "Enable reCAPTCHA"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site key"
@ -959,6 +962,10 @@ numberOfPageCache: "Number of cached pages"
numberOfPageCacheDescription: "Increasing this number will improve convenience for but cause more load as more memory usage on the user's device." numberOfPageCacheDescription: "Increasing this number will improve convenience for but cause more load as more memory usage on the user's device."
numberOfReplies: "Number of replies in a thread" numberOfReplies: "Number of replies in a thread"
numberOfRepliesDescription: "Increasing this number will display more replies. Setting this too high can cause replies to be cramped and unreadable." numberOfRepliesDescription: "Increasing this number will display more replies. Setting this too high can cause replies to be cramped and unreadable."
boostSettings: "Boost Settings"
showVisibilitySelectorOnBoost: "Show Visibility Selector"
showVisibilitySelectorOnBoostDescription: "Shows the visiblity selector if enabled when clicking boost, if disabled it will use the default visiblity defined below and the selector will not show up."
visibilityOnBoost: "Default boost visibility"
logoutConfirm: "Really log out?" logoutConfirm: "Really log out?"
lastActiveDate: "Last used at" lastActiveDate: "Last used at"
statusbar: "Status bar" statusbar: "Status bar"
@ -1010,6 +1017,7 @@ neverShow: "Don't show again"
remindMeLater: "Maybe later" remindMeLater: "Maybe later"
didYouLikeMisskey: "Have you taken a liking to Sharkey?" didYouLikeMisskey: "Have you taken a liking to Sharkey?"
pleaseDonate: "{host} uses the free software, Sharkey. We would highly appreciate your donations so development of Sharkey can continue!" pleaseDonate: "{host} uses the free software, Sharkey. We would highly appreciate your donations so development of Sharkey can continue!"
pleaseDonateInstance: "You can also support {host} directly by donating to your instance administration."
roles: "Roles" roles: "Roles"
role: "Role" role: "Role"
noRole: "Role not found" noRole: "Role not found"
@ -1196,6 +1204,8 @@ impressumDescription: "In some countries, like germany, the inclusion of operato
privacyPolicy: "Privacy Policy" privacyPolicy: "Privacy Policy"
privacyPolicyUrl: "Privacy Policy URL" privacyPolicyUrl: "Privacy Policy URL"
tosAndPrivacyPolicy: "Terms of Service and Privacy Policy" tosAndPrivacyPolicy: "Terms of Service and Privacy Policy"
donation: "Donate"
donationUrl: "Donation URL"
avatarDecorations: "Avatar decorations" avatarDecorations: "Avatar decorations"
attach: "Attach" attach: "Attach"
detach: "Remove" detach: "Remove"
@ -1219,6 +1229,10 @@ seasonalScreenEffect: "Seasonal screen effects"
decorate: "Decorate" decorate: "Decorate"
addMfmFunction: "Add MFM" addMfmFunction: "Add MFM"
enableQuickAddMfmFunction: "Show advanced MFM picker" enableQuickAddMfmFunction: "Show advanced MFM picker"
bubbleGame: "Bubble Game"
sfx: "Sound Effects"
replay: "Replay"
lastNDays: "Last {n} days"
_announcement: _announcement:
forExistingUsers: "Existing users only" forExistingUsers: "Existing users only"
forExistingUsersDescription: "This announcement will only be shown to users existing at the point of publishment if enabled. If disabled, those newly signing up after it has been posted will also see it." forExistingUsersDescription: "This announcement will only be shown to users existing at the point of publishment if enabled. If disabled, those newly signing up after it has been posted will also see it."
@ -1589,6 +1603,10 @@ _achievements:
_tutorialCompleted: _tutorialCompleted:
title: "Sharkey Elementary Course Diploma" title: "Sharkey Elementary Course Diploma"
description: "Tutorial completed" description: "Tutorial completed"
_bubbleGameExplodingHead:
title: "🤯"
_bubbleGameDoubleExplodingHead:
title: "Double🤯"
_role: _role:
new: "New role" new: "New role"
edit: "Edit role" edit: "Edit role"
@ -2143,12 +2161,17 @@ _profile:
metadataContent: "Content" metadataContent: "Content"
changeAvatar: "Change avatar" changeAvatar: "Change avatar"
changeBanner: "Change banner" changeBanner: "Change banner"
updateBanner: "Update banner"
removeBanner: "Remove banner"
changeBackground: "Change background" changeBackground: "Change background"
updateBackground: "Update background"
removeBackground: "Remove background"
verifiedLinkDescription: "By entering an URL that contains a link to your profile here, an ownership verification icon can be displayed next to the field." verifiedLinkDescription: "By entering an URL that contains a link to your profile here, an ownership verification icon can be displayed next to the field."
avatarDecorationMax: "You can add up to {max} decorations." avatarDecorationMax: "You can add up to {max} decorations."
_exportOrImport: _exportOrImport:
allNotes: "All notes" allNotes: "All notes"
favoritedNotes: "Favorite notes" favoritedNotes: "Favorite notes"
clips: "Clip"
followingList: "Followed users" followingList: "Followed users"
muteList: "Muted users" muteList: "Muted users"
blockingList: "Blocked users" blockingList: "Blocked users"
@ -2536,3 +2559,6 @@ _dataSaver:
_code: _code:
title: "Code highlighting" title: "Code highlighting"
description: "If code highlighting notations are used in MFM, etc., they will not load until tapped. Syntax highlighting requires downloading the highlight definition files for each programming language. Therefore, disabling the automatic loading of these files is expected to reduce the amount of communication data." description: "If code highlighting notations are used in MFM, etc., they will not load until tapped. Syntax highlighting requires downloading the highlight definition files for each programming language. Therefore, disabling the automatic loading of these files is expected to reduce the amount of communication data."
_reversi:
total: "Total"

View file

@ -130,6 +130,7 @@ overwriteFromPinnedEmojis: "Sobreescribir los emojis fijados"
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir." reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
rememberNoteVisibility: "Recordar visibilidad" rememberNoteVisibility: "Recordar visibilidad"
attachCancel: "Quitar adjunto" attachCancel: "Quitar adjunto"
deleteFile: "Archivo eliminado"
markAsSensitive: "Marcar como sensible" markAsSensitive: "Marcar como sensible"
unmarkAsSensitive: "Desmarcar como sensible" unmarkAsSensitive: "Desmarcar como sensible"
enterFileName: "Ingrese el nombre del archivo" enterFileName: "Ingrese el nombre del archivo"
@ -379,6 +380,11 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Habilitar hCaptcha" enableHcaptcha: "Habilitar hCaptcha"
hcaptchaSiteKey: "Clave del sitio" hcaptchaSiteKey: "Clave del sitio"
hcaptchaSecretKey: "Clave secreta" hcaptchaSecretKey: "Clave secreta"
mcaptcha: "mCaptcha"
enableMcaptcha: "Activar mCaptcha"
mcaptchaSiteKey: "Clave del sitio"
mcaptchaSecretKey: "Clave secreta"
mcaptchaInstanceUrl: "URL del servidor mCaptcha"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "activar reCAPTCHA" enableRecaptcha: "activar reCAPTCHA"
recaptchaSiteKey: "Clave del sitio" recaptchaSiteKey: "Clave del sitio"
@ -626,6 +632,7 @@ medium: "Mediano"
small: "Pequeño" small: "Pequeño"
generateAccessToken: "Generar token de acceso" generateAccessToken: "Generar token de acceso"
permission: "Permisos" permission: "Permisos"
adminPermission: "Permiso de administrador"
enableAll: "Activar todo" enableAll: "Activar todo"
disableAll: "Desactivar todo" disableAll: "Desactivar todo"
tokenRequested: "Permiso de acceso a la cuenta" tokenRequested: "Permiso de acceso a la cuenta"
@ -669,6 +676,7 @@ useGlobalSettingDesc: "Al activarse, se usará la configuración de notificacion
other: "Otro" other: "Otro"
regenerateLoginToken: "Regenerar token de login" regenerateLoginToken: "Regenerar token de login"
regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en todos los dispositivos." regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en todos los dispositivos."
theKeywordWhenSearchingForCustomEmoji: "Palabra clave para buscar el emoji personalizado."
setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios." setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios."
fileIdOrUrl: "Id del archivo o URL" fileIdOrUrl: "Id del archivo o URL"
behavior: "Comportamiento" behavior: "Comportamiento"
@ -1181,6 +1189,18 @@ remainingN: "Faltan: {n}"
overwriteContentConfirm: "¿Quieres sustituir todo el contenido actual?" overwriteContentConfirm: "¿Quieres sustituir todo el contenido actual?"
seasonalScreenEffect: "Efectos de pantalla asociados a estaciones" seasonalScreenEffect: "Efectos de pantalla asociados a estaciones"
decorate: "Decorar" decorate: "Decorar"
addMfmFunction: "Añadir función MFM"
enableQuickAddMfmFunction: "Activar acceso rápido para añadir funciones MFM"
bubbleGame: "Bubble Game"
sfx: "Efectos de sonido"
soundWillBePlayed: "Se reproducirán efector sonoros"
showReplay: "Ver reproducción"
replay: "Reproducir"
replaying: "Reproduciendo"
ranking: "Clasificación"
lastNDays: "Últimos {n} días"
_bubbleGame:
howToPlay: "Cómo jugar"
_announcement: _announcement:
forExistingUsers: "Solo para usuarios registrados" forExistingUsers: "Solo para usuarios registrados"
forExistingUsersDescription: "Este anuncio solo se mostrará a aquellos usuarios registrados en el momento de su publicación. Si se deshabilita esta opción, aquellos usuarios que se registren tras su publicación también lo verán." forExistingUsersDescription: "Este anuncio solo se mostrará a aquellos usuarios registrados en el momento de su publicación. Si se deshabilita esta opción, aquellos usuarios que se registren tras su publicación también lo verán."
@ -1551,6 +1571,10 @@ _achievements:
_tutorialCompleted: _tutorialCompleted:
title: "Diploma del Curso Básico de Misskey" title: "Diploma del Curso Básico de Misskey"
description: "Tutorial completado" description: "Tutorial completado"
_bubbleGameExplodingHead:
title: "🤯"
_bubbleGameDoubleExplodingHead:
title: "Doble 🤯"
_role: _role:
new: "Crear rol" new: "Crear rol"
edit: "Editar rol" edit: "Editar rol"
@ -1933,6 +1957,54 @@ _permissions:
"write:flash": "Editar Plays" "write:flash": "Editar Plays"
"read:flash-likes": "Ver los Play que me gustan" "read:flash-likes": "Ver los Play que me gustan"
"write:flash-likes": "Editar lista de Play que me gustan" "write:flash-likes": "Editar lista de Play que me gustan"
"read:admin:abuse-user-reports": "Ver reportes de usuarios"
"write:admin:delete-account": "Eliminar cuentas de usuario"
"write:admin:delete-all-files-of-a-user": "Eliminar todos los archivos de un usuario"
"read:admin:index-stats": "Ver datos indexados"
"read:admin:user-ips": "Ver dirección IP de usuario"
"read:admin:meta": "Ver metadatos de la instancia"
"write:admin:reset-password": "Restablecer contraseñas de usuario"
"write:admin:resolve-abuse-user-report": "Resolución de reportes de usuario"
"write:admin:send-email": "Enviar email"
"read:admin:server-info": "Ver información del servidor"
"read:admin:show-moderation-log": "Ver log de moderación"
"read:admin:show-user": "Ver información privada de usuario"
"read:admin:show-users": "Ver información privada de usuario"
"write:admin:suspend-user": "Suspender cuentas de usuario"
"write:admin:unset-user-avatar": "Quitar avatares de usuario"
"write:admin:unset-user-banner": "Quitar banner de usuarios"
"write:admin:unsuspend-user": "Quitar suspensión de cuentas de usuario"
"write:admin:meta": "Edición de metadatos de la instancia"
"write:admin:user-note": "Moderación de notas"
"write:admin:roles": "Edición de roles de usuario"
"read:admin:roles": "Ver roles de usuario"
"write:admin:relays": "Edición de relays"
"read:admin:relays": "Ver relays"
"write:admin:invite-codes": "Edición de códigos de invitación"
"read:admin:invite-codes": "Ver códigos de invitación"
"write:admin:announcements": "Edición de anuncios"
"read:admin:announcements": "Ver anuncios"
"write:admin:avatar-decorations": "Edición de decoración de avatares"
"read:admin:avatar-decorations": "Ver decoraciones de avatar"
"write:admin:federation": "Edición de federación de instancias"
"write:admin:account": "Edición de cuentas de usuario"
"read:admin:account": "Ver cuentas de usuario"
"write:admin:emoji": "Edición de emojis"
"read:admin:emoji": "Ver emojis"
"write:admin:queue": "Edición de cola de tareas"
"read:admin:queue": "Ver cola de tareas"
"write:admin:promo": "Edición de promociones"
"write:admin:drive": "Edición de Drive de usuarios"
"read:admin:drive": "Ver Drive de usuarios"
"read:admin:stream": "Usar la API de Websocket para administradores"
"write:admin:ad": "Edición de anuncios"
"read:admin:ad": "Ver anuncios"
"write:invite-codes": "Crear códigos de invitación"
"read:invite-codes": "Ver códigos de invitación"
"write:clip-favorite": "Marcar me gusta en clips"
"read:clip-favorite": "Ver los clips que me gustan"
"read:federation": "Ver instancias federadas"
"write:report-abuse": "Crear reportes de usuario"
_auth: _auth:
shareAccessTitle: "Permisos de la aplicación" shareAccessTitle: "Permisos de la aplicación"
shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?" shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?"
@ -2055,6 +2127,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "Todas las notas" allNotes: "Todas las notas"
favoritedNotes: "Notas favoritas" favoritedNotes: "Notas favoritas"
clips: "Clip"
followingList: "Siguiendo" followingList: "Siguiendo"
muteList: "Silenciados" muteList: "Silenciados"
blockingList: "Bloqueados" blockingList: "Bloqueados"
@ -2354,3 +2427,6 @@ _dataSaver:
_code: _code:
title: "Resaltar código" title: "Resaltar código"
description: "Si se usa resaltado de código en MFM, etc., no se cargará hasta pulsar en ello. El resaltado de sintaxis requiere la descarga de archivos de definición para cada lenguaje de programación. Debido a esto, al deshabilitar la carga automática de estos archivos reducirás el consumo de datos." description: "Si se usa resaltado de código en MFM, etc., no se cargará hasta pulsar en ello. El resaltado de sintaxis requiere la descarga de archivos de definición para cada lenguaje de programación. Debido a esto, al deshabilitar la carga automática de estos archivos reducirás el consumo de datos."
_reversi:
total: "Total"

View file

@ -130,6 +130,7 @@ overwriteFromPinnedEmojis: "Remplacer par les émojis épinglés globalement"
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter." reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
rememberNoteVisibility: "Se souvenir de la visibilité des notes" rememberNoteVisibility: "Se souvenir de la visibilité des notes"
attachCancel: "Supprimer le fichier attaché" attachCancel: "Supprimer le fichier attaché"
deleteFile: "Fichier supprimé"
markAsSensitive: "Marquer comme sensible" markAsSensitive: "Marquer comme sensible"
unmarkAsSensitive: "Supprimer le marquage comme sensible" unmarkAsSensitive: "Supprimer le marquage comme sensible"
enterFileName: "Entrer le nom du fichier" enterFileName: "Entrer le nom du fichier"
@ -168,7 +169,7 @@ cacheRemoteSensitiveFilesDescription: "Si vous désactivez ce paramètre, les fi
flagAsBot: "Ce compte est un robot" flagAsBot: "Ce compte est un robot"
flagAsBotDescription: "Si ce compte est géré de manière automatisée, choisissez cette option. Si elle est activée, elle agira comme un marqueur pour les autres développeurs afin d'éviter des chaînes d'interaction sans fin avec d'autres robots et d'ajuster les systèmes internes de Misskey pour traiter ce compte comme un robot." flagAsBotDescription: "Si ce compte est géré de manière automatisée, choisissez cette option. Si elle est activée, elle agira comme un marqueur pour les autres développeurs afin d'éviter des chaînes d'interaction sans fin avec d'autres robots et d'ajuster les systèmes internes de Misskey pour traiter ce compte comme un robot."
flagAsCat: "Ce compte est un chat" flagAsCat: "Ce compte est un chat"
flagAsCatDescription: "Activer l'option \" Je suis un chat \" pour ce compte." flagAsCatDescription: "Miaou miaou miaou ?"
flagShowTimelineReplies: "Afficher les réponses dans le fil" flagShowTimelineReplies: "Afficher les réponses dans le fil"
flagShowTimelineRepliesDescription: "Affiche les réponses des utilisateurs aux notes des autres utilisateurs dans la timeline si cette option est activée." flagShowTimelineRepliesDescription: "Affiche les réponses des utilisateurs aux notes des autres utilisateurs dans la timeline si cette option est activée."
autoAcceptFollowed: "Accepter automatiquement les demandes dabonnement venant dutilisateur·rice·s que vous suivez" autoAcceptFollowed: "Accepter automatiquement les demandes dabonnement venant dutilisateur·rice·s que vous suivez"
@ -379,6 +380,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Activer hCaptcha" enableHcaptcha: "Activer hCaptcha"
hcaptchaSiteKey: "Clé du site" hcaptchaSiteKey: "Clé du site"
hcaptchaSecretKey: "Clé secrète" hcaptchaSecretKey: "Clé secrète"
mcaptchaSiteKey: "Clé du site"
mcaptchaSecretKey: "Clé secrète"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Activer reCAPTCHA" enableRecaptcha: "Activer reCAPTCHA"
recaptchaSiteKey: "Clé du site" recaptchaSiteKey: "Clé du site"
@ -696,7 +699,7 @@ system: "Système"
switchUi: "Modifier l'interface utilisateur" switchUi: "Modifier l'interface utilisateur"
desktop: "Bureau" desktop: "Bureau"
clip: "Clip" clip: "Clip"
createNew: "Créer nouveau" createNew: "Créer"
optional: "Facultatif" optional: "Facultatif"
createNewClip: "Créer un nouveau clip" createNewClip: "Créer un nouveau clip"
unclip: "Supprimer le clip" unclip: "Supprimer le clip"
@ -1081,12 +1084,24 @@ specifyUser: "Spécifier l'utilisateur·rice"
failedToPreviewUrl: "Aperçu d'URL échoué" failedToPreviewUrl: "Aperçu d'URL échoué"
update: "Mettre à jour" update: "Mettre à jour"
rolesThatCanBeUsedThisEmojiAsReaction: "Rôles qui peuvent utiliser cet émoji comme réaction" rolesThatCanBeUsedThisEmojiAsReaction: "Rôles qui peuvent utiliser cet émoji comme réaction"
cancelReactionConfirm: "Supprimez la réaction ?"
later: "Plus tard" later: "Plus tard"
goToMisskey: "Retour vers Misskey" goToMisskey: "Retour vers Misskey"
additionalEmojiDictionary: "Dictionnaires d'émojis additionnels" additionalEmojiDictionary: "Dictionnaires d'émojis additionnels"
installed: "Installé" installed: "Installé"
branding: "Image de marque" branding: "Image de marque"
enableServerMachineStats: "Publier les statistiques du matériel du serveur"
enableIdenticonGeneration: "Générer les identicons des utilisateurs"
turnOffToImprovePerformance: "Désactiver peut améliorer la performance."
createInviteCode: "Créer un code d'invitation"
createWithOptions: "Options"
createCount: "Quantité à créer"
inviteCodeCreated: "Code d'invitation créé"
inviteLimitExceeded: "Vous avez atteint la limite de codes d'invitation que vous pouvez générer."
expirationDate: "Date dexpiration" expirationDate: "Date dexpiration"
noExpirationDate: "Ne pas expirer"
inviteCodeUsedAt: "Code d'invitation utilisé à"
registeredUserUsingInviteCode: "Code d'invitation utilisé par"
waitingForMailAuth: "En attente de la vérification de l'adresse courriel" waitingForMailAuth: "En attente de la vérification de l'adresse courriel"
inviteCodeCreator: "Créateur·rice de ce code d'invitation" inviteCodeCreator: "Créateur·rice de ce code d'invitation"
usedAt: "Utilisé le" usedAt: "Utilisé le"
@ -1106,6 +1121,7 @@ loadReplies: "Inclure les réponses"
loadConversation: "Afficher la conversation" loadConversation: "Afficher la conversation"
pinnedList: "Liste épinglée" pinnedList: "Liste épinglée"
notifyNotes: "Notifier à propos des nouvelles notes" notifyNotes: "Notifier à propos des nouvelles notes"
unnotifyNotes: "Ne pas notifier pour la publication des notes"
authentication: "Authentification" authentication: "Authentification"
authenticationRequiredToContinue: "Veuillez vous authentifier pour continuer" authenticationRequiredToContinue: "Veuillez vous authentifier pour continuer"
dateAndTime: "Date et heure" dateAndTime: "Date et heure"
@ -1147,7 +1163,9 @@ remainingN: "Restants : {n}"
overwriteContentConfirm: "Voulez-vous remplacer le contenu actuel ?" overwriteContentConfirm: "Voulez-vous remplacer le contenu actuel ?"
seasonalScreenEffect: "Effet d'écran saisonnier" seasonalScreenEffect: "Effet d'écran saisonnier"
decorate: "Décorer" decorate: "Décorer"
lastNDays: "Derniers {n} jours"
_announcement: _announcement:
forExistingUsers: "Pour les utilisateurs existants seulement"
readConfirmTitle: "Marquer comme lu ?" readConfirmTitle: "Marquer comme lu ?"
shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes." shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes."
dialogAnnouncementUxWarn: "Avoir deux ou plus annonces de style dialogue en même temps pourrait nuire considérablement à l'expérience utilisateur. Veuillez les utiliser avec caution." dialogAnnouncementUxWarn: "Avoir deux ou plus annonces de style dialogue en même temps pourrait nuire considérablement à l'expérience utilisateur. Veuillez les utiliser avec caution."
@ -1242,6 +1260,7 @@ _accountMigration:
startMigration: "Migrer" startMigration: "Migrer"
movedTo: "Compte vers lequel vous migrez :" movedTo: "Compte vers lequel vous migrez :"
_achievements: _achievements:
earnedAt: "Date d'obtention"
_types: _types:
_notes1: _notes1:
title: "Je viens tout juste de configurer mon shonk" title: "Je viens tout juste de configurer mon shonk"
@ -1799,6 +1818,7 @@ _profile:
avatarDecorationMax: "Vous pouvez mettre au plus {max} décorations d'avatar." avatarDecorationMax: "Vous pouvez mettre au plus {max} décorations d'avatar."
_exportOrImport: _exportOrImport:
allNotes: "Toutes les notes" allNotes: "Toutes les notes"
clips: "Clip"
followingList: "Abonnements" followingList: "Abonnements"
muteList: "Comptes masqués" muteList: "Comptes masqués"
blockingList: "Comptes bloqués" blockingList: "Comptes bloqués"
@ -2063,3 +2083,6 @@ _dataSaver:
_code: _code:
title: "Mise en évidence du code" title: "Mise en évidence du code"
description: "Si la notation de mise en évidence du code est utilisée, par exemple dans la MFM, elle ne sera pas chargée tant qu'elle n'aura pas été tapée. La mise en évidence du code nécessite le chargement du fichier de définition de chaque langue à mettre en évidence, mais comme ces fichiers ne sont plus chargés automatiquement, on peut s'attendre à une réduction du trafic de données." description: "Si la notation de mise en évidence du code est utilisée, par exemple dans la MFM, elle ne sera pas chargée tant qu'elle n'aura pas été tapée. La mise en évidence du code nécessite le chargement du fichier de définition de chaque langue à mettre en évidence, mais comme ces fichiers ne sont plus chargés automatiquement, on peut s'attendre à une réduction du trafic de données."
_reversi:
total: "Total"

View file

@ -6,54 +6,176 @@ import ts from 'typescript';
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename); const __dirname = dirname(__filename);
const parameterRegExp = /\{(\w+)\}/g;
function createMemberType(item) {
if (typeof item !== 'string') {
return ts.factory.createTypeLiteralNode(createMembers(item));
}
const parameters = Array.from(
item.matchAll(parameterRegExp),
([, parameter]) => parameter,
);
return parameters.length
? ts.factory.createTypeReferenceNode(
ts.factory.createIdentifier('ParameterizedString'),
[
ts.factory.createUnionTypeNode(
parameters.map((parameter) =>
ts.factory.createStringLiteral(parameter),
),
),
],
)
: ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
}
function createMembers(record) { function createMembers(record) {
return Object.entries(record) return Object.entries(record).map(([k, v]) => {
.map(([k, v]) => ts.factory.createPropertySignature( const node = ts.factory.createPropertySignature(
undefined, undefined,
ts.factory.createStringLiteral(k), ts.factory.createStringLiteral(k),
undefined, undefined,
typeof v === 'string' createMemberType(v),
? ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword) );
: ts.factory.createTypeLiteralNode(createMembers(v)), if (typeof v === 'string') {
)); ts.addSyntheticLeadingComment(
node,
ts.SyntaxKind.MultiLineCommentTrivia,
`*
* ${v.replace(/\n/g, '\n * ')}
`,
true,
);
}
return node;
});
} }
export default function generateDTS() { export default function generateDTS() {
const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8')); const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
const members = createMembers(locale); const members = createMembers(locale);
const elements = [ const elements = [
ts.factory.createVariableStatement(
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
ts.factory.createVariableDeclarationList(
[
ts.factory.createVariableDeclaration(
ts.factory.createIdentifier('kParameters'),
undefined,
ts.factory.createTypeOperatorNode(
ts.SyntaxKind.UniqueKeyword,
ts.factory.createKeywordTypeNode(ts.SyntaxKind.SymbolKeyword),
),
undefined,
),
],
ts.NodeFlags.Const,
),
),
ts.factory.createInterfaceDeclaration(
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
ts.factory.createIdentifier('ParameterizedString'),
[
ts.factory.createTypeParameterDeclaration(
undefined,
ts.factory.createIdentifier('T'),
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
),
],
undefined,
[
ts.factory.createPropertySignature(
undefined,
ts.factory.createComputedPropertyName(
ts.factory.createIdentifier('kParameters'),
),
undefined,
ts.factory.createTypeReferenceNode(
ts.factory.createIdentifier('T'),
undefined,
),
),
],
),
ts.factory.createInterfaceDeclaration(
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
ts.factory.createIdentifier('ILocale'),
undefined,
undefined,
[
ts.factory.createIndexSignature(
undefined,
[
ts.factory.createParameterDeclaration(
undefined,
undefined,
ts.factory.createIdentifier('_'),
undefined,
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
undefined,
),
],
ts.factory.createUnionTypeNode([
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
ts.factory.createTypeReferenceNode(
ts.factory.createIdentifier('ParameterizedString'),
),
ts.factory.createTypeReferenceNode(
ts.factory.createIdentifier('ILocale'),
undefined,
),
]),
),
],
),
ts.factory.createInterfaceDeclaration( ts.factory.createInterfaceDeclaration(
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)], [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
ts.factory.createIdentifier('Locale'), ts.factory.createIdentifier('Locale'),
undefined, undefined,
[
ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
ts.factory.createExpressionWithTypeArguments(
ts.factory.createIdentifier('ILocale'),
undefined, undefined,
),
]),
],
members, members,
), ),
ts.factory.createVariableStatement( ts.factory.createVariableStatement(
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)], [ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
ts.factory.createVariableDeclarationList( ts.factory.createVariableDeclarationList(
[ts.factory.createVariableDeclaration( [
ts.factory.createVariableDeclaration(
ts.factory.createIdentifier('locales'), ts.factory.createIdentifier('locales'),
undefined, undefined,
ts.factory.createTypeLiteralNode([ts.factory.createIndexSignature( ts.factory.createTypeLiteralNode([
ts.factory.createIndexSignature(
undefined, undefined,
[ts.factory.createParameterDeclaration( [
ts.factory.createParameterDeclaration(
undefined, undefined,
undefined, undefined,
ts.factory.createIdentifier('lang'), ts.factory.createIdentifier('lang'),
undefined, undefined,
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword), ts.factory.createKeywordTypeNode(
ts.SyntaxKind.StringKeyword,
),
undefined, undefined,
)], ),
],
ts.factory.createTypeReferenceNode( ts.factory.createTypeReferenceNode(
ts.factory.createIdentifier('Locale'), ts.factory.createIdentifier('Locale'),
undefined, undefined,
), ),
)]), ),
]),
undefined, undefined,
)], ),
ts.NodeFlags.Const | ts.NodeFlags.Ambient | ts.NodeFlags.ContextFlags, ],
ts.NodeFlags.Const,
), ),
), ),
ts.factory.createFunctionDeclaration( ts.factory.createFunctionDeclaration(
@ -70,16 +192,39 @@ export default function generateDTS() {
), ),
ts.factory.createExportDefault(ts.factory.createIdentifier('locales')), ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
]; ];
const printed = ts.createPrinter({ ts.addSyntheticLeadingComment(
elements[0],
ts.SyntaxKind.MultiLineCommentTrivia,
' eslint-disable ',
true,
);
ts.addSyntheticLeadingComment(
elements[0],
ts.SyntaxKind.SingleLineCommentTrivia,
' This file is generated by locales/generateDTS.js',
true,
);
ts.addSyntheticLeadingComment(
elements[0],
ts.SyntaxKind.SingleLineCommentTrivia,
' Do not edit this file directly.',
true,
);
const printed = ts
.createPrinter({
newLine: ts.NewLineKind.LineFeed, newLine: ts.NewLineKind.LineFeed,
}).printList( })
.printList(
ts.ListFormat.MultiLine, ts.ListFormat.MultiLine,
ts.factory.createNodeArray(elements), ts.factory.createNodeArray(elements),
ts.createSourceFile('index.d.ts', '', ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS), ts.createSourceFile(
'index.d.ts',
'',
ts.ScriptTarget.ESNext,
true,
ts.ScriptKind.TS,
),
); );
fs.writeFileSync(`${__dirname}/index.d.ts`, `/* eslint-disable */ fs.writeFileSync(`${__dirname}/index.d.ts`, printed, 'utf-8');
// This file is generated by locales/generateDTS.js
// Do not edit this file directly.
${printed}`, 'utf-8');
} }

View file

@ -3,3 +3,4 @@ _lang_: "japanski"
ok: "OK" ok: "OK"
gotIt: "Razumijem" gotIt: "Razumijem"
cancel: "otkazati" cancel: "otkazati"

View file

@ -16,3 +16,4 @@ _2fa:
renewTOTPCancel: "Sispann" renewTOTPCancel: "Sispann"
_widgets: _widgets:
profile: "pwofil" profile: "pwofil"

View file

@ -102,3 +102,4 @@ _deck:
_columns: _columns:
notifications: "Értesítések" notifications: "Értesítések"
tl: "Idővonal" tl: "Idővonal"

View file

@ -125,9 +125,12 @@ emojiPicker: "Emoji Picker"
pinnedEmojisForReactionSettingDescription: "Atur sematan emoji pada reaksi" pinnedEmojisForReactionSettingDescription: "Atur sematan emoji pada reaksi"
pinnedEmojisSettingDescription: "Atur sematan emoji pada masukan emoji" pinnedEmojisSettingDescription: "Atur sematan emoji pada masukan emoji"
emojiPickerDisplay: "Tampilan Emoji Picker" emojiPickerDisplay: "Tampilan Emoji Picker"
overwriteFromPinnedEmojisForReaction: "Timpa dari pengaturan reaksi"
overwriteFromPinnedEmojis: "Timpa dari pengaturan umum"
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan" reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan" rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
attachCancel: "Hapus lampiran" attachCancel: "Hapus lampiran"
deleteFile: "Berkas dihapus"
markAsSensitive: "Tandai sebagai konten sensitif" markAsSensitive: "Tandai sebagai konten sensitif"
unmarkAsSensitive: "Hapus tanda konten sensitif" unmarkAsSensitive: "Hapus tanda konten sensitif"
enterFileName: "Masukkan nama berkas" enterFileName: "Masukkan nama berkas"
@ -377,6 +380,9 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Nyalakan hCaptcha" enableHcaptcha: "Nyalakan hCaptcha"
hcaptchaSiteKey: "Site Key" hcaptchaSiteKey: "Site Key"
hcaptchaSecretKey: "Secret Key" hcaptchaSecretKey: "Secret Key"
mcaptcha: "mCaptcha"
mcaptchaSiteKey: "Site key"
mcaptchaSecretKey: "Secret Key"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Nyalakan reCAPTCHA" enableRecaptcha: "Nyalakan reCAPTCHA"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site key"
@ -667,6 +673,7 @@ useGlobalSettingDesc: "Jika dinyalakan, setelan notifikasi akun kamu akan diguna
other: "Lainnya" other: "Lainnya"
regenerateLoginToken: "Perbarui token login" regenerateLoginToken: "Perbarui token login"
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout." regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
theKeywordWhenSearchingForCustomEmoji: "Kata kunci ini digunakan untuk mencari emoji kustom yang dicari."
setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya menggunakan spasi." setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya menggunakan spasi."
fileIdOrUrl: "File-ID atau URL" fileIdOrUrl: "File-ID atau URL"
behavior: "Perilaku" behavior: "Perilaku"
@ -879,6 +886,8 @@ makeReactionsPublicDescription: "Pengaturan ini akan membuat daftar dari semua r
classic: "Klasik" classic: "Klasik"
muteThread: "Bisukan thread" muteThread: "Bisukan thread"
unmuteThread: "Suarakan thread" unmuteThread: "Suarakan thread"
followingVisibility: "Visibilitas mengikuti"
followersVisibility: "Visibilitas pengikut"
continueThread: "Lihat lanjutan thread" continueThread: "Lihat lanjutan thread"
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?" deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
incorrectPassword: "Kata sandi salah." incorrectPassword: "Kata sandi salah."
@ -1174,7 +1183,17 @@ doReaction: "Tambahkan reaksi"
code: "Kode" code: "Kode"
reloadRequiredToApplySettings: "Muat ulang diperlukan untuk menerapkan pengaturan." reloadRequiredToApplySettings: "Muat ulang diperlukan untuk menerapkan pengaturan."
remainingN: "Sisa : {n}" remainingN: "Sisa : {n}"
overwriteContentConfirm: "Apakah kamu yakin untuk menimpa konten saat ini?"
seasonalScreenEffect: "Efek layar musiman"
decorate: "Dekor" decorate: "Dekor"
addMfmFunction: "Tambahkan dekorasi"
enableQuickAddMfmFunction: "Tampilkan pemilih MFM tingkat lanjut"
bubbleGame: "Bubble Game"
sfx: "Efek Suara"
lastNDays: "{n} hari terakhir"
backToTitle: "Ke Judul"
_bubbleGame:
howToPlay: "Cara bermain"
_announcement: _announcement:
forExistingUsers: "Hanya pengguna yang telah ada" forExistingUsers: "Hanya pengguna yang telah ada"
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya." forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
@ -1184,7 +1203,10 @@ _announcement:
tooManyActiveAnnouncementDescription: "Terlalu banyak pengumuman dapat memperburuk pengalaman pengguna. Mohon pertimbangkan untuk mengarsipkan pengumuman yang sudah usang/tidak relevan." tooManyActiveAnnouncementDescription: "Terlalu banyak pengumuman dapat memperburuk pengalaman pengguna. Mohon pertimbangkan untuk mengarsipkan pengumuman yang sudah usang/tidak relevan."
readConfirmTitle: "Tandai telah dibaca?" readConfirmTitle: "Tandai telah dibaca?"
readConfirmText: "Aksi ini akan menandai konten dari \"{title}\" telah dibaca." readConfirmText: "Aksi ini akan menandai konten dari \"{title}\" telah dibaca."
shouldNotBeUsedToPresentPermanentInfo: "Karena dapat berdampak pada pengalaman pengguna untuk pengguna baru, sangat direkomendasikan untuk menggunakan notifikasi secara mengalir daripada tetap."
dialogAnnouncementUxWarn: "Memiliki dua atau lebih gaya dialog notifikasi secara bersamaan dapat berdampak signifikan pada pengalaman pengguna, mohon untuk menggunakannya dengan hati-hati."
silence: "Tiada notifikasi" silence: "Tiada notifikasi"
silenceDescription: "Apabila diaktifkan, notifikasi dari pengumuman ini akan dilewatkan dan pengguna tidak perlu membacanya."
_initialAccountSetting: _initialAccountSetting:
accountCreated: "Akun kamu telah sukses dibuat!" accountCreated: "Akun kamu telah sukses dibuat!"
letsStartAccountSetup: "Untuk pemula, ayo atur profilmu dulu." letsStartAccountSetup: "Untuk pemula, ayo atur profilmu dulu."
@ -1197,6 +1219,7 @@ _initialAccountSetting:
pushNotificationDescription: "Menyalakan notifikasi dorong akan membuatmu menerima notifikasi dari {name} secara langsung ke perangkatmu." pushNotificationDescription: "Menyalakan notifikasi dorong akan membuatmu menerima notifikasi dari {name} secara langsung ke perangkatmu."
initialAccountSettingCompleted: "Pengaturan profil selesai!" initialAccountSettingCompleted: "Pengaturan profil selesai!"
haveFun: "Selamat menikmati, {name}!" haveFun: "Selamat menikmati, {name}!"
youCanContinueTutorial: "Kamu dapat menjutkan ke tutorial dalam bagaimana menggunakan {name} (Misskey) atau kamu dapat keluar dari pemasangan ini dan langsung menggunakannya segera."
startTutorial: "Mulai Tutorial" startTutorial: "Mulai Tutorial"
skipAreYouSure: "Yakin melewati atur profil?" skipAreYouSure: "Yakin melewati atur profil?"
laterAreYouSure: "Yakin banget untuk atur profil nanti?" laterAreYouSure: "Yakin banget untuk atur profil nanti?"
@ -1210,6 +1233,10 @@ _initialTutorial:
description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan Misskey dan fitur-fiturnya." description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan Misskey dan fitur-fiturnya."
_note: _note:
title: "Apa itu Catatan?" title: "Apa itu Catatan?"
description: "Postingan di Misskey disebut sebagai 'Catatan'. Catatan ditampilkan secara kronologis pada lini masa dan dimutakhirkan secara real-time."
reply: "Klik pada tombol ini untuk membalas ke sebuah pesan. Bisa juga untuk membalas ke sebuah balasan dan melanjutkannya seperti percakapan selayaknya utas."
renote: "Kamu dapat membagikan catatan ke lini masa milikmu. Kamu juga dapat mengutipnya dengan komentarmu."
reaction: "Kamu dapat menambahkan reaksi ke Catatan. Detil lebih lanjut akan dijelaskan di halaman berikutnya."
_reaction: _reaction:
title: "Apa itu Reaksi?" title: "Apa itu Reaksi?"
_timeline: _timeline:
@ -1774,6 +1801,14 @@ _sfx:
notification: "Notifikasi" notification: "Notifikasi"
antenna: "Penerimaan Antenna" antenna: "Penerimaan Antenna"
channel: "Notifikasi Kanal" channel: "Notifikasi Kanal"
reaction: "Ketika memilih reaksi"
_soundSettings:
driveFile: "Menggunakan berkas audio dalam Drive"
driveFileWarn: "Pilih berkas audio dari Drive"
driveFileTypeWarn: "Berkas ini tidak didukung"
driveFileTypeWarnDescription: "Pilih berkas audio"
driveFileDurationWarn: "Audio ini terlalu panjang"
driveFileDurationWarnDescription: "Audio panjang dapat mengganggu penggunaan Misskey. Masih ingin melanjutkan?"
_ago: _ago:
future: "Masa depan" future: "Masa depan"
justNow: "Baru saja" justNow: "Baru saja"
@ -1785,6 +1820,14 @@ _ago:
monthsAgo: "{n} bulan lalu" monthsAgo: "{n} bulan lalu"
yearsAgo: "{n} tahun lalu" yearsAgo: "{n} tahun lalu"
invalid: "Tidak ada sama sekali disini" invalid: "Tidak ada sama sekali disini"
_timeIn:
seconds: "dalam {n} detik"
minutes: "dalam {n} menit"
hours: "dalam {n} jam"
days: "dalam {n} hari"
weeks: "dalam {n} minggu"
months: "dalam {n} bulan"
years: "dalam {n} tahun"
_time: _time:
second: "detik" second: "detik"
minute: "menit" minute: "menit"
@ -1972,9 +2015,11 @@ _profile:
changeAvatar: "Ubah avatar" changeAvatar: "Ubah avatar"
changeBanner: "Ubah header" changeBanner: "Ubah header"
verifiedLinkDescription: "Dengan memasukkan URL yang mengandung tautan ke profil kamu di sini, ikon verifikasi kepemilikan dapat ditampilkan di sebelah kolom ini." verifiedLinkDescription: "Dengan memasukkan URL yang mengandung tautan ke profil kamu di sini, ikon verifikasi kepemilikan dapat ditampilkan di sebelah kolom ini."
avatarDecorationMax: "Dapat ditambahkan hingga {max} dekorasi."
_exportOrImport: _exportOrImport:
allNotes: "Semua catatan" allNotes: "Semua catatan"
favoritedNotes: "Catatan favorit" favoritedNotes: "Catatan favorit"
clips: "Klip"
followingList: "Ikuti" followingList: "Ikuti"
muteList: "Bisukan" muteList: "Bisukan"
blockingList: "Blokir" blockingList: "Blokir"
@ -2093,12 +2138,16 @@ _notification:
pollEnded: "Hasil Kuesioner telah keluar" pollEnded: "Hasil Kuesioner telah keluar"
newNote: "Catatan baru" newNote: "Catatan baru"
unreadAntennaNote: "Antena {name}" unreadAntennaNote: "Antena {name}"
roleAssigned: "Peran Diberikan"
emptyPushNotificationMessage: "Pembaruan notifikasi dorong" emptyPushNotificationMessage: "Pembaruan notifikasi dorong"
achievementEarned: "Pencapaian didapatkan" achievementEarned: "Pencapaian didapatkan"
testNotification: "Tes notifikasi" testNotification: "Tes notifikasi"
checkNotificationBehavior: "Cek tampilan notifikasi" checkNotificationBehavior: "Cek tampilan notifikasi"
sendTestNotification: "Kirim tes notifikasi" sendTestNotification: "Kirim tes notifikasi"
notificationWillBeDisplayedLikeThis: "Notifikasi akan terlihat seperti ini" notificationWillBeDisplayedLikeThis: "Notifikasi akan terlihat seperti ini"
reactedBySomeUsers: "{n} orang memberikan reaksi"
renotedBySomeUsers: "{n} orang telah merenote"
followedBySomeUsers: "{n} orang telah mengikuti"
_types: _types:
all: "Semua" all: "Semua"
note: "Catatan baru" note: "Catatan baru"
@ -2111,6 +2160,7 @@ _notification:
pollEnded: "Jajak pendapat berakhir" pollEnded: "Jajak pendapat berakhir"
receiveFollowRequest: "Permintaan mengikuti diterima" receiveFollowRequest: "Permintaan mengikuti diterima"
followRequestAccepted: "Permintaan mengikuti disetujui" followRequestAccepted: "Permintaan mengikuti disetujui"
roleAssigned: "Peran Diberikan"
achievementEarned: "Pencapaian didapatkan" achievementEarned: "Pencapaian didapatkan"
app: "Notifikasi dari aplikasi tertaut" app: "Notifikasi dari aplikasi tertaut"
_actions: _actions:
@ -2202,6 +2252,11 @@ _moderationLogTypes:
createAd: "Iklan telah dibuat" createAd: "Iklan telah dibuat"
deleteAd: "Iklan telah dihapus" deleteAd: "Iklan telah dihapus"
updateAd: "Iklan telah diperbaharui" updateAd: "Iklan telah diperbaharui"
createAvatarDecoration: "Buat dekorasi avatar"
updateAvatarDecoration: "Perbarui dekorasi avatar"
deleteAvatarDecoration: "Hapus dekorasi avatar"
unsetUserAvatar: "Hapus avatar pengguna"
unsetUserBanner: "Hapus banner pengguna"
_fileViewer: _fileViewer:
title: "Rincian berkas" title: "Rincian berkas"
type: "Jenis berkas" type: "Jenis berkas"
@ -2210,3 +2265,60 @@ _fileViewer:
uploadedAt: "Diunggah pada" uploadedAt: "Diunggah pada"
attachedNotes: "Catatan yang dilampirkan" attachedNotes: "Catatan yang dilampirkan"
thisPageCanBeSeenFromTheAuthor: "Halaman ini hanya dapat dilihat oleh pengguna yang mengunggah bekas ini." thisPageCanBeSeenFromTheAuthor: "Halaman ini hanya dapat dilihat oleh pengguna yang mengunggah bekas ini."
_externalResourceInstaller:
title: "Pasang dari situs eksternal"
checkVendorBeforeInstall: "Pastikan sumber dari sumber daya ini terpercaya sebelum melakukan pemasangan."
_plugin:
title: "Apakah kamu ingin memasang plugin ini?"
metaTitle: "Informasi plugin"
_theme:
title: "Apakah kamu ingin memasang tema ini?"
metaTitle: "Informasi tema"
_meta:
base: "Skema warna dasar"
_vendorInfo:
title: "Informasi sumber"
endpoint: "Referensi Endpoint"
hashVerify: "Verifikasi hash"
_errors:
_invalidParams:
title: "Parameter tidak valid"
description: "Tidak cukup informasi untuk memuat data dari situs eksternal. Mohon konfirmasi kembali URL yang dimasukkan."
_resourceTypeNotSupported:
title: "Sumber daya eksternal ini tidak didukung"
description: "Tipe sumber daya eksternal ini tidak didukung. Mohon kontak administrator dari situs tersebut."
_failedToFetch:
title: "Gagal memuat data"
fetchErrorDescription: "Kesalahan terjadi ketika menghubungkan dengan situs eksternal. Jika percobaan kembali tidak dapat memperbaiki masalah ini, mohon hubungi administrator dari situs tersebut."
parseErrorDescription: "Kesalahan terjadi dalam memproses data yang dimuat dari situs eksternal. Mohon hubungi administrator dari situs tersebut."
_hashUnmatched:
title: "Verifikasi data gagal"
description: "Kesalahan terjadi dalam memverifikasi integritas data yang diambil. Sebagai pencegahan keamanan, pemasangan tidak dapat dilanjutkan. Mohon hubungi administrator dari situs tersebut."
_pluginParseFailed:
title: "Kesalahan AiScript"
description: "Data yang diminta telah diambil dengan sukses, namun kesalahan terjadi ketika AiScript melakukan parsing. Mohon hubungi pembuat plugin. Detil kesalahan dapat dilihat pada konsol Javascript."
_pluginInstallFailed:
title: "Pemasangan plugin gagal"
description: "Kesalahan terjadi ketika pemasangan plugin. Mohon coba lagi. Detil kesalahan dapat dilihat pada konsol Javascript."
_themeParseFailed:
title: "Parsing tema gagal"
description: "Data yang diminta telah diambil dengan sukses, namun kesalahan terjadi ketika tema melakukan parsing. Mohon hubungi pembuat tema. Detil kesalahan dapat dilihat pada konsol Javascript."
_themeInstallFailed:
title: "Pemasangan tema gagal"
description: "Kesalahan terjadi ketika pemasangan tema. Mohon coba lagi. Detil kesalahan dapat dilihat pada konsol Javascript."
_dataSaver:
_media:
title: "Memuat media"
description: "Mencegah gambar/video dimuat secara otomatis. Menyembunyikan gambar/video dan akan dimuat ketika diketuk."
_avatar:
title: "Gambar avatar"
description: "Hentikan animasi gambar avatar. Gambar animasi dapat berukuran lebih besar dari gambar biasa, berpotensi pada pengurangan lalu lintas data lebih jauh."
_urlPreview:
title: "Gambar kecil URL pratinjau"
description: "Gambar kecil URL pratinjau tidak akan dimuat lagi."
_code:
title: "Penyorotan kode"
description: "Jika notasi penyorotan kode digunakan di MFM, dll. Fungsi tersebut tidak akan dimuat apabila tidak diketuk. Penyorotan sintaks membutuhkan pengunduhan berkas definisi penyorotan untuk setiap bahasa pemrograman. Oleh sebab itu, menonaktifkan pemuatan otomatis dari berkas ini dilakukan untuk mengurangi jumlah komunikasi data."
_reversi:
total: "Jumlah"

7451
locales/index.d.ts vendored

File diff suppressed because it is too large Load diff

View file

@ -131,6 +131,7 @@ overwriteFromPinnedEmojis: "Sovrascrivi con le impostazioni globali"
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere." reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note" rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
attachCancel: "Rimuovi allegato" attachCancel: "Rimuovi allegato"
deleteFile: "File da Drive eliminato"
markAsSensitive: "Segna come esplicito" markAsSensitive: "Segna come esplicito"
unmarkAsSensitive: "Non segnare come esplicito " unmarkAsSensitive: "Non segnare come esplicito "
enterFileName: "Nome del file" enterFileName: "Nome del file"
@ -380,6 +381,9 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Abilita hCaptcha" enableHcaptcha: "Abilita hCaptcha"
hcaptchaSiteKey: "Chiave del sito" hcaptchaSiteKey: "Chiave del sito"
hcaptchaSecretKey: "Chiave segreta" hcaptchaSecretKey: "Chiave segreta"
enableMcaptcha: "Abilita hCaptcha"
mcaptchaSiteKey: "Chiave del sito"
mcaptchaSecretKey: "Chiave segreta"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Abilita reCAPTCHA" enableRecaptcha: "Abilita reCAPTCHA"
recaptchaSiteKey: "Chiave del sito" recaptchaSiteKey: "Chiave del sito"
@ -1183,6 +1187,7 @@ remainingN: "Rimangono: {n}"
overwriteContentConfirm: "Vuoi davvero sostituire l'attuale contenuto?" overwriteContentConfirm: "Vuoi davvero sostituire l'attuale contenuto?"
seasonalScreenEffect: "Schermate in base alla stagione" seasonalScreenEffect: "Schermate in base alla stagione"
decorate: "Decora" decorate: "Decora"
lastNDays: "Ultimi {n} giorni"
_announcement: _announcement:
forExistingUsers: "Solo ai profili attuali" forExistingUsers: "Solo ai profili attuali"
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio." forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
@ -2056,6 +2061,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "Tutte le note" allNotes: "Tutte le note"
favoritedNotes: "Note preferite" favoritedNotes: "Note preferite"
clips: "Clip"
followingList: "Follow" followingList: "Follow"
muteList: "Elenco profili silenziati" muteList: "Elenco profili silenziati"
blockingList: "Elenco profili bloccati" blockingList: "Elenco profili bloccati"
@ -2353,3 +2359,6 @@ _dataSaver:
_code: _code:
title: "Codice evidenziato" title: "Codice evidenziato"
description: "Impedire che il codice sorgente sia automaticamente evidenziato. Evidenziare il codice richiede il caricamento di un file per ogni linguaggio. Puoi evidenziare soltanto il codice che intendi leggere e ridurre il traffico inutilizzato." description: "Impedire che il codice sorgente sia automaticamente evidenziato. Evidenziare il codice richiede il caricamento di un file per ogni linguaggio. Puoi evidenziare soltanto il codice che intendi leggere e ridurre il traffico inutilizzato."
_reversi:
total: "Totale"

View file

@ -15,7 +15,7 @@ gotIt: "わかった"
cancel: "キャンセル" cancel: "キャンセル"
noThankYou: "やめておく" noThankYou: "やめておく"
enterUsername: "ユーザー名を入力" enterUsername: "ユーザー名を入力"
renotedBy: "{user}がリノート" renotedBy: "{user}がブースト"
noNotes: "ノートはありません" noNotes: "ノートはありません"
noNotifications: "通知はありません" noNotifications: "通知はありません"
instance: "サーバー" instance: "サーバー"
@ -46,16 +46,16 @@ pin: "ピン留め"
unpin: "ピン留め解除" unpin: "ピン留め解除"
copyContent: "内容をコピー" copyContent: "内容をコピー"
copyLink: "リンクをコピー" copyLink: "リンクをコピー"
copyLinkRenote: "リノートのリンクをコピー" copyLinkRenote: "ブーストのリンクをコピー"
delete: "削除" delete: "削除"
deleteAndEdit: "削除して編集" deleteAndEdit: "削除して編集"
deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、リノート、返信も全て削除されます。" deleteAndEditConfirm: "このノートを削除してもう一度編集しますか?このノートへのリアクション、ブースト、返信も全て削除されます。"
addToList: "リストに追加" addToList: "リストに追加"
addToAntenna: "アンテナに追加" addToAntenna: "アンテナに追加"
sendMessage: "メッセージを送信" sendMessage: "メッセージを送信"
copyRSS: "RSSをコピー" copyRSS: "RSSをコピー"
copyUsername: "ユーザー名をコピー" copyUsername: "ユーザー名をコピー"
openRemoteProfile: "リモートプロファイルを開く" openRemoteProfile: "リモートプロフィールを開く"
copyUserId: "ユーザーIDをコピー" copyUserId: "ユーザーIDをコピー"
copyNoteId: "ートIDをコピー" copyNoteId: "ートIDをコピー"
copyFileId: "ファイルIDをコピー" copyFileId: "ファイルIDをコピー"
@ -107,15 +107,15 @@ followRequests: "フォロー申請"
unfollow: "フォロー解除" unfollow: "フォロー解除"
followRequestPending: "フォロー許可待ち" followRequestPending: "フォロー許可待ち"
enterEmoji: "絵文字を入力" enterEmoji: "絵文字を入力"
renote: "リノート" renote: "ブースト"
unrenote: "リノート解除" unrenote: "ブースト解除"
renoted: "ブースト。" renoted: "ブーストしました。"
quoted: "引用。" quoted: "引用。"
rmboost: "アンブースト。" rmboost: "ブースト解除しました。"
cantRenote: "この投稿はリノートできません。" cantRenote: "この投稿はブーストできません。"
cantReRenote: "リノートをリノートすることはできません。" cantReRenote: "ブーストをブーストすることはできません。"
quote: "引用" quote: "引用"
inChannelRenote: "チャンネル内リノート" inChannelRenote: "チャンネル内ブースト"
inChannelQuote: "チャンネル内引用" inChannelQuote: "チャンネル内引用"
pinnedNote: "ピン留めされたノート" pinnedNote: "ピン留めされたノート"
pinned: "ピン留め" pinned: "ピン留め"
@ -134,13 +134,14 @@ overwriteFromPinnedEmojis: "全般設定から上書きする"
reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。" reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。"
rememberNoteVisibility: "公開範囲を記憶する" rememberNoteVisibility: "公開範囲を記憶する"
attachCancel: "添付取り消し" attachCancel: "添付取り消し"
deleteFile: "ファイルを削除"
markAsSensitive: "センシティブとして設定" markAsSensitive: "センシティブとして設定"
unmarkAsSensitive: "センシティブを解除する" unmarkAsSensitive: "センシティブを解除する"
enterFileName: "ファイル名を入力" enterFileName: "ファイル名を入力"
mute: "ミュート" mute: "ミュート"
unmute: "ミュート解除" unmute: "ミュート解除"
renoteMute: "リノートをミュート" renoteMute: "ブーストをミュート"
renoteUnmute: "リノートのミュートを解除" renoteUnmute: "ブーストのミュートを解除"
block: "ブロック" block: "ブロック"
unblock: "ブロック解除" unblock: "ブロック解除"
markAsNSFW: "ユーザーのすべてのメディアをNSFWとしてマークする" markAsNSFW: "ユーザーのすべてのメディアをNSFWとしてマークする"
@ -209,8 +210,8 @@ charts: "チャート"
perHour: "1時間ごと" perHour: "1時間ごと"
perDay: "1日ごと" perDay: "1日ごと"
stopActivityDelivery: "アクティビティの配送を停止" stopActivityDelivery: "アクティビティの配送を停止"
blockThisInstance: "このサーバーをブロック" blockThisInstance: "このインスタンスをブロック"
silenceThisInstance: "サーバーをサイレンス" silenceThisInstance: "インスタンスをサイレンス"
operations: "操作" operations: "操作"
software: "ソフトウェア" software: "ソフトウェア"
version: "バージョン" version: "バージョン"
@ -231,7 +232,7 @@ clearCachedFilesConfirm: "キャッシュされたリモートファイルをす
blockedInstances: "ブロックしたサーバー" blockedInstances: "ブロックしたサーバー"
blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定します。ブロックされたサーバーは、このインスタンスとやり取りできなくなります。" blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定します。ブロックされたサーバーは、このインスタンスとやり取りできなくなります。"
silencedInstances: "サイレンスしたサーバー" silencedInstances: "サイレンスしたサーバー"
silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなります。ブロックしたインスタンスには影響しません。" silencedInstancesDescription: "サイレンスしたいインスタンスのホストを改行で区切って設定します。サイレンスされたインスタンスに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなります。ブロックしたインスタンスには影響しません。"
muteAndBlock: "ミュートとブロック" muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしたユーザー" mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー" blockedUsers: "ブロックしたユーザー"
@ -390,6 +391,11 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptchaを有効にする" enableHcaptcha: "hCaptchaを有効にする"
hcaptchaSiteKey: "サイトキー" hcaptchaSiteKey: "サイトキー"
hcaptchaSecretKey: "シークレットキー" hcaptchaSecretKey: "シークレットキー"
mcaptcha: "mCaptcha"
enableMcaptcha: "mCaptchaを有効にする"
mcaptchaSiteKey: "サイトキー"
mcaptchaSecretKey: "シークレットキー"
mcaptchaInstanceUrl: "mCaptchaのインスタンスのURL"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHAを有効にする" enableRecaptcha: "reCAPTCHAを有効にする"
recaptchaSiteKey: "サイトキー" recaptchaSiteKey: "サイトキー"
@ -640,6 +646,7 @@ medium: "中"
small: "小" small: "小"
generateAccessToken: "アクセストークンの発行" generateAccessToken: "アクセストークンの発行"
permission: "権限" permission: "権限"
adminPermission: "管理者権限"
enableAll: "全て有効にする" enableAll: "全て有効にする"
disableAll: "全て無効にする" disableAll: "全て無効にする"
tokenRequested: "アカウントへのアクセス許可" tokenRequested: "アカウントへのアクセス許可"
@ -683,13 +690,14 @@ useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使
other: "その他" other: "その他"
regenerateLoginToken: "ログイントークンを再生成" regenerateLoginToken: "ログイントークンを再生成"
regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。" regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。"
theKeywordWhenSearchingForCustomEmoji: "カスタム絵文字を検索する時のキーワードになります。"
setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。" setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。"
fileIdOrUrl: "ファイルIDまたはURL" fileIdOrUrl: "ファイルIDまたはURL"
behavior: "動作" behavior: "動作"
sample: "サンプル" sample: "サンプル"
abuseReports: "通報" abuseReports: "通報"
reportAbuse: "通報" reportAbuse: "通報"
reportAbuseRenote: "リノートを通報" reportAbuseRenote: "ブーストを通報"
reportAbuseOf: "{name}を通報する" reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のートがある場合はそのURLも記入してください。" fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のートがある場合はそのURLも記入してください。"
abuseReported: "内容が送信されました。ご報告ありがとうございました。" abuseReported: "内容が送信されました。ご報告ありがとうございました。"
@ -723,9 +731,9 @@ manageAccessTokens: "アクセストークンの管理"
accountInfo: "アカウント情報" accountInfo: "アカウント情報"
notesCount: "ノートの数" notesCount: "ノートの数"
repliesCount: "返信した数" repliesCount: "返信した数"
renotesCount: "リノートした数" renotesCount: "ブーストした数"
repliedCount: "返信された数" repliedCount: "返信された数"
renotedCount: "リノートされた数" renotedCount: "ブーストされた数"
followingCount: "フォロー数" followingCount: "フォロー数"
followersCount: "フォロワー数" followersCount: "フォロワー数"
sentReactionsCount: "リアクションした数" sentReactionsCount: "リアクションした数"
@ -959,6 +967,10 @@ numberOfPageCache: "ページキャッシュ数"
numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。" numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。"
numberOfReplies: "スレッド内の返信数" numberOfReplies: "スレッド内の返信数"
numberOfRepliesDescription: "この数値を大きくすると、より多くの返信が表示されます。この値を大きくしすぎると、返信が窮屈になり、読めなくなることがあります。" numberOfRepliesDescription: "この数値を大きくすると、より多くの返信が表示されます。この値を大きくしすぎると、返信が窮屈になり、読めなくなることがあります。"
boostSettings: "ブースト設定"
showVisibilitySelectorOnBoost: "可視性セレクタを表示"
showVisibilitySelectorOnBoostDescription: "無効の場合、以下で定義されるデフォルトの可視性が使用され、セレクタは表示されません。"
visibilityOnBoost: "デフォルトのブースト可視性の設定"
logoutConfirm: "ログアウトしますか?" logoutConfirm: "ログアウトしますか?"
lastActiveDate: "最終利用日時" lastActiveDate: "最終利用日時"
statusbar: "ステータスバー" statusbar: "ステータスバー"
@ -1010,6 +1022,7 @@ neverShow: "今後表示しない"
remindMeLater: "また後で" remindMeLater: "また後で"
didYouLikeMisskey: "Sharkeyを気に入っていただけましたか" didYouLikeMisskey: "Sharkeyを気に入っていただけましたか"
pleaseDonate: "Sharkeyは{host}が使用している無料のソフトウェアです。これからも開発を続けられるように、ぜひ寄付をお願いします!" pleaseDonate: "Sharkeyは{host}が使用している無料のソフトウェアです。これからも開発を続けられるように、ぜひ寄付をお願いします!"
pleaseDonateInstance: "インスタンス管理者への寄付によって{host}を直接サポートすることもできます。"
roles: "ロール" roles: "ロール"
role: "ロール" role: "ロール"
noRole: "ロールはありません" noRole: "ロールはありません"
@ -1036,7 +1049,7 @@ thisPostMayBeAnnoying: "この投稿は迷惑になる可能性があります
thisPostMayBeAnnoyingHome: "ホームに投稿" thisPostMayBeAnnoyingHome: "ホームに投稿"
thisPostMayBeAnnoyingCancel: "やめる" thisPostMayBeAnnoyingCancel: "やめる"
thisPostMayBeAnnoyingIgnore: "このまま投稿" thisPostMayBeAnnoyingIgnore: "このまま投稿"
collapseRenotes: "見たことのあるリノートを省略して表示" collapseRenotes: "見たことのあるブーストを省略して表示"
collapseFiles: "ファイルを折りたたむ" collapseFiles: "ファイルを折りたたむ"
autoloadConversation: "返信に会話を読み込む" autoloadConversation: "返信に会話を読み込む"
internalServerError: "サーバー内部エラー" internalServerError: "サーバー内部エラー"
@ -1081,6 +1094,8 @@ limitWidthOfReaction: "リアクションの最大横幅を制限し、縮小し
noteIdOrUrl: "ートIDまたはURL" noteIdOrUrl: "ートIDまたはURL"
video: "動画" video: "動画"
videos: "動画" videos: "動画"
audio: "音声"
audioFiles: "音声"
dataSaver: "データセーバー" dataSaver: "データセーバー"
accountMigration: "アカウントの移行" accountMigration: "アカウントの移行"
accountMoved: "このユーザーは新しいアカウントに移行しました:" accountMoved: "このユーザーは新しいアカウントに移行しました:"
@ -1090,7 +1105,7 @@ forceShowAds: "常に広告を表示する"
addMemo: "メモを追加" addMemo: "メモを追加"
editMemo: "メモを編集" editMemo: "メモを編集"
reactionsList: "リアクション一覧" reactionsList: "リアクション一覧"
renotesList: "リノート一覧" renotesList: "ブースト一覧"
notificationDisplay: "通知の表示" notificationDisplay: "通知の表示"
leftTop: "左上" leftTop: "左上"
rightTop: "右上" rightTop: "右上"
@ -1132,9 +1147,9 @@ installed: "インストール済み"
branding: "ブランディング" branding: "ブランディング"
enableServerMachineStats: "サーバーのマシン情報を公開する" enableServerMachineStats: "サーバーのマシン情報を公開する"
enableAchievements: "実績を有効にする" enableAchievements: "実績を有効にする"
turnOffAchievements: "これをオフにすると、達成システムは無効になります。" turnOffAchievements: "オフにすると実績システムは無効になります。"
enableBotTrending: "ハッシュタグにボットを追加する" enableBotTrending: "botのハッシュタグ追加を許可する"
turnOffBotTrending: "これをオフにするとボットがハッシュタグを入力しなくなります。" turnOffBotTrending: "オフにするとボットがハッシュタグを入力しなくなります。"
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。" turnOffToImprovePerformance: "オフにするとパフォーマンスが向上します。"
createInviteCode: "招待コードを作成" createInviteCode: "招待コードを作成"
@ -1165,7 +1180,7 @@ pastAnnouncements: "過去のお知らせ"
youHaveUnreadAnnouncements: "未読のお知らせがあります。" youHaveUnreadAnnouncements: "未読のお知らせがあります。"
useSecurityKey: "ブラウザまたはデバイスの指示に従って、セキュリティキーまたはパスキーを使用してください。" useSecurityKey: "ブラウザまたはデバイスの指示に従って、セキュリティキーまたはパスキーを使用してください。"
replies: "返信" replies: "返信"
renotes: "リノート" renotes: "ブースト"
loadReplies: "返信を見る" loadReplies: "返信を見る"
loadConversation: "会話を見る" loadConversation: "会話を見る"
pinnedList: "ピン留めされたリスト" pinnedList: "ピン留めされたリスト"
@ -1178,7 +1193,7 @@ unnotifyNotes: "投稿の通知を解除"
authentication: "認証" authentication: "認証"
authenticationRequiredToContinue: "続けるには認証を行ってください" authenticationRequiredToContinue: "続けるには認証を行ってください"
dateAndTime: "日時" dateAndTime: "日時"
showRenotes: "リノートを表示" showRenotes: "ブーストを表示"
edited: "編集済み" edited: "編集済み"
notificationRecieveConfig: "通知の受信設定" notificationRecieveConfig: "通知の受信設定"
mutualFollow: "相互フォロー" mutualFollow: "相互フォロー"
@ -1196,6 +1211,8 @@ impressumDescription: "ドイツなどの一部の国と地域では表示が義
privacyPolicy: "プライバシーポリシー" privacyPolicy: "プライバシーポリシー"
privacyPolicyUrl: "プライバシーポリシーURL" privacyPolicyUrl: "プライバシーポリシーURL"
tosAndPrivacyPolicy: "利用規約・プライバシーポリシー" tosAndPrivacyPolicy: "利用規約・プライバシーポリシー"
donation: "寄付する"
donationUrl: "寄付URL"
avatarDecorations: "アイコンデコレーション" avatarDecorations: "アイコンデコレーション"
attach: "付ける" attach: "付ける"
detach: "外す" detach: "外す"
@ -1219,6 +1236,26 @@ seasonalScreenEffect: "季節に応じた画面の演出"
decorate: "デコる" decorate: "デコる"
addMfmFunction: "装飾を追加" addMfmFunction: "装飾を追加"
enableQuickAddMfmFunction: "高度なMFMのピッカーを表示する" enableQuickAddMfmFunction: "高度なMFMのピッカーを表示する"
bubbleGame: "バブルゲーム"
sfx: "効果音"
soundWillBePlayed: "サウンドが再生されます"
showReplay: "リプレイを見る"
replay: "リプレイ"
replaying: "リプレイ中"
ranking: "ランキング"
lastNDays: "直近{n}日"
backToTitle: "タイトルへ"
hemisphere: "お住まいの地域"
withSensitive: "センシティブなファイルを含むノートを表示"
userSaysSomethingSensitive: "{name}のセンシティブなファイルを含む投稿"
enableHorizontalSwipe: "スワイプしてタブを切り替える"
_bubbleGame:
howToPlay: "遊び方"
_howToPlay:
section1: "位置を調整してハコにモノを落とします。"
section2: "同じ種類のモノがくっつくと別のモノに変化して、スコアが得られます。"
section3: "モノがハコからあふれるとゲームオーバーです。ハコからあふれないようにしつつモノを融合させてハイスコアを目指そう!"
_announcement: _announcement:
forExistingUsers: "既存ユーザーのみ" forExistingUsers: "既存ユーザーのみ"
@ -1288,8 +1325,8 @@ _initialTutorial:
_visibility: _visibility:
description: "ノートを表示できる相手を制限できます。" description: "ノートを表示できる相手を制限できます。"
public: "すべてのユーザーに公開。" public: "すべてのユーザーに公開。"
home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・リノートから、他のユーザーも見ることができます。" home: "ホームタイムラインのみに公開。フォロワー・プロフィールを見に来た人・ブーストから、他のユーザーも見ることができます。"
followers: "フォロワーにのみ公開。本人以外がリノートすることはできず、またフォロワー以外は閲覧できません。" followers: "フォロワーにのみ公開。本人以外がブーストすることはできず、またフォロワー以外は閲覧できません。"
direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。" direct: "指定したユーザーにのみ公開され、また相手に通知が入ります。ダイレクトメッセージのかわりにお使いいただけます。"
doNotSendConfidencialOnDirect1: "機密情報は送信する際は注意してください。" doNotSendConfidencialOnDirect1: "機密情報は送信する際は注意してください。"
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。" doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容を見ることが可能なので、信頼できないサーバーのユーザーにダイレクト投稿を送信する場合は、機密情報の扱いに注意が必要です。"
@ -1597,6 +1634,13 @@ _achievements:
_tutorialCompleted: _tutorialCompleted:
title: "Sharkey初心者講座 修了証" title: "Sharkey初心者講座 修了証"
description: "チュートリアルを完了した" description: "チュートリアルを完了した"
_bubbleGameExplodingHead:
title: "🤯"
description: "バブルゲームで最も大きいモノを出した"
_bubbleGameDoubleExplodingHead:
title: "ダブル🤯"
description: "バブルゲームで最も大きいモを2つ同時に出した"
flavor: "これくらいの おべんとばこに 🤯 🤯 ちょっとつめて"
_role: _role:
new: "ロールの作成" new: "ロールの作成"
@ -1636,7 +1680,7 @@ _role:
high: "高" high: "高"
_options: _options:
gtlAvailable: "グローバルタイムラインの閲覧" gtlAvailable: "グローバルタイムラインの閲覧"
btlAvailable: "バブルのタイムラインを見ることができる" btlAvailable: "バブルタイムラインの閲覧"
ltlAvailable: "ローカルタイムラインの閲覧" ltlAvailable: "ローカルタイムラインの閲覧"
canPublicNote: "パブリック投稿の許可" canPublicNote: "パブリック投稿の許可"
canImportNotes: "ノートのインポートが可能" canImportNotes: "ノートのインポートが可能"
@ -1774,7 +1818,7 @@ _registry:
createKey: "キーを作成" createKey: "キーを作成"
_aboutMisskey: _aboutMisskey:
about: "Sharkeyは、2014年からsyuiloによって開発されているMisskeyをベースにしたオープンソースのソフトウェアです。" about: "Sharkeyは、Misskeyをベースにしたオープンソースのソフトウェアです。"
contributors: "主なコントリビューター" contributors: "主なコントリビューター"
allContributors: "全てのコントリビューター" allContributors: "全てのコントリビューター"
source: "ソースコード" source: "ソースコード"
@ -1812,7 +1856,7 @@ _channel:
notesCount: "{n}投稿があります" notesCount: "{n}投稿があります"
nameAndDescription: "名前と説明" nameAndDescription: "名前と説明"
nameOnly: "名前のみ" nameOnly: "名前のみ"
allowRenoteToExternal: "チャンネル外へのリノートと引用リノートを許可する" allowRenoteToExternal: "チャンネル外へのブーストと引用ブーストを許可する"
_menuDisplay: _menuDisplay:
sideFull: "横" sideFull: "横"
@ -1826,7 +1870,7 @@ _wordMute:
muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。" muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。"
_instanceMute: _instanceMute:
instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したサーバーの全てのノートとRenoteをミュートします。" instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したサーバーの全てのノートとブーストをミュートします。"
instanceMuteDescription2: "改行で区切って設定します" instanceMuteDescription2: "改行で区切って設定します"
title: "設定したサーバーのノートを隠します。" title: "設定したサーバーのノートを隠します。"
heading: "ミュートするサーバー" heading: "ミュートするサーバー"
@ -1880,7 +1924,7 @@ _theme:
hashtag: "ハッシュタグ" hashtag: "ハッシュタグ"
mention: "メンション" mention: "メンション"
mentionMe: "あなた宛てメンション" mentionMe: "あなた宛てメンション"
renote: "Renote" renote: "Boost"
modalBg: "モーダルの背景" modalBg: "モーダルの背景"
divider: "分割線" divider: "分割線"
scrollbarHandle: "スクロールバーの取っ手" scrollbarHandle: "スクロールバーの取っ手"
@ -2190,13 +2234,18 @@ _profile:
metadataContent: "内容" metadataContent: "内容"
changeAvatar: "アイコン画像を変更" changeAvatar: "アイコン画像を変更"
changeBanner: "バナー画像を変更" changeBanner: "バナー画像を変更"
updateBanner: "更新バナー"
removeBanner: "バナーを削除"
changeBackground: "背景を変更する" changeBackground: "背景を変更する"
updateBackground: "背景を更新する"
removeBackground: "背景を削除する"
verifiedLinkDescription: "内容にURLを設定すると、リンク先のWebサイトに自分のプロフィールへのリンクが含まれている場合に所有者確認済みアイコンを表示させることができます。" verifiedLinkDescription: "内容にURLを設定すると、リンク先のWebサイトに自分のプロフィールへのリンクが含まれている場合に所有者確認済みアイコンを表示させることができます。"
avatarDecorationMax: "最大{max}つまでデコレーションを付けられます。" avatarDecorationMax: "最大{max}つまでデコレーションを付けられます。"
_exportOrImport: _exportOrImport:
allNotes: "全てのノート" allNotes: "全てのノート"
favoritedNotes: "お気に入りにしたノート" favoritedNotes: "お気に入りにしたノート"
clips: "クリップ"
followingList: "フォロー" followingList: "フォロー"
muteList: "ミュート" muteList: "ミュート"
blockingList: "ブロック" blockingList: "ブロック"
@ -2316,7 +2365,7 @@ _notification:
youGotMention: "{name}からのメンション" youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ" youGotReply: "{name}からのリプライ"
youGotQuote: "{name}による引用" youGotQuote: "{name}による引用"
youRenoted: "{name}がRenoteしました" youRenoted: "{name}がBoostしました"
youWereFollowed: "フォローされました" youWereFollowed: "フォローされました"
youReceivedFollowRequest: "フォローリクエストが来ました" youReceivedFollowRequest: "フォローリクエストが来ました"
yourFollowRequestAccepted: "フォローリクエストが承認されました" yourFollowRequestAccepted: "フォローリクエストが承認されました"
@ -2331,7 +2380,7 @@ _notification:
sendTestNotification: "テスト通知を送信する" sendTestNotification: "テスト通知を送信する"
notificationWillBeDisplayedLikeThis: "通知はこのように表示されます" notificationWillBeDisplayedLikeThis: "通知はこのように表示されます"
reactedBySomeUsers: "{n}人がリアクションしました" reactedBySomeUsers: "{n}人がリアクションしました"
renotedBySomeUsers: "{n}人がリノートしました" renotedBySomeUsers: "{n}人がブーストしました"
followedBySomeUsers: "{n}人にフォローされました" followedBySomeUsers: "{n}人にフォローされました"
_types: _types:
@ -2340,7 +2389,7 @@ _notification:
follow: "フォロー" follow: "フォロー"
mention: "メンション" mention: "メンション"
reply: "リプライ" reply: "リプライ"
renote: "Renote" renote: "Boost"
quote: "引用" quote: "引用"
reaction: "リアクション" reaction: "リアクション"
pollEnded: "アンケートが終了" pollEnded: "アンケートが終了"
@ -2353,7 +2402,7 @@ _notification:
_actions: _actions:
followBack: "フォローバック" followBack: "フォローバック"
reply: "返信" reply: "返信"
renote: "Renote" renote: "Boost"
_deck: _deck:
alwaysShowMainColumn: "常にメインカラムを表示" alwaysShowMainColumn: "常にメインカラムを表示"
@ -2411,7 +2460,7 @@ _webhookSettings:
followed: "フォローされたとき" followed: "フォローされたとき"
note: "ノートを投稿したとき" note: "ノートを投稿したとき"
reply: "返信されたとき" reply: "返信されたとき"
renote: "Renoteされたとき" renote: "Boostされたとき"
reaction: "リアクションがあったとき" reaction: "リアクションがあったとき"
mention: "メンションされたとき" mention: "メンションされたとき"
@ -2508,13 +2557,13 @@ _animatedMFM:
play: "MFMアニメーションを再生" play: "MFMアニメーションを再生"
stop: "MFMアニメーション停止" stop: "MFMアニメーション停止"
_alert: _alert:
text: "アニメーションMFMには、点滅するライトや高速で動くテキスト/絵文字を含めることができる。" text: "MFMアニメーションには、点滅するライトや高速で動くテキスト/絵文字を含まれる場合があります。"
confirm: "アニメイト" confirm: "再生する"
_dataRequest: _dataRequest:
title: "リクエストデータ" title: "データリクエスト"
warn: "データのリクエストは3日ごとにしかできない。" warn: "データリクエストは3日ごとに可能です。"
text: "データのダウンロードが完了すると、このアカウントに登録されているEメールアドレスにEメールが送信されます。" text: "データの保存が完了すると、このアカウントに登録されているEメールアドレスにメールが送信されます。"
button: "リクエスト" button: "リクエスト"
_dataSaver: _dataSaver:
@ -2530,3 +2579,56 @@ _dataSaver:
_code: _code:
title: "コードハイライト" title: "コードハイライト"
description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。" description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。"
_hemisphere:
N: "北半球"
S: "南半球"
caption: "一部のクライアント設定で、季節を判定するために使用します。"
_reversi:
reversi: "リバーシ"
gameSettings: "対局の設定"
chooseBoard: "ボードを選択"
blackOrWhite: "先行/後攻"
blackIs: "{name}が黒(先行)"
rules: "ルール"
thisGameIsStartedSoon: "対局はまもなく開始されます"
waitingForOther: "相手の準備が完了するのを待っています"
waitingForMe: "あなたの準備が完了するのを待っています"
waitingBoth: "準備してください"
ready: "準備完了"
cancelReady: "準備を再開"
opponentTurn: "相手のターンです"
myTurn: "あなたのターンです"
turnOf: "{name}のターンです"
pastTurnOf: "{name}のターン"
surrender: "投了"
surrendered: "投了により"
timeout: "時間切れ"
drawn: "引き分け"
won: "{name}の勝ち"
black: "黒"
white: "白"
total: "合計"
turnCount: "{count}ターン目"
myGames: "自分の対局"
allGames: "みんなの対局"
ended: "終了"
playing: "対局中"
isLlotheo: "石の少ない方が勝ち(ロセオ)"
loopedMap: "ループマップ"
canPutEverywhere: "どこでも置けるモード"
timeLimitForEachTurn: "1ターンの時間制限"
freeMatch: "フリーマッチ"
lookingForPlayer: "対戦相手を探しています"
gameCanceled: "対局がキャンセルされました"
shareToTlTheGameWhenStart: "開始時に対局をタイムラインに投稿"
iStartedAGame: "対局を開始しました! #MisskeyReversi"
opponentHasSettingsChanged: "相手が設定を変更しました"
allowIrregularRules: "変則許可 (完全フリー)"
disallowIrregularRules: "変則なし"
_offlineScreen:
title: "オフライン - サーバーに接続できません"
header: "サーバーに接続できません"

View file

@ -15,7 +15,7 @@ gotIt: "ほい"
cancel: "やめとく" cancel: "やめとく"
noThankYou: "やめとく" noThankYou: "やめとく"
enterUsername: "ユーザー名を入れてや" enterUsername: "ユーザー名を入れてや"
renotedBy: "{user}がリノートしたで" renotedBy: "{user}がブーストしたで"
noNotes: "ノートはあらへん" noNotes: "ノートはあらへん"
noNotifications: "通知はあらへん" noNotifications: "通知はあらへん"
instance: "サーバー" instance: "サーバー"
@ -45,10 +45,10 @@ pin: "ピン留めしとく"
unpin: "やっぱピン留めせん" unpin: "やっぱピン留めせん"
copyContent: "内容をコピー" copyContent: "内容をコピー"
copyLink: "リンクをコピー" copyLink: "リンクをコピー"
copyLinkRenote: "リノートのリンクをコピーするで?" copyLinkRenote: "ブーストのリンクをコピーするで?"
delete: "ほかす" delete: "ほかす"
deleteAndEdit: "ほかして直す" deleteAndEdit: "ほかして直す"
deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、リノート、返信も全部消えるんやけどそれでもええん?" deleteAndEditConfirm: "このノートをほかしてもっかい直す?このノートへのツッコミ、ブースト、返信も全部消えるんやけどそれでもええん?"
addToList: "リストに入れたる" addToList: "リストに入れたる"
addToAntenna: "アンテナに入れる" addToAntenna: "アンテナに入れる"
sendMessage: "メッセージを送る" sendMessage: "メッセージを送る"
@ -105,13 +105,13 @@ followRequests: "フォロー申請"
unfollow: "フォローやめる" unfollow: "フォローやめる"
followRequestPending: "フォロー許してくれるん待っとる" followRequestPending: "フォロー許してくれるん待っとる"
enterEmoji: "絵文字を入れてや" enterEmoji: "絵文字を入れてや"
renote: "リノート" renote: "ブースト"
unrenote: "リノートやめる" unrenote: "ブーストやめる"
renoted: "リノートしたで。" renoted: "ブーストしたで。"
cantRenote: "この投稿はリノートできへんっぽい。" cantRenote: "この投稿はブーストできへんっぽい。"
cantReRenote: "リノート自体はリノートできへんで。" cantReRenote: "ブースト自体はブーストできへんで。"
quote: "引用" quote: "引用"
inChannelRenote: "チャンネルの中でリノート" inChannelRenote: "チャンネルの中でブースト"
inChannelQuote: "チャンネル内引用" inChannelQuote: "チャンネル内引用"
pinnedNote: "ピン留めされとるノート" pinnedNote: "ピン留めされとるノート"
pinned: "ピン留めしとく" pinned: "ピン留めしとく"
@ -130,13 +130,14 @@ overwriteFromPinnedEmojis: "全般設定から上書きする"
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。" reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
rememberNoteVisibility: "公開範囲覚えといて" rememberNoteVisibility: "公開範囲覚えといて"
attachCancel: "のっけるのやめる" attachCancel: "のっけるのやめる"
deleteFile: "ファイルをほかす"
markAsSensitive: "ちょっとこれはアカン" markAsSensitive: "ちょっとこれはアカン"
unmarkAsSensitive: "そこまでアカンことないやろ" unmarkAsSensitive: "そこまでアカンことないやろ"
enterFileName: "ファイル名を入れてや" enterFileName: "ファイル名を入れてや"
mute: "ミュート" mute: "ミュート"
unmute: "ミュートやめたる" unmute: "ミュートやめたる"
renoteMute: "リノートは見いひん" renoteMute: "ブーストは見いひん"
renoteUnmute: "リノートもやっぱ見るわ" renoteUnmute: "ブーストもやっぱ見るわ"
block: "ブロック" block: "ブロック"
unblock: "ブロックやめたる" unblock: "ブロックやめたる"
suspend: "凍結" suspend: "凍結"
@ -381,6 +382,11 @@ hcaptcha: "hCaptchaキャプチャ"
enableHcaptcha: "hCaptchaキャプチャをつけとく" enableHcaptcha: "hCaptchaキャプチャをつけとく"
hcaptchaSiteKey: "サイトキー" hcaptchaSiteKey: "サイトキー"
hcaptchaSecretKey: "シークレットキー" hcaptchaSecretKey: "シークレットキー"
mcaptcha: "mCaptcha"
enableMcaptcha: "hCaptchaキャプチャをつけとく"
mcaptchaSiteKey: "サイトキー"
mcaptchaSecretKey: "シークレットキー"
mcaptchaInstanceUrl: "mCaptchaのインスタンスのURL"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHAリキャプチャを有効にする" enableRecaptcha: "reCAPTCHAリキャプチャを有効にする"
recaptchaSiteKey: "サイトキー" recaptchaSiteKey: "サイトキー"
@ -628,6 +634,7 @@ medium: "中"
small: "小" small: "小"
generateAccessToken: "アクセストークンの発行" generateAccessToken: "アクセストークンの発行"
permission: "権限" permission: "権限"
adminPermission: "管理者権限"
enableAll: "全部使えるようにする" enableAll: "全部使えるようにする"
disableAll: "全部使えへんようにする" disableAll: "全部使えへんようにする"
tokenRequested: "アカウントへのアクセス許してやったらどうや" tokenRequested: "アカウントへのアクセス許してやったらどうや"
@ -671,13 +678,14 @@ useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使
other: "その他" other: "その他"
regenerateLoginToken: "ログイントークンを再生成" regenerateLoginToken: "ログイントークンを再生成"
regenerateLoginTokenDescription: "ログインに使われる内部トークンをもっかい作るで。いつもならこれをやる必要はないで。もっかい作ると、全部のデバイスでログアウトされるで気ぃつけてなー。" regenerateLoginTokenDescription: "ログインに使われる内部トークンをもっかい作るで。いつもならこれをやる必要はないで。もっかい作ると、全部のデバイスでログアウトされるで気ぃつけてなー。"
theKeywordWhenSearchingForCustomEmoji: "カスタム絵文字を探すときのキーワードになるで。"
setMultipleBySeparatingWithSpace: "スペースで区切って何個でも設定できるで。" setMultipleBySeparatingWithSpace: "スペースで区切って何個でも設定できるで。"
fileIdOrUrl: "ファイルIDかURL" fileIdOrUrl: "ファイルIDかURL"
behavior: "動作" behavior: "動作"
sample: "サンプル" sample: "サンプル"
abuseReports: "通報" abuseReports: "通報"
reportAbuse: "通報" reportAbuse: "通報"
reportAbuseRenote: "リノート苦情だすで?" reportAbuseRenote: "ブースト苦情だすで?"
reportAbuseOf: "{name}を通報する" reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ートがある時はそのURLも書いといてなー。" fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ートがある時はそのURLも書いといてなー。"
abuseReported: "無事内容が送信されたみたいやで。おおきに〜。" abuseReported: "無事内容が送信されたみたいやで。おおきに〜。"
@ -711,9 +719,9 @@ manageAccessTokens: "アクセストークンの管理"
accountInfo: "アカウント情報" accountInfo: "アカウント情報"
notesCount: "ノートの数やで" notesCount: "ノートの数やで"
repliesCount: "返信した数やで" repliesCount: "返信した数やで"
renotesCount: "リノートした数やで" renotesCount: "ブーストした数やで"
repliedCount: "返信された数やで" repliedCount: "返信された数やで"
renotedCount: "リノートされた数やで" renotedCount: "ブーストされた数やで"
followingCount: "フォロー数やで" followingCount: "フォロー数やで"
followersCount: "フォロワー数やで" followersCount: "フォロワー数やで"
sentReactionsCount: "ツッコんだ数" sentReactionsCount: "ツッコんだ数"
@ -883,6 +891,8 @@ makeReactionsPublicDescription: "あんたがしたツッコミ一覧を誰で
classic: "クラシック" classic: "クラシック"
muteThread: "スレッドをミュート" muteThread: "スレッドをミュート"
unmuteThread: "スレッドのミュートを解除" unmuteThread: "スレッドのミュートを解除"
followingVisibility: "フォローの公開範囲"
followersVisibility: "フォロワーの公開範囲"
continueThread: "さらにスレッドを見るで" continueThread: "さらにスレッドを見るで"
deleteAccountConfirm: "アカウントを消すで?ええんか?" deleteAccountConfirm: "アカウントを消すで?ええんか?"
incorrectPassword: "パスワードがちゃうわ。" incorrectPassword: "パスワードがちゃうわ。"
@ -1009,7 +1019,7 @@ thisPostMayBeAnnoying: "この投稿は迷惑かもしらんで。"
thisPostMayBeAnnoyingHome: "ホームに投稿" thisPostMayBeAnnoyingHome: "ホームに投稿"
thisPostMayBeAnnoyingCancel: "やめとく" thisPostMayBeAnnoyingCancel: "やめとく"
thisPostMayBeAnnoyingIgnore: "このまま投稿" thisPostMayBeAnnoyingIgnore: "このまま投稿"
collapseRenotes: "見たことあるリノートは飛ばして表示するで" collapseRenotes: "見たことあるブーストは飛ばして表示するで"
internalServerError: "サーバー内部エラー" internalServerError: "サーバー内部エラー"
internalServerErrorDescription: "サーバーでなんか変なこと起こっとるわ。" internalServerErrorDescription: "サーバーでなんか変なこと起こっとるわ。"
copyErrorInfo: "エラー情報をコピるで" copyErrorInfo: "エラー情報をコピるで"
@ -1051,6 +1061,8 @@ limitWidthOfReaction: "ツッコミの最大横幅を制限して、ちっさく
noteIdOrUrl: "ートIDかURL" noteIdOrUrl: "ートIDかURL"
video: "動画" video: "動画"
videos: "動画" videos: "動画"
audio: "音声"
audioFiles: "音声"
dataSaver: "データケチケチ" dataSaver: "データケチケチ"
accountMigration: "アカウントのお引っ越し" accountMigration: "アカウントのお引っ越し"
accountMoved: "このユーザーはさらのアカウントに引っ越したで:" accountMoved: "このユーザーはさらのアカウントに引っ越したで:"
@ -1060,7 +1072,7 @@ forceShowAds: "いっつも広告を映す"
addMemo: "メモを足す" addMemo: "メモを足す"
editMemo: "メモをいらう" editMemo: "メモをいらう"
reactionsList: "ツッコミ一覧" reactionsList: "ツッコミ一覧"
renotesList: "リノート一覧" renotesList: "ブースト一覧"
notificationDisplay: "通知見せる" notificationDisplay: "通知見せる"
leftTop: "左上" leftTop: "左上"
rightTop: "右上" rightTop: "右上"
@ -1131,7 +1143,7 @@ pastAnnouncements: "過去のお知らせやで"
youHaveUnreadAnnouncements: "あんたまだこのお知らせ読んどらんやろ。" youHaveUnreadAnnouncements: "あんたまだこのお知らせ読んどらんやろ。"
useSecurityKey: "ブラウザまたはデバイスの言う通りに、セキュリティキーまたはパスキーを使ってや。" useSecurityKey: "ブラウザまたはデバイスの言う通りに、セキュリティキーまたはパスキーを使ってや。"
replies: "返事" replies: "返事"
renotes: "リノート" renotes: "ブースト"
loadReplies: "返信を見るで" loadReplies: "返信を見るで"
loadConversation: "会話を見るで" loadConversation: "会話を見るで"
pinnedList: "ピン留めしはったリスト" pinnedList: "ピン留めしはったリスト"
@ -1142,7 +1154,7 @@ unnotifyNotes: "投稿の通知やめる"
authentication: "認証" authentication: "認証"
authenticationRequiredToContinue: "続けるんなら認証してや。" authenticationRequiredToContinue: "続けるんなら認証してや。"
dateAndTime: "日時" dateAndTime: "日時"
showRenotes: "リノート出す" showRenotes: "ブースト出す"
edited: "いじったやつ" edited: "いじったやつ"
notificationRecieveConfig: "通知もらうかの設定" notificationRecieveConfig: "通知もらうかの設定"
mutualFollow: "お互いフォローしてんで" mutualFollow: "お互いフォローしてんで"
@ -1181,6 +1193,27 @@ remainingN: "残り:{n}"
overwriteContentConfirm: "今の内容に上書きされるけどいい?" overwriteContentConfirm: "今の内容に上書きされるけどいい?"
seasonalScreenEffect: "季節にあった画面の動き" seasonalScreenEffect: "季節にあった画面の動き"
decorate: "デコる" decorate: "デコる"
addMfmFunction: "装飾つける"
enableQuickAddMfmFunction: "ややこしいMFMのピッカーを出す"
bubbleGame: "バブルゲーム"
sfx: "効果音"
soundWillBePlayed: "サウンドが再生されるで"
showReplay: "リプレイ見る"
replay: "リプレイ"
replaying: "リプレイ中"
ranking: "ランキング"
lastNDays: "直近{n}日"
backToTitle: "タイトルへ"
hemisphere: "住んでる地域"
withSensitive: "センシティブなファイルを含むノートを表示"
userSaysSomethingSensitive: "{name}のセンシティブなファイルを含む投稿"
enableHorizontalSwipe: "スワイプしてタブを切り替える"
_bubbleGame:
howToPlay: "遊び方"
_howToPlay:
section1: "位置を調整してハコにモノを落とすで。"
section2: "同じもんがくっついたら別のやつになって、スコアがもらえるで。"
section3: "モノがハコからあふれたらゲームオーバーや。ハコからあふれんようにしながらモノを融合させてハイスコアを目指しいや!"
_announcement: _announcement:
forExistingUsers: "もうおるユーザーのみ" forExistingUsers: "もうおるユーザーのみ"
forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。" forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。"
@ -1247,8 +1280,8 @@ _initialTutorial:
_visibility: _visibility:
description: "ノートを見れる相手を制限できるわ。" description: "ノートを見れる相手を制限できるわ。"
public: "みんなに見せるで。" public: "みんなに見せるで。"
home: "ホームタイムラインにだけ見せるで。フォロワーとか、プロフィールを見に来た人、リノートからも見れるから、実質は全員見れるけどな。あんまし広がりにくいってことや。" home: "ホームタイムラインにだけ見せるで。フォロワーとか、プロフィールを見に来た人、ブーストからも見れるから、実質は全員見れるけどな。あんまし広がりにくいってことや。"
followers: "フォロワーにだけ見せるで。自分以外はリノートできへんし、フォロワー以外は絶対に見れへん。" followers: "フォロワーにだけ見せるで。自分以外はブーストできへんし、フォロワー以外は絶対に見れへん。"
direct: "指定した人にだけ公開されて、ついでに通知も送るで。ダイレクトメールの代わりとして使ってな。" direct: "指定した人にだけ公開されて、ついでに通知も送るで。ダイレクトメールの代わりとして使ってな。"
doNotSendConfidencialOnDirect1: "機密情報を送るときは十分注意せえよ。" doNotSendConfidencialOnDirect1: "機密情報を送るときは十分注意せえよ。"
doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容が見れるから、信用できへんサーバーのひとにダイレクト投稿するときには、めっちゃ用心しとくんやで。" doNotSendConfidencialOnDirect2: "送信先のサーバーの管理者は投稿内容が見れるから、信用できへんサーバーのひとにダイレクト投稿するときには、めっちゃ用心しとくんやで。"
@ -1551,6 +1584,13 @@ _achievements:
_tutorialCompleted: _tutorialCompleted:
title: "Sharkeyひよっこ講座 修了証" title: "Sharkeyひよっこ講座 修了証"
description: "チュートリアル全部やった" description: "チュートリアル全部やった"
_bubbleGameExplodingHead:
title: "🤯"
description: "バブルゲームで最も大きいモノを出した"
_bubbleGameDoubleExplodingHead:
title: "ダブル🤯"
description: "バブルゲームで最も大きいモを2つ同時に出した"
flavor: "これくらいの おべんとばこに 🤯 🤯 ちょっとつめて"
_role: _role:
new: "ロールの作成" new: "ロールの作成"
edit: "ロールの編集" edit: "ロールの編集"
@ -1641,6 +1681,7 @@ _emailUnavailable:
disposable: "ずーっと使えるアドレスじゃないみたいや" disposable: "ずーっと使えるアドレスじゃないみたいや"
mx: "正しいメールサーバーじゃないっぽいわ" mx: "正しいメールサーバーじゃないっぽいわ"
smtp: "メールサーバーがうんともすんとも言わへん" smtp: "メールサーバーがうんともすんとも言わへん"
banned: "このメールアドレスはあかん"
_ffVisibility: _ffVisibility:
public: "公開" public: "公開"
followers: "フォロワーだけに公開" followers: "フォロワーだけに公開"
@ -1709,7 +1750,7 @@ _registry:
domain: "ドメイン" domain: "ドメイン"
createKey: "キーを作る" createKey: "キーを作る"
_aboutMisskey: _aboutMisskey:
about: "Sharkeyは、syuiloが2014年からずっと作ってはる、Misskeyをベースにしたオープンソースなソフトウェアや。" about: "Sharkeyは、Misskeyをベースにしたオープンソースなソフトウェアや。"
contributors: "主な貢献者" contributors: "主な貢献者"
allContributors: "全ての貢献者" allContributors: "全ての貢献者"
source: "ソースコード" source: "ソースコード"
@ -1742,7 +1783,7 @@ _channel:
notesCount: "{n}こ投稿があるで" notesCount: "{n}こ投稿があるで"
nameAndDescription: "名前と説明" nameAndDescription: "名前と説明"
nameOnly: "名前だけ" nameOnly: "名前だけ"
allowRenoteToExternal: "チャンネルの外にリノートできるようにする" allowRenoteToExternal: "チャンネルの外にブーストできるようにする"
_menuDisplay: _menuDisplay:
sideFull: "横" sideFull: "横"
sideIcon: "横(アイコン)" sideIcon: "横(アイコン)"
@ -1932,6 +1973,55 @@ _permissions:
"write:flash": "Playを操作する" "write:flash": "Playを操作する"
"read:flash-likes": "Playのええやんを見る" "read:flash-likes": "Playのええやんを見る"
"write:flash-likes": "Playのええやんを見る" "write:flash-likes": "Playのええやんを見る"
"read:admin:abuse-user-reports": "ユーザーからの通報を見る"
"write:admin:delete-account": "ユーザーアカウント消す"
"write:admin:delete-all-files-of-a-user": "ユーザーのファイル全部ほかす"
"read:admin:index-stats": "データベースインデックスの情報見る"
"read:admin:table-stats": "データベーステーブルの情報見る"
"read:admin:user-ips": "ユーザーのIPアドレスを見る"
"read:admin:meta": "インスタンスのメタデータ見る"
"write:admin:reset-password": "ユーザーのパスワードをリセット"
"write:admin:resolve-abuse-user-report": "ユーザーからの通報を解決する"
"write:admin:send-email": "メール送る"
"read:admin:server-info": "サーバーの情報見る"
"read:admin:show-moderation-log": "モデレーションログ見る"
"read:admin:show-user": "ユーザーのプライベートな情報見る"
"read:admin:show-users": "ユーザーのプライベートな情報見る"
"write:admin:suspend-user": "ユーザーを凍結"
"write:admin:unset-user-avatar": "ユーザーのアバターを削除"
"write:admin:unset-user-banner": "ユーザーのバナーを削除"
"write:admin:unsuspend-user": "ユーザーの凍結解除"
"write:admin:meta": "インスタンスのメタデータいじる"
"write:admin:user-note": "モデレーションノートいじる"
"write:admin:roles": "ロールをいじる"
"read:admin:roles": "ロール見る"
"write:admin:relays": "リレーいじる"
"read:admin:relays": "リレー見る"
"write:admin:invite-codes": "招待コードいじる"
"read:admin:invite-codes": "招待コード見る"
"write:admin:announcements": "お知らせいじる"
"read:admin:announcements": "お知らせ見る"
"write:admin:avatar-decorations": "アバターデコレーションをいじる"
"read:admin:avatar-decorations": "アバターデコレーション見る"
"write:admin:federation": "連合の情報いじる"
"write:admin:account": "ユーザーアカウントいじる"
"read:admin:account": "ユーザーの情報見る"
"write:admin:emoji": "絵文字いじる"
"read:admin:emoji": "絵文字見る"
"write:admin:queue": "ジョブキューいじる"
"read:admin:queue": "ジョブキューの情報見る"
"write:admin:promo": "プロモーションノートいじる"
"write:admin:drive": "ユーザーのドライブいじる"
"read:admin:drive": "ユーザーのドライブの情報見る"
"read:admin:stream": "管理者用のWebsocket API使う"
"write:admin:ad": "広告いじる"
"read:admin:ad": "広告見る"
"write:invite-codes": "招待コード作る"
"read:invite-codes": "招待コード取得"
"write:clip-favorite": "クリップのいいねいじる"
"read:clip-favorite": "クリップのいいね見る"
"read:federation": "連合の情報取得"
"write:report-abuse": "違反報告"
_auth: _auth:
shareAccessTitle: "アプリへのアクセス許してやったらどうや" shareAccessTitle: "アプリへのアクセス許してやったらどうや"
shareAccess: "「{name}」がアカウントにアクセスすることを許可してええか?" shareAccess: "「{name}」がアカウントにアクセスすることを許可してええか?"
@ -2053,6 +2143,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "全てのノート" allNotes: "全てのノート"
favoritedNotes: "お気に入りにしたノート" favoritedNotes: "お気に入りにしたノート"
clips: "クリップ"
followingList: "フォロー" followingList: "フォロー"
muteList: "ミュート" muteList: "ミュート"
blockingList: "ブロック" blockingList: "ブロック"
@ -2164,13 +2255,14 @@ _notification:
youGotMention: "{name}からのメンション" youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ" youGotReply: "{name}からのリプライ"
youGotQuote: "{name}による引用" youGotQuote: "{name}による引用"
youRenoted: "{name}がリノートしたみたいやで" youRenoted: "{name}がブーストしたみたいやで"
youWereFollowed: "フォローされたで" youWereFollowed: "フォローされたで"
youReceivedFollowRequest: "フォロー許可してほしいみたいやな" youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
yourFollowRequestAccepted: "フォローさせてもろたで" yourFollowRequestAccepted: "フォローさせてもろたで"
pollEnded: "アンケートの結果が出たみたいや" pollEnded: "アンケートの結果が出たみたいや"
newNote: "さらの投稿" newNote: "さらの投稿"
unreadAntennaNote: "アンテナ {name}" unreadAntennaNote: "アンテナ {name}"
roleAssigned: "ロールが付与されたで"
emptyPushNotificationMessage: "プッシュ通知の更新をしといたで" emptyPushNotificationMessage: "プッシュ通知の更新をしといたで"
achievementEarned: "実績を獲得しとるで" achievementEarned: "実績を獲得しとるで"
testNotification: "通知テスト" testNotification: "通知テスト"
@ -2178,7 +2270,7 @@ _notification:
sendTestNotification: "テスト通知を送信するで" sendTestNotification: "テスト通知を送信するで"
notificationWillBeDisplayedLikeThis: "通知はこのように表示されるで" notificationWillBeDisplayedLikeThis: "通知はこのように表示されるで"
reactedBySomeUsers: "{n}人がツッコんだで" reactedBySomeUsers: "{n}人がツッコんだで"
renotedBySomeUsers: "{n}人がリノートしたで" renotedBySomeUsers: "{n}人がブーストしたで"
followedBySomeUsers: "{n}人にフォローされたで" followedBySomeUsers: "{n}人にフォローされたで"
_types: _types:
all: "すべて" all: "すべて"
@ -2192,6 +2284,7 @@ _notification:
pollEnded: "アンケートが終了したで" pollEnded: "アンケートが終了したで"
receiveFollowRequest: "フォロー許可してほしいみたいやで" receiveFollowRequest: "フォロー許可してほしいみたいやで"
followRequestAccepted: "フォローが受理されたで" followRequestAccepted: "フォローが受理されたで"
roleAssigned: "ロールが付与された"
achievementEarned: "実績の獲得" achievementEarned: "実績の獲得"
app: "連携アプリからの通知や" app: "連携アプリからの通知や"
_actions: _actions:
@ -2249,7 +2342,7 @@ _webhookSettings:
followed: "フォローもらったとき~!" followed: "フォローもらったとき~!"
note: "ノートを投稿したとき~!" note: "ノートを投稿したとき~!"
reply: "返信があるとき~!" reply: "返信があるとき~!"
renote: "リノートされるとき~!" renote: "ブーストされるとき~!"
reaction: "ツッコまれたとき~!" reaction: "ツッコまれたとき~!"
mention: "メンションがあるとき~!" mention: "メンションがあるとき~!"
_moderationLogTypes: _moderationLogTypes:
@ -2350,3 +2443,51 @@ _dataSaver:
_code: _code:
title: "コードハイライト" title: "コードハイライト"
description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。" description: "MFMとかでコードハイライト記法が使われてるとき、タップするまで読み込まれへんくなるで。コードハイライトではハイライトする言語ごとにその決めてるファイルを読む必要はあんねんな。けどな、それは自動で読み込まれなくなるから、通信量を少なくできることができるねん。"
_hemisphere:
N: "北半球"
S: "南半球"
caption: "一部のクライアント設定で、季節を判定するのに使用するで。"
_reversi:
reversi: "リバーシ"
gameSettings: "対局の設定"
chooseBoard: "ボードを選択"
blackOrWhite: "先行/後攻"
blackIs: "{name}が黒(先行)"
rules: "ルール"
thisGameIsStartedSoon: "対局、そろそろ開始されるで。"
waitingForOther: "相手の準備が完了するのを待ってんで。"
waitingForMe: "あんさんの準備が完了すんのを待ってんで"
waitingBoth: "準備してなー"
ready: "準備完了"
cancelReady: "準備を再開"
opponentTurn: "相手のターンやで"
myTurn: "あんさんのターンや"
turnOf: "{name}のターンやで"
pastTurnOf: "{name}のターン"
surrender: "投了"
surrendered: "投了により"
timeout: "時間切れ"
drawn: "引き分け"
won: "{name}の勝ち"
black: "黒"
white: "白"
total: "合計"
turnCount: "{count}ターン目"
myGames: "自分の対局"
allGames: "みんなの対局"
ended: "終了"
playing: "対局中"
isLlotheo: "石の少ない方が勝ち(ロセオ)"
loopedMap: "ループマップ"
canPutEverywhere: "どこでも置けるモード"
timeLimitForEachTurn: "1ターンの時間制限"
freeMatch: "フリーマッチ"
lookingForPlayer: "対戦相手を探してるで"
gameCanceled: "対局がキャンセルされたわ"
shareToTlTheGameWhenStart: "初めの時に対局をタイムラインに投稿するで"
iStartedAGame: "対局し始めたで! #MisskeyReversi"
opponentHasSettingsChanged: "相手が設定変えたで"
_offlineScreen:
title: "オフライン - サーバーに接続できひんで"
header: "サーバーに接続できへんわ"

View file

@ -1,3 +1,4 @@
--- ---
_lang_: "la .lojban." _lang_: "la .lojban."
headlineMisskey: "lo se tcana noi jorne fi loi notci" headlineMisskey: "lo se tcana noi jorne fi loi notci"

View file

@ -104,3 +104,4 @@ _deck:
_columns: _columns:
notifications: "Ilɣuyen" notifications: "Ilɣuyen"
list: "Tibdarin" list: "Tibdarin"

View file

@ -84,3 +84,4 @@ _deck:
notifications: "ಅಧಿಸೂಚನೆಗಳು" notifications: "ಅಧಿಸೂಚನೆಗಳು"
tl: "ಸಮಯಸಾಲು" tl: "ಸಮಯಸಾಲು"
mentions: "ಹೆಸರಿಸಿದ" mentions: "ಹೆಸರಿಸಿದ"

View file

@ -373,6 +373,8 @@ hcaptcha: "에이치캡차"
enableHcaptcha: "에이치캡차 키기" enableHcaptcha: "에이치캡차 키기"
hcaptchaSiteKey: "사이트키" hcaptchaSiteKey: "사이트키"
hcaptchaSecretKey: "시크릿키" hcaptchaSecretKey: "시크릿키"
mcaptchaSiteKey: "사이트키"
mcaptchaSecretKey: "시크릿키"
recaptcha: "리캡차" recaptcha: "리캡차"
enableRecaptcha: "리캡차 키기" enableRecaptcha: "리캡차 키기"
recaptchaSiteKey: "사이트키" recaptchaSiteKey: "사이트키"
@ -680,6 +682,7 @@ _profile:
name: "이럼" name: "이럼"
username: "사용자 이럼" username: "사용자 이럼"
_exportOrImport: _exportOrImport:
clips: "클립 맨걸기"
followingList: "팔로잉" followingList: "팔로잉"
muteList: "수ᇚ후기" muteList: "수ᇚ후기"
blockingList: "차단하기" blockingList: "차단하기"
@ -721,3 +724,6 @@ _moderationLogTypes:
deleteUserAnnouncement: "사용자 공지 걸 뭉캐기" deleteUserAnnouncement: "사용자 공지 걸 뭉캐기"
resetPassword: "비밀번호 재설정" resetPassword: "비밀번호 재설정"
resolveAbuseReport: "신고 해겔하기" resolveAbuseReport: "신고 해겔하기"
_reversi:
total: "합계"

View file

@ -130,6 +130,7 @@ overwriteFromPinnedEmojis: "일반 설정을 덮어쓰기"
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다." reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
rememberNoteVisibility: "공개 범위를 기억하기" rememberNoteVisibility: "공개 범위를 기억하기"
attachCancel: "첨부 취소" attachCancel: "첨부 취소"
deleteFile: "파일 삭제"
markAsSensitive: "열람주의로 설정" markAsSensitive: "열람주의로 설정"
unmarkAsSensitive: "열람주의 해제" unmarkAsSensitive: "열람주의 해제"
enterFileName: "파일명을 입력" enterFileName: "파일명을 입력"
@ -379,6 +380,11 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptcha 활성화" enableHcaptcha: "hCaptcha 활성화"
hcaptchaSiteKey: "사이트 키" hcaptchaSiteKey: "사이트 키"
hcaptchaSecretKey: "시크릿 키" hcaptchaSecretKey: "시크릿 키"
mcaptcha: "mCaptcha"
enableMcaptcha: "mCaptcha 활성화"
mcaptchaSiteKey: "사이트 키"
mcaptchaSecretKey: "시크릿 키"
mcaptchaInstanceUrl: "mCaptcha 인스턴스 URL"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHA 활성화" enableRecaptcha: "reCAPTCHA 활성화"
recaptchaSiteKey: "사이트 키" recaptchaSiteKey: "사이트 키"
@ -626,6 +632,7 @@ medium: "보통"
small: "작게" small: "작게"
generateAccessToken: "액세스 토큰 생성" generateAccessToken: "액세스 토큰 생성"
permission: "권한" permission: "권한"
adminPermission: "관리자 권한"
enableAll: "전체 선택" enableAll: "전체 선택"
disableAll: "전체 해제" disableAll: "전체 해제"
tokenRequested: "계정 접근 허용" tokenRequested: "계정 접근 허용"
@ -669,6 +676,7 @@ useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용됩니
other: "기타" other: "기타"
regenerateLoginToken: "로그인 토큰을 재생성" regenerateLoginToken: "로그인 토큰을 재생성"
regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다." regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다."
theKeywordWhenSearchingForCustomEmoji: "맞춤 이모티콘을 검색할 때 키워드가 됩니다."
setMultipleBySeparatingWithSpace: "공백으로 구분하여 여러 개 설정할 수 있습니다." setMultipleBySeparatingWithSpace: "공백으로 구분하여 여러 개 설정할 수 있습니다."
fileIdOrUrl: "파일 ID 또는 URL" fileIdOrUrl: "파일 ID 또는 URL"
behavior: "동작" behavior: "동작"
@ -1051,6 +1059,8 @@ limitWidthOfReaction: "리액션의 최대 폭을 제한하고 작게 표시하
noteIdOrUrl: "노트 ID 및 URL" noteIdOrUrl: "노트 ID 및 URL"
video: "동영상" video: "동영상"
videos: "동영상" videos: "동영상"
audio: "소리"
audioFiles: "소리"
dataSaver: "데이터 절약 모드" dataSaver: "데이터 절약 모드"
accountMigration: "계정 이동" accountMigration: "계정 이동"
accountMoved: "이 사용자는 다음 계정으로 이사했습니다:" accountMoved: "이 사용자는 다음 계정으로 이사했습니다:"
@ -1151,7 +1161,7 @@ showRepliesToOthersInTimeline: "타임라인에 다른 사람에게 보내는
hideRepliesToOthersInTimeline: "타임라인에 다른 사람에게 보내는 답글을 포함하지 않음" hideRepliesToOthersInTimeline: "타임라인에 다른 사람에게 보내는 답글을 포함하지 않음"
showRepliesToOthersInTimelineAll: "타임라인에 현재 팔로우 중인 사람 전원의 답글을 포함하게 하기" showRepliesToOthersInTimelineAll: "타임라인에 현재 팔로우 중인 사람 전원의 답글을 포함하게 하기"
hideRepliesToOthersInTimelineAll: "타임라인에 현재 팔로우 중인 사람 전원의 답글이 나오지 않게 하기" hideRepliesToOthersInTimelineAll: "타임라인에 현재 팔로우 중인 사람 전원의 답글이 나오지 않게 하기"
confirmShowRepliesAll: "이 조작은 되돌릴 수 없습니다. 정말로 타임라인에 현재 팔로우 중인 사람 전원의 답글이 나오지 않게 하시겠습니까?" confirmShowRepliesAll: "이 조작은 되돌릴 수 없습니다. 정말로 타임라인에 현재 팔로우 중인 사람 전원의 답글이 나오게 하시겠습니까?"
confirmHideRepliesAll: "이 조작은 되돌릴 수 없습니다. 정말로 타임라인에 현재 팔로우 중인 사람 전원의 답글이 나오지 않게 하시겠습니까?" confirmHideRepliesAll: "이 조작은 되돌릴 수 없습니다. 정말로 타임라인에 현재 팔로우 중인 사람 전원의 답글이 나오지 않게 하시겠습니까?"
externalServices: "외부 서비스" externalServices: "외부 서비스"
impressum: "운영자 정보" impressum: "운영자 정보"
@ -1183,6 +1193,25 @@ seasonalScreenEffect: "계절에 따른 효과 보이기"
decorate: "장식하기" decorate: "장식하기"
addMfmFunction: "장식 추가하기" addMfmFunction: "장식 추가하기"
enableQuickAddMfmFunction: "상급자용 MFM 선택기 표시하기" enableQuickAddMfmFunction: "상급자용 MFM 선택기 표시하기"
bubbleGame: "버블 게임"
sfx: "효과음"
soundWillBePlayed: "소리가 재생됩니다"
showReplay: "리플레이 보기"
replay: "리플레이"
replaying: "리플레이 중"
ranking: "랭킹"
lastNDays: "최근 {n}일"
backToTitle: "타이틀로 가기"
hemisphere: "거주 지역"
withSensitive: "민감한 파일이 포함된 노트 보기"
userSaysSomethingSensitive: "{name}의 민감한 파일이 포함된 게시물"
enableHorizontalSwipe: "스와이프하여 탭 전환"
_bubbleGame:
howToPlay: "설명"
_howToPlay:
section1: "위치를 조정하여 상자에 물건을 떨어뜨립니다."
section2: "같은 종류의 물건이 붙으면 다른 물건으로 바뀌면서 점수를 얻게 됩니다."
section3: "상자에서 물건이 넘치면 게임 오버입니다. 상자에서 물건이 넘치지 않도록 하면서 물건을 융합하여 높은 점수를 획득하세요!"
_announcement: _announcement:
forExistingUsers: "기존 유저에게만 알림" forExistingUsers: "기존 유저에게만 알림"
forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 유저에게만 표시합니다. 비활성화하면 게시 후에 가입한 유저에게도 표시합니다." forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 유저에게만 표시합니다. 비활성화하면 게시 후에 가입한 유저에게도 표시합니다."
@ -1553,6 +1582,13 @@ _achievements:
_tutorialCompleted: _tutorialCompleted:
title: "Misskey 입문자 과정 수료증" title: "Misskey 입문자 과정 수료증"
description: "튜토리얼을 완료했습니다" description: "튜토리얼을 완료했습니다"
_bubbleGameExplodingHead:
title: "🤯"
description: "버블 게임에서 가장 큰 물건을 내놓았다"
_bubbleGameDoubleExplodingHead:
title: "더블 🤯"
description: "버블게임에서 가장 큰 물건 2개를 동시에 내놓았다."
flavor: "이 정도만 도시락통에 🤯 🤯 조금만 더"
_role: _role:
new: "새 역할 생성" new: "새 역할 생성"
edit: "역할 수정" edit: "역할 수정"
@ -2105,6 +2141,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "모든 노트" allNotes: "모든 노트"
favoritedNotes: "즐겨찾기한 노트" favoritedNotes: "즐겨찾기한 노트"
clips: "클립"
followingList: "팔로잉" followingList: "팔로잉"
muteList: "뮤트" muteList: "뮤트"
blockingList: "차단" blockingList: "차단"
@ -2404,3 +2441,48 @@ _dataSaver:
_code: _code:
title: "문자열 강조" title: "문자열 강조"
description: "MFM 등으로 문자열 강조 기법을 사용할 때 누르기 전에는 불러오지 않습니다. 문자열 강조에서는 강조할 언어마다 그 정의 파일을 불러와야 하지만 이를 자동으로 불러오지 않으므로 데이터 사용량을 줄일 수 있습니다." description: "MFM 등으로 문자열 강조 기법을 사용할 때 누르기 전에는 불러오지 않습니다. 문자열 강조에서는 강조할 언어마다 그 정의 파일을 불러와야 하지만 이를 자동으로 불러오지 않으므로 데이터 사용량을 줄일 수 있습니다."
_hemisphere:
N: "북반구"
S: "남반구"
caption: "일부 클라이언트 설정에서 계절을 판단하기 위해 사용합니다."
_reversi:
reversi: "리버시"
gameSettings: "대국 설정"
chooseBoard: "보드 선택"
blackOrWhite: "선공/후공"
blackIs: "{name}님이 흑(선공)"
rules: "규칙"
thisGameIsStartedSoon: "대국이 곧 시작됩니다"
waitingForOther: "상대방의 준비가 완료되기를 기다리고 있습니다."
waitingForMe: "당신의 준비가 완료되기를 기다리고 있습니다."
waitingBoth: "준비하세요"
ready: "준비 완료"
cancelReady: "준비 다시 시작"
opponentTurn: "상대의 차례입니다"
myTurn: "당신의 차례입니다"
turnOf: "{name}의 차례입니다"
pastTurnOf: "{name}의 차례"
surrender: "기권"
surrendered: "기권에 의해"
timeout: "시간 초과"
drawn: "무승부"
won: "{name}의 승리"
black: "흑"
white: "백"
total: "합계"
turnCount: "{count}턴 째"
myGames: "내 대국"
allGames: "모두의 대국"
ended: "종료"
playing: "대국 중"
isLlotheo: "돌이 적은 사람이 승리 (로세오)"
loopedMap: "루프 지도"
canPutEverywhere: "어디에도 둘 수 있는 모드"
timeLimitForEachTurn: "1턴의 시간 제한"
freeMatch: "프리매치"
lookingForPlayer: "상대를 찾고 있습니다"
gameCanceled: "대국이 취소되었습니다"
_offlineScreen:
title: "오프라인 - 서버에 접속할 수 없습니다"
header: "서버에 접속할 수 없습니다"

View file

@ -1,9 +1,9 @@
--- ---
_lang_: "ພາສາລາວ" _lang_: "ພາສາລາວ"
headlineMisskey: "ເຊື່ອມຕໍ່ເຄືອຂ່າຍໂດຍຫມາຍເຫດ" headlineMisskey: "ເຊື່ອມຕໍ່ເຄືອຂ່າຍໂດຍ note"
introMisskey: "ຍິນດີຕ້ອນຮັບ! Misskey ເປັນແຫຼ່ງເປີດ, ການບໍລິການ microblogging ກະຈາຍ\nສ້າງ \"ບັນທຶກ\" ເພື່ອແບ່ງປັນຄວາມຄິດຂອງທ່ານກັບທຸກໆຄົນທີ່ຢູ່ອ້ອມຮອບທ່ານ 📡\nດ້ວຍ \"ປະຕິກິລິຍາ\", ທ່ານຍັງສາມາດສະແດງຄວາມຮູ້ສຶກຂອງທ່ານຢ່າງໄວວາກ່ຽວກັບບັນທຶກຂອງທຸກໆຄົນ 👍\nມາສຳຫຼວດໂລກໃໝ່! 🚀" introMisskey: "ຍິນດີຕ້ອນຮັບ! Misskey ເປັນຊອຟແວopensource, ສຳລັບບໍລິການ microblogging ແບບ decentralized\nສ້າງ “note” ເພື່ອແບ່ງປັນຄວາມຄິດຂອງທ່ານກັບທຸກໆ ຄົນທີ່ຢູ່ອ້ອມຮອບທ່ານ 📡\nຢ່າລືມ “reaction” ໂນຕຂອງລາວເພື່ອສະແດງຄວາມຮູ້ສຶກ 👍\nມາສຳຫຼວດໂລກໃໝ່ແນ! 🚀"
poweredByMisskeyDescription: "{name} ແມ່ນສ່ວນໜຶ່ງຂອງການບໍລິການທີ່ຂັບເຄື່ອນໂດຍແພລດຟອມ open source. <b>Misskey</b> (ເອີ້ນວ່າ \"Misskey instance\")" poweredByMisskeyDescription: "{name} ແມ່ນສ່ວນໜຶ່ງຂອງການບໍລິການທີ່ຂັບເຄື່ອນໂດຍແພລດຟອມ open source. <b>Misskey</b> (ເອີ້ນວ່າ \"Misskey instance\")"
monthAndDay: "{ເດືອນ}/{ມື້}" monthAndDay: "ເດືອນ{month} / ວັນ{day}"
search: "ຄົ້ນຫາ" search: "ຄົ້ນຫາ"
notifications: "ການແຈ້ງເຕືອນ" notifications: "ການແຈ້ງເຕືອນ"
username: "ຊື່ຜູ້ໃຊ້" username: "ຊື່ຜູ້ໃຊ້"
@ -15,25 +15,25 @@ gotIt: "ເຂົ້າໃຈແລ້ວ!"
cancel: "ຍົກເລີກ" cancel: "ຍົກເລີກ"
noThankYou: "ບໍ່​ແມ່ນ​ຕອນ​ນີ້" noThankYou: "ບໍ່​ແມ່ນ​ຕອນ​ນີ້"
enterUsername: "ປ້ອນຊື່ຜູ້ໃຊ້" enterUsername: "ປ້ອນຊື່ຜູ້ໃຊ້"
renotedBy: "Renoted ໂດຍ {ຜູ້ໃຊ້}" renotedBy: "Renoted ໂດຍ {user}"
noNotes: "ບໍ່ມີຫມາຍເຫດ" noNotes: "ບໍ່ມີ note"
noNotifications: "ບໍ່ມີການແຈ້ງເຕືອນ" noNotifications: "ບໍ່ມີການແຈ້ງເຕືອນ"
instance: "ອີນສະແຕນ" instance: "ອີນສະແຕນ"
settings: "ກຳນົດຄ່າ" settings: "ກຳນົດຄ່າ"
notificationSettings: "ຕັ້ງຄ່າການແຈ້ງເຕືອນ" notificationSettings: "ຕັ້ງຄ່າການແຈ້ງເຕືອນ"
basicSettings: "ການຕັ້ງຄ່າພື້ນຖານ" basicSettings: "ການຕັ້ງຄ່າພື້ນຖານ"
otherSettings: "ການຕັ້ງຄ່າອື່ນໆ" otherSettings: "ການຕັ້ງຄ່າອື່ນໆ"
openInWindow: "ເປີດຢູ່ໃນປ່ອງຢ້ຽມ" openInWindow: "ເປີດໃນປ່ອງຢ້ຽມ"
profile: "ໂພຼຟາຍ" profile: "ໂພຼຟາຍ"
timeline: "​ເສັ້ນກຳ​ນົດ​ເວ​ລາ​" timeline: "ໄທມ໌ໄລນ໌"
noAccountDescription: "ຜູ້ໃຊ້ນີ້ຍັງບໍ່ໄດ້ຂຽນໃນຊີວະປະຫວັດຂອງເຂົາເຈົ້າເທື່ອ" noAccountDescription: "ຜູ້ໃຊ້ນີ້ຍັງບໍ່ໄດ້ຂຽນໃນຊີວະປະຫວັດຂອງເຂົາເຈົ້າເທື່ອ"
login: "ເຂົ້າ​ສູ່​ລະ​ບົບ" login: "ເຂົ້າ​ສູ່​ລະ​ບົບ"
loggingIn: "ກຳລັງເຂົ້າສູ່ລະບົບ..." loggingIn: "ກຳລັງເຂົ້າສູ່ລະບົບ..."
logout: "ອອກ​ຈາກ​ລະ​ບົບ" logout: "ອອກ​ຈາກ​ລະ​ບົບ"
signup: "ລົງ​ທະ​ບຽນ" signup: "ລົງ​ທະ​ບຽນ"
uploading: "ການອັບໂຫຼດ..." uploading: "ກຳລັງອັບໂຫຼດ..."
save: "ບັນທຶກ" save: "ບັນທຶກ"
users: "ຜູ້ໃຊ້ຕ່າງໆ" users: "ຜູ້ໃຊ້"
addUser: "ເພີ່ມຜູ້ໃຊ້" addUser: "ເພີ່ມຜູ້ໃຊ້"
favorite: "ເພີ່ມໃສ່ລາຍການທີ່ມັກ" favorite: "ເພີ່ມໃສ່ລາຍການທີ່ມັກ"
favorites: "ລາຍການທີ່ມັກ" favorites: "ລາຍການທີ່ມັກ"
@ -41,13 +41,14 @@ unfavorite: "ລຶບອອກຈາກລາຍການທີ່ມັກ"
favorited: "ເພີ່ມໃສ່ລາຍການທີ່ມັກແລ້ວ" favorited: "ເພີ່ມໃສ່ລາຍການທີ່ມັກແລ້ວ"
alreadyFavorited: "ເພີ່ມເຂົ້າໃນລາຍການທີ່ມັກແລ້ວ." alreadyFavorited: "ເພີ່ມເຂົ້າໃນລາຍການທີ່ມັກແລ້ວ."
cantFavorite: "ບໍ່ສາມາດເພີ່ມໃສ່ລາຍການທີ່ມັກໄດ້." cantFavorite: "ບໍ່ສາມາດເພີ່ມໃສ່ລາຍການທີ່ມັກໄດ້."
pin: "ປັກໝຸດໄປຫາໂປຣໄຟລ໌" pin: "ປັກໝຸດ"
unpin: "ຖອດປັກໝຸດອອກຈາກໂປຣໄຟລ໌" unpin: "ຖອດປັກໝຸດອອກ"
copyContent: "ຄັດລອກເນື້ອຫາ" copyContent: "ຄັດລອກເນື້ອຫາ"
copyLink: "ສຳເນົາລິ້ງ" copyLink: "ຄັດລອກລິ້ງ"
copyLinkRenote: "ຄັດລອກລິ້ງຂອງ renote"
delete: "ລຶບ" delete: "ລຶບ"
deleteAndEdit: "ລບ​ແລະ​ແກ້​ໄຂ​" deleteAndEdit: "ລບ​ແລະ​ແກ້​ໄຂ​"
deleteAndEditConfirm: "ເຈົ້າ​ແນ່​ໃຈ​ບໍ່? ທີ່ທ່ານຕ້ອງການທີ່ຈະລຶບບັນທຶກນີ້ແລະແກ້ໄຂມັນ ທ່ານອາດຈະສູນເສຍການໂຕ້ຕອບ, ບັນທຶກ, ແລະການຕອບກັບທັງໝົດ" deleteAndEditConfirm: "ເຈົ້າ​ແນ່​ໃຈ​ບໍ່? ທີ່ທ່ານຕ້ອງການທີ່ຈະລຶບ note ນີ້ ແລະແກ້ໄຂມັນ ທ່ານອາດຈະສູນເສຍ reaction, renote, ແລະການຕອບກັບທັງໝົດ"
addToList: "ເພີ່ມໃສ່ລາຍຊື່" addToList: "ເພີ່ມໃສ່ລາຍຊື່"
addToAntenna: "ເພີ່ມໃສ່ເສົາອາກາດ" addToAntenna: "ເພີ່ມໃສ່ເສົາອາກາດ"
sendMessage: "ສົ່ງຂໍ້ຄວາມ" sendMessage: "ສົ່ງຂໍ້ຄວາມ"
@ -66,15 +67,15 @@ showLess: "ປິດ"
youGotNewFollower: "ໄດ້ຕິດຕາມທ່ານ" youGotNewFollower: "ໄດ້ຕິດຕາມທ່ານ"
receiveFollowRequest: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍທີ່ໄດ້ຮັບ" receiveFollowRequest: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍທີ່ໄດ້ຮັບ"
followRequestAccepted: "ຜູ້ຕິດຕາມໄດ້ຍອມຮັບຄໍາຮ້ອງຂໍຂອງທ່ານ" followRequestAccepted: "ຜູ້ຕິດຕາມໄດ້ຍອມຮັບຄໍາຮ້ອງຂໍຂອງທ່ານ"
mention: "ໄດ້ກ່າວມາ" mention: "ກ່າວຖືງ"
mentions: "ກ່າວເຖິງ" mentions: "ກ່າວເຖິງ"
directNotes: "ໂດຍກົງຫມາຍເຫດ" directNotes: "ໂພສ Direct note"
importAndExport: "ນໍາເຂົ້າ / ສົ່ງອອກ" importAndExport: "ນໍາເຂົ້າ / ສົ່ງອອກ"
import: "ນຳເຂົ້າ" import: "ນຳເຂົ້າ"
export: "ນຳອອກ" export: "ສົ່ງອອກ"
files: "ໄຟລ໌" files: "ໄຟລ໌"
download: "ດາວໂຫລດ" download: "ດາວໂຫລດ"
driveFileDeleteConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບໄຟລ໌ \"{name}\"? ບັນທຶກທີ່ມີໄຟລ໌ແນບນີ້ຈະຖືກລຶບຖິ້ມ" driveFileDeleteConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການລຶບໄຟລ໌ \"{name}\"? note ທີ່ມີໄຟລ໌ແນບນີ້ຈະຖືກລຶບຖິ້ມ"
unfollowConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເຊົາຕິດຕາມ {name}?" unfollowConfirm: "ທ່ານແນ່ໃຈບໍ່ວ່າຕ້ອງການເຊົາຕິດຕາມ {name}?"
exportRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການສົ່ງອອກ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ ແລະມັນຈະຖືກເພີ່ມໃສ່ drive ຂອງທ່ານເມື່ອມັນສຳເລັດແລ້ວ" exportRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການສົ່ງອອກ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ ແລະມັນຈະຖືກເພີ່ມໃສ່ drive ຂອງທ່ານເມື່ອມັນສຳເລັດແລ້ວ"
importRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການນໍາເຂົ້າ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ" importRequested: "ໃນເວລາທີ່ທ່ານໄດ້ຮ້ອງຂໍການນໍາເຂົ້າ ມັນອາດຈະໃຊ້ເວລາບາງເວລາ"
@ -86,7 +87,7 @@ following: "ກຳລັງຕິດຕາມ"
followers: "ຜູ້ຕິດຕາມ" followers: "ຜູ້ຕິດຕາມ"
followsYou: "ຕິດ​ຕາມ​ເຈົ້າ" followsYou: "ຕິດ​ຕາມ​ເຈົ້າ"
createList: "ສ້າງລາຍຊື່" createList: "ສ້າງລາຍຊື່"
manageLists: "ການບໍລິຫານບັນຊີລາຍການ" manageLists: "ຈັດການລາຍຊື່"
error: "ຂໍ້ຜິດພາດ" error: "ຂໍ້ຜິດພາດ"
somethingHappened: "​ອຸຍ, ມີ​ບາງ​ຢ່າງ​ຜິ​ດ​ພາດ" somethingHappened: "​ອຸຍ, ມີ​ບາງ​ຢ່າງ​ຜິ​ດ​ພາດ"
retry: "ລອງໃຫມ່" retry: "ລອງໃຫມ່"
@ -96,30 +97,30 @@ serverIsDead: "ເຊີບເວີນີ້ບໍ່ຕອບສະໜອງ
youShouldUpgradeClient: "ເພື່ອເບິ່ງໜ້ານີ້, ກະລຸນາໂຫຼດຂໍ້ມູນຄືນໃໝ່ເພື່ອອັບເດດລູກຄ້າຂອງທ່ານ" youShouldUpgradeClient: "ເພື່ອເບິ່ງໜ້ານີ້, ກະລຸນາໂຫຼດຂໍ້ມູນຄືນໃໝ່ເພື່ອອັບເດດລູກຄ້າຂອງທ່ານ"
enterListName: "ໃສ່ຊື່ສຳລັບລາຍຊື່" enterListName: "ໃສ່ຊື່ສຳລັບລາຍຊື່"
privacy: "ຄວາມເປັນສ່ວນຕົວ" privacy: "ຄວາມເປັນສ່ວນຕົວ"
makeFollowManuallyApprove: "ປະຕິບັດຕາມການຮ້ອງຂໍຮຽກຮ້ອງໃຫ້ມີການອະນຸມັດ" makeFollowManuallyApprove: "ຕິດຕາມຄຳຂໍທີ່ຕ້ອງໄດ້ຮັບການອະນຸມັດ"
defaultNoteVisibility: "ເປັນຄ່າເລີ່ມຕົ້ນ" defaultNoteVisibility: "ການເບິ່ງເຫັນທີ່ເປັນຄ່າເລີ່ມຕົ້ນ"
follow: "ກຳລັງຕິດຕາມ" follow: "ກຳລັງຕິດຕາມ"
followRequest: "ສົ່ງ​ການ​ຮ້ອງ​ຂໍ​ປະ​ຕິ​ບ​ຕາມ​" followRequest: "ສົ່ງ​ຄຳຂໍ​ຕິ​ດ​ຕາມ​"
followRequests: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍ" followRequests: "ສົ່ງ​ຄຳຂໍ​ຕິ​ດ​ຕາມ​"
unfollow: "ເຊົາຕິດຕາມ" unfollow: "ເຊົາຕິດຕາມ"
followRequestPending: "ປະຕິບັດຕາມຄໍາຮ້ອງຂໍທີ່ລໍຖ້າຢູ່" followRequestPending: "ລໍຖ້າການອະນຸມັດໃຫ້ຕິດຕາມ"
enterEmoji: "ປ້ອນໂມຈິ" enterEmoji: "ປ້ອນອໂມຈິ"
renote: "Renote" renote: "Renote"
unrenote: "ເລີກ Renote" unrenote: "ເລີກ Renote"
renoted: "ເກັບບັນທຶກໄວ້" renoted: "renote ແລ້ວ"
cantRenote: "ໂພສນີ້ບໍ່ສາມາດຖືກບັນທຶກໄວ້ຄືນໃໝ່ໄດ້" cantRenote: "ໂພສນີ້ບໍ່ສາມາດ renote ໃໝ່ໄດ້"
cantReRenote: "ບໍ່ສາມາດບັນທຶກຄືນໃໝ່ໄດ້" cantReRenote: "ບໍ່ສາມາດບັນທຶກຄືນໃໝ່ໄດ້"
quote: "ລວມຂໍ້ຄວາມອ້າງອີງ" quote: "ອ້າງອີງ"
inChannelRenote: "ຊ່ອງພຽງແຕ່ Renote" inChannelRenote: "Renote ໃນ channel ເທົ່ານັ້ນ"
inChannelQuote: "ຊ່ອງເທົ່ານັ້ນ Quote" inChannelQuote: "້າອິງໃນ channel ເທົ່ານັ້ນ"
pinnedNote: "ບັນທຶກທີ່ປັກໝຸດໄວ້" pinnedNote: "note ທີ່ປັກໝຸດໄວ້"
pinned: "ປັກໝຸດໄປຫາໂປຣໄຟລ໌" pinned: "ປັກໝຸດ"
you: "ເຈົ້າ" you: "ເຈົ້າ"
clickToShow: "ກົດເພື່ອສະແດງໃຫ້ເຫັນ" clickToShow: "ກົດເພື່ອສະແດງໃຫ້ເຫັນ"
sensitive: "NSFW" sensitive: "NSFW"
add: "ເພີ່ມ" add: "ເພີ່ມ"
reaction: "ປະຕິກິລິຍາ" reaction: "reaction"
reactions: "ປະຕິກິລິຍາ" reactions: "reaction"
attachCancel: "ເອົາໄຟລ໌ແນບ" attachCancel: "ເອົາໄຟລ໌ແນບ"
mute: "ປີດສຽງ" mute: "ປີດສຽງ"
unmute: "ເປີດສຽງ" unmute: "ເປີດສຽງ"
@ -306,6 +307,8 @@ basicInfo: "ຂໍ້ມຸນເບື້ອງຕົ້ນ"
pinnedNotes: "ບັນທຶກທີ່ປັກໝຸດໄວ້" pinnedNotes: "ບັນທຶກທີ່ປັກໝຸດໄວ້"
hcaptchaSiteKey: "ກະແຈໄຊທ໌" hcaptchaSiteKey: "ກະແຈໄຊທ໌"
hcaptchaSecretKey: "ກະແຈລັບ" hcaptchaSecretKey: "ກະແຈລັບ"
mcaptchaSiteKey: "ກະແຈໄຊທ໌"
mcaptchaSecretKey: "ກະແຈລັບ"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "ເປີດໃຊ້ງານລີແຄ໋ບຈາ" enableRecaptcha: "ເປີດໃຊ້ງານລີແຄ໋ບຈາ"
recaptchaSiteKey: "ກະແຈໄຊທ໌" recaptchaSiteKey: "ກະແຈໄຊທ໌"
@ -463,3 +466,4 @@ _webhookSettings:
name: "ຊື່" name: "ຊື່"
_moderationLogTypes: _moderationLogTypes:
suspend: "ລະງັບ" suspend: "ລະງັບ"

View file

@ -348,6 +348,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Inschakelen hCaptcha" enableHcaptcha: "Inschakelen hCaptcha"
hcaptchaSiteKey: "Site sleutel" hcaptchaSiteKey: "Site sleutel"
hcaptchaSecretKey: "Geheime sleutel" hcaptchaSecretKey: "Geheime sleutel"
mcaptchaSiteKey: "Site sleutel"
mcaptchaSecretKey: "Geheime sleutel"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Inschakelen reCAPTCHA" enableRecaptcha: "Inschakelen reCAPTCHA"
recaptchaSiteKey: "Site sleutel" recaptchaSiteKey: "Site sleutel"
@ -495,3 +497,4 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Opschorten" suspend: "Opschorten"
resetPassword: "Wachtwoord terugzetten" resetPassword: "Wachtwoord terugzetten"

View file

@ -720,3 +720,4 @@ _webhookSettings:
name: "Navn" name: "Navn"
_moderationLogTypes: _moderationLogTypes:
suspend: "Suspender" suspend: "Suspender"

View file

@ -345,6 +345,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Włącz hCaptcha" enableHcaptcha: "Włącz hCaptcha"
hcaptchaSiteKey: "Klucz strony" hcaptchaSiteKey: "Klucz strony"
hcaptchaSecretKey: "Tajny klucz" hcaptchaSecretKey: "Tajny klucz"
mcaptchaSiteKey: "Klucz strony"
mcaptchaSecretKey: "Tajny klucz"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Włącz reCAPTCHA" enableRecaptcha: "Włącz reCAPTCHA"
recaptchaSiteKey: "Klucz strony" recaptchaSiteKey: "Klucz strony"
@ -1232,6 +1234,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "Wszystkie wpisy" allNotes: "Wszystkie wpisy"
favoritedNotes: "Ulubione wpisy" favoritedNotes: "Ulubione wpisy"
clips: "Klip"
followingList: "Obserwowani" followingList: "Obserwowani"
muteList: "Wycisz" muteList: "Wycisz"
blockingList: "Zablokuj" blockingList: "Zablokuj"
@ -1394,3 +1397,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Zawieś" suspend: "Zawieś"
resetPassword: "Zresetuj hasło" resetPassword: "Zresetuj hasło"
_reversi:
total: "Łącznie"

View file

@ -368,6 +368,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Ativar hCaptcha" enableHcaptcha: "Ativar hCaptcha"
hcaptchaSiteKey: "Chave do sítio web" hcaptchaSiteKey: "Chave do sítio web"
hcaptchaSecretKey: "Chave secreta" hcaptchaSecretKey: "Chave secreta"
mcaptchaSiteKey: "Chave do sítio web"
mcaptchaSecretKey: "Chave secreta"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Habilitar reCAPTCHA" enableRecaptcha: "Habilitar reCAPTCHA"
recaptchaSiteKey: "Chave do sítio web" recaptchaSiteKey: "Chave do sítio web"
@ -1008,6 +1010,7 @@ replies: "Respostas"
renotes: "Repostagens" renotes: "Repostagens"
keepScreenOn: "Manter a tela do dispositivo sempre ligada" keepScreenOn: "Manter a tela do dispositivo sempre ligada"
flip: "Inversão" flip: "Inversão"
lastNDays: "Últimos {n} dias"
_initialAccountSetting: _initialAccountSetting:
followUsers: "Siga usuários que lhe interessam para criar a sua linha do tempo." followUsers: "Siga usuários que lhe interessam para criar a sua linha do tempo."
_serverSettings: _serverSettings:
@ -1400,6 +1403,7 @@ _profile:
username: "Nome de usuário" username: "Nome de usuário"
_exportOrImport: _exportOrImport:
favoritedNotes: "Notas nos favoritos" favoritedNotes: "Notas nos favoritos"
clips: "Clipe"
followingList: "Seguindo" followingList: "Seguindo"
muteList: "Silenciar" muteList: "Silenciar"
blockingList: "Bloquear" blockingList: "Bloquear"
@ -1494,3 +1498,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Suspender" suspend: "Suspender"
resetPassword: "Redefinir senha" resetPassword: "Redefinir senha"
_reversi:
total: "Total"

View file

@ -359,6 +359,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Activează hCaptcha" enableHcaptcha: "Activează hCaptcha"
hcaptchaSiteKey: "Site key" hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key" hcaptchaSecretKey: "Secret key"
mcaptchaSiteKey: "Site key"
mcaptchaSecretKey: "Secret key"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Activează reCAPTCHA" enableRecaptcha: "Activează reCAPTCHA"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site key"
@ -725,3 +727,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Suspendă" suspend: "Suspendă"
resetPassword: "Resetează parola" resetPassword: "Resetează parola"
_reversi:
total: "Total"

View file

@ -53,8 +53,8 @@ addToAntenna: "Добавить к антенне"
sendMessage: "Отправить сообщение" sendMessage: "Отправить сообщение"
copyRSS: "Скопировать RSS" copyRSS: "Скопировать RSS"
copyUsername: "Скопировать имя пользователя" copyUsername: "Скопировать имя пользователя"
copyUserId: "Скопировать ID пользователя" copyUserId: "Скопировать идентификатор пользователя"
copyNoteId: "Скопировать ID заметки" copyNoteId: "Скопировать идентификатор заметки"
copyFileId: "Скопировать ID файла" copyFileId: "Скопировать ID файла"
copyFolderId: "Скопировать ID папки" copyFolderId: "Скопировать ID папки"
copyProfileUrl: "Скопировать URL профиля " copyProfileUrl: "Скопировать URL профиля "
@ -134,8 +134,8 @@ unmarkAsSensitive: "Снять отметку «не для всех»"
enterFileName: "Введите имя файла" enterFileName: "Введите имя файла"
mute: "Скрыть" mute: "Скрыть"
unmute: "Отменить скрытие" unmute: "Отменить скрытие"
renoteMute: "Заглушить репосты" renoteMute: "Скрыть репосты"
renoteUnmute: "Включить репосты" renoteUnmute: "Открыть репосты"
block: "Заблокировать" block: "Заблокировать"
unblock: "Разблокировать" unblock: "Разблокировать"
suspend: "Заморозить" suspend: "Заморозить"
@ -161,8 +161,8 @@ addEmoji: "Добавить эмодзи"
settingGuide: "Рекомендуемые настройки" settingGuide: "Рекомендуемые настройки"
cacheRemoteFiles: "Кешировать внешние файлы" cacheRemoteFiles: "Кешировать внешние файлы"
cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик, так как не будут создаваться эскизы." cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик, так как не будут создаваться эскизы."
cacheRemoteSensitiveFiles: "Кешировать внешние файлы" cacheRemoteSensitiveFiles: "Кэшировать внешние файлы «не для всех»"
cacheRemoteSensitiveFilesDescription: "Описание удаленных внешних файлов в кэше" cacheRemoteSensitiveFilesDescription: "Если отключено, файлы «не для всех» загружаются непосредственно с удалённых серверов, не кэшируясь."
flagAsBot: "Аккаунт бота" flagAsBot: "Аккаунт бота"
flagAsBotDescription: "Включите, если этот аккаунт управляется программой. Это позволит системе Misskey учитывать это, а также поможет разработчикам других ботов предотвратить бесконечные циклы взаимодействия." flagAsBotDescription: "Включите, если этот аккаунт управляется программой. Это позволит системе Misskey учитывать это, а также поможет разработчикам других ботов предотвратить бесконечные циклы взаимодействия."
flagAsCat: "Аккаунт кота" flagAsCat: "Аккаунт кота"
@ -261,6 +261,7 @@ removed: "Удалено"
removeAreYouSure: "Хотите удалить «{x}»?" removeAreYouSure: "Хотите удалить «{x}»?"
deleteAreYouSure: "Хотите удалить «{x}»?" deleteAreYouSure: "Хотите удалить «{x}»?"
resetAreYouSure: "На самом деле сбросить?" resetAreYouSure: "На самом деле сбросить?"
areYouSure: "Вы уверены?"
saved: "Сохранено" saved: "Сохранено"
messaging: "Сообщения" messaging: "Сообщения"
upload: "Загрузить" upload: "Загрузить"
@ -278,7 +279,7 @@ noMoreHistory: "История закончилась"
startMessaging: "Начать общение" startMessaging: "Начать общение"
nUsersRead: "Прочитали {n}" nUsersRead: "Прочитали {n}"
agreeTo: "Я соглашаюсь с {0}" agreeTo: "Я соглашаюсь с {0}"
agree: "Согласиться" agree: "Согласен"
agreeBelow: "Согласен со следующими" agreeBelow: "Согласен со следующими"
basicNotesBeforeCreateAccount: "Записи, перед созданием аккаунта" basicNotesBeforeCreateAccount: "Записи, перед созданием аккаунта"
termsOfService: "Условия использования" termsOfService: "Условия использования"
@ -324,7 +325,7 @@ copyUrl: "Копировать ссылку"
rename: "Переименовать" rename: "Переименовать"
avatar: "Аватар" avatar: "Аватар"
banner: "Шапка" banner: "Шапка"
displayOfSensitiveMedia: "Определение деликатного контента" displayOfSensitiveMedia: "Отображение содержимого не для всех"
whenServerDisconnected: "Когда соединение с сервером потеряно" whenServerDisconnected: "Когда соединение с сервером потеряно"
disconnectedFromServer: "Разорвано соединение с сервером" disconnectedFromServer: "Разорвано соединение с сервером"
reload: "Перезагрузить" reload: "Перезагрузить"
@ -372,6 +373,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Включить hCaptcha" enableHcaptcha: "Включить hCaptcha"
hcaptchaSiteKey: "Ключ сайта" hcaptchaSiteKey: "Ключ сайта"
hcaptchaSecretKey: "Секретный ключ" hcaptchaSecretKey: "Секретный ключ"
mcaptchaSiteKey: "Ключ сайта"
mcaptchaSecretKey: "Секретный ключ"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Включить reCAPTCHA" enableRecaptcha: "Включить reCAPTCHA"
recaptchaSiteKey: "Ключ сайта" recaptchaSiteKey: "Ключ сайта"
@ -413,7 +416,7 @@ about: "Описание"
aboutMisskey: "О Misskey" aboutMisskey: "О Misskey"
administrator: "Администратор" administrator: "Администратор"
token: "Токен" token: "Токен"
2fa: "2-х факторная аутентификация" 2fa: "Двухфакторная аутентификация"
setupOf2fa: "Настроить двухфакторную аутентификацию" setupOf2fa: "Настроить двухфакторную аутентификацию"
totp: "Приложение-аутентификатор" totp: "Приложение-аутентификатор"
totpDescription: "Описание приложения-аутентификатора" totpDescription: "Описание приложения-аутентификатора"
@ -477,7 +480,7 @@ aboutX: "Описание {x}"
emojiStyle: "Стиль эмодзи" emojiStyle: "Стиль эмодзи"
native: "Системные" native: "Системные"
disableDrawer: "Не использовать выдвижные меню" disableDrawer: "Не использовать выдвижные меню"
showNoteActionsOnlyHover: "Показывать кнопки управления заметкой только при наведении" showNoteActionsOnlyHover: "Показывать кнопки у заметок только при наведении"
noHistory: "История пока пуста" noHistory: "История пока пуста"
signinHistory: "Журнал посещений" signinHistory: "Журнал посещений"
enableAdvancedMfm: "Включить расширенный MFM" enableAdvancedMfm: "Включить расширенный MFM"
@ -490,8 +493,8 @@ createAccount: "Новая учётная запись"
existingAccount: "Существующая учётная запись" existingAccount: "Существующая учётная запись"
regenerate: "Создать повторно" regenerate: "Создать повторно"
fontSize: "Размер шрифта" fontSize: "Размер шрифта"
mediaListWithOneImageAppearance: "Показывать список медиа только одним изображением" mediaListWithOneImageAppearance: "Вид изображения, если оно единственное в списке"
limitTo: "Обрезать до {x}" limitTo: "Ограничить до {x}"
noFollowRequests: "Нерассмотренные запросы на подписку отсутствуют" noFollowRequests: "Нерассмотренные запросы на подписку отсутствуют"
openImageInNewTab: "Открыть изображение в новой вкладке" openImageInNewTab: "Открыть изображение в новой вкладке"
dashboard: "Панель управления" dashboard: "Панель управления"
@ -525,7 +528,7 @@ objectStorageUseSSLDesc: "Отключите, если не собираетес
objectStorageUseProxy: "Использовать прокси" objectStorageUseProxy: "Использовать прокси"
objectStorageUseProxyDesc: "Отключите, если не будете испоьзовать прокси для соединений по протоколу ObjectStorage." objectStorageUseProxyDesc: "Отключите, если не будете испоьзовать прокси для соединений по протоколу ObjectStorage."
objectStorageSetPublicRead: "Устанавливать public-read при загрузке на сервер" objectStorageSetPublicRead: "Устанавливать public-read при загрузке на сервер"
s3ForcePathStyleDesc: "Включение s3ForcePathStyle принудительно указывает имя корзины как часть пути в URL-адресе вместо имени хоста. Может потребоваться активация при использовании таких вещей, как локальный Minio." s3ForcePathStyleDesc: "Включение s3ForcePathStyle приводит к тому, что имя корзины указывается как часть пути в URL, а не в имени хоста. Может потребоваться включить при использовании локального Minio или чего-то подобного."
serverLogs: "Журнал сервера" serverLogs: "Журнал сервера"
deleteAll: "Удалить всё" deleteAll: "Удалить всё"
showFixedPostForm: "Показывать поле для ввода новой заметки наверху ленты" showFixedPostForm: "Показывать поле для ввода новой заметки наверху ленты"
@ -569,7 +572,7 @@ yourAccountSuspendedTitle: "Эта учетная запись заблокир
yourAccountSuspendedDescription: "Эта учетная запись была заблокирована из-за нарушения условий предоставления услуг сервера. Свяжитесь с администратором, если вы хотите узнать более подробную причину. Пожалуйста, не создавайте новую учетную запись." yourAccountSuspendedDescription: "Эта учетная запись была заблокирована из-за нарушения условий предоставления услуг сервера. Свяжитесь с администратором, если вы хотите узнать более подробную причину. Пожалуйста, не создавайте новую учетную запись."
tokenRevoked: "Токен недействителен" tokenRevoked: "Токен недействителен"
tokenRevokedDescription: "Срок действия вашего токена входа истек. Пожалуйста, войдите снова." tokenRevokedDescription: "Срок действия вашего токена входа истек. Пожалуйста, войдите снова."
accountDeleted: "Эта учетная запись удалена" accountDeleted: "Учетная запись удалена"
accountDeletedDescription: "Эта учетная запись удалена" accountDeletedDescription: "Эта учетная запись удалена"
menu: "Меню" menu: "Меню"
divider: "Линия-разделитель" divider: "Линия-разделитель"
@ -651,6 +654,7 @@ useGlobalSettingDesc: "Если включено, будут использов
other: "Другие" other: "Другие"
regenerateLoginToken: "Создать новый токен для входа" regenerateLoginToken: "Создать новый токен для входа"
regenerateLoginTokenDescription: "Создаёт новый токен, используемый внутри программы во время входа. Обычно в этом нет необходимости. При создании все устройства будут отключены." regenerateLoginTokenDescription: "Создаёт новый токен, используемый внутри программы во время входа. Обычно в этом нет необходимости. При создании все устройства будут отключены."
theKeywordWhenSearchingForCustomEmoji: "Это ключевое слово будет использовано при поиске эмодзи."
setMultipleBySeparatingWithSpace: "Можно написать несколько через пробел" setMultipleBySeparatingWithSpace: "Можно написать несколько через пробел"
fileIdOrUrl: "Идентификатор файла или ссылка" fileIdOrUrl: "Идентификатор файла или ссылка"
behavior: "Поведение" behavior: "Поведение"
@ -721,7 +725,7 @@ useSystemFont: "Использовать шрифт, предлагаемый с
clips: "Подборки" clips: "Подборки"
experimentalFeatures: "Экспериментальные функции" experimentalFeatures: "Экспериментальные функции"
experimental: "Экспериментальные" experimental: "Экспериментальные"
thisIsExperimentalFeature: "Это экспериментальная функция. Технические характеристики могут измениться или он может работать неправильно." thisIsExperimentalFeature: "Это экспериментальная функция. Её поведение, вероятно, поменяется в следующей версии, а ещё она может работать не так, как задумано."
developer: "Разработчик" developer: "Разработчик"
makeExplorable: "Опубликовать профиль в «Обзоре»." makeExplorable: "Опубликовать профиль в «Обзоре»."
makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»." makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе «Обзор»."
@ -806,7 +810,7 @@ noMaintainerInformationWarning: "Не заполнены сведения об
noBotProtectionWarning: "Ботозащита не настроена" noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить" configure: "Настроить"
postToGallery: "Опубликовать в галерею" postToGallery: "Опубликовать в галерею"
postToHashtag: "Опубликовать пост с этим хештегом" postToHashtag: "Написать заметку с этим хэштегом"
gallery: "Галерея" gallery: "Галерея"
recentPosts: "Недавние публикации" recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации" popularPosts: "Популярные публикации"
@ -835,7 +839,7 @@ useBlurEffect: "Размытие в интерфейсе"
learnMore: "Подробнее" learnMore: "Подробнее"
misskeyUpdated: "Misskey обновился!" misskeyUpdated: "Misskey обновился!"
whatIsNew: "Что новенького?" whatIsNew: "Что новенького?"
translate: "Перевод" translate: "Перевести"
translatedFrom: "Перевод. Язык оригинала — {x}" translatedFrom: "Перевод. Язык оригинала — {x}"
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи" accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи"
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже." usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже."
@ -847,11 +851,11 @@ lastCommunication: "Последнее сообщение"
resolved: "Решено" resolved: "Решено"
unresolved: "Без решения" unresolved: "Без решения"
breakFollow: "Отписка" breakFollow: "Отписка"
breakFollowConfirm: "Удалить из подписок пользователя ?" breakFollowConfirm: "Действительно удалить этого подписчика?"
itsOn: "Включено" itsOn: "Включено"
itsOff: "Выключено" itsOff: "Выключено"
on: "Вкл" on: "Вкл."
off: "Выкл" off: "Выкл."
emailRequiredForSignup: "Для регистрации учётной записи нужен адрес электронной почты" emailRequiredForSignup: "Для регистрации учётной записи нужен адрес электронной почты"
unread: "Непрочитанное" unread: "Непрочитанное"
filter: "Фильтры" filter: "Фильтры"
@ -880,7 +884,7 @@ numberOfColumn: "Количество столбцов"
searchByGoogle: "Поиск" searchByGoogle: "Поиск"
instanceDefaultLightTheme: "Светлая тема по умолчанию" instanceDefaultLightTheme: "Светлая тема по умолчанию"
instanceDefaultDarkTheme: "Темная тема по умолчанию" instanceDefaultDarkTheme: "Темная тема по умолчанию"
instanceDefaultThemeDescription: "Описание темы по умолчанию для инстанса" instanceDefaultThemeDescription: "Введите код темы в формате объекта."
mutePeriod: "Продолжительность скрытия" mutePeriod: "Продолжительность скрытия"
period: "Опрос длится" period: "Опрос длится"
indefinitely: "вечно" indefinitely: "вечно"
@ -904,7 +908,7 @@ thereIsUnresolvedAbuseReportWarning: "Остались нерешённые жа
recommended: "Рекомендуем" recommended: "Рекомендуем"
check: "Проверить" check: "Проверить"
driveCapOverrideLabel: "Изменение лимита дискового пространства для этого пользователя" driveCapOverrideLabel: "Изменение лимита дискового пространства для этого пользователя"
driveCapOverrideCaption: "Укажите меньше или равное нулю для отмены" driveCapOverrideCaption: "Введите нуль или меньше, чтобы использовать значение по умолчанию."
requireAdminForView: "Для просмотра необходимо иметь аккаунт администратора" requireAdminForView: "Для просмотра необходимо иметь аккаунт администратора"
isSystemAccount: "Данная учётная запись создана автоматически и управляется системой" isSystemAccount: "Данная учётная запись создана автоматически и управляется системой"
typeToConfirm: "Введите {x} для продолжения" typeToConfirm: "Введите {x} для продолжения"
@ -924,7 +928,7 @@ type: "Тип"
speed: "Скорость" speed: "Скорость"
slow: "Медленная" slow: "Медленная"
fast: "Быстрая" fast: "Быстрая"
sensitiveMediaDetection: "Определение содержимого деликатного характера" sensitiveMediaDetection: "Распознание содержимого не для всех"
localOnly: "Локально" localOnly: "Локально"
remoteOnly: "Только удалённо" remoteOnly: "Только удалённо"
failedToUpload: "Сбой выгрузки" failedToUpload: "Сбой выгрузки"
@ -1001,10 +1005,11 @@ invitationRequiredToRegister: "Этот сервер в настоящее вр
emailNotSupported: "Доставка почты не поддерживается на этом сервере" emailNotSupported: "Доставка почты не поддерживается на этом сервере"
postToTheChannel: "Отправить в канал" postToTheChannel: "Отправить в канал"
cannotBeChangedLater: "Это нельзя изменить позже" cannotBeChangedLater: "Это нельзя изменить позже"
reactionAcceptance: "Принятие реакций" reactionAcceptance: "Допустимые реакции"
likeOnly: "Только лайки" likeOnly: "Только «нравится!»"
likeOnlyForRemote: "Только лайки с удалённых серверов" likeOnlyForRemote: "Всё (с других серверов только «нравится!»)"
nonSensitiveOnly: "Безопасный серфинг" nonSensitiveOnly: "Только безопасные"
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Только безопасные (с других серверов только «нравится!»)"
rolesAssignedToMe: "Мои роли" rolesAssignedToMe: "Мои роли"
resetPasswordConfirm: "Сбросить пароль?" resetPasswordConfirm: "Сбросить пароль?"
sensitiveWords: "Чувствительные слова" sensitiveWords: "Чувствительные слова"
@ -1024,20 +1029,20 @@ noteIdOrUrl: "ID или ссылка на заметку"
video: "Видео" video: "Видео"
videos: "Видео" videos: "Видео"
dataSaver: "Экономия трафика" dataSaver: "Экономия трафика"
accountMigration: "Перенести учётную запись" accountMigration: "Перенос учётной записи"
accountMoved: "Учетная запись перенесена" accountMoved: "Учётная запись перенесена"
accountMovedShort: "Эта учётная запись перемещена" accountMovedShort: "Эта учётная запись перемещена"
operationForbidden: "Эта операция невозможна." operationForbidden: "Это действие запрещено"
forceShowAds: "Всегда отображать рекламу" forceShowAds: "Всегда отображать рекламу"
addMemo: "Добавить заметку" addMemo: "Добавить памятку"
editMemo: "Редактировать заметку" editMemo: "Изменить памятку"
reactionsList: "Реакции" reactionsList: "Список реакций"
renotesList: "Репосты" renotesList: "Репосты"
notificationDisplay: "Отображение уведомления" notificationDisplay: "Отображение уведомлений"
leftTop: "Верхний левый угол" leftTop: "Влево вверх"
rightTop: "Сверху справа" rightTop: "Вправо вверх"
leftBottom: "Снизу слева" leftBottom: "Влево вниз"
rightBottom: "Снизу справа" rightBottom: "Вправо вниз"
vertical: "Вертикальная" vertical: "Вертикальная"
horizontal: "Сбоку" horizontal: "Сбоку"
position: "Позиция" position: "Позиция"
@ -1077,6 +1082,7 @@ replies: "Ответы"
renotes: "Репост" renotes: "Репост"
loadReplies: "Показать ответы" loadReplies: "Показать ответы"
flip: "Переворот" flip: "Переворот"
lastNDays: "Последние {n} сут"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "Аккаунт успешно создан!" accountCreated: "Аккаунт успешно создан!"
letsStartAccountSetup: "Давайте настроим вашу учётную запись." letsStartAccountSetup: "Давайте настроим вашу учётную запись."
@ -1693,7 +1699,7 @@ _weekday:
_widgets: _widgets:
profile: "Профиль" profile: "Профиль"
instanceInfo: "Информация об инстансе" instanceInfo: "Информация об инстансе"
memo: "Напоминания" memo: "Памятки"
notifications: "Уведомления" notifications: "Уведомления"
timeline: "Лента" timeline: "Лента"
calendar: "Календарь" calendar: "Календарь"
@ -1784,6 +1790,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "Все заметки\n" allNotes: "Все заметки\n"
favoritedNotes: "Избранное" favoritedNotes: "Избранное"
clips: "Подборка"
followingList: "Подписки" followingList: "Подписки"
muteList: "Скрытые" muteList: "Скрытые"
blockingList: "Заблокированные" blockingList: "Заблокированные"
@ -1959,4 +1966,10 @@ _webhookSettings:
active: "Вкл." active: "Вкл."
_moderationLogTypes: _moderationLogTypes:
suspend: "Заморозить" suspend: "Заморозить"
addCustomEmoji: "Добавлено эмодзи"
updateCustomEmoji: "Изменено эмодзи"
deleteCustomEmoji: "Удалено эмодзи"
resetPassword: "Сброс пароля:" resetPassword: "Сброс пароля:"
_reversi:
total: "Всего"

View file

@ -1 +1,2 @@
--- ---

View file

@ -349,6 +349,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Zapnúť hCaptchu" enableHcaptcha: "Zapnúť hCaptchu"
hcaptchaSiteKey: "Site key" hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key" hcaptchaSecretKey: "Secret key"
mcaptchaSiteKey: "Site key"
mcaptchaSecretKey: "Secret key"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Zapnúť ReCAPTCHA" enableRecaptcha: "Zapnúť ReCAPTCHA"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site key"
@ -918,6 +920,7 @@ icon: "Avatar"
replies: "Odpovede" replies: "Odpovede"
renotes: "Preposlať" renotes: "Preposlať"
flip: "Preklopiť" flip: "Preklopiť"
lastNDays: "Posledných {n} dní"
_role: _role:
priority: "Priorita" priority: "Priorita"
_priority: _priority:
@ -1284,6 +1287,7 @@ _profile:
changeBanner: "Zmeniť banner" changeBanner: "Zmeniť banner"
_exportOrImport: _exportOrImport:
allNotes: "Všetky poznámky" allNotes: "Všetky poznámky"
clips: "Klip"
followingList: "Sledujete" followingList: "Sledujete"
muteList: "Vypnúť zvuk" muteList: "Vypnúť zvuk"
blockingList: "Zablokovať" blockingList: "Zablokovať"
@ -1441,3 +1445,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Zmraziť" suspend: "Zmraziť"
resetPassword: "Resetovať heslo" resetPassword: "Resetovať heslo"
_reversi:
total: "Celkom"

View file

@ -345,6 +345,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Aktivera hCaptcha" enableHcaptcha: "Aktivera hCaptcha"
hcaptchaSiteKey: "Webbplatsnyckel" hcaptchaSiteKey: "Webbplatsnyckel"
hcaptchaSecretKey: "Hemlig nyckel" hcaptchaSecretKey: "Hemlig nyckel"
mcaptchaSiteKey: "Webbplatsnyckel"
mcaptchaSecretKey: "Hemlig nyckel"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Aktivera reCAPTCHA" enableRecaptcha: "Aktivera reCAPTCHA"
recaptchaSiteKey: "Webbplatsnyckel" recaptchaSiteKey: "Webbplatsnyckel"
@ -574,3 +576,4 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Suspendera" suspend: "Suspendera"
resetPassword: "Återställ Lösenord" resetPassword: "Återställ Lösenord"

File diff suppressed because it is too large Load diff

View file

@ -455,3 +455,4 @@ _deck:
_moderationLogTypes: _moderationLogTypes:
suspend: "askıya al" suspend: "askıya al"
resetPassword: "Şifre sıfırlama" resetPassword: "Şifre sıfırlama"

View file

@ -17,3 +17,4 @@ _2fa:
renewTOTPCancel: "ئۇنى توختىتىڭ" renewTOTPCancel: "ئۇنى توختىتىڭ"
_widgets: _widgets:
profile: "profile" profile: "profile"

View file

@ -352,6 +352,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Увімкнути hCaptcha" enableHcaptcha: "Увімкнути hCaptcha"
hcaptchaSiteKey: "Ключ сайту" hcaptchaSiteKey: "Ключ сайту"
hcaptchaSecretKey: "Секретний ключ" hcaptchaSecretKey: "Секретний ключ"
mcaptchaSiteKey: "Ключ сайту"
mcaptchaSecretKey: "Секретний ключ"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Увімкнути reCAPTCHA" enableRecaptcha: "Увімкнути reCAPTCHA"
recaptchaSiteKey: "Ключ сайту" recaptchaSiteKey: "Ключ сайту"
@ -910,6 +912,7 @@ icon: "Аватар"
replies: "Відповісти" replies: "Відповісти"
renotes: "Поширити" renotes: "Поширити"
flip: "Перевернути" flip: "Перевернути"
lastNDays: "Останні {n} днів"
_achievements: _achievements:
earnedAt: "Відкрито" earnedAt: "Відкрито"
_types: _types:
@ -1468,6 +1471,7 @@ _profile:
changeBanner: "Змінити банер" changeBanner: "Змінити банер"
_exportOrImport: _exportOrImport:
allNotes: "Всі нотатки" allNotes: "Всі нотатки"
clips: "Добірка"
followingList: "Підписки" followingList: "Підписки"
muteList: "Ігнорувати" muteList: "Ігнорувати"
blockingList: "Заблокувати" blockingList: "Заблокувати"
@ -1616,3 +1620,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Призупинити" suspend: "Призупинити"
resetPassword: "Скинути пароль" resetPassword: "Скинути пароль"
_reversi:
total: "Всього"

View file

@ -366,6 +366,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptchani yoqish" enableHcaptcha: "hCaptchani yoqish"
hcaptchaSiteKey: "Sayt kaliti" hcaptchaSiteKey: "Sayt kaliti"
hcaptchaSecretKey: "Mahfiy kalit" hcaptchaSecretKey: "Mahfiy kalit"
mcaptchaSiteKey: "Sayt kaliti"
mcaptchaSecretKey: "Maxfiy kalit"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHA ni yoqish" enableRecaptcha: "reCAPTCHA ni yoqish"
recaptchaSiteKey: "Sayt kaliti" recaptchaSiteKey: "Sayt kaliti"
@ -973,6 +975,7 @@ _profile:
changeBanner: "Bannerni o'zgartirish" changeBanner: "Bannerni o'zgartirish"
_exportOrImport: _exportOrImport:
allNotes: "Barcha qaydlar" allNotes: "Barcha qaydlar"
clips: "Klip"
followingList: "Obuna bolish" followingList: "Obuna bolish"
muteList: "Ovozni ochirish" muteList: "Ovozni ochirish"
blockingList: "Bloklangan foydalanuvchilar" blockingList: "Bloklangan foydalanuvchilar"
@ -1085,3 +1088,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "To'xtatish" suspend: "To'xtatish"
resetPassword: "Parolni tiklash" resetPassword: "Parolni tiklash"
_reversi:
total: "Jami"

View file

@ -368,6 +368,8 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "Bật hCaptcha" enableHcaptcha: "Bật hCaptcha"
hcaptchaSiteKey: "Khóa của trang" hcaptchaSiteKey: "Khóa của trang"
hcaptchaSecretKey: "Khóa bí mật" hcaptchaSecretKey: "Khóa bí mật"
mcaptchaSiteKey: "Khóa của trang"
mcaptchaSecretKey: "Khóa bí mật"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Bật reCAPTCHA" enableRecaptcha: "Bật reCAPTCHA"
recaptchaSiteKey: "Khóa của trang" recaptchaSiteKey: "Khóa của trang"
@ -1044,6 +1046,7 @@ pinnedList: "Các mục đã được ghim"
keepScreenOn: "Giữ màn hình luôn bật" keepScreenOn: "Giữ màn hình luôn bật"
verifiedLink: "Chúng tôi đã xác nhận bạn là chủ sở hữu của đường dẫn này" verifiedLink: "Chúng tôi đã xác nhận bạn là chủ sở hữu của đường dẫn này"
flip: "Lật" flip: "Lật"
lastNDays: "{n} ngày trước"
_announcement: _announcement:
forExistingUsers: "Chỉ những người dùng đã tồn tại" forExistingUsers: "Chỉ những người dùng đã tồn tại"
forExistingUsersDescription: "Nếu được bật, thông báo này sẽ chỉ hiển thị với những người dùng đã tồn tại vào lúc thông báo được tạo. Nếu tắt đi, những tài khoản mới đăng ký sau khi thông báo được đăng lên cũng sẽ thấy nó." forExistingUsersDescription: "Nếu được bật, thông báo này sẽ chỉ hiển thị với những người dùng đã tồn tại vào lúc thông báo được tạo. Nếu tắt đi, những tài khoản mới đăng ký sau khi thông báo được đăng lên cũng sẽ thấy nó."
@ -1669,6 +1672,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "Toàn bộ tút" allNotes: "Toàn bộ tút"
favoritedNotes: "Bài viết đã thích" favoritedNotes: "Bài viết đã thích"
clips: "Lưu bài viết"
followingList: "Đang theo dõi" followingList: "Đang theo dõi"
muteList: "Ẩn" muteList: "Ẩn"
blockingList: "Chặn" blockingList: "Chặn"
@ -1846,3 +1850,6 @@ _webhookSettings:
_moderationLogTypes: _moderationLogTypes:
suspend: "Vô hiệu hóa" suspend: "Vô hiệu hóa"
resetPassword: "Đặt lại mật khẩu" resetPassword: "Đặt lại mật khẩu"
_reversi:
total: "Tổng cộng"

View file

@ -121,14 +121,21 @@ sensitive: "敏感内容"
add: "添加" add: "添加"
reaction: "回应" reaction: "回应"
reactions: "回应" reactions: "回应"
emojiPicker: "表情符号选择器"
pinnedEmojisForReactionSettingDescription: "可以设置发表回应时置顶显示的表情符号"
pinnedEmojisSettingDescription: "可以设置输入表情符号时置顶显示的表情符号"
emojiPickerDisplay: "选择器显示设置"
overwriteFromPinnedEmojisForReaction: "从「置顶(回应)」设置覆盖"
overwriteFromPinnedEmojis: "从全局设置覆盖"
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
rememberNoteVisibility: "保存上次设置的可见性" rememberNoteVisibility: "保存上次设置的可见性"
attachCancel: "删除附件" attachCancel: "删除附件"
deleteFile: "删除文件"
markAsSensitive: "标记为敏感内容" markAsSensitive: "标记为敏感内容"
unmarkAsSensitive: "取消标记为敏感内容" unmarkAsSensitive: "取消标记为敏感内容"
enterFileName: "输入文件名" enterFileName: "输入文件名"
mute: "屏蔽" mute: "屏蔽"
unmute: "解除屏蔽" unmute: "解除静音"
renoteMute: "屏蔽转帖" renoteMute: "屏蔽转帖"
renoteUnmute: "解除屏蔽转帖" renoteUnmute: "解除屏蔽转帖"
block: "拉黑" block: "拉黑"
@ -209,15 +216,15 @@ instanceInfo: "服务器信息"
statistics: "统计" statistics: "统计"
clearQueue: "清除队列" clearQueue: "清除队列"
clearQueueConfirmTitle: "确定清除队列?" clearQueueConfirmTitle: "确定清除队列?"
clearQueueConfirmText: "未送达的帖子将不会投递。 通常,您不需要这样做。" clearQueueConfirmText: "未送达的帖子将不会被投递。 通常无需执行此操作。"
clearCachedFiles: "清除缓存" clearCachedFiles: "清除缓存"
clearCachedFilesConfirm: "确定要清除缓存文件?" clearCachedFilesConfirm: "确定要清除所有缓存的远程文件?"
blockedInstances: "被封锁的服务器" blockedInstances: "被封锁的服务器"
blockedInstancesDescription: "设定要封锁的服务器,以换行来进行分割。被封锁的服务器将无法与本服务器进行交换通讯。子域名也同样会被封锁。" blockedInstancesDescription: "设定要封锁的服务器,以换行来进行分割。被封锁的服务器将无法与本服务器进行交换通讯。子域名也同样会被封锁。"
silencedInstances: "沉默的服务器" silencedInstances: "被静音的服务器"
silencedInstancesDescription: "设置要静音的服务器的主机,以换行符分隔。属于静默服务器的所有帐户都将被视为“静默”,所有关注都将成为请求,并且您将无法提及非关注者的本地帐户。被阻止的实例不受影响。" silencedInstancesDescription: "设置要静音的服务器,以换行符分隔。被静音的服务器内所有的账户将默认处于「静音」状态,仅能发送关注请求,并且在未关注状态下无法提及本地账户。被阻止的实例不受影响。"
muteAndBlock: "屏蔽/拉黑" muteAndBlock: "静音/拉黑"
mutedUsers: "已屏蔽用户" mutedUsers: "已静音用户"
blockedUsers: "已拉黑的用户" blockedUsers: "已拉黑的用户"
noUsers: "无用户" noUsers: "无用户"
editProfile: "编辑资料" editProfile: "编辑资料"
@ -260,6 +267,7 @@ removed: "已删除"
removeAreYouSure: "要删掉「{x}」吗?" removeAreYouSure: "要删掉「{x}」吗?"
deleteAreYouSure: "要删掉「{x}」吗?" deleteAreYouSure: "要删掉「{x}」吗?"
resetAreYouSure: "恢复默认设置?" resetAreYouSure: "恢复默认设置?"
areYouSure: "你确定吗?"
saved: "已保存" saved: "已保存"
messaging: "聊天" messaging: "聊天"
upload: "本地上传" upload: "本地上传"
@ -352,7 +360,7 @@ connectService: "连接"
disconnectService: "断开连接" disconnectService: "断开连接"
enableLocalTimeline: "启用本地时间线" enableLocalTimeline: "启用本地时间线"
enableGlobalTimeline: "启用全局时间线" enableGlobalTimeline: "启用全局时间线"
disablingTimelinesInfo: "即使时间线功能被禁用,出于方便,管理员和协作者也可以继续使用。" disablingTimelinesInfo: "即使时间线功能被禁用,出于方便,管理员和监察员也可以继续使用。"
registration: "注册" registration: "注册"
enableRegistration: "允许任何人注册" enableRegistration: "允许任何人注册"
invite: "邀请" invite: "邀请"
@ -372,15 +380,20 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "启用 hCaptcha" enableHcaptcha: "启用 hCaptcha"
hcaptchaSiteKey: "网站密钥" hcaptchaSiteKey: "网站密钥"
hcaptchaSecretKey: "hCaptcha 密钥(SecretKey)" hcaptchaSecretKey: "hCaptcha 密钥(SecretKey)"
mcaptcha: "mCaptcha"
enableMcaptcha: "启用 mCaptcha"
mcaptchaSiteKey: "网站密钥"
mcaptchaSecretKey: "mCaptcha 密钥(SecretKey)"
mcaptchaInstanceUrl: "mCaptcha 实例地址"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)" enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)"
recaptchaSiteKey: "网站密钥" recaptchaSiteKey: "网站密钥"
recaptchaSecretKey: "reCAPTCHA 密钥(SecretKey)" recaptchaSecretKey: "mCaptcha 密钥(SecretKey)"
turnstile: "Turnstile" turnstile: "Turnstile"
enableTurnstile: "启用 Turnstile" enableTurnstile: "启用 Turnstile"
turnstileSiteKey: "网站密钥" turnstileSiteKey: "网站密钥"
turnstileSecretKey: "Turnstile 密钥(SecretKey)" turnstileSecretKey: "Turnstile 密钥(SecretKey)"
avoidMultiCaptchaConfirm: "使用多种验证方式可能会造成干扰,您要禁用其他验证方式吗?您可以按“取消”按钮,继续保持启用多种验证方式。" avoidMultiCaptchaConfirm: "使用多个 Captcha 可能会互相干扰,您要禁用其它 Captcha 吗?您可以按“取消”按钮,继续保持启用多种验证方式。"
antennas: "天线" antennas: "天线"
manageAntennas: "天线管理" manageAntennas: "天线管理"
name: "名称" name: "名称"
@ -477,7 +490,7 @@ or: "或者"
language: "语言" language: "语言"
uiLanguage: "显示语言" uiLanguage: "显示语言"
aboutX: "关于 {x}" aboutX: "关于 {x}"
emojiStyle: "emoji 的样式" emojiStyle: "表情符号的样式"
native: "原生" native: "原生"
disableDrawer: "不显示抽屉菜单" disableDrawer: "不显示抽屉菜单"
showNoteActionsOnlyHover: "仅在悬停时显示帖子操作" showNoteActionsOnlyHover: "仅在悬停时显示帖子操作"
@ -514,7 +527,7 @@ showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
objectStorage: "对象存储" objectStorage: "对象存储"
useObjectStorage: "使用对象存储" useObjectStorage: "使用对象存储"
objectStorageBaseUrl: "Base URL" objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "这里是用于参考的 URL如果您正在使用 CDN 或反向代理,请指定其 URL例如 S3“https://<bucket>.s3.amazonaws.com”GCS“https://storage.googleapis.com/<bucket>”" objectStorageBaseUrlDesc: "用于参考的 URL如果您正在使用 CDN 或 Proxy请填入服务商提供的 URLS3“https://<bucket>.s3.amazonaws.com”GCS“https://storage.googleapis.com/<bucket>”"
objectStorageBucket: "存储桶" objectStorageBucket: "存储桶"
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。" objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
objectStoragePrefix: "前缀" objectStoragePrefix: "前缀"
@ -533,6 +546,7 @@ serverLogs: "服务器日志"
deleteAll: "全部删除" deleteAll: "全部删除"
showFixedPostForm: "在时间线顶部显示发帖框" showFixedPostForm: "在时间线顶部显示发帖框"
showFixedPostFormInChannel: "在时间线顶部显示发帖对话框(频道)" showFixedPostFormInChannel: "在时间线顶部显示发帖对话框(频道)"
withRepliesByDefaultForNewlyFollowed: "在时间线中默认包含新关注用户的回复"
newNoteRecived: "有新的帖子" newNoteRecived: "有新的帖子"
sounds: "提示音" sounds: "提示音"
sound: "提示音" sound: "提示音"
@ -542,6 +556,8 @@ showInPage: "在页面中显示"
popout: "弹窗" popout: "弹窗"
volume: "音量" volume: "音量"
masterVolume: "主音量" masterVolume: "主音量"
notUseSound: "静音"
useSoundOnlyWhenActive: "仅在 Misskey 活跃时输出声音"
details: "详情" details: "详情"
chooseEmoji: "选择表情符号" chooseEmoji: "选择表情符号"
unableToProcess: "操作无法完成" unableToProcess: "操作无法完成"
@ -562,10 +578,14 @@ output: "输出"
script: "脚本" script: "脚本"
disablePagesScript: "禁用页面脚本" disablePagesScript: "禁用页面脚本"
updateRemoteUser: "更新远程用户信息" updateRemoteUser: "更新远程用户信息"
unsetUserAvatar: "清除头像"
unsetUserAvatarConfirm: "要清除头像吗?"
unsetUserBanner: "清除横幅"
unsetUserBannerConfirm: "要清除横幅吗?"
deleteAllFiles: "删除所有文件" deleteAllFiles: "删除所有文件"
deleteAllFilesConfirm: "要删除所有文件吗?" deleteAllFilesConfirm: "要删除所有文件吗?"
removeAllFollowing: "取消所有关注" removeAllFollowing: "取消所有关注"
removeAllFollowingDescription: "取消 {host} 的所有关注者。当服务器不再存在时执行。" removeAllFollowingDescription: "取消来自 {host} 的所有关注者。当服务器不再存在时执行。"
userSuspended: "该用户已被冻结。" userSuspended: "该用户已被冻结。"
userSilenced: "该用户已被禁言。" userSilenced: "该用户已被禁言。"
yourAccountSuspendedTitle: "账户已被冻结" yourAccountSuspendedTitle: "账户已被冻结"
@ -612,6 +632,7 @@ medium: "中"
small: "小" small: "小"
generateAccessToken: "生成访问令牌" generateAccessToken: "生成访问令牌"
permission: "权限" permission: "权限"
adminPermission: "管理员权限"
enableAll: "启用全部" enableAll: "启用全部"
disableAll: "禁用全部" disableAll: "禁用全部"
tokenRequested: "允许访问账户" tokenRequested: "允许访问账户"
@ -633,6 +654,7 @@ smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS"
smtpSecureInfo: "使用 STARTTLS 时关闭。" smtpSecureInfo: "使用 STARTTLS 时关闭。"
testEmail: "邮件发送测试" testEmail: "邮件发送测试"
wordMute: "文字屏蔽" wordMute: "文字屏蔽"
hardWordMute: "屏蔽关键词"
regexpError: "正则表达式错误" regexpError: "正则表达式错误"
regexpErrorDescription: "{tab} 屏蔽文字的第 {line} 行的正则表达式有错误:" regexpErrorDescription: "{tab} 屏蔽文字的第 {line} 行的正则表达式有错误:"
instanceMute: "被屏蔽的服务器" instanceMute: "被屏蔽的服务器"
@ -654,6 +676,7 @@ useGlobalSettingDesc: "启用时,将使用账户通知设置。关闭时,则
other: "其他" other: "其他"
regenerateLoginToken: "重新生成登录令牌" regenerateLoginToken: "重新生成登录令牌"
regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通常您不需要这样做。重新生成后,您将在所有设备上登出。" regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通常您不需要这样做。重新生成后,您将在所有设备上登出。"
theKeywordWhenSearchingForCustomEmoji: "这将是搜素自定义表情符号时的关键词。"
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。" setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
fileIdOrUrl: "文件 ID 或者 URL" fileIdOrUrl: "文件 ID 或者 URL"
behavior: "行为" behavior: "行为"
@ -866,6 +889,8 @@ makeReactionsPublicDescription: "将您发表过的回应设置成公开可见
classic: "经典" classic: "经典"
muteThread: "屏蔽帖子列表" muteThread: "屏蔽帖子列表"
unmuteThread: "取消屏蔽帖子列表" unmuteThread: "取消屏蔽帖子列表"
followingVisibility: "关注的人的公开范围"
followersVisibility: "关注者的公开范围"
continueThread: "查看更多帖子" continueThread: "查看更多帖子"
deleteAccountConfirm: "将要删除账户。是否确认?" deleteAccountConfirm: "将要删除账户。是否确认?"
incorrectPassword: "密码错误" incorrectPassword: "密码错误"
@ -949,7 +974,7 @@ unsubscribePushNotification: "停用推送通知消息"
pushNotificationAlreadySubscribed: "推送通知消息已启用" pushNotificationAlreadySubscribed: "推送通知消息已启用"
pushNotificationNotSupported: "浏览器或服务器不支持推送通知消息" pushNotificationNotSupported: "浏览器或服务器不支持推送通知消息"
sendPushNotificationReadMessage: "删除已读推送通知消息" sendPushNotificationReadMessage: "删除已读推送通知消息"
sendPushNotificationReadMessageCaption: "“{emptyPushNotificationMessage}”的通知消息将会显示。您终端设备的电池消耗可能会增加。" sendPushNotificationReadMessageCaption: "您终端设备的电池消耗可能会增加。"
windowMaximize: "最大化" windowMaximize: "最大化"
windowMinimize: "最小化" windowMinimize: "最小化"
windowRestore: "还原" windowRestore: "还原"
@ -975,6 +1000,7 @@ assign: "分配"
unassign: "取消分配" unassign: "取消分配"
color: "颜色" color: "颜色"
manageCustomEmojis: "管理自定义表情符号" manageCustomEmojis: "管理自定义表情符号"
manageAvatarDecorations: "管理头像挂件"
youCannotCreateAnymore: "抱歉,您无法再创建更多了。" youCannotCreateAnymore: "抱歉,您无法再创建更多了。"
cannotPerformTemporary: "暂时不可用" cannotPerformTemporary: "暂时不可用"
cannotPerformTemporaryDescription: "因操作过于频繁,暂时不可用,请稍后再试。" cannotPerformTemporaryDescription: "因操作过于频繁,暂时不可用,请稍后再试。"
@ -1015,6 +1041,8 @@ resetPasswordConfirm: "确定重置密码?"
sensitiveWords: "敏感词" sensitiveWords: "敏感词"
sensitiveWordsDescription: "将包含设置词的帖子的可见范围设置为首页。可以通过用换行符分隔来设置多个。" sensitiveWordsDescription: "将包含设置词的帖子的可见范围设置为首页。可以通过用换行符分隔来设置多个。"
sensitiveWordsDescription2: "AND 条件用空格分隔,正则表达式用斜线包裹。" sensitiveWordsDescription2: "AND 条件用空格分隔,正则表达式用斜线包裹。"
hiddenTags: "隐藏标签"
hiddenTagsDescription: "设定的标签将不会在时间线上显示。可使用换行来设置多个标签。"
notesSearchNotAvailable: "帖子检索不可用" notesSearchNotAvailable: "帖子检索不可用"
license: "许可信息" license: "许可信息"
unfavoriteConfirm: "确定要取消收藏吗?" unfavoriteConfirm: "确定要取消收藏吗?"
@ -1027,9 +1055,12 @@ enableChartsForRemoteUser: "生成远程用户的图表"
enableChartsForFederatedInstances: "生成远程服务器的图表" enableChartsForFederatedInstances: "生成远程服务器的图表"
showClipButtonInNoteFooter: "在贴文下方显示便签按钮" showClipButtonInNoteFooter: "在贴文下方显示便签按钮"
reactionsDisplaySize: "回应显示大小" reactionsDisplaySize: "回应显示大小"
limitWidthOfReaction: "限制回应的最大宽度,并将其缩小显示"
noteIdOrUrl: "帖子 ID 或 URL" noteIdOrUrl: "帖子 ID 或 URL"
video: "视频" video: "视频"
videos: "视频" videos: "视频"
audio: "音频"
audioFiles: "音频"
dataSaver: "省流量模式" dataSaver: "省流量模式"
accountMigration: "账户迁移" accountMigration: "账户迁移"
accountMoved: "此用户已迁移账户" accountMoved: "此用户已迁移账户"
@ -1126,19 +1157,67 @@ edited: "已编辑"
notificationRecieveConfig: "通知接收设置" notificationRecieveConfig: "通知接收设置"
mutualFollow: "互相关注" mutualFollow: "互相关注"
fileAttachedOnly: "仅限媒体" fileAttachedOnly: "仅限媒体"
showRepliesToOthersInTimeline: "在时间线上显示给其他人的回复" showRepliesToOthersInTimeline: "在时间线中包含给别人的回复"
hideRepliesToOthersInTimeline: "在时间线上隐藏给其他人的回复" hideRepliesToOthersInTimeline: "在时间线中隐藏给别人的回复"
showRepliesToOthersInTimelineAll: "在时间线中包含现在关注的所有人的回复"
hideRepliesToOthersInTimelineAll: "在时间线中隐藏现在关注的所有人的回复"
confirmShowRepliesAll: "此操作不可撤销。确认要在时间线中包含现在关注的所有人的回复吗?"
confirmHideRepliesAll: "此操作不可撤销。确认要在时间线中隐藏现在关注的所有人的回复吗?"
externalServices: "外部服务"
impressum: "运营商信息"
impressumUrl: "运营商信息地址"
impressumDescription: "德国等国家和地区有义务展示此类信息Impressum。"
privacyPolicy: "隐私政策"
privacyPolicyUrl: "隐私政策地址"
tosAndPrivacyPolicy: "服务条款及隐私政策"
avatarDecorations: "头像挂件" avatarDecorations: "头像挂件"
attach: "佩戴"
detach: "卸下"
detachAll: "全部卸下"
angle: "角度"
flip: "翻转" flip: "翻转"
showAvatarDecorations: "显示头像挂件"
releaseToRefresh: "松开以刷新"
refreshing: "刷新中"
pullDownToRefresh: "下拉以刷新"
disableStreamingTimeline: "禁止实时更新时间线"
useGroupedNotifications: "分组显示通知"
signupPendingError: "确认电子邮件时出现错误。链接可能已过期。"
cwNotationRequired: "在启用「隐藏内容」时必须输入注释"
doReaction: "回应"
reloadRequiredToApplySettings: "需要重新载入来使设置生效"
remainingN: "剩余:{n}"
overwriteContentConfirm: "将覆盖现有内容。确定吗?"
seasonalScreenEffect: "应景的画面效果"
decorate: "装饰"
addMfmFunction: "添加装饰"
enableQuickAddMfmFunction: "显示高级 MFM 选择器"
sfx: "音效"
soundWillBePlayed: "声音将会播放"
showReplay: "查看重播"
replay: "重播"
replaying: "重播中"
ranking: "排行榜"
lastNDays: "最近 {n} 天"
backToTitle: "返回标题"
hemisphere: "居住地区"
withSensitive: "显示包含敏感媒体的帖子"
enableHorizontalSwipe: "滑动切换标签页"
_bubbleGame:
howToPlay: "游戏说明"
_announcement: _announcement:
forExistingUsers: "仅限现有用户" forExistingUsers: "仅限现有用户"
forExistingUsersDescription: "若启用,该公告将仅对创建此公告时存在的用户可见。 如果禁用,则在创建此公告后注册的用户也可以看到该公告。" forExistingUsersDescription: "若启用,该公告将仅对创建此公告时存在的用户可见。 如果禁用,则在创建此公告后注册的用户也可以看到该公告。"
needConfirmationToRead: "需要确认才能标记为已读" needConfirmationToRead: "需要确认才能标记为已读"
needConfirmationToReadDescription: "若启用,则会在标记已读时会显示确认对话框。此外,它也会不受批量已读操作的影响。" needConfirmationToReadDescription: "若启用,则会在标记已读时会显示确认对话框。此外,它也会不受批量已读操作的影响。"
end: "结束公告" end: "结束公告"
tooManyActiveAnnouncementDescription: "若有大量活动公告,可能会造成用户体验可能下降。请考虑归档已完成的公告。" tooManyActiveAnnouncementDescription: "若有大量活动公告,可能会造成用户体验下降。请考虑归档已完成的公告。"
readConfirmTitle: "标记为已读?" readConfirmTitle: "标记为已读?"
readConfirmText: "阅读“{title}”的内容并将其标记为已读。" readConfirmText: "阅读“{title}”的内容并将其标记为已读。"
shouldNotBeUsedToPresentPermanentInfo: "我们建议使用公告来发布临时性的流动信息而不是固定的常规信息,因为这可能损害用户体验,尤其是对于新用户而言。"
dialogAnnouncementUxWarn: "同时存在 2 个或以上的对话框公告极有可能对用户体验产生负面的影响,建议谨慎使用。"
silence: "不发送通知"
silenceDescription: "开启后,此条公告将不会发送通知,也不强制用户阅读。"
_initialAccountSetting: _initialAccountSetting:
accountCreated: "账户创建完成了!" accountCreated: "账户创建完成了!"
letsStartAccountSetup: "来进行帐户的初始设置吧。" letsStartAccountSetup: "来进行帐户的初始设置吧。"
@ -1151,19 +1230,91 @@ _initialAccountSetting:
pushNotificationDescription: "启用推送通知的话,就可以在设备上接收来自 {name} 的通知了。" pushNotificationDescription: "启用推送通知的话,就可以在设备上接收来自 {name} 的通知了。"
initialAccountSettingCompleted: "初始设定已经完成了!" initialAccountSettingCompleted: "初始设定已经完成了!"
haveFun: "希望 {name} 在这里玩得开心!" haveFun: "希望 {name} 在这里玩得开心!"
youCanContinueTutorial: "您可以继续了解 {name}(Misskey) 的使用教程,也可以在此停止教程并立即开始使用它。\n"
startTutorial: "开始教学"
skipAreYouSure: "要跳过初始设置吗?" skipAreYouSure: "要跳过初始设置吗?"
laterAreYouSure: "要稍后再进行初始设定吗?" laterAreYouSure: "要稍后再进行初始设定吗?"
_initialTutorial:
launchTutorial: "观看教学"
title: "教学"
wellDone: "做得好"
skipAreYouSure: "是否退出教学?"
_landing:
title: "欢迎来到教学"
description: "在这里,您可以查看 Misskey 的基本使用方法和功能。"
_note:
title: "什么是帖子?"
description: "在 Misskey 上发表的文章称为「帖子」。帖子在时间线上按照时间顺序排列,并实时更新。"
reply: "用来回复帖子。可以对回复进行回复,从而形成一串对话。"
renote: "用来将帖子共享到自己的时间线上。也可以加上自己的文字然后引用它。"
reaction: "用来添加回应。详细信息将在下一页进行说明。"
menu: "用来进行例如显示帖子详情、复制链接等各种各样的操作。"
_reaction:
title: "什么是回应?"
description: "您可以在帖子中添加“回应”。 您可以使用反应轻松地表达点“赞”所无法传达的细微差别。"
letsTryReacting: "回应可以通过点击帖子中的「+」按钮来添加。试着给这个示例帖子添加一个回应!"
reactToContinue: "添加一个回应来继续"
reactNotification: "当您的帖子被某人添加了回应时,将实时收到通知。"
reactDone: "通过按下「ー」按钮,可以取消已经添加的回应"
_timeline:
title: "时间线的运作方式"
description1: "Misskey 根据使用方式提供了多个时间线(根据服务器的设定,可能有一些被禁用)。"
home: "可以查看您关注的账户的帖子。"
local: "可以查看这个服务器上所有用户发表的帖子。"
social: "将同时显示首页时间线和本地时间线的内容。"
global: "可以查看所有已联合的服务器上的帖子。"
description2: "可以随时在屏幕顶部在每个时间线之间切换。"
description3: "另外,还有列表时间线和频道时间线。请参阅{link}了解更多详细信息。"
_postNote:
title: "帖子发布设置"
description1: "在 Misskey 发布帖子时,您可以设置各种选项。发帖窗口看起来是这样的。\n"
_visibility:
description: "您可以限制谁可以看到您的帖子。"
public: "向所有用户公开。\n"
home: "仅在首页时间线上发布。 关注者、从个人资料页查看过来的用户、以及通过转帖也能被别的用户看见。"
followers: "仅对关注者可见。 除了您自己之外,没有人可以转贴,并且只有您的关注者可以查看它。\n"
direct: "它将仅向指定用户公开,并且他们也会收到通知。 您可以使用它来代替私信。\n"
doNotSendConfidencialOnDirect1: "发送敏感信息时请注意。\n"
doNotSendConfidencialOnDirect2: "目标服务器的管理员可以看到发布的内容,因此如果您向不受信任的服务器上的用户发送私信,则在处理敏感信息时需要小心。"
localOnly: "不将帖子推送到其它服务器。 无论上述公开范围如何,其它服务器的用户将无法看到附加了此设定的帖子。\n"
_cw:
title: "隐藏内容 (CW)\n"
description: "显示「注解」里的内容而不是正文。点击「查看更多」将会把正文显示出来。"
_exampleNote:
cw: "深夜报复社会"
note: "茨了带巧克力的甜甜圈🍩😋"
useCases: "用于服务器条款所规定的帖子,或对剧透内容和敏感内容进行自主规制。"
_howToMakeAttachmentsSensitive:
title: "如何将附件标注为敏感内容?"
description: "对于服务器方针所要求要求的,又或者不适合直接展示的附件,请添加「敏感」标记。\n"
tryThisFile: "试试看,将附加到此窗口的图像标注为敏感!"
_exampleNote:
note: "不该打开纳豆的盖子的……"
method: "要标注附件为敏感内容,请单击该文件以打开菜单,然后单击“设置为敏感”。"
sensitiveSucceeded: "附加文件时,请遵循服务器的条款来设置正确敏感设定。\n"
doItToContinue: "将图像标记为敏感后才能够继续"
_done:
title: "恭喜您,已经完成了教程🎉\n"
description: "这里介绍的只是其中一小部分的功能。 要了解更多有关如何使用 Misskey 的更多信息,请访问 {link}。"
_timelineDescription:
home: "首页时间线可以查看您关注的账户的帖子。"
local: "本地时间线可以查看这个服务器上所有用户发表的帖子。"
social: "社交时间线将同时显示首页时间线和本地时间线的内容。"
global: "全局时间线可以查看所有已联合的服务器上的帖子。"
_serverRules: _serverRules:
description: "在新用户注册前显示服务器的简单规则。推荐显示服务条款的主要内容。" description: "在新用户注册前显示服务器的简单规则。推荐显示服务条款的主要内容。"
_serverSettings: _serverSettings:
iconUrl: "图标 URL" iconUrl: "图标 URL"
appIconDescription: "指定当 {host} 显示为 app 时的图标。" appIconDescription: "指定当 {host} 显示为 app 时的图标。"
appIconUsageExample: "例如:作为书签添加到 PWA 或手机主屏幕的时候" appIconUsageExample: "如作为书签添加到 PWA 或手机主屏幕时"
appIconStyleRecommendation: "因为有可能会被裁切为圆形或者圆角矩形,建议使用边缘带有留白背景的图标。" appIconStyleRecommendation: "因为有可能会被裁切为圆形或者圆角矩形,建议使用边缘带有留白背景的图标。"
appIconResolutionMustBe: "分辨率必须为 {resolution}。" appIconResolutionMustBe: "分辨率必须为 {resolution}。"
manifestJsonOverride: "覆盖 manifest.json" manifestJsonOverride: "覆盖 manifest.json"
shortName: "简称" shortName: "简称"
shortNameDescription: "如果服务器的正式名称很长,可以用简称或者別名来替代。" shortNameDescription: "如果服务器的正式名称很长,可以用简称或者別名来替代。"
fanoutTimelineDescription: "当启用时,可显著提高获取各种时间线时的性能,并减轻数据库的负荷。但是相对的 Redis 的内存使用量将会增加。如果服务器的内存不是很大,又或者运行不稳定的话可以把它关掉。"
fanoutTimelineDbFallback: "回退到数据库"
fanoutTimelineDbFallbackDescription: "当启用时,若时间线未被缓存,则将额外查询数据库。禁用该功能可通过不执行回退处理进一步减少服务器负载,但会限制可检索的时间线范围。"
_accountMigration: _accountMigration:
moveFrom: "从别的账号迁移到此账户" moveFrom: "从别的账号迁移到此账户"
moveFromSub: "为另一个账户建立别名" moveFromSub: "为另一个账户建立别名"
@ -1390,7 +1541,7 @@ _achievements:
description: "点了这里" description: "点了这里"
_justPlainLucky: _justPlainLucky:
title: "超高校级的幸运" title: "超高校级的幸运"
description: "每 10 秒有 0.01 的概率自动获得" description: "每 10 秒有 0.005% 的概率自动获得"
_setNameToSyuilo: _setNameToSyuilo:
title: "像神一样呐" title: "像神一样呐"
description: "将名称设定为 syuilo" description: "将名称设定为 syuilo"
@ -1421,6 +1572,11 @@ _achievements:
_smashTestNotificationButton: _smashTestNotificationButton:
title: "过度测试" title: "过度测试"
description: "短时间内连续测试通知" description: "短时间内连续测试通知"
_tutorialCompleted:
title: "Misskey 初学者课程 结业证书"
description: "完成了教学"
_bubbleGameExplodingHead:
title: "🤯"
_role: _role:
new: "创建角色" new: "创建角色"
edit: "编辑角色" edit: "编辑角色"
@ -1431,7 +1587,9 @@ _role:
assignTarget: "授权对象" assignTarget: "授权对象"
descriptionOfAssignTarget: "<b>手动</b>指手动选择谁被包括在这个角色中。\n<b>符合条件</b>指设置条件以自动包括符合条件的用户。" descriptionOfAssignTarget: "<b>手动</b>指手动选择谁被包括在这个角色中。\n<b>符合条件</b>指设置条件以自动包括符合条件的用户。"
manual: "手动" manual: "手动"
manualRoles: "手动角色"
conditional: "符合条件" conditional: "符合条件"
conditionalRoles: "条件角色"
condition: "条件" condition: "条件"
isConditionalRole: "这是一个条件控制的角色。" isConditionalRole: "这是一个条件控制的角色。"
isPublic: "角色公开" isPublic: "角色公开"
@ -1464,6 +1622,7 @@ _role:
inviteLimitCycle: "邀请码的发行间隔" inviteLimitCycle: "邀请码的发行间隔"
inviteExpirationTime: "邀请码的有效日期" inviteExpirationTime: "邀请码的有效日期"
canManageCustomEmojis: "管理自定义表情符号" canManageCustomEmojis: "管理自定义表情符号"
canManageAvatarDecorations: "管理头像挂件"
driveCapacity: "网盘容量" driveCapacity: "网盘容量"
alwaysMarkNsfw: "总是将文件标记为 NSFW" alwaysMarkNsfw: "总是将文件标记为 NSFW"
pinMax: "帖子置顶数量限制" pinMax: "帖子置顶数量限制"
@ -1478,6 +1637,8 @@ _role:
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。" descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
canHideAds: "可以隐藏广告" canHideAds: "可以隐藏广告"
canSearchNotes: "是否可以搜索帖子" canSearchNotes: "是否可以搜索帖子"
canUseTranslator: "使用翻译功能"
avatarDecorationLimit: "可添加头像挂件的最大个数"
_condition: _condition:
isLocal: "是本地用户" isLocal: "是本地用户"
isRemote: "是远程用户" isRemote: "是远程用户"
@ -1506,6 +1667,7 @@ _emailUnavailable:
disposable: "不是永久可用的地址" disposable: "不是永久可用的地址"
mx: "邮件服务器不正确" mx: "邮件服务器不正确"
smtp: "邮件服务器没有响应" smtp: "邮件服务器没有响应"
banned: "无法使用此邮件地址注册"
_ffVisibility: _ffVisibility:
public: "公开" public: "公开"
followers: "只有关注你的用户能看到" followers: "只有关注你的用户能看到"
@ -1526,6 +1688,10 @@ _ad:
reduceFrequencyOfThisAd: "减少此广告的频率" reduceFrequencyOfThisAd: "减少此广告的频率"
hide: "不显示" hide: "不显示"
timezoneinfo: "星期几是由服务器的时区所指定的。" timezoneinfo: "星期几是由服务器的时区所指定的。"
adsSettings: "广告设置"
notesPerOneAd: "在实时更新时间线中插入广告的间隔(帖子个数)"
setZeroToDisable: "设为 0 将不在实时更新时间线中投放广告"
adsTooClose: "广告投放时间间隔过短将可能显著损害用户体验。"
_forgotPassword: _forgotPassword:
enterEmail: "请输入您设置的电子邮箱地址,密码重置链接将发送至该邮箱上。" enterEmail: "请输入您设置的电子邮箱地址,密码重置链接将发送至该邮箱上。"
ifNoEmail: "如果您没有设置电子邮件地址,请联系管理员。" ifNoEmail: "如果您没有设置电子邮件地址,请联系管理员。"
@ -1565,8 +1731,8 @@ _preferencesBackups:
invalidFile: "无效的的文件格式。" invalidFile: "无效的的文件格式。"
_registry: _registry:
scope: "范围" scope: "范围"
key: "主要" key: ""
keys: "主要" keys: ""
domain: "域" domain: "域"
createKey: "创建键" createKey: "创建键"
_aboutMisskey: _aboutMisskey:
@ -1578,6 +1744,7 @@ _aboutMisskey:
donate: "赞助 Misskey" donate: "赞助 Misskey"
morePatrons: "还有很多其它的人也在支持我们,非常感谢🥰" morePatrons: "还有很多其它的人也在支持我们,非常感谢🥰"
patrons: "支持者" patrons: "支持者"
projectMembers: "项目成员"
_displayOfSensitiveMedia: _displayOfSensitiveMedia:
respect: "隐藏敏感媒体" respect: "隐藏敏感媒体"
ignore: "显示敏感媒体" ignore: "显示敏感媒体"
@ -1602,6 +1769,7 @@ _channel:
notesCount: "有 {n} 个帖子" notesCount: "有 {n} 个帖子"
nameAndDescription: "名称与描述" nameAndDescription: "名称与描述"
nameOnly: "仅名称" nameOnly: "仅名称"
allowRenoteToExternal: "允许在频道外转帖及引用"
_menuDisplay: _menuDisplay:
sideFull: "横向" sideFull: "横向"
sideIcon: "横向(图标)" sideIcon: "横向(图标)"
@ -1693,6 +1861,14 @@ _sfx:
notification: "通知" notification: "通知"
antenna: "天线接收" antenna: "天线接收"
channel: "频道通知" channel: "频道通知"
reaction: "选择回应时"
_soundSettings:
driveFile: "使用网盘内的音频"
driveFileWarn: "选择网盘上的文件"
driveFileTypeWarn: "不支持此文件"
driveFileTypeWarnDescription: "请选择音频文件"
driveFileDurationWarn: "音频过长"
driveFileDurationWarnDescription: "使用长音频可能会影响 Misskey 的使用。即使这样也要继续吗?"
_ago: _ago:
future: "未来" future: "未来"
justNow: "最近" justNow: "最近"
@ -1706,7 +1882,12 @@ _ago:
invalid: "没有" invalid: "没有"
_timeIn: _timeIn:
seconds: "{n}秒后" seconds: "{n}秒后"
minutes: "{n} 分后"
hours: "{n} 小时后"
days: "{n}天后" days: "{n}天后"
weeks: "{n} 周后"
months: "{n} 月后"
years: "{n} 年后"
_time: _time:
second: "秒" second: "秒"
minute: "分" minute: "分"
@ -1778,6 +1959,55 @@ _permissions:
"write:flash": "编辑 Play" "write:flash": "编辑 Play"
"read:flash-likes": "查看 Play 的点赞" "read:flash-likes": "查看 Play 的点赞"
"write:flash-likes": "编辑 Play 的点赞列表" "write:flash-likes": "编辑 Play 的点赞列表"
"read:admin:abuse-user-reports": "查看来自用户的举报"
"write:admin:delete-account": "删除用户账户"
"write:admin:delete-all-files-of-a-user": "删除用户所有的文件"
"read:admin:index-stats": "查看数据库索引相关的信息"
"read:admin:table-stats": "查看数据库表相关的信息"
"read:admin:user-ips": "查看用户 IP 地址"
"read:admin:meta": "查看实例的元数据"
"write:admin:reset-password": "重置用户密码"
"write:admin:resolve-abuse-user-report": "将来自用户的报告标记为「已解决」"
"write:admin:send-email": "发送邮件"
"read:admin:server-info": "查看服务器信息"
"read:admin:show-moderation-log": "查看管理日志"
"read:admin:show-user": "查看用户的非公开信息"
"read:admin:show-users": "查看用户的非公开信息"
"write:admin:suspend-user": "冻结用户"
"write:admin:unset-user-avatar": "删除用户头像"
"write:admin:unset-user-banner": "删除用户横幅"
"write:admin:unsuspend-user": "解除用户冻结"
"write:admin:meta": "编辑实例元数据"
"write:admin:user-note": "编辑管理笔记"
"write:admin:roles": "编辑角色"
"read:admin:roles": "查看角色"
"write:admin:relays": "编辑中继"
"read:admin:relays": "查看中继"
"write:admin:invite-codes": "编辑邀请码"
"read:admin:invite-codes": "查看邀请码"
"write:admin:announcements": "编辑公告"
"read:admin:announcements": "查看公告"
"write:admin:avatar-decorations": "编辑头像挂件"
"read:admin:avatar-decorations": "查看头像挂件"
"write:admin:federation": "编辑联合相关信息"
"write:admin:account": "编辑用户账户"
"read:admin:account": "查看用户相关情报"
"write:admin:emoji": "编辑表情文字"
"read:admin:emoji": "查看表情文字"
"write:admin:queue": "编辑作业队列"
"read:admin:queue": "查看作业队列相关情报"
"write:admin:promo": "运营推广说明"
"write:admin:drive": "编辑用户网盘"
"read:admin:drive": "查看用户网盘相关情报"
"read:admin:stream": "使用管理员用的 Websocket API"
"write:admin:ad": "编辑广告"
"read:admin:ad": "查看广告"
"write:invite-codes": "发行邀请码"
"read:invite-codes": "获取已发行的邀请码"
"write:clip-favorite": "编辑便签的点赞"
"read:clip-favorite": "查看便签的点赞"
"read:federation": "查看联合相关信息"
"write:report-abuse": "举报用户"
_auth: _auth:
shareAccessTitle: "应用程序授权许可" shareAccessTitle: "应用程序授权许可"
shareAccess: "您要授权允许 “{name}” 访问您的帐户吗?" shareAccess: "您要授权允许 “{name}” 访问您的帐户吗?"
@ -1832,6 +2062,7 @@ _widgets:
_userList: _userList:
chooseList: "选择列表" chooseList: "选择列表"
clicker: "点击器" clicker: "点击器"
birthdayFollowings: "今天是他们的生日"
_cw: _cw:
hide: "隐藏" hide: "隐藏"
show: "查看更多" show: "查看更多"
@ -1894,15 +2125,18 @@ _profile:
changeAvatar: "修改头像" changeAvatar: "修改头像"
changeBanner: "修改横幅" changeBanner: "修改横幅"
verifiedLinkDescription: "如果将内容设置为 URL当链接所指向的网页内包含自己的个人资料链接时可以显示一个已验证图标。" verifiedLinkDescription: "如果将内容设置为 URL当链接所指向的网页内包含自己的个人资料链接时可以显示一个已验证图标。"
avatarDecorationMax: "最多可添加 {max} 个挂件"
_exportOrImport: _exportOrImport:
allNotes: "所有帖子" allNotes: "所有帖子"
favoritedNotes: "收藏的帖子" favoritedNotes: "收藏的帖子"
clips: "便签"
followingList: "关注中" followingList: "关注中"
muteList: "屏蔽" muteList: "屏蔽"
blockingList: "拉黑" blockingList: "拉黑"
userLists: "列表" userLists: "列表"
excludeMutingUsers: "排除屏蔽用户" excludeMutingUsers: "排除屏蔽用户"
excludeInactiveUsers: "排除不活跃用户" excludeInactiveUsers: "排除不活跃用户"
withReplies: "在时间线中包含导入用户的回复"
_charts: _charts:
federation: "联合" federation: "联合"
apRequest: "请求" apRequest: "请求"
@ -2014,12 +2248,16 @@ _notification:
pollEnded: "问卷调查结果已生成。" pollEnded: "问卷调查结果已生成。"
newNote: "新的帖子" newNote: "新的帖子"
unreadAntennaNote: "天线 {name}" unreadAntennaNote: "天线 {name}"
roleAssigned: "授予的角色"
emptyPushNotificationMessage: "推送通知已更新" emptyPushNotificationMessage: "推送通知已更新"
achievementEarned: "获得成就" achievementEarned: "获得成就"
testNotification: "测试通知" testNotification: "测试通知"
checkNotificationBehavior: "检查通知显示" checkNotificationBehavior: "检查通知显示"
sendTestNotification: "发送测试通知" sendTestNotification: "发送测试通知"
notificationWillBeDisplayedLikeThis: "通知将会这样表示" notificationWillBeDisplayedLikeThis: "通知将会这样表示"
reactedBySomeUsers: "{n} 人回应了"
renotedBySomeUsers: "{n} 人转发了"
followedBySomeUsers: "被 {n} 人关注"
_types: _types:
all: "全部" all: "全部"
note: "用户的新帖子" note: "用户的新帖子"
@ -2032,6 +2270,7 @@ _notification:
pollEnded: "问卷调查结束" pollEnded: "问卷调查结束"
receiveFollowRequest: "收到关注请求" receiveFollowRequest: "收到关注请求"
followRequestAccepted: "关注请求已通过" followRequestAccepted: "关注请求已通过"
roleAssigned: "授予的角色"
achievementEarned: "取得的成就" achievementEarned: "取得的成就"
app: "关联应用的通知" app: "关联应用的通知"
_actions: _actions:
@ -2114,6 +2353,8 @@ _moderationLogTypes:
deleteGlobalAnnouncement: "删除全体通知" deleteGlobalAnnouncement: "删除全体通知"
deleteUserAnnouncement: "删除用户通知" deleteUserAnnouncement: "删除用户通知"
resetPassword: "重置密码" resetPassword: "重置密码"
suspendRemoteInstance: "停止远程服务器"
unsuspendRemoteInstance: "恢复远程服务器"
markSensitiveDriveFile: "标记网盘文件为敏感媒体" markSensitiveDriveFile: "标记网盘文件为敏感媒体"
unmarkSensitiveDriveFile: "取消标记网盘文件为敏感媒体" unmarkSensitiveDriveFile: "取消标记网盘文件为敏感媒体"
resolveAbuseReport: "处理举报" resolveAbuseReport: "处理举报"
@ -2121,10 +2362,81 @@ _moderationLogTypes:
createAd: "创建了广告" createAd: "创建了广告"
deleteAd: "删除了广告" deleteAd: "删除了广告"
updateAd: "更新了广告" updateAd: "更新了广告"
createAvatarDecoration: "新建头像挂件"
updateAvatarDecoration: "更新头像挂件"
deleteAvatarDecoration: "删除头像挂件"
unsetUserAvatar: "清除用户头像"
unsetUserBanner: "清除用户横幅"
_fileViewer: _fileViewer:
title: "文件信息"
type: "文件类型"
size: "文件大小"
url: "URL" url: "URL"
uploadedAt: "添加日期" uploadedAt: "添加日期"
attachedNotes: "附加到的帖子"
thisPageCanBeSeenFromTheAuthor: "此页只能被该文件的上传者查看。"
_externalResourceInstaller: _externalResourceInstaller:
title: "从外部站点安装"
checkVendorBeforeInstall: "请在安装前确保来源可靠"
_plugin:
title: "要安装此插件吗?"
metaTitle: "插件信息"
_theme:
title: "要安装此主题吗?"
metaTitle: "主题信息"
_meta:
base: "基本配色方案"
_vendorInfo:
title: "来源信息"
endpoint: "参考端点"
hashVerify: "确认文件完整性"
_errors: _errors:
_invalidParams:
title: "缺少参数"
description: "缺少从外部站点获取数据所需的信息。请检查 URL。"
_resourceTypeNotSupported:
title: "不支持此外部资源"
description: "不支持从此外部站点获取的资源类型。请联系站点管理员。"
_failedToFetch:
title: "获取数据失败"
fetchErrorDescription: "与外部站点的通信失败。 如果重试后问题仍然存在,请联系站点管理员。"
parseErrorDescription: "无法读取从外部站点取得的数据。请联系站点管理员。"
_hashUnmatched:
title: "无法获取正确数据"
description: "无法验证数据的完整性。安全起见,无法继续安装。请联系站点管理员。"
_pluginParseFailed: _pluginParseFailed:
title: "AiScript 错误" title: "AiScript 错误"
description: "虽然取得了数据,但是由于 AiScript 解析时出现错误,无法读取数据。请联系插件的作者。可在 Javascript 控制台查看错误详情。"
_pluginInstallFailed:
title: "插件安装失败"
description: "安装插件时出现错误。请再试一次。可在 Javascript 控制台查看错误详情。"
_themeParseFailed:
title: "主题解析错误"
description: "虽然取得了主题文件,但是由于解析时出现错误,无法加载主题。请联系主题的作者。可在 Javascript 控制台查看错误详情。"
_themeInstallFailed:
title: "安装主题失败"
description: "安装主题时出错。请再试一次。可在 Javascript 控制台查看错误详情。"
_dataSaver:
_media:
title: "加载媒体"
description: "防止自动加载图像和视频。 点击隐藏的图像/视频即可加载它们。\n"
_avatar:
title: "头像"
description: "停止播放头像的动画。 由于动画图片的文件大小可能比普通图像大,这可以进一步减少数据流量。"
_urlPreview:
title: "URL预览缩略图\n"
description: "将不再加载 URL 预览缩略图。"
_code:
title: "代码高亮"
description: "如果使用了代码高亮标记,例如在 MFM 中,则在点击之前不会加载。 代码高亮要求加载每种高亮语言的定义文件,由于这些文件不再自动加载,因此有望减少数据传输量。"
_hemisphere:
N: "北半球"
S: "南半球"
caption: "在某些客户端设置中用来确定季节"
_reversi:
reversi: "黑白棋"
total: "总计"
_offlineScreen:
title: "离线——无法连接到服务器"
header: "无法连接到服务器"

View file

@ -91,7 +91,7 @@ manageLists: "管理清單"
error: "錯誤" error: "錯誤"
somethingHappened: "發生錯誤" somethingHappened: "發生錯誤"
retry: "重試" retry: "重試"
pageLoadError: "載入頁面失敗" pageLoadError: "無法載入頁面。"
pageLoadErrorDescription: "這通常是網路錯誤或瀏覽器快取殘留而引起的。請先清除瀏覽器快取,稍後再重試。" pageLoadErrorDescription: "這通常是網路錯誤或瀏覽器快取殘留而引起的。請先清除瀏覽器快取,稍後再重試。"
serverIsDead: "伺服器沒有回應。請稍等片刻再試。" serverIsDead: "伺服器沒有回應。請稍等片刻再試。"
youShouldUpgradeClient: "請重新載入以使用新版客戶端顯示此頁面。" youShouldUpgradeClient: "請重新載入以使用新版客戶端顯示此頁面。"
@ -130,6 +130,7 @@ overwriteFromPinnedEmojis: "從一般複寫設定"
reactionSettingDescription2: "拖動以交換,點擊以刪除,按下「+」以新增。" reactionSettingDescription2: "拖動以交換,點擊以刪除,按下「+」以新增。"
rememberNoteVisibility: "記住貼文可見性" rememberNoteVisibility: "記住貼文可見性"
attachCancel: "移除附件" attachCancel: "移除附件"
deleteFile: "刪除檔案"
markAsSensitive: "標記為敏感內容" markAsSensitive: "標記為敏感內容"
unmarkAsSensitive: "取消標記為敏感內容" unmarkAsSensitive: "取消標記為敏感內容"
enterFileName: "請輸入檔案名稱" enterFileName: "請輸入檔案名稱"
@ -379,6 +380,11 @@ hcaptcha: "hCaptcha"
enableHcaptcha: "啟用 hCaptcha" enableHcaptcha: "啟用 hCaptcha"
hcaptchaSiteKey: "網站金鑰" hcaptchaSiteKey: "網站金鑰"
hcaptchaSecretKey: "金鑰" hcaptchaSecretKey: "金鑰"
mcaptcha: "mCaptcha"
enableMcaptcha: "啟用 mCaptcha"
mcaptchaSiteKey: "網站金鑰"
mcaptchaSecretKey: "金鑰"
mcaptchaInstanceUrl: "mCaptcha 的實例網址"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "啟用 reCAPTCHA" enableRecaptcha: "啟用 reCAPTCHA"
recaptchaSiteKey: "網站金鑰" recaptchaSiteKey: "網站金鑰"
@ -592,10 +598,10 @@ menu: "選單"
divider: "分隔線" divider: "分隔線"
addItem: "新增項目" addItem: "新增項目"
rearrange: "排序方式" rearrange: "排序方式"
relays: "中繼" relays: "中繼"
addRelay: "新增中繼" addRelay: "新增中繼"
inboxUrl: "收件夾URL" inboxUrl: "收件夾URL"
addedRelays: "已加入的中繼" addedRelays: "已加入的中繼"
serviceworkerInfo: "如要使用推播通知,需要啟用此選項並設定金鑰。" serviceworkerInfo: "如要使用推播通知,需要啟用此選項並設定金鑰。"
deletedNote: "已刪除的貼文" deletedNote: "已刪除的貼文"
invisibleNote: "私密的貼文" invisibleNote: "私密的貼文"
@ -626,6 +632,7 @@ medium: "中"
small: "小" small: "小"
generateAccessToken: "發行存取權杖" generateAccessToken: "發行存取權杖"
permission: "權限" permission: "權限"
adminPermission: "管理員權限"
enableAll: "啟用全部" enableAll: "啟用全部"
disableAll: "停用全部" disableAll: "停用全部"
tokenRequested: "允許存取帳戶" tokenRequested: "允許存取帳戶"
@ -669,6 +676,7 @@ useGlobalSettingDesc: "啟用時,將使用帳戶通知設定。停用時,則
other: "其他" other: "其他"
regenerateLoginToken: "重新產生登入權杖" regenerateLoginToken: "重新產生登入權杖"
regenerateLoginTokenDescription: "重新產生用於登入的內部權杖。一般情況下是不需要這樣做的。重新產生後,所有裝置將會被登出。" regenerateLoginTokenDescription: "重新產生用於登入的內部權杖。一般情況下是不需要這樣做的。重新產生後,所有裝置將會被登出。"
theKeywordWhenSearchingForCustomEmoji: "這是搜尋自訂表情符號時的關鍵字"
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多個項目。" setMultipleBySeparatingWithSpace: "您可以使用空格分隔多個項目。"
fileIdOrUrl: "檔案 ID 或 URL" fileIdOrUrl: "檔案 ID 或 URL"
behavior: "行為" behavior: "行為"
@ -682,7 +690,7 @@ abuseReported: "檢舉完成。感謝您的報告。"
reporter: "檢舉者" reporter: "檢舉者"
reporteeOrigin: "檢舉來源" reporteeOrigin: "檢舉來源"
reporterOrigin: "檢舉者來源" reporterOrigin: "檢舉者來源"
forwardReport: "將報告轉送給遠端實例" forwardReport: "將報告轉送給遠端伺服器"
forwardReportIsAnonymous: "在遠端實例上看不到您的資訊,顯示的報告者是匿名的系统帳戶。" forwardReportIsAnonymous: "在遠端實例上看不到您的資訊,顯示的報告者是匿名的系统帳戶。"
send: "發送" send: "發送"
abuseMarkAsResolved: "處理完畢" abuseMarkAsResolved: "處理完畢"
@ -690,7 +698,7 @@ openInNewTab: "在新分頁中開啟"
openInSideView: "在側欄中開啟" openInSideView: "在側欄中開啟"
defaultNavigationBehaviour: "預設導航" defaultNavigationBehaviour: "預設導航"
editTheseSettingsMayBreakAccount: "修改這些設定可能會毀損您的帳戶" editTheseSettingsMayBreakAccount: "修改這些設定可能會毀損您的帳戶"
instanceTicker: "貼文的實例來源" instanceTicker: "貼文的伺服器資訊"
waitingFor: "等待{x}" waitingFor: "等待{x}"
random: "隨機" random: "隨機"
system: "系統" system: "系統"
@ -811,7 +819,7 @@ active: "最近活躍"
offline: "離線" offline: "離線"
notRecommended: "不推薦" notRecommended: "不推薦"
botProtection: "Bot 防護" botProtection: "Bot 防護"
instanceBlocking: "已封鎖的實例" instanceBlocking: "已封鎖或禁言的伺服器"
selectAccount: "選擇帳戶" selectAccount: "選擇帳戶"
switchAccount: "切換帳戶" switchAccount: "切換帳戶"
enabled: "已啟用" enabled: "已啟用"
@ -954,7 +962,7 @@ cannotUploadBecauseNoFreeSpace: "由於雲端硬碟沒有可用空間,因此
cannotUploadBecauseExceedsFileSizeLimit: "由於超過了檔案大小的限制,無法上傳。" cannotUploadBecauseExceedsFileSizeLimit: "由於超過了檔案大小的限制,無法上傳。"
beta: "測試版" beta: "測試版"
enableAutoSensitive: "自動 NSFW 判定" enableAutoSensitive: "自動 NSFW 判定"
enableAutoSensitiveDescription: "如果可,它將使用機器學習技術判斷檔案是否需要標記為敏感。即使關閉此功能,也可能會依實例規則而自動啟用。" enableAutoSensitiveDescription: "如果可,它將使用機器學習技術判斷檔案是否需要標記為敏感。即使關閉此功能,也可能會依伺服器規則而自動啟用。"
activeEmailValidationDescription: "主動地驗證使用者的電子郵件地址,以確定是否是一次性地址以及是否可以真正與其進行通訊。關閉時,僅檢查格式是否正確。" activeEmailValidationDescription: "主動地驗證使用者的電子郵件地址,以確定是否是一次性地址以及是否可以真正與其進行通訊。關閉時,僅檢查格式是否正確。"
navbar: "導覽列" navbar: "導覽列"
shuffle: "隨機" shuffle: "隨機"
@ -964,7 +972,7 @@ pushNotification: "推播通知"
subscribePushNotification: "啟用推播通知" subscribePushNotification: "啟用推播通知"
unsubscribePushNotification: "停用推播通知" unsubscribePushNotification: "停用推播通知"
pushNotificationAlreadySubscribed: "推播通知啟用中" pushNotificationAlreadySubscribed: "推播通知啟用中"
pushNotificationNotSupported: "瀏覽器或實例不支援推播通知" pushNotificationNotSupported: "瀏覽器或伺服器不支援推播通知"
sendPushNotificationReadMessage: "如果已閱讀通知與訊息,就刪除推播通知" sendPushNotificationReadMessage: "如果已閱讀通知與訊息,就刪除推播通知"
sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」通知將立刻顯示。可能會更消耗裝置電池。" sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」通知將立刻顯示。可能會更消耗裝置電池。"
windowMaximize: "最大化" windowMaximize: "最大化"
@ -1051,6 +1059,8 @@ limitWidthOfReaction: "限制反應的最大寬度,並縮小顯示尺寸。"
noteIdOrUrl: "貼文ID或URL" noteIdOrUrl: "貼文ID或URL"
video: "影片" video: "影片"
videos: "影片" videos: "影片"
audio: "音效"
audioFiles: "音效檔案"
dataSaver: "數據節省模式" dataSaver: "數據節省模式"
accountMigration: "遷移帳戶" accountMigration: "遷移帳戶"
accountMoved: "這個使用者已遷移至新的帳戶:" accountMoved: "這個使用者已遷移至新的帳戶:"
@ -1183,6 +1193,25 @@ seasonalScreenEffect: "隨季節變換畫面的呈現"
decorate: "設置頭像裝飾" decorate: "設置頭像裝飾"
addMfmFunction: "插入MFM功能語法" addMfmFunction: "插入MFM功能語法"
enableQuickAddMfmFunction: "顯示高級MFM選擇器" enableQuickAddMfmFunction: "顯示高級MFM選擇器"
bubbleGame: "氣泡遊戲"
sfx: "音效"
soundWillBePlayed: "將播放音效"
showReplay: "觀看重播"
replay: "重播"
replaying: "重播中"
ranking: "排行榜"
lastNDays: "過去 {n} 天"
backToTitle: "回到遊戲標題頁"
hemisphere: "您居住的地區"
withSensitive: "顯示包含敏感檔案的貼文"
userSaysSomethingSensitive: "包含 {name} 敏感檔案的貼文"
enableHorizontalSwipe: "滑動切換時間軸"
_bubbleGame:
howToPlay: "玩法說明"
_howToPlay:
section1: "調整位置並將物體放入盒子中。"
section2: "當相同類型的物體黏在一起時,它們會變成不同的物體,您就會得到分數。"
section3: "如果物體從盒子裡溢出,遊戲就結束了。透過融合物體而不溢出盒子來獲得高分!"
_announcement: _announcement:
forExistingUsers: "僅限既有的使用者" forExistingUsers: "僅限既有的使用者"
forExistingUsersDescription: "啟用代表僅向現存使用者顯示;停用代表張貼後註冊的新使用者也會看到。" forExistingUsersDescription: "啟用代表僅向現存使用者顯示;停用代表張貼後註冊的新使用者也會看到。"
@ -1501,7 +1530,7 @@ _achievements:
description: "首頁時間軸在一分鐘內出現超過二十篇貼文" description: "首頁時間軸在一分鐘內出現超過二十篇貼文"
_viewInstanceChart: _viewInstanceChart:
title: "分析師" title: "分析師"
description: "顯示了實例的圖表" description: "顯示了伺服器的圖表"
_outputHelloWorldOnScratchpad: _outputHelloWorldOnScratchpad:
title: "Hello, world!" title: "Hello, world!"
description: "在 AiScript 控制臺輸出了「hello world」" description: "在 AiScript 控制臺輸出了「hello world」"
@ -1553,13 +1582,20 @@ _achievements:
_tutorialCompleted: _tutorialCompleted:
title: "Misskey新手講座 結業證書" title: "Misskey新手講座 結業證書"
description: "已完成教學課程" description: "已完成教學課程"
_bubbleGameExplodingHead:
title: "🤯"
description: "氣泡遊戲中最大的物體出現了"
_bubbleGameDoubleExplodingHead:
title: "雙重🤯"
description: "氣泡遊戲中最大的物體同時出現了兩個"
flavor: "這樣大小的便當盒,用 🤯 🤯 稍微裝滿一些吧"
_role: _role:
new: "建立角色" new: "建立角色"
edit: "編輯角色" edit: "編輯角色"
name: "角色名稱" name: "角色名稱"
description: "角色描述 " description: "角色描述 "
permission: "角色的權限" permission: "角色的權限"
descriptionOfPermission: "<b>審查員</b>執行與審查相關的基本操作。\n<b>管理員</b>能變更實例的全部設定" descriptionOfPermission: "<b>審查員</b>執行與審查相關的基本操作。\n<b>管理員</b>能變更伺服器的全部設定。"
assignTarget: "指派目標" assignTarget: "指派目標"
descriptionOfAssignTarget: "<b>手動</b>是以手動管理這個角色包含的人員。\n<b>符合條件</b>是設定條件以自動包含符合條件的使用者。" descriptionOfAssignTarget: "<b>手動</b>是以手動管理這個角色包含的人員。\n<b>符合條件</b>是設定條件以自動包含符合條件的使用者。"
manual: "手動" manual: "手動"
@ -1593,7 +1629,7 @@ _role:
gtlAvailable: "瀏覽全域時間軸" gtlAvailable: "瀏覽全域時間軸"
ltlAvailable: "瀏覽本地時間軸" ltlAvailable: "瀏覽本地時間軸"
canPublicNote: "允許公開貼文" canPublicNote: "允許公開貼文"
canInvite: "發行實例邀請碼" canInvite: "發行伺服器邀請碼"
inviteLimit: "可建立邀請碼的數量" inviteLimit: "可建立邀請碼的數量"
inviteLimitCycle: "邀請碼的發放間隔" inviteLimitCycle: "邀請碼的發放間隔"
inviteExpirationTime: "邀請碼的有效日期" inviteExpirationTime: "邀請碼的有效日期"
@ -1671,7 +1707,7 @@ _ad:
_forgotPassword: _forgotPassword:
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。" enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 " ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 " contactAdmin: "本伺服器不支援電子郵件,請聯繫您的管理員重置您的密碼。 "
_gallery: _gallery:
my: "我的貼文" my: "我的貼文"
liked: "喜歡的貼文" liked: "喜歡的貼文"
@ -1758,8 +1794,8 @@ _wordMute:
_instanceMute: _instanceMute:
instanceMuteDescription: "包括對被靜音伺服器上的使用者的回覆,被設定的伺服器上所有貼文及轉發都會被靜音。" instanceMuteDescription: "包括對被靜音伺服器上的使用者的回覆,被設定的伺服器上所有貼文及轉發都會被靜音。"
instanceMuteDescription2: "設定時以換行進行分隔" instanceMuteDescription2: "設定時以換行進行分隔"
title: "將隱藏被設定的實例貼文。" title: "將隱藏被設定的伺服器貼文。"
heading: "將實例靜音" heading: "將伺服器靜音"
_theme: _theme:
explore: "探索佈景主題" explore: "探索佈景主題"
install: "安裝佈景主題" install: "安裝佈景主題"
@ -1927,14 +1963,63 @@ _permissions:
"write:user-groups": "編輯使用者群組" "write:user-groups": "編輯使用者群組"
"read:channels": "已查看的頻道" "read:channels": "已查看的頻道"
"write:channels": "編輯頻道" "write:channels": "編輯頻道"
"read:gallery": "瀏覽圖庫" "read:gallery": "瀏覽相簿"
"write:gallery": "操作圖庫" "write:gallery": "編輯相簿"
"read:gallery-likes": "讀取喜歡的圖片" "read:gallery-likes": "瀏覽相簿的讚"
"write:gallery-likes": "操作喜歡的圖片" "write:gallery-likes": "編輯相簿的讚"
"read:flash": "檢視 Play" "read:flash": "檢視 Play"
"write:flash": "編輯 Play" "write:flash": "編輯 Play"
"read:flash-likes": "檢視 Play 的讚" "read:flash-likes": "檢視 Play 的讚"
"write:flash-likes": "編輯 Play 的讚" "write:flash-likes": "編輯 Play 的讚"
"read:admin:abuse-user-reports": "查看來自使用者的檢舉"
"write:admin:delete-account": "刪除使用者帳戶"
"write:admin:delete-all-files-of-a-user": "刪除使用者的所有檔案"
"read:admin:index-stats": "查看資料庫索引的相關資訊"
"read:admin:table-stats": "查看資料庫表格的相關資訊"
"read:admin:user-ips": "查看使用者的 IP 位址"
"read:admin:meta": "查看實例的元資料"
"write:admin:reset-password": "重設使用者的密碼"
"write:admin:resolve-abuse-user-report": "解決來自使用者的檢舉"
"write:admin:send-email": "發送郵件"
"read:admin:server-info": "查看伺服器的資訊"
"read:admin:show-moderation-log": "查看審查紀錄"
"read:admin:show-user": "查看使用者的私密資訊"
"read:admin:show-users": "查看使用者的私密資訊"
"write:admin:suspend-user": "凍結使用者"
"write:admin:unset-user-avatar": "刪除使用者的頭像"
"write:admin:unset-user-banner": "刪除使用者的橫幅"
"write:admin:unsuspend-user": "解除凍結使用者"
"write:admin:meta": "編輯實例的元資料"
"write:admin:user-note": "編輯審查筆記"
"write:admin:roles": "編輯角色"
"read:admin:roles": "查看角色"
"write:admin:relays": "編輯中繼器"
"read:admin:relays": "查看中繼器"
"write:admin:invite-codes": "編輯邀請碼"
"read:admin:invite-codes": "查看邀請碼"
"write:admin:announcements": "編輯公告"
"read:admin:announcements": "查看公告"
"write:admin:avatar-decorations": "編輯頭像裝飾"
"read:admin:avatar-decorations": "查看頭像裝飾"
"write:admin:federation": "編輯站台聯邦的相關資訊"
"write:admin:account": "編輯使用者帳戶"
"read:admin:account": "查看使用者的相關資訊"
"write:admin:emoji": "編輯表情符號"
"read:admin:emoji": "查看表情符號"
"write:admin:queue": "編輯工作佇列"
"read:admin:queue": "查看工作佇列的相關資訊"
"write:admin:promo": "編輯推廣貼文"
"write:admin:drive": "編輯使用者的雲端硬碟"
"read:admin:drive": "查看使用者雲端硬碟的相關資訊"
"read:admin:stream": "使用管理員的 Websocket API"
"write:admin:ad": "編輯廣告"
"read:admin:ad": "查看廣告"
"write:invite-codes": "建立邀請碼"
"read:invite-codes": "取得邀請碼"
"write:clip-favorite": "編輯摘錄的讚"
"read:clip-favorite": "查看摘錄的讚"
"read:federation": "查看站台聯邦的相關資訊"
"write:report-abuse": "檢舉違規行為"
_auth: _auth:
shareAccessTitle: "應用程式的存取權限" shareAccessTitle: "應用程式的存取權限"
shareAccess: "要授權「“{name}”」存取您的帳戶嗎?" shareAccess: "要授權「“{name}”」存取您的帳戶嗎?"
@ -1961,7 +2046,7 @@ _weekday:
saturday: "週六" saturday: "週六"
_widgets: _widgets:
profile: "個人檔案" profile: "個人檔案"
instanceInfo: "實例資訊" instanceInfo: "伺服器資訊"
memo: "備忘錄" memo: "備忘錄"
notifications: "通知" notifications: "通知"
timeline: "時間軸" timeline: "時間軸"
@ -1975,7 +2060,7 @@ _widgets:
digitalClock: "電子時鐘" digitalClock: "電子時鐘"
unixClock: "UNIX 時間" unixClock: "UNIX 時間"
federation: "聯邦宇宙" federation: "聯邦宇宙"
instanceCloud: "實例雲" instanceCloud: "伺服器雲"
postForm: "發文視窗" postForm: "發文視窗"
slideshow: "幻燈片" slideshow: "幻燈片"
button: "按鈕" button: "按鈕"
@ -2027,7 +2112,7 @@ _visibility:
specified: "指定使用者" specified: "指定使用者"
specifiedDescription: "僅發布至指定使用者" specifiedDescription: "僅發布至指定使用者"
disableFederation: "停用聯邦" disableFederation: "停用聯邦"
disableFederationDescription: "不要傳遞給其他實例" disableFederationDescription: "不發送到其他伺服器"
_postForm: _postForm:
replyPlaceholder: "回覆此貼文..." replyPlaceholder: "回覆此貼文..."
quotePlaceholder: "引用此貼文..." quotePlaceholder: "引用此貼文..."
@ -2056,6 +2141,7 @@ _profile:
_exportOrImport: _exportOrImport:
allNotes: "所有貼文" allNotes: "所有貼文"
favoritedNotes: "「我的最愛」貼文" favoritedNotes: "「我的最愛」貼文"
clips: "摘錄"
followingList: "追隨中" followingList: "追隨中"
muteList: "靜音" muteList: "靜音"
blockingList: "封鎖" blockingList: "封鎖"
@ -2355,3 +2441,53 @@ _dataSaver:
_code: _code:
title: "程式碼突出顯示" title: "程式碼突出顯示"
description: "如果使用了 MFM 的程式碼突顯標記,則在點擊之前不會載入。程式碼突顯要求加載每種程式語言的突顯定義檔案,但由於這些檔案不再自動載入,因此有望減少資料流量。" description: "如果使用了 MFM 的程式碼突顯標記,則在點擊之前不會載入。程式碼突顯要求加載每種程式語言的突顯定義檔案,但由於這些檔案不再自動載入,因此有望減少資料流量。"
_hemisphere:
N: "北半球"
S: "南半球"
caption: "在某些客戶端的設定中,用於判斷季節。"
_reversi:
reversi: "黑白棋"
gameSettings: "對弈設定"
chooseBoard: "選擇棋盤"
blackOrWhite: "先手/後手"
blackIs: "{name} 為黑棋(先攻)"
rules: "規則"
thisGameIsStartedSoon: "對弈即將開始"
waitingForOther: "等待對手準備就緒"
waitingForMe: "等待您準備就緒"
waitingBoth: "請準備"
ready: "準備就緒"
cancelReady: "重新準備"
opponentTurn: "對手的回合"
myTurn: "您的回合"
turnOf: "{name} 的回合"
pastTurnOf: "{name} 的回合"
surrender: "認輸"
surrendered: "對手認輸"
timeout: "時間到"
drawn: "平手"
won: "{name} 獲勝"
black: "黑"
white: "白"
total: "合計"
turnCount: "{count} 回合"
myGames: "我的對弈"
allGames: "所有對弈"
ended: "已結束"
playing: "正在對弈"
isLlotheo: "子較少的一方為勝(顛倒規則)"
loopedMap: "循環棋盤"
canPutEverywhere: "隨意置放模式"
timeLimitForEachTurn: "每回合的時間限制"
freeMatch: "自由對戰"
lookingForPlayer: "正在搜尋對手"
gameCanceled: "對弈已被取消"
shareToTlTheGameWhenStart: "在遊戲開始時將對弈資訊發布到時間軸"
iStartedAGame: "對弈開始了! #MisskeyReversi"
opponentHasSettingsChanged: "對手更改了設定"
allowIrregularRules: "允許異常規則(完全自由)"
disallowIrregularRules: "不允許異常規則"
_offlineScreen:
title: "離線-無法連接伺服器"
header: "無法連接伺服器"

View file

@ -1,6 +1,6 @@
{ {
"name": "sharkey", "name": "sharkey",
"version": "2023.12.0.beta3", "version": "2024.2.0-beta2",
"codename": "shonk", "codename": "shonk",
"repository": { "repository": {
"type": "git", "type": "git",
@ -10,7 +10,10 @@
"workspaces": [ "workspaces": [
"packages/frontend", "packages/frontend",
"packages/backend", "packages/backend",
"packages/sw" "packages/sw",
"packages/misskey-js",
"packages/misskey-reversi",
"packages/misskey-bubble-game"
], ],
"private": true, "private": true,
"scripts": { "scripts": {
@ -46,17 +49,17 @@
}, },
"dependencies": { "dependencies": {
"execa": "8.0.1", "execa": "8.0.1",
"cssnano": "6.0.2", "cssnano": "6.0.3",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"postcss": "8.4.32", "postcss": "8.4.33",
"terser": "5.26.0", "terser": "5.27.0",
"typescript": "5.3.3" "typescript": "5.3.3"
}, },
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "6.14.0", "@typescript-eslint/eslint-plugin": "6.18.1",
"@typescript-eslint/parser": "6.14.0", "@typescript-eslint/parser": "6.18.1",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"cypress": "13.6.1", "cypress": "13.6.3",
"eslint": "8.56.0", "eslint": "8.56.0",
"start-server-and-test": "2.0.3", "start-server-and-test": "2.0.3",
"ncp": "2.0.0" "ncp": "2.0.0"

View file

@ -160,7 +160,6 @@ module.exports = {
testMatch: [ testMatch: [
"<rootDir>/test/unit/**/*.ts", "<rootDir>/test/unit/**/*.ts",
"<rootDir>/src/**/*.test.ts", "<rootDir>/src/**/*.test.ts",
"<rootDir>/test/e2e/**/*.ts",
], ],
// An array of regexp pattern strings that are matched against all test paths, matched tests are skipped // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped

View file

@ -0,0 +1,15 @@
/*
* For a detailed explanation regarding each configuration property and type check, visit:
* https://jestjs.io/docs/en/configuration.html
*/
const base = require('./jest.config.cjs')
module.exports = {
...base,
globalSetup: "<rootDir>/built-test/entry.js",
setupFilesAfterEnv: ["<rootDir>/test/jest.setup.ts"],
testMatch: [
"<rootDir>/test/e2e/**/*.ts",
],
};

View file

@ -0,0 +1,14 @@
/*
* For a detailed explanation regarding each configuration property and type check, visit:
* https://jestjs.io/docs/en/configuration.html
*/
const base = require('./jest.config.cjs')
module.exports = {
...base,
testMatch: [
"<rootDir>/test/unit/**/*.ts",
"<rootDir>/src/**/*.test.ts",
],
};

View file

@ -0,0 +1,20 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class SupportTrueMailApi1703658526000 {
name = 'SupportTrueMailApi1703658526000'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "truemailInstance" character varying(1024)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "truemailAuthKey" character varying(1024)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "enableTruemailApi" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableTruemailApi"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "truemailInstance"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "truemailAuthKey"`);
}
}

View file

@ -0,0 +1,22 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class SupportMcaptcha1704373210054 {
name = 'SupportMcaptcha1704373210054'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "enableMcaptcha" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`ALTER TABLE "meta" ADD "mcaptchaSitekey" character varying(1024)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "mcaptchaSecretKey" character varying(1024)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "mcaptchaInstanceUrl" character varying(1024)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "mcaptchaInstanceUrl"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "mcaptchaSecretKey"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "mcaptchaSitekey"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableMcaptcha"`);
}
}

View file

@ -0,0 +1,10 @@
export class AddDonationUrl1704744370000 {
name = 'AddDonationUrl1704744370000'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "donationUrl" character varying(1024)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "donationUrl"`);
}
}

View file

@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class BubbleGameRecord1704959805077 {
name = 'BubbleGameRecord1704959805077'
async up(queryRunner) {
await queryRunner.query(`CREATE TABLE "bubble_game_record" ("id" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, "seededAt" TIMESTAMP WITH TIME ZONE NOT NULL, "seed" character varying(1024) NOT NULL, "gameVersion" integer NOT NULL, "gameMode" character varying(128) NOT NULL, "score" integer NOT NULL, "logs" jsonb NOT NULL DEFAULT '[]', "isVerified" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_a75395fe404b392e2893b50d7ea" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_75276757070d21fdfaf4c05290" ON "bubble_game_record" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_4ae7053179014915d1432d3f40" ON "bubble_game_record" ("seededAt") `);
await queryRunner.query(`CREATE INDEX "IDX_26d4ee490b5a487142d35466ee" ON "bubble_game_record" ("score") `);
await queryRunner.query(`ALTER TABLE "bubble_game_record" ADD CONSTRAINT "FK_75276757070d21fdfaf4c052909" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "bubble_game_record" DROP CONSTRAINT "FK_75276757070d21fdfaf4c052909"`);
await queryRunner.query(`DROP INDEX "public"."IDX_26d4ee490b5a487142d35466ee"`);
await queryRunner.query(`DROP INDEX "public"."IDX_4ae7053179014915d1432d3f40"`);
await queryRunner.query(`DROP INDEX "public"."IDX_75276757070d21fdfaf4c05290"`);
await queryRunner.query(`DROP TABLE "bubble_game_record"`);
}
}

View file

@ -0,0 +1,24 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class OptimizeNoteIndexForArrayColumns1705222772858 {
name = 'OptimizeNoteIndexForArrayColumns1705222772858'
async up(queryRunner) {
await queryRunner.query(`DROP INDEX "public"."IDX_796a8c03959361f97dc2be1d5c"`);
await queryRunner.query(`DROP INDEX "public"."IDX_54ebcb6d27222913b908d56fd8"`);
await queryRunner.query(`DROP INDEX "public"."IDX_88937d94d7443d9a99a76fa5c0"`);
await queryRunner.query(`DROP INDEX "public"."IDX_51c063b6a133a9cb87145450f5"`);
await queryRunner.query(`CREATE INDEX "IDX_NOTE_FILE_IDS" ON "note" using gin ("fileIds")`)
}
async down(queryRunner) {
await queryRunner.query(`DROP INDEX "IDX_NOTE_FILE_IDS"`)
await queryRunner.query(`CREATE INDEX "IDX_51c063b6a133a9cb87145450f5" ON "note" ("fileIds") `);
await queryRunner.query(`CREATE INDEX "IDX_88937d94d7443d9a99a76fa5c0" ON "note" ("tags") `);
await queryRunner.query(`CREATE INDEX "IDX_54ebcb6d27222913b908d56fd8" ON "note" ("mentions") `);
await queryRunner.query(`CREATE INDEX "IDX_796a8c03959361f97dc2be1d5c" ON "note" ("visibleUserIds") `);
}
}

View file

@ -0,0 +1,22 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi1705475608437 {
name = 'Reversi1705475608437'
async up(queryRunner) {
await queryRunner.query(`DROP INDEX "public"."IDX_b46ec40746efceac604142be1c"`);
await queryRunner.query(`DROP INDEX "public"."IDX_b604d92d6c7aec38627f6eaf16"`);
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "createdAt"`);
await queryRunner.query(`ALTER TABLE "reversi_matching" DROP COLUMN "createdAt"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL`);
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL`);
await queryRunner.query(`CREATE INDEX "IDX_b604d92d6c7aec38627f6eaf16" ON "reversi_matching" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_b46ec40746efceac604142be1c" ON "reversi_game" ("createdAt") `);
}
}

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi21705654039457 {
name = 'Reversi21705654039457'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "user1Accepted" TO "user1Ready"`);
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "user2Accepted" TO "user2Ready"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "user1Ready" TO "user1Accepted"`);
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "user2Ready" TO "user2Accepted"`);
}
}

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi31705793785675 {
name = 'Reversi31705793785675'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "surrendered" TO "surrenderedUserId"`);
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "timeoutUserId" character varying(32)`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "timeoutUserId"`);
await queryRunner.query(`ALTER TABLE "reversi_game" RENAME COLUMN "surrenderedUserId" TO "surrendered"`);
}
}

View file

@ -0,0 +1,18 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi41705794768153 {
name = 'Reversi41705794768153'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "endedAt" TIMESTAMP WITH TIME ZONE`);
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."endedAt" IS 'The ended date of the ReversiGame.'`);
}
async down(queryRunner) {
await queryRunner.query(`COMMENT ON COLUMN "reversi_game"."endedAt" IS 'The ended date of the ReversiGame.'`);
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "endedAt"`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi51705798904141 {
name = 'Reversi51705798904141'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "timeLimitForEachTurn" smallint NOT NULL DEFAULT '90'`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "timeLimitForEachTurn"`);
}
}

View file

@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
export class Reversi61706081514499 {
name = 'Reversi61706081514499'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" ADD "noIrregularRules" boolean NOT NULL DEFAULT false`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "reversi_game" DROP COLUMN "noIrregularRules"`);
}
}

View file

@ -8,11 +8,12 @@
}, },
"scripts": { "scripts": {
"start": "node ./built/boot/entry.js", "start": "node ./built/boot/entry.js",
"start:test": "NODE_ENV=test node ./built/boot/entry.js", "start:test": "cross-env NODE_ENV=test node ./built/boot/entry.js",
"migrate": "pnpm typeorm migration:run -d ormconfig.js", "migrate": "pnpm typeorm migration:run -d ormconfig.js",
"revert": "pnpm typeorm migration:revert -d ormconfig.js", "revert": "pnpm typeorm migration:revert -d ormconfig.js",
"check:connect": "node ./check_connect.js", "check:connect": "node ./check_connect.js",
"build": "swc src -d built -D", "build": "swc src -d built -D",
"build:test": "swc test-server -d built-test -D --config-file test-server/.swcrc",
"watch:swc": "swc src -d built -D -w", "watch:swc": "swc src -d built -D -w",
"build:tsc": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json", "build:tsc": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
"watch": "node watch.mjs", "watch": "node watch.mjs",
@ -21,12 +22,16 @@
"typecheck": "pnpm --filter megalodon build && tsc --noEmit", "typecheck": "pnpm --filter megalodon build && tsc --noEmit",
"eslint": "eslint --quiet \"src/**/*.ts\"", "eslint": "eslint --quiet \"src/**/*.ts\"",
"lint": "pnpm typecheck && pnpm eslint", "lint": "pnpm typecheck && pnpm eslint",
"jest": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit", "jest": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.unit.cjs",
"jest-and-coverage": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit", "jest:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --forceExit --config jest.config.e2e.cjs",
"jest-and-coverage": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.unit.cjs",
"jest-and-coverage:e2e": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --coverage --forceExit --config jest.config.e2e.cjs",
"jest-clear": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --clearCache", "jest-clear": "cross-env NODE_ENV=test node --experimental-vm-modules --experimental-import-meta-resolve node_modules/jest/bin/jest.js --clearCache",
"test": "pnpm jest", "test": "pnpm jest",
"test:e2e": "pnpm build && pnpm build:test && pnpm jest:e2e",
"test-and-coverage": "pnpm jest-and-coverage", "test-and-coverage": "pnpm jest-and-coverage",
"generate-api-json": "node ./generate_api_json.js" "test-and-coverage:e2e": "pnpm build && pnpm build:test && pnpm jest-and-coverage:e2e",
"generate-api-json": "pnpm build && node ./generate_api_json.js"
}, },
"optionalDependencies": { "optionalDependencies": {
"@swc/core-android-arm64": "1.3.11", "@swc/core-android-arm64": "1.3.11",
@ -65,33 +70,35 @@
"@bull-board/ui": "5.10.2", "@bull-board/ui": "5.10.2",
"@discordapp/twemoji": "15.0.2", "@discordapp/twemoji": "15.0.2",
"@fastify/accepts": "4.3.0", "@fastify/accepts": "4.3.0",
"@fastify/cookie": "9.2.0", "@fastify/cookie": "9.3.1",
"@fastify/cors": "8.5.0", "@fastify/cors": "8.5.0",
"@fastify/express": "2.3.0", "@fastify/express": "2.3.0",
"@fastify/http-proxy": "9.3.0", "@fastify/http-proxy": "9.3.0",
"@fastify/multipart": "8.0.0", "@fastify/multipart": "8.1.0",
"@fastify/static": "6.12.0", "@fastify/static": "6.12.0",
"@fastify/view": "8.2.0", "@fastify/view": "8.2.0",
"@misskey-dev/sharp-read-bmp": "^1.1.1",
"@misskey-dev/summaly": "^5.0.3",
"@nestjs/common": "10.2.10", "@nestjs/common": "10.2.10",
"@nestjs/core": "10.2.10", "@nestjs/core": "10.2.10",
"@nestjs/testing": "10.2.10", "@nestjs/testing": "10.2.10",
"@peertube/http-signature": "1.7.0", "@peertube/http-signature": "1.7.0",
"@sharkey/sfm-js": "0.24.3", "@sharkey/sfm-js": "0.24.4",
"@simplewebauthn/server": "8.3.5", "@simplewebauthn/server": "9.0.0",
"@sinonjs/fake-timers": "11.2.2", "@sinonjs/fake-timers": "11.2.2",
"@smithy/node-http-handler": "2.1.10", "@smithy/node-http-handler": "2.1.10",
"@swc/cli": "0.1.63", "@swc/cli": "0.1.63",
"@swc/core": "1.3.100", "@swc/core": "1.3.105",
"@twemoji/parser": "15.0.0", "@twemoji/parser": "15.0.0",
"accepts": "1.3.8", "accepts": "1.3.8",
"ajv": "8.12.0", "ajv": "8.12.0",
"archiver": "6.0.1", "archiver": "6.0.1",
"argon2": "^0.31.1", "argon2": "^0.31.1",
"async-mutex": "0.4.0", "async-mutex": "0.4.1",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "2.0.5", "blurhash": "2.0.5",
"body-parser": "1.20.2", "body-parser": "1.20.2",
"bullmq": "4.15.4", "bullmq": "5.1.4",
"cacheable-lookup": "7.0.0", "cacheable-lookup": "7.0.0",
"cbor": "9.0.1", "cbor": "9.0.1",
"chalk": "5.3.0", "chalk": "5.3.0",
@ -102,11 +109,11 @@
"content-disposition": "0.5.4", "content-disposition": "0.5.4",
"date-fns": "2.30.0", "date-fns": "2.30.0",
"deep-email-validator": "0.1.21", "deep-email-validator": "0.1.21",
"fastify": "4.24.3",
"fastify-multer": "^2.0.3", "fastify-multer": "^2.0.3",
"fastify": "4.25.2",
"fastify-raw-body": "4.3.0", "fastify-raw-body": "4.3.0",
"feed": "4.2.2", "feed": "4.2.2",
"file-type": "18.7.0", "file-type": "19.0.0",
"fluent-ffmpeg": "2.1.2", "fluent-ffmpeg": "2.1.2",
"form-data": "4.0.0", "form-data": "4.0.0",
"glob": "10.3.10", "glob": "10.3.10",
@ -119,25 +126,26 @@
"ipaddr.js": "2.1.0", "ipaddr.js": "2.1.0",
"is-svg": "5.0.0", "is-svg": "5.0.0",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"jsdom": "23.0.1", "jsdom": "23.2.0",
"json5": "2.2.3", "json5": "2.2.3",
"jsonld": "8.3.2", "jsonld": "8.3.2",
"jsrsasign": "10.9.0",
"meilisearch": "0.36.0",
"megalodon": "workspace:*", "megalodon": "workspace:*",
"jsrsasign": "11.0.0",
"meilisearch": "0.37.0",
"microformats-parser": "2.0.2", "microformats-parser": "2.0.2",
"mime-types": "2.1.35", "mime-types": "2.1.35",
"misskey-js": "workspace:*", "misskey-js": "workspace:*",
"misskey-reversi": "workspace:*",
"ms": "3.0.0-canary.1", "ms": "3.0.0-canary.1",
"nanoid": "5.0.4", "nanoid": "5.0.4",
"nested-property": "4.0.0", "nested-property": "4.0.0",
"node-fetch": "3.3.2", "node-fetch": "3.3.2",
"nodemailer": "6.9.7", "nodemailer": "6.9.8",
"oauth": "0.10.0", "oauth": "0.10.0",
"oauth2orize": "1.12.0", "oauth2orize": "1.12.0",
"oauth2orize-pkce": "0.1.2", "oauth2orize-pkce": "0.1.2",
"os-utils": "0.0.14", "os-utils": "0.0.14",
"otpauth": "9.2.1", "otpauth": "9.2.2",
"parse5": "7.1.2", "parse5": "7.1.2",
"pg": "8.11.3", "pg": "8.11.3",
"pkce-challenge": "4.0.1", "pkce-challenge": "4.0.1",
@ -158,29 +166,29 @@
"sanitize-html": "2.11.0", "sanitize-html": "2.11.0",
"secure-json-parse": "2.7.0", "secure-json-parse": "2.7.0",
"sharp": "0.32.6", "sharp": "0.32.6",
"sharp-read-bmp": "github:misskey-dev/sharp-read-bmp",
"slacc": "0.0.10", "slacc": "0.0.10",
"strict-event-emitter-types": "2.0.0", "strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"summaly": "github:misskey-dev/summaly", "systeminformation": "5.21.23",
"systeminformation": "5.21.20",
"tinycolor2": "1.6.0", "tinycolor2": "1.6.0",
"tmp": "0.2.1", "tmp": "0.2.1",
"tsc-alias": "1.8.8", "tsc-alias": "1.8.8",
"tsconfig-paths": "4.2.0", "tsconfig-paths": "4.2.0",
"typeorm": "0.3.17", "typeorm": "0.3.19",
"typescript": "5.3.3", "typescript": "5.3.3",
"ulid": "2.3.0", "ulid": "2.3.0",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"vary": "1.1.2", "vary": "1.1.2",
"web-push": "3.6.6", "web-push": "3.6.7",
"ws": "8.15.1", "ws": "8.16.0",
"xev": "3.0.2" "xev": "3.0.2"
}, },
"devDependencies": { "devDependencies": {
"@jest/globals": "29.7.0", "@jest/globals": "29.7.0",
"@misskey-dev/eslint-plugin": "1.0.0",
"@nestjs/platform-express": "10.3.0",
"@simplewebauthn/typescript-types": "8.3.4", "@simplewebauthn/typescript-types": "8.3.4",
"@swc/jest": "0.2.29", "@swc/jest": "0.2.31",
"@types/accepts": "1.3.7", "@types/accepts": "1.3.7",
"@types/archiver": "6.0.2", "@types/archiver": "6.0.2",
"@types/bcryptjs": "2.4.6", "@types/bcryptjs": "2.4.6",
@ -197,7 +205,7 @@
"@types/jsrsasign": "10.5.12", "@types/jsrsasign": "10.5.12",
"@types/mime-types": "2.1.4", "@types/mime-types": "2.1.4",
"@types/ms": "0.7.34", "@types/ms": "0.7.34",
"@types/node": "20.10.5", "@types/node": "20.11.5",
"@types/node-fetch": "3.0.3", "@types/node-fetch": "3.0.3",
"@types/nodemailer": "6.4.14", "@types/nodemailer": "6.4.14",
"@types/oauth": "0.9.4", "@types/oauth": "0.9.4",
@ -221,16 +229,18 @@
"@types/vary": "1.1.3", "@types/vary": "1.1.3",
"@types/web-push": "3.6.3", "@types/web-push": "3.6.3",
"@types/ws": "8.5.10", "@types/ws": "8.5.10",
"@typescript-eslint/eslint-plugin": "6.14.0", "@typescript-eslint/eslint-plugin": "6.18.1",
"@typescript-eslint/parser": "6.14.0", "@typescript-eslint/parser": "6.18.1",
"aws-sdk-client-mock": "3.0.0", "aws-sdk-client-mock": "3.0.1",
"cross-env": "7.0.3", "cross-env": "7.0.3",
"eslint": "8.56.0", "eslint": "8.56.0",
"eslint-plugin-import": "2.29.1", "eslint-plugin-import": "2.29.1",
"execa": "8.0.1", "execa": "8.0.1",
"fkill": "^9.0.0",
"jest": "29.7.0", "jest": "29.7.0",
"jest-mock": "29.7.0", "jest-mock": "29.7.0",
"nodemon": "3.0.2", "nodemon": "3.0.3",
"pid-port": "1.0.0",
"simple-oauth2": "5.0.0" "simple-oauth2": "5.0.0"
} }
} }

View file

@ -3,7 +3,6 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { setTimeout } from 'node:timers/promises';
import { Global, Inject, Module } from '@nestjs/common'; import { Global, Inject, Module } from '@nestjs/common';
import * as Redis from 'ioredis'; import * as Redis from 'ioredis';
import { DataSource } from 'typeorm'; import { DataSource } from 'typeorm';
@ -12,6 +11,7 @@ import { DI } from './di-symbols.js';
import { Config, loadConfig } from './config.js'; import { Config, loadConfig } from './config.js';
import { createPostgresDataSource } from './postgres.js'; import { createPostgresDataSource } from './postgres.js';
import { RepositoryModule } from './models/RepositoryModule.js'; import { RepositoryModule } from './models/RepositoryModule.js';
import { allSettled } from './misc/promise-tracker.js';
import type { Provider, OnApplicationShutdown } from '@nestjs/common'; import type { Provider, OnApplicationShutdown } from '@nestjs/common';
const $config: Provider = { const $config: Provider = {
@ -94,14 +94,9 @@ export class GlobalModule implements OnApplicationShutdown {
) { } ) { }
public async dispose(): Promise<void> { public async dispose(): Promise<void> {
if (process.env.NODE_ENV === 'test') { // Wait for all potential DB queries
// XXX: await allSettled();
// Shutting down the existing connections causes errors on Jest as // And then disconnect from DB
// Misskey has asynchronous postgres/redis connections that are not
// awaited.
// Let's wait for some random time for them to finish.
await setTimeout(5000);
}
await Promise.all([ await Promise.all([
this.db.destroy(), this.db.destroy(),
this.redisClient.disconnect(), this.redisClient.disconnect(),

View file

@ -149,7 +149,7 @@ export type Config = {
inboxJobMaxAttempts: number | undefined; inboxJobMaxAttempts: number | undefined;
proxyRemoteFiles: boolean | undefined; proxyRemoteFiles: boolean | undefined;
customMOTD: string[] | undefined; customMOTD: string[] | undefined;
signToActivityPubGet: boolean | undefined; signToActivityPubGet: boolean;
checkActivityPubGetSignature: boolean | undefined; checkActivityPubGetSignature: boolean | undefined;
version: string; version: string;
@ -265,7 +265,7 @@ export function loadConfig(): Config {
inboxJobMaxAttempts: config.inboxJobMaxAttempts, inboxJobMaxAttempts: config.inboxJobMaxAttempts,
proxyRemoteFiles: config.proxyRemoteFiles, proxyRemoteFiles: config.proxyRemoteFiles,
customMOTD: config.customMOTD, customMOTD: config.customMOTD,
signToActivityPubGet: config.signToActivityPubGet, signToActivityPubGet: config.signToActivityPubGet ?? true,
checkActivityPubGetSignature: config.checkActivityPubGetSignature, checkActivityPubGetSignature: config.checkActivityPubGetSignature,
mediaProxy: externalMediaProxy ?? internalMediaProxy, mediaProxy: externalMediaProxy ?? internalMediaProxy,
externalMediaProxyEnabled: externalMediaProxy !== null && externalMediaProxy !== internalMediaProxy, externalMediaProxyEnabled: externalMediaProxy !== null && externalMediaProxy !== internalMediaProxy,

View file

@ -87,6 +87,8 @@ export const ACHIEVEMENT_TYPES = [
'brainDiver', 'brainDiver',
'smashTestNotificationButton', 'smashTestNotificationButton',
'tutorialCompleted', 'tutorialCompleted',
'bubbleGameExplodingHead',
'bubbleGameDoubleExplodingHead',
] as const; ] as const;
@Injectable() @Injectable()

View file

@ -55,23 +55,29 @@ export class AntennaService implements OnApplicationShutdown {
const { type, body } = obj.message as GlobalEvents['internal']['payload']; const { type, body } = obj.message as GlobalEvents['internal']['payload'];
switch (type) { switch (type) {
case 'antennaCreated': case 'antennaCreated':
this.antennas.push({ this.antennas.push({ // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body, ...body,
lastUsedAt: new Date(body.lastUsedAt), lastUsedAt: new Date(body.lastUsedAt),
user: null, // joinなカラムは通常取ってこないので
userList: null, // joinなカラムは通常取ってこないので
}); });
break; break;
case 'antennaUpdated': { case 'antennaUpdated': {
const idx = this.antennas.findIndex(a => a.id === body.id); const idx = this.antennas.findIndex(a => a.id === body.id);
if (idx >= 0) { if (idx >= 0) {
this.antennas[idx] = { this.antennas[idx] = { // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body, ...body,
lastUsedAt: new Date(body.lastUsedAt), lastUsedAt: new Date(body.lastUsedAt),
user: null, // joinなカラムは通常取ってこないので
userList: null, // joinなカラムは通常取ってこないので
}; };
} else { } else {
// サーバ起動時にactiveじゃなかった場合、リストに持っていないので追加する必要あり // サーバ起動時にactiveじゃなかった場合、リストに持っていないので追加する必要あり
this.antennas.push({ this.antennas.push({ // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body, ...body,
lastUsedAt: new Date(body.lastUsedAt), lastUsedAt: new Date(body.lastUsedAt),
user: null, // joinなカラムは通常取ってこないので
userList: null, // joinなカラムは通常取ってこないので
}); });
} }
} }

View file

@ -73,6 +73,37 @@ export class CaptchaService {
} }
} }
// https://codeberg.org/Gusted/mCaptcha/src/branch/main/mcaptcha.go
@bindThis
public async verifyMcaptcha(secret: string, siteKey: string, instanceHost: string, response: string | null | undefined): Promise<void> {
if (response == null) {
throw new Error('mcaptcha-failed: no response provided');
}
const endpointUrl = new URL('/api/v1/pow/siteverify', instanceHost);
const result = await this.httpRequestService.send(endpointUrl.toString(), {
method: 'POST',
body: JSON.stringify({
key: siteKey,
secret: secret,
token: response,
}),
headers: {
'Content-Type': 'application/json',
},
});
if (result.status !== 200) {
throw new Error('mcaptcha-failed: mcaptcha didn\'t return 200 OK');
}
const resp = (await result.json()) as { valid: boolean };
if (!resp.valid) {
throw new Error('mcaptcha-request-failed');
}
}
@bindThis @bindThis
public async verifyTurnstile(secret: string, response: string | null | undefined): Promise<void> { public async verifyTurnstile(secret: string, response: string | null | undefined): Promise<void> {
if (response == null) { if (response == null) {

View file

@ -66,6 +66,8 @@ import { FeaturedService } from './FeaturedService.js';
import { FanoutTimelineService } from './FanoutTimelineService.js'; import { FanoutTimelineService } from './FanoutTimelineService.js';
import { ChannelFollowingService } from './ChannelFollowingService.js'; import { ChannelFollowingService } from './ChannelFollowingService.js';
import { RegistryApiService } from './RegistryApiService.js'; import { RegistryApiService } from './RegistryApiService.js';
import { ReversiService } from './ReversiService.js';
import { ChartLoggerService } from './chart/ChartLoggerService.js'; import { ChartLoggerService } from './chart/ChartLoggerService.js';
import FederationChart from './chart/charts/federation.js'; import FederationChart from './chart/charts/federation.js';
import NotesChart from './chart/charts/notes.js'; import NotesChart from './chart/charts/notes.js';
@ -80,6 +82,7 @@ import PerUserFollowingChart from './chart/charts/per-user-following.js';
import PerUserDriveChart from './chart/charts/per-user-drive.js'; import PerUserDriveChart from './chart/charts/per-user-drive.js';
import ApRequestChart from './chart/charts/ap-request.js'; import ApRequestChart from './chart/charts/ap-request.js';
import { ChartManagementService } from './chart/ChartManagementService.js'; import { ChartManagementService } from './chart/ChartManagementService.js';
import { AbuseUserReportEntityService } from './entities/AbuseUserReportEntityService.js'; import { AbuseUserReportEntityService } from './entities/AbuseUserReportEntityService.js';
import { AntennaEntityService } from './entities/AntennaEntityService.js'; import { AntennaEntityService } from './entities/AntennaEntityService.js';
import { AppEntityService } from './entities/AppEntityService.js'; import { AppEntityService } from './entities/AppEntityService.js';
@ -112,6 +115,8 @@ import { UserListEntityService } from './entities/UserListEntityService.js';
import { FlashEntityService } from './entities/FlashEntityService.js'; import { FlashEntityService } from './entities/FlashEntityService.js';
import { FlashLikeEntityService } from './entities/FlashLikeEntityService.js'; import { FlashLikeEntityService } from './entities/FlashLikeEntityService.js';
import { RoleEntityService } from './entities/RoleEntityService.js'; import { RoleEntityService } from './entities/RoleEntityService.js';
import { ReversiGameEntityService } from './entities/ReversiGameEntityService.js';
import { ApAudienceService } from './activitypub/ApAudienceService.js'; import { ApAudienceService } from './activitypub/ApAudienceService.js';
import { ApDbResolverService } from './activitypub/ApDbResolverService.js'; import { ApDbResolverService } from './activitypub/ApDbResolverService.js';
import { ApDeliverManagerService } from './activitypub/ApDeliverManagerService.js'; import { ApDeliverManagerService } from './activitypub/ApDeliverManagerService.js';
@ -199,6 +204,7 @@ const $FanoutTimelineService: Provider = { provide: 'FanoutTimelineService', use
const $FanoutTimelineEndpointService: Provider = { provide: 'FanoutTimelineEndpointService', useExisting: FanoutTimelineEndpointService }; const $FanoutTimelineEndpointService: Provider = { provide: 'FanoutTimelineEndpointService', useExisting: FanoutTimelineEndpointService };
const $ChannelFollowingService: Provider = { provide: 'ChannelFollowingService', useExisting: ChannelFollowingService }; const $ChannelFollowingService: Provider = { provide: 'ChannelFollowingService', useExisting: ChannelFollowingService };
const $RegistryApiService: Provider = { provide: 'RegistryApiService', useExisting: RegistryApiService }; const $RegistryApiService: Provider = { provide: 'RegistryApiService', useExisting: RegistryApiService };
const $ReversiService: Provider = { provide: 'ReversiService', useExisting: ReversiService };
const $ChartLoggerService: Provider = { provide: 'ChartLoggerService', useExisting: ChartLoggerService }; const $ChartLoggerService: Provider = { provide: 'ChartLoggerService', useExisting: ChartLoggerService };
const $FederationChart: Provider = { provide: 'FederationChart', useExisting: FederationChart }; const $FederationChart: Provider = { provide: 'FederationChart', useExisting: FederationChart };
@ -247,6 +253,7 @@ const $UserListEntityService: Provider = { provide: 'UserListEntityService', use
const $FlashEntityService: Provider = { provide: 'FlashEntityService', useExisting: FlashEntityService }; const $FlashEntityService: Provider = { provide: 'FlashEntityService', useExisting: FlashEntityService };
const $FlashLikeEntityService: Provider = { provide: 'FlashLikeEntityService', useExisting: FlashLikeEntityService }; const $FlashLikeEntityService: Provider = { provide: 'FlashLikeEntityService', useExisting: FlashLikeEntityService };
const $RoleEntityService: Provider = { provide: 'RoleEntityService', useExisting: RoleEntityService }; const $RoleEntityService: Provider = { provide: 'RoleEntityService', useExisting: RoleEntityService };
const $ReversiGameEntityService: Provider = { provide: 'ReversiGameEntityService', useExisting: ReversiGameEntityService };
const $ApAudienceService: Provider = { provide: 'ApAudienceService', useExisting: ApAudienceService }; const $ApAudienceService: Provider = { provide: 'ApAudienceService', useExisting: ApAudienceService };
const $ApDbResolverService: Provider = { provide: 'ApDbResolverService', useExisting: ApDbResolverService }; const $ApDbResolverService: Provider = { provide: 'ApDbResolverService', useExisting: ApDbResolverService };
@ -336,6 +343,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
FanoutTimelineEndpointService, FanoutTimelineEndpointService,
ChannelFollowingService, ChannelFollowingService,
RegistryApiService, RegistryApiService,
ReversiService,
ChartLoggerService, ChartLoggerService,
FederationChart, FederationChart,
NotesChart, NotesChart,
@ -350,6 +359,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PerUserDriveChart, PerUserDriveChart,
ApRequestChart, ApRequestChart,
ChartManagementService, ChartManagementService,
AbuseUserReportEntityService, AbuseUserReportEntityService,
AntennaEntityService, AntennaEntityService,
AppEntityService, AppEntityService,
@ -382,6 +392,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
FlashEntityService, FlashEntityService,
FlashLikeEntityService, FlashLikeEntityService,
RoleEntityService, RoleEntityService,
ReversiGameEntityService,
ApAudienceService, ApAudienceService,
ApDbResolverService, ApDbResolverService,
ApDeliverManagerService, ApDeliverManagerService,
@ -466,6 +478,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$FanoutTimelineEndpointService, $FanoutTimelineEndpointService,
$ChannelFollowingService, $ChannelFollowingService,
$RegistryApiService, $RegistryApiService,
$ReversiService,
$ChartLoggerService, $ChartLoggerService,
$FederationChart, $FederationChart,
$NotesChart, $NotesChart,
@ -480,6 +494,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PerUserDriveChart, $PerUserDriveChart,
$ApRequestChart, $ApRequestChart,
$ChartManagementService, $ChartManagementService,
$AbuseUserReportEntityService, $AbuseUserReportEntityService,
$AntennaEntityService, $AntennaEntityService,
$AppEntityService, $AppEntityService,
@ -512,6 +527,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$FlashEntityService, $FlashEntityService,
$FlashLikeEntityService, $FlashLikeEntityService,
$RoleEntityService, $RoleEntityService,
$ReversiGameEntityService,
$ApAudienceService, $ApAudienceService,
$ApDbResolverService, $ApDbResolverService,
$ApDeliverManagerService, $ApDeliverManagerService,
@ -597,6 +614,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
FanoutTimelineEndpointService, FanoutTimelineEndpointService,
ChannelFollowingService, ChannelFollowingService,
RegistryApiService, RegistryApiService,
ReversiService,
FederationChart, FederationChart,
NotesChart, NotesChart,
UsersChart, UsersChart,
@ -610,6 +629,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
PerUserDriveChart, PerUserDriveChart,
ApRequestChart, ApRequestChart,
ChartManagementService, ChartManagementService,
AbuseUserReportEntityService, AbuseUserReportEntityService,
AntennaEntityService, AntennaEntityService,
AppEntityService, AppEntityService,
@ -642,6 +662,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
FlashEntityService, FlashEntityService,
FlashLikeEntityService, FlashLikeEntityService,
RoleEntityService, RoleEntityService,
ReversiGameEntityService,
ApAudienceService, ApAudienceService,
ApDbResolverService, ApDbResolverService,
ApDeliverManagerService, ApDeliverManagerService,
@ -726,6 +748,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$FanoutTimelineEndpointService, $FanoutTimelineEndpointService,
$ChannelFollowingService, $ChannelFollowingService,
$RegistryApiService, $RegistryApiService,
$ReversiService,
$FederationChart, $FederationChart,
$NotesChart, $NotesChart,
$UsersChart, $UsersChart,
@ -739,6 +763,7 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$PerUserDriveChart, $PerUserDriveChart,
$ApRequestChart, $ApRequestChart,
$ChartManagementService, $ChartManagementService,
$AbuseUserReportEntityService, $AbuseUserReportEntityService,
$AntennaEntityService, $AntennaEntityService,
$AppEntityService, $AppEntityService,
@ -771,6 +796,8 @@ const $ApQuestionService: Provider = { provide: 'ApQuestionService', useExisting
$FlashEntityService, $FlashEntityService,
$FlashLikeEntityService, $FlashLikeEntityService,
$RoleEntityService, $RoleEntityService,
$ReversiGameEntityService,
$ApAudienceService, $ApAudienceService,
$ApDbResolverService, $ApDbResolverService,
$ApDeliverManagerService, $ApDeliverManagerService,

View file

@ -145,7 +145,8 @@ export class DownloadService {
const parsedIp = ipaddr.parse(ip); const parsedIp = ipaddr.parse(ip);
for (const net of this.config.allowedPrivateNetworks ?? []) { for (const net of this.config.allowedPrivateNetworks ?? []) {
if (parsedIp.match(ipaddr.parseCIDR(net))) { const cidr = ipaddr.parseCIDR(net);
if (cidr[0].kind() === parsedIp.kind() && parsedIp.match(ipaddr.parseCIDR(net))) {
return false; return false;
} }
} }

View file

@ -7,7 +7,7 @@ import { randomUUID } from 'node:crypto';
import * as fs from 'node:fs'; import * as fs from 'node:fs';
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import sharp from 'sharp'; import sharp from 'sharp';
import { sharpBmp } from 'sharp-read-bmp'; import { sharpBmp } from '@misskey-dev/sharp-read-bmp';
import { IsNull } from 'typeorm'; import { IsNull } from 'typeorm';
import { DeleteObjectCommandInput, PutObjectCommandInput, NoSuchKey } from '@aws-sdk/client-s3'; import { DeleteObjectCommandInput, PutObjectCommandInput, NoSuchKey } from '@aws-sdk/client-s3';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
@ -634,7 +634,7 @@ export class DriveService {
public async updateFile(file: MiDriveFile, values: Partial<MiDriveFile>, updater: MiUser) { public async updateFile(file: MiDriveFile, values: Partial<MiDriveFile>, updater: MiUser) {
const alwaysMarkNsfw = (await this.roleService.getUserPolicies(file.userId)).alwaysMarkNsfw; const alwaysMarkNsfw = (await this.roleService.getUserPolicies(file.userId)).alwaysMarkNsfw;
if (values.name && !this.driveFileEntityService.validateFileName(file.name)) { if (values.name != null && !this.driveFileEntityService.validateFileName(values.name)) {
throw new DriveService.InvalidFileNameError(); throw new DriveService.InvalidFileNameError();
} }

View file

@ -156,7 +156,7 @@ export class EmailService {
@bindThis @bindThis
public async validateEmailForAccount(emailAddress: string): Promise<{ public async validateEmailForAccount(emailAddress: string): Promise<{
available: boolean; available: boolean;
reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned'; reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned' | 'network' | 'blacklist';
}> { }> {
const meta = await this.metaService.fetch(); const meta = await this.metaService.fetch();
@ -165,14 +165,23 @@ export class EmailService {
email: emailAddress, email: emailAddress,
}); });
if (exist !== 0) {
return {
available: false,
reason: 'used',
};
}
let validated: { let validated: {
valid: boolean, valid: boolean,
reason?: string | null, reason?: string | null,
}; } = { valid: true, reason: null };
if (meta.enableActiveEmailValidation) { if (meta.enableActiveEmailValidation) {
if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) { if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) {
validated = await this.verifyMail(emailAddress, meta.verifymailAuthKey); validated = await this.verifyMail(emailAddress, meta.verifymailAuthKey);
} else if (meta.enableTruemailApi && meta.truemailInstance && meta.truemailAuthKey != null) {
validated = await this.trueMail(meta.truemailInstance, emailAddress, meta.truemailAuthKey);
} else { } else {
validated = await validateEmail({ validated = await validateEmail({
email: emailAddress, email: emailAddress,
@ -183,25 +192,37 @@ export class EmailService {
validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので validateSMTP: false, // 日本だと25ポートが殆どのプロバイダーで塞がれていてタイムアウトになるので
}); });
} }
} else { }
validated = { valid: true, reason: null };
if (!validated.valid) {
const formatReason: Record<string, 'format' | 'disposable' | 'mx' | 'smtp' | 'network' | 'blacklist' | undefined> = {
regex: 'format',
disposable: 'disposable',
mx: 'mx',
smtp: 'smtp',
network: 'network',
blacklist: 'blacklist',
};
return {
available: false,
reason: validated.reason ? formatReason[validated.reason] ?? null : null,
};
} }
const emailDomain: string = emailAddress.split('@')[1]; const emailDomain: string = emailAddress.split('@')[1];
const isBanned = this.utilityService.isBlockedHost(meta.bannedEmailDomains, emailDomain); const isBanned = this.utilityService.isBlockedHost(meta.bannedEmailDomains, emailDomain);
const available = exist === 0 && validated.valid && !isBanned; if (isBanned) {
return {
available: false,
reason: 'banned',
};
}
return { return {
available, available: true,
reason: available ? null : reason: null,
exist !== 0 ? 'used' :
isBanned ? 'banned' :
validated.reason === 'regex' ? 'format' :
validated.reason === 'disposable' ? 'disposable' :
validated.reason === 'mx' ? 'mx' :
validated.reason === 'smtp' ? 'smtp' :
null,
}; };
} }
@ -218,7 +239,8 @@ export class EmailService {
}, },
}); });
const json = (await res.json()) as { const json = (await res.json()) as Partial<{
message: string;
block: boolean; block: boolean;
catch_all: boolean; catch_all: boolean;
deliverable_email: boolean; deliverable_email: boolean;
@ -233,8 +255,15 @@ export class EmailService {
mx_priority: { [key: string]: number }; mx_priority: { [key: string]: number };
privacy: boolean; privacy: boolean;
related_domains: string[]; related_domains: string[];
}; }>;
/* api error: when there is only one `message` attribute in the returned result */
if (Object.keys(json).length === 1 && Reflect.has(json, 'message')) {
return {
valid: false,
reason: null,
};
}
if (json.email_address === undefined) { if (json.email_address === undefined) {
return { return {
valid: false, valid: false,
@ -265,4 +294,68 @@ export class EmailService {
reason: null, reason: null,
}; };
} }
private async trueMail<T>(truemailInstance: string, emailAddress: string, truemailAuthKey: string): Promise<{
valid: boolean;
reason: 'used' | 'format' | 'blacklist' | 'mx' | 'smtp' | 'network' | T | null;
}> {
const endpoint = truemailInstance + '?email=' + emailAddress;
try {
const res = await this.httpRequestService.send(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
Authorization: truemailAuthKey,
},
});
const json = (await res.json()) as {
email: string;
success: boolean;
error?: string;
errors?: {
list_match?: string;
regex?: string;
mx?: string;
smtp?: string;
} | null;
};
if (json.email === undefined || json.errors?.regex) {
return {
valid: false,
reason: 'format',
};
}
if (json.errors?.smtp) {
return {
valid: false,
reason: 'smtp',
};
}
if (json.errors?.mx) {
return {
valid: false,
reason: 'mx',
};
}
if (!json.success) {
return {
valid: false,
reason: json.errors?.list_match as T || 'blacklist',
};
}
return {
valid: true,
reason: null,
};
} catch (error) {
return {
valid: false,
reason: 'network',
};
}
}
} }

View file

@ -122,6 +122,8 @@ export class FanoutTimelineEndpointService {
filter = (note) => { filter = (note) => {
if (isUserRelated(note, userIdsWhoBlockingMe, ps.ignoreAuthorFromBlock)) return false; if (isUserRelated(note, userIdsWhoBlockingMe, ps.ignoreAuthorFromBlock)) return false;
if (isUserRelated(note, userIdsWhoMeMuting, ps.ignoreAuthorFromMute)) return false; if (isUserRelated(note, userIdsWhoMeMuting, ps.ignoreAuthorFromMute)) return false;
if (note.mentions.some(mention => userIdsWhoMeMuting.has(mention))) return false;
if (isPureRenote(note) && note.renote && note.renote.mentions.some(mention => userIdsWhoMeMuting.has(mention))) return false;
if (isPureRenote(note) && isUserRelated(note, userIdsWhoMeMutingRenotes, ps.ignoreAuthorFromMute)) return false; if (isPureRenote(note) && isUserRelated(note, userIdsWhoMeMutingRenotes, ps.ignoreAuthorFromMute)) return false;
if (isInstanceMuted(note, userMutedInstances)) return false; if (isInstanceMuted(note, userMutedInstances)) return false;

View file

@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable } from '@nestjs/common';
import * as Redis from 'ioredis'; import * as Redis from 'ioredis';
import * as Reversi from 'misskey-reversi';
import type { MiChannel } from '@/models/Channel.js'; import type { MiChannel } from '@/models/Channel.js';
import type { MiUser } from '@/models/User.js'; import type { MiUser } from '@/models/User.js';
import type { MiUserProfile } from '@/models/UserProfile.js'; import type { MiUserProfile } from '@/models/UserProfile.js';
@ -18,7 +19,7 @@ import type { MiSignin } from '@/models/Signin.js';
import type { MiPage } from '@/models/Page.js'; import type { MiPage } from '@/models/Page.js';
import type { MiWebhook } from '@/models/Webhook.js'; import type { MiWebhook } from '@/models/Webhook.js';
import type { MiMeta } from '@/models/Meta.js'; import type { MiMeta } from '@/models/Meta.js';
import { MiAvatarDecoration, MiRole, MiRoleAssignment } from '@/models/_.js'; import { MiAvatarDecoration, MiReversiGame, MiRole, MiRoleAssignment } from '@/models/_.js';
import type { Packed } from '@/misc/json-schema.js'; import type { Packed } from '@/misc/json-schema.js';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js'; import type { Config } from '@/config.js';
@ -162,6 +163,38 @@ export interface AdminEventTypes {
comment: string; comment: string;
}; };
} }
export interface ReversiEventTypes {
matched: {
game: Packed<'ReversiGameDetailed'>;
};
invited: {
user: Packed<'User'>;
};
}
export interface ReversiGameEventTypes {
changeReadyStates: {
user1: boolean;
user2: boolean;
};
updateSettings: {
userId: MiUser['id'];
key: string;
value: any;
};
log: Reversi.Serializer.Log & { id: string | null };
started: {
game: Packed<'ReversiGameDetailed'>;
};
ended: {
winnerId: MiUser['id'] | null;
game: Packed<'ReversiGameDetailed'>;
};
canceled: {
userId: MiUser['id'];
};
}
//#endregion //#endregion
// 辞書(interface or type)から{ type, body }ユニオンを定義 // 辞書(interface or type)から{ type, body }ユニオンを定義
@ -252,6 +285,14 @@ export type GlobalEvents = {
name: 'notesStream'; name: 'notesStream';
payload: Serialized<Packed<'Note'>>; payload: Serialized<Packed<'Note'>>;
}; };
reversi: {
name: `reversiStream:${MiUser['id']}`;
payload: EventUnionFromDictionary<SerializedAll<ReversiEventTypes>>;
};
reversiGame: {
name: `reversiGameStream:${MiReversiGame['id']}`;
payload: EventUnionFromDictionary<SerializedAll<ReversiGameEventTypes>>;
};
}; };
// API event definitions // API event definitions
@ -341,4 +382,14 @@ export class GlobalEventService {
public publishAdminStream<K extends keyof AdminEventTypes>(userId: MiUser['id'], type: K, value?: AdminEventTypes[K]): void { public publishAdminStream<K extends keyof AdminEventTypes>(userId: MiUser['id'], type: K, value?: AdminEventTypes[K]): void {
this.publish(`adminStream:${userId}`, type, typeof value === 'undefined' ? null : value); this.publish(`adminStream:${userId}`, type, typeof value === 'undefined' ? null : value);
} }
@bindThis
public publishReversiStream<K extends keyof ReversiEventTypes>(userId: MiUser['id'], type: K, value?: ReversiEventTypes[K]): void {
this.publish(`reversiStream:${userId}`, type, typeof value === 'undefined' ? null : value);
}
@bindThis
public publishReversiGameStream<K extends keyof ReversiGameEventTypes>(gameId: MiReversiGame['id'], type: K, value?: ReversiGameEventTypes[K]): void {
this.publish(`reversiGameStream:${gameId}`, type, typeof value === 'undefined' ? null : value);
}
} }

View file

@ -51,7 +51,10 @@ export class MetaService implements OnApplicationShutdown {
const { type, body } = obj.message as GlobalEvents['internal']['payload']; const { type, body } = obj.message as GlobalEvents['internal']['payload'];
switch (type) { switch (type) {
case 'metaUpdated': { case 'metaUpdated': {
this.cache = body; this.cache = { // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body,
proxyAccount: null, // joinなカラムは通常取ってこないので
};
break; break;
} }
default: default:

View file

@ -57,7 +57,10 @@ import { FeaturedService } from '@/core/FeaturedService.js';
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js'; import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import { UtilityService } from '@/core/UtilityService.js'; import { UtilityService } from '@/core/UtilityService.js';
import { UserBlockingService } from '@/core/UserBlockingService.js'; import { UserBlockingService } from '@/core/UserBlockingService.js';
import { CacheService } from '@/core/CacheService.js';
import { isReply } from '@/misc/is-reply.js'; import { isReply } from '@/misc/is-reply.js';
import { trackPromise } from '@/misc/promise-tracker.js';
import { isUserRelated } from '@/misc/is-user-related.js';
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention'; type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
@ -216,6 +219,7 @@ export class NoteCreateService implements OnApplicationShutdown {
private instanceChart: InstanceChart, private instanceChart: InstanceChart,
private utilityService: UtilityService, private utilityService: UtilityService,
private userBlockingService: UserBlockingService, private userBlockingService: UserBlockingService,
private cacheService: CacheService,
) { } ) { }
@bindThis @bindThis
@ -493,6 +497,9 @@ export class NoteCreateService implements OnApplicationShutdown {
data.text = data.text.slice(0, DB_MAX_NOTE_TEXT_LENGTH); data.text = data.text.slice(0, DB_MAX_NOTE_TEXT_LENGTH);
} }
data.text = data.text.trim(); data.text = data.text.trim();
if (data.text === '') {
data.text = null;
}
} else { } else {
data.text = null; data.text = null;
} }
@ -792,7 +799,15 @@ export class NoteCreateService implements OnApplicationShutdown {
}, },
}); });
if (!isThreadMuted) { const [
userIdsWhoMeMuting,
] = data.reply.userId ? await Promise.all([
this.cacheService.userMutingsCache.fetch(data.reply.userId),
]) : [new Set<string>()];
const muted = isUserRelated(note, userIdsWhoMeMuting);
if (!isThreadMuted || !muted) {
nm.push(data.reply.userId, 'reply'); nm.push(data.reply.userId, 'reply');
this.globalEventService.publishMainStream(data.reply.userId, 'reply', noteObj); this.globalEventService.publishMainStream(data.reply.userId, 'reply', noteObj);
@ -812,8 +827,25 @@ export class NoteCreateService implements OnApplicationShutdown {
// Notify // Notify
if (data.renote.userHost === null) { if (data.renote.userHost === null) {
const isThreadMuted = await this.noteThreadMutingsRepository.exist({
where: {
userId: data.renote.userId,
threadId: data.renote.threadId ?? data.renote.id,
},
});
const [
userIdsWhoMeMuting,
] = data.renote.userId ? await Promise.all([
this.cacheService.userMutingsCache.fetch(data.renote.userId),
]) : [new Set<string>()];
const muted = isUserRelated(note, userIdsWhoMeMuting);
if (!isThreadMuted || !muted) {
nm.push(data.renote.userId, type); nm.push(data.renote.userId, type);
} }
}
// Publish event // Publish event
if ((user.id !== data.renote.userId) && data.renote.userHost === null) { if ((user.id !== data.renote.userId) && data.renote.userHost === null) {
@ -862,7 +894,7 @@ export class NoteCreateService implements OnApplicationShutdown {
this.relayService.deliverToRelays(user, noteActivity); this.relayService.deliverToRelays(user, noteActivity);
} }
dm.execute(); trackPromise(dm.execute());
})(); })();
} }
//#endregion //#endregion
@ -1029,7 +1061,15 @@ export class NoteCreateService implements OnApplicationShutdown {
}, },
}); });
if (isThreadMuted) { const [
userIdsWhoMeMuting,
] = u.id ? await Promise.all([
this.cacheService.userMutingsCache.fetch(u.id),
]) : [new Set<string>()];
const muted = isUserRelated(note, userIdsWhoMeMuting);
if (isThreadMuted || muted) {
continue; continue;
} }

View file

@ -14,6 +14,7 @@ import { IdService } from '@/core/IdService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js'; import { GlobalEventService } from '@/core/GlobalEventService.js';
import type { NoteUnreadsRepository, MutingsRepository, NoteThreadMutingsRepository } from '@/models/_.js'; import type { NoteUnreadsRepository, MutingsRepository, NoteThreadMutingsRepository } from '@/models/_.js';
import { bindThis } from '@/decorators.js'; import { bindThis } from '@/decorators.js';
import { trackPromise } from '@/misc/promise-tracker.js';
@Injectable() @Injectable()
export class NoteReadService implements OnApplicationShutdown { export class NoteReadService implements OnApplicationShutdown {
@ -107,7 +108,7 @@ export class NoteReadService implements OnApplicationShutdown {
// TODO: ↓まとめてクエリしたい // TODO: ↓まとめてクエリしたい
this.noteUnreadsRepository.countBy({ trackPromise(this.noteUnreadsRepository.countBy({
userId: userId, userId: userId,
isMentioned: true, isMentioned: true,
}).then(mentionsCount => { }).then(mentionsCount => {
@ -115,9 +116,9 @@ export class NoteReadService implements OnApplicationShutdown {
// 全て既読になったイベントを発行 // 全て既読になったイベントを発行
this.globalEventService.publishMainStream(userId, 'readAllUnreadMentions'); this.globalEventService.publishMainStream(userId, 'readAllUnreadMentions');
} }
}); }));
this.noteUnreadsRepository.countBy({ trackPromise(this.noteUnreadsRepository.countBy({
userId: userId, userId: userId,
isSpecified: true, isSpecified: true,
}).then(specifiedCount => { }).then(specifiedCount => {
@ -125,7 +126,7 @@ export class NoteReadService implements OnApplicationShutdown {
// 全て既読になったイベントを発行 // 全て既読になったイベントを発行
this.globalEventService.publishMainStream(userId, 'readAllUnreadSpecifiedNotes'); this.globalEventService.publishMainStream(userId, 'readAllUnreadSpecifiedNotes');
} }
}); }));
} }
} }

View file

@ -20,6 +20,7 @@ import { CacheService } from '@/core/CacheService.js';
import type { Config } from '@/config.js'; import type { Config } from '@/config.js';
import { UserListService } from '@/core/UserListService.js'; import { UserListService } from '@/core/UserListService.js';
import type { FilterUnionByProperty } from '@/types.js'; import type { FilterUnionByProperty } from '@/types.js';
import { trackPromise } from '@/misc/promise-tracker.js';
@Injectable() @Injectable()
export class NotificationService implements OnApplicationShutdown { export class NotificationService implements OnApplicationShutdown {
@ -74,7 +75,18 @@ export class NotificationService implements OnApplicationShutdown {
} }
@bindThis @bindThis
public async createNotification<T extends MiNotification['type']>( public createNotification<T extends MiNotification['type']>(
notifieeId: MiUser['id'],
type: T,
data: Omit<FilterUnionByProperty<MiNotification, 'type', T>, 'type' | 'id' | 'createdAt' | 'notifierId'>,
notifierId?: MiUser['id'] | null,
) {
trackPromise(
this.#createNotificationInternal(notifieeId, type, data, notifierId),
);
}
async #createNotificationInternal<T extends MiNotification['type']>(
notifieeId: MiUser['id'], notifieeId: MiUser['id'],
type: T, type: T,
data: Omit<FilterUnionByProperty<MiNotification, 'type', T>, 'type' | 'id' | 'createdAt' | 'notifierId'>, data: Omit<FilterUnionByProperty<MiNotification, 'type', T>, 'type' | 'id' | 'createdAt' | 'notifierId'>,

View file

@ -212,8 +212,8 @@ export class QueryService {
// または 自分自身 // または 自分自身
.orWhere('note.userId = :meId') .orWhere('note.userId = :meId')
// または 自分宛て // または 自分宛て
.orWhere(':meId = ANY(note.visibleUserIds)') .orWhere(':meIdAsList <@ note.visibleUserIds')
.orWhere(':meId = ANY(note.mentions)') .orWhere(':meIdAsList <@ note.mentions')
.orWhere(new Brackets(qb => { .orWhere(new Brackets(qb => {
qb qb
// または フォロワー宛ての投稿であり、 // または フォロワー宛ての投稿であり、
@ -228,7 +228,7 @@ export class QueryService {
})); }));
})); }));
q.setParameters({ meId: me.id }); q.setParameters({ meId: me.id, meIdAsList: [me.id] });
} }
} }

View file

@ -3,12 +3,12 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { setTimeout } from 'node:timers/promises';
import { Inject, Module, OnApplicationShutdown } from '@nestjs/common'; import { Inject, Module, OnApplicationShutdown } from '@nestjs/common';
import * as Bull from 'bullmq'; import * as Bull from 'bullmq';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js'; import type { Config } from '@/config.js';
import { QUEUE, baseQueueOptions } from '@/queue/const.js'; import { QUEUE, baseQueueOptions } from '@/queue/const.js';
import { allSettled } from '@/misc/promise-tracker.js';
import type { Provider } from '@nestjs/common'; import type { Provider } from '@nestjs/common';
import type { DeliverJobData, InboxJobData, EndedPollNotificationJobData, WebhookDeliverJobData, RelationshipJobData } from '../queue/types.js'; import type { DeliverJobData, InboxJobData, EndedPollNotificationJobData, WebhookDeliverJobData, RelationshipJobData } from '../queue/types.js';
@ -106,14 +106,9 @@ export class QueueModule implements OnApplicationShutdown {
) {} ) {}
public async dispose(): Promise<void> { public async dispose(): Promise<void> {
if (process.env.NODE_ENV === 'test') { // Wait for all potential queue jobs
// XXX: await allSettled();
// Shutting down the existing connections causes errors on Jest as // And then close all queues
// Misskey has asynchronous postgres/redis connections that are not
// awaited.
// Let's wait for some random time for them to finish.
await setTimeout(5000);
}
await Promise.all([ await Promise.all([
this.systemQueue.close(), this.systemQueue.close(),
this.endedPollNotificationQueue.close(), this.endedPollNotificationQueue.close(),

View file

@ -17,6 +17,7 @@ import type { DbJobData, DeliverJobData, RelationshipJobData, ThinUser } from '.
import type httpSignature from '@peertube/http-signature'; import type httpSignature from '@peertube/http-signature';
import type * as Bull from 'bullmq'; import type * as Bull from 'bullmq';
import { MiNote } from '@/models/Note.js'; import { MiNote } from '@/models/Note.js';
import { ApRequestCreator } from '@/core/activitypub/ApRequestService.js';
@Injectable() @Injectable()
export class QueueService { export class QueueService {
@ -75,11 +76,15 @@ export class QueueService {
if (content == null) return null; if (content == null) return null;
if (to == null) return null; if (to == null) return null;
const contentBody = JSON.stringify(content);
const digest = ApRequestCreator.createDigest(contentBody);
const data: DeliverJobData = { const data: DeliverJobData = {
user: { user: {
id: user.id, id: user.id,
}, },
content, content: contentBody,
digest,
to, to,
isSharedInbox, isSharedInbox,
}; };
@ -104,6 +109,8 @@ export class QueueService {
@bindThis @bindThis
public async deliverMany(user: ThinUser, content: IActivity | null, inboxes: Map<string, boolean>) { public async deliverMany(user: ThinUser, content: IActivity | null, inboxes: Map<string, boolean>) {
if (content == null) return null; if (content == null) return null;
const contentBody = JSON.stringify(content);
const digest = ApRequestCreator.createDigest(contentBody);
const opts = { const opts = {
attempts: this.config.deliverJobMaxAttempts ?? 12, attempts: this.config.deliverJobMaxAttempts ?? 12,
@ -118,7 +125,8 @@ export class QueueService {
name: d[0], name: d[0],
data: { data: {
user, user,
content, content: contentBody,
digest,
to: d[0], to: d[0],
isSharedInbox: d[1], isSharedInbox: d[1],
} as DeliverJobData, } as DeliverJobData,
@ -185,6 +193,16 @@ export class QueueService {
}); });
} }
@bindThis
public createExportClipsJob(user: ThinUser) {
return this.dbQueue.add('exportClips', {
user: { id: user.id },
}, {
removeOnComplete: true,
removeOnFail: true,
});
}
@bindThis @bindThis
public createExportFavoritesJob(user: ThinUser) { public createExportFavoritesJob(user: ThinUser) {
return this.dbQueue.add('exportFavorites', { return this.dbQueue.add('exportFavorites', {

View file

@ -28,6 +28,7 @@ import { UserBlockingService } from '@/core/UserBlockingService.js';
import { CustomEmojiService } from '@/core/CustomEmojiService.js'; import { CustomEmojiService } from '@/core/CustomEmojiService.js';
import { RoleService } from '@/core/RoleService.js'; import { RoleService } from '@/core/RoleService.js';
import { FeaturedService } from '@/core/FeaturedService.js'; import { FeaturedService } from '@/core/FeaturedService.js';
import { trackPromise } from '@/misc/promise-tracker.js';
const FALLBACK = '❤'; const FALLBACK = '❤';
const PER_NOTE_REACTION_USER_PAIR_CACHE_MAX = 16; const PER_NOTE_REACTION_USER_PAIR_CACHE_MAX = 16;
@ -280,7 +281,7 @@ export class ReactionService {
} }
} }
dm.execute(); trackPromise(dm.execute());
} }
//#endregion //#endregion
} }
@ -328,7 +329,7 @@ export class ReactionService {
dm.addDirectRecipe(reactee as MiRemoteUser); dm.addDirectRecipe(reactee as MiRemoteUser);
} }
dm.addFollowersRecipe(); dm.addFollowersRecipe();
dm.execute(); trackPromise(dm.execute());
} }
//#endregion //#endregion
} }

View file

@ -0,0 +1,615 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable } from '@nestjs/common';
import * as Redis from 'ioredis';
import { ModuleRef } from '@nestjs/core';
import * as Reversi from 'misskey-reversi';
import { IsNull, LessThan, MoreThan } from 'typeorm';
import type {
MiReversiGame,
ReversiGamesRepository,
} from '@/models/_.js';
import type { MiUser } from '@/models/User.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { CacheService } from '@/core/CacheService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import { IdService } from '@/core/IdService.js';
import { NotificationService } from '@/core/NotificationService.js';
import { Serialized } from '@/types.js';
import { ReversiGameEntityService } from './entities/ReversiGameEntityService.js';
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
const INVITATION_TIMEOUT_MS = 1000 * 20; // 20sec
@Injectable()
export class ReversiService implements OnApplicationShutdown, OnModuleInit {
private notificationService: NotificationService;
constructor(
private moduleRef: ModuleRef,
@Inject(DI.redis)
private redisClient: Redis.Redis,
@Inject(DI.reversiGamesRepository)
private reversiGamesRepository: ReversiGamesRepository,
private cacheService: CacheService,
private userEntityService: UserEntityService,
private globalEventService: GlobalEventService,
private reversiGameEntityService: ReversiGameEntityService,
private idService: IdService,
) {
}
async onModuleInit() {
this.notificationService = this.moduleRef.get(NotificationService.name);
}
@bindThis
private async cacheGame(game: MiReversiGame) {
await this.redisClient.setex(`reversi:game:cache:${game.id}`, 60 * 60, JSON.stringify(game));
}
@bindThis
private async deleteGameCache(gameId: MiReversiGame['id']) {
await this.redisClient.del(`reversi:game:cache:${gameId}`);
}
@bindThis
private getBakeProps(game: MiReversiGame) {
return {
startedAt: game.startedAt,
endedAt: game.endedAt,
// ゲームの途中からユーザーが変わることは無いので
//user1Id: game.user1Id,
//user2Id: game.user2Id,
user1Ready: game.user1Ready,
user2Ready: game.user2Ready,
black: game.black,
isStarted: game.isStarted,
isEnded: game.isEnded,
winnerId: game.winnerId,
surrenderedUserId: game.surrenderedUserId,
timeoutUserId: game.timeoutUserId,
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
timeLimitForEachTurn: game.timeLimitForEachTurn,
logs: game.logs,
map: game.map,
bw: game.bw,
crc32: game.crc32,
noIrregularRules: game.noIrregularRules,
} satisfies Partial<MiReversiGame>;
}
@bindThis
public async matchSpecificUser(me: MiUser, targetUser: MiUser, multiple = false): Promise<MiReversiGame | null> {
if (targetUser.id === me.id) {
throw new Error('You cannot match yourself.');
}
if (!multiple) {
// 既にマッチしている対局が無いか探す(3分以内)
const games = await this.reversiGamesRepository.find({
where: [
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user1Id: me.id, user2Id: targetUser.id, isStarted: false },
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user1Id: targetUser.id, user2Id: me.id, isStarted: false },
],
relations: ['user1', 'user2'],
order: { id: 'DESC' },
});
if (games.length > 0) {
return games[0];
}
}
//#region 相手から既に招待されてないか確認
const invitations = await this.redisClient.zrange(
`reversi:matchSpecific:${me.id}`,
Date.now() - INVITATION_TIMEOUT_MS,
'+inf',
'BYSCORE');
if (invitations.includes(targetUser.id)) {
await this.redisClient.zrem(`reversi:matchSpecific:${me.id}`, targetUser.id);
const game = await this.matched(targetUser.id, me.id, {
noIrregularRules: false,
});
return game;
}
//#endregion
const redisPipeline = this.redisClient.pipeline();
redisPipeline.zadd(`reversi:matchSpecific:${targetUser.id}`, Date.now(), me.id);
redisPipeline.expire(`reversi:matchSpecific:${targetUser.id}`, 120, 'NX');
await redisPipeline.exec();
this.globalEventService.publishReversiStream(targetUser.id, 'invited', {
user: await this.userEntityService.pack(me, targetUser),
});
return null;
}
@bindThis
public async matchAnyUser(me: MiUser, options: { noIrregularRules: boolean }, multiple = false): Promise<MiReversiGame | null> {
if (!multiple) {
// 既にマッチしている対局が無いか探す(3分以内)
const games = await this.reversiGamesRepository.find({
where: [
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user1Id: me.id, isStarted: false },
{ id: MoreThan(this.idService.gen(Date.now() - 1000 * 60 * 3)), user2Id: me.id, isStarted: false },
],
relations: ['user1', 'user2'],
order: { id: 'DESC' },
});
if (games.length > 0) {
return games[0];
}
}
//#region まず自分宛ての招待を探す
const invitations = await this.redisClient.zrange(
`reversi:matchSpecific:${me.id}`,
Date.now() - INVITATION_TIMEOUT_MS,
'+inf',
'BYSCORE');
if (invitations.length > 0) {
const invitorId = invitations[Math.floor(Math.random() * invitations.length)];
await this.redisClient.zrem(`reversi:matchSpecific:${me.id}`, invitorId);
const game = await this.matched(invitorId, me.id, {
noIrregularRules: false,
});
return game;
}
//#endregion
const matchings = await this.redisClient.zrange(
'reversi:matchAny',
0,
2, // 自分自身のIDが入っている場合もあるので2つ取得
'REV');
const items = matchings.filter(id => !id.startsWith(me.id));
if (items.length > 0) {
const [matchedUserId, option] = items[0].split(':');
await this.redisClient.zrem('reversi:matchAny',
me.id,
matchedUserId,
me.id + ':noIrregularRules',
matchedUserId + ':noIrregularRules');
const game = await this.matched(matchedUserId, me.id, {
noIrregularRules: options.noIrregularRules || option === 'noIrregularRules',
});
return game;
} else {
const redisPipeline = this.redisClient.pipeline();
if (options.noIrregularRules) {
redisPipeline.zadd('reversi:matchAny', Date.now(), me.id + ':noIrregularRules');
} else {
redisPipeline.zadd('reversi:matchAny', Date.now(), me.id);
}
redisPipeline.expire('reversi:matchAny', 15, 'NX');
await redisPipeline.exec();
return null;
}
}
@bindThis
public async matchSpecificUserCancel(user: MiUser, targetUserId: MiUser['id']) {
await this.redisClient.zrem(`reversi:matchSpecific:${targetUserId}`, user.id);
}
@bindThis
public async matchAnyUserCancel(user: MiUser) {
await this.redisClient.zrem('reversi:matchAny', user.id, user.id + ':noIrregularRules');
}
@bindThis
public async cleanOutdatedGames() {
await this.reversiGamesRepository.delete({
id: LessThan(this.idService.gen(Date.now() - 1000 * 60 * 10)),
isStarted: false,
});
}
@bindThis
public async gameReady(gameId: MiReversiGame['id'], user: MiUser, ready: boolean) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isStarted) return;
let isBothReady = false;
if (game.user1Id === user.id) {
const updatedGame = {
...game,
user1Ready: ready,
};
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'changeReadyStates', {
user1: ready,
user2: updatedGame.user2Ready,
});
if (ready && updatedGame.user2Ready) isBothReady = true;
} else if (game.user2Id === user.id) {
const updatedGame = {
...game,
user2Ready: ready,
};
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'changeReadyStates', {
user1: updatedGame.user1Ready,
user2: ready,
});
if (ready && updatedGame.user1Ready) isBothReady = true;
} else {
return;
}
if (isBothReady) {
// 3秒後、両者readyならゲーム開始
setTimeout(async () => {
const freshGame = await this.get(game.id);
if (freshGame == null || freshGame.isStarted || freshGame.isEnded) return;
if (!freshGame.user1Ready || !freshGame.user2Ready) return;
this.startGame(freshGame);
}, 3000);
}
}
@bindThis
private async matched(parentId: MiUser['id'], childId: MiUser['id'], options: { noIrregularRules: boolean; }): Promise<MiReversiGame> {
const game = await this.reversiGamesRepository.insert({
id: this.idService.gen(),
user1Id: parentId,
user2Id: childId,
user1Ready: false,
user2Ready: false,
isStarted: false,
isEnded: false,
logs: [],
map: Reversi.maps.eighteight.data,
bw: 'random',
isLlotheo: false,
noIrregularRules: options.noIrregularRules,
}).then(x => this.reversiGamesRepository.findOneOrFail({
where: { id: x.identifiers[0].id },
relations: ['user1', 'user2'],
}));
this.cacheGame(game);
const packed = await this.reversiGameEntityService.packDetail(game);
this.globalEventService.publishReversiStream(parentId, 'matched', { game: packed });
return game;
}
@bindThis
private async startGame(game: MiReversiGame) {
let bw: number;
if (game.bw === 'random') {
bw = Math.random() > 0.5 ? 1 : 2;
} else {
bw = parseInt(game.bw, 10);
}
const engine = new Reversi.Game(game.map, {
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
});
const crc32 = engine.calcCrc32().toString();
const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
.set({
...this.getBakeProps(game),
startedAt: new Date(),
isStarted: true,
black: bw,
map: game.map,
crc32,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
// キャッシュ効率化のためにユーザー情報は再利用
updatedGame.user1 = game.user1;
updatedGame.user2 = game.user2;
this.cacheGame(updatedGame);
//#region 盤面に最初から石がないなどして始まった瞬間に勝敗が決定する場合があるのでその処理
if (engine.isEnded) {
let winnerId;
if (engine.winner === true) {
winnerId = bw === 1 ? updatedGame.user1Id : updatedGame.user2Id;
} else if (engine.winner === false) {
winnerId = bw === 1 ? updatedGame.user2Id : updatedGame.user1Id;
} else {
winnerId = null;
}
await this.endGame(updatedGame, winnerId, null);
return;
}
//#endregion
this.redisClient.setex(`reversi:game:turnTimer:${game.id}:1`, updatedGame.timeLimitForEachTurn, '');
this.globalEventService.publishReversiGameStream(game.id, 'started', {
game: await this.reversiGameEntityService.packDetail(updatedGame),
});
}
@bindThis
private async endGame(game: MiReversiGame, winnerId: MiUser['id'] | null, reason: 'surrender' | 'timeout' | null) {
const updatedGame = await this.reversiGamesRepository.createQueryBuilder().update()
.set({
...this.getBakeProps(game),
isEnded: true,
endedAt: new Date(),
winnerId: winnerId,
surrenderedUserId: reason === 'surrender' ? (winnerId === game.user1Id ? game.user2Id : game.user1Id) : null,
timeoutUserId: reason === 'timeout' ? (winnerId === game.user1Id ? game.user2Id : game.user1Id) : null,
})
.where('id = :id', { id: game.id })
.returning('*')
.execute()
.then((response) => response.raw[0]);
// キャッシュ効率化のためにユーザー情報は再利用
updatedGame.user1 = game.user1;
updatedGame.user2 = game.user2;
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'ended', {
winnerId: winnerId,
game: await this.reversiGameEntityService.packDetail(updatedGame),
});
}
@bindThis
public async getInvitations(user: MiUser): Promise<MiUser['id'][]> {
const invitations = await this.redisClient.zrange(
`reversi:matchSpecific:${user.id}`,
Date.now() - INVITATION_TIMEOUT_MS,
'+inf',
'BYSCORE');
return invitations;
}
@bindThis
public async updateSettings(gameId: MiReversiGame['id'], user: MiUser, key: string, value: any) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isStarted) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
if ((game.user1Id === user.id) && game.user1Ready) return;
if ((game.user2Id === user.id) && game.user2Ready) return;
if (!['map', 'bw', 'isLlotheo', 'canPutEverywhere', 'loopedBoard', 'timeLimitForEachTurn'].includes(key)) return;
// TODO: より厳格なバリデーション
const updatedGame = {
...game,
[key]: value,
};
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'updateSettings', {
userId: user.id,
key: key,
value: value,
});
}
@bindThis
public async putStoneToGame(gameId: MiReversiGame['id'], user: MiUser, pos: number, id?: string | null) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (!game.isStarted) return;
if (game.isEnded) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
const myColor =
((game.user1Id === user.id) && game.black === 1) || ((game.user2Id === user.id) && game.black === 2)
? true
: false;
const engine = Reversi.Serializer.restoreGame({
map: game.map,
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
logs: game.logs,
});
if (engine.turn !== myColor) return;
if (!engine.canPut(myColor, pos)) return;
engine.putStone(pos);
const logs = Reversi.Serializer.deserializeLogs(game.logs);
const log = {
time: Date.now(),
player: myColor,
operation: 'put',
pos,
} as const;
logs.push(log);
const serializeLogs = Reversi.Serializer.serializeLogs(logs);
const crc32 = engine.calcCrc32().toString();
const updatedGame = {
...game,
crc32,
logs: serializeLogs,
};
this.cacheGame(updatedGame);
this.globalEventService.publishReversiGameStream(game.id, 'log', {
...log,
id: id ?? null,
});
if (engine.isEnded) {
let winnerId;
if (engine.winner === true) {
winnerId = game.black === 1 ? game.user1Id : game.user2Id;
} else if (engine.winner === false) {
winnerId = game.black === 1 ? game.user2Id : game.user1Id;
} else {
winnerId = null;
}
await this.endGame(updatedGame, winnerId, null);
} else {
this.redisClient.setex(`reversi:game:turnTimer:${game.id}:${engine.turn ? '1' : '0'}`, updatedGame.timeLimitForEachTurn, '');
}
}
@bindThis
public async surrender(gameId: MiReversiGame['id'], user: MiUser) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isEnded) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
const winnerId = game.user1Id === user.id ? game.user2Id : game.user1Id;
await this.endGame(game, winnerId, 'surrender');
}
@bindThis
public async checkTimeout(gameId: MiReversiGame['id']) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isEnded) return;
const engine = Reversi.Serializer.restoreGame({
map: game.map,
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
logs: game.logs,
});
if (engine.turn == null) return;
const timer = await this.redisClient.exists(`reversi:game:turnTimer:${game.id}:${engine.turn ? '1' : '0'}`);
if (timer === 0) {
const winnerId = engine.turn ? (game.black === 1 ? game.user2Id : game.user1Id) : (game.black === 1 ? game.user1Id : game.user2Id);
await this.endGame(game, winnerId, 'timeout');
}
}
@bindThis
public async cancelGame(gameId: MiReversiGame['id'], user: MiUser) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (game.isStarted) return;
if ((game.user1Id !== user.id) && (game.user2Id !== user.id)) return;
await this.reversiGamesRepository.delete(game.id);
this.deleteGameCache(game.id);
this.globalEventService.publishReversiGameStream(game.id, 'canceled', {
userId: user.id,
});
}
@bindThis
public async get(id: MiReversiGame['id']): Promise<MiReversiGame | null> {
const cached = await this.redisClient.get(`reversi:game:cache:${id}`);
if (cached != null) {
// TODO: この辺りのデシリアライズ処理をどこか別のサービスに切り出したい
const parsed = JSON.parse(cached) as Serialized<MiReversiGame>;
return {
...parsed,
startedAt: parsed.startedAt != null ? new Date(parsed.startedAt) : null,
endedAt: parsed.endedAt != null ? new Date(parsed.endedAt) : null,
user1: parsed.user1 != null ? {
...parsed.user1,
avatar: null,
banner: null,
background: null,
updatedAt: parsed.user1.updatedAt != null ? new Date(parsed.user1.updatedAt) : null,
lastActiveDate: parsed.user1.lastActiveDate != null ? new Date(parsed.user1.lastActiveDate) : null,
lastFetchedAt: parsed.user1.lastFetchedAt != null ? new Date(parsed.user1.lastFetchedAt) : null,
movedAt: parsed.user1.movedAt != null ? new Date(parsed.user1.movedAt) : null,
} : null,
user2: parsed.user2 != null ? {
...parsed.user2,
avatar: null,
banner: null,
background: null,
updatedAt: parsed.user2.updatedAt != null ? new Date(parsed.user2.updatedAt) : null,
lastActiveDate: parsed.user2.lastActiveDate != null ? new Date(parsed.user2.lastActiveDate) : null,
lastFetchedAt: parsed.user2.lastFetchedAt != null ? new Date(parsed.user2.lastFetchedAt) : null,
movedAt: parsed.user2.movedAt != null ? new Date(parsed.user2.movedAt) : null,
} : null,
};
} else {
const game = await this.reversiGamesRepository.findOne({
where: { id },
relations: ['user1', 'user2'],
});
if (game == null) return null;
this.cacheGame(game);
return game;
}
}
@bindThis
public async checkCrc(gameId: MiReversiGame['id'], crc32: string | number) {
const game = await this.get(gameId);
if (game == null) throw new Error('game not found');
if (crc32.toString() !== game.crc32) {
return game;
} else {
return null;
}
}
@bindThis
public dispose(): void {
}
@bindThis
public onApplicationShutdown(signal?: string | undefined): void {
this.dispose();
}
}

View file

@ -181,9 +181,11 @@ export class RoleService implements OnApplicationShutdown, OnModuleInit {
case 'userRoleAssigned': { case 'userRoleAssigned': {
const cached = this.roleAssignmentByUserIdCache.get(body.userId); const cached = this.roleAssignmentByUserIdCache.get(body.userId);
if (cached) { if (cached) {
cached.push({ cached.push({ // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body, ...body,
expiresAt: body.expiresAt ? new Date(body.expiresAt) : null, expiresAt: body.expiresAt ? new Date(body.expiresAt) : null,
user: null, // joinなカラムは通常取ってこないので
role: null, // joinなカラムは通常取ってこないので
}); });
} }
break; break;

View file

@ -49,9 +49,10 @@ export class WebhookService implements OnApplicationShutdown {
switch (type) { switch (type) {
case 'webhookCreated': case 'webhookCreated':
if (body.active) { if (body.active) {
this.webhooks.push({ this.webhooks.push({ // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body, ...body,
latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null, latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null,
user: null, // joinなカラムは通常取ってこないので
}); });
} }
break; break;
@ -59,14 +60,16 @@ export class WebhookService implements OnApplicationShutdown {
if (body.active) { if (body.active) {
const i = this.webhooks.findIndex(a => a.id === body.id); const i = this.webhooks.findIndex(a => a.id === body.id);
if (i > -1) { if (i > -1) {
this.webhooks[i] = { this.webhooks[i] = { // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body, ...body,
latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null, latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null,
user: null, // joinなカラムは通常取ってこないので
}; };
} else { } else {
this.webhooks.push({ this.webhooks.push({ // TODO: このあたりのデシリアライズ処理は各modelファイル内に関数としてexportしたい
...body, ...body,
latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null, latestSentAt: body.latestSentAt ? new Date(body.latestSentAt) : null,
user: null, // joinなカラムは通常取ってこないので
}); });
} }
} else { } else {

View file

@ -58,7 +58,7 @@ export class ApAudienceService {
}; };
} }
if (toGroups.followers.length > 0) { if (toGroups.followers.length > 0 || ccGroups.followers.length > 0) {
return { return {
visibility: 'followers', visibility: 'followers',
mentionedUsers, mentionedUsers,

View file

@ -144,7 +144,7 @@ class DeliverManager {
} }
// deliver // deliver
this.queueService.deliverMany(this.actor, this.activity, inboxes); await this.queueService.deliverMany(this.actor, this.activity, inboxes);
} }
} }

View file

@ -97,6 +97,8 @@ export class ApInboxService {
} catch (err) { } catch (err) {
if (err instanceof Error || typeof err === 'string') { if (err instanceof Error || typeof err === 'string') {
this.logger.error(err); this.logger.error(err);
} else {
throw err;
} }
} }
} }
@ -256,7 +258,7 @@ export class ApInboxService {
const targetUri = getApId(activity.object); const targetUri = getApId(activity.object);
this.announceNote(actor, activity, targetUri); await this.announceNote(actor, activity, targetUri);
} }
@bindThis @bindThis
@ -288,7 +290,7 @@ export class ApInboxService {
} catch (err) { } catch (err) {
// 対象が4xxならスキップ // 対象が4xxならスキップ
if (err instanceof StatusError) { if (err instanceof StatusError) {
if (err.isClientError) { if (!err.isRetryable) {
this.logger.warn(`Ignored announce target ${targetUri} - ${err.statusCode}`); this.logger.warn(`Ignored announce target ${targetUri} - ${err.statusCode}`);
return; return;
} }
@ -373,7 +375,7 @@ export class ApInboxService {
}); });
if (isPost(object)) { if (isPost(object)) {
this.createNote(resolver, actor, object, false, activity); await this.createNote(resolver, actor, object, false, activity);
} else { } else {
this.logger.warn(`Unknown type: ${getApType(object)}`); this.logger.warn(`Unknown type: ${getApType(object)}`);
} }
@ -404,7 +406,7 @@ export class ApInboxService {
await this.apNoteService.createNote(note, resolver, silent); await this.apNoteService.createNote(note, resolver, silent);
return 'ok'; return 'ok';
} catch (err) { } catch (err) {
if (err instanceof StatusError && err.isClientError) { if (err instanceof StatusError && !err.isRetryable) {
return `skip ${err.statusCode}`; return `skip ${err.statusCode}`;
} else { } else {
throw err; throw err;

View file

@ -34,9 +34,9 @@ type PrivateKey = {
}; };
export class ApRequestCreator { export class ApRequestCreator {
static createSignedPost(args: { key: PrivateKey, url: string, body: string, additionalHeaders: Record<string, string> }): Signed { static createSignedPost(args: { key: PrivateKey, url: string, body: string, digest?: string, additionalHeaders: Record<string, string> }): Signed {
const u = new URL(args.url); const u = new URL(args.url);
const digestHeader = `SHA-256=${crypto.createHash('sha256').update(args.body).digest('base64')}`; const digestHeader = args.digest ?? this.createDigest(args.body);
const request: Request = { const request: Request = {
url: u.href, url: u.href,
@ -59,6 +59,10 @@ export class ApRequestCreator {
}; };
} }
static createDigest(body: string) {
return `SHA-256=${crypto.createHash('sha256').update(body).digest('base64')}`;
}
static createSignedGet(args: { key: PrivateKey, url: string, additionalHeaders: Record<string, string> }): Signed { static createSignedGet(args: { key: PrivateKey, url: string, additionalHeaders: Record<string, string> }): Signed {
const u = new URL(args.url); const u = new URL(args.url);
@ -145,8 +149,8 @@ export class ApRequestService {
} }
@bindThis @bindThis
public async signedPost(user: { id: MiUser['id'] }, url: string, object: unknown): Promise<void> { public async signedPost(user: { id: MiUser['id'] }, url: string, object: unknown, digest?: string): Promise<void> {
const body = JSON.stringify(object); const body = typeof object === 'string' ? object : JSON.stringify(object);
const keypair = await this.userKeypairService.getUserKeypair(user.id); const keypair = await this.userKeypairService.getUserKeypair(user.id);
@ -157,6 +161,7 @@ export class ApRequestService {
}, },
url, url,
body, body,
digest,
additionalHeaders: { additionalHeaders: {
}, },
}); });

View file

@ -221,7 +221,7 @@ export class ApNoteService {
return { status: 'ok', res }; return { status: 'ok', res };
} catch (e) { } catch (e) {
return { return {
status: (e instanceof StatusError && e.isClientError) ? 'permerror' : 'temperror', status: (e instanceof StatusError && !e.isRetryable) ? 'permerror' : 'temperror',
}; };
} }
}; };

View file

@ -369,6 +369,7 @@ export class NoteEntityService implements OnModuleInit {
color: channel.color, color: channel.color,
isSensitive: channel.isSensitive, isSensitive: channel.isSensitive,
allowRenoteToExternal: channel.allowRenoteToExternal, allowRenoteToExternal: channel.allowRenoteToExternal,
userId: channel.userId,
} : undefined, } : undefined,
mentions: note.mentions && note.mentions.length > 0 ? note.mentions : undefined, mentions: note.mentions && note.mentions.length > 0 ? note.mentions : undefined,
uri: note.uri ?? undefined, uri: note.uri ?? undefined,

View file

@ -0,0 +1,120 @@
/*
* SPDX-FileCopyrightText: syuilo and other misskey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
import { Inject, Injectable } from '@nestjs/common';
import { DI } from '@/di-symbols.js';
import type { ReversiGamesRepository } from '@/models/_.js';
import { awaitAll } from '@/misc/prelude/await-all.js';
import type { Packed } from '@/misc/json-schema.js';
import type { } from '@/models/Blocking.js';
import type { MiReversiGame } from '@/models/ReversiGame.js';
import { bindThis } from '@/decorators.js';
import { IdService } from '@/core/IdService.js';
import { UserEntityService } from './UserEntityService.js';
@Injectable()
export class ReversiGameEntityService {
constructor(
@Inject(DI.reversiGamesRepository)
private reversiGamesRepository: ReversiGamesRepository,
private userEntityService: UserEntityService,
private idService: IdService,
) {
}
@bindThis
public async packDetail(
src: MiReversiGame['id'] | MiReversiGame,
): Promise<Packed<'ReversiGameDetailed'>> {
const game = typeof src === 'object' ? src : await this.reversiGamesRepository.findOneByOrFail({ id: src });
const users = await Promise.all([
this.userEntityService.pack(game.user1 ?? game.user1Id),
this.userEntityService.pack(game.user2 ?? game.user2Id),
]);
return await awaitAll({
id: game.id,
createdAt: this.idService.parse(game.id).date.toISOString(),
startedAt: game.startedAt && game.startedAt.toISOString(),
endedAt: game.endedAt && game.endedAt.toISOString(),
isStarted: game.isStarted,
isEnded: game.isEnded,
form1: game.form1,
form2: game.form2,
user1Ready: game.user1Ready,
user2Ready: game.user2Ready,
user1Id: game.user1Id,
user2Id: game.user2Id,
user1: users[0],
user2: users[1],
winnerId: game.winnerId,
winner: game.winnerId ? users.find(u => u.id === game.winnerId)! : null,
surrenderedUserId: game.surrenderedUserId,
timeoutUserId: game.timeoutUserId,
black: game.black,
bw: game.bw,
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
timeLimitForEachTurn: game.timeLimitForEachTurn,
noIrregularRules: game.noIrregularRules,
logs: game.logs,
map: game.map,
});
}
@bindThis
public packDetailMany(
xs: MiReversiGame[],
) {
return Promise.all(xs.map(x => this.packDetail(x)));
}
@bindThis
public async packLite(
src: MiReversiGame['id'] | MiReversiGame,
): Promise<Packed<'ReversiGameLite'>> {
const game = typeof src === 'object' ? src : await this.reversiGamesRepository.findOneByOrFail({ id: src });
const users = await Promise.all([
this.userEntityService.pack(game.user1 ?? game.user1Id),
this.userEntityService.pack(game.user2 ?? game.user2Id),
]);
return await awaitAll({
id: game.id,
createdAt: this.idService.parse(game.id).date.toISOString(),
startedAt: game.startedAt && game.startedAt.toISOString(),
endedAt: game.endedAt && game.endedAt.toISOString(),
isStarted: game.isStarted,
isEnded: game.isEnded,
user1Id: game.user1Id,
user2Id: game.user2Id,
user1: users[0],
user2: users[1],
winnerId: game.winnerId,
winner: game.winnerId ? users.find(u => u.id === game.winnerId)! : null,
surrenderedUserId: game.surrenderedUserId,
timeoutUserId: game.timeoutUserId,
black: game.black,
bw: game.bw,
isLlotheo: game.isLlotheo,
canPutEverywhere: game.canPutEverywhere,
loopedBoard: game.loopedBoard,
timeLimitForEachTurn: game.timeLimitForEachTurn,
noIrregularRules: game.noIrregularRules,
});
}
@bindThis
public packLiteMany(
xs: MiReversiGame[],
) {
return Promise.all(xs.map(x => this.packLite(x)));
}
}

View file

@ -37,7 +37,7 @@ export class ServerStatsService implements OnApplicationShutdown {
const log = [] as any[]; const log = [] as any[];
ev.on('requestServerStatsLog', x => { ev.on('requestServerStatsLog', x => {
ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length ?? 50)); ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length));
}); });
const tick = async () => { const tick = async () => {

Some files were not shown because too many files have changed in this diff Show more