Merge upstream for Peertube federation fix

This commit is contained in:
vib 2023-03-23 12:43:19 +02:00
commit 75113b3d4f
436 changed files with 3134 additions and 2543 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

@ -40,15 +40,27 @@ After that the actual endpoint code is run by `call.ts` after checking some more
ActivityPub related code is in `/packages/backend/src/remote/activitypub/`
Both incoming and outgoing ActivityPub request are handled through queues, to e.g. allow for retrying a request when it fails, or spikes of many incoming requests.
#### Incoming Activities
Remote ActivityPub implementations will HTTP POST to the resource `/user/:userId/inbox` or `/inbox` (the latter is also known as the "shared inbox").
The behaviour for these routes is exactly the same: They add all the received data into the inbox queue.
This is defined in `/packages/backend/src/server/activitypub.ts`.
The inbox processor will do some basic things like verify signatures.
Incoming ActivityPub requests are processed by the code in `kernel/`.
The files/directories are generally named the same as the Activities that they process, which should help with orientation.
The entry point for processing an activity is `processOneActivity` in the `kernel/index.ts` file in that directory.
Parts of incoming activities may also be processed by `models/`.
The bodys of outgoing ActivityPub requests are "rendered" using `renderer/`.
#### Outgoing Activities
Outgoing activities are usually initiated in the logic of the API endpoints.
The bodies of outgoing ActivityPub requests are "rendered" using `renderer/`.
These files define several functions that are meant to be used together, e.g. `renderCreate(await renderNote(note, false), note)`.
The invocation of these functions is placed either in the API endpoints directly or in the services code.
Both incoming and outgoing ActivityPub request are handled through queues, to e.g. allow for retrying a request when it fails, or spikes of many incoming requests.
The rendered bodies of the functions and the recipients are put into the deliver queue to be delivered.
### Services

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,16 +645,13 @@ enabled: "مفعّل"
disabled: "معطّل"
quickAction: "الإجراءات السّريعة"
user: "المستخدمون"
administration: "إدارة "
administration: "إدارة"
accounts: "الحسابات"
switch: "بدّل"
noMaintainerInformationWarning: "لم تُضبط معلومات المدير"
noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية"
configure: "اضبط"
postToGallery: "انشر في المعرض"
gallery: "المعرض"
recentPosts: "المشاركات الحديثة"
popularPosts: "المشاركات المتداولة"
shareWithNote: "شاركه في ملاحظة"
emailNotConfiguredWarning: "لم تعيّن بريدًا إلكترونيًا"
ratio: "النسبة"
@ -743,11 +740,6 @@ _forgotPassword:
ifNoEmail: "إذا لم تربط حسابك ببريد إلكتروني سيتوجب عليك التواصل مع مدير الموقع."
contactAdmin: "هذا المثيل لا يدعم استخدام البريد الإلكتروني، إن أردت إعادة تعيين\
\ كلمة المرور تواصل مع المدير."
_gallery:
my: "معرضي"
liked: "المشاركات المُعجب بها"
like: "أعجبني"
unlike: "أزل الإعجاب"
_email:
_follow:
title: "يتابعك"
@ -772,7 +764,7 @@ _nsfw:
force: "اخف كل الوسائط"
_mfm:
cheatSheet: "مرجع ملخص عن MFM"
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
\ كل تعابيرها مع كيفية استخدامها هنا."
mention: "أشر الى"
mentionDescription: "يمكنك الإشارة لمستخدم معيّن من خلال كتابة @ متبوعة باسم مستخدم."
@ -950,7 +942,6 @@ _permissions:
"write:notes": "أنشئ أو احذف ملاحظات"
"read:notifications": "اظهر الإشعارات"
"write:notifications": "إدارة الإشعارات"
"read:reactions": "اعرض تفاعلاتك"
"write:reactions": "عدّل تفاعلاتك"
"write:votes": "صوّت"
"read:pages": "اعرض صفحاتك"
@ -960,9 +951,6 @@ _permissions:
"write:user-groups": "عدّل أو احذف فِرق المستخدمين"
"read:channels": "طالع قنواتك"
"write:channels": "عدّل القنوات"
"read:gallery": "اعرض المعرض"
"write:gallery": "عدّل المعرض"
"read:gallery-likes": "يعرض ما أعجبك من مشاركات المعرض"
_auth:
shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟"
shareAccessAsk: "هل تخول لهذا التطبيق الوصول لحسابك؟"

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: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায়\
\ প্রদর্শিত হবে না।"
@ -671,7 +671,6 @@ editCode: "কোড সম্পাদনা করুন"
apply: "প্রয়োগ করুন"
receiveAnnouncementFromInstance: "এই ইন্সট্যান্স থেকে বিজ্ঞপ্তি পান"
emailNotification: "ইমেইল বিজ্ঞপ্তি"
publish: "প্রকাশ"
useReactionPickerForContextMenu: "রাইট ক্লিকের মাধ্যমে রিঅ্যাকশন পিকার খুলুন"
typingUsers: "{users} লেখছে"
jumpToSpecifiedDate: "একটি নির্দিষ্ট তারিখে যান"
@ -710,10 +709,7 @@ switch: "পাল্টান"
noMaintainerInformationWarning: "প্রশাসকের তথ্য সেট করা হয়নি।"
noBotProtectionWarning: "বট প্রোটেকশন সেট করা হয়নি।"
configure: "কনফিগার করুন"
postToGallery: "গ্যালারী পোস্ট তৈরি করুন"
gallery: "গ্যালারী"
recentPosts: "নতুন পোস্ট"
popularPosts: "জনপ্রিয় পোস্ট"
shareWithNote: "নোটের মাধ্যমে শেয়ার করুন"
emailNotConfiguredWarning: "ইমেইল অ্যাড্রেস সেট করা হয়নি।"
ratio: "অনুপাত"
@ -721,7 +717,7 @@ previewNoteText: "প্রিভিউ দেখান"
customCss: "কাস্টম CSS"
customCssWarn: "এই ব্যাপারে অভিজ্ঞতা না থাকলে এই সেটিংটি ব্যাবহার করবেন না। অনুপযুক্ত\
\ সেটিংস ক্লায়েন্টকে স্বাভাবিকভাবে ব্যবহার করতে বাধা দিতে পারে।"
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান "
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান"
searchResult: "অনুসন্ধানের ফলাফল"
hashtags: "হ্যাশট্যাগ"
troubleshooting: "ট্রাবলশুটিং"
@ -765,7 +761,7 @@ hide: "লুকান"
leaveGroup: "গ্রুপ ছেড়ে চলে যান"
leaveGroupConfirm: "\"{name}\" গ্রুপ ছেড়ে চলে যেতে চান?"
useDrawerReactionPickerForMobile: "মোবাইলে রিঅ্যাকশন পিকারকে ড্রয়ারে প্রদর্শন করুন"
clickToFinishEmailVerification: " [{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
clickToFinishEmailVerification: "[{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
\ করুন।"
overridedDeviceKind: "ডিভাইসের ধরন"
smartphone: "স্মার্টফোন"
@ -785,12 +781,12 @@ oneDay: "একদিন"
oneWeek: "এক সপ্তাহ"
reflectMayTakeTime: "এটির কাজ দেখা যেতে কিছুটা সময় লাগতে পারে।"
failedToFetchAccountInformation: "অ্যাকাউন্টের তথ্য উদ্ধার করা যায়নি"
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে "
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে"
_emailUnavailable:
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
disposable: "অস্থায়ী ইমেইল ঠিকানা ব্যাবহার করা যাবে না"
mx: "ইমেইল সার্ভারটি ঠিক না"
mx: "ইমেইল সার্ভারটি ঠিক না"
smtp: "ইমেইল সার্ভারটি সাড়া দিচ্ছে না"
_ffVisibility:
public: "প্রকাশ"
@ -819,11 +815,6 @@ _forgotPassword:
\ প্রশাসকের সাথে যোগাযোগ করুন।"
contactAdmin: "এই ইন্সট্যান্সটি ইমেইল ব্যাবহার করে না, তাই আপনার পাসওয়ার্ড পুনরায়\
\ সেট করতে প্রশাসকের সাথে যোগাযোগ করুন৷"
_gallery:
my: "আমার গ্যালারী"
liked: "পছন্দ করা পোস্ট"
like: "পছন্দ করা"
unlike: "পছন্দ সরান"
_email:
_follow:
title: "আপনাকে অনুসরণ করছে"
@ -867,8 +858,7 @@ _mfm:
center: "সেন্টার"
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
inlineCode: "কোড (ইনলাইন)"
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা\
\ হবে"
inlineCodeDescription: "প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে."
blockCode: "কোড (ব্লক)"
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
inlineMath: "গাণিতিক সূত্র (ইনলাইন)"
@ -1015,7 +1005,7 @@ _tutorial:
\ পছন্দ করেন তাকে বেছে নিতে এবং অনুসরণ করতে পারেন, অথবা {explore}-এ জনপ্রিয় ব্যবহারকারীদের\
\ দেখতে পারেন৷"
step5_3: "একজন ব্যবহারকারীকে অনুসরণ করতে, ব্যবহারকারীর আইকনে ক্লিক করুন এবং ব্যবহারকারীর\
\ পৃষ্ঠাতে \"অনুসরণ করুন\" বাটনে ক্লিক করুন।"
\ পৃষ্ঠাতে \"অনুসরণ করুন\" বাটনে ক্লিক করুন।"
step5_4: "যদি ব্যবহারকারীর নামের পাশে একটি লক আইকন থাকে তাহলে আপনার অনুসরণের অনুরোধ\
\ গ্রহণ করার জন্য তারা কিছু সময় নিতে পারে।"
step6_1: "সবকিছু ঠিক থাকলে আপনি টাইমলাইনে অন্য ব্যবহারকারীদের নোট দেখতে পাবেন।"
@ -1055,7 +1045,6 @@ _permissions:
"write:notes": "নোট লিখা"
"read:notifications": "বিজ্ঞপ্তিগুলি দেখুন"
"write:notifications": "বিজ্ঞপ্তি নিয়ে কাজ করে"
"read:reactions": "রিঅ্যাকশনগুলি দেখুন"
"write:reactions": "রিঅ্যাকশনগুলি সম্পাদনা করুন"
"write:votes": "ভোট দিন"
"read:pages": "আপনার পেজগুলি দেখুন"
@ -1066,10 +1055,6 @@ _permissions:
"write:user-groups": "ব্যাবহারকারী গ্রুপগুলি সম্পাদনা করুন"
"read:channels": "চ্যানেলগুলি দেখুন"
"write:channels": "চ্যানেলগুলি সম্পাদনা করুন"
"read:gallery": "গ্যালারী দেখুন"
"write:gallery": "গ্যালারী সম্পাদনা করুন"
"read:gallery-likes": "গ্যালারীর পছন্দগুলি দেখুন"
"write:gallery-likes": "গ্যালারীর পছন্দগুলি সম্পাদনা করুন"
_auth:
shareAccess: "\"{name}\" কে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"
shareAccessAsk: "অ্যাপ্লিকেশনটিকে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"

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

