Merge branch 'develop'

This commit is contained in:
syuilo 2021-08-12 12:48:58 +09:00
commit a6e2f18821
21 changed files with 654 additions and 703 deletions

View File

@ -1 +1 @@
v16.2.0 v16.6.2

View File

@ -1,3 +1,25 @@
<!--
## 12.x.x (unreleased)
### Improvements
### Bugfixes
-->
## 12.87.0 (2021/08/12)
### Improvements
- 絵文字オートコンプリートで一文字目は最近使った絵文字をサジェストするように
- 絵文字オートコンプリートのパフォーマンスを改善
- about-misskeyページにドキュメントへのリンクを追加
- Docker: Node.jsを16.6.2に
- 依存関係の更新
- 翻訳の更新
### Bugfixes
- Misskey更新時、テーマキャッシュの影響でスタイルがおかしくなる問題を修正
## 12.86.0 (2021/08/11) ## 12.86.0 (2021/08/11)
### Improvements ### Improvements
@ -9,4 +31,4 @@
### Bugfixes ### Bugfixes
- ハッシュタグ入力が空のときに#が付くのを修正 - ハッシュタグ入力が空のときに#が付くのを修正
- フォロー通知のEメール通知を修正 - フォローリクエストのEメール通知を修正

View File

@ -1,4 +1,4 @@
FROM node:16.2.0-alpine3.13 AS base FROM node:16.6.2-alpine3.13 AS base
ENV NODE_ENV=production ENV NODE_ENV=production

View File

@ -771,6 +771,7 @@ received: "Erhalten"
searchResult: "Suchergebnisse" searchResult: "Suchergebnisse"
hashtags: "Hashtags" hashtags: "Hashtags"
troubleshooting: "Problembehandlung" troubleshooting: "Problembehandlung"
useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden"
_docs: _docs:
continueReading: "Mehr lesen" continueReading: "Mehr lesen"
features: "Funktionen" features: "Funktionen"

View File

@ -249,7 +249,7 @@ agreeTo: "I agree to {0}"
tos: "Terms of Service" tos: "Terms of Service"
start: "Begin" start: "Begin"
home: "Home" home: "Home"
remoteUserCaution: "As this user is from a renote instance, the shown information may be incomplete." remoteUserCaution: "As this user is from a remote instance, the shown information may be incomplete."
activity: "Activity" activity: "Activity"
images: "Images" images: "Images"
birthday: "Birthday" birthday: "Birthday"
@ -771,6 +771,7 @@ received: "Received"
searchResult: "Search results" searchResult: "Search results"
hashtags: "Hashtags" hashtags: "Hashtags"
troubleshooting: "Troubleshooting" troubleshooting: "Troubleshooting"
useBlurEffect: "Use blur effects in the UI"
_docs: _docs:
continueReading: "Read more" continueReading: "Read more"
features: "Features" features: "Features"

View File

@ -772,6 +772,7 @@ searchResult: "検索結果"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
troubleshooting: "トラブルシューティング" troubleshooting: "トラブルシューティング"
useBlurEffect: "UIにぼかし効果を使用" useBlurEffect: "UIにぼかし効果を使用"
learnMore: "詳しく"
_docs: _docs:
continueReading: "続きを読む" continueReading: "続きを読む"

View File

@ -771,12 +771,14 @@ received: "수신"
searchResult: "검색 결과" searchResult: "검색 결과"
hashtags: "해시태그" hashtags: "해시태그"
troubleshooting: "트러블 슈팅" troubleshooting: "트러블 슈팅"
useBlurEffect: "UI에 흐림 효과 사용"
_docs: _docs:
continueReading: "계속 읽기" continueReading: "계속 읽기"
features: "기능" features: "기능"
generalTopics: "일반 주제" generalTopics: "일반 주제"
advancedTopics: "심화 주제" advancedTopics: "심화 주제"
admin: "관리" admin: "관리"
translateWarn: "이 문서는 번역되었기 때문에 원본과는 내용이 다를 수 있습니다."
_ad: _ad:
back: "뒤로" back: "뒤로"
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기" reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"

View File

