Merge branch 'main' into mk.absturztau.be

This commit is contained in:
Puniko 2023-03-05 08:47:50 +01:00
commit 6a8128f255
370 changed files with 1965 additions and 1805 deletions

File diff suppressed because one or more lines are too long

873
.yarn/releases/yarn-3.4.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View file

@ -8,4 +8,4 @@ plugins:
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: "@yarnpkg/plugin-workspace-tools"
yarnPath: .yarn/releases/yarn-3.3.0.cjs
yarnPath: .yarn/releases/yarn-3.4.1.cjs

View file

@ -86,8 +86,6 @@ This release contains 6 breaking changes, including changes to the configuration
### Removed:
- **BREAKING** server: remove Twitter, Github and Discord integrations
ff31b8b06 server: remove bios and cli
a673647fb server: remove avatarColor and bannerColor properties
- **BREAKING** server: remove `api/admin/delete-account`,
You should use the API endpoint `admin/accounts/delete` instead.
It has the same parameter and the same behaviour.
@ -108,6 +106,8 @@ a673647fb server: remove avatarColor and bannerColor properties
- `/api/i/gallery/likes`
- `/api/i/gallery/posts`
- `/api/users/gallery/posts`
- server: remove bios and cli
- server: remove avatarColor and bannerColor properties
- server: remove application level websocket ping
This pinging mechanism was unused in `foundkey-js`, and we expect other usage to be low.
You can use the pinging mechanism built into the websocket protocol if you wish.

View file

@ -34,6 +34,7 @@ For a production environment you might not want to follow the `main` branch dire
This project follows [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html).
Significant changes should be listed in the changelog (i.e. the file called `CHANGELOG.md`, see also section "Changelog Trailer" below).
Although Semantic Versioning talks about "the API", changes to the user interface should also be tracked.
However, changes to translation files are not considered notable enough to be listed in the changelog.
Consider if any of the existing documentation has to be updated because of your contribution.

View file