@ -194,8 +194,8 @@ blockedInstances: "Blockierte Instanzen"
blockedInstancesDescription: "Gib die Hostnamen der Instanzen, welche blockiert werden\
\ sollen, durch Zeilenumbrüche getrennt an. Blockierte Instanzen können mit dieser\
\ Instanz nicht mehr kommunizieren. Hostnamen, die nicht-ASCII-Zeichen enthalten,\
\ müssen zuvor in Punycode umgewandelt werden. Ein Asterisk (*) kann als Platzhalter\
\ für beliebig viele Zeichen verwendet werden."
\ müssen zuvor in Punycode umgewandelt werden. Subdomains der aufgelisteten Hostnamen\
\ werden ebenfalls blockiert."
muteAndBlock: "Stummschaltungen und Blockierungen"
mutedUsers: "Stummgeschaltete Benutzer"
blockedUsers: "Blockierte Benutzer"
@ -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"
@ -693,7 +693,6 @@ editCode: "Code bearbeiten"
apply: "Anwenden"
receiveAnnouncementFromInstance: "Benachrichtigungen von dieser Instanz empfangen"
emailNotification: "Email-Benachrichtigungen"
publish: "Veröffentlichen"
useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen"
typingUsers: "{users} ist/sind am schreiben …"
jumpToSpecifiedDate: "Zu bestimmtem Datum springen"
@ -732,11 +731,7 @@ switch: "Wechseln"
noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert."
noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert."
configure: "Konfigurieren"
postToGallery: "Neuen Galeriebeitrag erstellen"
attachmentRequired: "Mindestens 1 Anhang ist erforderlich."
gallery: "Galerie"
recentPosts: "Neue Beiträge"
popularPosts: "Beliebte Beiträge"
shareWithNote: "Mit Notiz teilen"
emailNotConfiguredWarning: "Keine Email-Adresse hinterlegt."
ratio: "Verhältnis"
@ -851,11 +846,6 @@ _forgotPassword:
\ wende dich bitte an den Administrator."
contactAdmin: "Diese Instanz unterstützt die Verwendung von Email-Adressen nicht.\
\ Wende dich an den Administrator, um dein Passwort zurückzusetzen."
_gallery:
my: "Meine Galerie"
liked: "Mit \"Gefällt mir\" markierte Beiträge"
like: "Gefällt mir"
unlike: "\"Gefällt mir\" entfernen"
_email:
_follow:
title: "Du hast einen neuen Follower"
@ -979,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"
@ -1083,40 +1073,39 @@ _2fa:
\ deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels\
\ einrichten."
_permissions:
"read:account": "Deine Benutzerkontoinformationen lesen"
"write:account": "Deine Benutzerkontoinformationen bearbeiten"
"read:blocks": "Die Liste deiner blockierten Benutzer lesen"
"write:blocks": "Die Liste deiner blockierten Benutzer bearbeiten"
"read:drive": "Deine Drive-Dateien und Ordner lesen"
"write:drive": "Deine Drive-Dateien und Ordner bearbeiten oder löschen"
"read:favorites": "Deine Favoriten-Liste lesen"
"write:favorites": "Deine Favoriten-Liste bearbeiten"
"read:following": "Die Liste der Benutzer, denen du folgst, lesen"
"read:account": "Benutzerkonto-Informationen lesen"
"write:account": "Benutzerkonto-Informationen bearbeiten"
"read:blocks": "Liste der blockierten Benutzer lesen"
"write:blocks": "Liste der blockierten Benutzer bearbeiten"
"read:drive": "Drive-Dateien und -Ordner auflisten"
"write:drive": "Drive-Dateien und -Ordner erstellen, bearbeiten oder löschen"
"read:favorites": "Favorisierte Notizen auflisten"
"write:favorites": "Favorisierung von Notizen hinzufügen oder entfernen"
"read:following": "Gefolgte und folgende Benutzer auflisten"
"write:following": "Anderen Benutzern folgen oder entfolgen"
"read:messaging": "Chats lesen"
"write:messaging": "Chats bedienen"
"read:mutes": "Stummschaltungen lesen"
"write:mutes": "Stummschaltungen bearbeiten"
"read:messaging": "Chats und Chatverläufe lesen"
"write:messaging": "Chatnachrichten erstellen oder löschen"
"read:mutes": "Stummschaltungen und Renote-Stummschaltungen auflisten"
"write:mutes": "Stummschaltungen und Renote-Stummschaltungen bearbeiten"
"write:notes": "Notizen schreiben oder löschen"
"read:notifications": "Benachrichtigungen lesen"
"write:notifications": "Benachrichtigungen bedienen"
"read:reactions": "Reaktionen lesen"
"write:reactions": "Reaktionen bedienen"
"write:votes": "Umfragen bedienen"
"read:pages": "Deine Seiten lesen"
"write:pages": "Deine Seiten bearbeiten oder löschen"
"read:page-likes": "Liste der Seiten, die mir gefallen, lesen"
"write:page-likes": "Liste der Seiten, die mir gefallen, bearbeiten"
"read:user-groups": "Benutzergruppen lesen"
"write:user-groups": "Benutzergruppen bearbeiten oder löschen"
"read:channels": "Kanäle lesen"
"write:channels": "Kanäle bedienen"
"read:gallery": "Beiträge deiner Galerie lesen"
"write:gallery": "Deine Galerie bearbeiten"
"read:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\
\ lesen"
"write:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\
\ bearbeiten"
"write:notifications": "Benachrichtigungen als gelesen markieren oder App-Benachrichtigungen\
\ erstellen"
"write:reactions": "Reaktionen erstellen oder löschen"
"write:votes": "In Umfragen abstimmen"
"read:pages": "Deine Seiten auflisten und lesen"
"write:pages": "Seiten erstellen, bearbeiten oder löschen"
"read:page-likes": "Seiten, die mir gefallen, auflisten und auslesen"
"write:page-likes": "\"Gefällt mir\"-Markierung von Seiten bearbeiten"
"read:user-groups": "beigetretene, erstellte und eingeladene Benutzergruppen auflisten\
\ und lesen"
"write:user-groups": "Benutzergruppen erstellen, bearbeiten, löschen, übertragen,\
\ zu diesen beitreten oder diese verlassen. Andere Benutzer zu diesen Einladen\
\ oder Benutzer aus diesen Bannen. Einladungen zu Benutzergruppen annehmen oder\
\ ablehnen."
"read:channels": "gefolgte und beigetretene Kanäle auflisten und lesen"
"write:channels": "Kanäle erstellen, bearbeiten, diesen folgen und entfolgen"
"read:reactions": Reaktionen ansehen
_auth:
shareAccess: "Möchtest du „{name}“ authorisieren, auf dieses Benutzerkonto zugreifen\
\ zu können?"
@ -1289,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:
@ -1366,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
@ -1399,3 +1388,16 @@ selectAll: Alle auswählen
renoteUnmute: Renotes zeigen
renoteMute: Renotes verstecken
externalCssSnippets: Einige CSS-Schnipsel zur Inspiration (nicht durch FoundKey verwaltet)
botFollowRequiresApproval: Follow-Anfragen von als Bot markierten Accounts benötigen
Bestätigung
unrenoteAll: alle Renotes zurücknehmen
unrenoteAllConfirm: Bist du sicher, dass du alle Renotes zurücknehmen möchtest?
deleteAllFiles: Alle Dateien löschen
cannotAttachFileWhenAccountSwitched: Kann keine Dateien anhängen, während ein anderer
Account eingestellt ist.
cannotSwitchAccountWhenFileAttached: Kann keinen anderen Account einstellen, solange
Dateien angehängt sind.
oauthErrorGoBack: Bei der Authentifizierung einer Drittanbieter-Anwendung ist ein
Fehler aufgetreten. Bitte geh zurück und versuche es erneut.
appAuthorization: Anwendungs-Authorisierung
noPermissionsRequested: (Keine Berechtigungen angefordert.)

