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 cabb4ad46..65f5e0194 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,29 @@ --> +## 12.103.1 (2022/02/02) + +### Bugfixes +- クナイã‚ĸãƒŗãƒˆ: ツãƒŧãƒĢãƒãƒƒãƒ—ãŽčĄ¨į¤ēäŊįŊŽãŒæ­Ŗã—くãĒã„å•éĄŒã‚’äŋŽæ­Ŗ + +## 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 + ## 12.102.1 (2022/01/27) ### Bugfixes - ãƒãƒŖãƒƒãƒˆãŒčĄ¨į¤ēできãĒã„å•éĄŒã‚’äŋŽæ­Ŗ 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/cypress/integration/basic.js b/cypress/integration/basic.js index aca44ef15..7d27b649f 100644 --- a/cypress/integration/basic.js +++ b/cypress/integration/basic.js @@ -176,3 +176,7 @@ describe('After user singed in', () => { cy.contains('Hello, Misskey!'); }); }); + +// TODO: 投į¨ŋフりãƒŧムぎå…Ŧé–‹į¯„å›˛æŒ‡åŽšãŽãƒ†ã‚šãƒˆ +// TODO: 投į¨ŋフりãƒŧãƒ ãŽãƒ•ã‚Ąã‚¤ãƒĢæˇģäģ˜ãŽãƒ†ã‚šãƒˆ +// TODO: 投į¨ŋフりãƒŧãƒ ãŽãƒãƒƒã‚ˇãƒĨã‚ŋグäŋæŒãƒ•ã‚ŖãƒŧãƒĢドぎテ゚ト 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/file/index.ts b/packages/backend/src/server/file/index.ts index a455acd1c..6fe6110dc 100644 --- a/packages/backend/src/server/file/index.ts +++ b/packages/backend/src/server/file/index.ts @@ -18,7 +18,7 @@ const _dirname = dirname(_filename); const app = new Koa(); app.use(cors()); app.use(async (ctx, next) => { - ctx.set('Content-Security-Policy', `default-src 'none'; style-src 'unsafe-inline'`); + ctx.set('Content-Security-Policy', `default-src 'none'; img-src 'self'; media-src 'self'; style-src 'unsafe-inline'`); await next(); }); diff --git a/packages/backend/src/server/proxy/index.ts b/packages/backend/src/server/proxy/index.ts index b8993f19f..7a3094311 100644 --- a/packages/backend/src/server/proxy/index.ts +++ b/packages/backend/src/server/proxy/index.ts @@ -11,7 +11,7 @@ import { proxyMedia } from './proxy-media'; const app = new Koa(); app.use(cors()); app.use(async (ctx, next) => { - ctx.set('Content-Security-Policy', `default-src 'none'; style-src 'unsafe-inline'`); + ctx.set('Content-Security-Policy', `default-src 'none'; img-src 'self'; media-src 'self'; style-src 'unsafe-inline'`); await next(); }); 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/account.ts b/packages/client/src/account.ts index 5a935e1dc..4aeceecca 100644 --- a/packages/client/src/account.ts +++ b/packages/client/src/account.ts @@ -192,31 +192,31 @@ export async function openAccountMenu(opts: { if (opts.withExtraOperation) { popupMenu([...[{ type: 'link', - text: i18n.locale.profile, + text: i18n.ts.profile, to: `/@${ $i.username }`, avatar: $i, }, null, ...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises, { icon: 'fas fa-plus', - text: i18n.locale.addAccount, + text: i18n.ts.addAccount, action: () => { popupMenu([{ - text: i18n.locale.existingAccount, + text: i18n.ts.existingAccount, action: () => { showSigninDialog(); }, }, { - text: i18n.locale.createAccount, + text: i18n.ts.createAccount, action: () => { createAccount(); }, - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); }, }, { type: 'link', icon: 'fas fa-users', - text: i18n.locale.manageAccounts, + text: i18n.ts.manageAccounts, to: `/settings/accounts`, - }]], ev.currentTarget || ev.target, { + }]], ev.currentTarget ?? ev.target, { align: 'left' }); } else { - popupMenu([...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises], ev.currentTarget || ev.target, { + popupMenu([...(opts.includeCurrentAccount ? [createItem($i)] : []), ...accountItemPromises], ev.currentTarget ?? ev.target, { align: 'left' }); } diff --git a/packages/client/src/components/abuse-report-window.vue b/packages/client/src/components/abuse-report-window.vue index cd04f62bc..f2cb36980 100644 --- a/packages/client/src/components/abuse-report-window.vue +++ b/packages/client/src/components/abuse-report-window.vue @@ -2,7 +2,7 @@ diff --git a/packages/client/src/components/channel-preview.vue b/packages/client/src/components/channel-preview.vue index 8d135a192..dd3794a65 100644 --- a/packages/client/src/components/channel-preview.vue +++ b/packages/client/src/components/channel-preview.vue @@ -6,7 +6,7 @@
- + @@ -14,7 +14,7 @@
- + @@ -27,7 +27,7 @@
- {{ i18n.locale.updatedAt }}: + {{ i18n.ts.updatedAt }}:
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 1959271f5..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/components/user-online-indicator.vue b/packages/client/src/components/user-online-indicator.vue index a87b0aeff..a4f6f8038 100644 --- a/packages/client/src/components/user-online-indicator.vue +++ b/packages/client/src/components/user-online-indicator.vue @@ -13,10 +13,10 @@ const props = defineProps<{ const text = $computed(() => { switch (props.user.onlineStatus) { - case 'online': return i18n.locale.online; - case 'active': return i18n.locale.active; - case 'offline': return i18n.locale.offline; - case 'unknown': return i18n.locale.unknown; + case 'online': return i18n.ts.online; + case 'active': return i18n.ts.active; + case 'offline': return i18n.ts.offline; + case 'unknown': return i18n.ts.unknown; } }); 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 af70aec70..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'; @@ -185,7 +185,7 @@ app.config.globalProperties = { $store: defaultStore, $instance: instance, $t: i18n.t, - $ts: i18n.locale, + $ts: i18n.ts, }; app.use(router); @@ -299,8 +299,8 @@ stream.on('_disconnected_', async () => { reloadDialogShowing = true; const { canceled } = await confirm({ type: 'warning', - title: i18n.locale.disconnectedFromServer, - text: i18n.locale.reloadConfirm, + title: i18n.ts.disconnectedFromServer, + text: i18n.ts.reloadConfirm, }); reloadDialogShowing = false; if (!canceled) { @@ -324,7 +324,7 @@ if ($i) { if ($i.isDeleted) { alert({ type: 'warning', - text: i18n.locale.accountDeletionInProgress, + text: i18n.ts.accountDeletionInProgress, }); } diff --git a/packages/client/src/menu.ts b/packages/client/src/menu.ts index 184779f21..ebc789810 100644 --- a/packages/client/src/menu.ts +++ b/packages/client/src/menu.ts @@ -73,12 +73,12 @@ export const menuDef = reactive({ })), null, { type: 'link', to: '/my/lists', - text: i18n.locale.manageLists, + text: i18n.ts.manageLists, icon: 'fas fa-cog', }]; items.value = _items; }); - os.popupMenu(items, ev.currentTarget || ev.target); + os.popupMenu(items, ev.currentTarget ?? ev.target); }, }, groups: { @@ -104,12 +104,12 @@ export const menuDef = reactive({ })), null, { type: 'link', to: '/my/antennas', - text: i18n.locale.manageAntennas, + text: i18n.ts.manageAntennas, icon: 'fas fa-cog', }]; items.value = _items; }); - os.popupMenu(items, ev.currentTarget || ev.target); + os.popupMenu(items, ev.currentTarget ?? ev.target); }, }, mentions: { @@ -173,34 +173,34 @@ export const menuDef = reactive({ icon: 'fas fa-columns', action: (ev) => { os.popupMenu([{ - text: i18n.locale.default, + text: i18n.ts.default, active: ui === 'default' || ui === null, action: () => { localStorage.setItem('ui', 'default'); unisonReload(); } }, { - text: i18n.locale.deck, + text: i18n.ts.deck, active: ui === 'deck', action: () => { localStorage.setItem('ui', 'deck'); unisonReload(); } }, { - text: i18n.locale.classic, + text: i18n.ts.classic, active: ui === 'classic', action: () => { localStorage.setItem('ui', 'classic'); unisonReload(); } }, /*{ - text: i18n.locale.desktop + ' (β)', + text: i18n.ts.desktop + ' (β)', active: ui === 'desktop', action: () => { localStorage.setItem('ui', 'desktop'); unisonReload(); } - }*/], ev.currentTarget || ev.target); + }*/], ev.currentTarget ?? ev.target); }, }, }); diff --git a/packages/client/src/os.ts b/packages/client/src/os.ts index c16ea717a..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); @@ -403,7 +405,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) => { popup(import('@/components/emoji-picker-dialog.vue'), { src, @@ -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
-

{{ i18n.locale.pageLoadError }}

-

{{ i18n.locale.pageLoadErrorDescription }}

-

{{ i18n.locale.serverIsDead }}

+

{{ i18n.ts.pageLoadError }}

+

{{ i18n.ts.pageLoadErrorDescription }}

+

{{ i18n.ts.serverIsDead }}

-

{{ i18n.locale.troubleshooting }}

+

{{ i18n.ts.troubleshooting }}

ERROR: {{ error }}

@@ -54,7 +54,7 @@ function reload() { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.error, + title: i18n.ts.error, icon: 'fas fa-exclamation-triangle', }, }); diff --git a/packages/client/src/pages/about-misskey.vue b/packages/client/src/pages/about-misskey.vue index f887e29cc..0ffb6b9e1 100644 --- a/packages/client/src/pages/about-misskey.vue +++ b/packages/client/src/pages/about-misskey.vue @@ -10,7 +10,7 @@
- {{ i18n.locale._aboutMisskey.about }}
{{ i18n.locale.learnMore }} + {{ i18n.ts._aboutMisskey.about }}
{{ i18n.ts.learnMore }}
I #Misskey @@ -19,23 +19,23 @@ - + - + - +
{{ patron }}
- +
@@ -194,7 +194,7 @@ onBeforeUnmount(() => { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.aboutMisskey, + title: i18n.ts.aboutMisskey, icon: null, bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index a5984c548..d5bab4baf 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -90,7 +90,7 @@ const initStats = () => os.api('stats', { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.instanceInfo, + title: i18n.ts.instanceInfo, icon: 'fas fa-info-circle', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/admin/emojis.vue b/packages/client/src/pages/admin/emojis.vue index 5b1dfe565..a080ee9c2 100644 --- a/packages/client/src/pages/admin/emojis.vue +++ b/packages/client/src/pages/admin/emojis.vue @@ -118,7 +118,7 @@ const toggleSelect = (emoji) => { }; const add = async (ev: MouseEvent) => { - const files = await selectFiles(ev.currentTarget || ev.target, null); + const files = await selectFiles(ev.currentTarget ?? ev.target, null); const promise = Promise.all(files.map(file => os.api('admin/emoji/add', { fileId: file.id, @@ -157,23 +157,23 @@ const remoteMenu = (emoji, ev: MouseEvent) => { type: 'label', text: ':' + emoji.name + ':', }, { - text: i18n.locale.import, + text: i18n.ts.import, icon: 'fas fa-plus', action: () => { im(emoji) } - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); }; const menu = (ev: MouseEvent) => { os.popupMenu([{ icon: 'fas fa-download', - text: i18n.locale.export, + text: i18n.ts.export, action: async () => { os.api('export-custom-emojis', { }) .then(() => { os.alert({ type: 'info', - text: i18n.locale.exportRequested, + text: i18n.ts.exportRequested, }); }).catch((e) => { os.alert({ @@ -184,16 +184,16 @@ const menu = (ev: MouseEvent) => { } }, { icon: 'fas fa-upload', - text: i18n.locale.import, + text: i18n.ts.import, action: async () => { - const file = await selectFile(ev.currentTarget || ev.target); + const file = await selectFile(ev.currentTarget ?? ev.target); os.api('admin/emoji/import-zip', { fileId: file.id, }) .then(() => { os.alert({ type: 'info', - text: i18n.locale.importRequested, + text: i18n.ts.importRequested, }); }).catch((e) => { os.alert({ @@ -202,7 +202,7 @@ const menu = (ev: MouseEvent) => { }); }); } - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); }; const setCategoryBulk = async () => { @@ -256,7 +256,7 @@ const setTagBulk = async () => { const delBulk = async () => { const { canceled } = await os.confirm({ type: 'warning', - text: i18n.locale.deleteConfirm, + text: i18n.ts.deleteConfirm, }); if (canceled) return; await os.apiWithDialog('admin/emoji/delete-bulk', { @@ -267,13 +267,13 @@ const delBulk = async () => { defineExpose({ [symbols.PAGE_INFO]: computed(() => ({ - title: i18n.locale.customEmojis, + title: i18n.ts.customEmojis, icon: 'fas fa-laugh', bg: 'var(--bg)', actions: [{ asFullButton: true, icon: 'fas fa-plus', - text: i18n.locale.addEmoji, + text: i18n.ts.addEmoji, handler: add, }, { icon: 'fas fa-ellipsis-h', @@ -281,11 +281,11 @@ defineExpose({ }], tabs: [{ active: tab.value === 'local', - title: i18n.locale.local, + title: i18n.ts.local, onClick: () => { tab.value = 'local'; }, }, { active: tab.value === 'remote', - title: i18n.locale.remote, + title: i18n.ts.remote, onClick: () => { tab.value = 'remote'; }, },] })), diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue index 350e7defc..6b11650f4 100644 --- a/packages/client/src/pages/admin/index.vue +++ b/packages/client/src/pages/admin/index.vue @@ -55,7 +55,7 @@ export default defineComponent({ setup(props, context) { const indexInfo = { - title: i18n.locale.controlPanel, + title: i18n.ts.controlPanel, icon: 'fas fa-cog', bg: 'var(--bg)', hideHeader: true, @@ -91,119 +91,119 @@ export default defineComponent({ }); const menuDef = computed(() => [{ - title: i18n.locale.quickAction, + title: i18n.ts.quickAction, items: [{ type: 'button', icon: 'fas fa-search', - text: i18n.locale.lookup, + text: i18n.ts.lookup, action: lookup, }, ...(instance.disableRegistration ? [{ type: 'button', icon: 'fas fa-user', - text: i18n.locale.invite, + text: i18n.ts.invite, action: invite, }] : [])], }, { - title: i18n.locale.administration, + title: i18n.ts.administration, items: [{ icon: 'fas fa-tachometer-alt', - text: i18n.locale.dashboard, + text: i18n.ts.dashboard, to: '/admin/overview', active: page.value === 'overview', }, { icon: 'fas fa-users', - text: i18n.locale.users, + text: i18n.ts.users, to: '/admin/users', active: page.value === 'users', }, { icon: 'fas fa-laugh', - text: i18n.locale.customEmojis, + text: i18n.ts.customEmojis, to: '/admin/emojis', active: page.value === 'emojis', }, { icon: 'fas fa-globe', - text: i18n.locale.federation, + text: i18n.ts.federation, to: '/admin/federation', active: page.value === 'federation', }, { icon: 'fas fa-clipboard-list', - text: i18n.locale.jobQueue, + text: i18n.ts.jobQueue, to: '/admin/queue', active: page.value === 'queue', }, { icon: 'fas fa-cloud', - text: i18n.locale.files, + text: i18n.ts.files, to: '/admin/files', active: page.value === 'files', }, { icon: 'fas fa-broadcast-tower', - text: i18n.locale.announcements, + text: i18n.ts.announcements, to: '/admin/announcements', active: page.value === 'announcements', }, { icon: 'fas fa-audio-description', - text: i18n.locale.ads, + text: i18n.ts.ads, to: '/admin/ads', active: page.value === 'ads', }, { icon: 'fas fa-exclamation-circle', - text: i18n.locale.abuseReports, + text: i18n.ts.abuseReports, to: '/admin/abuses', active: page.value === 'abuses', }], }, { - title: i18n.locale.settings, + title: i18n.ts.settings, items: [{ icon: 'fas fa-cog', - text: i18n.locale.general, + text: i18n.ts.general, to: '/admin/settings', active: page.value === 'settings', }, { icon: 'fas fa-envelope', - text: i18n.locale.emailServer, + text: i18n.ts.emailServer, to: '/admin/email-settings', active: page.value === 'email-settings', }, { icon: 'fas fa-cloud', - text: i18n.locale.objectStorage, + text: i18n.ts.objectStorage, to: '/admin/object-storage', active: page.value === 'object-storage', }, { icon: 'fas fa-lock', - text: i18n.locale.security, + text: i18n.ts.security, to: '/admin/security', active: page.value === 'security', }, { icon: 'fas fa-globe', - text: i18n.locale.relays, + text: i18n.ts.relays, to: '/admin/relays', active: page.value === 'relays', }, { icon: 'fas fa-share-alt', - text: i18n.locale.integration, + text: i18n.ts.integration, to: '/admin/integrations', active: page.value === 'integrations', }, { icon: 'fas fa-ban', - text: i18n.locale.instanceBlocking, + text: i18n.ts.instanceBlocking, to: '/admin/instance-block', active: page.value === 'instance-block', }, { icon: 'fas fa-ghost', - text: i18n.locale.proxyAccount, + text: i18n.ts.proxyAccount, to: '/admin/proxy-account', active: page.value === 'proxy-account', }, { icon: 'fas fa-cogs', - text: i18n.locale.other, + text: i18n.ts.other, to: '/admin/other-settings', active: page.value === 'other-settings', }], }, { - title: i18n.locale.info, + title: i18n.ts.info, items: [{ icon: 'fas fa-database', - text: i18n.locale.database, + text: i18n.ts.database, to: '/admin/database', active: page.value === 'database', }], @@ -275,37 +275,37 @@ export default defineComponent({ const lookup = (ev) => { os.popupMenu([{ - text: i18n.locale.user, + text: i18n.ts.user, icon: 'fas fa-user', action: () => { lookupUser(); } }, { - text: i18n.locale.note, + text: i18n.ts.note, icon: 'fas fa-pencil-alt', action: () => { alert('TODO'); } }, { - text: i18n.locale.file, + text: i18n.ts.file, icon: 'fas fa-cloud', action: () => { alert('TODO'); } }, { - text: i18n.locale.instance, + text: i18n.ts.instance, icon: 'fas fa-globe', action: () => { alert('TODO'); } - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); }; return { [symbols.PAGE_INFO]: INFO, menuDef, header: { - title: i18n.locale.controlPanel, + title: i18n.ts.controlPanel, }, noMaintainerInformation, noBotProtection, diff --git a/packages/client/src/pages/channel-editor.vue b/packages/client/src/pages/channel-editor.vue index 58c644be6..3818c7481 100644 --- a/packages/client/src/pages/channel-editor.vue +++ b/packages/client/src/pages/channel-editor.vue @@ -112,7 +112,7 @@ export default defineComponent({ }, setBannerImage(e) { - selectFile(e.currentTarget || e.target, null).then(file => { + selectFile(e.currentTarget ?? e.target, null).then(file => { this.bannerId = file.id; }); }, diff --git a/packages/client/src/pages/clip.vue b/packages/client/src/pages/clip.vue index 6b49221d3..c999f1bfc 100644 --- a/packages/client/src/pages/clip.vue +++ b/packages/client/src/pages/clip.vue @@ -127,7 +127,7 @@ export default defineComponent({ clipId: this.clip.id, }); } - } : undefined], ev.currentTarget || ev.target); + } : undefined], ev.currentTarget ?? ev.target); } } }); diff --git a/packages/client/src/pages/drive.vue b/packages/client/src/pages/drive.vue index 1e17bea0c..68777bb08 100644 --- a/packages/client/src/pages/drive.vue +++ b/packages/client/src/pages/drive.vue @@ -15,7 +15,7 @@ let folder = $ref(null); defineExpose({ [symbols.PAGE_INFO]: computed(() => ({ - title: folder ? folder.name : i18n.locale.drive, + title: folder ? folder.name : i18n.ts.drive, icon: 'fas fa-cloud', bg: 'var(--bg)', hideHeader: true, diff --git a/packages/client/src/pages/emojis.emoji.vue b/packages/client/src/pages/emojis.emoji.vue index 83539ce7a..b2801694d 100644 --- a/packages/client/src/pages/emojis.emoji.vue +++ b/packages/client/src/pages/emojis.emoji.vue @@ -23,13 +23,13 @@ function menu(ev) { type: 'label', text: ':' + props.emoji.name + ':', }, { - text: i18n.locale.copy, + text: i18n.ts.copy, icon: 'fas fa-copy', action: () => { copyToClipboard(`:${props.emoji.name}:`); os.success(); } - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); } diff --git a/packages/client/src/pages/emojis.vue b/packages/client/src/pages/emojis.vue index 6577f5abd..886b5f711 100644 --- a/packages/client/src/pages/emojis.vue +++ b/packages/client/src/pages/emojis.vue @@ -16,14 +16,14 @@ const tab = ref('category'); function menu(ev) { os.popupMenu([{ icon: 'fas fa-download', - text: i18n.locale.export, + text: i18n.ts.export, action: async () => { os.api('export-custom-emojis', { }) .then(() => { os.alert({ type: 'info', - text: i18n.locale.exportRequested, + text: i18n.ts.exportRequested, }); }).catch((e) => { os.alert({ @@ -32,12 +32,12 @@ function menu(ev) { }); }); } - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); } defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.customEmojis, + title: i18n.ts.customEmojis, icon: 'fas fa-laugh', bg: 'var(--bg)', actions: [{ diff --git a/packages/client/src/pages/favorites.vue b/packages/client/src/pages/favorites.vue index 8965b30d6..b4f6ff35b 100644 --- a/packages/client/src/pages/favorites.vue +++ b/packages/client/src/pages/favorites.vue @@ -34,7 +34,7 @@ const pagingComponent = ref>(); defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.favorites, + title: i18n.ts.favorites, icon: 'fas fa-star', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/featured.vue b/packages/client/src/pages/featured.vue index 725c70f0f..14fe0cb74 100644 --- a/packages/client/src/pages/featured.vue +++ b/packages/client/src/pages/featured.vue @@ -17,7 +17,7 @@ const pagination = { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.featured, + title: i18n.ts.featured, icon: 'fas fa-fire-alt', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/federation.vue b/packages/client/src/pages/federation.vue index 6a4a28b6b..3c5050cdb 100644 --- a/packages/client/src/pages/federation.vue +++ b/packages/client/src/pages/federation.vue @@ -115,7 +115,7 @@ const pagination = { offsetMode: true, params: computed(() => ({ sort: sort, - host: host != '' ? host : null, + host: host !== '' ? host : null, ...( state === 'federating' ? { federating: true } : state === 'subscribing' ? { subscribing: true } : @@ -135,7 +135,7 @@ function getStatus(instance) { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.federation, + title: i18n.ts.federation, icon: 'fas fa-globe', bg: 'var(--bg)', }, @@ -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/follow-requests.vue b/packages/client/src/pages/follow-requests.vue index 764daa0d3..6adc1a404 100644 --- a/packages/client/src/pages/follow-requests.vue +++ b/packages/client/src/pages/follow-requests.vue @@ -60,7 +60,7 @@ function reject(user) { defineExpose({ [symbols.PAGE_INFO]: computed(() => ({ - title: i18n.locale.followRequests, + title: i18n.ts.followRequests, icon: 'fas fa-user-clock', bg: 'var(--bg)', })), diff --git a/packages/client/src/pages/gallery/edit.vue b/packages/client/src/pages/gallery/edit.vue index e3fa1a0fc..25ee51318 100644 --- a/packages/client/src/pages/gallery/edit.vue +++ b/packages/client/src/pages/gallery/edit.vue @@ -92,7 +92,7 @@ export default defineComponent({ methods: { selectFile(e) { - selectFiles(e.currentTarget || e.target, null).then(files => { + selectFiles(e.currentTarget ?? e.target, null).then(files => { this.files = this.files.concat(files); }); }, 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/mentions.vue b/packages/client/src/pages/mentions.vue index bda56fc72..9b57c956b 100644 --- a/packages/client/src/pages/mentions.vue +++ b/packages/client/src/pages/mentions.vue @@ -16,7 +16,7 @@ const pagination = { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.mentions, + title: i18n.ts.mentions, icon: 'fas fa-at', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/messages.vue b/packages/client/src/pages/messages.vue index 8efdc5558..9c5fb9b34 100644 --- a/packages/client/src/pages/messages.vue +++ b/packages/client/src/pages/messages.vue @@ -12,14 +12,14 @@ import { i18n } from '@/i18n'; const pagination = { endpoint: 'notes/mentions' as const, limit: 10, - params: () => ({ + params: { visibility: 'specified' - }), + }, }; defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.directNotes, + title: i18n.ts.directNotes, icon: 'fas fa-envelope', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/messaging/index.vue b/packages/client/src/pages/messaging/index.vue index 554ebc4b6..88a1e07af 100644 --- a/packages/client/src/pages/messaging/index.vue +++ b/packages/client/src/pages/messaging/index.vue @@ -128,7 +128,7 @@ export default defineComponent({ text: this.$ts.messagingWithGroup, icon: 'fas fa-users', action: () => { this.startGroup() } - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); }, async startUser() { diff --git a/packages/client/src/pages/messaging/messaging-room.form.vue b/packages/client/src/pages/messaging/messaging-room.form.vue index 1b9421ca9..3863c8f82 100644 --- a/packages/client/src/pages/messaging/messaging-room.form.vue +++ b/packages/client/src/pages/messaging/messaging-room.form.vue @@ -154,7 +154,7 @@ export default defineComponent({ }, chooseFile(e) { - selectFile(e.currentTarget || e.target, this.$ts.selectFile).then(file => { + selectFile(e.currentTarget ?? e.target, this.$ts.selectFile).then(file => { this.file = file; }); }, @@ -214,7 +214,7 @@ export default defineComponent({ }, async insertEmoji(ev) { - os.openEmojiPicker(ev.currentTarget || ev.target, {}, this.$refs.text); + os.openEmojiPicker(ev.currentTarget ?? ev.target, {}, this.$refs.text); } } }); diff --git a/packages/client/src/pages/messaging/messaging-room.vue b/packages/client/src/pages/messaging/messaging-room.vue index 65c44ce11..2ecc68eb5 100644 --- a/packages/client/src/pages/messaging/messaging-room.vue +++ b/packages/client/src/pages/messaging/messaging-room.vue @@ -335,7 +335,7 @@ const Component = defineComponent({ popout(path); this.$router.back(); }, - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); } } }); diff --git a/packages/client/src/pages/my-antennas/create.vue b/packages/client/src/pages/my-antennas/create.vue index 427c9935c..a08bece73 100644 --- a/packages/client/src/pages/my-antennas/create.vue +++ b/packages/client/src/pages/my-antennas/create.vue @@ -31,7 +31,7 @@ function onAntennaCreated() { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.manageAntennas, + title: i18n.ts.manageAntennas, icon: 'fas fa-satellite', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/my-clips/index.vue b/packages/client/src/pages/my-clips/index.vue index 97b563f6f..e287357a4 100644 --- a/packages/client/src/pages/my-clips/index.vue +++ b/packages/client/src/pages/my-clips/index.vue @@ -19,7 +19,7 @@ import MkPagination from '@/components/ui/pagination.vue'; import MkButton from '@/components/ui/button.vue'; import * as os from '@/os'; import * as symbols from '@/symbols'; -import i18n from '@/components/global/i18n'; +import { i18n } from '@/i18n'; const pagination = { endpoint: 'clips/list' as const, @@ -29,20 +29,20 @@ const pagination = { const pagingComponent = $ref>(); async function create() { - const { canceled, result } = await os.form(i18n.locale.createNewClip, { + const { canceled, result } = await os.form(i18n.ts.createNewClip, { name: { type: 'string', - label: i18n.locale.name, + label: i18n.ts.name, }, description: { type: 'string', required: false, multiline: true, - label: i18n.locale.description, + label: i18n.ts.description, }, isPublic: { type: 'boolean', - label: i18n.locale.public, + label: i18n.ts.public, default: false, }, }); @@ -63,7 +63,7 @@ function onClipDeleted() { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.clip, + title: i18n.ts.clip, icon: 'fas fa-paperclip', bg: 'var(--bg)', action: { diff --git a/packages/client/src/pages/my-lists/index.vue b/packages/client/src/pages/my-lists/index.vue index e6fcba1b3..9ed9e2960 100644 --- a/packages/client/src/pages/my-lists/index.vue +++ b/packages/client/src/pages/my-lists/index.vue @@ -31,7 +31,7 @@ const pagination = { async function create() { const { canceled, result: name } = await os.inputText({ - title: i18n.locale.enterListName, + title: i18n.ts.enterListName, }); if (canceled) return; await os.apiWithDialog('users/lists/create', { name: name }); @@ -40,7 +40,7 @@ async function create() { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.manageLists, + title: i18n.ts.manageLists, icon: 'fas fa-list-ul', bg: 'var(--bg)', action: { diff --git a/packages/client/src/pages/not-found.vue b/packages/client/src/pages/not-found.vue index 914fdb929..cdeb54b88 100644 --- a/packages/client/src/pages/not-found.vue +++ b/packages/client/src/pages/not-found.vue @@ -13,7 +13,7 @@ import { i18n } from '@/i18n'; defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.notFound, + title: i18n.ts.notFound, icon: 'fas fa-exclamation-triangle', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/notifications.vue b/packages/client/src/pages/notifications.vue index 090e80f99..36e423e53 100644 --- a/packages/client/src/pages/notifications.vue +++ b/packages/client/src/pages/notifications.vue @@ -27,26 +27,26 @@ function setFilter(ev) { })); const items = includeTypes != null ? [{ icon: 'fas fa-times', - text: i18n.locale.clear, + text: i18n.ts.clear, action: () => { includeTypes = null; } }, null, ...typeItems] : typeItems; - os.popupMenu(items, ev.currentTarget || ev.target); + os.popupMenu(items, ev.currentTarget ?? ev.target); } defineExpose({ [symbols.PAGE_INFO]: computed(() => ({ - title: i18n.locale.notifications, + title: i18n.ts.notifications, icon: 'fas fa-bell', bg: 'var(--bg)', actions: [{ - text: i18n.locale.filter, + text: i18n.ts.filter, icon: 'fas fa-filter', highlighted: includeTypes != null, handler: setFilter, }, { - text: i18n.locale.markAllAsRead, + text: i18n.ts.markAllAsRead, icon: 'fas fa-check', handler: () => { os.apiWithDialog('notifications/mark-all-as-read'); @@ -54,11 +54,11 @@ defineExpose({ }], tabs: [{ active: tab === 'all', - title: i18n.locale.all, + title: i18n.ts.all, onClick: () => { tab = 'all'; }, }, { active: tab === 'unread', - title: i18n.locale.unread, + title: i18n.ts.unread, onClick: () => { tab = 'unread'; }, },] })), diff --git a/packages/client/src/pages/page-editor/page-editor.vue b/packages/client/src/pages/page-editor/page-editor.vue index fe207555f..f302ac4f9 100644 --- a/packages/client/src/pages/page-editor/page-editor.vue +++ b/packages/client/src/pages/page-editor/page-editor.vue @@ -448,7 +448,7 @@ export default defineComponent({ }, setEyeCatchingImage(e) { - selectFile(e.currentTarget || e.target, null).then(file => { + selectFile(e.currentTarget ?? e.target, null).then(file => { this.eyeCatchingImageId = file.id; }); }, diff --git a/packages/client/src/pages/preview.vue b/packages/client/src/pages/preview.vue index 8eb454951..4accac419 100644 --- a/packages/client/src/pages/preview.vue +++ b/packages/client/src/pages/preview.vue @@ -12,7 +12,7 @@ import { i18n } from '@/i18n'; defineExpose({ [symbols.PAGE_INFO]: computed(() => ({ - title: i18n.locale.preview, + title: i18n.ts.preview, icon: 'fas fa-eye', bg: 'var(--bg)', })), diff --git a/packages/client/src/pages/reset-password.vue b/packages/client/src/pages/reset-password.vue index 8ef73858f..7d008ae75 100644 --- a/packages/client/src/pages/reset-password.vue +++ b/packages/client/src/pages/reset-password.vue @@ -3,10 +3,10 @@
- + - {{ i18n.locale.save }} + {{ i18n.ts.save }}
@@ -43,7 +43,7 @@ onMounted(() => { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.resetPassword, + title: i18n.ts.resetPassword, icon: 'fas fa-lock', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/settings/accounts.vue b/packages/client/src/pages/settings/accounts.vue index c795ede8a..a744a031d 100644 --- a/packages/client/src/pages/settings/accounts.vue +++ b/packages/client/src/pages/settings/accounts.vue @@ -64,7 +64,7 @@ export default defineComponent({ icon: 'fas fa-trash-alt', danger: true, action: () => this.removeAccount(account), - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); }, addAccount(ev) { @@ -74,7 +74,7 @@ export default defineComponent({ }, { text: this.$ts.createAccount, action: () => { this.createAccount(); }, - }], ev.currentTarget || ev.target); + }], ev.currentTarget ?? ev.target); }, addExistingAccount() { 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/pages/settings/email.vue b/packages/client/src/pages/settings/email.vue index 54557f877..4697fec9b 100644 --- a/packages/client/src/pages/settings/email.vue +++ b/packages/client/src/pages/settings/email.vue @@ -62,7 +62,7 @@ export default defineComponent({ const emailAddress = ref($i.email); const INFO = { - title: i18n.locale.email, + title: i18n.ts.email, icon: 'fas fa-envelope', bg: 'var(--bg)', }; @@ -75,7 +75,7 @@ export default defineComponent({ const saveEmailAddress = () => { os.inputText({ - title: i18n.locale.password, + title: i18n.ts.password, type: 'password' }).then(({ canceled, result: password }) => { if (canceled) return; diff --git a/packages/client/src/pages/settings/import-export.vue b/packages/client/src/pages/settings/import-export.vue index 21031c559..c153b4d28 100644 --- a/packages/client/src/pages/settings/import-export.vue +++ b/packages/client/src/pages/settings/import-export.vue @@ -60,7 +60,7 @@ export default defineComponent({ setup(props, context) { const INFO = { - title: i18n.locale.importAndExport, + title: i18n.ts.importAndExport, icon: 'fas fa-boxes', bg: 'var(--bg)', }; @@ -71,14 +71,14 @@ export default defineComponent({ const onExportSuccess = () => { os.alert({ type: 'info', - text: i18n.locale.exportRequested, + text: i18n.ts.exportRequested, }); }; const onImportSuccess = () => { os.alert({ type: 'info', - text: i18n.locale.importRequested, + text: i18n.ts.importRequested, }); }; @@ -114,22 +114,22 @@ export default defineComponent({ }; const importFollowing = async (ev) => { - const file = await selectFile(ev.currentTarget || ev.target); + const file = await selectFile(ev.currentTarget ?? ev.target); os.api('i/import-following', { fileId: file.id }).then(onImportSuccess).catch(onError); }; const importUserLists = async (ev) => { - const file = await selectFile(ev.currentTarget || ev.target); + const file = await selectFile(ev.currentTarget ?? ev.target); os.api('i/import-user-lists', { fileId: file.id }).then(onImportSuccess).catch(onError); }; const importMuting = async (ev) => { - const file = await selectFile(ev.currentTarget || ev.target); + const file = await selectFile(ev.currentTarget ?? ev.target); os.api('i/import-muting', { fileId: file.id }).then(onImportSuccess).catch(onError); }; const importBlocking = async (ev) => { - const file = await selectFile(ev.currentTarget || ev.target); + const file = await selectFile(ev.currentTarget ?? ev.target); os.api('i/import-blocking', { fileId: file.id }).then(onImportSuccess).catch(onError); }; diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue index 66c8b147b..ac8414ddb 100644 --- a/packages/client/src/pages/settings/index.vue +++ b/packages/client/src/pages/settings/index.vue @@ -49,7 +49,7 @@ export default defineComponent({ setup(props, context) { const indexInfo = { - title: i18n.locale.settings, + title: i18n.ts.settings, icon: 'fas fa-cog', bg: 'var(--bg)', hideHeader: true, @@ -61,96 +61,96 @@ export default defineComponent({ const el = ref(null); const childInfo = ref(null); const menuDef = computed(() => [{ - title: i18n.locale.basicSettings, + title: i18n.ts.basicSettings, items: [{ icon: 'fas fa-user', - text: i18n.locale.profile, + text: i18n.ts.profile, to: '/settings/profile', active: page.value === 'profile', }, { icon: 'fas fa-lock-open', - text: i18n.locale.privacy, + text: i18n.ts.privacy, to: '/settings/privacy', active: page.value === 'privacy', }, { icon: 'fas fa-laugh', - text: i18n.locale.reaction, + text: i18n.ts.reaction, to: '/settings/reaction', active: page.value === 'reaction', }, { icon: 'fas fa-cloud', - text: i18n.locale.drive, + text: i18n.ts.drive, to: '/settings/drive', active: page.value === 'drive', }, { icon: 'fas fa-bell', - text: i18n.locale.notifications, + text: i18n.ts.notifications, to: '/settings/notifications', active: page.value === 'notifications', }, { icon: 'fas fa-envelope', - text: i18n.locale.email, + text: i18n.ts.email, to: '/settings/email', active: page.value === 'email', }, { icon: 'fas fa-share-alt', - text: i18n.locale.integration, + text: i18n.ts.integration, to: '/settings/integration', active: page.value === 'integration', }, { icon: 'fas fa-lock', - text: i18n.locale.security, + text: i18n.ts.security, to: '/settings/security', active: page.value === 'security', }], }, { - title: i18n.locale.clientSettings, + title: i18n.ts.clientSettings, items: [{ icon: 'fas fa-cogs', - text: i18n.locale.general, + text: i18n.ts.general, to: '/settings/general', active: page.value === 'general', }, { icon: 'fas fa-palette', - text: i18n.locale.theme, + text: i18n.ts.theme, to: '/settings/theme', active: page.value === 'theme', }, { icon: 'fas fa-list-ul', - text: i18n.locale.menu, + text: i18n.ts.menu, to: '/settings/menu', active: page.value === 'menu', }, { icon: 'fas fa-music', - text: i18n.locale.sounds, + text: i18n.ts.sounds, to: '/settings/sounds', active: page.value === 'sounds', }, { icon: 'fas fa-plug', - text: i18n.locale.plugins, + text: i18n.ts.plugins, to: '/settings/plugin', active: page.value === 'plugin', }], }, { - title: i18n.locale.otherSettings, + title: i18n.ts.otherSettings, items: [{ icon: 'fas fa-boxes', - text: i18n.locale.importAndExport, + text: i18n.ts.importAndExport, to: '/settings/import-export', active: page.value === 'import-export', }, { icon: 'fas fa-volume-mute', - text: i18n.locale.instanceMute, + text: i18n.ts.instanceMute, to: '/settings/instance-mute', active: page.value === 'instance-mute', }, { icon: 'fas fa-ban', - text: i18n.locale.muteAndBlock, + text: i18n.ts.muteAndBlock, to: '/settings/mute-block', active: page.value === 'mute-block', }, { icon: 'fas fa-comment-slash', - text: i18n.locale.wordMute, + text: i18n.ts.wordMute, to: '/settings/word-mute', active: page.value === 'word-mute', }, { @@ -160,7 +160,7 @@ export default defineComponent({ active: page.value === 'api', }, { icon: 'fas fa-ellipsis-h', - text: i18n.locale.other, + text: i18n.ts.other, to: '/settings/other', active: page.value === 'other', }], @@ -168,7 +168,7 @@ export default defineComponent({ items: [{ type: 'button', icon: 'fas fa-trash', - text: i18n.locale.clearCache, + text: i18n.ts.clearCache, action: () => { localStorage.removeItem('locale'); localStorage.removeItem('theme'); @@ -177,7 +177,7 @@ export default defineComponent({ }, { type: 'button', icon: 'fas fa-sign-in-alt fa-flip-horizontal', - text: i18n.locale.logout, + text: i18n.ts.logout, action: () => { signout(); }, diff --git a/packages/client/src/pages/settings/mute-block.vue b/packages/client/src/pages/settings/mute-block.vue index f4f9ebf8d..28d11809e 100644 --- a/packages/client/src/pages/settings/mute-block.vue +++ b/packages/client/src/pages/settings/mute-block.vue @@ -52,7 +52,7 @@ const blockingPagination = { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.muteAndBlock, + title: i18n.ts.muteAndBlock, icon: 'fas fa-ban', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/settings/privacy.vue b/packages/client/src/pages/settings/privacy.vue index dd13ba4bd..cfae7e9ca 100644 --- a/packages/client/src/pages/settings/privacy.vue +++ b/packages/client/src/pages/settings/privacy.vue @@ -86,7 +86,7 @@ function save() { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.privacy, + title: i18n.ts.privacy, icon: 'fas fa-lock-open', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/settings/profile.vue b/packages/client/src/pages/settings/profile.vue index f875146a2..66b654d87 100644 --- a/packages/client/src/pages/settings/profile.vue +++ b/packages/client/src/pages/settings/profile.vue @@ -3,45 +3,45 @@
- {{ i18n.locale._profile.changeAvatar }} + {{ i18n.ts._profile.changeAvatar }}
- {{ i18n.locale._profile.changeBanner }} + {{ i18n.ts._profile.changeBanner }}
- + - - + + - + - + - + - {{ i18n.locale._profile.metadataEdit }} - + {{ i18n.ts._profile.metadataEdit }} + - {{ i18n.locale.flagAsCat }} + {{ i18n.ts.flagAsCat }} - {{ i18n.locale.flagAsBot }} + {{ i18n.ts.flagAsBot }} - {{ i18n.locale.alwaysMarkSensitive }} + {{ i18n.ts.alwaysMarkSensitive }} @@ -102,7 +102,7 @@ function save() { } function changeAvatar(ev) { - selectFile(ev.currentTarget || ev.target, i18n.locale.avatar).then(async (file) => { + selectFile(ev.currentTarget ?? ev.target, i18n.ts.avatar).then(async (file) => { const i = await os.apiWithDialog('i/update', { avatarId: file.id, }); @@ -112,7 +112,7 @@ function changeAvatar(ev) { } function changeBanner(ev) { - selectFile(ev.currentTarget || ev.target, i18n.locale.banner).then(async (file) => { + selectFile(ev.currentTarget ?? ev.target, i18n.ts.banner).then(async (file) => { const i = await os.apiWithDialog('i/update', { bannerId: file.id, }); @@ -122,45 +122,45 @@ function changeBanner(ev) { } async function editMetadata() { - const { canceled, result } = await os.form(i18n.locale._profile.metadata, { + const { canceled, result } = await os.form(i18n.ts._profile.metadata, { fieldName0: { type: 'string', - label: i18n.locale._profile.metadataLabel + ' 1', + label: i18n.ts._profile.metadataLabel + ' 1', default: additionalFields.fieldName0, }, fieldValue0: { type: 'string', - label: i18n.locale._profile.metadataContent + ' 1', + label: i18n.ts._profile.metadataContent + ' 1', default: additionalFields.fieldValue0, }, fieldName1: { type: 'string', - label: i18n.locale._profile.metadataLabel + ' 2', + label: i18n.ts._profile.metadataLabel + ' 2', default: additionalFields.fieldName1, }, fieldValue1: { type: 'string', - label: i18n.locale._profile.metadataContent + ' 2', + label: i18n.ts._profile.metadataContent + ' 2', default: additionalFields.fieldValue1, }, fieldName2: { type: 'string', - label: i18n.locale._profile.metadataLabel + ' 3', + label: i18n.ts._profile.metadataLabel + ' 3', default: additionalFields.fieldName2, }, fieldValue2: { type: 'string', - label: i18n.locale._profile.metadataContent + ' 3', + label: i18n.ts._profile.metadataContent + ' 3', default: additionalFields.fieldValue2, }, fieldName3: { type: 'string', - label: i18n.locale._profile.metadataLabel + ' 4', + label: i18n.ts._profile.metadataLabel + ' 4', default: additionalFields.fieldName3, }, fieldValue3: { type: 'string', - label: i18n.locale._profile.metadataContent + ' 4', + label: i18n.ts._profile.metadataContent + ' 4', default: additionalFields.fieldValue3, }, }); @@ -196,7 +196,7 @@ async function editMetadata() { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.profile, + title: i18n.ts.profile, icon: 'fas fa-user', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/settings/reaction.vue b/packages/client/src/pages/settings/reaction.vue index e5b118994..ae3e1a118 100644 --- a/packages/client/src/pages/settings/reaction.vue +++ b/packages/client/src/pages/settings/reaction.vue @@ -44,8 +44,8 @@ - diff --git a/packages/client/src/pages/settings/theme.install.vue b/packages/client/src/pages/settings/theme.install.vue index e2a3f042b..2d3514342 100644 --- a/packages/client/src/pages/settings/theme.install.vue +++ b/packages/client/src/pages/settings/theme.install.vue @@ -1,12 +1,12 @@ @@ -32,21 +32,21 @@ function parseThemeCode(code: string) { } catch (e) { os.alert({ type: 'error', - text: i18n.locale._theme.invalid + text: i18n.ts._theme.invalid }); return false; } if (!validateTheme(theme)) { os.alert({ type: 'error', - text: i18n.locale._theme.invalid + text: i18n.ts._theme.invalid }); return false; } if (getThemes().some(t => t.id === theme.id)) { os.alert({ type: 'info', - text: i18n.locale._theme.alreadyInstalled + text: i18n.ts._theme.alreadyInstalled }); return false; } @@ -71,7 +71,7 @@ async function install(code: string): Promise { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale._theme.install, + title: i18n.ts._theme.install, icon: 'fas fa-download', bg: 'var(--bg)', }, diff --git a/packages/client/src/pages/settings/theme.vue b/packages/client/src/pages/settings/theme.vue index 658e36ec0..3e4ec1b2a 100644 --- a/packages/client/src/pages/settings/theme.vue +++ b/packages/client/src/pages/settings/theme.vue @@ -116,7 +116,7 @@ export default defineComponent({ setup(props, { emit }) { const INFO = { - title: i18n.locale.theme, + title: i18n.ts.theme, icon: 'fas fa-palette', bg: 'var(--bg)', }; @@ -184,7 +184,7 @@ export default defineComponent({ themesCount, wallpaper, setWallpaper(e) { - selectFile(e.currentTarget || e.target, null).then(file => { + selectFile(e.currentTarget ?? e.target, null).then(file => { wallpaper.value = file.url; }); }, diff --git a/packages/client/src/pages/signup-complete.vue b/packages/client/src/pages/signup-complete.vue index a10af1a4c..344c9195f 100644 --- a/packages/client/src/pages/signup-complete.vue +++ b/packages/client/src/pages/signup-complete.vue @@ -1,6 +1,6 @@ @@ -18,7 +18,7 @@ const props = defineProps<{ onMounted(async () => { await os.alert({ type: 'info', - text: i18n.t('clickToFinishEmailVerification', { ok: i18n.locale.gotIt }), + text: i18n.t('clickToFinishEmailVerification', { ok: i18n.ts.gotIt }), }); const res = await os.apiWithDialog('signup-pending', { code: props.code, @@ -28,7 +28,7 @@ onMounted(async () => { defineExpose({ [symbols.PAGE_INFO]: { - title: i18n.locale.signup, + title: i18n.ts.signup, icon: 'fas fa-user', }, }); diff --git a/packages/client/src/pages/theme-editor.vue b/packages/client/src/pages/theme-editor.vue index 80b8c7806..a53e23c1c 100644 --- a/packages/client/src/pages/theme-editor.vue +++ b/packages/client/src/pages/theme-editor.vue @@ -2,7 +2,7 @@
- +
- {{ pageInfo.title }} + @@ -13,99 +13,89 @@
- diff --git a/packages/client/src/ui/deck.vue b/packages/client/src/ui/deck.vue index 51a4853e9..9accc34a8 100644 --- a/packages/client/src/ui/deck.vue +++ b/packages/client/src/ui/deck.vue @@ -104,7 +104,7 @@ export default defineComponent({ ]; const { canceled, result: column } = await os.select({ - title: i18n.locale._deck.addColumn, + title: i18n.ts._deck.addColumn, items: columns.map(column => ({ value: column, text: i18n.t('_deck._columns.' + column) })) @@ -121,7 +121,7 @@ export default defineComponent({ const onContextmenu = (ev) => { os.contextMenu([{ - text: i18n.locale._deck.addColumn, + text: i18n.ts._deck.addColumn, icon: null, action: addColumn }], ev); diff --git a/packages/client/src/ui/deck/deck-store.ts b/packages/client/src/ui/deck/deck-store.ts index 6b6b02f3f..66db5e83e 100644 --- a/packages/client/src/ui/deck/deck-store.ts +++ b/packages/client/src/ui/deck/deck-store.ts @@ -77,12 +77,12 @@ export const loadDeck = async () => { deckStore.set('columns', [{ id: 'a', type: 'main', - name: i18n.locale._deck._columns.main, + name: i18n.ts._deck._columns.main, width: 350, }, { id: 'b', type: 'notifications', - name: i18n.locale._deck._columns.notifications, + name: i18n.ts._deck._columns.notifications, width: 330, }]); deckStore.set('layout', [['a'], ['b']]); diff --git a/packages/client/src/ui/universal.vue b/packages/client/src/ui/universal.vue index 16cc9a4f0..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 @@
-