@ -529,6 +529,7 @@ removeAllFollowing: "Удалить всех подписчиков"
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует." removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
userSuspended: "Эта учётная запись заморожена" userSuspended: "Эта учётная запись заморожена"
userSilenced: "Этот пользователь был заглушен" userSilenced: "Этот пользователь был заглушен"
menu: "Меню"
divider: "Линия-разделитель" divider: "Линия-разделитель"
addItem: "Добавить элемент" addItem: "Добавить элемент"
rooms: "Комната" rooms: "Комната"
@ -761,15 +762,23 @@ middle: "Средне"
low: "Низкий" low: "Низкий"
emailNotConfiguredWarning: "Не указан адрес электронной почты" emailNotConfiguredWarning: "Не указан адрес электронной почты"
ratio: "Соотношение" ratio: "Соотношение"
customCss: "Индивидуальный CSS"
customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
global: "Всеобщая" global: "Всеобщая"
squareAvatars: "Квадратные аватарки"
sent: "Отправить" sent: "Отправить"
received: "Получено"
searchResult: "Результаты поиска"
hashtags: "Хэштег" hashtags: "Хэштег"
troubleshooting: "Разрешение проблем"
useBlurEffect: "Размытие в интерфейсе"
_docs: _docs:
continueReading: "Читать подробнее" continueReading: "Читать подробнее"
features: "Возможности" features: "Возможности"
generalTopics: "Основные темы" generalTopics: "Основные темы"
advancedTopics: "Дополнительные темы" advancedTopics: "Дополнительные темы"
admin: "Управление" admin: "Управление"
translateWarn: "Это перевод документа. Он может неточно отражать содержимое оригинала."
_ad: _ad:
back: "Выход" back: "Выход"
reduceFrequencyOfThisAd: "Реже показывать эту рекламу" reduceFrequencyOfThisAd: "Реже показывать эту рекламу"

View File

@ -771,6 +771,8 @@ received: "收取"
searchResult: "搜索结果" searchResult: "搜索结果"
hashtags: "话题标签" hashtags: "话题标签"
troubleshooting: "故障排除" troubleshooting: "故障排除"
useBlurEffect: "在UI上使用模糊效果"
learnMore: "更多信息"
_docs: _docs:
continueReading: "继续阅读" continueReading: "继续阅读"
features: "特性" features: "特性"

View File