View file

@ -88,6 +88,7 @@ youShouldUpgradeClient: "To view this page, please refresh to update your client
enterListName: "Enter a name for the list"
privacy: "Privacy"
makeFollowManuallyApprove: "Follow requests require approval"
botFollowRequiresApproval: "Follow requests from accounts marked as bots require approval"
defaultNoteVisibility: "Default visibility"
follow: "Follow"
followRequest: "Send follow request"
@ -709,6 +710,8 @@ botProtection: "Bot Protection"
instanceBlocking: "Blocked Instances"
selectAccount: "Select account"
switchAccount: "Switch account"
cannotAttachFileWhenAccountSwitched: "You cannot attach a file while switched to another account."
cannotSwitchAccountWhenFileAttached: "You cannot switch accounts while files are attached."
enabled: "Enabled"
disabled: "Disabled"
quickAction: "Quick actions"
@ -1336,3 +1339,7 @@ _translationService:
_libreTranslate:
endpoint: "LibreTranslate API Endpoint"
authKey: "LibreTranslate Auth Key (optional)"
_remoteInteract:
title: "I'm sorry, I'm afraid I can't do that."
description: "You cannot perform this action right now. You probably need to do it on your own instance, or sign in."
urlInstructions: "You can copy this URL. If you paste it into the search field on your instance, you should be taken to the right location."

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"
@ -675,7 +675,6 @@ editCode: "Editar código"
apply: "Aplicar"
receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia"
emailNotification: "Notificaciones por correo electrónico"
publish: "Publicar"
useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\
\ de reacciones"
typingUsers: "{users} está escribiendo"
@ -713,10 +712,7 @@ switch: "Cambiar"
noMaintainerInformationWarning: "No se ha establecido la información del administrador"
noBotProtectionWarning: "La protección contra los bots no está configurada"
configure: "Configurar"
postToGallery: "Crear una nueva publicación en la galería"
gallery: "Galería"
recentPosts: "Posts recientes"
popularPosts: "Más vistos"
shareWithNote: "Compartir con una nota"
emailNotConfiguredWarning: "No se ha configurado una dirección de correo electrónico."
ratio: "Proporción"
@ -768,11 +764,6 @@ _forgotPassword:
contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\
\ póngase en contacto con el administrador de la instancia para restablecer su\
\ contraseña"
_gallery:
my: "Mi galería"
liked: "Publicaciones que me gustan"
like: "¡Muy bien!"
unlike: "Quitar me gusta"
_email:
_follow:
title: "te ha seguido"
@ -794,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"
@ -960,7 +951,6 @@ _permissions:
"write:notes": "Crear/borrar notas"
"read:notifications": "Ver notificaciones"
"write:notifications": "Administrar notificaciones"
"read:reactions": "Ver reacciones"
"write:reactions": "Administrar reacciones"
"write:votes": "Votar"
"read:pages": "Ver páginas"

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"
@ -188,7 +188,9 @@ clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de f
\ distants ?"
blockedInstances: "Instances bloquées"
blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par\
\ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance."
\ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance.\
\ Les noms de domaine non-ASCII doivent être encodés en punycode. Les sous-domaines\
\ de ces instances seront aussi bloqués."
muteAndBlock: "Masqué·e·s / Bloqué·e·s"
mutedUsers: "Utilisateur·rice·s en sourdine"
blockedUsers: "Utilisateur·rice·s bloqué·e·s"
@ -683,7 +685,6 @@ editCode: "Modifier le code"
apply: "Appliquer"
receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance"
emailNotification: "Notifications par mail"
publish: "Public"
useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions"
typingUsers: "{users} est en train d'écrire..."
jumpToSpecifiedDate: "Se rendre à la date"
@ -722,10 +723,7 @@ switch: "Remplacer"
noMaintainerInformationWarning: "Informations administrateur non configurées."
noBotProtectionWarning: "La protection contre les bots n'est pas configurée."
configure: "Configurer"
postToGallery: "Publier dans la galerie"
gallery: "Galerie"
recentPosts: "Les plus récentes"
popularPosts: "Les plus consultées"
shareWithNote: "Partager dans une note"
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
ratio: "Ratio"
@ -831,11 +829,6 @@ _forgotPassword:
contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,\
\ prenez contact avec l'administrateur·rice pour procéder à la réinitialisation\
\ de votre mot de passe."
_gallery:
my: "Mes publications"
liked: "Publications que j'ai aimées"
like: "J'aime"
unlike: "Je naime pas"
_email:
_follow:
title: "Vous suit"
@ -1063,38 +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"
"write:account": "Mettre à jour les informations de votre compte"
"read:blocks": "Voir les comptes bloqués"
"write:blocks": "Gérer les comptes bloqués"
"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"
"write:following": "Abonnements/Se désabonner"
"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"
"read:reactions": "Lire les réactions"
"write:reactions": "Gérer vos réactions"
"write:votes": "Voter"
"read:pages": "Voir vos pages"
"read:account": "Lire les informations du compte"
"write:account": "Mettre à jour les informations du compte"
"read:blocks": "Lire les utilisateurs bloqués"
"write:blocks": "Bloquer et Débloquer des comptes"
"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 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:gallery": "Voir la galerie"
"write:gallery": "Éditer la galerie"
"read:gallery-likes": "Voir les mentions « J'aime » dans la galerie"
"write:gallery-likes": "Gérer les mentions « J'aime » dans la galerie"
"read:reactions": Lister les réactions
_auth:
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\
@ -1393,6 +1382,19 @@ regexpErrorDescription: "Il y a une erreur dans l'expression régulière de la l
\ {line} de vos mots ignorées {tab} :"
forwardReportIsAnonymous: Un compte système anonyme sera affiché, à la place de votre
compte, lors du signalement à l'instance distante.
attachmentRequired: Un attachement au moins est nécessaire.
useDrawerReactionPickerForMobile: Sur mobile afficher un tiroir pour le panneau de
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"
@ -678,7 +678,6 @@ editCode: "Sunting kode"
apply: "Terapkan"
receiveAnnouncementFromInstance: "Terima pemberitahuan surel dari instansi ini"
emailNotification: "Pemberitahuan surel"
publish: "Terbitkan"
useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan"
typingUsers: "{users} sedang mengetik..."
jumpToSpecifiedDate: "Loncat ke tanggal spesifik"
@ -717,10 +716,7 @@ switch: "Beralih"
noMaintainerInformationWarning: "Informasi pengelola belum disetel."
noBotProtectionWarning: "Proteksi bot belum disetel."
configure: "Setel"
postToGallery: "Posting ke galeri"
gallery: "Galeri"
recentPosts: "Postingan terbaru"
popularPosts: "Postingan populer"
shareWithNote: "Bagikan dengan catatan"
emailNotConfiguredWarning: "Alamat surel tidak disetel."
ratio: "Rasio"
@ -829,11 +825,6 @@ _forgotPassword:
\ admin segera."
contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak\
\ admin untuk mengatur ulang password kamu."
_gallery:
my: "Postingan saya"
liked: "Postingan yang disukai"
like: "Suka"
unlike: "Hapus suka"
_email:
_follow:
title: "Mengikuti kamu"
@ -1076,7 +1067,6 @@ _permissions:
"write:notes": "Buat atau hapus catatan"
"read:notifications": "Lihat pemberitahuan"
"write:notifications": "Sunting pemberitahuan"
"read:reactions": "Lihat reaksi"
"write:reactions": "Sunting reaksi"
"write:votes": "Beri suara"
"read:pages": "Lihat halaman"
@ -1087,10 +1077,6 @@ _permissions:
"write:user-groups": "Sunting atau hapus grup pengguna"
"read:channels": "Lihat saluran"
"write:channels": "Sunting saluran"
"read:gallery": "Lihat galeri"
"write:gallery": "Sunting galeri"
"read:gallery-likes": "Lihat daftar postingan galeri yang disukai"
"write:gallery-likes": "Sunting daftar postingan galeri yang disukai"
_auth:
shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?"
shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun\
@ -1239,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"
@ -661,11 +661,10 @@ editCode: "Modifica codice"
apply: "Applica"
receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza"
emailNotification: "Eventi per notifiche via mail"
publish: "Pubblico"
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"
@ -700,10 +699,7 @@ switch: "Sostituisci"
noMaintainerInformationWarning: "Le informazioni amministratore non sono impostate."
noBotProtectionWarning: "Nessuna protezione impostata contro i bot."
configure: "Imposta"
postToGallery: "Pubblicare nella galleria"
gallery: "Galleria"
recentPosts: "Le più recenti"
popularPosts: "Le più visualizzate"
shareWithNote: "Condividere in nota"
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
ratio: "Rapporto"
@ -780,11 +776,6 @@ _forgotPassword:
contactAdmin: "Poiché questa istanza non permette l'utilizzo di una mail, si prega\
\ di contattare l'amministratore·trice dell'istanza per poter ripristinare la\
\ password."
_gallery:
my: "Le mie pubblicazioni"
liked: "Pubblicazioni che mi piacciono"
like: "Mi piace!"
unlike: "Non mi piace più"
_email:
_follow:
title: "Ha iniziato a seguirti"
@ -907,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"
@ -925,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."
@ -951,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"
@ -975,7 +966,6 @@ _permissions:
"write:notes": "Creare / Eliminare note"
"read:notifications": "Visualizza notifiche"
"write:notifications": "Gerisci notifiche"
"read:reactions": "Vedi reazioni"
"write:reactions": "Gerisci reazioni"
"write:votes": "Votare"
"read:pages": "Visualizzare pagine"
@ -1128,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

