Merge branch 'develop' into notification-read-api

This commit is contained in:
tamaina 2022-01-28 15:46:26 +09:00
commit cbb5858316
172 changed files with 1968 additions and 3300 deletions

View File

@ -4,6 +4,5 @@
"eg2.vscode-npm-script", "eg2.vscode-npm-script",
"dbaeumer.vscode-eslint", "dbaeumer.vscode-eslint",
"johnsoncodehk.volar", "johnsoncodehk.volar",
"sysoev.language-stylus"
] ]
} }

View File

@ -9,6 +9,25 @@
## 12.x.x (unreleased) ## 12.x.x (unreleased)
### Improvements
### Bugfixes
- 投稿のNSFW画像を表示したあとにリアクションが更新されると画像が非表示になる問題を修正
- 「クリップ」ページが開かない問題を修正
- トレンドウィジェットが動作しないのを修正
- リアクション設定で絵文字ピッカーが開かないのを修正
- DMページでメンションが含まれる問題を修正
## 12.102.1 (2022/01/27)
### Bugfixes
- チャットが表示できない問題を修正
## 12.102.0 (2022/01/27)
### NOTE
アップデート後、一部カスタム絵文字が表示できなくなる場合があります。その場合、一旦絵文字管理ページから絵文字を一括エクスポートし、再度コントロールパネルから一括インポートすると直ります。
⚠ 12.102.0以前にエクスポートされたzipとは互換性がありません。アップデートしてからエクスポートを行なってください。
### Changes ### Changes
- Room機能が削除されました - Room機能が削除されました
- 後日別リポジトリとして復活予定です - 後日別リポジトリとして復活予定です
@ -22,8 +41,12 @@
- カスタム絵文字一括編集機能 - カスタム絵文字一括編集機能
- カスタム絵文字一括インポート - カスタム絵文字一括インポート
- 投稿フォームで一時的に投稿するアカウントを切り替えられるように - 投稿フォームで一時的に投稿するアカウントを切り替えられるように
- Unifying Misskey-specific IRIs in JSON-LD `@context`
- クライアントのパフォーマンス向上
- セキュリティの向上
### Bugfixes ### Bugfixes
- アップロードエラー時の処理を修正
## 12.101.1 (2021/12/29) ## 12.101.1 (2021/12/29)

View File

@ -87,14 +87,18 @@ Configuration files are located in [`/.github/workflows`](/.github/workflows).
## Vue ## Vue
Misskey uses Vue(v3) as its front-end framework. Misskey uses Vue(v3) as its front-end framework.
**When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.** - Use TypeScript.
Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome. - **When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.**
- Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome.
## Notes ## Notes
### How to resolve conflictions occurred at yarn.lock? ### How to resolve conflictions occurred at yarn.lock?
Just execute `yarn` to fix it. Just execute `yarn` to fix it.
### INSERTするときにはsaveではなくinsertを使用する
#6441
### placeholder ### placeholder
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
例えば 例えば

View File

@ -40,6 +40,7 @@ services:
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2 # image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
# environment: # environment:
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# - "TAKE_FILE_OWNERSHIP=111"
# networks: # networks:
# - internal_network # - internal_network
# volumes: # volumes:

View File

@ -237,7 +237,6 @@ uploadFromUrlDescription: "رابط الملف المراد رفعه"
uploadFromUrlRequested: "الرفع مطلوب" uploadFromUrlRequested: "الرفع مطلوب"
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع " uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
explore: "استكشاف" explore: "استكشاف"
games: "ألعاب ميسكي"
messageRead: "مقروءة" messageRead: "مقروءة"
noMoreHistory: "لا يوجد المزيد من التاريخ" noMoreHistory: "لا يوجد المزيد من التاريخ"
startMessaging: "ابدأ محادثة" startMessaging: "ابدأ محادثة"
@ -515,7 +514,6 @@ yourAccountSuspendedDescription: "عُلق الحساب بسبب انتهاك ش
menu: "القائمة" menu: "القائمة"
divider: "فاصل" divider: "فاصل"
addItem: "إضافة عنصر" addItem: "إضافة عنصر"
rooms: "الغرفة"
relays: "المُرَحلات" relays: "المُرَحلات"
addRelay: "إضافة مُرحّل" addRelay: "إضافة مُرحّل"
addedRelays: "المرحلات المضافة" addedRelays: "المرحلات المضافة"
@ -690,6 +688,7 @@ notRecommended: "غير مستحسن"
botProtection: "الحماية من الحسابات الآلية" botProtection: "الحماية من الحسابات الآلية"
instanceBlocking: "المثيلات المحجوبة" instanceBlocking: "المثيلات المحجوبة"
selectAccount: "اختر حسابًا" selectAccount: "اختر حسابًا"
switchAccount: "تغيير الحساب"
enabled: "مفعّل" enabled: "مفعّل"
disabled: "معطّل" disabled: "معطّل"
quickAction: "الإجراءات السّريعة" quickAction: "الإجراءات السّريعة"
@ -736,6 +735,7 @@ keepCw: "أبقِ على تحذيرات المحتوى"
lastCommunication: "آخر تواصل" lastCommunication: "آخر تواصل"
resolved: "عولج" resolved: "عولج"
unresolved: "لم يعالج" unresolved: "لم يعالج"
breakFollow: "إلغاء الاشتراك"
itsOn: "مفعّل" itsOn: "مفعّل"
itsOff: "معطّل" itsOff: "معطّل"
emailRequiredForSignup: "عنوان البريد الإلكتروني إلزامي للتسجيل" emailRequiredForSignup: "عنوان البريد الإلكتروني إلزامي للتسجيل"
@ -751,6 +751,8 @@ unmuteThread: "ارفع الكتم عن النقاش"
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟" deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
incorrectPassword: "كلمة السر خاطئة." incorrectPassword: "كلمة السر خاطئة."
hide: "إخفاء" hide: "إخفاء"
leaveGroup: "مغادرة الفريق"
welcomeBackWithName: "مرحبًا بك مجددًا {name}"
_emailUnavailable: _emailUnavailable:
used: "هذا البريد الإلكتروني مستخدم" used: "هذا البريد الإلكتروني مستخدم"
format: "صيغة البريد الإلكتروني غير صالحة" format: "صيغة البريد الإلكتروني غير صالحة"
@ -758,6 +760,7 @@ _emailUnavailable:
smtp: "خادم البريد الإلكتروتي لا يستجيب" smtp: "خادم البريد الإلكتروتي لا يستجيب"
_ffVisibility: _ffVisibility:
public: "علني" public: "علني"
followers: "مرئية لمتابِعيك فقط"
private: "خاص" private: "خاص"
_signup: _signup:
almostThere: "كدت تنتهي" almostThere: "كدت تنتهي"
@ -842,34 +845,6 @@ _mfm:
rainbow: "قوس قزح" rainbow: "قوس قزح"
rainbowDescription: "اجعل المحتوى يظهر بألوان الطيف" rainbowDescription: "اجعل المحتوى يظهر بألوان الطيف"
rotate: "تدوير" rotate: "تدوير"
_reversi:
gameSettings: "إعدادات اللعبة"
chooseBoard: "اختر اللوح"
blackOrWhite: "أسود/أبيض"
blackIs: "{name} سيلعب بالأسود"
rules: "القوانين"
botSettings: "خيارات الحسابات الآلية"
thisGameIsStartedSoon: "ستبدأ اللعبة خلال بضع ثوانٍ"
waitingForOther: "ينتظر دور الخصم"
waitingForMe: "ينتظر دورك"
waitingBoth: "استعد"
ready: "جاهز"
cancelReady: "ألغ الجهوزية"
opponentTurn: "دور الخصم"
myTurn: "دورك"
turnOf: "دور {name}"
pastTurnOf: "دور {name}"
surrender: "استسلم"
drawn: "تعادل"
won: "فاز {name}"
black: "أسود"
white: "أبيض"
total: "المجموع"
turnCount: "الدور {count}"
myGames: "جولاتي"
allGames: "كل الجولات"
ended: "انتهت"
playing: "يُلعب الآن"
_instanceTicker: _instanceTicker:
remote: "أظهر للمستخدمين البِعاد" remote: "أظهر للمستخدمين البِعاد"
_serverDisconnectedBehavior: _serverDisconnectedBehavior:
@ -886,6 +861,8 @@ _channel:
usersCount: "{n} منتسب" usersCount: "{n} منتسب"
notesCount: "{n} ملاحظة" notesCount: "{n} ملاحظة"
_menuDisplay: _menuDisplay:
sideFull: "جانبي"
top: "الأعلى"
hide: "إخفاء" hide: "إخفاء"
_wordMute: _wordMute:
muteWords: "الكلمات المحظورة" muteWords: "الكلمات المحظورة"
@ -1152,50 +1129,6 @@ _timelines:
local: "المحلي" local: "المحلي"
social: "الاجتماعي" social: "الاجتماعي"
global: "الشامل" global: "الشامل"
_rooms:
roomOf: "غرفة {user}"
translate: "أنقل"
rotate: "تدوير"
exit: "رجوع"
remove: "أزل"
clear: "أزل الكل"
clearConfirm: "أتريد إزالة كل الأثاث من الغرفة؟"
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
chooseImage: "اختر صورة"
roomType: "نوع الغرفة"
carpetColor: "لون السّجاد"
_roomType:
default: "افتراضي"
washitsu: "الأسلوب الياباني"
_furnitures:
milk: "علبة حليب"
bed: "سرير"
low-table: "طاولة قصيرة"
desk: "مكتب"
chair: "كرسي"
chair2: "كرسي 2"
fan: "مروحة"
pc: "حاسوب"
plant: "نبات زينة"
plant2: "نبات زينة 2"
eraser: "ممحاة"
pencil: "قلم رصاص"
pudding: "بودينغ"
book: "كتاب"
book2: "كتاب 2"
piano: "بيانو"
server: "خادم"
moon: "قمر"
monitor: "شاشة التحكم"
keyboard: "لوحة مفاتيح"
wall-clock: "ساعة حائط"
photoframe: "إطار صورة"
cube: "مكعب"
tv: "تلفاز"
pinguin: "بطريق"
sofa: "أريكة"
bin: "سلة مهملات"
banknote: "أوراق نقدية"
_pages: _pages:
newPage: "أنشئ صفحة جديدة" newPage: "أنشئ صفحة جديدة"
editPage: "عدّل الصفحة" editPage: "عدّل الصفحة"
@ -1204,16 +1137,21 @@ _pages:
updated: "نجح تعديل الصفحة" updated: "نجح تعديل الصفحة"
deleted: "نجح حذف الصفحة" deleted: "نجح حذف الصفحة"
pageSetting: "إعدادات الصفحة" pageSetting: "إعدادات الصفحة"
viewSource: "اظهر المصدر"
viewPage: "اعرض صفحاتك" viewPage: "اعرض صفحاتك"
like: "أعجبني" like: "أعجبني"
unlike: "أزل الإعجاب" unlike: "أزل الإعجاب"
my: "صفحاتي" my: "صفحاتي"
featured: "الأكثر شعبية"
contents: "المحتوى" contents: "المحتوى"
title: "العنوان"
summary: "ملخص الصفحة"
alignCenter: "توسيط العناصر" alignCenter: "توسيط العناصر"
hideTitleWhenPinned: "اخف عنوان الصفحة عند تدبيسها في ملف الشخصي" hideTitleWhenPinned: "اخف عنوان الصفحة عند تدبيسها في ملف الشخصي"
font: "الخط" font: "الخط"
fontSerif: "Serif" fontSerif: "Serif"
fontSansSerif: "Sans Serif" fontSansSerif: "Sans Serif"
chooseBlock: "إضافة كتلة"
selectType: "اختر النوع" selectType: "اختر النوع"
enterVariableName: "أدخل اسم المتغيّر" enterVariableName: "أدخل اسم المتغيّر"
variableNameIsAlreadyUsed: "هذا الاسم محجوز" variableNameIsAlreadyUsed: "هذا الاسم محجوز"
@ -1222,6 +1160,8 @@ _pages:
specialBlocks: "خاص" specialBlocks: "خاص"
blocks: blocks:
text: "نص" text: "نص"
textarea: "حقل نصي"
section: "قسم"
image: "الصور" image: "الصور"
button: "زرّ" button: "زرّ"
_if: _if:

1
locales/bn-BD.yml Normal file
View File

@ -0,0 +1 @@
---

View File

@ -207,7 +207,6 @@ uploadFromUrl: "Nahrát z URL adresy"
uploadFromUrlDescription: "URL adresa souboru, který chcete nahrát" uploadFromUrlDescription: "URL adresa souboru, který chcete nahrát"
uploadFromUrlMayTakeTime: "Může trvat nějakou dobu, dokud nebude dokončeno nahrávání." uploadFromUrlMayTakeTime: "Může trvat nějakou dobu, dokud nebude dokončeno nahrávání."
explore: "Objevovat" explore: "Objevovat"
games: "Misskey hry"
messageRead: "Přečtené" messageRead: "Přečtené"
noMoreHistory: "To je vše" noMoreHistory: "To je vše"
startMessaging: "Zahájit chat" startMessaging: "Zahájit chat"
@ -272,6 +271,8 @@ monthX: "{month}"
yearX: "{year}" yearX: "{year}"
pages: "Stránky" pages: "Stránky"
integration: "Integrace" integration: "Integrace"
connectService: "Připojit"
disconnectService: "Odpojit"
enableLocalTimeline: "Povolit lokální čas" enableLocalTimeline: "Povolit lokální čas"
enableGlobalTimeline: "Povolit globální čas" enableGlobalTimeline: "Povolit globální čas"
registration: "Registrace" registration: "Registrace"
@ -280,8 +281,10 @@ invite: "Pozvat"
inMb: "V megabajtech" inMb: "V megabajtech"
iconUrl: "Favicon URL" iconUrl: "Favicon URL"
bannerUrl: "Baner URL" bannerUrl: "Baner URL"
backgroundImageUrl: "Adresa URL obrázku pozadí"
basicInfo: "Základní informace" basicInfo: "Základní informace"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
enableHcaptcha: "Aktivovat hCaptchu"
hcaptchaSecretKey: "Tajný Klíč (Secret Key)" hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
recaptcha: "reCAPTCHA" recaptcha: "reCAPTCHA"
enableRecaptcha: "Zapnout ReCAPTCHu" enableRecaptcha: "Zapnout ReCAPTCHu"
@ -293,6 +296,7 @@ antennaSource: "Zdroj Antény"
enableServiceworker: "Povolit ServiceWorker" enableServiceworker: "Povolit ServiceWorker"
caseSensitive: "Rozlišuje malá a velká písmena" caseSensitive: "Rozlišuje malá a velká písmena"
connectedTo: "Následující účty jsou připojeny" connectedTo: "Následující účty jsou připojeny"
popularTags: "Populární tagy"
userList: "Seznamy" userList: "Seznamy"
about: "Informace" about: "Informace"
aboutMisskey: "O Misskey" aboutMisskey: "O Misskey"
@ -336,6 +340,9 @@ next: "Další"
retype: "Zadejte znovu" retype: "Zadejte znovu"
noteOf: "{user} poznámky" noteOf: "{user} poznámky"
inviteToGroup: "Pozvat do skupiny" inviteToGroup: "Pozvat do skupiny"
newMessageExists: "Máte novou zprávu"
onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor"
signinRequired: "Přihlašte se, prosím"
invitations: "Pozvat" invitations: "Pozvat"
checking: "Ověřuji" checking: "Ověřuji"
available: "K dispozici" available: "K dispozici"
@ -363,10 +370,13 @@ signinHistory: "Historie přihlášení"
category: "Kategorie" category: "Kategorie"
tags: "Štítky" tags: "Štítky"
createAccount: "Vytvořit účet" createAccount: "Vytvořit účet"
existingAccount: "Existující účet"
regenerate: "Obnovit"
fontSize: "Velikost písma" fontSize: "Velikost písma"
openImageInNewTab: "Otevřít obrázek v novém panelu" openImageInNewTab: "Otevřít obrázek v novém panelu"
dashboard: "Přehled" dashboard: "Přehled"
local: "Lokální" local: "Lokální"
remote: "Vzdálené"
total: "Celkem" total: "Celkem"
weekOverWeekChanges: "Týdně" weekOverWeekChanges: "Týdně"
dayOverDayChanges: "Denně" dayOverDayChanges: "Denně"
@ -376,6 +386,9 @@ accountSettings: "Nastavení účtu"
promotion: "Propagace" promotion: "Propagace"
promote: "Propagovat" promote: "Propagovat"
numberOfDays: "Počet dní" numberOfDays: "Počet dní"
deleteAll: "Smazat vše"
showFixedPostForm: "Zobrazit formulář pro nové příspěvky nad časovou osou"
masterVolume: "Celková hlasitost"
chooseEmoji: "Vybrat emotikon" chooseEmoji: "Vybrat emotikon"
unableToProcess: "Operace nebyla dokončena." unableToProcess: "Operace nebyla dokončena."
recentUsed: "Naposledy použité" recentUsed: "Naposledy použité"
@ -385,25 +398,57 @@ installedApps: "Autorizované aplikace"
nothing: "Nic nebylo nalezeno" nothing: "Nic nebylo nalezeno"
lastUsedDate: "Poslední použití" lastUsedDate: "Poslední použití"
state: "Stav" state: "Stav"
sort: "Seřadit"
ascendingOrder: "Vzestupně" ascendingOrder: "Vzestupně"
descendingOrder: "Sestupně" descendingOrder: "Sestupně"
scratchpad: "Zápisník" scratchpad: "Zápisník"
output: "Výstup" output: "Výstup"
script: "Skript" script: "Skript"
updateRemoteUser: "Aktualizovat informace o vzdáleném účtu"
deleteAllFiles: "Smazat všechny soubory" deleteAllFiles: "Smazat všechny soubory"
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?" deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
userSuspended: "Tomuto uživateli byl pozastaven účet." userSuspended: "Tomuto uživateli byl pozastaven účet."
menu: "Menu"
addItem: "Přidat položku" addItem: "Přidat položku"
rooms: "Místnost"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
deletedNote: "Odstraněné příspěvky" deletedNote: "Odstraněné příspěvky"
invisibleNote: "Skryté příspěvky" invisibleNote: "Skryté příspěvky"
description: "Popis"
author: "Autor"
manage: "Administrace"
small: "Malé"
generateAccessToken: "Vygenerovat přístupový token"
permission: "Oprávnění"
enableAll: "Povolit vše"
disableAll: "Vypnout vše"
notificationType: "Typy oznámení"
edit: "Upravit"
emailServer: "Mailový server"
enableEmail: "Zapnout email dystribuci"
email: "Email"
emailAddress: "Emailová adresa"
smtpConfig: "Konfigurace SMTP serveru"
smtpHost: "Hostitel" smtpHost: "Hostitel"
smtpPort: "Port"
smtpUser: "Uživatelské jméno" smtpUser: "Uživatelské jméno"
smtpPass: "Heslo" smtpPass: "Heslo"
smtpSecureInfo: "Toto vypněte pokud používáte STARTTLS"
makeActive: "Aktivovat"
display: "Zobrazit"
copy: "Kopírovat"
logs: "Logy"
database: "Databáze"
create: "Vytvořit"
notificationSetting: "Nastavení oznámení"
useGlobalSetting: "Použít globální nastavení"
other: "Ostatní"
fileIdOrUrl: "ID nebo URL souboru"
behavior: "Chování"
sample: "Ukázka"
clearCache: "Vyprázdnit mezipaměť" clearCache: "Vyprázdnit mezipaměť"
info: "Informace" info: "Informace"
user: "Uživatelé" user: "Uživatelé"
administration: "Administrace"
_email: _email:
_follow: _follow:
title: "Máte nového následovníka" title: "Máte nového následovníka"
@ -412,9 +457,8 @@ _mfm:
quote: "Citovat" quote: "Citovat"
emoji: "Vlastní emoji" emoji: "Vlastní emoji"
search: "Vyhledávání" search: "Vyhledávání"
_reversi:
total: "Celkem"
_theme: _theme:
description: "Popis"
keys: keys:
mention: "Zmínění" mention: "Zmínění"
renote: "Přeposlat" renote: "Přeposlat"
@ -442,11 +486,6 @@ _exportOrImport:
userLists: "Seznamy" userLists: "Seznamy"
_timelines: _timelines:
home: "Domů" home: "Domů"
_rooms:
_roomType:
default: "Výchozí"
_furnitures:
monitor: "Monitorovat"
_pages: _pages:
blocks: blocks:
image: "Obrázky" image: "Obrázky"

View File

@ -242,7 +242,6 @@ uploadFromUrlDescription: "URL der hochzuladenden Datei"
uploadFromUrlRequested: "Upload angefordert" uploadFromUrlRequested: "Upload angefordert"
uploadFromUrlMayTakeTime: "Es kann eine Weile dauern, bis das Hochladen abgeschlossen ist." uploadFromUrlMayTakeTime: "Es kann eine Weile dauern, bis das Hochladen abgeschlossen ist."
explore: "Erkunden" explore: "Erkunden"
games: "Misskey-Spiele"
messageRead: "Gelesen" messageRead: "Gelesen"
noMoreHistory: "Kein weiterer Verlauf vorhanden" noMoreHistory: "Kein weiterer Verlauf vorhanden"
startMessaging: "Neuen Chat erstellen" startMessaging: "Neuen Chat erstellen"
@ -537,7 +536,6 @@ yourAccountSuspendedDescription: "Dieses Benutzerkonto wurde gesperrt, da es geg
menu: "Menü" menu: "Menü"
divider: "Trenner" divider: "Trenner"
addItem: "Element hinzufügen" addItem: "Element hinzufügen"
rooms: "Raum"
relays: "Relays" relays: "Relays"
addRelay: "Relay hinzufügen" addRelay: "Relay hinzufügen"
inboxUrl: "inbox-URL" inboxUrl: "inbox-URL"
@ -621,8 +619,11 @@ reportAbuse: "Melden"
reportAbuseOf: "{name} melden" reportAbuseOf: "{name} melden"
fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Meldung an. Falls es sich um eine spezielle Notiz handelt, bitte gib dessen URL an." fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Meldung an. Falls es sich um eine spezielle Notiz handelt, bitte gib dessen URL an."
abuseReported: "Die Meldung wurde versendet. Vielen Dank." abuseReported: "Die Meldung wurde versendet. Vielen Dank."
reporter: "Melder"
reporteeOrigin: "Herkunft des Gemeldeten" reporteeOrigin: "Herkunft des Gemeldeten"
reporterOrigin: "Herkunft des Meldenden" reporterOrigin: "Herkunft des Meldenden"
forwardReport: "Meldung an fremde Instanz weiterleiten"
forwardReportIsAnonymous: "Anstatt deines Benutzerkontos wird bei der fremden Instanz ein anonymes Systemkonto als Melder angezeigt."
send: "Senden" send: "Senden"
abuseMarkAsResolved: "Meldung als gelöst markieren" abuseMarkAsResolved: "Meldung als gelöst markieren"
openInNewTab: "In neuem Tab öffnen" openInNewTab: "In neuem Tab öffnen"
@ -670,7 +671,6 @@ emailVerified: "Email-Adresse bestätigt"
noteFavoritesCount: "Anzahl an als Favorit markierter Notizen" noteFavoritesCount: "Anzahl an als Favorit markierter Notizen"
pageLikesCount: "Anzahl an als \"Gefällt mir\" markierter Seiten" pageLikesCount: "Anzahl an als \"Gefällt mir\" markierter Seiten"
pageLikedCount: "Anzahl erhaltener \"Gefällt mir\" auf Seiten" pageLikedCount: "Anzahl erhaltener \"Gefällt mir\" auf Seiten"
reversiCount: "Anzahl an Reversi-Runden"
contact: "Kontakt" contact: "Kontakt"
useSystemFont: "Standardschriftart des Systems verwenden" useSystemFont: "Standardschriftart des Systems verwenden"
clips: "Clips" clips: "Clips"
@ -746,6 +746,7 @@ notRecommended: "Nicht empfohlen"
botProtection: "Bot-Schutz" botProtection: "Bot-Schutz"
instanceBlocking: "Blockierte Instanzen" instanceBlocking: "Blockierte Instanzen"
selectAccount: "Benutzerkonto auswählen" selectAccount: "Benutzerkonto auswählen"
switchAccount: "Konto wechseln"
enabled: "Aktiviert" enabled: "Aktiviert"
disabled: "Deaktiviert" disabled: "Deaktiviert"
quickAction: "Schnellaktionen" quickAction: "Schnellaktionen"
@ -944,39 +945,6 @@ _mfm:
sparkleDescription: "Verleiht Inhalt einen glitzernden Partikeleffekt." sparkleDescription: "Verleiht Inhalt einen glitzernden Partikeleffekt."
rotate: "Drehen" rotate: "Drehen"
rotateDescription: "Dreht den Inhalt um einen angegebenen Winkel" rotateDescription: "Dreht den Inhalt um einen angegebenen Winkel"
_reversi:
reversi: "Reversi"
gameSettings: "Spieleinstellungen"
chooseBoard: "Spielbrett auswählen"
blackOrWhite: "Schwarz/Weiß"
blackIs: "{name} spielt Schwarz"
rules: "Regeln"
botSettings: "Optionen des Computergegners"
thisGameIsStartedSoon: "Dieses Spiel beginnt in wenigen Sekunden"
waitingForOther: "Warte auf den Zug des Gegenspielers"
waitingForMe: "Warte auf deinen Zug"
waitingBoth: "Mach dich bereit"
ready: "Bereit"
cancelReady: "Nicht bereit"
opponentTurn: "Zug deines Gegners"
myTurn: "Dein Zug"
turnOf: "{name} ist am Zug"
pastTurnOf: "Zug von {name}"
surrender: "Aufgeben"
surrendered: "Durch Aufgabe"
drawn: "Unentschieden"
won: "{name} gewinnt"
black: "Schwarz"
white: "Weiß"
total: "Gesamt"
turnCount: " Zug {count}"
myGames: "Meine Runden"
allGames: "Alle Runden"
ended: "Beendet"
playing: "Laufend"
isLlotheo: "Der mit weniger Steinen gewinnt (Llotheo)"
loopedMap: "Wiederholendes Spielbrett"
canPutEverywhere: "Steine können überall platziert werden"
_instanceTicker: _instanceTicker:
none: "Nie anzeigen" none: "Nie anzeigen"
remote: "Für Benutzer fremder Instanzen anzeigen" remote: "Für Benutzer fremder Instanzen anzeigen"
@ -1096,8 +1064,6 @@ _sfx:
chatBg: "Chat (Hintergrund)" chatBg: "Chat (Hintergrund)"
antenna: "Antennen" antenna: "Antennen"
channel: "Kanalbenachrichtigung" channel: "Kanalbenachrichtigung"
reversiPutBlack: "Reversi: Schwarz macht einen Zug"
reversiPutWhite: "Reversi: Weiß macht einen Zug"
_ago: _ago:
unknown: "Unbekannt" unknown: "Unbekannt"
future: "Zukunft" future: "Zukunft"
@ -1320,68 +1286,6 @@ _timelines:
local: "Lokal" local: "Lokal"
social: "Sozial" social: "Sozial"
global: "Global" global: "Global"
_rooms:
roomOf: "{user}'s Raum"
addFurniture: "Möbel hinzufügen"
translate: "Bewegen"
rotate: "Drehen"
exit: "Zurück"
remove: "Entfernen"
clear: "Aufräumen"
clearConfirm: "Möchtest du wirklich alle Möbel entfernen?"
leaveConfirm: "Es gibt ungespeicherte Änderungen. Möchtest du wirklich gehen?"
chooseImage: "Bild auswählen"
roomType: "Raumart"
carpetColor: "Teppichfarbe"
_roomType:
default: "Standard"
washitsu: "Japanischer Stil"
_furnitures:
milk: "Milchkarton"
bed: "Bett"
low-table: "Niedrigtisch"
desk: "Schreibtisch"
chair: "Stuhl"
chair2: "Stuhl 2"
fan: "Ventilator"
pc: "Computer"
plant: "Deko-Pflanze"
plant2: "Deko-Pflanze 2"
eraser: "Radiergummi"
pencil: "Bleistift"
pudding: "Pudding"
cardboard-box: "Pappkarton"
cardboard-box2: "Pappkarton 2"
cardboard-box3: "Pappkarton 3"
book: "Buch"
book2: "Buch 2"
piano: "Piano"
facial-tissue: "Taschentücher"
server: "Server"
moon: "Mond"
corkboard: "Pinnwand"
mousepad: "Mauspad"
monitor: "Monitor"
keyboard: "Tastatur"
carpet-stripe: "Gestreifter Teppich"
mat: "Matte"
color-box: "Regal"
wall-clock: "Wanduhr"
photoframe: "Bilderrahmen"
cube: "Würfel"
tv: "Fernseher"
pinguin: "Pinguin"
rubik-cube: "Zauberwürfel"
poster-h: "Poster (Horizontal)"
poster-v: "Poster (Vertikal)"
sofa: "Sofa"
spiral: "Spiraltreppe"
bin: "Papierkorb"
cup-noodle: "Instantnudeln"
holo-display: "Holographischer Bildschirm"
energy-drink: "Energy Drink"
doll-ai: "Ai-Puppe"
banknote: "Geldscheine"
_pages: _pages:
newPage: "Seite erstellen" newPage: "Seite erstellen"
editPage: "Seite bearbeiten" editPage: "Seite bearbeiten"

View File

@ -242,7 +242,6 @@ uploadFromUrlDescription: "URL of the file you want to upload"
uploadFromUrlRequested: "Upload requested" uploadFromUrlRequested: "Upload requested"
uploadFromUrlMayTakeTime: "It may take some time until the upload is complete." uploadFromUrlMayTakeTime: "It may take some time until the upload is complete."
explore: "Explore" explore: "Explore"
games: "Misskey Games"
messageRead: "Read" messageRead: "Read"
noMoreHistory: "There is no further history" noMoreHistory: "There is no further history"
startMessaging: "Start a new chat" startMessaging: "Start a new chat"
@ -537,7 +536,6 @@ yourAccountSuspendedDescription: "This account has been suspended due to breakin
menu: "Menu" menu: "Menu"
divider: "Divider" divider: "Divider"
addItem: "Add Item" addItem: "Add Item"
rooms: "Room"
relays: "Relays" relays: "Relays"
addRelay: "Add Relay" addRelay: "Add Relay"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
@ -621,8 +619,11 @@ reportAbuse: "Report"
reportAbuseOf: "Report {name}" reportAbuseOf: "Report {name}"
fillAbuseReportDescription: "Please fill in details regarding this report. If it is about a specific note, please include its URL." fillAbuseReportDescription: "Please fill in details regarding this report. If it is about a specific note, please include its URL."
abuseReported: "Your report has been sent. Thank you very much." abuseReported: "Your report has been sent. Thank you very much."
reporter: "Reporter"
reporteeOrigin: "Reportee Origin" reporteeOrigin: "Reportee Origin"
reporterOrigin: "Reporter Origin" reporterOrigin: "Reporter Origin"
forwardReport: "Forward report to remote instance"
forwardReportIsAnonymous: "Instead of your account, an anonymous system account will be displayed as reporter at the remote instance."
send: "Send" send: "Send"
abuseMarkAsResolved: "Mark report as resolved" abuseMarkAsResolved: "Mark report as resolved"
openInNewTab: "Open in new tab" openInNewTab: "Open in new tab"
@ -670,7 +671,6 @@ emailVerified: "Email has been verified"
noteFavoritesCount: "Number of favorite notes" noteFavoritesCount: "Number of favorite notes"
pageLikesCount: "Number of liked Pages" pageLikesCount: "Number of liked Pages"
pageLikedCount: "Number of received Page likes" pageLikedCount: "Number of received Page likes"
reversiCount: "Number of Reversi matches"
contact: "Contact" contact: "Contact"
useSystemFont: "Use the system's default font" useSystemFont: "Use the system's default font"
clips: "Clips" clips: "Clips"
@ -746,6 +746,7 @@ notRecommended: "Not recommended"
botProtection: "Bot Protection" botProtection: "Bot Protection"
instanceBlocking: "Blocked Instances" instanceBlocking: "Blocked Instances"
selectAccount: "Select account" selectAccount: "Select account"
switchAccount: "Switch account"
enabled: "Enabled" enabled: "Enabled"
disabled: "Disabled" disabled: "Disabled"
quickAction: "Quick actions" quickAction: "Quick actions"
@ -794,6 +795,7 @@ pubSub: "Pub/Sub Accounts"
lastCommunication: "Last communication" lastCommunication: "Last communication"
resolved: "Resolved" resolved: "Resolved"
unresolved: "Unresolved" unresolved: "Unresolved"
breakFollow: "Unfollow"
itsOn: "Enabled" itsOn: "Enabled"
itsOff: "Disabled" itsOff: "Disabled"
emailRequiredForSignup: "Require email address for sign-up" emailRequiredForSignup: "Require email address for sign-up"
@ -943,39 +945,6 @@ _mfm:
sparkleDescription: "Gives content a sparkling particle effect." sparkleDescription: "Gives content a sparkling particle effect."
rotate: "Rotate" rotate: "Rotate"
rotateDescription: "Turns content by a specified angle." rotateDescription: "Turns content by a specified angle."
_reversi:
reversi: "Reversi"
gameSettings: "Game settings"
chooseBoard: "Choose a board"
blackOrWhite: "Black/White"
blackIs: "{name} is playing Black"
rules: "Rules"
botSettings: "Bot options"
thisGameIsStartedSoon: "The game will start in a few seconds"
waitingForOther: "Waiting for the opponent's turn"
waitingForMe: "Waiting for your turn"
waitingBoth: "Get ready"
ready: "Ready"
cancelReady: "Cancel ready"
opponentTurn: "Opponent's turn"
myTurn: "Your turn"
turnOf: "It's {name}'s turn"
pastTurnOf: "{name}'s turn"
surrender: "Surrender"
surrendered: "By surrender"
drawn: "Draw"
won: "{name} wins"
black: "Black"
white: "White"
total: "Total"
turnCount: "Turn {count}"
myGames: "My rounds"
allGames: "All rounds"
ended: "Ended"
playing: "Currently playing"
isLlotheo: "The one with fewer stones wins (Llotheo)"
loopedMap: "Looping map"
canPutEverywhere: "Tiles are placeable everywhere"
_instanceTicker: _instanceTicker:
none: "Never show" none: "Never show"
remote: "Show for remote users" remote: "Show for remote users"
@ -1095,8 +1064,6 @@ _sfx:
chatBg: "Chat (Background)" chatBg: "Chat (Background)"
antenna: "Antennas" antenna: "Antennas"
channel: "Channel notifications" channel: "Channel notifications"
reversiPutBlack: "Reversi: Black makes a move"
reversiPutWhite: "Reversi: White makes a move"
_ago: _ago:
unknown: "Unknown" unknown: "Unknown"
future: "Future" future: "Future"
@ -1319,68 +1286,6 @@ _timelines:
local: "Local" local: "Local"
social: "Social" social: "Social"
global: "Global" global: "Global"
_rooms:
roomOf: "{user}'s room"
addFurniture: "Place furniture"
translate: "Move"
rotate: "Rotate"
exit: "Back"
remove: "Remove"
clear: "Remove All"
clearConfirm: "Do you really want to remove all furniture from your room?"
leaveConfirm: "There are unsaved changes. Do you really want to leave?"
chooseImage: "Select an image"
roomType: "Room type"
carpetColor: "Carpet color"
_roomType:
default: "Default"
washitsu: "Japanese-style"
_furnitures:
milk: "Milk carton"
bed: "Bed"
low-table: "Low Table"
desk: "Desk"
chair: "Chair"
chair2: "Chair 2"
fan: "Fan"
pc: "Computer"
plant: "Houseplant"
plant2: "Houseplant 2"
eraser: "Eraser"
pencil: "Pencil"
pudding: "Pudding"
cardboard-box: "Cardboard Box"
cardboard-box2: "Cardboard Box 2"
cardboard-box3: "Cardboard Box 3"
book: "Book"
book2: "Book 2"
piano: "Piano"
facial-tissue: "Tissues"
server: "Server"
moon: "Moon"
corkboard: "Cork board"
mousepad: "Mousepad"
monitor: "Monitor"
keyboard: "Keyboard"
carpet-stripe: "Carpet (striped)"
mat: "Mat"
color-box: "Bookshelf"
wall-clock: "Wall clock"
photoframe: "Picture frame"
cube: "Cube"
tv: "TV"
pinguin: "Penguin"
rubik-cube: "Puzzle Cube"
poster-h: "Poster (Horizontal)"
poster-v: "Poster (Vertical)"
sofa: "Sofa"
spiral: "Spiral Staircase"
bin: "Garbage can"
cup-noodle: "Cup noodles"
holo-display: "Holographic display"
energy-drink: "Energy drink"
doll-ai: "Ai doll"
banknote: "Pile of money"
_pages: _pages:
newPage: "Create a new Page" newPage: "Create a new Page"
editPage: "Edit this Page" editPage: "Edit this Page"

View File

