Compare commits
84 Commits
Author | SHA1 | Date | |
---|---|---|---|
e53c383908 | |||
55c9c0436b | |||
66b79e5e24 | |||
514b830910 | |||
e4f799bf1d | |||
b383427d3d | |||
e969518139 | |||
113fe294bd | |||
a4d92f781f | |||
414cac49c3 | |||
95b157ac3e | |||
8e3d884081 | |||
9def6fcadd | |||
7837bd44fc | |||
a6c3663155 | |||
0b5afadbb8 | |||
43864f0da4 | |||
6a0d9d70ed | |||
63c6dce68e | |||
53422ffcb2 | |||
38ca514f53 | |||
caea0f0376 | |||
25a8b26977 | |||
bcaefe8d62 | |||
46f1e8c599 | |||
16230f320e | |||
ace6419aef | |||
77fb9eb2be | |||
aa7fc7c893 | |||
8fc170109f | |||
ad12d00d7e | |||
fa5ea45726 | |||
4b6c113251 | |||
3548290ff2 | |||
b165b90c40 | |||
4ffe9c908b | |||
a135f75e71 | |||
cbc61ba03d | |||
5aa58da918 | |||
b083430011 | |||
a8946b0404 | |||
0303bccc61 | |||
f3ce8564ea | |||
52c3f9e98c | |||
6c8b4184fe | |||
a0979f8435 | |||
faba21d003 | |||
d82c5dff71 | |||
59fbc5b054 | |||
2c1a7f4392 | |||
769e6182d8 | |||
88176a17a3 | |||
fc660e869f | |||
dc04869650 | |||
93c3f34813 | |||
1282eed192 | |||
962b3ca78e | |||
62d17c9266 | |||
f5b928a537 | |||
c8811894b5 | |||
e579b49228 | |||
9561908ad3 | |||
fac7ebf4f6 | |||
a0769d65e3 | |||
d17aa4b24e | |||
310371658b | |||
7ca073aafd | |||
7216d0fb1f | |||
22a9e950c7 | |||
6683d50bae | |||
8f26176273 | |||
9ea7d446e8 | |||
757312ba52 | |||
1675c473d4 | |||
3a3a5d4bfb | |||
4a41499c95 | |||
a1d1cb58e0 | |||
acb82fe7b6 | |||
b25df24cea | |||
39284eb9b2 | |||
31b0e552a2 | |||
c4a2a31cf3 | |||
4497ddb3f3 | |||
5e0eda9526 |
@ -2,6 +2,11 @@ version: 2.1
|
|||||||
|
|
||||||
executors:
|
executors:
|
||||||
default:
|
default:
|
||||||
|
working_directory: /tmp/workspace
|
||||||
|
docker:
|
||||||
|
- image: misskey/ci:latest
|
||||||
|
- image: circleci/mongo:latest
|
||||||
|
with-redis:
|
||||||
working_directory: /tmp/workspace
|
working_directory: /tmp/workspace
|
||||||
docker:
|
docker:
|
||||||
- image: misskey/ci:latest
|
- image: misskey/ci:latest
|
||||||
@ -24,7 +29,6 @@ jobs:
|
|||||||
name: OK
|
name: OK
|
||||||
command: |
|
command: |
|
||||||
echo -e '\033[0;32mOK\033[0;39m'
|
echo -e '\033[0;32mOK\033[0;39m'
|
||||||
|
|
||||||
build:
|
build:
|
||||||
executor: default
|
executor: default
|
||||||
steps:
|
steps:
|
||||||
@ -68,10 +72,13 @@ jobs:
|
|||||||
- .
|
- .
|
||||||
test:
|
test:
|
||||||
parameters:
|
parameters:
|
||||||
without_redis:
|
executor:
|
||||||
type: string
|
type: string
|
||||||
default: ""
|
default: "default"
|
||||||
executor: default
|
without_redis:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
executor: <<parameters.executor>>
|
||||||
steps:
|
steps:
|
||||||
- attach_workspace:
|
- attach_workspace:
|
||||||
at: /tmp/workspace
|
at: /tmp/workspace
|
||||||
@ -94,12 +101,11 @@ jobs:
|
|||||||
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
key: yarn-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "yarn.lock" }}
|
||||||
paths:
|
paths:
|
||||||
- node_modules
|
- node_modules
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
parameters:
|
parameters:
|
||||||
with_deploy:
|
with_deploy:
|
||||||
type: string
|
type: boolean
|
||||||
default: ""
|
default: false
|
||||||
executor: docker
|
executor: docker
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
@ -126,7 +132,7 @@ jobs:
|
|||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
build-and-test:
|
nodejs:
|
||||||
jobs:
|
jobs:
|
||||||
- ok:
|
- ok:
|
||||||
filters:
|
filters:
|
||||||
@ -143,6 +149,7 @@ workflows:
|
|||||||
- imgbot
|
- imgbot
|
||||||
- patch-autogen
|
- patch-autogen
|
||||||
- test:
|
- test:
|
||||||
|
executor: with-redis
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
filters:
|
filters:
|
||||||
@ -153,7 +160,7 @@ workflows:
|
|||||||
- imgbot
|
- imgbot
|
||||||
- patch-autogen
|
- patch-autogen
|
||||||
- test:
|
- test:
|
||||||
without_redis: "true"
|
without_redis: true
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
filters:
|
filters:
|
||||||
@ -165,12 +172,21 @@ workflows:
|
|||||||
- l10n_develop
|
- l10n_develop
|
||||||
- imgbot
|
- imgbot
|
||||||
- patch-autogen
|
- patch-autogen
|
||||||
# - docker:
|
docker:
|
||||||
# filters:
|
jobs:
|
||||||
# branches:
|
- hold:
|
||||||
# ignore: master
|
type: approval
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
ignore: master
|
||||||
- docker:
|
- docker:
|
||||||
with_deploy: "true"
|
requires:
|
||||||
|
- hold
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
ignore: master
|
||||||
|
- docker:
|
||||||
|
with_deploy: true
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: master
|
only: master
|
||||||
|
37
CHANGELOG.md
37
CHANGELOG.md
@ -1,6 +1,41 @@
|
|||||||
ChangeLog
|
ChangeLog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
10.85.1
|
||||||
|
----------
|
||||||
|
* ローカルのみ投稿をログイン画面のタイムラインに表示しないように
|
||||||
|
* ナビゲーションバーを横にしてるとデッキに行けない問題を修正
|
||||||
|
|
||||||
|
10.85.0
|
||||||
|
----------
|
||||||
|
* デスクトップ版のUIを改良
|
||||||
|
* 投稿ハイライトページを実装
|
||||||
|
* 無効化されているタイムラインのフォールバック
|
||||||
|
* 既にフォローされている場合はフォローリクエストを生成しないように
|
||||||
|
* その他細かな修正
|
||||||
|
|
||||||
|
10.84.2
|
||||||
|
----------
|
||||||
|
* GIF画像にGIFバッジを表示
|
||||||
|
* よく話すユーザーからサスペンドされたユーザーを隠すなど
|
||||||
|
* nodeinfoが重い問題を修正
|
||||||
|
* ハッシュタグクラウド取得が重い問題を軽減
|
||||||
|
|
||||||
|
10.84.1
|
||||||
|
----------
|
||||||
|
* deckにフォローされていますマークを追加
|
||||||
|
* URLプレビューのサムネイルの調整
|
||||||
|
* 管理画面でサイレンスされているユーザーを一覧できるように
|
||||||
|
* ドキュメントにアクセスできない問題を修正
|
||||||
|
* ジョブキューを無効化
|
||||||
|
* 軽微なバグ修正
|
||||||
|
|
||||||
|
10.84.0
|
||||||
|
----------
|
||||||
|
* インスタンス管理の強化
|
||||||
|
* パフォーマンスの問題の修正
|
||||||
|
* バグ修正
|
||||||
|
|
||||||
10.83.0
|
10.83.0
|
||||||
----------
|
----------
|
||||||
* 特定のインスタンスをブロックをできるように
|
* 特定のインスタンスをブロックをできるように
|
||||||
@ -9,7 +44,7 @@ ChangeLog
|
|||||||
|
|
||||||
10.82.4
|
10.82.4
|
||||||
----------
|
----------
|
||||||
* 起動できなくなることがある問題を修正
|
* 10.82.3でオブジェクトストレージの設定をしていると起動しなくなるバグを修正
|
||||||
|
|
||||||
10.82.3
|
10.82.3
|
||||||
----------
|
----------
|
||||||
|
12
Dockerfile
12
Dockerfile
@ -8,7 +8,6 @@ WORKDIR /misskey
|
|||||||
|
|
||||||
FROM base AS builder
|
FROM base AS builder
|
||||||
|
|
||||||
RUN unlink /usr/bin/free
|
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
autoconf \
|
autoconf \
|
||||||
automake \
|
automake \
|
||||||
@ -20,18 +19,13 @@ RUN apk add --no-cache \
|
|||||||
make \
|
make \
|
||||||
nasm \
|
nasm \
|
||||||
pkgconfig \
|
pkgconfig \
|
||||||
procps \
|
|
||||||
python \
|
python \
|
||||||
zlib-dev
|
zlib-dev
|
||||||
RUN npm i -g node-gyp
|
RUN npm i -g yarn
|
||||||
|
|
||||||
COPY ./package.json ./
|
|
||||||
RUN npm i
|
|
||||||
|
|
||||||
COPY . ./
|
COPY . ./
|
||||||
RUN node-gyp configure \
|
RUN yarn install
|
||||||
&& node-gyp build \
|
RUN yarn build
|
||||||
&& npm run build
|
|
||||||
|
|
||||||
FROM base AS runner
|
FROM base AS runner
|
||||||
|
|
||||||
|
10
README.md
10
README.md
@ -3,9 +3,9 @@
|
|||||||
[](https://misskey.xyz/)
|
[](https://misskey.xyz/)
|
||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
[](https://circleci.com/gh/syuilo/misskey)
|
[](https://circleci.com/gh/syuilo/misskey)
|
||||||
[](https://david-dm.org/syuilo/misskey)
|
[](https://david-dm.org/syuilo/misskey)
|
||||||
[](http://makeapullrequest.com)
|
[](http://makeapullrequest.com)
|
||||||
|
|
||||||
**A forever evolving, sophisticated microblogging platform.**
|
**A forever evolving, sophisticated microblogging platform.**
|
||||||
|
|
||||||
@ -94,7 +94,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<!-- PATREON_START -->
|
<!-- PATREON_START -->
|
||||||
<table><tr>
|
<table><tr>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12190916/fb7fa7983c14425f890369535b1506a4/1?token-time=2145916800&token-hash=WeuDzzz24cRXJogyIkU-mxARqkdyms-rcZKbO-GpGjw%3D" alt="weep" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12731202/0995c46cdcb54153ab5f073f5869b70a/1?token-time=2145916800&token-hash=prtYqPOiSHBulhM7NU0VzMaWx39-9ntdq25b6kafDNA%3D" alt="negao" width="100"></td>
|
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12913507/f7181eacafe8469a93033d85f5969c29/3?token-time=2145916800&token-hash=c8HeVqLtmdgH-gSBJg8i10gmOcwllM87MDHeznl3el0%3D" alt="Melilot" width="100"></td>
|
||||||
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
<td><img src="https://c8.patreon.com/2/200/16869916" alt="見当かなみ" width="100"></td>
|
||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12999811/5f349fafcce44dd1824a8b1ebbec4564/3?token-time=2145916800&token-hash=LtV2lRi3L2jOWMLwccr9qWYfPrFlzIo2jYZHKzHEb6k%3D" alt="Xeltica" width="100"></td>
|
||||||
@ -102,7 +101,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
|
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/12021162/963128bb8d14476dbd8407943db8f31a/1?token-time=2145916800&token-hash=1FlxS9MEgmNGH_RHUVHbO5hIXB5I1z0lvA33CTvYvjA%3D" alt="gutfuckllc" width="100"></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
<td><a href="https://www.patreon.com/weepjp">weep</a></td>
|
||||||
<td><a href="https://www.patreon.com/negao">negao</a></td>
|
|
||||||
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
<td><a href="https://www.patreon.com/user?u=12913507">Melilot</a></td>
|
||||||
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
<td><a href="https://www.patreon.com/user?u=16869916">見当かなみ</a></td>
|
||||||
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
<td><a href="https://www.patreon.com/Xeltica">Xeltica</a></td>
|
||||||
@ -142,7 +140,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
|||||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
**Last updated:** Wed, 06 Feb 2019 18:18:05 UTC
|
**Last updated:** Thu, 14 Feb 2019 12:02:06 UTC
|
||||||
<!-- PATREON_END -->
|
<!-- PATREON_END -->
|
||||||
|
|
||||||
:four_leaf_clover: Copyright
|
:four_leaf_clover: Copyright
|
||||||
|
@ -122,6 +122,8 @@ CentOSで1024以下のポートを使用してMisskeyを使用する場合は`Ex
|
|||||||
4. `npm run build`
|
4. `npm run build`
|
||||||
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
5. [ChangeLog](../CHANGELOG.md)でマイグレーション情報を確認する
|
||||||
|
|
||||||
|
なにか問題が発生した場合は、`npm run clean`すると直る場合があります。
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
|
|
||||||
なにかお困りのことがありましたらお気軽にご連絡ください。
|
なにかお困りのことがありましたらお気軽にご連絡ください。
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1565,13 +1591,13 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "キーワード"
|
keywords: "キーワード"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "投稿はありません"
|
no-notes: "投稿はありません"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -5,7 +5,7 @@ meta:
|
|||||||
common:
|
common:
|
||||||
misskey: "Ein ⭐ des Fediversums"
|
misskey: "Ein ⭐ des Fediversums"
|
||||||
about-title: "Ein ⭐ des Fediversums."
|
about-title: "Ein ⭐ des Fediversums."
|
||||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
about: "Danke, dass Du Misskey gefunden hast. Misskey ist eine <b>dezentralisierte Microblogging-Plattform</b>, welche auf der ganzen Welt verteilt ist. Da es innerhalb es Fediversums existiert (ein Universum, in dem verschiedene Soziale Netzwerke organisiert sind), ist es unmittelbar mit anderen sozialen Netzwerken verbunden. Warum nimmst du dir nicht einmal eine Auszeit von dem Trubel der Stadt und tauchst in das neue Internet hinein?"
|
||||||
intro:
|
intro:
|
||||||
title: "Was ist Misskey?"
|
title: "Was ist Misskey?"
|
||||||
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
about: "Misskeyはオープンソースの<b>分散型マイクロブログSNS</b>です。リッチで高度にカスタマイズできるUI、投稿へのリアクション、ファイルを一元管理できるドライブなど、先進的な機能を揃えています。また、Fediverseと呼ばれるネットワークに接続できるため、他のSNSともやり取りできます。例えば、あなたが何か投稿すると、その投稿はMisskeyだけでなく他のSNSにも伝わります。ちょうどある惑星から他の惑星に電波を発信している様子をイメージしてください。"
|
||||||
@ -25,9 +25,9 @@ common:
|
|||||||
application-authorization: "Autorisierte Anwendungen"
|
application-authorization: "Autorisierte Anwendungen"
|
||||||
close: "Schließen"
|
close: "Schließen"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||||
load-more: "もっと読み込む"
|
load-more: "Mehr laden"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "Bitte Passwort eingeben"
|
||||||
2fa: "二段階認証"
|
2fa: "Zwei-Faktor-Authentifizierung"
|
||||||
got-it: "Verstanden!"
|
got-it: "Verstanden!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Anpassung-Tipps"
|
title: "Anpassung-Tipps"
|
||||||
@ -54,8 +54,8 @@ common:
|
|||||||
years_ago: "vor {} Jahr(en)"
|
years_ago: "vor {} Jahr(en)"
|
||||||
month-and-day: "{day}/{month}"
|
month-and-day: "{day}/{month}"
|
||||||
trash: "Papierkorb"
|
trash: "Papierkorb"
|
||||||
drive: "ドライブ"
|
drive: "Drive"
|
||||||
messaging: "トーク"
|
messaging: "Unterhaltungen"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "So"
|
sunday: "So"
|
||||||
monday: "Mo"
|
monday: "Mo"
|
||||||
@ -91,9 +91,9 @@ common:
|
|||||||
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
||||||
specified: "Direkt"
|
specified: "Direkt"
|
||||||
specified-desc: "Nur für bestimmte Benutzer posten"
|
specified-desc: "Nur für bestimmte Benutzer posten"
|
||||||
local-public: "公開 (ローカルのみ)"
|
local-public: "Öffentlich (nur lokal)"
|
||||||
local-home: "ホーム (ローカルのみ)"
|
local-home: "Home (nur lokal)"
|
||||||
local-followers: "フォロワー (ローカルのみ)"
|
local-followers: "Follower (nur lokal)"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "Was machst du gerade?"
|
a: "Was machst du gerade?"
|
||||||
b: "Was ist so passiert?"
|
b: "Was ist so passiert?"
|
||||||
@ -172,18 +172,18 @@ common:
|
|||||||
hashtags: "Hashtags"
|
hashtags: "Hashtags"
|
||||||
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
dev: "Fehler beim Erstellen der Applikation. Bitte versuche es erneut."
|
||||||
ai-chan-kawaii: "藍ちゃかわいい"
|
ai-chan-kawaii: "藍ちゃかわいい"
|
||||||
you: "あなた"
|
you: "Du"
|
||||||
auth/views/form.vue:
|
auth/views/form.vue:
|
||||||
share-access: "<i>{name}</i>があなたのアカウントにアクセスすることを許可しますか?"
|
share-access: "Erlaubst Du <i>{name}</i> auf deinen Account zuzugreifen?"
|
||||||
permission-ask: "このアプリは次の権限を要求しています:"
|
permission-ask: "Diese Applikation benötigt folgende Berechtigungen:"
|
||||||
account-read: "アカウントの情報を見る。"
|
account-read: "Accountinformationen anzeigen."
|
||||||
account-write: "アカウントの情報を操作する。"
|
account-write: "Accountinformationen bearbeiten."
|
||||||
note-write: "Senden."
|
note-write: "Senden."
|
||||||
like-write: "いいねしたりいいね解除する。"
|
like-write: "Auf Beiträge reagieren."
|
||||||
following-write: "フォローしたりフォロー解除する。"
|
following-write: "Folgen oder entfolgen."
|
||||||
drive-read: "ドライブを見る。"
|
drive-read: "ドライブを見る。"
|
||||||
drive-write: "ドライブを操作する。"
|
drive-write: "ドライブを操作する。"
|
||||||
notification-read: "通知を見る。"
|
notification-read: "Siehe deine Benachrichtigungen."
|
||||||
notification-write: "Benachrichtigungen verwalten."
|
notification-write: "Benachrichtigungen verwalten."
|
||||||
cancel: "Abbrechen"
|
cancel: "Abbrechen"
|
||||||
accept: "Zugriff erlauben."
|
accept: "Zugriff erlauben."
|
||||||
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1565,13 +1591,13 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "Schlagwörter"
|
keywords: "Schlagwörter"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "投稿はありません"
|
no-notes: "投稿はありません"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -1118,7 +1118,7 @@ admin/views/charts.vue:
|
|||||||
users: "The number of users: increase/decrease"
|
users: "The number of users: increase/decrease"
|
||||||
users-total: "Total users"
|
users-total: "Total users"
|
||||||
active-users: "Active users"
|
active-users: "Active users"
|
||||||
drive: "Capacity used as the storage: increase/decrease"
|
drive: "Increase and decrease in storage capacity use"
|
||||||
drive-total: "Total usage of Drive"
|
drive-total: "Total usage of Drive"
|
||||||
drive-files: "The number of files on the storage: increase/decrease"
|
drive-files: "The number of files on the storage: increase/decrease"
|
||||||
drive-files-total: "Total number of files on Drive"
|
drive-files-total: "Total number of files on Drive"
|
||||||
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "Moderator"
|
moderator: "Moderator"
|
||||||
adminOrModerator: "Admin/Moderator"
|
adminOrModerator: "Admin/Moderator"
|
||||||
verified: "Verified account"
|
verified: "Verified account"
|
||||||
|
silenced: "Already silenced"
|
||||||
suspended: "Suspended"
|
suspended: "Suspended"
|
||||||
origin:
|
origin:
|
||||||
title: "Origin"
|
title: "Origin"
|
||||||
@ -1243,9 +1244,10 @@ admin/views/federation.vue:
|
|||||||
status: "Status"
|
status: "Status"
|
||||||
latest-request-sent-at: "Time of last request sent"
|
latest-request-sent-at: "Time of last request sent"
|
||||||
latest-request-received-at: "Last request received at"
|
latest-request-received-at: "Last request received at"
|
||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "Withold all followers"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "Unfollow all accounts from {host}. Please run this if the instance no longer exists."
|
||||||
block: "Block"
|
block: "Block"
|
||||||
|
marked-as-closed: "Marked as closed"
|
||||||
lookup: "Look up"
|
lookup: "Look up"
|
||||||
instances: "Instances"
|
instances: "Instances"
|
||||||
instance-not-registered: "The instance has not been discovered"
|
instance-not-registered: "The instance has not been discovered"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "Date of discovery (Ascending)"
|
caughtAtAsc: "Date of discovery (Ascending)"
|
||||||
caughtAtDesc: "Date of discovery (Descending)"
|
caughtAtDesc: "Date of discovery (Descending)"
|
||||||
|
lastCommunicatedAtAsc: "The date and time of the older interactions"
|
||||||
|
lastCommunicatedAtDesc: "The date and time of the newer interactions"
|
||||||
notesAsc: "Order by least Notes posted"
|
notesAsc: "Order by least Notes posted"
|
||||||
notesDesc: "Order by most Notes posted"
|
notesDesc: "Order by most Notes posted"
|
||||||
usersAsc: "Less followers"
|
usersAsc: "Less followers"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "Has more followers"
|
followingDesc: "Has more followers"
|
||||||
followersAsc: "Sort by having less followers"
|
followersAsc: "Sort by having less followers"
|
||||||
followersDesc: "Sort by the larger number of followers"
|
followersDesc: "Sort by the larger number of followers"
|
||||||
|
driveUsageAsc: "Least storage used"
|
||||||
|
driveUsageDesc: "Most storage used"
|
||||||
|
driveFilesAsc: "By the smallest number of files stored on Drive"
|
||||||
|
driveFilesDesc: "By the largest number of files stored on Drive"
|
||||||
state: "Status"
|
state: "Status"
|
||||||
states:
|
states:
|
||||||
all: "All"
|
all: "All"
|
||||||
blocked: "Blocked"
|
blocked: "Blocked"
|
||||||
|
not-responding: "Without response"
|
||||||
|
marked-as-closed: "Marked as closed"
|
||||||
result-is-truncated: "Displaying the top {n} items."
|
result-is-truncated: "Displaying the top {n} items."
|
||||||
|
charts: "Charts"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "Requests"
|
||||||
|
users: "Increase, or decrease in the number of users"
|
||||||
|
users-total: "Total number of users"
|
||||||
|
notes: "Increase, or decrease in the number of notes"
|
||||||
|
notes-total: "Total number of notes"
|
||||||
|
ff: "Increase of followers"
|
||||||
|
ff-total: "Total number of follows accumulated"
|
||||||
|
drive-usage: "Increase and decrease in storage use"
|
||||||
|
drive-usage-total: "Total usage of the Drive"
|
||||||
|
drive-files: "Increase, or decrease in the number of files stored on Drive"
|
||||||
|
drive-files-total: "The number of files accumulated on Drive"
|
||||||
|
chart-spans:
|
||||||
|
hour: "Hourly"
|
||||||
|
day: "Daily"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "More details..."
|
about: "More details..."
|
||||||
gotit: "Got it!"
|
gotit: "Got it!"
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "Media view"
|
is-media-view: "Media view"
|
||||||
edit: "Options"
|
edit: "Options"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "Follows you"
|
||||||
posts: "Posts"
|
posts: "Posts"
|
||||||
following: "Following"
|
following: "Following"
|
||||||
followers: "Followers"
|
followers: "Followers"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1565,13 +1591,13 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "キーワード"
|
keywords: "キーワード"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "投稿はありません"
|
no-notes: "投稿はありません"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "Modérateur"
|
moderator: "Modérateur"
|
||||||
adminOrModerator: "Administrateur/Modérateur"
|
adminOrModerator: "Administrateur/Modérateur"
|
||||||
verified: "Compte vérifié"
|
verified: "Compte vérifié"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "Suspendu"
|
suspended: "Suspendu"
|
||||||
origin:
|
origin:
|
||||||
title: "Origine"
|
title: "Origine"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "Instances"
|
instances: "Instances"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "Date d’inscription (Ascendant)"
|
caughtAtAsc: "Date d’inscription (Ascendant)"
|
||||||
caughtAtDesc: "Date d’inscription (Descendant)"
|
caughtAtDesc: "Date d’inscription (Descendant)"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "Description des notes"
|
notesDesc: "Description des notes"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "Ayant le moins d'abonné·e·s"
|
followersAsc: "Ayant le moins d'abonné·e·s"
|
||||||
followersDesc: "Ayant le plus d'abonné·e·s"
|
followersDesc: "Ayant le plus d'abonné·e·s"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "à propos"
|
about: "à propos"
|
||||||
gotit: "J'ai compris !"
|
gotit: "J'ai compris !"
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "Vue média"
|
is-media-view: "Vue média"
|
||||||
edit: "Option"
|
edit: "Option"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "Notes"
|
posts: "Notes"
|
||||||
following: "Suit"
|
following: "Suit"
|
||||||
followers: "Abonnés"
|
followers: "Abonnés"
|
||||||
|
6
locales/index.d.ts
vendored
6
locales/index.d.ts
vendored
@ -1,5 +1,3 @@
|
|||||||
type Locale = { [key: string]: string };
|
declare const locales: { [lang: string]: any };
|
||||||
|
|
||||||
declare const locales: { [lang: string]: Locale };
|
export = locales;
|
||||||
|
|
||||||
export default locales;
|
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1565,13 +1591,13 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "キーワード"
|
keywords: "キーワード"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "投稿はありません"
|
no-notes: "投稿はありません"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -28,6 +28,8 @@ common:
|
|||||||
load-more: "もっと読み込む"
|
load-more: "もっと読み込む"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
2fa: "二段階認証"
|
2fa: "二段階認証"
|
||||||
|
customize-home: "ホームをカスタマイズ"
|
||||||
|
featured-notes: "ハイライト"
|
||||||
|
|
||||||
got-it: "わかった"
|
got-it: "わかった"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
@ -862,6 +864,9 @@ desktop/views/components/renote-form.vue:
|
|||||||
desktop/views/components/renote-form-window.vue:
|
desktop/views/components/renote-form-window.vue:
|
||||||
title: "この投稿をRenoteしますか?"
|
title: "この投稿をRenoteしますか?"
|
||||||
|
|
||||||
|
desktop/views/components/timeline.core.vue:
|
||||||
|
empty: "投稿がありません"
|
||||||
|
|
||||||
desktop/views/pages/user-following-or-followers.vue:
|
desktop/views/pages/user-following-or-followers.vue:
|
||||||
following: "{user}のフォロー"
|
following: "{user}のフォロー"
|
||||||
followers: "{user}のフォロワー"
|
followers: "{user}のフォロワー"
|
||||||
@ -893,14 +898,10 @@ desktop/views/components/settings.vue:
|
|||||||
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
web-search-engine-desc: "例: https://www.google.com/?#q={{query}}"
|
||||||
auto-popout: "ウィンドウの自動ポップアウト"
|
auto-popout: "ウィンドウの自動ポップアウト"
|
||||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||||
deck-nav: "デッキ内ナビゲーション"
|
|
||||||
deck-nav-desc: "デッキを使用しているとき、ナビゲーションが発生する際にページ遷移を行わずに一時的なカラムで受けるようにします。"
|
|
||||||
keep-cw: "CW保持"
|
keep-cw: "CW保持"
|
||||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||||
deck-default: "デッキをデフォルトのUIにする"
|
|
||||||
|
|
||||||
display: "デザインと表示"
|
display: "デザインと表示"
|
||||||
customize: "ホームをカスタマイズ"
|
|
||||||
wallpaper: "壁紙"
|
wallpaper: "壁紙"
|
||||||
choose-wallpaper: "壁紙を選択"
|
choose-wallpaper: "壁紙を選択"
|
||||||
delete-wallpaper: "壁紙を削除"
|
delete-wallpaper: "壁紙を削除"
|
||||||
@ -1076,7 +1077,6 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
follow-requests: "フォロー申請"
|
follow-requests: "フォロー申請"
|
||||||
customize: "ホームのカスタマイズ"
|
|
||||||
admin: "管理"
|
admin: "管理"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@ -1319,6 +1319,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1384,6 +1385,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1391,6 +1393,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1407,6 +1411,8 @@ admin/views/federation.vue:
|
|||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
charts: "チャート"
|
charts: "チャート"
|
||||||
chart-srcs:
|
chart-srcs:
|
||||||
@ -1418,9 +1424,9 @@ admin/views/federation.vue:
|
|||||||
ff: "フォロー/フォロワーの増減"
|
ff: "フォロー/フォロワーの増減"
|
||||||
ff-total: "フォロー/フォロワーの積算"
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
drive-usage: "ドライブ使用量の増減"
|
drive-usage: "ドライブ使用量の増減"
|
||||||
drive-usage-total: "ドライブ使用量の増減"
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
drive-files: "ドライブファイル数の増減"
|
drive-files: "ドライブファイル数の増減"
|
||||||
drive-files-total: "ドライブファイル数の増減"
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
chart-spans:
|
chart-spans:
|
||||||
hour: "1時間ごと"
|
hour: "1時間ごと"
|
||||||
day: "1日ごと"
|
day: "1日ごと"
|
||||||
@ -1441,9 +1447,6 @@ desktop/views/pages/welcome.vue:
|
|||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey Drive"
|
title: "Misskey Drive"
|
||||||
|
|
||||||
desktop/views/pages/home-customize.vue:
|
|
||||||
title: "ホームのカスタマイズ"
|
|
||||||
|
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
next: "次の投稿"
|
next: "次の投稿"
|
||||||
@ -1484,10 +1487,6 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
no-photos: "写真はありません"
|
no-photos: "写真はありません"
|
||||||
|
|
||||||
desktop/views/pages/user/user.profile.vue:
|
|
||||||
follows-you: "フォローされています"
|
|
||||||
menu: "メニュー"
|
|
||||||
|
|
||||||
desktop/views/pages/user/user.header.vue:
|
desktop/views/pages/user/user.header.vue:
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
@ -1497,6 +1496,7 @@ desktop/views/pages/user/user.header.vue:
|
|||||||
year: "年"
|
year: "年"
|
||||||
month: "月"
|
month: "月"
|
||||||
day: "日"
|
day: "日"
|
||||||
|
follows-you: "フォローされています"
|
||||||
|
|
||||||
desktop/views/pages/user/user.timeline.vue:
|
desktop/views/pages/user/user.timeline.vue:
|
||||||
default: "投稿"
|
default: "投稿"
|
||||||
@ -1683,6 +1683,9 @@ mobile/views/pages/home.vue:
|
|||||||
mentions: "あなた宛て"
|
mentions: "あなた宛て"
|
||||||
messages: "メッセージ"
|
messages: "メッセージ"
|
||||||
|
|
||||||
|
mobile/views/pages/home.timeline.vue:
|
||||||
|
empty: "投稿がありません"
|
||||||
|
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "ハッシュタグ「{q}」が付けられた投稿は見つかりませんでした。"
|
||||||
|
|
||||||
@ -1785,7 +1788,7 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "キーワード"
|
keywords: "キーワード"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
|
|
||||||
@ -1793,7 +1796,7 @@ mobile/views/pages/user/home.followers-you-know.vue:
|
|||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
|
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
|
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "投稿はありません"
|
no-notes: "投稿はありません"
|
||||||
@ -1828,6 +1831,7 @@ deck/deck.tl-column.vue:
|
|||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
|
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "もうちょい……"
|
about: "もうちょい……"
|
||||||
gotit: "ほい"
|
gotit: "ほい"
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -113,7 +113,7 @@ common:
|
|||||||
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
|
use-avatar-reversi-stones: "리버시의 돌로 아바타를 사용"
|
||||||
verified-user: "공식 계정"
|
verified-user: "공식 계정"
|
||||||
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
disable-animated-mfm: "글의 문자 애니메이션을 비활성화"
|
||||||
disable-showing-animated-images: "アニメーション画像を再生しない"
|
disable-showing-animated-images: "움직이는 이미지를 자동으로 재생하지 않음"
|
||||||
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
suggest-recent-hashtags: "최근 해시태그를 글 작성란에 표시"
|
||||||
always-show-nsfw: "항상 열람주의 미디어를 표시"
|
always-show-nsfw: "항상 열람주의 미디어를 표시"
|
||||||
always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
|
always-mark-nsfw: "항상 미디어를 열람주의로 설정하여 게시"
|
||||||
@ -345,8 +345,8 @@ common/views/components/note-menu.vue:
|
|||||||
copy-link: "링크 복사"
|
copy-link: "링크 복사"
|
||||||
favorite: "이 노트 즐겨찾기"
|
favorite: "이 노트 즐겨찾기"
|
||||||
unfavorite: "즐겨찾기에서 제거"
|
unfavorite: "즐겨찾기에서 제거"
|
||||||
watch: "ウォッチ"
|
watch: "지켜보기"
|
||||||
unwatch: "ウォッチ解除"
|
unwatch: "지켜보기 해제"
|
||||||
pin: "프로필에 고정"
|
pin: "프로필에 고정"
|
||||||
unpin: "프로필에서 고정 해제"
|
unpin: "프로필에서 고정 해제"
|
||||||
delete: "삭제"
|
delete: "삭제"
|
||||||
@ -509,13 +509,13 @@ common/views/components/profile-editor.vue:
|
|||||||
email-address: "메일 주소"
|
email-address: "메일 주소"
|
||||||
email-verified: "매일 주소가 확인되었습니다"
|
email-verified: "매일 주소가 확인되었습니다"
|
||||||
email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
|
email-not-verified: "메일 주소가 확인되지 않았습니다. 받은 편지함을 확인하여 주시기 바랍니다."
|
||||||
export: "エクスポート"
|
export: "내보내기"
|
||||||
export-targets:
|
export-targets:
|
||||||
all-notes: "すべての投稿データ"
|
all-notes: "모든 글 데이터"
|
||||||
following-list: "フォロー"
|
following-list: "팔로잉"
|
||||||
mute-list: "ミュート"
|
mute-list: "뮤트"
|
||||||
blocking-list: "ブロック"
|
blocking-list: "차단"
|
||||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
export-requested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 드라이브에 파일이 추가됩니다."
|
||||||
common/views/components/user-list-editor.vue:
|
common/views/components/user-list-editor.vue:
|
||||||
users: "사용자"
|
users: "사용자"
|
||||||
rename: "리스트 이름 바꾸기"
|
rename: "리스트 이름 바꾸기"
|
||||||
@ -1007,7 +1007,7 @@ admin/views/index.vue:
|
|||||||
announcements: "공지사항"
|
announcements: "공지사항"
|
||||||
hashtags: "해시태그"
|
hashtags: "해시태그"
|
||||||
abuse: "스팸 신고"
|
abuse: "스팸 신고"
|
||||||
queue: "ジョブキュー"
|
queue: "작업 대기열"
|
||||||
back-to-misskey: "Misskey로 돌아가기"
|
back-to-misskey: "Misskey로 돌아가기"
|
||||||
admin/views/dashboard.vue:
|
admin/views/dashboard.vue:
|
||||||
dashboard: "대시보드"
|
dashboard: "대시보드"
|
||||||
@ -1018,8 +1018,8 @@ admin/views/dashboard.vue:
|
|||||||
this-instance: "이 인스턴스"
|
this-instance: "이 인스턴스"
|
||||||
federated: "연합"
|
federated: "연합"
|
||||||
admin/views/queue.vue:
|
admin/views/queue.vue:
|
||||||
operation: "操作"
|
operation: "동작"
|
||||||
remove-all-jobs: "すべてのジョブをクリア"
|
remove-all-jobs: "모든 작업 제거"
|
||||||
admin/views/abuse.vue:
|
admin/views/abuse.vue:
|
||||||
title: "스팸 신고"
|
title: "스팸 신고"
|
||||||
target: "대상"
|
target: "대상"
|
||||||
@ -1114,7 +1114,7 @@ admin/views/charts.vue:
|
|||||||
notes: "글 증감 (통합)"
|
notes: "글 증감 (통합)"
|
||||||
local-notes: "글 증감 (로컬)"
|
local-notes: "글 증감 (로컬)"
|
||||||
remote-notes: "글 증감 (원격)"
|
remote-notes: "글 증감 (원격)"
|
||||||
notes-total: "글 누적 수"
|
notes-total: "글 누적"
|
||||||
users: "사용자 증감"
|
users: "사용자 증감"
|
||||||
users-total: "사용자 누적"
|
users-total: "사용자 누적"
|
||||||
active-users: "활성 사용자 수"
|
active-users: "활성 사용자 수"
|
||||||
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "모더레이터"
|
moderator: "모더레이터"
|
||||||
adminOrModerator: "관리자+모더레이터"
|
adminOrModerator: "관리자+모더레이터"
|
||||||
verified: "공식 계정"
|
verified: "공식 계정"
|
||||||
|
silenced: "침묵됨"
|
||||||
suspended: "정지됨"
|
suspended: "정지됨"
|
||||||
origin:
|
origin:
|
||||||
title: "위치 (오리진)"
|
title: "위치 (오리진)"
|
||||||
@ -1234,38 +1235,63 @@ admin/views/announcements.vue:
|
|||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
admin/views/federation.vue:
|
admin/views/federation.vue:
|
||||||
federation: "連合"
|
federation: "연합"
|
||||||
host: "ホスト"
|
host: "호스트"
|
||||||
notes: "投稿"
|
notes: "글"
|
||||||
users: "ユーザー"
|
users: "사용자"
|
||||||
following: "フォロー中"
|
following: "팔로우 중"
|
||||||
followers: "フォロワー"
|
followers: "팔로워"
|
||||||
status: "ステータス"
|
status: "상태"
|
||||||
latest-request-sent-at: "直近のリクエスト送信"
|
latest-request-sent-at: "마지막으로 요청을 전송한 시간"
|
||||||
latest-request-received-at: "直近のリクエスト受信"
|
latest-request-received-at: "마지막으로 요청을 받은 시간"
|
||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "모든 팔로잉 해제"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행하십시오."
|
||||||
block: "ブロック"
|
block: "차단"
|
||||||
lookup: "照会"
|
marked-as-closed: "폐쇄된 것으로 표시"
|
||||||
instances: "インスタンス"
|
lookup: "조회"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instances: "인스턴스"
|
||||||
sort: "ソート"
|
instance-not-registered: "해당 인스턴스가 등록되어 있지 않습니다"
|
||||||
|
sort: "정렬"
|
||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "등록일이 오래된 순"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "등록일이 최신인 순"
|
||||||
notesAsc: "投稿が少ない順"
|
lastCommunicatedAtAsc: "마지막으로 요청을 주고받은 일시가 오래된 순"
|
||||||
notesDesc: "投稿が多い順"
|
lastCommunicatedAtDesc: "마지막으로 요청을 주고받은 일시가 빠른 순"
|
||||||
usersAsc: "ユーザーが少ない順"
|
notesAsc: "글이 적은 순"
|
||||||
usersDesc: "ユーザーが多い順"
|
notesDesc: "글이 많은 순"
|
||||||
followingAsc: "フォローが少ない順"
|
usersAsc: "사용자가 적은 순"
|
||||||
followingDesc: "フォローが多い順"
|
usersDesc: "사용자가 많은 순"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followingAsc: "팔로잉이 적은 순"
|
||||||
followersDesc: "フォロワーが多い順"
|
followingDesc: "팔로잉이 많은 순"
|
||||||
state: "状態"
|
followersAsc: "팔로워가 적은 순"
|
||||||
|
followersDesc: "팔로워가 많은 순"
|
||||||
|
driveUsageAsc: "드라이브 사용량이 적은 순"
|
||||||
|
driveUsageDesc: "드라이브 사용량이 많은 순"
|
||||||
|
driveFilesAsc: "드라이브 파일 수가 적은 순"
|
||||||
|
driveFilesDesc: "드라이브 파일 수가 많은 순"
|
||||||
|
state: "상태"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "모두"
|
||||||
blocked: "ブロック"
|
blocked: "차단됨"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
not-responding: "응답 없음"
|
||||||
|
marked-as-closed: "폐쇄된 것으로 표시됨"
|
||||||
|
result-is-truncated: "상위 {n}개를 표시하고 있습니다."
|
||||||
|
charts: "차트"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "요청"
|
||||||
|
users: "사용자 증감"
|
||||||
|
users-total: "사용자 누적"
|
||||||
|
notes: "글 증감"
|
||||||
|
notes-total: "글 누적"
|
||||||
|
ff: "팔로잉/팔로워 증감"
|
||||||
|
ff-total: "팔로잉/팔로워 누적"
|
||||||
|
drive-usage: "드라이브 사용량 증감"
|
||||||
|
drive-usage-total: "드라이브 사용량 누적"
|
||||||
|
drive-files: "드라이브 파일 수 증감"
|
||||||
|
drive-files-total: "드라이브 파일 수 누적"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1시간마다"
|
||||||
|
day: "1일마다"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "자세히..."
|
about: "자세히..."
|
||||||
gotit: "알겠습니다"
|
gotit: "알겠습니다"
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "미디어 보기"
|
is-media-view: "미디어 보기"
|
||||||
edit: "옵션"
|
edit: "옵션"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "당신을 팔로우합니다"
|
||||||
posts: "글"
|
posts: "글"
|
||||||
following: "팔로잉"
|
following: "팔로잉"
|
||||||
followers: "팔로워"
|
followers: "팔로워"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "Skjønner!"
|
gotit: "Skjønner!"
|
||||||
@ -1565,13 +1591,13 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "Nøkkelord"
|
keywords: "Nøkkelord"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "投稿はありません"
|
no-notes: "投稿はありません"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "Źródło"
|
title: "Źródło"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "O Misskey"
|
about: "O Misskey"
|
||||||
gotit: "Rozumiem!"
|
gotit: "Rozumiem!"
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "Widok multimediów"
|
is-media-view: "Widok multimediów"
|
||||||
edit: "Opcje"
|
edit: "Opcje"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "Wpisy"
|
posts: "Wpisy"
|
||||||
following: "Śledzeni"
|
following: "Śledzeni"
|
||||||
followers: "Śledzący"
|
followers: "Śledzący"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1571,7 +1597,7 @@ mobile/views/pages/user/home.vue:
|
|||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "Nenhuma mensagem"
|
no-notes: "Nenhuma mensagem"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
verified: "公式アカウント"
|
||||||
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
title: "オリジン"
|
title: "オリジン"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "フォローを全解除"
|
remove-all-following: "フォローを全解除"
|
||||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||||
block: "ブロック"
|
block: "ブロック"
|
||||||
|
marked-as-closed: "閉鎖されているとマーク"
|
||||||
lookup: "照会"
|
lookup: "照会"
|
||||||
instances: "インスタンス"
|
instances: "インスタンス"
|
||||||
instance-not-registered: "そのインスタンスは登録されていません"
|
instance-not-registered: "そのインスタンスは登録されていません"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "登録日時が古い順"
|
caughtAtAsc: "登録日時が古い順"
|
||||||
caughtAtDesc: "登録日時が新しい順"
|
caughtAtDesc: "登録日時が新しい順"
|
||||||
|
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||||
|
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||||
notesAsc: "投稿が少ない順"
|
notesAsc: "投稿が少ない順"
|
||||||
notesDesc: "投稿が多い順"
|
notesDesc: "投稿が多い順"
|
||||||
usersAsc: "ユーザーが少ない順"
|
usersAsc: "ユーザーが少ない順"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "フォローが多い順"
|
followingDesc: "フォローが多い順"
|
||||||
followersAsc: "フォロワーが少ない順"
|
followersAsc: "フォロワーが少ない順"
|
||||||
followersDesc: "フォロワーが多い順"
|
followersDesc: "フォロワーが多い順"
|
||||||
|
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||||
|
driveUsageDesc: "ドライブ使用量が多い順"
|
||||||
|
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||||
|
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||||
state: "状態"
|
state: "状態"
|
||||||
states:
|
states:
|
||||||
all: "すべて"
|
all: "すべて"
|
||||||
blocked: "ブロック"
|
blocked: "ブロック"
|
||||||
|
not-responding: "応答なし"
|
||||||
|
marked-as-closed: "閉鎖とマーク済み"
|
||||||
result-is-truncated: "上位{n}件を表示しています。"
|
result-is-truncated: "上位{n}件を表示しています。"
|
||||||
|
charts: "チャート"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "リクエスト"
|
||||||
|
users: "ユーザーの増減"
|
||||||
|
users-total: "ユーザーの積算"
|
||||||
|
notes: "投稿の増減"
|
||||||
|
notes-total: "投稿の積算"
|
||||||
|
ff: "フォロー/フォロワーの増減"
|
||||||
|
ff-total: "フォロー/フォロワーの積算"
|
||||||
|
drive-usage: "ドライブ使用量の増減"
|
||||||
|
drive-usage-total: "ドライブ使用量の積算"
|
||||||
|
drive-files: "ドライブファイル数の増減"
|
||||||
|
drive-files-total: "ドライブファイル数の積算"
|
||||||
|
chart-spans:
|
||||||
|
hour: "1時間ごと"
|
||||||
|
day: "1日ごと"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "詳しく..."
|
about: "詳しく..."
|
||||||
gotit: "わかった"
|
gotit: "わかった"
|
||||||
@ -1565,13 +1591,13 @@ mobile/views/pages/user/home.vue:
|
|||||||
activity: "アクティビティ"
|
activity: "アクティビティ"
|
||||||
keywords: "キーワード"
|
keywords: "キーワード"
|
||||||
domains: "頻出ドメイン"
|
domains: "頻出ドメイン"
|
||||||
frequently-replied-users: "よく会話するユーザー"
|
frequently-replied-users: "よく話すユーザー"
|
||||||
followers-you-know: "知り合いのフォロワー"
|
followers-you-know: "知り合いのフォロワー"
|
||||||
last-used-at: "最終ログイン"
|
last-used-at: "最終ログイン"
|
||||||
mobile/views/pages/user/home.followers-you-know.vue:
|
mobile/views/pages/user/home.followers-you-know.vue:
|
||||||
no-users: "知り合いのユーザーはいません"
|
no-users: "知り合いのユーザーはいません"
|
||||||
mobile/views/pages/user/home.friends.vue:
|
mobile/views/pages/user/home.friends.vue:
|
||||||
no-users: "よく会話するユーザーはいません"
|
no-users: "よく話すユーザーはいません"
|
||||||
mobile/views/pages/user/home.notes.vue:
|
mobile/views/pages/user/home.notes.vue:
|
||||||
no-notes: "投稿はありません"
|
no-notes: "投稿はありません"
|
||||||
mobile/views/pages/user/home.photos.vue:
|
mobile/views/pages/user/home.photos.vue:
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "メディアビュー"
|
is-media-view: "メディアビュー"
|
||||||
edit: "オプション"
|
edit: "オプション"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "フォローされています"
|
||||||
posts: "投稿"
|
posts: "投稿"
|
||||||
following: "フォロー"
|
following: "フォロー"
|
||||||
followers: "フォロワー"
|
followers: "フォロワー"
|
||||||
|
@ -16,8 +16,8 @@ common:
|
|||||||
reaction-desc: "这是表达情绪的最简单方法。 Misskey允许您向其他帖子添加各种类型的回应。 一旦体验过Misskey的回应功能,就再也不会想回到那些只有点赞功能的其他SNS上了。"
|
reaction-desc: "这是表达情绪的最简单方法。 Misskey允许您向其他帖子添加各种类型的回应。 一旦体验过Misskey的回应功能,就再也不会想回到那些只有点赞功能的其他SNS上了。"
|
||||||
ui: "交互界面"
|
ui: "交互界面"
|
||||||
ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
|
ui-desc: "世界上没有一个UI可以适合每一个人. 所以, Misskey 提供一个可以高度定制的UI交互界面. 您可以通过编辑, 调整布局, 放置可选择的小部件来轻松定制您的专属UI界面。"
|
||||||
drive: "Misskey 云盘"
|
drive: "网盘"
|
||||||
drive-desc: "想要发布一张您已经上传过的照片吗? 想要组织,命名和为上传的文件创建文件夹吗? Misskey 云盘是一个最好的解决方案. "
|
drive-desc: "想要发布一张您已经上传过的照片吗?想要管理文件或为上传的文件创建文件夹吗?Misskey的网盘是一个最好的解决方案。"
|
||||||
outro: "Misskey还有其他更多功能,请亲身体验一下吧。因为 Misskey 是一个分布式的 SNS,如果您感觉某个功能不适合自己,试试其他的吧。祝您玩得开心!"
|
outro: "Misskey还有其他更多功能,请亲身体验一下吧。因为 Misskey 是一个分布式的 SNS,如果您感觉某个功能不适合自己,试试其他的吧。祝您玩得开心!"
|
||||||
adblock:
|
adblock:
|
||||||
detected: "请关闭广告拦截器"
|
detected: "请关闭广告拦截器"
|
||||||
@ -181,8 +181,8 @@ auth/views/form.vue:
|
|||||||
note-write: "投稿。"
|
note-write: "投稿。"
|
||||||
like-write: "点赞或取消赞。"
|
like-write: "点赞或取消赞。"
|
||||||
following-write: "关注或取消关注。"
|
following-write: "关注或取消关注。"
|
||||||
drive-read: "查看您的云盘"
|
drive-read: "查看您的网盘"
|
||||||
drive-write: "上传/删除您云盘中的文件。"
|
drive-write: "管理网盘文件。"
|
||||||
notification-read: "查看通知。"
|
notification-read: "查看通知。"
|
||||||
notification-write: "管理通知。"
|
notification-write: "管理通知。"
|
||||||
cancel: "取消"
|
cancel: "取消"
|
||||||
@ -324,7 +324,7 @@ common/views/components/messaging-room.form.vue:
|
|||||||
input-message-here: "在此键入信息"
|
input-message-here: "在此键入信息"
|
||||||
send: "发送"
|
send: "发送"
|
||||||
attach-from-local: "从电脑中添加文件"
|
attach-from-local: "从电脑中添加文件"
|
||||||
attach-from-drive: "从云盘中添加文件"
|
attach-from-drive: "从网盘中添加文件"
|
||||||
only-one-file-attached: "在信息中只允许添加一个附件"
|
only-one-file-attached: "在信息中只允许添加一个附件"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "已读"
|
is-read: "已读"
|
||||||
@ -559,14 +559,14 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line2: "从 <kbd>p</kbd> 或者 <kbd>n</kbd>打开投稿表单"
|
tips-line2: "从 <kbd>p</kbd> 或者 <kbd>n</kbd>打开投稿表单"
|
||||||
tips-line3: "您可以在投稿表单上拖放文件。"
|
tips-line3: "您可以在投稿表单上拖放文件。"
|
||||||
tips-line4: "您可以将剪贴板中的图像粘贴到提交表单中。"
|
tips-line4: "您可以将剪贴板中的图像粘贴到提交表单中。"
|
||||||
tips-line5: "您可以通过将文件拖放到云盘来上传文件。"
|
tips-line5: "您可以通过将文件拖放到网盘来上传文件。"
|
||||||
tips-line6: "您可以通过在云盘中拖动文件夹来移动文件夹。"
|
tips-line6: "您可以通过在网盘中通过拖动操作来移动文件夹"
|
||||||
tips-line7: "您可以通过在文件夹中拖动文件夹来移动文件夹。"
|
tips-line7: "您可以通过在网盘中通过拖动操作来移动文件夹。"
|
||||||
tips-line8: "可以从设置中定制主页。"
|
tips-line8: "可以从设置中定制主页。"
|
||||||
tips-line9: "Misskey 根据 AGPLv3 获得许可。"
|
tips-line9: "Misskey 根据 AGPLv3 获得许可。"
|
||||||
tips-line10: "使用Time Machine(时光机)小部件可以轻松追溯到过去的时间轴。"
|
tips-line10: "使用Time Machine(时光机)小部件可以轻松追溯到过去的时间轴。"
|
||||||
tips-line11: "您可以点击“...”将帖子固定到用户页面"
|
tips-line11: "您可以点击“...”将帖子固定到用户页面"
|
||||||
tips-line13: "附在帖子上的所有文件都会保存到云盘中。"
|
tips-line13: "附在帖子上的所有文件都会保存到网盘中。"
|
||||||
tips-line14: "在自定义首页布局时,您可以右键单击窗口小部件以更改其设计。"
|
tips-line14: "在自定义首页布局时,您可以右键单击窗口小部件以更改其设计。"
|
||||||
tips-line17: "用“**”围绕文本将突出显示它。"
|
tips-line17: "用“**”围绕文本将突出显示它。"
|
||||||
tips-line19: "可以在浏览器外部分离多个窗口。"
|
tips-line19: "可以在浏览器外部分离多个窗口。"
|
||||||
@ -740,7 +740,7 @@ desktop/views/components/post-form.vue:
|
|||||||
renote-failed: "转发失败"
|
renote-failed: "转发失败"
|
||||||
posting: "发送中"
|
posting: "发送中"
|
||||||
attach-media-from-local: "从设备中添加媒体文件"
|
attach-media-from-local: "从设备中添加媒体文件"
|
||||||
attach-media-from-drive: "从云盘中添加媒体文件"
|
attach-media-from-drive: "从网盘中添加媒体文件"
|
||||||
attach-cancel: "删除附件"
|
attach-cancel: "删除附件"
|
||||||
insert-a-kao: "v('ω')v"
|
insert-a-kao: "v('ω')v"
|
||||||
create-poll: "创建一个投票"
|
create-poll: "创建一个投票"
|
||||||
@ -1013,7 +1013,7 @@ admin/views/dashboard.vue:
|
|||||||
dashboard: "Dashboard"
|
dashboard: "Dashboard"
|
||||||
accounts: "账户"
|
accounts: "账户"
|
||||||
notes: "帖子"
|
notes: "帖子"
|
||||||
drive: "Misskey 云盘"
|
drive: "网盘"
|
||||||
instances: "例子"
|
instances: "例子"
|
||||||
this-instance: "此实例"
|
this-instance: "此实例"
|
||||||
federated: "联合"
|
federated: "联合"
|
||||||
@ -1038,11 +1038,11 @@ admin/views/instance.vue:
|
|||||||
maintainer-config: "管理员信息"
|
maintainer-config: "管理员信息"
|
||||||
maintainer-name: "管理员名称"
|
maintainer-name: "管理员名称"
|
||||||
maintainer-email: "联系管理员"
|
maintainer-email: "联系管理员"
|
||||||
drive-config: "云盘设置"
|
drive-config: "网盘设置"
|
||||||
cache-remote-files: "远程文件缓存"
|
cache-remote-files: "远程文件缓存"
|
||||||
cache-remote-files-desc: "如果没有此参数,则所有远程文件都将直接链接到其主机服务器。 这将是保存服务器存储的有效解决方案,但是对于设置禁用直接链接的用户而言,远程文件不可见,因为不会生成缩略图,从而增加流量。 建议启用此参数集。"
|
cache-remote-files-desc: "如果没有此参数,则所有远程文件都将直接链接到其主机服务器。 这将是保存服务器存储的有效解决方案,但是对于设置禁用直接链接的用户而言,远程文件不可见,因为不会生成缩略图,从而增加流量。 建议启用此参数集。"
|
||||||
local-drive-capacity-mb: "每个用户的云盘空间"
|
local-drive-capacity-mb: "每个用户的网盘空间"
|
||||||
remote-drive-capacity-mb: "每个远程用户的云盘容量"
|
remote-drive-capacity-mb: "每个远程用户的网盘容量"
|
||||||
mb: "以兆字节(Mbps)为单位"
|
mb: "以兆字节(Mbps)为单位"
|
||||||
recaptcha-config: "reCAPTCHA设置"
|
recaptcha-config: "reCAPTCHA设置"
|
||||||
recaptcha-info: "reCAPTCHA token是必要的. 请从 https://www.google.com/recaptcha/intro/ 获取。\n请注意, 该功能在中国大陆不可用。"
|
recaptcha-info: "reCAPTCHA token是必要的. 请从 https://www.google.com/recaptcha/intro/ 获取。\n请注意, 该功能在中国大陆不可用。"
|
||||||
@ -1106,7 +1106,7 @@ admin/views/charts.vue:
|
|||||||
federation: "联合"
|
federation: "联合"
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
users: "用户"
|
users: "用户"
|
||||||
drive: "Misskey 云盘"
|
drive: "网盘"
|
||||||
network: "网络"
|
network: "网络"
|
||||||
charts:
|
charts:
|
||||||
federation-instances: "实例数:增加/减少"
|
federation-instances: "实例数:增加/减少"
|
||||||
@ -1119,9 +1119,9 @@ admin/views/charts.vue:
|
|||||||
users-total: "用户总数"
|
users-total: "用户总数"
|
||||||
active-users: "活跃用户数"
|
active-users: "活跃用户数"
|
||||||
drive: "存储容量:增加/减少"
|
drive: "存储容量:增加/减少"
|
||||||
drive-total: "云盘总容量"
|
drive-total: "网盘总使用量"
|
||||||
drive-files: "云盘上的文件数:增加/减少"
|
drive-files: "网盘文件数量变化"
|
||||||
drive-files-total: "云盘上文件总数"
|
drive-files-total: "网盘文件总数"
|
||||||
network-requests: "请求"
|
network-requests: "请求"
|
||||||
network-time: "响应时间"
|
network-time: "响应时间"
|
||||||
network-usage: "网络流量"
|
network-usage: "网络流量"
|
||||||
@ -1186,6 +1186,7 @@ admin/views/users.vue:
|
|||||||
moderator: "版主"
|
moderator: "版主"
|
||||||
adminOrModerator: "管理员+版主"
|
adminOrModerator: "管理员+版主"
|
||||||
verified: "官方认证账户"
|
verified: "官方认证账户"
|
||||||
|
silenced: "已禁言"
|
||||||
suspended: "已冻结"
|
suspended: "已冻结"
|
||||||
origin:
|
origin:
|
||||||
title: "源自"
|
title: "源自"
|
||||||
@ -1246,6 +1247,7 @@ admin/views/federation.vue:
|
|||||||
remove-all-following: "取消所有关注"
|
remove-all-following: "取消所有关注"
|
||||||
remove-all-following-info: "取消{host}的所有关注者。当实例不存在时执行。"
|
remove-all-following-info: "取消{host}的所有关注者。当实例不存在时执行。"
|
||||||
block: "拉黑"
|
block: "拉黑"
|
||||||
|
marked-as-closed: "标记为已关闭"
|
||||||
lookup: "查询"
|
lookup: "查询"
|
||||||
instances: "实例"
|
instances: "实例"
|
||||||
instance-not-registered: "实例未注册"
|
instance-not-registered: "实例未注册"
|
||||||
@ -1253,6 +1255,8 @@ admin/views/federation.vue:
|
|||||||
sorts:
|
sorts:
|
||||||
caughtAtAsc: "注册时间从旧到新"
|
caughtAtAsc: "注册时间从旧到新"
|
||||||
caughtAtDesc: "注册时间从新到旧"
|
caughtAtDesc: "注册时间从新到旧"
|
||||||
|
lastCommunicatedAtAsc: "上次互动时间从旧到新"
|
||||||
|
lastCommunicatedAtDesc: "上次互动时间从新到旧"
|
||||||
notesAsc: "发帖数量从少到多"
|
notesAsc: "发帖数量从少到多"
|
||||||
notesDesc: "发帖数量从多到少"
|
notesDesc: "发帖数量从多到少"
|
||||||
usersAsc: "用户数从少到多"
|
usersAsc: "用户数从少到多"
|
||||||
@ -1261,11 +1265,33 @@ admin/views/federation.vue:
|
|||||||
followingDesc: "关注数从多到少"
|
followingDesc: "关注数从多到少"
|
||||||
followersAsc: "粉丝数从少到多"
|
followersAsc: "粉丝数从少到多"
|
||||||
followersDesc: "粉丝数从多到少"
|
followersDesc: "粉丝数从多到少"
|
||||||
|
driveUsageAsc: "网盘使用量从少到多"
|
||||||
|
driveUsageDesc: "网盘使用量从多到少"
|
||||||
|
driveFilesAsc: "网盘文件数从少到多"
|
||||||
|
driveFilesDesc: "网盘文件数从多到少"
|
||||||
state: "状态"
|
state: "状态"
|
||||||
states:
|
states:
|
||||||
all: "所有"
|
all: "所有"
|
||||||
blocked: "已拉黑"
|
blocked: "已拉黑"
|
||||||
|
not-responding: "没有响应"
|
||||||
|
marked-as-closed: "已标记为已关闭"
|
||||||
result-is-truncated: "显示最前面的{n}项。"
|
result-is-truncated: "显示最前面的{n}项。"
|
||||||
|
charts: "图表"
|
||||||
|
chart-srcs:
|
||||||
|
requests: "请求"
|
||||||
|
users: "用户数量变化"
|
||||||
|
users-total: "用户总数"
|
||||||
|
notes: "发帖数变化"
|
||||||
|
notes-total: "帖子总数"
|
||||||
|
ff: "关注/被关注数量变化"
|
||||||
|
ff-total: "关注/被关注总数"
|
||||||
|
drive-usage: "网盘使用量变化"
|
||||||
|
drive-usage-total: "网盘总使用量"
|
||||||
|
drive-files: "网盘文件数量变化"
|
||||||
|
drive-files-total: "网盘文件总数"
|
||||||
|
chart-spans:
|
||||||
|
hour: "每小时"
|
||||||
|
day: "每天"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
about: "更多信息..."
|
about: "更多信息..."
|
||||||
gotit: "没问题! "
|
gotit: "没问题! "
|
||||||
@ -1279,7 +1305,7 @@ desktop/views/pages/welcome.vue:
|
|||||||
powered-by-misskey: "Powered by <b>Misskey</b>."
|
powered-by-misskey: "Powered by <b>Misskey</b>."
|
||||||
info: "信息"
|
info: "信息"
|
||||||
desktop/views/pages/drive.vue:
|
desktop/views/pages/drive.vue:
|
||||||
title: "Misskey 云盘"
|
title: "Misskey 网盘"
|
||||||
desktop/views/pages/home-customize.vue:
|
desktop/views/pages/home-customize.vue:
|
||||||
title: "自定义首页布局"
|
title: "自定义首页布局"
|
||||||
desktop/views/pages/note.vue:
|
desktop/views/pages/note.vue:
|
||||||
@ -1359,7 +1385,7 @@ mobile/views/components/drive.vue:
|
|||||||
folder-count: "文件夹"
|
folder-count: "文件夹"
|
||||||
count-separator: ","
|
count-separator: ","
|
||||||
file-count: "文件"
|
file-count: "文件"
|
||||||
nothing-in-drive: "云盘上没有任何东西"
|
nothing-in-drive: "网盘为空"
|
||||||
folder-is-empty: "这文件夹是空的"
|
folder-is-empty: "这文件夹是空的"
|
||||||
prompt: "您想要干什么呢?(请输入数字):<1 → 上传文件 | 2 → 从URL上传文件 | 3 → 创建新文件夹 | 4 → 更改这个文件夹的名称 | 5 → 移动这个文件夹 | 6 → 删除这个文件夹>"
|
prompt: "您想要干什么呢?(请输入数字):<1 → 上传文件 | 2 → 从URL上传文件 | 3 → 创建新文件夹 | 4 → 更改这个文件夹的名称 | 5 → 移动这个文件夹 | 6 → 删除这个文件夹>"
|
||||||
deletion-alert: "抱歉! 删除文件夹功能尚未实现。"
|
deletion-alert: "抱歉! 删除文件夹功能尚未实现。"
|
||||||
@ -1601,6 +1627,7 @@ deck/deck.tl-column.vue:
|
|||||||
is-media-view: "媒体视图"
|
is-media-view: "媒体视图"
|
||||||
edit: "选项"
|
edit: "选项"
|
||||||
deck/deck.user-column.vue:
|
deck/deck.user-column.vue:
|
||||||
|
follows-you: "关注您"
|
||||||
posts: "帖子"
|
posts: "帖子"
|
||||||
following: "关注中"
|
following: "关注中"
|
||||||
followers: "关注者"
|
followers: "关注者"
|
||||||
@ -1654,7 +1681,7 @@ dev/views/new-app.vue:
|
|||||||
note-write: "投稿。"
|
note-write: "投稿。"
|
||||||
reaction-write: "添加或删除反应。"
|
reaction-write: "添加或删除反应。"
|
||||||
following-write: "关注和不关注"
|
following-write: "关注和不关注"
|
||||||
drive-read: "查看云盘"
|
drive-read: "查看网盘"
|
||||||
drive-write: "上传/删除云盘里的文件"
|
drive-write: "管理网盘文件。"
|
||||||
notification-read: "阅读您的通知"
|
notification-read: "阅读您的通知"
|
||||||
notification-write: "管理通知"
|
notification-write: "管理通知"
|
||||||
|
21
package.json
21
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.83.0",
|
"version": "10.85.1",
|
||||||
"clientVersion": "2.0.14211",
|
"clientVersion": "2.0.14295",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -23,14 +23,11 @@
|
|||||||
"test": "gulp test",
|
"test": "gulp test",
|
||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
|
||||||
"terser": "3.14.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.14",
|
"@fortawesome/fontawesome-svg-core": "1.2.14",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.7.1",
|
"@fortawesome/free-brands-svg-icons": "5.7.1",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.7.0",
|
"@fortawesome/free-regular-svg-icons": "5.7.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.6.3",
|
"@fortawesome/free-solid-svg-icons": "5.7.1",
|
||||||
"@fortawesome/vue-fontawesome": "0.1.5",
|
"@fortawesome/vue-fontawesome": "0.1.5",
|
||||||
"@koa/cors": "2.2.3",
|
"@koa/cors": "2.2.3",
|
||||||
"@prezzemolo/rap": "0.1.2",
|
"@prezzemolo/rap": "0.1.2",
|
||||||
@ -99,14 +96,14 @@
|
|||||||
"@types/websocket": "0.0.40",
|
"@types/websocket": "0.0.40",
|
||||||
"@types/ws": "6.0.1",
|
"@types/ws": "6.0.1",
|
||||||
"animejs": "3.0.1",
|
"animejs": "3.0.1",
|
||||||
"apexcharts": "3.2.2",
|
"apexcharts": "3.3.0",
|
||||||
"autobind-decorator": "2.4.0",
|
"autobind-decorator": "2.4.0",
|
||||||
"autosize": "4.0.2",
|
"autosize": "4.0.2",
|
||||||
"autwh": "0.1.0",
|
"autwh": "0.1.0",
|
||||||
"bcryptjs": "2.4.3",
|
"bcryptjs": "2.4.3",
|
||||||
"bee-queue": "1.2.2",
|
"bee-queue": "1.2.2",
|
||||||
"bootstrap-vue": "2.0.0-rc.11",
|
"bootstrap-vue": "2.0.0-rc.11",
|
||||||
"cafy": "12.1.0",
|
"cafy": "14.0.1",
|
||||||
"chai": "4.2.0",
|
"chai": "4.2.0",
|
||||||
"chai-http": "4.2.1",
|
"chai-http": "4.2.1",
|
||||||
"chalk": "2.4.2",
|
"chalk": "2.4.2",
|
||||||
@ -144,7 +141,7 @@
|
|||||||
"hard-source-webpack-plugin": "0.13.1",
|
"hard-source-webpack-plugin": "0.13.1",
|
||||||
"html-minifier": "3.5.21",
|
"html-minifier": "3.5.21",
|
||||||
"http-signature": "1.2.0",
|
"http-signature": "1.2.0",
|
||||||
"insert-text-at-cursor": "0.1.1",
|
"insert-text-at-cursor": "0.1.2",
|
||||||
"is-root": "2.0.0",
|
"is-root": "2.0.0",
|
||||||
"is-svg": "3.0.0",
|
"is-svg": "3.0.0",
|
||||||
"js-yaml": "3.12.1",
|
"js-yaml": "3.12.1",
|
||||||
@ -232,11 +229,11 @@
|
|||||||
"uuid": "3.3.2",
|
"uuid": "3.3.2",
|
||||||
"v-animate-css": "0.0.3",
|
"v-animate-css": "0.0.3",
|
||||||
"video-thumbnail-generator": "1.1.3",
|
"video-thumbnail-generator": "1.1.3",
|
||||||
"vue": "2.6.3",
|
"vue": "2.6.6",
|
||||||
"vue-color": "2.7.0",
|
"vue-color": "2.7.0",
|
||||||
"vue-content-loading": "1.5.3",
|
"vue-content-loading": "1.5.3",
|
||||||
"vue-cropperjs": "3.0.0",
|
"vue-cropperjs": "3.0.0",
|
||||||
"vue-i18n": "8.8.0",
|
"vue-i18n": "8.8.1",
|
||||||
"vue-js-modal": "1.3.28",
|
"vue-js-modal": "1.3.28",
|
||||||
"vue-loader": "15.6.2",
|
"vue-loader": "15.6.2",
|
||||||
"vue-marquee-text-component": "1.1.1",
|
"vue-marquee-text-component": "1.1.1",
|
||||||
@ -245,7 +242,7 @@
|
|||||||
"vue-sequential-entrance": "1.1.3",
|
"vue-sequential-entrance": "1.1.3",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
"vue-svg-inline-loader": "1.2.10",
|
"vue-svg-inline-loader": "1.2.10",
|
||||||
"vue-template-compiler": "2.6.3",
|
"vue-template-compiler": "2.6.6",
|
||||||
"vuedraggable": "2.17.0",
|
"vuedraggable": "2.17.0",
|
||||||
"vuewordcloud": "18.7.11",
|
"vuewordcloud": "18.7.11",
|
||||||
"vuex": "3.1.0",
|
"vuex": "3.1.0",
|
||||||
|
@ -5,9 +5,9 @@ program
|
|||||||
.version(pkg.version)
|
.version(pkg.version)
|
||||||
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
|
.option('--no-daemons', 'Disable daemon processes (for debbuging)')
|
||||||
.option('--disable-clustering', 'Disable clustering')
|
.option('--disable-clustering', 'Disable clustering')
|
||||||
.option('--disable-ap-queue', 'Disable creating job queue related to ap')
|
|
||||||
.option('--disable-queue', 'Disable job queue processing')
|
.option('--disable-queue', 'Disable job queue processing')
|
||||||
.option('--only-queue', 'Pocessing job queue only')
|
.option('--only-server', 'Run server only (without job queue)')
|
||||||
|
.option('--only-queue', 'Pocessing job queue only (without server)')
|
||||||
.option('--quiet', 'Suppress all logs')
|
.option('--quiet', 'Suppress all logs')
|
||||||
.option('--verbose', 'Enable all logs')
|
.option('--verbose', 'Enable all logs')
|
||||||
.option('--with-log-time', 'Include timestamp for each logs')
|
.option('--with-log-time', 'Include timestamp for each logs')
|
||||||
@ -15,8 +15,7 @@ program
|
|||||||
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
|
.option('--color', 'This option is a dummy for some external program\'s (e.g. forever) issue.')
|
||||||
.parse(process.argv);
|
.parse(process.argv);
|
||||||
|
|
||||||
/*if (process.env.MK_DISABLE_AP_QUEUE)*/ program.disableApQueue = true;
|
/*if (process.env.MK_DISABLE_QUEUE)*/ program.disableQueue = true;
|
||||||
if (process.env.MK_DISABLE_QUEUE) program.disableQueue = true;
|
|
||||||
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
if (process.env.MK_ONLY_QUEUE) program.onlyQueue = true;
|
||||||
|
|
||||||
export { program };
|
export { program };
|
||||||
|
@ -3,10 +3,10 @@
|
|||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title"><fa :icon="faTerminal"/> {{ $t('federation') }}</div>
|
<div slot="title"><fa :icon="faTerminal"/> {{ $t('federation') }}</div>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input class="target" v-model="target" type="text" @enter="showInstance">
|
<ui-input class="target" v-model="target" type="text" @enter="showInstance()">
|
||||||
<span>{{ $t('host') }}</span>
|
<span>{{ $t('host') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-button @click="showInstance"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
<ui-button @click="showInstance()"><fa :icon="faSearch"/> {{ $t('lookup') }}</ui-button>
|
||||||
|
|
||||||
<div class="instance" v-if="instance">
|
<div class="instance" v-if="instance">
|
||||||
<ui-input :value="instance.host" type="text" readonly>
|
<ui-input :value="instance.host" type="text" readonly>
|
||||||
@ -40,6 +40,7 @@
|
|||||||
<span>{{ $t('latest-request-received-at') }}</span>
|
<span>{{ $t('latest-request-received-at') }}</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-switch v-model="instance.isBlocked" @change="updateInstance()">{{ $t('block') }}</ui-switch>
|
<ui-switch v-model="instance.isBlocked" @change="updateInstance()">{{ $t('block') }}</ui-switch>
|
||||||
|
<ui-switch v-model="instance.isMarkedAsClosed" @change="updateInstance()">{{ $t('marked-as-closed') }}</ui-switch>
|
||||||
<details>
|
<details>
|
||||||
<summary>{{ $t('charts') }}</summary>
|
<summary>{{ $t('charts') }}</summary>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
@ -80,6 +81,8 @@
|
|||||||
<span slot="label">{{ $t('sort') }}</span>
|
<span slot="label">{{ $t('sort') }}</span>
|
||||||
<option value="-caughtAt">{{ $t('sorts.caughtAtAsc') }}</option>
|
<option value="-caughtAt">{{ $t('sorts.caughtAtAsc') }}</option>
|
||||||
<option value="+caughtAt">{{ $t('sorts.caughtAtDesc') }}</option>
|
<option value="+caughtAt">{{ $t('sorts.caughtAtDesc') }}</option>
|
||||||
|
<option value="-lastCommunicatedAt">{{ $t('sorts.lastCommunicatedAtAsc') }}</option>
|
||||||
|
<option value="+lastCommunicatedAt">{{ $t('sorts.lastCommunicatedAtDesc') }}</option>
|
||||||
<option value="-notes">{{ $t('sorts.notesAsc') }}</option>
|
<option value="-notes">{{ $t('sorts.notesAsc') }}</option>
|
||||||
<option value="+notes">{{ $t('sorts.notesDesc') }}</option>
|
<option value="+notes">{{ $t('sorts.notesDesc') }}</option>
|
||||||
<option value="-users">{{ $t('sorts.usersAsc') }}</option>
|
<option value="-users">{{ $t('sorts.usersAsc') }}</option>
|
||||||
@ -97,6 +100,8 @@
|
|||||||
<span slot="label">{{ $t('state') }}</span>
|
<span slot="label">{{ $t('state') }}</span>
|
||||||
<option value="all">{{ $t('states.all') }}</option>
|
<option value="all">{{ $t('states.all') }}</option>
|
||||||
<option value="blocked">{{ $t('states.blocked') }}</option>
|
<option value="blocked">{{ $t('states.blocked') }}</option>
|
||||||
|
<option value="notResponding">{{ $t('states.not-responding') }}</option>
|
||||||
|
<option value="markedAsClosed">{{ $t('states.marked-as-closed') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
|
|
||||||
@ -109,8 +114,8 @@
|
|||||||
<span>{{ $t('followers') }}</span>
|
<span>{{ $t('followers') }}</span>
|
||||||
<span>{{ $t('status') }}</span>
|
<span>{{ $t('status') }}</span>
|
||||||
</header>
|
</header>
|
||||||
<div v-for="instance in instances">
|
<div v-for="instance in instances" :style="{ opacity: instance.isNotResponding ? 0.5 : 1 }">
|
||||||
<span>{{ instance.host }}</span>
|
<a @click.prevent="showInstance(instance.host)" target="_blank" :href="`https://${instance.host}`" :style="{ textDecoration: instance.isMarkedAsClosed ? 'line-through' : 'none' }">{{ instance.host }}</a>
|
||||||
<span>{{ instance.notesCount | number }}</span>
|
<span>{{ instance.notesCount | number }}</span>
|
||||||
<span>{{ instance.usersCount | number }}</span>
|
<span>{{ instance.usersCount | number }}</span>
|
||||||
<span>{{ instance.followingCount | number }}</span>
|
<span>{{ instance.followingCount | number }}</span>
|
||||||
@ -143,7 +148,7 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
instance: null,
|
instance: null,
|
||||||
target: null,
|
target: null,
|
||||||
sort: '+caughtAt',
|
sort: '+lastCommunicatedAt',
|
||||||
state: 'all',
|
state: 'all',
|
||||||
limit: 50,
|
limit: 50,
|
||||||
instances: [],
|
instances: [],
|
||||||
@ -228,9 +233,9 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
showInstance() {
|
showInstance(target?: string) {
|
||||||
this.$root.api('federation/show-instance', {
|
this.$root.api('federation/show-instance', {
|
||||||
host: this.target
|
host: target || this.target
|
||||||
}).then(instance => {
|
}).then(instance => {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
@ -247,7 +252,9 @@ export default Vue.extend({
|
|||||||
fetchInstances() {
|
fetchInstances() {
|
||||||
this.instances = [];
|
this.instances = [];
|
||||||
this.$root.api('federation/instances', {
|
this.$root.api('federation/instances', {
|
||||||
state: this.state,
|
blocked: this.state === 'blocked' ? true : null,
|
||||||
|
notResponding: this.state === 'notResponding' ? true : null,
|
||||||
|
markedAsClosed: this.state === 'markedAsClosed' ? true : null,
|
||||||
sort: this.sort,
|
sort: this.sort,
|
||||||
limit: this.limit
|
limit: this.limit
|
||||||
}).then(instances => {
|
}).then(instances => {
|
||||||
@ -269,7 +276,8 @@ export default Vue.extend({
|
|||||||
updateInstance() {
|
updateInstance() {
|
||||||
this.$root.api('admin/federation/update-instance', {
|
this.$root.api('admin/federation/update-instance', {
|
||||||
host: this.instance.host,
|
host: this.instance.host,
|
||||||
isBlocked: this.instance.isBlocked,
|
isBlocked: this.instance.isBlocked || false,
|
||||||
|
isClosed: this.instance.isMarkedAsClosed || false
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -309,6 +317,9 @@ export default Vue.extend({
|
|||||||
curve: 'straight',
|
curve: 'straight',
|
||||||
width: 2
|
width: 2
|
||||||
},
|
},
|
||||||
|
tooltip: {
|
||||||
|
theme: this.$store.state.device.darkmode ? 'dark' : 'light'
|
||||||
|
},
|
||||||
legend: {
|
legend: {
|
||||||
labels: {
|
labels: {
|
||||||
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
colors: tinycolor(getComputedStyle(document.documentElement).getPropertyValue('--text')).toRgbString()
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
<option value="admin">{{ $t('users.state.admin') }}</option>
|
<option value="admin">{{ $t('users.state.admin') }}</option>
|
||||||
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
||||||
<option value="verified">{{ $t('users.state.verified') }}</option>
|
<option value="verified">{{ $t('users.state.verified') }}</option>
|
||||||
|
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
||||||
<option value="suspended">{{ $t('users.state.suspended') }}</option>
|
<option value="suspended">{{ $t('users.state.suspended') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
<ui-select v-model="origin">
|
<ui-select v-model="origin">
|
||||||
@ -89,7 +90,7 @@ export default Vue.extend({
|
|||||||
unsuspending: false,
|
unsuspending: false,
|
||||||
sort: '+createdAt',
|
sort: '+createdAt',
|
||||||
state: 'all',
|
state: 'all',
|
||||||
origin: 'combined',
|
origin: 'local',
|
||||||
limit: 10,
|
limit: 10,
|
||||||
offset: 0,
|
offset: 0,
|
||||||
users: [],
|
users: [],
|
||||||
@ -129,16 +130,25 @@ export default Vue.extend({
|
|||||||
const usernamePromise = this.$root.api('users/show', parseAcct(this.target));
|
const usernamePromise = this.$root.api('users/show', parseAcct(this.target));
|
||||||
const idPromise = this.$root.api('users/show', { userId: this.target });
|
const idPromise = this.$root.api('users/show', { userId: this.target });
|
||||||
|
|
||||||
usernamePromise.then(res);
|
let _notFound = false;
|
||||||
idPromise.then(res);
|
const notFound = () => {
|
||||||
|
if (_notFound) {
|
||||||
idPromise.catch(e => {
|
|
||||||
if (e == 'user not found') {
|
|
||||||
this.$root.dialog({
|
this.$root.dialog({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
text: this.$t('user-not-found')
|
text: this.$t('user-not-found')
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
_notFound = true;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
usernamePromise.then(res).catch(e => {
|
||||||
|
if (e == 'user not found') {
|
||||||
|
notFound();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
idPromise.then(res).catch(e => {
|
||||||
|
notFound();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import { url as instanceUrl } from '../../config';
|
import { url as instanceUrl } from '../../config';
|
||||||
|
import * as url from '../../../../prelude/url';
|
||||||
|
|
||||||
export function getStaticImageUrl(url: string): string {
|
export function getStaticImageUrl(baseUrl: string): string {
|
||||||
const u = new URL(url);
|
const u = new URL(baseUrl);
|
||||||
const dummy = `${u.host}${u.pathname}`; // 拡張子がないとキャッシュしてくれないCDNがあるので
|
const dummy = `${u.host}${u.pathname}`; // 拡張子がないとキャッシュしてくれないCDNがあるので
|
||||||
let result = `${instanceUrl}/proxy/${dummy}?url=${encodeURIComponent(u.href)}`;
|
return `${instanceUrl}/proxy/${dummy}?${url.query({
|
||||||
result += '&static=1';
|
url: u.href,
|
||||||
return result;
|
static: '1'
|
||||||
|
})}`;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-activity">
|
<div>
|
||||||
<div ref="chart"></div>
|
<div ref="chart"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -9,7 +9,17 @@ import Vue from 'vue';
|
|||||||
import ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['user'],
|
props: {
|
||||||
|
user: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
limit: {
|
||||||
|
type: Number,
|
||||||
|
required: false,
|
||||||
|
default: 21
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
fetching: true,
|
fetching: true,
|
||||||
@ -21,7 +31,7 @@ export default Vue.extend({
|
|||||||
this.$root.api('charts/user/notes', {
|
this.$root.api('charts/user/notes', {
|
||||||
userId: this.user.id,
|
userId: this.user.id,
|
||||||
span: 'day',
|
span: 'day',
|
||||||
limit: 21
|
limit: this.limit
|
||||||
}).then(stats => {
|
}).then(stats => {
|
||||||
const normal = [];
|
const normal = [];
|
||||||
const reply = [];
|
const reply = [];
|
||||||
@ -32,7 +42,7 @@ export default Vue.extend({
|
|||||||
const m = now.getMonth();
|
const m = now.getMonth();
|
||||||
const d = now.getDate();
|
const d = now.getDate();
|
||||||
|
|
||||||
for (let i = 0; i < 21; i++) {
|
for (let i = 0; i < this.limit; i++) {
|
||||||
const x = new Date(y, m, d - i);
|
const x = new Date(y, m, d - i);
|
||||||
normal.push([
|
normal.push([
|
||||||
x,
|
x,
|
||||||
@ -99,10 +109,3 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.mk-activity
|
|
||||||
max-width 600px
|
|
||||||
margin 0 auto
|
|
||||||
|
|
||||||
</style>
|
|
11
src/client/app/common/views/components/dummy.vue
Normal file
11
src/client/app/common/views/components/dummy.vue
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
export default Vue.extend({
|
||||||
|
});
|
||||||
|
</script>
|
@ -1,8 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<button class="wfliddvnhxvyusikowhxozkyxyenqxqr"
|
<button class="wfliddvnhxvyusikowhxozkyxyenqxqr"
|
||||||
:class="{ wait, block, mini, active: isFollowing || hasPendingFollowRequestFromYou }"
|
:class="{ wait, block, inline, mini, active: isFollowing || hasPendingFollowRequestFromYou }"
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
:disabled="wait"
|
:disabled="wait"
|
||||||
|
:inline="inline"
|
||||||
>
|
>
|
||||||
<template v-if="!wait">
|
<template v-if="!wait">
|
||||||
<fa :icon="iconAndText[0]"/> <template v-if="!mini">{{ iconAndText[1] }}</template>
|
<fa :icon="iconAndText[0]"/> <template v-if="!mini">{{ iconAndText[1] }}</template>
|
||||||
@ -28,6 +29,11 @@ export default Vue.extend({
|
|||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
|
inline: {
|
||||||
|
type: Boolean,
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
mini: {
|
mini: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
required: false,
|
required: false,
|
||||||
@ -128,6 +134,9 @@ export default Vue.extend({
|
|||||||
border solid 1px var(--primary)
|
border solid 1px var(--primary)
|
||||||
border-radius 36px
|
border-radius 36px
|
||||||
|
|
||||||
|
&.inline
|
||||||
|
display inline-block
|
||||||
|
|
||||||
&.mini
|
&.mini
|
||||||
padding 0
|
padding 0
|
||||||
min-width 0
|
min-width 0
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
import dummy from './dummy.vue';
|
||||||
import userName from './user-name.vue';
|
import userName from './user-name.vue';
|
||||||
import followButton from './follow-button.vue';
|
import followButton from './follow-button.vue';
|
||||||
import error from './error.vue';
|
import error from './error.vue';
|
||||||
@ -46,6 +47,7 @@ import formButton from './ui/form/button.vue';
|
|||||||
import formRadio from './ui/form/radio.vue';
|
import formRadio from './ui/form/radio.vue';
|
||||||
|
|
||||||
Vue.component('mfm', misskeyFlavoredMarkdown);
|
Vue.component('mfm', misskeyFlavoredMarkdown);
|
||||||
|
Vue.component('mk-dummy', dummy);
|
||||||
Vue.component('mk-user-name', userName);
|
Vue.component('mk-user-name', userName);
|
||||||
Vue.component('mk-follow-button', followButton);
|
Vue.component('mk-follow-button', followButton);
|
||||||
Vue.component('mk-error', error);
|
Vue.component('mk-error', error);
|
||||||
|
@ -10,7 +10,9 @@
|
|||||||
:style="style"
|
:style="style"
|
||||||
:title="image.name"
|
:title="image.name"
|
||||||
@click.prevent="onClick"
|
@click.prevent="onClick"
|
||||||
></a>
|
>
|
||||||
|
<div v-if="image.type === 'image/gif'">GIF</div>
|
||||||
|
</a>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -76,6 +78,20 @@ export default Vue.extend({
|
|||||||
background-size contain
|
background-size contain
|
||||||
background-repeat no-repeat
|
background-repeat no-repeat
|
||||||
|
|
||||||
|
> div
|
||||||
|
background-color var(--text)
|
||||||
|
border-radius var(--round)
|
||||||
|
color var(--secondary)
|
||||||
|
display inline-block
|
||||||
|
font-size 14px
|
||||||
|
font-weight bold
|
||||||
|
left 12px
|
||||||
|
opacity .5
|
||||||
|
padding 0 6px
|
||||||
|
text-align center
|
||||||
|
top 12px
|
||||||
|
pointer-events none
|
||||||
|
|
||||||
.qjewsnkgzzxlxtzncydssfbgjibiehcy
|
.qjewsnkgzzxlxtzncydssfbgjibiehcy
|
||||||
display flex
|
display flex
|
||||||
justify-content center
|
justify-content center
|
||||||
|
@ -76,6 +76,7 @@ export default Vue.extend({
|
|||||||
if (note.replyId != null) return;
|
if (note.replyId != null) return;
|
||||||
if (note.renoteId != null) return;
|
if (note.renoteId != null) return;
|
||||||
if (note.poll != null) return;
|
if (note.poll != null) return;
|
||||||
|
if (note.localOnly) return;
|
||||||
|
|
||||||
this.notes.unshift(note);
|
this.notes.unshift(note);
|
||||||
},
|
},
|
||||||
|
@ -13,6 +13,7 @@ import wSlideshow from './slideshow.vue';
|
|||||||
import wTips from './tips.vue';
|
import wTips from './tips.vue';
|
||||||
import wNav from './nav.vue';
|
import wNav from './nav.vue';
|
||||||
import wHashtags from './hashtags.vue';
|
import wHashtags from './hashtags.vue';
|
||||||
|
import wInstance from './instance.vue';
|
||||||
|
|
||||||
Vue.component('mkw-analog-clock', wAnalogClock);
|
Vue.component('mkw-analog-clock', wAnalogClock);
|
||||||
Vue.component('mkw-nav', wNav);
|
Vue.component('mkw-nav', wNav);
|
||||||
@ -27,3 +28,4 @@ Vue.component('mkw-memo', wMemo);
|
|||||||
Vue.component('mkw-rss', wRss);
|
Vue.component('mkw-rss', wRss);
|
||||||
Vue.component('mkw-version', wVersion);
|
Vue.component('mkw-version', wVersion);
|
||||||
Vue.component('mkw-hashtags', wHashtags);
|
Vue.component('mkw-hashtags', wHashtags);
|
||||||
|
Vue.component('mkw-instance', wInstance);
|
||||||
|
14
src/client/app/common/views/widgets/instance.vue
Normal file
14
src/client/app/common/views/widgets/instance.vue
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mkw-instance">
|
||||||
|
<mk-widget-container>
|
||||||
|
<mk-instance/>
|
||||||
|
</mk-widget-container>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import define from '../../../common/define-widget';
|
||||||
|
export default define({
|
||||||
|
name: 'instance'
|
||||||
|
});
|
||||||
|
</script>
|
@ -12,19 +12,13 @@ import init from '../init';
|
|||||||
import fuckAdBlock from '../common/scripts/fuck-ad-block';
|
import fuckAdBlock from '../common/scripts/fuck-ad-block';
|
||||||
import composeNotification from '../common/scripts/compose-notification';
|
import composeNotification from '../common/scripts/compose-notification';
|
||||||
|
|
||||||
import MkIndex from './views/pages/index.vue';
|
import MkHome from './views/home/home.vue';
|
||||||
import MkHome from './views/pages/home.vue';
|
import MkDeck from './views/deck/deck.vue';
|
||||||
import MkDeck from './views/pages/deck/deck.vue';
|
|
||||||
import MkUser from './views/pages/user/user.vue';
|
|
||||||
import MkUserFollowingOrFollowers from './views/pages/user-following-or-followers.vue';
|
import MkUserFollowingOrFollowers from './views/pages/user-following-or-followers.vue';
|
||||||
import MkFavorites from './views/pages/favorites.vue';
|
|
||||||
import MkSelectDrive from './views/pages/selectdrive.vue';
|
import MkSelectDrive from './views/pages/selectdrive.vue';
|
||||||
import MkDrive from './views/pages/drive.vue';
|
import MkDrive from './views/pages/drive.vue';
|
||||||
import MkHomeCustomize from './views/pages/home-customize.vue';
|
|
||||||
import MkMessagingRoom from './views/pages/messaging-room.vue';
|
import MkMessagingRoom from './views/pages/messaging-room.vue';
|
||||||
import MkNote from './views/pages/note.vue';
|
|
||||||
import MkSearch from './views/pages/search.vue';
|
import MkSearch from './views/pages/search.vue';
|
||||||
import MkTag from './views/pages/tag.vue';
|
|
||||||
import MkReversi from './views/pages/games/reversi.vue';
|
import MkReversi from './views/pages/games/reversi.vue';
|
||||||
import MkShare from './views/pages/share.vue';
|
import MkShare from './views/pages/share.vue';
|
||||||
import MkFollow from '../common/views/pages/follow.vue';
|
import MkFollow from '../common/views/pages/follow.vue';
|
||||||
@ -36,6 +30,7 @@ import PostFormWindow from './views/components/post-form-window.vue';
|
|||||||
import RenoteFormWindow from './views/components/renote-form-window.vue';
|
import RenoteFormWindow from './views/components/renote-form-window.vue';
|
||||||
import MkChooseFileFromDriveWindow from './views/components/choose-file-from-drive-window.vue';
|
import MkChooseFileFromDriveWindow from './views/components/choose-file-from-drive-window.vue';
|
||||||
import MkChooseFolderFromDriveWindow from './views/components/choose-folder-from-drive-window.vue';
|
import MkChooseFolderFromDriveWindow from './views/components/choose-folder-from-drive-window.vue';
|
||||||
|
import MkHomeTimeline from './views/home/timeline.vue';
|
||||||
import Notification from './views/components/ui-notification.vue';
|
import Notification from './views/components/ui-notification.vue';
|
||||||
|
|
||||||
import { url } from '../config';
|
import { url } from '../config';
|
||||||
@ -44,7 +39,7 @@ import MiOS from '../mios';
|
|||||||
/**
|
/**
|
||||||
* init
|
* init
|
||||||
*/
|
*/
|
||||||
init(async (launch) => {
|
init(async (launch, os) => {
|
||||||
Vue.mixin({
|
Vue.mixin({
|
||||||
methods: {
|
methods: {
|
||||||
$contextmenu(e, menu, opts?) {
|
$contextmenu(e, menu, opts?) {
|
||||||
@ -134,31 +129,40 @@ init(async (launch) => {
|
|||||||
const router = new VueRouter({
|
const router = new VueRouter({
|
||||||
mode: 'history',
|
mode: 'history',
|
||||||
routes: [
|
routes: [
|
||||||
{ path: '/', name: 'index', component: MkIndex },
|
os.store.getters.isSignedIn && os.store.state.device.deckMode
|
||||||
{ path: '/home', name: 'home', component: MkHome },
|
? { path: '/', name: 'index', component: MkDeck, children: [
|
||||||
{ path: '/deck', name: 'deck', component: MkDeck },
|
{ path: '/@:user', name: 'user', component: () => import('./views/deck/deck.user-column.vue').then(m => m.default) },
|
||||||
{ path: '/i/customize-home', component: MkHomeCustomize },
|
{ path: '/notes/:note', name: 'note', component: () => import('./views/deck/deck.note-column.vue').then(m => m.default) },
|
||||||
{ path: '/i/favorites', component: MkFavorites },
|
{ path: '/tags/:tag', name: 'tag', component: () => import('./views/deck/deck.hashtag-column.vue').then(m => m.default) },
|
||||||
|
{ path: '/featured', component: () => import('./views/deck/deck.featured-column.vue').then(m => m.default) },
|
||||||
|
{ path: '/i/favorites', component: () => import('./views/deck/deck.favorites-column.vue').then(m => m.default) }
|
||||||
|
]}
|
||||||
|
: { path: '/', component: MkHome, children: [
|
||||||
|
{ path: '', name: 'index', component: MkHomeTimeline },
|
||||||
|
{ path: '/@:user', name: 'user', component: () => import('./views/home/user/user.vue').then(m => m.default) },
|
||||||
|
{ path: '/notes/:note', name: 'note', component: () => import('./views/home/note.vue').then(m => m.default) },
|
||||||
|
{ path: '/tags/:tag', name: 'tag', component: () => import('./views/home/tag.vue').then(m => m.default) },
|
||||||
|
{ path: '/featured', component: () => import('./views/home/featured.vue').then(m => m.default) },
|
||||||
|
{ path: '/i/favorites', component: () => import('./views/home/favorites.vue').then(m => m.default) }
|
||||||
|
]},
|
||||||
{ path: '/i/messaging/:user', component: MkMessagingRoom },
|
{ path: '/i/messaging/:user', component: MkMessagingRoom },
|
||||||
{ path: '/i/drive', component: MkDrive },
|
{ path: '/i/drive', component: MkDrive },
|
||||||
{ path: '/i/drive/folder/:folder', component: MkDrive },
|
{ path: '/i/drive/folder/:folder', component: MkDrive },
|
||||||
{ path: '/i/settings', component: MkSettings },
|
{ path: '/i/settings', component: MkSettings },
|
||||||
{ path: '/selectdrive', component: MkSelectDrive },
|
{ path: '/selectdrive', component: MkSelectDrive },
|
||||||
{ path: '/search', component: MkSearch },
|
{ path: '/search', component: MkSearch },
|
||||||
{ path: '/tags/:tag', name: 'tag', component: MkTag },
|
|
||||||
{ path: '/share', component: MkShare },
|
{ path: '/share', component: MkShare },
|
||||||
{ path: '/games/reversi/:game?', component: MkReversi },
|
{ path: '/games/reversi/:game?', component: MkReversi },
|
||||||
{ path: '/@:user', name: 'user', component: MkUser },
|
|
||||||
{ path: '/@:user/following', name: 'userFollowing', component: MkUserFollowingOrFollowers },
|
{ path: '/@:user/following', name: 'userFollowing', component: MkUserFollowingOrFollowers },
|
||||||
{ path: '/@:user/followers', name: 'userFollowers', component: MkUserFollowingOrFollowers },
|
{ path: '/@:user/followers', name: 'userFollowers', component: MkUserFollowingOrFollowers },
|
||||||
{ path: '/notes/:note', name: 'note', component: MkNote },
|
|
||||||
{ path: '/authorize-follow', component: MkFollow },
|
{ path: '/authorize-follow', component: MkFollow },
|
||||||
|
{ path: '/deck', redirect: '/' },
|
||||||
{ path: '*', component: MkNotFound }
|
{ path: '*', component: MkNotFound }
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
// Launch the app
|
// Launch the app
|
||||||
const [app, os] = launch(router);
|
const [app, _] = launch(router);
|
||||||
|
|
||||||
if (os.store.getters.isSignedIn) {
|
if (os.store.getters.isSignedIn) {
|
||||||
/**
|
/**
|
||||||
|
@ -160,6 +160,7 @@ export default Vue.extend({
|
|||||||
color #222
|
color #222
|
||||||
|
|
||||||
> [data-icon]
|
> [data-icon]
|
||||||
|
box-sizing initial
|
||||||
padding 14px
|
padding 14px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,396 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="mk-home" :data-customize="customize">
|
|
||||||
<div class="customize" v-if="customize">
|
|
||||||
<router-link to="/"><fa icon="check"/>{{ $t('done') }}</router-link>
|
|
||||||
<div>
|
|
||||||
<div class="adder">
|
|
||||||
<p>{{ $t('add-widget') }}</p>
|
|
||||||
<select v-model="widgetAdderSelected">
|
|
||||||
<option value="profile">{{ $t('@.widgets.profile') }}</option>
|
|
||||||
<option value="analog-clock">{{ $t('@.widgets.analog-clock') }}</option>
|
|
||||||
<option value="calendar">{{ $t('@.widgets.calendar') }}</option>
|
|
||||||
<option value="timemachine">{{ $t('@.widgets.timemachine') }}</option>
|
|
||||||
<option value="activity">{{ $t('@.widgets.activity') }}</option>
|
|
||||||
<option value="rss">{{ $t('@.widgets.rss') }}</option>
|
|
||||||
<option value="trends">{{ $t('@.widgets.trends') }}</option>
|
|
||||||
<option value="photo-stream">{{ $t('@.widgets.photo-stream') }}</option>
|
|
||||||
<option value="slideshow">{{ $t('@.widgets.slideshow') }}</option>
|
|
||||||
<option value="version">{{ $t('@.widgets.version') }}</option>
|
|
||||||
<option value="broadcast">{{ $t('@.widgets.broadcast') }}</option>
|
|
||||||
<option value="notifications">{{ $t('@.widgets.notifications') }}</option>
|
|
||||||
<option value="users">{{ $t('@.widgets.users') }}</option>
|
|
||||||
<option value="polls">{{ $t('@.widgets.polls') }}</option>
|
|
||||||
<option value="post-form">{{ $t('@.widgets.post-form') }}</option>
|
|
||||||
<option value="messaging">{{ $t('@.widgets.messaging') }}</option>
|
|
||||||
<option value="memo">{{ $t('@.widgets.memo') }}</option>
|
|
||||||
<option value="hashtags">{{ $t('@.widgets.hashtags') }}</option>
|
|
||||||
<option value="posts-monitor">{{ $t('@.widgets.posts-monitor') }}</option>
|
|
||||||
<option value="server">{{ $t('@.widgets.server') }}</option>
|
|
||||||
<option value="nav">{{ $t('@.widgets.nav') }}</option>
|
|
||||||
<option value="tips">{{ $t('@.widgets.tips') }}</option>
|
|
||||||
</select>
|
|
||||||
<button @click="addWidget">{{ $t('add') }}</button>
|
|
||||||
</div>
|
|
||||||
<div class="trash">
|
|
||||||
<x-draggable v-model="trash" :options="{ group: 'x' }" @add="onTrash"></x-draggable>
|
|
||||||
<p>{{ $t('@.trash') }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="main" :class="{ side: widgets.left.length == 0 || widgets.right.length == 0 }">
|
|
||||||
<template v-if="customize">
|
|
||||||
<x-draggable v-for="place in ['left', 'right']"
|
|
||||||
:list="widgets[place]"
|
|
||||||
:class="place"
|
|
||||||
:data-place="place"
|
|
||||||
:options="{ group: 'x', animation: 150 }"
|
|
||||||
@sort="onWidgetSort"
|
|
||||||
:key="place"
|
|
||||||
>
|
|
||||||
<div v-for="widget in widgets[place]" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="onWidgetContextmenu(widget.id)">
|
|
||||||
<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="desktop"/>
|
|
||||||
</div>
|
|
||||||
</x-draggable>
|
|
||||||
<div class="main">
|
|
||||||
<a @click="hint">{{ $t('@.customization-tips.title') }}</a>
|
|
||||||
<div>
|
|
||||||
<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/>
|
|
||||||
<mk-timeline ref="tl" @loaded="onTlLoaded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<div v-for="place in ['left', 'right']" :class="place">
|
|
||||||
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp" platform="desktop"/>
|
|
||||||
</div>
|
|
||||||
<div class="main">
|
|
||||||
<mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/>
|
|
||||||
<mk-timeline class="tl" ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import i18n from '../../../i18n';
|
|
||||||
import * as XDraggable from 'vuedraggable';
|
|
||||||
import * as uuid from 'uuid';
|
|
||||||
|
|
||||||
const defaultDesktopHomeWidgets = {
|
|
||||||
left: [
|
|
||||||
'profile',
|
|
||||||
'calendar',
|
|
||||||
'activity',
|
|
||||||
'rss',
|
|
||||||
'hashtags',
|
|
||||||
'photo-stream',
|
|
||||||
'version'
|
|
||||||
],
|
|
||||||
right: [
|
|
||||||
'broadcast',
|
|
||||||
'notifications',
|
|
||||||
'users',
|
|
||||||
'polls',
|
|
||||||
'server',
|
|
||||||
'nav',
|
|
||||||
'tips'
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
//#region Construct home data
|
|
||||||
const _defaultDesktopHomeWidgets = [];
|
|
||||||
|
|
||||||
for (const widget of defaultDesktopHomeWidgets.left) {
|
|
||||||
_defaultDesktopHomeWidgets.push({
|
|
||||||
name: widget,
|
|
||||||
id: uuid(),
|
|
||||||
place: 'left',
|
|
||||||
data: {}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const widget of defaultDesktopHomeWidgets.right) {
|
|
||||||
_defaultDesktopHomeWidgets.push({
|
|
||||||
name: widget,
|
|
||||||
id: uuid(),
|
|
||||||
place: 'right',
|
|
||||||
data: {}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//#endregion
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
i18n: i18n('desktop/views/components/home.vue'),
|
|
||||||
components: {
|
|
||||||
XDraggable
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
customize: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
},
|
|
||||||
mode: {
|
|
||||||
type: String,
|
|
||||||
default: 'timeline'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
connection: null,
|
|
||||||
widgetAdderSelected: null,
|
|
||||||
trash: []
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
computed: {
|
|
||||||
home(): any[] {
|
|
||||||
return this.$store.state.settings.home || [];
|
|
||||||
},
|
|
||||||
left(): any[] {
|
|
||||||
return this.home.filter(w => w.place == 'left');
|
|
||||||
},
|
|
||||||
right(): any[] {
|
|
||||||
return this.home.filter(w => w.place == 'right');
|
|
||||||
},
|
|
||||||
widgets(): any {
|
|
||||||
return {
|
|
||||||
left: this.left,
|
|
||||||
right: this.right
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
if (this.$store.state.settings.home == null) {
|
|
||||||
this.$root.api('i/update_home', {
|
|
||||||
home: _defaultDesktopHomeWidgets
|
|
||||||
}).then(() => {
|
|
||||||
this.$store.commit('settings/setHome', _defaultDesktopHomeWidgets);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
|
||||||
this.connection = this.$root.stream.useSharedConnection('main');
|
|
||||||
},
|
|
||||||
|
|
||||||
beforeDestroy() {
|
|
||||||
this.connection.dispose();
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
hint() {
|
|
||||||
this.$root.dialog({
|
|
||||||
title: this.$t('@.customization-tips.title'),
|
|
||||||
text: this.$t('@.customization-tips.paragraph')
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
onTlLoaded() {
|
|
||||||
this.$emit('loaded');
|
|
||||||
},
|
|
||||||
|
|
||||||
onWidgetContextmenu(widgetId) {
|
|
||||||
const w = (this.$refs[widgetId] as any)[0];
|
|
||||||
if (w.func) w.func();
|
|
||||||
},
|
|
||||||
|
|
||||||
onWidgetSort() {
|
|
||||||
this.saveHome();
|
|
||||||
},
|
|
||||||
|
|
||||||
onTrash(evt) {
|
|
||||||
this.saveHome();
|
|
||||||
},
|
|
||||||
|
|
||||||
addWidget() {
|
|
||||||
this.$store.dispatch('settings/addHomeWidget', {
|
|
||||||
name: this.widgetAdderSelected,
|
|
||||||
id: uuid(),
|
|
||||||
place: 'left',
|
|
||||||
data: {}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
saveHome() {
|
|
||||||
const left = this.widgets.left;
|
|
||||||
const right = this.widgets.right;
|
|
||||||
this.$store.commit('settings/setHome', left.concat(right));
|
|
||||||
for (const w of left) w.place = 'left';
|
|
||||||
for (const w of right) w.place = 'right';
|
|
||||||
this.$root.api('i/update_home', {
|
|
||||||
home: this.home
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
warp(date) {
|
|
||||||
(this.$refs.tl as any).warp(date);
|
|
||||||
},
|
|
||||||
|
|
||||||
focus() {
|
|
||||||
(this.$refs.tl as any).focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.mk-home
|
|
||||||
display block
|
|
||||||
|
|
||||||
&[data-customize]
|
|
||||||
padding-top 48px
|
|
||||||
background-image url('/assets/desktop/grid.svg')
|
|
||||||
|
|
||||||
> .main > .main
|
|
||||||
> a
|
|
||||||
display block
|
|
||||||
margin-bottom 8px
|
|
||||||
text-align center
|
|
||||||
|
|
||||||
> div
|
|
||||||
cursor not-allowed !important
|
|
||||||
|
|
||||||
> *
|
|
||||||
pointer-events none
|
|
||||||
|
|
||||||
&:not([data-customize])
|
|
||||||
> .main > *:empty
|
|
||||||
display none
|
|
||||||
|
|
||||||
> .customize
|
|
||||||
position fixed
|
|
||||||
z-index 1000
|
|
||||||
top 0
|
|
||||||
left 0
|
|
||||||
width 100%
|
|
||||||
height 48px
|
|
||||||
color var(--text)
|
|
||||||
background var(--desktopHeaderBg)
|
|
||||||
box-shadow 0 1px 1px rgba(#000, 0.075)
|
|
||||||
|
|
||||||
> a
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
z-index 1001
|
|
||||||
top 0
|
|
||||||
right 0
|
|
||||||
padding 0 16px
|
|
||||||
line-height 48px
|
|
||||||
text-decoration none
|
|
||||||
color var(--primaryForeground)
|
|
||||||
background var(--primary)
|
|
||||||
transition background 0.1s ease
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
background var(--primaryLighten10)
|
|
||||||
|
|
||||||
&:active
|
|
||||||
background var(--primaryDarken10)
|
|
||||||
transition background 0s ease
|
|
||||||
|
|
||||||
> [data-icon]
|
|
||||||
margin-right 8px
|
|
||||||
|
|
||||||
> div
|
|
||||||
display flex
|
|
||||||
margin 0 auto
|
|
||||||
max-width 1220px - 32px
|
|
||||||
|
|
||||||
> div
|
|
||||||
width 50%
|
|
||||||
|
|
||||||
&.adder
|
|
||||||
> p
|
|
||||||
display inline
|
|
||||||
line-height 48px
|
|
||||||
|
|
||||||
&.trash
|
|
||||||
border-left solid 1px var(--faceDivider)
|
|
||||||
|
|
||||||
> div
|
|
||||||
width 100%
|
|
||||||
height 100%
|
|
||||||
|
|
||||||
> p
|
|
||||||
position absolute
|
|
||||||
top 0
|
|
||||||
left 0
|
|
||||||
width 100%
|
|
||||||
line-height 48px
|
|
||||||
margin 0
|
|
||||||
text-align center
|
|
||||||
pointer-events none
|
|
||||||
|
|
||||||
> .main
|
|
||||||
display flex
|
|
||||||
justify-content center
|
|
||||||
margin 0 auto
|
|
||||||
max-width 1240px
|
|
||||||
|
|
||||||
> *
|
|
||||||
.customize-container
|
|
||||||
cursor move
|
|
||||||
border-radius 6px
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
box-shadow 0 0 8px rgba(64, 120, 200, 0.3)
|
|
||||||
|
|
||||||
> *
|
|
||||||
pointer-events none
|
|
||||||
|
|
||||||
> .main
|
|
||||||
padding 16px
|
|
||||||
width calc(100% - 280px * 2)
|
|
||||||
order 2
|
|
||||||
|
|
||||||
> .form
|
|
||||||
margin-bottom 16px
|
|
||||||
box-shadow var(--shadow)
|
|
||||||
border-radius var(--round)
|
|
||||||
|
|
||||||
&.side
|
|
||||||
> .main
|
|
||||||
width calc(100% - 280px)
|
|
||||||
max-width 680px
|
|
||||||
|
|
||||||
> *:not(.main)
|
|
||||||
width 280px
|
|
||||||
padding 16px 0 16px 0
|
|
||||||
|
|
||||||
> *:not(:last-child)
|
|
||||||
margin-bottom 16px
|
|
||||||
|
|
||||||
> .left
|
|
||||||
padding-left 16px
|
|
||||||
order 1
|
|
||||||
|
|
||||||
> .right
|
|
||||||
padding-right 16px
|
|
||||||
order 3
|
|
||||||
|
|
||||||
&.side
|
|
||||||
@media (max-width 1000px)
|
|
||||||
> *:not(.main)
|
|
||||||
display none
|
|
||||||
|
|
||||||
> .main
|
|
||||||
width 100%
|
|
||||||
max-width 700px
|
|
||||||
margin 0 auto
|
|
||||||
|
|
||||||
&:not(.side)
|
|
||||||
@media (max-width 1200px)
|
|
||||||
> *:not(.main)
|
|
||||||
display none
|
|
||||||
|
|
||||||
> .main
|
|
||||||
width 100%
|
|
||||||
max-width 700px
|
|
||||||
margin 0 auto
|
|
||||||
|
|
||||||
</style>
|
|
@ -2,8 +2,6 @@ import Vue from 'vue';
|
|||||||
|
|
||||||
import ui from './ui.vue';
|
import ui from './ui.vue';
|
||||||
import uiNotification from './ui-notification.vue';
|
import uiNotification from './ui-notification.vue';
|
||||||
import home from './home.vue';
|
|
||||||
import timeline from './timeline.vue';
|
|
||||||
import notes from './notes.vue';
|
import notes from './notes.vue';
|
||||||
import subNoteContent from './sub-note-content.vue';
|
import subNoteContent from './sub-note-content.vue';
|
||||||
import window from './window.vue';
|
import window from './window.vue';
|
||||||
@ -24,8 +22,6 @@ import widgetContainer from './widget-container.vue';
|
|||||||
|
|
||||||
Vue.component('mk-ui', ui);
|
Vue.component('mk-ui', ui);
|
||||||
Vue.component('mk-ui-notification', uiNotification);
|
Vue.component('mk-ui-notification', uiNotification);
|
||||||
Vue.component('mk-home', home);
|
|
||||||
Vue.component('mk-timeline', timeline);
|
|
||||||
Vue.component('mk-notes', notes);
|
Vue.component('mk-notes', notes);
|
||||||
Vue.component('mk-sub-note-content', subNoteContent);
|
Vue.component('mk-sub-note-content', subNoteContent);
|
||||||
Vue.component('mk-window', window);
|
Vue.component('mk-window', window);
|
||||||
|
@ -31,9 +31,6 @@
|
|||||||
<ui-switch v-model="autoPopout">{{ $t('auto-popout') }}
|
<ui-switch v-model="autoPopout">{{ $t('auto-popout') }}
|
||||||
<span slot="desc">{{ $t('auto-popout-desc') }}</span>
|
<span slot="desc">{{ $t('auto-popout-desc') }}</span>
|
||||||
</ui-switch>
|
</ui-switch>
|
||||||
<ui-switch v-model="deckNav">{{ $t('deck-nav') }}
|
|
||||||
<span slot="desc">{{ $t('deck-nav-desc') }}</span>
|
|
||||||
</ui-switch>
|
|
||||||
<ui-switch v-model="keepCw">{{ $t('keep-cw') }}
|
<ui-switch v-model="keepCw">{{ $t('keep-cw') }}
|
||||||
<span slot="desc">{{ $t('keep-cw-desc') }}</span>
|
<span slot="desc">{{ $t('keep-cw-desc') }}</span>
|
||||||
</ui-switch>
|
</ui-switch>
|
||||||
@ -89,9 +86,6 @@
|
|||||||
<ui-radio v-model="navbar" value="left">{{ $t('navbar-position-left') }}</ui-radio>
|
<ui-radio v-model="navbar" value="left">{{ $t('navbar-position-left') }}</ui-radio>
|
||||||
<ui-radio v-model="navbar" value="right">{{ $t('navbar-position-right') }}</ui-radio>
|
<ui-radio v-model="navbar" value="right">{{ $t('navbar-position-right') }}</ui-radio>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
|
||||||
<ui-switch v-model="deckDefault">{{ $t('deck-default') }}</ui-switch>
|
|
||||||
</section>
|
|
||||||
<section>
|
<section>
|
||||||
<ui-switch v-model="darkmode">{{ $t('dark-mode') }}</ui-switch>
|
<ui-switch v-model="darkmode">{{ $t('dark-mode') }}</ui-switch>
|
||||||
<ui-switch v-model="useShadow">{{ $t('use-shadow') }}</ui-switch>
|
<ui-switch v-model="useShadow">{{ $t('use-shadow') }}</ui-switch>
|
||||||
@ -337,11 +331,6 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
deckNav: {
|
|
||||||
get() { return this.$store.state.settings.deckNav; },
|
|
||||||
set(value) { this.$store.commit('settings/set', { key: 'deckNav', value }); }
|
|
||||||
},
|
|
||||||
|
|
||||||
keepCw: {
|
keepCw: {
|
||||||
get() { return this.$store.state.settings.keepCw; },
|
get() { return this.$store.state.settings.keepCw; },
|
||||||
set(value) { this.$store.commit('settings/set', { key: 'keepCw', value }); }
|
set(value) { this.$store.commit('settings/set', { key: 'keepCw', value }); }
|
||||||
@ -367,11 +356,6 @@ export default Vue.extend({
|
|||||||
set(value) { this.$store.commit('device/set', { key: 'deckColumnWidth', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'deckColumnWidth', value }); }
|
||||||
},
|
},
|
||||||
|
|
||||||
deckDefault: {
|
|
||||||
get() { return this.$store.state.device.deckDefault; },
|
|
||||||
set(value) { this.$store.commit('device/set', { key: 'deckDefault', value }); }
|
|
||||||
},
|
|
||||||
|
|
||||||
enableSounds: {
|
enableSounds: {
|
||||||
get() { return this.$store.state.device.enableSounds; },
|
get() { return this.$store.state.device.enableSounds; },
|
||||||
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
|
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
|
||||||
@ -534,8 +518,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
customizeHome() {
|
customizeHome() {
|
||||||
this.$router.push('/i/customize-home');
|
location.href = '/?customize';
|
||||||
this.$emit('done');
|
|
||||||
},
|
},
|
||||||
updateWallpaper() {
|
updateWallpaper() {
|
||||||
this.$chooseDriveFile({
|
this.$chooseDriveFile({
|
||||||
|
@ -1,260 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="mk-timeline">
|
|
||||||
<header>
|
|
||||||
<span :data-active="src == 'home'" @click="src = 'home'"><fa icon="home"/> {{ $t('home') }}</span>
|
|
||||||
<span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline"><fa :icon="['far', 'comments']"/> {{ $t('local') }}</span>
|
|
||||||
<span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline"><fa icon="share-alt"/> {{ $t('hybrid') }}</span>
|
|
||||||
<span :data-active="src == 'global'" @click="src = 'global'" v-if="enableGlobalTimeline"><fa icon="globe"/> {{ $t('global') }}</span>
|
|
||||||
<span :data-active="src == 'tag'" @click="src = 'tag'" v-if="tagTl"><fa icon="hashtag"/> {{ tagTl.title }}</span>
|
|
||||||
<span :data-active="src == 'list'" @click="src = 'list'" v-if="list"><fa icon="list"/> {{ list.title }}</span>
|
|
||||||
<div class="buttons">
|
|
||||||
<button :data-active="src == 'mentions'" @click="src = 'mentions'" :title="$t('mentions')"><fa icon="at"/><i class="badge" v-if="$store.state.i.hasUnreadMentions"><fa icon="circle"/></i></button>
|
|
||||||
<button :data-active="src == 'messages'" @click="src = 'messages'" :title="$t('messages')"><fa :icon="['far', 'envelope']"/><i class="badge" v-if="$store.state.i.hasUnreadSpecifiedNotes"><fa icon="circle"/></i></button>
|
|
||||||
<button @click="chooseTag" :title="$t('hashtag')" ref="tagButton"><fa icon="hashtag"/></button>
|
|
||||||
<button @click="chooseList" :title="$t('list')" ref="listButton"><fa icon="list"/></button>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<x-core v-if="src == 'home'" ref="tl" key="home" src="home"/>
|
|
||||||
<x-core v-if="src == 'local'" ref="tl" key="local" src="local"/>
|
|
||||||
<x-core v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/>
|
|
||||||
<x-core v-if="src == 'global'" ref="tl" key="global" src="global"/>
|
|
||||||
<x-core v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/>
|
|
||||||
<x-core v-if="src == 'messages'" ref="tl" key="messages" src="messages"/>
|
|
||||||
<x-core v-if="src == 'tag'" ref="tl" key="tag" src="tag" :tag-tl="tagTl"/>
|
|
||||||
<mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import i18n from '../../../i18n';
|
|
||||||
import XCore from './timeline.core.vue';
|
|
||||||
import Menu from '../../../common/views/components/menu.vue';
|
|
||||||
import MkSettingsWindow from './settings-window.vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
i18n: i18n('desktop/views/components/timeline.vue'),
|
|
||||||
components: {
|
|
||||||
XCore
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
src: 'home',
|
|
||||||
list: null,
|
|
||||||
tagTl: null,
|
|
||||||
enableLocalTimeline: false,
|
|
||||||
enableGlobalTimeline: false,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
watch: {
|
|
||||||
src() {
|
|
||||||
this.saveSrc();
|
|
||||||
},
|
|
||||||
|
|
||||||
list(x) {
|
|
||||||
this.saveSrc();
|
|
||||||
if (x != null) this.tagTl = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
tagTl(x) {
|
|
||||||
this.saveSrc();
|
|
||||||
if (x != null) this.list = null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
this.$root.getMeta().then(meta => {
|
|
||||||
this.enableLocalTimeline = !meta.disableLocalTimeline || this.$store.state.i.isModerator || this.$store.state.i.isAdmin;
|
|
||||||
this.enableGlobalTimeline = !meta.disableGlobalTimeline || this.$store.state.i.isModerator || this.$store.state.i.isAdmin;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this.$store.state.device.tl) {
|
|
||||||
this.src = this.$store.state.device.tl.src;
|
|
||||||
if (this.src == 'list') {
|
|
||||||
this.list = this.$store.state.device.tl.arg;
|
|
||||||
} else if (this.src == 'tag') {
|
|
||||||
this.tagTl = this.$store.state.device.tl.arg;
|
|
||||||
}
|
|
||||||
} else if (this.$store.state.i.followingCount == 0) {
|
|
||||||
this.src = 'hybrid';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
|
||||||
(this.$refs.tl as any).$once('loaded', () => {
|
|
||||||
this.$emit('loaded');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
saveSrc() {
|
|
||||||
this.$store.commit('device/setTl', {
|
|
||||||
src: this.src,
|
|
||||||
arg: this.src == 'list' ? this.list : this.tagTl
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
focus() {
|
|
||||||
(this.$refs.tl as any).focus();
|
|
||||||
},
|
|
||||||
|
|
||||||
warp(date) {
|
|
||||||
(this.$refs.tl as any).warp(date);
|
|
||||||
},
|
|
||||||
|
|
||||||
async chooseList() {
|
|
||||||
const lists = await this.$root.api('users/lists/list');
|
|
||||||
|
|
||||||
let menu = [{
|
|
||||||
icon: 'plus',
|
|
||||||
text: this.$t('add-list'),
|
|
||||||
action: () => {
|
|
||||||
this.$root.dialog({
|
|
||||||
title: this.$t('list-name'),
|
|
||||||
input: true
|
|
||||||
}).then(async ({ canceled, result: title }) => {
|
|
||||||
if (canceled) return;
|
|
||||||
const list = await this.$root.api('users/lists/create', {
|
|
||||||
title
|
|
||||||
});
|
|
||||||
|
|
||||||
this.list = list;
|
|
||||||
this.src = 'list';
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}];
|
|
||||||
|
|
||||||
if (lists.length > 0) {
|
|
||||||
menu.push(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
menu = menu.concat(lists.map(list => ({
|
|
||||||
icon: 'list',
|
|
||||||
text: list.title,
|
|
||||||
action: () => {
|
|
||||||
this.list = list;
|
|
||||||
this.src = 'list';
|
|
||||||
}
|
|
||||||
})));
|
|
||||||
|
|
||||||
this.$root.new(Menu, {
|
|
||||||
source: this.$refs.listButton,
|
|
||||||
items: menu
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
chooseTag() {
|
|
||||||
let menu = [{
|
|
||||||
icon: 'plus',
|
|
||||||
text: this.$t('add-tag-timeline'),
|
|
||||||
action: () => {
|
|
||||||
this.$root.new(MkSettingsWindow, {
|
|
||||||
initialPage: 'hashtags'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}];
|
|
||||||
|
|
||||||
if (this.$store.state.settings.tagTimelines.length > 0) {
|
|
||||||
menu.push(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
menu = menu.concat(this.$store.state.settings.tagTimelines.map(t => ({
|
|
||||||
icon: 'hashtag',
|
|
||||||
text: t.title,
|
|
||||||
action: () => {
|
|
||||||
this.tagTl = t;
|
|
||||||
this.src = 'tag';
|
|
||||||
}
|
|
||||||
})));
|
|
||||||
|
|
||||||
this.$root.new(Menu, {
|
|
||||||
source: this.$refs.tagButton,
|
|
||||||
items: menu
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.mk-timeline
|
|
||||||
background var(--face)
|
|
||||||
box-shadow var(--shadow)
|
|
||||||
border-radius var(--round)
|
|
||||||
overflow hidden
|
|
||||||
|
|
||||||
> header
|
|
||||||
padding 0 8px
|
|
||||||
z-index 10
|
|
||||||
background var(--faceHeader)
|
|
||||||
box-shadow 0 var(--lineWidth) var(--desktopTimelineHeaderShadow)
|
|
||||||
|
|
||||||
> .buttons
|
|
||||||
position absolute
|
|
||||||
z-index 2
|
|
||||||
top 0
|
|
||||||
right 0
|
|
||||||
padding-right 8px
|
|
||||||
|
|
||||||
> button
|
|
||||||
padding 0 8px
|
|
||||||
font-size 0.9em
|
|
||||||
line-height 42px
|
|
||||||
color var(--faceTextButton)
|
|
||||||
|
|
||||||
> .badge
|
|
||||||
position absolute
|
|
||||||
top -4px
|
|
||||||
right 4px
|
|
||||||
font-size 10px
|
|
||||||
color var(--notificationIndicator)
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
color var(--faceTextButtonHover)
|
|
||||||
|
|
||||||
&[data-active]
|
|
||||||
color var(--primary)
|
|
||||||
cursor default
|
|
||||||
|
|
||||||
&:before
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
bottom 0
|
|
||||||
left 0
|
|
||||||
width 100%
|
|
||||||
height 2px
|
|
||||||
background var(--primary)
|
|
||||||
|
|
||||||
> span
|
|
||||||
display inline-block
|
|
||||||
padding 0 10px
|
|
||||||
line-height 42px
|
|
||||||
font-size 12px
|
|
||||||
user-select none
|
|
||||||
|
|
||||||
&[data-active]
|
|
||||||
color var(--primary)
|
|
||||||
cursor default
|
|
||||||
font-weight bold
|
|
||||||
|
|
||||||
&:before
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
position absolute
|
|
||||||
bottom 0
|
|
||||||
left -8px
|
|
||||||
width calc(100% + 16px)
|
|
||||||
height 2px
|
|
||||||
background var(--primary)
|
|
||||||
|
|
||||||
&:not([data-active])
|
|
||||||
color var(--desktopTimelineSrc)
|
|
||||||
cursor pointer
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
color var(--desktopTimelineSrcHover)
|
|
||||||
|
|
||||||
</style>
|
|
@ -44,13 +44,6 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
|
||||||
<router-link to="/i/customize-home">
|
|
||||||
<i><fa icon="wrench"/></i>
|
|
||||||
<span>{{ $t('customize') }}</span>
|
|
||||||
<i><fa icon="angle-right"/></i>
|
|
||||||
</router-link>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<router-link to="/i/settings">
|
<router-link to="/i/settings">
|
||||||
<i><fa icon="cog"/></i>
|
<i><fa icon="cog"/></i>
|
||||||
|
@ -2,20 +2,20 @@
|
|||||||
<div class="nav">
|
<div class="nav">
|
||||||
<ul>
|
<ul>
|
||||||
<template v-if="$store.getters.isSignedIn">
|
<template v-if="$store.getters.isSignedIn">
|
||||||
<template v-if="$store.state.device.deckDefault">
|
<template v-if="$store.state.device.deckMode">
|
||||||
<li class="deck" :class="{ active: $route.name == 'deck' || $route.name == 'index' }" @click="goToTop">
|
<li class="deck active" @click="goToTop">
|
||||||
<router-link to="/"><fa icon="columns"/><p>{{ $t('deck') }}</p></router-link>
|
<router-link to="/"><fa icon="columns"/><p>{{ $t('deck') }}</p></router-link>
|
||||||
</li>
|
</li>
|
||||||
<li class="home" :class="{ active: $route.name == 'home' }" @click="goToTop">
|
<li class="home">
|
||||||
<router-link to="/home"><fa icon="home"/><p>{{ $t('home') }}</p></router-link>
|
<a @click="toggleDeckMode(false)"><fa icon="home"/><p>{{ $t('home') }}</p></a>
|
||||||
</li>
|
</li>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<li class="home" :class="{ active: $route.name == 'home' || $route.name == 'index' }" @click="goToTop">
|
<li class="home active" @click="goToTop">
|
||||||
<router-link to="/"><fa icon="home"/><p>{{ $t('home') }}</p></router-link>
|
<router-link to="/"><fa icon="home"/><p>{{ $t('home') }}</p></router-link>
|
||||||
</li>
|
</li>
|
||||||
<li class="deck" :class="{ active: $route.name == 'deck' }" @click="goToTop">
|
<li class="deck">
|
||||||
<router-link to="/deck"><fa icon="columns"/><p>{{ $t('deck') }}</p></router-link>
|
<a @click="toggleDeckMode(true)"><fa icon="columns"/><p>{{ $t('deck') }}</p></a>
|
||||||
</li>
|
</li>
|
||||||
</template>
|
</template>
|
||||||
<li class="messaging">
|
<li class="messaging">
|
||||||
@ -25,6 +25,10 @@
|
|||||||
<template v-if="hasUnreadMessagingMessage"><fa icon="circle"/></template>
|
<template v-if="hasUnreadMessagingMessage"><fa icon="circle"/></template>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
</template>
|
||||||
|
<li class="featured">
|
||||||
|
<router-link to="/featured"><fa :icon="faNewspaper"/><p>{{ $t('@.featured-notes') }}</p></router-link>
|
||||||
|
</li>
|
||||||
<li class="game">
|
<li class="game">
|
||||||
<a @click="game">
|
<a @click="game">
|
||||||
<fa icon="gamepad"/>
|
<fa icon="gamepad"/>
|
||||||
@ -32,7 +36,6 @@
|
|||||||
<template v-if="hasGameInvitations"><fa icon="circle"/></template>
|
<template v-if="hasGameInvitations"><fa icon="circle"/></template>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</template>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -42,13 +45,15 @@ import Vue from 'vue';
|
|||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import MkMessagingWindow from './messaging-window.vue';
|
import MkMessagingWindow from './messaging-window.vue';
|
||||||
import MkGameWindow from './game-window.vue';
|
import MkGameWindow from './game-window.vue';
|
||||||
|
import { faNewspaper } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('desktop/views/components/ui.header.nav.vue'),
|
i18n: i18n('desktop/views/components/ui.header.nav.vue'),
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hasGameInvitations: false,
|
hasGameInvitations: false,
|
||||||
connection: null
|
connection: null,
|
||||||
|
faNewspaper
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@ -70,6 +75,11 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
toggleDeckMode(deck) {
|
||||||
|
this.$store.commit('device/set', { key: 'deckMode', value: deck });
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
|
||||||
onReversiInvited() {
|
onReversiInvited() {
|
||||||
this.hasGameInvitations = true;
|
this.hasGameInvitations = true;
|
||||||
},
|
},
|
||||||
|
@ -116,7 +116,7 @@ export default Vue.extend({
|
|||||||
> .container
|
> .container
|
||||||
display flex
|
display flex
|
||||||
width 100%
|
width 100%
|
||||||
max-width 1300px
|
max-width 1208px
|
||||||
margin 0 auto
|
margin 0 auto
|
||||||
|
|
||||||
> *
|
> *
|
||||||
|
@ -6,20 +6,20 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="nav" v-if="$store.getters.isSignedIn">
|
<div class="nav" v-if="$store.getters.isSignedIn">
|
||||||
<template v-if="$store.state.device.deckDefault">
|
<template v-if="$store.state.device.deckMode">
|
||||||
<div class="deck" :class="{ active: $route.name == 'deck' || $route.name == 'index' }" @click="goToTop">
|
<div class="deck active" @click="goToTop">
|
||||||
<router-link to="/"><fa icon="columns"/></router-link>
|
<router-link to="/"><fa icon="columns"/></router-link>
|
||||||
</div>
|
</div>
|
||||||
<div class="home" :class="{ active: $route.name == 'home' }" @click="goToTop">
|
<div class="home">
|
||||||
<router-link to="/home"><fa icon="home"/></router-link>
|
<a @click="toggleDeckMode(false)"><fa icon="home"/></a>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="home" :class="{ active: $route.name == 'home' || $route.name == 'index' }" @click="goToTop">
|
<div class="home active" @click="goToTop">
|
||||||
<router-link to="/"><fa icon="home"/></router-link>
|
<router-link to="/"><fa icon="home"/></router-link>
|
||||||
</div>
|
</div>
|
||||||
<div class="deck" :class="{ active: $route.name == 'deck' }" @click="goToTop">
|
<div class="deck">
|
||||||
<router-link to="/deck"><fa icon="columns"/></router-link>
|
<a @click="toggleDeckMode(true)"><fa icon="columns"/></a>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div class="messaging">
|
<div class="messaging">
|
||||||
@ -122,6 +122,11 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
toggleDeckMode(deck) {
|
||||||
|
this.$store.commit('device/set', { key: 'deckMode', value: deck });
|
||||||
|
location.reload();
|
||||||
|
},
|
||||||
|
|
||||||
onReversiInvited() {
|
onReversiInvited() {
|
||||||
this.hasGameInvitations = true;
|
this.hasGameInvitations = true;
|
||||||
},
|
},
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="zvdbznxvfixtmujpsigoccczftvpiwqh">
|
<div class="zvdbznxvfixtmujpsigoccczftvpiwqh">
|
||||||
<div class="banner" :style="bannerStyle"></div>
|
<div class="banner" :style="bannerStyle"></div>
|
||||||
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
||||||
<mk-follow-button :user="user" class="follow" mini/>
|
<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" :user="user" class="follow" mini/>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<router-link :to="user | userPage" class="name">
|
<router-link :to="user | userPage" class="name">
|
||||||
<mk-user-name :user="user"/>
|
<mk-user-name :user="user"/>
|
||||||
|
@ -27,9 +27,9 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import Menu from '../../../../common/views/components/menu.vue';
|
import Menu from '../../../common/views/components/menu.vue';
|
||||||
import { countIf } from '../../../../../../prelude/array';
|
import { countIf } from '../../../../../prelude/array';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('deck'),
|
i18n: i18n('deck'),
|
||||||
@ -245,10 +245,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
close() {
|
close() {
|
||||||
this.$store.commit('device/set', {
|
this.$router.push('/');
|
||||||
key: 'deckTemporaryColumn',
|
|
||||||
value: null
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
goTop() {
|
goTop() {
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import XDirect from './deck.direct.vue';
|
import XDirect from './deck.direct.vue';
|
||||||
|
|
88
src/client/app/desktop/views/deck/deck.favorites-column.vue
Normal file
88
src/client/app/desktop/views/deck/deck.favorites-column.vue
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<template>
|
||||||
|
<x-column>
|
||||||
|
<span slot="header">
|
||||||
|
<fa :icon="['fa', 'star']"/>{{ $t('favorites') }}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<x-notes ref="timeline" :more="existMore ? more : null"/>
|
||||||
|
</div>
|
||||||
|
</x-column>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
import XColumn from './deck.column.vue';
|
||||||
|
import XNotes from './deck.notes.vue';
|
||||||
|
|
||||||
|
const fetchLimit = 10;
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n(),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XColumn,
|
||||||
|
XNotes,
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
moreFetching: false,
|
||||||
|
existMore: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||||
|
this.$root.api('i/favorites', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
}).then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
this.existMore = true;
|
||||||
|
}
|
||||||
|
res(notes.map(x => x.note));
|
||||||
|
this.fetching = false;
|
||||||
|
this.$emit('loaded');
|
||||||
|
}, rej);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
more() {
|
||||||
|
this.moreFetching = true;
|
||||||
|
|
||||||
|
const promise = this.$root.api('i/favorites', {
|
||||||
|
limit: fetchLimit + 1,
|
||||||
|
untilId: (this.$refs.timeline as any).tail().id,
|
||||||
|
});
|
||||||
|
|
||||||
|
promise.then(notes => {
|
||||||
|
if (notes.length == fetchLimit + 1) {
|
||||||
|
notes.pop();
|
||||||
|
} else {
|
||||||
|
this.existMore = false;
|
||||||
|
}
|
||||||
|
for (const n of notes) {
|
||||||
|
(this.$refs.timeline as any).append(n);
|
||||||
|
}
|
||||||
|
this.moreFetching = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
return promise;
|
||||||
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
this.$refs.timeline.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
59
src/client/app/desktop/views/deck/deck.featured-column.vue
Normal file
59
src/client/app/desktop/views/deck/deck.featured-column.vue
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<template>
|
||||||
|
<x-column>
|
||||||
|
<span slot="header">
|
||||||
|
<fa :icon="faNewspaper"/>{{ $t('@.featured-notes') }}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<x-notes ref="timeline" :more="null"/>
|
||||||
|
</div>
|
||||||
|
</x-column>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
import XColumn from './deck.column.vue';
|
||||||
|
import XNotes from './deck.notes.vue';
|
||||||
|
import { faNewspaper } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n(),
|
||||||
|
|
||||||
|
components: {
|
||||||
|
XColumn,
|
||||||
|
XNotes,
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
faNewspaper
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
(this.$refs.timeline as any).init(() => new Promise((res, rej) => {
|
||||||
|
this.$root.api('notes/featured', {
|
||||||
|
limit: 15,
|
||||||
|
}).then(notes => {
|
||||||
|
res(notes);
|
||||||
|
this.fetching = false;
|
||||||
|
this.$emit('loaded');
|
||||||
|
}, rej);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
this.$refs.timeline.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
119
src/client/app/desktop/views/deck/deck.hashtag-column.vue
Normal file
119
src/client/app/desktop/views/deck/deck.hashtag-column.vue
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<template>
|
||||||
|
<x-column>
|
||||||
|
<span slot="header">
|
||||||
|
<fa icon="hashtag"/><span>{{ tag }}</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<div class="xroyrflcmhhtmlwmyiwpfqiirqokfueb">
|
||||||
|
<div ref="chart" class="chart"></div>
|
||||||
|
<x-hashtag-tl :tag-tl="tagTl" class="tl"/>
|
||||||
|
</div>
|
||||||
|
</x-column>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import XColumn from './deck.column.vue';
|
||||||
|
import XHashtagTl from './deck.hashtag-tl.vue';
|
||||||
|
import ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
components: {
|
||||||
|
XColumn,
|
||||||
|
XHashtagTl
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
tag(): string {
|
||||||
|
return this.$route.params.tag;
|
||||||
|
},
|
||||||
|
|
||||||
|
tagTl(): any {
|
||||||
|
return {
|
||||||
|
query: [[this.tag]]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
$route: 'fetch'
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.$root.api('charts/hashtag', {
|
||||||
|
tag: this.tag,
|
||||||
|
span: 'hour',
|
||||||
|
limit: 24
|
||||||
|
}).then(stats => {
|
||||||
|
const local = [];
|
||||||
|
const remote = [];
|
||||||
|
|
||||||
|
const now = new Date();
|
||||||
|
const y = now.getFullYear();
|
||||||
|
const m = now.getMonth();
|
||||||
|
const d = now.getDate();
|
||||||
|
const h = now.getHours();
|
||||||
|
|
||||||
|
for (let i = 0; i < 24; i++) {
|
||||||
|
const x = new Date(y, m, d, h - i);
|
||||||
|
local.push([x, stats.local.count[i]]);
|
||||||
|
remote.push([x, stats.remote.count[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const chart = new ApexCharts(this.$refs.chart, {
|
||||||
|
chart: {
|
||||||
|
type: 'area',
|
||||||
|
height: 70,
|
||||||
|
sparkline: {
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
clipMarkers: false,
|
||||||
|
padding: {
|
||||||
|
top: 16,
|
||||||
|
right: 16,
|
||||||
|
bottom: 16,
|
||||||
|
left: 16
|
||||||
|
}
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
curve: 'straight',
|
||||||
|
width: 2
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
name: 'Local',
|
||||||
|
data: local
|
||||||
|
}, {
|
||||||
|
name: 'Remote',
|
||||||
|
data: remote
|
||||||
|
}],
|
||||||
|
xaxis: {
|
||||||
|
type: 'datetime',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
chart.render();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.xroyrflcmhhtmlwmyiwpfqiirqokfueb
|
||||||
|
background var(--deckColumnBg)
|
||||||
|
|
||||||
|
> .chart
|
||||||
|
margin-bottom 16px
|
||||||
|
background var(--face)
|
||||||
|
|
||||||
|
> .tl
|
||||||
|
background var(--face)
|
||||||
|
|
||||||
|
</style>
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import XMentions from './deck.mentions.vue';
|
import XMentions from './deck.mentions.vue';
|
||||||
|
|
@ -18,10 +18,10 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import XNotes from './deck.notes.vue';
|
import XNotes from './deck.notes.vue';
|
||||||
import XNote from '../../components/note.vue';
|
import XNote from '../components/note.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n(),
|
i18n: i18n(),
|
||||||
@ -31,13 +31,6 @@ export default Vue.extend({
|
|||||||
XNote
|
XNote
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
|
||||||
noteId: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
note: null,
|
note: null,
|
||||||
@ -45,12 +38,26 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
$route: 'fetch'
|
||||||
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$root.api('notes/show', { noteId: this.noteId }).then(note => {
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
this.$root.api('notes/show', {
|
||||||
|
noteId: this.$route.params.note
|
||||||
|
}).then(note => {
|
||||||
this.note = note;
|
this.note = note;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -38,10 +38,10 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import shouldMuteNote from '../../../../common/scripts/should-mute-note';
|
import shouldMuteNote from '../../../common/scripts/should-mute-note';
|
||||||
|
|
||||||
import XNote from '../../components/note.vue';
|
import XNote from '../components/note.vue';
|
||||||
|
|
||||||
const displayLimit = 20;
|
const displayLimit = 20;
|
||||||
|
|
@ -96,8 +96,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import getNoteSummary from '../../../../../../misc/get-note-summary';
|
import getNoteSummary from '../../../../../misc/get-note-summary';
|
||||||
import XNote from '../../components/note.vue';
|
import XNote from '../components/note.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import XNotifications from './deck.notifications.vue';
|
import XNotifications from './deck.notifications.vue';
|
||||||
|
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XNotification from './deck.notification.vue';
|
import XNotification from './deck.notification.vue';
|
||||||
|
|
||||||
const displayLimit = 20;
|
const displayLimit = 20;
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import XTl from './deck.tl.vue';
|
import XTl from './deck.tl.vue';
|
||||||
import XListTl from './deck.list-tl.vue';
|
import XListTl from './deck.list-tl.vue';
|
@ -20,6 +20,7 @@
|
|||||||
<mk-user-name :user="user"/>
|
<mk-user-name :user="user"/>
|
||||||
</span>
|
</span>
|
||||||
<span class="acct">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span>
|
<span class="acct">@{{ user | acct }} <fa v-if="user.isLocked == true" class="locked" icon="lock" fixed-width/></span>
|
||||||
|
<span class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</span>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
@ -92,13 +93,13 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import parseAcct from '../../../../../../misc/acct/parse';
|
import parseAcct from '../../../../../misc/acct/parse';
|
||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import XNotes from './deck.notes.vue';
|
import XNotes from './deck.notes.vue';
|
||||||
import XNote from '../../components/note.vue';
|
import XNote from '../components/note.vue';
|
||||||
import XUserMenu from '../../../../common/views/components/user-menu.vue';
|
import XUserMenu from '../../../common/views/components/user-menu.vue';
|
||||||
import { concat } from '../../../../../../prelude/array';
|
import { concat } from '../../../../../prelude/array';
|
||||||
import ApexCharts from 'apexcharts';
|
import ApexCharts from 'apexcharts';
|
||||||
|
|
||||||
const fetchLimit = 10;
|
const fetchLimit = 10;
|
||||||
@ -111,13 +112,6 @@ export default Vue.extend({
|
|||||||
XNote
|
XNote
|
||||||
},
|
},
|
||||||
|
|
||||||
props: {
|
|
||||||
acct: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
user: null,
|
user: null,
|
||||||
@ -143,8 +137,18 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
$route: 'fetch'
|
||||||
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$root.api('users/show', parseAcct(this.acct)).then(user => {
|
this.fetch();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
this.$root.api('users/show', parseAcct(this.$route.params.user)).then(user => {
|
||||||
this.user = user;
|
this.user = user;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
|
||||||
@ -255,7 +259,6 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
|
||||||
initTl() {
|
initTl() {
|
||||||
return new Promise((res, rej) => {
|
return new Promise((res, rej) => {
|
||||||
this.$root.api('users/notes', {
|
this.$root.api('users/notes', {
|
||||||
@ -376,6 +379,7 @@ export default Vue.extend({
|
|||||||
text-shadow 0 0 8px #000
|
text-shadow 0 0 8px #000
|
||||||
|
|
||||||
> .acct
|
> .acct
|
||||||
|
display block
|
||||||
font-size 14px
|
font-size 14px
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
text-shadow 0 0 8px #000
|
text-shadow 0 0 8px #000
|
||||||
@ -383,6 +387,15 @@ export default Vue.extend({
|
|||||||
> .locked
|
> .locked
|
||||||
opacity 0.8
|
opacity 0.8
|
||||||
|
|
||||||
|
> .followed
|
||||||
|
display inline-block
|
||||||
|
font-size 12px
|
||||||
|
background rgba(0, 0, 0, 0.5)
|
||||||
|
opacity 0.7
|
||||||
|
margin-top: 2px
|
||||||
|
padding 4px
|
||||||
|
border-radius 4px
|
||||||
|
|
||||||
> .info
|
> .info
|
||||||
padding 16px
|
padding 16px
|
||||||
font-size 12px
|
font-size 12px
|
@ -9,11 +9,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])" @parentFocus="moveFocus(ids[0], $event)"/>
|
<x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])" @parentFocus="moveFocus(ids[0], $event)"/>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="temporaryColumn">
|
<router-view></router-view>
|
||||||
<x-user-column v-if="temporaryColumn.type == 'user'" :acct="temporaryColumn.acct" :key="temporaryColumn.acct"/>
|
|
||||||
<x-note-column v-else-if="temporaryColumn.type == 'note'" :note-id="temporaryColumn.noteId" :key="temporaryColumn.noteId"/>
|
|
||||||
<x-hashtag-column v-else-if="temporaryColumn.type == 'tag'" :tag="temporaryColumn.tag" :key="temporaryColumn.tag"/>
|
|
||||||
</template>
|
|
||||||
<button ref="add" @click="add" :title="$t('@deck.add-column')"><fa icon="plus"/></button>
|
<button ref="add" @click="add" :title="$t('@deck.add-column')"><fa icon="plus"/></button>
|
||||||
</div>
|
</div>
|
||||||
</mk-ui>
|
</mk-ui>
|
||||||
@ -21,20 +17,17 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XColumnCore from './deck.column-core.vue';
|
import XColumnCore from './deck.column-core.vue';
|
||||||
import Menu from '../../../../common/views/components/menu.vue';
|
import Menu from '../../../common/views/components/menu.vue';
|
||||||
import MkUserListsWindow from '../../components/user-lists-window.vue';
|
import MkUserListsWindow from '../components/user-lists-window.vue';
|
||||||
|
|
||||||
import * as uuid from 'uuid';
|
import * as uuid from 'uuid';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('deck'),
|
i18n: i18n('deck'),
|
||||||
components: {
|
components: {
|
||||||
XColumnCore,
|
XColumnCore
|
||||||
XUserColumn: () => import('./deck.user-column.vue').then(m => m.default),
|
|
||||||
XNoteColumn: () => import('./deck.note-column.vue').then(m => m.default),
|
|
||||||
XHashtagColumn: () => import('./deck.hashtag-column.vue').then(m => m.default)
|
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
@ -55,10 +48,6 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
temporaryColumn(): any {
|
|
||||||
return this.$store.state.device.deckTemporaryColumn;
|
|
||||||
},
|
|
||||||
|
|
||||||
keymap(): any {
|
keymap(): any {
|
||||||
return {
|
return {
|
||||||
't': this.focus
|
't': this.focus
|
||||||
@ -66,7 +55,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {/*
|
||||||
temporaryColumn() {
|
temporaryColumn() {
|
||||||
if (this.temporaryColumn != null) {
|
if (this.temporaryColumn != null) {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
@ -76,7 +65,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
},
|
},
|
||||||
|
|
||||||
provide() {
|
provide() {
|
||||||
@ -86,8 +75,6 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
this.$store.commit('navHook', this.onNav);
|
|
||||||
|
|
||||||
if (this.$store.state.settings.deck == null) {
|
if (this.$store.state.settings.deck == null) {
|
||||||
const deck = {
|
const deck = {
|
||||||
columns: [/*{
|
columns: [/*{
|
||||||
@ -133,8 +120,6 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
this.$store.commit('navHook', null);
|
|
||||||
|
|
||||||
document.documentElement.style.overflow = 'auto';
|
document.documentElement.style.overflow = 'auto';
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -143,39 +128,6 @@ export default Vue.extend({
|
|||||||
return this.$refs[id][0];
|
return this.$refs[id][0];
|
||||||
},
|
},
|
||||||
|
|
||||||
onNav(to) {
|
|
||||||
if (!this.$store.state.settings.deckNav) return false;
|
|
||||||
|
|
||||||
if (to.name == 'user') {
|
|
||||||
this.$store.commit('device/set', {
|
|
||||||
key: 'deckTemporaryColumn',
|
|
||||||
value: {
|
|
||||||
type: 'user',
|
|
||||||
acct: to.params.user
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
} else if (to.name == 'note') {
|
|
||||||
this.$store.commit('device/set', {
|
|
||||||
key: 'deckTemporaryColumn',
|
|
||||||
value: {
|
|
||||||
type: 'note',
|
|
||||||
noteId: to.params.note
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
} else if (to.name == 'tag') {
|
|
||||||
this.$store.commit('device/set', {
|
|
||||||
key: 'deckTemporaryColumn',
|
|
||||||
value: {
|
|
||||||
type: 'tag',
|
|
||||||
tag: to.params.tag
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add() {
|
add() {
|
||||||
this.$root.new(Menu, {
|
this.$root.new(Menu, {
|
||||||
source: this.$refs.add,
|
source: this.$refs.add,
|
@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import XColumn from './deck.column.vue';
|
import XColumn from './deck.column.vue';
|
||||||
import * as XDraggable from 'vuedraggable';
|
import * as XDraggable from 'vuedraggable';
|
||||||
import * as uuid from 'uuid';
|
import * as uuid from 'uuid';
|
@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-ui>
|
<div class="ecsvsegy" v-if="!fetching">
|
||||||
<main v-if="!fetching">
|
|
||||||
<sequential-entrance animation="entranceFromTop" delay="25">
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
<template v-for="favorite in favorites">
|
<template v-for="favorite in favorites">
|
||||||
<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
|
<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
|
||||||
@ -9,8 +8,7 @@
|
|||||||
<div class="more" v-if="existMore">
|
<div class="more" v-if="existMore">
|
||||||
<ui-button inline @click="more">{{ $t('@.load-more') }}</ui-button>
|
<ui-button inline @click="more">{{ $t('@.load-more') }}</ui-button>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</div>
|
||||||
</mk-ui>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -72,10 +70,8 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
main
|
.ecsvsegy
|
||||||
margin 0 auto
|
margin 0 auto
|
||||||
padding 16px
|
|
||||||
max-width 700px
|
|
||||||
|
|
||||||
> * > .post
|
> * > .post
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
54
src/client/app/desktop/views/home/featured.vue
Normal file
54
src/client/app/desktop/views/home/featured.vue
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<template>
|
||||||
|
<div class="glowckho" v-if="!fetching">
|
||||||
|
<sequential-entrance animation="entranceFromTop" delay="25">
|
||||||
|
<template v-for="note in notes">
|
||||||
|
<mk-note-detail class="post" :note="note" :key="note.id"/>
|
||||||
|
</template>
|
||||||
|
</sequential-entrance>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import Progress from '../../../common/scripts/loading';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
notes: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
Progress.start();
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
this.$root.api('notes/featured', {
|
||||||
|
limit: 10
|
||||||
|
}).then(notes => {
|
||||||
|
this.notes = notes;
|
||||||
|
this.fetching = false;
|
||||||
|
|
||||||
|
Progress.done();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.glowckho
|
||||||
|
margin 0 auto
|
||||||
|
|
||||||
|
> * > .post
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .more
|
||||||
|
margin 32px 16px 16px 16px
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
</style>
|
404
src/client/app/desktop/views/home/home.vue
Normal file
404
src/client/app/desktop/views/home/home.vue
Normal file
@ -0,0 +1,404 @@
|
|||||||
|
<template>
|
||||||
|
<component :is="customize ? 'mk-dummy' : 'mk-ui'" v-hotkey.global="keymap" v-if="$store.getters.isSignedIn || $route.name != 'index'">
|
||||||
|
<div class="wqsofvpm" :data-customize="customize">
|
||||||
|
<div class="customize" v-if="customize">
|
||||||
|
<a @click="done()"><fa icon="check"/>{{ $t('done') }}</a>
|
||||||
|
<div>
|
||||||
|
<div class="adder">
|
||||||
|
<p>{{ $t('add-widget') }}</p>
|
||||||
|
<select v-model="widgetAdderSelected">
|
||||||
|
<option value="profile">{{ $t('@.widgets.profile') }}</option>
|
||||||
|
<option value="analog-clock">{{ $t('@.widgets.analog-clock') }}</option>
|
||||||
|
<option value="calendar">{{ $t('@.widgets.calendar') }}</option>
|
||||||
|
<option value="timemachine">{{ $t('@.widgets.timemachine') }}</option>
|
||||||
|
<option value="activity">{{ $t('@.widgets.activity') }}</option>
|
||||||
|
<option value="rss">{{ $t('@.widgets.rss') }}</option>
|
||||||
|
<option value="trends">{{ $t('@.widgets.trends') }}</option>
|
||||||
|
<option value="photo-stream">{{ $t('@.widgets.photo-stream') }}</option>
|
||||||
|
<option value="slideshow">{{ $t('@.widgets.slideshow') }}</option>
|
||||||
|
<option value="version">{{ $t('@.widgets.version') }}</option>
|
||||||
|
<option value="broadcast">{{ $t('@.widgets.broadcast') }}</option>
|
||||||
|
<option value="notifications">{{ $t('@.widgets.notifications') }}</option>
|
||||||
|
<option value="users">{{ $t('@.widgets.users') }}</option>
|
||||||
|
<option value="polls">{{ $t('@.widgets.polls') }}</option>
|
||||||
|
<option value="post-form">{{ $t('@.widgets.post-form') }}</option>
|
||||||
|
<option value="messaging">{{ $t('@.widgets.messaging') }}</option>
|
||||||
|
<option value="memo">{{ $t('@.widgets.memo') }}</option>
|
||||||
|
<option value="hashtags">{{ $t('@.widgets.hashtags') }}</option>
|
||||||
|
<option value="posts-monitor">{{ $t('@.widgets.posts-monitor') }}</option>
|
||||||
|
<option value="server">{{ $t('@.widgets.server') }}</option>
|
||||||
|
<option value="nav">{{ $t('@.widgets.nav') }}</option>
|
||||||
|
<option value="tips">{{ $t('@.widgets.tips') }}</option>
|
||||||
|
</select>
|
||||||
|
<button @click="addWidget">{{ $t('add') }}</button>
|
||||||
|
</div>
|
||||||
|
<div class="trash">
|
||||||
|
<x-draggable v-model="trash" :options="{ group: 'x' }" @add="onTrash"></x-draggable>
|
||||||
|
<p>{{ $t('@.trash') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="main" :class="{ side: widgets.left.length == 0 || widgets.right.length == 0 }">
|
||||||
|
<template v-if="customize">
|
||||||
|
<x-draggable v-for="place in ['left', 'right']"
|
||||||
|
:list="widgets[place]"
|
||||||
|
:class="place"
|
||||||
|
:data-place="place"
|
||||||
|
:options="{ group: 'x', animation: 150 }"
|
||||||
|
@sort="onWidgetSort"
|
||||||
|
:key="place"
|
||||||
|
>
|
||||||
|
<div v-for="widget in widgets[place]" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="onWidgetContextmenu(widget.id)">
|
||||||
|
<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="desktop"/>
|
||||||
|
</div>
|
||||||
|
</x-draggable>
|
||||||
|
<div class="main">
|
||||||
|
<a @click="hint">{{ $t('@.customization-tips.title') }}</a>
|
||||||
|
<div>
|
||||||
|
<x-timeline/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div v-for="place in ['left', 'right']" :class="place">
|
||||||
|
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="desktop"/>
|
||||||
|
</div>
|
||||||
|
<div class="main">
|
||||||
|
<router-view ref="content"></router-view>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</component>
|
||||||
|
<x-welcome v-else/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
import * as XDraggable from 'vuedraggable';
|
||||||
|
import * as uuid from 'uuid';
|
||||||
|
import XWelcome from '../pages/welcome.vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('desktop/views/components/home.vue'),
|
||||||
|
components: {
|
||||||
|
XDraggable,
|
||||||
|
XWelcome
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
customize: window.location.search == '?customize',
|
||||||
|
connection: null,
|
||||||
|
widgetAdderSelected: null,
|
||||||
|
trash: [],
|
||||||
|
view: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
home(): any[] {
|
||||||
|
if (this.$store.getters.isSignedIn) {
|
||||||
|
return this.$store.state.settings.home || [];
|
||||||
|
} else {
|
||||||
|
return [{
|
||||||
|
name: 'instance',
|
||||||
|
place: 'right'
|
||||||
|
}, {
|
||||||
|
name: 'broadcast',
|
||||||
|
place: 'right',
|
||||||
|
data: {}
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
left(): any[] {
|
||||||
|
return this.home.filter(w => w.place == 'left');
|
||||||
|
},
|
||||||
|
right(): any[] {
|
||||||
|
return this.home.filter(w => w.place == 'right');
|
||||||
|
},
|
||||||
|
widgets(): any {
|
||||||
|
return {
|
||||||
|
left: this.left,
|
||||||
|
right: this.right
|
||||||
|
};
|
||||||
|
},
|
||||||
|
keymap(): any {
|
||||||
|
return {
|
||||||
|
't': this.focus
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
if (this.$store.getters.isSignedIn) {
|
||||||
|
const defaultDesktopHomeWidgets = {
|
||||||
|
left: [
|
||||||
|
'profile',
|
||||||
|
'calendar',
|
||||||
|
'activity',
|
||||||
|
'rss',
|
||||||
|
'hashtags',
|
||||||
|
'photo-stream',
|
||||||
|
'version'
|
||||||
|
],
|
||||||
|
right: [
|
||||||
|
'customize',
|
||||||
|
'broadcast',
|
||||||
|
'notifications',
|
||||||
|
'users',
|
||||||
|
'polls',
|
||||||
|
'server',
|
||||||
|
'nav',
|
||||||
|
'tips'
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
//#region Construct home data
|
||||||
|
const _defaultDesktopHomeWidgets = [];
|
||||||
|
|
||||||
|
for (const widget of defaultDesktopHomeWidgets.left) {
|
||||||
|
_defaultDesktopHomeWidgets.push({
|
||||||
|
name: widget,
|
||||||
|
id: uuid(),
|
||||||
|
place: 'left',
|
||||||
|
data: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const widget of defaultDesktopHomeWidgets.right) {
|
||||||
|
_defaultDesktopHomeWidgets.push({
|
||||||
|
name: widget,
|
||||||
|
id: uuid(),
|
||||||
|
place: 'right',
|
||||||
|
data: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
if (this.$store.state.settings.home == null) {
|
||||||
|
this.$root.api('i/update_home', {
|
||||||
|
home: _defaultDesktopHomeWidgets
|
||||||
|
}).then(() => {
|
||||||
|
this.$store.commit('settings/setHome', _defaultDesktopHomeWidgets);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.connection = this.$root.stream.useSharedConnection('main');
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
this.connection.dispose();
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
hint() {
|
||||||
|
this.$root.dialog({
|
||||||
|
title: this.$t('@.customization-tips.title'),
|
||||||
|
text: this.$t('@.customization-tips.paragraph')
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
onTlLoaded() {
|
||||||
|
this.$emit('loaded');
|
||||||
|
},
|
||||||
|
|
||||||
|
onWidgetContextmenu(widgetId) {
|
||||||
|
const w = (this.$refs[widgetId] as any)[0];
|
||||||
|
if (w.func) w.func();
|
||||||
|
},
|
||||||
|
|
||||||
|
onWidgetSort() {
|
||||||
|
this.saveHome();
|
||||||
|
},
|
||||||
|
|
||||||
|
onTrash(evt) {
|
||||||
|
this.saveHome();
|
||||||
|
},
|
||||||
|
|
||||||
|
addWidget() {
|
||||||
|
this.$store.dispatch('settings/addHomeWidget', {
|
||||||
|
name: this.widgetAdderSelected,
|
||||||
|
id: uuid(),
|
||||||
|
place: 'left',
|
||||||
|
data: {}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
saveHome() {
|
||||||
|
const left = this.widgets.left;
|
||||||
|
const right = this.widgets.right;
|
||||||
|
this.$store.commit('settings/setHome', left.concat(right));
|
||||||
|
for (const w of left) w.place = 'left';
|
||||||
|
for (const w of right) w.place = 'right';
|
||||||
|
this.$root.api('i/update_home', {
|
||||||
|
home: this.home
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
done() {
|
||||||
|
location.href = '/';
|
||||||
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
(this.$refs.content as any).focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.wqsofvpm
|
||||||
|
display block
|
||||||
|
|
||||||
|
&[data-customize]
|
||||||
|
padding-top 48px
|
||||||
|
background-image url('/assets/desktop/grid.svg')
|
||||||
|
|
||||||
|
> .main > .main
|
||||||
|
> a
|
||||||
|
display block
|
||||||
|
margin-bottom 8px
|
||||||
|
text-align center
|
||||||
|
|
||||||
|
> div
|
||||||
|
cursor not-allowed !important
|
||||||
|
|
||||||
|
> *
|
||||||
|
pointer-events none
|
||||||
|
|
||||||
|
&:not([data-customize])
|
||||||
|
> .main > *:not(.main):empty
|
||||||
|
display none
|
||||||
|
|
||||||
|
> .customize
|
||||||
|
position fixed
|
||||||
|
z-index 1000
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
height 48px
|
||||||
|
color var(--text)
|
||||||
|
background var(--desktopHeaderBg)
|
||||||
|
box-shadow 0 1px 1px rgba(#000, 0.075)
|
||||||
|
|
||||||
|
> a
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
z-index 1001
|
||||||
|
top 0
|
||||||
|
right 0
|
||||||
|
padding 0 16px
|
||||||
|
line-height 48px
|
||||||
|
text-decoration none
|
||||||
|
color var(--primaryForeground)
|
||||||
|
background var(--primary)
|
||||||
|
transition background 0.1s ease
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
background var(--primaryLighten10)
|
||||||
|
|
||||||
|
&:active
|
||||||
|
background var(--primaryDarken10)
|
||||||
|
transition background 0s ease
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 8px
|
||||||
|
|
||||||
|
> div
|
||||||
|
display flex
|
||||||
|
margin 0 auto
|
||||||
|
max-width 1220px - 32px
|
||||||
|
|
||||||
|
> div
|
||||||
|
width 50%
|
||||||
|
|
||||||
|
&.adder
|
||||||
|
> p
|
||||||
|
display inline
|
||||||
|
line-height 48px
|
||||||
|
|
||||||
|
&.trash
|
||||||
|
border-left solid 1px var(--faceDivider)
|
||||||
|
|
||||||
|
> div
|
||||||
|
width 100%
|
||||||
|
height 100%
|
||||||
|
|
||||||
|
> p
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
line-height 48px
|
||||||
|
margin 0
|
||||||
|
text-align center
|
||||||
|
pointer-events none
|
||||||
|
|
||||||
|
> .main
|
||||||
|
display flex
|
||||||
|
justify-content center
|
||||||
|
margin 0 auto
|
||||||
|
max-width 1240px
|
||||||
|
|
||||||
|
> *
|
||||||
|
.customize-container
|
||||||
|
cursor move
|
||||||
|
border-radius 6px
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
box-shadow 0 0 8px rgba(64, 120, 200, 0.3)
|
||||||
|
|
||||||
|
> *
|
||||||
|
pointer-events none
|
||||||
|
|
||||||
|
> .main
|
||||||
|
padding 16px
|
||||||
|
width calc(100% - 280px * 2)
|
||||||
|
order 2
|
||||||
|
|
||||||
|
&.side
|
||||||
|
> .main
|
||||||
|
width calc(100% - 280px)
|
||||||
|
max-width 680px
|
||||||
|
|
||||||
|
> *:not(.main)
|
||||||
|
width 280px
|
||||||
|
padding 16px 0 16px 0
|
||||||
|
|
||||||
|
> *:not(:last-child)
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .left
|
||||||
|
padding-left 16px
|
||||||
|
order 1
|
||||||
|
|
||||||
|
> .right
|
||||||
|
padding-right 16px
|
||||||
|
order 3
|
||||||
|
|
||||||
|
&.side
|
||||||
|
@media (max-width 1000px)
|
||||||
|
> *:not(.main)
|
||||||
|
display none
|
||||||
|
|
||||||
|
> .main
|
||||||
|
width 100%
|
||||||
|
max-width 700px
|
||||||
|
margin 0 auto
|
||||||
|
|
||||||
|
&:not(.side)
|
||||||
|
@media (max-width 1200px)
|
||||||
|
> *:not(.main)
|
||||||
|
display none
|
||||||
|
|
||||||
|
> .main
|
||||||
|
width 100%
|
||||||
|
max-width 700px
|
||||||
|
margin 0 auto
|
||||||
|
|
||||||
|
</style>
|
@ -1,13 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-ui>
|
<div v-if="!fetching" class="kcthdwmv">
|
||||||
<main v-if="!fetching">
|
|
||||||
<mk-note-detail :note="note"/>
|
<mk-note-detail :note="note"/>
|
||||||
<footer>
|
<footer>
|
||||||
<router-link v-if="note.next" :to="note.next"><fa icon="angle-left"/> {{ $t('next') }}</router-link>
|
<router-link v-if="note.next" :to="note.next"><fa icon="angle-left"/> {{ $t('next') }}</router-link>
|
||||||
<router-link v-if="note.prev" :to="note.prev">{{ $t('prev') }} <fa icon="angle-right"/></router-link>
|
<router-link v-if="note.prev" :to="note.prev">{{ $t('prev') }} <fa icon="angle-right"/></router-link>
|
||||||
</footer>
|
</footer>
|
||||||
</main>
|
</div>
|
||||||
</mk-ui>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -48,8 +46,7 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
main
|
.kcthdwmv
|
||||||
padding 16px
|
|
||||||
text-align center
|
text-align center
|
||||||
|
|
||||||
> footer
|
> footer
|
@ -1,11 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-ui>
|
<div>
|
||||||
<header :class="$style.header">
|
|
||||||
<h1>#{{ $route.params.tag }}</h1>
|
|
||||||
</header>
|
|
||||||
<p :class="$style.empty" v-if="!fetching && empty"><fa icon="search"/> {{ $t('no-posts-found', { q: $route.params.tag }) }}</p>
|
<p :class="$style.empty" v-if="!fetching && empty"><fa icon="search"/> {{ $t('no-posts-found', { q: $route.params.tag }) }}</p>
|
||||||
<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
|
<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
|
||||||
</mk-ui>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@ -96,17 +93,11 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.header
|
|
||||||
width 100%
|
|
||||||
max-width 600px
|
|
||||||
margin 0 auto
|
|
||||||
color #555
|
|
||||||
|
|
||||||
.notes
|
.notes
|
||||||
width 600px
|
background var(--face)
|
||||||
margin 0 auto
|
box-shadow var(--shadow)
|
||||||
border solid 1px rgba(#000, 0.075)
|
border-radius var(--round)
|
||||||
border-radius 6px
|
overflow hidden
|
||||||
overflow hidden
|
overflow hidden
|
||||||
|
|
||||||
.empty
|
.empty
|
273
src/client/app/desktop/views/home/timeline.vue
Normal file
273
src/client/app/desktop/views/home/timeline.vue
Normal file
@ -0,0 +1,273 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mk-timeline">
|
||||||
|
<mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/>
|
||||||
|
<div class="main">
|
||||||
|
<header>
|
||||||
|
<span :data-active="src == 'home'" @click="src = 'home'"><fa icon="home"/> {{ $t('home') }}</span>
|
||||||
|
<span :data-active="src == 'local'" @click="src = 'local'" v-if="enableLocalTimeline"><fa :icon="['far', 'comments']"/> {{ $t('local') }}</span>
|
||||||
|
<span :data-active="src == 'hybrid'" @click="src = 'hybrid'" v-if="enableLocalTimeline"><fa icon="share-alt"/> {{ $t('hybrid') }}</span>
|
||||||
|
<span :data-active="src == 'global'" @click="src = 'global'" v-if="enableGlobalTimeline"><fa icon="globe"/> {{ $t('global') }}</span>
|
||||||
|
<span :data-active="src == 'tag'" @click="src = 'tag'" v-if="tagTl"><fa icon="hashtag"/> {{ tagTl.title }}</span>
|
||||||
|
<span :data-active="src == 'list'" @click="src = 'list'" v-if="list"><fa icon="list"/> {{ list.title }}</span>
|
||||||
|
<div class="buttons">
|
||||||
|
<button :data-active="src == 'mentions'" @click="src = 'mentions'" :title="$t('mentions')"><fa icon="at"/><i class="badge" v-if="$store.state.i.hasUnreadMentions"><fa icon="circle"/></i></button>
|
||||||
|
<button :data-active="src == 'messages'" @click="src = 'messages'" :title="$t('messages')"><fa :icon="['far', 'envelope']"/><i class="badge" v-if="$store.state.i.hasUnreadSpecifiedNotes"><fa icon="circle"/></i></button>
|
||||||
|
<button @click="chooseTag" :title="$t('hashtag')" ref="tagButton"><fa icon="hashtag"/></button>
|
||||||
|
<button @click="chooseList" :title="$t('list')" ref="listButton"><fa icon="list"/></button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
<x-core v-if="src == 'home'" ref="tl" key="home" src="home"/>
|
||||||
|
<x-core v-if="src == 'local'" ref="tl" key="local" src="local"/>
|
||||||
|
<x-core v-if="src == 'hybrid'" ref="tl" key="hybrid" src="hybrid"/>
|
||||||
|
<x-core v-if="src == 'global'" ref="tl" key="global" src="global"/>
|
||||||
|
<x-core v-if="src == 'mentions'" ref="tl" key="mentions" src="mentions"/>
|
||||||
|
<x-core v-if="src == 'messages'" ref="tl" key="messages" src="messages"/>
|
||||||
|
<x-core v-if="src == 'tag'" ref="tl" key="tag" src="tag" :tag-tl="tagTl"/>
|
||||||
|
<mk-user-list-timeline v-if="src == 'list'" ref="tl" :key="list.id" :list="list"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
import XCore from './timeline.core.vue';
|
||||||
|
import Menu from '../../../common/views/components/menu.vue';
|
||||||
|
import MkSettingsWindow from '../components/settings-window.vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n('desktop/views/components/timeline.vue'),
|
||||||
|
components: {
|
||||||
|
XCore
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
src: 'home',
|
||||||
|
list: null,
|
||||||
|
tagTl: null,
|
||||||
|
enableLocalTimeline: false,
|
||||||
|
enableGlobalTimeline: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
watch: {
|
||||||
|
src() {
|
||||||
|
this.saveSrc();
|
||||||
|
},
|
||||||
|
|
||||||
|
list(x) {
|
||||||
|
this.saveSrc();
|
||||||
|
if (x != null) this.tagTl = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
tagTl(x) {
|
||||||
|
this.saveSrc();
|
||||||
|
if (x != null) this.list = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
this.$root.getMeta().then((meta: Record<string, any>) => {
|
||||||
|
if (!(
|
||||||
|
this.enableGlobalTimeline = !meta.disableGlobalTimeline || this.$store.state.i.isModerator || this.$store.state.i.isAdmin
|
||||||
|
) && this.src === 'global') this.src = 'local';
|
||||||
|
if (!(
|
||||||
|
this.enableLocalTimeline = !meta.disableLocalTimeline || this.$store.state.i.isModerator || this.$store.state.i.isAdmin
|
||||||
|
) && ['local', 'hybrid'].includes(this.src)) this.src = 'home';
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.$store.state.device.tl) {
|
||||||
|
this.src = this.$store.state.device.tl.src;
|
||||||
|
if (this.src == 'list') {
|
||||||
|
this.list = this.$store.state.device.tl.arg;
|
||||||
|
} else if (this.src == 'tag') {
|
||||||
|
this.tagTl = this.$store.state.device.tl.arg;
|
||||||
|
}
|
||||||
|
} else if (this.$store.state.i.followingCount == 0) {
|
||||||
|
this.src = 'hybrid';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
(this.$refs.tl as any).$once('loaded', () => {
|
||||||
|
this.$emit('loaded');
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
saveSrc() {
|
||||||
|
this.$store.commit('device/setTl', {
|
||||||
|
src: this.src,
|
||||||
|
arg: this.src == 'list' ? this.list : this.tagTl
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
(this.$refs.tl as any).focus();
|
||||||
|
},
|
||||||
|
|
||||||
|
warp(date) {
|
||||||
|
(this.$refs.tl as any).warp(date);
|
||||||
|
},
|
||||||
|
|
||||||
|
async chooseList() {
|
||||||
|
const lists = await this.$root.api('users/lists/list');
|
||||||
|
|
||||||
|
let menu = [{
|
||||||
|
icon: 'plus',
|
||||||
|
text: this.$t('add-list'),
|
||||||
|
action: () => {
|
||||||
|
this.$root.dialog({
|
||||||
|
title: this.$t('list-name'),
|
||||||
|
input: true
|
||||||
|
}).then(async ({ canceled, result: title }) => {
|
||||||
|
if (canceled) return;
|
||||||
|
const list = await this.$root.api('users/lists/create', {
|
||||||
|
title
|
||||||
|
});
|
||||||
|
|
||||||
|
this.list = list;
|
||||||
|
this.src = 'list';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
if (lists.length > 0) {
|
||||||
|
menu.push(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu = menu.concat(lists.map(list => ({
|
||||||
|
icon: 'list',
|
||||||
|
text: list.title,
|
||||||
|
action: () => {
|
||||||
|
this.list = list;
|
||||||
|
this.src = 'list';
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
|
||||||
|
this.$root.new(Menu, {
|
||||||
|
source: this.$refs.listButton,
|
||||||
|
items: menu
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
chooseTag() {
|
||||||
|
let menu = [{
|
||||||
|
icon: 'plus',
|
||||||
|
text: this.$t('add-tag-timeline'),
|
||||||
|
action: () => {
|
||||||
|
this.$root.new(MkSettingsWindow, {
|
||||||
|
initialPage: 'hashtags'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
|
||||||
|
if (this.$store.state.settings.tagTimelines.length > 0) {
|
||||||
|
menu.push(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
menu = menu.concat(this.$store.state.settings.tagTimelines.map(t => ({
|
||||||
|
icon: 'hashtag',
|
||||||
|
text: t.title,
|
||||||
|
action: () => {
|
||||||
|
this.tagTl = t;
|
||||||
|
this.src = 'tag';
|
||||||
|
}
|
||||||
|
})));
|
||||||
|
|
||||||
|
this.$root.new(Menu, {
|
||||||
|
source: this.$refs.tagButton,
|
||||||
|
items: menu
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.mk-timeline
|
||||||
|
> .form
|
||||||
|
margin-bottom 16px
|
||||||
|
box-shadow var(--shadow)
|
||||||
|
border-radius var(--round)
|
||||||
|
|
||||||
|
> .main
|
||||||
|
background var(--face)
|
||||||
|
box-shadow var(--shadow)
|
||||||
|
border-radius var(--round)
|
||||||
|
overflow hidden
|
||||||
|
|
||||||
|
> header
|
||||||
|
padding 0 8px
|
||||||
|
z-index 10
|
||||||
|
background var(--faceHeader)
|
||||||
|
box-shadow 0 var(--lineWidth) var(--desktopTimelineHeaderShadow)
|
||||||
|
|
||||||
|
> .buttons
|
||||||
|
position absolute
|
||||||
|
z-index 2
|
||||||
|
top 0
|
||||||
|
right 0
|
||||||
|
padding-right 8px
|
||||||
|
|
||||||
|
> button
|
||||||
|
padding 0 8px
|
||||||
|
font-size 0.9em
|
||||||
|
line-height 42px
|
||||||
|
color var(--faceTextButton)
|
||||||
|
|
||||||
|
> .badge
|
||||||
|
position absolute
|
||||||
|
top -4px
|
||||||
|
right 4px
|
||||||
|
font-size 10px
|
||||||
|
color var(--notificationIndicator)
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color var(--faceTextButtonHover)
|
||||||
|
|
||||||
|
&[data-active]
|
||||||
|
color var(--primary)
|
||||||
|
cursor default
|
||||||
|
|
||||||
|
&:before
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
bottom 0
|
||||||
|
left 0
|
||||||
|
width 100%
|
||||||
|
height 2px
|
||||||
|
background var(--primary)
|
||||||
|
|
||||||
|
> span
|
||||||
|
display inline-block
|
||||||
|
padding 0 10px
|
||||||
|
line-height 42px
|
||||||
|
font-size 12px
|
||||||
|
user-select none
|
||||||
|
|
||||||
|
&[data-active]
|
||||||
|
color var(--primary)
|
||||||
|
cursor default
|
||||||
|
font-weight bold
|
||||||
|
|
||||||
|
&:before
|
||||||
|
content ""
|
||||||
|
display block
|
||||||
|
position absolute
|
||||||
|
bottom 0
|
||||||
|
left -8px
|
||||||
|
width calc(100% + 16px)
|
||||||
|
height 2px
|
||||||
|
background var(--primary)
|
||||||
|
|
||||||
|
&:not([data-active])
|
||||||
|
color var(--desktopTimelineSrc)
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color var(--desktopTimelineSrcHover)
|
||||||
|
|
||||||
|
</style>
|
@ -64,6 +64,8 @@ export default Vue.extend({
|
|||||||
margin 4px
|
margin 4px
|
||||||
|
|
||||||
> img
|
> img
|
||||||
|
display inline-block
|
||||||
|
text-align center
|
||||||
width 48px
|
width 48px
|
||||||
height 48px
|
height 48px
|
||||||
vertical-align bottom
|
vertical-align bottom
|
@ -6,7 +6,7 @@
|
|||||||
<div class="user" v-for="friend in users">
|
<div class="user" v-for="friend in users">
|
||||||
<mk-avatar class="avatar" :user="friend"/>
|
<mk-avatar class="avatar" :user="friend"/>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<router-link class="name" :to="friend | userPage" v-user-preview="friend.id">{{ friend.name }}</router-link>
|
<router-link class="name" :to="friend | userPage" v-user-preview="friend.id"><mk-user-name :user="friend"/></router-link>
|
||||||
<p class="username">@{{ friend | acct }}</p>
|
<p class="username">@{{ friend | acct }}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
@ -9,12 +9,19 @@
|
|||||||
</p>
|
</p>
|
||||||
<div>
|
<div>
|
||||||
<span class="username"><mk-acct :user="user" :detail="true" /></span>
|
<span class="username"><mk-acct :user="user" :detail="true" /></span>
|
||||||
<span v-if="user.isBot" :title="$t('title')"><fa icon="robot"/></span>
|
<span v-if="user.isBot" :title="$t('is-bot')"><fa icon="robot"/></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
|
<div class="actions" v-if="$store.getters.isSignedIn">
|
||||||
|
<template v-if="$store.state.i.id != user.id">
|
||||||
|
<span class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</span>
|
||||||
|
<mk-follow-button :user="user" :inline="true" class="follow"/>
|
||||||
|
</template>
|
||||||
|
<ui-button @click="menu" ref="menu" :inline="true"><fa icon="ellipsis-h"/></ui-button>
|
||||||
|
</div>
|
||||||
<div class="description">
|
<div class="description">
|
||||||
<mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
<mfm v-if="user.description" :text="user.description" :author="user" :i="$store.state.i" :custom-emojis="user.emojis"/>
|
||||||
</div>
|
</div>
|
||||||
@ -45,6 +52,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../../i18n';
|
import i18n from '../../../../i18n';
|
||||||
import * as age from 's-age';
|
import * as age from 's-age';
|
||||||
|
import XUserMenu from '../../../../common/views/components/user-menu.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('desktop/views/pages/user/user.header.vue'),
|
i18n: i18n('desktop/views/pages/user/user.header.vue'),
|
||||||
@ -99,6 +107,13 @@ export default Vue.extend({
|
|||||||
this.$updateBanner().then(i => {
|
this.$updateBanner().then(i => {
|
||||||
this.user.bannerUrl = i.bannerUrl;
|
this.user.bannerUrl = i.bannerUrl;
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
menu() {
|
||||||
|
this.$root.new(XUserMenu, {
|
||||||
|
source: this.$refs.menu.$el,
|
||||||
|
user: this.user
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -187,6 +202,18 @@ export default Vue.extend({
|
|||||||
padding 16px 16px 16px 154px
|
padding 16px 16px 16px 154px
|
||||||
color var(--text)
|
color var(--text)
|
||||||
|
|
||||||
|
> .actions
|
||||||
|
text-align right
|
||||||
|
padding-bottom 16px
|
||||||
|
margin-bottom 16px
|
||||||
|
border-bottom solid 1px var(--faceDivider)
|
||||||
|
|
||||||
|
> *
|
||||||
|
margin-left 8px
|
||||||
|
|
||||||
|
> .follow
|
||||||
|
width 180px
|
||||||
|
|
||||||
> .fields
|
> .fields
|
||||||
margin-top 16px
|
margin-top 16px
|
||||||
|
|
@ -87,7 +87,7 @@ export default Vue.extend({
|
|||||||
> .img
|
> .img
|
||||||
flex 1 1 33%
|
flex 1 1 33%
|
||||||
width 33%
|
width 33%
|
||||||
height 80px
|
height 120px
|
||||||
background-position center center
|
background-position center center
|
||||||
background-size cover
|
background-size cover
|
||||||
background-clip content-box
|
background-clip content-box
|
109
src/client/app/desktop/views/home/user/user.vue
Normal file
109
src/client/app/desktop/views/home/user/user.vue
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<template>
|
||||||
|
<div class="xygkxeaeontfaokvqmiblezmhvhostak" v-if="!fetching">
|
||||||
|
<div class="is-suspended" v-if="user.isSuspended"><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</div>
|
||||||
|
<div class="is-remote" v-if="user.host != null"><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a></div>
|
||||||
|
<div class="main">
|
||||||
|
<x-header :user="user"/>
|
||||||
|
<mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
|
||||||
|
<x-integrations :user="user"/>
|
||||||
|
<!--<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>-->
|
||||||
|
<div class="activity">
|
||||||
|
<mk-widget-container :show-header="true" :naked="false">
|
||||||
|
<template slot="header"><fa icon="chart-bar"/>{{ $t('activity') }}</template>
|
||||||
|
<x-activity :user="user" :limit="35" style="padding: 16px;"/>
|
||||||
|
</mk-widget-container>
|
||||||
|
</div>
|
||||||
|
<x-photos :user="user"/>
|
||||||
|
<x-friends :user="user"/>
|
||||||
|
<x-followers-you-know v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
|
||||||
|
<x-timeline class="timeline" ref="tl" :user="user"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import i18n from '../../../../i18n';
|
||||||
|
import parseAcct from '../../../../../../misc/acct/parse';
|
||||||
|
import Progress from '../../../../common/scripts/loading';
|
||||||
|
import XHeader from './user.header.vue';
|
||||||
|
import XTimeline from './user.timeline.vue';
|
||||||
|
import XPhotos from './user.photos.vue';
|
||||||
|
import XFollowersYouKnow from './user.followers-you-know.vue';
|
||||||
|
import XFriends from './user.friends.vue';
|
||||||
|
import XIntegrations from './user.integrations.vue';
|
||||||
|
import XActivity from '../../../../common/views/components/activity.vue';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
i18n: i18n(),
|
||||||
|
components: {
|
||||||
|
XHeader,
|
||||||
|
XTimeline,
|
||||||
|
XPhotos,
|
||||||
|
XFollowersYouKnow,
|
||||||
|
XFriends,
|
||||||
|
XIntegrations,
|
||||||
|
XActivity
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
user: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
$route: 'fetch'
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
this.fetching = true;
|
||||||
|
Progress.start();
|
||||||
|
this.$root.api('users/show', parseAcct(this.$route.params.user)).then(user => {
|
||||||
|
this.user = user;
|
||||||
|
this.fetching = false;
|
||||||
|
Progress.done();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
warp(date) {
|
||||||
|
(this.$refs.tl as any).warp(date);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.xygkxeaeontfaokvqmiblezmhvhostak
|
||||||
|
width 100%
|
||||||
|
margin 0 auto
|
||||||
|
|
||||||
|
> .is-suspended
|
||||||
|
> .is-remote
|
||||||
|
margin-bottom 16px
|
||||||
|
padding 14px 16px
|
||||||
|
font-size 14px
|
||||||
|
box-shadow var(--shadow)
|
||||||
|
border-radius var(--round)
|
||||||
|
|
||||||
|
&.is-suspended
|
||||||
|
color var(--suspendedInfoFg)
|
||||||
|
background var(--suspendedInfoBg)
|
||||||
|
|
||||||
|
&.is-remote
|
||||||
|
color var(--remoteInfoFg)
|
||||||
|
background var(--remoteInfoBg)
|
||||||
|
|
||||||
|
> a
|
||||||
|
font-weight bold
|
||||||
|
|
||||||
|
> .main
|
||||||
|
> *
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> .timeline
|
||||||
|
box-shadow var(--shadow)
|
||||||
|
|
||||||
|
</style>
|
@ -1,112 +0,0 @@
|
|||||||
<template>
|
|
||||||
<x-column>
|
|
||||||
<span slot="header">
|
|
||||||
<fa icon="hashtag"/><span>{{ tag }}</span>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<div class="xroyrflcmhhtmlwmyiwpfqiirqokfueb">
|
|
||||||
<div ref="chart" class="chart"></div>
|
|
||||||
<x-hashtag-tl :tag-tl="tagTl" class="tl"/>
|
|
||||||
</div>
|
|
||||||
</x-column>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import XColumn from './deck.column.vue';
|
|
||||||
import XHashtagTl from './deck.hashtag-tl.vue';
|
|
||||||
import ApexCharts from 'apexcharts';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
components: {
|
|
||||||
XColumn,
|
|
||||||
XHashtagTl
|
|
||||||
},
|
|
||||||
|
|
||||||
props: {
|
|
||||||
tag: {
|
|
||||||
type: String,
|
|
||||||
required: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
computed: {
|
|
||||||
tagTl(): any {
|
|
||||||
return {
|
|
||||||
query: [[this.tag]]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
mounted() {
|
|
||||||
this.$root.api('charts/hashtag', {
|
|
||||||
tag: this.tag,
|
|
||||||
span: 'hour',
|
|
||||||
limit: 24
|
|
||||||
}).then(stats => {
|
|
||||||
const local = [];
|
|
||||||
const remote = [];
|
|
||||||
|
|
||||||
const now = new Date();
|
|
||||||
const y = now.getFullYear();
|
|
||||||
const m = now.getMonth();
|
|
||||||
const d = now.getDate();
|
|
||||||
const h = now.getHours();
|
|
||||||
|
|
||||||
for (let i = 0; i < 24; i++) {
|
|
||||||
const x = new Date(y, m, d, h - i);
|
|
||||||
local.push([x, stats.local.count[i]]);
|
|
||||||
remote.push([x, stats.remote.count[i]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const chart = new ApexCharts(this.$refs.chart, {
|
|
||||||
chart: {
|
|
||||||
type: 'area',
|
|
||||||
height: 70,
|
|
||||||
sparkline: {
|
|
||||||
enabled: true
|
|
||||||
},
|
|
||||||
},
|
|
||||||
grid: {
|
|
||||||
clipMarkers: false,
|
|
||||||
padding: {
|
|
||||||
top: 16,
|
|
||||||
right: 16,
|
|
||||||
bottom: 16,
|
|
||||||
left: 16
|
|
||||||
}
|
|
||||||
},
|
|
||||||
stroke: {
|
|
||||||
curve: 'straight',
|
|
||||||
width: 2
|
|
||||||
},
|
|
||||||
series: [{
|
|
||||||
name: 'Local',
|
|
||||||
data: local
|
|
||||||
}, {
|
|
||||||
name: 'Remote',
|
|
||||||
data: remote
|
|
||||||
}],
|
|
||||||
xaxis: {
|
|
||||||
type: 'datetime',
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
chart.render();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.xroyrflcmhhtmlwmyiwpfqiirqokfueb
|
|
||||||
background var(--deckColumnBg)
|
|
||||||
|
|
||||||
> .chart
|
|
||||||
margin-bottom 16px
|
|
||||||
background var(--face)
|
|
||||||
|
|
||||||
> .tl
|
|
||||||
background var(--face)
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,3 +0,0 @@
|
|||||||
<template>
|
|
||||||
<mk-home customize/>
|
|
||||||
</template>
|
|
@ -1,39 +0,0 @@
|
|||||||
<template>
|
|
||||||
<mk-ui>
|
|
||||||
<mk-home :mode="mode" @loaded="loaded" ref="home" v-hotkey.global="keymap"/>
|
|
||||||
</mk-ui>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import Progress from '../../../common/scripts/loading';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
props: {
|
|
||||||
mode: {
|
|
||||||
type: String,
|
|
||||||
default: 'timeline'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
keymap(): any {
|
|
||||||
return {
|
|
||||||
't': this.focus
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
document.title = this.$root.instanceName;
|
|
||||||
|
|
||||||
Progress.start();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
loaded() {
|
|
||||||
Progress.done();
|
|
||||||
},
|
|
||||||
focus() {
|
|
||||||
this.$refs.home.focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,25 +0,0 @@
|
|||||||
<template>
|
|
||||||
<component :is="page"></component>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import Home from './home.vue';
|
|
||||||
import Welcome from './welcome.vue';
|
|
||||||
import Deck from './deck/deck.vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
components: {
|
|
||||||
Home,
|
|
||||||
Deck,
|
|
||||||
Welcome
|
|
||||||
},
|
|
||||||
|
|
||||||
computed: {
|
|
||||||
page(): string {
|
|
||||||
if (!this.$store.getters.isSignedIn) return 'welcome';
|
|
||||||
return this.$store.state.device.deckDefault ? 'deck' : 'home';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,66 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="profile" v-if="$store.getters.isSignedIn">
|
|
||||||
<div class="friend-form" v-if="$store.state.i.id != user.id">
|
|
||||||
<mk-follow-button :user="user" block/>
|
|
||||||
<p class="followed" v-if="user.isFollowed">{{ $t('follows-you') }}</p>
|
|
||||||
</div>
|
|
||||||
<div class="action-form">
|
|
||||||
<ui-button @click="menu" ref="menu">{{ $t('menu') }}</ui-button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import i18n from '../../../../i18n';
|
|
||||||
import XUserMenu from '../../../../common/views/components/user-menu.vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
i18n: i18n('desktop/views/pages/user/user.profile.vue'),
|
|
||||||
props: ['user'],
|
|
||||||
|
|
||||||
methods: {
|
|
||||||
menu() {
|
|
||||||
this.$root.new(XUserMenu, {
|
|
||||||
source: this.$refs.menu.$el,
|
|
||||||
user: this.user
|
|
||||||
});
|
|
||||||
},
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.profile
|
|
||||||
background var(--face)
|
|
||||||
box-shadow var(--shadow)
|
|
||||||
border-radius var(--round)
|
|
||||||
|
|
||||||
> *:first-child
|
|
||||||
border-top none !important
|
|
||||||
|
|
||||||
> .friend-form
|
|
||||||
padding 16px
|
|
||||||
text-align center
|
|
||||||
border-bottom solid 1px var(--faceDivider)
|
|
||||||
|
|
||||||
> .followed
|
|
||||||
margin 12px 0 0 0
|
|
||||||
padding 0
|
|
||||||
text-align center
|
|
||||||
line-height 24px
|
|
||||||
font-size 0.8em
|
|
||||||
color var(--text)
|
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
> .action-form
|
|
||||||
padding 16px
|
|
||||||
text-align center
|
|
||||||
|
|
||||||
> *
|
|
||||||
width 100%
|
|
||||||
|
|
||||||
&:not(:last-child)
|
|
||||||
margin-bottom 12px
|
|
||||||
|
|
||||||
</style>
|
|
@ -1,155 +0,0 @@
|
|||||||
<template>
|
|
||||||
<mk-ui>
|
|
||||||
<div class="xygkxeaeontfaokvqmiblezmhvhostak" v-if="!fetching">
|
|
||||||
<div class="is-suspended" v-if="user.isSuspended"><fa icon="exclamation-triangle"/> {{ $t('@.user-suspended') }}</div>
|
|
||||||
<div class="is-remote" v-if="user.host != null"><fa icon="exclamation-triangle"/> {{ $t('@.is-remote-user') }}<a :href="user.url || user.uri" target="_blank">{{ $t('@.view-on-remote') }}</a></div>
|
|
||||||
<main>
|
|
||||||
<div class="main">
|
|
||||||
<x-header :user="user"/>
|
|
||||||
<mk-note-detail v-for="n in user.pinnedNotes" :key="n.id" :note="n" :compact="true"/>
|
|
||||||
<x-timeline class="timeline" ref="tl" :user="user"/>
|
|
||||||
</div>
|
|
||||||
<div class="side">
|
|
||||||
<div class="instance" v-if="!$store.getters.isSignedIn"><mk-instance/></div>
|
|
||||||
<x-profile :user="user"/>
|
|
||||||
<x-integrations :user="user"/>
|
|
||||||
<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>
|
|
||||||
<mk-activity :user="user"/>
|
|
||||||
<x-photos :user="user"/>
|
|
||||||
<x-friends :user="user"/>
|
|
||||||
<x-followers-you-know v-if="$store.getters.isSignedIn && $store.state.i.id != user.id" :user="user"/>
|
|
||||||
<div class="nav"><mk-nav/></div>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
</mk-ui>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import i18n from '../../../../i18n';
|
|
||||||
import parseAcct from '../../../../../../misc/acct/parse';
|
|
||||||
import Progress from '../../../../common/scripts/loading';
|
|
||||||
import XHeader from './user.header.vue';
|
|
||||||
import XTimeline from './user.timeline.vue';
|
|
||||||
import XProfile from './user.profile.vue';
|
|
||||||
import XPhotos from './user.photos.vue';
|
|
||||||
import XFollowersYouKnow from './user.followers-you-know.vue';
|
|
||||||
import XFriends from './user.friends.vue';
|
|
||||||
import XIntegrations from './user.integrations.vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
i18n: i18n(),
|
|
||||||
components: {
|
|
||||||
XHeader,
|
|
||||||
XTimeline,
|
|
||||||
XProfile,
|
|
||||||
XPhotos,
|
|
||||||
XFollowersYouKnow,
|
|
||||||
XFriends,
|
|
||||||
XIntegrations
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
fetching: true,
|
|
||||||
user: null
|
|
||||||
};
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
$route: 'fetch'
|
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.fetch();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
fetch() {
|
|
||||||
this.fetching = true;
|
|
||||||
Progress.start();
|
|
||||||
this.$root.api('users/show', parseAcct(this.$route.params.user)).then(user => {
|
|
||||||
this.user = user;
|
|
||||||
this.fetching = false;
|
|
||||||
Progress.done();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
warp(date) {
|
|
||||||
(this.$refs.tl as any).warp(date);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.xygkxeaeontfaokvqmiblezmhvhostak
|
|
||||||
max-width 980px
|
|
||||||
min-width 720px
|
|
||||||
padding 16px
|
|
||||||
margin 0 auto
|
|
||||||
|
|
||||||
> .is-suspended
|
|
||||||
> .is-remote
|
|
||||||
margin-bottom 16px
|
|
||||||
padding 14px 16px
|
|
||||||
font-size 14px
|
|
||||||
box-shadow var(--shadow)
|
|
||||||
border-radius var(--round)
|
|
||||||
|
|
||||||
&.is-suspended
|
|
||||||
color var(--suspendedInfoFg)
|
|
||||||
background var(--suspendedInfoBg)
|
|
||||||
|
|
||||||
&.is-remote
|
|
||||||
color var(--remoteInfoFg)
|
|
||||||
background var(--remoteInfoBg)
|
|
||||||
|
|
||||||
> a
|
|
||||||
font-weight bold
|
|
||||||
|
|
||||||
> main
|
|
||||||
display flex
|
|
||||||
justify-content center
|
|
||||||
|
|
||||||
> .main
|
|
||||||
> .side
|
|
||||||
> *:not(:last-child)
|
|
||||||
margin-bottom 16px
|
|
||||||
|
|
||||||
> .main
|
|
||||||
flex 1
|
|
||||||
min-width 0 // SEE: http://kudakurage.hatenadiary.com/entry/2016/04/01/232722
|
|
||||||
margin-right 16px
|
|
||||||
|
|
||||||
> .timeline
|
|
||||||
box-shadow var(--shadow)
|
|
||||||
|
|
||||||
> .side
|
|
||||||
width 275px
|
|
||||||
flex-shrink 0
|
|
||||||
|
|
||||||
> p
|
|
||||||
display block
|
|
||||||
margin 0
|
|
||||||
padding 0 12px
|
|
||||||
text-align center
|
|
||||||
font-size 0.8em
|
|
||||||
color var(--text)
|
|
||||||
|
|
||||||
> .instance
|
|
||||||
box-shadow var(--shadow)
|
|
||||||
border-radius var(--round)
|
|
||||||
|
|
||||||
> .nav
|
|
||||||
padding 16px
|
|
||||||
font-size 12px
|
|
||||||
color var(--text)
|
|
||||||
background var(--face)
|
|
||||||
box-shadow var(--shadow)
|
|
||||||
border-radius var(--round)
|
|
||||||
|
|
||||||
a
|
|
||||||
color var(--text)99
|
|
||||||
|
|
||||||
i
|
|
||||||
color var(--text)
|
|
||||||
|
|
||||||
</style>
|
|
21
src/client/app/desktop/views/widgets/customize.vue
Normal file
21
src/client/app/desktop/views/widgets/customize.vue
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mkw-customize">
|
||||||
|
<ui-button @click="customize()">{{ $t('@.customize-home') }}</ui-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import define from '../../../common/define-widget';
|
||||||
|
import i18n from '../../../i18n';
|
||||||
|
|
||||||
|
export default define({
|
||||||
|
name: 'customize',
|
||||||
|
}).extend({
|
||||||
|
i18n: i18n(),
|
||||||
|
methods: {
|
||||||
|
customize(date) {
|
||||||
|
location.href = '/?customize';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -9,6 +9,7 @@ import wPolls from './polls.vue';
|
|||||||
import wPostForm from './post-form.vue';
|
import wPostForm from './post-form.vue';
|
||||||
import wMessaging from './messaging.vue';
|
import wMessaging from './messaging.vue';
|
||||||
import wProfile from './profile.vue';
|
import wProfile from './profile.vue';
|
||||||
|
import wCustomize from './customize.vue';
|
||||||
|
|
||||||
Vue.component('mkw-notifications', wNotifications);
|
Vue.component('mkw-notifications', wNotifications);
|
||||||
Vue.component('mkw-timemachine', wTimemachine);
|
Vue.component('mkw-timemachine', wTimemachine);
|
||||||
@ -19,3 +20,4 @@ Vue.component('mkw-polls', wPolls);
|
|||||||
Vue.component('mkw-post-form', wPostForm);
|
Vue.component('mkw-post-form', wPostForm);
|
||||||
Vue.component('mkw-messaging', wMessaging);
|
Vue.component('mkw-messaging', wMessaging);
|
||||||
Vue.component('mkw-profile', wProfile);
|
Vue.component('mkw-profile', wProfile);
|
||||||
|
Vue.component('mkw-customize', wCustomize);
|
||||||
|
@ -350,7 +350,7 @@ if (localStorage.getItem('should-refresh') == 'true') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MiOSを初期化してコールバックする
|
// MiOSを初期化してコールバックする
|
||||||
export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void, sw = false) => {
|
export default (callback: (launch: (router: VueRouter) => [Vue, MiOS], os: MiOS) => void, sw = false) => {
|
||||||
const os = new MiOS(sw);
|
const os = new MiOS(sw);
|
||||||
|
|
||||||
os.init(() => {
|
os.init(() => {
|
||||||
@ -436,11 +436,6 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
|
|||||||
});
|
});
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// Navigation hook
|
|
||||||
router.beforeEach((to, from, next) => {
|
|
||||||
next(os.store.state.navHook && os.store.state.navHook(to) ? false : undefined);
|
|
||||||
});
|
|
||||||
|
|
||||||
document.addEventListener('visibilitychange', () => {
|
document.addEventListener('visibilitychange', () => {
|
||||||
if (!document.hidden) {
|
if (!document.hidden) {
|
||||||
os.store.commit('clearBehindNotes');
|
os.store.commit('clearBehindNotes');
|
||||||
@ -507,6 +502,6 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS]) => void,
|
|||||||
return [app, os] as [Vue, MiOS];
|
return [app, os] as [Vue, MiOS];
|
||||||
};
|
};
|
||||||
|
|
||||||
callback(launch);
|
callback(launch, os);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -12,7 +12,6 @@ import init from '../init';
|
|||||||
|
|
||||||
import MkIndex from './views/pages/index.vue';
|
import MkIndex from './views/pages/index.vue';
|
||||||
import MkSignup from './views/pages/signup.vue';
|
import MkSignup from './views/pages/signup.vue';
|
||||||
import MkUser from './views/pages/user.vue';
|
|
||||||
import MkSelectDrive from './views/pages/selectdrive.vue';
|
import MkSelectDrive from './views/pages/selectdrive.vue';
|
||||||
import MkDrive from './views/pages/drive.vue';
|
import MkDrive from './views/pages/drive.vue';
|
||||||
import MkNotifications from './views/pages/notifications.vue';
|
import MkNotifications from './views/pages/notifications.vue';
|
||||||
@ -134,6 +133,7 @@ init((launch) => {
|
|||||||
{ path: '/selectdrive', component: MkSelectDrive },
|
{ path: '/selectdrive', component: MkSelectDrive },
|
||||||
{ path: '/search', component: MkSearch },
|
{ path: '/search', component: MkSearch },
|
||||||
{ path: '/tags/:tag', component: MkTag },
|
{ path: '/tags/:tag', component: MkTag },
|
||||||
|
{ path: '/featured', name: 'featured', component: () => import('./views/pages/featured.vue').then(m => m.default) },
|
||||||
{ path: '/share', component: MkShare },
|
{ path: '/share', component: MkShare },
|
||||||
{ path: '/games/reversi/:game?', name: 'reversi', component: MkReversi },
|
{ path: '/games/reversi/:game?', name: 'reversi', component: MkReversi },
|
||||||
{ path: '/@:user', component: () => import('./views/pages/user.vue').then(m => m.default) },
|
{ path: '/@:user', component: () => import('./views/pages/user.vue').then(m => m.default) },
|
||||||
|
@ -124,6 +124,7 @@ export default Vue.extend({
|
|||||||
color #222
|
color #222
|
||||||
|
|
||||||
> [data-icon]
|
> [data-icon]
|
||||||
|
box-sizing initial
|
||||||
padding 10px
|
padding 10px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']" fixed-width/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']" fixed-width/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']" fixed-width/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']" fixed-width/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']" fixed-width/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']" fixed-width/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
|
<li><router-link to="/featured" :data-active="$route.name == 'featured'"><i><fa :icon="faNewspaper" fixed-width/></i>{{ $t('@.featured-notes') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||||
<li><router-link to="/games/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad" fixed-width/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
<li><router-link to="/games/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad" fixed-width/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
@ -50,6 +51,7 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../../i18n';
|
import i18n from '../../../i18n';
|
||||||
import { lang } from '../../../config';
|
import { lang } from '../../../config';
|
||||||
|
import { faNewspaper } from '@fortawesome/free-solid-svg-icons';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
i18n: i18n('mobile/views/components/ui.nav.vue'),
|
i18n: i18n('mobile/views/components/ui.nav.vue'),
|
||||||
@ -62,6 +64,7 @@ export default Vue.extend({
|
|||||||
aboutUrl: `/docs/${lang}/about`,
|
aboutUrl: `/docs/${lang}/about`,
|
||||||
announcements: [],
|
announcements: [],
|
||||||
searching: false,
|
searching: false,
|
||||||
|
faNewspaper
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<mk-user-name :user="user"/>
|
<mk-user-name :user="user"/>
|
||||||
</a>
|
</a>
|
||||||
<p class="username"><mk-acct :user="user"/></p>
|
<p class="username"><mk-acct :user="user"/></p>
|
||||||
<mk-follow-button class="follow-button" :user="user"/>
|
<mk-follow-button v-if="$store.getters.isSignedIn && user.id != $store.state.i.id" class="follow-button" :user="user"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user