@ -623,7 +623,6 @@ editCode: "コードを編集"
apply: "適用"
receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
emailNotification: "メール通知"
publish: "公開"
useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く"
typingUsers: "{users}が入力中"
jumpToSpecifiedDate: "特定の日付にジャンプ"
@ -661,10 +660,7 @@ switch: "切り替え"
noMaintainerInformationWarning: "管理者情報が設定されていません。"
noBotProtectionWarning: "Botプロテクションが設定されていません。"
configure: "設定する"
postToGallery: "ギャラリーへ投稿"
gallery: "ギャラリー"
recentPosts: "最近の投稿"
popularPosts: "人気の投稿"
shareWithNote: "ノートで共有"
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
ratio: "比率"
@ -776,12 +772,6 @@ _forgotPassword:
ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。"
contactAdmin: "このインスタンスではメールがサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。"
_gallery:
my: "自分の投稿"
liked: "いいねした投稿"
like: "いいね!"
unlike: "いいね解除"
_email:
_follow:
title: "フォローされました"
@ -1006,7 +996,6 @@ _permissions:
"write:notes": "ノートを作成・削除する"
"read:notifications": "通知を見る"
"write:notifications": "通知を操作する"
"read:reactions": "リアクションを見る"
"write:reactions": "リアクションを操作する"
"write:votes": "投票する"
"read:pages": "ページを見る"
@ -1017,11 +1006,6 @@ _permissions:
"write:user-groups": "ユーザーグループを操作する"
"read:channels": "チャンネルを見る"
"write:channels": "チャンネルを操作する"
"read:gallery": "ギャラリーを見る"
"write:gallery": "ギャラリーを操作する"
"read:gallery-likes": "ギャラリーのいいねを見る"
"write:gallery-likes": "ギャラリーのいいねを操作する"
_auth:
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
shareAccessAsk: "アカウントへのアクセスを許可しますか?"

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: "短すぎやろ!"
@ -561,8 +551,6 @@ administration: "管理"
hashtags: "ハッシュタグ"
hide: "隠す"
indefinitely: "無期限"
_gallery:
unlike: "良くないわ"
_email:
_follow:
title: "フォローされたで"
@ -656,7 +644,6 @@ _tutorial:
_2fa:
alreadyRegistered: "もう設定終わっとるわ。"
_permissions:
"read:reactions": "リアクションを見る"
"write:votes": "投票する"
"read:pages": "ページを見る"
"read:page-likes": "ページのええやんを見る"
@ -697,7 +684,7 @@ _widgets:
aiscript: "AiScriptコンソール"
_cw:
hide: "隠す"
show: "続き見して"
show: "続き見して"
chars: "{count}文字"
files: "{count}ファイル"
_poll:

View file

@ -34,7 +34,6 @@ selectList: "Fren tabdart"
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
security: "Taɣellist"
remove: "Kkes"
connectService: "Qqen"
userList: "Tibdarin"
securityKey: "Tasarutt n tɣellist"
securityKeyName: "Isem n tsarutt"

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"
@ -639,7 +638,6 @@ editCode: "Edytuj kod"
apply: "Zastosuj"
receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tej instancji"
emailNotification: "Powiadomienia e-mail"
publish: "Publikuj"
useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem"
typingUsers: "{users} pisze(-ą)..."
jumpToSpecifiedDate: "Przejdź do określonej daty"
@ -677,10 +675,7 @@ switch: "Przełącz"
noMaintainerInformationWarning: "Informacje o administratorze nie są skonfigurowane."
noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane."
configure: "Skonfiguruj"
postToGallery: "Opublikuj w galerii"
gallery: "Galeria"
recentPosts: "Ostatnie wpisy"
popularPosts: "Popularne wpisy"
shareWithNote: "Udostępnij z wpisem"
emailNotConfiguredWarning: "Nie podano adresu e-mail"
ratio: "Stosunek"
@ -700,11 +695,6 @@ _forgotPassword:
\ z administratorem zamiast tego."
contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się\
\ zamiast tego z administratorem, aby zresetować hasło."
_gallery:
my: "Moja galeria"
liked: "Polubione wpisy"
like: "Polub"
unlike: "Cofnij polubienie"
_email:
_follow:
title: "Zaobserwował(a) Cię"
@ -859,7 +849,6 @@ _permissions:
"write:mutes": "Edycja listy osób, które wyciszyłeś(-aś)"
"read:notifications": "Wyświetlanie powiadomień"
"write:notifications": "Działanie na powiadomieniach"
"read:reactions": "Wyświetlanie reakcji"
"write:reactions": "Edycja reakcji"
"write:votes": "Głosowanie w ankiecie"
"read:pages": "Wyświetlanie Twoich stron"
@ -976,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"
@ -1056,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: "Популярные пользователи"
@ -668,7 +668,6 @@ editCode: "Редактировать исходный текст"
apply: "Применить"
receiveAnnouncementFromInstance: "Получать оповещения с инстанса"
emailNotification: "Уведомления по электронной почте"
publish: "Опубликовать"
useReactionPickerForContextMenu: "Открывать палитру реакций правой кнопкой"
typingUsers: "Стук клавиш. Это {users}…"
jumpToSpecifiedDate: "Перейти к заданной дате"
@ -707,10 +706,7 @@ switch: "Переключение"
noMaintainerInformationWarning: "Не заполнены сведения об администраторах"
noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить"
postToGallery: "Опубликовать в галерею"
gallery: "Галерея"
recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации"
shareWithNote: "Поделиться заметкой"
emailNotConfiguredWarning: "Не указан адрес электронной почты"
ratio: "Соотношение"
@ -805,11 +801,6 @@ _forgotPassword:
\ ресурса, чтобы сменить пароль."
contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь\
\ с администратором, чтобы поменять пароль."
_gallery:
my: "Личная"
liked: "Понравившееся"
like: "Нравится!"
unlike: "Отменить «нравится»"
_email:
_follow:
title: "Новый подписчик"
@ -1004,7 +995,7 @@ _tutorial:
step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\
\ профиле нажмите кнопку «Подписаться»."
step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\
\ чужие подписки. Так что иногда подписка начинает работать не сразу.\n"
\ чужие подписки. Так что иногда подписка начинает работать не сразу."
step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось."
step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\
\ «реакцию» под ней."
@ -1044,7 +1035,6 @@ _permissions:
"write:notes": "Писать и удалять заметки"
"read:notifications": "Смотреть уведомления"
"write:notifications": "Изменять уведомления"
"read:reactions": "Смотреть реакции"
"write:reactions": "Изменять реакции"
"write:votes": "Голосовать"
"read:pages": "Смотреть страницы"
@ -1055,10 +1045,6 @@ _permissions:
"write:user-groups": "Изменять и удалять группы пользователей"
"read:channels": "Смотреть каналы"
"write:channels": "Изменять каналы"
"read:gallery": "Просмотр галереи"
"write:gallery": "Редактирование галереи"
"read:gallery-likes": "Просмотр списка понравившегося в галерее"
"write:gallery-likes": "Изменение списка понравившегося в галерее"
_auth:
shareAccess: "Дать доступ для «{name}» к вашей учётной записи?"
shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?"
@ -1162,7 +1148,7 @@ _profile:
changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке"
_exportOrImport:
allNotes: "Все записи\n"
allNotes: "Все записи"
followingList: "Подписки"
muteList: "Скрытые"
blockingList: "Заблокированные"