@ -1,8 +1,8 @@
--- ---
_lang_: "Esperanto" _lang_: "Esperanto"
headlineMisskey: "Reto konektita per notoj" headlineMisskey: "Reto konektita per notoj"
introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza etbloga servo.\nKreu \"noto\"n por diskonigi nunan aferon, aŭ por paroli vian penson al ĉiuj ĉirkaŭ vi. 📡\nLa funkcion \"reago\" ebligas esprimi rapide vian senton pri la noto de la alia en la Fediverso. 👍\nBonvole esploru novan mondon. 🚀" introMisskey: "Bonvenon! Misskey estas malfermitkoda malcentraliza etbloga servo.\nKreu \"noto\"n por diskonigi nunan aferon, aŭ por paroli vian penson al ĉiuj ĉirkaŭ vi. 📡\nLa funkcio \"reago\" ebligas esprimi rapide vian senton pri la noto de la alia en la Fediverso. 👍\nBonvole esploru novan mondon. 🚀"
monthAndDay: "La {day}a de la {month}a monato" monthAndDay: "La {day}a de l' {month}a"
search: "Serĉi" search: "Serĉi"
notifications: "Sciigoj" notifications: "Sciigoj"
username: "Uzantnomo" username: "Uzantnomo"
@ -23,7 +23,7 @@ otherSettings: "Aliaj agordoj"
openInWindow: "Malfermi en nova fenestro" openInWindow: "Malfermi en nova fenestro"
profile: "Profilo" profile: "Profilo"
timeline: "Templinio" timeline: "Templinio"
noAccountDescription: "La uzanto ankoraŭ ne skribis la sinprezenton en sia profilo." noAccountDescription: "La uzanto ankoraŭ ne skribis la prion de sia profilo."
login: "Saluti" login: "Saluti"
loggingIn: "Salutado…" loggingIn: "Salutado…"
logout: "Adiaŭi" logout: "Adiaŭi"
@ -41,10 +41,10 @@ cantFavorite: "Oni ne povis aldoni al viaj preferaĵoj."
pin: "Alpingli" pin: "Alpingli"
unpin: "Depingli" unpin: "Depingli"
copyContent: "Kopii enhavon" copyContent: "Kopii enhavon"
copyLink: "Kopii ligilon" copyLink: "Kopii la ligilon"
delete: "Forviŝi" delete: "Forviŝi"
deleteAndEdit: "Forviŝi kaj redakti" deleteAndEdit: "Forviŝi kaj redakti"
deleteAndEditConfirm: "Ĉu vi certas ke vi volas redakti foriginte la noton? Tio forviŝos reagojn, plusendojn, kaj respondojn ĉiujn apartenantajn al ĝi." deleteAndEditConfirm: "Ĉu vi certas ke vi volas foriginte redakti la noton? Vi perdos ĉiujn reagojn, plusendojn, kaj respondojn je ĝi."
addToList: "Aldoni al listo" addToList: "Aldoni al listo"
sendMessage: "Sendi mesaĝon" sendMessage: "Sendi mesaĝon"
copyUsername: "Kopii uzantnomon" copyUsername: "Kopii uzantnomon"
@ -69,7 +69,7 @@ lists: "Listoj"
noLists: "Neniu listo" noLists: "Neniu listo"
note: "Noti" note: "Noti"
notes: "Notoj" notes: "Notoj"
following: "Sekvatoj" following: "Sekvata"
followers: "Sekvantoj" followers: "Sekvantoj"
followsYou: "Sekvas vin" followsYou: "Sekvas vin"
createList: "Krei liston" createList: "Krei liston"
@ -97,7 +97,7 @@ quote: "Citi"
pinnedNote: "Alpinglita noto" pinnedNote: "Alpinglita noto"
pinned: "Alpingli" pinned: "Alpingli"
you: "Vi" you: "Vi"
clickToShow: "Klaku por malkaŝu" clickToShow: "Klaki por malkaŝi"
sensitive: "Enhavo ne estas deca por laborejo (NSFW)" sensitive: "Enhavo ne estas deca por laborejo (NSFW)"
add: "Aldoni" add: "Aldoni"
reaction: "Reagoj" reaction: "Reagoj"
@ -122,7 +122,7 @@ selectAntenna: "Elekti antenon"
selectWidget: "Elekti enestraĵon" selectWidget: "Elekti enestraĵon"
editWidgets: "Redakti fenestraĵon" editWidgets: "Redakti fenestraĵon"
editWidgetsExit: "Fini la redaktadon" editWidgetsExit: "Fini la redaktadon"
customEmojis: "Federaj emoĵioj" customEmojis: "Propraj emoĝioj"
emoji: "Emoĵio" emoji: "Emoĵio"
emojis: "Emoĵio" emojis: "Emoĵio"
emojiName: "Nomo de la emoĵio" emojiName: "Nomo de la emoĵio"
@ -132,11 +132,10 @@ settingGuide: "Agordaj rekomendoj"
cacheRemoteFiles: "Stapli forajn dosierojn" cacheRemoteFiles: "Stapli forajn dosierojn"
flagAsBot: "Marki kiel esti uzanto de roboto" flagAsBot: "Marki kiel esti uzanto de roboto"
flagAsCat: "Marki kiel esti kato" flagAsCat: "Marki kiel esti kato"
flagAsCatDescription: "Se vi estas kato, faru ĉi tiun flagon"
autoAcceptFollowed: "Aŭtomate akcepti la peton de sekvado far uzantoj kiujn vi sekvas" autoAcceptFollowed: "Aŭtomate akcepti la peton de sekvado far uzantoj kiujn vi sekvas"
addAccount: "Aldoni konton" addAccount: "Aldoni konton"
loginFailed: "Saluto malsukcesis" loginFailed: "Saluto malsukcesis"
showOnRemote: "Vidi ĉe la surloka nodo" showOnRemote: "Vidi pli al la originala profilo"
general: "Ĝenerala" general: "Ĝenerala"
wallpaper: "Ekranfonoj" wallpaper: "Ekranfonoj"
setWallpaper: "Apliki ekranfonon" setWallpaper: "Apliki ekranfonon"
@ -167,7 +166,7 @@ withNFiles: "{n} dosiero(j)"
monitor: "Monitoro" monitor: "Monitoro"
network: "Reto" network: "Reto"
disk: "Disko" disk: "Disko"
instanceInfo: "Informoj pri la nodo" instanceInfo: "Informoj sur la nodo"
statistics: "Statistikoj" statistics: "Statistikoj"
clearCachedFiles: "Malplenigi la staplon" clearCachedFiles: "Malplenigi la staplon"
clearCachedFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn forajn dosierojn en la staplo?" clearCachedFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn forajn dosierojn en la staplo?"
@ -223,7 +222,6 @@ uploadFromUrl: "Alŝuti de URL"
uploadFromUrlDescription: "URL de la dosiero kiun vi volas alŝuti" uploadFromUrlDescription: "URL de la dosiero kiun vi volas alŝuti"
uploadFromUrlRequested: "La alŝutado estis patita" uploadFromUrlRequested: "La alŝutado estis patita"
explore: "Esplori" explore: "Esplori"
games: "Miskiaj Ludoj"
messageRead: "Legita" messageRead: "Legita"
noMoreHistory: "Ne plu de la historio" noMoreHistory: "Ne plu de la historio"
startMessaging: "Komenci babiladon" startMessaging: "Komenci babiladon"
@ -232,7 +230,7 @@ agreeTo: "Mi akceptas {0}"
tos: "Kondiĉoj de uzado" tos: "Kondiĉoj de uzado"
start: "Komenciĝi" start: "Komenciĝi"
home: "Hejma" home: "Hejma"
remoteUserCaution: "Ĉi tiuj infomoj ne estas kompletaj, ĉar ili estas pri uzanto el la fora." remoteUserCaution: "Pro fora uzanto, la infomoj ne estas tuto."
activity: "Aktiveco" activity: "Aktiveco"
images: "Bildoj" images: "Bildoj"
birthday: "Naskiĝdato" birthday: "Naskiĝdato"
@ -283,7 +281,7 @@ normal: "Normala"
instanceName: "Nomo de la nodo" instanceName: "Nomo de la nodo"
instanceDescription: "Priskribo de la nodo " instanceDescription: "Priskribo de la nodo "
maintainerName: "Nomo de la administranto" maintainerName: "Nomo de la administranto"
maintainerEmail: "Retpoŝta adreso de la administranto" maintainerEmail: "Retpoŝtadreso de la administranto"
tosUrl: "URL de kondiĉoj de uzado" tosUrl: "URL de kondiĉoj de uzado"
thisYear: "Ĉi-jare" thisYear: "Ĉi-jare"
thisMonth: "Ĉi-monate" thisMonth: "Ĉi-monate"
@ -307,9 +305,9 @@ bannerUrl: "URL de standardo"
backgroundImageUrl: "URL de la fona bildo" backgroundImageUrl: "URL de la fona bildo"
basicInfo: "Baza informo" basicInfo: "Baza informo"
pinnedUsers: "Alpinglita uzanto" pinnedUsers: "Alpinglita uzanto"
pinnedUsersDescription: "Listigu uzantnomojn apartige en ĉiu linio por alpingli al la paĝoj ekz \"Esplori\"." pinnedUsersDescription: "Laŭlinigu uzantnomojn en ĉiu linio, por alpingli al la paĝoj ekz \"Esplori\"."
pinnedPages: "Alpinglitaj paĝoj" pinnedPages: "Alpinglitaj paĝoj"
pinnedPagesDescription: "Listigu dosierindiko apartige en ĉiu linio por alpingli al la ĉefpaĝo de la nodo." pinnedPagesDescription: "Laŭlinigu dosierindikojn de paĝo en ĉiu linio, por alpingli al la ĉefpaĝo de la nodo."
pinnedNotes: "Alpinglita noto" pinnedNotes: "Alpinglita noto"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
enableHcaptcha: "Ebligi hCaptcha" enableHcaptcha: "Ebligi hCaptcha"
@ -367,7 +365,7 @@ cacheClear: "Malplenigi staplon"
markAsReadAllNotifications: "Marki ĉiujn sciigojn kiel legita" markAsReadAllNotifications: "Marki ĉiujn sciigojn kiel legita"
markAsReadAllTalkMessages: "Marki ĉiujn retbabiladojn kiel legita" markAsReadAllTalkMessages: "Marki ĉiujn retbabiladojn kiel legita"
help: "Manlibro de uzado" help: "Manlibro de uzado"
inputMessageHere: "Entajpu masaĝo tie ĉi" inputMessageHere: "Entajpu mesaĝon tie"
close: "Fermi" close: "Fermi"
group: "Grupo" group: "Grupo"
groups: "Grupoj" groups: "Grupoj"
@ -378,7 +376,7 @@ invites: "Inviti"
groupName: "Grupa nomo" groupName: "Grupa nomo"
members: "Membroj" members: "Membroj"
transfer: "Movi" transfer: "Movi"
messagingWithUser: "Babili private" messagingWithUser: "Private babili "
messagingWithGroup: "Babili grupe" messagingWithGroup: "Babili grupe"
title: "Titolo" title: "Titolo"
text: "Teksto" text: "Teksto"
@ -434,6 +432,7 @@ clientSettings: "Agordoj de kliento"
accountSettings: "Agordoj de konto" accountSettings: "Agordoj de konto"
numberOfDays: "Nombro de tagoj" numberOfDays: "Nombro de tagoj"
hideThisNote: "Kaŝi la noton" hideThisNote: "Kaŝi la noton"
showFeaturedNotesInTimeline: "Montri en via templinio notojn de la tendenco"
objectStorageBaseUrl: "Baza URL" objectStorageBaseUrl: "Baza URL"
objectStoragePrefix: "Prefix" objectStoragePrefix: "Prefix"
objectStorageRegion: "Regiono" objectStorageRegion: "Regiono"
@ -469,11 +468,10 @@ disablePagesScript: "Malebligi AiScript en la paĝoj"
deleteAllFiles: "Forviŝi ĉiujn dosierojn" deleteAllFiles: "Forviŝi ĉiujn dosierojn"
deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn dosierojn?" deleteAllFilesConfirm: "Ĉu vi certas, ke vi volas forviŝi ĉiujn dosierojn?"
removeAllFollowing: "Ĉesi sekvi ĉiujn sekvatojn" removeAllFollowing: "Ĉesi sekvi ĉiujn sekvatojn"
userSuspended: "Ĉi tiu uzanto estas flostigita." userSuspended: "La uzanto estas flostigita."
userSilenced: "Ĉi tiu uzanto estas mutigita." userSilenced: "La uzanto estas mutigita."
menu: "Menuo" menu: "Menuo"
addItem: "Aldoni novaĵon" addItem: "Aldoni novaĵon"
rooms: "Ĉambro"
deletedNote: "Forviŝita noto" deletedNote: "Forviŝita noto"
invisibleNote: "Malpublikigita noto" invisibleNote: "Malpublikigita noto"
enableInfiniteScroll: "Ebligi infinitan rulumon" enableInfiniteScroll: "Ebligi infinitan rulumon"
@ -504,9 +502,10 @@ disableAll: "Malebligi ĉiujn"
notificationType: "Tipo de sciigoj" notificationType: "Tipo de sciigoj"
edit: "Redakti" edit: "Redakti"
emailServer: "Retpoŝta servilo" emailServer: "Retpoŝta servilo"
enableEmail: "Ebligi dissendon el retpoŝto" enableEmail: "Ebligi dissendon de retpoŝto"
emailConfigInfo: "Uzata por konfirmi vian retadreson kiam registri kaj por restarigi vian pasvorton"
email: "Retpoŝto" email: "Retpoŝto"
emailAddress: "Retpoŝta adreso" emailAddress: "Retpoŝtadreso"
smtpConfig: "Agordoj de SMTP servilo" smtpConfig: "Agordoj de SMTP servilo"
smtpHost: "Transa servilo" smtpHost: "Transa servilo"
smtpPort: "Pordo" smtpPort: "Pordo"
@ -531,12 +530,9 @@ regenerateLoginToken: "Regeneri la aŭtentikigan pecon"
fileIdOrUrl: "Dosiera identigilo aŭ URL" fileIdOrUrl: "Dosiera identigilo aŭ URL"
behavior: "Konduto" behavior: "Konduto"
sample: "Ekzemplo" sample: "Ekzemplo"
abuseReports: "Signaloj"
reportAbuse: "Signalo"
reportAbuseOf: "Signali kontraŭ {name}"
send: "Sendi" send: "Sendi"
openInNewTab: "Malfermi en nova langeto" openInNewTab: "Malfermi en nova langeto"
editTheseSettingsMayBreakAccount: "Redakti ĉi tiujn agordojn povas damaĝi vian konton." editTheseSettingsMayBreakAccount: "Redakti tiujn agordojn povas damaĝi vian konton."
instanceTicker: "Nomo de la nodo sendinta notojn" instanceTicker: "Nomo de la nodo sendinta notojn"
waitingFor: "Atendado pro {x}" waitingFor: "Atendado pro {x}"
random: "Hazarde" random: "Hazarde"
@ -559,17 +555,17 @@ sentReactionsCount: "La nombro de la reagoj senditaj"
receivedReactionsCount: "La nombro de la reagoj ricevitaj" receivedReactionsCount: "La nombro de la reagoj ricevitaj"
yes: "Jes" yes: "Jes"
no: "Ne" no: "Ne"
driveFilesCount: "La nombro de la dosieroj ĉe la disko" driveFilesCount: "La nombro de la dosieroj sur la disko"
notSet: "Ne elektita" notSet: "Ne elektita"
emailVerified: "Via retpoŝto estis kontrolita." emailVerified: "Via retpoŝtadreso estis kontrolita."
noteFavoritesCount: "La nombro de notoj preferataj" noteFavoritesCount: "La nombro de notoj preferataj"
pageLikesCount: "La nombro de paĝoj kiun la uzanto preferas" pageLikesCount: "La nombro de paĝa plaĉon"
pageLikedCount: "La nombro de uzantoj, kiuj preferas paĝon de ĉi tiu uzanto" pageLikedCount: "La nombro de la ricevita \"Mi plaĉas\""
contact: "Kontakto" contact: "Kontakto"
useSystemFont: "Uzi la tiparon implicitan de la sistemo" useSystemFont: "Uzi la tiparon implicitan de la sistemo"
developer: "Evoluiganto" developer: "Evoluiganto"
makeExplorable: "Videbligi konton sur la paĝo \"Esplori\"" makeExplorable: "La konton videbligi sur la paĝo \"Esplori\""
makeExplorableDescription: "Se vi elŝaltas tiun, via konto ne montros en la paĝo \"Esplori\"." makeExplorableDescription: "Se vi elŝaltas tiun, via konto ne montros sur la paĝo \"Esplori\"."
duplicate: "Duobligi" duplicate: "Duobligi"
left: "Maldekstra" left: "Maldekstra"
center: "Centra" center: "Centra"
@ -592,7 +588,7 @@ updatedAt: "Laste ĝisdatigita"
saveConfirm: "Ĉu vi konservas la ŝanĝon?" saveConfirm: "Ĉu vi konservas la ŝanĝon?"
deleteConfirm: "Ĉu certas forviŝi?" deleteConfirm: "Ĉu certas forviŝi?"
closeAccount: "Forigi konton" closeAccount: "Forigi konton"
currentVersion: "Nuna versio" currentVersion: "La aktuala versio"
latestVersion: "La plej nova versio" latestVersion: "La plej nova versio"
youAreRunningUpToDateClient: "Vi uzas la plej novan version de via kliento." youAreRunningUpToDateClient: "Vi uzas la plej novan version de via kliento."
newVersionOfClientAvailable: "Nova versio de via kliento estas disponebla." newVersionOfClientAvailable: "Nova versio de via kliento estas disponebla."
@ -624,6 +620,7 @@ memo: "Memorigilo"
high: "Alta" high: "Alta"
middle: "Meza" middle: "Meza"
low: "Malalta" low: "Malalta"
emailNotConfiguredWarning: "Vi ne agordis retpoŝtadreso."
customCss: "Personecigita CSS" customCss: "Personecigita CSS"
global: "Malloka" global: "Malloka"
sent: "Sendi" sent: "Sendi"
@ -636,19 +633,21 @@ translate: "Traduki"
translatedFrom: "Tradukita el {x}" translatedFrom: "Tradukita el {x}"
breakFollow: "Ĉesigi la sekvadon al vi" breakFollow: "Ĉesigi la sekvadon al vi"
itsOn: "Ŝaltita" itsOn: "Ŝaltita"
emailRequiredForSignup: "Registri konton devas konformi retpoŝtadreson"
unread: "Nelegita" unread: "Nelegita"
controlPanel: "Ŝaltpodio" controlPanel: "Ŝaltpodio"
manageAccounts: "Bonteni la kontojn" manageAccounts: "Bonteni la kontojn"
classic: "Klasika" classic: "Klasika"
muteThread: "Silentigi la mesaĝaron" muteThread: "Silentigi la mesaĝaron"
unmuteThread: "Malsilentigi la mesaĝaron" unmuteThread: "Malsilentigi la mesaĝaron"
ffVisibility: "Videbleco de la sekvadoj pri vi" ffVisibility: "Videbleco de viaj sekvatoj/sekvantoj"
ffVisibilityDescription: "Tie ĉi vi povas agordi la videblecon pri kiuj povas vidi tiujn, kiujn vi sekvas kaj kiuj sekvas vin." ffVisibilityDescription: "Oni permesas agordi tiuln kiuj povas vidi la homojn kiujn vi sekvas, kaj la homojn kiuj sekvas vin."
continueThread: "Pli vidi la mesaĝaron" continueThread: "Pli vidi la mesaĝaron"
incorrectPassword: "Nevalida pasvorto" incorrectPassword: "Nevalida pasvorto"
leaveGroup: "Eliĝi el la grupo" leaveGroup: "Eliĝi el la grupo"
leaveGroupConfirm: "Ĉu vi certas ke vi volas eliĝi el la grupo {name}?" leaveGroupConfirm: "Ĉu vi certas ke vi volas eliĝi el la grupo {name}?"
welcomeBackWithName: "Alvenbenon! {name}" welcomeBackWithName: "Bonrevenon, {name}!"
clickToFinishEmailVerification: "Volu klaki [{ok}] por fini la konfirmon de vian retadreson"
_emailUnavailable: _emailUnavailable:
used: "La retpoŝto jam estas uzita." used: "La retpoŝto jam estas uzita."
format: "Nevalida formato." format: "Nevalida formato."
@ -665,7 +664,7 @@ _accountDelete:
_ad: _ad:
back: "Nuligi" back: "Nuligi"
_forgotPassword: _forgotPassword:
enterEmail: "Entajpu la retpoŝton kiun vi registrigis al via konto. Ligilo por restarigi pasvorton estos sendita al la retpoŝto." enterEmail: "Entajpu la retpoŝton kiun vi registrigis al via konto. Ligilo por restarigi pasvorton estos sendita al la retadreso."
_gallery: _gallery:
liked: "Ŝatitaj notoj" liked: "Ŝatitaj notoj"
like: "Ŝati" like: "Ŝati"
@ -703,7 +702,7 @@ _mfm:
inlineMath: "Formulo (en linio)" inlineMath: "Formulo (en linio)"
blockMath: "Formulo (bloko)" blockMath: "Formulo (bloko)"
quote: "Citi" quote: "Citi"
emoji: "Federaj emoĵioj" emoji: "Propraj emoĝioj"
search: "Serĉi" search: "Serĉi"
flip: "Inversa" flip: "Inversa"
x2: "Granda" x2: "Granda"
@ -711,8 +710,6 @@ _mfm:
x4: "Pli grandega" x4: "Pli grandega"
font: "Presliteraro" font: "Presliteraro"
rotate: "Orientiĝo" rotate: "Orientiĝo"
_reversi:
total: "Entute"
_instanceTicker: _instanceTicker:
none: "Ne montri" none: "Ne montri"
remote: "Montri al foraj uzantoj" remote: "Montri al foraj uzantoj"
@ -725,7 +722,7 @@ _channel:
setBanner: "Apliki standardan bildon" setBanner: "Apliki standardan bildon"
removeBanner: "Forviŝi la standardan bildon" removeBanner: "Forviŝi la standardan bildon"
owned: "Bontenitaj de vi" owned: "Bontenitaj de vi"
following: "Sekvante" following: "Sekvado"
usersCount: "{n} partoprenantoj" usersCount: "{n} partoprenantoj"
_menuDisplay: _menuDisplay:
sideFull: "Flanko" sideFull: "Flanko"
@ -783,12 +780,12 @@ _time:
_tutorial: _tutorial:
title: "Uzado de Misskey" title: "Uzado de Misskey"
step1_1: "Bonvenon." step1_1: "Bonvenon."
step7_2: "Se vi volas scii pli pri Misskey, rigardu la fakon {help}." step7_2: "Se vi volas pli scii pri Misskey, vidu la fakon {help}."
step7_3: "Do, bonvolu amuziĝi sur Misskey🚀" step7_3: "Do, bonvolu amuziĝi sur Misskey🚀"
_2fa: _2fa:
registerKey: "Nove registri ŝlosilon" registerKey: "Nove registri ŝlosilon"
_permissions: _permissions:
"read:account": "Legado de la informoj pri via konto" "read:account": "Vidi la informojn de via konto"
"write:account": "Redatado de la informoj de via konto" "write:account": "Redatado de la informoj de via konto"
"read:blocks": "Vidi vian liston de uzantoj blokitaj" "read:blocks": "Vidi vian liston de uzantoj blokitaj"
"write:blocks": "Redakti vian liston de blokitoj" "write:blocks": "Redakti vian liston de blokitoj"
@ -796,8 +793,8 @@ _permissions:
"write:drive": "Ĉia operacio por skribi, forviŝi, aŭ alimaniere ŝanĝi la informon de dosiero en via disko de Misskey" "write:drive": "Ĉia operacio por skribi, forviŝi, aŭ alimaniere ŝanĝi la informon de dosiero en via disko de Misskey"
"read:favorites": "Vidi vian liston de preferaĵoj" "read:favorites": "Vidi vian liston de preferaĵoj"
"write:favorites": "Redakti vian liston de preferaĵoj" "write:favorites": "Redakti vian liston de preferaĵoj"
"read:following": "Vidi la infomojn pri la sekvadoj pri vi" "read:following": "Vidi la informojn de sekvo"
"write:following": "Sekvi/Malsekvi alian uzanton" "write:following": "Sekvi/ Ĉesi sekvi alian uzanton"
"read:messaging": "Vidi viajn retbabiladojn" "read:messaging": "Vidi viajn retbabiladojn"
"write:messaging": "Administri viajn retbabiladojn" "write:messaging": "Administri viajn retbabiladojn"
"read:mutes": "Vidi vian liston de silentigitoj" "read:mutes": "Vidi vian liston de silentigitoj"
@ -812,7 +809,7 @@ _permissions:
"read:channels": "Vidi kanalojn" "read:channels": "Vidi kanalojn"
_antennaSources: _antennaSources:
all: "Ĉiuj notoj" all: "Ĉiuj notoj"
homeTimeline: "Notoj de uzantoj kiujn vi sekvas" homeTimeline: "Notoj de la uzantoj kiujn vi sekvas"
_weekday: _weekday:
sunday: "Dimanĉo" sunday: "Dimanĉo"
monday: "Lundo" monday: "Lundo"
@ -856,18 +853,19 @@ _visibility:
_postForm: _postForm:
replyPlaceholder: "Respondi la noton…" replyPlaceholder: "Respondi la noton…"
quotePlaceholder: "Citi la noton…" quotePlaceholder: "Citi la noton…"
channelPlaceholder: "Mencii en la kanalo…" channelPlaceholder: "Afiŝi en la kanalo…"
_placeholders: _placeholders:
a: "Kiel vi fartas?" a: "Kiel vi fartas?"
b: "Kio okazis ĉirkaŭ vi?" b: "Kio okazis ĉirkaŭ vi?"
c: "Kion vi pensas?" c: "Kio estas sur via penso?"
d: "Kion vi parolos?" d: "Kion vi volas diri?"
e: "Komencu skribi…" e: "Komencu skribi tie"
f: "Atendanta de vi skribon…"
_profile: _profile:
name: "Nomo" name: "Nomo"
username: "Uzantnomo" username: "Uzantnomo"
description: "Sinprezento" description: "Sinprezento"
metadata: "Kromaj informoj" metadata: "Kromaj Informoj"
metadataEdit: "Redakti kromajn informojn" metadataEdit: "Redakti kromajn informojn"
changeAvatar: "Ŝanĝi profilbildon" changeAvatar: "Ŝanĝi profilbildon"
changeBanner: "Ŝanĝi standardon" changeBanner: "Ŝanĝi standardon"
@ -888,42 +886,18 @@ _timelines:
local: "Loka" local: "Loka"
social: "Sociala" social: "Sociala"
global: "Malloka" global: "Malloka"
_rooms:
translate: "Movi"
chooseImage: "Elekti bildon"
_roomType:
default: "Implicitaĵo"
_furnitures:
bed: "Lito"
low-table: "Malaltotablo"
desk: "Skribotablo"
chair: "Seĝo"
chair2: "Seĝo 2"
pc: "Komputilo"
eraser: "Skrapileto"
pencil: "Krajono"
pudding: "Flaŭno"
book: "Libro"
book2: "Libro 2"
piano: "Piano"
facial-tissue: "Tualetpaperejo"
server: "Servilo"
moon: "Luno"
monitor: "Monitoro"
keyboard: "Klavaro"
doll-ai: "Pupa Ai"
_pages: _pages:
newPage: "Krei novan paĝon" newPage: "Krei novan paĝon"
editPage: "Redakti paĝon" editPage: "Redakti paĝon"
deleted: "Oni forviŝis la paĝon." deleted: "Oni forviŝis la paĝon."
editThisPage: "Redakti la paĝon" editThisPage: "Redakti la paĝon"
viewPage: "Vidi viajn paĝojn" viewPage: "Vidi paĝojn"
my: "Miaj paĝoj" my: "Miaj paĝoj"
featured: "Ravaĵoj" featured: "Ravaĵoj"
contents: "Enhavo" contents: "Enhavo"
content: "Paĝo en bloko" content: "Bloko de paĝo"
title: "Temlinio" title: "Temlinio"
url: "URL de paĝo" url: "URL de la paĝo"
alignCenter: "Centrigi" alignCenter: "Centrigi"
hideTitleWhenPinned: "Kaŝi la titolon de la paĝo kiam alpinglita" hideTitleWhenPinned: "Kaŝi la titolon de la paĝo kiam alpinglita"
chooseBlock: "Aldoni blokon" chooseBlock: "Aldoni blokon"
@ -1039,7 +1013,7 @@ _notification:
youWereInvitedToGroup: "Invitita al grupo" youWereInvitedToGroup: "Invitita al grupo"
_types: _types:
all: "Ĉio" all: "Ĉio"
follow: "Novaj sekvatoj" follow: "Novaj sekvantoj"
mention: "Mencioj" mention: "Mencioj"
reply: "Respondoj" reply: "Respondoj"
renote: "Plusendoj" renote: "Plusendoj"

View File

@ -81,6 +81,8 @@ somethingHappened: "Ocurrió un error"
retry: "Reintentar" retry: "Reintentar"
pageLoadError: "Error al leer la página" pageLoadError: "Error al leer la página"
pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador. Por favor limpie el caché o intente más tarde." pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador. Por favor limpie el caché o intente más tarde."
serverIsDead: "No hay respuesta del servidor. Espere un momento y vuelva a intentarlo."
youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza una versión más reciente del cliente."
enterListName: "Ingrese nombre de lista" enterListName: "Ingrese nombre de lista"
privacy: "Privacidad" privacy: "Privacidad"
makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento" makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento"
@ -104,6 +106,7 @@ clickToShow: "Click para ver"
sensitive: "Marcado como sensible" sensitive: "Marcado como sensible"
add: "Agregar" add: "Agregar"
reaction: "Reacción" reaction: "Reacción"
reactionSetting: "Reacciones para mostrar en el menú de reacciones"
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir." reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
rememberNoteVisibility: "Recordar visibilidad" rememberNoteVisibility: "Recordar visibilidad"
attachCancel: "Quitar adjunto" attachCancel: "Quitar adjunto"
@ -239,7 +242,6 @@ uploadFromUrlDescription: "URL del fichero que quieres subir"
uploadFromUrlRequested: "Subida solicitada" uploadFromUrlRequested: "Subida solicitada"
uploadFromUrlMayTakeTime: "Subir el fichero puede tardar un tiempo." uploadFromUrlMayTakeTime: "Subir el fichero puede tardar un tiempo."
explore: "Explorar" explore: "Explorar"
games: "Misskey Games"
messageRead: "Ya leído" messageRead: "Ya leído"
noMoreHistory: "El historial se ha acabado" noMoreHistory: "El historial se ha acabado"
startMessaging: "Iniciar chat" startMessaging: "Iniciar chat"
@ -533,7 +535,6 @@ yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violac
menu: "Menú" menu: "Menú"
divider: "Divisor" divider: "Divisor"
addItem: "Agregar elemento" addItem: "Agregar elemento"
rooms: "Cuartos"
relays: "Relés" relays: "Relés"
addRelay: "Agregar relé" addRelay: "Agregar relé"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
@ -589,6 +590,7 @@ smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP"
smtpSecureInfo: "Apagar cuando se use STARTTLS" smtpSecureInfo: "Apagar cuando se use STARTTLS"
testEmail: "Prueba de envío" testEmail: "Prueba de envío"
wordMute: "Silenciar palabras" wordMute: "Silenciar palabras"
instanceMute: "Instancias silenciadas"
userSaysSomething: "{name} dijo algo" userSaysSomething: "{name} dijo algo"
makeActive: "Activar" makeActive: "Activar"
display: "Apariencia" display: "Apariencia"
@ -663,7 +665,6 @@ emailVerified: "Su dirección de correo electrónico ha sido verificada."
noteFavoritesCount: "Número de notas favoritas" noteFavoritesCount: "Número de notas favoritas"
pageLikesCount: "Número de favoritos en la página" pageLikesCount: "Número de favoritos en la página"
pageLikedCount: "Número de favoritos de su página" pageLikedCount: "Número de favoritos de su página"
reversiCount: "Numero de partidas Reversi"
contact: "Contacto" contact: "Contacto"
useSystemFont: "Utilizar la tipografía por defecto del sistema" useSystemFont: "Utilizar la tipografía por defecto del sistema"
clips: "Clip" clips: "Clip"
@ -707,12 +708,27 @@ usageAmount: "Uso"
capacity: "Capacidad" capacity: "Capacidad"
inUse: "Usado" inUse: "Usado"
editCode: "Editar código" editCode: "Editar código"
apply: "Aplicar"
publish: "Publicar"
inChannelSearch: "Buscar en el canal"
markAllAsRead: "Marcar todo como leído"
goBack: "Deseleccionar" goBack: "Deseleccionar"
info: "Información" info: "Información"
online: "En línea"
offline: "Sin conexión"
user: "Usuarios" user: "Usuarios"
administration: "Administrar" administration: "Administrar"
gallery: "Galería"
recentPosts: "Posts recientes"
popularPosts: "Más vistos"
expiration: "Termina el" expiration: "Termina el"
high: "Alta"
middle: "Mediano" middle: "Mediano"
low: "Baja"
emailNotConfiguredWarning: "No se ha configurado una dirección de correo electrónico."
ratio: "Proporción"
previewNoteText: "Mostrar vista preliminar"
customCss: "CSS personalizado"
customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir valores inadecuados puede hacer que el cliente deje de funcionar con normalidad." customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir valores inadecuados puede hacer que el cliente deje de funcionar con normalidad."
global: "Global" global: "Global"
squareAvatars: "Mostrar iconos cuadrados" squareAvatars: "Mostrar iconos cuadrados"
@ -735,13 +751,28 @@ pubSub: "Cuentas Pub/Sub"
lastCommunication: "Última comunicación" lastCommunication: "Última comunicación"
resolved: "Resuelto" resolved: "Resuelto"
unresolved: "Sin resolver" unresolved: "Sin resolver"
itsOn: "¡Está encendido!"
itsOff: "¡Está apagado!"
emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro de la cuenta"
unread: "No leído"
filter: "Filtro"
controlPanel: "Panel de control" controlPanel: "Panel de control"
manageAccounts: "Administrar cuenta"
makeReactionsPublic: "Hacer el historial de reacciones público"
makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente visibles."
classic: "Clásico"
muteThread: "Ocultar hilo"
unmuteThread: "Mostrar hilo"
ffVisibility: "Visibilidad de seguidores y seguidos"
hide: "Ocultar" hide: "Ocultar"
_ffVisibility:
public: "Publicar"
_accountDelete: _accountDelete:
accountDelete: "Eliminar Cuenta" accountDelete: "Eliminar Cuenta"
_ad: _ad:
back: "Deseleccionar" back: "Deseleccionar"
_gallery: _gallery:
my: "Mi galería"
unlike: "Quitar me gusta" unlike: "Quitar me gusta"
_email: _email:
_follow: _follow:
@ -768,39 +799,6 @@ _mfm:
flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha." flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda / derecha."
font: "Fuente" font: "Fuente"
rotate: "Rotar" rotate: "Rotar"
_reversi:
reversi: "Reversi"
gameSettings: "Configuración del juego"
chooseBoard: "Elegir tablero"
blackOrWhite: "Blancas/Negras"
blackIs: "{name} juega con fichas negras"
rules: "Reglas"
botSettings: "Opciones del bot"
thisGameIsStartedSoon: "El juego empezará en segundos"
waitingForOther: "Esperando el turno del adversario"
waitingForMe: "Esperando mi turno"
waitingBoth: "Prepárate"
ready: "Listo"
cancelReady: "No estoy listo"
opponentTurn: "Turno del adversario"
myTurn: "Mi turno"
turnOf: "Turno de {name}"
pastTurnOf: "Turno de {name}"
surrender: "Rendirse"
surrendered: "Por rendirse"
drawn: "Empate"
won: "{name} ha ganado"
black: "Negro"
white: "Blanco"
total: "Total"
turnCount: "Turno {count}"
myGames: "Mis juegos"
allGames: "Todos los juegos"
ended: "Finalizado"
playing: "Jugando"
isLlotheo: "El que tenga menos fichas gana (LLoTheO)"
loopedMap: "Mapa en bucle"
canPutEverywhere: "Puedes colocar donde quieras"
_instanceTicker: _instanceTicker:
none: "No mostrar" none: "No mostrar"
remote: "Mostrar a usuarios remotos" remote: "Mostrar a usuarios remotos"
@ -820,6 +818,8 @@ _channel:
usersCount: "{n} participantes" usersCount: "{n} participantes"
notesCount: "{n} notas" notesCount: "{n} notas"
_menuDisplay: _menuDisplay:
sideFull: "Horizontal"
sideIcon: "Horizontal (ícono)"
hide: "Ocultar" hide: "Ocultar"
_wordMute: _wordMute:
muteWords: "Palabras que silenciar" muteWords: "Palabras que silenciar"
@ -830,6 +830,11 @@ _wordMute:
soft: "Suave" soft: "Suave"
hard: "Duro" hard: "Duro"
mutedNotes: "Notas silenciadas" mutedNotes: "Notas silenciadas"
_instanceMute:
instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas, incluyendo respuestas a los usuarios de las mismas"
instanceMuteDescription2: "Separar por líneas"
title: "Oculta las notas de las instancias listadas."
heading: "Instancias a silenciar"
_theme: _theme:
explore: "Explorar temas" explore: "Explorar temas"
install: "Instalar tema" install: "Instalar tema"
@ -1116,68 +1121,6 @@ _timelines:
local: "Local" local: "Local"
social: "Social" social: "Social"
global: "Global" global: "Global"
_rooms:
roomOf: "Cuarto de {user}"
addFurniture: "Colocar muebles"
translate: "Mover"
rotate: "Rotar"
exit: "Deseleccionar"
remove: "Quitar"
clear: "Quitar todo"
clearConfirm: "¿Quiere quitar todos los muebles?"
leaveConfirm: "Hay modificaciones sin guardar. ¿Desea irse?"
chooseImage: "Escoger una imagen"
roomType: "Estilo de cuarto"
carpetColor: "Color de piso"
_roomType:
default: "Predeterminado"
washitsu: "Estilo japonés"
_furnitures:
milk: "Cartón de leche"
bed: "Cama"
low-table: "Mesa chica"
desk: "Escritorio"
chair: "Silla"
chair2: "Silla 2"
fan: "Ventilador"
pc: "Computadora"
plant: "Planta decorativa"
plant2: "Planta decorativa 2"
eraser: "Goma de borrar"
pencil: "lápiz"
pudding: "Pudín"
cardboard-box: "Caja de cartón"
cardboard-box2: "Caja de cartón 2"
cardboard-box3: "Caja de cartón 3"
book: "Libro"
book2: "Libro 2"
piano: "Piano"
facial-tissue: "Caja de pañuelos"
server: "Servidor"
moon: "Luna"
corkboard: "Pizarra de corcho"
mousepad: "Alfombrilla de ratón"
monitor: "Monitor"
keyboard: "Teclado"
carpet-stripe: "Alfombra (a rayas)"
mat: "Tapete"
color-box: "Caja de colores"
wall-clock: "Reloj de pared"
photoframe: "Fotograma"
cube: "Cubo"
tv: "Televisor"
pinguin: "Pinguino"
rubik-cube: "Cubo rubik"
poster-h: "Poster (horizontal)"
poster-v: "Poster (vertical)"
sofa: "Sillón"
spiral: "Escalera en espiral"
bin: "Papelera"
cup-noodle: "Taza de sopa de fideos"
holo-display: "Poster holográfico"
energy-drink: "Bebida energética"
doll-ai: "Muñeca"
banknote: "Billetes"
_pages: _pages:
newPage: "Crear página" newPage: "Crear página"
editPage: "Editar página" editPage: "Editar página"

View File

