diff --git a/.github/ISSUE_TEMPLATE/01_bug-report.md b/.github/ISSUE_TEMPLATE/01_bug-report.md index 019f8c739..8734fc0c3 100644 --- a/.github/ISSUE_TEMPLATE/01_bug-report.md +++ b/.github/ISSUE_TEMPLATE/01_bug-report.md @@ -16,11 +16,11 @@ First, in order to avoid duplicate Issues, please search to see if the problem y -## 🙂 Expected Behavior +## đŸĨ° Expected Behavior -## â˜šī¸ Actual Behavior +## đŸ¤Ŧ Actual Behavior @@ -33,3 +33,7 @@ First, in order to avoid duplicate Issues, please search to see if the problem y ## 📌 Environment + +Misskey version: +Your OS: +Your browser: diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bb56be2c..65f5e0194 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,17 +7,26 @@ --> -## 12.x.x (unreleased) - -### Improvements +## 12.103.1 (2022/02/02) ### Bugfixes -- 投į¨ŋぎNSFWį”ģåƒã‚’čĄ¨į¤ēしたあとãĢãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãŒæ›´æ–°ã•ã‚Œã‚‹ã¨į”ģåƒãŒéžčĄ¨į¤ēãĢãĒã‚‹å•éĄŒã‚’äŋŽæ­Ŗ -- 「クãƒĒップ」ペãƒŧジが開かãĒã„å•éĄŒã‚’äŋŽæ­Ŗ -- トãƒŦãƒŗãƒ‰ã‚Ļã‚Ŗã‚¸ã‚§ãƒƒãƒˆãŒå‹•äŊœã—ãĒいぎをäŋŽæ­Ŗ -- ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗč¨­åŽšã§įĩĩ文字ピッã‚Ģãƒŧが開かãĒいぎをäŋŽæ­Ŗ -- DMペãƒŧã‚¸ã§ãƒĄãƒŗã‚ˇãƒ§ãƒŗãŒåĢãžã‚Œã‚‹å•éĄŒã‚’äŋŽæ­Ŗ -- 投į¨ŋフりãƒŧãƒ ãŽãƒãƒƒã‚ˇãƒĨã‚ŋグäŋæŒãƒ•ã‚ŖãƒŧãƒĢドが動äŊœã—ãĒã„å•éĄŒã‚’äŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: ツãƒŧãƒĢãƒãƒƒãƒ—ãŽčĄ¨į¤ēäŊįŊŽãŒæ­Ŗã—くãĒã„å•éĄŒã‚’äŋŽæ­Ŗ + +## 12.103.0 (2022/02/02) + +### Improvements +- クナイã‚ĸãƒŗãƒˆ: é€Ŗåˆã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šãƒšãƒŧã‚¸ã‹ã‚‰ã‚¤ãƒŗã‚šã‚ŋãƒŗã‚šæƒ…å ąå†å–åž—ã‚’čĄŒãˆã‚‹ã‚ˆã†ãĢ + +### Bugfixes +- クナイã‚ĸãƒŗãƒˆ: 投į¨ŋぎNSFWį”ģåƒã‚’čĄ¨į¤ēしたあとãĢãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗãŒæ›´æ–°ã•ã‚Œã‚‹ã¨į”ģåƒãŒéžčĄ¨į¤ēãĢãĒã‚‹å•éĄŒã‚’äŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: 「クãƒĒップ」ペãƒŧジが開かãĒã„å•éĄŒã‚’äŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: トãƒŦãƒŗãƒ‰ã‚Ļã‚Ŗã‚¸ã‚§ãƒƒãƒˆãŒå‹•äŊœã—ãĒいぎをäŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: フェデãƒŦãƒŧã‚ˇãƒ§ãƒŗã‚Ļã‚Ŗã‚¸ã‚§ãƒƒãƒˆãŒå‹•äŊœã—ãĒいぎをäŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗč¨­åŽšã§įĩĩ文字ピッã‚Ģãƒŧが開かãĒいぎをäŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: DMペãƒŧã‚¸ã§ãƒĄãƒŗã‚ˇãƒ§ãƒŗãŒåĢãžã‚Œã‚‹å•éĄŒã‚’äŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: 投į¨ŋフりãƒŧãƒ ãŽãƒãƒƒã‚ˇãƒĨã‚ŋグäŋæŒãƒ•ã‚ŖãƒŧãƒĢドが動äŊœã—ãĒã„å•éĄŒã‚’äŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: ã‚ĩイドビãƒĨãƒŧが動かãĒいぎをäŋŽæ­Ŗ +- クナイã‚ĸãƒŗãƒˆ: ensure that specified users does not get duplicates - Add `img-src` and `media-src` directives to `Content-Security-Policy` for files and media proxy diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 27f5598a6..662fa709b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ We're glad you're interested in contributing Misskey! In this document you will **â„šī¸ Important:** This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.** Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\ -The accuracy of translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language. +The accuracy of machine translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language. It will also allow the reader to use the translation tool of their preference if necessary. ## Issues diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml index ed97d539c..02f18cd1e 100644 --- a/locales/bn-BD.yml +++ b/locales/bn-BD.yml @@ -1 +1,510 @@ --- +_lang_: "āĻŦāĻžāĻ‚āϞāĻž" +headlineMisskey: "āύ⧋āϟ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āĻ•" +introMisskey: "āĻ¸ā§āĻŦāĻžāĻ—āϤāĻŽ! āĻŽāĻŋāϏāĻ•āĻŋ āĻāĻ•āϟāĻŋ āĻ“āĻĒ⧇āύ āϏ⧋āĻ°ā§āϏ, āĻĄāĻŋāϏ⧇āĻ¨ā§āĻŸā§āϰāĻžāϞāĻžāχāϜāĻĄ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻŦā§āϞāĻ—āĻŋāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāĨ¤ \n\"āύ⧋āϟ\" āϤ⧈āϰāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϝāĻž āϘāϟāϛ⧇ āϤāĻž āϏāĻŦāĻžāϰ āϏāĻžāĻĨ⧇ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰ⧁āύ 📡\n\"āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ\" āϗ⧁āϞāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϝ⧇āϕ⧋āύ⧋ āύ⧋āϟ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāĻĒāύāĻžāϰ āĻ…āύ⧁āĻ­ā§‚āϤāĻŋ āĻŦā§āϝāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ 👍\nāĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻĻ⧁āύāĻŋ⧟āĻž āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ 🚀\n" +monthAndDay: "{day}/{month}" +search: "āϖ⧁āρāϜ⧁āύ" +notifications: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" +username: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ" +password: "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ" +forgotPassword: "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϭ⧁āϞ⧇ āϗ⧇āϛ⧇āύ" +fetchingAsApObject: "āĻĢ⧇āĻĄāĻŋāĻ­āĻžāĻ°ā§āϏ āĻĨ⧇āϕ⧇ āĻ–āĻŦāϰ āφāύāĻž āĻšāĻšā§āϛ⧇..." +ok: "āĻ āĻŋāĻ•" +gotIt: "āĻŦ⧁āĻā§‡āĻ›āĻŋ" +cancel: "āĻŦāĻžāϤāĻŋāϞ" +enterUsername: "āχāωāϜāĻžāϰāύ⧇āĻŽ āϞāĻŋāϖ⧁āύ" +renotedBy: "{user} āϰāĻŋāύ⧋āϟ āĻ•āϰ⧇āϛ⧇āύ" +noNotes: "āϕ⧋āύ āύ⧋āϟ āύ⧇āχ" +noNotifications: "āϕ⧋āύ⧋ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āύ⧇āχ" +instance: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ" +settings: "āϏ⧇āϟāĻŋāĻ‚āϏ" +basicSettings: "āϏāĻžāϧāĻžāϰāĻŖ āϏ⧇āϟāĻŋāĻ‚āϏ" +otherSettings: "āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϏ⧇āϟāĻŋāĻ‚āϏ" +openInWindow: "āύāϤ⧁āύ āωāχāĻ¨ā§āĻĄā§‹āϤ⧇ āϖ⧁āϞāĻž" +profile: "āĻĒā§āϰ⧋āĻĢāĻžāχāϞ" +timeline: "āϟāĻžāχāĻŽāϞāĻžāχāύ" +noAccountDescription: "āĻāχ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϕ⧋āύ āĻŦāĻžā§Ÿā§‹ āύ⧇āχ" +login: "āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰ⧁āύ" +loggingIn: "āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇..." +logout: "āϞāĻ—āφāωāϟ" +signup: "āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧁āύ" +uploading: "āφāĻĒāϞ⧋āĻĄ āĻšāĻšā§āĻ› â€Ļ" +save: "āϏāĻ‚āϰāĻ•ā§āώāĻŖ" +users: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āĻŖ" +addUser: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +favorite: "āĻĒāĻ›āĻ¨ā§āĻĻ" +favorites: "āĻĒāĻ›āĻ¨ā§āĻĻāϗ⧁āϞāĻŋ" +unfavorite: "āĻĒāĻ›āĻ¨ā§āĻĻ āύāĻž" +favorited: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +alreadyFavorited: "āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +cantFavorite: "āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻŋ" +pin: "āĻĒāĻŋāύ āĻ•āϰāĻž" +unpin: "āĻĒāĻŋāύ āϏāϰāĻžāύ" +copyContent: "āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁ āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ" +copyLink: "āϞāĻŋāĻ™ā§āĻ• āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ" +delete: "āĻŽā§āϛ⧁āύ" +deleteAndEdit: "āĻŽā§āϛ⧁āύ āĻāĻŦāĻ‚ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύ" +deleteAndEditConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāχ āύ⧋āϟāϟāĻŋ āĻŽā§āϛ⧇ āĻāϟāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰāĻžāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ? āφāĻĒāύāĻŋ āĻāϟāĻŋāϰ āϏāĻŽāĻ¸ā§āϤ āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ, āϰāĻŋāύ⧋āϟ āĻāĻŦāĻ‚ āϜāĻŦāĻžāĻŦ āĻšāĻžāϰāĻžāĻŦ⧇āύāĨ¤" +addToList: "āϞāĻŋāĻ¸ā§āϟ āĻ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +sendMessage: "āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ°ā§āϤāĻž āĻĒāĻžāĻ āĻžāύ" +copyUsername: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ" +searchUser: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϖ⧁āρāϜ⧁āύ..." +reply: "āϜāĻŦāĻžāĻŦ" +loadMore: "āφāϰāĻ“ āĻĻ⧇āϖ⧁āύ" +showMore: "āφāϰāĻ“ āĻĻ⧇āϖ⧁āύ" +youGotNewFollower: "āφāĻĒāύāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϛ⧇" +receiveFollowRequest: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻĒāĻžāĻ“ā§ŸāĻž āϗ⧇āϛ⧇" +followRequestAccepted: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āĻ—ā§ƒāĻšā§€āϤ āĻšā§Ÿā§‡āϛ⧇" +mention: "āωāĻ˛ā§āϞ⧇āĻ–" +mentions: "āωāĻ˛ā§āϞ⧇āĻ–āϏāĻŽā§‚āĻš" +directNotes: "āĻĄāĻžāχāϰ⧇āĻ•ā§āϟ āύ⧋āϟāϗ⧁āϞāĻŋ" +importAndExport: "āφāĻŽāĻĻāĻžāύāĻŋ āĻāĻŦāĻ‚ āϰāĻĒā§āϤāĻžāύāĻŋ" +import: "āφāĻŽāĻĻāĻžāύāĻŋ āĻ•āϰ⧁āĻŖ" +export: "āϰāĻĒā§āϤāĻžāύāĻŋ" +files: "āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ" +download: "āĻĄāĻžāωāύāϞ⧋āĻĄ" +driveFileDeleteConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āϝ⧇ āφāĻĒāύāĻŋ \"{name}\" āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāϤ⧇ āϚāĻžāύ? āϝ⧇ āϏāĻ•āϞ āύ⧋āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻāχ āĻĢāĻžāχāϞāϟāĻŋ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āϏ⧇āϗ⧁āϞ⧋āĻ“ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" +unfollowConfirm: "{name} āϕ⧇ āφāύāĻĢāϞ⧋āĻ“ āĻ•āϰāĻžāϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +exportRequested: "āφāĻĒāύāĻžāϰ āϤāĻĨā§āϝāϏāĻŽā§‚āĻš āϰāĻĒā§āϤāĻžāύāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āĻāϤ⧇ āĻ•āĻŋāϛ⧁ āϏāĻŽā§Ÿ āϞāĻžāĻ—āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϰāĻĒā§āϤāĻžāύāĻŋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāϞ⧇ āϤāĻž āφāĻĒāύāĻžāϰ āĻĄā§āϰāĻžāχāϭ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻšāĻŦ⧇āĨ¤" +importRequested: "āφāĻĒāύāĻžāϰ āϤāĻĨā§āϝāϏāĻŽā§‚āĻš āφāĻŽāĻĻāĻžāύāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āĻāϤ⧇ āĻ•āĻŋāϛ⧁ āϏāĻŽā§Ÿ āϞāĻžāĻ—āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ " +lists: "āϞāĻŋāĻ¸ā§āϟ" +noLists: "āϕ⧋āύ āϞāĻŋāĻ¸ā§āϟ āύ⧇āχ" +note: "āύ⧋āϟ" +notes: "āύ⧋āϟāϗ⧁āϞāĻŋ" +following: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" +followers: "āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀" +followsYou: "āφāĻĒāύāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇" +createList: "āϞāĻŋāĻ¸ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +manageLists: "āϞāĻŋāĻ¸ā§āϟ āĻŦā§āϝāĻžāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž" +error: "āϏāĻŽāĻ¸ā§āϝāĻž" +somethingHappened: "āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻšāϝāĻŧ⧇āϛ⧇" +retry: "āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύ" +pageLoadError: "āĻĒ⧇āϜ āϞ⧋āĻĄ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻŋ" +pageLoadErrorDescription: "āĻāϟāĻŋ āϏāĻžāϧāĻžāϰāύāϤ āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āϕ⧇āϰ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āĻŦāĻž āĻŦā§āϰāĻžāωāϜāĻžāϰ āĻ•ā§āϝāĻžāĻļ⧇āϰ āĻ•āĻžāϰāϪ⧇ āϘāĻŸā§‡ āĻĨāĻžāϕ⧇āĨ¤ āĻŦā§āϰāĻžāωāϜāĻžāϰ āĻāϰ āĻ•ā§āϝāĻžāĻļ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻāĻ•āϟ⧁ āĻĒāϰ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤ " +serverIsDead: "āĻāχ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āϏāĻžā§œāĻž āĻĻāĻŋāĻšā§āϛ⧇ āύāĻžāĨ¤ āĻāĻ•āϟ⧁ āĻĒāϰ⧇ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤" +youShouldUpgradeClient: "āĻāχ āĻĒ⧇āϜ āĻĻ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ āĻŦā§āϰāĻžāωāϜāĻžāϰ āϰāĻŋāĻĢā§āϰ⧇āĻļ āĻ•āϰ⧇ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧁āύāĨ¤ " +enterListName: "āϞāĻŋāĻ¸ā§āĻŸā§‡āϰ āύāĻžāĻŽ āϞāĻŋāϖ⧁āύ" +privacy: "āĻ—ā§‹āĻĒāĻ¨ā§€ā§ŸāϤāĻž" +makeFollowManuallyApprove: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āĻ—ā§ƒāĻšā§€āϤ āĻšāĻ“ā§ŸāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āϞāĻžāĻ—āĻŦ⧇" +defaultNoteVisibility: "āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻĻ⧃āĻļā§āϝāĻŽāĻžāĻ¨ā§āϝāϤāĻž" +follow: "āĻ…āύ⧁āϏāϰāĻŖ" +followRequest: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ" +followRequests: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧāϏāĻŽā§‚āĻš" +unfollow: "āĻ…āύ⧁āϏāϰāĻŖ āĻŦāĻžāϤāĻŋāϞ" +followRequestPending: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āĻŦāĻŋāϚāĻžāϰāĻžāϧ⧀āύ" +enterEmoji: "āχāĻŽā§‹āϜāĻŋ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāĻžāύ" +renote: "āϰāĻŋāύ⧋āϟ" +unrenote: "āϰāĻŋāύ⧋āϟ āϏāϰāĻžāύ " +renoted: "āϰāĻŋāύ⧋āϟ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +cantRenote: "āĻāχ āύ⧋āϟāϟāĻŋ āϰāĻŋāύ⧋āϟ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ āύāĻžāĨ¤" +cantReRenote: "āϰāĻŋāύ⧋āϟāϕ⧇ āϰāĻŋāύ⧋āϟ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ āύāĻžāĨ¤" +quote: "āωāĻĻā§āϧ⧃āϤāĻŋ" +pinnedNote: "āĻĒāĻŋāύ āĻ•āϰāĻž āύ⧋āϟ" +pinned: "āĻĒāĻŋāύ āĻ•āϰāĻž" +you: "āφāĻĒāύāĻŋ" +clickToShow: "āĻĻ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ" +sensitive: "āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁" +add: "āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ" +reaction: "āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž" +reactionSetting: "āϰāĻŋāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒāĻŋāĻ•āĻžāϰ⧇ āϝ⧇āϏāĻ•āϞ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋ⧟āĻž āĻĻ⧇āĻ–āĻžāύ⧋ āĻšāĻŦ⧇" +reactionSettingDescription2: "āĻĒ⧁āύāϰāĻžāϝāĻŧ āϏāĻžāϜāĻžāϤ⧇ āĻŸā§‡āύ⧇ āφāύ⧁āύ, āĻŽā§āĻ›āϤ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ, āϝ⧋āĻ— āĻ•āϰāϤ⧇ + āϟāĻŋāĻĒ⧁āύāĨ¤" +rememberNoteVisibility: "āύ⧋āĻŸā§‡āϰ āĻĻ⧃āĻļā§āϝāĻŽāĻžāĻ¨ā§āϝāϤāĻžāϰ āϏ⧇āϟāĻŋāĻ‚āϏ āĻŽāύ⧇ āϰāĻžāϖ⧁āύ" +attachCancel: "āĻ…ā§āϝāĻžāϟāĻžāϚāĻŽā§‡āĻ¨ā§āϟ āϏāϰāĻžāύ " +markAsSensitive: "āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +unmarkAsSensitive: "āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āϚāĻŋāĻšā§āύ āϏāϰāĻžāύ" +enterFileName: "āĻĢāĻžāχāϞ⧇āϰ āύāĻžāĻŽ āϞāĻŋāϖ⧁āύ" +mute: "āĻŽāĻŋāωāϟ" +unmute: "āφāύāĻŽāĻŋāωāϟ" +block: "āĻŦā§āϞāĻ•" +unblock: "āĻŦā§āϞāĻ• āϏāϰāĻžāύ" +suspend: "āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāĻž" +unsuspend: "āĻ…āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāĻž" +blockConfirm: "āĻŦā§āϞāĻ• āĻ•āϰāϤ⧇ āϚāĻžāύ?" +unblockConfirm: "āĻŦā§āϞāĻ• āϏāϰāĻžāϤ⧇ āϚāĻžāύ?" +suspendConfirm: "āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +unsuspendConfirm: "āĻ…āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +selectList: "āϞāĻŋāĻ¸ā§āϟ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +selectAntenna: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻž āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +selectWidget: "āωāχāĻœā§‡āϟ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +editWidgets: "āωāχāĻœā§‡āϟ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύ" +editWidgetsExit: "āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻļ⧇āώ āĻ•āϰ⧁āύ" +customEmojis: "āĻ¸ā§āĻŦāύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āχāĻŽā§‹āϜāĻŋāϗ⧁āϞāĻŋ" +emoji: "āχāĻŽā§‹āϜāĻŋ" +emojis: "āχāĻŽā§‹āϜāĻŋāϗ⧁āϞāĻŋ" +emojiName: "āχāĻŽā§‹āϜāĻŋāϰ āύāĻžāĻŽ" +emojiUrl: "āχāĻŽā§‹āϜāĻŋāϰ URL" +addEmoji: "āχāĻŽā§‹āϜāĻŋ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ" +settingGuide: "āϏ⧁āĻĒāĻžāϰāĻŋāĻļāĻ•ā§ƒāϤ āϏ⧇āϟāĻŋāĻ‚āϏ" +cacheRemoteFiles: "āϰāĻŋāĻŽā§‹āϟ āĻĢāĻžāχāϞāϏāĻŽā§āĻš āĻ•ā§āϝāĻžāĻļ āĻ•āϰ⧁āύ" +cacheRemoteFilesDescription: "āϝāĻ–āύ āĻāχ āĻ…āĻĒāĻļāύāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻĨāĻžāϕ⧇ āϤāĻ–āύ āϰāĻŋāĻŽā§‹āϟ āĻĢāĻžāχāϞ āϏāĻŽā§‚āĻš āϏāϰāĻžāϏāϰāĻŋ āϰāĻŋāĻŽā§‹āϟ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ āĻĨ⧇āϕ⧇ āϞ⧋āĻĄ āĻ•āϰāĻž āĻšā§ŸāĨ¤ āĻāχ āĻ…āĻĒāĻļāύāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰāϞ⧇ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻāϰ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āĻŽāĻŦ⧇ āϤāĻŦ⧇ āĻĨāĻžāĻŽā§āĻŦāύ⧇āχāϞ āϤ⧈āϰāĻŋ āύāĻž āĻ•āϰāĻžāϰ āĻ•āĻžāϰāϪ⧇ āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻžāĻ¨ā§āĻĄāωāχāĻĨ āĻŦ⧇āĻļā§€ āϞāĻžāĻ—āĻŦ⧇āĨ¤ " +flagAsBot: "āĻŦāϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +flagAsBotDescription: "āĻāχ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋ āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĻā§āĻŦāĻžāϰāĻž āĻĒāϰāĻŋāϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻāχ āĻ…āĻĒāĻļāύāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύāĨ¤ āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•āĻļāĻžāύ āĻšā§‡āχāύāĻŋāĻ‚ āϰ⧋āϧ āĻ•āϰāϤ⧇, āĻŽāĻŋāĻ¸ā§āĻ•āĻŋāϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĒāϰāĻŋāϚāĻžāϞāύāĻžāϕ⧇ āĻŦāϟ-āĻŦāĻžāĻ¨ā§āϧāĻŦ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāĻĻ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āφāĻĒāύāĻžāϰ āĻŦāϟ āĻ āĻāχ āĻ…āĻĒāĻļāύāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ⧎" +flagAsCat: "āĻŦāĻŋ⧜āĻžāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +flagAsCatDescription: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋāϕ⧇ āĻŦāĻŋ⧜āĻžāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒāĻļāύāϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύāĨ¤" +autoAcceptFollowed: "āφāĻĒāύāĻŋ āϝ⧇āϏāĻŦ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇āύ, āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ āϤāĻžāĻĻ⧇āϰ āĻ…āύ⧁āϏāϰāϪ⧇āϰ āĻ…āύ⧁āϰāϧ āĻ¸ā§āĻŦā§€āĻ•āĻžāϰ āĻ•āϰ⧁āύ" +addAccount: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +loginFailed: "āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻŋ" +showOnRemote: "āϰāĻŋāĻŽā§‹āϟ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻĻ⧇āϖ⧁āύ" +general: "āϏāĻžāϧāĻžāϰāĻŖ" +wallpaper: "āĻ“āϝāĻŧāĻžāϞāĻĒ⧇āĻĒāĻžāϰ" +setWallpaper: "āĻ“āϝāĻŧāĻžāϞāĻĒ⧇āĻĒāĻžāϰ āϏ⧇āϟ āĻ•āϰ⧁āύ" +removeWallpaper: "āĻ“ā§ŸāĻžāϞāĻĒ⧇āĻĒāĻžāϰ āϏāϰāĻžāύ" +searchWith: "āϖ⧁āρāϜ⧁āύ: {q}" +youHaveNoLists: "āφāĻĒāύāĻžāϰ āϕ⧋āύ āϞāĻŋāĻ¸ā§āϟ āύ⧇āχ" +followConfirm: "{name} āϕ⧇ āĻĢāϞ⧋āĻ“ āĻ•āϰāĻžāϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +proxyAccount: "āĻĒā§āϰāĻ•ā§āϏāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ" +proxyAccountDescription: "āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•ā§āϏāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϝāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻ°ā§āϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϜāĻ¨ā§āϝ āϰāĻŋāĻŽā§‹āϟ āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āϝāĻ–āύ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āϰāĻŋāĻŽā§‹āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻ•āϰ⧇, āϤāĻ–āύ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ⧇āϰ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻšāĻŦ⧇ āύāĻž āϝāĻĻāĻŋ āύāĻž āϕ⧇āω āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇, āϤāĻžāχ āĻĒā§āϰāĻ•ā§āϏāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻĻā§āĻŦāĻžāϰāĻž āϤāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" +host: "āĻšā§‹āĻ¸ā§āϟ" +selectUser: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +recipient: "āĻĒā§āϰāϤāĻŋ" +annotation: "āĻŽāĻ¨ā§āϤāĻŦā§āϝ" +federation: "āĻĢ⧇āĻĄāĻŋāĻ­āĻžāĻ°ā§āϏ" +instances: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ" +registeredAt: "āϝ⧋āĻ— āĻĻāĻŋā§Ÿā§‡āϛ⧇āύ" +latestRequestSentAt: "āĻļ⧇āώ āϰāĻŋāĻ•ā§ā§Ÿā§‡āĻ¸ā§āϟ āĻĒāĻžāĻ āĻžāύ⧋ āĻšā§Ÿā§‡āϛ⧇" +latestRequestReceivedAt: "āĻļ⧇āώ āϰāĻŋāĻ•ā§ā§Ÿā§‡āĻ¸ā§āϟ āĻ—ā§ƒāĻšā§€āϤ āĻšā§Ÿā§‡āϛ⧇" +latestStatus: "āϏāĻ°ā§āĻŦāĻļ⧇āώ āĻ…āĻŦāĻ¸ā§āĻĨāĻž" +storageUsage: "āĻ¸ā§āĻŸā§‹āϰ⧇āĻœā§‡āϰ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ" +charts: "āϚāĻžāĻ°ā§āϟ" +perHour: "āϘāĻ¨ā§āϟāĻž āĻĒā§āϰāϤāĻŋ" +perDay: "āĻĻ⧈āύāĻŋāĻ•" +stopActivityDelivery: "āĻ…ā§āϝāĻžāĻ•ā§āϟāĻŋāĻ­āĻŋāϟāĻŋ āĻĒāĻžāĻ āĻžāύ⧋ āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ" +blockThisInstance: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ āĻŦā§āϞāĻ• āĻ•āϰ⧁āύ" +operations: "āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ" +software: "āϏāĻĢāϟāĻ“ā§Ÿā§āϝāĻžāϰ" +version: "āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ" +metadata: "āĻŽā§‡āϟāĻžāĻĄāĻžāϟāĻž" +withNFiles: "{n} āϟāĻŋ āĻĢāĻžāχāϞ" +monitor: "āĻŽāύāĻŋāϟāϰ" +jobQueue: "āϜāĻŦ āĻ•āĻŋāω" +cpuAndMemory: "āϏāĻŋāĻĒāĻŋāω āĻāĻŦāĻ‚ āĻŽā§‡āĻŽāϰāĻŋ" +network: "āύ⧇āϟāĻ“ā§ŸāĻžāĻ°ā§āĻ•" +disk: "āĻĄāĻŋāĻ¸ā§āĻ•" +instanceInfo: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āϤāĻĨā§āϝ" +statistics: "āĻĒāϰāĻŋāϏāĻ‚āĻ–ā§āϝāĻžāύ" +clearQueue: "āĻ•āĻŋāω āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧁āύ" +clearQueueConfirmTitle: "āφāĻĒāύāĻŋ āĻ•āĻŋ āĻ•āĻŋāω āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻžāϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +clearQueueConfirmText: "āĻŦāĻŋāϤāϰāĻŖ āύāĻž āĻ•āϰāĻž āύ⧋āϟ āφāϰ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻšāĻŦ⧇ āύāĻžāĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ āφāĻĒāύāĻžāϰ āĻāϟāĻŋ āĻ•āϰāĻžāϰ āĻĻāϰāĻ•āĻžāϰ āύ⧇āχāĨ¤" +clearCachedFiles: "āĻ•ā§āϝāĻžāĻļ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧁āύ" +clearCachedFilesConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āĻ•ā§āϝāĻžāĻļ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰāĻžāϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +blockedInstances: "āĻŦā§āϞāĻ•āĻ•ā§ƒāϤ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏāϏāĻŽā§āĻš" +blockedInstancesDescription: "āφāĻĒāύāĻŋ āϝ⧇ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏāϗ⧁āϞāĻŋ āĻŦā§āϞāĻ• āĻ•āϰāϤ⧇ āϚāĻžāύ āϤāĻžāϰ āĻšā§‹āĻ¸ā§āϟāύ⧇āĻŽāϗ⧁āϞāĻŋ āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ•āϟāĻŋ āφāϞāĻžāĻĻāĻž āϞāĻžāχāύ⧇ āϞāĻŋāϖ⧁āύāĨ¤ āĻŦā§āϞāĻ•āĻ•ā§ƒāϤ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏāϗ⧁āϞāĻŋ āĻāχ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύāĻžā§ˇ" +muteAndBlock: "āĻŽāĻŋāωāϟ āĻāĻŦāĻ‚ āĻŦā§āϞāĻ•āϗ⧁āϞāĻŋ" +mutedUsers: "āύāĻŋāσāĻļāĻŦā§āĻĻāĻ•ā§ƒāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀" +blockedUsers: "āϝāĻžāĻĻ⧇āϰ āĻŦā§āϞāĻ• āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +noUsers: "āϕ⧋āύ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āύ⧇āχ" +editProfile: "āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻ•āϰ⧁āύ" +noteDeleteConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āύ⧋āϟ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāĻžāϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +pinLimitExceeded: "āφāĻĒāύāĻŋ āφāϰ āϕ⧋āύ āύ⧋āϟ āĻĒāĻŋāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āύāĻž" +intro: "Misskey āĻāϰ āχāĻ¨ā§āϏāϟāϞ⧇āĻļāύ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšā§Ÿā§‡āϛ⧇īŧāĻĻ⧟āĻž āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻĄāĻŽāĻŋāύ āχāωāϜāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤" +done: "āϏāĻŽā§āĻĒāĻ¨ā§āύ" +processing: "āĻĒā§āϰāĻ•ā§āϰāĻŋ⧟āĻžāϧ⧀āύ..." +preview: "āĻĒā§‚āĻ°ā§āĻŦāϰ⧂āĻĒ āĻĻ⧇āϖ⧁āύ" +default: "āĻĒā§‚āĻ°ā§āĻŦāύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ" +noCustomEmojis: "āϕ⧋āύ āχāĻŽā§‹āϜāĻŋ āύāĻžāχ" +noJobs: "āϕ⧋āύ āϜāĻŦ āύāĻžāχ" +federating: "āĻĢ⧇āĻĄāĻžāϰ⧇āϟ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" +blocked: "āĻŦā§āϞāĻ• āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +suspended: "āĻ¸ā§āĻĨāĻ—āĻŋāϤ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +all: "āϏāĻŦāϗ⧁āϞ⧋" +subscribing: "āϏāĻĻāĻ¸ā§āϝāϤāĻž āĻ¨ā§‡ā§ŸāĻž āĻšāĻšā§āϛ⧇" +publishing: "āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" +notResponding: "āϏāĻžā§œāĻž āύ⧇āχ" +instanceFollowing: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" +instanceFollowers: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀" +instanceUsers: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀" +changePassword: "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧁āύ" +security: "āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž" +retypedNotMatch: "āχāύāĻĒ⧁āϟ āĻŽā§‡āϞ⧇ āύāĻžāĨ¤" +currentPassword: "āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +newPassword: "āύāϤ⧁āύ āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ" +newPasswordRetype: "āύāϤ⧁āύ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ (āĻĒ⧁āύāϰāĻžāϝāĻŧ āϞāĻŋāϖ⧁āύ)" +attachFile: "āĻĢāĻžāχāϞ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ" +more: "āφāϰāĻ“!" +featured: "āĻšāĻžāχāϞāĻžāχāϟ" +usernameOrUserId: "āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻŦāĻž āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ ID" +noSuchUser: "āϕ⧋āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāύāĻŋ" +lookup: "āϖ⧁āρāĻœā§‡ āĻĻ⧇āĻ–ā§‹" +announcements: "āĻ˜ā§‹āώāĻŖāĻž" +imageUrl: "āϚāĻŋāĻ¤ā§āϰ⧇āϰ URL" +remove: "āĻŽā§āϛ⧁āύ" +removed: "āϏāϰāĻžāύ⧋ āĻšāϝāĻŧ⧇āϛ⧇" +removeAreYouSure: "āφāĻĒāύāĻŋ āĻ•āĻŋ \"{x}\" āϏāϰāĻžāύ⧋āϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +deleteAreYouSure: "āφāĻĒāύāĻŋ āĻ•āĻŋ \"{x}\" āϏāϰāĻžāύ⧋āϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +resetAreYouSure: "āϰāĻŋāϏ⧇āϟ āĻ•āϰāĻžāϰ āĻŦā§āϝāĻžāĻĒāĻžāϰ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ?" +saved: "āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻšā§Ÿā§‡āϛ⧇" +messaging: "āĻšā§āϝāĻžāϟ" +upload: "āφāĻĒāϞ⧋āĻĄ" +keepOriginalUploading: "āφāϏāϞ āĻ›āĻŦāĻŋ āϰāĻžāϖ⧁āύ" +keepOriginalUploadingDescription: "āĻ›āĻŦāĻŋāϟāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āφāϏāϞ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖāϟāĻŋ āϰāĻžāϖ⧁āύāĨ¤ āĻ…āĻĒāĻļāύāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻĨāĻžāĻ•āϞ⧇, āφāĻĒāϞ⧋āĻĄā§‡āϰ āϏāĻŽāϝāĻŧ āĻ“āϝāĻŧ⧇āĻŦ āĻĒā§āϰāĻ•āĻžāĻļāύāĻžāϰ āϜāĻ¨ā§āϝ āĻ›āĻŦāĻŋ āĻŦā§āϰāĻžāωāϜāĻžāϰ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤" +fromDrive: "āĻĄā§āϰāĻžāχāĻ­ āĻšāϤ⧇" +fromUrl: "URL āĻšāϤ⧇" +uploadFromUrl: "URL āĻšāϤ⧇ āφāĻĒāϞ⧋āĻĄ" +uploadFromUrlDescription: "āϝ⧇ āĻĢāĻžāχāϞāϟāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āϚāĻžāύ, āϏ⧇āϟāĻŋāϰ URL" +uploadFromUrlRequested: "āφāĻĒāϞ⧋āĻĄ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +uploadFromUrlMayTakeTime: "URL āĻšāϤ⧇ āφāĻĒāϞ⧋āĻĄ āĻšāϤ⧇ āĻ•āĻŋāϛ⧁ āϏāĻŽā§Ÿ āϞāĻžāĻ—āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤" +explore: "āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ" +messageRead: "āĻĒāĻĄāĻŧāĻž" +noMoreHistory: "āφāϰ āϕ⧋āύ āχāϤāĻŋāĻšāĻžāϏ āύ⧇āχ" +startMessaging: "āĻšā§āϝāĻžāϟ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ" +nUsersRead: "{n} āϜāύ āĻĒā§œā§‡āϛ⧇āύ" +agreeTo: "{0} āĻāϰ āĻĒā§āϰāϤāĻŋ āφāĻŽāĻŋ āϏāĻŽā§āĻŽāϤ" +tos: "āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻļāĻ°ā§āϤāĻžāĻĻāĻŋ" +start: "āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ" +home: "āĻŽā§‚āϞ āĻĒāĻžāϤāĻž" +remoteUserCaution: "āĻāχ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϰāĻŋāĻŽā§‹āϟ āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ, āύāĻŋāĻŽā§āύāĻ•ā§āϤ āϤāĻĨā§āϝ āĻ…āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤" +activity: "āĻ•āĻžāĻ°ā§āϝāĻ•āϞāĻžāĻĒ" +images: "āĻ›āĻŦāĻŋ" +birthday: "āϜāĻ¨ā§āĻŽāĻĻāĻŋāύ" +yearsOld: "{age} āĻŦāĻ›āϰ" +registeredDate: "āϝ⧋āĻ—āĻĻāĻžāύ⧇āϰ āϤāĻžāϰāĻŋāĻ–" +location: "āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ" +theme: "āĻĨāĻŋāĻŽ" +themeForLightMode: "āϞāĻžāχāϟ āĻŽā§‹āĻĄā§‡āϰ āĻĨāĻŋāĻŽ" +themeForDarkMode: "āĻĄāĻžāĻ°ā§āĻ• āĻŽā§‹āĻĄā§‡āϰ āĻĨāĻŋāĻŽ" +light: "āφāϞ⧋āĻ•āĻŋāϤ" +dark: "āĻ…āĻ¨ā§āϧāĻ•āĻžāϰ" +lightThemes: "āφāϞ⧋āĻ•āĻŋāϤ āĻĨāĻŋāĻŽ" +darkThemes: "āĻ…āĻ¨ā§āϧāĻ•āĻžāϰ āĻĨāĻŋāĻŽ" +syncDeviceDarkMode: "āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϏ⧇āϟāĻŋāĻ‚ āĻ…āύ⧁āϝāĻžā§Ÿā§€ āĻĄāĻžāĻ°ā§āĻ• āĻŽā§‹āĻĄ āϏ⧇āϟ āĻ•āϰ⧁āύ" +drive: "āĻĄā§āϰāĻžāχāĻ­" +fileName: "āĻĢāĻžāχāϞ⧇āϰ āύāĻžāĻŽ" +selectFile: "āĻĢāĻžāχāϞ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +selectFiles: "āĻĢāĻžāχāϞ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +selectFolder: "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +selectFolders: "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ" +renameFile: "āĻĢāĻžāχāϞ āĻĒ⧁āύāσāύāĻžāĻŽāĻ•āϰāύ" +folderName: "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇āϰ āύāĻžāĻŽ" +createFolder: "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +renameFolder: "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻĒ⧁āύāσāύāĻžāĻŽāĻ•āϰāύ" +deleteFolder: "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻŽā§āϛ⧁āύ" +addFile: "āĻĢāĻžāχāϞ āϝ⧋āĻ— āĻ•āϰ⧁āύ" +emptyDrive: "āφāĻĒāύāĻžāϰ āĻĄā§āϰāĻžāχāĻ­ āĻ–āĻžāϞāĻŋ" +emptyFolder: "āĻāχ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻ–āĻžāϞāĻŋ" +unableToDelete: "āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āϝāĻžā§ŸāύāĻŋ" +inputNewFileName: "āĻĢāĻžāχāϞ⧇āϰ āύāϤ⧁āύ āύāĻžāĻŽ āϞāĻŋāϖ⧁āύ" +inputNewDescription: "āύāϤ⧁āύ āĻ•ā§āϝāĻžāĻĒāĻļāύ āϞāĻŋāϖ⧁āύ" +inputNewFolderName: "āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ⧇āϰ āύāϤ⧁āύ āύāĻžāĻŽ āϞāĻŋāϖ⧁āύ" +circularReferenceFolder: "āĻ—āĻ¨ā§āϤāĻŦā§āϝ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϟāĻŋ āφāĻĒāύāĻŋ āϝ⧇ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϟāĻŋ āϏāϰāĻžāϤ⧇ āϚāĻžāύ āϤāĻžāϰ āĻāĻ•āϟāĻŋ āϏāĻžāĻŦāĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāĨ¤" +hasChildFilesOrFolders: "āĻāχ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϟāĻŋ āĻ–āĻžāϞāĻŋ āύāĻž āĻšāĻ“ā§ŸāĻžā§Ÿ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻŋāĨ¤" +copyUrl: "URL āĻ•āĻĒāĻŋ āĻ•āϰ⧁āύ" +rename: "āĻĒ⧁āύāσāύāĻžāĻŽāĻ•āϰāĻŖ" +avatar: "āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻ›āĻŦāĻŋ" +banner: "āĻŦā§āϝāĻžāύāĻžāϰ" +nsfw: "āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻŦāĻŋāώ⧟āĻŦāĻ¸ā§āϤ⧁" +whenServerDisconnected: "āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇" +disconnectedFromServer: "āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āϏāĻ‚āϝ⧋āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻšāϝāĻŧ⧇āϛ⧇" +reload: "āφāĻŦāĻžāϰ āϞ⧋āĻĄ āĻ•āϰ⧁āύ" +doNothing: "āĻ•āĻŋāϛ⧁ āĻ•āϰāĻŦ⧇āύ āύāĻž" +reloadConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āϰāĻŋāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +watch: "āĻĻ⧇āϖ⧁āύ" +unwatch: "āĻĻ⧇āĻ–āĻž āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ " +accept: "āĻ…āύ⧁āĻŽā§‹āĻĻāύ" +reject: "āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ" +normal: "āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•" +instanceName: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āύāĻžāĻŽ" +instanceDescription: "āχāĻ¨ā§āϏāĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻž" +maintainerName: "āĻŽā§‡āχāύāĻŸā§‡āχāύāĻžāϰ" +maintainerEmail: "āĻŽā§‡āχāύāĻŸā§‡āχāύāĻžāϰ⧇āϰ āχāĻŽā§‡āχāϞ" +tosUrl: "āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āĻļāĻ°ā§āϤāĻžāĻŦāϞ⧀āϰ URL" +thisYear: "āĻŦāĻ›āϰ" +thisMonth: "āĻŽāĻžāϏ" +today: "āφāϜ" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "āĻĒ⧃āĻˇā§āĻ āĻž" +integration: "āχāĻ¨ā§āϟāĻŋāĻ—ā§āϰ⧇āĻļāύ" +connectService: "āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ" +disconnectService: "āϏāĻ‚āϝ⧋āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻ•āϰ⧁āύ" +enableLocalTimeline: "āĻ¸ā§āĻĨāĻžāĻ¨ā§€ā§Ÿ āϟāĻžāχāĻŽāϞāĻžāχāύ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +enableGlobalTimeline: "āĻ—ā§āϞ⧋āĻŦāĻžāϞ āϟāĻžāχāĻŽāϞāĻžāχāύ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +disablingTimelinesInfo: "āφāĻĒāύāĻŋ āĻāχ āϟāĻžāχāĻŽāϞāĻžāχāύāϗ⧁āϞāĻŋ āĻŦāĻ¨ā§āϧ āĻ•āϰāϞ⧇āĻ“ āĻĒā§āϰāĻļāĻžāϏāĻ• āĻāĻŦāĻ‚ āĻŽāĻĄāĻžāϰ⧇āϟāϰāϰāĻž āĻāχ āϟāĻžāχāĻŽāϞāĻžāχāύāϗ⧁āϞāĻŋ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇" +registration: "āύāĻŋāĻŦāĻ¨ā§āϧāύ" +enableRegistration: "āύāϤ⧁āύ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āύāĻŋāĻŦāĻ¨ā§āϧāύ āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +invite: "āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ" +proxyRemoteFiles: "āϰāĻŋāĻŽā§‹āϟ āĻĢāĻžāχāϞāϏāĻŽā§āĻš āĻĒā§āϰāĻ•ā§āϏāĻŋ āĻ•āϰ⧁āύ" +proxyRemoteFilesDescription: "āϝāĻ–āύ āĻāχ āϏ⧇āϟāĻŋāĻ‚āϟāĻŋ āϚāĻžāϞ⧁ āĻĨāĻžāϕ⧇, āϤāĻ–āύ āĻ…āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻŦāĻž āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āĻ•ā§āώāĻŽāϤāĻžāϰ āĻ•āĻžāϰāϪ⧇ āĻĻā§‚āϰāĻŦāĻ°ā§āϤ⧀ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋāϕ⧇ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāĻ•ā§āϏāĻŋ āĻ•āϰāĻž āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āĻĨāĻžāĻŽā§āĻŦāύ⧇āϞāϗ⧁āϞāĻŋāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻŦ⧇⧎ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āύāĻž," +driveCapacityPerLocalAccount: "āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ• āĻ¸ā§āĻĨāĻžāĻ¨ā§€ā§Ÿ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻĄā§āϰāĻžāχāϭ⧇āϰ āϜāĻžā§ŸāĻ—āĻž" +driveCapacityPerRemoteAccount: "āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ• āϰāĻŋāĻŽā§‹āϟ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻĄā§āϰāĻžāχāϭ⧇āϰ āϜāĻžā§ŸāĻ—āĻž" +inMb: "āĻŽā§‡āĻ—āĻžāĻŦāĻžāχāĻŸā§‡ āϞāĻŋāϖ⧁āύ" +iconUrl: "āφāχāĻ•āύ⧇āϰ URL (āĻĢā§āϝāĻžāĻ­āĻŋāĻ•āύ, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ)" +bannerUrl: "āĻŦā§āϝāĻžāύāĻžāϰ āĻ›āĻŦāĻŋāϰ URL" +backgroundImageUrl: "āĻĒāϟāĻ­ā§‚āĻŽāĻŋāϰ āϚāĻŋāĻ¤ā§āϰ⧇āϰ URL" +basicInfo: "āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϤāĻĨā§āϝ" +pinnedUsers: "āĻĒāĻŋāύ āĻ•āϰāĻž āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āĻŖ" +pinnedUsersDescription: "āφāĻĒāύāĻŋ āϝ⧇āϏāĻŦ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ \"āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ\" āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āĻĒāĻŋāύ āĻ•āϰāϤ⧇ āϚāĻžāύ āϤāĻžāĻĻ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧁āύ, āĻĒā§āϰāĻ¤ā§āϝ⧇āϕ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻž āφāϞāĻžāĻĻāĻž āϞāĻžāχāύ⧇ āϞāĻŋāϖ⧁āύ" +pinnedPages: "āĻĒāĻŋāύ āĻ•āϰāĻž āĻĒ⧃āĻˇā§āĻ āĻžāϏ⧁āĻŽāĻš" +pinnedPagesDescription: "āφāĻĒāύāĻŋ āϝ⧇āϏāĻ•āϞ āĻĒ⧃āĻˇā§āĻ āĻžāϏāĻŽā§‚āĻšāϕ⧇ \"āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ\" āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āĻĒāĻŋāύ āĻ•āϰāϤ⧇ āϚāĻžāύ āϤāĻžāĻĻ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧁āύ, āĻĒā§āϰāĻ¤ā§āϝ⧇āϕ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻž āφāϞāĻžāĻĻāĻž āϞāĻžāχāύ⧇ āϞāĻŋāϖ⧁āύ" +pinnedClipId: "āĻĒāĻŋāύāĻ•ā§ƒāϤ āĻ•ā§āϞāĻŋāĻĒ⧇āϰ ID" +pinnedNotes: "āĻĒāĻŋāύ āĻ•āϰāĻž āύ⧋āϟ" +hcaptcha: "hCaptcha" +enableHcaptcha: "hCaptcha āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +hcaptchaSiteKey: "āϏāĻžāχāϟ āϕ⧀" +hcaptchaSecretKey: "āϏāĻŋāĻ•ā§āϰ⧇āϟ āϕ⧀" +recaptcha: "reCAPTCHA" +enableRecaptcha: "reCAPTCHA āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +recaptchaSiteKey: "āϏāĻžāχāϟ āϕ⧀" +antennas: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻž" +manageAntennas: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻž āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻž" +name: "āύāĻžāĻŽ" +antennaSource: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻžāϰ āĻ‰ā§ŽāϏ" +antennaKeywords: "āϝ⧇āϏāĻŦ āϕ⧀āĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻ⧇āĻ–āĻž āĻšāĻŦ⧇" +antennaExcludeKeywords: "āϝ⧇āϏāĻŦ āϕ⧀āĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĻ⧇āĻ–āĻž āĻšāĻŦ⧇ āύāĻž" +antennaKeywordsDescription: "āĻ¸ā§āĻĒ⧇āϏ āĻĻāĻŋāϝāĻŧ⧇ āφāϞāĻžāĻĻāĻž āĻ•āϰāϞ⧇ AND āĻļāĻ°ā§āϤ āϤ⧈āϰāĻŋ āĻšāĻŦ⧇ āĻāĻŦāĻ‚ āφāϞāĻžāĻĻāĻž āϞāĻžāχāύ⧇ āϞāĻŋāĻ–āϞ⧇ OR āĻļāĻ°ā§āϤ āϤ⧈āϰāĻŋ āĻšāĻŦ⧇āĨ¤" +notifyAntenna: "āύāϤ⧁āύ āύ⧋āϟ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ…āĻŦāĻšāĻŋāϤ āĻ•āϰ⧁āύ" +withFileAntenna: "āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĢāĻžāχāϞāϝ⧁āĻ•ā§āϤ āύ⧋āϟ" +enableServiceworker: "ServiceWorker āϚāĻžāϞ⧁ āĻ•āϰ⧁āύ" +antennaUsersDescription: "āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ• āϞāĻžāχāύ⧇ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āϞāĻŋāϖ⧁āύ" +caseSensitive: "āϛ⧋āϟ āĻšāĻžāϤ⧇āϰ āĻāĻŦāĻ‚ āĻŦ⧜ āĻšāĻžāϤ⧇āϰ āĻ…āĻ•ā§āώāϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧁āύ" +withReplies: "āϜāĻŦāĻžāĻŦāϏāĻŽā§āĻš āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ" +connectedTo: "āφāĻĒāύāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ" +notesAndReplies: "āύ⧋āϟāϏāĻŽā§‚āĻš āĻāĻŦāĻ‚ āϜāĻŦāĻžāĻŦāϗ⧁āϞāĻŋ" +withFiles: "āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ" +silence: "āύ⧀āϰāĻŦ" +silenceConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāχ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇āϰ āύ⧀āϰāĻŦ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +unsilence: "āϏāϰāĻŦ" +unsilenceConfirm: "āφāĻĒāύāĻŋ āĻ•āĻŋ āĻāχ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇āϰ āϏāϰāĻŦ āĻ•āϰāϤ⧇ āϚāĻžāύ?" +popularUsers: "āϜāύāĻĒā§āϰāĻŋāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āύ" +recentlyUpdatedUsers: "āϏāĻŽā§āĻĒā§āϰāϤāĻŋ āĻĒā§‹āĻ¸ā§āϟ āĻ•āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āύ" +recentlyRegisteredUsers: "āύāϤ⧁āύ āϝ⧋āĻ— āĻĻ⧇āĻ“ā§ŸāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āύ" +recentlyDiscoveredUsers: "āύāϤ⧁āύ āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻ“ā§ŸāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āύ" +exploreUsersCount: "{count} āϜāύ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀" +exploreFediverse: "Fediverse āϘ⧁āϰ⧇ āĻĻ⧇āϖ⧁āύ" +popularTags: "āϜāύāĻĒā§āϰāĻŋ⧟ āĻŸā§āϝāĻžāĻ—āϗ⧁āϞāĻŋ" +userList: "āϞāĻŋāĻ¸ā§āϟ" +about: "āφāĻĒāύāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇" +aboutMisskey: "Misskey āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇" +administrator: "āĻĒā§āϰāĻļāĻžāϏāĻ•" +token: "āĻŸā§‹āϕ⧇āύ" +twoStepAuthentication: "⧍-āϧāĻžāĻĒ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ" +moderator: "āĻŽāĻĄāĻžāϰ⧇āϟāϰ" +nUsersMentioned: "{n} āϜāύāϕ⧇ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +securityKey: "āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āϕ⧀" +securityKeyName: "āϕ⧀'āϰ āύāĻžāĻŽ" +registerSecurityKey: "āϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āϕ⧀ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧁āύ" +lastUsed: "āĻļ⧇āώ āĻŦā§āϝāĻžāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇" +unregister: "āύāĻŋāĻŦāĻ¨ā§āϧāύāĻŽā§āĻ•ā§āϤ āĻšāύ" +passwordLessLogin: "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ-āĻŦāĻŋāĻšā§€āύ āϞāĻ—āχāύ āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧁āύ" +resetPassword: "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϰāĻŋāϏ⧇āϟ āĻ•āϰ⧁āύ" +newPasswordIs: "āύāϤ⧁āύ āĻĒāĻžāϏāĻ“ā§ŸāĻžāĻ°ā§āĻĄ āĻšāĻšā§āϛ⧇ \"{password}\"" +reduceUiAnimation: "UI āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻļāύ āĻ•āĻŽāĻžāύ" +share: "āĻļā§‡ā§ŸāĻžāϰ" +notFound: "āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§ŸāύāĻŋ" +notFoundDescription: "āĻāχ URL-āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āϕ⧋āύ⧋ āĻĒ⧃āĻˇā§āĻ āĻž āύ⧇āχāĨ¤" +uploadFolder: "āφāĻĒāϞ⧋āĻĄā§‡āϰ āϜāĻ¨ā§āϝ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ" +cacheClear: "āĻ•ā§āϝāĻžāĻļ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧁āύ" +markAsReadAllNotifications: "āϏāĻŽāĻ¸ā§āϤ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϗ⧁āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +markAsReadAllUnreadNotes: "āϏāĻŽāĻ¸ā§āϤ āύ⧋āϟāϗ⧁āϞāĻŋ āĻĒāĻ āĻŋāϤ āĻšāĻŋāϏāĻžāĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ" +invites: "āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ" +invitations: "āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ" +useOsNativeEmojis: "āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āύ⧇āϟāĻŋāĻ­ āχāĻŽā§‹āϜāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ" +disableDrawer: "āĻĄā§āϰāϝāĻŧāĻžāϰ āĻŽā§‡āύ⧁ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻŦ⧇āύ āύāĻž" +youHaveNoGroups: "āφāĻĒāύāĻžāϰ āϕ⧋āύ āĻ—ā§āϰ⧁āĻĒ āύ⧇āχ " +joinOrCreateGroup: "āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ—ā§āϰ⧁āĻĒ⧇āϰ āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻĒāĻžāύ āĻŦāĻž āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ—ā§āϰ⧁āĻĒ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ⧎" +noHistory: "āϕ⧋āύ⧋ āχāϤāĻŋāĻšāĻžāϏ āύ⧇āχ" +signinHistory: "āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāĻžāϰ āχāϤāĻŋāĻšāĻžāϏ" +disableAnimatedMfm: "āĻ…ā§āϝāĻžāύāĻŋāĻŽā§‡āĻŸā§‡āĻĄ MFM āĻ…āĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ" +doing: "āĻĒā§āϰāĻ•ā§āϰāĻŋ⧟āĻž āĻ•āϰāϛ⧇..." +category: "āĻŦāĻŋāĻ­āĻžāĻ—" +tags: "āĻŸâ€ā§āϝāĻžāĻ—āϏāĻŽā§‚āĻš" +docSource: "āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻ‰ā§ŽāϏ" +createAccount: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +existingAccount: "āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ" +regenerate: "āφāĻŦāĻžāϰāĻ“ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ" +fontSize: "āĻĢāĻ¨ā§āĻŸā§‡āϰ āφāĻ•āĻžāϰ" +noFollowRequests: "āφāĻĒāύāĻžāϰ āϕ⧋āύ āĻĢāϞ⧋āĻ“ āϰāĻŋāĻ•ā§ā§Ÿā§‡āĻ¸ā§āϟ āύ⧇āχ" +openImageInNewTab: "āĻ›āĻŦāĻŋ āύāϤ⧁āύ āĻŸā§āϝāĻžāĻŦ⧇ āϖ⧁āϞ⧁āύ" +dashboard: "āĻĄā§āϝāĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ" +local: "āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ" +remote: "āϰāĻŋāĻŽā§‹āϟ" +total: "āĻŽā§‹āϟ" +weekOverWeekChanges: "āĻ—āϤ āϏāĻĒā§āϤāĻžāĻšā§‡" +dayOverDayChanges: "āĻ—āϤāĻ•āĻžāϞ" +appearance: "āĻ…āĻŦ⧟āĻŦ" +clientSettings: "āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āϏ⧇āϟāĻŋāĻ‚āϏ" +accountSettings: "āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϏ⧇āϟāĻŋāĻ‚āϏ" +promotion: "āĻĒā§āϰāĻŽā§‹āĻļāύ" +promote: "āĻĒā§āϰāϚāĻžāϰ āĻ•āϰ⧁āύ" +numberOfDays: "āĻĻāĻŋāύ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž" +hideThisNote: "āύ⧋āϟāϟāĻŋ āϞ⧁āĻ•āĻžāύ" +smtpHost: "āĻšā§‹āĻ¸ā§āϟ" +smtpUser: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ" +smtpPass: "āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ" +clearCache: "āĻ•ā§āϝāĻžāĻļ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻ•āϰ⧁āύ" +info: "āφāĻĒāύāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇" +user: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻ—āĻŖ" +controlPanel: "āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāύ āϕ⧇āĻ¨ā§āĻĻā§āϰ" +_email: + _follow: + title: "āφāĻĒāύāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϛ⧇" +_mfm: + mention: "āωāĻ˛ā§āϞ⧇āĻ–" + quote: "āωāĻĻā§āϧ⧃āϤāĻŋ" + emoji: "āĻ¸ā§āĻŦāύāĻŋāĻ°ā§āϧāĻžāϰāĻŋāϤ āχāĻŽā§‹āϜāĻŋāϗ⧁āϞāĻŋ" + search: "āϖ⧁āρāϜ⧁āύ" +_theme: + keys: + mention: "āωāĻ˛ā§āϞ⧇āĻ–" + renote: "āϰāĻŋāύ⧋āϟ" +_sfx: + note: "āύ⧋āϟāϗ⧁āϞāĻŋ" + notification: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" + chat: "āĻšā§āϝāĻžāϟ" +_widgets: + notifications: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" + timeline: "āϟāĻžāχāĻŽāϞāĻžāχāύ" + activity: "āĻ•āĻžāĻ°ā§āϝāĻ•āϞāĻžāĻĒ" + federation: "āĻĢ⧇āĻĄāĻŋāĻ­āĻžāĻ°ā§āϏ" + jobQueue: "āϜāĻŦ āĻ•āĻŋāω" +_cw: + show: "āφāϰāĻ“ āĻĻ⧇āϖ⧁āύ" +_visibility: + home: "āĻŽā§‚āϞ āĻĒāĻžāϤāĻž" + followers: "āĻ…āύ⧁āϏāϰāĻŖāĻ•āĻžāϰ⧀" +_profile: + name: "āύāĻžāĻŽ" + username: "āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ" +_exportOrImport: + followingList: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" + muteList: "āĻŽāĻŋāωāϟ" + blockingList: "āĻŦā§āϞāĻ•" + userLists: "āϞāĻŋāĻ¸ā§āϟ" +_timelines: + home: "āĻŽā§‚āϞ āĻĒāĻžāϤāĻž" +_pages: + blocks: + image: "āĻ›āĻŦāĻŋ" + script: + categories: + list: "āϞāĻŋāĻ¸ā§āϟ" + blocks: + _join: + arg1: "āϞāĻŋāĻ¸ā§āϟ" + _randomPick: + arg1: "āϞāĻŋāĻ¸ā§āϟ" + _dailyRandomPick: + arg1: "āϞāĻŋāĻ¸ā§āϟ" + _seedRandomPick: + arg2: "āϞāĻŋāĻ¸ā§āϟ" + _pick: + arg1: "āϞāĻŋāĻ¸ā§āϟ" + _listLen: + arg1: "āϞāĻŋāĻ¸ā§āϟ" + types: + array: "āϞāĻŋāĻ¸ā§āϟ" +_notification: + youWereFollowed: "āφāĻĒāύāĻžāϕ⧇ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϛ⧇" + _types: + follow: "āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇" + mention: "āωāĻ˛ā§āϞ⧇āĻ–" + renote: "āϰāĻŋāύ⧋āϟ" + quote: "āωāĻĻā§āϧ⧃āϤāĻŋ" + reaction: "āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž" +_deck: + _columns: + notifications: "āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ" + tl: "āϟāĻžāχāĻŽāϞāĻžāχāύ" + antenna: "āĻ…ā§āϝāĻžāĻ¨ā§āĻŸā§‡āύāĻž" + list: "āϞāĻŋāĻ¸ā§āϟ" + mentions: "āωāĻ˛ā§āϞ⧇āĻ–āϏāĻŽā§‚āĻš" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index 2f327a905..05360e170 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -235,6 +235,8 @@ resetAreYouSure: "Wirklich zurÃŧcksetzen?" saved: "Gespeichert" messaging: "Chat" upload: "Hochladen" +keepOriginalUploading: "Originalbild speichern" +keepOriginalUploadingDescription: "Speichert das Originalbild so, wie es ist. Ist dies deaktiviert, wird eine Version zum Anzeigen im Internet generiert." fromDrive: "Aus Drive" fromUrl: "Von einer URL" uploadFromUrl: "Von einer URL hochladen" diff --git a/locales/en-US.yml b/locales/en-US.yml index 6bbe84821..9a2b0bf5c 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -235,6 +235,8 @@ resetAreYouSure: "Really reset?" saved: "Saved" messaging: "Chat" upload: "Upload" +keepOriginalUploading: "Keep original image" +keepOriginalUploadingDescription: "Saves the originally uploaded image as-is. If turned off, a version to display on the web will be generated on upload." fromDrive: "From Drive" fromUrl: "From URL" uploadFromUrl: "Upload from a URL" diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 58dd000cc..62f85bef8 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -235,6 +235,7 @@ resetAreYouSure: "Voulez-vous rÊinitialiser ?" saved: "EnregistrÊ" messaging: "Discuter" upload: "TÊlÊverser" +keepOriginalUploading: "Garder l’image d’origine" fromDrive: "Depuis le Drive" fromUrl: "Depuis une URL" uploadFromUrl: "TÊlÊverser via une URL" @@ -743,6 +744,7 @@ notRecommended: "DÊconseillÊ" botProtection: "Protection contre les bots" instanceBlocking: "Instances bloquÊes" selectAccount: "SÊlectionner un compte" +switchAccount: "Changer de compte" enabled: "ActivÊ" disabled: "DÊsactivÊ" quickAction: "Actions rapides" @@ -803,6 +805,7 @@ makeReactionsPublic: "Rendre les rÊactions publiques" makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos rÊactions donnÊes publique." classic: "Classique" muteThread: "Mettre ce thread en sourdine" +unmuteThread: "Ne plus masquer le fil" 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" @@ -1241,6 +1244,7 @@ _exportOrImport: muteList: "Comptes masquÊs" blockingList: "Comptes bloquÊs" userLists: "Listes" + excludeMutingUsers: "Exclure les utilisateur¡rice¡s mis en sourdine" excludeInactiveUsers: "Exclure les utilisateur¡rice¡s inactifs" _charts: federationInstancesIncDec: "Variation du nombre d'instances fÊdÊrÊes" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index b3279d78b..8fd41e533 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -235,6 +235,8 @@ resetAreYouSure: "ãƒĒã‚ģットしぞすかīŧŸ" saved: "äŋå­˜ã—ぞした" messaging: "ãƒãƒŖãƒƒãƒˆ" upload: "ã‚ĸップロãƒŧド" +keepOriginalUploading: "ã‚ĒãƒĒジナãƒĢį”ģ像をäŋæŒ" +keepOriginalUploadingDescription: "į”ģ像をã‚ĸップロãƒŧドする時ãĢã‚ĒãƒĒジナãƒĢį‰ˆã‚’äŋæŒã—ぞす。ã‚ĒフãĢするとã‚ĸップロãƒŧド時ãĢブナã‚Ļã‚ļでWebå…Ŧ開ᔍį”ģåƒã‚’į”Ÿæˆã—ãžã™ã€‚" fromDrive: "ドナイブから" fromUrl: "URLから" uploadFromUrl: "URLã‚ĸップロãƒŧド" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 7451603a6..38a328862 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -106,6 +106,7 @@ clickToShow: "클ëĻ­í•˜ė—Ŧ ëŗ´ę¸°" sensitive: "ė—´ëžŒėŖŧė˜" add: "ėļ”ę°€" reaction: "ëĻŦė•Ąė…˜" +reactionSetting: "ė„ íƒę¸°ė— í‘œė‹œí•  ëĻŦė•Ąė…˜" reactionSettingDescription2: "ëŒė–´ė„œ ėˆœė„œ ëŗ€ę˛Ŋ, 클ëĻ­í•´ė„œ ė‚­ė œ, īŧ‹ëĨŧ 눌ëŸŦė„œ ėļ”가할 눘 ėžˆėŠĩ니다." rememberNoteVisibility: "ęŗĩ氜 ë˛”ėœ„ëĨŧ 기ė–ĩ하기" attachCancel: "랍ëļ€ ėˇ¨ė†Œ" @@ -234,6 +235,8 @@ resetAreYouSure: "ė´ˆę¸°í™” í•˜ė‹œę˛ ėŠĩ니까?" saved: "ė €ėžĨí•˜ė˜€ėŠĩ니다" messaging: "대화" upload: "ė—…ëĄœë“œ" +keepOriginalUploading: "ė›ëŗ¸ ė´ë¯¸ė§€ëĨŧ ėœ ė§€" +keepOriginalUploadingDescription: "ė´ë¯¸ė§€ëĨŧ ė—…ëĄœë“œí•  ë•Œė— ė›ëŗ¸ė„ 그대로 ėœ ė§€í•Šë‹ˆë‹¤. ëš„í™œė„ąí™”í•˜ëŠ´ ė—…ëĄœë“œí•  때 브ëŧėš°ė €ė—ė„œ ė›š ęŗĩę°œėšŠ ė´ë¯¸ė§€ëĨŧ ėƒė„ąí•Šë‹ˆë‹¤." fromDrive: "드ëŧė´ë¸Œė—ė„œ" fromUrl: "URL로ëļ€í„°" uploadFromUrl: "URL ė—…ëĄœë“œ" @@ -446,6 +449,7 @@ uiLanguage: "UI í‘œė‹œ 떏떴" groupInvited: "ęˇ¸ëŖšė— ė´ˆëŒ€ë˜ė—ˆėŠĩ니다" aboutX: "{x}뗐 대하ė—Ŧ" useOsNativeEmojis: "OS ę¸°ëŗ¸ ė´ëǍ맀ëĨŧ ė‚ŦėšŠ" +disableDrawer: "ë“œëĄœė–´ 메뉴ëĨŧ ė‚ŦėšŠí•˜ė§€ ė•Šę¸°" youHaveNoGroups: "ęˇ¸ëŖšė´ ė—†ėŠĩ니다" joinOrCreateGroup: "다ëĨ¸ ęˇ¸ëŖšė˜ ė´ˆëŒ€ëĨŧ 받거나, 링렑 냈 ęˇ¸ëŖšė„ ë§Œë“¤ė–´ ëŗ´ė„¸ėš”." noHistory: "ę¸°ëĄė´ ė—†ėŠĩ니다" @@ -617,8 +621,11 @@ reportAbuse: "ė‹ ęŗ " reportAbuseOf: "{name}ė„ ė‹ ęŗ í•˜ę¸°" fillAbuseReportDescription: "ė‹ ęŗ í•˜ë ¤ëŠ” ė´ėœ ëĨŧ ėžė„¸ížˆ ė•Œë ¤ėŖŧė„¸ėš”. íŠšė • ę˛Œė‹œëŦŧė„ ė‹ ęŗ í•  ë•Œė—ëŠ” ę˛Œė‹œëŦŧė˜ URL도 íŦ함해 ėŖŧė„¸ėš”." abuseReported: "ė‹ ęŗ ëĨŧ ëŗ´ëƒˆėŠĩ니다. ė‹ ęŗ í•´ ėŖŧė…”ė„œ 감ė‚Ŧ합니다." +reporter: "ė‹ ęŗ ėž" reporteeOrigin: "í”ŧė‹ ęŗ ėž" reporterOrigin: "ė‹ ęŗ ėž" +forwardReport: "ëĻŦëĒ¨íŠ¸ ė¸ėŠ¤í„´ėŠ¤ė—ë„ ė‹ ęŗ  ë‚´ėšŠ ëŗ´ë‚´ę¸°" +forwardReportIsAnonymous: "ëĻŦëĒ¨íŠ¸ ė¸ėŠ¤í„´ėŠ¤ė—ė„œëŠ” ë‚˜ė˜ ė •ëŗ´ëĨŧ ëŗŧ 눘 ė—†ėœŧ늰, ėĩëĒ…ė˜ ė‹œėŠ¤í…œ ęŗ„ė •ėœŧ로 í‘œė‹œëŠë‹ˆë‹¤." send: "ė „ė†Ą" abuseMarkAsResolved: "해결됨ėœŧ로 í‘œė‹œ" openInNewTab: "냈 íƒ­ė—ė„œ 뗴揰" @@ -680,6 +687,7 @@ center: "ę°€ėš´ë°" wide: "넓게" narrow: "ėĸę˛Œ" reloadToApplySetting: "ė´ ė„¤ė •ė„ ė ėšŠí•˜ë ¤ëŠ´ íŽ˜ė´ė§€ëĨŧ ėƒˆëĄœęŗ ėš¨í•´ė•ŧ 합니다. 바로 ėƒˆëĄœęŗ ėš¨í•˜ė‹œę˛ ėŠĩ니까?" +needReloadToApply: "ëŗ€ę˛Ŋ ė‚Ŧí•­ė€ ėƒˆëĄœęŗ ėš¨í•˜ëŠ´ ė ėšŠëŠë‹ˆë‹¤." showTitlebar: "íƒ€ė´í‹€ 바ëĨŧ í‘œė‹œí•˜ę¸°" clearCache: "ėēė‹œ ëš„ėš°ę¸°" onlineUsersCount: "{n}ëĒ…ė´ ė ‘ė† 뤑" @@ -740,6 +748,7 @@ notRecommended: "ėļ”ė˛œí•˜ė§€ ė•ŠėŒ" botProtection: "Bot ë°Šė–´" instanceBlocking: "ė¸ėŠ¤í„´ėŠ¤ ė°¨ë‹¨" selectAccount: "ęŗ„ė • ė„ íƒ" +switchAccount: "ęŗ„ė • 바꾸기" enabled: "í™œė„ąí™”" disabled: "ëš„í™œė„ąí™”" quickAction: "ëš ëĨ¸ ë™ėž‘" @@ -808,6 +817,11 @@ deleteAccountConfirm: "ęŗ„ė •ė´ ė‚­ė œë˜ęŗ  되돌ëĻ´ 눘 ė—†ę˛Œ 됩니다. incorrectPassword: "비밀번호가 ė˜Ŧ바ëĨ´ė§€ ė•ŠėŠĩ니다." voteConfirm: "\"{choice}\"뗐 íˆŦí‘œí•˜ė‹œę˛ ėŠĩ니까?" hide: "눍揰揰" +leaveGroup: "ęˇ¸ëŖš 나가기" +leaveGroupConfirm: "\"{name}\"ė—ė„œ ë‚˜ę°ˆęšŒėš”?" +useDrawerReactionPickerForMobile: "ëĒ¨ë°”ėŧė—ė„œ ë“œëĄœė–´ 메뉴로 í‘œė‹œ" +welcomeBackWithName: "í™˜ė˜í•Šë‹ˆë‹¤, {name}님" +clickToFinishEmailVerification: "[{ok}]ëĨŧ 눌ëŸŦ ė´ëŠ”ėŧ ė¸ėĻė„ ė™„ëŖŒí•˜ė„¸ėš”." _emailUnavailable: used: "ė´ 메ėŧ ėŖŧė†ŒëŠ” ė‚ŦėšŠė¤‘ėž…ë‹ˆë‹¤" format: "í˜•ė‹ė´ ė˜Ŧ바ëĨ´ė§€ ė•ŠėŠĩ니다" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 5815c92f4..c54e64214 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -235,6 +235,8 @@ resetAreYouSure: "æĸ复éģ˜čŽ¤čŽžįŊŽīŧŸ" saved: "厞äŋå­˜" messaging: "čŠå¤Š" upload: "æœŦ地上äŧ " +keepOriginalUploading: "äŋį•™åŽŸå›ž" +keepOriginalUploadingDescription: "上äŧ å›žį‰‡æ—ļäŋį•™åŽŸå§‹å›žį‰‡ã€‚å…ŗé—­æ—ļīŧŒæĩč§ˆå™¨äŧšåœ¨ä¸Šäŧ æ—ļį”Ÿæˆä¸€åŧ į”¨äēŽwebå‘å¸ƒįš„å›žį‰‡ã€‚" fromDrive: "äģŽįŊ‘į›˜ä¸­" fromUrl: "äģŽ URL" uploadFromUrl: "äģŽįŊ‘址上äŧ " @@ -619,8 +621,11 @@ reportAbuse: "丞æŠĨ" reportAbuseOf: "丞æŠĨ{name}" fillAbuseReportDescription: "蝎åĄĢ写丞æŠĨįš„č¯Ļįģ†åŽŸå› ã€‚åĻ‚æžœæœ‰å¯šæ–šå‘įš„å¸–å­īŧŒč¯ˇåŒæ—ļåĄĢ写URL地址。" abuseReported: "å†…åŽšåˇ˛å‘é€ã€‚æ„Ÿč°ĸæ‚¨įš„æŠĨ告。" +reporter: "æŠĨå‘Šč€…" reporteeOrigin: "丞æŠĨæĨæē" reporterOrigin: "丞æŠĨ者æĨæē" +forwardReport: "将æŠĨ告čŊŦ发įģ™čŋœį¨‹åŽžäž‹" +forwardReportIsAnonymous: "在čŋœį¨‹åŽžäž‹ä¸Šæ˜žį¤ēįš„æŠĨå‘Šč€…æ˜¯åŒŋåįš„įŗģįģŸč´ĻåˇīŧŒč€Œä¸æ˜¯æ‚¨įš„č´Ļåˇã€‚" send: "发送" abuseMarkAsResolved: "å¤„į†åŽŒæ¯•" openInNewTab: "åœ¨æ–°æ ‡į­žéĄĩ中打åŧ€" diff --git a/package.json b/package.json index f6e05af4e..1615deba1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "12.102.1-simkey", + "version": "12.103.1-simkey", "codename": "indigo", "repository": { "type": "git", @@ -46,7 +46,7 @@ "@types/fluent-ffmpeg": "2.1.20", "@typescript-eslint/parser": "5.10.0", "cross-env": "7.0.3", - "cypress": "9.3.1", + "cypress": "9.4.1", "start-server-and-test": "1.14.0", "typescript": "4.5.5" } diff --git a/packages/backend/package.json b/packages/backend/package.json index 3d3a901f3..3541e803f 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -122,7 +122,7 @@ "langmap": "0.0.16", "mfm-js": "0.21.0", "mime-types": "2.1.34", - "misskey-js": "0.0.13", + "misskey-js": "0.0.14", "mocha": "8.4.0", "ms": "3.0.0-canary.1", "multer": "1.4.4", diff --git a/packages/backend/src/misc/is-duplicate-key-value-error.ts b/packages/backend/src/misc/is-duplicate-key-value-error.ts index 23d8ceb1b..04ff191e4 100644 --- a/packages/backend/src/misc/is-duplicate-key-value-error.ts +++ b/packages/backend/src/misc/is-duplicate-key-value-error.ts @@ -1,3 +1,3 @@ -export function isDuplicateKeyValueError(e: Error): boolean { - return e.message.startsWith('duplicate key value'); +export function isDuplicateKeyValueError(e: unknown | Error): boolean { + return (e as any).message && (e as Error).message.startsWith('duplicate key value'); } diff --git a/packages/backend/src/server/api/api-handler.ts b/packages/backend/src/server/api/api-handler.ts index faa35d12d..362bbb0f5 100644 --- a/packages/backend/src/server/api/api-handler.ts +++ b/packages/backend/src/server/api/api-handler.ts @@ -32,7 +32,7 @@ export default (endpoint: IEndpoint, ctx: Koa.Context) => new Promise((res) => { // Authentication authenticate(body['i']).then(([user, app]) => { // API invoking - call(endpoint.name, user, app, body, (ctx as any).file).then((res: any) => { + call(endpoint.name, user, app, body, ctx).then((res: any) => { reply(res); }).catch((e: ApiError) => { reply(e.httpStatusCode ? e.httpStatusCode : e.kind === 'client' ? 400 : 500, e); diff --git a/packages/backend/src/server/api/call.ts b/packages/backend/src/server/api/call.ts index 399ee65bd..ea9ab3ccb 100644 --- a/packages/backend/src/server/api/call.ts +++ b/packages/backend/src/server/api/call.ts @@ -1,3 +1,4 @@ +import * as Koa from 'koa'; import { performance } from 'perf_hooks'; import { limiter } from './limiter'; import { User } from '@/models/entities/user'; @@ -12,7 +13,7 @@ const accessDenied = { id: '56f35758-7dd5-468b-8439-5d6fb8ec9b8e', }; -export default async (endpoint: string, user: User | null | undefined, token: AccessToken | null | undefined, data: any, file?: any) => { +export default async (endpoint: string, user: User | null | undefined, token: AccessToken | null | undefined, data: any, ctx?: Koa.Context) => { const isSecure = user != null && token == null; const ep = endpoints.find(e => e.name === endpoint); @@ -76,9 +77,20 @@ export default async (endpoint: string, user: User | null | undefined, token: Ac }); } + // Cast non JSON input + if (ep.meta.requireFile && ep.meta.params) { + const body = (ctx!.request as any).body; + for (const k of Object.keys(ep.meta.params)) { + const param = ep.meta.params[k]; + if (['Boolean', 'Number'].includes(param.validator.name) && typeof body[k] === 'string') { + body[k] = JSON.parse(body[k]); + } + } + } + // API invoking const before = performance.now(); - return await ep.exec(data, user, token, file).catch((e: Error) => { + return await ep.exec(data, user, token, ctx?.file).catch((e: Error) => { if (e instanceof ApiError) { throw e; } else { diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts index dd65ab061..877e76677 100644 --- a/packages/backend/src/server/api/endpoints/drive/files/create.ts +++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts @@ -39,15 +39,13 @@ export const meta = { }, isSensitive: { - validator: $.optional.either($.bool, $.str), + validator: $.optional.bool, default: false, - transform: (v: any): boolean => v === true || v === 'true', }, force: { - validator: $.optional.either($.bool, $.str), + validator: $.optional.bool, default: false, - transform: (v: any): boolean => v === true || v === 'true', }, }, diff --git a/packages/backend/src/server/api/stream/types.ts b/packages/backend/src/server/api/stream/types.ts index e70c26f5e..e2f1c6fc9 100644 --- a/packages/backend/src/server/api/stream/types.ts +++ b/packages/backend/src/server/api/stream/types.ts @@ -105,7 +105,10 @@ export interface NoteStreamTypes { }; reacted: { reaction: string; - emoji?: Emoji; + emoji?: { + name: string; + url: string; + } | null; userId: User['id']; }; unreacted: { diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug index 12ad03e77..7204da9ae 100644 --- a/packages/backend/src/server/web/views/base.pug +++ b/packages/backend/src/server/web/views/base.pug @@ -21,6 +21,7 @@ html meta(name='referrer' content='origin') meta(name='theme-color' content='#a7dc4e') meta(name='theme-color-orig' content='#a7dc4e') + meta(property='twitter:card' content='summary') meta(property='og:site_name' content= instanceName || 'Misskey') meta(name='viewport' content='width=device-width, initial-scale=1') link(rel='icon' href= icon || '/favicon.ico') @@ -42,7 +43,9 @@ html block meta block og - meta(property='og:image' content=img) + meta(property='og:title' content= title || 'Misskey') + meta(property='og:description' content= desc || '✨🌎✨ A interplanetary communication platform ✨🚀✨') + meta(property='og:image' content= img) style include ../style.css diff --git a/packages/backend/src/server/web/views/channel.pug b/packages/backend/src/server/web/views/channel.pug index 273632f0e..486f0ecc4 100644 --- a/packages/backend/src/server/web/views/channel.pug +++ b/packages/backend/src/server/web/views/channel.pug @@ -16,6 +16,3 @@ block og meta(property='og:description' content= channel.description) meta(property='og:url' content= url) meta(property='og:image' content= channel.bannerUrl) - -block meta - meta(name='twitter:card' content='summary') diff --git a/packages/backend/src/server/web/views/clip.pug b/packages/backend/src/server/web/views/clip.pug index 8de53f19d..7a84d50f6 100644 --- a/packages/backend/src/server/web/views/clip.pug +++ b/packages/backend/src/server/web/views/clip.pug @@ -26,8 +26,6 @@ block meta meta(name='misskey:user-id' content=user.id) meta(name='misskey:clip-id' content=clip.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/gallery-post.pug b/packages/backend/src/server/web/views/gallery-post.pug index 95bbb2437..ca0663a48 100644 --- a/packages/backend/src/server/web/views/gallery-post.pug +++ b/packages/backend/src/server/web/views/gallery-post.pug @@ -25,8 +25,6 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/note.pug b/packages/backend/src/server/web/views/note.pug index fce91bdab..34b03f983 100644 --- a/packages/backend/src/server/web/views/note.pug +++ b/packages/backend/src/server/web/views/note.pug @@ -26,9 +26,7 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) meta(name='misskey:note-id' content=note.id) - - meta(name='twitter:card' content='summary') - + // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/page.pug b/packages/backend/src/server/web/views/page.pug index cb9e1039e..b6c954802 100644 --- a/packages/backend/src/server/web/views/page.pug +++ b/packages/backend/src/server/web/views/page.pug @@ -26,8 +26,6 @@ block meta meta(name='misskey:user-id' content=user.id) meta(name='misskey:page-id' content=page.id) - meta(name='twitter:card' content='summary') - // todo if user.twitter meta(name='twitter:creator' content=`@${user.twitter.screenName}`) diff --git a/packages/backend/src/server/web/views/user.pug b/packages/backend/src/server/web/views/user.pug index 1a8a6b441..2adec0f88 100644 --- a/packages/backend/src/server/web/views/user.pug +++ b/packages/backend/src/server/web/views/user.pug @@ -25,8 +25,6 @@ block meta meta(name='misskey:user-username' content=user.username) meta(name='misskey:user-id' content=user.id) - meta(name='twitter:card' content='summary') - if profile.twitter meta(name='twitter:creator' content=`@${profile.twitter.screenName}`) diff --git a/packages/backend/src/services/note/create.ts b/packages/backend/src/services/note/create.ts index fb22bd659..cfb1f8c1e 100644 --- a/packages/backend/src/services/note/create.ts +++ b/packages/backend/src/services/note/create.ts @@ -59,7 +59,7 @@ class NotificationManager { if (exist) { // ã€ŒãƒĄãƒŗã‚ˇãƒ§ãƒŗã•ã‚ŒãĻいるかつčŋ”äŋĄã•れãĻã„ã‚‹ã€å ´åˆã¯ã€ãƒĄãƒŗã‚ˇãƒ§ãƒŗã¨ã—ãĻぎ通įŸĨではãĒくčŋ”äŋĄã¨ã—ãĻぎ通įŸĨãĢする - if (reason != 'mention') { + if (reason !== 'mention') { exist.reason = reason; } } else { @@ -201,7 +201,7 @@ export default async (user: { id: User['id']; username: User['username']; host: mentionedUsers.push(await Users.findOneOrFail(data.reply.userId)); } - if (data.visibility == 'specified') { + if (data.visibility === 'specified') { if (data.visibleUsers == null) throw new Error('invalid param'); for (const u of data.visibleUsers) { @@ -301,7 +301,7 @@ export default async (user: { id: User['id']; username: User['username']; host: if (Users.isRemoteUser(user)) activeUsersChart.update(user); // æœĒčĒ­é€šįŸĨをäŊœæˆ - if (data.visibility == 'specified') { + if (data.visibility === 'specified') { if (data.visibleUsers == null) throw new Error('invalid param'); for (const u of data.visibleUsers) { @@ -439,7 +439,7 @@ export default async (user: { id: User['id']; username: User['username']; host: async function renderNoteOrRenoteActivity(data: Option, note: Note) { if (data.localOnly) return null; - const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length == 0) + const content = data.renote && data.text == null && data.poll == null && (data.files == null || data.files.length === 0) ? renderAnnounce(data.renote.uri ? data.renote.uri : `${config.url}/notes/${data.renote.id}`, note) : renderCreate(await renderNote(note, false), note); @@ -478,7 +478,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O userId: user.id, localOnly: data.localOnly!, visibility: data.visibility as any, - visibleUserIds: data.visibility == 'specified' + visibleUserIds: data.visibility === 'specified' ? data.visibleUsers ? data.visibleUsers.map(u => u.id) : [] @@ -502,7 +502,7 @@ async function insertNote(user: { id: User['id']; host: User['host']; }, data: O insert.mentions = mentionedUsers.map(u => u.id); const profiles = await UserProfiles.find({ userId: In(insert.mentions) }); insert.mentionedRemoteUsers = JSON.stringify(mentionedUsers.filter(u => Users.isRemoteUser(u)).map(u => { - const profile = profiles.find(p => p.userId == u.id); + const profile = profiles.find(p => p.userId === u.id); const url = profile != null ? profile.url : null; return { uri: u.uri, diff --git a/packages/backend/src/services/note/delete.ts b/packages/backend/src/services/note/delete.ts index 64383ee92..77723fe8b 100644 --- a/packages/backend/src/services/note/delete.ts +++ b/packages/backend/src/services/note/delete.ts @@ -39,7 +39,7 @@ export default async function(user: User, note: Note, quiet = false) { let renote: Note | undefined; // if deletd note is renote - if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length == 0)) { + if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length === 0)) { renote = await Notes.findOne({ id: note.renoteId, }); diff --git a/packages/backend/src/services/note/reaction/create.ts b/packages/backend/src/services/note/reaction/create.ts index 47f46419d..c01d43c22 100644 --- a/packages/backend/src/services/note/reaction/create.ts +++ b/packages/backend/src/services/note/reaction/create.ts @@ -76,7 +76,7 @@ export default async (user: { id: User['id']; host: User['host']; }, note: Note, // ã‚Ģ゚ã‚ŋムįĩĩ文字ãƒĒã‚ĸã‚¯ã‚ˇãƒ§ãƒŗã ãŖãŸã‚‰įĩĩæ–‡å­—æƒ…å ąã‚‚é€ã‚‹ const decodedReaction = decodeReaction(reaction); - let emoji = await Emojis.findOne({ + const emoji = await Emojis.findOne({ where: { name: decodedReaction.name, host: decodedReaction.host, diff --git a/packages/backend/src/services/note/read.ts b/packages/backend/src/services/note/read.ts index aaf1c5ed7..032f1e84e 100644 --- a/packages/backend/src/services/note/read.ts +++ b/packages/backend/src/services/note/read.ts @@ -52,7 +52,7 @@ export default async function( if (note.user != null) { // たãļんnullãĢãĒã‚‹ã“ã¨ã¯į„Ąã„ã¯ãšã ã‘ãŠä¸€åŋœ for (const antenna of myAntennas) { - if (await checkHitAntenna(antenna, note, note.user as any, undefined, Array.from(following))) { + if (await checkHitAntenna(antenna, note, note.user, undefined, Array.from(following))) { readAntennaNotes.push(note); } } diff --git a/packages/backend/src/services/send-email.ts b/packages/backend/src/services/send-email.ts index f5f36148f..1fd406cb6 100644 --- a/packages/backend/src/services/send-email.ts +++ b/packages/backend/src/services/send-email.ts @@ -114,9 +114,9 @@ export async function sendEmail(to: string, subject: string, html: string, text: `, }); - logger.info('Message sent: %s', info.messageId); - } catch (e) { - logger.error(e); - throw e; + logger.info(`Message sent: ${info.messageId}`); + } catch (err) { + logger.error(err as Error); + throw err; } } diff --git a/packages/backend/yarn.lock b/packages/backend/yarn.lock index 99e2e2306..5bf6e05a7 100644 --- a/packages/backend/yarn.lock +++ b/packages/backend/yarn.lock @@ -4967,10 +4967,10 @@ minizlib@^2.0.0, minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -misskey-js@0.0.13: - version "0.0.13" - resolved "https://registry.yarnpkg.com/misskey-js/-/misskey-js-0.0.13.tgz#03a4e469186e28752d599dc4093519eb64647970" - integrity sha512-kBdJdfe281gtykzzsrN3IAxWUQIimzPiJGyKWf863ggWJlWYVPmP9hTFlX2z8oPOaypgVBPEPHyw/jNUdc2DbQ== +misskey-js@0.0.14: + version "0.0.14" + resolved "https://registry.yarnpkg.com/misskey-js/-/misskey-js-0.0.14.tgz#1a616bdfbe81c6ee6900219eaf425bb5c714dd4d" + integrity sha512-bvLx6U3OwQwqHfp/WKwIVwdvNYAAPk0+YblXyxmSG3dwlzCgBRRLcB8o6bNruUDyJgh3t73pLDcOz3myxcUmww== dependencies: autobind-decorator "^2.4.0" eventemitter3 "^4.0.7" diff --git a/packages/client/.eslintrc.js b/packages/client/.eslintrc.js index d414f86ed..acbb7c0c6 100644 --- a/packages/client/.eslintrc.js +++ b/packages/client/.eslintrc.js @@ -18,6 +18,7 @@ module.exports = { // data ぎįρæ­ĸį†į”ą: æŠŊčąĄįš„ã™ãŽã‚‹ãŸã‚ // e ぎįρæ­ĸį†į”ą: error や event ãĒãŠã€č¤‡æ•°ãŽã‚­ãƒŧワãƒŧドぎ頭文字であり分かりãĢくいため "id-denylist": ["error", "window", "data", "e"], + 'eqeqeq': ['error', 'always', { 'null': 'ignore' }], "vue/attributes-order": ["error", { "alphabetical": false }], diff --git a/packages/client/package.json b/packages/client/package.json index 71dd89bea..b840bafe8 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -69,7 +69,7 @@ "langmap": "0.0.16", "matter-js": "0.18.0", "mfm-js": "0.21.0", - "misskey-js": "0.0.13", + "misskey-js": "0.0.14", "mocha": "8.4.0", "ms": "2.1.3", "nested-property": "4.0.0", diff --git a/packages/client/src/components/chart-tooltip.vue b/packages/client/src/components/chart-tooltip.vue new file mode 100644 index 000000000..b080eaf2b --- /dev/null +++ b/packages/client/src/components/chart-tooltip.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/packages/client/src/components/chart.vue b/packages/client/src/components/chart.vue index d17c0c9f3..e9938e690 100644 --- a/packages/client/src/components/chart.vue +++ b/packages/client/src/components/chart.vue @@ -8,7 +8,7 @@ diff --git a/packages/client/src/directives/tooltip.ts b/packages/client/src/directives/tooltip.ts index fffde1487..dd715227a 100644 --- a/packages/client/src/directives/tooltip.ts +++ b/packages/client/src/directives/tooltip.ts @@ -48,7 +48,7 @@ export default { popup(import('@/components/ui/tooltip.vue'), { showing, text: self.text, - source: el + targetElement: el, }, {}, 'closed'); self._close = () => { @@ -56,8 +56,8 @@ export default { }; }; - el.addEventListener('selectstart', e => { - e.preventDefault(); + el.addEventListener('selectstart', ev => { + ev.preventDefault(); }); el.addEventListener(start, () => { diff --git a/packages/client/src/init.ts b/packages/client/src/init.ts index 81e41febd..994177468 100644 --- a/packages/client/src/init.ts +++ b/packages/client/src/init.ts @@ -14,7 +14,7 @@ if (localStorage.getItem('accounts') != null) { //#endregion import { computed, createApp, watch, markRaw, version as vueVersion } from 'vue'; -import * as compareVersions from 'compare-versions'; +import compareVersions from 'compare-versions'; import widgets from '@/widgets'; import directives from '@/directives'; diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts index f3be5c68f..95b4e87a1 100644 --- a/packages/client/src/os.ts +++ b/packages/client/src/os.ts @@ -7,8 +7,10 @@ import * as Misskey from 'misskey-js'; import { apiUrl, url } from '@/config'; import MkPostFormDialog from '@/components/post-form-dialog.vue'; import MkWaitingDialog from '@/components/waiting-dialog.vue'; +import { MenuItem } from '@/types/menu'; import { resolve } from '@/router'; import { $i } from '@/account'; +import { defaultStore } from '@/store'; export const pendingApiRequestsCount = ref(0); @@ -470,7 +472,7 @@ export async function openEmojiPicker(src?: HTMLElement, opts, initialTextarea: }); } -export function popupMenu(items: any[] | Ref, src?: HTMLElement, options?: { +export function popupMenu(items: MenuItem[] | Ref, src?: HTMLElement, options?: { align?: string; width?: number; viaKeyboard?: boolean; @@ -494,7 +496,7 @@ export function popupMenu(items: any[] | Ref, src?: HTMLElement, options? }); } -export function contextMenu(items: any[], ev: MouseEvent) { +export function contextMenu(items: MenuItem[] | Ref, ev: MouseEvent) { ev.preventDefault(); return new Promise((resolve, reject) => { let dispose; @@ -541,7 +543,7 @@ export const uploads = ref<{ img: string; }[]>([]); -export function upload(file: File, folder?: any, name?: string): Promise { +export function upload(file: File, folder?: any, name?: string, keepOriginal: boolean = defaultStore.state.keepOriginalUploading): Promise { if (folder && typeof folder == 'object') folder = folder.id; return new Promise((resolve, reject) => { @@ -559,6 +561,8 @@ export function upload(file: File, folder?: any, name?: string): Promise ({ sort: sort, - host: host != '' ? host : null, + host: host !== '' ? host : null, ...( state === 'federating' ? { federating: true } : state === 'subscribing' ? { subscribing: true } : @@ -157,11 +157,10 @@ defineExpose({ > .instance { padding: 16px; - border: solid 1px var(--divider); - border-radius: 6px; + background: var(--panel); + border-radius: 8px; &:hover { - border: solid 1px var(--accent); text-decoration: none; } diff --git a/packages/client/src/pages/instance-info.vue b/packages/client/src/pages/instance-info.vue index fa36db065..f19cb9d1a 100644 --- a/packages/client/src/pages/instance-info.vue +++ b/packages/client/src/pages/instance-info.vue @@ -29,6 +29,7 @@ {{ $ts.stopActivityDelivery }} {{ $ts.blockThisInstance }} + Refresh metadata @@ -111,6 +112,7 @@ import MkChart from '@/components/chart.vue'; import MkObjectView from '@/components/object-view.vue'; import FormLink from '@/components/form/link.vue'; import MkLink from '@/components/link.vue'; +import MkButton from '@/components/ui/button.vue'; import FormSection from '@/components/form/section.vue'; import MkKeyValue from '@/components/key-value.vue'; import MkSelect from '@/components/form/select.vue'; @@ -155,6 +157,15 @@ async function toggleSuspend(v) { }); } +function refreshMetadata() { + os.api('admin/federation/refresh-remote-instance-metadata', { + host: instance.host, + }); + os.alert({ + text: 'Refresh requested', + }); +} + fetch(); defineExpose({ diff --git a/packages/client/src/pages/settings/drive.vue b/packages/client/src/pages/settings/drive.vue index f1016ebd8..134fa6330 100644 --- a/packages/client/src/pages/settings/drive.vue +++ b/packages/client/src/pages/settings/drive.vue @@ -28,6 +28,7 @@ + {{ $ts.keepOriginalUploading }} @@ -36,18 +37,21 @@ import { defineComponent } from 'vue'; import * as tinycolor from 'tinycolor2'; import FormLink from '@/components/form/link.vue'; +import FormSwitch from '@/components/form/switch.vue'; import FormSection from '@/components/form/section.vue'; import MkKeyValue from '@/components/key-value.vue'; import FormSplit from '@/components/form/split.vue'; import * as os from '@/os'; import bytes from '@/filters/bytes'; import * as symbols from '@/symbols'; +import { defaultStore } from '@/store'; // TODO: render chart export default defineComponent({ components: { FormLink, + FormSwitch, FormSection, MkKeyValue, FormSplit, @@ -79,7 +83,8 @@ export default defineComponent({ l: 0.5 }) }; - } + }, + keepOriginalUploading: defaultStore.makeGetterSetter('keepOriginalUploading'), }, async created() { diff --git a/packages/client/src/scripts/select-file.ts b/packages/client/src/scripts/select-file.ts index 56e0b564f..23df4edf5 100644 --- a/packages/client/src/scripts/select-file.ts +++ b/packages/client/src/scripts/select-file.ts @@ -1,3 +1,4 @@ +import { ref } from 'vue'; import * as os from '@/os'; import { stream } from '@/stream'; import { i18n } from '@/i18n'; @@ -6,12 +7,14 @@ import { DriveFile } from 'misskey-js/built/entities'; function select(src: any, label: string | null, multiple: boolean): Promise { return new Promise((res, rej) => { + const keepOriginal = ref(defaultStore.state.keepOriginalUploading); + const chooseFileFromPc = () => { const input = document.createElement('input'); input.type = 'file'; input.multiple = multiple; input.onchange = () => { - const promises = Array.from(input.files).map(file => os.upload(file, defaultStore.state.uploadFolder)); + const promises = Array.from(input.files).map(file => os.upload(file, defaultStore.state.uploadFolder, undefined, keepOriginal.value)); Promise.all(promises).then(driveFiles => { res(multiple ? driveFiles : driveFiles[0]); @@ -74,6 +77,10 @@ function select(src: any, label: string | null, multiple: boolean): Promise void; + +export type MenuDivider = null; +export type MenuNull = undefined; +export type MenuLabel = { type: 'label', text: string }; +export type MenuLink = { type: 'link', to: string, text: string, icon?: string, indicate?: boolean, avatar?: Misskey.entities.User }; +export type MenuA = { type: 'a', href: string, target?: string, download?: string, text: string, icon?: string, indicate?: boolean }; +export type MenuUser = { type: 'user', user: Misskey.entities.User, active?: boolean, indicate?: boolean, action: MenuAction }; +export type MenuSwitch = { type: 'switch', ref: Ref, text: string, disabled?: boolean }; +export type MenuButton = { type?: 'button', text: string, icon?: string, indicate?: boolean, danger?: boolean, active?: boolean, avatar?: Misskey.entities.User; action: MenuAction }; + +export type MenuPending = { type: 'pending' }; + +type OuterMenuItem = MenuDivider | MenuNull | MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton; +type OuterPromiseMenuItem = Promise; +export type MenuItem = OuterMenuItem | OuterPromiseMenuItem; +export type InnerMenuItem = MenuDivider | MenuPending | MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton; diff --git a/packages/client/src/ui/classic.side.vue b/packages/client/src/ui/classic.side.vue index f81683414..6c2329194 100644 --- a/packages/client/src/ui/classic.side.vue +++ b/packages/client/src/ui/classic.side.vue @@ -4,7 +4,7 @@
- {{ pageInfo.title }} +
@@ -13,99 +13,89 @@ - diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue index 8fe9dcffa..b0dfc5aad 100644 --- a/packages/client/src/ui/universal.vue +++ b/packages/client/src/ui/universal.vue @@ -20,7 +20,7 @@ - +
@@ -31,9 +31,9 @@
- + - +
@@ -64,155 +64,133 @@
-