View file

@ -661,7 +661,6 @@ editCode: "Upraviť kód"
apply: "Použiť"
receiveAnnouncementFromInstance: "Prijať notifikácie z tohoto servera"
emailNotification: "Emailové upozornenia"
publish: "Zverejniť"
useReactionPickerForContextMenu: "Otvoriť výber reakcií na pravý klik"
typingUsers: "{users} píše/u"
jumpToSpecifiedDate: "Skočiť na konkrétny dátum"
@ -700,10 +699,7 @@ switch: "Prepnúť"
noMaintainerInformationWarning: "Informácie správcu nie sú nastavené."
noBotProtectionWarning: "Ochrana proti botom nie je nastavená."
configure: "Konfigurovať"
postToGallery: "Vytvoriť nový príspevok v galérii"
gallery: "Galéria"
recentPosts: "Najnovšie príspevky"
popularPosts: "Populárne príspevky"
shareWithNote: "Zdieľať s poznámkou"
emailNotConfiguredWarning: "Nie je nastavená emailová adresa."
ratio: "Pomer"
@ -804,11 +800,6 @@ _forgotPassword:
ifNoEmail: "Ak ste pri registrácii nepoužili email, prosím kontaktujte administrátora."
contactAdmin: "Tento server nepodporuje používanie emailových adries, prosím kontaktuje\
\ administrátor, ktorý vám resetuje heslo."
_gallery:
my: "Moja galéria"
liked: "Obľúbené príspevky"
like: "Páči sa mi"
unlike: "Nepáči sa mi"
_email:
_follow:
title: "Máte nového sledujúceho"
@ -1039,7 +1030,6 @@ _permissions:
"write:notes": "Písať alebo odstrániť poznámky"
"read:notifications": "Vidieť vaše oznámenia"
"write:notifications": "Pracovať s vašimi notifikáciami"
"read:reactions": "Vidieť vaše reakcie"
"write:reactions": "Upravovať vaše reakcie"
"write:votes": "Hlasovať v hlasovaniach"
"read:pages": "Vidieť vaše stránky"
@ -1050,10 +1040,6 @@ _permissions:
"write:user-groups": "Upraviť alebo odstrániť vaše skupiny"
"read:channels": "Čítať vaše kanály"
"write:channels": "Upravovať vaše kanály"
"read:gallery": "Vidieť vašu galériu"
"write:gallery": "Upravovať vašu galériu"
"read:gallery-likes": "Vidieť zoznam obľúbených príspevkov z galérie"
"write:gallery-likes": "Upraviť zoznam obľúbených príspevov z galérie"
_auth:
shareAccess: "Prajete si povoliť \"{name}\", aby mal prístup k tomuto účtu?"
shareAccessAsk: "Naozaj chcete povoliť tejto aplikácii prístup k tomuto účtu?"
@ -1257,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

@ -74,7 +74,7 @@ followers: "Följare"
followsYou: "Följer dig"
createList: "Skapa lista"
manageLists: "Hantera lista"
error: "Fel!"
error: "Fel"
somethingHappened: "Ett fel har uppstått"
retry: "Försök igen"
pageLoadError: "Det gick inte att ladda sidan."
@ -183,15 +183,17 @@ clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte fede
clearCachedFiles: "Rensa cache"
clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?"
blockedInstances: "Blockerade instanser"
blockedInstancesDescription: "Lista adressnamn av instanser som du vill blockera.\
\ Listade instanser kommer inte längre kommunicera med denna instans."
blockedInstancesDescription: "Skriv de instansernas domäner som du vill blockera.\
\ Uppradade instanser kommer inte längre kunna kommunicera med denna instans. Icke\
\ ASCII domännamn måste skrivas i punycode. Subdomäner till de uppradade instanserna\
\ kommer också blockeras."
muteAndBlock: "Tystningar och blockeringar"
mutedUsers: "Tystade användare"
blockedUsers: "Blockerade användare"
noUsers: "Det finns inga användare"
editProfile: "Redigera profil"
noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?"
pinLimitExceeded: "Du kan inte fästa fler noter"
pinLimitExceeded: "Du kan inte fästa fler noter."
intro: "FoundKey har installerats! Vänligen skapa en adminanvändare."
done: "Klar"
processing: "Bearbetar..."
@ -208,7 +210,7 @@ publishing: "Publiceras"
notResponding: "Svarar inte"
changePassword: "Ändra lösenord"
security: "Säkerhet"
retypedNotMatch: "Inmatningen matchar inte"
retypedNotMatch: "Inmatningen matchar inte."
currentPassword: "Nuvarande lösenord"
newPassword: "Nytt lösenord"
newPasswordRetype: "Bekräfta lösenord"
@ -284,3 +286,35 @@ _deck:
list: "Listor"
mentions: "Omnämningar"
_services: {}
botFollowRequiresApproval: Följarförfrågningar från botmarkerade konton kräver manuellt
godkännande
home: Hem
activity: Akitivitet
images: Bilder
birthday: Födelsedag
yearsOld: '{age} år gammal'
stopActivityDeliveryDescription: Lokala aktiviteter kommer inte skickas till denna
instans. Mottagande av aktiviteter fungerar som innan.
remoteUserCaution: Eftersom användaren är ifrån en fjärran instans så kan informationen
vara inkomplett.
registeredDate: Blev medlem vid
location: Plats
theme: Teman
exportAll: Exportera alla
exportSelected: Exportera valda
showLess: Dölj
keepOriginalUploadingDescription: Sparar den ursprungliga bilden som den är. Om avstängd
så kommer en version som visas på webben genereras vid uppladning.
fromDrive: Från Drive
fromUrl: Från URL
uploadFromUrl: Ladda upp via en URL
uploadFromUrlDescription: URL till filen som du vill ladda upp
uploadFromUrlRequested: Förfrågade uppladningar
uploadFromUrlMayTakeTime: Det tar kanske ett tag innan uppladningen är färdig.
explore: Upptäck
messageRead: Läs
noMoreHistory: Det finns ingen mer historik
startMessaging: Inled en ny chatt
agreeTo: Jag godkänner användarvillkoren {0}
tos: Användarevillkoren
start: Börja

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