@ -19,7 +19,7 @@ noNotifications: "Aucune notification"
instance: "Instance" instance: "Instance"
settings: "Paramètres" settings: "Paramètres"
basicSettings: "Paramètres généraux" basicSettings: "Paramètres généraux"
otherSettings: "Autres paramètres" otherSettings: "Paramètres avancés"
openInWindow: "Ouvrir dans une nouvelle fenêtre" openInWindow: "Ouvrir dans une nouvelle fenêtre"
profile: "Profil" profile: "Profil"
timeline: "Fil" timeline: "Fil"
@ -106,6 +106,7 @@ clickToShow: "Cliquer pour afficher"
sensitive: "Contenu sensible" sensitive: "Contenu sensible"
add: "Ajouter" add: "Ajouter"
reaction: "Réactions" reaction: "Réactions"
reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter." reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilité des notes \" vous permet de réutiliser automatiquement la visibilité utilisée lors de la publication de votre note précédente." rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilité des notes \" vous permet de réutiliser automatiquement la visibilité utilisée lors de la publication de votre note précédente."
attachCancel: "Supprimer le fichier attaché" attachCancel: "Supprimer le fichier attaché"
@ -241,7 +242,6 @@ uploadFromUrlDescription: "URL du fichier que vous souhaitez téléverser"
uploadFromUrlRequested: "Téléversement demandé" uploadFromUrlRequested: "Téléversement demandé"
uploadFromUrlMayTakeTime: "Le téléversement de votre fichier peut prendre un certain temps." uploadFromUrlMayTakeTime: "Le téléversement de votre fichier peut prendre un certain temps."
explore: "Découvrir" explore: "Découvrir"
games: "Jeux de Misskey"
messageRead: "Lu" messageRead: "Lu"
noMoreHistory: "Il ny a plus dhistorique" noMoreHistory: "Il ny a plus dhistorique"
startMessaging: "Commencer à discuter" startMessaging: "Commencer à discuter"
@ -535,7 +535,6 @@ yourAccountSuspendedDescription: "Ce compte est suspendu car vous avez enfreint
menu: "Menu" menu: "Menu"
divider: "Séparateur" divider: "Séparateur"
addItem: "Ajouter un élément" addItem: "Ajouter un élément"
rooms: "Chambre"
relays: "Relais" relays: "Relais"
addRelay: "Ajouter un relais" addRelay: "Ajouter un relais"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
@ -591,6 +590,7 @@ smtpSecure: "Utiliser SSL/TLS implicitement dans les connexions SMTP"
smtpSecureInfo: "Désactiver cette option lorsque STARTTLS est utilisé" smtpSecureInfo: "Désactiver cette option lorsque STARTTLS est utilisé"
testEmail: "Tester la distribution de courriel" testEmail: "Tester la distribution de courriel"
wordMute: "Filtre de mots" wordMute: "Filtre de mots"
instanceMute: "Instance en sourdine"
userSaysSomething: "{name} a dit quelque chose" userSaysSomething: "{name} a dit quelque chose"
makeActive: "Activer" makeActive: "Activer"
display: "Affichage" display: "Affichage"
@ -618,6 +618,9 @@ reportAbuse: "Signaler"
reportAbuseOf: "Signaler {name}" reportAbuseOf: "Signaler {name}"
fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit d'une note précise, veuillez en donner le lien." fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit d'une note précise, veuillez en donner le lien."
abuseReported: "Le rapport est envoyé. Merci." abuseReported: "Le rapport est envoyé. Merci."
reporteeOrigin: "Origine du signalement"
reporterOrigin: "Signalé par"
forwardReport: "Transférer le signalement à linstance distante"
send: "Envoyer" send: "Envoyer"
abuseMarkAsResolved: "Marquer le signalement comme résolu" abuseMarkAsResolved: "Marquer le signalement comme résolu"
openInNewTab: "Ouvrir dans un nouvel onglet" openInNewTab: "Ouvrir dans un nouvel onglet"
@ -665,7 +668,6 @@ emailVerified: "Votre adresse e-mail a été vérifiée."
noteFavoritesCount: "Nombre de notes dans les favoris" noteFavoritesCount: "Nombre de notes dans les favoris"
pageLikesCount: "Nombre de pages aimées" pageLikesCount: "Nombre de pages aimées"
pageLikedCount: "Nombre de vos pages aimées" pageLikedCount: "Nombre de vos pages aimées"
reversiCount: "Nombre de parties de Reversi"
contact: "Contact" contact: "Contact"
useSystemFont: "Utiliser la police par défaut du système" useSystemFont: "Utiliser la police par défaut du système"
clips: "Clips" clips: "Clips"
@ -680,6 +682,7 @@ center: "Centrer"
wide: "Large" wide: "Large"
narrow: "Condensé" narrow: "Condensé"
reloadToApplySetting: "Vos paramètres seront appliqués lorsque vous rechargerez la page. Souhaitez-vous recharger ?" reloadToApplySetting: "Vos paramètres seront appliqués lorsque vous rechargerez la page. Souhaitez-vous recharger ?"
needReloadToApply: "Ce paramètre s'appliquera après un rechargement."
showTitlebar: "Afficher la barre de titre" showTitlebar: "Afficher la barre de titre"
clearCache: "Vider le cache" clearCache: "Vider le cache"
onlineUsersCount: "{n} utilisateur(s) en ligne" onlineUsersCount: "{n} utilisateur(s) en ligne"
@ -788,6 +791,7 @@ pubSub: "Comptes Pub/Sub"
lastCommunication: "Dernière communication" lastCommunication: "Dernière communication"
resolved: "Résolu" resolved: "Résolu"
unresolved: "En attente" unresolved: "En attente"
breakFollow: "Ne plus suivre"
itsOn: "Activé" itsOn: "Activé"
itsOff: "Désactivé" itsOff: "Désactivé"
emailRequiredForSignup: "Une adresse e-mail est nécessaire pour créer un compte" emailRequiredForSignup: "Une adresse e-mail est nécessaire pour créer un compte"
@ -795,9 +799,22 @@ unread: "Non lu"
filter: "Filtre" filter: "Filtre"
controlPanel: "Panneau de contrôle" controlPanel: "Panneau de contrôle"
manageAccounts: "Gérer les comptes" manageAccounts: "Gérer les comptes"
makeReactionsPublic: "Rendre les réactions publiques"
makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions données publique."
classic: "Classique" classic: "Classique"
muteThread: "Mettre ce thread en sourdine"
ffVisibility: "Visibilité des abonnés/abonnements"
ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu suis et les personnes qui te suivent."
continueThread: "Afficher la suite du fil"
deleteAccountConfirm: "Votre compte sera supprimé. Êtes vous certain ?"
incorrectPassword: "Le mot de passe est incorrect."
hide: "Masquer" hide: "Masquer"
leaveGroup: "Quitter le groupe"
leaveGroupConfirm: "Êtes vous sûr de vouloir quitter \"{name}\" ?"
welcomeBackWithName: "Heureux de vous revoir, {name}"
clickToFinishEmailVerification: "Veuillez cliquer sur [{ok}] afin de compléter la vérification par courriel."
_emailUnavailable: _emailUnavailable:
used: "Non disponible"
format: "Le format de cette adresse de courriel est invalide" format: "Le format de cette adresse de courriel est invalide"
mx: "Ce serveur de courriels est invalide" mx: "Ce serveur de courriels est invalide"
smtp: "Ce serveur de courriels ne répond pas" smtp: "Ce serveur de courriels ne répond pas"
@ -919,39 +936,6 @@ _mfm:
sparkle: "Paillettes" sparkle: "Paillettes"
sparkleDescription: "Ajoute un effet scintillant au contenu." sparkleDescription: "Ajoute un effet scintillant au contenu."
rotate: "Pivoter" rotate: "Pivoter"
_reversi:
reversi: "Reversi"
gameSettings: "Réglages de la partie"
chooseBoard: "Choix du plateau"
blackOrWhite: "Pions blancs/Pions noirs"
blackIs: "{name} joue les pions noirs"
rules: "Règles"
botSettings: "Options du bot"
thisGameIsStartedSoon: "La partie commencera dans quelques secondes"
waitingForOther: "En attente que l'adversaire soit prêt"
waitingForMe: "En attente que vous soyez prêt"
waitingBoth: "Préparez-vous"
ready: "Prêt"
cancelReady: "Recommencer la préparation"
opponentTurn: "Tour de ladversaire"
myTurn: "Cest votre tour"
turnOf: "Tour de {name}"
pastTurnOf: "Tour de {name}"
surrender: "Abandonner"
surrendered: "Par abandon"
drawn: "Match nul"
won: "{name} a gagné"
black: "Noirs"
white: "Blancs"
total: "Total"
turnCount: "Tour {count}"
myGames: "Mes parties"
allGames: "Toutes les parties"
ended: "Fin de partie"
playing: "En cours"
isLlotheo: "Celui ou celle qui a le moins de pièces gagne (Llotheo)"
loopedMap: "Carte en boucle"
canPutEverywhere: "Les pions peuvent être placés partout "
_instanceTicker: _instanceTicker:
none: "Cacher " none: "Cacher "
remote: "Montrer pour les utilisateur·ice·s distant·e·s" remote: "Montrer pour les utilisateur·ice·s distant·e·s"
@ -984,6 +968,8 @@ _wordMute:
soft: "Doux" soft: "Doux"
hard: "Strict" hard: "Strict"
mutedNotes: "Notes filtrées" mutedNotes: "Notes filtrées"
_instanceMute:
heading: "Instances à mettre en sourdine"
_theme: _theme:
explore: "Explorer les thèmes" explore: "Explorer les thèmes"
install: "Installer un thème" install: "Installer un thème"
@ -1066,8 +1052,6 @@ _sfx:
chatBg: "Discussion (arrière-plan)" chatBg: "Discussion (arrière-plan)"
antenna: "Réception de lantenne" antenna: "Réception de lantenne"
channel: "Notifications de canal" channel: "Notifications de canal"
reversiPutBlack: "Reversi : les pions noirs ont joué"
reversiPutWhite: "Reversi : les pions blancs ont joué"
_ago: _ago:
unknown: "Inconnu" unknown: "Inconnu"
future: "Futur" future: "Futur"
@ -1257,6 +1241,7 @@ _exportOrImport:
muteList: "Comptes masqués" muteList: "Comptes masqués"
blockingList: "Comptes bloqués" blockingList: "Comptes bloqués"
userLists: "Listes" userLists: "Listes"
excludeInactiveUsers: "Exclure les utilisateur·rice·s inactifs"
_charts: _charts:
federationInstancesIncDec: "Variation du nombre d'instances fédérées" federationInstancesIncDec: "Variation du nombre d'instances fédérées"
federationInstancesTotal: "Nombre total d'instances fédérées" federationInstancesTotal: "Nombre total d'instances fédérées"
@ -1288,68 +1273,6 @@ _timelines:
local: "Local" local: "Local"
social: "Social" social: "Social"
global: "Global" global: "Global"
_rooms:
roomOf: "Chambre de {user}"
addFurniture: "Placer des meubles"
translate: "Déplacer"
rotate: "Pivoter"
exit: "Retour"
remove: "Enlever"
clear: "Tout enlever"
clearConfirm: "Souhaitez-vous enlever tous les meubles de votre chambre ?"
leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous vraiment quitter ?"
chooseImage: "Sélectionnez une image"
roomType: "Type de chambre"
carpetColor: "Couleur du tapis"
_roomType:
default: "Par défaut"
washitsu: "Style japonnais"
_furnitures:
milk: "Brique de lait"
bed: "Lit"
low-table: "Table basse"
desk: "Bureau"
chair: "Chaise"
chair2: "Chaise 2"
fan: "Ventilateur"
pc: "Ordinateur"
plant: "Plante dintérieur"
plant2: "Plante dintérieur 2"
eraser: "Gomme"
pencil: "Crayon"
pudding: "Pudding"
cardboard-box: "Boîte en carton"
cardboard-box2: "Boîte en carton 2"
cardboard-box3: "Boîte en carton 3"
book: "Livre"
book2: "Livre 2"
piano: "Piano"
facial-tissue: "Boîte de mouchoirs"
server: "Serveurs"
moon: "Lune"
corkboard: "Tableau en liège"
mousepad: "Tapis de souris"
monitor: "Écran de contrôle"
keyboard: "Clavier"
carpet-stripe: "Tapis (zébré)"
mat: "Tapis"
color-box: "Étagère"
wall-clock: "Horloge murale"
photoframe: "Cadre photo"
cube: "Cube"
tv: "Télé"
pinguin: "Pingouin"
rubik-cube: "Cube de Rubik"
poster-h: "Affiche (horizontale)"
poster-v: "Affiche (verticale)"
sofa: "Canapé"
spiral: "Escaliers en spirale"
bin: "Corbeille"
cup-noodle: "Bol de nouilles"
holo-display: "Affichage holographique"
energy-drink: "Boisson énergétique"
doll-ai: "Poupée Ai"
banknote: "Billets de banque"
_pages: _pages:
newPage: "Créer une page" newPage: "Créer une page"
editPage: "Modifier une page" editPage: "Modifier une page"

View File

@ -241,7 +241,6 @@ uploadFromUrlDescription: "URL berkas yang ingin kamu unggah"
uploadFromUrlRequested: "Pengunggahan telah diminta" uploadFromUrlRequested: "Pengunggahan telah diminta"
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai" uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
explore: "Jelajahi" explore: "Jelajahi"
games: "Permainan Misskey"
messageRead: "Telah dibaca" messageRead: "Telah dibaca"
noMoreHistory: "Tidak ada sejarah lagi" noMoreHistory: "Tidak ada sejarah lagi"
startMessaging: "Mulai mengirim pesan" startMessaging: "Mulai mengirim pesan"
@ -535,7 +534,6 @@ yourAccountSuspendedDescription: "Akun ini dibekukan karena melanggar ketentuan
menu: "Menu" menu: "Menu"
divider: "Pembagi" divider: "Pembagi"
addItem: "Tambahkan item" addItem: "Tambahkan item"
rooms: "Ruang"
relays: "Relay" relays: "Relay"
addRelay: "Tambahkan relay" addRelay: "Tambahkan relay"
inboxUrl: "URL Kotak masuk" inboxUrl: "URL Kotak masuk"
@ -667,7 +665,6 @@ emailVerified: "Surel telah diverifikasi"
noteFavoritesCount: "Jumlah catatan yang difavoritkan" noteFavoritesCount: "Jumlah catatan yang difavoritkan"
pageLikesCount: "Jumlah suka yang diterima Halaman" pageLikesCount: "Jumlah suka yang diterima Halaman"
pageLikedCount: "Jumlah Halaman yang disukai" pageLikedCount: "Jumlah Halaman yang disukai"
reversiCount: "Jumlah pertandingan Reversi"
contact: "Kontak" contact: "Kontak"
useSystemFont: "Gunakan font bawaan sistem operasi" useSystemFont: "Gunakan font bawaan sistem operasi"
clips: "Klip" clips: "Klip"
@ -934,39 +931,6 @@ _mfm:
sparkleDescription: "Memberikan konten efek partikel kelap-kelip." sparkleDescription: "Memberikan konten efek partikel kelap-kelip."
rotate: "Putar" rotate: "Putar"
rotateDescription: "Putar konten sesuai sudut yang ditentukan." rotateDescription: "Putar konten sesuai sudut yang ditentukan."
_reversi:
reversi: "Reversi"
gameSettings: "Pengaturan permainan"
chooseBoard: "Pilih papan"
blackOrWhite: "Hitam/Putih"
blackIs: "{name} bermain Hitam"
rules: "Peraturan"
botSettings: "Opsi bot"
thisGameIsStartedSoon: "Permainan akan mulai dalam beberapa detik"
waitingForOther: "Menunggu giliran lawan"
waitingForMe: "Menunggu giliran kamu"
waitingBoth: "Bersiap"
ready: "Siap"
cancelReady: "Batalkan siap"
opponentTurn: "Giliran lawan"
myTurn: "Giliran kamu"
turnOf: "Giliran {name}"
pastTurnOf: "Giliran {name}"
surrender: "Menyerah"
surrendered: "Karena menyerah"
drawn: "Seri"
won: "Kemenangan {name}"
black: "Hitam"
white: "Putih"
total: "Jumlah"
turnCount: "Giliran {count}"
myGames: "Rondeku"
allGames: "Semua ronde"
ended: "Selesai"
playing: "Sedang bermain"
isLlotheo: "Pemain dengan batu paling sedikitlah yang menang (Llotheo)"
loopedMap: "Peta melingkar"
canPutEverywhere: "Keping dapat ditaruh dimana saja"
_instanceTicker: _instanceTicker:
none: "Jangan tampilkan" none: "Jangan tampilkan"
remote: "Tampilkan untuk pengguna luar" remote: "Tampilkan untuk pengguna luar"
@ -1081,8 +1045,6 @@ _sfx:
chatBg: "Obrolan (Latar Belakang)" chatBg: "Obrolan (Latar Belakang)"
antenna: "Penerimaan Antenna" antenna: "Penerimaan Antenna"
channel: "Pemberitahuan saluran" channel: "Pemberitahuan saluran"
reversiPutBlack: "Reversi: Hitam bergerak"
reversiPutWhite: "Reversi: Putih bergerak"
_ago: _ago:
unknown: "Tidak diketahui" unknown: "Tidak diketahui"
future: "Masa depan" future: "Masa depan"
@ -1303,68 +1265,6 @@ _timelines:
local: "Lokal" local: "Lokal"
social: "Sosial" social: "Sosial"
global: "Global" global: "Global"
_rooms:
roomOf: "Ruangan {user}"
addFurniture: "Letakkan perabotan"
translate: "Pindah"
rotate: "Putar"
exit: "Kembali"
remove: "Hapus"
clear: "Bersihkan"
clearConfirm: "Apakah kamu yakin ingin menghapus semua perabotan di ruanganmu?"
leaveConfirm: "Ada perubahan yang belum tersimpan. Apakah kamu ingin pergi?"
chooseImage: "Pilih gambar"
roomType: "Tipe ruangan"
carpetColor: "Warna karpet"
_roomType:
default: "Bawaan"
washitsu: "Gaya Jepang"
_furnitures:
milk: "Kardus susu"
bed: "Tempat tidur"
low-table: "Meja pendek"
desk: "Meja tulis"
chair: "Kursi"
chair2: "Kursi 2"
fan: "Kipas angin"
pc: "Komputer"
plant: "Tanaman"
plant2: "Tanaman 2"
eraser: "Karet Penghapus"
pencil: "Pensil"
pudding: "Puding"
cardboard-box: "Kotak Kardus"
cardboard-box2: "Kotak Kardus 2"
cardboard-box3: "Kotak Kardus 3"
book: "Buku"
book2: "Buku 2"
piano: "Piano"
facial-tissue: "Tisu Wajah"
server: "Server"
moon: "Bulan"
corkboard: "Papan buletin"
mousepad: "Mousepad"
monitor: "Layar Monitor"
keyboard: "Papan tombol"
carpet-stripe: "Karpet (Bergaris)"
mat: "Keset"
color-box: "Rak buku"
wall-clock: "Jam dinding"
photoframe: "Bingkai foto"
cube: "Kubus"
tv: "Televisi"
pinguin: "Pinguin"
rubik-cube: "Rubik"
poster-h: "Poster (Horizontal)"
poster-v: "Poster (Vertical)"
sofa: "Sofa"
spiral: "Tangga spiral"
bin: "Tempat sampah"
cup-noodle: "Migelas"
holo-display: "Layar hologram"
energy-drink: "Minuman energi"
doll-ai: "Boneka Ai"
banknote: "Uang"
_pages: _pages:
newPage: "Buat halaman baru" newPage: "Buat halaman baru"
editPage: "Sunting halaman" editPage: "Sunting halaman"

View File

@ -80,6 +80,9 @@ error: "Errore"
somethingHappened: "Si è verificato un problema" somethingHappened: "Si è verificato un problema"
retry: "Riprova" retry: "Riprova"
pageLoadError: "Caricamento pagina non riuscito. " pageLoadError: "Caricamento pagina non riuscito. "
pageLoadErrorDescription: "Questo viene normalmente causato dalla rete o dalla cache del browser. Si prega di pulire la cache, o di attendere e riprovare più tardi."
serverIsDead: "Il server non risponde. Si prega di attendere e riprovare più tardi."
youShouldUpgradeClient: "Per visualizzare la pagina è necessario aggiornare il client alla nuova versione e ricaricare."
enterListName: "Nome della lista" enterListName: "Nome della lista"
privacy: "Privacy" privacy: "Privacy"
makeFollowManuallyApprove: "Richiedi di approvare i follower manualmente" makeFollowManuallyApprove: "Richiedi di approvare i follower manualmente"
@ -103,6 +106,7 @@ clickToShow: "Clicca per visualizzare"
sensitive: "Contenuto sensibile" sensitive: "Contenuto sensibile"
add: "Aggiungi" add: "Aggiungi"
reaction: "Reazione" reaction: "Reazione"
reactionSetting: "Reazioni visualizzate sul pannello"
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere." reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note" rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
attachCancel: "Rimuovi allegato" attachCancel: "Rimuovi allegato"
@ -132,6 +136,7 @@ emojiUrl: "URL dell'emoji"
addEmoji: "Aggiungi un emoji" addEmoji: "Aggiungi un emoji"
settingGuide: "Configurazione suggerita" settingGuide: "Configurazione suggerita"
cacheRemoteFiles: "Memorizzazione nella cache dei file remoti" cacheRemoteFiles: "Memorizzazione nella cache dei file remoti"
cacheRemoteFilesDescription: "Disabilitando questa opzione, i file remoti verranno linkati direttamente senza essere memorizzati nella cache. Sarà possibile risparmiare spazio di archiviazione sul server, ma il traffico aumenterà in quanto non verranno generate anteprime."
flagAsBot: "Io sono un robot" flagAsBot: "Io sono un robot"
flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche, attiva quest'opzione. Quando attivata, opera come un segnalatore per gli altri sviluppatori allo scopo di prevenire catene dinterazione senza fine con altri bot, e di adeguare i sistemi interni di Misskey perché trattino questo account come un bot." flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche, attiva quest'opzione. Quando attivata, opera come un segnalatore per gli altri sviluppatori allo scopo di prevenire catene dinterazione senza fine con altri bot, e di adeguare i sistemi interni di Misskey perché trattino questo account come un bot."
flagAsCat: "Io sono un gatto" flagAsCat: "Io sono un gatto"
@ -148,12 +153,14 @@ searchWith: "Cerca: {q}"
youHaveNoLists: "Non hai ancora creato nessuna lista" youHaveNoLists: "Non hai ancora creato nessuna lista"
followConfirm: "Sei sicur@ di voler seguire {name}?" followConfirm: "Sei sicur@ di voler seguire {name}?"
proxyAccount: "Account proxy" proxyAccount: "Account proxy"
proxyAccountDescription: "Un account proxy è un account che funziona da follower remoto per gli utenti sotto certe condizioni. Ad esempio, quando un utente aggiunge un utente remoto alla lista, dato che se nessun utente locale segue quell'utente le sue attività non verranno distribuite, al suo posto lo seguirà un account proxy."
host: "Server remoto" host: "Server remoto"
selectUser: "Seleziona utente" selectUser: "Seleziona utente"
recipient: "Destinatario" recipient: "Destinatario"
annotation: "Descrizione" annotation: "Descrizione"
federation: "Federazione" federation: "Federazione"
instances: "Istanza" instances: "Istanza"
registeredAt: "Registrato presso"
latestRequestSentAt: "Ultima richiesta inviata" latestRequestSentAt: "Ultima richiesta inviata"
latestRequestReceivedAt: "Ultima richiesta ricevuta" latestRequestReceivedAt: "Ultima richiesta ricevuta"
latestStatus: "Ultimo stato" latestStatus: "Ultimo stato"
@ -161,6 +168,7 @@ storageUsage: "Volume di dischi"
charts: "Grafici" charts: "Grafici"
perHour: "All'ora" perHour: "All'ora"
perDay: "al giorno" perDay: "al giorno"
stopActivityDelivery: "Interrompi la distribuzione di attività"
blockThisInstance: "Blocca l'istanza" blockThisInstance: "Blocca l'istanza"
operations: "Operazioni" operations: "Operazioni"
software: "Software" software: "Software"
@ -234,7 +242,6 @@ uploadFromUrlDescription: "URL del file che vuoi caricare"
uploadFromUrlRequested: "Caricamento richiesto" uploadFromUrlRequested: "Caricamento richiesto"
uploadFromUrlMayTakeTime: "Il caricamento del file può richiedere tempo." uploadFromUrlMayTakeTime: "Il caricamento del file può richiedere tempo."
explore: "Esplora" explore: "Esplora"
games: "Misskey Giochi"
messageRead: "Visualizzato" messageRead: "Visualizzato"
noMoreHistory: "Non c'è più cronologia da visualizzare" noMoreHistory: "Non c'è più cronologia da visualizzare"
startMessaging: "Nuovo messaggio" startMessaging: "Nuovo messaggio"
@ -315,11 +322,13 @@ registration: "Iscriviti"
enableRegistration: "Permettere nuove registrazioni" enableRegistration: "Permettere nuove registrazioni"
invite: "Invita" invite: "Invita"
proxyRemoteFiles: "Usare file remoti come proxy" proxyRemoteFiles: "Usare file remoti come proxy"
proxyRemoteFilesDescription: "Attivando questa opzione i file remoti non salvati o cancellati perché eccedenti il limite di archiviazione verranno inoltrati tramite proxy, inclusa la generazione di anteprime. Non ha effetto sullo spazio di archiviazione del server."
driveCapacityPerLocalAccount: "Volume del Drive per utente locale" driveCapacityPerLocalAccount: "Volume del Drive per utente locale"
driveCapacityPerRemoteAccount: "Volume del Drive per utente remoto" driveCapacityPerRemoteAccount: "Volume del Drive per utente remoto"
inMb: "in Megabytes" inMb: "in Megabytes"
iconUrl: "URL di icona (favicon, ecc.)" iconUrl: "URL di icona (favicon, ecc.)"
bannerUrl: "URL dell'immagine d'intestazione" bannerUrl: "URL dell'immagine d'intestazione"
backgroundImageUrl: "URL dello sfondo"
basicInfo: "Informazioni fondamentali" basicInfo: "Informazioni fondamentali"
pinnedUsers: "Utenti in evidenza" pinnedUsers: "Utenti in evidenza"
pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagina \"Esplora\", un@ per riga." pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagina \"Esplora\", un@ per riga."
@ -438,10 +447,12 @@ uiLanguage: "Lingua di visualizzazione dell'interfaccia"
groupInvited: "Invitat@ al gruppo" groupInvited: "Invitat@ al gruppo"
aboutX: "Informazioni su {x}" aboutX: "Informazioni su {x}"
useOsNativeEmojis: "Usare le emoji native del sistema operativo" useOsNativeEmojis: "Usare le emoji native del sistema operativo"
disableDrawer: "Non mostrare il menù sul drawer"
youHaveNoGroups: "Nessun gruppo" youHaveNoGroups: "Nessun gruppo"
joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono." joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono."
noHistory: "Nessuna cronologia" noHistory: "Nessuna cronologia"
signinHistory: "Cronologia di accesso all'account" signinHistory: "Cronologia di accesso all'account"
disableAnimatedMfm: "Disabilità i MFM animati"
doing: "In corso..." doing: "In corso..."
category: "Categoria" category: "Categoria"
tags: "Tag" tags: "Tag"
@ -469,12 +480,17 @@ showFeaturedNotesInTimeline: "Mostrare le note di tendenza nella tua timeline"
objectStorage: "Stoccaggio oggetti" objectStorage: "Stoccaggio oggetti"
useObjectStorage: "Utilizza stoccaggio oggetti" useObjectStorage: "Utilizza stoccaggio oggetti"
objectStorageBaseUrl: "Base URL" objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "URL di riferimento. In caso di utilizzo di proxy o CDN l'URL è 'https://<bucket>.s3.amazonaws.com' per S3, 'https://storage.googleapis.com/<bucket>' per GCS eccetera. "
objectStorageBucket: "Bucket" objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Specificare il nome del bucket utilizzato dal provider."
objectStoragePrefix: "Prefix" objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "I file saranno conservati sotto la directory di questo prefisso." objectStoragePrefixDesc: "I file saranno conservati sotto la directory di questo prefisso."
objectStorageEndpoint: "Endpoint" objectStorageEndpoint: "Endpoint"
objectStorageEndpointDesc: "Lasciare vuoto se si sta utilizzando S3. In caso contrario si prega di specificare l'endpoint come '<host>' oppure '<host>:<port>' a seconda del servizio utilizzato."
objectStorageRegion: "Region" objectStorageRegion: "Region"
objectStorageRegionDesc: "Specificate una regione, quale 'xx-east-1'. Se il servizio in utilizzo non distingue tra regioni, lasciate vuoto o inserite 'us-east-1'."
objectStorageUseSSL: "Usare SSL" objectStorageUseSSL: "Usare SSL"
objectStorageUseSSLDesc: "Disabilita quest'opzione se non utilizzi HTTPS per le connessioni API."
objectStorageUseProxy: "Usa proxy" objectStorageUseProxy: "Usa proxy"
objectStorageUseProxyDesc: "Disabilita quest'opzione se non usi proxy per la connessione API." objectStorageUseProxyDesc: "Disabilita quest'opzione se non usi proxy per la connessione API."
objectStorageSetPublicRead: "Imposta \"visibilità pubblica\" al momento di caricare" objectStorageSetPublicRead: "Imposta \"visibilità pubblica\" al momento di caricare"
@ -504,6 +520,7 @@ sort: "Ordina per"
ascendingOrder: "Ascendente" ascendingOrder: "Ascendente"
descendingOrder: "Discendente" descendingOrder: "Discendente"
scratchpad: "ScratchPad" scratchpad: "ScratchPad"
scratchpadDescription: "Lo Scratchpad offre un ambiente per esperimenti di AiScript. È possibile scrivere, eseguire e confermare i risultati dell'interazione del codice con Misskey."
output: "Uscita" output: "Uscita"
script: "Script" script: "Script"
disablePagesScript: "Disabilita AiScript nelle pagine" disablePagesScript: "Disabilita AiScript nelle pagine"
@ -514,9 +531,11 @@ removeAllFollowing: "Cancella tutti i follows"
removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più." removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, esegui se, ad esempio, l'istanza non esiste più."
userSuspended: "L'utente è sospes@." userSuspended: "L'utente è sospes@."
userSilenced: "L'utente è silenziat@." userSilenced: "L'utente è silenziat@."
yourAccountSuspendedTitle: "Questo account è sospeso."
yourAccountSuspendedDescription: "Questo account è stato sospeso a causa di una violazione dei termini di servizio del server. Contattare l'amministrazione per i dettagli. Si prega di non creare un nuovo account."
menu: "Menù"
divider: "Linea di separazione" divider: "Linea di separazione"
addItem: "Aggiungi elemento" addItem: "Aggiungi elemento"
rooms: "Camera"
relays: "Ripetitori" relays: "Ripetitori"
addRelay: "Aggiungi ripetitore" addRelay: "Aggiungi ripetitore"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
@ -541,6 +560,7 @@ manage: "Gestione"
plugins: "Estensioni" plugins: "Estensioni"
deck: "Deck" deck: "Deck"
undeck: "Esci dal deck" undeck: "Esci dal deck"
useBlurEffectForModal: "Utilizza effetto sfocatura per i modali"
useFullReactionPicker: "Usa la totalità del pannello di reazioni" useFullReactionPicker: "Usa la totalità del pannello di reazioni"
width: "Larghezza" width: "Larghezza"
height: "Altezza" height: "Altezza"
@ -571,6 +591,7 @@ smtpSecure: "Usare la porta SSL/TLS implicito per le connessioni SMTP"
smtpSecureInfo: "Disabilitare quando è attivo STARTTLS." smtpSecureInfo: "Disabilitare quando è attivo STARTTLS."
testEmail: "Testare la consegna di posta elettronica" testEmail: "Testare la consegna di posta elettronica"
wordMute: "Filtri parole" wordMute: "Filtri parole"
instanceMute: "Silenzia l'istanza"
userSaysSomething: "{name} ha detto qualcosa" userSaysSomething: "{name} ha detto qualcosa"
makeActive: "Attiva" makeActive: "Attiva"
display: "Visualizza" display: "Visualizza"
@ -589,13 +610,18 @@ useGlobalSettingDesc: "Se abilitato, le impostazioni notifiche dell'account verr
other: "Avanzate" other: "Avanzate"
regenerateLoginToken: "Genera di nuovo un token di connessione" regenerateLoginToken: "Genera di nuovo un token di connessione"
regenerateLoginTokenDescription: "Genera un nuovo token di autenticazione. Solitamente questa operazione non è necessaria: quando si genera un nuovo token, tutti i dispositivi vanno disconnessi." regenerateLoginTokenDescription: "Genera un nuovo token di autenticazione. Solitamente questa operazione non è necessaria: quando si genera un nuovo token, tutti i dispositivi vanno disconnessi."
setMultipleBySeparatingWithSpace: "È possibile creare multiple voci separate da spazi."
fileIdOrUrl: "ID o URL del file" fileIdOrUrl: "ID o URL del file"
behavior: "Comportamento" behavior: "Comportamento"
sample: "Esempio"
abuseReports: "Segnalazioni" abuseReports: "Segnalazioni"
reportAbuse: "Segnalazioni" reportAbuse: "Segnalazioni"
reportAbuseOf: "Segnala {name}" reportAbuseOf: "Segnala {name}"
fillAbuseReportDescription: "Si prega di spiegare il motivo della segnalazione. Se riguarda una nota precisa, si prega di collegare anche l'URL della nota." fillAbuseReportDescription: "Si prega di spiegare il motivo della segnalazione. Se riguarda una nota precisa, si prega di collegare anche l'URL della nota."
abuseReported: "La segnalazione è stata inviata. Grazie." abuseReported: "La segnalazione è stata inviata. Grazie."
reporter: "il corrispondente"
reporteeOrigin: "Origine del segnalato"
reporterOrigin: "Origine del segnalatore"
send: "Inviare" send: "Inviare"
abuseMarkAsResolved: "Contrassegna la segnalazione come risolta" abuseMarkAsResolved: "Contrassegna la segnalazione come risolta"
openInNewTab: "Apri in una nuova scheda" openInNewTab: "Apri in una nuova scheda"
@ -643,7 +669,6 @@ emailVerified: "Il tuo indirizzo email è stato verificato"
noteFavoritesCount: "Conteggio note tra i preferiti" noteFavoritesCount: "Conteggio note tra i preferiti"
pageLikesCount: "Numero di pagine che ti piacciono" pageLikesCount: "Numero di pagine che ti piacciono"
pageLikedCount: "Numero delle tue pagine che hanno ricevuto \"Mi piace\"" pageLikedCount: "Numero delle tue pagine che hanno ricevuto \"Mi piace\""
reversiCount: "Numero di partite a Reversi"
contact: "Contatti" contact: "Contatti"
useSystemFont: "Usa il carattere predefinito del sistema" useSystemFont: "Usa il carattere predefinito del sistema"
clips: "Clip" clips: "Clip"
@ -657,6 +682,7 @@ left: "Sinistra"
center: "Centro" center: "Centro"
wide: "Largo" wide: "Largo"
reloadToApplySetting: "Le tue preferenze verranno impostate dopo il ricaricamento della pagina. Vuoi ricaricare adesso?" reloadToApplySetting: "Le tue preferenze verranno impostate dopo il ricaricamento della pagina. Vuoi ricaricare adesso?"
needReloadToApply: "È necessario riavviare per rendere effettive le modifiche."
showTitlebar: "Visualizza la barra del titolo" showTitlebar: "Visualizza la barra del titolo"
clearCache: "Svuota cache" clearCache: "Svuota cache"
onlineUsersCount: "{n} utenti online" onlineUsersCount: "{n} utenti online"
@ -739,13 +765,65 @@ middle: "Media"
low: "Bassa" low: "Bassa"
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail." emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
ratio: "Rapporto" ratio: "Rapporto"
previewNoteText: "Anteprima del testo"
customCss: "CSS personalizzato"
global: "Federata" global: "Federata"
squareAvatars: "Mostra l'immagine del profilo come quadrato"
sent: "Inviare" sent: "Inviare"
searchResult: "Risultati della Ricerca"
hashtags: "Hashtag" hashtags: "Hashtag"
troubleshooting: "Risoluzione problemi" troubleshooting: "Risoluzione problemi"
useBlurEffect: "Utilizza effetto sfocatura per l'interfaccia utente"
learnMore: "Più dettagli"
misskeyUpdated: "Misskey è stato aggiornato!"
whatIsNew: "Visualizza le informazioni sull'aggiornamento"
translate: "Traduzione"
translatedFrom: "Tradotto da {x}"
accountDeletionInProgress: "La cancellazione dell'account è in corso"
usernameInfo: "Un nome per identificare univocamente il tuo account sul server. È possibile utilizzare caratteri alfanumerici (a~z, A~Z, 0~9) e il trattino basso (_). Non sarà possibile cambiare il nome utente in seguito."
aiChanMode: "Modalità Ai"
keepCw: "Mantieni il CW"
resolved: "Risolto"
unresolved: "Non risolto"
breakFollow: "Smetti di seguire"
itsOn: "Abilitato"
itsOff: "Disabilitato"
emailRequiredForSignup: "È necessario un indirizzo mail per registrare un account"
unread: "Non letto"
filter: "Filtri"
controlPanel: "Pannello di controllo"
manageAccounts: "Gestisci account"
classic: "Classico"
muteThread: "Silenzia la discussione"
unmuteThread: "Riattiva la discussione"
deleteAccountConfirm: "L'account verrà cancellato. Procedere?"
incorrectPassword: "La password è errata."
voteConfirm: "Votare per「{choice}」?"
hide: "Nascondere" hide: "Nascondere"
leaveGroup: "Esci dal gruppo"
leaveGroupConfirm: "Uscire da「{name}」?"
useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile"
welcomeBackWithName: "Bentornato/a, {name}"
clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo email."
_emailUnavailable:
used: "Email già in uso"
format: "Formato email non valido"
disposable: "Email non riutilizzabile"
mx: "Server email non corretto"
smtp: "Il server email non risponde"
_ffVisibility: _ffVisibility:
public: "Pubblico" public: "Pubblico"
followers: "Mostra solo ai follower"
private: "Invisibile"
_signup:
almostThere: "Quasi completo"
emailAddressInfo: "Inserisci il tuo indirizzo email. Non verrà reso pubblico."
_accountDelete:
accountDelete: "Cancellazione account"
sendEmail: "Al termine della cancellazione dell'account, verrà inviata una mail all'indirizzo a cui era registrato."
requestAccountDelete: "Richiesta di cancellazione account"
started: "Il processo di cancellazione è iniziato."
inProgress: "Cancellazione in corso"
_ad: _ad:
back: "Indietro" back: "Indietro"
reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso" reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso"
@ -801,19 +879,27 @@ _mfm:
quote: "Cita il nota" quote: "Cita il nota"
emoji: "Emoji personalizzati" emoji: "Emoji personalizzati"
search: "Cerca" search: "Cerca"
flip: "Inverti"
jump: "Animazione(salto)"
jumpDescription: "Da un animazione che salta su e giù."
bounce: "Animazione(rimbalzo)"
bounceDescription: "Rende il testo rimbalzante"
shake: "rimbalzante"
shakeDescription: "Rende il testo traballante"
twitch: "testo"
twitchDescription: "Fa tremare il testo"
x2: "Più grande"
x2Description: "Mostra il contenuto ingrandito."
x3: "Molto più grande"
x3Description: "Mostra il contenuto molto più ingrandito."
x4: "Estremamente più grande"
x4Description: "Mostra il contenuto estremamente più ingrandito."
blur: "Sfocatura" blur: "Sfocatura"
blurDescription: "È possibile rendere sfocato il contenuto. Spostando il cursore su di esso tornerà visibile chiaramente."
font: "Tipo di carattere" font: "Tipo di carattere"
fontDescription: "Puoi scegliere il tipo di carattere per il contenuto." fontDescription: "Puoi scegliere il tipo di carattere per il contenuto."
rainbow: "Arcobaleno" rainbow: "Arcobaleno"
rotate: "Ruota" rotate: "Ruota"
_reversi:
reversi: "Reversi"
gameSettings: "Impostazioni di gioco"
botSettings: "Opzioni del bot"
black: "Nero"
white: "Bianco"
total: "Totale"
ended: "Esci"
_instanceTicker: _instanceTicker:
none: "Nascondi" none: "Nascondi"
remote: "Mostra solo per gli/le utenti remotə" remote: "Mostra solo per gli/le utenti remotə"
@ -865,6 +951,7 @@ _theme:
func: "Funzione" func: "Funzione"
funcKind: "Tipo di funzione" funcKind: "Tipo di funzione"
argument: "Argomento" argument: "Argomento"
alpha: "Opacità"
darken: "Scuro" darken: "Scuro"
lighten: "Chiaro" lighten: "Chiaro"
inputConstantName: "Inserisci un nome per la costante" inputConstantName: "Inserisci un nome per la costante"
@ -902,6 +989,7 @@ _theme:
inputBorder: "Inquadra casella di testo" inputBorder: "Inquadra casella di testo"
listItemHoverBg: "Sfondo della voce di elenco (sorvolato)" listItemHoverBg: "Sfondo della voce di elenco (sorvolato)"
driveFolderBg: "Sfondo della cartella di disco" driveFolderBg: "Sfondo della cartella di disco"
badge: "Distintivo"
messageBg: "Sfondo della chat" messageBg: "Sfondo della chat"
_sfx: _sfx:
note: "Nota" note: "Nota"
@ -1119,68 +1207,6 @@ _timelines:
local: "Locale" local: "Locale"
social: "Sociale" social: "Sociale"
global: "Federata" global: "Federata"
_rooms:
roomOf: "Camera di {user}"
addFurniture: "Disponi mobilia"
translate: "Sposta"
rotate: "Ruota"
exit: "Indietro"
remove: "Togli"
clear: "Rimuovi tutto"
clearConfirm: "Sei sicur@ di voler rimuovere tutti i mobili dalla tua camera?"
leaveConfirm: "Hai fatto modifiche ancora non salvate. Vuoi davvero uscire?"
chooseImage: "Seleziona immagine"
roomType: "Tipo di stanza"
carpetColor: "Colore del suolo"
_roomType:
default: "Predefinito"
washitsu: "Washitsu"
_furnitures:
milk: "Cartone del latte"
bed: "Letto"
low-table: "Tavolino"
desk: "Tavolo"
chair: "Sedia"
chair2: "Sedia 2"
fan: "Ventilatore"
pc: "Computer"
plant: "Pianta da appartamento"
plant2: "Pianta da appartamento2"
eraser: "Gomma"
pencil: "Matita"
pudding: "Pudding"
cardboard-box: "Scatola di cartone"
cardboard-box2: "Scatola di cartone 2"
cardboard-box3: "Scatola di cartone 3"
book: "Libro"
book2: "Libro2"
piano: "Pianoforte"
facial-tissue: "Scatola di fazzolettini"
server: "Server"
moon: "Luna"
corkboard: "Bacheca"
mousepad: "Tappetino per il mouse"
monitor: "Monitor "
keyboard: "Tastiera"
carpet-stripe: "Tappeto (a strisce)"
mat: "Zerbino"
color-box: "Libreria"
wall-clock: "Orologio da parete"
photoframe: "Cornice"
cube: "Cubo"
tv: "TV"
pinguin: "Pinguino"
rubik-cube: "Cubo di Rubik"
poster-h: "Poster (orizzontale)"
poster-v: "Poster (verticale)"
sofa: "Divano"
spiral: "Scale a chiocciola"
bin: "Cestino"
cup-noodle: "Noodle istantanei"
holo-display: "Visualizzazione olografica"
energy-drink: "Bevanda energetica"
doll-ai: "Bambola Ai"
banknote: "Mazzetta di banconote"
_pages: _pages:
newPage: "Crea pagina" newPage: "Crea pagina"
editPage: "Modifica pagina" editPage: "Modifica pagina"
@ -1378,6 +1404,10 @@ _pages:
string: "Testo" string: "Testo"
array: "Liste" array: "Liste"
stringArray: "Lista di testo" stringArray: "Lista di testo"
_relayStatus:
requesting: "In attesa di approvazione"
accepted: "Approvato"
rejected: "Respinto"
_notification: _notification:
fileUploaded: "File caricato correttamente" fileUploaded: "File caricato correttamente"
youGotMention: "{name} ti ha menzionato" youGotMention: "{name} ti ha menzionato"

