summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-08-12 12:48:58 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-08-12 12:48:58 +0900
commit9fd0e9085004fe01529ef9d3853a3c12c5d1bd8d (patch)
tree2b59b7768791b093319696e88f47fbbb3797a107 /src
parentMerge branch 'develop' (diff)
parent12.87.0 (diff)
downloadmisskey-9fd0e9085004fe01529ef9d3853a3c12c5d1bd8d.tar.gz
misskey-9fd0e9085004fe01529ef9d3853a3c12c5d1bd8d.tar.bz2
misskey-9fd0e9085004fe01529ef9d3853a3c12c5d1bd8d.zip
Merge branch 'develop'
Diffstat (limited to 'src')
-rw-r--r--src/client/components/autocomplete.vue82
-rw-r--r--src/client/init.ts15
-rw-r--r--src/client/pages/about-misskey.vue18
-rw-r--r--src/docs/en-US/features/note.md2
-rw-r--r--src/docs/en-US/general/links.md2
-rw-r--r--src/docs/ru-RU/general/troubleshooting.md2
-rw-r--r--src/docs/zh-CN/admin/disable-timelines.md6
-rw-r--r--src/docs/zh-CN/advanced/api.md68
-rw-r--r--src/docs/zh-CN/advanced/create-plugin.md6
-rw-r--r--src/docs/zh-CN/advanced/stream.md2
10 files changed, 104 insertions, 99 deletions
diff --git a/src/client/components/autocomplete.vue b/src/client/components/autocomplete.vue
index 35cfb77301..065ee6de2e 100644
--- a/src/client/components/autocomplete.vue
+++ b/src/client/components/autocomplete.vue
@@ -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;
});
diff --git a/src/client/init.ts b/src/client/init.ts
index a4a228da22..95aa18862c 100644
--- a/src/client/init.ts
+++ b/src/client/init.ts
@@ -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 });
diff --git a/src/client/pages/about-misskey.vue b/src/client/pages/about-misskey.vue
index f7b9245fcc..a324ebce5c 100644
--- a/src/client/pages/about-misskey.vue
+++ b/src/client/pages/about-misskey.vue
@@ -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);
}
}
diff --git a/src/docs/en-US/features/note.md b/src/docs/en-US/features/note.md
index fbc47f1ac3..a835cf09a4 100644
--- a/src/docs/en-US/features/note.md
+++ b/src/docs/en-US/features/note.md
@@ -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.
diff --git a/src/docs/en-US/general/links.md b/src/docs/en-US/general/links.md
index 932db975b3..1952160359 100644
--- a/src/docs/en-US/general/links.md
+++ b/src/docs/en-US/general/links.md
@@ -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
diff --git a/src/docs/ru-RU/general/troubleshooting.md b/src/docs/ru-RU/general/troubleshooting.md
index f895b49847..e325e4e944 100644
--- a/src/docs/ru-RU/general/troubleshooting.md
+++ b/src/docs/ru-RU/general/troubleshooting.md
@@ -1,4 +1,4 @@
-# トラブルシューティング
+# Разрешение проблем
<div class="info">ℹ️ <a href="./faq">よくある質問</a>も合わせてお役立てください。</div>
問題が発生したときは、まずこちらをご確認ください。 該当する項目が無い、もしくは手順を試しても効果がない場合は、サーバーの管理者に連絡するか[不具合を報告](./report-issue)してください。
diff --git a/src/docs/zh-CN/admin/disable-timelines.md b/src/docs/zh-CN/admin/disable-timelines.md
index fb20e91a43..fdc66a6898 100644
--- a/src/docs/zh-CN/admin/disable-timelines.md
+++ b/src/docs/zh-CN/admin/disable-timelines.md
@@ -1,8 +1,8 @@
# 禁用 LTL/STL/GTL
Misskey 允许您禁用 LTL/STL/GTL。如果需要启用/禁用,请在实例控制面板中进行设置。
-LTLやSTLは、そのインスタンス全員の投稿が見れるため、新規のユーザーにとってはユーザーを探す必要がなくなり、興味のあるユーザーを見つけやすいという利点があります。 しかし同時に、フォロー機能が活用されなくなったり、不適切な投稿が目につきやすくなったり、チャットのようになることで内輪感が生じて逆に新規ユーザーが参加しにくくなるといったデメリットも持ち合わせています。 サーバーによってメリット/デメリットどちらが優勢かは異なるので、オプションとして無効にできるようになっています。 もしデメリットの方が上回っていると感じたら、それらのタイムラインを無効化することも検討してください。
+LTL 和 STL 的优点是新用户不必寻找用户,因为他们可以查看来自所有实例的帖子,从而更容易找到感兴趣的用户。 但同时它也存在着诸多缺点,例如无法使用关注,容易看到不适宜的帖子,感觉像小圈子内部对话一样而使新用户难以参与等等。 不同的服务器会有不同的优缺点,因此可以选择禁用它们。 如果您认为弊大于利,请考虑禁用这些时间线。
-<div class="warn">⚠️ 無効化を行うと、ユーザーが困惑し、短期的に見て利用者が減る可能性があります。そのため、無効化の際は影響を慎重に検討し、事前に説明してフォローを整える期間を一定程度設けることを推奨します。</div>
+<div class="warn">⚠️ 禁用后可能会使用户感到困惑,并导致短期内的用户数量减少。因此,建议在禁用时慎重考虑影响。建议事先发布声明并留出一定时间作为过渡。</div>
-なお、管理者/モデレーターは、これらのタイムラインの無効化状態は適用されず、引き続き利用することが可能です。
+请注意,这些时间线的禁用状态不适用于管理员/版主,这些用户可以继续使用。
diff --git a/src/docs/zh-CN/advanced/api.md b/src/docs/zh-CN/advanced/api.md
index 76019b6145..a1ca2f470b 100644
--- a/src/docs/zh-CN/advanced/api.md
+++ b/src/docs/zh-CN/advanced/api.md
@@ -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)
diff --git a/src/docs/zh-CN/advanced/create-plugin.md b/src/docs/zh-CN/advanced/create-plugin.md
index e444b9ed37..b3289f323e 100644
--- a/src/docs/zh-CN/advanced/create-plugin.md
+++ b/src/docs/zh-CN/advanced/create-plugin.md
@@ -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)
diff --git a/src/docs/zh-CN/advanced/stream.md b/src/docs/zh-CN/advanced/stream.md
index f9584e8c7f..b4cd7ec104 100644
--- a/src/docs/zh-CN/advanced/stream.md
+++ b/src/docs/zh-CN/advanced/stream.md
@@ -1,4 +1,4 @@
-# ストリーミングAPI
+# 流式API
ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。