@ -1,7 +1,7 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>", "author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.86.0", "version": "12.87.0",
"codename": "indigo", "codename": "indigo",
"repository": { "repository": {
"type": "git", "type": "git",
@ -44,7 +44,7 @@
"@sinonjs/fake-timers": "7.1.2", "@sinonjs/fake-timers": "7.1.2",
"@syuilo/aiscript": "0.11.1", "@syuilo/aiscript": "0.11.1",
"@types/bcryptjs": "2.4.2", "@types/bcryptjs": "2.4.2",
"@types/bull": "3.15.2", "@types/bull": "3.15.3",
"@types/cbor": "6.0.0", "@types/cbor": "6.0.0",
"@types/dateformat": "3.0.1", "@types/dateformat": "3.0.1",
"@types/escape-regexp": "0.0.0", "@types/escape-regexp": "0.0.0",
@ -57,8 +57,8 @@
"@types/jsonld": "1.5.6", "@types/jsonld": "1.5.6",
"@types/katex": "0.11.1", "@types/katex": "0.11.1",
"@types/koa": "2.13.4", "@types/koa": "2.13.4",
"@types/koa-bodyparser": "4.3.2", "@types/koa-bodyparser": "4.3.3",
"@types/koa-cors": "0.0.1", "@types/koa-cors": "0.0.2",
"@types/koa-favicon": "2.0.21", "@types/koa-favicon": "2.0.21",
"@types/koa-logger": "3.1.1", "@types/koa-logger": "3.1.1",
"@types/koa-mount": "4.0.0", "@types/koa-mount": "4.0.0",
@ -68,10 +68,10 @@
"@types/koa__multer": "2.0.3", "@types/koa__multer": "2.0.3",
"@types/koa__router": "8.0.7", "@types/koa__router": "8.0.7",
"@types/markdown-it": "12.0.3", "@types/markdown-it": "12.0.3",
"@types/matter-js": "0.17.3", "@types/matter-js": "0.17.5",
"@types/mocha": "8.2.3", "@types/mocha": "8.2.3",
"@types/node": "16.3.3", "@types/node": "16.6.0",
"@types/node-fetch": "2.5.11", "@types/node-fetch": "2.5.12",
"@types/nodemailer": "6.4.4", "@types/nodemailer": "6.4.4",
"@types/nprogress": "0.2.0", "@types/nprogress": "0.2.0",
"@types/oauth": "0.9.1", "@types/oauth": "0.9.1",
@ -88,7 +88,7 @@
"@types/request-stats": "3.0.0", "@types/request-stats": "3.0.0",
"@types/rimraf": "3.0.1", "@types/rimraf": "3.0.1",
"@types/seedrandom": "2.4.28", "@types/seedrandom": "2.4.28",
"@types/sharp": "0.28.4", "@types/sharp": "0.28.5",
"@types/sinonjs__fake-timers": "6.0.3", "@types/sinonjs__fake-timers": "6.0.3",
"@types/speakeasy": "2.0.6", "@types/speakeasy": "2.0.6",
"@types/throttle-debounce": "2.1.0", "@types/throttle-debounce": "2.1.0",
@ -98,40 +98,40 @@
"@types/web-push": "3.3.2", "@types/web-push": "3.3.2",
"@types/webpack": "5.28.0", "@types/webpack": "5.28.0",
"@types/webpack-stream": "3.2.12", "@types/webpack-stream": "3.2.12",
"@types/websocket": "1.0.3", "@types/websocket": "1.0.4",
"@types/ws": "7.4.6", "@types/ws": "7.4.7",
"@typescript-eslint/parser": "4.28.3", "@typescript-eslint/parser": "4.29.1",
"@vue/compiler-sfc": "3.2.1", "@vue/compiler-sfc": "3.2.2",
"abort-controller": "3.0.0", "abort-controller": "3.0.0",
"apexcharts": "3.27.2", "apexcharts": "3.27.3",
"autobind-decorator": "2.4.0", "autobind-decorator": "2.4.0",
"autosize": "4.0.4", "autosize": "4.0.4",
"autwh": "0.1.0", "autwh": "0.1.0",
"aws-sdk": "2.948.0", "aws-sdk": "2.966.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "1.1.3", "blurhash": "1.1.3",
"broadcast-channel": "3.7.0", "broadcast-channel": "3.7.0",
"bull": "3.26.0", "bull": "3.26.0",
"cafy": "15.2.1", "cafy": "15.2.1",
"cbor": "7.0.6", "cbor": "8.0.0",
"chalk": "4.1.1", "chalk": "4.1.2",
"chart.js": "2.9.4", "chart.js": "2.9.4",
"cli-highlight": "2.1.11", "cli-highlight": "2.1.11",
"commander": "7.2.0", "commander": "7.2.0",
"concurrently": "6.2.0", "concurrently": "6.2.0",
"content-disposition": "0.5.3", "content-disposition": "0.5.3",
"core-js": "3.15.2", "core-js": "3.16.1",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "6.0.0", "css-loader": "6.2.0",
"cssnano": "5.0.6", "cssnano": "5.0.7",
"dateformat": "4.5.1", "dateformat": "4.5.1",
"diskusage": "1.1.3", "diskusage": "1.1.3",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "7.30.0", "eslint": "7.32.0",
"eslint-plugin-vue": "7.13.0", "eslint-plugin-vue": "7.16.0",
"eventemitter3": "4.0.7", "eventemitter3": "4.0.7",
"feed": "4.2.2", "feed": "4.2.2",
"file-type": "16.5.1", "file-type": "16.5.3",
"fluent-ffmpeg": "2.1.2", "fluent-ffmpeg": "2.1.2",
"glob": "7.1.7", "glob": "7.1.7",
"got": "11.8.2", "got": "11.8.2",
@ -146,17 +146,17 @@
"http-proxy-agent": "4.0.1", "http-proxy-agent": "4.0.1",
"http-signature": "1.3.5", "http-signature": "1.3.5",
"https-proxy-agent": "5.0.0", "https-proxy-agent": "5.0.0",
"idb-keyval": "5.0.6", "idb-keyval": "5.1.3",
"insert-text-at-cursor": "0.3.0", "insert-text-at-cursor": "0.3.0",
"is-root": "2.1.0", "is-root": "2.1.0",
"is-svg": "4.3.1", "is-svg": "4.3.1",
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"jsdom": "16.6.0", "jsdom": "16.7.0",
"json5": "2.2.0", "json5": "2.2.0",
"json5-loader": "4.0.1", "json5-loader": "4.0.1",
"jsonld": "5.2.0", "jsonld": "5.2.0",
"jsrsasign": "8.0.20", "jsrsasign": "8.0.20",
"katex": "0.13.11", "katex": "0.13.13",
"koa": "2.13.1", "koa": "2.13.1",
"koa-bodyparser": "4.3.0", "koa-bodyparser": "4.3.0",
"koa-favicon": "2.1.0", "koa-favicon": "2.1.0",
@ -168,7 +168,7 @@
"koa-views": "7.0.1", "koa-views": "7.0.1",
"langmap": "0.0.16", "langmap": "0.0.16",
"lookup-dns-cache": "2.1.0", "lookup-dns-cache": "2.1.0",
"markdown-it": "12.1.0", "markdown-it": "12.2.0",
"markdown-it-anchor": "7.1.0", "markdown-it-anchor": "7.1.0",
"matter-js": "0.17.1", "matter-js": "0.17.1",
"mfm-js": "0.19.0", "mfm-js": "0.19.0",
@ -176,7 +176,7 @@
"mocha": "8.4.0", "mocha": "8.4.0",
"moji": "0.5.1", "moji": "0.5.1",
"ms": "2.1.3", "ms": "2.1.3",
"multer": "1.4.2", "multer": "1.4.3",
"nested-property": "4.0.0", "nested-property": "4.0.0",
"node-fetch": "2.6.1", "node-fetch": "2.6.1",
"nodemailer": "6.6.3", "nodemailer": "6.6.3",
@ -185,7 +185,7 @@
"parse5": "6.0.1", "parse5": "6.0.1",
"pg": "8.6.0", "pg": "8.6.0",
"portscanner": "2.2.0", "portscanner": "2.2.0",
"postcss": "8.3.5", "postcss": "8.3.6",
"postcss-loader": "6.1.1", "postcss-loader": "6.1.1",
"prismjs": "1.24.1", "prismjs": "1.24.1",
"probe-image-size": "7.2.1", "probe-image-size": "7.2.1",
@ -202,32 +202,32 @@
"redis": "3.1.2", "redis": "3.1.2",
"redis-lock": "0.1.4", "redis-lock": "0.1.4",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"regenerator-runtime": "0.13.7", "regenerator-runtime": "0.13.9",
"rename": "1.0.4", "rename": "1.0.4",
"request-stats": "3.0.0", "request-stats": "3.0.0",
"require-all": "3.0.0", "require-all": "3.0.0",
"rimraf": "3.0.2", "rimraf": "3.0.2",
"rndstr": "1.0.0", "rndstr": "1.0.0",
"s-age": "1.1.2", "s-age": "1.1.2",
"sass": "1.35.2", "sass": "1.37.5",
"sass-loader": "12.1.0", "sass-loader": "12.1.0",
"seedrandom": "3.0.5", "seedrandom": "3.0.5",
"sharp": "0.28.3", "sharp": "0.28.3",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"style-loader": "3.1.0", "style-loader": "3.2.1",
"summaly": "2.4.0", "summaly": "2.4.1",
"syslog-pro": "1.0.0", "syslog-pro": "1.0.0",
"systeminformation": "5.7.7", "systeminformation": "5.8.0",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"three": "0.117.1", "three": "0.117.1",
"throttle-debounce": "3.0.1", "throttle-debounce": "3.0.1",
"tinycolor2": "1.4.2", "tinycolor2": "1.4.2",
"tmp": "0.2.1", "tmp": "0.2.1",
"ts-loader": "9.2.3", "ts-loader": "9.2.5",
"ts-node": "10.1.0", "ts-node": "10.2.0",
"tsc-alias": "1.3.7", "tsc-alias": "1.3.8",
"tsconfig-paths": "3.10.1", "tsconfig-paths": "3.10.1",
"tslint": "6.1.3", "tslint": "6.1.3",
"tslint-sonarts": "1.9.0", "tslint-sonarts": "1.9.0",
@ -237,21 +237,21 @@
"ulid": "2.3.0", "ulid": "2.3.0",
"uuid": "8.3.2", "uuid": "8.3.2",
"v-debounce": "0.1.2", "v-debounce": "0.1.2",
"vanilla-tilt": "1.7.0", "vanilla-tilt": "1.7.1",
"vue": "3.2.1", "vue": "3.2.2",
"vue-color": "2.8.1", "vue-color": "2.8.1",
"vue-json-pretty": "1.8.1", "vue-json-pretty": "1.8.1",
"vue-loader": "16.3.1", "vue-loader": "16.5.0",
"vue-prism-editor": "2.0.0-alpha.2", "vue-prism-editor": "2.0.0-alpha.2",
"vue-router": "4.0.5", "vue-router": "4.0.5",
"vue-style-loader": "4.1.3", "vue-style-loader": "4.1.3",
"vue-svg-loader": "0.17.0-beta.2", "vue-svg-loader": "0.17.0-beta.2",
"vuedraggable": "4.0.1", "vuedraggable": "4.0.1",
"web-push": "3.4.5", "web-push": "3.4.5",
"webpack": "5.45.1", "webpack": "5.50.0",
"webpack-cli": "4.7.2", "webpack-cli": "4.7.2",
"websocket": "1.0.34", "websocket": "1.0.34",
"ws": "7.5.3", "ws": "8.1.0",
"xev": "2.0.1" "xev": "2.0.1"
}, },
"devDependencies": { "devDependencies": {

View File

@ -35,6 +35,7 @@ import { twemojiSvgBase } from '@/misc/twemoji-base';
import { getStaticImageUrl } from '@client/scripts/get-static-image-url'; import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
import { acct } from '@client/filters/user'; import { acct } from '@client/filters/user';
import * as os from '@client/os'; import * as os from '@client/os';
import { instance } from '@client/instance';
type EmojiDef = { type EmojiDef = {
emoji: string; emoji: string;
@ -75,6 +76,36 @@ for (const x of lib) {
emjdb.sort((a, b) => a.name.length - b.name.length); emjdb.sort((a, b) => a.name.length - b.name.length);
//#region Construct Emoji DB
const customEmojis = instance.emojis;
const emojiDefinitions: EmojiDef[] = [];
for (const x of customEmojis) {
emojiDefinitions.push({
name: x.name,
emoji: `:${x.name}:`,
url: x.url,
isCustomEmoji: true
});
if (x.aliases) {
for (const alias of x.aliases) {
emojiDefinitions.push({
name: alias,
aliasOf: x.name,
emoji: `:${x.name}:`,
url: x.url,
isCustomEmoji: true
});
}
}
}
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
const emojiDb = markRaw(emojiDefinitions.concat(emjdb));
//#endregion
export default defineComponent({ export default defineComponent({
props: { props: {
type: { type: {
@ -124,7 +155,6 @@ export default defineComponent({
emojis: [], emojis: [],
items: [], items: [],
select: -1, select: -1,
emojiDb: [] as EmojiDef[]
} }
}, },
@ -144,36 +174,6 @@ export default defineComponent({
mounted() { mounted() {
this.setPosition(); this.setPosition();
//#region Construct Emoji DB
const customEmojis = this.$instance.emojis;
const emojiDefinitions: EmojiDef[] = [];
for (const x of customEmojis) {
emojiDefinitions.push({
name: x.name,
emoji: `:${x.name}:`,
url: x.url,
isCustomEmoji: true
});
if (x.aliases) {
for (const alias of x.aliases) {
emojiDefinitions.push({
name: alias,
aliasOf: x.name,
emoji: `:${x.name}:`,
url: x.url,
isCustomEmoji: true
});
}
}
}
emojiDefinitions.sort((a, b) => a.name.length - b.name.length);
this.emojiDb = markRaw(emojiDefinitions.concat(emjdb));
//#endregion
this.textarea.addEventListener('keydown', this.onKeydown); this.textarea.addEventListener('keydown', this.onKeydown);
for (const el of Array.from(document.querySelectorAll('body *'))) { for (const el of Array.from(document.querySelectorAll('body *'))) {
@ -203,6 +203,13 @@ export default defineComponent({
complete(type, value) { complete(type, value) {
this.$emit('done', { type, value }); this.$emit('done', { type, value });
this.$emit('closed'); this.$emit('closed');
if (type === 'emoji') {
let recents = this.$store.state.recentlyUsedEmojis;
recents = recents.filter((e: any) => e !== value);
recents.unshift(value);
this.$store.set('recentlyUsedEmojis', recents.splice(0, 32));
}
}, },
setPosition() { setPosition() {
@ -281,29 +288,26 @@ export default defineComponent({
} }
} else if (this.type == 'emoji') { } else if (this.type == 'emoji') {
if (this.q == null || this.q == '') { if (this.q == null || this.q == '') {
this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => { // 使
var textA = a.name.toUpperCase(); this.emojis = this.$store.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji == emoji)).filter(x => x != null);
var textB = b.name.toUpperCase();
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
return; return;
} }
const matched = []; const matched = [];
const max = 30; const max = 30;
this.emojiDb.some(x => { emojiDb.some(x => {
if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x); if (x.name.startsWith(this.q) && !x.aliasOf && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
return matched.length == max; return matched.length == max;
}); });
if (matched.length < max) { if (matched.length < max) {
this.emojiDb.some(x => { emojiDb.some(x => {
if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x); if (x.name.startsWith(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
return matched.length == max; return matched.length == max;
}); });
} }
if (matched.length < max) { if (matched.length < max) {
this.emojiDb.some(x => { emojiDb.some(x => {
if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x); if (x.name.includes(this.q) && !matched.some(y => y.emoji == x.emoji)) matched.push(x);
return matched.length == max; return matched.length == max;
}); });

View File

@ -16,7 +16,7 @@ import { router } from '@client/router';
import { applyTheme } from '@client/scripts/theme'; import { applyTheme } from '@client/scripts/theme';
import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode'; import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode';
import { i18n } from '@client/i18n'; import { i18n } from '@client/i18n';
import { stream, dialog, post } from '@client/os'; import { stream, dialog, post, popup } from '@client/os';
import * as sound from '@client/scripts/sound'; import * as sound from '@client/scripts/sound';
import { $i, refreshAccount, login, updateAccount, signout } from '@client/account'; import { $i, refreshAccount, login, updateAccount, signout } from '@client/account';
import { defaultStore, ColdDeviceStorage } from '@client/store'; import { defaultStore, ColdDeviceStorage } from '@client/store';
@ -198,6 +198,19 @@ if (splash) {
splash.style.pointerEvents = 'none'; splash.style.pointerEvents = 'none';
} }
// クライアントが更新されたか?
const lastVersion = localStorage.getItem('lastVersion');
if (lastVersion !== version) {
localStorage.setItem('lastVersion', version);
// テーマリビルドするため
localStorage.removeItem('theme');
// TODO: バージョンが新しくなった時だけダイアログ出す
//popup();
}
// NOTE: この処理は必ず↑のクライアント更新時処理より後に来ること(テーマ再構築のため)
watch(defaultStore.reactiveState.darkMode, (darkMode) => { watch(defaultStore.reactiveState.darkMode, (darkMode) => {
applyTheme(darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme')); applyTheme(darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme'));
}, { immediate: localStorage.theme == null }); }, { immediate: localStorage.theme == null });

View File

@ -4,14 +4,14 @@
<div id="debug"></div> <div id="debug"></div>
<section class="_formItem about"> <section class="_formItem about">
<div class="_formPanel panel" :class="{ playing: easterEggEngine != null }" ref="about"> <div class="_formPanel panel" :class="{ playing: easterEggEngine != null }" ref="about">
<img src="/static-assets/client/about-icon.png" alt="" class="icon" ref="icon" @load="iconLoaded" draggable="false"/> <img src="/static-assets/client/about-icon.png" alt="" class="icon" @load="iconLoaded" draggable="false" @click="gravity"/>
<div class="misskey">Misskey</div> <div class="misskey">Misskey</div>
<div class="version">v{{ version }}</div> <div class="version">v{{ version }}</div>
<span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span> <span class="emoji" v-for="emoji in easterEggEmojis" :key="emoji.id" :data-physics-x="emoji.left" :data-physics-y="emoji.top" :class="{ _physics_circle_: !emoji.emoji.startsWith(':') }"><MkEmoji class="emoji" :emoji="emoji.emoji" :custom-emojis="$instance.emojis" :is-reaction="false" :normal="true" :no-style="true"/></span>
</div> </div>
</section> </section>
<section class="_formItem" style="text-align: center; padding: 0 16px;" @click="gravity"> <section class="_formItem" style="text-align: center; padding: 0 16px;">
{{ $ts._aboutMisskey.about }} {{ $ts._aboutMisskey.about }}<br><MkA class="_link" to="/docs/general/misskey">{{ $ts.learnMore }}</MkA>
</section> </section>
<FormGroup> <FormGroup>
<FormLink to="https://github.com/misskey-dev/misskey" external> <FormLink to="https://github.com/misskey-dev/misskey" external>
@ -54,7 +54,6 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import VanillaTilt from 'vanilla-tilt';
import { version } from '@client/config'; import { version } from '@client/config';
import FormLink from '@client/components/form/link.vue'; import FormLink from '@client/components/form/link.vue';
import FormBase from '@client/components/form/base.vue'; import FormBase from '@client/components/form/base.vue';
@ -62,7 +61,6 @@ import FormGroup from '@client/components/form/group.vue';
import FormKeyValueView from '@client/components/form/key-value-view.vue'; import FormKeyValueView from '@client/components/form/key-value-view.vue';
import MkLink from '@client/components/link.vue'; import MkLink from '@client/components/link.vue';
import { physics } from '@client/scripts/physics.ts'; import { physics } from '@client/scripts/physics.ts';
import * as os from '@client/os';
import * as symbols from '@client/symbols'; import * as symbols from '@client/symbols';
const patrons = [ const patrons = [
@ -145,15 +143,6 @@ export default defineComponent({
} }
}, },
mounted() {
VanillaTilt.init(this.$refs.icon, {
max: 30,
perspective: 500,
scale: 1.125,
speed: 1000,
});
},
beforeUnmount() { beforeUnmount() {
if (this.easterEggEngine) { if (this.easterEggEngine) {
this.easterEggEngine.stop(); this.easterEggEngine.stop();
@ -181,7 +170,6 @@ export default defineComponent({
gravity() { gravity() {
if (!this.easterEggReady) return; if (!this.easterEggReady) return;
this.easterEggReady = false; this.easterEggReady = false;
this.$refs.icon.vanillaTilt.destroy();
this.easterEggEngine = physics(this.$refs.about); this.easterEggEngine = physics(this.$refs.about);
} }
} }

View File

@ -51,4 +51,4 @@ If you enable this option, your note won't be federated to remote instances.
By pinning a note to your profile it will be constantly displayed on your profile page. To pin a note, open the note menu and press "Pin to profile". It's also possible to pin multiple notes to your profile. By pinning a note to your profile it will be constantly displayed on your profile page. To pin a note, open the note menu and press "Pin to profile". It's also possible to pin multiple notes to your profile.
## Watch ## Watch
ノートをウォッチすると、自分以外のノートへのリアクションや返信などの通知を受け取ることができます。 ノートのメニューを開き、「ウォッチ」を選択してウォッチできます。 You can get notifications for replies, reactions etc. for a note that is not yours by watching it. To watch a note, select "Watch" from the respective note's menu.

View File

@ -1,8 +1,8 @@
# A collection of links # A collection of links
## Websites ## Websites
- [Official Discord](https://discord.gg/Wp8gVStHW3) - The official Discord server for Misskey
- [Misskey Forum](https://forum.misskey.io/) - A forum used for questions surrounding Misskey - [Misskey Forum](https://forum.misskey.io/) - A forum used for questions surrounding Misskey
- [Misskey Forum](https://forum.misskey.io/) - Misskeyに関する話題を扱うフォーラム
## Accounts ## Accounts
- [@repo@misskey.io](https://misskey.io/@repo) - A bot that publishes posts about updates to the Misskey repository - [@repo@misskey.io](https://misskey.io/@repo) - A bot that publishes posts about updates to the Misskey repository

View File

@ -1,4 +1,4 @@
# トラブルシューティング # Разрешение проблем
<div class="info"> <a href="./faq">よくある質問</a>も合わせてお役立てください。</div> <div class="info"> <a href="./faq">よくある質問</a>も合わせてお役立てください。</div>
問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。 問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。

View File

@ -1,8 +1,8 @@
# 禁用 LTL/STL/GTL # 禁用 LTL/STL/GTL
Misskey 允许您禁用 LTL/STL/GTL。如果需要启用/禁用,请在实例控制面板中进行设置。 Misskey 允许您禁用 LTL/STL/GTL。如果需要启用/禁用,请在实例控制面板中进行设置。
LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください LTL 和 STL 的优点是新用户不必寻找用户,因为他们可以查看来自所有实例的帖子,从而更容易找到感兴趣的用户。 但同时它也存在着诸多缺点,例如无法使用关注,容易看到不适宜的帖子,感觉像小圈子内部对话一样而使新用户难以参与等等。 不同的服务器会有不同的优缺点,因此可以选择禁用它们。 如果您认为弊大于利,请考虑禁用这些时间线
<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します</div> <div class="warn">⚠️ 禁用后可能会使用户感到困惑,并导致短期内的用户数量减少。因此,建议在禁用时慎重考虑影响。建议事先发布声明并留出一定时间作为过渡</div>
なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です 请注意,这些时间线的禁用状态不适用于管理员/版主,这些用户可以继续使用

View File

@ -1,58 +1,58 @@
# Misskey API # Misskey API
MisskeyAPIを使ってMisskeyクライアント、Misskey連携Webサービス、Bot等(以下「アプリケーション」と呼びます)を開発できます。 ストリーミングAPIもあるので、リアルタイム性のあるアプリケーションを作ることも可能です 您可以使用Misskey API来开发Misskey客户端、与Misskey链接的Web服务、Bot等应用以下称为“应用程序”。 另外还有一个流式API因此还可以用来创建实时性的应用程序
APIを使い始めるには、まずアクセストークンを取得する必要があります。 このドキュメントでは、アクセストークンを取得する手順を説明した後、基本的なAPIの使い方を説明します 开始使用API前您首先需要获取访问令牌。 本文档将向您介绍获取访问令牌所需的步骤以及API的基本使用方法
## アクセストークンの取得 ## 访问令牌的获取
基本的に、APIはリクエストにはアクセストークンが必要となります。 APIにリクエストするのが自分自身なのか、不特定の利用者に使ってもらうアプリケーションなのかによって取得手順は異なります 总的来说API请求需要访问令牌。 获取方式则根据请求的API或者非特定用户所使用的应用程序而有所不同
* 前者の場合: [「自分自身のアクセストークンを手動発行する」](#自分自身のアクセストークンを手動発行する)に進む * 对于前者:请转到[“手动发放自己的访问令牌”](#自分自身のアクセストークンを手動発行する)
* 後者の場合: [「アプリケーション利用者にアクセストークンの発行をリクエストする」](#アプリケーション利用者にアクセストークンの発行をリクエストする)に進む * 对于后者:请转到[“请求应用程序用户发放访问令牌”](#アプリケーション利用者にアクセストークンの発行をリクエストする)
### 自分自身のアクセストークンを手動発行する ### 手动发放自己的访问令牌
「設定 > API」で、自分のアクセストークンを発行できます 您可以在“设置 > API”中发放自己的访问令牌
[「APIの使い方」へ進む](#APIの使い方) [请转到“API使用方法”](#APIの使い方)
### アプリケーション利用者にアクセストークンの発行をリクエストする ### 请求应用程序用户发放访问令牌
アプリケーション利用者のアクセストークンを取得するには、以下の手順で発行をリクエストします 要获取应用程序用户的访问令牌,请按照以下步骤请求发放
#### Step 1 #### 步骤 1
UUIDを生成する。以後これをセッションIDと呼びます 生成UUID。以下将其称为会话ID
> このセッションIDは毎回生成し、使いまわさないようにしてください > 此会话ID需要每次重新生成请勿重复使用
#### Step 2 #### 步骤 2
`{_URL_}/miauth/{session}`をユーザーのブラウザで表示させる。`{session}`の部分は、セッションIDに置き換えてください 在用户的浏览器中显示`{_URL_}/miauth/{session}`。将`{session}`的部分替换为会话ID
> 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f` > 例: `{_URL_}/miauth/c1f6d42b-468b-4fd2-8274-e58abdedef6f`
表示する際、URLにクエリパラメータとしていくつかのオプションを設定できます: 显示时可以在URL中设置一些选项作为查询参数
* `name` ... アプリケーション名 * `name` ... 应用程序名称
* > 例: `MissDeck` * > 例: `MissDeck`
* `icon` ... アプリケーションのアイコン画像URL * `icon` ... 应用程序图标URL
* > 例: `https://missdeck.example.com/icon.png` * > 例: `https://missdeck.example.com/icon.png`
* `callback` ... 認証が終わった後にリダイレクトするURL * `callback` ... 认证后重定向的URL
* > 例: `https://missdeck.example.com/callback` * > 例: `https://missdeck.example.com/callback`
* リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます * 重定向时会话ID将添加查询参数`session`
* `permission` ... アプリケーションが要求する権 * `permission` ... 应用程序要求的权
* > 例: `write:notes,write:following,read:drive` * > 例: `write:notes,write:following,read:drive`
* 要求する権限を`,`で区切って列挙します * 要求的权限需要以`,`分隔
* どのような権限があるかは[APIリファレンス](/api-doc)で確認できます * 您可以在[API参考](/api-doc)中确认您所拥有的权限。
#### Step 3 #### 步骤 3
ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります 用户允许发行后,对`{_URL_}/api/miauth/{session}/check`的POST请求所返回的是一个包含访问令牌的JSON格式的响应
レスポンスに含まれるプロパティ: 响应中包含的属性:
* `token` ... ユーザーのアクセストークン * `token` ... 用户的访问令牌
* `user` ... ユーザーの情報 * `user` ... 用户信息
[「APIの使い方」へ進む](#APIの使い方) [请转到“API使用方法”](#APIの使い方)
## APIの使い方 ## API使用方法
**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます **所有API均为POST并且请求/响应均为JSON格式。不是REST。** 访问令牌包含在请求中,参数名为`i`
* [APIリファレンス](/api-doc) * [API 参考](/api-doc)
* [ストリーミングAPI](./stream) * [流式API](./stream)

View File

@ -1,5 +1,5 @@
# プラグインの作成 # 插件开发
Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します Misskey Web客户端插件功能使您可以扩展客户端并添加各种功能。 我们在这里给出用于创建插件的元数据定义和AiScript API参考
## 元数据 ## 元数据
プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。 プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
@ -34,7 +34,7 @@ Misskey Webクライアントのプラグイン機能を使うと、クライア
#### default #### default
設定のデフォルト値 設定のデフォルト値
## APIリファレンス ## API 参考
AiScript標準で組み込まれているAPIは掲載しません。 AiScript標準で組み込まれているAPIは掲載しません。
### Mk:dialog(title text type) ### Mk:dialog(title text type)

View File

@ -1,4 +1,4 @@
# ストリーミングAPI # 流式API
ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。 ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。

1026
yarn.lock

File diff suppressed because it is too large Load Diff