View File

@ -239,7 +239,6 @@ uploadFromUrlDescription: "このURLのファイルをアップロードした
uploadFromUrlRequested: "アップロードしたい言うといたで" uploadFromUrlRequested: "アップロードしたい言うといたで"
uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。" uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。"
explore: "みつける" explore: "みつける"
games: "Misskey Games"
messageRead: "もう読んだ" messageRead: "もう読んだ"
noMoreHistory: "これより過去の履歴はあらへんで" noMoreHistory: "これより過去の履歴はあらへんで"
startMessaging: "チャットやるで" startMessaging: "チャットやるで"
@ -515,7 +514,6 @@ removeAllFollowingDescription: "{host}からのフォローをすべて解除す
userSuspended: "このユーザーは...凍結されとる。" userSuspended: "このユーザーは...凍結されとる。"
userSilenced: "このユーザーは...サイレンスされとる。" userSilenced: "このユーザーは...サイレンスされとる。"
divider: "分割線" divider: "分割線"
rooms: "ルーム"
relays: "リレー" relays: "リレー"
addRelay: "リレーの追加" addRelay: "リレーの追加"
inboxUrl: "inboxのURL" inboxUrl: "inboxのURL"
@ -701,29 +699,6 @@ _mfm:
blur: "ぼかし" blur: "ぼかし"
font: "フォント" font: "フォント"
rotate: "回転" rotate: "回転"
_reversi:
reversi: "リバーシ"
gameSettings: "対局の設定"
chooseBoard: "ボードを選択"
blackOrWhite: "先行/後攻"
blackIs: "{name}が黒(先行)"
rules: "ルール"
botSettings: "Botのオプション"
pastTurnOf: "{name}のターン"
surrender: "投了"
surrendered: "投了により"
drawn: "引き分け"
won: "{name}の勝ち"
black: "黒"
white: "白"
total: "合計"
turnCount: "{count}ターン目"
myGames: "自分の対局"
allGames: "みんなの対局"
ended: "終了"
playing: "対局中"
isLlotheo: "石の少ない方が勝ち(ロセオ)"
loopedMap: "ループマップ"
_instanceTicker: _instanceTicker:
none: "表示せん" none: "表示せん"
remote: "リモートユーザーに表示" remote: "リモートユーザーに表示"
@ -936,68 +911,6 @@ _timelines:
local: "ローカル" local: "ローカル"
social: "ソーシャル" social: "ソーシャル"
global: "グローバル" global: "グローバル"
_rooms:
roomOf: "{user}のルーム"
addFurniture: "家具を置く"
translate: "移動"
rotate: "回転"
exit: "戻る"
remove: "しまう"
clear: "片付け"
clearConfirm: "家具ぜんぶしまうけど、ホンマにええん?"
leaveConfirm: "未保存の変更があるけど、移動してええか?"
chooseImage: "画像を選ぶ"
roomType: "部屋のタイプ"
carpetColor: "床の色"
_roomType:
default: "デフォルト"
washitsu: "和室"
_furnitures:
milk: "牛乳パック"
bed: "ベッド"
low-table: "ローテーブル"
desk: "デスク"
chair: "チェア"
chair2: "チェア2"
fan: "換気扇"
pc: "パソコン"
plant: "観葉植物"
plant2: "観葉植物2"
eraser: "消しゴム"
pencil: "鉛筆"
pudding: "プリン"
cardboard-box: "段ボール箱"
cardboard-box2: "段ボール箱2"
cardboard-box3: "段ボール箱3"
book: "本"
book2: "本2"
piano: "ピアノ"
facial-tissue: "ティッシュボックス"
server: "サーバー"
moon: "月"
corkboard: "コルクボード"
mousepad: "マウスパッド"
monitor: "モニター"
keyboard: "キーボード"
carpet-stripe: "カーペット(縞)"
mat: "マット"
color-box: "カラーボックス"
wall-clock: "壁掛け時計"
photoframe: "額縁"
cube: "キューブ"
tv: "テレビ"
pinguin: "ピンギン"
rubik-cube: "ルービックキューブ"
poster-h: "ルービックキューブ"
poster-v: "ポスター(縦長)"
sofa: "ソファ"
spiral: "螺旋階段"
bin: "ゴミ箱"
cup-noodle: "カップ麺"
holo-display: "ホログラフィックディスプレイ"
energy-drink: "エナジードリンク"
doll-ai: "藍ちゃん人形"
banknote: "札束"
_pages: _pages:
newPage: "ページを作る" newPage: "ページを作る"
editPage: "ページの編集" editPage: "ページの編集"

View File

@ -241,7 +241,6 @@ uploadFromUrlDescription: "업로드하려는 파일의 URL"
uploadFromUrlRequested: "업로드를 요청했습니다" uploadFromUrlRequested: "업로드를 요청했습니다"
uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될 수 있습니다." uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될 수 있습니다."
explore: "발견하기" explore: "발견하기"
games: "Misskey Games"
messageRead: "읽음" messageRead: "읽음"
noMoreHistory: "이것보다 과거의 기록이 없습니다" noMoreHistory: "이것보다 과거의 기록이 없습니다"
startMessaging: "대화 시작하기" startMessaging: "대화 시작하기"
@ -535,7 +534,6 @@ yourAccountSuspendedDescription: "이 계정은 서버의 이용 약관을 위
menu: "메뉴" menu: "메뉴"
divider: "구분선" divider: "구분선"
addItem: "항목 추가" addItem: "항목 추가"
rooms: "방"
relays: "릴레이" relays: "릴레이"
addRelay: "릴레이 추가" addRelay: "릴레이 추가"
inboxUrl: "Inbox 주소" inboxUrl: "Inbox 주소"
@ -668,7 +666,6 @@ emailVerified: "메일 주소가 확인되었습니다."
noteFavoritesCount: "즐겨찾기한 노트 수" noteFavoritesCount: "즐겨찾기한 노트 수"
pageLikesCount: "좋아요 한 Page 수" pageLikesCount: "좋아요 한 Page 수"
pageLikedCount: "Page에 받은 좋아요 수" pageLikedCount: "Page에 받은 좋아요 수"
reversiCount: "리버시 대국 횟수"
contact: "연락처" contact: "연락처"
useSystemFont: "시스템 기본 글꼴을 사용" useSystemFont: "시스템 기본 글꼴을 사용"
clips: "클립" clips: "클립"
@ -936,39 +933,6 @@ _mfm:
sparkleDescription: "반짝이는 파티클 효과를 추가합니다." sparkleDescription: "반짝이는 파티클 효과를 추가합니다."
rotate: "회전" rotate: "회전"
rotateDescription: "지정한 각도로 회전시킵니다." rotateDescription: "지정한 각도로 회전시킵니다."
_reversi:
reversi: "리버시"
gameSettings: "대국 설정"
chooseBoard: "보드 선택"
blackOrWhite: "선공/후공"
blackIs: "{name}님이 흑(선공)"
rules: "규칙"
botSettings: "Bot 설정"
thisGameIsStartedSoon: "잠시 후에 대국이 시작됩니다"
waitingForOther: "상대의 준비가 완료될 때까지 기다리고 있습니다"
waitingForMe: "당신의 준비 완료를 기다리고 있습니다"
waitingBoth: "준비해 주세요"
ready: "준비 완료"
cancelReady: "준비 취소"
opponentTurn: "상대의 차례입니다"
myTurn: "당신의 차례입니다"
turnOf: "{name}님의 차례입니다"
pastTurnOf: "{name}님의 차례"
surrender: "기권"
surrendered: "기권에 의해"
drawn: "무승부"
won: "{name}님의 승리"
black: "흑"
white: "백"
total: "합계"
turnCount: "{count}턴 째"
myGames: "내 대국"
allGames: "모두의 대국"
ended: "종료"
playing: "지금 대국 중"
isLlotheo: "돌이 적은 사람이 승리 (llotheo)"
loopedMap: "루프 지도"
canPutEverywhere: "어디에나 놓을 수 있음"
_instanceTicker: _instanceTicker:
none: "보이지 않음" none: "보이지 않음"
remote: "리모트 유저에게만 보이기" remote: "리모트 유저에게만 보이기"
@ -1088,8 +1052,6 @@ _sfx:
chatBg: "대화 (백그라운드)" chatBg: "대화 (백그라운드)"
antenna: "안테나 수신" antenna: "안테나 수신"
channel: "채널 알림" channel: "채널 알림"
reversiPutBlack: "리버시: 흑돌을 두었을 때"
reversiPutWhite: "리버시: 백돌을 두었을 때"
_ago: _ago:
unknown: "알 수 없음" unknown: "알 수 없음"
future: "미래" future: "미래"
@ -1312,68 +1274,6 @@ _timelines:
local: "로컬" local: "로컬"
social: "소셜" social: "소셜"
global: "글로벌" global: "글로벌"
_rooms:
roomOf: "{user}의 방"
addFurniture: "가구를 배치"
translate: "이동"
rotate: "회전"
exit: "뒤로"
remove: "치우기"
clear: "모두 치우기"
clearConfirm: "정말 방 안의 모든 가구를 치우시겠습니까?"
leaveConfirm: "저장되지 않은 변경 사항이 있습니다. 정말 나가시겠습니까?"
chooseImage: "이미지 선택"
roomType: "방 스타일"
carpetColor: "바닥 색상"
_roomType:
default: "기본값"
washitsu: "일본식"
_furnitures:
milk: "우유 팩"
bed: "침대"
low-table: "낮은 테이블"
desk: "책상"
chair: "의자"
chair2: "의자 2"
fan: "환기구"
pc: "컴퓨터"
plant: "관엽식물"
plant2: "관엽식물 2"
eraser: "지우개"
pencil: "연필"
pudding: "푸딩"
cardboard-box: "골판지 상자"
cardboard-box2: "골판지 상자 2"
cardboard-box3: "골판지 상자 3"
book: "책"
book2: "책 2"
piano: "피아노"
facial-tissue: "휴지 상자"
server: "서버"
moon: "달"
corkboard: "게시판"
mousepad: "마우스 패드"
monitor: "모니터"
keyboard: "키보드"
carpet-stripe: "카페트 (줄무늬)"
mat: "매트"
color-box: "책장"
wall-clock: "벽걸이 시계"
photoframe: "액자"
cube: "큐브"
tv: "TV"
pinguin: "펭귄"
rubik-cube: "루빅스 큐브"
poster-h: "포스터 (가로)"
poster-v: "포스터 (세로)"
sofa: "소파"
spiral: "나선형 계단"
bin: "휴지통"
cup-noodle: "컵라면"
holo-display: "홀로그램"
energy-drink: "에너지 드링크"
doll-ai: "아이쨩 인형"
banknote: "지폐뭉치"
_pages: _pages:
newPage: "페이지 만들기" newPage: "페이지 만들기"
editPage: "페이지 수정" editPage: "페이지 수정"

View File

@ -212,7 +212,6 @@ uploadFromUrlDescription: "URL van het bestand dat je wil uploaden"
uploadFromUrlRequested: "Uploadverzoek" uploadFromUrlRequested: "Uploadverzoek"
uploadFromUrlMayTakeTime: "Het kan even duren voordat het uploaden voltooid is." uploadFromUrlMayTakeTime: "Het kan even duren voordat het uploaden voltooid is."
explore: "Verkennen" explore: "Verkennen"
games: "Misskey spellen"
messageRead: "Lezen" messageRead: "Lezen"
noMoreHistory: "Er is geen verdere geschiedenis" noMoreHistory: "Er is geen verdere geschiedenis"
startMessaging: "Start een gesprek" startMessaging: "Start een gesprek"
@ -294,11 +293,6 @@ _exportOrImport:
excludeInactiveUsers: "Negeer inactieve gebruikers" excludeInactiveUsers: "Negeer inactieve gebruikers"
_timelines: _timelines:
home: "Startpagina" home: "Startpagina"
_rooms:
_roomType:
default: "Standaard"
_furnitures:
monitor: "Monitor"
_pages: _pages:
blocks: blocks:
image: "Afbeeldingen" image: "Afbeeldingen"

View File

@ -241,7 +241,6 @@ uploadFromUrlDescription: "Adres URL pliku, który chcesz wysłać"
uploadFromUrlRequested: "Zażądano wysłania" uploadFromUrlRequested: "Zażądano wysłania"
uploadFromUrlMayTakeTime: "Wysyłanie może chwilę potrwać." uploadFromUrlMayTakeTime: "Wysyłanie może chwilę potrwać."
explore: "Eksploruj" explore: "Eksploruj"
games: "Gry Misskey"
messageRead: "Przeczytano" messageRead: "Przeczytano"
noMoreHistory: "Nie ma dalszej historii" noMoreHistory: "Nie ma dalszej historii"
startMessaging: "Rozpocznij czat" startMessaging: "Rozpocznij czat"
@ -528,7 +527,6 @@ userSuspended: "To konto zostało zawieszone."
userSilenced: "Ten użytkownik został wyciszony." userSilenced: "Ten użytkownik został wyciszony."
divider: "Rozdzielacz" divider: "Rozdzielacz"
addItem: "Dodaj element" addItem: "Dodaj element"
rooms: "Pokój"
relays: "Przekaźniki" relays: "Przekaźniki"
addRelay: "Dodaj przekaźnik" addRelay: "Dodaj przekaźnik"
inboxUrl: "Adres URL skrzynki nadawczej" inboxUrl: "Adres URL skrzynki nadawczej"
@ -656,7 +654,6 @@ emailVerified: "Adres e-mail został potwierdzony"
noteFavoritesCount: "Liczba polubionych wpisów" noteFavoritesCount: "Liczba polubionych wpisów"
pageLikesCount: "Liczba otrzymanych polubień stron" pageLikesCount: "Liczba otrzymanych polubień stron"
pageLikedCount: "Liczba polubionych stron" pageLikedCount: "Liczba polubionych stron"
reversiCount: "Liczba rozgrywek Reversi"
contact: "Kontakt" contact: "Kontakt"
useSystemFont: "Używaj domyślnej czcionki systemu" useSystemFont: "Używaj domyślnej czcionki systemu"
experimentalFeatures: "Eksperymentalne funkcje" experimentalFeatures: "Eksperymentalne funkcje"
@ -842,36 +839,6 @@ _mfm:
font: "Czcionka" font: "Czcionka"
fontDescription: "Wybiera czcionkę do wyświetlania treści." fontDescription: "Wybiera czcionkę do wyświetlania treści."
rotate: "Obróć" rotate: "Obróć"
_reversi:
reversi: "Reversi"
gameSettings: "Ustawienia gry"
chooseBoard: "Wybierz tablicę"
blackOrWhite: "Czarne/białe"
blackIs: "{name} gra czarnymi"
rules: "Zasady"
botSettings: "Opcje bota"
thisGameIsStartedSoon: "Gra rozpocznie się za kilka sekund"
waitingForOther: "Oczekiwanie na ruch przeciwnika"
waitingForMe: "Oczekiwanie na Twój ruch"
waitingBoth: "Przygotuj się"
ready: "Gotowy(-a)"
cancelReady: "Anuluj gotowość"
opponentTurn: "Kolej przeciwnika"
myTurn: "Twoja kolej"
turnOf: "Kolej {name}"
pastTurnOf: "Kolej {name}"
surrender: "Poddaj się"
surrendered: "Przez poddanie się"
drawn: "Remis"
won: "{name} wygrał(a)"
black: "Czarny"
white: "Biały"
total: "Łącznie"
turnCount: "Ruch {count}"
myGames: "Moje gry"
allGames: "Wszystkie gry"
ended: "Zakończono"
playing: "W trakcie gry"
_instanceTicker: _instanceTicker:
none: "Nigdy nie pokazuj" none: "Nigdy nie pokazuj"
remote: "Pokaż dla zdalnych użytkowników" remote: "Pokaż dla zdalnych użytkowników"
@ -979,8 +946,6 @@ _sfx:
chat: "Wiadomości" chat: "Wiadomości"
chatBg: "Rozmowy (tło)" chatBg: "Rozmowy (tło)"
channel: "Powiadomienia kanału" channel: "Powiadomienia kanału"
reversiPutBlack: "Reversi: Czarny wykonuje ruch"
reversiPutWhite: "Reversi: Biały wykonuje ruch"
_ago: _ago:
unknown: "Nieznane" unknown: "Nieznane"
future: "W przyszłości" future: "W przyszłości"
@ -1136,65 +1101,6 @@ _timelines:
local: "Lokalne" local: "Lokalne"
social: "Społeczność" social: "Społeczność"
global: "Globalna" global: "Globalna"
_rooms:
roomOf: "Pokój {user}"
addFurniture: "Umieść meble"
translate: "Przenieś"
rotate: "Obróć"
exit: "Wróć"
remove: "Usuń"
clear: "Usuń wszystkie"
clearConfirm: "Czy na pewno chcesz usunąć wszystkie meble ze swojego pokoju?"
leaveConfirm: "Masz niezapisane zmiany. Czy na pewno chcesz wyjść?"
chooseImage: "Wybierz obraz"
roomType: "Typ pokoju"
carpetColor: "Kolor dywanu"
_roomType:
default: "Domyślne"
washitsu: "W japońskim stylu"
_furnitures:
milk: "Karton mleka"
bed: "Łóżko"
low-table: "Niski stolik"
desk: "Biurko"
chair: "Krzesło"
chair2: "Krzesło 2"
fan: "Chłodzenie"
pc: "Komputer"
plant: "Roślina domowa"
plant2: "Roślina domowa 2"
eraser: "Gumka"
pencil: "Ołówek"
pudding: "Budyń"
cardboard-box: "Pudło tekturowe"
cardboard-box2: "Pudło tekturowe 2"
cardboard-box3: "Pudło tekturowe 3"
book: "Książka"
book2: "Książka 2"
piano: "Fortepian"
server: "Serwery"
moon: "Księżyc"
corkboard: "Tablica korkowa"
mousepad: "Podkładka pod mysz"
monitor: "Monitor"
keyboard: "Klawiatura"
carpet-stripe: "Dywan (w paski)"
color-box: "Biblioteczka"
wall-clock: "Zegar ścienny"
photoframe: "Ramka do zdjęć"
cube: "Kostka"
tv: "Telewizor"
pinguin: "Pingwin"
rubik-cube: "Kostka Rubika"
poster-h: "Plakat (poziomy)"
poster-v: "Plakat (pionowy)"
sofa: "Kanapa"
spiral: "Schody spiralne"
bin: "Kosz"
holo-display: "Wyświetlacz holograficzny"
energy-drink: "Napój energetyczny"
doll-ai: "Lalka AI"
banknote: "Banknot"
_pages: _pages:
newPage: "Utwórz stronę" newPage: "Utwórz stronę"
editPage: "Edytuj tę stronę" editPage: "Edytuj tę stronę"

View File

@ -106,6 +106,7 @@ clickToShow: "Нажмите для просмотра"
sensitive: "Содержимое не для всех" sensitive: "Содержимое не для всех"
add: "Добавить" add: "Добавить"
reaction: "Реакции" reaction: "Реакции"
reactionSetting: "Реакции, отображаемые в палитре"
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»." reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
rememberNoteVisibility: "Запоминать видимость заметок" rememberNoteVisibility: "Запоминать видимость заметок"
attachCancel: "Удалить вложение" attachCancel: "Удалить вложение"
@ -127,7 +128,7 @@ selectAntenna: "Выберите антенну"
selectWidget: "Выберите виджет" selectWidget: "Выберите виджет"
editWidgets: "Редактировать виджеты" editWidgets: "Редактировать виджеты"
editWidgetsExit: "Готово" editWidgetsExit: "Готово"
customEmojis: "Эмодзи пользователя" customEmojis: "Собственные эмодзи"
emoji: "Эмодзи" emoji: "Эмодзи"
emojis: "Эмодзи" emojis: "Эмодзи"
emojiName: "Название эмодзи" emojiName: "Название эмодзи"
@ -200,7 +201,7 @@ done: "Готово"
processing: "Обработка" processing: "Обработка"
preview: "Предпросмотр" preview: "Предпросмотр"
default: "По умолчанию" default: "По умолчанию"
noCustomEmojis: "Эмодзи пользователя отсутствуют" noCustomEmojis: "Собственные эмодзи отсутствуют"
noJobs: "Нет заданий" noJobs: "Нет заданий"
federating: "Федерируется" federating: "Федерируется"
blocked: "Заблокировано" blocked: "Заблокировано"
@ -241,7 +242,6 @@ uploadFromUrlDescription: "Ссылка на файл, который хотит
uploadFromUrlRequested: "Загрузка выбранного" uploadFromUrlRequested: "Загрузка выбранного"
uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время." uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время."
explore: "Обзор" explore: "Обзор"
games: "Игры Misskey"
messageRead: "Прочитали" messageRead: "Прочитали"
noMoreHistory: "История закончилась" noMoreHistory: "История закончилась"
startMessaging: "Начать общение" startMessaging: "Начать общение"
@ -447,6 +447,7 @@ uiLanguage: "Язык интерфейса"
groupInvited: "Приглашение в группу" groupInvited: "Приглашение в группу"
aboutX: "Описание {x}" aboutX: "Описание {x}"
useOsNativeEmojis: "Использовать эмодзи операционной системы" useOsNativeEmojis: "Использовать эмодзи операционной системы"
disableDrawer: "Не использовать выдвижные меню"
youHaveNoGroups: "У вас нет ни одной группы" youHaveNoGroups: "У вас нет ни одной группы"
joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные" joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные"
noHistory: "История пока пуста" noHistory: "История пока пуста"
@ -535,7 +536,6 @@ yourAccountSuspendedDescription: "Эта учетная запись была з
menu: "Меню" menu: "Меню"
divider: "Линия-разделитель" divider: "Линия-разделитель"
addItem: "Добавить элемент" addItem: "Добавить элемент"
rooms: "Комната"
relays: "Ретрансляторы" relays: "Ретрансляторы"
addRelay: "Добавить ретранслятор" addRelay: "Добавить ретранслятор"
inboxUrl: "URL ящика входящих сообщений" inboxUrl: "URL ящика входящих сообщений"
@ -591,6 +591,7 @@ smtpSecure: "Использовать SSL/TLS для SMTP-соединений"
smtpSecureInfo: "Выключите при использовании STARTTLS." smtpSecureInfo: "Выключите при использовании STARTTLS."
testEmail: "Проверка доставки электронной почты" testEmail: "Проверка доставки электронной почты"
wordMute: "Скрытие слов" wordMute: "Скрытие слов"
instanceMute: "Глушение инстансов"
userSaysSomething: "{name} что-то сообщает" userSaysSomething: "{name} что-то сообщает"
makeActive: "Активировать" makeActive: "Активировать"
display: "Отображение" display: "Отображение"
@ -618,8 +619,8 @@ reportAbuse: "Жалоба"
reportAbuseOf: "Пожаловаться на пользователя {name}" reportAbuseOf: "Пожаловаться на пользователя {name}"
fillAbuseReportDescription: "Опишите, пожалуйста, причину жалобы подробнее. Если речь о конкретной заметке, будьте добры приложить ссылку на неё." fillAbuseReportDescription: "Опишите, пожалуйста, причину жалобы подробнее. Если речь о конкретной заметке, будьте добры приложить ссылку на неё."
abuseReported: "Жалоба отправлена. Большое спасибо за информацию." abuseReported: "Жалоба отправлена. Большое спасибо за информацию."
reporteeOrigin: "Куда сообщать" reporteeOrigin: "О ком сообщено"
reporterOrigin: "Сообщено" reporterOrigin: "Кто сообщил"
send: "Отправить" send: "Отправить"
abuseMarkAsResolved: "Отметить жалобу как решённую" abuseMarkAsResolved: "Отметить жалобу как решённую"
openInNewTab: "Открыть в новой вкладке" openInNewTab: "Открыть в новой вкладке"
@ -667,7 +668,6 @@ emailVerified: "Адрес электронной почты подтвержд
noteFavoritesCount: "Количество добавленного в избранное" noteFavoritesCount: "Количество добавленного в избранное"
pageLikesCount: "Количество понравившихся страниц" pageLikesCount: "Количество понравившихся страниц"
pageLikedCount: "Количество страниц, понравившихся другим" pageLikedCount: "Количество страниц, понравившихся другим"
reversiCount: "Количество сыгранных игр в реверси"
contact: "Как связаться" contact: "Как связаться"
useSystemFont: "Использовать шрифт, предлагаемый системой" useSystemFont: "Использовать шрифт, предлагаемый системой"
clips: "Подборки" clips: "Подборки"
@ -682,7 +682,7 @@ center: "По центру"
wide: "Толстый" wide: "Толстый"
narrow: "Тонкий" narrow: "Тонкий"
reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?" reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить сейчас?"
needReloadToApply: "Чтобы это вступило в силу, требуется перезагрузка." needReloadToApply: "Изменения вступят в силу после перезагрузки страницы."
showTitlebar: "Показать заголовок" showTitlebar: "Показать заголовок"
clearCache: "Очистить кэш" clearCache: "Очистить кэш"
onlineUsersCount: "Пользователей сейчас в сети: {n}" onlineUsersCount: "Пользователей сейчас в сети: {n}"
@ -767,7 +767,7 @@ middle: "Средне"
low: "Низкий" low: "Низкий"
emailNotConfiguredWarning: "Не указан адрес электронной почты" emailNotConfiguredWarning: "Не указан адрес электронной почты"
ratio: "Соотношение" ratio: "Соотношение"
previewNoteText: "Предварительный просмотр текста" previewNoteText: "Предварительный просмотр"
customCss: "Индивидуальный CSS" customCss: "Индивидуальный CSS"
customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас." customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
global: "Всеобщая" global: "Всеобщая"
@ -782,16 +782,19 @@ learnMore: "Подробнее"
misskeyUpdated: "Misskey обновился!" misskeyUpdated: "Misskey обновился!"
whatIsNew: "Что новенького?" whatIsNew: "Что новенького?"
translate: "Перевод" translate: "Перевод"
translatedFrom: "{x}Перевод с английского" translatedFrom: "Перевод. Язык оригинала — {x}"
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи" accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи"
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже." usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере. Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания (_). Имена пользователей не могут быть изменены позже."
aiChanMode: "ИИ режим" aiChanMode: "ИИ режим"
keepCw: "Сохраняйте Предупреждения о содержимом" keepCw: "Сохраняйте Предупреждения о содержимом"
pubSub: "Учётные записи Pub/Sub"
lastCommunication: "Последнее сообщение" lastCommunication: "Последнее сообщение"
resolved: "Решен" resolved: "Решено"
unresolved: "Неразрешенные" unresolved: "Без решения"
itsOff: "Он выключен!" breakFollow: "Отписка"
emailRequiredForSignup: "Требуется адрес электронной почты для регистрации аккаунта" itsOn: "Включено"
itsOff: "Выключено"
emailRequiredForSignup: "Для регистрации учётной записи нужен адрес электронной почты"
unread: "Непрочитанное" unread: "Непрочитанное"
filter: "Фильтры" filter: "Фильтры"
controlPanel: "Панель управления" controlPanel: "Панель управления"
@ -799,30 +802,38 @@ manageAccounts: "Управление аккаунтом"
makeReactionsPublic: "Опубликовать список реакций" makeReactionsPublic: "Опубликовать список реакций"
makeReactionsPublicDescription: "Список сделанных вами реакций доступен для просмотра всем желающим." makeReactionsPublicDescription: "Список сделанных вами реакций доступен для просмотра всем желающим."
classic: "Классика" classic: "Классика"
unmuteThread: "Отключить звук" muteThread: "Заглушить цепочку"
ffVisibilityDescription: "Вы можете установить объем вашей следующей/последней информации." unmuteThread: "Отменить глушение цепочки"
voteConfirm: "Вы бы проголосовали за \"{choice}\"?" ffVisibility: "Видимость подписок и подписчиков"
ffVisibilityDescription: "Здесь можно настроить, кто будет видеть ваши подписки и подписчиков."
continueThread: "Показать следующие ответы"
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
incorrectPassword: "Пароль неверен."
voteConfirm: "Отдать голос за «{choice}»?"
hide: "Спрятать" hide: "Спрятать"
leaveGroup: "Покинуть группу" leaveGroup: "Покинуть группу"
leaveGroupConfirm: "Вы хотите оставить \"{name}\"?" leaveGroupConfirm: "Покинуть группу «{name}»?"
useDrawerReactionPickerForMobile: "Выдвижная палитра на мобильном устройстве"
welcomeBackWithName: "С возвращением, {name}!" welcomeBackWithName: "С возвращением, {name}!"
clickToFinishEmailVerification: "Пожалуйста, нажмите [{ok}], чтобы завершить подтверждение адреса электронной почты." clickToFinishEmailVerification: "Пожалуйста, нажмите [{ok}], чтобы завершить подтверждение адреса электронной почты."
_emailUnavailable: _emailUnavailable:
used: "Уже используется" used: "Уже используется"
format: "Неправильный формат" format: "Неверный формат"
mx: "Это неправильный почтовый сервер!" disposable: "Временный адрес электронной почты не принимается"
mx: "Неверный почтовый сервер"
smtp: "Почтовый сервер не отвечает" smtp: "Почтовый сервер не отвечает"
_ffVisibility: _ffVisibility:
public: "Опубликовать" public: "Общедоступны"
private: "Частный" followers: "Показываются только подписчикам"
private: "Показываются только вам"
_signup: _signup:
almostThere: "Почти готово!" almostThere: "Почти готово!"
emailAddressInfo: "Пожалуйста, введите адрес электронной почты, который вы используете." emailAddressInfo: "Введите ваш адрес электронной почты."
emailSent: "На указанный вами адрес электронной почты ({email}) было отправлено письмо с подтверждением. Перейдите по ссылке в электронном письме, чтобы завершить создание учетной записи." emailSent: "На указанный вами адрес электронной почты ({email}) отправлено письмо. Перейдите по ссылке в письме, чтобы завершить регистрацию."
_accountDelete: _accountDelete:
accountDelete: "Удалить свой аккаунт" accountDelete: "Удалить свою учётную запись"
mayTakeTime: "Удаление учетной записи - это тяжелый процесс, который может занять много времени, если у вас создано много контента или загружено много файлов." mayTakeTime: "Удаление учётной записи — ресурсозатратный процесс. Он может занять много времени, если вы много писали и загружали файлов."
sendEmail: "Мы отправим уведомление на зарегистрированный вами адрес электронной почты, когда ваша учетная запись будет удалена." sendEmail: "Когда ваша учетная запись будет удалена, мы сообщим на указанную вами электронную почту."
requestAccountDelete: "Запросить удаление вашей учетной записи" requestAccountDelete: "Запросить удаление вашей учетной записи"
started: "Процесс удаления начался." started: "Процесс удаления начался."
inProgress: "Удаление в процессе" inProgress: "Удаление в процессе"
@ -894,7 +905,7 @@ _mfm:
blockMathDescription: "Оформляет математическое выражение (KaTeX) на отдельной строке." blockMathDescription: "Оформляет математическое выражение (KaTeX) на отдельной строке."
quote: "Цитата" quote: "Цитата"
quoteDescription: "Так можно процитировать чей-то текст." quoteDescription: "Так можно процитировать чей-то текст."
emoji: "Эмодзи пользователя" emoji: "Собственные эмодзи"
emojiDescription: "Можно вставить эмодзи в текст, окружив название двоеточиями." emojiDescription: "Можно вставить эмодзи в текст, окружив название двоеточиями."
search: "Поиск" search: "Поиск"
searchDescription: "Можно добавить форму для поиска, сразу задав, что искать." searchDescription: "Можно добавить форму для поиска, сразу задав, что искать."
@ -926,43 +937,10 @@ _mfm:
fontDescription: "Так можно писать произвольным шрифтом." fontDescription: "Так можно писать произвольным шрифтом."
rainbow: "Радуга" rainbow: "Радуга"
rainbowDescription: "Заставлять содержимое отображаться в цветах радуги." rainbowDescription: "Заставлять содержимое отображаться в цветах радуги."
sparkle: "Блеск" sparkle: "Искры"
sparkleDescription: "Добавьте эффект искрящихся частиц." sparkleDescription: "Добавляет эффект искрящихся частиц."
rotate: "Повернуть" rotate: "Повернуть"
rotateDescription: "Повернуть на указанный угол." rotateDescription: "Поворачивает на заданный угол."
_reversi:
reversi: "Реверси"
gameSettings: "Настройки игры"
chooseBoard: "Выберите доску"
blackOrWhite: "Черные/Белые"
blackIs: "{name} за чёрных"
rules: "Правила"
botSettings: "Настройки бота"
thisGameIsStartedSoon: "Игра скоро начнётся."
waitingForOther: "Ожидание соперника..."
waitingForMe: "В ожидании, когда будете готовы."
waitingBoth: "Приготовьтесь."
ready: "Готово"
cancelReady: "Возврат к подготовке"
opponentTurn: "Ход соперника"
myTurn: "Ваш ход"
turnOf: "Ходит {name}."
pastTurnOf: "Ходит {name}."
surrender: "Сдаться"
surrendered: "Противник сдался"
drawn: "Ничья"
won: "Победитель — {name}"
black: "Чёрные"
white: "Белые"
total: "Всего"
turnCount: "Ход {count}"
myGames: "Сыгранное вами"
allGames: "Все игры"
ended: "Завершена"
playing: "Идёт игра"
isLlotheo: "Выигрывает меньшее число камней (LLoTheO)"
loopedMap: "Замкнутая в кольцо доска"
canPutEverywhere: "Камни можно ставить везде"
_instanceTicker: _instanceTicker:
none: "Не показывать" none: "Не показывать"
remote: "Только для других сайтов" remote: "Только для других сайтов"
@ -995,6 +973,8 @@ _wordMute:
soft: "Мягкий" soft: "Мягкий"
hard: "Жёсткий" hard: "Жёсткий"
mutedNotes: "Скрытые заметки" mutedNotes: "Скрытые заметки"
_instanceMute:
heading: "Список заглушенных инстансов"
_theme: _theme:
explore: "Обзор" explore: "Обзор"
install: "Установить тему" install: "Установить тему"
@ -1077,8 +1057,6 @@ _sfx:
chatBg: "Сообщения (фон)" chatBg: "Сообщения (фон)"
antenna: "Антенна" antenna: "Антенна"
channel: "Канал" channel: "Канал"
reversiPutBlack: "Реверси — ход чёрных"
reversiPutWhite: "Реверси — ход белых"
_ago: _ago:
unknown: "Когда-то" unknown: "Когда-то"
future: "Из будущего" future: "Из будущего"
@ -1156,10 +1134,10 @@ _permissions:
"write:user-groups": "Изменять и удалять группы пользователей" "write:user-groups": "Изменять и удалять группы пользователей"
"read:channels": "Смотреть каналы" "read:channels": "Смотреть каналы"
"write:channels": "Изменять каналы" "write:channels": "Изменять каналы"
"read:gallery": "Смотреть галерею" "read:gallery": "Просмотр галереи"
"write:gallery": "Работа с галереей" "write:gallery": "Редактирование галереи"
"read:gallery-likes": осмотреть галерею лайков" "read:gallery-likes": росмотр списка понравившегося в галерее"
"write:gallery-likes": "Манипулируйте понравившейся галереей" "write:gallery-likes": "Изменение списка понравившегося в галерее"
_auth: _auth:
shareAccess: "Дать доступ для «{name}» к вашей учётной записи?" shareAccess: "Дать доступ для «{name}» к вашей учётной записи?"
shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?" shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?"
@ -1268,7 +1246,8 @@ _exportOrImport:
muteList: "Скрытые" muteList: "Скрытые"
blockingList: "Заблокированные" blockingList: "Заблокированные"
userLists: "Списки" userLists: "Списки"
excludeMutingUsers: "Исключение отключенных пользователей" excludeMutingUsers: "За исключением заглушенных пользователей"
excludeInactiveUsers: "Без неактивных учётных записей"
_charts: _charts:
federationInstancesIncDec: "Изменение внешних связей" federationInstancesIncDec: "Изменение внешних связей"
federationInstancesTotal: "Количество внешних связей" federationInstancesTotal: "Количество внешних связей"
@ -1300,68 +1279,6 @@ _timelines:
local: "Местная" local: "Местная"
social: "Социальная" social: "Социальная"
global: "Всеобщая" global: "Всеобщая"
_rooms:
roomOf: "Комната {user}"
addFurniture: "Добавить обстановку"
translate: "Передвинуть"
rotate: "Повернуть"
exit: "Выход"
remove: "Выбросить"
clear: "Очистить"
clearConfirm: "Уверены что стоит убрать всю обстановку из вашей комнаты?"
leaveConfirm: "Изменения не сохранены, правда хотите покинуть комнату?"
chooseImage: "Выберите изображение"
roomType: "Стиль комнаты"
carpetColor: "Цвет ковра"
_roomType:
default: "По умолчанию"
washitsu: "Японская"
_furnitures:
milk: "Пакет молока"
bed: "Кровать"
low-table: "Журнальный стол"
desk: "Письменный стол"
chair: "Стул"
chair2: "Стул 2"
fan: "Вентилятор"
pc: "Системный блок"
plant: "Растение в горшке"
plant2: "Растение в горшке 2"
eraser: "Ластик"
pencil: "Карандаш"
pudding: "Пудинг"
cardboard-box: "Картонная коробка"
cardboard-box2: "Картонная коробка 2"
cardboard-box3: "Картонная коробка 3"
book: "Книга"
book2: "Книга про Misskey"
piano: "Пианино"
facial-tissue: "Салфетки"
server: "Сервер"
moon: "Луна"
corkboard: "Пробковая доска"
mousepad: "Коврик для мыши"
monitor: "Монитор"
keyboard: "Клавиатура"
carpet-stripe: "Полосатый ковёр"
mat: "Мат"
color-box: "Книжная полка"
wall-clock: "Настенные часы"
photoframe: "Картина в раме"
cube: "Куб"
tv: "Телевизор"
pinguin: "Пингвин"
rubik-cube: "Кубик Рубика"
poster-h: "Плакат (альбомная ориентация)"
poster-v: "Плакат (портретная ориентация)"
sofa: "Диван"
spiral: "Спиральная лестница"
bin: "Мусорное ведро"
cup-noodle: "Стакан лапши"
holo-display: "Голографический проектор"
energy-drink: "Банка энергетического напитка"
doll-ai: "Кукла Ай-тян"
banknote: "Пачка денег"
_pages: _pages:
newPage: "Создать страницу" newPage: "Создать страницу"
editPage: "Править страницу" editPage: "Править страницу"