@ -183,14 +183,16 @@ clearCachedFiles: "Очистити кеш"
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
blockedInstances: "Заблоковані інстанси"
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені\
\ інстанси більше не зможуть спілкуватися з цим інстансом."
\ інстанси більше не зможуть спілкуватися з цим інстансом. Назви доменів не в ASCII\
\ кодуванні мають бути вказані в кодуванні punycode. Піддомени вказаних доменів\
\ також будуть заблоковані."
muteAndBlock: "Заглушення і блокування"
mutedUsers: "Заглушені користувачі"
blockedUsers: "Заблоковані користувачі"
noUsers: "Немає користувачів"
editProfile: "Редагувати обліковий запис"
noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?"
pinLimitExceeded: "Більше записів не можна закріпити"
pinLimitExceeded: "Більше записів закріпити не можна."
intro: "Встановлення FoundKey завершено! Будь ласка, створіть обліковий запис адміністратора."
done: "Готово"
processing: "Обробка"
@ -548,7 +550,7 @@ smtpPass: "Пароль"
emptyToDisableSmtpAuth: "Залиште назву користувача і пароль пустими для вимкнення\
\ підтвердження SMTP"
smtpSecure: "Використовувати безумовне шифрування SSL/TLS для з'єднань SMTP"
smtpSecureInfo: "Вимкніть при використанні STARTTLS "
smtpSecureInfo: "Вимкніть при використанні STARTTLS ."
testEmail: "Тестовий email"
wordMute: "Блокування слів"
regexpError: "Помилка регулярного виразу"
@ -580,7 +582,7 @@ abuseReports: "Скарги"
reportAbuse: "Поскаржитись"
reportAbuseOf: "Поскаржитись на {name}"
fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги."
abuseReported: "Дякуємо, вашу скаргу було відправлено. "
abuseReported: "Дякуємо, вашу скаргу було відправлено."
reporter: "Репортер"
reporteeOrigin: "Про кого повідомлено"
reporterOrigin: "Хто повідомив"
@ -666,7 +668,6 @@ editCode: "Редагувати вихідний текст"
apply: "Застосувати"
receiveAnnouncementFromInstance: "Отримувати оповіщення з інстансу"
emailNotification: "Сповіщення електронною поштою"
publish: "Опублікувати"
useReactionPickerForContextMenu: "Відкривати палітру реакцій правою кнопкою"
typingUsers: "Стук клавіш. Це {users}…"
goBack: "Назад"
@ -678,8 +679,6 @@ hide: "Сховати"
indefinitely: "Ніколи"
_ffVisibility:
public: "Опублікувати"
_gallery:
unlike: "Не вподобати"
_email:
_follow:
title: "Новий підписник"
@ -698,7 +697,7 @@ _nsfw:
ignore: "Не приховувати NSFW медіа"
force: "Приховувати всі медіа файли"
_mfm:
cheatSheet: " Довідка MFM"
cheatSheet: "Довідка MFM"
intro: "MFM це ексклюзивна мова розмітки тексту в FoundKey, яку можна використовувати\
\ в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "FoundKey розширює світ Федіверсу"
@ -849,7 +848,7 @@ _tutorial:
step5_4: "Якщо користувач має замок при імені, то йому потрібно буде вручну підтвердити\
\ вашу заявку на підписку."
step6_1: "Тепер ви повинні бачити записи інших користувачів на вашій стрічці подій."
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
\ користувачів."
step6_3: "Щоб \"відреагувати\", нажміть на знак плюс \"+\" на записі і виберіть\
\ емоджі яким ви хочете \"відреагувати\"."
@ -875,7 +874,6 @@ _permissions:
"write:mutes": "Змінювати список ігнорованих"
"write:notes": "Писати і видаляти нотатки"
"read:notifications": "Переглядати сповіщення"
"read:reactions": "Переглядати реакції"
"write:reactions": "Змінювати реакції"
"write:votes": "Голосувати в опитуваннях"
"read:pages": "Переглядати сторінки"
@ -918,7 +916,7 @@ _widgets:
button: "Кнопка"
onlineUsers: "Користувачі онлайн"
jobQueue: "Черга завдань"
serverMetric: "Показники сервера "
serverMetric: "Показники сервера"
aiscript: "Консоль AiScript"
_cw:
hide: "Сховати"
@ -1095,3 +1093,26 @@ _deck:
mentions: "Згадки"
direct: "Особисте"
_services: {}
exportAll: Експортувати все
exportSelected: Експортувати обране
signinHistoryExpires: Дані про минулі спроби входу автоматично видаляються через 60
днів з метою дотримання законодавства.
addDescription: Додати опис
userPagePinTip: Ви можете показувати тут дописи вибравши «Закріпити в профілі» в меню
окремих дописів.
unrenoteAllConfirm: Ви впевнені, що хочете скасувати всі поширення цього запису?
unrenoteAll: Скасувати всі поширення
renoteMute: Приховати поширення
renoteUnmute: Показати поширення
quitFullView: Вийти з повного перегляду
notSpecifiedMentionWarning: Цей допис містить згадки користувачів не вказаних як одержувачі
userInfo: Інформація про користувача
unknown: Невідомо
hideOnlineStatus: Приховати онлайн статус
deleteAllFiles: Видалити всі файли
clear: Повернутися
markAllAsRead: Позначити все як прочитане
unlikeConfirm: Дійсно видалити ваше вподобання?
fullView: Повний перегляд
showLess: Показати менше
jumpToSpecifiedDate: Перейти до вказаної дати

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"
@ -666,7 +666,6 @@ editCode: "Chỉnh sửa mã"
apply: "Áp dụng"
receiveAnnouncementFromInstance: "Nhận thông báo từ máy chủ này"
emailNotification: "Thông báo email"
publish: "Đăng"
useReactionPickerForContextMenu: "Nhấn chuột phải để mở bộ chọn biểu cảm"
typingUsers: "{users} đang nhập…"
jumpToSpecifiedDate: "Đến một ngày cụ thể"
@ -704,10 +703,7 @@ switch: "Chuyển đổi"
noMaintainerInformationWarning: "Chưa thiết lập thông tin vận hành."
noBotProtectionWarning: "Bảo vệ Bot chưa thiết lập."
configure: "Thiết lập"
postToGallery: "Tạo tút có ảnh"
gallery: "Thư viện ảnh"
recentPosts: "Tút gần đây"
popularPosts: "Tút được xem nhiều nhất"
shareWithNote: "Chia sẻ kèm với tút"
emailNotConfiguredWarning: "Chưa đặt địa chỉ email."
ratio: "Tỷ lệ"
@ -810,11 +806,6 @@ _forgotPassword:
\ viên."
contactAdmin: "Máy chủ này không hỗ trợ sử dụng địa chỉ email, vui lòng liên hệ\
\ với quản trị viên để đặt lại mật khẩu của bạn."
_gallery:
my: "Kho Ảnh"
liked: "Tút Đã Thích"
like: "Thích"
unlike: "Bỏ thích"
_email:
_follow:
title: "đã theo dõi bạn"
@ -942,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"
@ -1050,7 +1041,6 @@ _permissions:
"write:notes": "Soạn hoặc xóa tút"
"read:notifications": "Xem thông báo của tôi"
"write:notifications": "Quản lý thông báo của tôi"
"read:reactions": "Xem lượt biểu cảm của tôi"
"write:reactions": "Sửa lượt biểu cảm của tôi"
"write:votes": "Bình chọn"
"read:pages": "Xem trang của tôi"
@ -1061,10 +1051,6 @@ _permissions:
"write:user-groups": "Sửa hoặc xóa nhóm của tôi"
"read:channels": "Xem kênh của tôi"
"write:channels": "Sửa kênh của tôi"
"read:gallery": "Xem kho ảnh của tôi"
"write:gallery": "Sửa kho ảnh của tôi"
"read:gallery-likes": "Xem danh sách các tút đã thích trong thư viện của tôi"
"write:gallery-likes": "Sửa danh sách các tút đã thích trong thư viện của tôi"
_auth:
shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?"
shareAccessAsk: "Bạn có chắc muốn cho phép ứng dụng này truy cập vào tài khoản của\

View file