@ -6,7 +6,9 @@ FoundKey is a free and open source microblogging server compatible with Activity
See the [changelog](./CHANGELOG.md) and [roadmap](./ROADMAP.md) for more on what's changed and future plans.
## Documentation
FoundKey's documentation is a work in progress. In the meantime, much of the documentation on the [Misskey Hub](https://misskey-hub.net/) will also apply to FoundKey.
FoundKey's documentation is a work in progress, which can be found in the `docs/` folder.
In the meantime, much of the documentation on the [Misskey Hub](https://misskey-hub.net/) will also apply to FoundKey.
## Contributing
If you're interested in helping out with the project, please read the [contributing guide](./CONTRIBUTING.md).

View file

@ -1,2 +0,0 @@
# Changing the default Reaction
You can change the default reaction that is used when an ActivityPub "Like" is received from '👍' to '⭐' by changing the boolean value `meta.useStarForReactionFallback` in the databse respectively.

View file

@ -64,6 +64,13 @@ adduser --disabled-password --disabled-login foundkey
- Make sure you set the PostgreSQL and Redis settings correctly.
- Use a strong password for the PostgreSQL user and take note of it since it'll be needed later.
### Reverse proxy
For production use and for HTTPS termination you will have to use a reverse proxy.
There are instructions for setting up [nginx](./nginx.md) for this purpose.
### Changing the default Reaction
You can change the default reaction that is used when an ActivityPub "Like" is received from '👍' to '⭐' by changing the boolean value `meta.useStarForReactionFallback` in the databse respectively.
## Build FoundKey
Build foundkey with the following:

View file

@ -10,7 +10,7 @@
4. Run `sudo nginx -t` to verify that the configuration file will be loaded successfully.
5. Run `sudo systemctl restart nginx` to restart nginx.
# Nginx cofig example
# Nginx config example
```nginx
# For WebSocket

View file

@ -11,9 +11,9 @@ username: "اسم المستخدم"
password: "الكلمة السرية"
forgotPassword: "نسيتَ كلمة السر"
fetchingAsApObject: "جارٍ جلبه مِن الفديفرس…"
ok: " حسناً"
ok: "حسناً"
gotIt: "فهِمت"
cancel: " إلغاء"
cancel: "إلغاء"
renotedBy: "أعاد نشرها {user}"
noNotes: "لم يُعثر على أية ملاحظات"
noNotifications: "ليس هناك أية اشعارات"
@ -144,7 +144,7 @@ youHaveNoLists: "لا تمتلك أية قائمة"
followConfirm: "أتريد متابعة {name}؟"
proxyAccount: "حساب وكيل البروكسي"
proxyAccountDescription: "يتصرف حساب الوكيل كمتابع بعيد لمستخدمين تحت ظروف معينة.\
\ على سبيل المثال ، عندما يضيف مستخدم مستخدمًا بعيدًا إلى قائمة فإن ملاحظاته لن\
\ على سبيل المثال ، عندما يضيف مستخدم مستخدمًا بعيدًا إلى قائمة فإن ملاحظاته لن\
\ تُرسل إلى المثيل ما لم يُتابعه مستخدم محلي. وبالتالي فإن حساب الوكيل سوف يتابع\
\ هذا المستخدم لكي تُرسل ملاحظاته."
host: "المضيف"
@ -222,7 +222,7 @@ fromUrl: "عبر رابط"
uploadFromUrl: "ارفع عبر رابط"
uploadFromUrlDescription: "رابط الملف المراد رفعه"
uploadFromUrlRequested: "الرفع مطلوب"
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع"
explore: "استكشاف"
messageRead: "مقروءة"
noMoreHistory: "لا يوجد المزيد من التاريخ"
@ -484,7 +484,7 @@ description: "الوصف"
describeFile: "أضف تعليقًا توضيحيًا"
author: "الكاتب"
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
manage: "إدارة "
manage: "إدارة"
plugins: "الإضافات"
width: "العرض"
height: "الإرتفاع"
@ -502,7 +502,7 @@ useStarForReactionFallback: "استخدم ★ كبديل إذا كان التف
emailServer: "خادم البريد الإلكتروني"
emailConfigInfo: "يستخدم لتأكيد عنوان بريدك الإلكتروني ولإعادة تعيين كلمة المرور إن\
\ نسيتها."
email: "البريد الإلكتروني "
email: "البريد الإلكتروني"
emailAddress: "عنوان البريد الالكتروني"
smtpConfig: "إعدادات خادم SMTP"
smtpHost: "المضيف"
@ -645,7 +645,7 @@ enabled: "مفعّل"
disabled: "معطّل"
quickAction: "الإجراءات السّريعة"
user: "المستخدمون"
administration: "إدارة "
administration: "إدارة"
accounts: "الحسابات"
switch: "بدّل"
noMaintainerInformationWarning: "لم تُضبط معلومات المدير"
@ -764,7 +764,7 @@ _nsfw:
force: "اخف كل الوسائط"
_mfm:
cheatSheet: "مرجع ملخص عن MFM"
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
\ كل تعابيرها مع كيفية استخدامها هنا."
mention: "أشر الى"
mentionDescription: "يمكنك الإشارة لمستخدم معيّن من خلال كتابة @ متبوعة باسم مستخدم."

View file

@ -3,7 +3,7 @@ headlineMisskey: "নোট ব্যাবহার করে সংযুক
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা।\
\ \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন \U0001F4E1\n\"রিঅ্যাকশন\"\
\ গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন \U0001F44D\n\
একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680\n"
একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680"
monthAndDay: "{day}/{month}"
search: "খুঁজুন"
notifications: "বিজ্ঞপ্তি"
@ -65,7 +65,7 @@ driveFileDeleteConfirm: "আপনি কি নিশ্চিত যে আপ
unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?"
exportRequested: "আপনার তথ্যসমূহ রপ্তানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।\
\ রপ্তানি সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।"
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। "
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।."
lists: "লিস্ট"
note: "নোট"
notes: "নোটগুলি"
@ -79,10 +79,10 @@ somethingHappened: "একটি ত্রুটি হয়েছে"
retry: "আবার চেষ্টা করুন"
pageLoadError: "পেজ লোড করা যায়নি"
pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে\
\ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন। "
\ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন।."
serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।"
youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট\
\ করুন। "
\ করুন।."
enterListName: "লিস্টের নাম লিখুন"
privacy: "গোপনীয়তা"
makeFollowManuallyApprove: "অনুসরণ করার অনুরোধগুলি গৃহীত হওয়ার জন্য আপনার অনুমতি লাগবে"
@ -93,7 +93,7 @@ followRequests: "অনুসরণ করার অনুরোধসমূহ"
unfollow: "অনুসরণ বাতিল"
followRequestPending: "অনুসরণ করার অনুরোধ বিচারাধীন"
renote: "রিনোট"
unrenote: "রিনোট সরান "
unrenote: "রিনোট সরান"
quote: "উদ্ধৃতি"
pinnedNote: "পিন করা নোট"
you: "আপনি"
@ -103,7 +103,7 @@ add: "যুক্ত করুন"
reaction: "প্রতিক্রিয়া"
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে\
\ + টিপুন।"
attachCancel: "অ্যাটাচমেন্ট সরান "
attachCancel: "অ্যাটাচমেন্ট সরান"
markAsSensitive: "সংবেদনশীল হিসাবে চিহ্নিত করুন"
unmarkAsSensitive: "সংবেদনশীল চিহ্ন সরান"
enterFileName: "ফাইলের নাম লিখুন"
@ -129,7 +129,7 @@ addEmoji: "ইমোজি যুক্ত করুন"
cacheRemoteFiles: "রিমোট ফাইলসমুহ ক্যাশ করুন"
cacheRemoteFilesDescription: "যখন এই অপশনটি বন্ধ থাকে তখন রিমোট ফাইল সমূহ সরাসরি রিমোট\
\ ইন্সট্যান্স থেকে লোড করা হয়। এই অপশনটি বন্ধ করলে স্টোরেজ এর ব্যাবহার কমবে তবে\
\ থাম্বনেইল তৈরি না করার কারণে নেটওয়ার্ক ব্যান্ডউইথ বেশী লাগবে। "
\ থাম্বনেইল তৈরি না করার কারণে নেটওয়ার্ক ব্যান্ডউইথ বেশী লাগবে।"
flagAsBot: "বট হিসাবে চিহ্নিত করুন"
flagAsBotDescription: "এই অ্যাকাউন্টটি যদি একটি প্রোগ্রাম দ্বারা পরিচালিত হয়, তাহলে\
\ এই অপশনটি চালু করুন। ইন্টারঅ্যাকশান চেইনিং রোধ করতে, মিস্কির সিস্টেম পরিচালনাকে\
@ -184,7 +184,7 @@ clearCachedFiles: "ক্যাশ পরিষ্কার করুন"
clearCachedFilesConfirm: "আপনি কি ক্যাশ পরিষ্কার করার ব্যাপারে নিশ্চিত?"
blockedInstances: "ব্লককৃত ইন্সট্যান্সসমুহ"
blockedInstancesDescription: "আপনি যে ইন্সট্যান্সগুলি ব্লক করতে চান তার হোস্টনেমগুলি\
\ প্রত্যেকটি আলাদা লাইনে লিখুন। ব্লককৃত ইন্সট্যান্সগুলি এই ইন্সট্যান্সের সাথে যোগাযোগ\
\ প্রত্যেকটি আলাদা লাইনে লিখুন। ব্লককৃত ইন্সট্যান্সগুলি এই ইন্সট্যান্সের সাথে যোগাযোগ\
\ করতে পারবেনা৷"
muteAndBlock: "মিউট এবং ব্লকগুলি"
mutedUsers: "নিঃশব্দকৃত ব্যবহারকারী"
@ -292,7 +292,7 @@ reload: "আবার লোড করুন"
doNothing: "কিছু করবেন না"
reloadConfirm: "আপনি কি রিলোড করতে চান?"
watch: "বিজ্ঞপ্তি পান"
unwatch: "বিজ্ঞপ্তি পাওয়া বন্ধ করুন "
unwatch: "বিজ্ঞপ্তি পাওয়া বন্ধ করুন"
accept: "অনুমোদন"
reject: "প্রত্যাখ্যান"
normal: "স্বাভাবিক"
@ -422,7 +422,7 @@ uiLanguage: "UI এর ভাষা"
groupInvited: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন"
useOsNativeEmojis: "অপারেটিং সিস্টেমের নেটিভ ইমোজি ব্যবহার করুন"
disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
youHaveNoGroups: "আপনার কোন গ্রুপ নেই "
youHaveNoGroups: "আপনার কোন গ্রুপ নেই"
joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷"
noHistory: "কোনো ইতিহাস নেই"
signinHistory: "প্রবেশ করার ইতিহাস"
@ -447,7 +447,7 @@ objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "রেফারেন্স হিসাবে ব্যবহৃত URL। আপনি একটি CDN বা প্রক্সি\
\ ব্যবহার করলে URL, S3: 'https://<bucket>.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/<bucket>'।"
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন। "
objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন।."
objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "ফাইলসমূহ এই prefix যুক্ত ফোল্ডারের অধীনে সংরক্ষণ করা হবে।"
objectStorageEndpoint: "এন্ডপয়েন্ট"
@ -495,7 +495,7 @@ deleteAllFilesConfirm: "সকল ফাইল ডিলিট করতে চ
removeAllFollowing: "সকল অনুসরণ বাতিল করুন"
removeAllFollowingDescription: "{host} এর সকল ব্যাবহারকারীকে আর ফলোও করবেন না । যদি\
\ ইন্সত্যান্সটির কোন সমস্যা (যেমনঃ ইন্সত্যান্সটি আর নেই) হয়ে থাকে তবে এটি ব্যাবহার\
\ করুন । "
\ করুন ।."
userSuspended: "এই ব্যাবহারকারির অ্যাকাউন্ট স্থগিত করা হয়েছে"
userSilenced: "এই ব্যাবহারকারিকে মিউট করা হয়েছে"
yourAccountSuspendedTitle: "এই অ্যাকাউন্টটি স্থগিত করা হয়েছে"
@ -625,7 +625,7 @@ driveFilesCount: "ড্রাইভে ফাইল এর সংখ্যা"
driveUsage: "ড্রাইভ এর ব্যাবহার"
noCrawle: "ক্রলার ইন্ডেক্সিং বন্ধ করুন"
noCrawleDescription: "সার্চ ইঞ্জিনগুলিকে আপনার প্রোফাইল, নোট, পেজ ইত্যাদি ইনডেক্স\
\ করতে নিষেধ করুন। "
\ করতে নিষেধ করুন।."
lockedAccountInfo: "এমনকি আপনি আপনার অনুসরণকারীদের বেছে বেছে অনুমোদন করলেও, যে কেউ\
\ আপনার নোটগুলি দেখতে পাবে, যতক্ষণ না আপনি আপনার নোটগুলিকে \"অনুসারীদের জন্য\" হিসাবে\
\ সেট না করেন৷"
@ -640,7 +640,7 @@ pageLikesCount: "পেজ লাইক করেছেন"
pageLikedCount: "পেজ লাইক পেয়েছেন"
contact: "পরিচিতি সমূহ"
useSystemFont: "সিস্টেম ফন্ট ব্যাবহার করুন"
clips: "ক্লিপগুলি "
clips: "ক্লিপগুলি"
makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান"
makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায়\
\ প্রদর্শিত হবে না।"
@ -717,7 +717,7 @@ previewNoteText: "প্রিভিউ দেখান"
customCss: "কাস্টম CSS"
customCssWarn: "এই ব্যাপারে অভিজ্ঞতা না থাকলে এই সেটিংটি ব্যাবহার করবেন না। অনুপযুক্ত\
\ সেটিংস ক্লায়েন্টকে স্বাভাবিকভাবে ব্যবহার করতে বাধা দিতে পারে।"
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান "
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান"
searchResult: "অনুসন্ধানের ফলাফল"
hashtags: "হ্যাশট্যাগ"
troubleshooting: "ট্রাবলশুটিং"
@ -761,7 +761,7 @@ hide: "লুকান"
leaveGroup: "গ্রুপ ছেড়ে চলে যান"
leaveGroupConfirm: "\"{name}\" গ্রুপ ছেড়ে চলে যেতে চান?"
useDrawerReactionPickerForMobile: "মোবাইলে রিঅ্যাকশন পিকারকে ড্রয়ারে প্রদর্শন করুন"
clickToFinishEmailVerification: " [{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
clickToFinishEmailVerification: "[{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
\ করুন।"
overridedDeviceKind: "ডিভাইসের ধরন"
smartphone: "স্মার্টফোন"
@ -781,12 +781,12 @@ oneDay: "একদিন"
oneWeek: "এক সপ্তাহ"
reflectMayTakeTime: "এটির কাজ দেখা যেতে কিছুটা সময় লাগতে পারে।"
failedToFetchAccountInformation: "অ্যাকাউন্টের তথ্য উদ্ধার করা যায়নি"
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে "
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে"
_emailUnavailable:
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
disposable: "অস্থায়ী ইমেইল ঠিকানা ব্যাবহার করা যাবে না"
mx: "ইমেইল সার্ভারটি ঠিক না"
mx: "ইমেইল সার্ভারটি ঠিক না"
smtp: "ইমেইল সার্ভারটি সাড়া দিচ্ছে না"
_ffVisibility:
public: "প্রকাশ"
@ -858,8 +858,7 @@ _mfm:
center: "সেন্টার"
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
inlineCode: "কোড (ইনলাইন)"
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা\
\ হবে"
inlineCodeDescription: "প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে."
blockCode: "কোড (ব্লক)"
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
inlineMath: "গাণিতিক সূত্র (ইনলাইন)"
@ -1006,7 +1005,7 @@ _tutorial:
\ পছন্দ করেন তাকে বেছে নিতে এবং অনুসরণ করতে পারেন, অথবা {explore}-এ জনপ্রিয় ব্যবহারকারীদের\
\ দেখতে পারেন৷"
step5_3: "একজন ব্যবহারকারীকে অনুসরণ করতে, ব্যবহারকারীর আইকনে ক্লিক করুন এবং ব্যবহারকারীর\
\ পৃষ্ঠাতে \"অনুসরণ করুন\" বাটনে ক্লিক করুন।"
\ পৃষ্ঠাতে \"অনুসরণ করুন\" বাটনে ক্লিক করুন।"
step5_4: "যদি ব্যবহারকারীর নামের পাশে একটি লক আইকন থাকে তাহলে আপনার অনুসরণের অনুরোধ\
\ গ্রহণ করার জন্য তারা কিছু সময় নিতে পারে।"
step6_1: "সবকিছু ঠিক থাকলে আপনি টাইমলাইনে অন্য ব্যবহারকারীদের নোট দেখতে পাবেন।"

View file

@ -14,7 +14,7 @@ fetchingAsApObject: "Cercant en el Fediverse..."
ok: "OK"
gotIt: "Ho he entès!"
cancel: "Cancel·lar"
renotedBy: "Resignat per {usuari}"
renotedBy: "Resignat per {user}"
noNotes: "Cap nota"
noNotifications: "Cap notificació"
instance: "Instàncies"

View file

@ -337,9 +337,9 @@ pinnedUsers: "Angeheftete Benutzer"
pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die \"\
Erkunden\"-Seite angeheftet werden sollen."
hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key"
recaptchaSiteKey: "Site key"
recaptchaSecretKey: "Secret key"
hcaptchaSecretKey: "Geheimer Schlüssel"
recaptchaSiteKey: "Site-Schlüssel"
recaptchaSecretKey: "Geheimer Schlüssel"
antennas: "Antennen"
manageAntennas: "Antennen verwalten"
name: "Name"
@ -969,9 +969,9 @@ _wordMute:
\ trennen."
muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke\
\ zu verwenden."
softDescription: "Notizen, die die angegebenen Konditionen erfüllen, in der Chronik\
softDescription: "Notizen, welche die angegebenen Konditionen erfüllen, in der Chronik\
\ ausblenden."
hardDescription: "Verhindern, dass Notizen, die die angegebenen Konditionen erfüllen,\
hardDescription: "Verhindern, dass Notizen, welche die angegebenen Konditionen erfüllen,\
\ der Chronik hinzugefügt werden. Zudem werden diese Notizen auch nicht der Chronik\
\ hinzugefügt, falls die Konditionen geändert werden."
soft: "Leicht"
@ -1278,7 +1278,7 @@ _pages:
hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden"
font: "Schriftart"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
fontSansSerif: "serifenlos"
eyeCatchingImageSet: "Vorschaubild festlegen"
eyeCatchingImageRemove: "Vorschaubild entfernen"
_relayStatus:
@ -1355,7 +1355,7 @@ confirmToUnclipAlreadyClippedNote: "Diese Notiz ist bereits im \"{name}\" Clip e
noEmailServerWarning: "Es ist kein Email-Server konfiguriert."
thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor."
recommended: "Empfehlung"
check: "Check"
check: "Überprüfen"
maxCustomEmojiPicker: Maximale Anzahl vorgeschlagener benutzerdefinierter Emoji
maxUnicodeEmojiPicker: Maximale Anzahl vorgeschlagener Unicode-Emoji
documentation: Dokumentation

View file

@ -471,7 +471,7 @@ objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión
objectStorageUseProxy: "Conectarse a través de Proxy"
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\
\ de Almacenamiento de objetos"
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir"
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
newNoteRecived: "Tienes una nota nuevo"
sounds: "Sonidos"
@ -785,7 +785,7 @@ _aboutMisskey:
source: "Código fuente"
_nsfw:
respect: "Ocultar medios NSFW"
ignore: "No esconder medios NSFW "
ignore: "No esconder medios NSFW"
force: "Ocultar todos los medios"
_mfm:
cheatSheet: "Hoja de referencia de MFM"

View file

@ -71,8 +71,8 @@ importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de t
lists: "Listes"
note: "Notes"
notes: "Notes"
following: "Abonnements"
followers: "Abonné·e·s"
following: "Suivis"
followers: "Vous suivent"
followsYou: "Vous suit"
createList: "Créer une liste"
manageLists: "Gérer les listes"
@ -88,15 +88,15 @@ youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la
\ mettre votre client à jour."
enterListName: "Nom de la liste"
privacy: "Confidentialité"
makeFollowManuallyApprove: "Accepter manuellement les demandes dabonnement"
makeFollowManuallyApprove: "Accepter manuellement les demandes de suivi"
defaultNoteVisibility: "Visibilité des notes par défaut"
follow: "Sabonner"
followRequest: "Demande dabonnement"
followRequests: "Demandes dabonnement"
unfollow: "Se désabonner"
followRequestPending: "Demande d'abonnement en attente de confirmation"
follow: "Suivre"
followRequest: "Demande de suivi"
followRequests: "Demandes de suivi"
unfollow: "Ne plus suivre"
followRequestPending: "Demande de suivi en attente de confirmation"
renote: "Renoter"
unrenote: "Annuler la Renote"
unrenote: "Retirer la renote"
quote: "Citer"
pinnedNote: "Note épinglée"
you: "Vous"
@ -1056,33 +1056,34 @@ _2fa:
step2Url: 'Vous pouvez aussi entrer cette URL si vous utilisez un client lourd sur
ordinateur :'
_permissions:
"read:account": "Afficher les informations du compte"
"read:account": "Lire les informations du compte"
"write:account": "Mettre à jour les informations du compte"
"read:blocks": "Voir les comptes bloqués"
"read:blocks": "Lire les utilisateurs bloqués"
"write:blocks": "Bloquer et Débloquer des comptes"
"read:drive": "Parcourir le Drive"
"write:drive": "Écrire sur le Drive"
"read:favorites": "Afficher les favoris"
"write:favorites": "Gérer les favoris"
"read:following": "Voir les informations de vos abonnements"
"read:drive": "Lister les fichiers et dossiers du drive"
"write:drive": "Créer, changer et supprimer des fichiers du drive"
"read:favorites": "Lister les notes favorites"
"write:favorites": "Gérer les notes favorites"
"read:following": "Lister les comptes suivis et les comptes qui vous suivent"
"write:following": "Abonner et désabonner autres comptes"
"read:messaging": "Voir vos discussions"
"write:messaging": "Gérer les discussions"
"read:mutes": "Voir les comptes masqués"
"write:mutes": "Gérer les comptes masqués"
"write:notes": "Créer / supprimer des notes"
"read:notifications": "Afficher les notifications"
"write:notifications": "Gérer vos notifications"
"write:reactions": "Gérer vos réactions"
"write:votes": "Voter"
"read:pages": "Voir vos pages"
"read:messaging": "Voir vos discussions et leur historique"
"write:messaging": "Créer et supprimer les messages des discussions"
"read:mutes": "Lister les comptes desquels vous masquez les notes ou les renotes"
"write:mutes": "Masquer et démasquer les notes ou les renotes des comptes"
"write:notes": "Gérer les notes"
"read:notifications": "Lire vos notifications"
"write:notifications": "Gérer vos notifications et en créer"
"write:reactions": "Gérer les réactions"
"write:votes": "Voter dans les sondages"
"read:pages": "Lister et lire les pages"
"write:pages": "Gérer les pages"
"read:page-likes": "Voir les mentions « J'aime » des pages"
"write:page-likes": "Gérer les mentions « J'aime » sur les pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
"read:channels": "Lire les canaux"
"read:channels": "Lister et lire les canaux suivis et rejoints"
"write:channels": "Gérer les canaux"
"read:reactions": Lister les réactions
_auth:
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\
@ -1385,3 +1386,15 @@ useDrawerReactionPickerForMobile: Sur mobile afficher un tiroir pour le panneau
réaction
appAuthorization: Authorisation de l'application
noPermissionsRequested: (Aucune permission demandée.)
oauthErrorGoBack: Une erreur est survenue pendant l'authentification d'une application
tierce. Veuillez réessayer.
botFollowRequiresApproval: Accepter manuellement les demandes de suivi des comptes
marqués « robots »
unrenoteAllConfirm: Étes-vous certain·e de vouloir retirer toutes les renotes de cette
note ?
unrenoteAll: Retirer toutes les renotes
deleteAllFiles: Supprimer tous les fichiers
cannotAttachFileWhenAccountSwitched: Vous ne pouvez pas joindre un fichier à partir
d'un autre compte.
cannotSwitchAccountWhenFileAttached: Vous ne pouvez pas changer de compte tant qu'il
y a des pièces jointes.

View file

@ -495,7 +495,7 @@ ascendingOrder: "Urutkan naik"
descendingOrder: "Urutkan menurun"
scratchpad: "Scratchpad"
scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript.\
\ Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan\
\ Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan\
\ FoundKey."
output: "Keluaran"
updateRemoteUser: "Perbaharui informasi pengguna luar"
@ -1225,7 +1225,7 @@ _pages:
editPage: "Sunting halaman"
readPage: "Lihat sumber kode aktif"
created: "Halaman berhasil dibuat"
updated: "Halaman berhasil diperbaharui!"
updated: "Halaman berhasil diperbaharui"
deleted: "Halaman telah dihapus"
pageSetting: "Pengaturan Halaman"
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"

View file

@ -66,7 +66,7 @@ driveFileDeleteConfirm: "Vuoi davvero eliminare il file「{name}? Anche gli alle
unfollowConfirm: "Vuoi davvero smettere di seguire {name}?"
exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando\
\ sarà compiuta, il file verrà aggiunto direttamente al Drive."
importRequested: "Hai richiesto un'importazione. Può volerci tempo. "
importRequested: "Hai richiesto un'importazione. Può volerci tempo."
lists: "Liste"
note: "Nota"
notes: "Note"
@ -78,7 +78,7 @@ manageLists: "Gestisci liste"
error: "Errore"
somethingHappened: "Si è verificato un problema"
retry: "Riprova"
pageLoadError: "Caricamento pagina non riuscito. "
pageLoadError: "Caricamento pagina non riuscito."
pageLoadErrorDescription: "Questo viene normalmente causato dalla rete o dalla cache\
\ del browser. Si prega di pulire la cache, o di attendere e riprovare più tardi."
serverIsDead: "Il server non risponde. Si prega di attendere e riprovare più tardi."
@ -190,7 +190,7 @@ blockedUsers: "Account bloccati"
noUsers: "Nessun utente trovato"
editProfile: "Modifica profilo"
noteDeleteConfirm: "Eliminare questo Nota?"
pinLimitExceeded: "Non puoi fissare altre note "
pinLimitExceeded: "Non puoi fissare altre note."
intro: "L'installazione di FoundKey è finita! Si prega di creare un account amministratore."
done: "Fine"
processing: "In elaborazione"
@ -442,7 +442,7 @@ useObjectStorage: "Utilizza stoccaggio oggetti"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "URL di riferimento. In caso di utilizzo di proxy o CDN\
\ l'URL è 'https://<bucket>.s3.amazonaws.com' per S3, 'https://storage.googleapis.com/<bucket>'\
\ per GCS eccetera. "
\ per GCS eccetera."
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Specificare il nome del bucket utilizzato dal provider."
objectStoragePrefix: "Prefix"
@ -527,7 +527,7 @@ large: "Grande"
medium: "Predefinito"
small: "Piccolo"
generateAccessToken: "Genera token di accesso"
permission: "Autorizzazioni "
permission: "Autorizzazioni"
enableAll: "Abilita tutto"
disableAll: "Disabilita tutto"
tokenRequested: "Autorizza accesso all'account"
@ -664,7 +664,7 @@ emailNotification: "Eventi per notifiche via mail"
useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello\
\ di reazioni"
typingUsers: "{users} sta(nno) scrivendo"
jumpToSpecifiedDate: "Vai alla data "
jumpToSpecifiedDate: "Vai alla data"
clear: "Cancella"
markAllAsRead: "Segna tutti come già letti"
goBack: "Indietro"
@ -898,7 +898,7 @@ _ago:
secondsAgo: "{n}s fa"
minutesAgo: "{n}min fa"
hoursAgo: "{n}h fa"
daysAgo: "{1} giorni fa"
daysAgo: "{n} giorni fa"
weeksAgo: "{n} settimane fa"
monthsAgo: "{n} mesi fa"
yearsAgo: "{n} anni fa"
@ -916,22 +916,22 @@ _tutorial:
\ hai pubblicato alcuna nota ancora."
step2_1: "Prima di scrivere una nota o di seguire un account, imposta il tuo profilo!"
step2_2: "Aggiungere qualche informazione su di te aumenterà le tue possibilità\
\ di essere seguit@ da altre persone. "
\ di essere seguit@ da altre persone."
step3_1: "Hai finito di impostare il tuo profilo?"
step3_2: "Ora, puoi pubblicare una nota. Facciamo una prova! Premi il pulsante a\
\ forma di penna in cima allo schermo per aprire una finestra di dialogo. "
\ forma di penna in cima allo schermo per aprire una finestra di dialogo."
step3_3: "Scritto il testo della nota, puoi pubblicarla premendo il pulsante nella\
\ parte superiore destra della finestra di dialogo."
step3_4: "Non ti viene niente in mente? Perché non scrivi semplicemente \"Ho appena\
\ cominciato a usare FoundKey\"?"
step4_1: "Hai pubblicato qualcosa?"
step4_2: "Se puoi visualizzare la tua nota sulla timeline, ce l'hai fatta!"
step5_1: "Adesso, cerca di seguire altre persone per vivacizzare la tua timeline. "
step5_1: "Adesso, cerca di seguire altre persone per vivacizzare la tua timeline."
step5_2: "La pagina {featured} mostra le note di tendenza su questa istanza, e magari\
\ ti aiuterà a trovare account che ti piacciono e che vorrai seguire. Oppure,\
\ potrai trovare utenti popolari usando {explore}."
step5_3: "Per seguire altrə utenti, clicca sul loro avatar per aprire la pagina\
\ di profilo dove puoi premere il pulsante \"Seguire\". "
\ di profilo dove puoi premere il pulsante \"Seguire\"."
step5_4: "Alcunə utenti scelgono di confermare manualmente le richieste di follow\
\ che ricevono, quindi a seconda delle persone potrebbe volerci un pò prima che\
\ la tua richiesta sia accolta."
@ -942,7 +942,7 @@ _tutorial:
step6_3: "Per inviare una reazione, premi l'icona + della nota e scegli l'emoji\
\ che vuoi mandare."
step7_1: "Complimenti! Sei arrivat@ alla fine dell'esercitazione di base su come\
\ usare FoundKey. "
\ usare FoundKey."
step7_2: "Se vuoi saperne di più su FoundKey, puoi dare un'occhiata alla sezione\
\ {help}."
step7_3: "Da ultimo, buon divertimento su FoundKey! \U0001F680"
@ -1118,9 +1118,9 @@ _timelines:
_pages:
newPage: "Crea pagina"
editPage: "Modifica pagina"
readPage: "Visualizzando fonte "
created: "Pagina creata!"
updated: "Pagina aggiornata con successo!"
readPage: "Visualizzando fonte"
created: "Pagina creata"
updated: "Pagina aggiornata con successo"
deleted: "Pagina eliminata"
pageSetting: "Impostazioni pagina"
nameAlreadyExists: "Esiste già una pagina con lo stesso URL."

View file

@ -74,10 +74,6 @@ somethingHappened: "なんかアカンことが起こったで"
retry: "もっぺんやる?"
pageLoadError: "ページの読み込みに失敗してしもうたで…"
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
serverIsDead: "The server is not responding. Please wait for a while before trying\
\ again."
youShouldUpgradeClient: "To display this page, please reload and use a new version\
\ client. "
enterListName: "リスト名を入れてや"
privacy: "プライバシー"
makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする"
@ -126,9 +122,6 @@ flagAsBot: "Botやで"
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったもんになるんやで。"
flagAsCat: "Catやで"
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
flagShowTimelineReplies: "It will display the reply to the note in the timeline. "
flagShowTimelineRepliesDescription: "It will display the reply to notes other than\
\ the user notes in the timeline when you turn it on. "
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
addAccount: "アカウントを追加"
loginFailed: "ログインに失敗してしもうた…"
@ -209,9 +202,6 @@ resetAreYouSure: "リセットしてええん?"
saved: "保存したで!"
messaging: "チャット"
upload: "アップロード"
keepOriginalUploading: "Retain the original image. "
keepOriginalUploadingDescription: "When uploading the clip, the original version will\
\ be retained. Turning it of then uploading will produce images for public use. "
fromDrive: "ドライブから"
fromUrl: "URLから"
uploadFromUrl: "URLアップロード"
@ -380,7 +370,7 @@ onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファ
signinRequired: "ログインしてくれへん?"
invitationCode: "招待コード"
checking: "確認しとるで"
available: "利用できる\n"
available: "利用できる"
unavailable: "利用できん"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
tooShort: "短すぎやろ!"
@ -694,7 +684,7 @@ _widgets:
aiscript: "AiScriptコンソール"
_cw:
hide: "隠す"
show: "続き見して"
show: "続き見して"
chars: "{count}文字"
files: "{count}ファイル"
_poll:

View file

@ -10,7 +10,7 @@ notifications: "Meldingen"
username: "Gebruikersnaam"
password: "Wachtwoord"
forgotPassword: "Wachtwoord vergeten"
fetchingAsApObject: "Ophalen vanuit de Fediverse"
fetchingAsApObject: "Ophalen vanuit de Fediverse..."
ok: "Ok"
gotIt: "Begrepen"
cancel: "Annuleren"
@ -45,7 +45,7 @@ deleteAndEditConfirm: "Weet je zeker dat je deze notitie wilt verwijderen en dan
\ Je verliest alle reacties, herdelingen en antwoorden erop."
addToList: "Aan lijst toevoegen"
sendMessage: "Verstuur bericht"
copyUsername: "Kopiëren gebruikersnaam "
copyUsername: "Kopiëren gebruikersnaam"
reply: "Antwoord"
loadMore: "Laad meer"
showMore: "Toon meer"
@ -222,7 +222,7 @@ keepOriginalUploadingDescription: "Bewaar de originele versie bij het uploaden v
\ afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie\
\ voor webpublicatie genereert."
fromDrive: "Van schijf"
fromUrl: "Van URL"
fromUrl: "Van URL"
uploadFromUrl: "Uploaden vanaf een URL"
uploadFromUrlDescription: "URL van het bestand dat je wil uploaden"
uploadFromUrlRequested: "Uploadverzoek"
@ -294,7 +294,7 @@ smtpUser: "Gebruikersnaam"
smtpPass: "Wachtwoord"
clearCache: "Cache opschonen"
user: "Gebruikers"
muteThread: "Discussies dempen "
muteThread: "Discussies dempen"
unmuteThread: "Dempen van discussie ongedaan maken"
hide: "Verbergen"
cropImage: "Afbeelding bijsnijden"

View file

@ -1,10 +1,9 @@
_lang_: "język polski"
_lang_: "Polski"
headlineMisskey: "Sieć połączona wpisami"
introMisskey: "FoundKey jest serwisem mikroblogowym typu open source.\nFoundKey to\
\ opensource'owy serwis mikroblogowy, w którym możesz tworzyć \"notatki\", aby dzielić\
\ się tym, co się dzieje i opowiadać wszystkim o sobie.\nMożesz również użyć funkcji\
\ \"Reakcje\", aby szybko dodać własne reakcje do notatek innych użytkowników\U0001F44D\
.\nOdkrywaj nowy świat\U0001F680!"
introMisskey: "Witaj! FoundKey jest otwartoźródłowym serwisem mikroblogowym.\nTwórz\
\ \"wpisy\", aby dzielić się tym, co się dzieje i opowiadać wszystkim o sobie. \U0001F4E1\
\nMożesz również użyć \"reakcji\", aby szybko wyrazić swoje uczucia dotyczące wpisów\
\ innych użytkowników. \U0001F44D\nOdkrywaj nowy świat! \U0001F680"
monthAndDay: "{month}-{day}"
search: "Szukaj"
notifications: "Powiadomienia"
@ -15,7 +14,7 @@ fetchingAsApObject: "Pobieranie z Fediwersum…"
ok: "OK"
gotIt: "Rozumiem!"
cancel: "Anuluj"
renotedBy: "Udostępniono przez {user}"
renotedBy: "Podbito przez {user}"
noNotes: "Brak wpisów"
noNotifications: "Brak powiadomień"
instance: "Instancja"
@ -43,7 +42,7 @@ copyLink: "Skopiuj odnośnik"
delete: "Usuń"
deleteAndEdit: "Usuń i edytuj"
deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz\
\ wszystkie reakcje, udostępnienia i odpowiedzi do tego wpisu."
\ wszystkie reakcje, podbicia i odpowiedzi do tego wpisu."
addToList: "Dodaj do listy"
sendMessage: "Wyślij wiadomość"
copyUsername: "Kopiuj nazwę użytkownika"
@ -92,8 +91,8 @@ followRequest: "Poproś o możliwość obserwacji"
followRequests: "Prośby o możliwość obserwacji"
unfollow: "Przestań obserwować"
followRequestPending: "Oczekująca prośba o możliwość obserwacji"
renote: "Udostępnij"
unrenote: "Cofnij udostępnienie"
renote: "Podbij"
unrenote: "Cofnij podbicie"
quote: "Cytuj"
pinnedNote: "Przypięty wpis"
you: "Ty"
@ -128,7 +127,7 @@ emojis: "Emoji"
addEmoji: "Dodaj emoji"
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane\
\ bezpośrednio ze zdalnych instancji. Wyłączenie the opcji zmniejszy użycie powierzchni\
\ bezpośrednio ze zdalnych instancji. Wyłączenie tej opcji zmniejszy użycie powierzchni\
\ dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
flagAsBot: "To konto jest botem"
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw\
@ -579,9 +578,9 @@ manageAccessTokens: "Zarządzaj tokenami dostępu"
accountInfo: "Informacje o koncie"
notesCount: "Liczba wpisów"
repliesCount: "Liczba wysłanych odpowiedzi"
renotesCount: "Liczba wysłanych udostępnień"
renotesCount: "Liczba wysłanych podbić"
repliedCount: "Liczba otrzymanych odpowiedzi"
renotedCount: "Liczba otrzymanych udostępnień"
renotedCount: "Liczba otrzymanych podbić"
followingCount: "Liczba obserwowanych kont"
followersCount: "Liczba obserwujących"
sentReactionsCount: "Liczba wysłanych reakcji"
@ -966,8 +965,8 @@ _pages:
newPage: "Utwórz stronę"
editPage: "Edytuj tę stronę"
readPage: "Aktywowano widok źródła"
created: "Pomyślnie utworzono stronę!"
updated: "Pomyślnie zaktualizowano stronę!"
created: "Pomyślnie utworzono stronę"
updated: "Pomyślnie zaktualizowano stronę"
deleted: "Strona została usunięta"
pageSetting: "Ustawienia strony"
nameAlreadyExists: "Określony adres URL strony już istnieje"
@ -1046,3 +1045,12 @@ _deck:
mentions: "Wspomnienia"
direct: "Bezpośredni"
_services: {}
exportAll: Eksportuj wszystko
exportSelected: Eksportuj wybrane
showLess: Pokaż mniej
botFollowRequiresApproval: Prośby o możliwość obserwacji z kont oznaczonych jako boty
wymagają zatwierdzenia
unrenoteAllConfirm: Czy na pewno chcesz cofnąć wszystkie podbicia tego wpisu?
renoteMute: Ukryj podbicia
renoteUnmute: Pokaż podbicia
unrenoteAll: Cofnij wszystkie podbicia

View file

@ -341,7 +341,7 @@ connectedTo: "Вы подключены к следующим аккаунтам
notesAndReplies: "Заметки и ответы"
withFiles: "Заметки с файлами"
silence: "Заглушить"
silenceConfirm: " Заглушить этого пользователя? Уверены?"
silenceConfirm: "Заглушить этого пользователя? Уверены?"
unsilence: "Снять глушение"
unsilenceConfirm: "Снять глушение с этого пользователя? Уверены?"
popularUsers: "Популярные пользователи"
@ -995,7 +995,7 @@ _tutorial:
step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\
\ профиле нажмите кнопку «Подписаться»."
step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\
\ чужие подписки. Так что иногда подписка начинает работать не сразу.\n"
\ чужие подписки. Так что иногда подписка начинает работать не сразу."
step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось."
step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\
\ «реакцию» под ней."
@ -1148,7 +1148,7 @@ _profile:
changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке"
_exportOrImport:
allNotes: "Все записи\n"
allNotes: "Все записи"
followingList: "Подписки"
muteList: "Скрытые"
blockingList: "Заблокированные"

View file

@ -1243,7 +1243,7 @@ _notification:
groupInvited: "Pozvánky do skupín"
app: "Oznámenia z prepojených aplikácií"
_actions:
followBack: "Sledovať späť\n"
followBack: "Sledovať späť"
reply: "Odpovedať"
renote: "Preposlať"
_deck:

View file

@ -23,7 +23,7 @@ openInWindow: "Bir pencere ile aç"
profile: "Profil"
timeline: "Zaman çizelgesi"
noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı"
login: "Giriş Yap "
login: "Giriş Yap"
logout: ıkış Yap"
signup: "Kayıt Ol"
users: "Kullanıcı"

View file

@ -582,7 +582,7 @@ abuseReports: "Скарги"
reportAbuse: "Поскаржитись"
reportAbuseOf: "Поскаржитись на {name}"
fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги."
abuseReported: "Дякуємо, вашу скаргу було відправлено. "
abuseReported: "Дякуємо, вашу скаргу було відправлено."
reporter: "Репортер"
reporteeOrigin: "Про кого повідомлено"
reporterOrigin: "Хто повідомив"
@ -697,7 +697,7 @@ _nsfw:
ignore: "Не приховувати NSFW медіа"
force: "Приховувати всі медіа файли"
_mfm:
cheatSheet: " Довідка MFM"
cheatSheet: "Довідка MFM"
intro: "MFM це ексклюзивна мова розмітки тексту в FoundKey, яку можна використовувати\
\ в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "FoundKey розширює світ Федіверсу"
@ -848,7 +848,7 @@ _tutorial:
step5_4: "Якщо користувач має замок при імені, то йому потрібно буде вручну підтвердити\
\ вашу заявку на підписку."
step6_1: "Тепер ви повинні бачити записи інших користувачів на вашій стрічці подій."
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
\ користувачів."
step6_3: "Щоб \"відреагувати\", нажміть на знак плюс \"+\" на записі і виберіть\
\ емоджі яким ви хочете \"відреагувати\"."
@ -916,7 +916,7 @@ _widgets:
button: "Кнопка"
onlineUsers: "Користувачі онлайн"
jobQueue: "Черга завдань"
serverMetric: "Показники сервера "
serverMetric: "Показники сервера"
aiscript: "Консоль AiScript"
_cw:
hide: "Сховати"

View file

@ -528,7 +528,7 @@ large: "Lớn"
medium: "Vừa"
small: "Nhỏ"
generateAccessToken: "Tạo mã truy cập"
permission: "Cho phép "
permission: "Cho phép"
enableAll: "Bật toàn bộ"
disableAll: "Tắt toàn bộ"
tokenRequested: "Cấp quyền truy cập vào tài khoản"
@ -933,7 +933,7 @@ _wordMute:
mutedNotes: "Những tút đã ẩn"
_instanceMute:
instanceMuteDescription: "Thao tác này sẽ ẩn mọi tút/lượt đăng lại từ các máy chủ\
\ được liệt kê, bao gồm cả những tút dạng trả lời từ máy chủ bị ẩn."
\ được liệt kê, bao gồm cả những tút dạng trả lời từ máy chủ bị ẩn."
instanceMuteDescription2: "Tách bằng cách xuống dòng"
title: "Ẩn tút từ những máy chủ đã liệt kê."
heading: "Danh sách những máy chủ bị ẩn"

View file

@ -645,7 +645,7 @@ instanceBlocking: "被阻拦的实例"
selectAccount: "选择账户"
switchAccount: "切换账户"
enabled: "已启用"
disabled: "已禁用 "
disabled: "已禁用"
quickAction: "快捷操作"
user: "用户"
administration: "管理"

View file

@ -57,7 +57,7 @@ import: "匯入"
export: "匯出"
files: "檔案"
download: "下載"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。\n"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。"
unfollowConfirm: "確定要取消追隨{name}嗎?"
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
importRequested: "已請求匯入。這可能會花一點時間"
@ -253,7 +253,7 @@ emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空"
unableToDelete: "無法刪除"
inputNewFileName: "輸入檔案名稱"
inputNewDescription: "請輸入新標題 "
inputNewDescription: "請輸入新標題"
inputNewFolderName: "輸入新資料夾的名稱"
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
@ -294,7 +294,7 @@ driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
inMb: "以Mbps為單位"
iconUrl: "圖像URL"
bannerUrl: "橫幅圖像URL"
backgroundImageUrl: "背景圖片的來源網址 "
backgroundImageUrl: "背景圖片的來源網址"
pinnedUsers: "置頂用戶"
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
hcaptchaSiteKey: "網站金鑰"
@ -419,7 +419,7 @@ useObjectStorage: "使用Object Storage"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "引用時的URL。如果您使用的是CDN或反向代理请指定其URL例如S3“https://<bucket>.s3.amazonaws.com”GCS“https://storage.googleapis.com/<bucket>”"
objectStorageBucket: "儲存空間Bucket"
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。 "
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。"
objectStoragePrefix: "前綴"
objectStoragePrefixDesc: "它存儲在此前綴目錄下。"
objectStorageEndpoint: "端點Endpoint"
@ -479,7 +479,7 @@ enablePlayer: "打開播放器"
disablePlayer: "關閉播放器"
themeEditor: "主題編輯器"
description: "描述"
describeFile: "添加標題 "
describeFile: "添加標題"
author: "作者"
leaveConfirm: "有未保存的更改。要放棄嗎?"
manage: "管理"
@ -742,8 +742,8 @@ _accountDelete:
inProgress: "正在刪除"
_forgotPassword:
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 "
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。"
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。"
_email:
_follow:
title: "您有新的追隨者"
@ -777,7 +777,7 @@ _mfm:
url: "URL"
urlDescription: "可以展示URL位址。"
link: "鏈接"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。"
bold: "粗體"
boldDescription: "可以將文字顯示为粗體来強調。"
small: "縮小"
@ -795,7 +795,7 @@ _mfm:
quote: "引用"
quoteDescription: "可以用來表示引用的内容。"
emoji: "自訂表情符號"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。"
search: "搜尋"
searchDescription: "您可以顯示所輸入的搜索框。"
flip: "翻轉"
@ -1001,7 +1001,7 @@ _widgets:
button: "按鈕"
onlineUsers: "線上的用戶"
jobQueue: "佇列"
serverMetric: "服務器指標 "
serverMetric: "服務器指標"
aiscript: "AiScript控制台"
aichan: "小藍"
_cw:
@ -1017,7 +1017,7 @@ _poll:
expiration: "期限"
infinite: "無期限"
at: "結束時間"
after: "進度指定 "
after: "進度指定"
deadlineDate: "截止日期"
deadlineTime: "小時"
duration: "時長"
@ -1033,7 +1033,7 @@ _poll:
remainingSeconds: "{s}秒後截止"
_visibility:
public: "公開"
publicDescription: "發布給所有用戶 "
publicDescription: "發布給所有用戶"
home: "首頁"
homeDescription: "僅發送至首頁的時間軸"
followers: "追隨者"

View file

@ -54,5 +54,5 @@
"start-server-and-test": "1.14.0",
"typescript": "^4.9.4"
},
"packageManager": "yarn@3.3.0"
"packageManager": "yarn@3.4.1"
}

View file

@ -0,0 +1,53 @@
export class noteVisibilityFunction1662132062000 {
name = 'noteVisibilityFunction1662132062000';
async up(queryRunner) {
await queryRunner.query(`
CREATE OR REPLACE FUNCTION note_visible(note_id varchar, user_id varchar) RETURNS BOOLEAN
LANGUAGE SQL
STABLE
CALLED ON NULL INPUT
AS $$
SELECT CASE
WHEN note_id IS NULL THEN TRUE
WHEN NOT EXISTS (SELECT 1 FROM note WHERE id = note_id) THEN FALSE
WHEN user_id IS NULL THEN (
-- simplified check without logged in user
SELECT
visibility IN ('public', 'home')
-- check reply / renote recursively
AND note_visible("replyId", NULL)
AND note_visible("renoteId", NULL)
FROM note WHERE note.id = note_id
) ELSE (
SELECT
(
visibility IN ('public', 'home')
OR
user_id = "userId"
OR
user_id = ANY("visibleUserIds")
OR
user_id = ANY("mentions")
OR (
visibility = 'followers'
AND
EXISTS (
SELECT 1 FROM following WHERE "followeeId" = "userId" AND "followerId" = user_id
)
)
)
-- check reply / renote recursively
AND note_visible("replyId", user_id)
AND note_visible("renoteId", user_id)
FROM note WHERE note.id = note_id
)
END;
$$;
`);
}
async down(queryRunner) {
await queryRunner.query('DROP FUNCTION note_visible');
}
}

View file

@ -22,6 +22,7 @@ import { packedNoteReactionSchema } from '@/models/schema/note-reaction.js';
import { packedHashtagSchema } from '@/models/schema/hashtag.js';
import { packedPageSchema } from '@/models/schema/page.js';
import { packedUserGroupSchema } from '@/models/schema/user-group.js';
import { packedUserGroupInvitationSchema } from '@/models/schema/user-group-invitation.js';
import { packedNoteFavoriteSchema } from '@/models/schema/note-favorite.js';
import { packedChannelSchema } from '@/models/schema/channel.js';
import { packedAntennaSchema } from '@/models/schema/antenna.js';
@ -41,6 +42,7 @@ export const refs = {
UserList: packedUserListSchema,
UserGroup: packedUserGroupSchema,
UserGroupInvitation: packedUserGroupInvitationSchema,
App: packedAppSchema,
MessagingMessage: packedMessagingMessageSchema,
Note: packedNoteSchema,

View file

@ -78,7 +78,7 @@ export class DriveFile {
default: {},
comment: 'The any properties of the DriveFile. For example, it includes image width/height.',
})
public properties: { width?: number; height?: number; orientation?: number; avgColor?: string };
public properties: { width?: number; height?: number; orientation?: number; };
@Column('boolean')
public storedInternal: boolean;

View file

@ -11,6 +11,7 @@ import { NoteReaction } from '@/models/entities/note-reaction.js';
import { User } from '@/models/entities/user.js';
import { awaitAll } from '@/prelude/await-all.js';
import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '../index.js';
import { apiLogger } from '@/server/api/logger.js';
async function populatePoll(note: Note, meId: User['id'] | null) {
const poll = await Polls.findOneByOrFail({ noteId: note.id });
@ -77,7 +78,7 @@ async function populateMyReaction(note: Note, meId: User['id'], _hint_?: {
export const NoteRepository = db.getRepository(Note).extend({
async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> {
// This code must always be synchronized with the checks in generateVisibilityQuery.
// This code must always be synchronized with the `note_visible` SQL function.
// visibility が specified かつ自分が指定されていなかったら非表示
if (note.visibility === 'specified') {
if (meId == null) {
@ -270,6 +271,13 @@ export const NoteRepository = db.getRepository(Note).extend({
})));
// filter out rejected promises, only keep fulfilled values
return promises.flatMap(result => result.status === 'fulfilled' ? [result.value] : []);
return promises.flatMap((result, i) => {
if (result.status === 'fulfilled') {
return [result.value];
} else {
apiLogger.error(`dropping note due to violating visibility restrictions, note ${notes[i].id} user ${meId}`);
return [];
}
});
},
});

View file

@ -60,11 +60,6 @@ export const packedDriveFileSchema = {
optional: true, nullable: false,
example: 8,
},
avgColor: {
type: 'string',
optional: true, nullable: false,
example: 'rgb(40,65,87)',
},
},
},
url: {

View file

@ -163,16 +163,20 @@ export const packedNoteSchema = {
optional: false, nullable: false,
},
uri: {
description: 'ActivityPub `id` of this Note',
type: 'string',
optional: true, nullable: false,
},
url: {
description: 'URL to a presentation form intended for humans, if available',
type: 'string',
optional: true, nullable: false,
},
myReaction: {
type: 'object',
description: 'Textual representation of the authenticated users reaction, if they reacted.',
example: ':blobfox@.:',
type: 'string',
optional: true, nullable: true,
},
},

View file

@ -48,6 +48,7 @@ export const packedNotificationSchema = {
},
invitation: {
type: 'object',
ref: 'UserGroupInvitation',
optional: true, nullable: true,
},
body: {

View file

@ -0,0 +1,16 @@
export const packedUserGroupInvitationSchema = {
type: 'object',
properties: {
id: {
type: 'string',
optional: false, nullable: false,
format: 'id',
example: 'xxxxxxxxxx',
},
group: {
type: 'object',
optional: false, nullable: false,
ref: 'UserGroup',
},
},
} as const;

View file

@ -87,11 +87,13 @@ export const packedUserDetailedNotMeOnlySchema = {
type: 'object',
properties: {
url: {
description: 'URL to a presentation form intended for humans, if available',
type: 'string',
format: 'url',
nullable: true, optional: false,
},
uri: {
description: 'ActivityPub `id` of this User',
type: 'string',
format: 'uri',
nullable: true, optional: false,
@ -403,6 +405,24 @@ export const packedMeDetailedOnlySchema = {
items: {
type: 'object',
nullable: false, optional: false,
properties: {
id: {
type: 'string',
optional: false,
nullable: false,
},
name: {
type: 'string',
optional: false,
nullable: false,
},
lastUsed: {
type: 'string',
optional: false,
nullable: false,
example: '1970-01-01T00:00:00Z',
},
},
},
},
//#endregion

View file

@ -185,19 +185,21 @@ export async function createNote(value: string | IObject, resolver: Resolver, si
};
const uris = unique([quoteUrl, note._misskey_quote, note.quoteUri].filter((x): x is string => typeof x === 'string'));
let temperror = false;
// check the urls sequentially and abort early to not do unnecessary HTTP requests
// picks the first one that works
for (const uri in uris) {
for (const uri of uris) {
const res = await tryResolveNote(uri);
if (res.status === 'ok') {
quote = res.res;
break;
} else if (res.status === 'temperror') {
temperror = true;
}
}
if (!quote) {
if (results.some(x => x.status === 'temperror')) {
throw new Error('quote resolve failed');
}
if (!quote && temperror) {
// could not resolve quote, try again later
throw new Error('quote resolve failed');
}
}

View file

@ -1,42 +1,17 @@
import { Brackets, SelectQueryBuilder } from 'typeorm';
import { SelectQueryBuilder } from 'typeorm';
import { User } from '@/models/entities/user.js';
import { Followings } from '@/models/index.js';
import { Note } from '@/models/entities/note.js';
import { Notes } from '@/models/index.js';
export function generateVisibilityQuery(q: SelectQueryBuilder<any>, me?: { id: User['id'] } | null) {
// This code must always be synchronized with the checks in Notes.isVisibleForMe.
if (me == null) {
q.andWhere(new Brackets(qb => { qb
.where("note.visibility = 'public'")
.orWhere("note.visibility = 'home'");
}));
export function visibilityQuery(q: SelectQueryBuilder<Note>, meId?: User['id'] | null = null): SelectQueryBuilder<Note> {
const superQuery = Notes.createQueryBuilder()
.from(() => q, 'note');
if (meId == null) {
superQuery.where('note_visible(note.id, null);');
} else {
const followingQuery = Followings.createQueryBuilder('following')
.select('following.followeeId')
.where('following.followerId = :meId');
q.andWhere(new Brackets(qb => { qb
// 公開投稿である
.where(new Brackets(qb => { qb
.where("note.visibility = 'public'")
.orWhere("note.visibility = 'home'");
}))
// または 自分自身
.orWhere('note.userId = :meId')
// または 自分宛て
.orWhere(':meId = ANY(note.visibleUserIds)')
.orWhere(':meId = ANY(note.mentions)')
.orWhere(new Brackets(qb => { qb
// または フォロワー宛ての投稿であり、
.where("note.visibility = 'followers'")
.andWhere(new Brackets(qb => { qb
// 自分がフォロワーである
.where(`note.userId IN (${ followingQuery.getQuery() })`)
// または 自分の投稿へのリプライ
.orWhere('note.replyUserId = :meId');
}));
}));
}));
q.setParameters({ meId: me.id });
superQuery.where('note_visible(note.id, :meId)', { meId });
}
return q;
}

View file

@ -2,7 +2,8 @@ import { IdentifiableError } from '@/misc/identifiable-error.js';
import { User } from '@/models/entities/user.js';
import { Note } from '@/models/entities/note.js';
import { Notes, Users } from '@/models/index.js';
import { generateVisibilityQuery } from './generate-visibility-query.js';
import { apiLogger } from '@/server/api/logger.js';
import { visibilityQuery } from './generate-visibility-query.js';
/**
* Get note for API processing, taking into account visibility.
@ -13,11 +14,10 @@ export async function getNote(noteId: Note['id'], me: { id: User['id'] } | null)
id: noteId,
});
generateVisibilityQuery(query, me);
const note = await query.getOne();
const note = await visibilityQuery(query, me).getOne();
if (note == null) {
apiLogger.error(`user ${me.id} tried to view note ${noteId} violating visibility restrictions`);
throw new IdentifiableError('9725d0ce-ba28-4dde-95a7-2cbb2c15de24', 'No such note.');
}

View file

@ -2,14 +2,10 @@ import { Schema } from '@/misc/schema.js';
import { errors } from './error.js';
import * as ep___admin_meta from './endpoints/admin/meta.js';
import * as ep___admin_abuseUserReports from './endpoints/admin/abuse-user-reports.js';
import * as ep___admin_accounts_create from './endpoints/admin/accounts/create.js';
import * as ep___admin_accounts_delete from './endpoints/admin/accounts/delete.js';
import * as ep___admin_announcements_create from './endpoints/admin/announcements/create.js';
import * as ep___admin_announcements_delete from './endpoints/admin/announcements/delete.js';
import * as ep___admin_announcements_list from './endpoints/admin/announcements/list.js';
import * as ep___admin_announcements_update from './endpoints/admin/announcements/update.js';
import * as ep___admin_deleteAllFilesOfAUser from './endpoints/admin/delete-all-files-of-a-user.js';
import * as ep___admin_drive_cleanRemoteFiles from './endpoints/admin/drive/clean-remote-files.js';
import * as ep___admin_drive_files from './endpoints/admin/drive/files.js';
import * as ep___admin_drive_showFile from './endpoints/admin/drive/show-file.js';
@ -41,17 +37,21 @@ import * as ep___admin_queue_stats from './endpoints/admin/queue/stats.js';
import * as ep___admin_relays_add from './endpoints/admin/relays/add.js';
import * as ep___admin_relays_list from './endpoints/admin/relays/list.js';
import * as ep___admin_relays_remove from './endpoints/admin/relays/remove.js';
import * as ep___admin_resetPassword from './endpoints/admin/reset-password.js';
import * as ep___admin_resolveAbuseUserReport from './endpoints/admin/resolve-abuse-user-report.js';
import * as ep___admin_reports_list from './endpoints/admin/reports/list.js';
import * as ep___admin_reports_resolve from './endpoints/admin/reports/resolve.js';
import * as ep___admin_sendEmail from './endpoints/admin/send-email.js';
import * as ep___admin_serverInfo from './endpoints/admin/server-info.js';
import * as ep___admin_showModerationLogs from './endpoints/admin/show-moderation-logs.js';
import * as ep___admin_showUser from './endpoints/admin/show-user.js';
import * as ep___admin_showUsers from './endpoints/admin/show-users.js';
import * as ep___admin_silenceUser from './endpoints/admin/silence-user.js';
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js';
import * as ep___admin_unsilenceUser from './endpoints/admin/unsilence-user.js';
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.js';
import * as ep___admin_users from './endpoints/admin/users.js';
import * as ep___admin_users_create from './endpoints/admin/users/create.js';
import * as ep___admin_users_delete from './endpoints/admin/users/delete.js';
import * as ep___admin_users_deleteAllFiles from './endpoints/admin/users/delete-all-files.js';
import * as ep___admin_users_resetPassword from './endpoints/admin/users/reset-password.js';
import * as ep___admin_users_show from './endpoints/admin/users/show.js';
import * as ep___admin_users_silence from './endpoints/admin/users/silence.js';
import * as ep___admin_users_suspend from './endpoints/admin/users/suspend.js';
import * as ep___admin_users_unsilence from './endpoints/admin/users/unsilence.js';
import * as ep___admin_users_unsuspend from './endpoints/admin/users/unsuspend.js';
import * as ep___admin_updateMeta from './endpoints/admin/update-meta.js';
import * as ep___admin_vacuum from './endpoints/admin/vacuum.js';
import * as ep___announcements from './endpoints/announcements.js';
@ -298,14 +298,10 @@ import * as ep___fetchRss from './endpoints/fetch-rss.js';
const eps = [
['admin/meta', ep___admin_meta],
['admin/abuse-user-reports', ep___admin_abuseUserReports],
['admin/accounts/create', ep___admin_accounts_create],
['admin/accounts/delete', ep___admin_accounts_delete],
['admin/announcements/create', ep___admin_announcements_create],
['admin/announcements/delete', ep___admin_announcements_delete],
['admin/announcements/list', ep___admin_announcements_list],
['admin/announcements/update', ep___admin_announcements_update],
['admin/delete-all-files-of-a-user', ep___admin_deleteAllFilesOfAUser],
['admin/drive/clean-remote-files', ep___admin_drive_cleanRemoteFiles],
['admin/drive/files', ep___admin_drive_files],
['admin/drive/show-file', ep___admin_drive_showFile],
@ -337,17 +333,21 @@ const eps = [
['admin/relays/add', ep___admin_relays_add],
['admin/relays/list', ep___admin_relays_list],
['admin/relays/remove', ep___admin_relays_remove],
['admin/reset-password', ep___admin_resetPassword],
['admin/resolve-abuse-user-report', ep___admin_resolveAbuseUserReport],
['admin/reports/list', ep___admin_reports_list],
['admin/reports/resolve', ep___admin_reports_resolve],
['admin/send-email', ep___admin_sendEmail],
['admin/server-info', ep___admin_serverInfo],
['admin/show-moderation-logs', ep___admin_showModerationLogs],
['admin/show-user', ep___admin_showUser],
['admin/show-users', ep___admin_showUsers],
['admin/silence-user', ep___admin_silenceUser],
['admin/suspend-user', ep___admin_suspendUser],
['admin/unsilence-user', ep___admin_unsilenceUser],
['admin/unsuspend-user', ep___admin_unsuspendUser],
['admin/users', ep___admin_users],
['admin/users/create', ep___admin_users_create],
['admin/users/delete', ep___admin_users_delete],
['admin/users/delete-all-files', ep___admin_users_deleteAllFiles],
['admin/users/reset-password', ep___admin_users_resetPassword],
['admin/users/show', ep___admin_users_show],
['admin/users/silence', ep___admin_users_silence],
['admin/users/suspend', ep___admin_users_suspend],
['admin/users/unsilence', ep___admin_users_unsilence],
['admin/users/unsuspend', ep___admin_users_unsuspend],
['admin/update-meta', ep___admin_updateMeta],
['admin/vacuum', ep___admin_vacuum],
['announcements', ep___announcements],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Announcements, AnnouncementReads } from '@/models/index.js';
import { Announcement } from '@/models/entities/announcement.js';
import define from '../../../define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js';
import define from '@/server/api/define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { createCleanRemoteFilesJob } from '@/queue/index.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js';
import define from '@/server/api/define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],
@ -79,11 +79,6 @@ export const meta = {
optional: false, nullable: false,
example: 720,
},
avgColor: {
type: 'string',
optional: true, nullable: false,
example: 'rgb(40,65,87)',
},
},
},
storedInternal: {

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm';
import { Emojis } from '@/models/index.js';
import { db } from '@/db/postgre.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -3,8 +3,8 @@ import { db } from '@/db/postgre.js';
import { Emojis, DriveFiles } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -4,8 +4,8 @@ import { DriveFile } from '@/models/entities/drive-file.js';
import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
import { publishBroadcastStream } from '@/services/stream.js';
import { db } from '@/db/postgre.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { In } from 'typeorm';
import { Emojis } from '@/models/index.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { db } from '@/db/postgre.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,8 +1,8 @@
import { Emojis } from '@/models/index.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { db } from '@/db/postgre.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { createImportCustomEmojisJob } from '@/queue/index.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
secure: true,

View file

@ -1,7 +1,7 @@
import { Emojis } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js';
import define from '../../../define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js';
import define from '@/server/api/define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Emoji } from '@/models/entities/emoji.js';
import { Emojis } from '@/models/index.js';
import define from '../../../define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js';
import define from '@/server/api/define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm';
import { db } from '@/db/postgre.js';
import { Emojis } from '@/models/index.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm';
import { Emojis } from '@/models/index.js';
import { db } from '@/db/postgre.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { In } from 'typeorm';
import { db } from '@/db/postgre.js';
import { Emojis } from '@/models/index.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { db } from '@/db/postgre.js';
import { Emojis } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { deleteFile } from '@/services/drive/delete-file.js';
import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Instances } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js';
import { ApiError } from '@/server/api/error.js';
import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import deleteFollowing from '@/services/following/delete.js';
import { Followings, Users } from '@/models/index.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Instances } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js';
import { ApiError } from '@/server/api/error.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { db } from '@/db/postgre.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
requireCredential: true,

View file

@ -1,5 +1,5 @@
import { db } from '@/db/postgre.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
requireCredential: true,

View file

@ -1,7 +1,7 @@
import { RegistrationTickets } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { secureRndstrCustom } from '@/misc/secure-rndstr.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,8 +1,8 @@
import config from '@/config/index.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
import { TranslationService } from '@/models/entities/meta.js';
import { translatorAvailable } from '../../common/translator.js';
import define from '../../define.js';
import { translatorAvailable } from '@/server/api/common/translator.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['meta'],
@ -52,7 +52,7 @@ export const meta = {
},
bannerUrl: {
type: 'string',
optional: false, nullable: false,
optional: false, nullable: true,
},
iconUrl: {
type: 'string',

View file

@ -1,7 +1,7 @@
import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import { publishInternalEvent } from '@/services/stream.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import { publishInternalEvent } from '@/services/stream.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { destroy } from '@/queue/index.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { URL } from 'node:url';
import { deliverQueue } from '@/queue/queues.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { URL } from 'node:url';
import { inboxQueue } from '@/queue/queues.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { URL } from 'node:url';
import { addRelay } from '@/services/relay.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { listRelay } from '@/services/relay.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { removeRelay } from '@/services/relay.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { AbuseUserReports } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import define from '../../define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -3,7 +3,7 @@ import { getInstanceActor } from '@/services/instance-actor.js';
import { deliver } from '@/queue/index.js';
import { renderActivity } from '@/remote/activitypub/renderer/index.js';
import { renderFlag } from '@/remote/activitypub/renderer/flag.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { sendEmail } from '@/services/send-email.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -2,7 +2,7 @@ import * as os from 'node:os';
import si from 'systeminformation';
import { db } from '@/db/postgre.js';
import { redisClient } from '@/db/redis.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
requireCredential: true,

View file

@ -1,6 +1,6 @@
import { ModerationLogs } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import define from '../../define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { fetchMeta, setMeta } from '@/misc/fetch-meta.js';
import { TranslationService } from '@/models/entities/meta.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { DAY } from '@/const.js';
import { Users } from '@/models/index.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,8 +1,8 @@
import { IsNull } from 'typeorm';
import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import define from '../../../define.js';
import { signup } from '../../../common/signup.js';
import define from '@/server/api/define.js';
import { signup } from '@/server/api/common/signup.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { deleteFile } from '@/services/drive/delete-file.js';
import { DriveFiles } from '@/models/index.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import { deleteAccount } from '@/services/delete-account.js';
import define from '../../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { hashPassword } from '@/misc/password.js';
import { secureRndstr } from '@/misc/secure-rndstr.js';
import { Users, UserProfiles } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Signins, UserProfiles, Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -5,7 +5,7 @@ import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { doPostSuspend } from '@/services/suspend-user.js';
import { publishUserEvent } from '@/services/stream.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Users } from '@/models/index.js';
import { ApiError } from '@/server/api/error.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { doPostUnsuspend } from '@/services/unsuspend-user.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { db } from '@/db/postgre.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { Announcements, AnnouncementReads } from '@/models/index.js';
import define from '../define.js';
import { makePaginationQuery } from '../common/make-pagination-query.js';
import define from '@/server/api/define.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
export const meta = {
tags: ['meta'],

View file

@ -1,8 +1,8 @@
import { genId } from '@/misc/gen-id.js';
import { Antennas, UserLists, UserGroupJoinings } from '@/models/index.js';
import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['antennas'],

View file

@ -1,7 +1,7 @@
import { Antennas } from '@/models/index.js';
import { publishInternalEvent } from '@/services/stream.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['antennas'],

View file

@ -1,5 +1,5 @@
import { Antennas } from '@/models/index.js';
import define from '../../define.js';
import define from '@/server/api/define.js';
export const meta = {
tags: ['antennas', 'account'],

View file

@ -1,11 +1,11 @@
import { readNote } from '@/services/note/read.js';
import { Antennas, Notes, AntennaNotes } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
import { makePaginationQuery } from '@/server/api/common/make-pagination-query.js';
import { visibilityQuery } from '@/server/api/common/generate-visibility-query.js';
import { generateMutedUserQuery } from '@/server/api/common/generate-muted-user-query.js';
import { generateBlockedUserQuery } from '@/server/api/common/generate-block-query.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['antennas', 'account', 'notes'],
@ -65,11 +65,10 @@ export default define(meta, paramDef, async (ps, user) => {
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner')
.andWhere('antennaNote.antennaId = :antennaId', { antennaId: antenna.id });
generateVisibilityQuery(query, user);
generateMutedUserQuery(query, user);
generateBlockedUserQuery(query, user);
const notes = await query
const notes = await visibilityQuery(query, user)
.take(ps.limit)
.getMany();

View file

@ -1,6 +1,6 @@
import { Antennas } from '@/models/index.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
import define from '@/server/api/define.js';
import { ApiError } from '@/server/api/error.js';
export const meta = {
tags: ['antennas', 'account'],

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