View File

@ -236,7 +236,6 @@ uploadFromUrlDescription: "Посилання на файл для завант
uploadFromUrlRequested: "Завантаження розпочалось" uploadFromUrlRequested: "Завантаження розпочалось"
uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час." uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час."
explore: "Огляд" explore: "Огляд"
games: "Ігри Misskey"
messageRead: "Прочитано" messageRead: "Прочитано"
noMoreHistory: "Подальшої історії немає" noMoreHistory: "Подальшої історії немає"
startMessaging: "Розпочати діалог" startMessaging: "Розпочати діалог"
@ -519,7 +518,6 @@ userSuspended: "Обліковий запис заблокований."
userSilenced: "Обліковий запис приглушений." userSilenced: "Обліковий запис приглушений."
divider: "Розділювач" divider: "Розділювач"
addItem: "Додати елемент" addItem: "Додати елемент"
rooms: "Кімнати"
relays: "Ретранслятори" relays: "Ретранслятори"
addRelay: "Додати ретранслятор" addRelay: "Додати ретранслятор"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
@ -646,7 +644,6 @@ emailVerified: "Електронну пошту підтверджено."
noteFavoritesCount: "Кількість улюблених нотаток" noteFavoritesCount: "Кількість улюблених нотаток"
pageLikesCount: "Кількість отриманих вподобань сторінки" pageLikesCount: "Кількість отриманих вподобань сторінки"
pageLikedCount: "Кількість вподобаних сторінок" pageLikedCount: "Кількість вподобаних сторінок"
reversiCount: "Кількість матчів \"Реверсі\""
contact: "Контакт" contact: "Контакт"
useSystemFont: "Використовувати стандартний шрифт системи" useSystemFont: "Використовувати стандартний шрифт системи"
clips: "Добірка" clips: "Добірка"
@ -771,37 +768,6 @@ _mfm:
font: "Шрифт" font: "Шрифт"
fontDescription: "Встановлює шрифт для контенту." fontDescription: "Встановлює шрифт для контенту."
rotate: "Обертати" rotate: "Обертати"
_reversi:
reversi: "Реверсі"
gameSettings: "Налаштування гри"
chooseBoard: "Вибір дошки"
blackOrWhite: "Чорні / Білі"
blackIs: "{name} грає чорними"
rules: "Правила"
botSettings: "Параметри бота"
thisGameIsStartedSoon: "Гра розпочнеться через кілька секунд"
waitingForOther: "Чекаємо на хід суперника"
waitingForMe: "Чекаємо на ваш хід"
waitingBoth: "Приготуйтесь"
ready: "Готовність"
cancelReady: "Скасувати готовність"
opponentTurn: "Хід суперника"
myTurn: "Ваш хід"
turnOf: "Хід {name}"
pastTurnOf: "Хід {name}"
surrender: "Здатися"
drawn: "Нічия"
won: "Перемога {name}"
black: "Чорні"
white: "Білі"
total: "Всього"
turnCount: "Хід {count}"
myGames: "Мої ігри"
allGames: "Усі ігри"
ended: "Завершено"
playing: "В даний момент у процесі гри"
isLlotheo: "Гравець з найменшою кількістю фігур виграє (Llotheo)"
canPutEverywhere: "Фігури можна ставити в будь якії позиції"
_instanceTicker: _instanceTicker:
none: "Не відображати" none: "Не відображати"
remote: "Відображати для віддалених користувачів" remote: "Відображати для віддалених користувачів"
@ -901,8 +867,6 @@ _sfx:
chatBg: "Чати (фон)" chatBg: "Чати (фон)"
antenna: "Прийом антени" antenna: "Прийом антени"
channel: "Повідомлення каналу" channel: "Повідомлення каналу"
reversiPutBlack: "Реверсі: хід Чорного"
reversiPutWhite: "Реверсі: хід Білого"
_ago: _ago:
unknown: "Невідомо" unknown: "Невідомо"
future: "Майбутнє" future: "Майбутнє"
@ -1095,68 +1059,6 @@ _timelines:
local: "Локальна" local: "Локальна"
social: "Соціальна" social: "Соціальна"
global: "Глобальна" global: "Глобальна"
_rooms:
roomOf: "Кімната {user}"
addFurniture: "Розмістити меблі"
translate: "Пересунути"
rotate: "Обертати"
exit: "Назад"
remove: "Видалити"
clear: "Видалити все"
clearConfirm: "Ви дійсно хочете позбутись усіх речей у вашій кімнаті?"
leaveConfirm: "Є незбережені зміни. Ви дійсно хочете вийти?"
chooseImage: "Виберіть зображення"
roomType: "Тип кімнати"
carpetColor: "Колір килима"
_roomType:
default: "За замовчуванням"
washitsu: "В японському стилі"
_furnitures:
milk: "Пакет молока"
bed: "Ліжко"
low-table: "Журнальний стіл"
desk: "Письмовий стіл"
chair: "Стілець"
chair2: "Стілець 2"
fan: "Вентилятор"
pc: "Комп’ютер"
plant: "Кімнатна рослина"
plant2: "Кімнатна рослина 2"
eraser: "Ластик"
pencil: "Олівець"
pudding: "Пудинг"
cardboard-box: "Картонна коробка"
cardboard-box2: "Картонна коробка 2"
cardboard-box3: "Картонна коробка 3"
book: "Книга"
book2: "Книга 2"
piano: "Піаніно"
facial-tissue: "Серветки"
server: "Сервер"
moon: "Місяць"
corkboard: "Коркова дошка"
mousepad: "Килимок для миші"
monitor: "Монітор"
keyboard: "Клавіатура"
carpet-stripe: "Смугастий килим"
mat: "Мат"
color-box: "Книжкова полиця"
wall-clock: "Настінний годинник"
photoframe: "Фоторамка"
cube: "Куб"
tv: "Телевізор"
pinguin: "Пінгвін"
rubik-cube: "Кубик Рубіка"
poster-h: "Плакат (горизонтальний)"
poster-v: "Плакат (вертикальний)"
sofa: "Диван"
spiral: "Гвинтові сходи"
bin: "Смітник"
cup-noodle: "Локшина в чашці"
holo-display: "Голографічний дисплей"
energy-drink: "Енергетичний напій"
doll-ai: "Лялька Аі-тян"
banknote: "Пачка грошей"
_pages: _pages:
newPage: "Створити сторінку" newPage: "Створити сторінку"
editPage: "Редагувати сторінку" editPage: "Редагувати сторінку"

View File

@ -242,7 +242,6 @@ uploadFromUrlDescription: "输入文件的URL"
uploadFromUrlRequested: "请求上传" uploadFromUrlRequested: "请求上传"
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。" uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
explore: "发现" explore: "发现"
games: "Misskey游戏"
messageRead: "已读" messageRead: "已读"
noMoreHistory: "没有更多的历史记录" noMoreHistory: "没有更多的历史记录"
startMessaging: "添加聊天" startMessaging: "添加聊天"
@ -537,7 +536,6 @@ yourAccountSuspendedDescription: "由于违反了服务器的服务条款或其
menu: "菜单" menu: "菜单"
divider: "分割线" divider: "分割线"
addItem: "添加项目" addItem: "添加项目"
rooms: "房间"
relays: "中继" relays: "中继"
addRelay: "添加中继" addRelay: "添加中继"
inboxUrl: "Inbox URL" inboxUrl: "Inbox URL"
@ -670,7 +668,6 @@ emailVerified: "电子邮件地址已验证"
noteFavoritesCount: "收藏的帖子数" noteFavoritesCount: "收藏的帖子数"
pageLikesCount: "页面点赞次数" pageLikesCount: "页面点赞次数"
pageLikedCount: "页面被点赞次数" pageLikedCount: "页面被点赞次数"
reversiCount: "黑白棋对战次数"
contact: "联系人" contact: "联系人"
useSystemFont: "使用系统默认字体" useSystemFont: "使用系统默认字体"
clips: "书签" clips: "书签"
@ -746,6 +743,7 @@ notRecommended: "不推荐"
botProtection: "Bot防御" botProtection: "Bot防御"
instanceBlocking: "被阻拦的实例" instanceBlocking: "被阻拦的实例"
selectAccount: "选择账户" selectAccount: "选择账户"
switchAccount: "切换账户"
enabled: "已启用" enabled: "已启用"
disabled: "已禁用 " disabled: "已禁用 "
quickAction: "快捷操作" quickAction: "快捷操作"
@ -944,39 +942,6 @@ _mfm:
sparkleDescription: "添加发光粒子效果。" sparkleDescription: "添加发光粒子效果。"
rotate: "旋转" rotate: "旋转"
rotateDescription: "旋转指定的角度。" rotateDescription: "旋转指定的角度。"
_reversi:
reversi: "黑白棋"
gameSettings: "对局设置"
chooseBoard: "棋盘选择"
blackOrWhite: "先手/后手"
blackIs: "{name}执黑(先走)"
rules: "规则"
botSettings: "机器人设置"
thisGameIsStartedSoon: "对局在几秒后开始"
waitingForOther: "等待对手准备"
waitingForMe: "等待您的准备"
waitingBoth: "请准备"
ready: "准备就绪"
cancelReady: "重新准备"
opponentTurn: "对手的会合"
myTurn: "您的回合"
turnOf: "{name}的回合"
pastTurnOf: "{name}的回合"
surrender: "认输 "
surrendered: "对手认输"
drawn: "平局"
won: "{name}获胜"
black: "黑"
white: "白"
total: "总计"
turnCount: "{count}回合"
myGames: "我的对局"
allGames: "所有对局"
ended: "结束"
playing: "对局中"
isLlotheo: "棋子较少一方获胜(LLoTheO规则)"
loopedMap: "循环棋盘"
canPutEverywhere: "可以下在任意位置"
_instanceTicker: _instanceTicker:
none: "不显示" none: "不显示"
remote: "显示给远程用户" remote: "显示给远程用户"
@ -1096,8 +1061,6 @@ _sfx:
chatBg: "聊天背景" chatBg: "聊天背景"
antenna: "天线接收" antenna: "天线接收"
channel: "频道通知" channel: "频道通知"
reversiPutBlack: "黑白棋:黑方下子时"
reversiPutWhite: "黑白棋:白方下子时"
_ago: _ago:
unknown: "未知" unknown: "未知"
future: "未来" future: "未来"
@ -1320,68 +1283,6 @@ _timelines:
local: "本地" local: "本地"
social: "社交" social: "社交"
global: "全局" global: "全局"
_rooms:
roomOf: "{user}的房间"
addFurniture: "放置家具"
translate: "移动"
rotate: "旋转"
exit: "返回"
remove: "移除"
clear: "清理"
clearConfirm: "是否清除所有家具?"
leaveConfirm: "有尚未保存的修改。是否离开?"
chooseImage: "选择图片"
roomType: "房间类型"
carpetColor: "地板颜色"
_roomType:
default: "默认"
washitsu: "和式房间"
_furnitures:
milk: "牛奶纸箱"
bed: "床"
low-table: "矮桌"
desk: "书桌"
chair: "椅子"
chair2: "椅子2"
fan: "换气扇"
pc: "电脑"
plant: "观叶植物"
plant2: "观叶植物2"
eraser: "橡皮擦"
pencil: "铅笔"
pudding: "布丁"
cardboard-box: "纸箱"
cardboard-box2: "纸箱2"
cardboard-box3: "纸箱3"
book: "书"
book2: "书2"
piano: "钢琴"
facial-tissue: "纸巾盒"
server: "服务器"
moon: "月亮"
corkboard: "软木板"
mousepad: "鼠标垫"
monitor: "显示器"
keyboard: "键盘"
carpet-stripe: "地毯(条纹)"
mat: "垫子"
color-box: "收纳柜"
wall-clock: "挂钟"
photoframe: "相框"
cube: "立方体"
tv: "电视"
pinguin: "企鹅君"
rubik-cube: "魔方"
poster-h: "海报(横向)"
poster-v: "海报(纵向)"
sofa: "沙发"
spiral: "螺旋楼梯"
bin: "垃圾箱"
cup-noodle: "杯面"
holo-display: "全息显示器"
energy-drink: "能量饮料"
doll-ai: "小蓝的玩偶"
banknote: "钞票"
_pages: _pages:
newPage: "创建页面" newPage: "创建页面"
editPage: "编辑页面" editPage: "编辑页面"

View File

@ -239,7 +239,6 @@ uploadFromUrlDescription: "您要上傳的文件的URL"
uploadFromUrlRequested: "已請求上傳" uploadFromUrlRequested: "已請求上傳"
uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。" uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。"
explore: "探索" explore: "探索"
games: "Misskey 遊戲"
messageRead: "已讀" messageRead: "已讀"
noMoreHistory: "沒有更多歷史紀錄" noMoreHistory: "沒有更多歷史紀錄"
startMessaging: "開始傳送訊息" startMessaging: "開始傳送訊息"
@ -525,7 +524,6 @@ userSuspended: "該使用者已被停用"
userSilenced: "該用戶已被禁言。" userSilenced: "該用戶已被禁言。"
divider: "分割線" divider: "分割線"
addItem: "新增項目" addItem: "新增項目"
rooms: "房間"
relays: "中繼" relays: "中繼"
addRelay: "新增中繼" addRelay: "新增中繼"
inboxUrl: "收件夾URL" inboxUrl: "收件夾URL"
@ -651,7 +649,6 @@ emailVerified: "已成功驗證您的電郵"
noteFavoritesCount: "我的最愛貼文的數目" noteFavoritesCount: "我的最愛貼文的數目"
pageLikesCount: "頁面被按讚次數" pageLikesCount: "頁面被按讚次數"
pageLikedCount: "頁面被按讚次數" pageLikedCount: "頁面被按讚次數"
reversiCount: "黑白棋對戰次數"
contact: "聯絡人" contact: "聯絡人"
useSystemFont: "使用系統預設的字型" useSystemFont: "使用系統預設的字型"
clips: "摘錄" clips: "摘錄"
@ -840,37 +837,6 @@ _mfm:
font: "字型" font: "字型"
fontDescription: "您可以設定顯示內容的字型" fontDescription: "您可以設定顯示內容的字型"
rotate: "旋轉" rotate: "旋轉"
_reversi:
reversi: "黑白棋"
gameSettings: "對弈設定"
chooseBoard: "選擇棋盤"
blackOrWhite: "黑棋/白棋"
blackIs: "{name}在玩黑棋"
rules: "規則"
botSettings: "機器人設定"
thisGameIsStartedSoon: "遊戲即將開始"
waitingForOther: "等待對手準備"
waitingForMe: "等待您的準備"
waitingBoth: "請準備"
ready: "已就緒"
cancelReady: "重新準備"
opponentTurn: "對手回合"
myTurn: "你的回合"
turnOf: "{name}的回合"
pastTurnOf: "{name}的回合"
surrender: "認輸"
surrendered: "對手認輸"
drawn: "平手"
won: "{name}獲勝"
black: "黑"
white: "白"
total: "合計"
turnCount: "{count}回合"
myGames: "我的對弈"
allGames: "所有對弈"
ended: "已結束"
playing: "正在對弈"
loopedMap: "循環棋盤"
_instanceTicker: _instanceTicker:
none: "隱藏" none: "隱藏"
remote: "向遠端使用者顯示" remote: "向遠端使用者顯示"
@ -1176,67 +1142,6 @@ _timelines:
local: "本地" local: "本地"
social: "社群" social: "社群"
global: "公開" global: "公開"
_rooms:
roomOf: "{user}的房間"
addFurniture: "擺放家具"
translate: "移動 "
rotate: "旋轉"
exit: "返回"
remove: "移除"
clear: "全部移除"
clearConfirm: "確定要移除全部家具嗎?"
leaveConfirm: "修改未儲存,是否要離開?"
chooseImage: "選擇圖像"
roomType: "房間種類"
carpetColor: "地板顏色"
_roomType:
default: "預設"
washitsu: "和室"
_furnitures:
milk: "牛奶盒"
bed: "床"
low-table: "咖啡桌"
desk: "書桌"
chair: "椅子"
chair2: "椅子2"
fan: "通風機"
pc: "電腦"
plant: "觀葉植物"
plant2: "觀葉植物2"
eraser: "橡皮擦"
pencil: "鉛筆"
pudding: "布丁"
cardboard-box: "紙板箱"
cardboard-box2: "紙板箱2"
cardboard-box3: "紙板箱3"
book: "讀物"
book2: "讀物2"
piano: "鋼琴"
server: "伺服器"
moon: "月亮"
corkboard: "木栓板"
mousepad: "滑鼠墊"
monitor: "監視器"
keyboard: "鍵盤"
carpet-stripe: "條紋地毯"
mat: "地毯"
color-box: "層架"
wall-clock: "壁鐘"
photoframe: "相框"
cube: "立方體"
tv: "電視"
pinguin: "企鵝蠟像"
rubik-cube: "魔術方塊"
poster-h: "海報(橫向)"
poster-v: "海報(直向)"
sofa: " 沙發"
spiral: "螺旋式樓梯"
bin: "垃圾箱"
cup-noodle: "杯面"
holo-display: "投影機"
energy-drink: "能量飲料"
doll-ai: "小藍的人偶公仔"
banknote: "大疊鈔票"
_pages: _pages:
newPage: "建立頁面" newPage: "建立頁面"
editPage: "編輯頁面" editPage: "編輯頁面"

View File

@ -1,6 +1,6 @@
{ {
"name": "misskey", "name": "misskey",
"version": "12.101.1", "version": "12.102.1",
"codename": "indigo", "codename": "indigo",
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -86,7 +86,7 @@ export async function exportBlocking(job: Bull.Job<DbUserJobData>, done: any): P
logger.succ(`Exported to: ${path}`); logger.succ(`Exported to: ${path}`);
const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; const fileName = 'blocking-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
const driveFile = await addFile(user, path, fileName, null, null, true); const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`); logger.succ(`Exported to: ${driveFile.id}`);
cleanup(); cleanup();

View File

@ -111,7 +111,7 @@ export async function exportCustomEmojis(job: Bull.Job, done: () => void): Promi
logger.succ(`Exported to: ${archivePath}`); logger.succ(`Exported to: ${archivePath}`);
const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.zip'; const fileName = 'custom-emojis-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.zip';
const driveFile = await addFile(user, archivePath, fileName, null, null, true); const driveFile = await addFile({ user, path: archivePath, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`); logger.succ(`Exported to: ${driveFile.id}`);
cleanup(); cleanup();

View File

@ -87,7 +87,7 @@ export async function exportFollowing(job: Bull.Job<DbUserJobData>, done: () =>
logger.succ(`Exported to: ${path}`); logger.succ(`Exported to: ${path}`);
const fileName = 'following-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; const fileName = 'following-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
const driveFile = await addFile(user, path, fileName, null, null, true); const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`); logger.succ(`Exported to: ${driveFile.id}`);
cleanup(); cleanup();

View File

@ -86,7 +86,7 @@ export async function exportMute(job: Bull.Job<DbUserJobData>, done: any): Promi
logger.succ(`Exported to: ${path}`); logger.succ(`Exported to: ${path}`);
const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; const fileName = 'mute-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
const driveFile = await addFile(user, path, fileName, null, null, true); const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`); logger.succ(`Exported to: ${driveFile.id}`);
cleanup(); cleanup();

View File

@ -95,7 +95,7 @@ export async function exportNotes(job: Bull.Job<DbUserJobData>, done: any): Prom
logger.succ(`Exported to: ${path}`); logger.succ(`Exported to: ${path}`);
const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.json'; const fileName = 'notes-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.json';
const driveFile = await addFile(user, path, fileName, null, null, true); const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`); logger.succ(`Exported to: ${driveFile.id}`);
cleanup(); cleanup();

View File

@ -63,7 +63,7 @@ export async function exportUserLists(job: Bull.Job<DbUserJobData>, done: any):
logger.succ(`Exported to: ${path}`); logger.succ(`Exported to: ${path}`);
const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv'; const fileName = 'user-lists-' + dateFormat(new Date(), 'yyyy-mm-dd-HH-MM-ss') + '.csv';
const driveFile = await addFile(user, path, fileName, null, null, true); const driveFile = await addFile({ user, path, name: fileName, force: true });
logger.succ(`Exported to: ${driveFile.id}`); logger.succ(`Exported to: ${driveFile.id}`);
cleanup(); cleanup();

View File

@ -59,7 +59,7 @@ export async function importCustomEmojis(job: Bull.Job<DbUserImportJobData>, don
await Emojis.delete({ await Emojis.delete({
name: emojiInfo.name, name: emojiInfo.name,
}); });
const driveFile = await addFile(null, emojiPath, record.fileName, null, null, true); const driveFile = await addFile({ user: null, path: emojiPath, name: record.fileName, force: true });
const emoji = await Emojis.insert({ const emoji = await Emojis.insert({
id: genId(), id: genId(),
updatedAt: new Date(), updatedAt: new Date(),

View File

@ -1,4 +1,4 @@
import uploadFromUrl from '@/services/drive/upload-from-url'; import { uploadFromUrl } from '@/services/drive/upload-from-url';
import { IRemoteUser } from '@/models/entities/user'; import { IRemoteUser } from '@/models/entities/user';
import Resolver from '../resolver'; import Resolver from '../resolver';
import { fetchMeta } from '@/misc/fetch-meta'; import { fetchMeta } from '@/misc/fetch-meta';
@ -28,9 +28,15 @@ export async function createImage(actor: IRemoteUser, value: any): Promise<Drive
logger.info(`Creating the Image: ${image.url}`); logger.info(`Creating the Image: ${image.url}`);
const instance = await fetchMeta(); const instance = await fetchMeta();
const cache = instance.cacheRemoteFiles;
let file = await uploadFromUrl(image.url, actor, null, image.url, image.sensitive, false, !cache, truncate(image.name, DB_MAX_IMAGE_COMMENT_LENGTH)); let file = await uploadFromUrl({
url: image.url,
user: actor,
uri: image.url,
sensitive: image.sensitive,
isLink: !instance.cacheRemoteFiles,
comment: truncate(image.name, DB_MAX_IMAGE_COMMENT_LENGTH)
});
if (file.isLink) { if (file.isLink) {
// URLが異なっている場合、同じ画像が以前に異なるURLで登録されていたということなので、 // URLが異なっている場合、同じ画像が以前に異なるURLで登録されていたということなので、

View File

@ -32,7 +32,7 @@ export const renderActivity = (x: any): IActivity | null => {
PropertyValue: 'schema:PropertyValue', PropertyValue: 'schema:PropertyValue',
value: 'schema:value', value: 'schema:value',
// Misskey // Misskey
misskey: `${config.url}/ns#`, misskey: 'https://misskey-hub.net/ns#',
'_misskey_content': 'misskey:_misskey_content', '_misskey_content': 'misskey:_misskey_content',
'_misskey_quote': 'misskey:_misskey_quote', '_misskey_quote': 'misskey:_misskey_quote',
'_misskey_reaction': 'misskey:_misskey_reaction', '_misskey_reaction': 'misskey:_misskey_reaction',

View File

@ -37,7 +37,7 @@ export async function resolveUser(username: string, host: string | null, option?
}); });
} }
const user = await Users.findOne({ usernameLower, host }, option) as IRemoteUser; const user = await Users.findOne({ usernameLower, host }, option) as IRemoteUser | null;
const acctLower = `${usernameLower}@${host}`; const acctLower = `${usernameLower}@${host}`;

View File

