Compare commits
	
		
			14 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 834cb2ea1a | ||
|   | d82769abd4 | ||
|   | adf01ed4a4 | ||
|   | 09c007b3aa | ||
|   | 526ff177aa | ||
|   | 0e40d4e796 | ||
|   | 172ebab7bd | ||
|   | aa4493fe5c | ||
|   | a68a88f79e | ||
|   | 1de7dc94e1 | ||
|   | 59cb7992e2 | ||
|   | 87b15df47b | ||
|   | 6932d86240 | ||
|   | 87f61e714a | 
							
								
								
									
										2613
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										2613
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -8,7 +8,7 @@ | ||||
| [](http://makeapullrequest.com) | ||||
| [](https://github.com/humanetech-community/awesome-humane-tech) | ||||
|  | ||||
| **A forever evolving, sophisticated microblogging platform.** | ||||
| **A forever evolving, professional microblogging platform.** | ||||
|  | ||||
| <p align="justify"> | ||||
| <a href="https://join.misskey.page/">Misskey</a> is a decentralized microblogging platform born on Earth. | ||||
|   | ||||
| @@ -14,8 +14,12 @@ noNotes: "لم يتم العثور على أية ملاحظات" | ||||
| noNotifications: "ليس هناك أية اشعارات" | ||||
| instance: "مثيل الخادم" | ||||
| settings: "الاعدادات" | ||||
| basicSettings: "الاعدادات الأساسية" | ||||
| otherSettings: "إعدادات أخرى" | ||||
| openInWindow: "افتح في نافذة جديدة" | ||||
| profile: "الملف التعريفي" | ||||
| timeline: "الخيط الزمني" | ||||
| noAccountDescription: "لم يكتب هذا المستخدم سيرته بعد." | ||||
| login: "لِج" | ||||
| loggingIn: "جارٍ تسجيل الدخول" | ||||
| logout: "الخروج" | ||||
| @@ -32,18 +36,26 @@ copyContent: "انسخ المحتوى" | ||||
| copyLink: "انسخ الرابط" | ||||
| delete: "حذف" | ||||
| deleteAndEdit: "إزالة وإعادة الصياغة" | ||||
| deleteAndEditConfirm: "أمتأكد من حذف الملاحظة؟ ستفقد كل مشاركاتها، والتفاعلات، والردود عليها." | ||||
| addToList: "أضفه إلى قائمة" | ||||
| sendMessage: "أرسل رسالة" | ||||
| copyUsername: "انسخ اسم المستخدم" | ||||
| searchUser: "ابحث عن مستخدمين" | ||||
| reply: "رد" | ||||
| loadMore: "عرض المزيد" | ||||
| youGotNewFollower: "يتابعك" | ||||
| receiveFollowRequest: "تلقيت طلب متابعة" | ||||
| followRequestAccepted: "قُبل طلب المتابعة" | ||||
| mention: "أشر الى" | ||||
| mentions: "الإشارات" | ||||
| directNotes: "الملاحظات المباشرة" | ||||
| importAndExport: "إستورد / صدر" | ||||
| import: "استيراد" | ||||
| export: "تصدير" | ||||
| files: "الملفات" | ||||
| download: "تنزيل" | ||||
| driveFileDeleteConfirm: "أمتأكد من حذف ملف {name}؟ كل الملاحظات المُرفق بها هذا الملف ستحذف." | ||||
| unfollowConfirm: "أمتأكد من إلغاء متابعة {name}؟" | ||||
| lists: "القوائم" | ||||
| noLists: "ليس لديك أية قائمة" | ||||
| note: "ملاحظة" | ||||
| @@ -53,8 +65,10 @@ followers: "المتابِعين" | ||||
| followsYou: "يتابعك" | ||||
| createList: "إنشاء قائمة" | ||||
| manageLists: "إدارة القوائم" | ||||
| error: "حدث خطأ ما" | ||||
| error: "خطأ" | ||||
| somethingHappened: "حدث خطأ" | ||||
| retry: "حاول مجددًا" | ||||
| pageLoadError: "فشل تحميل الصفحة" | ||||
| enterListName: "اسم القائمة" | ||||
| privacy: "الخصوصية" | ||||
| makeFollowManuallyApprove: "القبول يدويا طلبات الإشتراك" | ||||
| @@ -71,16 +85,24 @@ you: "أنت" | ||||
| clickToShow: "اضغط للعرض" | ||||
| sensitive: "محتوى حساس" | ||||
| add: "إضافة" | ||||
| reaction: "تفاعل" | ||||
| rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات" | ||||
| attachCancel: "أزل المرفق" | ||||
| enterFileName: "ادخل اسم الملف" | ||||
| mute: "اكتم" | ||||
| unmute: "إلغاء الكتم" | ||||
| block: "احجب" | ||||
| unblock: "إلغاء الحجب" | ||||
| blockConfirm: "أمتأكد من حجب هذا الحساب؟" | ||||
| unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟" | ||||
| selectList: "اختر قائمة" | ||||
| editWidgetsExit: "تم" | ||||
| customEmojis: "إيموجي مخصص" | ||||
| addEmoji: "إضافة إيموجي" | ||||
| cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة" | ||||
| autoAcceptFollowed: "اقبل طلبات المتابعة تلقائيا من الحسابات المتابَعة" | ||||
| addAcount: "إضافة حساب" | ||||
| loginFailed: "فشل الولوج" | ||||
| showOnRemote: "رؤيته على مثيل الخادم البُعدي" | ||||
| general: "الرئيسية" | ||||
| wallpaper: "خلفية الشاشة" | ||||
| @@ -88,6 +110,7 @@ setWallpaper: "استخدم خلفية الشاشة" | ||||
| removeWallpaper: "إزالة خلفية الشاشة" | ||||
| searchWith: "البحث: {q}" | ||||
| youHaveNoLists: "لا تمتلك أية قائمة" | ||||
| followConfirm: "أتريد متابعة {name}؟" | ||||
| proxyAccount: "حساب وكيل البروكسي" | ||||
| host: "المضيف" | ||||
| selectUser: "حدّد مستخدمًا" | ||||
| @@ -96,6 +119,8 @@ annotation: "التعليقات" | ||||
| federation: "الفديرالية" | ||||
| instances: "مثيل الخادم" | ||||
| latestRequestSentAt: "آخر طلب أرسِل في" | ||||
| latestRequestReceivedAt: "آخر طلب تُلقي في" | ||||
| storageUsage: "مساحة التخزين المستخدمة" | ||||
| charts: "المنحنيات البيانية" | ||||
| perHour: "في الساعة" | ||||
| perDay: "في اليوم" | ||||
| @@ -127,7 +152,6 @@ processing: "المعالجة جارية" | ||||
| preview: "معاينة" | ||||
| default: "افتراضي" | ||||
| noCustomEmojis: "ليس هناك إيموجيات" | ||||
| customEmojisOfRemote: "الإيموجيات القادمة مِن مثيلات الخوادم الأخرى" | ||||
| federating: "الفديرالية جارية" | ||||
| blocked: "محجوب" | ||||
| suspended: "مُعلّق" | ||||
| @@ -313,7 +337,6 @@ total: "المجموع" | ||||
| weekOverWeekChanges: "أسبوعيا" | ||||
| dayOverDayChanges: "يوميا" | ||||
| appearance: "المظهر" | ||||
| clinetSettings: "إعدادات التطبيق" | ||||
| accountSettings: "إعدادات الحساب" | ||||
| promotion: "ترقية" | ||||
| promote: "روِّج" | ||||
| @@ -366,6 +389,7 @@ _theme: | ||||
|   make: "إنشاء قالب" | ||||
|   alpha: "الشفافية" | ||||
|   keys: | ||||
|     mention: "أشر الى" | ||||
|     messageBg: "خلفية الدردشة" | ||||
| _sfx: | ||||
|   note: "الملاحظات" | ||||
| @@ -508,7 +532,9 @@ _notification: | ||||
|   youWereFollowed: "يتابعك" | ||||
|   _types: | ||||
|     follow: "المتابَعون" | ||||
|     mention: "أشر الى" | ||||
|     quote: "اقتبس" | ||||
|     reaction: "تفاعل" | ||||
| _deck: | ||||
|   _columns: | ||||
|     notifications: "الإشعارات" | ||||
|   | ||||
| @@ -16,6 +16,9 @@ noNotes: "Keine Notizen" | ||||
| noNotifications: "Keine Benachrichtigungen" | ||||
| instance: "Instanz" | ||||
| settings: "Einstellungen" | ||||
| basicSettings: "Allgemeine Einstellungen" | ||||
| otherSettings: "Andere Einstellungen" | ||||
| openInWindow: "In neuem Fenster öffnen" | ||||
| profile: "Profil" | ||||
| timeline: "Chronik" | ||||
| noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt." | ||||
| @@ -40,6 +43,7 @@ deleteAndEditConfirm: "Möchtest du diese Notiz wirklich löschen und bearbeiten | ||||
| addToList: "Zu Liste hinzufügen" | ||||
| sendMessage: "Nachricht senden" | ||||
| copyUsername: "Benutzernamen kopieren" | ||||
| searchUser: "Benutzersuche" | ||||
| reply: "Antworten" | ||||
| loadMore: "Mehr anzeigen" | ||||
| youGotNewFollower: "Du hast einen neuen Follower" | ||||
| @@ -66,8 +70,11 @@ followers: "Gefolgt von" | ||||
| followsYou: "Folgt dir" | ||||
| createList: "Liste erstellen" | ||||
| manageLists: "Listen verwalten" | ||||
| error: "Ein Problem ist aufgetreten" | ||||
| error: "Fehler" | ||||
| somethingHappened: "Ein Fehler ist aufgetreten" | ||||
| retry: "Wiederholen" | ||||
| pageLoadError: "Laden der Seite fehlgeschlagen." | ||||
| pageLoadErrorDescription: "Dieser Fehler wird meist durch Netzwerkfehler oder den Browser-Cache verursacht. Versuche den Browser-Cache zu leeren und es nach kurzer Zeit noch einmal zu probieren." | ||||
| enterListName: "Listennamen eingeben" | ||||
| privacy: "Privatsphäre" | ||||
| makeFollowManuallyApprove: "Follow-Anfragen benötigen Bestätigung" | ||||
| @@ -106,6 +113,8 @@ unsuspendConfirm: "Möchtest du die Sperrung dieses Benutzers wirklich aufheben? | ||||
| selectList: "Wähle eine Liste aus" | ||||
| selectAntenna: "Antenne auswählen" | ||||
| selectWidget: "Widget auswählen" | ||||
| editWidgets: "Widgets bearbeiten" | ||||
| editWidgetsExit: "Fertig" | ||||
| customEmojis: "Benutzerdefinierte Emojis" | ||||
| emoji: "Emoji" | ||||
| emojiName: "Emojiname" | ||||
| @@ -177,7 +186,6 @@ processing: "In Bearbeitung" | ||||
| preview: "Vorschau" | ||||
| default: "Standard" | ||||
| noCustomEmojis: "Es existieren keine Emojis" | ||||
| customEmojisOfRemote: "Emojis von anderen Instanzen" | ||||
| noJobs: "Es gibt keine Jobs" | ||||
| federating: "Föderiert" | ||||
| blocked: "Blockiert" | ||||
| @@ -445,7 +453,7 @@ total: "Gesamt" | ||||
| weekOverWeekChanges: "Wöchentlich" | ||||
| dayOverDayChanges: "Täglich" | ||||
| appearance: "Aussehen" | ||||
| clinetSettings: "Client-Einstellungen" | ||||
| clientSettings: "Client-Einstellungen" | ||||
| accountSettings: "Benutzerkonto-Einstellungen" | ||||
| promotion: "Hervorgehoben" | ||||
| promote: "Hervorheben" | ||||
| @@ -476,6 +484,8 @@ newNoteRecived: "Es gibt neue Notizen" | ||||
| sounds: "Töne" | ||||
| listen: "Anhören" | ||||
| none: "Keine" | ||||
| showInPage: "In Seiten anzeigen" | ||||
| popout: "Pop-Up" | ||||
| volume: "Lautstärke" | ||||
| details: "Details" | ||||
| chooseEmoji: "Wähle ein Emoji" | ||||
| @@ -518,7 +528,6 @@ enableInfiniteScroll: "Automatisch mehr Notizen laden" | ||||
| visibility: "Sichtbarkeit" | ||||
| poll: "Umfrage" | ||||
| useCw: "Inhalt verstecken" | ||||
| fixedWidgetsPosition: "Widgetposition fixieren" | ||||
| enablePlayer: "Video-Player öffnen" | ||||
| disablePlayer: "Video-Player schließen" | ||||
| expandTweet: "Tweet ausklappen" | ||||
| @@ -564,8 +573,26 @@ overview: "Übersicht" | ||||
| logs: "Logs" | ||||
| delayed: "Verzögert" | ||||
| database: "Datenbank" | ||||
| channel: "Kanal" | ||||
| channel: "Kanäle" | ||||
| create: "Erstellen" | ||||
| notificationSetting: "Benachrichtigungseinstellungen" | ||||
| notificationSettingDesc: "Wähle die Art der anzuzeigenden Benachrichtigung" | ||||
| useGlobalSetting: "Globale Einstellung verwenden" | ||||
| useGlobalSettingDesc: "Wenn dies eingeschaltet ist, werden die Benachrichtigungseinstellungen deines Benutzerkontos verwendet. Wenn dies ausgeschaltet ist, können individuelle Einstellungen vorgenommen werden." | ||||
| other: "Andere" | ||||
| regenerateLoginToken: "Login-Token regenerieren" | ||||
| regenerateLoginTokenDescription: "Den bei Logins intern verwendeten Token regenerieren. Normalerweise wird dies nicht benötigt. Bei Regeneration werden alle Geräte ausgeloggt." | ||||
| setMultipleBySeparatingWithSpace: "Trenne Elemente durch ein Leerzeichen um mehrere Einstellungen zu kofigurieren." | ||||
| fileIdOrUrl: "Datei-ID oder URL" | ||||
| chatOpenBehavior: "Verhalten des Chatfensters bei Öffnung" | ||||
| sample: "Beispiel" | ||||
| abuseReports: "Melden" | ||||
| reportAbuse: "Melden" | ||||
| reportAbuseOf: "{name} melden" | ||||
| fillAbuseReportDescription: "Bitte gib Details für diese Meldung an. Falls es sich um eine spezielle Notiz handelt, bitte gib dessen URL an." | ||||
| abuseReported: "Die Meldung wurde versendet. Vielen Dank." | ||||
| send: "Senden" | ||||
| abuseMarkAsResolved: "Meldung als gelöst markieren" | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "Automatisch aktualisieren" | ||||
|   dialog: "Warnungsfenster zeigen" | ||||
| @@ -576,13 +603,13 @@ _channel: | ||||
|   setBanner: "Kanalbanner festlegen" | ||||
|   removeBanner: "Kanalbanner entfernen" | ||||
|   featured: "Trends" | ||||
|   owned: "Besitzer" | ||||
|   following: "Folgt" | ||||
|   owned: "Besitzt" | ||||
|   following: "Gefolgt" | ||||
|   usersCount: "{n} Teilnehmer" | ||||
|   notesCount: "{n} Notizen" | ||||
| _sidebar: | ||||
|   full: "Voll" | ||||
|   icon: "Profilbild" | ||||
|   icon: "Symbol" | ||||
|   hide: "Ausblenden" | ||||
| _wordMute: | ||||
|   muteWords: "Wort stummschalten" | ||||
| @@ -782,6 +809,7 @@ _widgets: | ||||
|   photos: "Fotos" | ||||
|   digitalClock: "Digitaluhr" | ||||
|   federation: "Föderation" | ||||
|   postForm: "Neue Notiz anfertigen" | ||||
| _cw: | ||||
|   hide: "Ausblenden" | ||||
|   show: "Mehr anzeigen" | ||||
| @@ -1238,14 +1266,17 @@ _notification: | ||||
|   youWereInvitedToGroup: "Du wurdest in eine Gruppe eingeladen" | ||||
|   _types: | ||||
|     all: "Alle" | ||||
|     follow: "Folgt" | ||||
|     mention: "Erwähnung" | ||||
|     follow: "Neue Follower" | ||||
|     mention: "Erwähnungen" | ||||
|     reply: "Antworten" | ||||
|     renote: "Renote" | ||||
|     quote: "Zitieren" | ||||
|     renote: "Renotes" | ||||
|     quote: "Zitationen" | ||||
|     reaction: "Reaktionen" | ||||
|     pollVote: "Umfragen" | ||||
|     receiveFollowRequest: "Follow-Anfragen" | ||||
|     pollVote: "Antworten auf Umfragen" | ||||
|     receiveFollowRequest: "Follow-Anfrage erhalten" | ||||
|     followRequestAccepted: "Follow-Anfrage akzeptiert" | ||||
|     groupInvited: "Gruppeneinladung erhalten" | ||||
|     app: "Benachrichtigungen von Apps" | ||||
| _deck: | ||||
|   alwaysShowMainColumn: "Hauptspalte immer zeigen" | ||||
|   columnAlign: "Spalten ausrichten" | ||||
|   | ||||
| @@ -16,6 +16,9 @@ noNotes: "No notes" | ||||
| noNotifications: "No notifications" | ||||
| instance: "Instance" | ||||
| settings: "Settings" | ||||
| basicSettings: "Basic Settings" | ||||
| otherSettings: "Other Settings" | ||||
| openInWindow: "Open in new window" | ||||
| profile: "Profile" | ||||
| timeline: "Timeline" | ||||
| noAccountDescription: "This user has not written their bio yet." | ||||
| @@ -29,7 +32,7 @@ users: "Users" | ||||
| addUser: "Add a user" | ||||
| favorite: "Favorite" | ||||
| favorites: "Favorites" | ||||
| unfavorite: "Undo favorite" | ||||
| unfavorite: "Unfavorite" | ||||
| pin: "Pin to profile" | ||||
| unpin: "Unpin from profile" | ||||
| copyContent: "Copy contents" | ||||
| @@ -40,6 +43,7 @@ deleteAndEditConfirm: "Are you sure you want to delete this note and edit it? Yo | ||||
| addToList: "Add to list" | ||||
| sendMessage: "Send a message" | ||||
| copyUsername: "Copy username" | ||||
| searchUser: "User search" | ||||
| reply: "Reply" | ||||
| loadMore: "Load more" | ||||
| youGotNewFollower: "Followed you" | ||||
| @@ -66,8 +70,11 @@ followers: "Followers" | ||||
| followsYou: "Follows you" | ||||
| createList: "Create list" | ||||
| manageLists: "Manage lists" | ||||
| error: "Something happened :(" | ||||
| error: "Error" | ||||
| somethingHappened: "An error occurred" | ||||
| retry: "Retry" | ||||
| pageLoadError: "Failed to load page" | ||||
| pageLoadErrorDescription: "This is normally caused by network errors or the browser's cache. Try clearung the cache and then try again after waiting a little while." | ||||
| enterListName: "List name" | ||||
| privacy: "Privacy" | ||||
| makeFollowManuallyApprove: "Follow requests require approval" | ||||
| @@ -106,6 +113,8 @@ unsuspendConfirm: "Are you sure you that want to unsuspend this account?" | ||||
| selectList: "Select a list" | ||||
| selectAntenna: "Select an Antenna" | ||||
| selectWidget: "Select a widget" | ||||
| editWidgets: "Edit widgets" | ||||
| editWidgetsExit: "Done" | ||||
| customEmojis: "Custom Emoji" | ||||
| emoji: "Emoji" | ||||
| emojiName: "Emoji name" | ||||
| @@ -177,7 +186,6 @@ processing: "Processing" | ||||
| preview: "Preview" | ||||
| default: "Default" | ||||
| noCustomEmojis: "There are no emojis" | ||||
| customEmojisOfRemote: "Emojis from other instances" | ||||
| noJobs: "There are no jobs" | ||||
| federating: "Federating" | ||||
| blocked: "Blocked" | ||||
| @@ -445,7 +453,7 @@ total: "Total" | ||||
| weekOverWeekChanges: "Weekly" | ||||
| dayOverDayChanges: "Daily" | ||||
| appearance: "Appearance" | ||||
| clinetSettings: "Client Settings" | ||||
| clientSettings: "Client settings" | ||||
| accountSettings: "Account Settings" | ||||
| promotion: "Promoted" | ||||
| promote: "Promote" | ||||
| @@ -476,6 +484,8 @@ newNoteRecived: "You've got a new note" | ||||
| sounds: "Sounds" | ||||
| listen: "Listen" | ||||
| none: "None" | ||||
| showInPage: "Show in Pages" | ||||
| popout: "Pop-out" | ||||
| volume: "Volume" | ||||
| details: "Details" | ||||
| chooseEmoji: "Choose an emoji" | ||||
| @@ -518,7 +528,6 @@ enableInfiniteScroll: "Enable infinite scrolling" | ||||
| visibility: "Visiblility" | ||||
| poll: "Poll" | ||||
| useCw: "Hide content" | ||||
| fixedWidgetsPosition: "Make widget position fixed" | ||||
| enablePlayer: "Open video player" | ||||
| disablePlayer: "Close video player" | ||||
| expandTweet: "Expand tweet" | ||||
| @@ -564,8 +573,26 @@ overview: "Overview" | ||||
| logs: "Logs" | ||||
| delayed: "Delayed" | ||||
| database: "Database" | ||||
| channel: "Channel" | ||||
| channel: "Channels" | ||||
| create: "Create" | ||||
| notificationSetting: "Notification settings" | ||||
| notificationSettingDesc: "Select the type of notification to display" | ||||
| useGlobalSetting: "Use global setting" | ||||
| useGlobalSettingDesc: "If turned on, your account's notification settings will be used. If turned off, individual configurations can be made." | ||||
| other: "Other" | ||||
| regenerateLoginToken: "Regenerate login token" | ||||
| regenerateLoginTokenDescription: "Regenerate the token used internally during login. Normally this action is not necessary. If regenerated, all devices will be logged out." | ||||
| setMultipleBySeparatingWithSpace: "You can set multiple by separating them with spaces." | ||||
| fileIdOrUrl: "File-ID or URL" | ||||
| chatOpenBehavior: "Behavior of the chat window when opened" | ||||
| sample: "Sample" | ||||
| abuseReports: "Reports" | ||||
| reportAbuse: "Report" | ||||
| reportAbuseOf: "Report {name}" | ||||
| fillAbuseReportDescription: "Please fill in the report details. If it is about a specific note, please include its URL." | ||||
| abuseReported: "Your report has been sent. Thank you very much." | ||||
| send: "Send" | ||||
| abuseMarkAsResolved: "Mark report as resolved" | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "Automatically reload" | ||||
|   dialog: "Show warning dialog" | ||||
| @@ -576,8 +603,8 @@ _channel: | ||||
|   setBanner: "Set banner" | ||||
|   removeBanner: "Remove banner" | ||||
|   featured: "Trending" | ||||
|   owned: "Owner" | ||||
|   following: "Following" | ||||
|   owned: "Owned" | ||||
|   following: "Followed" | ||||
|   usersCount: "{n} Participants" | ||||
|   notesCount: "{n} Notes" | ||||
| _sidebar: | ||||
| @@ -782,6 +809,7 @@ _widgets: | ||||
|   photos: "Photos" | ||||
|   digitalClock: "Digital clock" | ||||
|   federation: "Federation" | ||||
|   postForm: "Compose a note" | ||||
| _cw: | ||||
|   hide: "Hide" | ||||
|   show: "Load more" | ||||
| @@ -1238,14 +1266,17 @@ _notification: | ||||
|   youWereInvitedToGroup: "Invited to group" | ||||
|   _types: | ||||
|     all: "All" | ||||
|     follow: "Following" | ||||
|     mention: "Mention" | ||||
|     follow: "Follows" | ||||
|     mention: "Mentions" | ||||
|     reply: "Replies" | ||||
|     renote: "Renote" | ||||
|     quote: "Quote" | ||||
|     reaction: "Reaction" | ||||
|     pollVote: "Polls" | ||||
|     receiveFollowRequest: "Follow requests" | ||||
|     renote: "Renotes" | ||||
|     quote: "Quotes" | ||||
|     reaction: "Reactions" | ||||
|     pollVote: "Votes on polls" | ||||
|     receiveFollowRequest: "Follow request received" | ||||
|     followRequestAccepted: "Follow request accepted" | ||||
|     groupInvited: "Invited to groups" | ||||
|     app: "Notifications from apps" | ||||
| _deck: | ||||
|   alwaysShowMainColumn: "Always show main column" | ||||
|   columnAlign: "Align columns" | ||||
|   | ||||
| @@ -66,7 +66,6 @@ followers: "Seguidores" | ||||
| followsYou: "Te sigue" | ||||
| createList: "Crear lista" | ||||
| manageLists: "Administrar listas" | ||||
| error: "Ocurrió un problema" | ||||
| retry: "Reintentar" | ||||
| enterListName: "Ingrese nombre de lista" | ||||
| privacy: "Privacidad" | ||||
| @@ -177,7 +176,6 @@ processing: "Procesando" | ||||
| preview: "Vista previa" | ||||
| default: "Predeterminado" | ||||
| noCustomEmojis: "No hay emojis personalizados" | ||||
| customEmojisOfRemote: "Emojis remotos" | ||||
| noJobs: "No hay trabajos" | ||||
| federating: "Federando" | ||||
| blocked: "Bloqueando" | ||||
| @@ -445,7 +443,6 @@ total: "Total" | ||||
| weekOverWeekChanges: "Dif semanal" | ||||
| dayOverDayChanges: "Dif diaria" | ||||
| appearance: "Apariencia" | ||||
| clinetSettings: "Ajustes del cliente" | ||||
| accountSettings: "Ajustes de cuenta" | ||||
| promotion: "Promovido" | ||||
| promote: "Promover" | ||||
| @@ -518,7 +515,6 @@ enableInfiniteScroll: "Activar scroll infinito" | ||||
| visibility: "Visibilidad" | ||||
| poll: "Encuesta" | ||||
| useCw: "Esconder contenidos" | ||||
| fixedWidgetsPosition: "Fijar la posición de los widgets" | ||||
| enablePlayer: "Abrir reproductor" | ||||
| disablePlayer: "Cerrar reproductor" | ||||
| expandTweet: "Expandir tweet" | ||||
| @@ -566,6 +562,10 @@ delayed: "atrasado" | ||||
| database: "Base de datos" | ||||
| channel: "Canal" | ||||
| create: "Crear" | ||||
| notificationSetting: "Ajustes de Notificaciones" | ||||
| notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar" | ||||
| useGlobalSetting: "Usar ajustes globales" | ||||
| useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de la cuenta, al desactivarse se pueden hacer configuraciones particulares." | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "Recargar automáticamente" | ||||
|   dialog: "Mostrar diálogo de advertencia" | ||||
| @@ -782,6 +782,7 @@ _widgets: | ||||
|   photos: "Fotos" | ||||
|   digitalClock: "Reloj digital" | ||||
|   federation: "Federación" | ||||
|   postForm: "Formulario" | ||||
| _cw: | ||||
|   hide: "Ocultar" | ||||
|   show: "Ver más" | ||||
| @@ -1244,8 +1245,11 @@ _notification: | ||||
|     renote: "Renotar" | ||||
|     quote: "Citar" | ||||
|     reaction: "Reacción" | ||||
|     pollVote: "Encuestas" | ||||
|     receiveFollowRequest: "Solicitudes de seguimiento" | ||||
|     pollVote: "Votado en la encuesta" | ||||
|     receiveFollowRequest: "Recibió una solicitud de seguimiento" | ||||
|     followRequestAccepted: "El seguimiento fue aceptado" | ||||
|     groupInvited: "Invitado al grupo" | ||||
|     app: "Notificaciones desde aplicaciones" | ||||
| _deck: | ||||
|   alwaysShowMainColumn: "Siempre mostrar la columna principal" | ||||
|   columnAlign: "Alinear columnas" | ||||
|   | ||||
| @@ -16,6 +16,9 @@ noNotes: "Aucune note" | ||||
| noNotifications: "Aucune notification" | ||||
| instance: "Instance" | ||||
| settings: "Paramètres" | ||||
| basicSettings: "Paramètres basiques" | ||||
| otherSettings: "Autres paramètres" | ||||
| openInWindow: "Ouvrir dans une nouvelle fenêtre" | ||||
| profile: "Profil" | ||||
| timeline: "Fil" | ||||
| noAccountDescription: "L’utilisateur·rice n’a pas encore renseigné de biographie de présentation sur son profil." | ||||
| @@ -40,6 +43,7 @@ deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la | ||||
| addToList: "Ajouter à une liste" | ||||
| sendMessage: "Envoyer un message" | ||||
| copyUsername: "Copier le nom d’utilisateur·rice" | ||||
| searchUser: "Chercher un·e utilisateur·rice" | ||||
| reply: "Répondre" | ||||
| loadMore: "Afficher plus …" | ||||
| youGotNewFollower: "Vous suit" | ||||
| @@ -66,8 +70,10 @@ followers: "Abonné·e·s" | ||||
| followsYou: "Vous suit" | ||||
| createList: "Créer une liste" | ||||
| manageLists: "Gérer les listes" | ||||
| error: "Une erreur est survenue" | ||||
| error: "Erreur" | ||||
| somethingHappened: "Une erreur est survenue" | ||||
| retry: "Réessayer" | ||||
| pageLoadError: "Le chargement de la page a échoué" | ||||
| enterListName: "Nom de la liste" | ||||
| privacy: "Confidentialité" | ||||
| makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement" | ||||
| @@ -106,6 +112,8 @@ unsuspendConfirm: "Êtes-vous sûr·e de vouloir annuler la suspension de ce com | ||||
| selectList: "Sélectionner une liste" | ||||
| selectAntenna: "Sélectionner une antenne" | ||||
| selectWidget: "Sélectionner un widget" | ||||
| editWidgets: "Modifier les widgets" | ||||
| editWidgetsExit: "Fait" | ||||
| customEmojis: "Émojis personnalisés" | ||||
| emoji: "Émoji" | ||||
| emojiName: "Nom de l’émoji" | ||||
| @@ -177,7 +185,6 @@ processing: "Traitement en cours" | ||||
| preview: "Prévisualisation" | ||||
| default: "Par défaut" | ||||
| noCustomEmojis: "Il n'y a pas d’émoji" | ||||
| customEmojisOfRemote: "Émojis provenant des autres instances" | ||||
| noJobs: "Il n’y a aucune tâche planifiée" | ||||
| federating: "En cours de fédération" | ||||
| blocked: "Bloqué·e" | ||||
| @@ -264,6 +271,7 @@ rename: "Renommer" | ||||
| avatar: "Avatar" | ||||
| banner: "Bannière" | ||||
| nsfw: "Contenu sensible" | ||||
| whenServerDisconnected: "Lorsque la connexion au serveur est perdue" | ||||
| disconnectedFromServer: "Déconnecté·e du serveur" | ||||
| reload: "Rafraîchir" | ||||
| doNothing: "Ignorer" | ||||
| @@ -444,7 +452,7 @@ total: "Total" | ||||
| weekOverWeekChanges: "Diff hebdo" | ||||
| dayOverDayChanges: "Diff quotidien" | ||||
| appearance: "Aspect" | ||||
| clinetSettings: "Paramètres du client" | ||||
| clientSettings: "Paramètres du client" | ||||
| accountSettings: "Paramètres du compte" | ||||
| promotion: "Promu" | ||||
| promote: "Promouvoir" | ||||
| @@ -474,6 +482,7 @@ newNoteRecived: "Vous avez une nouvelle note" | ||||
| sounds: "Sons" | ||||
| listen: "Écouter" | ||||
| none: "Rien" | ||||
| popout: "Fenêtre contextuelle" | ||||
| volume: "Volume" | ||||
| details: "Détails" | ||||
| chooseEmoji: "Choisissez un émoji" | ||||
| @@ -516,7 +525,6 @@ enableInfiniteScroll: "Activer le défilement infini" | ||||
| visibility: "Visibilité" | ||||
| poll: "Sondage" | ||||
| useCw: "Masquer le contenu" | ||||
| fixedWidgetsPosition: "Rendre la position du widget fixe" | ||||
| enablePlayer: "Activer le lecteur vidéo" | ||||
| disablePlayer: "Désactiver le lecteur vidéo" | ||||
| expandTweet: "Étendre le tweet" | ||||
| @@ -538,6 +546,7 @@ tokenRequested: "Autoriser l'accès au compte" | ||||
| pluginTokenRequestedDescription: "Ce plugin pourra utiliser les autorisations définies ici." | ||||
| notificationType: "Type de notifications" | ||||
| edit: "Editer" | ||||
| useStarForReactionFallback: "Utiliser ★ comme alternative si l’émoji de réaction est inconnu" | ||||
| emailConfig: "Configuration du serveur email" | ||||
| enableEmail: "Activer la distribution de courriel" | ||||
| emailConfigInfo: "Utilisé pour confirmer votre adresse de courriel et la réinitialisation de votre mot de passe en cas d’oubli." | ||||
| @@ -549,16 +558,45 @@ smtpUser: "Nom d’utilisateur·rice" | ||||
| smtpPass: "Mot de passe" | ||||
| emptyToDisableSmtpAuth: "Laisser le nom d’utilisateur et le mot de passe vides pour désactiver la vérification SMTP" | ||||
| smtpSecure: "Utiliser SSL/TLS implicitement dans les connexions SMTP" | ||||
| smtpSecureInfo: "Désactiver cette option lorsque STARTTLS est utilisé" | ||||
| testEmail: "Tester la distribution de courriel" | ||||
| wordMute: "Filtre de mots" | ||||
| userSaysSomething: "{name} a dit quelque chose" | ||||
| makeActive: "Activer" | ||||
| display: "Affichage" | ||||
| copy: "Copier" | ||||
| metrics: "Métriques" | ||||
| overview: "Aperçu" | ||||
| logs: "Journaux" | ||||
| delayed: "en retard" | ||||
| database: "Base de données" | ||||
| channel: "Canaux" | ||||
| create: "Créer" | ||||
| notificationSetting: "Paramètres des notifications " | ||||
| notificationSettingDesc: "Sélectionnez le type de notification à afficher" | ||||
| useGlobalSetting: "Utiliser paramètre général" | ||||
| other: "Autre" | ||||
| regenerateLoginToken: "Régénérer le jeton de connexion" | ||||
| setMultipleBySeparatingWithSpace: "Vous pouvez définir plus d’un, séparés par des espaces." | ||||
| fileIdOrUrl: "ID du fichier ou URL" | ||||
| chatOpenBehavior: "Comportement de la fenêtre de discussion lors de son ouverture" | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "Rechargement automatique" | ||||
| _channel: | ||||
|   create: "Créer un canal" | ||||
|   edit: "Éditer le canal" | ||||
|   removeBanner: "Supprimer la bannière" | ||||
|   featured: "Tendances" | ||||
|   usersCount: "{n} Participants" | ||||
|   notesCount: "{n} Notes" | ||||
| _sidebar: | ||||
|   full: "Complet" | ||||
|   icon: "Avatar" | ||||
|   hide: "Masquer" | ||||
| _wordMute: | ||||
|   muteWords: "Mot à mettre en sourdine" | ||||
|   muteWordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec un saut de ligne pour une condition OR." | ||||
|   mutedNotes: "Notes mises en sourdine" | ||||
| _theme: | ||||
|   explore: "Explorer les thèmes" | ||||
|   install: "Installer un thème" | ||||
| @@ -569,6 +607,8 @@ _theme: | ||||
|   invalid: "Le format du thème n'est pas valide" | ||||
|   make: "Créer un thème" | ||||
|   base: "Base" | ||||
|   addConstant: "Ajouter une constante" | ||||
|   constant: "Constante" | ||||
|   defaultValue: "Valeur par défaut" | ||||
|   color: "Couleur" | ||||
|   key: "Clé " | ||||
| @@ -594,6 +634,7 @@ _theme: | ||||
|     renote: "Renote" | ||||
|     divider: "Séparateur" | ||||
|     infoWarnFg: "Texte d’avertissement" | ||||
|     cwBg: "Arrière-plan du CW" | ||||
|     badge: "Badge" | ||||
|     messageBg: "Arrière plan de la discussion" | ||||
| _sfx: | ||||
| @@ -678,6 +719,8 @@ _permissions: | ||||
|   "write:page-likes": "Mettre à jour les favoris 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" | ||||
|   "write:channels": "Modifier les canaux" | ||||
| _auth: | ||||
|   shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?" | ||||
|   shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre compte?" | ||||
| @@ -711,6 +754,7 @@ _widgets: | ||||
|   photos: "Photos" | ||||
|   digitalClock: "Horloge numérique" | ||||
|   federation: "Fédération" | ||||
|   postForm: "Formulaire à publier" | ||||
| _cw: | ||||
|   hide: "Masquer" | ||||
|   show: "Afficher plus …" | ||||
| @@ -752,6 +796,7 @@ _visibility: | ||||
| _postForm: | ||||
|   replyPlaceholder: "Répondre à cette note ..." | ||||
|   quotePlaceholder: "Citez cette note ..." | ||||
|   channelPlaceholder: "Publier vers le canal" | ||||
|   _placeholders: | ||||
|     a: "Quoi de neuf ?" | ||||
|     b: "Quoi de neuf ?" | ||||
| @@ -1165,11 +1210,15 @@ _notification: | ||||
|   yourFollowRequestAccepted: "Votre demande d’abonnement a été accepté" | ||||
|   youWereInvitedToGroup: "Invité au groupe" | ||||
|   _types: | ||||
|     all: "Toutes" | ||||
|     follow: "Abonnements" | ||||
|     mention: "Mentionner" | ||||
|     reply: "Réponses" | ||||
|     renote: "Renote" | ||||
|     quote: "Citer" | ||||
|     reaction: "Réactions" | ||||
|     groupInvited: "Invité aux groupes" | ||||
|     app: "Notifications provenant des apps" | ||||
| _deck: | ||||
|   alwaysShowMainColumn: "Toujours afficher la colonne principale" | ||||
|   columnAlign: "Aligner les colonnes" | ||||
|   | ||||
| @@ -586,6 +586,13 @@ setMultipleBySeparatingWithSpace: "スペースで区切って複数設定でき | ||||
| fileIdOrUrl: "ファイルIDまたはURL" | ||||
| chatOpenBehavior: "チャットを開くときの動作" | ||||
| sample: "サンプル" | ||||
| abuseReports: "通報" | ||||
| reportAbuse: "通報" | ||||
| reportAbuseOf: "{name}を通報する" | ||||
| fillAbuseReportDescription: "通報理由の詳細を記入してください。対象のノートがある場合はそのURLも記入してください。" | ||||
| abuseReported: "内容が送信されました。ご報告ありがとうございました。" | ||||
| send: "送信" | ||||
| abuseMarkAsResolved: "対応済みにする" | ||||
|  | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "自動でリロード" | ||||
|   | ||||
| @@ -65,7 +65,6 @@ followers: "フォロワー" | ||||
| followsYou: "フォローされとるで" | ||||
| createList: "リスト作る" | ||||
| manageLists: "リストの管理" | ||||
| error: "問題が発生してん" | ||||
| retry: "もっぺんやってみる" | ||||
| enterListName: "リスト名を入れてや" | ||||
| privacy: "プライバシーってなんや?オカンの年齢か?" | ||||
| @@ -173,7 +172,6 @@ processing: "処理しとる" | ||||
| preview: "プレビュー" | ||||
| default: "デフォルト" | ||||
| noCustomEmojis: "絵文字はあらへん" | ||||
| customEmojisOfRemote: "リモートの絵文字" | ||||
| noJobs: "ジョブはあらへん" | ||||
| federating: "連合しとる" | ||||
| blocked: "ブロックしとる" | ||||
|   | ||||
| @@ -66,7 +66,6 @@ followers: "팔로워" | ||||
| followsYou: "당신을 팔로우합니다" | ||||
| createList: "리스트 만들기" | ||||
| manageLists: "리스트 관리" | ||||
| error: "오류가 발생했습니다" | ||||
| retry: "다시 시도" | ||||
| enterListName: "리스트 이름을 입력" | ||||
| privacy: "프라이버시" | ||||
| @@ -177,7 +176,6 @@ processing: "처리중" | ||||
| preview: "미리보기" | ||||
| default: "기본값" | ||||
| noCustomEmojis: "이모지가 없습니다" | ||||
| customEmojisOfRemote: "다른 인스턴스들의 이모지" | ||||
| noJobs: "작업이 없습니다" | ||||
| federating: "연합 중" | ||||
| blocked: "차단됨" | ||||
| @@ -443,7 +441,6 @@ remote: "리모트" | ||||
| total: "합계" | ||||
| weekOverWeekChanges: "지난주보다" | ||||
| dayOverDayChanges: "어제보다" | ||||
| clinetSettings: "클라이언트 설정" | ||||
| accountSettings: "계정 설정" | ||||
| promotion: "프로모션" | ||||
| promote: "프로모션하기" | ||||
| @@ -515,7 +512,6 @@ enableInfiniteScroll: "자동으로 좀 더 보기" | ||||
| visibility: "공개 범위" | ||||
| poll: "투표" | ||||
| useCw: "내용 숨기기" | ||||
| fixedWidgetsPosition: "위젯의 위치 고정" | ||||
| enablePlayer: "플레이어 열기" | ||||
| disablePlayer: "플레이어 닫기" | ||||
| expandTweet: "트윗 확장하기" | ||||
| @@ -708,6 +704,7 @@ _widgets: | ||||
|   photos: "사진" | ||||
|   digitalClock: "디지털 시계" | ||||
|   federation: "연합" | ||||
|   postForm: "글 입력란" | ||||
| _cw: | ||||
|   hide: "숨기기" | ||||
|   show: "더 보기" | ||||
| @@ -1165,7 +1162,6 @@ _notification: | ||||
|     renote: "Renote" | ||||
|     quote: "인용" | ||||
|     reaction: "리액션" | ||||
|     receiveFollowRequest: "팔로우 요청" | ||||
| _deck: | ||||
|   alwaysShowMainColumn: "메인 칼럼 항상 표시" | ||||
|   columnAlign: "칼럼 정렬" | ||||
|   | ||||
| @@ -1,2 +1,21 @@ | ||||
| --- | ||||
| _lang_: "język polski" | ||||
| search: "Szukaj" | ||||
| notifications: "Powiadomienia" | ||||
| username: "Nazwa użytkownika" | ||||
| password: "Hasło" | ||||
| ok: "OK" | ||||
| gotIt: "Rozumiem!" | ||||
| cancel: "Anuluj" | ||||
| enterUsername: "Wprowadź nazwę użytkownika" | ||||
| smtpUser: "Nazwa użytkownika" | ||||
| smtpPass: "Hasło" | ||||
| _sfx: | ||||
|   notification: "Powiadomienia" | ||||
| _widgets: | ||||
|   notifications: "Powiadomienia" | ||||
| _profile: | ||||
|   username: "Nazwa użytkownika" | ||||
| _deck: | ||||
|   _columns: | ||||
|     notifications: "Powiadomienia" | ||||
|   | ||||
| @@ -1,45 +1,894 @@ | ||||
| --- | ||||
| _lang_: "Русский язык" | ||||
| _lang_: "Русский" | ||||
| introMisskey: "Добро пожаловать! Misskey - это децентрализованный сервис микроблогов с открытым исходным кодом.\nСоздавайте «записи», чтобы поделиться происходящим или рассказать всем о себе 📡\nТакже Вы можете добавить быструю реакцию на все записи с помощью функции «реакция» 👍\nОткройте для себя новый мир 🚀" | ||||
| monthAndDay: "{day}.{month}" | ||||
| search: "Поиск" | ||||
| notifications: "Уведомления" | ||||
| username: "Имя пользователя" | ||||
| password: "Пароль" | ||||
| fetchingAsApObject: "Запрос на федерацию" | ||||
| ok: "Окей" | ||||
| gotIt: "Отлично" | ||||
| cancel: "Отмена" | ||||
| instance: "Экземпляр" | ||||
| enterUsername: "Введите имя пользователя" | ||||
| renotedBy: "{user} репостнул(а)" | ||||
| noNotes: "Нет постов" | ||||
| noNotifications: "Нет уведомлений" | ||||
| instance: "Узел" | ||||
| settings: "Настройки" | ||||
| basicSettings: "Основное" | ||||
| otherSettings: "Прочee" | ||||
| openInWindow: "Открыть в окне" | ||||
| profile: "Профиль" | ||||
| timeline: "Лента" | ||||
| noAccountDescription: "Описание отсутствует" | ||||
| login: "Войти" | ||||
| loggingIn: "Выполняется вход" | ||||
| logout: "Выйти" | ||||
| signup: "Регистрация" | ||||
| uploading: "Загрузка..." | ||||
| save: "Сохранить" | ||||
| users: "Пользователи" | ||||
| addUser: "Добавить пользователя" | ||||
| favorite: "Избранное" | ||||
| favorites: "Избранное" | ||||
| unfavorite: "Удалить из избранных" | ||||
| pin: "Закрепить" | ||||
| unpin: "Открепить" | ||||
| copyContent: "Скопировать содержимое" | ||||
| copyLink: "Скопировать ссылку" | ||||
| delete: "Удалить" | ||||
| deleteAndEdit: "Удалить и отредактировать" | ||||
| deleteAndEditConfirm: "Удалить этот пост и отредактировать заново? Все реакции, репосты и ответы на него также будут удалены." | ||||
| addToList: "Добавить в список" | ||||
| sendMessage: "Отправить сообщение" | ||||
| copyUsername: "Скопировать имя пользователя" | ||||
| searchUser: "Поиск людей" | ||||
| reply: "Ответить" | ||||
| loadMore: "Показать еще" | ||||
| youGotNewFollower: "Новый подписчик" | ||||
| receiveFollowRequest: "Запрос на подписку" | ||||
| followRequestAccepted: "Запрос на подписку принят" | ||||
| mention: "Упоминание" | ||||
| mentions: "Упоминания" | ||||
| directNotes: "Прямые сообщения" | ||||
| importAndExport: "Импорт / Экспорт" | ||||
| files: "Файл" | ||||
| instances: "Экземпляр" | ||||
| import: "Импорт" | ||||
| export: "Экспорт" | ||||
| files: "Файлы" | ||||
| download: "Скачать" | ||||
| driveFileDeleteConfirm: "Удалить файл {name} ? Посты с ним также будут удалены" | ||||
| unfollowConfirm: "Удалить из подписок {name}?" | ||||
| exportRequested: "Вы запросили экспорт. Это может занять некоторое время. По завершению результат будет добавлен на «Диск»." | ||||
| importRequested: "Вы запросили импорт. Это может занять некоторое время." | ||||
| lists: "Списки" | ||||
| noLists: "Нет списков" | ||||
| note: "Пост" | ||||
| notes: "Посты" | ||||
| following: "Подписки" | ||||
| followers: "Подписчики" | ||||
| followsYou: "Подписчики" | ||||
| createList: "Создать список" | ||||
| manageLists: "Управление списками" | ||||
| error: "Ошибка" | ||||
| somethingHappened: "Что-то пошло не так" | ||||
| retry: "Повторить попытку" | ||||
| pageLoadError: "Ошибка загрузки страницы" | ||||
| pageLoadErrorDescription: "Обычно это вызвано сетевыми ошибками или кэшем браузера. Попробуйте очистить кэш, а затем попробуйте еще раз, немного подождав." | ||||
| enterListName: "Введите имя списка" | ||||
| privacy: "Приватность" | ||||
| makeFollowManuallyApprove: "Подтверждать подписчиков вручную" | ||||
| defaultNoteVisibility: "Видимость постов по умолчанию" | ||||
| follow: "Подписки" | ||||
| followRequest: "Запрос на подписку" | ||||
| followRequests: "Запросы на подписку" | ||||
| unfollow: "Отписаться" | ||||
| followRequestPending: "Ожидающие запросы на подписку" | ||||
| enterEmoji: "Введите эмодзи" | ||||
| renote: "Репост" | ||||
| unrenote: "Отмена репоста" | ||||
| quote: "Цитата" | ||||
| pinnedNote: "Закреплённый пост" | ||||
| you: "Вы" | ||||
| clickToShow: "Нажмите для просмотра" | ||||
| sensitive: "NSFW" | ||||
| add: "Добавить" | ||||
| reaction: "Реакции" | ||||
| reactionSettingDescription: "Выберите реакции для показа в селекторе реакций" | ||||
| rememberNoteVisibility: "Запоминать видимость поста" | ||||
| attachCancel: "Удалить вложение" | ||||
| markAsSensitive: "Отметить как NSFW" | ||||
| unmarkAsSensitive: "Снять отметку NSFW" | ||||
| enterFileName: "Введите имя файла" | ||||
| mute: "Скрыть" | ||||
| unmute: "Показывать" | ||||
| block: "Заблокировать" | ||||
| unblock: "Разблокировать" | ||||
| suspend: "Приостановить" | ||||
| unsuspend: "Возобновить" | ||||
| blockConfirm: "Заблокировать?" | ||||
| unblockConfirm: "Разблокировать?" | ||||
| suspendConfirm: "Приостановить?" | ||||
| unsuspendConfirm: "Возобновить?" | ||||
| selectList: "Выберите список" | ||||
| selectAntenna: "Выберите антенну" | ||||
| selectWidget: "Выберите виджет" | ||||
| editWidgets: "Редактировать виджет" | ||||
| editWidgetsExit: "Завершить" | ||||
| customEmojis: "Кастомные эмодзи" | ||||
| emoji: "Эмодзи" | ||||
| emojiName: "Название эмодзи" | ||||
| emojiUrl: "URL изображения" | ||||
| addEmoji: "Добавить эмодзи" | ||||
| settingGuide: "Рекомендуемые настройки" | ||||
| cacheRemoteFiles: "Кешировать внешние файлы" | ||||
| cacheRemoteFilesDescription: "Когда эта настройка отключена, удаленные файлы загружаются непосредственно из удаленного экземпляра. Отключение этого параметра уменьшит использование хранилища, но увеличит трафик, так как эскизы не будут генерироваться." | ||||
| flagAsBot: "Учётка бота" | ||||
| flagAsCat: "Учётка кота" | ||||
| autoAcceptFollowed: "Принимать подписки автоматически" | ||||
| addAcount: "Добавить учётку" | ||||
| loginFailed: "Ошибка входа" | ||||
| showOnRemote: "Посмотреть оригинал" | ||||
| general: "Общее" | ||||
| wallpaper: "Обои" | ||||
| setWallpaper: "Установить обои" | ||||
| removeWallpaper: "Удалить обои" | ||||
| searchWith: "Искать в {q}" | ||||
| youHaveNoLists: "Нет списков" | ||||
| followConfirm: "Подписаться на {name}?" | ||||
| proxyAccount: "Прокси аккаунт" | ||||
| proxyAccountDescription: "Учетная запись прокси - это учетная запись, которая при определенных условиях действует в качестве удаленного последователя для пользователей. Например, когда пользователь добавляет удаленного пользователя в список, действия удаленного пользователя не будут доставляться экземпляру, если ни один локальный пользователь не следует за этим пользователем, поэтому вместо него будет действовать учетная запись прокси." | ||||
| host: "Хост" | ||||
| selectUser: "Выбор пользователя" | ||||
| recipient: "Кому" | ||||
| annotation: "Описание" | ||||
| federation: "Федиверс" | ||||
| instances: "Узел" | ||||
| registeredAt: "Присоединился(ась)" | ||||
| latestRequestSentAt: "Последний запрос отправлен" | ||||
| latestRequestReceivedAt: "Последний запрос, поступивший по адресу" | ||||
| latestStatus: "Последний статус" | ||||
| storageUsage: "Использовано" | ||||
| charts: "Диаграммы" | ||||
| perHour: "Каждый час" | ||||
| perDay: "Каждый день" | ||||
| blockThisInstance: "Блокировать этот инстанс" | ||||
| operations: "Операции" | ||||
| software: "Программы" | ||||
| version: "Версия" | ||||
| metadata: "Метаданные" | ||||
| withNFiles: "{n} файлов" | ||||
| monitor: "Монитор" | ||||
| jobQueue: "Очередь заданий" | ||||
| cpuAndMemory: "CPU и память" | ||||
| network: "Сеть" | ||||
| disk: "Диск" | ||||
| instanceInfo: "Информация об узле" | ||||
| statistics: "Статистика" | ||||
| clearQueue: "Очистить очередь" | ||||
| clearQueueConfirmTitle: "Очистить очередь?" | ||||
| clearQueueConfirmText: "Любые недоставленные записи, оставшиеся в очереди, не будут переданы. Обычно эта операция НЕ нужна." | ||||
| clearCachedFiles: "Очистить кэш" | ||||
| clearCachedFilesConfirm: "Хотите удалить все кешированные файлы?" | ||||
| blockedInstances: "Заблокированные узлы" | ||||
| blockedInstancesDescription: "Введите список узлов, которые хотите заблокировать. Они не смогут взаимодействовать с этим." | ||||
| muteAndBlock: "Скрытие и блокировка" | ||||
| mutedUsers: "Скрытые пользователи" | ||||
| blockedUsers: "Заблокированные Пользователи" | ||||
| noUsers: "Нет пользователей" | ||||
| editProfile: "Изменить профиль" | ||||
| noteDeleteConfirm: "Вы хотите удалить эту запись?" | ||||
| pinLimitExceeded: "Превышен лимит" | ||||
| intro: "Misskey установлен! Создайте учетную запись администратора" | ||||
| done: "Завершено" | ||||
| processing: "Обработка" | ||||
| preview: "Превью" | ||||
| default: "По умолчанию" | ||||
| noCustomEmojis: "Нет эмодзи" | ||||
| noJobs: "Нет заданий" | ||||
| federating: "федеративный" | ||||
| blocked: "Заблокировано" | ||||
| suspended: "Приостановленный" | ||||
| all: "Все" | ||||
| subscribing: "Подписка" | ||||
| publishing: "Публикация" | ||||
| notResponding: "Нет ответа" | ||||
| instanceFollowing: "Подписаться на инстанс" | ||||
| instanceFollowers: "Подписчики инстанса" | ||||
| instanceUsers: "Пользователи инстанса" | ||||
| changePassword: "Изменить пароль" | ||||
| security: "Безопасность" | ||||
| retypedNotMatch: "Нет совпадений" | ||||
| currentPassword: "Текущий пароль" | ||||
| newPassword: "Новый пароль" | ||||
| newPasswordRetype: "Новый пароль (повторно):" | ||||
| attachFile: "Прикрепить файлы" | ||||
| more: "Ещё!" | ||||
| featured: "Рекомендуемые" | ||||
| usernameOrUserId: "Имя пользователя или ID" | ||||
| noSuchUser: "Пользователь не найден" | ||||
| lookup: "Подписка" | ||||
| announcements: "Уведомление" | ||||
| imageUrl: "URL-адрес изображения" | ||||
| remove: "Удалить" | ||||
| removed: "Удалено" | ||||
| removeAreYouSure: "Хочешь удалить \"{x}\"?" | ||||
| saved: "Сохранено" | ||||
| messaging: "Сообщения" | ||||
| upload: "Загрузить" | ||||
| fromDrive: "С диска" | ||||
| fromUrl: "URL-адрес" | ||||
| uploadFromUrl: "Загрузить по ссылке" | ||||
| uploadFromUrlDescription: "URL-адрес файла, который вы хотите загрузить" | ||||
| uploadFromUrlRequested: "Загрузить запрос" | ||||
| uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время." | ||||
| explore: "Обзор" | ||||
| games: "Игры Misskey" | ||||
| messageRead: "Прочитанных" | ||||
| noMoreHistory: "Истории больше нет" | ||||
| startMessaging: "Отправить сообщение" | ||||
| nUsersRead: "прочитано {n}" | ||||
| agreeTo: "Я согласен с {0}" | ||||
| tos: "Пользовательское соглашение" | ||||
| start: "Начать" | ||||
| home: "Главная" | ||||
| remoteUserCaution: "Эта информация может быть неактуальной, так как пользователь является удаленным пользователем." | ||||
| activity: "Активность" | ||||
| images: "Изображение" | ||||
| birthday: "День рождения" | ||||
| yearsOld: "{age} лет" | ||||
| registeredDate: "Дата регистрации" | ||||
| location: "Местоположение" | ||||
| theme: "Тема" | ||||
| themeForLightMode: "Темы для использования в световом режиме" | ||||
| themeForDarkMode: "Темы для использования в темном режиме" | ||||
| light: "Светлый" | ||||
| dark: "Тёмный" | ||||
| lightThemes: "Светлые темы" | ||||
| darkThemes: "Тёмные темы" | ||||
| syncDeviceDarkMode: "Синхронизировать с темным режимом устройства" | ||||
| drive: "Диск" | ||||
| fileName: "Имя файла" | ||||
| selectFile: "Выберите Файл" | ||||
| selectFiles: "Выберите Файл" | ||||
| selectFolder: "Выберите папку" | ||||
| selectFolders: "Выберите папку" | ||||
| renameFile: "Переименовать файл" | ||||
| folderName: "Имя папки" | ||||
| createFolder: "Создать папку" | ||||
| renameFolder: "Переименовать папку" | ||||
| deleteFolder: "Удалить папку" | ||||
| addFile: "Добавить файл" | ||||
| emptyDrive: "Диск пуст" | ||||
| emptyFolder: "Папка пуста" | ||||
| unableToDelete: "Удаление невозможно" | ||||
| inputNewFileName: "Введите имя нового файла" | ||||
| inputNewFolderName: "Пожалуйста, введите новое имя папки!" | ||||
| circularReferenceFolder: "Конечная папка - это вложенная папка, которую вы хотите переместить." | ||||
| hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена." | ||||
| copyUrl: "Копировать URL" | ||||
| rename: "Переименовать" | ||||
| avatar: "Иконка" | ||||
| banner: "Баннер" | ||||
| nsfw: "NSFW" | ||||
| whenServerDisconnected: "Когда соединение с сервером потеряно" | ||||
| disconnectedFromServer: "Разорвано соединение с сервером" | ||||
| reload: "Перезагрузить" | ||||
| doNothing: "Ничего не делать" | ||||
| reloadConfirm: "Подтвердить перезагрузку?" | ||||
| watch: "Следить" | ||||
| unwatch: "Отписаться" | ||||
| accept: "Принять" | ||||
| reject: "Отклонить" | ||||
| normal: "Стабильно" | ||||
| instanceName: "Имя экземпляра" | ||||
| instanceDescription: "Описание инстанса" | ||||
| maintainerName: "Имя администратора" | ||||
| maintainerEmail: "email администратора" | ||||
| tosUrl: "Пользовательское соглашение URL" | ||||
| thisYear: "Текущий год" | ||||
| thisMonth: "Текущий месяц" | ||||
| today: "Сегодня" | ||||
| dayX: "{day}дней" | ||||
| monthX: "{month}месяц" | ||||
| yearX: "{year}год" | ||||
| pages: "Страница" | ||||
| integration: "подключение" | ||||
| connectSerice: "Соединение" | ||||
| disconnectSerice: "Отключение" | ||||
| enableLocalTimeline: "Включить локальную ленту" | ||||
| enableGlobalTimeline: "Включить глобальную ленту" | ||||
| disablingTimelinesInfo: "Администраторы и Модераторы всегда будут иметь доступ ко всем временным параметрам, даже если они не включены." | ||||
| registration: "Регистрация" | ||||
| enableRegistration: "Разрешить регистрацию" | ||||
| invite: "Пригласить" | ||||
| proxyRemoteFiles: "Удаленные файлы прокси" | ||||
| proxyRemoteFilesDescription: "Если эта функция включена, удаленные файлы, которые (1) не хранятся локально или (2) были удалены с превышением лимита хранения, будут проксированы локально (с эскизами). Это не влияет на хранение на сервере." | ||||
| driveCapacityPerLocalAccount: "Емкость диска для локального пользователя" | ||||
| driveCapacityPerRemoteAccount: "Емкость диска для удаленного пользователя" | ||||
| inMb: "В мегабайтах" | ||||
| iconUrl: "URL-адрес иконки" | ||||
| bannerUrl: "URL-адрес изображения баннера" | ||||
| basicInfo: "Общая информация" | ||||
| pinnedUsers: "Прикреплённый пользователь" | ||||
| pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи, перечисленные здесь, будут привязаны к закладке \"Изучение\"." | ||||
| hcaptcha: "hCaptcha" | ||||
| enableHcaptcha: "Включить hCaptcha" | ||||
| hcaptchaSiteKey: "Ключ сайта" | ||||
| hcaptchaSecretKey: "Секретный ключ" | ||||
| recaptcha: "reCAPTCHA" | ||||
| enableRecaptcha: "Включить reCAPTCHA" | ||||
| recaptchaSiteKey: "Ключ сайта" | ||||
| recaptchaSecretKey: "Секретный ключ" | ||||
| avoidMultiCaptchaConfirm: "Использование нескольких Captchas может вызвать помехи. Хотите отключить другую Captcha? Вы можете оставить несколько Captchas включенными, нажав \"Отмена\"." | ||||
| antennas: "Антенны" | ||||
| manageAntennas: "Настройки антенн" | ||||
| name: "Имя" | ||||
| antennaSource: "Источник антенны" | ||||
| antennaKeywords: "Ключевые слова" | ||||
| antennaExcludeKeywords: "Исключения" | ||||
| antennaKeywordsDescription: "Разделяйте пробелами для условия \"И\". Разделяйте переводом строки для \"ИЛИ\"." | ||||
| notifyAntenna: "Уведомлять о новых записях" | ||||
| serviceworker: "ServiceWorker" | ||||
| enableServiceworker: "Включить ServiceWorker" | ||||
| caseSensitive: "С учётом регистра" | ||||
| withReplies: "Включить ответы" | ||||
| connectedTo: "Вы подключены к следующим аккаунтам" | ||||
| notesAndReplies: "Посты и ответы" | ||||
| withFiles: "с файлами" | ||||
| silence: "Заглушить" | ||||
| silenceConfirm: "Вы уверены, что хотите заглушить этого пользователя?" | ||||
| unsilenceConfirm: "Ты уверен, что хочешь отменить глушение этого пользователя?" | ||||
| popularUsers: "Популярные пользователи" | ||||
| recentlyUpdatedUsers: "Недавно активные" | ||||
| recentlyRegisteredUsers: "Недавно зарегистрированные пользователи" | ||||
| recentlyDiscoveredUsers: "Недавно обнаруженные пользователи" | ||||
| exploreUsersCount: "{count} пользователей" | ||||
| exploreFediverse: "Исследуйте Fediverse" | ||||
| popularTags: "Популярные теги" | ||||
| userList: "Списки" | ||||
| about: "Описание" | ||||
| aboutMisskey: "О Misskey" | ||||
| aboutMisskeyText: "Misskey - это программное обеспечение с открытым исходным кодом, разрабатываемое syuilo с 2014 года." | ||||
| misskeyMembers: "В настоящее время он разрабатывается и поддерживается следующими членами:" | ||||
| misskeySource: "Исходный код доступен здесь:" | ||||
| misskeyTranslation: "Помогите нам перевести Misskey:" | ||||
| misskeyDonate: "Вы можете поддержать развитие, пожертвовав Misskey:" | ||||
| morePatrons: "Есть много других, кто поддержал нас. Спасибо 🥰." | ||||
| patrons: "Поддержавшие" | ||||
| administrator: "Администратор" | ||||
| token: "Токен" | ||||
| twoStepAuthentication: "Двухфакторная аутентификация" | ||||
| moderator: "Модератор" | ||||
| nUsersMentioned: "{n}указанные пользователи" | ||||
| securityKey: "Ключ безопасности" | ||||
| securityKeyName: "Имя ключа" | ||||
| registerSecurityKey: "Зарегистрировать защитный ключ" | ||||
| lastUsed: "Последнее использование" | ||||
| unregister: "Отписаться" | ||||
| resetPassword: "Сброс пароля:" | ||||
| newPasswordIs: "Новый пароль - \"{пароль}\"." | ||||
| autoNoteWatch: "Автоматически просматривать записи" | ||||
| autoNoteWatchDescription: "Получать уведомления о заметках других пользователей, на которые вы отреагировали или на которые вы ответили." | ||||
| reduceUiAnimation: "Уменьшить анимацию в пользовательском интерфейсе." | ||||
| share: "Поделиться" | ||||
| notFound: "Не найдено" | ||||
| notFoundDescription: "Страница, соответствующая указанному URL, не найдена." | ||||
| uploadFolder: "Место загрузки по умолчанию" | ||||
| cacheClear: "Очистка кэша" | ||||
| markAsReadAllNotifications: "Отметить все уведомления как прочитанные" | ||||
| markAsReadAllUnreadNotes: "Отметьте все сообщения как прочитанные." | ||||
| markAsReadAllTalkMessages: "Отметьте все сообщения как прочитанные" | ||||
| help: "Помощь" | ||||
| inputMessageHere: "Введите сообщение здесь" | ||||
| close: "Закрыть" | ||||
| group: "Группа" | ||||
| groups: "Группы" | ||||
| createGroup: "Создать группу" | ||||
| ownedGroups: "Собственные группы" | ||||
| joinedGroups: "Участие в группах" | ||||
| invites: "Пригласить" | ||||
| groupName: "Название группы" | ||||
| members: "Участники" | ||||
| transfer: "Перенос" | ||||
| messagingWithUser: "Сообщения пользователей" | ||||
| messagingWithGroup: "Чат в группе" | ||||
| title: "Заголовок." | ||||
| text: "Текст" | ||||
| enable: "Включить." | ||||
| next: "Следующий" | ||||
| retype: "Введите повторно" | ||||
| noteOf: "Посты {user}" | ||||
| inviteToGroup: "Пригласить в группу" | ||||
| maxNoteTextLength: "Максимальная длина текста" | ||||
| quoteQuestion: "Хочешь добавить цитату?" | ||||
| noMessagesYet: "Сообщений нет" | ||||
| newMessageExists: "Новое сообщение" | ||||
| onlyOneFileCanBeAttached: "К сообщению можно прикрепить только один файл." | ||||
| signinRequired: "Пожалуйста, войдите." | ||||
| invitationCode: "Код приглашения" | ||||
| checking: "Проверка" | ||||
| available: "Доступен" | ||||
| unavailable: "Не доступно" | ||||
| usernameInvalidFormat: "Вы можете использовать a-z, A-Z, 0-9 и _" | ||||
| tooShort: "Слишком короткий" | ||||
| tooLong: "Слишком длинный" | ||||
| weakPassword: "Слабый пароль" | ||||
| normalPassword: "Обычный пароль" | ||||
| strongPassword: "Надёжный пароль" | ||||
| passwordMatched: "Подходящий пароль" | ||||
| passwordNotMatched: "Пароль не найден" | ||||
| signinWith: "Войти в систему с помощью {x}" | ||||
| signinFailed: "Невозможно войти в систему. Введенное вами имя пользователя или пароль неверны." | ||||
| or: "или" | ||||
| uiLanguage: "Язык интерфейса" | ||||
| groupInvited: "Приглашение в группу" | ||||
| aboutX: "Описание {x}" | ||||
| useOsNativeEmojis: "Используйте родной для ОС Emojis" | ||||
| youHaveNoGroups: "Группы не найдены" | ||||
| joinOrCreateGroup: "Получите приглашение присоединиться к группам или вы можете создать свою собственную группу." | ||||
| noHistory: "Ничего не найдено" | ||||
| disableAnimatedMfm: "Отключение MFM в анимации" | ||||
| doing: "В пути" | ||||
| category: "Категория" | ||||
| tags: "Теги" | ||||
| docSource: "Источник документа" | ||||
| createAccount: "Зарегистрироваться" | ||||
| existingAcount: "У вас уже есть учетная запись?" | ||||
| regenerate: "Восстановить" | ||||
| fontSize: "Размер шрифта" | ||||
| noFollowRequests: "У вас нет никаких ожидающих ответа запросов" | ||||
| openImageInNewTab: "Открыть изображение в новой вкладке" | ||||
| dashboard: "Панель управления" | ||||
| local: "Локальный" | ||||
| remote: "Удаленный" | ||||
| total: "Всего" | ||||
| weekOverWeekChanges: "Еженедельно" | ||||
| dayOverDayChanges: "Ежедневно" | ||||
| appearance: "Внешний вид" | ||||
| clientSettings: "Настройки клиента" | ||||
| accountSettings: "Настройки учетной записи" | ||||
| promotion: "Опубликовано" | ||||
| promote: "Продвинуть" | ||||
| numberOfDays: "Количество дней" | ||||
| hideThisNote: "Спрятать эту запись" | ||||
| objectStorage: "Хранилище" | ||||
| useObjectStorage: "Занято в хранилище" | ||||
| objectStorageBaseUrl: "Базовый URL-адрес" | ||||
| objectStorageBucket: "Bucket" | ||||
| objectStoragePrefix: "Префикс" | ||||
| objectStorageRegion: "Регион" | ||||
| serverLogs: "Журнал сервера" | ||||
| deleteAll: "Удалить всё" | ||||
| sounds: "Звуки" | ||||
| listen: "Слушать" | ||||
| none: "Ничего" | ||||
| showInPage: "Показать страницу" | ||||
| popout: "Развернуть" | ||||
| volume: "Громкость" | ||||
| details: "Подробнее" | ||||
| chooseEmoji: "Выберите эмодзи" | ||||
| unableToProcess: "Я не могу завершить операцию." | ||||
| recentUsed: "Последние использованные" | ||||
| install: "Установить" | ||||
| uninstall: "Удалить" | ||||
| installedApps: "Установленные приложения" | ||||
| nothing: "Ничего не найдено" | ||||
| installedDate: "Дата установки" | ||||
| lastUsedDate: "Дата использования" | ||||
| state: "Состояние" | ||||
| sort: "Сортировать" | ||||
| ascendingOrder: "по возрастанию" | ||||
| descendingOrder: "По убыванию" | ||||
| scratchpad: "Редактор " | ||||
| scratchpadDescription: "Scratchpad предоставляет экспериментальную среду для AiScript, позволяющую писать, запускать и проверять результаты кода, взаимодействующего с Misskey." | ||||
| output: "Выходы" | ||||
| script: "Скрипт" | ||||
| disablePagesScript: "Отключение скриптов в Pages" | ||||
| deleteAllFiles: "Удалить все файлы" | ||||
| deleteAllFilesConfirm: "Вы хотите удалить все файлы?" | ||||
| removeAllFollowing: "Удалить всех подписчиков" | ||||
| userSuspended: "Этот пользователь был заморожен" | ||||
| userSilenced: "Этот пользователь был заглушен" | ||||
| sidebar: "Боковая панель" | ||||
| divider: "Разделительная полоса" | ||||
| addItem: "Добавить элемент" | ||||
| rooms: "Комнаты" | ||||
| relays: "Ретрансляторы" | ||||
| addRelay: "Добавить ретранслятор" | ||||
| addedRelays: "Добавленные ретрансляторы" | ||||
| invisibleNote: "Личное сообщение" | ||||
| visibility: "Видимость" | ||||
| poll: "Опрос" | ||||
| enablePlayer: "Включить плеер" | ||||
| disablePlayer: "Выключить плеер" | ||||
| themeEditor: "Редактор темы" | ||||
| description: "Описание" | ||||
| author: "Автор" | ||||
| plugins: "Плагины" | ||||
| permission: "Разрешения" | ||||
| enableAll: "Включить все" | ||||
| disableAll: "Выключить всё" | ||||
| notificationType: "Тип уведомления" | ||||
| edit: "Изменить" | ||||
| emailConfig: "Настройки почтового сервера" | ||||
| enableEmail: "Активировать функцию доставки электронной почты" | ||||
| emailConfigInfo: "Он используется для подтверждения адреса электронной почты и сброса пароля." | ||||
| email: "email" | ||||
| smtpConfig: "Конфигурация SMTP-сервера" | ||||
| smtpHost: "Хост" | ||||
| smtpPort: "smtp порт" | ||||
| smtpUser: "Имя пользователя" | ||||
| smtpPass: "Пароль" | ||||
| emptyToDisableSmtpAuth: "Вы можете отключить SMTP аутентификацию, оставив ваше имя пользователя и пароль пустыми" | ||||
| smtpSecure: "Использовать SSL/TLS для SMTP-соединений" | ||||
| smtpSecureInfo: "Выключите его при использовании STARTTLS." | ||||
| testEmail: "Проверка Email" | ||||
| wordMute: "Скрытие слов" | ||||
| makeActive: "Активировать" | ||||
| display: "Показать" | ||||
| copy: "Копировать" | ||||
| metrics: "Метрика" | ||||
| overview: "Обзор" | ||||
| logs: "Лог-файлы" | ||||
| delayed: "Задержка" | ||||
| database: "База данных" | ||||
| channel: "каналы" | ||||
| create: "Создать" | ||||
| notificationSetting: "Настройки уведомлений" | ||||
| notificationSettingDesc: "Выберите тип уведомлений для отображения" | ||||
| useGlobalSetting: "Использовать глобальные настройки" | ||||
| useGlobalSettingDesc: "Использовать глобальные настройки" | ||||
| other: "Другие" | ||||
| regenerateLoginToken: "Восстановить токен входа" | ||||
| regenerateLoginTokenDescription: "Восстановите токен, используемый внутри во время входа. Обычно в этом нет необходимости. При восстановлении все устройства будут отключены." | ||||
| setMultipleBySeparatingWithSpace: "Вы можете установить несколько, разделив их пробелами." | ||||
| fileIdOrUrl: "ID файла или URL-адрес" | ||||
| chatOpenBehavior: "Поведение окна чата при открытии" | ||||
| sample: "Пример" | ||||
| abuseReports: "Отчеты" | ||||
| reportAbuse: "Отчеты" | ||||
| fillAbuseReportDescription: "Пожалуйста, заполните данные отчета. Если речь идет о конкретном сообщении, пожалуйста, укажите его URL." | ||||
| abuseReported: "Содержимое отправлено. Спасибо за сообщение" | ||||
| send: "Отправить" | ||||
| abuseMarkAsResolved: "Отметить отчет как решенный" | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "Автоматическая перезагрузка" | ||||
|   dialog: "Предупреждение" | ||||
|   quiet: "Показать ненавязчивое предупреждение" | ||||
| _channel: | ||||
|   create: "Создать канал" | ||||
|   edit: "Редактировать канал" | ||||
|   setBanner: "Установить баннер" | ||||
|   removeBanner: "Удалить баннер" | ||||
|   featured: "В тренде" | ||||
|   owned: "Владелец" | ||||
|   usersCount: "{n} Участники" | ||||
|   notesCount: "{n} Записи" | ||||
| _sidebar: | ||||
|   full: "Полный" | ||||
|   icon: "Иконка" | ||||
|   hide: "Спрятать" | ||||
| _wordMute: | ||||
|   muteWords: "Скрыть слово" | ||||
|   muteWordsDescription: "Разделяйте пробелами для условия \"И\". Разделяйте переводом строки для \"ИЛИ\"." | ||||
|   muteWordsDescription2: "Округляйте ключевые слова слэшами для использования регулярных выражений." | ||||
|   soft: "Лёгкий " | ||||
|   hard: "Сложный" | ||||
|   mutedNotes: "Скрытые посты" | ||||
| _theme: | ||||
|   explore: "Обзор" | ||||
|   install: "Установить тему" | ||||
|   manage: "Менеджер тем" | ||||
|   code: "Код темы" | ||||
|   installed: "{name} установлено " | ||||
|   alreadyInstalled: "Тема уже установлена" | ||||
|   invalid: "Формат темы некорректный " | ||||
|   make: "Создать тему" | ||||
|   base: "База" | ||||
|   addConstant: "Добавить константу" | ||||
|   constant: "Константа" | ||||
|   defaultValue: "Значение по умолчанию" | ||||
|   color: "Цвет" | ||||
|   refConst: "Ссылка на константу" | ||||
|   key: "Ключ" | ||||
|   func: "Функции" | ||||
|   funcKind: "Тип функции" | ||||
|   argument: "Аргумент" | ||||
|   basedProp: "Указанное свойство" | ||||
|   alpha: "Непрозрачность" | ||||
|   darken: "Темный" | ||||
|   inputConstantName: "Введите имя для константы" | ||||
|   importInfo: "Если вы введете код темы здесь, вы можете импортировать его в редактор тем." | ||||
|   deleteConstantConfirm: "Вы действительно хотите удалить константу {const}?" | ||||
|   keys: | ||||
|     bg: "Справочная информация" | ||||
|     fg: "Текст" | ||||
|     navHoverFg: "Текст на боковой панели (Навести)" | ||||
|     link: "Ссылка" | ||||
|     hashtag: "Хэштеги" | ||||
|     mention: "Упоминание" | ||||
|     renote: "Репост" | ||||
|     divider: "Разделительная полоса" | ||||
|     infoBg: "Справочная информация" | ||||
|     infoFg: "Текст информации" | ||||
| _sfx: | ||||
|   note: "Посты" | ||||
|   notification: "Уведомления" | ||||
|   chat: "Сообщения" | ||||
| _ago: | ||||
|   secondsAgo: "{} секунд назад" | ||||
|   minutesAgo: "{} минут назад" | ||||
|   hoursAgo: "{} часов назад" | ||||
|   daysAgo: "{} дней назад" | ||||
|   weeksAgo: "{} недель назад" | ||||
|   monthsAgo: "{} месяцев назад" | ||||
|   yearsAgo: "{} лет назад" | ||||
| _time: | ||||
|   second: "сек" | ||||
|   minute: "Мин." | ||||
| _tutorial: | ||||
|   title: "Как пользоваться Misskey" | ||||
|   step1_1: "Добро пожаловать!" | ||||
|   step2_1: "Прежде чем создать заметку или следовать за кем-либо, сначала заполните свой профиль." | ||||
|   step3_1: "Вы хорошо подготовили свой профиль?" | ||||
|   step6_2: "Вы можете добавлять \"реакции\" к записям других людей, что облегчает общение с ними." | ||||
|   step6_3: "Чтобы добавить реакцию, нажмите на знак \"+\" в записке и выберите нужную реакцию." | ||||
|   step7_1: "На этом мы завершаем основные инструкции по использованию Misskey. Спасибо за вашу тяжёлую работу." | ||||
|   step7_2: "Если вы хотите узнать больше о Misskey, посмотрите в {хелп}." | ||||
| _2fa: | ||||
|   alreadyRegistered: "Настройка завершена" | ||||
|   registerDevice: "Зарегистрируйте ваше устройство" | ||||
|   step1: "Во-первых, установите на устройство приложение для аутентификации, например, {a} или {b}." | ||||
|   step2: "Далее отсканируйте отображаемый QR-код при помощи приложения" | ||||
|   step3: "Введите токен, отображаемый в приложении, и все готово" | ||||
|   step4: "Когда вы войдете в систему, вы можете ввести свой токен тем же способом." | ||||
|   securityKeyInfo: "Вы можете настроить вход с помощью аппаратного ключа безопасности, поддерживающего FIDO2, или отпечатка пальца или PIN-кода на устройстве." | ||||
| _permissions: | ||||
|   "read:account": "Просмотр информации об аккаунте" | ||||
|   "write:account": "Изменить информацию о вашем аккаунте" | ||||
|   "write:blocks": "Отредактируйте список людей, которых вы заблокировали" | ||||
|   "read:drive": "Доступ к файлам и папкам диска" | ||||
|   "write:drive": "Редактирование или удаление файлов и папок диска" | ||||
|   "read:favorites": "Просмотреть список избранных" | ||||
|   "write:favorites": "Редактирование списка избранных" | ||||
|   "read:messaging": "Просмотр сообщений" | ||||
|   "read:mutes": "Просмотр скрытых пользователей" | ||||
|   "write:mutes": "Изменение списка скрытых" | ||||
|   "read:notifications": "Просмотреть уведомления" | ||||
|   "write:reactions": "Редактировать реакции" | ||||
| _weekday: | ||||
|   saturday: "Суббота" | ||||
| _widgets: | ||||
|   memo: "Заметка" | ||||
|   notifications: "Уведомления" | ||||
|   timeline: "Лента" | ||||
|   calendar: "Календарь" | ||||
|   trends: "В тренде" | ||||
|   clock: "Часы" | ||||
|   rss: "Ридер RSS" | ||||
|   activity: "Активность" | ||||
|   photos: "Фото" | ||||
|   digitalClock: "Цифровые Часы" | ||||
|   federation: "Федиверс" | ||||
|   postForm: "Форма отправки" | ||||
| _cw: | ||||
|   hide: "Спрятать" | ||||
|   show: "Показать еще" | ||||
|   chars: "{count} символов" | ||||
|   files: "{count} файлов" | ||||
| _poll: | ||||
|   noOnlyOneChoice: "Нужно как минимум два варианта." | ||||
|   choiceN: "Выбрать{n}" | ||||
|   canMultipleVote: "Возможны несколько вариантов ответов" | ||||
|   expiration: "Истечение срока действия" | ||||
|   infinite: "Неограниченное количество" | ||||
|   deadlineDate: "Срок исполнения" | ||||
|   deadlineTime: "Длительность" | ||||
|   duration: "Продожительность" | ||||
|   totalVotes: "Всего {n} голосов" | ||||
|   vote: "Проголосовать" | ||||
|   showResult: "Смотреть результаты" | ||||
|   voted: "Проголосовали" | ||||
|   closed: "Завершено" | ||||
| _visibility: | ||||
|   public: "Публичный" | ||||
|   publicDescription: "Открыт для всех пользователей" | ||||
|   home: "Главная" | ||||
|   followers: "Подписчики" | ||||
|   specifiedDescription: "Отправлять сообщения только указанным пользователям" | ||||
|   localOnly: "Только локально" | ||||
|   localOnlyDescription: "Не видно удаленным пользователям" | ||||
| _postForm: | ||||
|   replyPlaceholder: "Ответьте на эту запись..." | ||||
|   quotePlaceholder: "Процитировать эту запись..." | ||||
|   channelPlaceholder: "Отправить в канал" | ||||
|   _placeholders: | ||||
|     a: "Что происходит?" | ||||
| _profile: | ||||
|   name: "Имя" | ||||
|   username: "Имя пользователя" | ||||
|   metadataContent: "Содержание" | ||||
| _exportOrImport: | ||||
|   allNotes: "Все записи\n" | ||||
|   followingList: "Подписки" | ||||
|   muteList: "Скрыть" | ||||
|   blockingList: "Заблокировать" | ||||
|   userLists: "Списки" | ||||
| _timelines: | ||||
|   home: "Главная" | ||||
| _rooms: | ||||
|   roomOf: "Комната {user}" | ||||
|   _roomType: | ||||
|     default: "По умолчанию" | ||||
|   _furnitures: | ||||
|     pencil: "Карандаш" | ||||
|     book: "Книга" | ||||
|     server: "Сервер" | ||||
|     monitor: "Монитор" | ||||
| _pages: | ||||
|   title: "Заголовок." | ||||
|   url: "URL страницы" | ||||
|   hideTitleWhenPinned: "Скрыть заголовок страницы при привязке к профилю" | ||||
|   font: "Шрифт" | ||||
|   blocks: | ||||
|     section: "Раздел" | ||||
|     image: "Изображение" | ||||
|     button: "Кнопка" | ||||
|     if: "Если" | ||||
|     _if: | ||||
|       variable: "Переменная" | ||||
|     post: "Форма отправки" | ||||
|     _post: | ||||
|       text: "Содержание" | ||||
|     textInput: "Ввод текста" | ||||
|     _textInput: | ||||
|       name: "Имя переменной" | ||||
|       text: "Заголовок." | ||||
|       default: "Значение по умолчанию" | ||||
|     textareaInput: "Многострочный ввод текста" | ||||
|     _textareaInput: | ||||
|       name: "Имя переменной" | ||||
|       text: "Заголовок." | ||||
|       default: "Значение по умолчанию" | ||||
|     _numberInput: | ||||
|       name: "Имя переменной" | ||||
|       text: "Заголовок." | ||||
|       default: "Значение по умолчанию" | ||||
|     _switch: | ||||
|       name: "Имя переменной" | ||||
|       text: "Заголовок." | ||||
|       default: "Значение по умолчанию" | ||||
|     _counter: | ||||
|       name: "Имя переменной" | ||||
|       text: "Заголовок." | ||||
|     _button: | ||||
|       text: "Заголовок." | ||||
|       _action: | ||||
|         _dialog: | ||||
|           content: "Содержание" | ||||
|         _pushEvent: | ||||
|           no-variable: "Не найдено" | ||||
|         callAiScript: "Справка AiScript" | ||||
|         _callAiScript: | ||||
|           functionName: "Имя функции" | ||||
|     _radioButton: | ||||
|       name: "Имя переменной" | ||||
|       title: "Заголовок." | ||||
|       default: "Значение по умолчанию" | ||||
|   script: | ||||
|     categories: | ||||
|       list: "Списки" | ||||
|     blocks: | ||||
|       strLen: "Длина текста" | ||||
|       _strLen: | ||||
|         arg1: "Текст" | ||||
|       _strReplace: | ||||
|         arg1: "Текст" | ||||
|       _strReverse: | ||||
|         arg1: "Текст" | ||||
|       _join: | ||||
|         arg1: "Списки" | ||||
|       add: "Добавить" | ||||
|       _add: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _subtract: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _multiply: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _divide: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _mod: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _eq: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _notEq: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _and: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _or: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _lt: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _gt: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _ltEq: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _gtEq: | ||||
|         arg1: "А" | ||||
|         arg2: "Б" | ||||
|       _if: | ||||
|         arg1: "Если" | ||||
|       _rannum: | ||||
|         arg2: "Максимальное значение" | ||||
|       randomPick: "Случайный выбор из списка" | ||||
|       _randomPick: | ||||
|         arg1: "Списки" | ||||
|       _dailyRandom: | ||||
|         arg1: "Вероятность" | ||||
|       _dailyRannum: | ||||
|         arg2: "Максимальное значение" | ||||
|       _dailyRandomPick: | ||||
|         arg1: "Списки" | ||||
|       _seedRannum: | ||||
|         arg3: "Максимальное значение" | ||||
|       _seedRandomPick: | ||||
|         arg2: "Списки" | ||||
|       pick: "Выберите из списка" | ||||
|       _pick: | ||||
|         arg1: "Списки" | ||||
|         arg2: "Расположение" | ||||
|       _listLen: | ||||
|         arg1: "Списки" | ||||
|       number: "Номер" | ||||
|       _stringToNumber: | ||||
|         arg1: "Текст" | ||||
|       _numberToString: | ||||
|         arg1: "Номер" | ||||
|       ref: "Переменная" | ||||
|       aiScriptVar: "Переменная AiScript" | ||||
|       fn: "функции" | ||||
|       _fn: | ||||
|         slots: "Слоты" | ||||
|       _for: | ||||
|         arg1: "Количество повторений" | ||||
|     types: | ||||
|       array: "Списки" | ||||
| _notification: | ||||
|   youWereFollowed: "Новый подписчик" | ||||
|   youReceivedFollowRequest: "Запрос на подписку" | ||||
|   youWereInvitedToGroup: "Приглашение в группу" | ||||
|   _types: | ||||
|     follow: "Подписки" | ||||
|     mention: "Упоминание" | ||||
|     renote: "Репост" | ||||
|     quote: "Цитата" | ||||
|     reaction: "Реакции" | ||||
|     app: "Уведомления из приложений" | ||||
| _deck: | ||||
|   alwaysShowMainColumn: "Всегда показывать главную колонку" | ||||
|   columnAlign: "Выравнивание колонн" | ||||
|   addColumn: "Добавить колонку" | ||||
|   swapLeft: "Переместить влево" | ||||
|   swapRight: "Переместить вправо" | ||||
|   swapUp: "Поднять вверх" | ||||
|   swapDown: "Переместить Вниз" | ||||
|   _columns: | ||||
|     widgets: "Виджеты" | ||||
|     notifications: "Уведомления" | ||||
|     tl: "Лента" | ||||
|     antenna: "Антенны" | ||||
|     list: "Списки" | ||||
|     mentions: "Упоминания" | ||||
|   | ||||
| @@ -16,6 +16,9 @@ noNotes: "没有帖文" | ||||
| noNotifications: "无通知" | ||||
| instance: "实例" | ||||
| settings: "设置" | ||||
| basicSettings: "基本设置" | ||||
| otherSettings: "其他设置" | ||||
| openInWindow: "在新窗口中打开" | ||||
| profile: "个人资料" | ||||
| timeline: "时间线" | ||||
| noAccountDescription: "这个人很懒,没有写自我介绍" | ||||
| @@ -40,6 +43,7 @@ deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回 | ||||
| addToList: "添加至列表" | ||||
| sendMessage: "发送" | ||||
| copyUsername: "复制用户名" | ||||
| searchUser: "搜索用户" | ||||
| reply: "回复" | ||||
| loadMore: "查看更多" | ||||
| youGotNewFollower: "你有新的关注者" | ||||
| @@ -66,8 +70,11 @@ followers: "关注者" | ||||
| followsYou: "关注了你" | ||||
| createList: "创建列表" | ||||
| manageLists: "管理列表" | ||||
| error: "有点小问题" | ||||
| error: "错误" | ||||
| somethingHappened: "出现了问题" | ||||
| retry: "重试" | ||||
| pageLoadError: "页面加载失败。" | ||||
| pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" | ||||
| enterListName: "输入列表名称" | ||||
| privacy: "隐私" | ||||
| makeFollowManuallyApprove: "关注者请求需要批准" | ||||
| @@ -106,6 +113,8 @@ unsuspendConfirm: "要解除冻结吗?" | ||||
| selectList: "选择列表" | ||||
| selectAntenna: "天线选择" | ||||
| selectWidget: "选择小工具" | ||||
| editWidgets: "编辑小工具" | ||||
| editWidgetsExit: "完成编辑" | ||||
| customEmojis: "自定义Emoji" | ||||
| emoji: "表情符号" | ||||
| emojiName: "Emoji 名称" | ||||
| @@ -177,7 +186,6 @@ processing: "处理中" | ||||
| preview: "预览" | ||||
| default: "默认" | ||||
| noCustomEmojis: "无自定义Emoji" | ||||
| customEmojisOfRemote: "远程Emoji" | ||||
| noJobs: "没有任务" | ||||
| federating: "联合中" | ||||
| blocked: "已拦截" | ||||
| @@ -286,7 +294,7 @@ dayX: "{day}日" | ||||
| monthX: "{month}月" | ||||
| yearX: "{year}年" | ||||
| pages: "页面" | ||||
| integration: "连携" | ||||
| integration: "关联" | ||||
| connectSerice: "已连接" | ||||
| disconnectSerice: "断开连接" | ||||
| enableLocalTimeline: "启用本地时间线功能" | ||||
| @@ -445,7 +453,7 @@ total: "总计" | ||||
| weekOverWeekChanges: "与前一周相比" | ||||
| dayOverDayChanges: "与前一日相比" | ||||
| appearance: "外观" | ||||
| clinetSettings: "客户端设置" | ||||
| clientSettings: "客户端设置" | ||||
| accountSettings: "账户设置" | ||||
| promotion: "推广" | ||||
| promote: "推广" | ||||
| @@ -476,6 +484,8 @@ newNoteRecived: "有新的帖子" | ||||
| sounds: "声音" | ||||
| listen: "听" | ||||
| none: "空" | ||||
| showInPage: "在页面中显示" | ||||
| popout: "弹窗" | ||||
| volume: "音量" | ||||
| details: "详情" | ||||
| chooseEmoji: "选择表情符号" | ||||
| @@ -518,7 +528,6 @@ enableInfiniteScroll: "启用自动滚动页面模式" | ||||
| visibility: "可见性" | ||||
| poll: "调查问卷" | ||||
| useCw: "隐藏内容" | ||||
| fixedWidgetsPosition: "固定小工具的位置" | ||||
| enablePlayer: "打开播放器" | ||||
| disablePlayer: "关闭播放器" | ||||
| expandTweet: "展开推文" | ||||
| @@ -566,6 +575,24 @@ delayed: "延迟" | ||||
| database: "数据库" | ||||
| channel: "频道" | ||||
| create: "创建" | ||||
| notificationSetting: "通知设置" | ||||
| notificationSettingDesc: "选择要显示的通知类型。" | ||||
| useGlobalSetting: "使用全局设置" | ||||
| useGlobalSettingDesc: "启用时,将使用帐户通知设置。关闭时,则可以单独设置。" | ||||
| other: "其他" | ||||
| regenerateLoginToken: "重新生成登录令牌" | ||||
| regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通常您不需要这样做。重新生成后,您将在所有设备上登出。" | ||||
| setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。" | ||||
| fileIdOrUrl: "文件ID或者URL" | ||||
| chatOpenBehavior: "聊天窗口打开时的行为" | ||||
| sample: "示例" | ||||
| abuseReports: "举报" | ||||
| reportAbuse: "举报" | ||||
| reportAbuseOf: "举报{name}" | ||||
| fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写URL地址。" | ||||
| abuseReported: "内容已发送。感谢您的报告。" | ||||
| send: "发送" | ||||
| abuseMarkAsResolved: "处理完毕" | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "自动重载" | ||||
|   dialog: "对话框警告" | ||||
| @@ -782,6 +809,7 @@ _widgets: | ||||
|   photos: "照片" | ||||
|   digitalClock: "数字时钟" | ||||
|   federation: "联邦宇宙" | ||||
|   postForm: "投稿窗口" | ||||
| _cw: | ||||
|   hide: "隐藏" | ||||
|   show: "查看更多" | ||||
| @@ -1244,8 +1272,11 @@ _notification: | ||||
|     renote: "转发" | ||||
|     quote: "引用" | ||||
|     reaction: "回应" | ||||
|     pollVote: "投票" | ||||
|     receiveFollowRequest: "关注请求" | ||||
|     pollVote: "问卷调查已投票" | ||||
|     receiveFollowRequest: "收到关注请求" | ||||
|     followRequestAccepted: "关注请求已接受" | ||||
|     groupInvited: "加入群组邀请" | ||||
|     app: "关联应用的通知" | ||||
| _deck: | ||||
|   alwaysShowMainColumn: "总是显示主列" | ||||
|   columnAlign: "列对齐" | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| --- | ||||
| _lang_: "中文(繁體)" | ||||
| _lang_: "繁體中文" | ||||
| introMisskey: "歡迎! Misskey是一個開源的去中心化的社群網站。\n通過「貼文」來分享現在發生的事情吧! 📡\n「反應」功能,可以讓你快速的對大家的「帖子」來表達感情👍\n一起來探索新的世界吧! 🚀" | ||||
| monthAndDay: "{month}月 {day}日" | ||||
| search: "搜尋" | ||||
| @@ -11,11 +11,14 @@ ok: "確定" | ||||
| gotIt: "知道了" | ||||
| cancel: "取消" | ||||
| enterUsername: "輸入使用者名稱" | ||||
| renotedBy: "由{user}轉發" | ||||
| renotedBy: "{user} 轉發了" | ||||
| noNotes: "貼文不可用。" | ||||
| noNotifications: "沒有通知" | ||||
| instance: "實例" | ||||
| settings: "設定" | ||||
| basicSettings: "基本設定" | ||||
| otherSettings: "其他設定" | ||||
| openInWindow: "在新視窗開啟" | ||||
| profile: "個人檔案" | ||||
| timeline: "時間軸" | ||||
| noAccountDescription: "此用戶還沒有自我介紹" | ||||
| @@ -40,6 +43,7 @@ deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有反應, | ||||
| addToList: "添加至清單" | ||||
| sendMessage: "發送訊息" | ||||
| copyUsername: "複製用戶名" | ||||
| searchUser: "搜尋用戶" | ||||
| reply: "回覆" | ||||
| loadMore: "瀏覽更多" | ||||
| youGotNewFollower: "您有新的追隨者" | ||||
| @@ -66,8 +70,10 @@ followers: "追隨者" | ||||
| followsYou: "追隨你的人" | ||||
| createList: "建立清單" | ||||
| manageLists: "管理清單" | ||||
| error: "發生錯誤" | ||||
| error: "錯誤" | ||||
| somethingHappened: "發生錯誤" | ||||
| retry: "重試" | ||||
| pageLoadError: "載入頁面失敗" | ||||
| enterListName: "輸入清單名稱" | ||||
| privacy: "隱私" | ||||
| makeFollowManuallyApprove: "手動審核追隨請求" | ||||
| @@ -106,13 +112,15 @@ unsuspendConfirm: "確定解凍此帳號?" | ||||
| selectList: "選擇清單" | ||||
| selectAntenna: "選擇天線" | ||||
| selectWidget: "選擇小工具" | ||||
| editWidgets: "編輯小工具" | ||||
| editWidgetsExit: "停止編輯" | ||||
| customEmojis: "自訂表情符號" | ||||
| emoji: "表情符號" | ||||
| emojiName: "表情符號名稱" | ||||
| emojiUrl: "表情符號URL" | ||||
| addEmoji: "新增表情符號" | ||||
| settingGuide: "推薦設定" | ||||
| cacheRemoteFiles: "遠程文件緩存" | ||||
| cacheRemoteFiles: "緩存非遠程檔案" | ||||
| cacheRemoteFilesDescription: "如果禁用此設定,遠程文件將會被直接連結而非緩存。禁用將節省服務器上的存儲空間,但會因為沒有生成預覽圖而增加流量。" | ||||
| flagAsBot: "此帳戶是Bot" | ||||
| flagAsCat: "此帳戶是Cat" | ||||
| @@ -176,7 +184,6 @@ processing: "處理中" | ||||
| preview: "預覽" | ||||
| default: "預設" | ||||
| noCustomEmojis: "沒有表情符號" | ||||
| customEmojisOfRemote: "來自其他實例的表情符號" | ||||
| noJobs: "沒有任務" | ||||
| federating: "整合搜索中" | ||||
| blocked: "已封鎖" | ||||
| @@ -223,7 +230,7 @@ nUsersRead: "{n}人已讀" | ||||
| tos: "使用條款" | ||||
| start: "開始" | ||||
| home: "首頁" | ||||
| remoteUserCaution: "由於是遠程用戶,信息不完整。" | ||||
| remoteUserCaution: "由於該用戶來自遠端實例,因此資料用戶並未即時更新。" | ||||
| activity: "動態" | ||||
| images: "圖片" | ||||
| birthday: "生日" | ||||
| @@ -293,7 +300,7 @@ disablingTimelinesInfo: "即使您禁用了時間線功能,管理員和協調 | ||||
| registration: "註冊" | ||||
| enableRegistration: "開啟新用戶註冊" | ||||
| invite: "邀請" | ||||
| proxyRemoteFiles: "代理遠程檔案" | ||||
| proxyRemoteFiles: "遠端代理檔案" | ||||
| proxyRemoteFilesDescription: "啟用此設置後,由於超出存儲容量而未保存或刪除的遠程文件將被本地代理,並且將生成預覽圖。這不影響服務器的存儲。" | ||||
| driveCapacityPerLocalAccount: "每個本地用戶的雲端容量" | ||||
| driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量" | ||||
| @@ -316,7 +323,7 @@ antennas: "天線" | ||||
| manageAntennas: "管理天線" | ||||
| name: "名稱" | ||||
| antennaSource: "接收來源" | ||||
| antennaKeywords: "包含的關鍵字" | ||||
| antennaKeywords: "包含關鍵字" | ||||
| antennaExcludeKeywords: "排除關鍵字" | ||||
| antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR" | ||||
| notifyAntenna: "通知我有新的貼文" | ||||
| @@ -430,12 +437,23 @@ category: "類別" | ||||
| tags: "標籤" | ||||
| docSource: "文件來源" | ||||
| createAccount: "建立帳戶" | ||||
| existingAcount: "現有帳戶" | ||||
| regenerate: "再生" | ||||
| fontSize: "字體大小" | ||||
| openImageInNewTab: "於新分頁中開啟圖片" | ||||
| local: "本地" | ||||
| remote: "遠端" | ||||
| total: "合計" | ||||
| clinetSettings: "用戶端設定" | ||||
| appearance: "外觀" | ||||
| accountSettings: "帳戶設置" | ||||
| objectStoragePrefix: "前綴" | ||||
| objectStorageUseSSL: "使用SSL" | ||||
| objectStorageUseProxy: "使用網路代理" | ||||
| serverLogs: "伺服器日誌" | ||||
| deleteAll: "刪除所有記錄" | ||||
| sounds: "音效" | ||||
| none: "無" | ||||
| showInPage: "在頁面中顯示" | ||||
| volume: "音量" | ||||
| details: "詳細資訊" | ||||
| chooseEmoji: "選擇您的表情符號\n" | ||||
| @@ -443,14 +461,21 @@ unableToProcess: "操作無法完成" | ||||
| recentUsed: "最近使用" | ||||
| install: "安裝" | ||||
| uninstall: "解除安裝" | ||||
| installedApps: "已授權的應用程式" | ||||
| nothing: "未發現" | ||||
| installedDate: "安裝時間" | ||||
| lastUsedDate: "最後上線日期" | ||||
| state: "狀態" | ||||
| sort: "排序" | ||||
| ascendingOrder: "昇冪" | ||||
| descendingOrder: "降冪" | ||||
| scratchpad: "暫存記憶體" | ||||
| output: "輸出" | ||||
| script: "腳本" | ||||
| updateRemoteUser: "更新非本地用戶資料" | ||||
| deleteAllFiles: "刪除所有檔案" | ||||
| deleteAllFilesConfirm: "要删除所有檔案吗?" | ||||
| removeAllFollowing: "解除所有追隨" | ||||
| userSuspended: "該用戶已被凍結" | ||||
| userSilenced: "該用戶已被禁言。" | ||||
| sidebar: "側邊列" | ||||
| @@ -468,7 +493,6 @@ enableInfiniteScroll: "啟用自動滾動頁面模式" | ||||
| visibility: "公開範圍" | ||||
| poll: "投票" | ||||
| useCw: "隱藏內容" | ||||
| fixedWidgetsPosition: "固定小工具的位置" | ||||
| enablePlayer: "打開播放器" | ||||
| disablePlayer: "關閉播放器" | ||||
| expandTweet: "展開推文" | ||||
| @@ -497,8 +521,15 @@ smtpHost: "主機" | ||||
| smtpPort: "端口" | ||||
| smtpUser: "使用名稱" | ||||
| smtpPass: "密碼" | ||||
| display: "檢視" | ||||
| copy: "複製" | ||||
| metrics: "指標" | ||||
| logs: "日誌" | ||||
| delayed: "延遲" | ||||
| database: "資料庫" | ||||
| channel: "頻道" | ||||
| create: "新增" | ||||
| notificationSetting: "管理通知" | ||||
| _serverDisconnectedBehavior: | ||||
|   reload: "自動重載" | ||||
|   dialog: "以對話框警告" | ||||
| @@ -515,12 +546,19 @@ _channel: | ||||
|   notesCount: "有{n}個帖子" | ||||
| _sidebar: | ||||
|   icon: "頭像" | ||||
|   hide: "隱藏" | ||||
| _wordMute: | ||||
|   muteWords: "加入靜音文字" | ||||
| _theme: | ||||
|   color: "顏色" | ||||
|   func: "函数" | ||||
|   keys: | ||||
|     bg: "背景" | ||||
|     mention: "提及" | ||||
|     renote: "轉發貼文" | ||||
|     divider: "分割線" | ||||
|     infoBg: "資訊背景" | ||||
|     infoFg: "資訊內容" | ||||
| _sfx: | ||||
|   note: "貼文" | ||||
|   noteMy: "我的貼文" | ||||
| @@ -579,6 +617,8 @@ _permissions: | ||||
|   "write:votes": "投票" | ||||
|   "read:channels": "已查看的頻道" | ||||
|   "write:channels": "操作頻道" | ||||
| _antennaSources: | ||||
|   all: "全部貼文" | ||||
| _weekday: | ||||
|   sunday: "週日" | ||||
|   monday: "週一" | ||||
| @@ -588,33 +628,53 @@ _weekday: | ||||
|   friday: "週五" | ||||
|   saturday: "週六" | ||||
| _widgets: | ||||
|   memo: "備忘錄" | ||||
|   notifications: "通知" | ||||
|   timeline: "時間軸" | ||||
|   calendar: "行事曆" | ||||
|   trends: "發燒貼文" | ||||
|   clock: "時鐘" | ||||
|   rss: "RSS閱讀器" | ||||
|   activity: "動態" | ||||
|   photos: "照片" | ||||
|   digitalClock: "電子時鐘" | ||||
|   federation: "聯邦宇宙" | ||||
| _cw: | ||||
|   hide: "隱藏" | ||||
|   show: "瀏覽更多" | ||||
|   chars: "{count}字元" | ||||
|   files: "{count} 個檔案" | ||||
| _poll: | ||||
|   noOnlyOneChoice: "至少需要兩個選項。" | ||||
|   expiration: "期限" | ||||
|   infinite: "無期限" | ||||
|   deadlineDate: "截止日期" | ||||
|   deadlineTime: "小時" | ||||
|   votesCount: "{n}票" | ||||
|   totalVotes: "一共{n}票" | ||||
|   vote: "投票" | ||||
|   showResult: "顯示結果" | ||||
|   voted: "已投票" | ||||
|   closed: "已結束" | ||||
| _visibility: | ||||
|   home: "首頁" | ||||
|   followers: "追隨者" | ||||
|   localOnly: "僅限本地" | ||||
| _postForm: | ||||
|   channelPlaceholder: "發佈到頻道" | ||||
| _profile: | ||||
|   name: "名稱" | ||||
|   username: "使用名稱" | ||||
|   metadataLabel: "標籤" | ||||
|   metadataContent: "内容" | ||||
| _exportOrImport: | ||||
|   allNotes: "全部貼文" | ||||
|   followingList: "追隨中" | ||||
|   muteList: "消音" | ||||
|   blockingList: "封鎖" | ||||
|   userLists: "清單" | ||||
| _charts: | ||||
|   remoteNotesIncDec: "非本地貼文的數目增减" | ||||
| _instanceCharts: | ||||
|   cacheSize: "增加或減少快取用量" | ||||
|   cacheSizeTotal: "快取大小總計" | ||||
| @@ -632,6 +692,8 @@ _pages: | ||||
|   unlike: "收回喜歡" | ||||
|   blocks: | ||||
|     image: "圖片" | ||||
|     _post: | ||||
|       text: "内容" | ||||
|     _textareaInput: | ||||
|       name: "變數名稱" | ||||
|     numberInput: "輸入數值" | ||||
| @@ -643,6 +705,9 @@ _pages: | ||||
|       text: "標題" | ||||
|     _button: | ||||
|       text: "標題" | ||||
|       _action: | ||||
|         _dialog: | ||||
|           content: "内容" | ||||
|   script: | ||||
|     categories: | ||||
|       value: "數值 " | ||||
| @@ -782,6 +847,7 @@ _relayStatus: | ||||
|   accepted: "已通過核准" | ||||
|   rejected: "已拒絕" | ||||
| _notification: | ||||
|   youRenoted: "{name} 轉發了你的貼文" | ||||
|   youGotPoll: "{name}已投票" | ||||
|   youWereFollowed: "您有新的追隨者" | ||||
|   yourFollowRequestAccepted: "您的追隨請求已通過" | ||||
|   | ||||
							
								
								
									
										32
									
								
								migration/1603094348345-refine-abuse-user-report.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								migration/1603094348345-refine-abuse-user-report.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| import {MigrationInterface, QueryRunner} from "typeorm"; | ||||
|  | ||||
| export class refineAbuseUserReport1603094348345 implements MigrationInterface { | ||||
|     name = 'refineAbuseUserReport1603094348345' | ||||
|  | ||||
|     public async up(queryRunner: QueryRunner): Promise<void> { | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_d049123c413e68ca52abe734203"`); | ||||
|         await queryRunner.query(`DROP INDEX "IDX_d049123c413e68ca52abe73420"`); | ||||
|         await queryRunner.query(`DROP INDEX "IDX_5cd442c3b2e74fdd99dae20243"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" RENAME COLUMN "userId" TO "targetUserId"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "assigneeId" character varying(32)`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "resolved" boolean NOT NULL DEFAULT false`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "comment"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "comment" character varying(2048) NOT NULL`); | ||||
|         await queryRunner.query(`CREATE INDEX "IDX_2b15aaf4a0dc5be3499af7ab6a" ON "abuse_user_report" ("resolved") `); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_08b883dd5fdd6f9c4c1572b36de" FOREIGN KEY ("assigneeId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE NO ACTION`); | ||||
|     } | ||||
|  | ||||
|     public async down(queryRunner: QueryRunner): Promise<void> { | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP CONSTRAINT "FK_08b883dd5fdd6f9c4c1572b36de"`); | ||||
|         await queryRunner.query(`DROP INDEX "IDX_2b15aaf4a0dc5be3499af7ab6a"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "comment"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "comment" character varying(512) NOT NULL`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "resolved"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "assigneeId"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" RENAME COLUMN "targetUserId" TO "userId"`); | ||||
|         await queryRunner.query(`CREATE UNIQUE INDEX "IDX_5cd442c3b2e74fdd99dae20243" ON "abuse_user_report" ("userId", "reporterId") `); | ||||
|         await queryRunner.query(`CREATE INDEX "IDX_d049123c413e68ca52abe73420" ON "abuse_user_report" ("userId") `); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD CONSTRAINT "FK_d049123c413e68ca52abe734203" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										20
									
								
								migration/1603095701770-refine-abuse-user-report2.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								migration/1603095701770-refine-abuse-user-report2.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| import {MigrationInterface, QueryRunner} from "typeorm"; | ||||
|  | ||||
| export class refineAbuseUserReport21603095701770 implements MigrationInterface { | ||||
|     name = 'refineAbuseUserReport21603095701770' | ||||
|  | ||||
|     public async up(queryRunner: QueryRunner): Promise<void> { | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "targetUserHost" character varying(128)`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" ADD "reporterHost" character varying(128)`); | ||||
|         await queryRunner.query(`CREATE INDEX "IDX_4ebbf7f93cdc10e8d1ef2fc6cd" ON "abuse_user_report" ("targetUserHost") `); | ||||
|         await queryRunner.query(`CREATE INDEX "IDX_f8d8b93740ad12c4ce8213a199" ON "abuse_user_report" ("reporterHost") `); | ||||
|     } | ||||
|  | ||||
|     public async down(queryRunner: QueryRunner): Promise<void> { | ||||
|         await queryRunner.query(`DROP INDEX "IDX_f8d8b93740ad12c4ce8213a199"`); | ||||
|         await queryRunner.query(`DROP INDEX "IDX_4ebbf7f93cdc10e8d1ef2fc6cd"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "reporterHost"`); | ||||
|         await queryRunner.query(`ALTER TABLE "abuse_user_report" DROP COLUMN "targetUserHost"`); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										49
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								package.json
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| { | ||||
| 	"name": "misskey", | ||||
| 	"author": "syuilo <syuilotan@yahoo.co.jp>", | ||||
| 	"version": "12.48.3", | ||||
| 	"version": "12.49.1", | ||||
| 	"codename": "indigo", | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
| @@ -46,7 +46,7 @@ | ||||
| 		"@koa/multer": "3.0.0", | ||||
| 		"@koa/router": "9.0.1", | ||||
| 		"@sinonjs/fake-timers": "6.0.1", | ||||
| 		"@syuilo/aiscript": "0.11.0", | ||||
| 		"@syuilo/aiscript": "0.11.1", | ||||
| 		"@types/bcryptjs": "2.4.2", | ||||
| 		"@types/bull": "3.14.0", | ||||
| 		"@types/cbor": "5.0.1", | ||||
| @@ -92,7 +92,7 @@ | ||||
| 		"@types/request-stats": "3.0.0", | ||||
| 		"@types/rimraf": "3.0.0", | ||||
| 		"@types/seedrandom": "2.4.28", | ||||
| 		"@types/sharp": "0.25.0", | ||||
| 		"@types/sharp": "0.26.0", | ||||
| 		"@types/sinonjs__fake-timers": "6.0.1", | ||||
| 		"@types/speakeasy": "2.0.5", | ||||
| 		"@types/tinycolor2": "1.4.2", | ||||
| @@ -104,7 +104,7 @@ | ||||
| 		"@types/websocket": "1.0.1", | ||||
| 		"@types/ws": "7.2.7", | ||||
| 		"@typescript-eslint/parser": "4.4.0", | ||||
| 		"@vue/compiler-sfc": "3.0.0", | ||||
| 		"@vue/compiler-sfc": "3.0.2", | ||||
| 		"abort-controller": "3.0.0", | ||||
| 		"apexcharts": "3.22.0", | ||||
| 		"autobind-decorator": "2.4.0", | ||||
| @@ -123,19 +123,19 @@ | ||||
| 		"content-disposition": "0.5.3", | ||||
| 		"core-js": "3.6.5", | ||||
| 		"crc-32": "1.2.0", | ||||
| 		"css-loader": "4.3.0", | ||||
| 		"css-loader": "5.0.0", | ||||
| 		"cssnano": "4.1.10", | ||||
| 		"dateformat": "3.0.3", | ||||
| 		"deep-entries": "3.1.0", | ||||
| 		"diskusage": "1.1.3", | ||||
| 		"double-ended-queue": "2.1.0-0", | ||||
| 		"escape-regexp": "0.0.1", | ||||
| 		"eslint": "7.10.0", | ||||
| 		"eslint-plugin-vue": "7.0.1", | ||||
| 		"eslint": "7.11.0", | ||||
| 		"eslint-plugin-vue": "7.1.0", | ||||
| 		"eventemitter3": "4.0.7", | ||||
| 		"feed": "4.2.1", | ||||
| 		"fibers": "5.0.0", | ||||
| 		"file-type": "15.0.1", | ||||
| 		"file-type": "16.0.0", | ||||
| 		"fluent-ffmpeg": "2.1.2", | ||||
| 		"glob": "7.1.6", | ||||
| 		"got": "11.7.0", | ||||
| @@ -159,8 +159,8 @@ | ||||
| 		"js-yaml": "3.14.0", | ||||
| 		"jsdom": "16.4.0", | ||||
| 		"json5": "2.1.3", | ||||
| 		"json5-loader": "4.0.0", | ||||
| 		"jsonld": "3.1.1", | ||||
| 		"json5-loader": "4.0.1", | ||||
| 		"jsonld": "3.2.0", | ||||
| 		"jsrsasign": "8.0.20", | ||||
| 		"katex": "0.12.0", | ||||
| 		"koa": "2.13.0", | ||||
| @@ -190,9 +190,9 @@ | ||||
| 		"parsimmon": "1.16.0", | ||||
| 		"pg": "8.4.1", | ||||
| 		"portscanner": "2.2.0", | ||||
| 		"postcss": "8.1.1", | ||||
| 		"postcss-loader": "4.0.3", | ||||
| 		"prismjs": "1.21.0", | ||||
| 		"postcss": "8.1.2", | ||||
| 		"postcss-loader": "4.0.4", | ||||
| 		"prismjs": "1.22.0", | ||||
| 		"probe-image-size": "5.0.0", | ||||
| 		"promise-limit": "2.7.0", | ||||
| 		"promise-sequential": "1.1.1", | ||||
| @@ -202,8 +202,8 @@ | ||||
| 		"qrcode": "1.4.4", | ||||
| 		"random-seed": "0.3.0", | ||||
| 		"ratelimiter": "3.4.1", | ||||
| 		"re2": "1.15.5", | ||||
| 		"recaptcha-promise": "0.1.3", | ||||
| 		"re2": "1.15.8", | ||||
| 		"recaptcha-promise": "1.0.0", | ||||
| 		"reconnecting-websocket": "4.4.0", | ||||
| 		"redis": "3.0.2", | ||||
| 		"redis-lock": "0.1.4", | ||||
| @@ -216,12 +216,12 @@ | ||||
| 		"rndstr": "1.0.0", | ||||
| 		"s-age": "1.1.2", | ||||
| 		"sass": "1.27.0", | ||||
| 		"sass-loader": "10.0.2", | ||||
| 		"sass-loader": "10.0.3", | ||||
| 		"seedrandom": "3.0.5", | ||||
| 		"sharp": "0.26.1", | ||||
| 		"sharp": "0.26.2", | ||||
| 		"speakeasy": "2.0.0", | ||||
| 		"stringz": "2.1.0", | ||||
| 		"style-loader": "1.3.0", | ||||
| 		"style-loader": "2.0.0", | ||||
| 		"summaly": "2.4.0", | ||||
| 		"syslog-pro": "1.0.0", | ||||
| 		"systeminformation": "4.27.8", | ||||
| @@ -230,32 +230,31 @@ | ||||
| 		"three": "0.117.1", | ||||
| 		"tinycolor2": "1.4.2", | ||||
| 		"tmp": "0.2.1", | ||||
| 		"ts-loader": "8.0.4", | ||||
| 		"ts-loader": "8.0.6", | ||||
| 		"ts-node": "9.0.0", | ||||
| 		"tslint": "6.1.3", | ||||
| 		"tslint-sonarts": "1.9.0", | ||||
| 		"typeorm": "0.2.28", | ||||
| 		"typescript": "4.0.3", | ||||
| 		"ulid": "2.3.0", | ||||
| 		"url-loader": "4.1.0", | ||||
| 		"url-loader": "4.1.1", | ||||
| 		"uuid": "8.3.1", | ||||
| 		"v-debounce": "0.1.2", | ||||
| 		"vue": "3.0.1", | ||||
| 		"vue": "3.0.2", | ||||
| 		"vue-color": "2.7.1", | ||||
| 		"vue-draggable-next": "1.0.8", | ||||
| 		"vue-i18n": "9.0.0-beta.4", | ||||
| 		"vue-i18n": "9.0.0-beta.6", | ||||
| 		"vue-json-pretty": "1.7.0", | ||||
| 		"vue-loader": "16.0.0-beta.7", | ||||
| 		"vue-loader": "16.0.0-beta.8", | ||||
| 		"vue-prism-editor": "1.2.2", | ||||
| 		"vue-router": "4.0.0-beta.13", | ||||
| 		"vue-style-loader": "4.1.2", | ||||
| 		"vue-svg-inline-loader-corejs3": "1.5.0", | ||||
| 		"vue-template-compiler": "2.6.12", | ||||
| 		"vuex": "4.0.0-beta.4", | ||||
| 		"vuex-persistedstate": "3.1.0", | ||||
| 		"web-push": "3.4.4", | ||||
| 		"webpack": "5.1.3", | ||||
| 		"webpack-cli": "3.3.12", | ||||
| 		"webpack-cli": "4.1.0", | ||||
| 		"websocket": "1.0.32", | ||||
| 		"ws": "7.3.1", | ||||
| 		"xev": "2.0.1" | ||||
|   | ||||
							
								
								
									
										85
									
								
								src/client/components/abuse-report-window.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								src/client/components/abuse-report-window.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,85 @@ | ||||
| <template> | ||||
| <XWindow ref="window" :initial-width="400" :initial-height="500" :can-resize="true" @closed="$emit('closed')"> | ||||
| 	<template #header> | ||||
| 		<Fa :icon="faExclamationCircle" style="margin-right: 0.5em;"/> | ||||
| 		<i18n-t keypath="reportAbuseOf" tag="span"> | ||||
| 			<template #name> | ||||
| 				<b><MkAcct :user="user"/></b> | ||||
| 			</template> | ||||
| 		</i18n-t> | ||||
| 	</template> | ||||
| 	<div class="dpvffvvy"> | ||||
| 		<div class="_section"> | ||||
| 			<div class="_content"> | ||||
| 				<MkTextarea v-model:value="comment"> | ||||
| 					<span>{{ $t('details') }}</span> | ||||
| 					<template #desc>{{ $t('fillAbuseReportDescription') }}</template> | ||||
| 				</MkTextarea> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		<div class="_section"> | ||||
| 			<div class="_content"> | ||||
| 				<MkButton @click="send" primary full :disabled="comment.length === 0">{{ $t('send') }}</MkButton> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| </XWindow> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import { faExclamationCircle } from '@fortawesome/free-solid-svg-icons'; | ||||
| import XWindow from '@/components/ui/window.vue'; | ||||
| import MkTextarea from '@/components/ui/textarea.vue'; | ||||
| import MkButton from '@/components/ui/button.vue'; | ||||
| import * as os from '@/os'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		XWindow, | ||||
| 		MkTextarea, | ||||
| 		MkButton, | ||||
| 	}, | ||||
|  | ||||
| 	props: { | ||||
| 		user: { | ||||
| 			type: Object, | ||||
| 			required: true, | ||||
| 		}, | ||||
| 		initialComment: { | ||||
| 			type: String, | ||||
| 			required: false, | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	emits: ['closed'], | ||||
|  | ||||
| 	data() { | ||||
| 		return { | ||||
| 			comment: this.initialComment || '', | ||||
| 			faExclamationCircle, | ||||
| 		}; | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		send() { | ||||
| 			os.apiWithDialog('users/report-abuse', { | ||||
| 				userId: this.user.id, | ||||
| 				comment: this.comment, | ||||
| 			}, undefined, res => { | ||||
| 				os.dialog({ | ||||
| 					type: 'success', | ||||
| 					text: this.$t('abuseReported') | ||||
| 				}); | ||||
| 				this.$refs.window.close(); | ||||
| 			}); | ||||
| 		} | ||||
| 	}, | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .dpvffvvy { | ||||
| 	--section-padding: 16px; | ||||
| } | ||||
| </style> | ||||
| @@ -1,102 +0,0 @@ | ||||
| <template> | ||||
| <div class="eqryymyo"> | ||||
| 	<div class="header"> | ||||
| 		<time ref="time" class="_ghost"> | ||||
| 			<span class="yyyymmdd">{{ yyyy }}/{{ mm }}/{{ dd }}</span> | ||||
| 			<br> | ||||
| 			<span class="hhnn">{{ hh }}<span :style="{ visibility: now.getSeconds() % 2 == 0 ? 'visible' : 'hidden' }">:</span>{{ nn }}</span> | ||||
| 		</time> | ||||
| 	</div> | ||||
| 	<div class="content _panel _ghost"> | ||||
| 		<MkClock/> | ||||
| 	</div> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import MkClock from './analog-clock.vue'; | ||||
| import * as os from '@/os'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		MkClock | ||||
| 	}, | ||||
| 	data() { | ||||
| 		return { | ||||
| 			now: new Date(), | ||||
| 			clock: null | ||||
| 		}; | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		yyyy(): number { | ||||
| 			return this.now.getFullYear(); | ||||
| 		}, | ||||
| 		mm(): string { | ||||
| 			return ('0' + (this.now.getMonth() + 1)).slice(-2); | ||||
| 		}, | ||||
| 		dd(): string { | ||||
| 			return ('0' + this.now.getDate()).slice(-2); | ||||
| 		}, | ||||
| 		hh(): string { | ||||
| 			return ('0' + this.now.getHours()).slice(-2); | ||||
| 		}, | ||||
| 		nn(): string { | ||||
| 			return ('0' + this.now.getMinutes()).slice(-2); | ||||
| 		} | ||||
| 	}, | ||||
| 	mounted() { | ||||
| 		this.tick(); | ||||
| 		this.clock = setInterval(this.tick, 1000); | ||||
| 	}, | ||||
| 	beforeUnmount() { | ||||
| 		clearInterval(this.clock); | ||||
| 	}, | ||||
| 	methods: { | ||||
| 		tick() { | ||||
| 			this.now = new Date(); | ||||
| 		} | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .eqryymyo { | ||||
| 	display: inline-block; | ||||
| 	overflow: visible; | ||||
|  | ||||
| 	> .header { | ||||
| 		padding: 0 12px; | ||||
| 		padding-top: 4px; | ||||
| 		text-align: center; | ||||
| 		font-size: 12px; | ||||
| 		font-family: Lucida Console, Courier, monospace; | ||||
|  | ||||
| 		&:hover + .content { | ||||
| 			opacity: 1; | ||||
| 		} | ||||
|  | ||||
| 		> time { | ||||
| 			display: table-cell; | ||||
| 			vertical-align: middle; | ||||
| 			height: 48px; | ||||
|  | ||||
| 			> .yyyymmdd { | ||||
| 				opacity: 0.7; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	> .content { | ||||
| 		opacity: 0; | ||||
| 		display: block; | ||||
| 		position: absolute; | ||||
| 		top: auto; | ||||
| 		right: 0; | ||||
| 		margin: 16px 0 0 0; | ||||
| 		padding: 16px; | ||||
| 		width: 230px; | ||||
| 		transition: opacity 0.2s ease; | ||||
| 	} | ||||
| } | ||||
| </style> | ||||
| @@ -101,7 +101,7 @@ | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { computed, defineAsyncComponent, defineComponent, markRaw, ref } from 'vue'; | ||||
| import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug, faExclamationCircle } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons'; | ||||
| import { parse } from '../../mfm/parse'; | ||||
| import { sum, unique } from '../../prelude/array'; | ||||
| @@ -637,6 +637,21 @@ export default defineComponent({ | ||||
| 					}] | ||||
| 					: [] | ||||
| 				), | ||||
| 				...(this.appearNote.userId != this.$store.state.i.id ? [ | ||||
| 					null, | ||||
| 					{ | ||||
| 						icon: faExclamationCircle, | ||||
| 						text: this.$t('reportAbuse'), | ||||
| 						action: () => { | ||||
| 							const u = `${url}/notes/${this.appearNote.id}`; | ||||
| 							os.popup(defineAsyncComponent(() => import('@/components/abuse-report-window.vue')), { | ||||
| 								user: this.appearNote.user, | ||||
| 								initialComment: `Note: ${u}\n-----\n` | ||||
| 							}, {}, 'closed'); | ||||
| 						} | ||||
| 					}] | ||||
| 					: [] | ||||
| 				), | ||||
| 				...(this.appearNote.userId == this.$store.state.i.id || this.$store.state.i.isModerator || this.$store.state.i.isAdmin ? [ | ||||
| 					null, | ||||
| 					this.appearNote.userId == this.$store.state.i.id ? { | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
| 		<button class="_button" @click="expand" v-tooltip="$t('showInPage')"><Fa :icon="faExpandAlt"/></button> | ||||
| 		<button class="_button" @click="popout" v-tooltip="$t('popout')"><Fa :icon="faExternalLinkAlt"/></button> | ||||
| 	</template> | ||||
| 	<div style="min-height: 100%; background: var(--bg);"> | ||||
| 	<div class="yrolvcoq" style="min-height: 100%; background: var(--bg);"> | ||||
| 		<component :is="component" v-bind="props" :ref="changePage"/> | ||||
| 	</div> | ||||
| </XWindow> | ||||
| @@ -84,3 +84,9 @@ export default defineComponent({ | ||||
| 	}, | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .yrolvcoq { | ||||
| 	--section-padding: 16px; | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -46,7 +46,7 @@ | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { faGripVertical, faChevronLeft, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faListUl, faPlus, faUserClock, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer, faInfoCircle, faQuestionCircle, faProjectDiagram, faStream } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faGripVertical, faChevronLeft, faHashtag, faBroadcastTower, faFireAlt, faEllipsisH, faPencilAlt, faBars, faTimes, faSearch, faUserCog, faCog, faUser, faHome, faStar, faCircle, faAt, faListUl, faPlus, faUserClock, faUsers, faTachometerAlt, faExchangeAlt, faGlobe, faChartBar, faCloud, faServer, faInfoCircle, faQuestionCircle, faProjectDiagram, faStream, faExclamationCircle } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faBell, faEnvelope, faLaugh, faComments } from '@fortawesome/free-regular-svg-icons'; | ||||
| import { host, instanceName } from '@/config'; | ||||
| import { search } from '@/scripts/search'; | ||||
| @@ -217,6 +217,11 @@ export default defineComponent({ | ||||
| 				text: this.$t('announcements'), | ||||
| 				to: '/instance/announcements', | ||||
| 				icon: faBroadcastTower, | ||||
| 			}, { | ||||
| 				type: 'link', | ||||
| 				text: this.$t('abuseReports'), | ||||
| 				to: '/instance/abuses', | ||||
| 				icon: faExclamationCircle, | ||||
| 			}, { | ||||
| 				type: 'link', | ||||
| 				text: this.$t('logs'), | ||||
|   | ||||
| @@ -7,7 +7,9 @@ | ||||
| 				<span class="title" @mousedown.prevent="onHeaderMousedown" @touchstart.prevent="onHeaderMousedown"> | ||||
| 					<slot name="header"></slot> | ||||
| 				</span> | ||||
| 				<slot name="buttons"></slot> | ||||
| 				<slot name="buttons"> | ||||
| 					<button class="_button" style="pointer-events: none;"></button> | ||||
| 				</slot> | ||||
| 			</div> | ||||
| 			<div class="body" v-if="padding"> | ||||
| 				<div class="_section"> | ||||
| @@ -313,11 +315,13 @@ export default defineComponent({ | ||||
|  | ||||
| 		// 高さを適用 | ||||
| 		applyTransformHeight(height) { | ||||
| 			if (height > window.innerHeight) height = window.innerHeight; | ||||
| 			(this.$el as any).style.height = height + 'px'; | ||||
| 		}, | ||||
|  | ||||
| 		// 幅を適用 | ||||
| 		applyTransformWidth(width) { | ||||
| 			if (width > window.innerWidth) width = window.innerWidth; | ||||
| 			(this.$el as any).style.width = width + 'px'; | ||||
| 		}, | ||||
|  | ||||
| @@ -371,8 +375,6 @@ export default defineComponent({ | ||||
| 		width: 100%; | ||||
|     height: 100%; | ||||
|  | ||||
| 		--section-padding: 16px; | ||||
|  | ||||
| 		> .header { | ||||
| 			$height: 50px; | ||||
| 			display: flex; | ||||
| @@ -380,7 +382,6 @@ export default defineComponent({ | ||||
| 			z-index: 1; | ||||
| 			flex-shrink: 0; | ||||
| 			box-shadow: 0px 1px var(--divider); | ||||
| 			cursor: move; | ||||
| 			user-select: none; | ||||
| 			height: $height; | ||||
|  | ||||
| @@ -400,6 +401,8 @@ export default defineComponent({ | ||||
| 				white-space: nowrap; | ||||
| 				overflow: hidden; | ||||
| 				text-overflow: ellipsis; | ||||
| 				text-align: center; | ||||
| 				cursor: move; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import Stream from '@/scripts/stream'; | ||||
| import { store } from '@/store'; | ||||
| import { apiUrl } from '@/config'; | ||||
| import MkPostFormDialog from '@/components/post-form-dialog.vue'; | ||||
| import MkWaitingDialog from '@/components/waiting-dialog.vue'; | ||||
|  | ||||
| const ua = navigator.userAgent.toLowerCase(); | ||||
| export const isMobile = /mobile|iphone|ipad|android/.test(ua); | ||||
| @@ -73,7 +74,7 @@ export function apiWithDialog( | ||||
| 	promiseDialog(promise, onSuccess, onFailure ? onFailure : (e) => { | ||||
| 		dialog({ | ||||
| 			type: 'error', | ||||
| 			text: e.message + '\n' + (e as any).id, | ||||
| 			text: e.message + '<br>' + (e as any).id, | ||||
| 		}); | ||||
| 	}); | ||||
|  | ||||
| @@ -111,7 +112,8 @@ export function promiseDialog<T extends Promise<any>>( | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	popup(defineAsyncComponent(() => import('@/components/waiting-dialog.vue')), { | ||||
| 	// NOTE: dynamic importすると挙動がおかしくなる(showingの変更が伝播しない) | ||||
| 	popup(MkWaitingDialog, { | ||||
| 		success: success, | ||||
| 		showing: showing, | ||||
| 		text: text, | ||||
|   | ||||
							
								
								
									
										163
									
								
								src/client/pages/instance/abuses.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								src/client/pages/instance/abuses.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | ||||
| <template> | ||||
| <div class=""> | ||||
| 	<div class="_section reports"> | ||||
| 		<div class="_content"> | ||||
| 			<div class="inputs" style="display: flex;"> | ||||
| 				<MkSelect v-model:value="state" style="margin: 0; flex: 1;"> | ||||
| 					<template #label>{{ $t('state') }}</template> | ||||
| 					<option value="all">{{ $t('all') }}</option> | ||||
| 					<option value="unresolved">{{ $t('unresolved') }}</option> | ||||
| 					<option value="resolved">{{ $t('resolved') }}</option> | ||||
| 				</MkSelect> | ||||
| 				<MkSelect v-model:value="targetUserOrigin" style="margin: 0; flex: 1;"> | ||||
| 					<template #label>{{ $t('targetUserOrigin') }}</template> | ||||
| 					<option value="combined">{{ $t('all') }}</option> | ||||
| 					<option value="local">{{ $t('local') }}</option> | ||||
| 					<option value="remote">{{ $t('remote') }}</option> | ||||
| 				</MkSelect> | ||||
| 				<MkSelect v-model:value="reporterOrigin" style="margin: 0; flex: 1;"> | ||||
| 					<template #label>{{ $t('reporterOrigin') }}</template> | ||||
| 					<option value="combined">{{ $t('all') }}</option> | ||||
| 					<option value="local">{{ $t('local') }}</option> | ||||
| 					<option value="remote">{{ $t('remote') }}</option> | ||||
| 				</MkSelect> | ||||
| 			</div> | ||||
| 			<!-- TODO | ||||
| 			<div class="inputs" style="display: flex; padding-top: 1.2em;"> | ||||
| 				<MkInput v-model:value="searchUsername" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.reports.reload()"> | ||||
| 					<span>{{ $t('username') }}</span> | ||||
| 				</MkInput> | ||||
| 				<MkInput v-model:value="searchHost" style="margin: 0; flex: 1;" type="text" spellcheck="false" @update:value="$refs.reports.reload()" :disabled="pagination.params().origin === 'local'"> | ||||
| 					<span>{{ $t('host') }}</span> | ||||
| 				</MkInput> | ||||
| 			</div> | ||||
| 			--> | ||||
|  | ||||
| 			<MkPagination :pagination="pagination" #default="{items}" ref="reports" :auto-margin="false" style="margin-top: var(--margin);"> | ||||
| 				<div class="bcekxzvu _card _vMargin" v-for="report in items" :key="report.id"> | ||||
| 					<div class="_content target"> | ||||
| 						<MkAvatar class="avatar" :user="report.targetUser"/> | ||||
| 						<div class="info"> | ||||
| 							<MkUserName class="name" :user="report.targetUser"/> | ||||
| 							<div class="acct">@{{ acct(report.targetUser) }}</div> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="_content"> | ||||
| 						<div> | ||||
| 							<Mfm :text="report.comment"/> | ||||
| 						</div> | ||||
| 						<hr> | ||||
| 						<div>Reporter: <MkAcct :user="report.reporter"/></div> | ||||
| 						<div><MkTime :time="report.createdAt"/></div> | ||||
| 					</div> | ||||
| 					<div class="_footer"> | ||||
| 						<div v-if="report.assignee">Assignee: <MkAcct :user="report.assignee"/></div> | ||||
| 						<MkButton @click="resolve(report)" primary v-if="!report.resolved">{{ $t('abuseMarkAsResolved') }}</MkButton> | ||||
| 					</div> | ||||
| 				</div> | ||||
| 			</MkPagination> | ||||
| 		</div> | ||||
| 	</div> | ||||
| </div> | ||||
| </template> | ||||
|  | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { faPlus, faUsers, faSearch, faBookmark, faMicrophoneSlash, faExclamationCircle } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faSnowflake, faBookmark as farBookmark } from '@fortawesome/free-regular-svg-icons'; | ||||
| import parseAcct from '../../../misc/acct/parse'; | ||||
| import MkButton from '@/components/ui/button.vue'; | ||||
| import MkInput from '@/components/ui/input.vue'; | ||||
| import MkSelect from '@/components/ui/select.vue'; | ||||
| import MkPagination from '@/components/ui/pagination.vue'; | ||||
| import { acct } from '../../filters/user'; | ||||
| import * as os from '@/os'; | ||||
|  | ||||
| export default defineComponent({ | ||||
| 	components: { | ||||
| 		MkButton, | ||||
| 		MkInput, | ||||
| 		MkSelect, | ||||
| 		MkPagination, | ||||
| 	}, | ||||
|  | ||||
| 	data() { | ||||
| 		return { | ||||
| 			INFO: { | ||||
| 				header: [{ | ||||
| 					title: this.$t('abuseReports'), | ||||
| 					icon: faExclamationCircle | ||||
| 				}], | ||||
| 			}, | ||||
| 			searchUsername: '', | ||||
| 			searchHost: '', | ||||
| 			state: 'unresolved', | ||||
| 			reporterOrigin: 'combined', | ||||
| 			targetUserOrigin: 'combined', | ||||
| 			pagination: { | ||||
| 				endpoint: 'admin/abuse-user-reports', | ||||
| 				limit: 10, | ||||
| 				params: () => ({ | ||||
| 					state: this.state, | ||||
| 					reporterOrigin: this.reporterOrigin, | ||||
| 					targetUserOrigin: this.targetUserOrigin, | ||||
| 				}), | ||||
| 			}, | ||||
| 			faPlus, faUsers, faSearch, faBookmark, farBookmark, faMicrophoneSlash, faSnowflake | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	watch: { | ||||
| 		state() { | ||||
| 			this.$refs.reports.reload(); | ||||
| 		}, | ||||
|  | ||||
| 		reporterOrigin() { | ||||
| 			this.$refs.reports.reload(); | ||||
| 		}, | ||||
|  | ||||
| 		targetUserOrigin() { | ||||
| 			this.$refs.reports.reload(); | ||||
| 		}, | ||||
| 	}, | ||||
|  | ||||
| 	methods: { | ||||
| 		acct, | ||||
|  | ||||
| 		resolve(report) { | ||||
| 			os.apiWithDialog('admin/resolve-abuse-user-report', { | ||||
| 				reportId: report.id, | ||||
| 			}).then(() => { | ||||
| 				this.$refs.reports.removeItem(item => item.id === report.id); | ||||
| 			}); | ||||
| 		}, | ||||
| 	} | ||||
| }); | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .bcekxzvu { | ||||
| 	> .target { | ||||
| 		display: flex; | ||||
| 		width: 100%; | ||||
| 		box-sizing: border-box; | ||||
| 		text-align: left; | ||||
| 		align-items: center; | ||||
| 					 | ||||
| 		> .avatar { | ||||
| 			width: 42px; | ||||
| 			height: 42px; | ||||
| 		} | ||||
|  | ||||
| 		> .info { | ||||
| 			margin-left: 0.3em; | ||||
| 			padding: 0 8px; | ||||
| 			flex: 1; | ||||
|  | ||||
| 			> .name { | ||||
| 				font-weight: bold; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| </style> | ||||
| @@ -86,6 +86,7 @@ export const router = createRouter({ | ||||
| 		{ path: '/instance/federation', component: page('instance/federation') }, | ||||
| 		{ path: '/instance/relays', component: page('instance/relays') }, | ||||
| 		{ path: '/instance/announcements', component: page('instance/announcements') }, | ||||
| 		{ path: '/instance/abuses', component: page('instance/abuses') }, | ||||
| 		{ path: '/notes/:note', name: 'note', component: page('note') }, | ||||
| 		{ path: '/tags/:tag', component: page('tag') }, | ||||
| 		{ path: '/auth/:token', component: page('auth') }, | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import { faAt, faListUl, faEye, faEyeSlash, faBan, faPencilAlt, faComments, faUsers, faMicrophoneSlash, faPlug } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faAt, faListUl, faEye, faEyeSlash, faBan, faPencilAlt, faComments, faUsers, faMicrophoneSlash, faPlug, faExclamationCircle } from '@fortawesome/free-solid-svg-icons'; | ||||
| import { faSnowflake, faEnvelope } from '@fortawesome/free-regular-svg-icons'; | ||||
| import { i18n } from '@/i18n'; | ||||
| import copyToClipboard from '@/scripts/copy-to-clipboard'; | ||||
| @@ -102,6 +102,12 @@ export function getUserMenu(user) { | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	async function reportAbuse() { | ||||
| 		os.popup(await import('@/components/abuse-report-window.vue'), { | ||||
| 			user: user, | ||||
| 		}, {}, 'closed'); | ||||
| 	} | ||||
|  | ||||
| 	async function getConfirmed(text: string): Promise<boolean> { | ||||
| 		const confirm = await os.dialog({ | ||||
| 			type: 'warning', | ||||
| @@ -157,6 +163,12 @@ export function getUserMenu(user) { | ||||
| 			action: toggleBlock | ||||
| 		}]); | ||||
|  | ||||
| 		menu = menu.concat([null, { | ||||
| 			icon: faExclamationCircle, | ||||
| 			text: i18n.global.t('reportAbuse'), | ||||
| 			action: reportAbuse | ||||
| 		}]); | ||||
|  | ||||
| 		if (store.getters.isSignedIn && (store.state.i.isAdmin || store.state.i.isModerator)) { | ||||
| 			menu = menu.concat([null, { | ||||
| 				icon: faMicrophoneSlash, | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import { User } from './user'; | ||||
| import { id } from '../id'; | ||||
|  | ||||
| @Entity() | ||||
| @Index(['userId', 'reporterId'], { unique: true }) | ||||
| export class AbuseUserReport { | ||||
| 	@PrimaryColumn(id()) | ||||
| 	public id: string; | ||||
| @@ -16,13 +15,13 @@ export class AbuseUserReport { | ||||
|  | ||||
| 	@Index() | ||||
| 	@Column(id()) | ||||
| 	public userId: User['id']; | ||||
| 	public targetUserId: User['id']; | ||||
|  | ||||
| 	@ManyToOne(type => User, { | ||||
| 		onDelete: 'CASCADE' | ||||
| 	}) | ||||
| 	@JoinColumn() | ||||
| 	public user: User | null; | ||||
| 	public targetUser: User | null; | ||||
|  | ||||
| 	@Index() | ||||
| 	@Column(id()) | ||||
| @@ -34,8 +33,42 @@ export class AbuseUserReport { | ||||
| 	@JoinColumn() | ||||
| 	public reporter: User | null; | ||||
|  | ||||
| 	@Column({ | ||||
| 		...id(), | ||||
| 		nullable: true | ||||
| 	}) | ||||
| 	public assigneeId: User['id'] | null; | ||||
|  | ||||
| 	@ManyToOne(type => User, { | ||||
| 		onDelete: 'SET NULL' | ||||
| 	}) | ||||
| 	@JoinColumn() | ||||
| 	public assignee: User | null; | ||||
|  | ||||
| 	@Index() | ||||
| 	@Column('boolean', { | ||||
| 		default: false | ||||
| 	}) | ||||
| 	public resolved: boolean; | ||||
|  | ||||
| 	@Column('varchar', { | ||||
| 		length: 512, | ||||
| 		length: 2048, | ||||
| 	}) | ||||
| 	public comment: string; | ||||
|  | ||||
| 	//#region Denormalized fields | ||||
| 	@Index() | ||||
| 	@Column('varchar', { | ||||
| 		length: 128, nullable: true, | ||||
| 		comment: '[Denormalized]' | ||||
| 	}) | ||||
| 	public targetUserHost: string | null; | ||||
|  | ||||
| 	@Index() | ||||
| 	@Column('varchar', { | ||||
| 		length: 128, nullable: true, | ||||
| 		comment: '[Denormalized]' | ||||
| 	}) | ||||
| 	public reporterHost: string | null; | ||||
| 	//#endregion | ||||
| } | ||||
|   | ||||
| @@ -15,14 +15,19 @@ export class AbuseUserReportRepository extends Repository<AbuseUserReport> { | ||||
| 			id: report.id, | ||||
| 			createdAt: report.createdAt, | ||||
| 			comment: report.comment, | ||||
| 			resolved: report.resolved, | ||||
| 			reporterId: report.reporterId, | ||||
| 			userId: report.userId, | ||||
| 			targetUserId: report.targetUserId, | ||||
| 			assigneeId: report.assigneeId, | ||||
| 			reporter: Users.pack(report.reporter || report.reporterId, null, { | ||||
| 				detail: true | ||||
| 			}), | ||||
| 			user: Users.pack(report.user || report.userId, null, { | ||||
| 			targetUser: Users.pack(report.targetUser || report.targetUserId, null, { | ||||
| 				detail: true | ||||
| 			}), | ||||
| 			assignee: report.assigneeId ? Users.pack(report.assignee || report.assigneeId, null, { | ||||
| 				detail: true | ||||
| 			}) : null, | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -19,8 +19,10 @@ export default async (actor: IRemoteUser, activity: IFlag): Promise<string> => { | ||||
| 	await AbuseUserReports.insert({ | ||||
| 		id: genId(), | ||||
| 		createdAt: new Date(), | ||||
| 		userId: users[0].id, | ||||
| 		targetUserId: users[0].id, | ||||
| 		targetUserHost: users[0].host, | ||||
| 		reporterId: actor.id, | ||||
| 		reporterHost: actor.host, | ||||
| 		comment: `${activity.content}\n${JSON.stringify(uris, null, 2)}` | ||||
| 	}); | ||||
|  | ||||
|   | ||||
| @@ -23,12 +23,50 @@ export const meta = { | ||||
| 		untilId: { | ||||
| 			validator: $.optional.type(ID), | ||||
| 		}, | ||||
|  | ||||
| 		state: { | ||||
| 			validator: $.optional.nullable.str, | ||||
| 			default: null, | ||||
| 		}, | ||||
|  | ||||
| 		reporterOrigin: { | ||||
| 			validator: $.optional.str.or([ | ||||
| 				'combined', | ||||
| 				'local', | ||||
| 				'remote', | ||||
| 			]), | ||||
| 			default: 'combined' | ||||
| 		}, | ||||
|  | ||||
| 		targetUserOrigin: { | ||||
| 			validator: $.optional.str.or([ | ||||
| 				'combined', | ||||
| 				'local', | ||||
| 				'remote', | ||||
| 			]), | ||||
| 			default: 'combined' | ||||
| 		}, | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| export default define(meta, async (ps) => { | ||||
| 	const query = makePaginationQuery(AbuseUserReports.createQueryBuilder('report'), ps.sinceId, ps.untilId); | ||||
|  | ||||
| 	switch (ps.state) { | ||||
| 		case 'resolved': query.andWhere('report.resolved = TRUE'); break; | ||||
| 		case 'unresolved': query.andWhere('report.resolved = FALSE'); break; | ||||
| 	} | ||||
|  | ||||
| 	switch (ps.reporterOrigin) { | ||||
| 		case 'local': query.andWhere('report.reporterHost IS NULL'); break; | ||||
| 		case 'remote': query.andWhere('report.reporterHost IS NOT NULL'); break; | ||||
| 	} | ||||
|  | ||||
| 	switch (ps.targetUserOrigin) { | ||||
| 		case 'local': query.andWhere('report.targetUserHost IS NULL'); break; | ||||
| 		case 'remote': query.andWhere('report.targetUserHost IS NOT NULL'); break; | ||||
| 	} | ||||
|  | ||||
| 	const reports = await query.take(ps.limit!).getMany(); | ||||
|  | ||||
| 	return await AbuseUserReports.packMany(reports); | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import { getConnection } from 'typeorm'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true as const, | ||||
| 	requireAdmin: true, | ||||
| 	requireModerator: true, | ||||
|  | ||||
| 	desc: { | ||||
|   | ||||
| @@ -16,12 +16,15 @@ export const meta = { | ||||
| 	} | ||||
| }; | ||||
| 
 | ||||
| export default define(meta, async (ps) => { | ||||
| export default define(meta, async (ps, me) => { | ||||
| 	const report = await AbuseUserReports.findOne(ps.reportId); | ||||
| 
 | ||||
| 	if (report == null) { | ||||
| 		throw new Error('report not found'); | ||||
| 	} | ||||
| 
 | ||||
| 	await AbuseUserReports.delete(report.id); | ||||
| 	await AbuseUserReports.update(report.id, { | ||||
| 		resolved: true, | ||||
| 		assigneeId: me.id, | ||||
| 	}); | ||||
| }); | ||||
| @@ -6,7 +6,6 @@ import redis from '../../../../db/redis'; | ||||
|  | ||||
| export const meta = { | ||||
| 	requireCredential: true as const, | ||||
| 	requireAdmin: true, | ||||
| 	requireModerator: true, | ||||
|  | ||||
| 	desc: { | ||||
|   | ||||
| @@ -26,7 +26,7 @@ export const meta = { | ||||
| 		}, | ||||
|  | ||||
| 		comment: { | ||||
| 			validator: $.str.range(1, 3000), | ||||
| 			validator: $.str.range(1, 2048), | ||||
| 			desc: { | ||||
| 				'ja-JP': '迷惑行為の詳細' | ||||
| 			} | ||||
| @@ -72,9 +72,11 @@ export default define(meta, async (ps, me) => { | ||||
| 	const report = await AbuseUserReports.save({ | ||||
| 		id: genId(), | ||||
| 		createdAt: new Date(), | ||||
| 		userId: user.id, | ||||
| 		targetUserId: user.id, | ||||
| 		targetUserHost: user.host, | ||||
| 		reporterId: me.id, | ||||
| 		comment: ps.comment | ||||
| 		reporterHost: null, | ||||
| 		comment: ps.comment, | ||||
| 	}); | ||||
|  | ||||
| 	// Publish event to moderators | ||||
| @@ -90,7 +92,7 @@ export default define(meta, async (ps, me) => { | ||||
| 		for (const moderator of moderators) { | ||||
| 			publishAdminStream(moderator.id, 'newAbuseUserReport', { | ||||
| 				id: report.id, | ||||
| 				userId: report.userId, | ||||
| 				targetUserId: report.targetUserId, | ||||
| 				reporterId: report.reporterId, | ||||
| 				comment: report.comment | ||||
| 			}); | ||||
|   | ||||
| @@ -50,8 +50,6 @@ module.exports = { | ||||
| 						preserveWhitespace: false | ||||
| 					} | ||||
| 				} | ||||
| 			}, { | ||||
| 				loader: 'vue-svg-inline-loader-corejs3' | ||||
| 			}] | ||||
| 		}, { | ||||
| 			test: /\.scss?$/, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user