mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-12-27 16:23:07 +02:00
Merge branch 'develop'
This commit is contained in:
commit
9fd0e90850
21 changed files with 654 additions and 703 deletions
|
@ -1 +1 @@
|
|||
v16.2.0
|
||||
v16.6.2
|
||||
|
|
24
CHANGELOG.md
24
CHANGELOG.md
|
@ -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)
|
||||
|
||||
### Improvements
|
||||
|
@ -9,4 +31,4 @@
|
|||
|
||||
### Bugfixes
|
||||
- ハッシュタグ入力が空のときに#が付くのを修正
|
||||
- フォロー通知のEメール通知を修正
|
||||
- フォローリクエストのEメール通知を修正
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -771,6 +771,7 @@ received: "Erhalten"
|
|||
searchResult: "Suchergebnisse"
|
||||
hashtags: "Hashtags"
|
||||
troubleshooting: "Problembehandlung"
|
||||
useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden"
|
||||
_docs:
|
||||
continueReading: "Mehr lesen"
|
||||
features: "Funktionen"
|
||||
|
|
|
@ -249,7 +249,7 @@ agreeTo: "I agree to {0}"
|
|||
tos: "Terms of Service"
|
||||
start: "Begin"
|
||||
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"
|
||||
images: "Images"
|
||||
birthday: "Birthday"
|
||||
|
@ -771,6 +771,7 @@ received: "Received"
|
|||
searchResult: "Search results"
|
||||
hashtags: "Hashtags"
|
||||
troubleshooting: "Troubleshooting"
|
||||
useBlurEffect: "Use blur effects in the UI"
|
||||
_docs:
|
||||
continueReading: "Read more"
|
||||
features: "Features"
|
||||
|
|
|
@ -772,6 +772,7 @@ searchResult: "検索結果"
|
|||
hashtags: "ハッシュタグ"
|
||||
troubleshooting: "トラブルシューティング"
|
||||
useBlurEffect: "UIにぼかし効果を使用"
|
||||
learnMore: "詳しく"
|
||||
|
||||
_docs:
|
||||
continueReading: "続きを読む"
|
||||
|
|
|
@ -771,12 +771,14 @@ received: "수신"
|
|||
searchResult: "검색 결과"
|
||||
hashtags: "해시태그"
|
||||
troubleshooting: "트러블 슈팅"
|
||||
useBlurEffect: "UI에 흐림 효과 사용"
|
||||
_docs:
|
||||
continueReading: "계속 읽기"
|
||||
features: "기능"
|
||||
generalTopics: "일반 주제"
|
||||
advancedTopics: "심화 주제"
|
||||
admin: "관리"
|
||||
translateWarn: "이 문서는 번역되었기 때문에 원본과는 내용이 다를 수 있습니다."
|
||||
_ad:
|
||||
back: "뒤로"
|
||||
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
||||
|
|
|
@ -529,6 +529,7 @@ removeAllFollowing: "Удалить всех подписчиков"
|
|||
removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста, применяйте это действие, если инстанс больше не существует."
|
||||
userSuspended: "Эта учётная запись заморожена"
|
||||
userSilenced: "Этот пользователь был заглушен"
|
||||
menu: "Меню"
|
||||
divider: "Линия-разделитель"
|
||||
addItem: "Добавить элемент"
|
||||
rooms: "Комната"
|
||||
|
@ -761,15 +762,23 @@ middle: "Средне"
|
|||
low: "Низкий"
|
||||
emailNotConfiguredWarning: "Не указан адрес электронной почты"
|
||||
ratio: "Соотношение"
|
||||
customCss: "Индивидуальный CSS"
|
||||
customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки здесь чреваты тем, что сайт перестанет нормально работать у вас."
|
||||
global: "Всеобщая"
|
||||
squareAvatars: "Квадратные аватарки"
|
||||
sent: "Отправить"
|
||||
received: "Получено"
|
||||
searchResult: "Результаты поиска"
|
||||
hashtags: "Хэштег"
|
||||
troubleshooting: "Разрешение проблем"
|
||||
useBlurEffect: "Размытие в интерфейсе"
|
||||
_docs:
|
||||
continueReading: "Читать подробнее"
|
||||
features: "Возможности"
|
||||
generalTopics: "Основные темы"
|
||||
advancedTopics: "Дополнительные темы"
|
||||
admin: "Управление"
|
||||
translateWarn: "Это перевод документа. Он может неточно отражать содержимое оригинала."
|
||||
_ad:
|
||||
back: "Выход"
|
||||
reduceFrequencyOfThisAd: "Реже показывать эту рекламу"
|
||||
|
|
|
@ -771,6 +771,8 @@ received: "收取"
|
|||
searchResult: "搜索结果"
|
||||
hashtags: "话题标签"
|
||||
troubleshooting: "故障排除"
|
||||
useBlurEffect: "在UI上使用模糊效果"
|
||||
learnMore: "更多信息"
|
||||
_docs:
|
||||
continueReading: "继续阅读"
|
||||
features: "特性"
|
||||
|
|
82
package.json
82
package.json
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <syuilotan@yahoo.co.jp>",
|
||||
"version": "12.86.0",
|
||||
"version": "12.87.0",
|
||||
"codename": "indigo",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -44,7 +44,7 @@
|
|||
"@sinonjs/fake-timers": "7.1.2",
|
||||
"@syuilo/aiscript": "0.11.1",
|
||||
"@types/bcryptjs": "2.4.2",
|
||||
"@types/bull": "3.15.2",
|
||||
"@types/bull": "3.15.3",
|
||||
"@types/cbor": "6.0.0",
|
||||
"@types/dateformat": "3.0.1",
|
||||
"@types/escape-regexp": "0.0.0",
|
||||
|
@ -57,8 +57,8 @@
|
|||
"@types/jsonld": "1.5.6",
|
||||
"@types/katex": "0.11.1",
|
||||
"@types/koa": "2.13.4",
|
||||
"@types/koa-bodyparser": "4.3.2",
|
||||
"@types/koa-cors": "0.0.1",
|
||||
"@types/koa-bodyparser": "4.3.3",
|
||||
"@types/koa-cors": "0.0.2",
|
||||
"@types/koa-favicon": "2.0.21",
|
||||
"@types/koa-logger": "3.1.1",
|
||||
"@types/koa-mount": "4.0.0",
|
||||
|
@ -68,10 +68,10 @@
|
|||
"@types/koa__multer": "2.0.3",
|
||||
"@types/koa__router": "8.0.7",
|
||||
"@types/markdown-it": "12.0.3",
|
||||
"@types/matter-js": "0.17.3",
|
||||
"@types/matter-js": "0.17.5",
|
||||
"@types/mocha": "8.2.3",
|
||||
"@types/node": "16.3.3",
|
||||
"@types/node-fetch": "2.5.11",
|
||||
"@types/node": "16.6.0",
|
||||
"@types/node-fetch": "2.5.12",
|
||||
"@types/nodemailer": "6.4.4",
|
||||
"@types/nprogress": "0.2.0",
|
||||
"@types/oauth": "0.9.1",
|
||||
|
@ -88,7 +88,7 @@
|
|||
"@types/request-stats": "3.0.0",
|
||||
"@types/rimraf": "3.0.1",
|
||||
"@types/seedrandom": "2.4.28",
|
||||
"@types/sharp": "0.28.4",
|
||||
"@types/sharp": "0.28.5",
|
||||
"@types/sinonjs__fake-timers": "6.0.3",
|
||||
"@types/speakeasy": "2.0.6",
|
||||
"@types/throttle-debounce": "2.1.0",
|
||||
|
@ -98,40 +98,40 @@
|
|||
"@types/web-push": "3.3.2",
|
||||
"@types/webpack": "5.28.0",
|
||||
"@types/webpack-stream": "3.2.12",
|
||||
"@types/websocket": "1.0.3",
|
||||
"@types/ws": "7.4.6",
|
||||
"@typescript-eslint/parser": "4.28.3",
|
||||
"@vue/compiler-sfc": "3.2.1",
|
||||
"@types/websocket": "1.0.4",
|
||||
"@types/ws": "7.4.7",
|
||||
"@typescript-eslint/parser": "4.29.1",
|
||||
"@vue/compiler-sfc": "3.2.2",
|
||||
"abort-controller": "3.0.0",
|
||||
"apexcharts": "3.27.2",
|
||||
"apexcharts": "3.27.3",
|
||||
"autobind-decorator": "2.4.0",
|
||||
"autosize": "4.0.4",
|
||||
"autwh": "0.1.0",
|
||||
"aws-sdk": "2.948.0",
|
||||
"aws-sdk": "2.966.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"blurhash": "1.1.3",
|
||||
"broadcast-channel": "3.7.0",
|
||||
"bull": "3.26.0",
|
||||
"cafy": "15.2.1",
|
||||
"cbor": "7.0.6",
|
||||
"chalk": "4.1.1",
|
||||
"cbor": "8.0.0",
|
||||
"chalk": "4.1.2",
|
||||
"chart.js": "2.9.4",
|
||||
"cli-highlight": "2.1.11",
|
||||
"commander": "7.2.0",
|
||||
"concurrently": "6.2.0",
|
||||
"content-disposition": "0.5.3",
|
||||
"core-js": "3.15.2",
|
||||
"core-js": "3.16.1",
|
||||
"crc-32": "1.2.0",
|
||||
"css-loader": "6.0.0",
|
||||
"cssnano": "5.0.6",
|
||||
"css-loader": "6.2.0",
|
||||
"cssnano": "5.0.7",
|
||||
"dateformat": "4.5.1",
|
||||
"diskusage": "1.1.3",
|
||||
"escape-regexp": "0.0.1",
|
||||
"eslint": "7.30.0",
|
||||
"eslint-plugin-vue": "7.13.0",
|
||||
"eslint": "7.32.0",
|
||||
"eslint-plugin-vue": "7.16.0",
|
||||
"eventemitter3": "4.0.7",
|
||||
"feed": "4.2.2",
|
||||
"file-type": "16.5.1",
|
||||
"file-type": "16.5.3",
|
||||
"fluent-ffmpeg": "2.1.2",
|
||||
"glob": "7.1.7",
|
||||
"got": "11.8.2",
|
||||
|
@ -146,17 +146,17 @@
|
|||
"http-proxy-agent": "4.0.1",
|
||||
"http-signature": "1.3.5",
|
||||
"https-proxy-agent": "5.0.0",
|
||||
"idb-keyval": "5.0.6",
|
||||
"idb-keyval": "5.1.3",
|
||||
"insert-text-at-cursor": "0.3.0",
|
||||
"is-root": "2.1.0",
|
||||
"is-svg": "4.3.1",
|
||||
"js-yaml": "4.1.0",
|
||||
"jsdom": "16.6.0",
|
||||
"jsdom": "16.7.0",
|
||||
"json5": "2.2.0",
|
||||
"json5-loader": "4.0.1",
|
||||
"jsonld": "5.2.0",
|
||||
"jsrsasign": "8.0.20",
|
||||
"katex": "0.13.11",
|
||||
"katex": "0.13.13",
|
||||
"koa": "2.13.1",
|
||||
"koa-bodyparser": "4.3.0",
|
||||
"koa-favicon": "2.1.0",
|
||||
|
@ -168,7 +168,7 @@
|
|||
"koa-views": "7.0.1",
|
||||
"langmap": "0.0.16",
|
||||
"lookup-dns-cache": "2.1.0",
|
||||
"markdown-it": "12.1.0",
|
||||
"markdown-it": "12.2.0",
|
||||
"markdown-it-anchor": "7.1.0",
|
||||
"matter-js": "0.17.1",
|
||||
"mfm-js": "0.19.0",
|
||||
|
@ -176,7 +176,7 @@
|
|||
"mocha": "8.4.0",
|
||||
"moji": "0.5.1",
|
||||
"ms": "2.1.3",
|
||||
"multer": "1.4.2",
|
||||
"multer": "1.4.3",
|
||||
"nested-property": "4.0.0",
|
||||
"node-fetch": "2.6.1",
|
||||
"nodemailer": "6.6.3",
|
||||
|
@ -185,7 +185,7 @@
|
|||
"parse5": "6.0.1",
|
||||
"pg": "8.6.0",
|
||||
"portscanner": "2.2.0",
|
||||
"postcss": "8.3.5",
|
||||
"postcss": "8.3.6",
|
||||
"postcss-loader": "6.1.1",
|
||||
"prismjs": "1.24.1",
|
||||
"probe-image-size": "7.2.1",
|
||||
|
@ -202,32 +202,32 @@
|
|||
"redis": "3.1.2",
|
||||
"redis-lock": "0.1.4",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"regenerator-runtime": "0.13.7",
|
||||
"regenerator-runtime": "0.13.9",
|
||||
"rename": "1.0.4",
|
||||
"request-stats": "3.0.0",
|
||||
"require-all": "3.0.0",
|
||||
"rimraf": "3.0.2",
|
||||
"rndstr": "1.0.0",
|
||||
"s-age": "1.1.2",
|
||||
"sass": "1.35.2",
|
||||
"sass": "1.37.5",
|
||||
"sass-loader": "12.1.0",
|
||||
"seedrandom": "3.0.5",
|
||||
"sharp": "0.28.3",
|
||||
"speakeasy": "2.0.0",
|
||||
"stringz": "2.1.0",
|
||||
"style-loader": "3.1.0",
|
||||
"summaly": "2.4.0",
|
||||
"style-loader": "3.2.1",
|
||||
"summaly": "2.4.1",
|
||||
"syslog-pro": "1.0.0",
|
||||
"systeminformation": "5.7.7",
|
||||
"systeminformation": "5.8.0",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"textarea-caret": "3.1.0",
|
||||
"three": "0.117.1",
|
||||
"throttle-debounce": "3.0.1",
|
||||
"tinycolor2": "1.4.2",
|
||||
"tmp": "0.2.1",
|
||||
"ts-loader": "9.2.3",
|
||||
"ts-node": "10.1.0",
|
||||
"tsc-alias": "1.3.7",
|
||||
"ts-loader": "9.2.5",
|
||||
"ts-node": "10.2.0",
|
||||
"tsc-alias": "1.3.8",
|
||||
"tsconfig-paths": "3.10.1",
|
||||
"tslint": "6.1.3",
|
||||
"tslint-sonarts": "1.9.0",
|
||||
|
@ -237,21 +237,21 @@
|
|||
"ulid": "2.3.0",
|
||||
"uuid": "8.3.2",
|
||||
"v-debounce": "0.1.2",
|
||||
"vanilla-tilt": "1.7.0",
|
||||
"vue": "3.2.1",
|
||||
"vanilla-tilt": "1.7.1",
|
||||
"vue": "3.2.2",
|
||||
"vue-color": "2.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-router": "4.0.5",
|
||||
"vue-style-loader": "4.1.3",
|
||||
"vue-svg-loader": "0.17.0-beta.2",
|
||||
"vuedraggable": "4.0.1",
|
||||
"web-push": "3.4.5",
|
||||
"webpack": "5.45.1",
|
||||
"webpack": "5.50.0",
|
||||
"webpack-cli": "4.7.2",
|
||||
"websocket": "1.0.34",
|
||||
"ws": "7.5.3",
|
||||
"ws": "8.1.0",
|
||||
"xev": "2.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -35,6 +35,7 @@ import { twemojiSvgBase } from '@/misc/twemoji-base';
|
|||
import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
|
||||
import { acct } from '@client/filters/user';
|
||||
import * as os from '@client/os';
|
||||
import { instance } from '@client/instance';
|
||||
|
||||
type EmojiDef = {
|
||||
emoji: string;
|
||||
|
@ -75,6 +76,36 @@ for (const x of lib) {
|
|||
|
||||
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({
|
||||
props: {
|
||||
type: {
|
||||
|
@ -124,7 +155,6 @@ export default defineComponent({
|
|||
emojis: [],
|
||||
items: [],
|
||||
select: -1,
|
||||
emojiDb: [] as EmojiDef[]
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -144,36 +174,6 @@ export default defineComponent({
|
|||
mounted() {
|
||||
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);
|
||||
|
||||
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
||||
|
@ -203,6 +203,13 @@ export default defineComponent({
|
|||
complete(type, value) {
|
||||
this.$emit('done', { type, value });
|
||||
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() {
|
||||
|
@ -281,29 +288,26 @@ export default defineComponent({
|
|||
}
|
||||
} else if (this.type == 'emoji') {
|
||||
if (this.q == null || this.q == '') {
|
||||
this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf).sort((a, b) => {
|
||||
var textA = a.name.toUpperCase();
|
||||
var textB = b.name.toUpperCase();
|
||||
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
|
||||
});
|
||||
// 最近使った絵文字をサジェスト
|
||||
this.emojis = this.$store.state.recentlyUsedEmojis.map(emoji => emojiDb.find(e => e.emoji == emoji)).filter(x => x != null);
|
||||
return;
|
||||
}
|
||||
|
||||
const matched = [];
|
||||
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);
|
||||
return 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);
|
||||
return 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);
|
||||
return matched.length == max;
|
||||
});
|
||||
|
|
|
@ -16,7 +16,7 @@ import { router } from '@client/router';
|
|||
import { applyTheme } from '@client/scripts/theme';
|
||||
import { isDeviceDarkmode } from '@client/scripts/is-device-darkmode';
|
||||
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 { $i, refreshAccount, login, updateAccount, signout } from '@client/account';
|
||||
import { defaultStore, ColdDeviceStorage } from '@client/store';
|
||||
|
@ -198,6 +198,19 @@ if (splash) {
|
|||
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) => {
|
||||
applyTheme(darkMode ? ColdDeviceStorage.get('darkTheme') : ColdDeviceStorage.get('lightTheme'));
|
||||
}, { immediate: localStorage.theme == null });
|
||||
|
|
|
@ -4,14 +4,14 @@
|
|||
<div id="debug"></div>
|
||||
<section class="_formItem 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="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>
|
||||
</div>
|
||||
</section>
|
||||
<section class="_formItem" style="text-align: center; padding: 0 16px;" @click="gravity">
|
||||
{{ $ts._aboutMisskey.about }}
|
||||
<section class="_formItem" style="text-align: center; padding: 0 16px;">
|
||||
{{ $ts._aboutMisskey.about }}<br><MkA class="_link" to="/docs/general/misskey">{{ $ts.learnMore }}</MkA>
|
||||
</section>
|
||||
<FormGroup>
|
||||
<FormLink to="https://github.com/misskey-dev/misskey" external>
|
||||
|
@ -54,7 +54,6 @@
|
|||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import VanillaTilt from 'vanilla-tilt';
|
||||
import { version } from '@client/config';
|
||||
import FormLink from '@client/components/form/link.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 MkLink from '@client/components/link.vue';
|
||||
import { physics } from '@client/scripts/physics.ts';
|
||||
import * as os from '@client/os';
|
||||
import * as symbols from '@client/symbols';
|
||||
|
||||
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() {
|
||||
if (this.easterEggEngine) {
|
||||
this.easterEggEngine.stop();
|
||||
|
@ -181,7 +170,6 @@ export default defineComponent({
|
|||
gravity() {
|
||||
if (!this.easterEggReady) return;
|
||||
this.easterEggReady = false;
|
||||
this.$refs.icon.vanillaTilt.destroy();
|
||||
this.easterEggEngine = physics(this.$refs.about);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
||||
## 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.
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# A collection of links
|
||||
|
||||
## 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/) - Misskeyに関する話題を扱うフォーラム
|
||||
|
||||
## Accounts
|
||||
- [@repo@misskey.io](https://misskey.io/@repo) - A bot that publishes posts about updates to the Misskey repository
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# トラブルシューティング
|
||||
# Разрешение проблем
|
||||
<div class="info">ℹ️ <a href="./faq">よくある質問</a>も合わせてお役立てください。</div>
|
||||
|
||||
問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# 禁用 LTL/STL/GTL
|
||||
Misskey 允许您禁用 LTL/STL/GTL。如果需要启用/禁用,请在实例控制面板中进行设置。
|
||||
|
||||
LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください。
|
||||
LTL 和 STL 的优点是新用户不必寻找用户,因为他们可以查看来自所有实例的帖子,从而更容易找到感兴趣的用户。 但同时它也存在着诸多缺点,例如无法使用关注,容易看到不适宜的帖子,感觉像小圈子内部对话一样而使新用户难以参与等等。 不同的服务器会有不同的优缺点,因此可以选择禁用它们。 如果您认为弊大于利,请考虑禁用这些时间线。
|
||||
|
||||
<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します。</div>
|
||||
<div class="warn">⚠️ 禁用后可能会使用户感到困惑,并导致短期内的用户数量减少。因此,建议在禁用时慎重考虑影响。建议事先发布声明并留出一定时间作为过渡。</div>
|
||||
|
||||
なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です。
|
||||
请注意,这些时间线的禁用状态不适用于管理员/版主,这些用户可以继续使用。
|
||||
|
|
|
@ -1,58 +1,58 @@
|
|||
# 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にクエリパラメータとしていくつかのオプションを設定できます:
|
||||
* `name` ... アプリケーション名
|
||||
显示时,可以在URL中设置一些选项作为查询参数:
|
||||
* `name` ... 应用程序名称
|
||||
* > 例: `MissDeck`
|
||||
* `icon` ... アプリケーションのアイコン画像URL
|
||||
* `icon` ... 应用程序图标URL
|
||||
* > 例: `https://missdeck.example.com/icon.png`
|
||||
* `callback` ... 認証が終わった後にリダイレクトするURL
|
||||
* `callback` ... 认证后重定向的URL
|
||||
* > 例: `https://missdeck.example.com/callback`
|
||||
* リダイレクト時には、`session`というクエリパラメータでセッションIDが付きます
|
||||
* `permission` ... アプリケーションが要求する権限
|
||||
* 重定向时,会话ID将添加查询参数`session`
|
||||
* `permission` ... 应用程序要求的权限
|
||||
* > 例: `write:notes,write:following,read:drive`
|
||||
* 要求する権限を`,`で区切って列挙します
|
||||
* どのような権限があるかは[APIリファレンス](/api-doc)で確認できます
|
||||
* 要求的权限需要以`,`分隔
|
||||
* 您可以在[API参考](/api-doc)中确认您所拥有的权限。
|
||||
|
||||
#### Step 3
|
||||
ユーザーが発行を許可した後、`{_URL_}/api/miauth/{session}/check`にPOSTリクエストすると、レスポンスとしてアクセストークンを含むJSONが返ります。
|
||||
#### 步骤 3
|
||||
用户允许发行后,对`{_URL_}/api/miauth/{session}/check`的POST请求所返回的是一个包含访问令牌的JSON格式的响应。
|
||||
|
||||
レスポンスに含まれるプロパティ:
|
||||
* `token` ... ユーザーのアクセストークン
|
||||
* `user` ... ユーザーの情報
|
||||
响应中包含的属性:
|
||||
* `token` ... 用户的访问令牌
|
||||
* `user` ... 用户信息
|
||||
|
||||
[「APIの使い方」へ進む](#APIの使い方)
|
||||
[请转到“API使用方法”](#APIの使い方)
|
||||
|
||||
## APIの使い方
|
||||
**APIはすべてPOSTで、リクエスト/レスポンスともにJSON形式です。RESTではありません。** アクセストークンは、`i`というパラメータ名でリクエストに含めます。
|
||||
## API使用方法
|
||||
**所有API均为POST,并且请求/响应均为JSON格式。不是REST。** 访问令牌包含在请求中,参数名为`i`。
|
||||
|
||||
* [APIリファレンス](/api-doc)
|
||||
* [ストリーミングAPI](./stream)
|
||||
* [API 参考](/api-doc)
|
||||
* [流式API](./stream)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# プラグインの作成
|
||||
Misskey Webクライアントのプラグイン機能を使うと、クライアントを拡張し、様々な機能を追加できます。 ここではプラグインの作成にあたってのメタデータ定義や、AiScript APIリファレンスを掲載します。
|
||||
# 插件开发
|
||||
Misskey Web客户端插件功能使您可以扩展客户端并添加各种功能。 我们在这里给出用于创建插件的元数据定义和AiScript API参考。
|
||||
|
||||
## 元数据
|
||||
プラグインは、AiScriptのメタデータ埋め込み機能を使って、デフォルトとしてプラグインのメタデータを定義する必要があります。 メタデータは次のプロパティを含むオブジェクトです。
|
||||
|
@ -34,7 +34,7 @@ Misskey Webクライアントのプラグイン機能を使うと、クライア
|
|||
#### default
|
||||
設定のデフォルト値
|
||||
|
||||
## APIリファレンス
|
||||
## API 参考
|
||||
AiScript標準で組み込まれているAPIは掲載しません。
|
||||
|
||||
### Mk:dialog(title text type)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# ストリーミングAPI
|
||||
# 流式API
|
||||
|
||||
ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。
|
||||
|
||||
|
|
Loading…
Reference in a new issue