@ -67,7 +67,7 @@ router.get('/notes/:note', async (ctx, next) => {
const note = await Notes.findOne({ const note = await Notes.findOne({
id: ctx.params.note, id: ctx.params.note,
visibility: In(['public', 'home']), visibility: In(['public' as const, 'home' as const]),
localOnly: false, localOnly: false,
}); });
@ -96,7 +96,7 @@ router.get('/notes/:note/activity', async ctx => {
const note = await Notes.findOne({ const note = await Notes.findOne({
id: ctx.params.note, id: ctx.params.note,
userHost: null, userHost: null,
visibility: In(['public', 'home']), visibility: In(['public' as const, 'home' as const]),
localOnly: false, localOnly: false,
}); });

View File

@ -10,7 +10,7 @@ export class AuthenticationError extends Error {
} }
} }
export default async (token: string): Promise<[User | null | undefined, App | null | undefined]> => { export default async (token: string | null): Promise<[User | null | undefined, AccessToken | null | undefined]> => {
if (token == null) { if (token == null) {
return [null, null]; return [null, null];
} }

View File

@ -6,7 +6,7 @@ import { getConnection } from 'typeorm';
import { ApiError } from '../../../error'; import { ApiError } from '../../../error';
import { DriveFile } from '@/models/entities/drive-file'; import { DriveFile } from '@/models/entities/drive-file';
import { ID } from '@/misc/cafy-id'; import { ID } from '@/misc/cafy-id';
import uploadFromUrl from '@/services/drive/upload-from-url'; import { uploadFromUrl } from '@/services/drive/upload-from-url';
import { publishBroadcastStream } from '@/services/stream'; import { publishBroadcastStream } from '@/services/stream';
export const meta = { export const meta = {
@ -54,7 +54,7 @@ export default define(meta, async (ps, me) => {
try { try {
// Create file // Create file
driveFile = await uploadFromUrl(emoji.originalUrl, null, null, null, false, true); driveFile = await uploadFromUrl({ url: emoji.originalUrl, user: null, force: true });
} catch (e) { } catch (e) {
throw new ApiError(); throw new ApiError();
} }

View File

@ -46,7 +46,7 @@ export default define(meta, async (ps, user) => {
const permission = unique(ps.permission.map(v => v.replace(/^(.+)(\/|-)(read|write)$/, '$3:$1'))); const permission = unique(ps.permission.map(v => v.replace(/^(.+)(\/|-)(read|write)$/, '$3:$1')));
// Create account // Create account
const app = await Apps.save({ const app = await Apps.insert({
id: genId(), id: genId(),
createdAt: new Date(), createdAt: new Date(),
userId: user ? user.id : null, userId: user ? user.id : null,
@ -55,7 +55,7 @@ export default define(meta, async (ps, user) => {
permission, permission,
callbackUrl: ps.callbackUrl, callbackUrl: ps.callbackUrl,
secret: secret, secret: secret,
}); }).then(x => Apps.findOneOrFail(x.identifiers[0]));
return await Apps.pack(app, null, { return await Apps.pack(app, null, {
detail: true, detail: true,

View File

@ -56,14 +56,14 @@ export default define(meta, async (ps, user) => {
} }
} }
const channel = await Channels.save({ const channel = await Channels.insert({
id: genId(), id: genId(),
createdAt: new Date(), createdAt: new Date(),
userId: user.id, userId: user.id,
name: ps.name, name: ps.name,
description: ps.description || null, description: ps.description || null,
bannerId: banner ? banner.id : null, bannerId: banner ? banner.id : null,
} as Channel); } as Channel).then(x => Channels.findOneOrFail(x.identifiers[0]));
return await Channels.pack(channel, user); return await Channels.pack(channel, user);
}); });

View File

@ -6,6 +6,7 @@ import define from '../../../define';
import { apiLogger } from '../../../logger'; import { apiLogger } from '../../../logger';
import { ApiError } from '../../../error'; import { ApiError } from '../../../error';
import { DriveFiles } from '@/models/index'; import { DriveFiles } from '@/models/index';
import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits';
export const meta = { export const meta = {
tags: ['drive'], tags: ['drive'],
@ -32,6 +33,11 @@ export const meta = {
default: null, default: null,
}, },
comment: {
validator: $.optional.nullable.str.max(DB_MAX_IMAGE_COMMENT_LENGTH),
default: null,
},
isSensitive: { isSensitive: {
validator: $.optional.either($.bool, $.str), validator: $.optional.either($.bool, $.str),
default: false, default: false,
@ -79,7 +85,7 @@ export default define(meta, async (ps, user, _, file, cleanup) => {
try { try {
// Create file // Create file
const driveFile = await addFile(user, file.path, name, null, ps.folderId, ps.force, false, null, null, ps.isSensitive); const driveFile = await addFile({ user, path: file.path, name, comment: ps.comment, folderId: ps.folderId, force: ps.force, sensitive: ps.isSensitive });
return await DriveFiles.pack(driveFile, { self: true }); return await DriveFiles.pack(driveFile, { self: true });
} catch (e) { } catch (e) {
apiLogger.error(e); apiLogger.error(e);

View File

@ -1,7 +1,7 @@
import $ from 'cafy'; import $ from 'cafy';
import { ID } from '@/misc/cafy-id'; import { ID } from '@/misc/cafy-id';
import ms from 'ms'; import ms from 'ms';
import uploadFromUrl from '@/services/drive/upload-from-url'; import { uploadFromUrl } from '@/services/drive/upload-from-url';
import define from '../../../define'; import define from '../../../define';
import { DriveFiles } from '@/models/index'; import { DriveFiles } from '@/models/index';
import { publishMainStream } from '@/services/stream'; import { publishMainStream } from '@/services/stream';
@ -54,7 +54,7 @@ export const meta = {
// eslint-disable-next-line import/no-default-export // eslint-disable-next-line import/no-default-export
export default define(meta, async (ps, user) => { export default define(meta, async (ps, user) => {
uploadFromUrl(ps.url, user, ps.folderId, null, ps.isSensitive, ps.force, false, ps.comment).then(file => { uploadFromUrl({ url: ps.url, user, folderId: ps.folderId, sensitive: ps.isSensitive, force: ps.force, comment: ps.comment }).then(file => {
DriveFiles.pack(file, { self: true }).then(packedFile => { DriveFiles.pack(file, { self: true }).then(packedFile => {
publishMainStream(user.id, 'urlUploadFinished', { publishMainStream(user.id, 'urlUploadFinished', {
marker: ps.marker, marker: ps.marker,

View File

@ -130,7 +130,7 @@ export default define(meta, async (ps, user) => {
const credentialIdString = credentialId.toString('hex'); const credentialIdString = credentialId.toString('hex');
await UserSecurityKeys.save({ await UserSecurityKeys.insert({
userId: user.id, userId: user.id,
id: credentialIdString, id: credentialIdString,
lastUsed: new Date(), lastUsed: new Date(),

View File

@ -45,7 +45,7 @@ export default define(meta, async (ps, user) => {
const challengeId = genId(); const challengeId = genId();
await AttestationChallenges.save({ await AttestationChallenges.insert({
userId: user.id, userId: user.id,
id: challengeId, id: challengeId,
challenge: hash(Buffer.from(challenge, 'utf-8')).toString('hex'), challenge: hash(Buffer.from(challenge, 'utf-8')).toString('hex'),

View File

@ -1,9 +1,8 @@
import * as Router from '@koa/router'; import * as Router from '@koa/router';
import config from '@/config/index'; import config from '@/config/index';
import { fetchMeta } from '@/misc/fetch-meta'; import { fetchMeta } from '@/misc/fetch-meta';
import { Users } from '@/models/index'; import { Users, Notes } from '@/models/index';
// import User from '../models/user'; import { Not, IsNull, MoreThan } from 'typeorm';
// import Note from '../models/note';
const router = new Router(); const router = new Router();
@ -19,20 +18,21 @@ export const links = [/* (awaiting release) {
}]; }];
const nodeinfo2 = async () => { const nodeinfo2 = async () => {
const now = Date.now();
const [ const [
meta, meta,
// total, total,
// activeHalfyear, activeHalfyear,
// activeMonth, activeMonth,
// localPosts, localPosts,
// localComments localComments,
] = await Promise.all([ ] = await Promise.all([
fetchMeta(true), fetchMeta(true),
// User.count({ host: null }), Users.count({ where: { host: null } }),
// User.count({ host: null, updatedAt: { $gt: new Date(Date.now() - 15552000000) } }), Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 15552000000)) } }),
// User.count({ host: null, updatedAt: { $gt: new Date(Date.now() - 2592000000) } }), Users.count({ where: { host: null, updatedAt: MoreThan(new Date(now - 2592000000)) } }),
// Note.count({ '_user.host': null, replyId: null }), Notes.count({ where: { userHost: null, replyId: null } }),
// Note.count({ '_user.host': null, replyId: { $ne: null } }) Notes.count({ where: { userHost: null, replyId: Not(IsNull()) } }),
]); ]);
const proxyAccount = meta.proxyAccountId ? await Users.pack(meta.proxyAccountId).catch(() => null) : null; const proxyAccount = meta.proxyAccountId ? await Users.pack(meta.proxyAccountId).catch(() => null) : null;
@ -50,9 +50,9 @@ const nodeinfo2 = async () => {
}, },
openRegistrations: !meta.disableRegistration, openRegistrations: !meta.disableRegistration,
usage: { usage: {
users: {}, // { total, activeHalfyear, activeMonth }, users: { total, activeHalfyear, activeMonth },
// localPosts, localPosts,
// localComments localComments,
}, },
metadata: { metadata: {
nodeName: meta.name, nodeName: meta.name,

View File

@ -297,33 +297,45 @@ async function deleteOldFile(user: IRemoteUser) {
} }
} }
type AddFileArgs = {
/** User who wish to add file */
user: { id: User['id']; host: User['host'] } | null;
/** File path */
path: string;
/** Name */
name?: string | null;
/** Comment */
comment?: string | null;
/** Folder ID */
folderId?: any;
/** If set to true, forcibly upload the file even if there is a file with the same hash. */
force?: boolean;
/** Do not save file to local */
isLink?: boolean;
/** URL of source (URLからアップロードされた場合(ローカル/リモート)の元URL) */
url?: string | null;
/** URL of source (リモートインスタンスのURLからアップロードされた場合の元URL) */
uri?: string | null;
/** Mark file as sensitive */
sensitive?: boolean | null;
};
/** /**
* Add file to drive * Add file to drive
* *
* @param user User who wish to add file
* @param path File path
* @param name Name
* @param comment Comment
* @param folderId Folder ID
* @param force If set to true, forcibly upload the file even if there is a file with the same hash.
* @param isLink Do not save file to local
* @param url URL of source (URLからアップロードされた場合(/)URL)
* @param uri URL of source (URLからアップロードされた場合の元URL)
* @param sensitive Mark file as sensitive
* @return Created drive file
*/ */
export async function addFile( export async function addFile({
user: { id: User['id']; host: User['host'] } | null, user,
path: string, path,
name: string | null = null, name = null,
comment: string | null = null, comment = null,
folderId: any = null, folderId = null,
force: boolean = false, force = false,
isLink: boolean = false, isLink = false,
url: string | null = null, url = null,
uri: string | null = null, uri = null,
sensitive: boolean | null = null sensitive = null
): Promise<DriveFile> { }: AddFileArgs): Promise<DriveFile> {
const info = await getFileInfo(path); const info = await getFileInfo(path);
logger.info(`${JSON.stringify(info)}`); logger.info(`${JSON.stringify(info)}`);

View File

@ -10,16 +10,27 @@ import { DriveFiles } from '@/models/index';
const logger = driveLogger.createSubLogger('downloader'); const logger = driveLogger.createSubLogger('downloader');
export default async ( type Args = {
url: string, url: string;
user: { id: User['id']; host: User['host'] } | null, user: { id: User['id']; host: User['host'] } | null;
folderId: DriveFolder['id'] | null = null, folderId?: DriveFolder['id'] | null;
uri: string | null = null, uri?: string | null;
sensitive?: boolean;
force?: boolean;
isLink?: boolean;
comment?: string | null;
};
export async function uploadFromUrl({
url,
user,
folderId = null,
uri = null,
sensitive = false, sensitive = false,
force = false, force = false,
link = false, isLink = false,
comment = null comment = null
): Promise<DriveFile> => { }: Args): Promise<DriveFile> {
let name = new URL(url).pathname.split('/').pop() || null; let name = new URL(url).pathname.split('/').pop() || null;
if (name == null || !DriveFiles.validateFileName(name)) { if (name == null || !DriveFiles.validateFileName(name)) {
name = null; name = null;
@ -41,7 +52,7 @@ export default async (
let error; let error;
try { try {
driveFile = await addFile(user, path, name, comment, folderId, force, link, url, uri, sensitive); driveFile = await addFile({ user, path, name, comment, folderId, force, isLink, url, uri, sensitive });
logger.succ(`Got: ${driveFile.id}`); logger.succ(`Got: ${driveFile.id}`);
} catch (e) { } catch (e) {
error = e; error = e;
@ -59,4 +70,4 @@ export default async (
} else { } else {
return driveFile!; return driveFile!;
} }
}; }

View File

@ -25,7 +25,7 @@ export default async function(follower: { id: User['id']; host: User['host']; ur
if (blocking != null) throw new Error('blocking'); if (blocking != null) throw new Error('blocking');
if (blocked != null) throw new Error('blocked'); if (blocked != null) throw new Error('blocked');
const followRequest = await FollowRequests.save({ const followRequest = await FollowRequests.insert({
id: genId(), id: genId(),
createdAt: new Date(), createdAt: new Date(),
followerId: follower.id, followerId: follower.id,
@ -39,7 +39,7 @@ export default async function(follower: { id: User['id']; host: User['host']; ur
followeeHost: followee.host, followeeHost: followee.host,
followeeInbox: Users.isRemoteUser(followee) ? followee.inbox : undefined, followeeInbox: Users.isRemoteUser(followee) ? followee.inbox : undefined,
followeeSharedInbox: Users.isRemoteUser(followee) ? followee.sharedInbox : undefined, followeeSharedInbox: Users.isRemoteUser(followee) ? followee.sharedInbox : undefined,
}); }).then(x => FollowRequests.findOneOrFail(x.identifiers[0]));
// Publish receiveRequest event // Publish receiveRequest event
if (Users.isLocalUser(followee)) { if (Users.isLocalUser(followee)) {

View File

@ -16,12 +16,12 @@ export async function registerOrFetchInstanceDoc(host: string): Promise<Instance
const index = await Instances.findOne({ host }); const index = await Instances.findOne({ host });
if (index == null) { if (index == null) {
const i = await Instances.save({ const i = await Instances.insert({
id: genId(), id: genId(),
host, host,
caughtAt: new Date(), caughtAt: new Date(),
lastCommunicatedAt: new Date(), lastCommunicatedAt: new Date(),
}); }).then(x => Instances.findOneOrFail(x.identifiers[0]));
federationChart.update(true); federationChart.update(true);

View File

@ -47,6 +47,7 @@ module.exports = {
"vue/no-unused-components": "warn", "vue/no-unused-components": "warn",
"vue/valid-v-for": "warn", "vue/valid-v-for": "warn",
"vue/return-in-computed-property": "warn", "vue/return-in-computed-property": "warn",
"vue/no-setup-props-destructure": "warn",
"vue/max-attributes-per-line": "off", "vue/max-attributes-per-line": "off",
"vue/html-self-closing": "off", "vue/html-self-closing": "off",
"vue/singleline-html-element-content-newline": "off", "vue/singleline-html-element-content-newline": "off",

View File

@ -38,7 +38,7 @@
"@types/websocket": "1.0.4", "@types/websocket": "1.0.4",
"@types/ws": "8.2.2", "@types/ws": "8.2.2",
"@typescript-eslint/parser": "5.10.0", "@typescript-eslint/parser": "5.10.0",
"@vue/compiler-sfc": "3.2.28", "@vue/compiler-sfc": "3.2.29",
"abort-controller": "3.0.0", "abort-controller": "3.0.0",
"autobind-decorator": "2.4.0", "autobind-decorator": "2.4.0",
"autosize": "5.0.1", "autosize": "5.0.1",
@ -111,7 +111,7 @@
"uuid": "8.3.2", "uuid": "8.3.2",
"v-debounce": "0.1.2", "v-debounce": "0.1.2",
"vanilla-tilt": "1.7.2", "vanilla-tilt": "1.7.2",
"vue": "3.2.28", "vue": "3.2.29",
"vue-loader": "17.0.0", "vue-loader": "17.0.0",
"vue-prism-editor": "2.0.0-alpha.2", "vue-prism-editor": "2.0.0-alpha.2",
"vue-router": "4.0.5", "vue-router": "4.0.5",

View File

@ -192,31 +192,31 @@ export async function openAccountMenu(opts: {
if (opts.withExtraOperation) { if (opts.withExtraOperation) {
popupMenu([...[{ popupMenu([...[{
type: 'link', type: 'link',
text: i18n.locale.profile, text: i18n.ts.profile,
to: `/@${ $i.username }`, to: `/@${ $i.username }`,
avatar: $i, avatar: $i,
}, null, ...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises, { }, null, ...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises, {
icon: 'fas fa-plus', icon: 'fas fa-plus',
text: i18n.locale.addAccount, text: i18n.ts.addAccount,
action: () => { action: () => {
popupMenu([{ popupMenu([{
text: i18n.locale.existingAccount, text: i18n.ts.existingAccount,
action: () => { showSigninDialog(); }, action: () => { showSigninDialog(); },
}, { }, {
text: i18n.locale.createAccount, text: i18n.ts.createAccount,
action: () => { createAccount(); }, action: () => { createAccount(); },
}], ev.currentTarget || ev.target); }], ev.currentTarget ?? ev.target);
}, },
}, { }, {
type: 'link', type: 'link',
icon: 'fas fa-users', icon: 'fas fa-users',
text: i18n.locale.manageAccounts, text: i18n.ts.manageAccounts,
to: `/settings/accounts`, to: `/settings/accounts`,
}]], ev.currentTarget || ev.target, { }]], ev.currentTarget ?? ev.target, {
align: 'left' align: 'left'
}); });
} else { } else {
popupMenu([...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises], ev.currentTarget || ev.target, { popupMenu([...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises], ev.currentTarget ?? ev.target, {
align: 'left' align: 'left'
}); });
} }

View File

@ -2,7 +2,7 @@
<XWindow ref="window" :initial-width="400" :initial-height="500" :can-resize="true" @closed="emit('closed')"> <XWindow ref="window" :initial-width="400" :initial-height="500" :can-resize="true" @closed="emit('closed')">
<template #header> <template #header>
<i class="fas fa-exclamation-circle" style="margin-right: 0.5em;"></i> <i class="fas fa-exclamation-circle" style="margin-right: 0.5em;"></i>
<I18n :src="i18n.locale.reportAbuseOf" tag="span"> <I18n :src="i18n.ts.reportAbuseOf" tag="span">
<template #name> <template #name>
<b><MkAcct :user="user"/></b> <b><MkAcct :user="user"/></b>
</template> </template>
@ -11,12 +11,12 @@
<div class="dpvffvvy _monolithic_"> <div class="dpvffvvy _monolithic_">
<div class="_section"> <div class="_section">
<MkTextarea v-model="comment"> <MkTextarea v-model="comment">
<template #label>{{ i18n.locale.details }}</template> <template #label>{{ i18n.ts.details }}</template>
<template #caption>{{ i18n.locale.fillAbuseReportDescription }}</template> <template #caption>{{ i18n.ts.fillAbuseReportDescription }}</template>
</MkTextarea> </MkTextarea>
</div> </div>
<div class="_section"> <div class="_section">
<MkButton primary full :disabled="comment.length === 0" @click="send">{{ i18n.locale.send }}</MkButton> <MkButton primary full :disabled="comment.length === 0" @click="send">{{ i18n.ts.send }}</MkButton>
</div> </div>
</div> </div>
</XWindow> </XWindow>
@ -50,7 +50,7 @@ function send() {
}, undefined).then(res => { }, undefined).then(res => {
os.alert({ os.alert({
type: 'success', type: 'success',
text: i18n.locale.abuseReported text: i18n.ts.abuseReported
}); });
window.value?.close(); window.value?.close();
emit('closed'); emit('closed');

View File

@ -8,7 +8,7 @@
</span> </span>
<span class="username">@{{ acct(user) }}</span> <span class="username">@{{ acct(user) }}</span>
</li> </li>
<li tabindex="-1" class="choose" @click="chooseUser()" @keydown="onKeydown">{{ i18n.locale.selectUser }}</li> <li tabindex="-1" class="choose" @click="chooseUser()" @keydown="onKeydown">{{ i18n.ts.selectUser }}</li>
</ol> </ol>
<ol v-else-if="hashtags.length > 0" ref="suggests" class="hashtags"> <ol v-else-if="hashtags.length > 0" ref="suggests" class="hashtags">
<li v-for="hashtag in hashtags" tabindex="-1" @click="complete(type, hashtag)" @keydown="onKeydown"> <li v-for="hashtag in hashtags" tabindex="-1" @click="complete(type, hashtag)" @keydown="onKeydown">

View File

@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<span v-if="!available">{{ i18n.locale.waiting }}<MkEllipsis/></span> <span v-if="!available">{{ i18n.ts.waiting }}<MkEllipsis/></span>
<div ref="captchaEl"></div> <div ref="captchaEl"></div>
</div> </div>
</template> </template>
@ -38,7 +38,7 @@ const props = defineProps<{
}>(); }>();
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'update:modelValue', v: string | null): void; (ev: 'update:modelValue', v: string | null): void;
}>(); }>();
const available = ref(false); const available = ref(false);

View File

@ -6,14 +6,14 @@
> >
<template v-if="!wait"> <template v-if="!wait">
<template v-if="isFollowing"> <template v-if="isFollowing">
<span v-if="full">{{ i18n.locale.unfollow }}</span><i class="fas fa-minus"></i> <span v-if="full">{{ i18n.ts.unfollow }}</span><i class="fas fa-minus"></i>
</template> </template>
<template v-else> <template v-else>
<span v-if="full">{{ i18n.locale.follow }}</span><i class="fas fa-plus"></i> <span v-if="full">{{ i18n.ts.follow }}</span><i class="fas fa-plus"></i>
</template> </template>
</template> </template>
<template v-else> <template v-else>
<span v-if="full">{{ i18n.locale.processing }}</span><i class="fas fa-spinner fa-pulse fa-fw"></i> <span v-if="full">{{ i18n.ts.processing }}</span><i class="fas fa-spinner fa-pulse fa-fw"></i>
</template> </template>
</button> </button>
</template> </template>

View File

@ -6,7 +6,7 @@
<div class="status"> <div class="status">
<div> <div>
<i class="fas fa-users fa-fw"></i> <i class="fas fa-users fa-fw"></i>
<I18n :src="i18n.locale._channel.usersCount" tag="span" style="margin-left: 4px;"> <I18n :src="i18n.ts._channel.usersCount" tag="span" style="margin-left: 4px;">
<template #n> <template #n>
<b>{{ channel.usersCount }}</b> <b>{{ channel.usersCount }}</b>
</template> </template>
@ -14,7 +14,7 @@
</div> </div>
<div> <div>
<i class="fas fa-pencil-alt fa-fw"></i> <i class="fas fa-pencil-alt fa-fw"></i>
<I18n :src="i18n.locale._channel.notesCount" tag="span" style="margin-left: 4px;"> <I18n :src="i18n.ts._channel.notesCount" tag="span" style="margin-left: 4px;">
<template #n> <template #n>
<b>{{ channel.notesCount }}</b> <b>{{ channel.notesCount }}</b>
</template> </template>
@ -27,7 +27,7 @@
</article> </article>
<footer> <footer>
<span v-if="channel.lastNotedAt"> <span v-if="channel.lastNotedAt">
{{ i18n.locale.updatedAt }}: <MkTime :time="channel.lastNotedAt"/> {{ i18n.ts.updatedAt }}: <MkTime :time="channel.lastNotedAt"/>
</span> </span>
</footer> </footer>
</MkA> </MkA>

View File

@ -143,6 +143,7 @@ export default defineComponent({
} }
const gridColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'; const gridColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)';
const vLineColor = defaultStore.state.darkMode ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)';
// //
Chart.defaults.color = getComputedStyle(document.documentElement).getPropertyValue('--fg'); Chart.defaults.color = getComputedStyle(document.documentElement).getPropertyValue('--fg');
@ -255,6 +256,27 @@ export default defineComponent({
}, },
}, },
}, },
plugins: [{
id: 'vLine',
beforeDraw(chart, args, options) {
if (chart.tooltip._active && chart.tooltip._active.length) {
const activePoint = chart.tooltip._active[0];
const ctx = chart.ctx;
const x = activePoint.element.x;
const topY = chart.scales.y.top;
const bottomY = chart.scales.y.bottom;
ctx.save();
ctx.beginPath();
ctx.moveTo(x, bottomY);
ctx.lineTo(x, topY);
ctx.lineWidth = 1;
ctx.strokeStyle = vLineColor;
ctx.stroke();
ctx.restore();
}
}
}]
}); });
}; };

View File

@ -1,6 +1,6 @@
<template> <template>
<button class="nrvgflfu _button" @click="toggle"> <button class="nrvgflfu _button" @click="toggle">
<b>{{ modelValue ? i18n.locale._cw.hide : i18n.locale._cw.show }}</b> <b>{{ modelValue ? i18n.ts._cw.hide : i18n.ts._cw.show }}</b>
<span v-if="!modelValue">{{ label }}</span> <span v-if="!modelValue">{{ label }}</span>
</button> </button>
</template> </template>
@ -25,7 +25,7 @@ const label = computed(() => {
return concat([ return concat([
props.note.text ? [i18n.t('_cw.chars', { count: length(props.note.text) })] : [], props.note.text ? [i18n.t('_cw.chars', { count: length(props.note.text) })] : [],
props.note.files && props.note.files.length !== 0 ? [i18n.t('_cw.files', { count: props.note.files.length }) ] : [], props.note.files && props.note.files.length !== 0 ? [i18n.t('_cw.files', { count: props.note.files.length }) ] : [],
props.note.poll != null ? [i18n.locale.poll] : [] props.note.poll != null ? [i18n.ts.poll] : []
] as string[][]).join(' / '); ] as string[][]).join(' / ');
}); });

View File

@ -28,8 +28,8 @@
</template> </template>
</MkSelect> </MkSelect>
<div v-if="(showOkButton || showCancelButton) && !actions" class="buttons"> <div v-if="(showOkButton || showCancelButton) && !actions" class="buttons">
<MkButton v-if="showOkButton" inline primary :autofocus="!input && !select" @click="ok">{{ (showCancelButton || input || select) ? i18n.locale.ok : i18n.locale.gotIt }}</MkButton> <MkButton v-if="showOkButton" inline primary :autofocus="!input && !select" @click="ok">{{ (showCancelButton || input || select) ? i18n.ts.ok : i18n.ts.gotIt }}</MkButton>
<MkButton v-if="showCancelButton || input || select" inline @click="cancel">{{ i18n.locale.cancel }}</MkButton> <MkButton v-if="showCancelButton || input || select" inline @click="cancel">{{ i18n.ts.cancel }}</MkButton>
</div> </div>
<div v-if="actions" class="buttons"> <div v-if="actions" class="buttons">
<MkButton v-for="action in actions" :key="action.text" inline :primary="action.primary" @click="() => { action.callback(); close(); }">{{ action.text }}</MkButton> <MkButton v-for="action in actions" :key="action.text" inline :primary="action.primary" @click="() => { action.callback(); close(); }">{{ action.text }}</MkButton>

View File

@ -10,7 +10,7 @@
@closed="emit('closed')" @closed="emit('closed')"
> >
<template #header> <template #header>
{{ multiple ? ((type === 'file') ? i18n.locale.selectFiles : i18n.locale.selectFolders) : ((type === 'file') ? i18n.locale.selectFile : i18n.locale.selectFolder) }} {{ multiple ? ((type === 'file') ? i18n.ts.selectFiles : i18n.ts.selectFolders) : ((type === 'file') ? i18n.ts.selectFile : i18n.ts.selectFolder) }}
<span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ number(selected.length) }})</span> <span v-if="selected.length > 0" style="margin-left: 8px; opacity: 0.5;">({{ number(selected.length) }})</span>
</template> </template>
<XDrive :multiple="multiple" :select="type" @changeSelection="onChangeSelection" @selected="ok()"/> <XDrive :multiple="multiple" :select="type" @changeSelection="onChangeSelection" @selected="ok()"/>

View File

@ -6,7 +6,7 @@
@closed="emit('closed')" @closed="emit('closed')"
> >
<template #header> <template #header>
{{ i18n.locale.drive }} {{ i18n.ts.drive }}
</template> </template>
<XDrive :initial-folder="initialFolder"/> <XDrive :initial-folder="initialFolder"/>
</XWindow> </XWindow>

View File

@ -10,15 +10,15 @@
> >
<div v-if="$i?.avatarId == file.id" class="label"> <div v-if="$i?.avatarId == file.id" class="label">
<img src="/client-assets/label.svg"/> <img src="/client-assets/label.svg"/>
<p>{{ i18n.locale.avatar }}</p> <p>{{ i18n.ts.avatar }}</p>
</div> </div>
<div v-if="$i?.bannerId == file.id" class="label"> <div v-if="$i?.bannerId == file.id" class="label">
<img src="/client-assets/label.svg"/> <img src="/client-assets/label.svg"/>
<p>{{ i18n.locale.banner }}</p> <p>{{ i18n.ts.banner }}</p>
</div> </div>
<div v-if="file.isSensitive" class="label red"> <div v-if="file.isSensitive" class="label red">
<img src="/client-assets/label-red.svg"/> <img src="/client-assets/label-red.svg"/>
<p>{{ i18n.locale.nsfw }}</p> <p>{{ i18n.ts.nsfw }}</p>
</div> </div>
<MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/> <MkDriveFileThumbnail class="thumbnail" :file="file" fit="contain"/>
@ -61,30 +61,30 @@ const title = computed(() => `${props.file.name}\n${props.file.type} ${bytes(pro
function getMenu() { function getMenu() {
return [{ return [{
text: i18n.locale.rename, text: i18n.ts.rename,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',
action: rename action: rename
}, { }, {
text: props.file.isSensitive ? i18n.locale.unmarkAsSensitive : i18n.locale.markAsSensitive, text: props.file.isSensitive ? i18n.ts.unmarkAsSensitive : i18n.ts.markAsSensitive,
icon: props.file.isSensitive ? 'fas fa-eye' : 'fas fa-eye-slash', icon: props.file.isSensitive ? 'fas fa-eye' : 'fas fa-eye-slash',
action: toggleSensitive action: toggleSensitive
}, { }, {
text: i18n.locale.describeFile, text: i18n.ts.describeFile,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',
action: describe action: describe
}, null, { }, null, {
text: i18n.locale.copyUrl, text: i18n.ts.copyUrl,
icon: 'fas fa-link', icon: 'fas fa-link',
action: copyUrl action: copyUrl
}, { }, {
type: 'a', type: 'a',
href: props.file.url, href: props.file.url,
target: '_blank', target: '_blank',
text: i18n.locale.download, text: i18n.ts.download,
icon: 'fas fa-download', icon: 'fas fa-download',
download: props.file.name download: props.file.name
}, null, { }, null, {
text: i18n.locale.delete, text: i18n.ts.delete,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
danger: true, danger: true,
action: deleteFile action: deleteFile
@ -95,7 +95,7 @@ function onClick(ev: MouseEvent) {
if (props.selectMode) { if (props.selectMode) {
emit('chosen', props.file); emit('chosen', props.file);
} else { } else {
os.popupMenu(getMenu(), (ev.currentTarget || ev.target || undefined) as HTMLElement | undefined); os.popupMenu(getMenu(), (ev.currentTarget ?? ev.target ?? undefined) as HTMLElement | undefined);
} }
} }
@ -120,8 +120,8 @@ function onDragend() {
function rename() { function rename() {
os.inputText({ os.inputText({
title: i18n.locale.renameFile, title: i18n.ts.renameFile,
placeholder: i18n.locale.inputNewFileName, placeholder: i18n.ts.inputNewFileName,
default: props.file.name, default: props.file.name,
}).then(({ canceled, result: name }) => { }).then(({ canceled, result: name }) => {
if (canceled) return; if (canceled) return;
@ -134,9 +134,9 @@ function rename() {
function describe() { function describe() {
os.popup(import('@/components/media-caption.vue'), { os.popup(import('@/components/media-caption.vue'), {
title: i18n.locale.describeFile, title: i18n.ts.describeFile,
input: { input: {
placeholder: i18n.locale.inputNewDescription, placeholder: i18n.ts.inputNewDescription,
default: props.file.comment !== null ? props.file.comment : '', default: props.file.comment !== null ? props.file.comment : '',
}, },
image: props.file image: props.file

View File

@ -20,7 +20,7 @@
{{ folder.name }} {{ folder.name }}
</p> </p>
<p v-if="defaultStore.state.uploadFolder == folder.id" class="upload"> <p v-if="defaultStore.state.uploadFolder == folder.id" class="upload">
{{ i18n.locale.uploadFolder }} {{ i18n.ts.uploadFolder }}
</p> </p>
<button v-if="selectMode" class="checkbox _button" :class="{ checked: isSelected }" @click.prevent.stop="checkboxClicked"></button> <button v-if="selectMode" class="checkbox _button" :class="{ checked: isSelected }" @click.prevent.stop="checkboxClicked"></button>
</div> </div>
@ -146,14 +146,14 @@ function onDrop(ev: DragEvent) {
switch (err) { switch (err) {
case 'detected-circular-definition': case 'detected-circular-definition':
os.alert({ os.alert({
title: i18n.locale.unableToProcess, title: i18n.ts.unableToProcess,
text: i18n.locale.circularReferenceFolder text: i18n.ts.circularReferenceFolder
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.locale.somethingHappened text: i18n.ts.somethingHappened
}); });
} }
}); });
@ -184,8 +184,8 @@ function go() {
function rename() { function rename() {
os.inputText({ os.inputText({
title: i18n.locale.renameFolder, title: i18n.ts.renameFolder,
placeholder: i18n.locale.inputNewFolderName, placeholder: i18n.ts.inputNewFolderName,
default: props.folder.name default: props.folder.name
}).then(({ canceled, result: name }) => { }).then(({ canceled, result: name }) => {
if (canceled) return; if (canceled) return;
@ -208,14 +208,14 @@ function deleteFolder() {
case 'b0fc8a17-963c-405d-bfbc-859a487295e1': case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
os.alert({ os.alert({
type: 'error', type: 'error',
title: i18n.locale.unableToDelete, title: i18n.ts.unableToDelete,
text: i18n.locale.hasChildFilesOrFolders text: i18n.ts.hasChildFilesOrFolders
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.locale.unableToDelete text: i18n.ts.unableToDelete
}); });
} }
}); });
@ -227,7 +227,7 @@ function setAsUploadFolder() {
function onContextmenu(ev: MouseEvent) { function onContextmenu(ev: MouseEvent) {
os.contextMenu([{ os.contextMenu([{
text: i18n.locale.openInWindow, text: i18n.ts.openInWindow,
icon: 'fas fa-window-restore', icon: 'fas fa-window-restore',
action: () => { action: () => {
os.popup(import('./drive-window.vue'), { os.popup(import('./drive-window.vue'), {
@ -236,11 +236,11 @@ function onContextmenu(ev: MouseEvent) {
}, 'closed'); }, 'closed');
} }
}, null, { }, null, {
text: i18n.locale.rename, text: i18n.ts.rename,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',
action: rename, action: rename,
}, null, { }, null, {
text: i18n.locale.delete, text: i18n.ts.delete,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
danger: true, danger: true,
action: deleteFolder, action: deleteFolder,

View File

@ -8,7 +8,7 @@
@drop.stop="onDrop" @drop.stop="onDrop"
> >
<i v-if="folder == null" class="fas fa-cloud"></i> <i v-if="folder == null" class="fas fa-cloud"></i>
<span>{{ folder == null ? i18n.locale.drive : folder.name }}</span> <span>{{ folder == null ? i18n.ts.drive : folder.name }}</span>
</div> </div>
</template> </template>

View File

@ -54,7 +54,7 @@
/> />
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid --> <!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
<div v-for="(n, i) in 16" :key="i" class="padding"></div> <div v-for="(n, i) in 16" :key="i" class="padding"></div>
<MkButton v-if="moreFolders" ref="moreFolders">{{ i18n.locale.loadMore }}</MkButton> <MkButton v-if="moreFolders" ref="moreFolders">{{ i18n.ts.loadMore }}</MkButton>
</div> </div>
<div v-show="files.length > 0" ref="filesContainer" class="files"> <div v-show="files.length > 0" ref="filesContainer" class="files">
<XFile <XFile
@ -71,12 +71,12 @@
/> />
<!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid --> <!-- SEE: https://stackoverflow.com/questions/18744164/flex-box-align-last-row-to-grid -->
<div v-for="(n, i) in 16" :key="i" class="padding"></div> <div v-for="(n, i) in 16" :key="i" class="padding"></div>
<MkButton v-show="moreFiles" ref="loadMoreFiles" @click="fetchMoreFiles">{{ i18n.locale.loadMore }}</MkButton> <MkButton v-show="moreFiles" ref="loadMoreFiles" @click="fetchMoreFiles">{{ i18n.ts.loadMore }}</MkButton>
</div> </div>
<div v-if="files.length == 0 && folders.length == 0 && !fetching" class="empty"> <div v-if="files.length == 0 && folders.length == 0 && !fetching" class="empty">
<p v-if="draghover">{{ i18n.t('empty-draghover') }}</p> <p v-if="draghover">{{ i18n.t('empty-draghover') }}</p>
<p v-if="!draghover && folder == null"><strong>{{ i18n.locale.emptyDrive }}</strong><br/>{{ i18n.t('empty-drive-description') }}</p> <p v-if="!draghover && folder == null"><strong>{{ i18n.ts.emptyDrive }}</strong><br/>{{ i18n.t('empty-drive-description') }}</p>
<p v-if="!draghover && folder != null">{{ i18n.locale.emptyFolder }}</p> <p v-if="!draghover && folder != null">{{ i18n.ts.emptyFolder }}</p>
</div> </div>
</div> </div>
<MkLoading v-if="fetching"/> <MkLoading v-if="fetching"/>
@ -253,14 +253,14 @@ function onDrop(e: DragEvent): any {
switch (err) { switch (err) {
case 'detected-circular-definition': case 'detected-circular-definition':
os.alert({ os.alert({
title: i18n.locale.unableToProcess, title: i18n.ts.unableToProcess,
text: i18n.locale.circularReferenceFolder text: i18n.ts.circularReferenceFolder
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.locale.somethingHappened text: i18n.ts.somethingHappened
}); });
} }
}); });
@ -274,9 +274,9 @@ function selectLocalFile() {
function urlUpload() { function urlUpload() {
os.inputText({ os.inputText({
title: i18n.locale.uploadFromUrl, title: i18n.ts.uploadFromUrl,
type: 'url', type: 'url',
placeholder: i18n.locale.uploadFromUrlDescription placeholder: i18n.ts.uploadFromUrlDescription
}).then(({ canceled, result: url }) => { }).then(({ canceled, result: url }) => {
if (canceled || !url) return; if (canceled || !url) return;
os.api('drive/files/upload-from-url', { os.api('drive/files/upload-from-url', {
@ -285,16 +285,16 @@ function urlUpload() {
}); });
os.alert({ os.alert({
title: i18n.locale.uploadFromUrlRequested, title: i18n.ts.uploadFromUrlRequested,
text: i18n.locale.uploadFromUrlMayTakeTime text: i18n.ts.uploadFromUrlMayTakeTime
}); });
}); });
} }
function createFolder() { function createFolder() {
os.inputText({ os.inputText({
title: i18n.locale.createFolder, title: i18n.ts.createFolder,
placeholder: i18n.locale.folderName placeholder: i18n.ts.folderName
}).then(({ canceled, result: name }) => { }).then(({ canceled, result: name }) => {
if (canceled) return; if (canceled) return;
os.api('drive/folders/create', { os.api('drive/folders/create', {
@ -308,8 +308,8 @@ function createFolder() {
function renameFolder(folderToRename: Misskey.entities.DriveFolder) { function renameFolder(folderToRename: Misskey.entities.DriveFolder) {
os.inputText({ os.inputText({
title: i18n.locale.renameFolder, title: i18n.ts.renameFolder,
placeholder: i18n.locale.inputNewFolderName, placeholder: i18n.ts.inputNewFolderName,
default: folderToRename.name default: folderToRename.name
}).then(({ canceled, result: name }) => { }).then(({ canceled, result: name }) => {
if (canceled) return; if (canceled) return;
@ -334,14 +334,14 @@ function deleteFolder(folderToDelete: Misskey.entities.DriveFolder) {
case 'b0fc8a17-963c-405d-bfbc-859a487295e1': case 'b0fc8a17-963c-405d-bfbc-859a487295e1':
os.alert({ os.alert({
type: 'error', type: 'error',
title: i18n.locale.unableToDelete, title: i18n.ts.unableToDelete,
text: i18n.locale.hasChildFilesOrFolders text: i18n.ts.hasChildFilesOrFolders
}); });
break; break;
default: default:
os.alert({ os.alert({
type: 'error', type: 'error',
text: i18n.locale.unableToDelete text: i18n.ts.unableToDelete
}); });
} }
}); });
@ -562,36 +562,36 @@ function fetchMoreFiles() {
function getMenu() { function getMenu() {
return [{ return [{
text: i18n.locale.addFile, text: i18n.ts.addFile,
type: 'label' type: 'label'
}, { }, {
text: i18n.locale.upload, text: i18n.ts.upload,
icon: 'fas fa-upload', icon: 'fas fa-upload',
action: () => { selectLocalFile(); } action: () => { selectLocalFile(); }
}, { }, {
text: i18n.locale.fromUrl, text: i18n.ts.fromUrl,
icon: 'fas fa-link', icon: 'fas fa-link',
action: () => { urlUpload(); } action: () => { urlUpload(); }
}, null, { }, null, {
text: folder.value ? folder.value.name : i18n.locale.drive, text: folder.value ? folder.value.name : i18n.ts.drive,
type: 'label' type: 'label'
}, folder.value ? { }, folder.value ? {
text: i18n.locale.renameFolder, text: i18n.ts.renameFolder,
icon: 'fas fa-i-cursor', icon: 'fas fa-i-cursor',
action: () => { renameFolder(folder.value); } action: () => { renameFolder(folder.value); }
} : undefined, folder.value ? { } : undefined, folder.value ? {
text: i18n.locale.deleteFolder, text: i18n.ts.deleteFolder,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
action: () => { deleteFolder(folder.value as Misskey.entities.DriveFolder); } action: () => { deleteFolder(folder.value as Misskey.entities.DriveFolder); }
} : undefined, { } : undefined, {
text: i18n.locale.createFolder, text: i18n.ts.createFolder,
icon: 'fas fa-folder-plus', icon: 'fas fa-folder-plus',
action: () => { createFolder(); } action: () => { createFolder(); }
}]; }];
} }
function showMenu(ev: MouseEvent) { function showMenu(ev: MouseEvent) {
os.popupMenu(getMenu(), (ev.currentTarget || ev.target || undefined) as HTMLElement | undefined); os.popupMenu(getMenu(), (ev.currentTarget ?? ev.target ?? undefined) as HTMLElement | undefined);
} }
function onContextmenu(ev: MouseEvent) { function onContextmenu(ev: MouseEvent) {

View File

@ -32,20 +32,20 @@ import MkEmojiPicker from '@/components/emoji-picker.vue';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
withDefaults(defineProps<{ withDefaults(defineProps<{
manualShowing?: boolean; manualShowing?: boolean | null;
src?: HTMLElement; src?: HTMLElement;
showPinned?: boolean; showPinned?: boolean;
asReactionPicker?: boolean; asReactionPicker?: boolean;
}>(), { }>(), {
manualShowing: false, manualShowing: null,
showPinned: true, showPinned: true,
asReactionPicker: false, asReactionPicker: false,
}); });
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'done', v: any): void; (ev: 'done', v: any): void;
(e: 'close'): void; (ev: 'close'): void;
(e: 'closed'): void; (ev: 'closed'): void;
}>(); }>();
const modal = ref<InstanceType<typeof MkModal>>(); const modal = ref<InstanceType<typeof MkModal>>();

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="omfetrab" :class="['w' + width, 'h' + height, { big, asDrawer }]" :style="{ maxHeight: maxHeight ? maxHeight + 'px' : undefined }"> <div class="omfetrab" :class="['w' + width, 'h' + height, { big, asDrawer }]" :style="{ maxHeight: maxHeight ? maxHeight + 'px' : undefined }">
<input ref="search" v-model.trim="q" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" :placeholder="i18n.locale.search" @paste.stop="paste" @keyup.enter="done()"> <input ref="search" v-model.trim="q" class="search" data-prevent-emoji-insert :class="{ filled: q != null && q != '' }" :placeholder="i18n.ts.search" @paste.stop="paste" @keyup.enter="done()">
<div ref="emojis" class="emojis"> <div ref="emojis" class="emojis">
<section class="result"> <section class="result">
<div v-if="searchResultCustom.length > 0"> <div v-if="searchResultCustom.length > 0">
@ -43,7 +43,7 @@
</section> </section>
<section> <section>
<header class="_acrylic"><i class="far fa-clock fa-fw"></i> {{ i18n.locale.recentUsed }}</header> <header class="_acrylic"><i class="far fa-clock fa-fw"></i> {{ i18n.ts.recentUsed }}</header>
<div> <div>
<button v-for="emoji in recentlyUsedEmojis" <button v-for="emoji in recentlyUsedEmojis"
:key="emoji" :key="emoji"
@ -56,11 +56,11 @@
</section> </section>
</div> </div>
<div> <div>
<header class="_acrylic">{{ i18n.locale.customEmojis }}</header> <header class="_acrylic">{{ i18n.ts.customEmojis }}</header>
<XSection v-for="category in customEmojiCategories" :key="'custom:' + category" :initial-shown="false" :emojis="customEmojis.filter(e => e.category === category).map(e => ':' + e.name + ':')" @chosen="chosen">{{ category || i18n.locale.other }}</XSection> <XSection v-for="category in customEmojiCategories" :key="'custom:' + category" :initial-shown="false" :emojis="customEmojis.filter(e => e.category === category).map(e => ':' + e.name + ':')" @chosen="chosen">{{ category || i18n.ts.other }}</XSection>
</div> </div>
<div> <div>
<header class="_acrylic">{{ i18n.locale.emoji }}</header> <header class="_acrylic">{{ i18n.ts.emoji }}</header>
<XSection v-for="category in categories" :emojis="emojilist.filter(e => e.category === category).map(e => e.char)" @chosen="chosen">{{ category }}</XSection> <XSection v-for="category in categories" :emojis="emojilist.filter(e => e.category === category).map(e => e.char)" @chosen="chosen">{{ category }}</XSection>
</div> </div>
</div> </div>
@ -280,7 +280,7 @@ function getKey(emoji: string | Misskey.entities.CustomEmoji | UnicodeEmojiDef):
} }
function chosen(emoji: any, ev?: MouseEvent) { function chosen(emoji: any, ev?: MouseEvent) {
const el = ev && (ev.currentTarget || ev.target) as HTMLElement | null | undefined; const el = ev && (ev.currentTarget ?? ev.target) as HTMLElement | null | undefined;
if (el) { if (el) {
const rect = el.getBoundingClientRect(); const rect = el.getBoundingClientRect();
const x = rect.left + (el.offsetWidth / 2); const x = rect.left + (el.offsetWidth / 2);

View File

@ -6,23 +6,23 @@
> >
<template v-if="!wait"> <template v-if="!wait">
<template v-if="hasPendingFollowRequestFromYou && user.isLocked"> <template v-if="hasPendingFollowRequestFromYou && user.isLocked">
<span v-if="full">{{ i18n.locale.followRequestPending }}</span><i class="fas fa-hourglass-half"></i> <span v-if="full">{{ i18n.ts.followRequestPending }}</span><i class="fas fa-hourglass-half"></i>
</template> </template>
<template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked"> <!-- つまりリモートフォローの場合 --> <template v-else-if="hasPendingFollowRequestFromYou && !user.isLocked"> <!-- つまりリモートフォローの場合 -->
<span v-if="full">{{ i18n.locale.processing }}</span><i class="fas fa-spinner fa-pulse"></i> <span v-if="full">{{ i18n.ts.processing }}</span><i class="fas fa-spinner fa-pulse"></i>
</template> </template>
<template v-else-if="isFollowing"> <template v-else-if="isFollowing">
<span v-if="full">{{ i18n.locale.unfollow }}</span><i class="fas fa-minus"></i> <span v-if="full">{{ i18n.ts.unfollow }}</span><i class="fas fa-minus"></i>
</template> </template>
<template v-else-if="!isFollowing && user.isLocked"> <template v-else-if="!isFollowing && user.isLocked">
<span v-if="full">{{ i18n.locale.followRequest }}</span><i class="fas fa-plus"></i> <span v-if="full">{{ i18n.ts.followRequest }}</span><i class="fas fa-plus"></i>
</template> </template>
<template v-else-if="!isFollowing && !user.isLocked"> <template v-else-if="!isFollowing && !user.isLocked">
<span v-if="full">{{ i18n.locale.follow }}</span><i class="fas fa-plus"></i> <span v-if="full">{{ i18n.ts.follow }}</span><i class="fas fa-plus"></i>
</template> </template>
</template> </template>
<template v-else> <template v-else>
<span v-if="full">{{ i18n.locale.processing }}</span><i class="fas fa-spinner fa-pulse fa-fw"></i> <span v-if="full">{{ i18n.ts.processing }}</span><i class="fas fa-spinner fa-pulse fa-fw"></i>
</template> </template>
</button> </button>
</template> </template>

View File

@ -5,28 +5,28 @@
@close="dialog.close()" @close="dialog.close()"
@closed="emit('closed')" @closed="emit('closed')"
> >
<template #header>{{ i18n.locale.forgotPassword }}</template> <template #header>{{ i18n.ts.forgotPassword }}</template>
<form v-if="instance.enableEmail" class="bafeceda" @submit.prevent="onSubmit"> <form v-if="instance.enableEmail" class="bafeceda" @submit.prevent="onSubmit">
<div class="main _formRoot"> <div class="main _formRoot">
<MkInput v-model="username" class="_formBlock" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required> <MkInput v-model="username" class="_formBlock" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required>
<template #label>{{ i18n.locale.username }}</template> <template #label>{{ i18n.ts.username }}</template>
<template #prefix>@</template> <template #prefix>@</template>
</MkInput> </MkInput>
<MkInput v-model="email" class="_formBlock" type="email" spellcheck="false" required> <MkInput v-model="email" class="_formBlock" type="email" spellcheck="false" required>
<template #label>{{ i18n.locale.emailAddress }}</template> <template #label>{{ i18n.ts.emailAddress }}</template>
<template #caption>{{ i18n.locale._forgotPassword.enterEmail }}</template> <template #caption>{{ i18n.ts._forgotPassword.enterEmail }}</template>
</MkInput> </MkInput>
<MkButton class="_formBlock" type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ i18n.locale.send }}</MkButton> <MkButton class="_formBlock" type="submit" :disabled="processing" primary style="margin: 0 auto;">{{ i18n.ts.send }}</MkButton>
</div> </div>
<div class="sub"> <div class="sub">
<MkA to="/about" class="_link">{{ i18n.locale._forgotPassword.ifNoEmail }}</MkA> <MkA to="/about" class="_link">{{ i18n.ts._forgotPassword.ifNoEmail }}</MkA>
</div> </div>
</form> </form>
<div v-else class="bafecedb"> <div v-else class="bafecedb">
{{ i18n.locale._forgotPassword.contactAdmin }} {{ i18n.ts._forgotPassword.contactAdmin }}
</div> </div>
</XModalWindow> </XModalWindow>
</template> </template>

View File

@ -1,5 +1,5 @@
<template> <template>
<transition name="fade" mode="out-in"> <transition :name="$store.state.animation ? 'fade' : ''" mode="out-in">
<div v-if="pending"> <div v-if="pending">
<MkLoading/> <MkLoading/>
</div> </div>

View File

@ -43,31 +43,31 @@ function onContextmenu(ev) {
text: props.to, text: props.to,
}, { }, {
icon: 'fas fa-window-maximize', icon: 'fas fa-window-maximize',
text: i18n.locale.openInWindow, text: i18n.ts.openInWindow,
action: () => { action: () => {
os.pageWindow(props.to); os.pageWindow(props.to);
} }
}, sideViewHook ? { }, sideViewHook ? {
icon: 'fas fa-columns', icon: 'fas fa-columns',
text: i18n.locale.openInSideView, text: i18n.ts.openInSideView,
action: () => { action: () => {
sideViewHook(props.to); sideViewHook(props.to);
} }
} : undefined, { } : undefined, {
icon: 'fas fa-expand-alt', icon: 'fas fa-expand-alt',
text: i18n.locale.showInPage, text: i18n.ts.showInPage,
action: () => { action: () => {
router.push(props.to); router.push(props.to);
} }
}, null, { }, null, {
icon: 'fas fa-external-link-alt', icon: 'fas fa-external-link-alt',
text: i18n.locale.openInNewTab, text: i18n.ts.openInNewTab,
action: () => { action: () => {
window.open(props.to, '_blank'); window.open(props.to, '_blank');
} }
}, { }, {
icon: 'fas fa-link', icon: 'fas fa-link',
text: i18n.locale.copyLink, text: i18n.ts.copyLink,
action: () => { action: () => {
copyToClipboard(`${url}${props.to}`); copyToClipboard(`${url}${props.to}`);
} }

View File

@ -104,7 +104,7 @@ export default defineComponent({
if (props.info.share) { if (props.info.share) {
if (menu.length > 0) menu.push(null); if (menu.length > 0) menu.push(null);
menu.push({ menu.push({
text: i18n.locale.share, text: i18n.ts.share,
icon: 'fas fa-share-alt', icon: 'fas fa-share-alt',
action: share action: share
}); });
@ -113,7 +113,7 @@ export default defineComponent({
if (menu.length > 0) menu.push(null); if (menu.length > 0) menu.push(null);
menu = menu.concat(props.menu); menu = menu.concat(props.menu);
} }
popupMenu(menu, ev.currentTarget || ev.target); popupMenu(menu, ev.currentTarget ?? ev.target);
}; };
const showTabsPopup = (ev: MouseEvent) => { const showTabsPopup = (ev: MouseEvent) => {
@ -126,7 +126,7 @@ export default defineComponent({
icon: tab.icon, icon: tab.icon,
action: tab.onClick, action: tab.onClick,
})); }));
popupMenu(menu, ev.currentTarget || ev.target); popupMenu(menu, ev.currentTarget ?? ev.target);
}; };
const preventDrag = (ev: TouchEvent) => { const preventDrag = (ev: TouchEvent) => {

View File

@ -24,16 +24,16 @@ let now = $ref(new Date());
const relative = $computed(() => { const relative = $computed(() => {
const ago = (now.getTime() - _time.getTime()) / 1000/*ms*/; const ago = (now.getTime() - _time.getTime()) / 1000/*ms*/;
return ( return (
ago >= 31536000 ? i18n.t('_ago.yearsAgo', { n: (~~(ago / 31536000)).toString() }) : ago >= 31536000 ? i18n.t('_ago.yearsAgo', { n: Math.round(ago / 31536000).toString() }) :
ago >= 2592000 ? i18n.t('_ago.monthsAgo', { n: (~~(ago / 2592000)).toString() }) : ago >= 2592000 ? i18n.t('_ago.monthsAgo', { n: Math.round(ago / 2592000).toString() }) :
ago >= 604800 ? i18n.t('_ago.weeksAgo', { n: (~~(ago / 604800)).toString() }) : ago >= 604800 ? i18n.t('_ago.weeksAgo', { n: Math.round(ago / 604800).toString() }) :
ago >= 86400 ? i18n.t('_ago.daysAgo', { n: (~~(ago / 86400)).toString() }) : ago >= 86400 ? i18n.t('_ago.daysAgo', { n: Math.round(ago / 86400).toString() }) :
ago >= 3600 ? i18n.t('_ago.hoursAgo', { n: (~~(ago / 3600)).toString() }) : ago >= 3600 ? i18n.t('_ago.hoursAgo', { n: Math.round(ago / 3600).toString() }) :
ago >= 60 ? i18n.t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) : ago >= 60 ? i18n.t('_ago.minutesAgo', { n: (~~(ago / 60)).toString() }) :
ago >= 10 ? i18n.t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) : ago >= 10 ? i18n.t('_ago.secondsAgo', { n: (~~(ago % 60)).toString() }) :
ago >= -1 ? i18n.locale._ago.justNow : ago >= -1 ? i18n.ts._ago.justNow :
ago < -1 ? i18n.locale._ago.future : ago < -1 ? i18n.ts._ago.future :
i18n.locale._ago.unknown); i18n.ts._ago.unknown);
}); });
function tick() { function tick() {

View File

@ -20,52 +20,32 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from 'vue'; import { watch } from 'vue';
import * as misskey from 'misskey-js';
import { getStaticImageUrl } from '@/scripts/get-static-image-url'; import { getStaticImageUrl } from '@/scripts/get-static-image-url';
import ImgWithBlurhash from '@/components/img-with-blurhash.vue'; import ImgWithBlurhash from '@/components/img-with-blurhash.vue';
import * as os from '@/os'; import { defaultStore } from '@/store';
export default defineComponent({ const props = defineProps<{
components: { image: misskey.entities.DriveFile;
ImgWithBlurhash raw?: boolean;
}, }>();
props: {
image: {
type: Object,
required: true
},
raw: {
default: false
}
},
data() {
return {
hide: true,
};
},
computed: {
url(): any {
let url = this.$store.state.disableShowingAnimatedImages
? getStaticImageUrl(this.image.thumbnailUrl)
: this.image.thumbnailUrl;
if (this.raw || this.$store.state.loadRawImages) { let hide = $ref(true);
url = this.image.url;
}
return url; const url = (props.raw || defaultStore.state.loadRawImages)
} ? props.image.url
}, : defaultStore.state.disableShowingAnimatedImages
created() { ? getStaticImageUrl(props.image.thumbnailUrl)
// Plugin:register_note_view_interruptor 使watch : props.image.thumbnailUrl;
this.$watch('image', () => {
this.hide = (this.$store.state.nsfw === 'force') ? true : this.image.isSensitive && (this.$store.state.nsfw !== 'ignore'); // Plugin:register_note_view_interruptor 使watch
}, { watch(() => props.image, () => {
deep: true, hide = (defaultStore.state.nsfw === 'force') ? true : props.image.isSensitive && (defaultStore.state.nsfw !== 'ignore');
immediate: true, }, {
}); deep: true,
}, immediate: true,
}); });
</script> </script>

View File

@ -3,7 +3,7 @@
<XBanner v-for="media in mediaList.filter(media => !previewable(media))" :key="media.id" :media="media"/> <XBanner v-for="media in mediaList.filter(media => !previewable(media))" :key="media.id" :media="media"/>
<div v-if="mediaList.filter(media => previewable(media)).length > 0" class="gird-container"> <div v-if="mediaList.filter(media => previewable(media)).length > 0" class="gird-container">
<div ref="gallery" :data-count="mediaList.filter(media => previewable(media)).length"> <div ref="gallery" :data-count="mediaList.filter(media => previewable(media)).length">
<template v-for="media in mediaList"> <template v-for="media in mediaList.filter(media => previewable(media))">
<XVideo v-if="media.type.startsWith('video')" :key="media.id" :video="media"/> <XVideo v-if="media.type.startsWith('video')" :key="media.id" :video="media"/>
<XImage v-else-if="media.type.startsWith('image')" :key="media.id" class="image" :data-id="media.id" :image="media" :raw="raw"/> <XImage v-else-if="media.type.startsWith('image')" :key="media.id" class="image" :data-id="media.id" :image="media" :raw="raw"/>
</template> </template>
@ -12,8 +12,8 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, onMounted, PropType, ref } from 'vue'; import { onMounted, ref } from 'vue';
import * as misskey from 'misskey-js'; import * as misskey from 'misskey-js';
import PhotoSwipeLightbox from 'photoswipe/dist/photoswipe-lightbox.esm.js'; import PhotoSwipeLightbox from 'photoswipe/dist/photoswipe-lightbox.esm.js';
import PhotoSwipe from 'photoswipe/dist/photoswipe.esm.js'; import PhotoSwipe from 'photoswipe/dist/photoswipe.esm.js';
@ -22,93 +22,83 @@ import XBanner from './media-banner.vue';
import XImage from './media-image.vue'; import XImage from './media-image.vue';
import XVideo from './media-video.vue'; import XVideo from './media-video.vue';
import * as os from '@/os'; import * as os from '@/os';
import { FILE_TYPE_BROWSERSAFE } from '@/const';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
export default defineComponent({ const props = defineProps<{
components: { mediaList: misskey.entities.DriveFile[];
XBanner, raw?: boolean;
XImage, }>();
XVideo,
},
props: {
mediaList: {
type: Array as PropType<misskey.entities.DriveFile[]>,
required: true,
},
raw: {
default: false
},
},
setup(props) {
const gallery = ref(null);
onMounted(() => { const gallery = ref(null);
const lightbox = new PhotoSwipeLightbox({ const pswpZIndex = os.claimZIndex('middle');
dataSource: props.mediaList.filter(media => media.type.startsWith('image')).map(media => {
const item = {
src: media.url,
w: media.properties.width,
h: media.properties.height,
alt: media.name,
};
if (media.properties.orientation != null && media.properties.orientation >= 5) {
[item.w, item.h] = [item.h, item.w];
}
return item;
}),
gallery: gallery.value,
children: '.image',
thumbSelector: '.image',
loop: false,
padding: window.innerWidth > 500 ? {
top: 32,
bottom: 32,
left: 32,
right: 32,
} : {
top: 0,
bottom: 0,
left: 0,
right: 0,
},
imageClickAction: 'close',
tapAction: 'toggle-controls',
pswpModule: PhotoSwipe,
});
lightbox.on('itemData', (e) => { onMounted(() => {
const { itemData } = e; const lightbox = new PhotoSwipeLightbox({
dataSource: props.mediaList
// element is children .filter(media => {
const { element } = itemData; if (media.type === 'image/svg+xml') return true; // svgwebpublicpngtrue
return media.type.startsWith('image') && FILE_TYPE_BROWSERSAFE.includes(media.type);
const id = element.dataset.id; })
const file = props.mediaList.find(media => media.id === id); .map(media => {
const item = {
itemData.src = file.url; src: media.url,
itemData.w = Number(file.properties.width); w: media.properties.width,
itemData.h = Number(file.properties.height); h: media.properties.height,
if (file.properties.orientation != null && file.properties.orientation >= 5) { alt: media.name,
[itemData.w, itemData.h] = [itemData.h, itemData.w]; };
if (media.properties.orientation != null && media.properties.orientation >= 5) {
[item.w, item.h] = [item.h, item.w];
} }
itemData.msrc = file.thumbnailUrl; return item;
itemData.thumbCropped = true; }),
}); gallery: gallery.value,
children: '.image',
thumbSelector: '.image',
loop: false,
padding: window.innerWidth > 500 ? {
top: 32,
bottom: 32,
left: 32,
right: 32,
} : {
top: 0,
bottom: 0,
left: 0,
right: 0,
},
imageClickAction: 'close',
tapAction: 'toggle-controls',
pswpModule: PhotoSwipe,
});
lightbox.init(); lightbox.on('itemData', (ev) => {
}); const { itemData } = ev;
const previewable = (file: misskey.entities.DriveFile): boolean => { // element is children
return file.type.startsWith('video') || file.type.startsWith('image'); const { element } = itemData;
};
return { const id = element.dataset.id;
previewable, const file = props.mediaList.find(media => media.id === id);
gallery,
pswpZIndex: os.claimZIndex('middle'), itemData.src = file.url;
}; itemData.w = Number(file.properties.width);
}, itemData.h = Number(file.properties.height);
if (file.properties.orientation != null && file.properties.orientation >= 5) {
[itemData.w, itemData.h] = [itemData.h, itemData.w];
}
itemData.msrc = file.thumbnailUrl;
itemData.thumbCropped = true;
});
lightbox.init();
}); });
const previewable = (file: misskey.entities.DriveFile): boolean => {
if (file.type === 'image/svg+xml') return true; // svgwebpublic/thumbnailpngtrue
// FILE_TYPE_BROWSERSAFE
return (file.type.startsWith('video') || file.type.startsWith('image')) && FILE_TYPE_BROWSERSAFE.includes(file.type);
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -250,7 +250,7 @@ function menu(viaKeyboard = false): void {
function showRenoteMenu(viaKeyboard = false): void { function showRenoteMenu(viaKeyboard = false): void {
if (!isMyRenote) return; if (!isMyRenote) return;
os.popupMenu([{ os.popupMenu([{
text: i18n.locale.unrenote, text: i18n.ts.unrenote,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
danger: true, danger: true,
action: () => { action: () => {

View File

@ -10,13 +10,13 @@
:class="{ renote: isRenote }" :class="{ renote: isRenote }"
> >
<MkNoteSub v-if="appearNote.reply" :note="appearNote.reply" class="reply-to"/> <MkNoteSub v-if="appearNote.reply" :note="appearNote.reply" class="reply-to"/>
<div v-if="pinned" class="info"><i class="fas fa-thumbtack"></i> {{ i18n.locale.pinnedNote }}</div> <div v-if="pinned" class="info"><i class="fas fa-thumbtack"></i> {{ i18n.ts.pinnedNote }}</div>
<div v-if="appearNote._prId_" class="info"><i class="fas fa-bullhorn"></i> {{ i18n.locale.promotion }}<button class="_textButton hide" @click="readPromo()">{{ i18n.locale.hideThisNote }} <i class="fas fa-times"></i></button></div> <div v-if="appearNote._prId_" class="info"><i class="fas fa-bullhorn"></i> {{ i18n.ts.promotion }}<button class="_textButton hide" @click="readPromo()">{{ i18n.ts.hideThisNote }} <i class="fas fa-times"></i></button></div>
<div v-if="appearNote._featuredId_" class="info"><i class="fas fa-bolt"></i> {{ i18n.locale.featured }}</div> <div v-if="appearNote._featuredId_" class="info"><i class="fas fa-bolt"></i> {{ i18n.ts.featured }}</div>
<div v-if="isRenote" class="renote"> <div v-if="isRenote" class="renote">
<MkAvatar class="avatar" :user="note.user"/> <MkAvatar class="avatar" :user="note.user"/>
<i class="fas fa-retweet"></i> <i class="fas fa-retweet"></i>
<I18n :src="i18n.locale.renotedBy" tag="span"> <I18n :src="i18n.ts.renotedBy" tag="span">
<template #user> <template #user>
<MkA v-user-preview="note.userId" class="name" :to="userPage(note.user)"> <MkA v-user-preview="note.userId" class="name" :to="userPage(note.user)">
<MkUserName :user="note.user"/> <MkUserName :user="note.user"/>
@ -48,7 +48,7 @@
</p> </p>
<div v-show="appearNote.cw == null || showContent" class="content" :class="{ collapsed }"> <div v-show="appearNote.cw == null || showContent" class="content" :class="{ collapsed }">
<div class="text"> <div class="text">
<span v-if="appearNote.isHidden" style="opacity: 0.5">({{ i18n.locale.private }})</span> <span v-if="appearNote.isHidden" style="opacity: 0.5">({{ i18n.ts.private }})</span>
<MkA v-if="appearNote.replyId" class="reply" :to="`/notes/${appearNote.replyId}`"><i class="fas fa-reply"></i></MkA> <MkA v-if="appearNote.replyId" class="reply" :to="`/notes/${appearNote.replyId}`"><i class="fas fa-reply"></i></MkA>
<Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/> <Mfm v-if="appearNote.text" :text="appearNote.text" :author="appearNote.user" :i="$i" :custom-emojis="appearNote.emojis"/>
<a v-if="appearNote.renote != null" class="rp">RN:</a> <a v-if="appearNote.renote != null" class="rp">RN:</a>
@ -67,7 +67,7 @@
<MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="false" class="url-preview"/> <MkUrlPreview v-for="url in urls" :key="url" :url="url" :compact="true" :detail="false" class="url-preview"/>
<div v-if="appearNote.renote" class="renote"><XNoteSimple :note="appearNote.renote"/></div> <div v-if="appearNote.renote" class="renote"><XNoteSimple :note="appearNote.renote"/></div>
<button v-if="collapsed" class="fade _button" @click="collapsed = false"> <button v-if="collapsed" class="fade _button" @click="collapsed = false">
<span>{{ i18n.locale.showMore }}</span> <span>{{ i18n.ts.showMore }}</span>
</button> </button>
</div> </div>
<MkA v-if="appearNote.channel && !inChannel" class="channel" :to="`/channels/${appearNote.channel.id}`"><i class="fas fa-satellite-dish"></i> {{ appearNote.channel.name }}</MkA> <MkA v-if="appearNote.channel && !inChannel" class="channel" :to="`/channels/${appearNote.channel.id}`"><i class="fas fa-satellite-dish"></i> {{ appearNote.channel.name }}</MkA>
@ -94,7 +94,7 @@
</article> </article>
</div> </div>
<div v-else class="muted" @click="muted = false"> <div v-else class="muted" @click="muted = false">
<I18n :src="i18n.locale.userSaysSomething" tag="small"> <I18n :src="i18n.ts.userSaysSomething" tag="small">
<template #name> <template #name>
<MkA v-user-preview="appearNote.userId" class="name" :to="userPage(appearNote.user)"> <MkA v-user-preview="appearNote.userId" class="name" :to="userPage(appearNote.user)">
<MkUserName :user="appearNote.user"/> <MkUserName :user="appearNote.user"/>
@ -238,7 +238,7 @@ function menu(viaKeyboard = false): void {
function showRenoteMenu(viaKeyboard = false): void { function showRenoteMenu(viaKeyboard = false): void {
if (!isMyRenote) return; if (!isMyRenote) return;
os.popupMenu([{ os.popupMenu([{
text: i18n.locale.unrenote, text: i18n.ts.unrenote,
icon: 'fas fa-trash-alt', icon: 'fas fa-trash-alt',
danger: true, danger: true,
action: () => { action: () => {

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="mk-notification-toast" :style="{ zIndex }"> <div class="mk-notification-toast" :style="{ zIndex }">
<transition name="notification-toast" appear @after-leave="$emit('closed')"> <transition :name="$store.state.animation ? 'notification-toast' : ''" appear @after-leave="$emit('closed')">
<XNotification v-if="showing" :notification="notification" class="notification _acrylic"/> <XNotification v-if="showing" :notification="notification" class="notification _acrylic"/>
</transition> </transition>
</div> </div>

View File

@ -160,7 +160,7 @@ export default defineComponent({
action: () => { action: () => {
copyToClipboard(this.url); copyToClipboard(this.url);
} }
}], ev.currentTarget || ev.target); }], ev.currentTarget ?? ev.target);
}, },
back() { back() {

View File

@ -3,7 +3,7 @@
<p v-if="choices.length < 2" class="caution"> <p v-if="choices.length < 2" class="caution">
<i class="fas fa-exclamation-triangle"></i>{{ $ts._poll.noOnlyOneChoice }} <i class="fas fa-exclamation-triangle"></i>{{ $ts._poll.noOnlyOneChoice }}
</p> </p>
<ul ref="choices"> <ul>
<li v-for="(choice, i) in choices" :key="i"> <li v-for="(choice, i) in choices" :key="i">
<MkInput class="input" :model-value="choice" :placeholder="$t('_poll.choiceN', { n: i + 1 })" @update:modelValue="onInput(i, $event)"> <MkInput class="input" :model-value="choice" :placeholder="$t('_poll.choiceN', { n: i + 1 })" @update:modelValue="onInput(i, $event)">
</MkInput> </MkInput>
@ -14,8 +14,8 @@
</ul> </ul>
<MkButton v-if="choices.length < 10" class="add" @click="add">{{ $ts.add }}</MkButton> <MkButton v-if="choices.length < 10" class="add" @click="add">{{ $ts.add }}</MkButton>
<MkButton v-else class="add" disabled>{{ $ts._poll.noMore }}</MkButton> <MkButton v-else class="add" disabled>{{ $ts._poll.noMore }}</MkButton>
<MkSwitch v-model="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
<section> <section>
<MkSwitch v-model="multiple">{{ $ts._poll.canMultipleVote }}</MkSwitch>
<div> <div>
<MkSelect v-model="expiration"> <MkSelect v-model="expiration">
<template #label>{{ $ts._poll.expiration }}</template> <template #label>{{ $ts._poll.expiration }}</template>
@ -31,7 +31,7 @@
<template #label>{{ $ts._poll.deadlineTime }}</template> <template #label>{{ $ts._poll.deadlineTime }}</template>
</MkInput> </MkInput>
</section> </section>
<section v-if="expiration === 'after'"> <section v-else-if="expiration === 'after'">
<MkInput v-model="after" type="number" class="input"> <MkInput v-model="after" type="number" class="input">
<template #label>{{ $ts._poll.duration }}</template> <template #label>{{ $ts._poll.duration }}</template>
</MkInput> </MkInput>
@ -47,8 +47,8 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent } from 'vue'; import { ref, watch } from 'vue';
import { addTime } from '@/scripts/time'; import { addTime } from '@/scripts/time';
import { formatDateTimeString } from '@/scripts/format-time-string'; import { formatDateTimeString } from '@/scripts/format-time-string';
import MkInput from './form/input.vue'; import MkInput from './form/input.vue';
@ -56,131 +56,91 @@ import MkSelect from './form/select.vue';
import MkSwitch from './form/switch.vue'; import MkSwitch from './form/switch.vue';
import MkButton from './ui/button.vue'; import MkButton from './ui/button.vue';
export default defineComponent({ const props = defineProps<{
components: { modelValue: {
MkInput, expiresAt: string;
MkSelect, expiredAfter: number;
MkSwitch, choices: string[];
MkButton, multiple: boolean;
}, };
}>();
const emit = defineEmits<{
(ev: 'update:modelValue', v: {
expiresAt: string;
expiredAfter: number;
choices: string[];
multiple: boolean;
}): void;
}>();
props: { const choices = ref(props.modelValue.choices);
poll: { const multiple = ref(props.modelValue.multiple);
type: Object, const expiration = ref('infinite');
required: true const atDate = ref(formatDateTimeString(addTime(new Date(), 1, 'day'), 'yyyy-MM-dd'));
const atTime = ref('00:00');
const after = ref(0);
const unit = ref('second');
if (props.modelValue.expiresAt) {
expiration.value = 'at';
atDate.value = atTime.value = props.modelValue.expiresAt;
} else if (typeof props.modelValue.expiredAfter === 'number') {
expiration.value = 'after';
after.value = props.modelValue.expiredAfter / 1000;
} else {
expiration.value = 'infinite';
}
function onInput(i, value) {
choices.value[i] = value;
}
function add() {
choices.value.push('');
// TODO
// nextTick(() => {
// (this.$refs.choices as any).childNodes[this.choices.length - 1].childNodes[0].focus();
// });
}
function remove(i) {
choices.value = choices.value.filter((_, _i) => _i != i);
}
function get() {
const calcAt = () => {
return new Date(`${atDate.value} ${atTime.value}`).getTime();
};
const calcAfter = () => {
let base = parseInt(after.value);
switch (unit.value) {
case 'day': base *= 24;
case 'hour': base *= 60;
case 'minute': base *= 60;
case 'second': return base *= 1000;
default: return null;
} }
}, };
emits: ['updated'], return {
choices: choices.value,
multiple: multiple.value,
...(
expiration.value === 'at' ? { expiresAt: calcAt() } :
expiration.value === 'after' ? { expiredAfter: calcAfter() } : {}
)
};
}
data() { watch([choices, multiple, expiration, atDate, atTime, after, unit], () => emit('update:modelValue', get()), {
return { deep: true,
choices: this.poll.choices,
multiple: this.poll.multiple,
expiration: 'infinite',
atDate: formatDateTimeString(addTime(new Date(), 1, 'day'), 'yyyy-MM-dd'),
atTime: '00:00',
after: 0,
unit: 'second',
};
},
watch: {
choices: {
handler() {
this.$emit('updated', this.get());
},
deep: true
},
multiple: {
handler() {
this.$emit('updated', this.get());
},
},
expiration: {
handler() {
this.$emit('updated', this.get());
},
},
atDate: {
handler() {
this.$emit('updated', this.get());
},
},
after: {
handler() {
this.$emit('updated', this.get());
},
},
unit: {
handler() {
this.$emit('updated', this.get());
},
},
},
created() {
const poll = this.poll;
if (poll.expiresAt) {
this.expiration = 'at';
this.atDate = this.atTime = poll.expiresAt;
} else if (typeof poll.expiredAfter === 'number') {
this.expiration = 'after';
this.after = poll.expiredAfter / 1000;
} else {
this.expiration = 'infinite';
}
},
methods: {
onInput(i, e) {
this.choices[i] = e;
},
add() {
this.choices.push('');
this.$nextTick(() => {
// TODO
//(this.$refs.choices as any).childNodes[this.choices.length - 1].childNodes[0].focus();
});
},
remove(i) {
this.choices = this.choices.filter((_, _i) => _i != i);
},
get() {
const at = () => {
return new Date(`${this.atDate} ${this.atTime}`).getTime();
};
const after = () => {
let base = parseInt(this.after);
switch (this.unit) {
case 'day': base *= 24;
case 'hour': base *= 60;
case 'minute': base *= 60;
case 'second': return base *= 1000;
default: return null;
}
};
return {
choices: this.choices,
multiple: this.multiple,
...(
this.expiration === 'at' ? { expiresAt: at() } :
this.expiration === 'after' ? { expiredAfter: after() } : {}
)
};
},
}
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.zmdxowus { .zmdxowus {
padding: 8px; padding: 8px 16px;
> .caution { > .caution {
margin: 0 0 8px 0; margin: 0 0 8px 0;
@ -216,7 +176,7 @@ export default defineComponent({
} }
> .add { > .add {
margin: 8px 0 0 0; margin: 8px 0;
z-index: 1; z-index: 1;
} }
@ -225,21 +185,27 @@ export default defineComponent({
> div { > div {
margin: 0 8px; margin: 0 8px;
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 12px;
&:last-child { &:last-child {
flex: 1 0 auto; flex: 1 0 auto;
> section { > div {
align-items: center; flex-grow: 1;
display: flex; }
margin: -32px 0 0;
> &:first-child { > section {
margin-right: 16px; // MAGIC: Prevent div above from growing unless wrapped to its own line
} flex-grow: 9999;
align-items: end;
display: flex;
gap: 4px;
> .input { > .input {
flex: 1 0 auto; flex: 1 1 auto;
} }
} }
} }

View File

@ -127,7 +127,7 @@ export default defineComponent({
text: this.$ts.attachCancel, text: this.$ts.attachCancel,
icon: 'fas fa-times-circle', icon: 'fas fa-times-circle',
action: () => { this.detachMedia(file.id) } action: () => { this.detachMedia(file.id) }
}], ev.currentTarget || ev.target).then(() => this.menu = null); }], ev.currentTarget ?? ev.target).then(() => this.menu = null);
} }
} }
}); });

View File

@ -8,28 +8,28 @@
> >
<header> <header>
<button v-if="!fixed" class="cancel _button" @click="cancel"><i class="fas fa-times"></i></button> <button v-if="!fixed" class="cancel _button" @click="cancel"><i class="fas fa-times"></i></button>
<button v-click-anime v-tooltip="i18n.locale.switchAccount" class="account _button" @click="openAccountMenu"> <button v-click-anime v-tooltip="i18n.ts.switchAccount" class="account _button" @click="openAccountMenu">
<MkAvatar :user="postAccount ?? $i" class="avatar"/> <MkAvatar :user="postAccount ?? $i" class="avatar"/>
</button> </button>
<div> <div>
<span class="text-count" :class="{ over: textLength > maxTextLength }">{{ maxTextLength - textLength }}</span> <span class="text-count" :class="{ over: textLength > maxTextLength }">{{ maxTextLength - textLength }}</span>
<span v-if="localOnly" class="local-only"><i class="fas fa-biohazard"></i></span> <span v-if="localOnly" class="local-only"><i class="fas fa-biohazard"></i></span>
<button ref="visibilityButton" v-tooltip="i18n.locale.visibility" class="_button visibility" :disabled="channel != null" @click="setVisibility"> <button ref="visibilityButton" v-tooltip="i18n.ts.visibility" class="_button visibility" :disabled="channel != null" @click="setVisibility">
<span v-if="visibility === 'public'"><i class="fas fa-globe"></i></span> <span v-if="visibility === 'public'"><i class="fas fa-globe"></i></span>
<span v-if="visibility === 'home'"><i class="fas fa-home"></i></span> <span v-if="visibility === 'home'"><i class="fas fa-home"></i></span>
<span v-if="visibility === 'followers'"><i class="fas fa-unlock"></i></span> <span v-if="visibility === 'followers'"><i class="fas fa-unlock"></i></span>
<span v-if="visibility === 'specified'"><i class="fas fa-envelope"></i></span> <span v-if="visibility === 'specified'"><i class="fas fa-envelope"></i></span>
</button> </button>
<button v-tooltip="i18n.locale.previewNoteText" class="_button preview" :class="{ active: showPreview }" @click="showPreview = !showPreview"><i class="fas fa-file-code"></i></button> <button v-tooltip="i18n.ts.previewNoteText" class="_button preview" :class="{ active: showPreview }" @click="showPreview = !showPreview"><i class="fas fa-file-code"></i></button>
<button class="submit _buttonGradate" :disabled="!canPost" data-cy-open-post-form-submit @click="post">{{ submitText }}<i :class="reply ? 'fas fa-reply' : renote ? 'fas fa-quote-right' : 'fas fa-paper-plane'"></i></button> <button class="submit _buttonGradate" :disabled="!canPost" data-cy-open-post-form-submit @click="post">{{ submitText }}<i :class="reply ? 'fas fa-reply' : renote ? 'fas fa-quote-right' : 'fas fa-paper-plane'"></i></button>
</div> </div>
</header> </header>
<div class="form" :class="{ fixed }"> <div class="form" :class="{ fixed }">
<XNoteSimple v-if="reply" class="preview" :note="reply"/> <XNoteSimple v-if="reply" class="preview" :note="reply"/>
<XNoteSimple v-if="renote" class="preview" :note="renote"/> <XNoteSimple v-if="renote" class="preview" :note="renote"/>
<div v-if="quoteId" class="with-quote"><i class="fas fa-quote-left"></i> {{ i18n.locale.quoteAttached }}<button @click="quoteId = null"><i class="fas fa-times"></i></button></div> <div v-if="quoteId" class="with-quote"><i class="fas fa-quote-left"></i> {{ i18n.ts.quoteAttached }}<button @click="quoteId = null"><i class="fas fa-times"></i></button></div>
<div v-if="visibility === 'specified'" class="to-specified"> <div v-if="visibility === 'specified'" class="to-specified">
<span style="margin-right: 8px;">{{ i18n.locale.recipient }}</span> <span style="margin-right: 8px;">{{ i18n.ts.recipient }}</span>
<div class="visibleUsers"> <div class="visibleUsers">
<span v-for="u in visibleUsers" :key="u.id"> <span v-for="u in visibleUsers" :key="u.id">
<MkAcct :user="u"/> <MkAcct :user="u"/>
@ -38,21 +38,21 @@
<button class="_buttonPrimary" @click="addVisibleUser"><i class="fas fa-plus fa-fw"></i></button> <button class="_buttonPrimary" @click="addVisibleUser"><i class="fas fa-plus fa-fw"></i></button>
</div> </div>
</div> </div>
<MkInfo v-if="hasNotSpecifiedMentions" warn class="hasNotSpecifiedMentions">{{ i18n.locale.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ i18n.locale.add }}</button></MkInfo> <MkInfo v-if="hasNotSpecifiedMentions" warn class="hasNotSpecifiedMentions">{{ i18n.ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ i18n.ts.add }}</button></MkInfo>
<input v-show="useCw" ref="cwInputEl" v-model="cw" class="cw" :placeholder="i18n.locale.annotation" @keydown="onKeydown"> <input v-show="useCw" ref="cwInputEl" v-model="cw" class="cw" :placeholder="i18n.ts.annotation" @keydown="onKeydown">
<textarea ref="textareaEl" v-model="text" class="text" :class="{ withCw: useCw }" :disabled="posting" :placeholder="placeholder" data-cy-post-form-text @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd"/> <textarea ref="textareaEl" v-model="text" class="text" :class="{ withCw: useCw }" :disabled="posting" :placeholder="placeholder" data-cy-post-form-text @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd"/>
<input v-show="withHashtags" ref="hashtagsInputEl" v-model="hashtags" class="hashtags" :placeholder="i18n.locale.hashtags" list="hashtags"> <input v-show="withHashtags" ref="hashtagsInputEl" v-model="hashtags" class="hashtags" :placeholder="i18n.ts.hashtags" list="hashtags">
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/> <XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
<XPollEditor v-if="poll" :poll="poll" @destroyed="poll = null" @updated="onPollUpdate"/> <XPollEditor v-if="poll" v-model="poll" @destroyed="poll = null"/>
<XNotePreview v-if="showPreview" class="preview" :text="text"/> <XNotePreview v-if="showPreview" class="preview" :text="text"/>
<footer> <footer>
<button v-tooltip="i18n.locale.attachFile" class="_button" @click="chooseFileFrom"><i class="fas fa-photo-video"></i></button> <button v-tooltip="i18n.ts.attachFile" class="_button" @click="chooseFileFrom"><i class="fas fa-photo-video"></i></button>
<button v-tooltip="i18n.locale.poll" class="_button" :class="{ active: poll }" @click="togglePoll"><i class="fas fa-poll-h"></i></button> <button v-tooltip="i18n.ts.poll" class="_button" :class="{ active: poll }" @click="togglePoll"><i class="fas fa-poll-h"></i></button>
<button v-tooltip="i18n.locale.useCw" class="_button" :class="{ active: useCw }" @click="useCw = !useCw"><i class="fas fa-eye-slash"></i></button> <button v-tooltip="i18n.ts.useCw" class="_button" :class="{ active: useCw }" @click="useCw = !useCw"><i class="fas fa-eye-slash"></i></button>
<button v-tooltip="i18n.locale.mention" class="_button" @click="insertMention"><i class="fas fa-at"></i></button> <button v-tooltip="i18n.ts.mention" class="_button" @click="insertMention"><i class="fas fa-at"></i></button>
<button v-tooltip="i18n.locale.hashtags" class="_button" :class="{ active: withHashtags }" @click="withHashtags = !withHashtags"><i class="fas fa-hashtag"></i></button> <button v-tooltip="i18n.ts.hashtags" class="_button" :class="{ active: withHashtags }" @click="withHashtags = !withHashtags"><i class="fas fa-hashtag"></i></button>
<button v-tooltip="i18n.locale.emoji" class="_button" @click="insertEmoji"><i class="fas fa-laugh-squint"></i></button> <button v-tooltip="i18n.ts.emoji" class="_button" @click="insertEmoji"><i class="fas fa-laugh-squint"></i></button>
<button v-if="postFormActions.length > 0" v-tooltip="i18n.locale.plugin" class="_button" @click="showActions"><i class="fas fa-plug"></i></button> <button v-if="postFormActions.length > 0" v-tooltip="i18n.ts.plugin" class="_button" @click="showActions"><i class="fas fa-plug"></i></button>
</footer> </footer>
<datalist id="hashtags"> <datalist id="hashtags">
<option v-for="hashtag in recentHashtags" :key="hashtag" :value="hashtag"/> <option v-for="hashtag in recentHashtags" :key="hashtag" :value="hashtag"/>
@ -102,7 +102,7 @@ const props = withDefaults(defineProps<{
initialLocalOnly?: boolean; initialLocalOnly?: boolean;
initialVisibleUsers?: misskey.entities.User[]; initialVisibleUsers?: misskey.entities.User[];
initialNote?: misskey.entities.Note; initialNote?: misskey.entities.Note;
share?: boolean; instant?: boolean;
fixed?: boolean; fixed?: boolean;
autofocus?: boolean; autofocus?: boolean;
}>(), { }>(), {
@ -111,9 +111,9 @@ const props = withDefaults(defineProps<{
}); });
const emit = defineEmits<{ const emit = defineEmits<{
(e: 'posted'): void; (ev: 'posted'): void;
(e: 'cancel'): void; (ev: 'cancel'): void;
(e: 'esc'): void; (ev: 'esc'): void;
}>(); }>();
const textareaEl = $ref<HTMLTextAreaElement | null>(null); const textareaEl = $ref<HTMLTextAreaElement | null>(null);
@ -127,8 +127,8 @@ let files = $ref(props.initialFiles ?? []);
let poll = $ref<{ let poll = $ref<{
choices: string[]; choices: string[];
multiple: boolean; multiple: boolean;
expiresAt: string; expiresAt: string | null;
expiredAfter: string; expiredAfter: string | null;
} | null>(null); } | null>(null);
let useCw = $ref(false); let useCw = $ref(false);
let showPreview = $ref(false); let showPreview = $ref(false);
@ -165,19 +165,19 @@ const draftKey = $computed((): string => {
const placeholder = $computed((): string => { const placeholder = $computed((): string => {
if (props.renote) { if (props.renote) {
return i18n.locale._postForm.quotePlaceholder; return i18n.ts._postForm.quotePlaceholder;
} else if (props.reply) { } else if (props.reply) {
return i18n.locale._postForm.replyPlaceholder; return i18n.ts._postForm.replyPlaceholder;
} else if (props.channel) { } else if (props.channel) {
return i18n.locale._postForm.channelPlaceholder; return i18n.ts._postForm.channelPlaceholder;
} else { } else {
const xs = [ const xs = [
i18n.locale._postForm._placeholders.a, i18n.ts._postForm._placeholders.a,
i18n.locale._postForm._placeholders.b, i18n.ts._postForm._placeholders.b,
i18n.locale._postForm._placeholders.c, i18n.ts._postForm._placeholders.c,
i18n.locale._postForm._placeholders.d, i18n.ts._postForm._placeholders.d,
i18n.locale._postForm._placeholders.e, i18n.ts._postForm._placeholders.e,
i18n.locale._postForm._placeholders.f i18n.ts._postForm._placeholders.f
]; ];
return xs[Math.floor(Math.random() * xs.length)]; return xs[Math.floor(Math.random() * xs.length)];
} }
@ -185,10 +185,10 @@ const placeholder = $computed((): string => {
const submitText = $computed((): string => { const submitText = $computed((): string => {
return props.renote return props.renote
? i18n.locale.quote ? i18n.ts.quote
: props.reply : props.reply
? i18n.locale.reply ? i18n.ts.reply
: i18n.locale.note; : i18n.ts.note;
}); });
const textLength = $computed((): number => { const textLength = $computed((): number => {
@ -342,7 +342,7 @@ function focus() {
} }
function chooseFileFrom(ev) { function chooseFileFrom(ev) {
selectFiles(ev.currentTarget || ev.target, i18n.locale.attachFile).then(files_ => { selectFiles(ev.currentTarget ?? ev.target, i18n.ts.attachFile).then(files_ => {
for (const file of files_) { for (const file of files_) {
files.push(file); files.push(file);
} }
@ -371,11 +371,6 @@ function upload(file: File, name?: string) {
}); });
} }
function onPollUpdate(poll) {
poll = poll;
saveDraft();
}
function setVisibility() { function setVisibility() {
if (props.channel) { if (props.channel) {
// TODO: information dialog // TODO: information dialog
@ -452,7 +447,7 @@ async function onPaste(e: ClipboardEvent) {
os.confirm({ os.confirm({
type: 'info', type: 'info',
text: i18n.locale.quoteQuestion, text: i18n.ts.quoteQuestion,
}).then(({ canceled }) => { }).then(({ canceled }) => {
if (canceled) { if (canceled) {
insertTextAtCursor(textareaEl, paste); insertTextAtCursor(textareaEl, paste);
@ -597,7 +592,7 @@ function insertMention() {
} }
async function insertEmoji(ev: MouseEvent) { async function insertEmoji(ev: MouseEvent) {
os.openEmojiPicker(ev.currentTarget || ev.target, {}, textareaEl); os.openEmojiPicker(ev.currentTarget ?? ev.target, {}, textareaEl);
} }
function showActions(ev) { function showActions(ev) {
@ -610,7 +605,7 @@ function showActions(ev) {
if (key === 'text') { text = value; } if (key === 'text') { text = value; }
}); });
} }
})), ev.currentTarget || ev.target); })), ev.currentTarget ?? ev.target);
} }
let postAccount = $ref<misskey.entities.UserDetailed | null>(null); let postAccount = $ref<misskey.entities.UserDetailed | null>(null);
@ -646,7 +641,7 @@ onMounted(() => {
nextTick(() => { nextTick(() => {
// 稿 // 稿
if (!props.share && !props.mention && !props.specified) { if (!props.instant && !props.mention && !props.specified) {
const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[draftKey]; const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[draftKey];
if (draft) { if (draft) {
text = draft.data.text; text = draft.data.text;

View File

@ -59,7 +59,7 @@ export default defineComponent({
const renote = (viaKeyboard = false) => { const renote = (viaKeyboard = false) => {
pleaseLogin(); pleaseLogin();
os.popupMenu([{ os.popupMenu([{
text: i18n.locale.renote, text: i18n.ts.renote,
icon: 'fas fa-retweet', icon: 'fas fa-retweet',
action: () => { action: () => {
os.api('notes/create', { os.api('notes/create', {
@ -67,7 +67,7 @@ export default defineComponent({
}); });
} }
}, { }, {
text: i18n.locale.quote, text: i18n.ts.quote,
icon: 'fas fa-quote-right', icon: 'fas fa-quote-right',
action: () => { action: () => {
os.post({ os.post({

View File

@ -109,7 +109,7 @@ export default defineComponent({
text: 'Delete some bananas', text: 'Delete some bananas',
danger: true, danger: true,
action: () => {}, action: () => {},
}], ev.currentTarget || ev.target); }], ev.currentTarget ?? ev.target);
}, },
} }
}); });

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="mk-toast"> <div class="mk-toast">
<transition name="toast" appear @after-leave="emit('closed')"> <transition :name="$store.state.animation ? 'toast' : ''" appear @after-leave="emit('closed')">
<div v-if="showing" class="body _acrylic" :style="{ zIndex }"> <div v-if="showing" class="body _acrylic" :style="{ zIndex }">
<div class="message"> <div class="message">
{{ message }} {{ message }}

View File

@ -10,7 +10,7 @@
</button> </button>
</div> </div>
</header> </header>
<transition name="container-toggle" <transition :name="$store.state.animation ? 'container-toggle' : ''"
@enter="enter" @enter="enter"
@after-enter="afterEnter" @after-enter="afterEnter"
@leave="leave" @leave="leave"

View File

@ -8,7 +8,7 @@
<template v-else><i class="fas fa-angle-down"></i></template> <template v-else><i class="fas fa-angle-down"></i></template>
</button> </button>
</header> </header>
<transition name="folder-toggle" <transition :name="$store.state.animation ? 'folder-toggle' : ''"
@enter="enter" @enter="enter"
@after-enter="afterEnter" @after-enter="afterEnter"
@leave="leave" @leave="leave"

View File

@ -1,5 +1,5 @@
<template> <template>
<transition :name="$store.state.animation ? (type === 'drawer') ? 'modal-drawer' : (type === 'popup') ? 'modal-popup' : 'modal' : ''" :duration="$store.state.animation ? 200 : 0" appear @after-leave="$emit('closed')" @enter="$emit('opening')" @after-enter="childRendered"> <transition :name="$store.state.animation ? (type === 'drawer') ? 'modal-drawer' : (type === 'popup') ? 'modal-popup' : 'modal' : ''" :duration="$store.state.animation ? 200 : 0" appear @after-leave="emit('closed')" @enter="emit('opening')" @after-enter="childRendered">
<div v-show="manualShowing != null ? manualShowing : showing" v-hotkey.global="keymap" class="qzhlnise" :class="{ drawer: type === 'drawer', dialog: type === 'dialog' || type === 'dialog:top', popup: type === 'popup' }" :style="{ zIndex, pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }"> <div v-show="manualShowing != null ? manualShowing : showing" v-hotkey.global="keymap" class="qzhlnise" :class="{ drawer: type === 'drawer', dialog: type === 'dialog' || type === 'dialog:top', popup: type === 'popup' }" :style="{ zIndex, pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }">
<div class="bg _modalBg" :class="{ transparent: transparentBg && (type === 'popup') }" :style="{ zIndex }" @click="onBgClick" @contextmenu.prevent.stop="() => {}"></div> <div class="bg _modalBg" :class="{ transparent: transparentBg && (type === 'popup') }" :style="{ zIndex }" @click="onBgClick" @contextmenu.prevent.stop="() => {}"></div>
<div ref="content" class="content" :class="{ fixed, top: type === 'dialog:top' }" :style="{ zIndex }" @click.self="onBgClick"> <div ref="content" class="content" :class="{ fixed, top: type === 'dialog:top' }" :style="{ zIndex }" @click.self="onBgClick">
@ -9,8 +9,8 @@
</transition> </transition>
</template> </template>
<script lang="ts"> <script lang="ts" setup>
import { defineComponent, nextTick, onMounted, computed, PropType, ref, watch } from 'vue'; import { nextTick, onMounted, computed, ref, watch, provide } from 'vue';
import * as os from '@/os'; import * as os from '@/os';
import { isTouchUsing } from '@/scripts/touch'; import { isTouchUsing } from '@/scripts/touch';
import { defaultStore } from '@/store'; import { defaultStore } from '@/store';
@ -25,234 +25,206 @@ function getFixedContainer(el: Element | null): Element | null {
} }
} }
export default defineComponent({ type ModalTypes = 'popup' | 'dialog' | 'dialog:top' | 'drawer';
provide: {
modal: true
},
props: { const props = withDefaults(defineProps<{
manualShowing: { manualShowing?: boolean | null;
type: Boolean, srcCenter?: boolean;
required: false, src?: HTMLElement;
default: null, preferType?: ModalTypes | 'auto';
}, zPriority?: 'low' | 'middle' | 'high';
srcCenter: { noOverlap?: boolean;
type: Boolean, transparentBg?: boolean;
required: false }>(), {
}, manualShowing: null,
src: { src: null,
type: Object as PropType<HTMLElement>, preferType: 'auto',
required: false, zPriority: 'low',
default: null, noOverlap: true,
}, transparentBg: false,
preferType: { });
required: false,
type: String,
default: 'auto',
},
zPriority: {
type: String as PropType<'low' | 'middle' | 'high'>,
required: false,
default: 'low',
},
noOverlap: {
type: Boolean,
required: false,
default: true,
},
transparentBg: {
type: Boolean,
required: false,
default: false,
},
},
emits: ['opening', 'click', 'esc', 'close', 'closed'], const emit = defineEmits<{
(ev: 'opening'): void;
(ev: 'click'): void;
(ev: 'esc'): void;
(ev: 'close'): void;
(ev: 'closed'): void;
}>();
setup(props, context) { provide('modal', true);
const maxHeight = ref<number>();
const fixed = ref(false);
const transformOrigin = ref('center');
const showing = ref(true);
const content = ref<HTMLElement>();
const zIndex = os.claimZIndex(props.zPriority);
const type = computed(() => {
if (props.preferType === 'auto') {
if (!defaultStore.state.disableDrawer && isTouchUsing && window.innerWidth < 500 && window.innerHeight < 1000) {
return 'drawer';
} else {
return props.src != null ? 'popup' : 'dialog';
}
} else {
return props.preferType;
}
});
let contentClicking = false; const maxHeight = ref<number>();
const fixed = ref(false);
const transformOrigin = ref('center');
const showing = ref(true);
const content = ref<HTMLElement>();
const zIndex = os.claimZIndex(props.zPriority);
const type = computed(() => {
if (props.preferType === 'auto') {
if (!defaultStore.state.disableDrawer && isTouchUsing && window.innerWidth < 500 && window.innerHeight < 1000) {
return 'drawer';
} else {
return props.src != null ? 'popup' : 'dialog';
}
} else {
return props.preferType!;
}
});
const close = () => { let contentClicking = false;
// eslint-disable-next-line vue/no-mutating-props
if (props.src) props.src.style.pointerEvents = 'auto';
showing.value = false;
context.emit('close');
};
const onBgClick = () => { const close = () => {
if (contentClicking) return; // eslint-disable-next-line vue/no-mutating-props
context.emit('click'); if (props.src) props.src.style.pointerEvents = 'auto';
}; showing.value = false;
emit('close');
};
if (type.value === 'drawer') { const onBgClick = () => {
maxHeight.value = window.innerHeight / 2; if (contentClicking) return;
emit('click');
};
if (type.value === 'drawer') {
maxHeight.value = window.innerHeight / 2;
}
const keymap = {
'esc': () => emit('esc'),
};
const MARGIN = 16;
const align = () => {
if (props.src == null) return;
if (type.value === 'drawer') return;
const popover = content.value!;
if (popover == null) return;
const rect = props.src.getBoundingClientRect();
const width = popover.offsetWidth;
const height = popover.offsetHeight;
let left;
let top;
if (props.srcCenter) {
const x = rect.left + (fixed.value ? 0 : window.pageXOffset) + (props.src.offsetWidth / 2);
const y = rect.top + (fixed.value ? 0 : window.pageYOffset) + (props.src.offsetHeight / 2);
left = (x - (width / 2));
top = (y - (height / 2));
} else {
const x = rect.left + (fixed.value ? 0 : window.pageXOffset) + (props.src.offsetWidth / 2);
const y = rect.top + (fixed.value ? 0 : window.pageYOffset) + props.src.offsetHeight;
left = (x - (width / 2));
top = y;
}
if (fixed.value) {
//
if (left + width > window.innerWidth) {
left = window.innerWidth - width;
} }
const keymap = { //
'esc': () => context.emit('esc'), if (top + height > (window.innerHeight - MARGIN)) {
}; if (props.noOverlap) {
const underSpace = (window.innerHeight - MARGIN) - top;
const MARGIN = 16; const upperSpace = (rect.top - MARGIN);
if (underSpace >= (upperSpace / 3)) {
const align = () => { maxHeight.value = underSpace;
if (props.src == null) return; } else {
if (type.value === 'drawer') return; maxHeight.value = upperSpace;
top = (upperSpace + MARGIN) - height;
const popover = content.value!;
if (popover == null) return;
const rect = props.src.getBoundingClientRect();
const width = popover.offsetWidth;
const height = popover.offsetHeight;
let left;
let top;
if (props.srcCenter) {
const x = rect.left + (fixed.value ? 0 : window.pageXOffset) + (props.src.offsetWidth / 2);
const y = rect.top + (fixed.value ? 0 : window.pageYOffset) + (props.src.offsetHeight / 2);
left = (x - (width / 2));
top = (y - (height / 2));
} else {
const x = rect.left + (fixed.value ? 0 : window.pageXOffset) + (props.src.offsetWidth / 2);
const y = rect.top + (fixed.value ? 0 : window.pageYOffset) + props.src.offsetHeight;
left = (x - (width / 2));
top = y;
}
if (fixed.value) {
//
if (left + width > window.innerWidth) {
left = window.innerWidth - width;
}
//
if (top + height > (window.innerHeight - MARGIN)) {
if (props.noOverlap) {
const underSpace = (window.innerHeight - MARGIN) - top;
const upperSpace = (rect.top - MARGIN);
if (underSpace >= (upperSpace / 3)) {
maxHeight.value = underSpace;
} else {
maxHeight.value = upperSpace;
top = (upperSpace + MARGIN) - height;
}
} else {
top = (window.innerHeight - MARGIN) - height;
}
} }
} else { } else {
// top = (window.innerHeight - MARGIN) - height;
if (left + width - window.pageXOffset > window.innerWidth) { }
left = window.innerWidth - width + window.pageXOffset - 1; }
} else {
//
if (left + width - window.pageXOffset > window.innerWidth) {
left = window.innerWidth - width + window.pageXOffset - 1;
}
//
if (top + height - window.pageYOffset > (window.innerHeight - MARGIN)) {
if (props.noOverlap) {
const underSpace = (window.innerHeight - MARGIN) - (top - window.pageYOffset);
const upperSpace = (rect.top - MARGIN);
if (underSpace >= (upperSpace / 3)) {
maxHeight.value = underSpace;
} else {
maxHeight.value = upperSpace;
top = window.pageYOffset + ((upperSpace + MARGIN) - height);
} }
//
if (top + height - window.pageYOffset > (window.innerHeight - MARGIN)) {
if (props.noOverlap) {
const underSpace = (window.innerHeight - MARGIN) - (top - window.pageYOffset);
const upperSpace = (rect.top - MARGIN);
if (underSpace >= (upperSpace / 3)) {
maxHeight.value = underSpace;
} else {
maxHeight.value = upperSpace;
top = window.pageYOffset + ((upperSpace + MARGIN) - height);
}
} else {
top = (window.innerHeight - MARGIN) - height + window.pageYOffset - 1;
}
}
}
if (top < 0) {
top = MARGIN;
}
if (left < 0) {
left = 0;
}
if (top > rect.top + (fixed.value ? 0 : window.pageYOffset)) {
transformOrigin.value = 'center top';
} else if ((top + height) <= rect.top + (fixed.value ? 0 : window.pageYOffset)) {
transformOrigin.value = 'center bottom';
} else { } else {
transformOrigin.value = 'center'; top = (window.innerHeight - MARGIN) - height + window.pageYOffset - 1;
} }
}
}
popover.style.left = left + 'px'; if (top < 0) {
popover.style.top = top + 'px'; top = MARGIN;
}; }
const childRendered = () => { if (left < 0) {
// left = 0;
const el = content.value!.children[0]; }
el.addEventListener('mousedown', e => {
contentClicking = true;
window.addEventListener('mouseup', e => {
// click mouseup
window.setTimeout(() => {
contentClicking = false;
}, 100);
}, { passive: true, once: true });
}, { passive: true });
};
onMounted(() => { if (top > rect.top + (fixed.value ? 0 : window.pageYOffset)) {
watch(() => props.src, async () => { transformOrigin.value = 'center top';
if (props.src) { } else if ((top + height) <= rect.top + (fixed.value ? 0 : window.pageYOffset)) {
// eslint-disable-next-line vue/no-mutating-props transformOrigin.value = 'center bottom';
props.src.style.pointerEvents = 'none'; } else {
} transformOrigin.value = 'center';
fixed.value = (type.value === 'drawer') || (getFixedContainer(props.src) != null); }
await nextTick() popover.style.left = left + 'px';
popover.style.top = top + 'px';
};
align(); const childRendered = () => {
}, { immediate: true, }); //
const el = content.value!.children[0];
el.addEventListener('mousedown', ev => {
contentClicking = true;
window.addEventListener('mouseup', ev => {
// click mouseup
window.setTimeout(() => {
contentClicking = false;
}, 100);
}, { passive: true, once: true });
}, { passive: true });
};
nextTick(() => { onMounted(() => {
const popover = content.value; watch(() => props.src, async () => {
new ResizeObserver((entries, observer) => { if (props.src) {
align(); // eslint-disable-next-line vue/no-mutating-props
}).observe(popover!); props.src.style.pointerEvents = 'none';
}); }
}); fixed.value = (type.value === 'drawer') || (getFixedContainer(props.src) != null);
return { await nextTick()
showing,
type, align();
fixed, }, { immediate: true, });
content,
transformOrigin, nextTick(() => {
maxHeight, const popover = content.value;
close, new ResizeObserver((entries, observer) => {
zIndex, align();
keymap, }).observe(popover!);
onBgClick, });
childRendered, });
};
}, defineExpose({
close,
}); });
</script> </script>

View File

@ -1,5 +1,5 @@
<template> <template>
<transition name="fade" mode="out-in"> <transition :name="$store.state.animation ? 'fade' : ''" mode="out-in">
<MkLoading v-if="fetching"/> <MkLoading v-if="fetching"/>
<MkError v-else-if="error" @retry="init()"/> <MkError v-else-if="error" @retry="init()"/>

View File

@ -1,5 +1,5 @@
<template> <template>
<transition name="tooltip" appear @after-leave="$emit('closed')"> <transition :name="$store.state.animation ? 'tooltip' : ''" appear @after-leave="$emit('closed')">
<div v-show="showing" ref="el" class="buebdbiu _acrylic _shadow" :style="{ zIndex, maxWidth: maxWidth + 'px' }"> <div v-show="showing" ref="el" class="buebdbiu _acrylic _shadow" :style="{ zIndex, maxWidth: maxWidth + 'px' }">
<slot>{{ text }}</slot> <slot>{{ text }}</slot>
</div> </div>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="fgmtyycl" :style="{ zIndex, top: top + 'px', left: left + 'px' }"> <div class="fgmtyycl" :style="{ zIndex, top: top + 'px', left: left + 'px' }">
<transition name="zoom" @after-leave="$emit('closed')"> <transition :name="$store.state.animation ? 'zoom' : ''" @after-leave="$emit('closed')">
<MkUrlPreview v-if="showing" class="_popup _shadow" :url="url"/> <MkUrlPreview v-if="showing" class="_popup _shadow" :url="url"/>
</transition> </transition>
</div> </div>

View File

@ -7,7 +7,7 @@
<iframe ref="tweet" scrolling="no" frameborder="no" :style="{ position: 'relative', width: '100%', height: `${tweetHeight}px` }" :src="`https://platform.twitter.com/embed/index.html?embedId=${embedId}&amp;hideCard=false&amp;hideThread=false&amp;lang=en&amp;theme=${$store.state.darkMode ? 'dark' : 'light'}&amp;id=${tweetId}`"></iframe> <iframe ref="tweet" scrolling="no" frameborder="no" :style="{ position: 'relative', width: '100%', height: `${tweetHeight}px` }" :src="`https://platform.twitter.com/embed/index.html?embedId=${embedId}&amp;hideCard=false&amp;hideThread=false&amp;lang=en&amp;theme=${$store.state.darkMode ? 'dark' : 'light'}&amp;id=${tweetId}`"></iframe>
</div> </div>
<div v-else v-size="{ max: [400, 350] }" class="mk-url-preview"> <div v-else v-size="{ max: [400, 350] }" class="mk-url-preview">
<transition name="zoom" mode="out-in"> <transition :name="$store.state.animation ? 'zoom' : ''" mode="out-in">
<component :is="self ? 'MkA' : 'a'" v-if="!fetching" :class="{ compact }" :[attr]="self ? url.substr(local.length) : url" rel="nofollow noopener" :target="target" :title="url"> <component :is="self ? 'MkA' : 'a'" v-if="!fetching" :class="{ compact }" :[attr]="self ? url.substr(local.length) : url" rel="nofollow noopener" :target="target" :title="url">
<div v-if="thumbnail" class="thumbnail" :style="`background-image: url('${thumbnail}')`"> <div v-if="thumbnail" class="thumbnail" :style="`background-image: url('${thumbnail}')`">
<button v-if="!playerEnabled && player.url" class="_button" :title="$ts.enablePlayer" @click.prevent="playerEnabled = true"><i class="fas fa-play-circle"></i></button> <button v-if="!playerEnabled && player.url" class="_button" :title="$ts.enablePlayer" @click.prevent="playerEnabled = true"><i class="fas fa-play-circle"></i></button>

View File

@ -13,10 +13,10 @@ const props = defineProps<{
const text = $computed(() => { const text = $computed(() => {
switch (props.user.onlineStatus) { switch (props.user.onlineStatus) {
case 'online': return i18n.locale.online; case 'online': return i18n.ts.online;
case 'active': return i18n.locale.active; case 'active': return i18n.ts.active;
case 'offline': return i18n.locale.offline; case 'offline': return i18n.ts.offline;
case 'unknown': return i18n.locale.unknown; case 'unknown': return i18n.ts.unknown;
} }
}); });
</script> </script>

View File

@ -1,5 +1,5 @@
<template> <template>
<transition name="popup" appear @after-leave="$emit('closed')"> <transition :name="$store.state.animation ? 'popup' : ''" appear @after-leave="$emit('closed')">
<div v-if="showing" class="fxxzrfni _popup _shadow" :style="{ zIndex, top: top + 'px', left: left + 'px' }" @mouseover="() => { $emit('mouseover'); }" @mouseleave="() => { $emit('mouseleave'); }"> <div v-if="showing" class="fxxzrfni _popup _shadow" :style="{ zIndex, top: top + 'px', left: left + 'px' }" @mouseover="() => { $emit('mouseover'); }" @mouseleave="() => { $emit('mouseleave'); }">
<div v-if="fetched" class="info"> <div v-if="fetched" class="info">
<div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''"></div> <div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''"></div>

View File

@ -0,0 +1,44 @@
// ブラウザで直接表示することを許可するファイルの種類のリスト
// ここに含まれないものは application/octet-stream としてレスポンスされる
// SVGはXSSを生むので許可しない
export const FILE_TYPE_BROWSERSAFE = [
// Images
'image/png',
'image/gif',
'image/jpeg',
'image/webp',
'image/apng',
'image/bmp',
'image/tiff',
'image/x-icon',
// OggS
'audio/opus',
'video/ogg',
'audio/ogg',
'application/ogg',
// ISO/IEC base media file format
'video/quicktime',
'video/mp4',
'audio/mp4',
'video/x-m4v',
'audio/x-m4a',
'video/3gpp',
'video/3gpp2',
'video/mpeg',
'audio/mpeg',
'video/webm',
'audio/webm',
'audio/aac',
'audio/x-flac',
'audio/vnd.wave',
];
/*
https://github.com/sindresorhus/file-type/blob/main/supported.js
https://github.com/sindresorhus/file-type/blob/main/core.js
https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers
*/

View File

@ -185,7 +185,7 @@ app.config.globalProperties = {
$store: defaultStore, $store: defaultStore,
$instance: instance, $instance: instance,
$t: i18n.t, $t: i18n.t,
$ts: i18n.locale, $ts: i18n.ts,
}; };
app.use(router); app.use(router);
@ -299,8 +299,8 @@ stream.on('_disconnected_', async () => {
reloadDialogShowing = true; reloadDialogShowing = true;
const { canceled } = await confirm({ const { canceled } = await confirm({
type: 'warning', type: 'warning',
title: i18n.locale.disconnectedFromServer, title: i18n.ts.disconnectedFromServer,
text: i18n.locale.reloadConfirm, text: i18n.ts.reloadConfirm,
}); });
reloadDialogShowing = false; reloadDialogShowing = false;
if (!canceled) { if (!canceled) {
@ -324,7 +324,7 @@ if ($i) {
if ($i.isDeleted) { if ($i.isDeleted) {
alert({ alert({
type: 'warning', type: 'warning',
text: i18n.locale.accountDeletionInProgress, text: i18n.ts.accountDeletionInProgress,
}); });
} }

View File

@ -73,12 +73,12 @@ export const menuDef = reactive({
})), null, { })), null, {
type: 'link', type: 'link',
to: '/my/lists', to: '/my/lists',
text: i18n.locale.manageLists, text: i18n.ts.manageLists,
icon: 'fas fa-cog', icon: 'fas fa-cog',
}]; }];
items.value = _items; items.value = _items;
}); });
os.popupMenu(items, ev.currentTarget || ev.target); os.popupMenu(items, ev.currentTarget ?? ev.target);
}, },
}, },
groups: { groups: {
@ -104,12 +104,12 @@ export const menuDef = reactive({
})), null, { })), null, {
type: 'link', type: 'link',
to: '/my/antennas', to: '/my/antennas',
text: i18n.locale.manageAntennas, text: i18n.ts.manageAntennas,
icon: 'fas fa-cog', icon: 'fas fa-cog',
}]; }];
items.value = _items; items.value = _items;
}); });
os.popupMenu(items, ev.currentTarget || ev.target); os.popupMenu(items, ev.currentTarget ?? ev.target);
}, },
}, },
mentions: { mentions: {
@ -173,34 +173,34 @@ export const menuDef = reactive({
icon: 'fas fa-columns', icon: 'fas fa-columns',
action: (ev) => { action: (ev) => {
os.popupMenu([{ os.popupMenu([{
text: i18n.locale.default, text: i18n.ts.default,
active: ui === 'default' || ui === null, active: ui === 'default' || ui === null,
action: () => { action: () => {
localStorage.setItem('ui', 'default'); localStorage.setItem('ui', 'default');
unisonReload(); unisonReload();
} }
}, { }, {
text: i18n.locale.deck, text: i18n.ts.deck,
active: ui === 'deck', active: ui === 'deck',
action: () => { action: () => {
localStorage.setItem('ui', 'deck'); localStorage.setItem('ui', 'deck');
unisonReload(); unisonReload();
} }
}, { }, {
text: i18n.locale.classic, text: i18n.ts.classic,
active: ui === 'classic', active: ui === 'classic',
action: () => { action: () => {
localStorage.setItem('ui', 'classic'); localStorage.setItem('ui', 'classic');
unisonReload(); unisonReload();
} }
}, /*{ }, /*{
text: i18n.locale.desktop + ' (β)', text: i18n.ts.desktop + ' (β)',
active: ui === 'desktop', active: ui === 'desktop',
action: () => { action: () => {
localStorage.setItem('ui', 'desktop'); localStorage.setItem('ui', 'desktop');
unisonReload(); unisonReload();
} }
}*/], ev.currentTarget || ev.target); }*/], ev.currentTarget ?? ev.target);
}, },
}, },
}); });

View File

@ -403,7 +403,7 @@ export async function selectDriveFolder(multiple: boolean) {
}); });
} }
export async function pickEmoji(src?: HTMLElement, opts) { export async function pickEmoji(src: HTMLElement | null, opts) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
popup(import('@/components/emoji-picker-dialog.vue'), { popup(import('@/components/emoji-picker-dialog.vue'), {
src, src,
@ -570,7 +570,7 @@ export function upload(file: File, folder?: any, name?: string): Promise<Misskey
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open('POST', apiUrl + '/drive/files/create', true); xhr.open('POST', apiUrl + '/drive/files/create', true);
xhr.onload = (ev) => { xhr.onload = (ev) => {
if (ev.target == null || ev.target.response == null) { if (xhr.status !== 200 || ev.target == null || ev.target.response == null) {
// TODO: 消すのではなくて再送できるようにしたい // TODO: 消すのではなくて再送できるようにしたい
uploads.value = uploads.value.filter(x => x.id != id); uploads.value = uploads.value.filter(x => x.id != id);

View File

@ -3,15 +3,15 @@
<transition :name="$store.state.animation ? 'zoom' : ''" appear> <transition :name="$store.state.animation ? 'zoom' : ''" appear>
<div v-show="loaded" class="mjndxjch"> <div v-show="loaded" class="mjndxjch">
<img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/> <img src="https://xn--931a.moe/assets/error.jpg" class="_ghost"/>
<p><b><i class="fas fa-exclamation-triangle"></i> {{ i18n.locale.pageLoadError }}</b></p> <p><b><i class="fas fa-exclamation-triangle"></i> {{ i18n.ts.pageLoadError }}</b></p>
<p v-if="meta && (version === meta.version)">{{ i18n.locale.pageLoadErrorDescription }}</p> <p v-if="meta && (version === meta.version)">{{ i18n.ts.pageLoadErrorDescription }}</p>
<p v-else-if="serverIsDead">{{ i18n.locale.serverIsDead }}</p> <p v-else-if="serverIsDead">{{ i18n.ts.serverIsDead }}</p>
<template v-else> <template v-else>
<p>{{ i18n.locale.newVersionOfClientAvailable }}</p> <p>{{ i18n.ts.newVersionOfClientAvailable }}</p>
<p>{{ i18n.locale.youShouldUpgradeClient }}</p> <p>{{ i18n.ts.youShouldUpgradeClient }}</p>
<MkButton class="button primary" @click="reload">{{ i18n.locale.reload }}</MkButton> <MkButton class="button primary" @click="reload">{{ i18n.ts.reload }}</MkButton>
</template> </template>
<p><MkA to="/docs/general/troubleshooting" class="_link">{{ i18n.locale.troubleshooting }}</MkA></p> <p><MkA to="/docs/general/troubleshooting" class="_link">{{ i18n.ts.troubleshooting }}</MkA></p>
<p v-if="error" class="error">ERROR: {{ error }}</p> <p v-if="error" class="error">ERROR: {{ error }}</p>
</div> </div>
</transition> </transition>
@ -54,7 +54,7 @@ function reload() {
defineExpose({ defineExpose({
[symbols.PAGE_INFO]: { [symbols.PAGE_INFO]: {
title: i18n.locale.error, title: i18n.ts.error,
icon: 'fas fa-exclamation-triangle', icon: 'fas fa-exclamation-triangle',
}, },
}); });

View File

@ -10,7 +10,7 @@
<span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span> <span v-for="emoji in easterEggEmojis" :key="emoji.id" class="emoji" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
</div> </div>
<div class="_formBlock" style="text-align: center;"> <div class="_formBlock" style="text-align: center;">
{{ i18n.locale._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.locale.learnMore }}</a> {{ i18n.ts._aboutMisskey.about }}<br><a href="https://misskey-hub.net/docs/misskey.html" target="_blank" class="_link">{{ i18n.ts.learnMore }}</a>
</div> </div>
<div class="_formBlock" style="text-align: center;"> <div class="_formBlock" style="text-align: center;">
<MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton> <MkButton primary rounded inline @click="iLoveMisskey">I <Mfm text="$[jelly ❤]"/> #Misskey</MkButton>
@ -19,23 +19,23 @@
<div class="_formLinks"> <div class="_formLinks">
<FormLink to="https://github.com/misskey-dev/misskey" external> <FormLink to="https://github.com/misskey-dev/misskey" external>
<template #icon><i class="fas fa-code"></i></template> <template #icon><i class="fas fa-code"></i></template>
{{ i18n.locale._aboutMisskey.source }} {{ i18n.ts._aboutMisskey.source }}
<template #suffix>GitHub</template> <template #suffix>GitHub</template>
</FormLink> </FormLink>
<FormLink to="https://crowdin.com/project/misskey" external> <FormLink to="https://crowdin.com/project/misskey" external>
<template #icon><i class="fas fa-language"></i></template> <template #icon><i class="fas fa-language"></i></template>
{{ i18n.locale._aboutMisskey.translation }} {{ i18n.ts._aboutMisskey.translation }}
<template #suffix>Crowdin</template> <template #suffix>Crowdin</template>
</FormLink> </FormLink>
<FormLink to="https://www.patreon.com/syuilo" external> <FormLink to="https://www.patreon.com/syuilo" external>
<template #icon><i class="fas fa-hand-holding-medical"></i></template> <template #icon><i class="fas fa-hand-holding-medical"></i></template>
{{ i18n.locale._aboutMisskey.donate }} {{ i18n.ts._aboutMisskey.donate }}
<template #suffix>Patreon</template> <template #suffix>Patreon</template>
</FormLink> </FormLink>
</div> </div>
</FormSection> </FormSection>
<FormSection> <FormSection>
<template #label>{{ i18n.locale._aboutMisskey.contributors }}</template> <template #label>{{ i18n.ts._aboutMisskey.contributors }}</template>
<div class="_formLinks"> <div class="_formLinks">
<FormLink to="https://github.com/syuilo" external>@syuilo</FormLink> <FormLink to="https://github.com/syuilo" external>@syuilo</FormLink>
<FormLink to="https://github.com/AyaMorisawa" external>@AyaMorisawa</FormLink> <FormLink to="https://github.com/AyaMorisawa" external>@AyaMorisawa</FormLink>
@ -47,12 +47,12 @@
<FormLink to="https://github.com/u1-liquid" external>@u1-liquid</FormLink> <FormLink to="https://github.com/u1-liquid" external>@u1-liquid</FormLink>
<FormLink to="https://github.com/marihachi" external>@marihachi</FormLink> <FormLink to="https://github.com/marihachi" external>@marihachi</FormLink>
</div> </div>
<template #caption><MkLink url="https://github.com/misskey-dev/misskey/graphs/contributors">{{ i18n.locale._aboutMisskey.allContributors }}</MkLink></template> <template #caption><MkLink url="https://github.com/misskey-dev/misskey/graphs/contributors">{{ i18n.ts._aboutMisskey.allContributors }}</MkLink></template>
</FormSection> </FormSection>
<FormSection> <FormSection>
<template #label><Mfm text="$[jelly ❤]"/> {{ i18n.locale._aboutMisskey.patrons }}</template> <template #label><Mfm text="$[jelly ❤]"/> {{ i18n.ts._aboutMisskey.patrons }}</template>
<div v-for="patron in patrons" :key="patron">{{ patron }}</div> <div v-for="patron in patrons" :key="patron">{{ patron }}</div>
<template #caption>{{ i18n.locale._aboutMisskey.morePatrons }}</template> <template #caption>{{ i18n.ts._aboutMisskey.morePatrons }}</template>
</FormSection> </FormSection>
</div> </div>
</MkSpacer> </MkSpacer>
@ -182,6 +182,7 @@ function gravity() {
function iLoveMisskey() { function iLoveMisskey() {
os.post({ os.post({
initialText: 'I $[jelly ❤] #Misskey', initialText: 'I $[jelly ❤] #Misskey',
instant: true,
}); });
} }
@ -193,7 +194,7 @@ onBeforeUnmount(() => {
defineExpose({ defineExpose({
[symbols.PAGE_INFO]: { [symbols.PAGE_INFO]: {
title: i18n.locale.aboutMisskey, title: i18n.ts.aboutMisskey,
icon: null, icon: null,
bg: 'var(--bg)', bg: 'var(--bg)',
}, },

View File

@ -90,7 +90,7 @@ const initStats = () => os.api('stats', {
defineExpose({ defineExpose({
[symbols.PAGE_INFO]: { [symbols.PAGE_INFO]: {
title: i18n.locale.instanceInfo, title: i18n.ts.instanceInfo,
icon: 'fas fa-info-circle', icon: 'fas fa-info-circle',
bg: 'var(--bg)', bg: 'var(--bg)',
}, },

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