@ -619,7 +619,6 @@ editCode: "编辑代码"
apply: "应用"
receiveAnnouncementFromInstance: "从实例接收通知"
emailNotification: "邮件通知"
publish: "发布"
useReactionPickerForContextMenu: "单击右键打开回应工具栏"
typingUsers: "{users}正在输入"
jumpToSpecifiedDate: "跳转到特定日期"
@ -646,7 +645,7 @@ instanceBlocking: "被阻拦的实例"
selectAccount: "选择账户"
switchAccount: "切换账户"
enabled: "已启用"
disabled: "已禁用 "
disabled: "已禁用"
quickAction: "快捷操作"
user: "用户"
administration: "管理"
@ -655,10 +654,7 @@ switch: "切换"
noMaintainerInformationWarning: "管理人员信息未设置。"
noBotProtectionWarning: "Bot保护未设置。"
configure: "设置"
postToGallery: "发送到图库"
gallery: "图库"
recentPosts: "最新发布"
popularPosts: "热门投稿"
shareWithNote: "在帖子中分享"
emailNotConfiguredWarning: "电子邮件地址未设置。"
ratio: "比率"
@ -749,11 +745,6 @@ _forgotPassword:
enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。"
ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。"
contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。"
_gallery:
my: "我的图库"
liked: "喜欢的图片"
like: "喜欢"
unlike: "取消喜欢"
_email:
_follow:
title: "你有新的关注者"
@ -963,7 +954,6 @@ _permissions:
"write:notes": "撰写或删除帖子"
"read:notifications": "查看通知"
"write:notifications": "管理通知"
"read:reactions": "查看回应"
"write:reactions": "回应操作"
"write:votes": "投票"
"read:pages": "查看页面"
@ -974,10 +964,6 @@ _permissions:
"write:user-groups": "操作用户组"
"read:channels": "查看频道"
"write:channels": "管理频道"
"read:gallery": "浏览图库"
"write:gallery": "操作图库"
"read:gallery-likes": "读取喜欢的图片"
"write:gallery-likes": "操作喜欢的图片"
_auth:
shareAccess: "您要授权允许“{name}”访问您的帐户吗?"
shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?"

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: "管理"
@ -618,7 +618,6 @@ editCode: "編輯代碼"
apply: "套用"
receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知"
emailNotification: "郵件通知"
publish: "發佈"
useReactionPickerForContextMenu: "點擊右鍵開啟回應工具欄"
typingUsers: "{users}輸入中..."
jumpToSpecifiedDate: "跳轉到特定日期"
@ -654,10 +653,7 @@ switch: "切換"
noMaintainerInformationWarning: "尚未設定管理員信息。"
noBotProtectionWarning: "尚未設定Bot防護。"
configure: "設定"
postToGallery: "發佈到相簿"
gallery: "相簿"
recentPosts: "最新貼文"
popularPosts: "熱門的貼文"
shareWithNote: "在貼文中分享"
emailNotConfiguredWarning: "沒有設定電子郵件地址"
ratio: "%"
@ -746,13 +742,8 @@ _accountDelete:
inProgress: "正在刪除"
_forgotPassword:
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 "
_gallery:
my: "我的貼文"
liked: "喜歡的貼文"
like: "讚"
unlike: "收回喜歡"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。"
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。"
_email:
_follow:
title: "您有新的追隨者"
@ -786,7 +777,7 @@ _mfm:
url: "URL"
urlDescription: "可以展示URL位址。"
link: "鏈接"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。"
bold: "粗體"
boldDescription: "可以將文字顯示为粗體来強調。"
small: "縮小"
@ -804,7 +795,7 @@ _mfm:
quote: "引用"
quoteDescription: "可以用來表示引用的内容。"
emoji: "自訂表情符號"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。"
search: "搜尋"
searchDescription: "您可以顯示所輸入的搜索框。"
flip: "翻轉"
@ -962,7 +953,6 @@ _permissions:
"write:notes": "撰寫或刪除貼文"
"read:notifications": "查看通知"
"write:notifications": "編輯通知"
"read:reactions": "查看情感"
"write:reactions": "編輯情感"
"write:votes": "投票"
"read:pages": "顯示頁面"
@ -973,10 +963,6 @@ _permissions:
"write:user-groups": "編輯使用者群組"
"read:channels": "已查看的頻道"
"write:channels": "編輯頻道"
"read:gallery": "瀏覽圖庫"
"write:gallery": "操作圖庫"
"read:gallery-likes": "讀取喜歡的圖片"
"write:gallery-likes": "操作喜歡的圖片"
_auth:
shareAccess: "要授權「“{name}”」存取您的帳戶嗎?"
shareAccessAsk: "您確定要授權這個應用程式使用您的帳戶嗎?"
@ -1015,7 +1001,7 @@ _widgets:
button: "按鈕"
onlineUsers: "線上的用戶"
jobQueue: "佇列"
serverMetric: "服務器指標 "
serverMetric: "服務器指標"
aiscript: "AiScript控制台"
aichan: "小藍"
_cw:
@ -1031,7 +1017,7 @@ _poll:
expiration: "期限"
infinite: "無期限"
at: "結束時間"
after: "進度指定 "
after: "進度指定"
deadlineDate: "截止日期"
deadlineTime: "小時"
duration: "時長"
@ -1047,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

@ -5,8 +5,8 @@ export class registryRemoveDomain1675375940759 {
await queryRunner.query(`DROP INDEX "public"."IDX_0a72bdfcdb97c0eca11fe7ecad"`);
await queryRunner.query(`ALTER TABLE "registry_item" DROP COLUMN "domain"`);
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "key" TYPE text USING "key"::text`);
// delete existing duplicated entries, keeping the latest updated one
await queryRunner.query(`DELETE FROM "registry_item" AS "a" WHERE "updatedAt" != (SELECT MAX("updatedAt") FROM "registry_item" AS "b" WHERE "a"."userId" = "b"."userId" AND "a"."key" = "b"."key" AND "a"."scope" = "b"."scope" GROUP BY "userId", "key", "scope")`);
// delete existing duplicated entries, keeping the latest created one
await queryRunner.query(`DELETE FROM "registry_item" AS "a" WHERE "id" != (SELECT MAX("id") FROM "registry_item" AS "b" WHERE "a"."userId" = "b"."userId" AND "a"."key" = "b"."key" AND "a"."scope" = "b"."scope" GROUP BY "userId", "key", "scope")`);
await queryRunner.query(`ALTER TABLE "registry_item" ADD CONSTRAINT "UQ_b8d6509f847331273ab99daccc7" UNIQUE ("userId", "key", "scope")`);
}

View file

@ -0,0 +1,13 @@
export class removeUnused1678427401214 {
name = 'removeUnused1678427401214'
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedPages"`);
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedClipId"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedClipId" character varying(32)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedPages" character varying(512) array NOT NULL DEFAULT '{/featured,/channels,/explore,/pages,/about-misskey}'`);
}
}

View file

@ -18,7 +18,13 @@ const ev = new Xev();
* Init process
*/
export async function boot(): Promise<void> {
process.title = `FoundKey (${cluster.isPrimary ? 'master' : 'worker'})`;
if (envOption.disableClustering) {
process.title = "Foundkey";
} else if (cluster.isPrimary) {
process.title = "Foundkey (master)";
} else if (cluster.isWorker) {
process.title = `Foundkey (${process.env.mode})`;
}
if (cluster.isPrimary || envOption.disableClustering) {
await masterMain();

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

@ -82,17 +82,6 @@ export class Meta {
})
public blockedHosts: string[];
@Column('varchar', {
length: 512, array: true, default: '{/featured,/channels,/explore,/pages,/about-foundkey}',
})
public pinnedPages: string[];
@Column({
...id(),
nullable: true,
})
public pinnedClipId: Clip['id'] | null;
@Column('varchar', {
length: 512,
nullable: true,

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

@ -270,16 +270,14 @@ export const UserRepository = db.getRepository(User).extend({
const followingCount = profile == null ? null :
(profile.ffVisibility === 'public') || isMe ? user.followingCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followingCount :
(profile.ffVisibility === 'followers') && relation?.isFollowing ? user.followingCount :
null;
const followersCount = profile == null ? null :
(profile.ffVisibility === 'public') || isMe ? user.followersCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount :
(profile.ffVisibility === 'followers') && relation?.isFollowing ? user.followersCount :
null;
const falsy = opts.detail ? false : undefined;
const packed = {
id: user.id,
name: user.name,
@ -287,10 +285,10 @@ export const UserRepository = db.getRepository(User).extend({
host: user.host,
avatarUrl: this.getAvatarUrlSync(user),
avatarBlurhash: user.avatar?.blurhash || null,
isAdmin: user.isAdmin || falsy,
isModerator: user.isModerator || falsy,
isBot: user.isBot || falsy,
isCat: user.isCat || falsy,
isAdmin: user.isAdmin,
isModerator: user.isModerator,
isBot: user.isBot,
isCat: user.isCat,
instance: !user.host ? undefined : userInstanceCache.fetch(user.host)
.then(instance => !instance ? undefined : {
name: instance.name,
@ -312,8 +310,8 @@ export const UserRepository = db.getRepository(User).extend({
bannerUrl: user.banner ? DriveFiles.getPublicUrl(user.banner, false) : null,
bannerBlurhash: user.banner?.blurhash || null,
isLocked: user.isLocked,
isSilenced: user.isSilenced || falsy,
isSuspended: user.isSuspended || falsy,
isSilenced: user.isSilenced,
isSuspended: user.isSuspended,
description: profile!.description,
location: profile!.location,
birthday: profile!.birthday,
@ -369,7 +367,7 @@ export const UserRepository = db.getRepository(User).extend({
mutedInstances: profile!.mutedInstances,
mutingNotificationTypes: profile!.mutingNotificationTypes,
emailNotificationTypes: profile!.emailNotificationTypes,
showTimelineReplies: user.showTimelineReplies || falsy,
showTimelineReplies: user.showTimelineReplies,
federateBlocks: user!.federateBlocks,
} : {}),

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

@ -4,7 +4,6 @@ import { request } from '@/remote/activitypub/request.js';
import { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc.js';
import Logger from '@/services/logger.js';
import { Instances } from '@/models/index.js';
import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index.js';
import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
import { toPuny } from '@/misc/convert-host.js';
import { StatusError } from '@/misc/fetch.js';
@ -13,8 +12,6 @@ import { DeliverJobData } from '@/queue/types.js';
const logger = new Logger('deliver');
let latest: string | null = null;
export default async (job: Bull.Job<DeliverJobData>) => {
const { host } = new URL(job.data.to);
const puny = toPuny(host);
@ -22,12 +19,14 @@ export default async (job: Bull.Job<DeliverJobData>) => {
if (await shouldSkipInstance(puny)) return 'skip';
try {
if (latest !== (latest = JSON.stringify(job.data.content, null, 2))) {
logger.debug(`delivering ${latest}`);
if (Array.isArray(job.data.content)) {
await Promise.all(
job.data.content.map(x => request(job.data.user, job.data.to, x))
);
} else {
await request(job.data.user, job.data.to, job.data.content);
}
await request(job.data.user, job.data.to, job.data.content);
// Update stats
registerOrFetchInstanceDoc(host).then(i => {
Instances.update(i.id, {
@ -38,13 +37,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
});
fetchInstanceMetadata(i);
instanceChart.requestSent(i.host, true);
apRequestChart.deliverSucc();
federationChart.deliverd(i.host, true);
});
return 'Success';
} catch (res) {
// Update stats
registerOrFetchInstanceDoc(host).then(i => {
@ -53,10 +46,6 @@ export default async (job: Bull.Job<DeliverJobData>) => {
latestStatus: res instanceof StatusError ? res.statusCode : null,
isNotResponding: true,
});
instanceChart.requestSent(i.host, false);
apRequestChart.deliverFail();
federationChart.deliverd(i.host, false);
});
if (res instanceof StatusError) {
@ -67,7 +56,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
return `${res.statusCode} ${res.statusMessage}`;
}
// 5xx etc.
// 5xx etc., throwing an Error will make Bull retry
throw new Error(`${res.statusCode} ${res.statusMessage}`);
} else {
// DNS error, socket error, timeout ...

View file

@ -1,5 +1,5 @@
import { CacheableRemoteUser } from '@/models/entities/user.js';
import deleteNode from '@/services/note/delete.js';
import { deleteNotes } from '@/services/note/delete.js';
import { getApLock } from '@/misc/app-lock.js';
import { deleteMessage } from '@/services/messages/delete.js';
import { DbResolver } from '@/remote/activitypub/db-resolver.js';
@ -29,7 +29,7 @@ export default async function(actor: CacheableRemoteUser, uri: string): Promise<
return 'skip: cant delete other actors note';
}
await deleteNode(actor, note);
await deleteNotes([note], actor);
return 'ok: note deleted';
}
} finally {

View file

@ -11,7 +11,7 @@ export default async (actor: CacheableRemoteUser, activity: ILike) => {
await extractEmojis(activity.tag || [], actor.host).catch(() => null);
return await createReaction(actor, note, activity._misskey_reaction || activity.content || activity.name).catch(e => {
return await createReaction(actor, note, activity.content || activity.name).catch(e => {
if (e.id === '51c42bb4-931a-456b-bff7-e5a8a70dd298') {
return 'skip: already reacted';
} else {

View file

@ -1,6 +1,6 @@
import { Notes } from '@/models/index.js';
import { CacheableRemoteUser } from '@/models/entities/user.js';
import deleteNote from '@/services/note/delete.js';
import { deleteNotes } from '@/services/note/delete.js';
import { IAnnounce, getApId } from '@/remote/activitypub/type.js';
export const undoAnnounce = async (actor: CacheableRemoteUser, activity: IAnnounce): Promise<string> => {
@ -13,6 +13,6 @@ export const undoAnnounce = async (actor: CacheableRemoteUser, activity: IAnnoun
if (!note) return 'skip: no such Announce';
await deleteNote(actor, note);
await deleteNotes([note], actor);
return 'ok: deleted';
};

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');
}
}
@ -207,8 +209,6 @@ export async function createNote(value: string | IObject, resolver: Resolver, si
let text: string | null = null;
if (note.source?.mediaType === 'text/x.misskeymarkdown' && typeof note.source.content === 'string') {
text = note.source.content;
} else if (typeof note._misskey_content !== 'undefined') {
text = note._misskey_content;
} else if (typeof note.content === 'string') {
text = fromHtml(note.content, quote?.uri);
}

View file

@ -23,7 +23,7 @@ export async function extractPollFromQuestion(source: string | IObject, resolver
.map(x => x.name!);
const votes = question[multiple ? 'anyOf' : 'oneOf']!
.map(x => x.replies && x.replies.totalItems || x._misskey_votes || 0);
.map(x => x.replies && x.replies.totalItems || 0);
return {
choices,

View file

@ -35,10 +35,7 @@ export const renderActivity = (x: any): IActivity | null => {
value: 'schema:value',
// Misskey
misskey: 'https://misskey-hub.net/ns#',
'_misskey_content': 'misskey:_misskey_content',
'_misskey_quote': 'misskey:_misskey_quote',
'_misskey_reaction': 'misskey:_misskey_reaction',
'_misskey_votes': 'misskey:_misskey_votes',
'_misskey_talk': 'misskey:_misskey_talk',
'isCat': 'misskey:isCat',
// vcard

View file

@ -15,7 +15,6 @@ export const renderLike = async (noteReaction: NoteReaction, note: Note) => {
object: note.uri ? note.uri : `${config.url}/notes/${noteReaction.noteId}`,
... (reaction !== '\u2b50' ? {
content: reaction,
_misskey_reaction: reaction,
} : {}),
} as any;

View file

@ -145,7 +145,6 @@ export default async function renderNote(note: Note, dive = true, isTalk = false
attributedTo,
summary,
content,
_misskey_content: text,
source: {
content: text,
mediaType: 'text/x.misskeymarkdown',

View file

@ -11,7 +11,6 @@ export default async function renderQuestion(user: { id: User['id'] }, note: Not
content: note.text || '',
[poll.multiple ? 'anyOf' : 'oneOf']: poll.choices.map((text, i) => ({
name: text,
_misskey_votes: poll.votes[i],
replies: {
type: 'Collection',
totalItems: poll.votes[i],

View file

@ -4,7 +4,16 @@ import { getUserKeypair } from '@/misc/keypair-store.js';
import { User } from '@/models/entities/user.js';
import { getResponse } from '@/misc/fetch.js';
import { createSignedPost, createSignedGet } from './ap-request.js';
import { apRequestChart, federationChart, instanceChart } from '@/services/chart/index.js';
/**
* Post an activity to an inbox. Automatically updates the statistics
* on succeeded or failed delivery attempts.
*
* @param user http-signature user
* @param url The URL of the inbox.
* @param object The Activity or other object to be posted to the inbox.
*/
export async function request(user: { id: User['id'] }, url: string, object: any): Promise<void> {
const body = JSON.stringify(object);
@ -22,14 +31,28 @@ export async function request(user: { id: User['id'] }, url: string, object: any
},
});
await getResponse({
url,
method: req.request.method,
headers: req.request.headers,
body,
// don't allow redirects on the inbox
redirect: 'error',
});
const { host } = new URL(url);
try {
await getResponse({
url,
method: req.request.method,
headers: req.request.headers,
body,
// don't allow redirects on the inbox
redirect: 'error',
});
instanceChart.requestSent(host, true);
apRequestChart.deliverSucc();
federationChart.deliverd(host, true);
} catch (err) {
instanceChart.requestSent(host, false);
apRequestChart.deliverFail();
federationChart.deliverd(host, false);
throw err;
}
}
/**

View file

@ -55,7 +55,7 @@ export function getApId(value: string | Object): string {
export function getOneApId(value: ApObject): string {
if (Array.isArray(value)) {
// find the first valid ID
for (const id of value) {
for (const x of value) {
try {
return getApId(x);
} catch {
@ -171,7 +171,6 @@ export const isQuestion = (object: IObject): object is IQuestion =>
interface IQuestionChoice {
name?: string;
replies?: ICollection;
_misskey_votes?: number;
}
export interface ITombstone extends IObject {
type: 'Tombstone';
@ -282,7 +281,7 @@ export interface IRemove extends IActivity {
export interface ILike extends IActivity {
type: 'Like' | 'EmojiReaction' | 'EmojiReact';
_misskey_reaction?: string;
content?: string;
}
export interface IAnnounce extends IActivity {

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';
@ -104,6 +104,7 @@ import * as ep___clips_show from './endpoints/clips/show.js';
import * as ep___clips_update from './endpoints/clips/update.js';
import * as ep___drive from './endpoints/drive.js';
import * as ep___drive_files from './endpoints/drive/files.js';
import * as ep___drive_show from './endpoints/drive/show.js';
import * as ep___drive_files_attachedNotes from './endpoints/drive/files/attached-notes.js';
import * as ep___drive_files_checkExistence from './endpoints/drive/files/check-existence.js';
import * as ep___drive_files_create from './endpoints/drive/files/create.js';
@ -298,14 +299,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 +334,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],
@ -400,6 +401,7 @@ const eps = [
['clips/update', ep___clips_update],
['drive', ep___drive],
['drive/files', ep___drive_files],
['drive/show', ep___drive_show],
['drive/files/attached-notes', ep___drive_files_attachedNotes],
['drive/files/check-existence', ep___drive_files_checkExistence],
['drive/files/create', ep___drive_files_create],

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',
@ -288,8 +288,6 @@ export default define(meta, paramDef, async () => {
defaultLightTheme: instance.defaultLightTheme,
defaultDarkTheme: instance.defaultDarkTheme,
enableEmail: instance.enableEmail,
pinnedPages: instance.pinnedPages,
pinnedClipId: instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles,
useStarForReactionFallback: instance.useStarForReactionFallback,

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'],

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