Compare commits

...

101 Commits

Author SHA1 Message Date
631091940b Merge branch 'develop' 2021-04-18 23:25:55 +09:00
53d257ef0f 12.77.1 2021-04-18 23:25:46 +09:00
9e012dbc1a New Crowdin updates (#7452)
* New translations ja-JP.yml (Korean)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Korean)

* New translations reaction.md (Korean)

* New translations reversi-bot.md (Korean)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (German)

* New translations ja-JP.yml (English)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)

* New translations ja-JP.yml (French)
2021-04-18 23:24:33 +09:00
7da5eead8a Resolve #7457 2021-04-18 22:51:35 +09:00
f984f56459 精度を高めるためストリーミング接続中に定期的にlastActiveDateを更新するように 2021-04-18 22:35:47 +09:00
203799871c Update yarn.lock 2021-04-18 16:36:01 +09:00
ad826bf088 update MFM (#7456) 2021-04-18 16:35:34 +09:00
e81c466d74 fix #7454 2021-04-18 16:35:22 +09:00
e04d866b20 Tweak UI 2021-04-18 14:29:31 +09:00
d7a042b95d Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2021-04-18 11:55:46 +09:00
5c51185388 refactoring 2021-04-18 11:55:44 +09:00
926266c7af fix style 2021-04-18 11:55:38 +09:00
1bcf123dd5 update secret message 2021-04-18 11:16:57 +09:00
7c26fbbb2e New Crowdin updates (#7451)
* New translations ja-JP.yml (English)

* New translations theme.md (English)

* New translations ja-JP.yml (Ukrainian)

* New translations ja-JP.yml (Chinese Traditional)

* New translations theme.md (Chinese Simplified)

* New translations ja-JP.yml (Chinese Simplified)

* New translations ja-JP.yml (Japanese, Kansai)

* New translations mfm.md (Czech)

* New translations timelines.md (Czech)

* New translations theme.md (Czech)

* New translations reaction.md (Czech)

* New translations pages.md (Czech)

* New translations mute.md (Czech)

* New translations follow.md (Czech)

* New translations ja-JP.yml (Italian)

* New translations theme.md (German)

* New translations ja-JP.yml (German)

* New translations keyboard-shortcut.md (Czech)

* New translations custom-emoji.md (Czech)

* New translations ja-JP.yml (Spanish)

* New translations theme.md (French)

* New translations stream.md (French)

* New translations reversi-bot.md (French)

* New translations create-plugin.md (Czech)

* New translations aiscript.md (Czech)

* New translations ja-JP.yml (Czech)

* New translations ja-JP.yml (Arabic)

* New translations ja-JP.yml (Polish)

* New translations ja-JP.yml (Russian)

* New translations mute.md (Korean)

* New translations keyboard-shortcut.md (Korean)

* New translations follow.md (Korean)

* New translations custom-emoji.md (Korean)

* New translations create-plugin.md (Korean)

* New translations api.md (Korean)

* New translations ja-JP.yml (Korean)

* New translations reaction.md (Korean)

* New translations pages.md (Korean)

* New translations reversi-bot.md (Korean)

* New translations stream.md (Korean)

* New translations deck.md (Korean)

* New translations timelines.md (Korean)

* New translations theme.md (Korean)
2021-04-18 00:23:38 +09:00
938fcb3e5e Merge branch 'develop' 2021-04-18 00:07:33 +09:00
3553f3be4e 12.77.0 2021-04-18 00:07:20 +09:00
8c4662e6e5 Improve tooltip behaviour 2021-04-17 23:53:05 +09:00
e7610b2467 display online status 2021-04-17 23:52:54 +09:00
79e60afd42 Update Dockerfile 2021-04-17 18:37:10 +09:00
3da93e7bf9 Create .yarnrc 2021-04-17 17:35:44 +09:00
1700154f00 Update package.json 2021-04-17 15:34:19 +09:00
68571d8f57 Implement user online status
Resolve #7422
Fix #7424
2021-04-17 15:30:26 +09:00
61461b7f59 Improve client 2021-04-17 14:06:32 +09:00
c27c3817a9 Tweak UI 2021-04-17 11:40:47 +09:00
08e1db45a9 Improve client 2021-04-17 11:29:44 +09:00
27c373ddf4 Tweak UI 2021-04-17 00:12:50 +09:00
e62d7bc1ba Tweak UI 2021-04-16 23:26:01 +09:00
0d680b060e Tweak UI 2021-04-16 23:19:39 +09:00
0f054aed88 Tweak UI 2021-04-16 23:04:25 +09:00
b4308ecb91 Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2021-04-16 21:47:15 +09:00
e68ff28649 Improve client 2021-04-16 21:47:12 +09:00
cb946772b4 Update package.json 2021-04-16 18:34:56 +09:00
f169585a55 Tweak style 2021-04-16 17:52:45 +09:00
e5fbc68e0e 詳細ユーザー情報ページなど 2021-04-16 17:34:06 +09:00
f32cad2667 Tweak UI 2021-04-16 15:44:17 +09:00
503f23ad3b Tweak UI 2021-04-16 12:17:22 +09:00
481b46ac9e Tweak UI 2021-04-16 12:06:54 +09:00
9c34ef7d74 Improve UI 2021-04-16 09:41:56 +09:00
18fbaee9df fix 2021-04-16 09:05:32 +09:00
94b59e8b6f update commander 2021-04-16 09:03:17 +09:00
e9c5cd543e update dependencies 2021-04-16 08:51:38 +09:00
5e1d17dff2 Merge branch 'develop' 2021-04-16 00:21:56 +09:00
526838c77c 12.76.1 2021-04-16 00:21:46 +09:00
ef6b370d0e Improve usability 2021-04-16 00:13:20 +09:00
38896205c8 fix bug 2021-04-15 23:49:05 +09:00
7221684337 Improve usability 2021-04-15 23:38:34 +09:00
99e936bf2b Tweak style 2021-04-15 23:34:12 +09:00
138fee9b52 fix theme 2021-04-15 23:27:33 +09:00
a19c1535e8 タイトルバー非表示オプション削除 2021-04-15 23:27:28 +09:00
05ba1d0fd4 fix style 2021-04-15 20:55:54 +09:00
c2b3436770 better list rendering 2021-04-15 20:26:02 +09:00
a0fd3aef98 update mfm-js 2021-04-15 20:25:32 +09:00
b112341d91 🎨 2021-04-15 18:02:55 +09:00
0dba5607a8 refactor 2021-04-15 17:36:09 +09:00
7378c4a9d8 fix #7444 2021-04-15 12:37:58 +09:00
89e7ef36dc Update yarn.lock 2021-04-15 12:37:32 +09:00
39ed02bc53 apply hotfix of MFM parser (#7446) 2021-04-15 12:10:16 +09:00
449dc17df8 Merge branch 'develop' 2021-04-14 16:39:53 +09:00
5cb3d86a1b 12.76.0 2021-04-14 16:39:38 +09:00
a3687dd653 theme description 2021-04-14 16:24:07 +09:00
fbc5b8ceb7 fix bug 2021-04-14 15:49:48 +09:00
4c545fbba5 refactor 2021-04-14 15:35:04 +09:00
7fda726bbe Tweak UI 2021-04-14 14:12:29 +09:00
e404e5e2de Tweak UI 2021-04-14 03:34:56 +09:00
930127348a Tweak UI 2021-04-14 03:23:29 +09:00
3db37e1d52 Tweak UI 2021-04-14 02:12:46 +09:00
b9c4a582ac Tweak UI 2021-04-14 01:41:49 +09:00
a085d9fbd7 Revert "Improve performance" (#7441)
This reverts commit 1dbce5e3e2.
2021-04-13 16:00:40 +09:00
7f2356ba4b Tweak UI 2021-04-13 12:43:19 +09:00
7a7f668879 fix bug 2021-04-13 01:59:18 +09:00
69a05aa5de Merge branch 'develop' of https://github.com/misskey-dev/misskey into develop 2021-04-12 23:14:00 +09:00
c0c64a2d5d Tweak UI 2021-04-12 23:13:58 +09:00
3c3b4eb2af Fix undefined user page title (#7436) 2021-04-12 23:07:12 +09:00
1019e0bcfd Add prop validations in MkAcct (#7439) 2021-04-12 23:04:10 +09:00
faf2c007aa fix bug 2021-04-12 22:07:32 +09:00
43678ac801 Tweak UI 2021-04-12 14:16:30 +09:00
f22d5aa46d Tweak UI 2021-04-12 13:20:04 +09:00
d599c1e740 Tweak UI 2021-04-12 13:06:00 +09:00
0cc4519fc0 Tweak UI 2021-04-12 00:14:27 +09:00
0265c85ba3 full view 2021-04-12 00:05:13 +09:00
7ec0670748 Tweak UI 2021-04-11 23:49:13 +09:00
d06517265f Tweak UI 2021-04-11 21:31:38 +09:00
a88e486468 Tweak UI 2021-04-11 21:09:35 +09:00
c22ff4c556 Resolve #7425 2021-04-11 12:42:48 +09:00
d4c4e30fe4 Tweak UI 2021-04-11 12:31:24 +09:00
1ec3338d2e update mfm.js (#7435)
* use mfm.js 0.14.0

* use mfm.extract

* use mfm.extract

* use mfm.extract
2021-04-11 00:18:29 +09:00
bffcfd92da Tweak UI 2021-04-11 00:03:31 +09:00
f44517f4af Tweak UI 2021-04-10 23:52:45 +09:00
5087a5af21 Tweak UI 2021-04-10 18:17:42 +09:00
3a6331693a refactor mfm extract (#7434)
* refactor extractCustomEmojisFromMfm()

* refactor extract-hashtags

* refactor extract-mentions

* refactor extract-hashtags

* refactor extract-url-from-mfm

* refactor extract-mentions
2021-04-10 17:50:18 +09:00
56a28923ca Tweak UI 2021-04-10 14:37:29 +09:00
fb8ed718ce Improve UI 2021-04-10 13:38:24 +09:00
45e5d89353 refactor(client): Use symbol 2021-04-10 12:54:12 +09:00
d3fe02fb3e Default UI redesign (#7429)
* wip

* wip

* wip

* wip

* Update default.sidebar.vue

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update sticky-sidebar.ts

* wip

* wip

* Update messaging-room.form.vue

* Update timeline.vue
2021-04-10 12:40:50 +09:00
7d2126e2b2 Fix punycode deprecation warning (#7426) 2021-04-04 13:00:39 +09:00
1f4ae2f63a Use mfm-js for MFM parsing (#7415)
* wip

* Update mfm.ts

* wip

* update mfmjs

* refactor

* nanka

* Update mfm.ts

* Update to-html.ts

* Update to-html.ts

* wip

* fix test

* fix test
2021-04-02 10:36:11 +09:00
b378066ebf tweak avatar generation 2021-04-02 10:00:05 +09:00
2210d1053a Update vue 2021-03-27 11:08:15 +09:00
bb6cd258f3 syuilo/misskey --> misskey-dev/misskey 2021-03-24 12:23:05 +09:00
b5adb02eb8 Update 01_bug-report.md 2021-03-24 12:01:37 +09:00
8b702bcfa0 Update README.md 2021-03-24 11:57:12 +09:00
345 changed files with 7484 additions and 4634 deletions

View File

@ -7,6 +7,11 @@ assignees: ''
--- ---
<!--
Thanks for reporting!
First, in order to avoid duplicate Issues, please search to see if the problem you found has already been reported.
-->
## 💡 Summary ## 💡 Summary
<!-- Tell us what the bug is --> <!-- Tell us what the bug is -->

1
.yarnrc Normal file
View File

@ -0,0 +1 @@
network-timeout 600000

View File

@ -1 +1 @@
see [releases](https://github.com/syuilo/misskey/releases) see [releases](https://github.com/misskey-dev/misskey/releases)

View File

@ -8,7 +8,7 @@
- 温度感高めで見てほしいものは責付いてください。 - 温度感高めで見てほしいものは責付いてください。
## Issues ## Issues
Feature suggestions and bug reports are filed in https://github.com/syuilo/misskey/issues . Feature suggestions and bug reports are filed in https://github.com/misskey-dev/misskey/issues .
* Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one. * Please search existing issues to avoid duplication. If your issue is already filed, please add your reaction or comment to the existing one.
* If you have multiple independent issues, please submit them separately. * If you have multiple independent issues, please submit them separately.

View File

@ -22,7 +22,7 @@ RUN apk add --no-cache \
vips-dev \ vips-dev \
vips vips
COPY package.json yarn.lock ./ COPY package.json yarn.lock .yarnrc ./
RUN yarn install RUN yarn install
COPY . ./ COPY . ./
RUN yarn build RUN yarn build

View File

@ -4,8 +4,8 @@
<div align="center"> <div align="center">
[![CircleCI](https://img.shields.io/circleci/project/github/syuilo/misskey.svg?style=for-the-badge&logo=circleci)](https://circleci.com/gh/syuilo/misskey) [![CircleCI](https://img.shields.io/circleci/project/github/misskey-dev/misskey.svg?style=for-the-badge&logo=circleci)](https://circleci.com/gh/misskey-dev/misskey)
[![Dependencies](https://img.shields.io/david/syuilo/misskey.svg?style=for-the-badge&logo=npm)](https://david-dm.org/syuilo/misskey) [![Dependencies](https://img.shields.io/david/misskey-dev/misskey.svg?style=for-the-badge&logo=npm)](https://david-dm.org/misskey-dev/misskey)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge&logo=github)](http://makeapullrequest.com) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge&logo=github)](http://makeapullrequest.com)
[![Awesome Humane Tech](https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true)](https://github.com/humanetech-community/awesome-humane-tech) [![Awesome Humane Tech](https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true)](https://github.com/humanetech-community/awesome-humane-tech)
@ -22,11 +22,16 @@ Why don't you take a short break from the hustle and bustle of the city, and div
--- ---
Do you have a question? Or are you experiencing trouble?
Visit [our forum](https://forum.misskey.io/)!
---
![](https://ja.mstdn.wiki/images/e/ed/Deck.jpg) ![](https://ja.mstdn.wiki/images/e/ed/Deck.jpg)
:sparkles: Features :sparkles: Features
---------------------------------------------------------------- ----------------------------------------------------------------
<a href="https://xn--931a.moe/"><img src="https://github.com/syuilo/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a> <a href="https://xn--931a.moe/"><img src="https://github.com/misskey-dev/misskey/blob/develop/assets/ai-orig.png?raw=true" align="right" height="320px"/></a>
<h3>Posting</h3> <h3>Posting</h3>
<p> <p>

View File

@ -12,13 +12,13 @@ This guide describes how to install and setup Misskey with Docker.
---------------------------------------------------------------- ----------------------------------------------------------------
1. Clone Misskey repository's master branch. 1. Clone Misskey repository's master branch.
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
2. Move to misskey directory. 2. Move to misskey directory.
`cd misskey` `cd misskey`
3. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) tag. 3. Checkout to the [latest release](https://github.com/misskey-dev/misskey/releases/latest) tag.
`git checkout master` `git checkout master`

View File

@ -13,13 +13,13 @@ Ce guide explique comment installer et configurer Misskey avec Docker.
---------------------------------------------------------------- ----------------------------------------------------------------
1. Clone le dépôt de Misskey sur la branche master. 1. Clone le dépôt de Misskey sur la branche master.
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
2. Naviguez dans le dossier du dépôt. 2. Naviguez dans le dossier du dépôt.
`cd misskey` `cd misskey`
3. Checkout sur le tag de la [dernière version](https://github.com/syuilo/misskey/releases/latest). 3. Checkout sur le tag de la [dernière version](https://github.com/misskey-dev/misskey/releases/latest).
`git checkout master` `git checkout master`

View File

@ -12,13 +12,13 @@ Dockerを使ったMisskey構築方法
---------------------------------------------------------------- ----------------------------------------------------------------
1. masterブランチからMisskeyレポジトリをクローン 1. masterブランチからMisskeyレポジトリをクローン
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
2. misskeyディレクトリに移動 2. misskeyディレクトリに移動
`cd misskey` `cd misskey`
3. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 3. [最新のリリース](https://github.com/misskey-dev/misskey/releases/latest)を確認
`git checkout master` `git checkout master`

View File

@ -12,13 +12,13 @@ Docker 部署指南
---------------------------------------------------------------- ----------------------------------------------------------------
1. 克隆 Misskey 项目的 master 分支。 1. 克隆 Misskey 项目的 master 分支。
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
2. 进入 misskey 文件夹。 2. 进入 misskey 文件夹。
`cd misskey` `cd misskey`
3. 检查 [最新发布版](https://github.com/syuilo/misskey/releases/latest) 标签。 3. 检查 [最新发布版](https://github.com/misskey-dev/misskey/releases/latest) 标签。
`git checkout master` `git checkout master`

View File

@ -40,13 +40,13 @@ Please install and setup these softwares:
2. Clone the misskey repo from master branch. 2. Clone the misskey repo from master branch.
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
3. Navigate to misskey directory 3. Navigate to misskey directory
`cd misskey` `cd misskey`
4. Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest) 4. Checkout to the [latest release](https://github.com/misskey-dev/misskey/releases/latest)
`git checkout master` `git checkout master`

View File

@ -41,13 +41,13 @@ Installez les paquets suivants :
2. Clonez la branche master du dépôt misskey. 2. Clonez la branche master du dépôt misskey.
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
3. Accédez au dossier misskey. 3. Accédez au dossier misskey.
`cd misskey` `cd misskey`
4. Checkout sur le tag de la [version la plus récente](https://github.com/syuilo/misskey/releases/latest) 4. Checkout sur le tag de la [version la plus récente](https://github.com/misskey-dev/misskey/releases/latest)
`git checkout master` `git checkout master`

View File

@ -42,13 +42,13 @@ adduser --disabled-password --disabled-login misskey
2. masterブランチからMisskeyレポジトリをクローン 2. masterブランチからMisskeyレポジトリをクローン
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
3. misskeyディレクトリに移動 3. misskeyディレクトリに移動
`cd misskey` `cd misskey`
4. [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認 4. [最新のリリース](https://github.com/misskey-dev/misskey/releases/latest)を確認
`git checkout master` `git checkout master`

View File

@ -40,13 +40,13 @@ adduser --disabled-password --disabled-login misskey
2. 克隆 Misskey 项目的 master 分支。 2. 克隆 Misskey 项目的 master 分支。
`git clone -b master git://github.com/syuilo/misskey.git` `git clone -b master git://github.com/misskey-dev/misskey.git`
3. 进入 misskey 文件夹。 3. 进入 misskey 文件夹。
`cd misskey` `cd misskey`
4. 检查 [最新发布版](https://github.com/syuilo/misskey/releases/latest) 标签。 4. 检查 [最新发布版](https://github.com/misskey-dev/misskey/releases/latest) 标签。
`git checkout master` `git checkout master`

View File

@ -1,6 +1,6 @@
# **DO NOT edit locale files** except `ja-JP.yml`. # **DO NOT edit locale files** except `ja-JP.yml`.
When you add text to the ja-JP file (of syuilo/misskey), it will automatically be applied to other language files. When you add text to the ja-JP file (of misskey-dev/misskey), it will automatically be applied to other language files.
Translations added in ja-JP file should contain the original Japanese strings. Translations added in ja-JP file should contain the original Japanese strings.
Please see [Contribution guide](../CONTRIBUTING.md) for more information. Please see [Contribution guide](../CONTRIBUTING.md) for more information.

View File

@ -429,6 +429,7 @@ latestVersion: "آخر نسخة مستقرة"
usageAmount: "الإستخدام" usageAmount: "الإستخدام"
capacity: "السعة" capacity: "السعة"
inUse: "مستخدم" inUse: "مستخدم"
info: "عن"
_email: _email:
_follow: _follow:
title: "يتابعك" title: "يتابعك"

View File

@ -1,2 +1,375 @@
--- ---
_lang_: "Čeština" _lang_: "Čeština"
introMisskey: "Vítejte! Misskey je otevřený a decentralizovaný microblogový servis.\n\"Poznámkami\" můžete sdílet co se zrovna děje se všemi ve Vašem okolí. 📡\nPomocí \"reakcí\" můžete sdílet své názory a pocity na ostatní poznámky. 👍\nPojďte objevovat nový svět! 🚀"
monthAndDay: "{day}. {month}."
search: "Vyhledávání"
notifications: "Oznámení"
username: "Uživatelské jméno"
password: "Heslo"
fetchingAsApObject: "Načítám data z Fediversu..."
ok: "Potvrdit"
gotIt: "Rozumím!"
cancel: "Zrušit"
enterUsername: "Zadej uživatelské jméno"
renotedBy: "{user} přeposla/a"
noNotes: "Žádné poznámky"
noNotifications: "Žádná oznámení"
instance: "Instance"
settings: "Nastavení"
basicSettings: "Obecná nastavení"
otherSettings: "Rozšířená nastavení"
openInWindow: "Otevřít v novém okně"
profile: "Váš profil"
timeline: "Časová osa"
noAccountDescription: "Tento uživatel zatím nenapsal svou biografii."
login: "Přihlásit se"
loggingIn: "Probíhá přihlašování"
logout: "Odhlásit"
signup: "Registrace"
uploading: "Nahrávám"
save: "Uložit"
users: "Uživatelé"
addUser: "Přidat uživatele"
favorite: "Oblíbené"
favorites: "Oblíbené"
unfavorite: "Odebrat z oblízených"
favorited: "Přidáno do oblíbených"
alreadyFavorited: "Už je mezi oblíbenými"
cantFavorite: "Nepodařilo se přidat mezi oblíbené."
pin: "Připnout"
unpin: "Odepnout"
copyContent: "Zkopírovat obsah"
copyLink: "Kopírovat odkaz"
delete: "Smazat"
deleteAndEdit: "Smazat a upravit"
deleteAndEditConfirm: "Jste si jistí že chcete smazat tuto poznámku a editovat ji? Ztratíte tím všechny reakce, sdílení a odpovědi na ni."
addToList: "Přidat do seznamu"
sendMessage: "Odeslat zprávu"
copyUsername: "Kopírovat uživatelské jméno"
searchUser: "Vyhledat uživatele"
reply: "Odpovědět"
loadMore: "Zobrazit více"
showMore: "Zobrazit více"
mention: "Zmínění"
mentions: "Zmínění"
importAndExport: "Import a export"
import: "Importovat"
export: "Exportovat"
files: "Soubor(ů)"
download: "Stáhnout"
unfollowConfirm: "Jste si jisti že už nechcete sledovat {name}?"
importRequested: "Požádali jste o export. To může chvilku trvat."
lists: "Seznamy"
noLists: "Nemáte žádné seznamy"
note: "Poznámka"
notes: "Poznámky"
following: "Sledovaní"
followers: "Sledující"
followsYou: "Sledují vás"
createList: "Vytvořit seznam"
manageLists: "Spravovat seznam"
error: "Chyba"
somethingHappened: "Jejda. Něco se nepovedlo."
retry: "Opakovat"
pageLoadError: "Nepodařilo se načíst stránku"
follow: "Sledovaní"
unfollow: "Přestat sledovat"
renote: "Přeposlat"
cantReRenote: "Odpověď nemůže být odstraněna."
quote: "Citovat"
pinned: "Připnout"
you: "Vy"
clickToShow: "Klikněte pro zobrazení"
sensitive: "NSFW"
add: "Přidat"
reaction: "Reakce"
reactionSettingDescription: "Vyberte Vaší oblíbenou reakci, kterou chcete připnout ve výběru."
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
attachCancel: "Odstranit přílohu"
markAsSensitive: "Označit jako NSFW"
unmarkAsSensitive: "Odznačit jako NSFW"
enterFileName: "Zadejte název souboru"
mute: "Ztlumit"
unmute: "Odmlčet"
block: "Zablokovat"
unblock: "Odblokovat"
suspend: "Zmrazit"
unsuspend: "Odmrazit"
blockConfirm: "Jste si jistí že chcete zablokovat tento účet?"
unblockConfirm: "Jste si jistí že chcete odblokovat tento účet?"
suspendConfirm: "Jste si jistí že chcete suspendovat tenhle účet?"
unsuspendConfirm: "Jste si jistí že chcete obnovit tenhle účet?"
selectList: "Vybrat seznam"
selectAntenna: "Vyberte Anténu"
selectWidget: "Zvolte widget"
editWidgets: "Upravit widget"
editWidgetsExit: "Hotovo"
customEmojis: "Vlastní emoji"
emoji: "Emoji"
emojiName: "Jméno emoji"
emojiUrl: "URL obrázku"
addEmoji: "Přidat emoji"
settingGuide: "Doporučené nastavení"
flagAsBot: "Tento účet je bot"
flagAsBotDescription: "Pokud je tento účet kontrolován programem zaškrtněte tuto možnost. To označí tento účet jako bot pro ostatní vývojáře a zabrání tak nekonečným interakcím s ostatními boty a upraví Misskey systém aby se choval k tomuhle účtu jako bot."
flagAsCat: "Tenhle účet je kočka"
flagAsCatDescription: "Vyberte tuto možnost aby tento účet byl označen jako kočka."
autoAcceptFollowed: "Automaticky akceptovat následování od účtů které sledujete"
addAcount: "Přidat účet"
loginFailed: "Přihlášení se nezdařilo."
general: "Obecně"
wallpaper: "Obrázek na pozadí"
setWallpaper: "Nastavení obrázku na pozadí"
removeWallpaper: "Odstranit pozadí"
selectUser: "Vyberte uživatele"
recipient: "Pro"
annotation: "Komentáře"
instances: "Instance"
registeredAt: "Registrován"
latestRequestSentAt: "Poslední požadavek poslán"
latestRequestReceivedAt: "Poslední požadavek přijat"
latestStatus: "Poslední status"
storageUsage: "Využití úložiště"
charts: "Grafy"
perHour: "za hodinu"
perDay: "za den"
blockThisInstance: "Blokovat tuto instanci"
operations: "Operace"
software: "Software"
version: "Verze"
metadata: "Metadata"
jobQueue: "Fronta úloh"
cpuAndMemory: "CPU a paměť"
network: "Síť"
disk: "Disk"
instanceInfo: "Informace o instanci"
statistics: "Statistiky"
clearQueue: "Vyčistit frontu"
clearQueueConfirmTitle: "Jste si jisti že zrušit všechny úlohy ve frontě?"
clearCachedFiles: "Vyprázdnit mezipaměť"
blockedInstances: "Blokované instance"
pinLimitExceeded: "Nemůžete připnout další poznámky."
intro: "Instalace Misskey byla dokončena! Prosím vytvořte admina."
done: "Hotovo"
processing: "Zpracovávám"
preview: "Náhled"
default: "Výchozí"
blocked: "Blokováno"
suspended: "Suspendováno"
all: "Vše"
subscribing: "Odebíráte"
publishing: "Publikuji"
notResponding: "Neodpovídá"
instanceFollowers: "Následovníci na instanci"
instanceUsers: "Uživatelé této instance"
changePassword: "Změnit heslo"
security: "Zabezpečení"
currentPassword: "Současné heslo"
newPassword: "Nové heslo"
newPasswordRetype: "Nové heslo (znovu)"
attachFile: "Přiložit soubor"
more: "Více!"
usernameOrUserId: "Uživatelské jméno nebo uživatelské id"
noSuchUser: "Uživatel nebyl nalezen"
announcements: "Oznámení"
imageUrl: "URL obrázku"
remove: "Smazat"
removed: "Smazáno"
removeAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?"
deleteAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?"
resetAreYouSure: "Opravdu resetovat?"
saved: "Uloženo"
messaging: "Zprávy"
upload: "Nahrát soubory"
fromDrive: "Z disku"
fromUrl: "Z URL"
uploadFromUrl: "Nahrát z URL adresy"
uploadFromUrlDescription: "URL adresa souboru, který chcete nahrát"
uploadFromUrlMayTakeTime: "Může trvat nějakou dobu, dokud nebude dokončeno nahrávání."
explore: "Objevovat"
games: "Misskey hry"
messageRead: "Přečtené"
noMoreHistory: "To je vše"
startMessaging: "Zahájit chat"
nUsersRead: "přečteno {n} uživateli"
agreeTo: "Souhlasím s {0}"
tos: "Podmínky užívání"
start: "Začít"
home: "Domů"
remoteUserCaution: "Tyto informace nemusí být aktuální jelikož uživatel je ze vzdálené instance."
activity: "Aktivita"
images: "Obrázky"
birthday: "Datum narození"
registeredDate: "Datum registrace"
location: "Lokace"
lightThemes: "Světlý vzhled"
darkThemes: "Tmavý vzhled"
syncDeviceDarkMode: "Synchronizovat tmavý vzhled s nastavením Vašeho systému"
drive: "Úložiště"
fileName: "Název souboru"
selectFile: "Vybrat soubor"
selectFiles: "Vybrat soubory"
selectFolder: "Vyberte složku"
selectFolders: "Vyberte složky"
renameFile: "Přejmenovat soubor"
folderName: "Název složky"
createFolder: "Vytvořit složku"
renameFolder: "Přejmenovat složku"
deleteFolder: "Odstranit složku"
copyUrl: "Kopírovat URL"
rename: "Přejmenovat"
avatar: "Avatar"
banner: "Baner"
nsfw: "NSFW"
disconnectedFromServer: "Spojení bylo přerušeno"
reload: "Aktualizovat"
watch: "Sledovat"
unwatch: "Přestat sledovat"
accept: "Souhlasím"
reject: "Odmítnout"
normal: "Normální"
instanceName: "Název instance"
instanceDescription: "Popis instance"
maintainerName: "Správce"
maintainerEmail: "E-mailová adresa správce"
tosUrl: "URL pro smluvní podmínky"
thisYear: "Tento rok"
thisMonth: "Tento měsíc"
today: "Dnes"
dayX: "{day}"
monthX: "{month}"
yearX: "{year}"
pages: "Stránky"
integration: "Integrace"
connectSerice: "Připojit"
disconnectSerice: "Odpojit"
enableLocalTimeline: "Povolit lokální čas"
enableGlobalTimeline: "Povolit globální čas"
registration: "Registrace"
enableRegistration: "Povolit registraci novým uživatelům"
invite: "Pozvat"
inMb: "V megabajtech"
iconUrl: "Favicon URL"
bannerUrl: "Baner URL"
basicInfo: "Základní informace"
hcaptcha: "hCaptcha"
userList: "Seznamy"
about: "Informace"
aboutMisskey: "O Misskey"
administrator: "Administrátor"
token: "Token"
twoStepAuthentication: "Dvoufaktorová autentikace"
moderator: "Moderátor"
nUsersMentioned: "{n} uživatelů zmínilo"
securityKey: "Bezpečnostní klíč"
securityKeyName: "Název klíče"
registerSecurityKey: "Registrovat bezpečnostní klíč"
lastUsed: "Naposledy použito"
unregister: "Odstranit"
resetPassword: "Resetovat heslo"
newPasswordIs: "Nové heslo je \"{password}\""
reduceUiAnimation: "Snížit UI animace"
share: "Sdílet"
notFound: "Nenalezeno"
notFoundDescription: "Nebyla nalezená žádná stránka korespondující se zadanou URL."
uploadFolder: "Výchozí lokace pro upload"
cacheClear: "Vymazat cache"
markAsReadAllNotifications: "Označit všechna oznámení za přečtená"
markAsReadAllUnreadNotes: "Označit všechny příspěvky za přečtené"
markAsReadAllTalkMessages: "Označit všechny zprávy za přečtené"
help: "Nápověda"
inputMessageHere: "Sem zadejte zprávu"
close: "Zavřít"
group: "Skupina"
groups: "Skupiny"
createGroup: "Vytvořit skupinu"
ownedGroups: "Vlastněné skupiny"
joinedGroups: "Členství ve skupinách"
invites: "Pozvat"
groupName: "Název skupiny"
members: "Členové"
transfer: "Převod"
title: "Titulek"
text: "Text"
enable: "Povolit"
next: "Další"
retype: "Zadejte znovu"
noteOf: "{user} poznámky"
inviteToGroup: "Pozvat do skupiny"
invitations: "Pozvat"
smtpUser: "Uživatelské jméno"
smtpPass: "Heslo"
clearCache: "Vyprázdnit mezipaměť"
info: "Informace"
_mfm:
mention: "Zmínění"
quote: "Citovat"
emoji: "Vlastní emoji"
search: "Vyhledávání"
_sidebar:
icon: "Avatar"
_theme:
keys:
mention: "Zmínění"
renote: "Přeposlat"
_sfx:
note: "Poznámky"
notification: "Oznámení"
chat: "Zprávy"
_widgets:
notifications: "Oznámení"
timeline: "Časová osa"
activity: "Aktivita"
jobQueue: "Fronta úloh"
_cw:
show: "Zobrazit více"
_visibility:
home: "Domů"
followers: "Sledující"
_profile:
username: "Uživatelské jméno"
_exportOrImport:
followingList: "Sledovaní"
muteList: "Ztlumit"
blockingList: "Zablokovat"
userLists: "Seznamy"
_timelines:
home: "Domů"
_rooms:
_roomType:
default: "Výchozí"
_pages:
blocks:
image: "Obrázky"
script:
categories:
list: "Seznamy"
blocks:
_join:
arg1: "Seznamy"
_randomPick:
arg1: "Seznamy"
_dailyRandomPick:
arg1: "Seznamy"
_seedRandomPick:
arg2: "Seznamy"
_pick:
arg1: "Seznamy"
_listLen:
arg1: "Seznamy"
types:
array: "Seznamy"
_notification:
_types:
follow: "Sledovaní"
mention: "Zmínění"
renote: "Přeposlat"
quote: "Citovat"
reaction: "Reakce"
_deck:
_columns:
notifications: "Oznámení"
tl: "Časová osa"
list: "Seznamy"
mentions: "Zmínění"

View File

@ -687,6 +687,7 @@ textColor: "Text"
saveAs: "Speichern als…" saveAs: "Speichern als…"
advanced: "Fortgeschritten" advanced: "Fortgeschritten"
value: "Wert" value: "Wert"
createdAt: "Erstellt am"
updatedAt: "Zuletzt geändert am" updatedAt: "Zuletzt geändert am"
saveConfirm: "Änderungen speichern?" saveConfirm: "Änderungen speichern?"
deleteConfirm: "Wirklich löschen?" deleteConfirm: "Wirklich löschen?"
@ -710,6 +711,23 @@ typingUsers: "{users} ist/sind am schreiben..."
jumpToSpecifiedDate: "Zu bestimmtem Datum springen" jumpToSpecifiedDate: "Zu bestimmtem Datum springen"
showingPastTimeline: "Momentan wird eine alte Chronik angezeigt" showingPastTimeline: "Momentan wird eine alte Chronik angezeigt"
clear: "Zurückkehren" clear: "Zurückkehren"
markAllAsRead: "Alle als gelesen markieren"
goBack: "Zurück"
unlikeConfirm: "\"Gefällt mir\" wirklich entfernen?"
fullView: "Vollansicht"
quitFullView: "Vollansicht verlassen"
addDescription: "Beschreibung hinzufügen"
userPagePinTip: "Um Notizen hier erscheinen zu lassen, drücke \"Anpinnen\" im Menü individueller Notizen"
notSpecifiedMentionWarning: "Diese Notiz enthält Erwähnungen von Nutzern, die nicht als Empfänger ausgewählt sind"
info: "Über"
userInfo: "Benutzerinformation"
unknown: "Unbekannt"
onlineStatus: "Online-Status"
hideOnlineStatus: "Online-Status verbergen"
hideOnlineStatusDescription: "Das Verbergen deines Online-Statuses reduziert die Nützlichkeit von Funktionen wie der Suche."
online: "Online"
active: "Aktiv"
offline: "Offline"
_email: _email:
_follow: _follow:
title: "Du hast einen neuen Follower" title: "Du hast einen neuen Follower"
@ -865,6 +883,7 @@ _theme:
install: "Thema installieren" install: "Thema installieren"
manage: "Themaverwaltung" manage: "Themaverwaltung"
code: "Themen-Code" code: "Themen-Code"
description: "Beschreibung"
installed: "{name} wurde installiert" installed: "{name} wurde installiert"
installedThemes: "Installierte Themen" installedThemes: "Installierte Themen"
builtinThemes: "Eingebaute Themen" builtinThemes: "Eingebaute Themen"

View File

@ -687,6 +687,7 @@ textColor: "Text"
saveAs: "Save as..." saveAs: "Save as..."
advanced: "Advanced" advanced: "Advanced"
value: "Value" value: "Value"
createdAt: "Created on"
updatedAt: "Updated at" updatedAt: "Updated at"
saveConfirm: "Save changes?" saveConfirm: "Save changes?"
deleteConfirm: "Really delete?" deleteConfirm: "Really delete?"
@ -710,6 +711,23 @@ typingUsers: "{users} is/are typing..."
jumpToSpecifiedDate: "Jump to specific date" jumpToSpecifiedDate: "Jump to specific date"
showingPastTimeline: "Currently displaying an old timeline" showingPastTimeline: "Currently displaying an old timeline"
clear: "Return" clear: "Return"
markAllAsRead: "Mark all as read"
goBack: "Back"
unlikeConfirm: "Really remove your like?"
fullView: "Full view"
quitFullView: "Exit full view"
addDescription: "Add description"
userPagePinTip: "You can make notes be displayed here by selecting \"Pin to profile\" from the menu of individual notes"
notSpecifiedMentionWarning: "This note contains mentions of users not included as recipient"
info: "About"
userInfo: "User information"
unknown: "Unknown"
onlineStatus: "Online status"
hideOnlineStatus: "Hide online status"
hideOnlineStatusDescription: "Hiding your online status reduces the convenience of some functions such as search"
online: "Online"
active: "Active"
offline: "Offline"
_email: _email:
_follow: _follow:
title: "You've got a new follower" title: "You've got a new follower"
@ -865,6 +883,7 @@ _theme:
install: "Install theme" install: "Install theme"
manage: "Themes manager" manage: "Themes manager"
code: "Theme code" code: "Theme code"
description: "Description"
installed: "{name} has been installed" installed: "{name} has been installed"
installedThemes: "Installed themes" installedThemes: "Installed themes"
builtinThemes: "Built-in themes" builtinThemes: "Built-in themes"

View File

@ -652,6 +652,8 @@ backgroundColor: "Fondo"
accentColor: "Acento" accentColor: "Acento"
textColor: "Texto" textColor: "Texto"
value: "Valores" value: "Valores"
goBack: "Deseleccionar"
info: "Información"
_email: _email:
_follow: _follow:
title: "te ha seguido" title: "te ha seguido"
@ -745,6 +747,7 @@ _theme:
install: "Instalar tema" install: "Instalar tema"
manage: "Gestor de temas" manage: "Gestor de temas"
code: "Código del tema" code: "Código del tema"
description: "Descripción"
installed: "{name} ha sido instalado" installed: "{name} ha sido instalado"
alreadyInstalled: "Este tema ya está instalado" alreadyInstalled: "Este tema ya está instalado"
invalid: "El formato del tema no es válido" invalid: "El formato del tema no es válido"

View File

@ -686,6 +686,7 @@ textColor: "Texte"
saveAs: "Enregistrer sous ..." saveAs: "Enregistrer sous ..."
advanced: "Avancé" advanced: "Avancé"
value: "Valeur" value: "Valeur"
createdAt: "Date de création"
updatedAt: "Mis à jour le" updatedAt: "Mis à jour le"
saveConfirm: "Voulez-vous sauvegarder les modifications?" saveConfirm: "Voulez-vous sauvegarder les modifications?"
deleteConfirm: "Confirmez-vous la suppression?" deleteConfirm: "Confirmez-vous la suppression?"
@ -709,6 +710,22 @@ typingUsers: "{users} est en train d'écrire"
jumpToSpecifiedDate: "Se rendre à la date" jumpToSpecifiedDate: "Se rendre à la date"
showingPastTimeline: "Un fil ancien est affiché" showingPastTimeline: "Un fil ancien est affiché"
clear: "Effacer" clear: "Effacer"
markAllAsRead: "Tout marquer comme lu"
goBack: "Retour"
unlikeConfirm: "Êtes-vous sûr·e de ne plus vouloir aimer cette publication ?"
fullView: "Plein écran"
quitFullView: "Quitter le plein écran"
addDescription: "Ajouter une description"
userPagePinTip: "Vous pouvez afficher des notes ici en sélectionnant l'option « Épingler au profil » dans le menu de chaque note."
notSpecifiedMentionWarning: "Vous avez mentionné des utilisateur·rice·s qui ne font pas partie de la liste des destinataires"
info: "Informations"
userInfo: "Informations sur l'utilisateur"
unknown: "Inconnu"
onlineStatus: "Statut"
hideOnlineStatus: "Toujours apparaître hors ligne"
hideOnlineStatusDescription: "Forcer votre statut à toujours apparaître hors ligne peut diminuer les performances de certaines fonctionnalités, telles que la Recherche."
online: "En ligne"
offline: "Hors ligne"
_email: _email:
_follow: _follow:
title: "Vous suit" title: "Vous suit"
@ -842,6 +859,7 @@ _theme:
install: "Installer un thème" install: "Installer un thème"
manage: "Gestion des thèmes" manage: "Gestion des thèmes"
code: "Code du thème" code: "Code du thème"
description: "Description"
installed: "{name} a été installé" installed: "{name} a été installé"
installedThemes: "Thèmes installés" installedThemes: "Thèmes installés"
builtinThemes: "Thèmes intégrés" builtinThemes: "Thèmes intégrés"
@ -936,7 +954,7 @@ _tutorial:
step3_3: "Remplissez le cadran et cliquez sur le bouton en haut à droite pour envoyer." step3_3: "Remplissez le cadran et cliquez sur le bouton en haut à droite pour envoyer."
step3_4: "Vous navez rien à dire ? Essayez décrire « Jai commencé à utiliser Misskey »." step3_4: "Vous navez rien à dire ? Essayez décrire « Jai commencé à utiliser Misskey »."
step4_1: "Avez-vous publié votre première note ?" step4_1: "Avez-vous publié votre première note ?"
step4_2: "Youpi ! Celle-ci est maintenant affiché sur votre fil dactualité." step4_2: "Youpi ! Celle-ci est maintenant affichée sur votre fil dactualité."
step5_1: "Maintenant, essayons de nous abonner à dautres personnes afin de rendre votre fil plus vivant." step5_1: "Maintenant, essayons de nous abonner à dautres personnes afin de rendre votre fil plus vivant."
step5_2: "La page {featured} affiche les notes en tendance sur la présente instance et {explore} vous permet de trouver des utilisateur·rice·s en tendance. Essayez de vous abonner aux gens que vous aimez !" step5_2: "La page {featured} affiche les notes en tendance sur la présente instance et {explore} vous permet de trouver des utilisateur·rice·s en tendance. Essayez de vous abonner aux gens que vous aimez !"
step5_3: "Pour pouvoir suivre dautres utilisateur·rice, cliquez sur leur avatar afin dafficher la page du profil utilisateur ensuite appuyez sur le bouton « Sabonner »." step5_3: "Pour pouvoir suivre dautres utilisateur·rice, cliquez sur leur avatar afin dafficher la page du profil utilisateur ensuite appuyez sur le bouton « Sabonner »."
@ -946,7 +964,7 @@ _tutorial:
step6_3: "Pour ajouter une réaction à une note, cliquez sur le signe « + » de celle-ci et sélectionnez lémoji souhaité." step6_3: "Pour ajouter une réaction à une note, cliquez sur le signe « + » de celle-ci et sélectionnez lémoji souhaité."
step7_1: "Félicitations ! Vous avez atteint la fin du tutoriel de base pour lutilisation de Misskey." step7_1: "Félicitations ! Vous avez atteint la fin du tutoriel de base pour lutilisation de Misskey."
step7_2: "Si vous désirez en savoir plus sur Misskey, jetez un œil sur la section {help}." step7_2: "Si vous désirez en savoir plus sur Misskey, jetez un œil sur la section {help}."
step7_3: "Bon courage et amusez-vous bien sur Misskey 🚀" step7_3: "Bon courage et amusez-vous bien sur Misskey ! 🚀"
_2fa: _2fa:
alreadyRegistered: "Cette étape à déjà été complétée" alreadyRegistered: "Cette étape à déjà été complétée"
registerDevice: "Ajouter un nouvel appareil" registerDevice: "Ajouter un nouvel appareil"

View File

@ -615,6 +615,7 @@ inChannelSearch: "Cerca in canale"
useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello di reazioni" useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello di reazioni"
typingUsers: "{users} sta(nno) scrivendo" typingUsers: "{users} sta(nno) scrivendo"
showingPastTimeline: "Stai visualizzando una vecchia timeline" showingPastTimeline: "Stai visualizzando una vecchia timeline"
info: "Informazioni"
_email: _email:
_follow: _follow:
title: "Ha iniziato a seguirti" title: "Ha iniziato a seguirti"
@ -676,6 +677,7 @@ _theme:
install: "Installa un tema" install: "Installa un tema"
manage: "Gerisci temi" manage: "Gerisci temi"
code: "Codice tema" code: "Codice tema"
description: "Descrizione"
installed: "{name} è installato" installed: "{name} è installato"
installedThemes: "Temi installati" installedThemes: "Temi installati"
builtinThemes: "Temi integrati" builtinThemes: "Temi integrati"

View File

@ -687,6 +687,7 @@ textColor: "文字"
saveAs: "名前を付けて保存" saveAs: "名前を付けて保存"
advanced: "高度" advanced: "高度"
value: "値" value: "値"
createdAt: "作成日時"
updatedAt: "更新日時" updatedAt: "更新日時"
saveConfirm: "保存しますか?" saveConfirm: "保存しますか?"
deleteConfirm: "削除しますか?" deleteConfirm: "削除しますか?"
@ -710,6 +711,23 @@ typingUsers: "{users}が入力中"
jumpToSpecifiedDate: "特定の日付にジャンプ" jumpToSpecifiedDate: "特定の日付にジャンプ"
showingPastTimeline: "過去のタイムラインを表示しています" showingPastTimeline: "過去のタイムラインを表示しています"
clear: "クリア" clear: "クリア"
markAllAsRead: "全て既読にする"
goBack: "戻る"
unlikeConfirm: "いいね解除しますか?"
fullView: "フルビュー"
quitFullView: "フルビュー解除"
addDescription: "説明を追加"
userPagePinTip: "個々のノートのメニューから「ピン留め」を選択することで、ここにノートを表示しておくことができます。"
notSpecifiedMentionWarning: "宛先に含まれていないメンションがあります"
info: "情報"
userInfo: "ユーザー情報"
unknown: "不明"
onlineStatus: "オンライン状態"
hideOnlineStatus: "オンライン状態を隠す"
hideOnlineStatusDescription: "オンライン状態を隠すと、検索などの一部機能において利便性が低下することがあります。"
online: "オンライン"
active: "アクティブ"
offline: "オフライン"
_email: _email:
_follow: _follow:
@ -878,6 +896,7 @@ _theme:
install: "テーマのインストール" install: "テーマのインストール"
manage: "テーマの管理" manage: "テーマの管理"
code: "テーマコード" code: "テーマコード"
description: "説明"
installed: "{name}をインストールしました" installed: "{name}をインストールしました"
installedThemes: "インストールされたテーマ" installedThemes: "インストールされたテーマ"
builtinThemes: "標準のテーマ" builtinThemes: "標準のテーマ"

View File

@ -1,5 +1,6 @@
--- ---
_lang_: "日本語 (関西弁)" _lang_: "日本語 (関西弁)"
headlineMisskey: "ノートでつながるネットワーク"
introMisskey: "ようお越しMisskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか🚀" introMisskey: "ようお越しMisskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか🚀"
monthAndDay: "{month}月 {day}日" monthAndDay: "{month}月 {day}日"
search: "探す" search: "探す"
@ -54,7 +55,7 @@ youGotNewFollower: "フォローされたで"
receiveFollowRequest: "フォローリクエストされたで" receiveFollowRequest: "フォローリクエストされたで"
followRequestAccepted: "フォローが承認されたで" followRequestAccepted: "フォローが承認されたで"
mention: "メンション" mention: "メンション"
mentions: "あんた宛て" mentions: "うち宛て"
directNotes: "ダイレクト投稿" directNotes: "ダイレクト投稿"
importAndExport: "インポートとエクスポート" importAndExport: "インポートとエクスポート"
import: "インポート" import: "インポート"
@ -433,6 +434,7 @@ passwordMatched: "よし!一致や!"
passwordNotMatched: "一致しとらんで?" passwordNotMatched: "一致しとらんで?"
signinWith: "{x}でログイン" signinWith: "{x}でログイン"
or: "それか" or: "それか"
language: "言語"
uiLanguage: "UIの表示言語" uiLanguage: "UIの表示言語"
groupInvited: "グループに招待されとるで" groupInvited: "グループに招待されとるで"
aboutX: "{x}について" aboutX: "{x}について"
@ -454,40 +456,352 @@ openImageInNewTab: "画像を新しいタブで開く"
dashboard: "ダッシュボード" dashboard: "ダッシュボード"
local: "ローカル" local: "ローカル"
remote: "リモート" remote: "リモート"
total: "合計"
weekOverWeekChanges: "前週比"
dayOverDayChanges: "前日比"
appearance: "見た目"
clientSettings: "クライアントの設定"
accountSettings: "アカウントの設定"
promotion: "宣伝"
promote: "宣伝"
numberOfDays: "日数"
hideThisNote: "このノートは表示せんでいい"
showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを表示してや"
objectStorage: "オブジェクトストレージ"
useObjectStorage: "オブジェクトストレージを使う"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "参照に使うにURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://<bucket>.s3.amazonaws.com'、GCSとかなら: 'https://storage.googleapis.com/<bucket>'。"
objectStorageBucket: "Bucket"
objectStoragePrefix: "Prefix"
objectStorageEndpoint: "Endpoint"
objectStorageRegion: "Region"
objectStorageUseSSL: "SSLを使う"
objectStorageUseProxy: "Proxyを使う"
objectStorageUseProxyDesc: "API接続にproxy使わんのやったら切ってくれへん"
objectStorageSetPublicRead: "アップロードした時に'public-read'を設定してや"
serverLogs: "サーバーログ"
deleteAll: "全て削除してや"
showFixedPostForm: "タイムラインの上の方で投稿できるようにやってくれへん?"
newNoteRecived: "新しいノートがあるで"
sounds: "サウンド"
listen: "聴く"
none: "なし"
showInPage: "ページで表示"
popout: "ポップアウト"
volume: "音量"
masterVolume: "全体の音量"
details: "もっと"
chooseEmoji: "絵文字を選ぶ"
unableToProcess: "なんか作業が止まってしまったようやね"
recentUsed: "最近使ったやつ"
install: "インストール"
uninstall: "アンインストール"
installedApps: "インストールされとるアプリ"
nothing: "あらへん"
installedDate: "インストールした日時"
lastUsedDate: "最後に使った日時"
state: "状態"
sort: "仕分ける"
ascendingOrder: "小さい順"
descendingOrder: "大きい順"
scratchpad: "スクラッチパッド"
scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。" scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。"
output: "出力"
script: "スクリプト"
disablePagesScript: "Pagesのスクリプトを無効にしてや"
updateRemoteUser: "リモートユーザー情報の更新してくれん?"
deleteAllFiles: "すべてのファイルを削除"
deleteAllFilesConfirm: "ホンマにすべてのファイルを削除するん?消したもんはもう戻ってこんのやで?"
removeAllFollowing: "フォローを全解除"
removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。"
userSuspended: "このユーザーは...凍結されとる。"
userSilenced: "このユーザーは...サイレンスされとる。"
sidebar: "サイドバー"
divider: "分割線"
rooms: "ルーム"
relays: "リレー"
addRelay: "リレーの追加"
inboxUrl: "inboxのURL"
addedRelays: "追加済みのリレー"
poll: "アンケート"
enablePlayer: "プレイヤーを開く"
disablePlayer: "プレイヤーを閉じる"
expandTweet: "ツイートを展開する"
themeEditor: "テーマエディター"
description: "説明"
author: "作者"
leaveConfirm: "未保存の変更があるで!ほかしてええか?" leaveConfirm: "未保存の変更があるで!ほかしてええか?"
manage: "管理"
plugins: "プラグイン"
deck: "デッキ"
undeck: "デッキ解除"
width: "幅"
height: "高さ"
large: "大"
medium: "中"
small: "小"
edit: "編集"
emailConfig: "メールサーバー設定"
enableEmail: "メール配信を受け取る"
emailConfigInfo: "メールアドレスの確認とかパスワードリセットの時に使うで" emailConfigInfo: "メールアドレスの確認とかパスワードリセットの時に使うで"
email: "メール"
emailAddress: "メールアドレス"
smtpConfig: "SMTP サーバーの設定"
smtpHost: "ホスト" smtpHost: "ホスト"
smtpPort: "ポート"
smtpUser: "ユーザー名" smtpUser: "ユーザー名"
smtpPass: "パスワード" smtpPass: "パスワード"
emptyToDisableSmtpAuth: "ユーザー名とパスワードになんも入れんかったら、SMTP認証を無効化するで"
smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する"
testEmail: "配信テスト"
wordMute: "ワードミュート"
userSaysSomething: "{name}が何か言ったようやで"
makeActive: "アクティブにしてや"
display: "表示"
copy: "コピー"
metrics: "メトリクス"
overview: "概要"
logs: "ログ"
delayed: "遅延"
database: "データベース"
channel: "チャンネル"
create: "作成"
notificationSetting: "通知設定"
notificationSettingDesc: "表示する通知の種類えらんでや。" notificationSettingDesc: "表示する通知の種類えらんでや。"
useGlobalSetting: "グローバル設定を使ってや"
other: "その他"
regenerateLoginToken: "ログイントークンを再生成"
behavior: "動作"
sample: "サンプル"
abuseReports: "通報"
reportAbuse: "通報"
reportAbuseOf: "{name}を通報する"
send: "送信"
abuseMarkAsResolved: "対応したで"
openInNewTab: "新しいタブで開く"
openInSideView: "サイドビューで開く"
defaultNavigationBehaviour: "デフォルトのナビゲーション"
editTheseSettingsMayBreakAccount: "このへんの設定をようわからんままイジるとアカウントが壊れて使えんくなるかも知れへんで?"
instanceTicker: "ノートのインスタンス情報"
waitingFor: "{x}を待っとるで"
random: "ランダム"
system: "システム"
switchUi: "UI切り替え"
desktop: "デスクトップ"
clip: "クリップ"
receivedReactionsCount: "リアクションされた数"
pollVotesCount: "アンケートに投票した数"
pollVotedCount: "アンケートに投票された数"
yes: "はい"
no: "いいえ"
driveFilesCount: "ドライブのファイル数"
emailVerified: "メールアドレスは確認されたで" emailVerified: "メールアドレスは確認されたで"
pageLikesCount: "Pageにええやんと思った数" pageLikesCount: "Pageにええやんと思った数"
pageLikedCount: "Pageにええやんと思ってくれた数" pageLikedCount: "Pageにええやんと思ってくれた数"
clips: "クリップ"
duplicate: "複製"
left: "左"
center: "中央"
wide: "広い"
narrow: "狭い"
reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?" reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?"
showTitlebar: "タイトルバーを見せる"
clearCache: "キャッシュをほかす" clearCache: "キャッシュをほかす"
onlineUsersCount: "{n}人が起きとるで" onlineUsersCount: "{n}人が起きとるで"
nUsers: "{n}ユーザー"
nNotes: "{n}ノート"
sendErrorReports: "エラーリポートを送る"
sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたときにエラーの詳細がMisskeyに共有されて、ソフトウェアの品質向上に役立てられるんや。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれるで。" sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたときにエラーの詳細がMisskeyに共有されて、ソフトウェアの品質向上に役立てられるんや。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれるで。"
myTheme: "マイテーマ"
backgroundColor: "背景"
accentColor: "アクセント"
textColor: "文字"
saveAs: "名前を付けて保存"
advanced: "高度"
value: "値"
updatedAt: "更新日時"
saveConfirm: "保存するで?"
deleteConfirm: "ホンマに削除するで?"
registry: "レジストリ"
closeAccount: "アカウントを閉鎖する"
currentVersion: "現在のバージョン"
latestVersion: "最新のバージョン"
youAreRunningUpToDateClient: "今使ってるクライアントが最新やで!" youAreRunningUpToDateClient: "今使ってるクライアントが最新やで!"
newVersionOfClientAvailable: "新しいバージョンのクライアントが使えるで。" newVersionOfClientAvailable: "新しいバージョンのクライアントが使えるで。"
usageAmount: "使用量"
capacity: "容量"
inUse: "使用中"
editCode: "コードを編集"
apply: "適用"
receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
emailNotification: "メール通知"
inChannelSearch: "チャンネル内検索"
useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開くようにする"
typingUsers: "{users}が今書きよるで"
jumpToSpecifiedDate: "特定の日付にジャンプ"
showingPastTimeline: "過去のタイムラインを表示してるで"
clear: "クリア"
goBack: "戻る"
info: "情報"
_email: _email:
_follow: _follow:
title: "フォローされたで" title: "フォローされたで"
_receiveFollowRequest:
title: "フォローリクエストを受け取ったで"
_plugin:
install: "プラグインのインストール"
installWarn: "信頼できへんプラグインはインストールせんとってな"
manage: "プラグインの管理"
_registry:
scope: "スコープ"
key: "キー"
keys: "キー"
domain: "ドメイン"
createKey: "キーを作る"
_aboutMisskey:
about: "Misskeyはsyuiloが2014年からずっと作ってはる、オープンソースなソフトウェアや。"
contributors: "主な貢献者"
allContributors: "全ての貢献者"
source: "ソースコード"
translation: "Misskeyを翻訳"
donate: "Misskeyに寄付"
morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰"
patrons: "支援者"
_mfm: _mfm:
cheatSheet: "MFMチートシート"
mention: "メンション" mention: "メンション"
hashtag: "ハッシュタグ"
url: "URL"
link: "リンク"
bold: "太字"
center: "中央寄せ"
inlineCode: "コード(インライン)"
blockCode: "コード(ブロック)"
inlineMath: "数式(インライン)"
quote: "引用" quote: "引用"
emoji: "カスタム絵文字" emoji: "カスタム絵文字"
search: "探す" search: "探す"
shake: "アニメーション(ぶるぶる)"
twitch: "アニメーション(ブレ)"
spin: "アニメーション(回転)"
blur: "ぼかし"
font: "フォント"
_reversi:
reversi: "リバーシ"
gameSettings: "対局の設定"
chooseBoard: "ボードを選択"
blackOrWhite: "先行/後攻"
blackIs: "{name}が黒(先行)"
rules: "ルール"
botSettings: "Botのオプション"
pastTurnOf: "{name}のターン"
surrender: "投了"
surrendered: "投了により"
drawn: "引き分け"
won: "{name}の勝ち"
black: "黒"
white: "白"
total: "合計"
turnCount: "{count}ターン目"
myGames: "自分の対局"
allGames: "みんなの対局"
ended: "終了"
playing: "対局中"
isLlotheo: "石の少ない方が勝ち(ロセオ)"
loopedMap: "ループマップ"
_instanceTicker:
none: "表示せん"
remote: "リモートユーザーに表示"
always: "常に表示"
_serverDisconnectedBehavior:
reload: "自動でリロード"
dialog: "ダイアログで警告"
_channel: _channel:
create: "チャンネルを作る"
edit: "チャンネルを編集"
setBanner: "バナーを設定"
removeBanner: "バナーを削除"
featured: "トレンド"
notesCount: "{n}こ投稿があるで" notesCount: "{n}こ投稿があるで"
_sidebar: _sidebar:
full: "フル"
icon: "アイコン" icon: "アイコン"
hide: "隠す"
_wordMute:
soft: "ソフト"
hard: "ハード"
_theme: _theme:
explore: "テーマを探す"
install: "テーマのインストール"
manage: "テーマの管理"
code: "テーマコード"
description: "説明"
installed: "{name}をインストールしたで。"
installedThemes: "インストールされとるテーマ"
builtinThemes: "標準のテーマ"
alreadyInstalled: "そのテーマはもうインストールされとるで?"
make: "テーマを作る"
base: "ベース"
addConstant: "定数を追加"
defaultValue: "デフォルト値"
color: "色"
refProp: "プロパティを参照"
refConst: "定数を参照"
key: "キー"
func: "関数"
funcKind: "関数の種類"
argument: "引数"
basedProp: "元にするプロパティの名前"
alpha: "不透明度"
darken: "暗さ"
lighten: "明るさ"
keys: keys:
accent: "アクセント"
bg: "背景"
fg: "文字"
focus: "フォーカス"
indicator: "インジケーター"
panel: "パネル"
shadow: "影"
header: "ヘッダー"
navBg: "サイドバーの背景"
navFg: "サイドバーの文字"
navHoverFg: "サイドバー文字(ホバー)"
navActive: "サイドバー文字(アクティブ)"
navIndicator: "サイドバーのインジケーター"
link: "リンク"
hashtag: "ハッシュタグ"
mention: "メンション" mention: "メンション"
mentionMe: "うち宛てのメンション"
renote: "Renote" renote: "Renote"
modalBg: "モーダルの背景"
divider: "分割線"
scrollbarHandle: "スクロールバーの取っ手"
scrollbarHandleHover: "スクロールバーの取っ手(ホバー)"
dateLabelFg: "日付ラベルの文字"
infoBg: "情報の背景"
infoFg: "情報の文字"
infoWarnBg: "警告の背景"
infoWarnFg: "警告の文字"
cwBg: "CW ボタンの背景"
cwFg: "CW ボタンの文字"
cwHoverBg: "CW ボタンの背景 (ホバー)"
toastBg: "通知トーストの背景"
toastFg: "通知トーストの文字"
buttonBg: "ボタンの背景"
buttonHoverBg: "ボタンの背景 (ホバー)"
inputBorder: "入力ボックスの縁取り"
listItemHoverBg: "リスト項目の背景 (ホバー)"
driveFolderBg: "ドライブフォルダーの背景"
wallpaperOverlay: "壁紙のオーバーレイ"
badge: "バッジ"
messageBg: "チャットの背景"
accentDarken: "アクセント (暗め)"
accentLighten: "アクセント (明るめ)"
fgHighlighted: "強調されとる文字"
_sfx: _sfx:
note: "ノート" note: "ノート"
noteMy: "ノート(自分)"
notification: "通知" notification: "通知"
chat: "チャット" chat: "チャット"
_ago: _ago:
@ -511,24 +825,63 @@ _tutorial:
_2fa: _2fa:
alreadyRegistered: "もう設定終わっとるわ。" alreadyRegistered: "もう設定終わっとるわ。"
_permissions: _permissions:
"read:reactions": "リアクションを見る"
"write:votes": "投票する"
"read:pages": "ページを見る"
"read:page-likes": "ページのええやんを見る" "read:page-likes": "ページのええやんを見る"
"write:page-likes": "ページのええやんを操作する" "write:page-likes": "ページのええやんを操作する"
"read:user-groups": "ユーザーグループを見る"
"read:channels": "チャンネルを見る"
_auth: _auth:
permissionAsk: "このアプリは次の権限を要求しとるで" permissionAsk: "このアプリは次の権限を要求しとるで"
_antennaSources: _antennaSources:
all: "みなのノート" all: "みなのノート"
homeTimeline: "フォローしとるユーザーのノート" homeTimeline: "フォローしとるユーザーのノート"
_weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
_widgets: _widgets:
memo: "付箋"
notifications: "通知" notifications: "通知"
timeline: "タイムライン" timeline: "タイムライン"
calendar: "カレンダー"
trends: "トレンド"
clock: "時計"
rss: "RSSリーダー"
activity: "アクティビティ" activity: "アクティビティ"
photos: "フォト"
digitalClock: "デジタル時計"
federation: "連合" federation: "連合"
postForm: "投稿フォーム"
slideshow: "スライドショー"
button: "ボタン"
onlineUsers: "オンラインユーザー"
jobQueue: "ジョブキュー" jobQueue: "ジョブキュー"
serverMetric: "サーバーメトリクス"
aiscript: "AiScriptコンソール"
_cw: _cw:
hide: "隠す"
show: "続き見して!" show: "続き見して!"
chars: "{count}文字"
files: "{count}ファイル"
_poll: _poll:
choiceN: "選択肢{n}"
noMore: "これ以上追加でけへん" noMore: "これ以上追加でけへん"
canMultipleVote: "複数回答可"
expiration: "期限"
infinite: "無期限"
at: "日時指定"
after: "経過指定"
deadlineDate: "期日"
deadlineTime: "時間" deadlineTime: "時間"
duration: "期間"
votesCount: "{n}票"
vote: "投票する"
_visibility: _visibility:
publicDescription: "みなのユーザーに公開" publicDescription: "みなのユーザーに公開"
home: "ホーム" home: "ホーム"
@ -542,44 +895,372 @@ _exportOrImport:
muteList: "ミュート" muteList: "ミュート"
blockingList: "ブロック" blockingList: "ブロック"
userLists: "リスト" userLists: "リスト"
_charts:
usersTotal: "ユーザーの合計"
activeUsers: "アクティブユーザー数"
notesIncDec: "ノートの増減"
localNotesIncDec: "ローカルのノートの増減"
remoteNotesIncDec: "リモートのノートの増減"
notesTotal: "ノートの合計"
filesIncDec: "ファイルの増減"
filesTotal: "ファイルの合計"
storageUsageIncDec: "ストレージ使用量の増減"
storageUsageTotal: "ストレージ使用量の合計"
_instanceCharts:
requests: "リクエスト"
users: "ユーザーの増減"
usersTotal: "ユーザーの累積"
notes: "ノートの増減"
notesTotal: "ノートの累積"
ff: "フォロー/フォロワーの増減"
ffTotal: "フォロー/フォロワーの累積"
cacheSize: "キャッシュサイズの増減"
cacheSizeTotal: "キャッシュサイズの累積"
files: "ファイル数の増減"
filesTotal: "ファイル数の累積"
_timelines: _timelines:
home: "ホーム" home: "ホーム"
local: "ローカル"
social: "ソーシャル"
global: "グローバル"
_rooms: _rooms:
roomOf: "{user}のルーム"
addFurniture: "家具を置く"
translate: "移動"
rotate: "回転"
exit: "戻る"
remove: "しまう"
clear: "片付け"
clearConfirm: "家具ぜんぶしまうけど、ホンマにええん?"
leaveConfirm: "未保存の変更があるけど、移動してええか?" leaveConfirm: "未保存の変更があるけど、移動してええか?"
chooseImage: "画像を選ぶ"
roomType: "部屋のタイプ"
carpetColor: "床の色"
_roomType: _roomType:
default: "デフォルト" default: "デフォルト"
washitsu: "和室"
_furnitures: _furnitures:
milk: "牛乳パック"
bed: "ベッド"
low-table: "ローテーブル"
desk: "デスク"
chair: "チェア"
chair2: "チェア2"
fan: "換気扇"
pc: "パソコン"
plant: "観葉植物"
plant2: "観葉植物2"
eraser: "消しゴム"
pencil: "鉛筆"
pudding: "プリン"
cardboard-box: "段ボール箱"
cardboard-box2: "段ボール箱2"
cardboard-box3: "段ボール箱3"
book: "本"
book2: "本2"
piano: "ピアノ"
facial-tissue: "ティッシュボックス"
server: "サーバー"
moon: "月"
corkboard: "コルクボード"
mousepad: "マウスパッド"
monitor: "モニター" monitor: "モニター"
keyboard: "キーボード"
carpet-stripe: "カーペット(縞)"
mat: "マット"
color-box: "カラーボックス"
wall-clock: "壁掛け時計"
photoframe: "額縁"
cube: "キューブ"
tv: "テレビ"
pinguin: "ピンギン"
rubik-cube: "ルービックキューブ"
poster-h: "ルービックキューブ"
poster-v: "ポスター(縦長)"
sofa: "ソファ"
spiral: "螺旋階段"
bin: "ゴミ箱"
cup-noodle: "カップ麺"
holo-display: "ホログラフィックディスプレイ"
energy-drink: "エナジードリンク"
doll-ai: "藍ちゃん人形"
banknote: "札束"
_pages: _pages:
newPage: "ページを作る"
editPage: "ページの編集"
readPage: "ソースを表示中"
created: "ページを作成したで"
updated: "ページを更新したで"
deleted: "ページを削除したで"
pageSetting: "ページ設定"
viewPage: "ページを見る"
like: "ええやん" like: "ええやん"
unlike: "良くないわ" unlike: "良くないわ"
liked: "ええと思ったページ" liked: "ええと思ったページ"
contents: "コンテンツ"
summary: "ページの要約"
alignCenter: "中央寄せ"
font: "フォント"
fontSerif: "セリフ"
fontSansSerif: "サンセリフ"
eyeCatchingImageSet: "アイキャッチ画像を設定"
eyeCatchingImageRemove: "アイキャッチ画像を削除"
chooseBlock: "ブロックを追加"
selectType: "種類を選択"
contentBlocks: "コンテンツ"
inputBlocks: "入力"
specialBlocks: "特殊"
blocks: blocks:
text: "テキスト"
textarea: "テキストエリア"
section: "セクション"
image: "画像" image: "画像"
button: "ボタン"
if: "もし"
_if:
variable: "変数"
post: "投稿フォーム"
_post:
text: "内容"
canvasId: "キャンバスID"
textInput: "テキスト入力"
_textInput:
name: "変数名"
text: "タイトル"
default: "デフォルト値"
textareaInput: "複数行テキスト入力"
_textareaInput:
name: "変数名"
text: "タイトル"
default: "デフォルト値"
numberInput: "数値入力"
_numberInput:
name: "変数名"
text: "タイトル"
default: "デフォルト値"
canvas: "キャンバス"
_canvas:
id: "キャンバスID"
width: "幅"
height: "高さ"
note: "ノート埋め込み"
_note:
id: "ートID"
detailed: "詳細な表示"
switch: "スイッチ"
_switch:
name: "変数名"
text: "タイトル"
default: "デフォルト値"
counter: "カウンター"
_counter:
name: "変数名"
text: "タイトル"
inc: "増加値"
_button:
text: "タイトル"
colored: "色付き"
action: "ボタンを押したときの動作"
_action:
dialog: "ダイアログを表示する"
_dialog:
content: "内容"
resetRandom: "乱数をリセット"
pushEvent: "イベントを送信させる"
_pushEvent:
event: "イベント名"
no-variable: "なし"
callAiScript: "AiScript呼び出し"
_callAiScript:
functionName: "関数名"
radioButton: "選択肢"
_radioButton:
name: "変数名"
title: "タイトル"
values: "改行で区切った選択肢"
default: "デフォルト値"
script: script:
categories: categories:
flow: "制御"
logical: "論理演算"
operation: "計算"
comparison: "比較"
random: "ランダム"
value: "値"
fn: "関数"
text: "関数"
convert: "変換"
list: "リスト" list: "リスト"
blocks: blocks:
text: "テキスト"
multiLineText: "テキスト(複数行)"
textList: "テキストのリスト"
strLen: "テキストの長さ"
_strLen:
arg1: "テキスト"
strPick: "文字取り出し"
_strPick:
arg1: "テキスト"
arg2: "文字の位置"
strReplace: "テキスト置き換え"
_strReplace:
arg1: "テキスト"
arg2: "置き換え前"
arg3: "置き換え後"
strReverse: "テキストを反転"
_strReverse:
arg1: "テキスト"
join: "テキストを連結"
_join: _join:
arg1: "リスト" arg1: "リスト"
arg2: "区切り"
add: "足す"
_add:
arg1: "A"
arg2: "B"
subtract: "引く"
_subtract:
arg1: "A"
arg2: "A"
multiply: "掛ける"
_multiply:
arg1: "A"
arg2: "B"
divide: "割る"
_divide:
arg1: "A"
arg2: "B"
mod: "割った余り"
_mod:
arg1: "A"
arg2: "B"
round: "小数を丸める"
_round:
arg1: "数値"
eq: "AとBが同じ"
_eq:
arg1: "A"
arg2: "B"
notEq: "AとBが異なる"
_notEq:
arg1: "A"
arg2: "B"
and: "AかつB"
_and:
arg1: "A"
arg2: "B"
or: "AまたはB"
_or:
arg1: "A"
arg2: "B"
lt: "< AがBより小さい"
_lt:
arg1: "A"
arg2: "B"
gt: "> AがBより大きい"
_gt:
arg1: "A"
arg2: "B"
ltEq: "<= AがBと同じか小さい"
_ltEq:
arg1: "A"
arg2: "B"
gtEq: ">= AがBと同じか大きい"
_gtEq:
arg1: "A"
arg2: "B"
if: "分岐"
_if:
arg1: "もし"
arg2: "なら"
arg3: "そうでなければ"
not: "否定"
_not:
arg1: "否定"
random: "ランダム"
_random:
arg1: "確率"
rannum: "乱数"
_rannum:
arg1: "最小"
arg2: "最大"
randomPick: "リストからランダムに選ぶ"
_randomPick: _randomPick:
arg1: "リスト" arg1: "リスト"
dailyRandom: "ランダム (ユーザーごとに日替わり)"
_dailyRandom:
arg1: "確率"
dailyRannum: "乱数 (ユーザーごとに日替わり)"
_dailyRannum:
arg1: "最小"
arg2: "最大"
dailyRandomPick: "リストからランダムに選ぶ (ユーザーごとに日替わり)"
_dailyRandomPick: _dailyRandomPick:
arg1: "リスト" arg1: "リスト"
seedRandom: "ランダム (シード)"
_seedRandom:
arg1: "シード"
arg2: "確率"
seedRannum: "乱数 (シード)"
_seedRannum:
arg1: "シード"
arg2: "最小"
arg3: "最大"
seedRandomPick: "リストからランダムに選択 (シード)"
_seedRandomPick: _seedRandomPick:
arg1: "シード"
arg2: "リスト" arg2: "リスト"
DRPWPM: "確率付きリストからランダムに選ぶ (ユーザーごとに日替わり)"
_DRPWPM:
arg1: "テキストのリスト"
pick: "リストから選ぶ"
_pick: _pick:
arg1: "リスト" arg1: "リスト"
arg2: "位置"
listLen: "リストの長さを取得"
_listLen: _listLen:
arg1: "リスト" arg1: "リスト"
number: "数値"
stringToNumber: "テキストを数値に"
_stringToNumber:
arg1: "テキスト"
numberToString: "数値をテキストに"
_numberToString:
arg1: "数値"
splitStrByLine: "テキストを行で分割"
_splitStrByLine:
arg1: "テキスト"
ref: "変数"
aiScriptVar: "AiScript変数"
fn: "関数"
_fn:
slots: "スロット"
arg1: "出力"
for: "繰り返し"
_for:
arg1: "回数"
arg2: "処理"
thereIsEmptySlot: "スロット{slot}が空っぽやで!"
types: types:
string: "テキスト"
number: "数値"
boolean: "フラグ"
array: "リスト" array: "リスト"
stringArray: "テキストのリスト"
emptySlot: "空のスロット"
enviromentVariables: "環境変数"
pageVariables: "ページ要素"
argVariables: "入力スロット"
_notification: _notification:
fileUploaded: "ファイルが無事アップロードされたで。"
youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ"
youWereFollowed: "フォローされたで" youWereFollowed: "フォローされたで"
youReceivedFollowRequest: "フォロー許可してほしいみたいやな" youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
yourFollowRequestAccepted: "フォローさせてもろたで" yourFollowRequestAccepted: "フォローさせてもろたで"
youWereInvitedToGroup: "グループに招待されとるで" youWereInvitedToGroup: "グループに招待されとるで"
_types: _types:
all: "すべて"
follow: "フォロー" follow: "フォロー"
mention: "メンション" mention: "メンション"
renote: "Renote" renote: "Renote"
@ -588,9 +1269,24 @@ _notification:
receiveFollowRequest: "フォロー許可してほしいみたいやで" receiveFollowRequest: "フォロー許可してほしいみたいやで"
followRequestAccepted: "フォローが受理されたで" followRequestAccepted: "フォローが受理されたで"
_deck: _deck:
alwaysShowMainColumn: "いつもメインカラムを表示"
columnAlign: "カラムの寄せ"
columnMargin: "カラム間のマージン"
columnHeaderHeight: "カラムのヘッダー幅"
addColumn: "カラムを追加"
swapLeft: "左に移動"
swapRight: "右に移動"
swapUp: "上に移動"
swapDown: "下に移動"
stackLeft: "左に重ねる"
popRight: "右に出す"
profile: "プロファイル"
_columns: _columns:
main: "メイン"
widgets: "ウィジェット"
notifications: "通知" notifications: "通知"
tl: "タイムライン" tl: "タイムライン"
antenna: "アンテナ" antenna: "アンテナ"
list: "リスト" list: "リスト"
mentions: "あんた宛て" mentions: "あんた宛て"
direct: "ダイレクト"

View File

@ -552,6 +552,8 @@ manage: "관리"
plugins: "플러그인" plugins: "플러그인"
deck: "덱" deck: "덱"
undeck: "덱 해제" undeck: "덱 해제"
useBlurEffectForModal: "모달에 흐림 효과 사용"
useFullReactionPicker: "모든 기능이 포함된 리액션 선택기 사용"
width: "폭" width: "폭"
height: "높이" height: "높이"
large: "크게" large: "크게"
@ -613,6 +615,7 @@ send: "전송"
abuseMarkAsResolved: "해결됨으로 표시" abuseMarkAsResolved: "해결됨으로 표시"
openInNewTab: "새 탭에서 열기" openInNewTab: "새 탭에서 열기"
openInSideView: "사이드뷰로 열기" openInSideView: "사이드뷰로 열기"
defaultNavigationBehaviour: "기본 탐색 동작"
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다." editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
instanceTicker: "노트의 인스턴스 정보" instanceTicker: "노트의 인스턴스 정보"
waitingFor: "{x}을(를) 기다리고 있습니다" waitingFor: "{x}을(를) 기다리고 있습니다"
@ -684,6 +687,7 @@ textColor: "문자 색"
saveAs: "다른 이름으로 저장" saveAs: "다른 이름으로 저장"
advanced: "고급" advanced: "고급"
value: "값" value: "값"
createdAt: "생성된 날짜"
updatedAt: "수정한 날짜" updatedAt: "수정한 날짜"
saveConfirm: "저장하시겠습니까?" saveConfirm: "저장하시겠습니까?"
deleteConfirm: "삭제하시겠습니까?" deleteConfirm: "삭제하시겠습니까?"
@ -692,15 +696,47 @@ registry: "레지스트리"
closeAccount: "계정 폐쇄" closeAccount: "계정 폐쇄"
currentVersion: "현재 버전" currentVersion: "현재 버전"
latestVersion: "최신 버전" latestVersion: "최신 버전"
youAreRunningUpToDateClient: "사용 중인 클라이언트는 최신입니다."
newVersionOfClientAvailable: "새로운 버전의 클라이언트를 이용할 수 있습니다." newVersionOfClientAvailable: "새로운 버전의 클라이언트를 이용할 수 있습니다."
usageAmount: "사용량" usageAmount: "사용량"
capacity: "용량" capacity: "용량"
inUse: "사용중" inUse: "사용중"
editCode: "코드 수정" editCode: "코드 수정"
apply: "적용" apply: "적용"
receiveAnnouncementFromInstance: "이 인스턴스의 알림을 이메일로 수신할게요"
emailNotification: "메일 알림"
inChannelSearch: "채널에서 검색"
useReactionPickerForContextMenu: "우클릭하여 리액션 선택기 열기"
typingUsers: "{users} 님이 입력하고 있어요.."
jumpToSpecifiedDate: "특정 날짜로 이동"
showingPastTimeline: "과거의 타임라인을 표시하고 있어요"
clear: "지우기"
markAllAsRead: "모두 읽은 상태로 표시"
goBack: "뒤로"
unlikeConfirm: "좋아요를 취소할까요?"
fullView: "전체 화면"
quitFullView: "전체 화면 해제"
addDescription: "설명 추가"
userPagePinTip: "각 노트의 메뉴에서 「프로필에 고정」을 선택하는 것으로, 여기에 노트를 표시해 둘 수 있어요."
notSpecifiedMentionWarning: "수신자가 선택되지 않은 멘션이 있어요"
info: "정보"
userInfo: "유저 정보"
unknown: "알 수 없음"
onlineStatus: "온라인 상태"
hideOnlineStatus: "온라인 상태 숨기기"
hideOnlineStatusDescription: "온라인 상태를 숨기면, 검색과 같은 일부 기능에 영향을 미칠 수 있습니다."
online: "온라인"
active: "활동 중"
offline: "오프라인"
_email: _email:
_follow: _follow:
title: "새로운 팔로워가 있습니다" title: "새로운 팔로워가 있습니다"
_receiveFollowRequest:
title: "팔로우 요청을 받았습니다"
_plugin:
install: "플러그인 설치"
installWarn: "신뢰할 수 없는 플러그인은 설치하지 않는 것이 좋습니다."
manage: "플러그인 관리"
_registry: _registry:
scope: "범위" scope: "범위"
key: "키" key: "키"
@ -734,6 +770,7 @@ _mfm:
linkDescription: "문장의 특정 범위를 URL로 표시합니다." linkDescription: "문장의 특정 범위를 URL로 표시합니다."
bold: "굵음/볼드체" bold: "굵음/볼드체"
boldDescription: "문자를 굵게 강조합니다." boldDescription: "문자를 굵게 강조합니다."
small: "눈에 띄지 않음"
smallDescription: "내용을 작고 연하게 보이게 합니다." smallDescription: "내용을 작고 연하게 보이게 합니다."
center: "가운데 정렬" center: "가운데 정렬"
centerDescription: "내용을 가운데 정렬로 보이게 합니다." centerDescription: "내용을 가운데 정렬로 보이게 합니다."
@ -746,19 +783,35 @@ _mfm:
blockMath: "수식(블록)" blockMath: "수식(블록)"
blockMathDescription: "여러 줄의 수식(KaTeX)를 블록으로 보이게 합니다." blockMathDescription: "여러 줄의 수식(KaTeX)를 블록으로 보이게 합니다."
quote: "인용" quote: "인용"
quoteDescription: "내용을 인용문으로 표시합니다."
emoji: "커스텀 이모지" emoji: "커스텀 이모지"
emojiDescription: "커스텀 이모지의 이름을 쌍점(:)으로 감싸서 커스텀 이모지를 사용합니다." emojiDescription: "커스텀 이모지의 이름을 쌍점(:)으로 감싸서 커스텀 이모지를 사용합니다."
search: "검색" search: "검색"
searchDescription: "주어진 키워드가 입력된 검색창을 보이게 합니다." searchDescription: "주어진 키워드가 입력된 검색창을 보이게 합니다."
flip: "플립" flip: "플립"
flipDescription: "내용을 상하 또는 좌우로 반전시킵니다." flipDescription: "내용을 상하 또는 좌우로 반전시킵니다."
jelly: "애니메이션 (젤리)"
jellyDescription: "젤리처럼 탱글탱글한 느낌의 효과를 줍니다."
tada: "애니메이션 (짠!)"
tadaDescription: "짠! 하는 느낌의 효과를 줍니다."
jump: "애니메이션(점프)" jump: "애니메이션(점프)"
jumpDescription: "펄쩍 뛸 듯한 느낌의 효과를 줍니다."
bounce: "애니메이션 (바운스)"
bounceDescription: "통통 튀는 느낌의 효과를 줍니다."
shake: "애니메이션 (부들부들)"
shakeDescription: "부들부들 떠는 느낌의 효과를 줍니다."
twitch: "애니메이션 (경련)"
twitchDescription: "격하게 흔들리는 느낌의 효과를 줍니다."
spin: "애니메이션 (회전)"
spinDescription: "회전 효과를 줍니다."
x2: "크게" x2: "크게"
x2Description: "내용을 크게 표시합니다." x2Description: "내용을 크게 표시합니다."
x3: "더 크게" x3: "더 크게"
x3Description: "내용을 더 크게 표시합니다." x3Description: "내용을 더 크게 표시합니다."
x4: "매우 크게" x4: "매우 크게"
x4Description: "내용을 매우 크게 표시합니다." x4Description: "내용을 매우 크게 표시합니다."
blur: "흐림"
blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다."
font: "폰트" font: "폰트"
fontDescription: "내용의 글꼴을 지정할 수 있습니다." fontDescription: "내용의 글꼴을 지정할 수 있습니다."
_reversi: _reversi:
@ -772,6 +825,7 @@ _reversi:
thisGameIsStartedSoon: "잠시 후에 대국이 시작됩니다" thisGameIsStartedSoon: "잠시 후에 대국이 시작됩니다"
waitingForOther: "상대의 준비가 완료될 때까지 기다리고 있습니다" waitingForOther: "상대의 준비가 완료될 때까지 기다리고 있습니다"
waitingForMe: "당신의 준비 완료를 기다리고 있습니다" waitingForMe: "당신의 준비 완료를 기다리고 있습니다"
waitingBoth: "준비해 주세요"
ready: "준비 완료" ready: "준비 완료"
cancelReady: "준비 취소" cancelReady: "준비 취소"
opponentTurn: "상대의 차례입니다" opponentTurn: "상대의 차례입니다"
@ -812,6 +866,7 @@ _channel:
usersCount: "{n}명 참여 중" usersCount: "{n}명 참여 중"
notesCount: "{n}노트" notesCount: "{n}노트"
_sidebar: _sidebar:
full: "전체"
icon: "아이콘" icon: "아이콘"
hide: "숨기기" hide: "숨기기"
_wordMute: _wordMute:
@ -820,12 +875,15 @@ _wordMute:
muteWordsDescription2: "정규 표현식을 사용하려면 키워드를 빗금표(/)로 감싸 주세요." muteWordsDescription2: "정규 표현식을 사용하려면 키워드를 빗금표(/)로 감싸 주세요."
softDescription: "지정한 조건의 노트를 타임라인에서 숨깁니다." softDescription: "지정한 조건의 노트를 타임라인에서 숨깁니다."
hardDescription: "지정한 조건의 노트를 타임라인에 추가하지 않습니다. 타임라인에 추가되지 않은 노트는 조건을 변경해도 표시되지 않습니다." hardDescription: "지정한 조건의 노트를 타임라인에 추가하지 않습니다. 타임라인에 추가되지 않은 노트는 조건을 변경해도 표시되지 않습니다."
soft: "보통"
hard: "보다 높은 수준"
mutedNotes: "뮤트된 노트" mutedNotes: "뮤트된 노트"
_theme: _theme:
explore: "테마 찾아보기" explore: "테마 찾아보기"
install: "테마 설치" install: "테마 설치"
manage: "테마 관리" manage: "테마 관리"
code: "테마 코드" code: "테마 코드"
description: "설명"
installed: "{name} 테마가 설치되었습니다" installed: "{name} 테마가 설치되었습니다"
installedThemes: "설치된 테마" installedThemes: "설치된 테마"
builtinThemes: "표준 테마" builtinThemes: "표준 테마"
@ -843,17 +901,57 @@ _theme:
func: "함수" func: "함수"
funcKind: "함수 종류" funcKind: "함수 종류"
argument: "매개변수" argument: "매개변수"
basedProp: "기준으로 할 속성 이름"
alpha: "불투명도"
darken: "어두움"
lighten: "밝음"
inputConstantName: "상수 이름을 입력하세요" inputConstantName: "상수 이름을 입력하세요"
importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다." importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다."
deleteConstantConfirm: "상수 {const}를 삭제하시겠습니까?" deleteConstantConfirm: "상수 {const}를 삭제하시겠습니까?"
keys: keys:
accent: "강조 색상" accent: "강조 색상"
bg: "배경"
fg: "텍스트"
focus: "포커스"
indicator: "인디케이터"
panel: "패널" panel: "패널"
shadow: "그림자"
header: "헤더"
navBg: "사이드바 배경"
navFg: "사이드바 텍스트"
navHoverFg: "사이드바 텍스트 (호버)"
navActive: "사이드바 텍스트 (활성)"
navIndicator: "사이드바 인디케이터"
link: "링크" link: "링크"
hashtag: "해시태그" hashtag: "해시태그"
mention: "멘션" mention: "멘션"
mentionMe: "나에게 보낸 멘션"
renote: "Renote" renote: "Renote"
modalBg: "모달 배경"
divider: "구분선" divider: "구분선"
scrollbarHandle: "스크롤바 핸들"
scrollbarHandleHover: "스크롤바 핸들 (호버)"
dateLabelFg: "날짜 레이블 텍스트"
infoBg: "정보창 배경"
infoFg: "정보창 텍스트"
infoWarnBg: "경고창 배경"
infoWarnFg: "경고창 텍스트"
cwBg: "CW 버튼 배경"
cwFg: "CW 버튼 텍스트"
cwHoverBg: "CW 버튼 배경 (호버)"
toastBg: "알림창 배경"
toastFg: "알림창 텍스트"
buttonBg: "버튼 배경"
buttonHoverBg: "버튼 배경 (호버)"
inputBorder: "입력 필드 테두리"
listItemHoverBg: "리스트 항목 배경 (호버)"
driveFolderBg: "드라이브 폴더 배경"
wallpaperOverlay: "배경화면 오버레이"
badge: "배지"
messageBg: "채팅 배경"
accentDarken: "강조 색상 (어두움)"
accentLighten: "강조 색상 (밝음)"
fgHighlighted: "강조된 텍스트"
_sfx: _sfx:
note: "새 노트" note: "새 노트"
noteMy: "내 노트" noteMy: "내 노트"
@ -977,8 +1075,10 @@ _widgets:
postForm: "글 입력란" postForm: "글 입력란"
slideshow: "슬라이드 쇼" slideshow: "슬라이드 쇼"
button: "버튼" button: "버튼"
onlineUsers: "온라인 유저"
jobQueue: "작업 대기열" jobQueue: "작업 대기열"
serverMetric: "서버 통계" serverMetric: "서버 통계"
aiscript: "AiScript 콘솔"
_cw: _cw:
hide: "숨기기" hide: "숨기기"
show: "더 보기" show: "더 보기"
@ -1033,8 +1133,13 @@ _profile:
username: "유저명" username: "유저명"
description: "자기소개" description: "자기소개"
youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다." youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다."
metadata: "추가 정보"
metadataEdit: "추가 정보 편집"
metadataDescription: "프로필에 최대 4개의 추가 정보를 표시할 수 있어요"
metadataLabel: "라벨" metadataLabel: "라벨"
metadataContent: "내용" metadataContent: "내용"
changeAvatar: "아바타 이미지 변경"
changeBanner: "배너 이미지 변경"
_exportOrImport: _exportOrImport:
allNotes: "모든 노트" allNotes: "모든 노트"
followingList: "팔로잉" followingList: "팔로잉"
@ -1434,19 +1539,30 @@ _notification:
youGotQuote: "{name}님이 인용함" youGotQuote: "{name}님이 인용함"
youRenoted: "{name}님이 Renote" youRenoted: "{name}님이 Renote"
youGotPoll: "{name}님이 투표함" youGotPoll: "{name}님이 투표함"
youGotMessagingMessageFromUser: "{name} 님이 보낸 채팅이 있어요"
youGotMessagingMessageFromGroup: "{name}에서 보낸 채팅이 있어요"
youWereFollowed: "새로운 팔로워가 있습니다" youWereFollowed: "새로운 팔로워가 있습니다"
youReceivedFollowRequest: "새로운 팔로우 요청이 있습니다" youReceivedFollowRequest: "새로운 팔로우 요청이 있습니다"
yourFollowRequestAccepted: "팔로우 요청이 수락되었습니다" yourFollowRequestAccepted: "팔로우 요청이 수락되었습니다"
youWereInvitedToGroup: "그룹에 초대되었습니다" youWereInvitedToGroup: "그룹에 초대되었습니다"
_types: _types:
all: "전부"
follow: "팔로잉" follow: "팔로잉"
mention: "멘션" mention: "멘션"
reply: "답글"
renote: "Renote" renote: "Renote"
quote: "인용" quote: "인용"
reaction: "리액션" reaction: "리액션"
pollVote: "투표 참여"
receiveFollowRequest: "팔로우 요청을 받았을 때"
followRequestAccepted: "팔로우 요청이 승인되었을 때"
groupInvited: "그룹에 초대되었을 때"
app: "연동된 앱을 통한 알림"
_deck: _deck:
alwaysShowMainColumn: "메인 칼럼 항상 표시" alwaysShowMainColumn: "메인 칼럼 항상 표시"
columnAlign: "칼럼 정렬" columnAlign: "칼럼 정렬"
columnMargin: "칼럼 간 여백"
columnHeaderHeight: "칼럼 헤더 폭"
addColumn: "칼럼 추가" addColumn: "칼럼 추가"
swapLeft: "왼쪽으로 이동" swapLeft: "왼쪽으로 이동"
swapRight: "오른쪽으로 이동" swapRight: "오른쪽으로 이동"

View File

@ -644,6 +644,8 @@ backgroundColor: "Tło"
accentColor: "Akcent" accentColor: "Akcent"
textColor: "Tekst" textColor: "Tekst"
value: "Wartość" value: "Wartość"
goBack: "Wróć"
info: "Informacje"
_email: _email:
_follow: _follow:
title: "Zaobserwował(a) Cię" title: "Zaobserwował(a) Cię"
@ -762,6 +764,7 @@ _theme:
install: "Zainstaluj motyw" install: "Zainstaluj motyw"
manage: "Zarządzanie motywami" manage: "Zarządzanie motywami"
code: "Kod motywu" code: "Kod motywu"
description: "Opis"
installed: "Zainstalowano {name}" installed: "Zainstalowano {name}"
installedThemes: "Zainstalowane motywy" installedThemes: "Zainstalowane motywy"
builtinThemes: "Wbudowane motywy" builtinThemes: "Wbudowane motywy"

View File

@ -623,7 +623,7 @@ random: "Случайные"
system: "Система" system: "Система"
switchUi: "Выбор вида" switchUi: "Выбор вида"
desktop: "Стол" desktop: "Стол"
clip: "В подборку" clip: "Подборка"
createNew: "Новый документ" createNew: "Новый документ"
optional: "Необязательно" optional: "Необязательно"
createNewClip: "Новая подборка" createNewClip: "Новая подборка"
@ -710,6 +710,8 @@ typingUsers: "Стук клавиш. Это {users}…"
jumpToSpecifiedDate: "Перейти к заданной дате" jumpToSpecifiedDate: "Перейти к заданной дате"
showingPastTimeline: "Отображается старая лента" showingPastTimeline: "Отображается старая лента"
clear: "Очистить" clear: "Очистить"
goBack: "Выход"
info: "Описание"
_email: _email:
_follow: _follow:
title: "Новый подписчик" title: "Новый подписчик"
@ -865,6 +867,7 @@ _theme:
install: "Установить тему" install: "Установить тему"
manage: "Менеджер тем" manage: "Менеджер тем"
code: "Код темы" code: "Код темы"
description: "Описание"
installed: "Тема «{name}» установлена." installed: "Тема «{name}» установлена."
installedThemes: "Установленные темы" installedThemes: "Установленные темы"
builtinThemes: "Встроенные темы" builtinThemes: "Встроенные темы"

View File

@ -689,6 +689,8 @@ deleteConfirm: "Ви дійсно бажаєте це видалити?"
invalidValue: "Некоректне значення." invalidValue: "Некоректне значення."
registry: "Реєстр" registry: "Реєстр"
closeAccount: "Закрити обліковий запис" closeAccount: "Закрити обліковий запис"
goBack: "Назад"
info: "Інформація"
_email: _email:
_follow: _follow:
title: "Новий підписник" title: "Новий підписник"
@ -830,6 +832,7 @@ _theme:
install: "Встановити тему" install: "Встановити тему"
manage: "Керування темами" manage: "Керування темами"
code: "Код теми" code: "Код теми"
description: "Опис"
installed: "Тему {name} встановлено" installed: "Тему {name} встановлено"
installedThemes: "Встановлені теми" installedThemes: "Встановлені теми"
builtinThemes: "Вбудоваі теми" builtinThemes: "Вбудоваі теми"

View File

@ -584,7 +584,7 @@ smtpSecureInfo: "使用STARTTLS时关闭。"
testEmail: "邮件发送测试" testEmail: "邮件发送测试"
wordMute: "文字屏蔽" wordMute: "文字屏蔽"
userSaysSomething: "{name}说了什么" userSaysSomething: "{name}说了什么"
makeActive: "激活" makeActive: "启用"
display: "显示" display: "显示"
copy: "复制" copy: "复制"
metrics: "指标" metrics: "指标"
@ -687,6 +687,7 @@ textColor: "文本"
saveAs: "另存为" saveAs: "另存为"
advanced: "高级" advanced: "高级"
value: "值" value: "值"
createdAt: "创建日期"
updatedAt: "更新时间" updatedAt: "更新时间"
saveConfirm: "确定保存?" saveConfirm: "确定保存?"
deleteConfirm: "确定删除?" deleteConfirm: "确定删除?"
@ -710,6 +711,23 @@ typingUsers: "{users}正在输入"
jumpToSpecifiedDate: "跳转到特定日期" jumpToSpecifiedDate: "跳转到特定日期"
showingPastTimeline: "显示过去的时间线" showingPastTimeline: "显示过去的时间线"
clear: "清除" clear: "清除"
markAllAsRead: "全部标记为已读"
goBack: "返回"
unlikeConfirm: "取消赞?"
fullView: "全屏"
quitFullView: "退出全屏"
addDescription: "添加描述"
userPagePinTip: "在帖子的菜单中选择“置顶”,即可显示该条帖子。"
notSpecifiedMentionWarning: "有未指定的提及"
info: "关于"
userInfo: "用户信息"
unknown: "未知"
onlineStatus: "在线状态"
hideOnlineStatus: "隐藏在线状态"
hideOnlineStatusDescription: "隐藏在线状态后,可能会降低例如搜索等功能的便利性。"
online: "在线"
active: "活动"
offline: "离线"
_email: _email:
_follow: _follow:
title: "你有新的关注者" title: "你有新的关注者"
@ -865,6 +883,7 @@ _theme:
install: "安装主题" install: "安装主题"
manage: "主题管理" manage: "主题管理"
code: "主题代码" code: "主题代码"
description: "描述"
installed: "{name} 已安装" installed: "{name} 已安装"
installedThemes: "已安装的主题" installedThemes: "已安装的主题"
builtinThemes: "标准主题" builtinThemes: "标准主题"

View File

@ -149,7 +149,7 @@ searchWith: "搜尋: {q}"
youHaveNoLists: "你沒有任何清單" youHaveNoLists: "你沒有任何清單"
followConfirm: "你真的要追隨{name}嗎?" followConfirm: "你真的要追隨{name}嗎?"
proxyAccount: "代理帳號" proxyAccount: "代理帳號"
proxyAccountDescription: "代理帳號是在某些情況下充當其他服器用戶的帳號。例如,當用戶將一個來自其他服器的帳號放在列表中時,由於沒有其他用戶關注該帳號,該指令不會傳送到該服器上,因此會由代理帳戶關注。" proxyAccountDescription: "代理帳號是在某些情況下充當其他服器用戶的帳號。例如,當用戶將一個來自其他服器的帳號放在列表中時,由於沒有其他用戶關注該帳號,該指令不會傳送到該服器上,因此會由代理帳戶關注。"
host: "主機" host: "主機"
selectUser: "選取使用者" selectUser: "選取使用者"
recipient: "收件人" recipient: "收件人"
@ -182,7 +182,7 @@ clearQueue: "清除佇列"
clearQueueConfirmTitle: "確定要清除佇列嗎?" clearQueueConfirmTitle: "確定要清除佇列嗎?"
clearQueueConfirmText: "未發佈的帖子將不會發佈。您通常不需要確認。" clearQueueConfirmText: "未發佈的帖子將不會發佈。您通常不需要確認。"
clearCachedFiles: "清除快取資料" clearCachedFiles: "清除快取資料"
clearCachedFilesConfirm: "確定要清除存資料嗎?" clearCachedFilesConfirm: "確定要清除所有遠端暫存資料嗎?"
blockedInstances: "已封鎖的實例" blockedInstances: "已封鎖的實例"
blockedInstancesDescription: "請逐行輸入需要封鎖的實例。已封鎖的實例將無法與本實例進行通訊。" blockedInstancesDescription: "請逐行輸入需要封鎖的實例。已封鎖的實例將無法與本實例進行通訊。"
muteAndBlock: "靜音和封鎖" muteAndBlock: "靜音和封鎖"
@ -215,7 +215,7 @@ retypedNotMatch: "兩次輸入不一致。"
currentPassword: "目前密碼" currentPassword: "目前密碼"
newPassword: "新密碼" newPassword: "新密碼"
newPasswordRetype: "確認密碼" newPasswordRetype: "確認密碼"
attachFile: "添加附件" attachFile: "上傳附件"
more: "更多!" more: "更多!"
featured: "精選" featured: "精選"
usernameOrUserId: "使用者名稱或用戶ID" usernameOrUserId: "使用者名稱或用戶ID"
@ -256,12 +256,12 @@ registeredDate: "註冊日期"
location: "位置" location: "位置"
theme: "外觀主題" theme: "外觀主題"
themeForLightMode: "在淺色模式下使用的主題" themeForLightMode: "在淺色模式下使用的主題"
themeForDarkMode: "在深色模式下使用的主題" themeForDarkMode: "在黑暗模式下使用的主題"
light: "淺色" light: "淺色"
dark: "暗" dark: "暗"
lightThemes: "明亮主題" lightThemes: "明亮主題"
darkThemes: "暗主題" darkThemes: "暗主題"
syncDeviceDarkMode: "將深色模式與設備設置同步" syncDeviceDarkMode: "將黑暗模式與設備設置同步"
drive: "雲端硬碟" drive: "雲端硬碟"
fileName: "檔案名稱" fileName: "檔案名稱"
selectFile: "選擇檔案" selectFile: "選擇檔案"
@ -313,7 +313,7 @@ connectSerice: "連線"
disconnectSerice: "中斷連線" disconnectSerice: "中斷連線"
enableLocalTimeline: "開啟本地時間軸" enableLocalTimeline: "開啟本地時間軸"
enableGlobalTimeline: "啟用公開時間軸" enableGlobalTimeline: "啟用公開時間軸"
disablingTimelinesInfo: "即使您禁用了時間線功能,管理員和協調人仍可以繼續使用,以方便您。" disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。"
registration: "註冊" registration: "註冊"
enableRegistration: "開啟新用戶註冊" enableRegistration: "開啟新用戶註冊"
invite: "邀請" invite: "邀請"
@ -373,14 +373,14 @@ about: "資訊"
aboutMisskey: "關於 Misskey" aboutMisskey: "關於 Misskey"
administrator: "管理員" administrator: "管理員"
token: "權杖" token: "權杖"
twoStepAuthentication: "雙重身份驗證" twoStepAuthentication: "兩階段驗證"
moderator: "板主" moderator: "板主"
nUsersMentioned: "提到了{n}" nUsersMentioned: "提到了{n}"
securityKey: "安全金鑰" securityKey: "安全金鑰"
securityKeyName: "金鑰名稱" securityKeyName: "金鑰名稱"
registerSecurityKey: "註冊安全金鑰" registerSecurityKey: "註冊安全金鑰"
lastUsed: "最後活躍時間" lastUsed: "上次使用"
unregister: "刪除賬戶" unregister: "註銷帳號"
passwordLessLogin: "設置無密碼登入" passwordLessLogin: "設置無密碼登入"
resetPassword: "重置密碼" resetPassword: "重置密碼"
newPasswordIs: "新密碼為「{password}」" newPasswordIs: "新密碼為「{password}」"
@ -419,7 +419,7 @@ quoteAttached: "引用"
quoteQuestion: "是否要引用?" quoteQuestion: "是否要引用?"
noMessagesYet: "沒有訊息" noMessagesYet: "沒有訊息"
newMessageExists: "有新的訊息" newMessageExists: "有新的訊息"
onlyOneFileCanBeAttached: "只能加一個附件" onlyOneFileCanBeAttached: "只能加一個附件"
signinRequired: "請先登入" signinRequired: "請先登入"
invitations: "邀請" invitations: "邀請"
invitationCode: "邀請碼" invitationCode: "邀請碼"
@ -446,7 +446,7 @@ useOsNativeEmojis: "使用OS原生表情符號"
youHaveNoGroups: "找不到群組" youHaveNoGroups: "找不到群組"
joinOrCreateGroup: "請加入現有群組,或創建新群組。" joinOrCreateGroup: "請加入現有群組,或創建新群組。"
noHistory: "沒有歷史紀錄" noHistory: "沒有歷史紀錄"
signinHistory: "登歷史" signinHistory: "登歷史"
disableAnimatedMfm: "禁用MFM動畫" disableAnimatedMfm: "禁用MFM動畫"
doing: "正在進行" doing: "正在進行"
category: "類別" category: "類別"
@ -482,7 +482,7 @@ objectStorageEndpointDesc: "如要使用AWS S3請留空。否則請根據伺
objectStorageRegion: "地域Region" objectStorageRegion: "地域Region"
objectStorageUseSSL: "使用SSL" objectStorageUseSSL: "使用SSL"
objectStorageUseProxy: "使用網路代理" objectStorageUseProxy: "使用網路代理"
objectStorageSetPublicRead: "上時設定為\"public-read\"" objectStorageSetPublicRead: "上時設定為\"public-read\""
serverLogs: "伺服器日誌" serverLogs: "伺服器日誌"
deleteAll: "刪除所有記錄" deleteAll: "刪除所有記錄"
showFixedPostForm: "於時間軸頁頂顯示「發送貼文」方框" showFixedPostForm: "於時間軸頁頂顯示「發送貼文」方框"
@ -495,7 +495,7 @@ popout: "彈出型窗口"
volume: "音量" volume: "音量"
masterVolume: "主音量" masterVolume: "主音量"
details: "詳細資訊" details: "詳細資訊"
chooseEmoji: "選擇您的表情符號\n" chooseEmoji: "選擇您的表情符號"
unableToProcess: "操作無法完成" unableToProcess: "操作無法完成"
recentUsed: "最近使用" recentUsed: "最近使用"
install: "安裝" install: "安裝"
@ -512,11 +512,11 @@ scratchpad: "暫存記憶體"
output: "輸出" output: "輸出"
script: "腳本" script: "腳本"
disablePagesScript: "停用頁面的AiScript腳本" disablePagesScript: "停用頁面的AiScript腳本"
updateRemoteUser: "更新非本地用戶資料" updateRemoteUser: "更新遠端用戶資料"
deleteAllFiles: "刪除所有檔案" deleteAllFiles: "刪除所有檔案"
deleteAllFilesConfirm: "要删除所有檔案" deleteAllFilesConfirm: "要删除所有檔案"
removeAllFollowing: "解除所有追" removeAllFollowing: "解除所有追"
removeAllFollowingDescription: "解除{host}所有的跟隨。在實例不再存在時執行。" removeAllFollowingDescription: "解除{host}所有的追蹤。在實例不再存在時執行。"
userSuspended: "該用戶已被凍結" userSuspended: "該用戶已被凍結"
userSilenced: "該用戶已被禁言。" userSilenced: "該用戶已被禁言。"
sidebar: "側邊列" sidebar: "側邊列"
@ -524,12 +524,12 @@ divider: "分割線"
addItem: "新增項目" addItem: "新增項目"
rooms: "房間" rooms: "房間"
relays: "中繼" relays: "中繼"
addRelay: "添加中繼" addRelay: "新增中繼"
inboxUrl: "私信URL" inboxUrl: "收件夾URL"
addedRelays: "已加的中繼" addedRelays: "已加的中繼"
serviceworkerInfo: "您需要啟用推送通知" serviceworkerInfo: "您需要啟用推送通知"
deletedNote: "已删除的貼文" deletedNote: "已删除的貼文"
invisibleNote: "隱藏的帖子" invisibleNote: "隱藏的貼文"
enableInfiniteScroll: "啟用自動滾動頁面模式" enableInfiniteScroll: "啟用自動滾動頁面模式"
visibility: "可見性" visibility: "可見性"
poll: "投票" poll: "投票"
@ -546,7 +546,7 @@ plugins: "插件"
deck: "多欄模式" deck: "多欄模式"
undeck: "取消多欄模式" undeck: "取消多欄模式"
useBlurEffectForModal: "在模態框使用模糊效果" useBlurEffectForModal: "在模態框使用模糊效果"
useFullReactionPicker: "使用尺寸的情感選擇" useFullReactionPicker: "使用尺寸的反應選擇"
width: "寬度" width: "寬度"
height: "高度" height: "高度"
large: "大" large: "大"
@ -555,7 +555,7 @@ small: "小"
permission: "權限" permission: "權限"
enableAll: "啟用全部" enableAll: "啟用全部"
disableAll: "停用全部" disableAll: "停用全部"
tokenRequested: "允許訪問帳號" tokenRequested: "允許存取帳號"
notificationType: "通知形式" notificationType: "通知形式"
edit: "編輯" edit: "編輯"
useStarForReactionFallback: "以★代替未知的表情符號" useStarForReactionFallback: "以★代替未知的表情符號"
@ -566,11 +566,11 @@ email: "電子郵件"
emailAddress: "電郵地址" emailAddress: "電郵地址"
smtpConfig: "SMTP伺服器設定" smtpConfig: "SMTP伺服器設定"
smtpHost: "主機" smtpHost: "主機"
smtpPort: "端口" smtpPort: ""
smtpUser: "使用者名稱" smtpUser: "使用者名稱"
smtpPass: "密碼" smtpPass: "密碼"
emptyToDisableSmtpAuth: "留空使用者名稱和密碼以禁用SMTP驗證。" emptyToDisableSmtpAuth: "留空使用者名稱和密碼以關閉SMTP驗證。"
testEmail: "郵件測試發送" testEmail: "測試郵件發送"
wordMute: "靜音文字" wordMute: "靜音文字"
userSaysSomething: "{name}說了什麼" userSaysSomething: "{name}說了什麼"
makeActive: "啟用" makeActive: "啟用"
@ -587,9 +587,9 @@ notificationSetting: "通知設定"
notificationSettingDesc: "選擇顯示通知的類型" notificationSettingDesc: "選擇顯示通知的類型"
useGlobalSetting: "使用全域設定" useGlobalSetting: "使用全域設定"
other: "其他" other: "其他"
regenerateLoginToken: "生登入權杖" regenerateLoginToken: "重新產生登入權杖"
regenerateLoginTokenDescription: "生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦再生,所有裝置將會被登出。" regenerateLoginTokenDescription: "重新產生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦重產,所有裝置將會被登出。"
fileIdOrUrl: "檔ID或URL" fileIdOrUrl: "檔ID或URL"
chatOpenBehavior: "開啟聊天窗口時的行為" chatOpenBehavior: "開啟聊天窗口時的行為"
behavior: "行為" behavior: "行為"
sample: "範例" sample: "範例"
@ -597,12 +597,12 @@ abuseReports: "檢舉"
reportAbuse: "檢舉" reportAbuse: "檢舉"
reportAbuseOf: "檢舉{name}" reportAbuseOf: "檢舉{name}"
fillAbuseReportDescription: "請填寫檢舉的詳細理由。可以的話請附上針對的URL網址。" fillAbuseReportDescription: "請填寫檢舉的詳細理由。可以的話請附上針對的URL網址。"
abuseReported: "內容已經發送。感謝您的報告。" abuseReported: "回報已送出。感謝您的報告。"
send: "發送" send: "發送"
abuseMarkAsResolved: "處理完畢" abuseMarkAsResolved: "處理完畢"
openInNewTab: "在新分頁中開啟" openInNewTab: "在新分頁中開啟"
openInSideView: "在側欄中開啟" openInSideView: "在側欄中開啟"
editTheseSettingsMayBreakAccount: "修改這些設定可能會毀您的帳戶" editTheseSettingsMayBreakAccount: "修改這些設定可能會毀您的帳戶"
instanceTicker: "貼文的實例來源" instanceTicker: "貼文的實例來源"
waitingFor: "等待{x}" waitingFor: "等待{x}"
random: "隨機" random: "隨機"
@ -618,7 +618,7 @@ i18nInfo: "Misskey已經被志願者們翻譯成各種語言版本如果想
manageAccessTokens: "管理存取權杖" manageAccessTokens: "管理存取權杖"
accountInfo: "帳戶資訊" accountInfo: "帳戶資訊"
notesCount: "貼文數量" notesCount: "貼文數量"
repliesCount: "回覆數量\n" repliesCount: "回覆數量"
renotesCount: "轉發數量" renotesCount: "轉發數量"
repliedCount: "回覆數量" repliedCount: "回覆數量"
renotedCount: "轉發次數" renotedCount: "轉發次數"
@ -632,26 +632,27 @@ yes: "確定"
no: "取消" no: "取消"
driveFilesCount: "雲端硬碟檔案數量" driveFilesCount: "雲端硬碟檔案數量"
driveUsage: "雲端硬碟使用量" driveUsage: "雲端硬碟使用量"
noCrawleDescription: "請求網路搜尋引擎不要索引你的個人資料頁、貼文及頁面等。" noCrawle: "拒絕搜尋引擎索引"
noCrawleDescription: "要求網路搜尋引擎不要索引你的個人資料頁、貼文及頁面等。"
lockedAccountInfo: "即使你通過了追隨者請求,除非你將貼文的可見性設定為 「追隨者」,否則任何人都能看見你的貼文。" lockedAccountInfo: "即使你通過了追隨者請求,除非你將貼文的可見性設定為 「追隨者」,否則任何人都能看見你的貼文。"
loadRawImages: "以原始圖像質量顯示附件圖的縮圖" loadRawImages: "以原始圖顯示附件圖的縮圖"
disableShowingAnimatedImages: "不播放動態圖" disableShowingAnimatedImages: "不播放動態圖"
notSet: "未設定" notSet: "未設定"
emailVerified: "已成功驗證您的電郵" emailVerified: "已成功驗證您的電郵"
noteFavoritesCount: "我的最愛貼文的數目" noteFavoritesCount: "我的最愛貼文的數目"
pageLikesCount: "頁面被喜歡次數" pageLikesCount: "頁面被按讚次數"
pageLikedCount: "頁面被喜歡次數" pageLikedCount: "頁面被按讚次數"
contact: "聯絡人" contact: "聯絡人"
useSystemFont: "使用系統默認的字型" useSystemFont: "使用系統預設的字型"
clips: "摘錄" clips: "摘錄"
experimentalFeatures: "測試中的功能" experimentalFeatures: "實驗中的功能"
developer: "開發者" developer: "開發者"
makeExplorable: "自己的帳戶能夠在“探索”版面顯示" makeExplorable: "使自己的帳戶能夠在“探索”頁面中顯示"
makeExplorableDescription: "如果關閉,帳戶將不會被顯示在\"探索\"面中。" makeExplorableDescription: "如果關閉,帳戶將不會被顯示在\"探索\"面中。"
showGapBetweenNotesInTimeline: "分開顯示時間線上的貼文。" showGapBetweenNotesInTimeline: "分開顯示時間線上的貼文。"
duplicate: "複製" duplicate: "複製"
left: "左" left: "左"
center: "向中央" center: "置中"
wide: "寬" wide: "寬"
narrow: "窄" narrow: "窄"
reloadToApplySetting: "設定將會在頁面重新載入之後生效。要現在就重載頁面嗎?" reloadToApplySetting: "設定將會在頁面重新載入之後生效。要現在就重載頁面嗎?"
@ -660,10 +661,13 @@ clearCache: "清除快取資料"
onlineUsersCount: "{n}人正在線上" onlineUsersCount: "{n}人正在線上"
nUsers: "{n}用戶" nUsers: "{n}用戶"
nNotes: "{n}貼文" nNotes: "{n}貼文"
sendErrorReports: "傳送錯誤報告"
sendErrorReportsDescription: "啟用後問題報告將傳送至開發者以提升軟體品質。問題報告可能包括OS版本瀏覽器類型行為歷史記錄等。"
myTheme: "我的佈景主題" myTheme: "我的佈景主題"
backgroundColor: "背景" backgroundColor: "背景"
accentColor: "重點色彩" accentColor: "重點色彩"
textColor: "文" textColor: "文"
saveAs: "另存為..."
advanced: "進階" advanced: "進階"
value: "數值" value: "數值"
updatedAt: "最後更新" updatedAt: "最後更新"
@ -672,13 +676,22 @@ deleteConfirm: "你確定要刪除嗎?"
invalidValue: "輸入值無效。" invalidValue: "輸入值無效。"
registry: "登錄表" registry: "登錄表"
closeAccount: "停用帳戶" closeAccount: "停用帳戶"
currentVersion: "前版本" currentVersion: "前版本"
latestVersion: "最新版本" latestVersion: "最新版本"
youAreRunningUpToDateClient: "您所使用的用戶端已經是最新的。"
newVersionOfClientAvailable: "新版本的用戶端可用。" newVersionOfClientAvailable: "新版本的用戶端可用。"
usageAmount: "使用量" usageAmount: "使用量"
capacity: "容量" capacity: "容量"
inUse: "已使用" inUse: "已使用"
editCode: "編輯代碼"
apply: "套用"
emailNotification: "郵件通知"
inChannelSearch: "頻道内搜尋"
typingUsers: "{users}輸入中..."
jumpToSpecifiedDate: "跳轉到特定日期"
clear: "清除" clear: "清除"
goBack: "返回"
info: "資訊"
_email: _email:
_follow: _follow:
title: "您有新的追隨者" title: "您有新的追隨者"
@ -691,13 +704,13 @@ _registry:
domain: "域" domain: "域"
createKey: "新增機碼" createKey: "新增機碼"
_aboutMisskey: _aboutMisskey:
about: "Misskey是由syuilo2014年開發的開源軟。" about: "Misskey是由syuilo2014年開發的開源軟。"
contributors: "主要貢獻者" contributors: "主要貢獻者"
allContributors: "全體貢獻人員" allContributors: "全體貢獻人員"
source: "原始碼" source: "原始碼"
translation: "翻譯Misskey" translation: "翻譯Misskey"
donate: "捐贈給Misskey" donate: "贊助Misskey"
morePatrons: "感謝你們的支持、 幫助。 🥰" morePatrons: "還有許許多多幫助我們的其他人,非常感謝你們。 🥰"
patrons: "贊助者" patrons: "贊助者"
_nsfw: _nsfw:
respect: "隱藏敏感內容" respect: "隱藏敏感內容"
@ -706,7 +719,7 @@ _nsfw:
_mfm: _mfm:
cheatSheet: "MFM代碼小抄" cheatSheet: "MFM代碼小抄"
intro: "MFM是Misskey專用的標記語言可以在Misskey中的各個位置使用。 您可以這裏看到MFM可用語法列表。" intro: "MFM是Misskey專用的標記語言可以在Misskey中的各個位置使用。 您可以這裏看到MFM可用語法列表。"
dummy: "通過Misskey擴展Fediverse的世界" dummy: "Misskey拓展了Fediverse的世界"
mention: "提及" mention: "提及"
mentionDescription: "透過 @+用戶名 來標示特定使用者。" mentionDescription: "透過 @+用戶名 來標示特定使用者。"
hashtag: "#tag" hashtag: "#tag"
@ -741,7 +754,7 @@ _mfm:
x4Description: "將顯示內容放至最大。" x4Description: "將顯示內容放至最大。"
blur: "模糊" blur: "模糊"
font: "字型" font: "字型"
fontDescription: "可設置顯示內容所使用的字型" fontDescription: "您可以設定顯示內容的字型"
_reversi: _reversi:
reversi: "黑白棋" reversi: "黑白棋"
gameSettings: "對弈設定" gameSettings: "對弈設定"
@ -762,7 +775,7 @@ _reversi:
pastTurnOf: "{name}的回合" pastTurnOf: "{name}的回合"
surrender: "認輸" surrender: "認輸"
surrendered: "對手認輸" surrendered: "對手認輸"
drawn: "平" drawn: "平"
won: "{name}獲勝" won: "{name}獲勝"
black: "黑" black: "黑"
white: "白" white: "白"
@ -772,6 +785,7 @@ _reversi:
allGames: "所有對弈" allGames: "所有對弈"
ended: "已結束" ended: "已結束"
playing: "正在對弈" playing: "正在對弈"
loopedMap: "循環棋盤"
_instanceTicker: _instanceTicker:
none: "隱藏" none: "隱藏"
remote: "向遠端使用者顯示" remote: "向遠端使用者顯示"
@ -785,14 +799,14 @@ _channel:
edit: "編輯頻道" edit: "編輯頻道"
setBanner: "設定橫幅" setBanner: "設定橫幅"
removeBanner: "移除封面圖" removeBanner: "移除封面圖"
featured: "發燒內容" featured: "熱門貼文"
owned: "管理中" owned: "管理中"
following: "關注中" following: "關注中"
usersCount: "有{n}人參與" usersCount: "有{n}人參與"
notesCount: "有{n}個帖子" notesCount: "有{n}個貼文"
_sidebar: _sidebar:
full: "全部" full: "全部"
icon: "頭像" icon: "大頭貼"
hide: "隱藏" hide: "隱藏"
_wordMute: _wordMute:
muteWords: "加入靜音文字" muteWords: "加入靜音文字"
@ -803,6 +817,7 @@ _theme:
install: "安裝佈景主題" install: "安裝佈景主題"
manage: "佈景主題管理員" manage: "佈景主題管理員"
code: "主題代碼" code: "主題代碼"
description: "描述"
installed: "{name}已安裝" installed: "{name}已安裝"
installedThemes: "已經安裝的主題" installedThemes: "已經安裝的主題"
builtinThemes: "標準主題" builtinThemes: "標準主題"
@ -822,16 +837,17 @@ _theme:
keys: keys:
bg: "背景" bg: "背景"
fg: "文本" fg: "文本"
panel: "面板"
shadow: "陰影" shadow: "陰影"
navIndicator: "側邊欄指示符" navIndicator: "側邊欄指示符"
link: "鏈接" link: "鏈接"
hashtag: "#tag" hashtag: "#tag"
mention: "提" mention: "提"
mentionMe: "提我" mentionMe: "提到了我"
renote: "轉發貼文" renote: "轉發貼文"
divider: "分割線" divider: "分割線"
scrollbarHandle: "動條" scrollbarHandle: "動條"
scrollbarHandleHover: "動條 (漂浮)" scrollbarHandleHover: "動條 (漂浮)"
dateLabelFg: "日期標籤文字" dateLabelFg: "日期標籤文字"
infoBg: "資訊背景" infoBg: "資訊背景"
infoFg: "資訊內容" infoFg: "資訊內容"
@ -846,7 +862,7 @@ _theme:
listItemHoverBg: "列表物品背景 (漂浮)" listItemHoverBg: "列表物品背景 (漂浮)"
driveFolderBg: "雲端硬碟文件夾背景" driveFolderBg: "雲端硬碟文件夾背景"
badge: "獎章" badge: "獎章"
messageBg: "私背景" messageBg: "私背景"
accentDarken: "強調色(偏暗)" accentDarken: "強調色(偏暗)"
accentLighten: "強調色(明亮)" accentLighten: "強調色(明亮)"
fgHighlighted: "高亮顯示文本" fgHighlighted: "高亮顯示文本"
@ -880,15 +896,15 @@ _tutorial:
step1_3: "由於你沒有發佈任何貼文,也沒有追隨任何人,所以你的時間軸目前是空的。" step1_3: "由於你沒有發佈任何貼文,也沒有追隨任何人,所以你的時間軸目前是空的。"
step2_1: "在發文或追隨其他人之前先讓我們設定一下個人資料吧。" step2_1: "在發文或追隨其他人之前先讓我們設定一下個人資料吧。"
step2_2: "提供一些關於自己的資訊來讓其他人更有追隨你的意願。" step2_2: "提供一些關於自己的資訊來讓其他人更有追隨你的意願。"
step3_1: "個人資料都打理好了嗎?" step3_1: "個人資料都設定好了嗎?"
step3_2: "下一步讓我們來試試看發個文,按一下畫面上的鉛筆圖示來開始" step3_2: "接下來,讓我們來試試看發個文,按一下畫面上的鉛筆圖示來開始"
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文" step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
step3_4: "不知道該寫什麼內容嗎試試看「開始使用Misskey了」如何。" step3_4: "不知道該寫什麼內容嗎試試看「開始使用Misskey了」如何。"
step4_1: "貼文發出去了嗎?" step4_1: "貼文發出去了嗎?"
step4_2: "如果你的貼文出現在時間軸上,就代表發文成功。" step4_2: "如果你的貼文出現在時間軸上,就代表發文成功。"
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。" step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
step5_2: "你會在{featured}上看到受歡迎的貼文,你也可以從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。" step5_2: "你會在{featured}上看到受歡迎的貼文,你也可以從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。"
step5_3: "想要追隨其他人,只要點擊他們的頭像並按「追隨」即可。" step5_3: "想要追隨其他人,只要點擊他們的大頭貼並按「追隨」即可。"
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。" step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
step6_1: "現在你可以在時間軸上看到其他用戶的貼文。" step6_1: "現在你可以在時間軸上看到其他用戶的貼文。"
step6_2: "你也可以對別人的貼文作出「情感」,作出簡單的回覆。" step6_2: "你也可以對別人的貼文作出「情感」,作出簡單的回覆。"
@ -899,13 +915,13 @@ _2fa:
alreadyRegistered: "此設備已經被註冊過了" alreadyRegistered: "此設備已經被註冊過了"
registerDevice: "註冊裝置" registerDevice: "註冊裝置"
step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。" step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。"
step2: "然後,掃描幕上的QR code。" step2: "然後,掃描幕上的QR code。"
_permissions: _permissions:
"read:account": "查看帳戶信息" "read:account": "查看帳戶信息"
"write:account": "更改帳戶信息" "write:account": "更改帳戶信息"
"read:blocks": "已封鎖用戶名單" "read:blocks": "已封鎖用戶名單"
"write:blocks": "編輯已封鎖用戶名單" "write:blocks": "編輯已封鎖用戶名單"
"read:drive": "存取雲端硬碟\n" "read:drive": "存取雲端硬碟"
"write:drive": "編輯雲端硬碟的檔案" "write:drive": "編輯雲端硬碟的檔案"
"read:favorites": "瀏覽我的最愛" "read:favorites": "瀏覽我的最愛"
"write:favorites": "編輯我的最愛列表" "write:favorites": "編輯我的最愛列表"
@ -922,7 +938,7 @@ _permissions:
"write:votes": "投票" "write:votes": "投票"
"read:pages": "顯示頁面" "read:pages": "顯示頁面"
"write:pages": "編輯頁面" "write:pages": "編輯頁面"
"read:page-likes": "顯示頁面的已喜歡" "read:page-likes": "顯示已按讚的頁面"
"write:page-likes": "編輯頁面上喜歡" "write:page-likes": "編輯頁面上喜歡"
"read:user-groups": "顯示使用者群組" "read:user-groups": "顯示使用者群組"
"write:user-groups": "編輯使用者群組" "write:user-groups": "編輯使用者群組"
@ -964,7 +980,7 @@ _widgets:
postForm: "發佈窗口" postForm: "發佈窗口"
slideshow: "幻燈片" slideshow: "幻燈片"
button: "按鈕" button: "按鈕"
onlineUsers: "線上的用戶" onlineUsers: "線上的用戶"
jobQueue: "佇列" jobQueue: "佇列"
_cw: _cw:
hide: "隱藏" hide: "隱藏"

View File

@ -4,8 +4,8 @@ export class AddSomeUrls1557761316509 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> { public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "meta" ADD "ToSUrl" character varying(512)`); await queryRunner.query(`ALTER TABLE "meta" ADD "ToSUrl" character varying(512)`);
await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://github.com/syuilo/misskey'`); await queryRunner.query(`ALTER TABLE "meta" ADD "repositoryUrl" character varying(512) NOT NULL DEFAULT 'https://github.com/misskey-dev/misskey'`);
await queryRunner.query(`ALTER TABLE "meta" ADD "feedbackUrl" character varying(512) DEFAULT 'https://github.com/syuilo/misskey/issues/new'`); await queryRunner.query(`ALTER TABLE "meta" ADD "feedbackUrl" character varying(512) DEFAULT 'https://github.com/misskey-dev/misskey/issues/new'`);
} }
public async down(queryRunner: QueryRunner): Promise<any> { public async down(queryRunner: QueryRunner): Promise<any> {

View File

@ -0,0 +1,16 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class userLastActiveDate1618637372000 implements MigrationInterface {
name = 'userLastActiveDate1618637372000'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" ADD "lastActiveDate" TIMESTAMP WITH TIME ZONE DEFAULT NULL`);
await queryRunner.query(`CREATE INDEX "IDX_seoignmeoprigmkpodgrjmkpormg" ON "user" ("lastActiveDate") `);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "IDX_seoignmeoprigmkpodgrjmkpormg"`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "lastActiveDate"`);
}
}

View File

@ -0,0 +1,14 @@
import {MigrationInterface, QueryRunner} from "typeorm";
export class userHideOnlineStatus1618639857000 implements MigrationInterface {
name = 'userHideOnlineStatus1618639857000'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" ADD "hideOnlineStatus" boolean NOT NULL DEFAULT false`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "hideOnlineStatus"`);
}
}

View File

@ -1,11 +1,11 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <syuilotan@yahoo.co.jp>", "author": "syuilo <syuilotan@yahoo.co.jp>",
"version": "12.75.1", "version": "12.77.1",
"codename": "indigo", "codename": "indigo",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/syuilo/misskey.git" "url": "https://github.com/misskey-dev/misskey.git"
}, },
"main": "./index.js", "main": "./index.js",
"private": true, "private": true,
@ -37,7 +37,7 @@
"lodash": "^4.17.20" "lodash": "^4.17.20"
}, },
"dependencies": { "dependencies": {
"@babel/plugin-transform-runtime": "7.13.10", "@babel/plugin-transform-runtime": "7.13.15",
"@elastic/elasticsearch": "7.11.0", "@elastic/elasticsearch": "7.11.0",
"@fortawesome/fontawesome-svg-core": "1.2.35", "@fortawesome/fontawesome-svg-core": "1.2.35",
"@fortawesome/free-brands-svg-icons": "5.15.3", "@fortawesome/free-brands-svg-icons": "5.15.3",
@ -49,7 +49,7 @@
"@koa/router": "9.0.1", "@koa/router": "9.0.1",
"@sentry/browser": "5.29.2", "@sentry/browser": "5.29.2",
"@sentry/tracing": "5.29.2", "@sentry/tracing": "5.29.2",
"@sinonjs/fake-timers": "7.0.2", "@sinonjs/fake-timers": "7.0.5",
"@syuilo/aiscript": "0.11.1", "@syuilo/aiscript": "0.11.1",
"@types/bcryptjs": "2.4.2", "@types/bcryptjs": "2.4.2",
"@types/bull": "3.15.0", "@types/bull": "3.15.0",
@ -62,7 +62,7 @@
"@types/gulp-replace": "0.0.31", "@types/gulp-replace": "0.0.31",
"@types/is-url": "1.2.28", "@types/is-url": "1.2.28",
"@types/js-yaml": "4.0.0", "@types/js-yaml": "4.0.0",
"@types/jsdom": "16.2.7", "@types/jsdom": "16.2.10",
"@types/jsonld": "1.5.5", "@types/jsonld": "1.5.5",
"@types/katex": "0.11.0", "@types/katex": "0.11.0",
"@types/koa": "2.13.1", "@types/koa": "2.13.1",
@ -77,10 +77,10 @@
"@types/koa__multer": "2.0.2", "@types/koa__multer": "2.0.2",
"@types/koa__router": "8.0.4", "@types/koa__router": "8.0.4",
"@types/markdown-it": "12.0.1", "@types/markdown-it": "12.0.1",
"@types/matter-js": "0.14.10", "@types/matter-js": "0.14.11",
"@types/mocha": "8.2.1", "@types/mocha": "8.2.2",
"@types/node": "14.14.35", "@types/node": "14.14.41",
"@types/node-fetch": "2.5.8", "@types/node-fetch": "2.5.10",
"@types/nodemailer": "6.4.1", "@types/nodemailer": "6.4.1",
"@types/nprogress": "0.2.0", "@types/nprogress": "0.2.0",
"@types/oauth": "0.9.1", "@types/oauth": "0.9.1",
@ -88,6 +88,7 @@
"@types/parsimmon": "1.10.6", "@types/parsimmon": "1.10.6",
"@types/portscanner": "2.1.0", "@types/portscanner": "2.1.0",
"@types/pug": "2.0.4", "@types/pug": "2.0.4",
"@types/punycode": "2.1.0",
"@types/qrcode": "1.4.0", "@types/qrcode": "1.4.0",
"@types/random-seed": "0.3.3", "@types/random-seed": "0.3.3",
"@types/ratelimiter": "3.4.1", "@types/ratelimiter": "3.4.1",
@ -96,7 +97,7 @@
"@types/request-stats": "3.0.0", "@types/request-stats": "3.0.0",
"@types/rimraf": "3.0.0", "@types/rimraf": "3.0.0",
"@types/seedrandom": "2.4.28", "@types/seedrandom": "2.4.28",
"@types/sharp": "0.27.1", "@types/sharp": "0.28.0",
"@types/sinonjs__fake-timers": "6.0.2", "@types/sinonjs__fake-timers": "6.0.2",
"@types/speakeasy": "2.0.5", "@types/speakeasy": "2.0.5",
"@types/throttle-debounce": "2.1.0", "@types/throttle-debounce": "2.1.0",
@ -104,39 +105,39 @@
"@types/tmp": "0.2.0", "@types/tmp": "0.2.0",
"@types/uuid": "8.3.0", "@types/uuid": "8.3.0",
"@types/web-push": "3.3.0", "@types/web-push": "3.3.0",
"@types/webpack": "4.41.26", "@types/webpack": "5.28.0",
"@types/webpack-stream": "3.2.11", "@types/webpack-stream": "3.2.12",
"@types/websocket": "1.0.2", "@types/websocket": "1.0.2",
"@types/ws": "7.4.0", "@types/ws": "7.4.1",
"@typescript-eslint/parser": "4.18.0", "@typescript-eslint/parser": "4.22.0",
"@vue/compiler-sfc": "3.0.7", "@vue/compiler-sfc": "3.0.11",
"abort-controller": "3.0.0", "abort-controller": "3.0.0",
"apexcharts": "3.26.0", "apexcharts": "3.26.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",
"aws-sdk": "2.867.0", "aws-sdk": "2.887.0",
"bcryptjs": "2.4.3", "bcryptjs": "2.4.3",
"blurhash": "1.1.3", "blurhash": "1.1.3",
"broadcast-channel": "3.5.3", "broadcast-channel": "3.5.3",
"bull": "3.21.1", "bull": "3.22.0",
"cafy": "15.2.1", "cafy": "15.2.1",
"cbor": "7.0.4", "cbor": "7.0.5",
"chalk": "4.1.0", "chalk": "4.1.0",
"chart.js": "2.9.4", "chart.js": "2.9.4",
"cli-highlight": "2.1.10", "cli-highlight": "2.1.11",
"commander": "4.1.1", "commander": "7.2.0",
"concurrently": "6.0.0", "concurrently": "6.0.2",
"content-disposition": "0.5.3", "content-disposition": "0.5.3",
"core-js": "3.9.1", "core-js": "3.10.1",
"crc-32": "1.2.0", "crc-32": "1.2.0",
"css-loader": "5.1.3", "css-loader": "5.2.1",
"cssnano": "4.1.10", "cssnano": "5.0.1",
"dateformat": "4.5.1", "dateformat": "4.5.1",
"diskusage": "1.1.3", "diskusage": "1.1.3",
"escape-regexp": "0.0.1", "escape-regexp": "0.0.1",
"eslint": "7.22.0", "eslint": "7.24.0",
"eslint-plugin-vue": "7.7.0", "eslint-plugin-vue": "7.9.0",
"eventemitter3": "4.0.7", "eventemitter3": "4.0.7",
"feed": "4.2.2", "feed": "4.2.2",
"fibers": "5.0.0", "fibers": "5.0.0",
@ -155,17 +156,17 @@
"http-proxy-agent": "4.0.1", "http-proxy-agent": "4.0.1",
"http-signature": "1.3.5", "http-signature": "1.3.5",
"https-proxy-agent": "5.0.0", "https-proxy-agent": "5.0.0",
"idb-keyval": "5.0.4", "idb-keyval": "5.0.5",
"insert-text-at-cursor": "0.3.0", "insert-text-at-cursor": "0.3.0",
"is-root": "2.1.0", "is-root": "2.1.0",
"is-svg": "4.3.1", "is-svg": "4.3.1",
"js-yaml": "4.0.0", "js-yaml": "4.1.0",
"jsdom": "16.5.1", "jsdom": "16.5.3",
"json5": "2.2.0", "json5": "2.2.0",
"json5-loader": "4.0.1", "json5-loader": "4.0.1",
"jsonld": "4.0.1", "jsonld": "4.0.1",
"jsrsasign": "8.0.20", "jsrsasign": "8.0.20",
"katex": "0.13.0", "katex": "0.13.2",
"koa": "2.13.1", "koa": "2.13.1",
"koa-bodyparser": "4.3.0", "koa-bodyparser": "4.3.0",
"koa-favicon": "2.1.0", "koa-favicon": "2.1.0",
@ -177,9 +178,10 @@
"koa-views": "7.0.1", "koa-views": "7.0.1",
"langmap": "0.0.16", "langmap": "0.0.16",
"lookup-dns-cache": "2.1.0", "lookup-dns-cache": "2.1.0",
"markdown-it": "12.0.4", "markdown-it": "12.0.5",
"markdown-it-anchor": "7.1.0", "markdown-it-anchor": "7.1.0",
"matter-js": "0.16.1", "matter-js": "0.17.1",
"mfm-js": "0.16.0",
"mocha": "8.3.2", "mocha": "8.3.2",
"moji": "0.5.1", "moji": "0.5.1",
"ms": "2.1.3", "ms": "2.1.3",
@ -190,24 +192,23 @@
"object-assign-deep": "0.4.0", "object-assign-deep": "0.4.0",
"os-utils": "0.0.14", "os-utils": "0.0.14",
"parse5": "6.0.1", "parse5": "6.0.1",
"parsimmon": "1.16.0", "pg": "8.6.0",
"pg": "8.5.1",
"portscanner": "2.2.0", "portscanner": "2.2.0",
"postcss": "8.2.8", "postcss": "8.2.10",
"postcss-loader": "5.2.0", "postcss-loader": "5.2.0",
"prismjs": "1.23.0", "prismjs": "1.23.0",
"probe-image-size": "7.0.1", "probe-image-size": "7.1.0",
"promise-limit": "2.7.0", "promise-limit": "2.7.0",
"promise-sequential": "1.1.1", "promise-sequential": "1.1.1",
"pug": "3.0.2", "pug": "3.0.2",
"punycode": "2.1.1", "punycode": "2.1.1",
"pureimage": "0.2.7", "pureimage": "0.3.2",
"qrcode": "1.4.4", "qrcode": "1.4.4",
"random-seed": "0.3.0", "random-seed": "0.3.0",
"ratelimiter": "3.4.1", "ratelimiter": "3.4.1",
"re2": "1.15.9", "re2": "1.15.9",
"reconnecting-websocket": "4.4.0", "reconnecting-websocket": "4.4.0",
"redis": "3.0.2", "redis": "3.1.1",
"redis-lock": "0.1.4", "redis-lock": "0.1.4",
"reflect-metadata": "0.1.13", "reflect-metadata": "0.1.13",
"regenerator-runtime": "0.13.7", "regenerator-runtime": "0.13.7",
@ -220,43 +221,44 @@
"sass": "1.32.8", "sass": "1.32.8",
"sass-loader": "11.0.1", "sass-loader": "11.0.1",
"seedrandom": "3.0.5", "seedrandom": "3.0.5",
"sharp": "0.27.2", "sharp": "0.28.1",
"speakeasy": "2.0.0", "speakeasy": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"style-loader": "2.0.0", "style-loader": "2.0.0",
"summaly": "2.4.0", "summaly": "2.4.0",
"syslog-pro": "1.0.0", "syslog-pro": "1.0.0",
"systeminformation": "5.6.7", "systeminformation": "5.6.12",
"syuilo-password-strength": "0.0.1", "syuilo-password-strength": "0.0.1",
"textarea-caret": "3.1.0", "textarea-caret": "3.1.0",
"three": "0.117.1", "three": "0.117.1",
"throttle-debounce": "3.0.1", "throttle-debounce": "3.0.1",
"tinycolor2": "1.4.2", "tinycolor2": "1.4.2",
"tmp": "0.2.1", "tmp": "0.2.1",
"ts-loader": "8.0.18", "ts-loader": "8.1.0",
"ts-node": "9.1.1", "ts-node": "9.1.1",
"tsc-alias": "1.2.8", "tsc-alias": "1.2.9",
"tsconfig-paths": "3.9.0", "tsconfig-paths": "3.9.0",
"tslint": "6.1.3", "tslint": "6.1.3",
"tslint-sonarts": "1.9.0", "tslint-sonarts": "1.9.0",
"typeorm": "0.2.31", "typeorm": "0.2.32",
"typescript": "4.2.3", "typescript": "4.2.4",
"ulid": "2.3.0", "ulid": "2.3.0",
"uuid": "8.3.2", "uuid": "8.3.2",
"v-debounce": "0.1.2", "v-debounce": "0.1.2",
"vanilla-tilt": "1.7.0", "vanilla-tilt": "1.7.0",
"vue": "3.0.7", "vue": "3.0.11",
"vue-color": "2.8.1", "vue-color": "2.8.1",
"vue-json-pretty": "1.7.1", "vue-json-pretty": "1.7.1",
"vue-loader": "16.1.2", "vue-loader": "16.1.2",
"vue-prism-editor": "2.0.0-alpha.2", "vue-prism-editor": "2.0.0-alpha.2",
"vue-router": "4.0.5", "vue-router": "4.0.5",
"vue-style-loader": "4.1.3", "vue-style-loader": "4.1.3",
"vue-svg-loader": "0.17.0-beta.2",
"vuedraggable": "4.0.1", "vuedraggable": "4.0.1",
"web-push": "3.4.4", "web-push": "3.4.4",
"webpack": "5.27.2", "webpack": "5.33.2",
"webpack-cli": "4.5.0", "webpack-cli": "4.6.0",
"websocket": "1.0.33", "websocket": "1.0.34",
"ws": "7.4.4", "ws": "7.4.4",
"xev": "2.0.1" "xev": "2.0.1"
}, },

View File

@ -1,6 +1,8 @@
import * as program from 'commander'; import { Command } from 'commander';
import config from '@/config'; import config from '@/config';
const program = new Command();
program program
.version(config.version) .version(config.version)
.option('--no-daemons', 'Disable daemon processes (for debbuging)') .option('--no-daemons', 'Disable daemon processes (for debbuging)')

View File

@ -8,21 +8,17 @@
</template> </template>
</I18n> </I18n>
</template> </template>
<div class="dpvffvvy"> <div class="dpvffvvy _monolithic_">
<div class="_section"> <div class="_section">
<div class="_content">
<MkTextarea v-model:value="comment"> <MkTextarea v-model:value="comment">
<span>{{ $ts.details }}</span> <span>{{ $ts.details }}</span>
<template #desc>{{ $ts.fillAbuseReportDescription }}</template> <template #desc>{{ $ts.fillAbuseReportDescription }}</template>
</MkTextarea> </MkTextarea>
</div> </div>
</div>
<div class="_section"> <div class="_section">
<div class="_content">
<MkButton @click="send" primary full :disabled="comment.length === 0">{{ $ts.send }}</MkButton> <MkButton @click="send" primary full :disabled="comment.length === 0">{{ $ts.send }}</MkButton>
</div> </div>
</div> </div>
</div>
</XWindow> </XWindow>
</template> </template>
@ -80,6 +76,6 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.dpvffvvy { .dpvffvvy {
--section-padding: 16px; --root-margin: 16px;
} }
</style> </style>

View File

@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<div v-for="user in us" :key="user.id" style="display:inline-block;width:32px;height:32px;margin-right:8px;"> <div v-for="user in us" :key="user.id" style="display:inline-block;width:32px;height:32px;margin-right:8px;">
<MkAvatar :user="user" style="width:32px;height:32px;"/> <MkAvatar :user="user" style="width:32px;height:32px;" :show-indicator="true"/>
</div> </div>
</div> </div>
</template> </template>

View File

@ -123,7 +123,7 @@ export default defineComponent({
> footer { > footer {
padding: 12px 16px; padding: 12px 16px;
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
> span { > span {
opacity: 0.7; opacity: 0.7;

View File

@ -18,17 +18,20 @@ export default defineComponent({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
} },
noGap: {
type: Boolean,
required: false,
default: false
},
}, },
methods: { methods: {
focus() { focus() {
this.$slots.default[0].elm.focus(); this.$slots.default[0].elm.focus();
}
}, },
render() { getDateText(time: string) {
const getDateText = (time: string) => {
const date = new Date(time).getDate(); const date = new Date(time).getDate();
const month = new Date(time).getMonth() + 1; const month = new Date(time).getMonth() + 1;
return this.$t('monthAndDay', { return this.$t('monthAndDay', {
@ -36,15 +39,19 @@ export default defineComponent({
day: date.toString() day: date.toString()
}); });
} }
},
render() {
if (this.items.length === 0) return;
return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? { return h(this.$store.state.animation ? TransitionGroup : 'div', this.$store.state.animation ? {
class: 'sqadhkmv _list_', class: 'sqadhkmv' + (this.noGap ? ' noGap _block' : ''),
name: 'list', name: 'list',
tag: 'div', tag: 'div',
'data-direction': this.direction, 'data-direction': this.direction,
'data-reversed': this.reversed ? 'true' : 'false', 'data-reversed': this.reversed ? 'true' : 'false',
} : { } : {
class: 'sqadhkmv _list_', class: 'sqadhkmv' + (this.noGap ? ' noGap _block' : ''),
}, this.items.map((item, i) => { }, this.items.map((item, i) => {
const el = this.$slots.default({ const el = this.$slots.default({
item: item item: item
@ -70,10 +77,10 @@ export default defineComponent({
class: 'icon', class: 'icon',
icon: faAngleUp, icon: faAngleUp,
}), }),
getDateText(item.createdAt) this.getDateText(item.createdAt)
]), ]),
h('span', [ h('span', [
getDateText(this.items[i + 1].createdAt), this.getDateText(this.items[i + 1].createdAt),
h(FontAwesomeIcon, { h(FontAwesomeIcon, {
class: 'icon', class: 'icon',
icon: faAngleDown, icon: faAngleDown,
@ -117,11 +124,7 @@ export default defineComponent({
transform: translateY(-64px); transform: translateY(-64px);
} }
} }
}
</style>
<style lang="scss">
.sqadhkmv {
> .separator { > .separator {
text-align: center; text-align: center;
@ -154,5 +157,18 @@ export default defineComponent({
} }
} }
} }
&.noGap {
> * {
margin: 0 !important;
border: none;
border-radius: 0;
box-shadow: none;
&:not(:last-child) {
border-bottom: solid 0.5px var(--divider);
}
}
}
} }
</style> </style>

View File

@ -26,7 +26,7 @@ import {
faFileArchive, faFileArchive,
faFilm faFilm
} from '@fortawesome/free-solid-svg-icons'; } from '@fortawesome/free-solid-svg-icons';
import ImgWithBlurhash from './img-with-blurhash.vue'; import ImgWithBlurhash from '@client/components/img-with-blurhash.vue';
import { ColdDeviceStorage } from '@client/store'; import { ColdDeviceStorage } from '@client/store';
export default defineComponent({ export default defineComponent({

View File

@ -330,8 +330,8 @@ export default defineComponent({
} }
> .thumbnail { > .thumbnail {
width: 128px; width: 110px;
height: 128px; height: 110px;
margin: auto; margin: auto;
} }

View File

@ -11,7 +11,7 @@
<span class="folder current" v-if="folder != null">{{ folder.name }}</span> <span class="folder current" v-if="folder != null">{{ folder.name }}</span>
</div> </div>
</nav> </nav>
<div class="main _section" :class="{ uploading: uploadings.length > 0, fetching }" <div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
ref="main" ref="main"
@dragover.prevent.stop="onDragover" @dragover.prevent.stop="onDragover"
@dragenter="onDragenter" @dragenter="onDragenter"
@ -704,6 +704,7 @@ export default defineComponent({
> .main { > .main {
flex: 1; flex: 1;
overflow: auto; overflow: auto;
padding: var(--margin);
&, * { &, * {
user-select: none; user-select: none;
@ -735,7 +736,7 @@ export default defineComponent({
> .folder, > .folder,
> .file { > .file {
flex-grow: 1; flex-grow: 1;
width: 144px; width: 128px;
margin: 4px; margin: 4px;
box-sizing: border-box; box-sizing: border-box;
} }
@ -743,7 +744,7 @@ export default defineComponent({
> .padding { > .padding {
flex-grow: 1; flex-grow: 1;
pointer-events: none; pointer-events: none;
width: 144px + 8px; width: 128px + 8px;
} }
} }

View File

@ -123,7 +123,7 @@ export default defineComponent({
> .index { > .index {
min-height: var(--height); min-height: var(--height);
position: relative; position: relative;
border-bottom: solid 1px var(--divider); border-bottom: solid 0.5px var(--divider);
> .arrow { > .arrow {
position: absolute; position: absolute;
@ -181,7 +181,7 @@ export default defineComponent({
} }
&.result { &.result {
border-bottom: solid 1px var(--divider); border-bottom: solid 0.5px var(--divider);
&:empty { &:empty {
display: none; display: none;

View File

@ -119,7 +119,7 @@ export default defineComponent({
> .index { > .index {
min-height: var(--height); min-height: var(--height);
position: relative; position: relative;
border-bottom: solid 1px var(--divider); border-bottom: solid 0.5px var(--divider);
> .arrow { > .arrow {
position: absolute; position: absolute;
@ -177,7 +177,7 @@ export default defineComponent({
} }
&.result { &.result {
border-bottom: solid 1px var(--divider); border-bottom: solid 0.5px var(--divider);
&:empty { &:empty {
display: none; display: none;

View File

@ -402,7 +402,7 @@ export default defineComponent({
> .tab { > .tab {
flex: 1; flex: 1;
height: 38px; height: 38px;
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
&.active { &.active {
border-top: solid 1px var(--accent); border-top: solid 1px var(--accent);
@ -425,7 +425,7 @@ export default defineComponent({
> div { > div {
&:not(.index) { &:not(.index) {
padding: 4px 0 8px 0; padding: 4px 0 8px 0;
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
} }
> header { > header {
@ -492,7 +492,7 @@ export default defineComponent({
} }
&.result { &.result {
border-bottom: solid 1px var(--divider); border-bottom: solid 0.5px var(--divider);
&:empty { &:empty {
display: none; display: none;

View File

@ -20,12 +20,19 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.rbusrurv { .rbusrurv {
line-height: 1.4em; // 他のCSSからも参照されるので消さないように
--formXPadding: 32px;
--formYPadding: 32px;
font-size: 95%;
line-height: 1.3em;
background: var(--bg); background: var(--bg);
padding: 32px; padding: var(--formYPadding) var(--formXPadding);
max-width: 750px;
margin: 0 auto;
&:not(.wide).max-width_400px { &:not(.wide).max-width_400px {
padding: 32px 0; --formXPadding: 0px;
> ::v-deep(*) { > ::v-deep(*) {
._formPanel { ._formPanel {
@ -36,16 +43,16 @@ export default defineComponent({
} }
._form_group { ._form_group {
> * { > *:not(._formNoConcat) {
&:not(:first-child) { &:not(:last-child):not(._formNoConcatPrev) {
&._formPanel, ._formPanel { &._formPanel, ._formPanel {
border-top: none; border-bottom: solid 0.5px var(--divider);
} }
} }
&:not(:last-child) { &:not(:first-child):not(._formNoConcatNext) {
&._formPanel, ._formPanel { &._formPanel, ._formPanel {
border-bottom: solid 0.5px var(--divider); border-top: none;
} }
} }
} }

View File

@ -1,32 +1,48 @@
._formPanel { ._formPanel {
background: var(--panel); background: var(--panel);
border-radius: var(--radius); border-radius: var(--radius);
transition: background 0.2s ease;
&._formClickable { &._formClickable {
&:hover { &:hover {
//background: var(--panelHighlight); //background: var(--panelHighlight);
} }
&:active {
background: var(--panelHighlight);
transition: background 0s;
}
}
}
._formLabel,
._formCaption {
font-size: 80%;
color: var(--fgTransparentWeak);
&:empty {
display: none;
} }
} }
._formLabel { ._formLabel {
font-size: 80%; position: sticky;
padding: 0 16px 8px 16px; top: var(--stickyTop, 0px);
opacity: 0.8; z-index: 2;
margin: -8px calc(var(--formXPadding) * -1) 0 calc(var(--formXPadding) * -1);
&:empty { padding: 8px calc(16px + var(--formXPadding)) 8px calc(16px + var(--formXPadding));
display: none; background: var(--X17);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
} }
._themeChanging_ ._formLabel {
transition: none !important;
background: transparent;
} }
._formCaption { ._formCaption {
font-size: 80%;
padding: 8px 16px 0 16px; padding: 8px 16px 0 16px;
opacity: 0.8;
&:empty {
display: none;
}
} }
._formItem { ._formItem {

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="vrtktovg _formItem" v-size="{ max: [500] }"> <div class="vrtktovg _formItem _formNoConcat" v-size="{ max: [500] }" v-sticky-container>
<div class="_formLabel"><slot name="label"></slot></div> <div class="_formLabel"><slot name="label"></slot></div>
<div class="main _form_group"> <div class="main _form_group" ref="child">
<slot></slot> <slot></slot>
</div> </div>
<div class="_formCaption"><slot name="caption"></slot></div> <div class="_formCaption"><slot name="caption"></slot></div>
@ -9,33 +9,69 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent, onMounted, ref } from 'vue';
export default defineComponent({ export default defineComponent({
setup(props, context) {
const child = ref<HTMLElement | null>(null);
const scanChild = () => {
if (child.value == null) return;
const els = Array.from(child.value.children);
for (let i = 0; i < els.length; i++) {
const el = els[i];
if (el.classList.contains('_formNoConcat')) {
if (els[i - 1]) els[i - 1].classList.add('_formNoConcatPrev');
if (els[i + 1]) els[i + 1].classList.add('_formNoConcatNext');
}
}
};
onMounted(() => {
scanChild();
const observer = new MutationObserver(records => {
scanChild();
});
observer.observe(child.value, {
childList: true,
subtree: false,
attributes: false,
characterData: false,
});
});
return {
child
};
}
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.vrtktovg { .vrtktovg {
> .main { > .main {
> ::v-deep(*) { > ::v-deep(*):not(._formNoConcat) {
&:not(._formNoConcatNext) {
margin: 0; margin: 0;
&:not(:first-child) {
&._formPanel, ._formPanel {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
} }
&:not(:last-child) { &:not(:last-child):not(._formNoConcatPrev) {
&._formPanel, ._formPanel { &._formPanel, ._formPanel {
border-bottom: solid 0.5px var(--divider); border-bottom: solid 0.5px var(--divider);
border-bottom-left-radius: 0; border-bottom-left-radius: 0;
border-bottom-right-radius: 0; border-bottom-right-radius: 0;
} }
} }
&:not(:first-child):not(._formNoConcatNext) {
&._formPanel, ._formPanel {
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
}
} }
} }
} }

View File

@ -0,0 +1,49 @@
<template>
<div class="fzenkabp _formItem">
<div class="_formPanel" :class="{ warn }">
<i v-if="warn"><Fa :icon="faExclamationTriangle"/></i>
<i v-else><Fa :icon="faInfoCircle"/></i>
<slot></slot>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { faInfoCircle, faExclamationTriangle } from '@fortawesome/free-solid-svg-icons';
export default defineComponent({
props: {
warn: {
type: Boolean,
required: false,
default: false
},
},
data() {
return {
faInfoCircle, faExclamationTriangle
};
}
});
</script>
<style lang="scss" scoped>
.fzenkabp {
> div {
padding: 14px 16px;
font-size: 90%;
background: var(--infoBg);
color: var(--infoFg);
&.warn {
background: var(--infoWarnBg);
color: var(--infoWarnFg);
}
> i {
margin-right: 4px;
}
}
}
</style>

View File

@ -215,7 +215,7 @@ export default defineComponent({
} }
> .input { > .input {
$height: 52px; $height: 48px;
position: relative; position: relative;
> input { > input {

View File

@ -22,9 +22,17 @@ export default defineComponent({
align-items: center; align-items: center;
padding: 14px 16px; padding: 14px 16px;
> .key {
margin-right: 12px;
white-space: nowrap;
}
> .value { > .value {
margin-left: auto; margin-left: auto;
opacity: 0.7; opacity: 0.7;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
} }
} }
</style> </style>

View File

@ -66,6 +66,7 @@ export default defineComponent({
&.active { &.active {
color: var(--accent); color: var(--accent);
background: var(--panelHighlight);
} }
> .icon { > .icon {

View File

@ -0,0 +1,102 @@
<template>
<FormGroup class="_formItem">
<template #label><slot></slot></template>
<div class="drooglns _formItem" :class="{ tall }">
<div class="input _formPanel">
<textarea class="_monospace"
v-model="v"
readonly
:spellcheck="false"
></textarea>
</div>
</div>
<template #caption><slot name="desc"></slot></template>
</FormGroup>
</template>
<script lang="ts">
import { defineComponent, ref, toRefs, watch } from 'vue';
import * as JSON5 from 'json5';
import './form.scss';
import FormGroup from './group.vue';
export default defineComponent({
components: {
FormGroup,
},
props: {
value: {
required: false
},
tall: {
type: Boolean,
required: false,
default: false
},
pre: {
type: Boolean,
required: false,
default: false
},
manualSave: {
type: Boolean,
required: false,
default: false
},
},
setup(props, context) {
const { value } = toRefs(props);
const v = ref('');
watch(() => value, newValue => {
v.value = JSON5.stringify(newValue.value, null, '\t');
}, {
immediate: true
});
return {
v,
};
}
});
</script>
<style lang="scss" scoped>
.drooglns {
position: relative;
> .input {
position: relative;
> textarea {
display: block;
width: 100%;
min-width: 100%;
max-width: 100%;
min-height: 130px;
margin: 0;
padding: 16px;
box-sizing: border-box;
font: inherit;
font-weight: normal;
font-size: 1em;
background: transparent;
border: none;
border-radius: 0;
outline: none;
box-shadow: none;
color: var(--fg);
tab-size: 2;
white-space: pre;
}
}
&.tall {
> .input {
> textarea {
min-height: 200px;
}
}
}
}
</style>

View File

@ -69,8 +69,8 @@ export default defineComponent({
display: inline-block; display: inline-block;
vertical-align: bottom; vertical-align: bottom;
position: relative; position: relative;
width: 20px; width: 16px;
height: 20px; height: 16px;
margin-right: 8px; margin-right: 8px;
background: none; background: none;
border: 2px solid var(--inputBorder); border: 2px solid var(--inputBorder);

View File

@ -69,7 +69,7 @@ export default defineComponent({
position: relative; position: relative;
> .main { > .main {
padding: 24px 16px; padding: 22px 16px;
> input { > input {
display: block; display: block;

View File

@ -97,7 +97,7 @@ export default defineComponent({
font: inherit; font: inherit;
font-weight: normal; font-weight: normal;
font-size: 1em; font-size: 1em;
height: 52px; height: 48px;
background: none; background: none;
border: none; border: none;
border-radius: 0; border-radius: 0;

View File

@ -0,0 +1,92 @@
<template>
<transition name="fade" mode="out-in">
<div class="_formItem" v-if="pending">
<div class="_formPanel">
<MkLoading/>
</div>
</div>
<FormGroup v-else-if="resolved" class="_formItem">
<slot :result="result"></slot>
</FormGroup>
<div class="_formItem" v-else>
<div class="_formPanel">
error!
<button @click="retry">retry</button>
</div>
</div>
</transition>
</template>
<script lang="ts">
import { defineComponent, PropType, ref, watch } from 'vue';
import './form.scss';
import FormGroup from './group.vue';
export default defineComponent({
components: {
FormGroup,
},
props: {
p: {
type: Function as PropType<() => Promise<any>>,
required: true,
}
},
setup(props, context) {
const pending = ref(true);
const resolved = ref(false);
const rejected = ref(false);
const result = ref(null);
const process = () => {
if (props.p == null) {
return;
}
const promise = props.p();
pending.value = true;
resolved.value = false;
rejected.value = false;
promise.then((_result) => {
pending.value = false;
resolved.value = true;
result.value = _result;
});
promise.catch(() => {
pending.value = false;
rejected.value = true;
});
};
watch(() => props.p, () => {
process();
}, {
immediate: true
});
const retry = () => {
process();
};
return {
pending,
resolved,
rejected,
result,
retry,
};
}
});
</script>
<style lang="scss" scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.125s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
</style>

View File

@ -57,7 +57,7 @@ export default defineComponent({
> .main { > .main {
position: relative; position: relative;
display: flex; display: flex;
padding: 16px; padding: 14px 16px;
cursor: pointer; cursor: pointer;
> * { > * {

View File

@ -93,6 +93,10 @@ export default defineComponent({
os.pageWindow(this.to); os.pageWindow(this.to);
}, },
modalWindow() {
os.modalPageWindow(this.to);
},
popout() { popout() {
popout(this.to); popout(this.to);
}, },
@ -111,6 +115,8 @@ export default defineComponent({
if (this.behavior) { if (this.behavior) {
if (this.behavior === 'window') { if (this.behavior === 'window') {
return this.window(); return this.window();
} else if (this.behavior === 'modalWindow') {
return this.modalWindow();
} }
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<span class="mk-acct" v-once> <span class="mk-acct">
<span class="name">@{{ user.username }}</span> <span class="name">@{{ user.username }}</span>
<span class="host" v-if="user.host || detail || $store.state.showFullAcct">@{{ user.host || host }}</span> <span class="host" v-if="user.host || detail || $store.state.showFullAcct">@{{ user.host || host }}</span>
</span> </span>
@ -7,11 +7,20 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { toUnicode } from 'punycode'; import { toUnicode } from 'punycode/';
import { host } from '@client/config'; import { host } from '@client/config';
export default defineComponent({ export default defineComponent({
props: ['user', 'detail'], props: {
user: {
type: Object,
required: true
},
detail: {
type: Boolean,
default: false
},
},
data() { data() {
return { return {
host: toUnicode(host), host: toUnicode(host),

View File

@ -1,9 +1,11 @@
<template> <template>
<span class="eiwwqkts _noSelect" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick"> <span class="eiwwqkts _noSelect" :class="{ cat }" :title="acct(user)" v-if="disableLink" v-user-preview="disablePreview ? undefined : user.id" @click="onClick">
<img class="inner" :src="url" decoding="async"/> <img class="inner" :src="url" decoding="async"/>
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
</span> </span>
<MkA class="eiwwqkts _noSelect" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id"> <MkA class="eiwwqkts _noSelect" :class="{ cat }" :to="userPage(user)" :title="acct(user)" :target="target" v-else v-user-preview="disablePreview ? undefined : user.id">
<img class="inner" :src="url" decoding="async"/> <img class="inner" :src="url" decoding="async"/>
<MkUserOnlineIndicator v-if="showIndicator" class="indicator" :user="user"/>
</MkA> </MkA>
</template> </template>
@ -12,8 +14,12 @@ import { defineComponent } from 'vue';
import { getStaticImageUrl } from '@client/scripts/get-static-image-url'; import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
import { extractAvgColorFromBlurhash } from '@client/scripts/extract-avg-color-from-blurhash'; import { extractAvgColorFromBlurhash } from '@client/scripts/extract-avg-color-from-blurhash';
import { acct, userPage } from '@client/filters/user'; import { acct, userPage } from '@client/filters/user';
import MkUserOnlineIndicator from '@client/components/user-online-indicator.vue';
export default defineComponent({ export default defineComponent({
components: {
MkUserOnlineIndicator
},
props: { props: {
user: { user: {
type: Object, type: Object,
@ -30,6 +36,10 @@ export default defineComponent({
disablePreview: { disablePreview: {
required: false, required: false,
default: false default: false
},
showIndicator: {
required: false,
default: false
} }
}, },
emits: ['click'], emits: ['click'],
@ -93,7 +103,7 @@ export default defineComponent({
} }
} }
.inner { > .inner {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
@ -106,5 +116,14 @@ export default defineComponent({
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
> .indicator {
position: absolute;
z-index: 1;
bottom: 0;
left: 0;
width: 20%;
height: 20%;
}
} }
</style> </style>

View File

@ -1,12 +1,11 @@
<template> <template>
<div class="yxspomdl" :class="{ inline }"> <div class="yxspomdl" :class="{ inline, colored }">
<div class="ring"></div> <div class="ring"></div>
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import * as os from '@client/os';
export default defineComponent({ export default defineComponent({
props: { props: {
@ -14,6 +13,11 @@ export default defineComponent({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
colored: {
type: Boolean,
required: false,
default: true
} }
} }
}); });
@ -32,6 +36,11 @@ export default defineComponent({
.yxspomdl { .yxspomdl {
padding: 32px; padding: 32px;
text-align: center; text-align: center;
cursor: wait;
&.colored {
color: var(--accent);
}
&.inline { &.inline {
display: inline; display: inline;
@ -41,15 +50,23 @@ export default defineComponent({
width: 32px; width: 32px;
height: 32px; height: 32px;
} }
> .ring {
&:before,
&:after {
width: 32px;
height: 32px;
}
}
} }
> .ring { > .ring {
position: relative;
display: inline-block; display: inline-block;
opacity: 0.7;
vertical-align: middle; vertical-align: middle;
}
> .ring:after { &:before,
&:after {
content: " "; content: " ";
display: block; display: block;
box-sizing: border-box; box-sizing: border-box;
@ -57,8 +74,19 @@ export default defineComponent({
height: 48px; height: 48px;
border-radius: 50%; border-radius: 50%;
border: solid 4px; border: solid 4px;
}
&:before {
border-color: currentColor;
opacity: 0.3;
}
&:after {
position: absolute;
top: 0;
border-color: currentColor transparent transparent transparent; border-color: currentColor transparent transparent transparent;
animation: ring 0.5s linear infinite; animation: ring 0.5s linear infinite;
} }
} }
}
</style> </style>

View File

@ -22,7 +22,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons'; import { faExternalLinkSquareAlt } from '@fortawesome/free-solid-svg-icons';
import { toUnicode as decodePunycode } from 'punycode'; import { toUnicode as decodePunycode } from 'punycode/';
import { url as local } from '@client/config'; import { url as local } from '@client/config';
import { isDeviceTouch } from '@client/scripts/is-device-touch'; import { isDeviceTouch } from '@client/scripts/is-device-touch';
import * as os from '@client/os'; import * as os from '@client/os';

View File

@ -71,6 +71,7 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.xubzgfgb { .xubzgfgb {
position: relative;
width: 100%; width: 100%;
height: 100%; height: 100%;
@ -82,6 +83,7 @@ export default defineComponent({
} }
> canvas { > canvas {
position: absolute;
object-fit: cover; object-fit: cover;
} }

View File

@ -146,7 +146,7 @@ export default defineComponent({
> .sub { > .sub {
margin-top: 8px; margin-top: 8px;
padding-top: 8px; padding-top: 8px;
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
} }
} }
</style> </style>

View File

@ -27,7 +27,7 @@ import { faExclamationTriangle, faEyeSlash } from '@fortawesome/free-solid-svg-i
import { getStaticImageUrl } from '@client/scripts/get-static-image-url'; import { getStaticImageUrl } from '@client/scripts/get-static-image-url';
import { extractAvgColorFromBlurhash } from '@client/scripts/extract-avg-color-from-blurhash'; import { extractAvgColorFromBlurhash } from '@client/scripts/extract-avg-color-from-blurhash';
import ImageViewer from './image-viewer.vue'; import ImageViewer from './image-viewer.vue';
import ImgWithBlurhash from './img-with-blurhash.vue'; import ImgWithBlurhash from '@client/components/img-with-blurhash.vue';
import * as os from '@client/os'; import * as os from '@client/os';
export default defineComponent({ export default defineComponent({
@ -123,7 +123,7 @@ export default defineComponent({
.gqnyydlz { .gqnyydlz {
position: relative; position: relative;
border: solid 1px var(--divider); border: solid 0.5px var(--divider);
> i { > i {
display: block; display: block;

View File

@ -16,7 +16,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { toUnicode } from 'punycode'; import { toUnicode } from 'punycode/';
import { host as localHost } from '@client/config'; import { host as localHost } from '@client/config';
import { wellKnownServices } from '../../well-known-services'; import { wellKnownServices } from '../../well-known-services';
import * as os from '@client/os'; import * as os from '@client/os';

View File

@ -1,6 +1,5 @@
import { VNode, defineComponent, h } from 'vue'; import { VNode, defineComponent, h } from 'vue';
import { MfmForest } from '@client/../mfm/prelude'; import * as mfm from 'mfm-js';
import { parse, parsePlain } from '@client/../mfm/parse';
import MkUrl from '@client/components/global/url.vue'; import MkUrl from '@client/components/global/url.vue';
import MkLink from '@client/components/link.vue'; import MkLink from '@client/components/link.vue';
import MkMention from '@client/components/mention.vue'; import MkMention from '@client/components/mention.vue';
@ -46,23 +45,26 @@ export default defineComponent({
render() { render() {
if (this.text == null || this.text == '') return; if (this.text == null || this.text == '') return;
const ast = (this.plain ? parsePlain : parse)(this.text); const ast = (this.plain ? mfm.parsePlain : mfm.parse)(this.text);
const validTime = (t: string | null | undefined) => { const validTime = (t: string | null | undefined) => {
if (t == null) return null; if (t == null) return null;
return t.match(/^[0-9.]+s$/) ? t : null; return t.match(/^[0-9.]+s$/) ? t : null;
}; };
const genEl = (ast: MfmForest) => concat(ast.map((token): VNode[] => { const genEl = (ast: mfm.MfmNode[]) => concat(ast.map((token): VNode[] => {
switch (token.node.type) { switch (token.type) {
case 'text': { case 'text': {
const text = token.node.props.text.replace(/(\r\n|\n|\r)/g, '\n'); const text = token.props.text.replace(/(\r\n|\n|\r)/g, '\n');
if (!this.plain) { if (!this.plain) {
const x = text.split('\n') const res = [];
.map(t => t == '' ? [h('br')] : [t, h('br')]); for (const t of text.split('\n')) {
x[x.length - 1].pop(); res.push(h('br'));
return x; res.push(t);
}
res.shift();
return res;
} else { } else {
return [text.replace(/\n/g, ' ')]; return [text.replace(/\n/g, ' ')];
} }
@ -83,38 +85,38 @@ export default defineComponent({
} }
case 'fn': { case 'fn': {
// TODO: CSSを文字列で組み立てていくと token.node.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる // TODO: CSSを文字列で組み立てていくと token.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる
let style; let style;
switch (token.node.props.name) { switch (token.props.name) {
case 'tada': { case 'tada': {
style = `font-size: 150%;` + (this.$store.state.animatedMfm ? 'animation: tada 1s linear infinite both;' : ''); style = `font-size: 150%;` + (this.$store.state.animatedMfm ? 'animation: tada 1s linear infinite both;' : '');
break; break;
} }
case 'jelly': { case 'jelly': {
const speed = validTime(token.node.props.args.speed) || '1s'; const speed = validTime(token.props.args.speed) || '1s';
style = (this.$store.state.animatedMfm ? `animation: mfm-rubberBand ${speed} linear infinite both;` : ''); style = (this.$store.state.animatedMfm ? `animation: mfm-rubberBand ${speed} linear infinite both;` : '');
break; break;
} }
case 'twitch': { case 'twitch': {
const speed = validTime(token.node.props.args.speed) || '0.5s'; const speed = validTime(token.props.args.speed) || '0.5s';
style = this.$store.state.animatedMfm ? `animation: mfm-twitch ${speed} ease infinite;` : ''; style = this.$store.state.animatedMfm ? `animation: mfm-twitch ${speed} ease infinite;` : '';
break; break;
} }
case 'shake': { case 'shake': {
const speed = validTime(token.node.props.args.speed) || '0.5s'; const speed = validTime(token.props.args.speed) || '0.5s';
style = this.$store.state.animatedMfm ? `animation: mfm-shake ${speed} ease infinite;` : ''; style = this.$store.state.animatedMfm ? `animation: mfm-shake ${speed} ease infinite;` : '';
break; break;
} }
case 'spin': { case 'spin': {
const direction = const direction =
token.node.props.args.left ? 'reverse' : token.props.args.left ? 'reverse' :
token.node.props.args.alternate ? 'alternate' : token.props.args.alternate ? 'alternate' :
'normal'; 'normal';
const anime = const anime =
token.node.props.args.x ? 'mfm-spinX' : token.props.args.x ? 'mfm-spinX' :
token.node.props.args.y ? 'mfm-spinY' : token.props.args.y ? 'mfm-spinY' :
'mfm-spin'; 'mfm-spin';
const speed = validTime(token.node.props.args.speed) || '1.5s'; const speed = validTime(token.props.args.speed) || '1.5s';
style = this.$store.state.animatedMfm ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : ''; style = this.$store.state.animatedMfm ? `animation: ${anime} ${speed} linear infinite; animation-direction: ${direction};` : '';
break; break;
} }
@ -128,8 +130,8 @@ export default defineComponent({
} }
case 'flip': { case 'flip': {
const transform = const transform =
(token.node.props.args.h && token.node.props.args.v) ? 'scale(-1, -1)' : (token.props.args.h && token.props.args.v) ? 'scale(-1, -1)' :
token.node.props.args.v ? 'scaleY(-1)' : token.props.args.v ? 'scaleY(-1)' :
'scaleX(-1)'; 'scaleX(-1)';
style = `transform: ${transform};`; style = `transform: ${transform};`;
break; break;
@ -148,12 +150,12 @@ export default defineComponent({
} }
case 'font': { case 'font': {
const family = const family =
token.node.props.args.serif ? 'serif' : token.props.args.serif ? 'serif' :
token.node.props.args.monospace ? 'monospace' : token.props.args.monospace ? 'monospace' :
token.node.props.args.cursive ? 'cursive' : token.props.args.cursive ? 'cursive' :
token.node.props.args.fantasy ? 'fantasy' : token.props.args.fantasy ? 'fantasy' :
token.node.props.args.emoji ? 'emoji' : token.props.args.emoji ? 'emoji' :
token.node.props.args.math ? 'math' : token.props.args.math ? 'math' :
null; null;
if (family) style = `font-family: ${family};`; if (family) style = `font-family: ${family};`;
break; break;
@ -165,7 +167,7 @@ export default defineComponent({
} }
} }
if (style == null) { if (style == null) {
return h('span', {}, ['[', token.node.props.name, ...genEl(token.children), ']']); return h('span', {}, ['[', token.props.name, ...genEl(token.children), ']']);
} else { } else {
return h('span', { return h('span', {
style: 'display: inline-block;' + style, style: 'display: inline-block;' + style,
@ -188,7 +190,7 @@ export default defineComponent({
case 'url': { case 'url': {
return [h(MkUrl, { return [h(MkUrl, {
key: Math.random(), key: Math.random(),
url: token.node.props.url, url: token.props.url,
rel: 'nofollow noopener', rel: 'nofollow noopener',
})]; })];
} }
@ -196,7 +198,7 @@ export default defineComponent({
case 'link': { case 'link': {
return [h(MkLink, { return [h(MkLink, {
key: Math.random(), key: Math.random(),
url: token.node.props.url, url: token.props.url,
rel: 'nofollow noopener', rel: 'nofollow noopener',
}, genEl(token.children))]; }, genEl(token.children))];
} }
@ -204,32 +206,31 @@ export default defineComponent({
case 'mention': { case 'mention': {
return [h(MkMention, { return [h(MkMention, {
key: Math.random(), key: Math.random(),
host: (token.node.props.host == null && this.author && this.author.host != null ? this.author.host : token.node.props.host) || host, host: (token.props.host == null && this.author && this.author.host != null ? this.author.host : token.props.host) || host,
username: token.node.props.username username: token.props.username
})]; })];
} }
case 'hashtag': { case 'hashtag': {
return [h(MkA, { return [h(MkA, {
key: Math.random(), key: Math.random(),
to: this.isNote ? `/tags/${encodeURIComponent(token.node.props.hashtag)}` : `/explore/tags/${encodeURIComponent(token.node.props.hashtag)}`, to: this.isNote ? `/tags/${encodeURIComponent(token.props.hashtag)}` : `/explore/tags/${encodeURIComponent(token.props.hashtag)}`,
style: 'color:var(--hashtag);' style: 'color:var(--hashtag);'
}, `#${token.node.props.hashtag}`)]; }, `#${token.props.hashtag}`)];
} }
case 'blockCode': { case 'blockCode': {
return [h(MkCode, { return [h(MkCode, {
key: Math.random(), key: Math.random(),
code: token.node.props.code, code: token.props.code,
lang: token.node.props.lang, lang: token.props.lang,
})]; })];
} }
case 'inlineCode': { case 'inlineCode': {
return [h(MkCode, { return [h(MkCode, {
key: Math.random(), key: Math.random(),
code: token.node.props.code, code: token.props.code,
lang: token.node.props.lang,
inline: true inline: true
})]; })];
} }
@ -246,10 +247,19 @@ export default defineComponent({
} }
} }
case 'emoji': { case 'emojiCode': {
return [h(MkEmoji, { return [h(MkEmoji, {
key: Math.random(), key: Math.random(),
emoji: token.node.props.name ? `:${token.node.props.name}:` : token.node.props.emoji, emoji: `:${token.props.name}:`,
customEmojis: this.customEmojis,
normal: this.plain
})];
}
case 'unicodeEmoji': {
return [h(MkEmoji, {
key: Math.random(),
emoji: token.props.emoji,
customEmojis: this.customEmojis, customEmojis: this.customEmojis,
normal: this.plain normal: this.plain
})]; })];
@ -258,7 +268,7 @@ export default defineComponent({
case 'mathInline': { case 'mathInline': {
return [h(MkFormula, { return [h(MkFormula, {
key: Math.random(), key: Math.random(),
formula: token.node.props.formula, formula: token.props.formula,
block: false block: false
})]; })];
} }
@ -266,7 +276,7 @@ export default defineComponent({
case 'mathBlock': { case 'mathBlock': {
return [h(MkFormula, { return [h(MkFormula, {
key: Math.random(), key: Math.random(),
formula: token.node.props.formula, formula: token.props.formula,
block: true block: true
})]; })];
} }
@ -274,12 +284,12 @@ export default defineComponent({
case 'search': { case 'search': {
return [h(MkGoogle, { return [h(MkGoogle, {
key: Math.random(), key: Math.random(),
q: token.node.props.query q: token.props.query
})]; })];
} }
default: { default: {
console.error('unrecognized ast type:', token.node.type); console.error('unrecognized ast type:', token.type);
return []; return [];
} }

View File

@ -0,0 +1,213 @@
<template>
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
<div class="hrmcaedk _popup _narrow_" :style="{ width: `${width}px`, height: (height ? `min(${height}px, 100%)` : '100%') }">
<div class="header">
<button class="_button" @click="back()" v-if="history.length > 0"><Fa :icon="faChevronLeft"/></button>
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
<span class="title">
<XHeader :info="pageInfo" :with-back="false"/>
</span>
<button class="_button" @click="$refs.modal.close()"><Fa :icon="faTimes"/></button>
</div>
<div class="body _flat_">
<keep-alive>
<component :is="component" v-bind="props" :ref="changePage"/>
</keep-alive>
</div>
</div>
</MkModal>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { faExternalLinkAlt, faExpandAlt, faLink, faChevronLeft, faColumns, faTimes } from '@fortawesome/free-solid-svg-icons';
import MkModal from '@client/components/ui/modal.vue';
import XHeader from '@client/ui/_common_/header.vue';
import { popout } from '@client/scripts/popout';
import copyToClipboard from '@client/scripts/copy-to-clipboard';
import { resolve } from '@client/router';
import { url } from '@client/config';
import * as symbols from '@client/symbols';
export default defineComponent({
components: {
MkModal,
XHeader,
},
inject: {
sideViewHook: {
default: null
}
},
provide() {
return {
navHook: (path) => {
this.navigate(path);
}
};
},
props: {
initialPath: {
type: String,
required: true,
},
initialComponent: {
type: Object,
required: true,
},
initialProps: {
type: Object,
required: false,
default: () => {},
},
},
emits: ['closed'],
data() {
return {
width: 860,
height: 660,
pageInfo: null,
path: this.initialPath,
component: this.initialComponent,
props: this.initialProps,
history: [],
faChevronLeft, faTimes,
};
},
computed: {
url(): string {
return url + this.path;
},
contextmenu() {
return [{
type: 'label',
text: this.path,
}, {
icon: faExpandAlt,
text: this.$ts.showInPage,
action: this.expand
}, this.sideViewHook ? {
icon: faColumns,
text: this.$ts.openInSideView,
action: () => {
this.sideViewHook(this.path);
this.$refs.window.close();
}
} : undefined, {
icon: faExternalLinkAlt,
text: this.$ts.popout,
action: this.popout
}, null, {
icon: faExternalLinkAlt,
text: this.$ts.openInNewTab,
action: () => {
window.open(this.url, '_blank');
this.$refs.window.close();
}
}, {
icon: faLink,
text: this.$ts.copyLink,
action: () => {
copyToClipboard(this.url);
}
}];
},
},
methods: {
changePage(page) {
if (page == null) return;
if (page[symbols.PAGE_INFO]) {
this.pageInfo = page[symbols.PAGE_INFO];
}
},
navigate(path, record = true) {
if (record) this.history.push(this.path);
this.path = path;
const { component, props } = resolve(path);
this.component = component;
this.props = props;
},
back() {
this.navigate(this.history.pop(), false);
},
expand() {
this.$router.push(this.path);
this.$refs.window.close();
},
popout() {
popout(this.path, this.$el);
this.$refs.window.close();
},
},
});
</script>
<style lang="scss" scoped>
.hrmcaedk {
overflow: hidden;
display: flex;
flex-direction: column;
contain: content;
--root-margin: 24px;
@media (max-width: 500px) {
--root-margin: 16px;
}
> .header {
$height: 52px;
$height-narrow: 42px;
display: flex;
flex-shrink: 0;
box-shadow: 0px 1px var(--divider);
> button {
height: $height;
width: $height;
@media (max-width: 500px) {
height: $height-narrow;
width: $height-narrow;
}
}
> .title {
flex: 1;
line-height: $height;
padding-left: 32px;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
pointer-events: none;
@media (max-width: 500px) {
line-height: $height-narrow;
padding-left: 16px;
}
}
> button + .title {
padding-left: 0;
}
}
> .body {
overflow: auto;
background: var(--bg);
}
}
</style>

View File

@ -1,6 +1,6 @@
<template> <template>
<div <div
class="note _panel" class="note _block"
v-if="!muted" v-if="!muted"
v-show="!isDeleted" v-show="!isDeleted"
:tabindex="!isDeleted ? '-1' : null" :tabindex="!isDeleted ? '-1' : null"
@ -35,7 +35,7 @@
</div> </div>
<article class="article" @contextmenu.stop="onContextmenu"> <article class="article" @contextmenu.stop="onContextmenu">
<header class="header"> <header class="header">
<MkAvatar class="avatar" :user="appearNote.user"/> <MkAvatar class="avatar" :user="appearNote.user" :show-indicator="true"/>
<div class="body"> <div class="body">
<div class="top"> <div class="top">
<MkA class="name" :to="userPage(appearNote.user)" v-user-preview="appearNote.user.id"> <MkA class="name" :to="userPage(appearNote.user)" v-user-preview="appearNote.user.id">
@ -120,11 +120,11 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineAsyncComponent, defineComponent, markRaw, ref } from 'vue'; import { defineAsyncComponent, defineComponent, markRaw } from 'vue';
import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug, faExclamationCircle, faPaperclip } from '@fortawesome/free-solid-svg-icons'; import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug, faExclamationCircle, faPaperclip, faShareAlt } from '@fortawesome/free-solid-svg-icons';
import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons'; import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import { parse } from '../../mfm/parse'; import * as mfm from 'mfm-js';
import { sum, unique } from '../../prelude/array'; import { sum } from '../../prelude/array';
import XSub from './note.sub.vue'; import XSub from './note.sub.vue';
import XNoteHeader from './note-header.vue'; import XNoteHeader from './note-header.vue';
import XNotePreview from './note-preview.vue'; import XNotePreview from './note-preview.vue';
@ -141,6 +141,7 @@ import { userPage } from '@client/filters/user';
import * as os from '@client/os'; import * as os from '@client/os';
import { noteActions, noteViewInterruptors } from '@client/store'; import { noteActions, noteViewInterruptors } from '@client/store';
import { reactionPicker } from '@client/scripts/reaction-picker'; import { reactionPicker } from '@client/scripts/reaction-picker';
import { extractUrlFromMfm } from '@/misc/extract-url-from-mfm';
function markRawAll(...xs) { function markRawAll(...xs) {
for (const x of xs) { for (const x of xs) {
@ -252,21 +253,7 @@ export default defineComponent({
urls(): string[] { urls(): string[] {
if (this.appearNote.text) { if (this.appearNote.text) {
const ast = parse(this.appearNote.text); return extractUrlFromMfm(mfm.parse(this.appearNote.text));
// TODO: 再帰的にURL要素がないか調べる
const urls = unique(ast
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
.map(t => t.node.props.url));
// unique without hash
// [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ]
const removeHash = x => x.replace(/#[^#]*$/, '');
return urls.reduce((array, url) => {
const removed = removeHash(url);
if (!array.map(x => removeHash(x)).includes(removed)) array.push(url);
return array;
}, []);
} else { } else {
return null; return null;
} }
@ -638,6 +625,11 @@ export default defineComponent({
window.open(this.appearNote.url || this.appearNote.uri, '_blank'); window.open(this.appearNote.url || this.appearNote.uri, '_blank');
} }
} : undefined, } : undefined,
{
icon: faShareAlt,
text: this.$ts.share,
action: this.share
},
null, null,
statePromise.then(state => state.isFavorited ? { statePromise.then(state => state.isFavorited ? {
icon: faStar, icon: faStar,
@ -863,6 +855,14 @@ export default defineComponent({
}); });
}, },
share() {
navigator.share({
title: this.$t('noteOf', { user: this.appearNote.user.name }),
text: this.appearNote.text,
url: `${url}/notes/${this.appearNote.id}`
});
},
focus() { focus() {
this.$el.focus(); this.$el.focus();
}, },
@ -1020,7 +1020,7 @@ export default defineComponent({
margin: 0 0.5em; margin: 0 0.5em;
padding: 4px 6px; padding: 4px 6px;
font-size: 80%; font-size: 80%;
border: solid 1px var(--divider); border: solid 0.5px var(--divider);
border-radius: 4px; border-radius: 4px;
} }
@ -1123,7 +1123,7 @@ export default defineComponent({
} }
> .reply { > .reply {
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
} }
&.max-width_500px { &.max-width_500px {

View File

@ -78,7 +78,7 @@ export default defineComponent({
margin: 0 .5em 0 0; margin: 0 .5em 0 0;
padding: 1px 6px; padding: 1px 6px;
font-size: 80%; font-size: 80%;
border: solid 1px var(--divider); border: solid 0.5px var(--divider);
border-radius: 3px; border-radius: 3px;
} }

View File

@ -139,7 +139,7 @@ export default defineComponent({
} }
> .reply { > .reply {
border-left: solid 1px var(--divider); border-left: solid 0.5px var(--divider);
margin-top: 10px; margin-top: 10px;
} }
} }

View File

@ -1,6 +1,6 @@
<template> <template>
<div <div
class="tkcbzcuz _panel" class="tkcbzcuz"
v-if="!muted" v-if="!muted"
v-show="!isDeleted" v-show="!isDeleted"
:tabindex="!isDeleted ? '-1' : null" :tabindex="!isDeleted ? '-1' : null"
@ -90,7 +90,7 @@
</div> </div>
</article> </article>
</div> </div>
<div v-else class="_panel muted" @click="muted = false"> <div v-else class="muted" @click="muted = false">
<I18n :src="$ts.userSaysSomething" tag="small"> <I18n :src="$ts.userSaysSomething" tag="small">
<template #name> <template #name>
<MkA class="name" :to="userPage(appearNote.user)" v-user-preview="appearNote.userId"> <MkA class="name" :to="userPage(appearNote.user)" v-user-preview="appearNote.userId">
@ -102,11 +102,11 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineAsyncComponent, defineComponent, markRaw, ref } from 'vue'; import { defineAsyncComponent, defineComponent, markRaw } from 'vue';
import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug, faExclamationCircle, faPaperclip } from '@fortawesome/free-solid-svg-icons'; import { faSatelliteDish, faBolt, faTimes, faBullhorn, faStar, faLink, faExternalLinkSquareAlt, faPlus, faMinus, faRetweet, faReply, faReplyAll, faEllipsisH, faHome, faUnlock, faEnvelope, faThumbtack, faBan, faQuoteRight, faInfoCircle, faBiohazard, faPlug, faExclamationCircle, faPaperclip, faShareAlt } from '@fortawesome/free-solid-svg-icons';
import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons'; import { faCopy, faTrashAlt, faEdit, faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons';
import { parse } from '../../mfm/parse'; import * as mfm from 'mfm-js';
import { sum, unique } from '../../prelude/array'; import { sum } from '../../prelude/array';
import XSub from './note.sub.vue'; import XSub from './note.sub.vue';
import XNoteHeader from './note-header.vue'; import XNoteHeader from './note-header.vue';
import XNotePreview from './note-preview.vue'; import XNotePreview from './note-preview.vue';
@ -123,6 +123,7 @@ import { userPage } from '@client/filters/user';
import * as os from '@client/os'; import * as os from '@client/os';
import { noteActions, noteViewInterruptors } from '@client/store'; import { noteActions, noteViewInterruptors } from '@client/store';
import { reactionPicker } from '@client/scripts/reaction-picker'; import { reactionPicker } from '@client/scripts/reaction-picker';
import { extractUrlFromMfm } from '@/misc/extract-url-from-mfm';
function markRawAll(...xs) { function markRawAll(...xs) {
for (const x of xs) { for (const x of xs) {
@ -238,21 +239,7 @@ export default defineComponent({
urls(): string[] { urls(): string[] {
if (this.appearNote.text) { if (this.appearNote.text) {
const ast = parse(this.appearNote.text); return extractUrlFromMfm(mfm.parse(this.appearNote.text));
// TODO: 再帰的にURL要素がないか調べる
const urls = unique(ast
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
.map(t => t.node.props.url));
// unique without hash
// [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ]
const removeHash = x => x.replace(/#[^#]*$/, '');
return urls.reduce((array, url) => {
const removed = removeHash(url);
if (!array.map(x => removeHash(x)).includes(removed)) array.push(url);
return array;
}, []);
} else { } else {
return null; return null;
} }
@ -613,6 +600,11 @@ export default defineComponent({
window.open(this.appearNote.url || this.appearNote.uri, '_blank'); window.open(this.appearNote.url || this.appearNote.uri, '_blank');
} }
} : undefined, } : undefined,
{
icon: faShareAlt,
text: this.$ts.share,
action: this.share
},
null, null,
statePromise.then(state => state.isFavorited ? { statePromise.then(state => state.isFavorited ? {
icon: faStar, icon: faStar,
@ -838,6 +830,14 @@ export default defineComponent({
}); });
}, },
share() {
navigator.share({
title: this.$t('noteOf', { user: this.appearNote.user.name }),
text: this.appearNote.text,
url: `${url}/notes/${this.appearNote.id}`
});
},
focus() { focus() {
this.$el.focus(); this.$el.focus();
}, },
@ -863,7 +863,7 @@ export default defineComponent({
.tkcbzcuz { .tkcbzcuz {
position: relative; position: relative;
transition: box-shadow 0.1s ease; transition: box-shadow 0.1s ease;
overflow: hidden; overflow: clip;
contain: content; contain: content;
// これらの指定はパフォーマンス向上には有効だが、ノートの高さは一定でないため、 // これらの指定はパフォーマンス向上には有効だが、ノートの高さは一定でないため、
@ -994,11 +994,12 @@ export default defineComponent({
> .avatar { > .avatar {
flex-shrink: 0; flex-shrink: 0;
display: block; display: block;
//position: sticky;
//top: 72px;
margin: 0 14px 8px 0; margin: 0 14px 8px 0;
width: 58px; width: 58px;
height: 58px; height: 58px;
position: sticky;
top: calc(22px + var(--stickyTop, 0px));
left: 0;
} }
> .main { > .main {
@ -1119,7 +1120,7 @@ export default defineComponent({
} }
> .reply { > .reply {
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
} }
&.max-width_500px { &.max-width_500px {
@ -1142,6 +1143,7 @@ export default defineComponent({
margin: 0 10px 8px 0; margin: 0 10px 8px 0;
width: 50px; width: 50px;
height: 50px; height: 50px;
top: calc(14px + var(--stickyTop, 0px));
} }
} }
} }

View File

@ -1,12 +1,15 @@
<template> <template>
<div class="_list_"> <transition name="fade" mode="out-in">
<div class="_fullinfo" v-if="empty"> <MkLoading v-if="fetching"/>
<MkError v-else-if="error" @retry="init()"/>
<div class="_fullinfo" v-else-if="empty">
<img src="https://xn--931a.moe/assets/info.jpg" class="_ghost"/> <img src="https://xn--931a.moe/assets/info.jpg" class="_ghost"/>
<div>{{ $ts.noNotes }}</div> <div>{{ $ts.noNotes }}</div>
</div> </div>
<MkError v-if="error" @retry="init()"/> <div v-else>
<div v-show="more && reversed" style="margin-bottom: var(--margin);"> <div v-show="more && reversed" style="margin-bottom: var(--margin);">
<MkButton style="margin: 0 auto;" @click="fetchMoreFeature" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }"> <MkButton style="margin: 0 auto;" @click="fetchMoreFeature" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
<template v-if="!moreFetching">{{ $ts.loadMore }}</template> <template v-if="!moreFetching">{{ $ts.loadMore }}</template>
@ -14,8 +17,8 @@
</MkButton> </MkButton>
</div> </div>
<XList ref="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed"> <XList ref="notes" :items="notes" v-slot="{ item: note }" :direction="reversed ? 'up' : 'down'" :reversed="reversed" :no-gap="noGap">
<XNote :note="note" @update:note="updated(note, $event)" :key="note._featuredId_ || note._prId_ || note.id"/> <XNote :note="note" class="_block" @update:note="updated(note, $event)" :key="note._featuredId_ || note._prId_ || note.id"/>
</XList> </XList>
<div v-show="more && !reversed" style="margin-top: var(--margin);"> <div v-show="more && !reversed" style="margin-top: var(--margin);">
@ -25,6 +28,7 @@
</MkButton> </MkButton>
</div> </div>
</div> </div>
</transition>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -55,11 +59,15 @@ export default defineComponent({
pagination: { pagination: {
required: true required: true
}, },
prop: { prop: {
type: String, type: String,
required: false required: false
} },
noGap: {
type: Boolean,
required: false,
default: false
},
}, },
emits: ['before', 'after'], emits: ['before', 'after'],
@ -90,3 +98,14 @@ export default defineComponent({
} }
}); });
</script> </script>
<style lang="scss" scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.125s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
</style>

View File

@ -9,6 +9,7 @@
@closed="$emit('closed')" @closed="$emit('closed')"
> >
<template #header>{{ $ts.notificationSetting }}</template> <template #header>{{ $ts.notificationSetting }}</template>
<div class="_monolithic_">
<div v-if="showGlobalToggle" class="_section"> <div v-if="showGlobalToggle" class="_section">
<MkSwitch v-model:value="useGlobalSetting"> <MkSwitch v-model:value="useGlobalSetting">
{{ $ts.useGlobalSetting }} {{ $ts.useGlobalSetting }}
@ -21,6 +22,7 @@
<MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton> <MkButton inline @click="enableAll">{{ $ts.enableAll }}</MkButton>
<MkSwitch v-for="type in notificationTypes" :key="type" v-model:value="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch> <MkSwitch v-for="type in notificationTypes" :key="type" v-model:value="typesMap[type]">{{ $t(`_notification._types.${type}`) }}</MkSwitch>
</div> </div>
</div>
</XModalWindow> </XModalWindow>
</template> </template>

View File

@ -1,6 +1,13 @@
<template> <template>
<div class="mfcuwfyp _noGap_"> <transition name="fade" mode="out-in">
<XList class="notifications" :items="items" v-slot="{ item: notification }"> <MkLoading v-if="fetching"/>
<MkError v-else-if="error" @retry="init()"/>
<p class="mfcuwfyp" v-else-if="empty">{{ $ts.noNotifications }}</p>
<div v-else>
<XList class="notifications" :items="items" v-slot="{ item: notification }" :no-gap="true">
<XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/> <XNote v-if="['reply', 'quote', 'mention'].includes(notification.type)" :note="notification.note" @update:note="noteUpdated(notification.note, $event)" :key="notification.id"/>
<XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/> <XNotification v-else :notification="notification" :with-time="true" :full="true" class="_panel notification" :key="notification.id"/>
</XList> </XList>
@ -9,11 +16,8 @@
<template v-if="!moreFetching">{{ $ts.loadMore }}</template> <template v-if="!moreFetching">{{ $ts.loadMore }}</template>
<template v-if="moreFetching"><MkLoading inline/></template> <template v-if="moreFetching"><MkLoading inline/></template>
</button> </button>
<p class="empty" v-if="empty">{{ $ts.noNotifications }}</p>
<MkError v-if="error" @retry="init()"/>
</div> </div>
</transition>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -120,17 +124,19 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.125s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
.mfcuwfyp { .mfcuwfyp {
> .empty {
margin: 0; margin: 0;
padding: 16px; padding: 16px;
text-align: center; text-align: center;
color: var(--fg); color: var(--fg);
} }
> .placeholder {
padding: 32px;
opacity: 0.3;
}
}
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<MkA :to="`/@${page.user.username}/pages/${page.name}`" class="vhpxefrj _panel" tabindex="-1"> <MkA :to="`/@${page.user.username}/pages/${page.name}`" class="vhpxefrj _block _isolated" tabindex="-1">
<div class="thumbnail" v-if="page.eyeCatchingImage" :style="`background-image: url('${page.eyeCatchingImage.thumbnailUrl}')`"></div> <div class="thumbnail" v-if="page.eyeCatchingImage" :style="`background-image: url('${page.eyeCatchingImage.thumbnailUrl}')`"></div>
<article> <article>
<header> <header>
@ -35,7 +35,6 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.vhpxefrj { .vhpxefrj {
display: block; display: block;
width: 100%;
&:hover { &:hover {
text-decoration: none; text-decoration: none;

View File

@ -14,7 +14,7 @@
<button class="_button" @click="back()" v-if="history.length > 0"><Fa :icon="faChevronLeft"/></button> <button class="_button" @click="back()" v-if="history.length > 0"><Fa :icon="faChevronLeft"/></button>
<button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button> <button class="_button" style="pointer-events: none;" v-else><!-- マージンのバランスを取るためのダミー --></button>
</template> </template>
<div class="yrolvcoq" style="min-height: 100%; background: var(--bg);"> <div class="yrolvcoq _flat_">
<component :is="component" v-bind="props" :ref="changePage"/> <component :is="component" v-bind="props" :ref="changePage"/>
</div> </div>
</XWindow> </XWindow>
@ -29,6 +29,7 @@ import { popout } from '@client/scripts/popout';
import copyToClipboard from '@client/scripts/copy-to-clipboard'; import copyToClipboard from '@client/scripts/copy-to-clipboard';
import { resolve } from '@client/router'; import { resolve } from '@client/router';
import { url } from '@client/config'; import { url } from '@client/config';
import * as symbols from '@client/symbols';
export default defineComponent({ export default defineComponent({
components: { components: {
@ -123,8 +124,8 @@ export default defineComponent({
methods: { methods: {
changePage(page) { changePage(page) {
if (page == null) return; if (page == null) return;
if (page.INFO) { if (page[symbols.PAGE_INFO]) {
this.pageInfo = page.INFO; this.pageInfo = page[symbols.PAGE_INFO];
} }
}, },
@ -155,6 +156,7 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.yrolvcoq { .yrolvcoq {
--section-padding: 16px; min-height: 100%;
background: var(--bg);
} }
</style> </style>

View File

@ -9,8 +9,8 @@
import { TextBlock } from '@client/scripts/hpml/block'; import { TextBlock } from '@client/scripts/hpml/block';
import { Hpml } from '@client/scripts/hpml/evaluator'; import { Hpml } from '@client/scripts/hpml/evaluator';
import { defineAsyncComponent, defineComponent, PropType } from 'vue'; import { defineAsyncComponent, defineComponent, PropType } from 'vue';
import { parse } from '../../../mfm/parse'; import * as mfm from 'mfm-js';
import { unique } from '../../../prelude/array'; import { extractUrlFromMfm } from '@/misc/extract-url-from-mfm';
export default defineComponent({ export default defineComponent({
components: { components: {
@ -34,11 +34,7 @@ export default defineComponent({
computed: { computed: {
urls(): string[] { urls(): string[] {
if (this.text) { if (this.text) {
const ast = parse(this.text); return extractUrlFromMfm(mfm.parse(this.text));
// TODO: 再帰的にURL要素がないか調べる
return unique(ast
.filter(t => ((t.node.type == 'url' || t.node.type == 'link') && t.node.props.url && !t.node.props.silent))
.map(t => t.node.props.url));
} else { } else {
return []; return [];
} }

View File

@ -110,7 +110,7 @@ export default defineComponent({
position: relative; position: relative;
margin: 4px 0; margin: 4px 0;
padding: 4px 8px; padding: 4px 8px;
border: solid 1px var(--divider); border: solid 0.5px var(--divider);
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
cursor: pointer; cursor: pointer;

View File

@ -34,6 +34,7 @@
<button @click="addVisibleUser" class="_buttonPrimary"><Fa :icon="faPlus" fixed-width/></button> <button @click="addVisibleUser" class="_buttonPrimary"><Fa :icon="faPlus" fixed-width/></button>
</div> </div>
</div> </div>
<MkInfo warn v-if="hasNotSpecifiedMentions" class="hasNotSpecifiedMentions">{{ $ts.notSpecifiedMentionWarning }} - <button class="_textButton" @click="addMissingMention()">{{ $ts.add }}</button></MkInfo>
<input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown"> <input v-show="useCw" ref="cw" class="cw" v-model="cw" :placeholder="$ts.annotation" @keydown="onKeydown">
<textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" /> <textarea v-model="text" class="text" :class="{ withCw: useCw }" ref="text" :disabled="posting" :placeholder="placeholder" @keydown="onKeydown" @paste="onPaste" @compositionupdate="onCompositionUpdate" @compositionend="onCompositionEnd" />
<XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/> <XPostFormAttaches class="attaches" :files="files" @updated="updateFiles" @detach="detachFile" @changeSensitive="updateFileSensitive" @changeName="updateFileName"/>
@ -56,12 +57,12 @@ import { faReply, faQuoteRight, faPaperPlane, faTimes, faUpload, faPollH, faGlob
import { faEyeSlash, faLaughSquint } from '@fortawesome/free-regular-svg-icons'; import { faEyeSlash, faLaughSquint } from '@fortawesome/free-regular-svg-icons';
import insertTextAtCursor from 'insert-text-at-cursor'; import insertTextAtCursor from 'insert-text-at-cursor';
import { length } from 'stringz'; import { length } from 'stringz';
import { toASCII } from 'punycode'; import { toASCII } from 'punycode/';
import XNotePreview from './note-preview.vue'; import XNotePreview from './note-preview.vue';
import { parse } from '../../mfm/parse'; import * as mfm from 'mfm-js';
import { host, url } from '@client/config'; import { host, url } from '@client/config';
import { erase, unique } from '../../prelude/array'; import { erase, unique } from '../../prelude/array';
import extractMentions from '@/misc/extract-mentions'; import { extractMentions } from '@/misc/extract-mentions';
import getAcct from '@/misc/acct/render'; import getAcct from '@/misc/acct/render';
import { formatTimeString } from '@/misc/format-time-string'; import { formatTimeString } from '@/misc/format-time-string';
import { Autocomplete } from '@client/scripts/autocomplete'; import { Autocomplete } from '@client/scripts/autocomplete';
@ -71,12 +72,14 @@ import { selectFile } from '@client/scripts/select-file';
import { notePostInterruptors, postFormActions } from '@client/store'; import { notePostInterruptors, postFormActions } from '@client/store';
import { isMobile } from '@client/scripts/is-mobile'; import { isMobile } from '@client/scripts/is-mobile';
import { throttle } from 'throttle-debounce'; import { throttle } from 'throttle-debounce';
import MkInfo from '@client/components/ui/info.vue';
export default defineComponent({ export default defineComponent({
components: { components: {
XNotePreview, XNotePreview,
XPostFormAttaches: defineAsyncComponent(() => import('./post-form-attaches.vue')), XPostFormAttaches: defineAsyncComponent(() => import('./post-form-attaches.vue')),
XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue')) XPollEditor: defineAsyncComponent(() => import('./poll-editor.vue')),
MkInfo,
}, },
inject: ['modal'], inject: ['modal'],
@ -143,6 +146,7 @@ export default defineComponent({
autocomplete: null, autocomplete: null,
draghover: false, draghover: false,
quoteId: null, quoteId: null,
hasNotSpecifiedMentions: false,
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'), recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]'),
imeText: '', imeText: '',
typing: throttle(3000, () => { typing: throttle(3000, () => {
@ -214,6 +218,18 @@ export default defineComponent({
} }
}, },
watch: {
text() {
this.checkMissingMention();
},
visibleUsers: {
handler() {
this.checkMissingMention();
},
deep: true
}
},
mounted() { mounted() {
if (this.initialText) { if (this.initialText) {
this.text = this.initialText; this.text = this.initialText;
@ -229,7 +245,7 @@ export default defineComponent({
} }
if (this.reply && this.reply.text != null) { if (this.reply && this.reply.text != null) {
const ast = parse(this.reply.text); const ast = mfm.parse(this.reply.text);
for (const x of extractMentions(ast)) { for (const x of extractMentions(ast)) {
const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`; const mention = x.host ? `@${x.username}@${toASCII(x.host)}` : `@${x.username}`;
@ -338,6 +354,32 @@ export default defineComponent({
this.$watch('localOnly', () => this.saveDraft()); this.$watch('localOnly', () => this.saveDraft());
}, },
checkMissingMention() {
if (this.visibility === 'specified') {
const ast = mfm.parse(this.text);
for (const x of extractMentions(ast)) {
if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) {
this.hasNotSpecifiedMentions = true;
return;
}
}
this.hasNotSpecifiedMentions = false;
}
},
addMissingMention() {
const ast = mfm.parse(this.text);
for (const x of extractMentions(ast)) {
if (!this.visibleUsers.some(u => (u.username === x.username) && (u.host == x.host))) {
os.api('users/show', { username: x.username, host: x.host }).then(user => {
this.visibleUsers.push(user);
});
}
}
},
togglePoll() { togglePoll() {
if (this.poll) { if (this.poll) {
this.poll = null; this.poll = null;
@ -580,7 +622,7 @@ export default defineComponent({
this.deleteDraft(); this.deleteDraft();
this.$emit('posted'); this.$emit('posted');
if (this.text && this.text != '') { if (this.text && this.text != '') {
const hashtags = parse(this.text).filter(x => x.node.type === 'hashtag').map(x => x.node.props.hashtag); const hashtags = mfm.parse(this.text).filter(x => x.type === 'hashtag').map(x => x.props.hashtag);
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[]; const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history)))); localStorage.setItem('hashtags', JSON.stringify(unique(hashtags.concat(history))));
} }
@ -741,6 +783,10 @@ export default defineComponent({
} }
} }
> .hasNotSpecifiedMentions {
margin: 0 20px 16px 20px;
}
> .cw, > .cw,
> .text { > .text {
display: block; display: block;
@ -767,7 +813,7 @@ export default defineComponent({
> .cw { > .cw {
z-index: 1; z-index: 1;
padding-bottom: 8px; padding-bottom: 8px;
border-bottom: solid 1px var(--divider); border-bottom: solid 0.5px var(--divider);
} }
> .text { > .text {

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="jmgmzlwq _panel"><Fa :icon="faExclamationTriangle" style="margin-right: 8px;"/>{{ $ts.remoteUserCaution }}<a :href="href" rel="nofollow noopener" target="_blank">{{ $ts.showOnRemote }}</a></div> <div class="jmgmzlwq _block"><Fa :icon="faExclamationTriangle" style="margin-right: 8px;"/>{{ $ts.remoteUserCaution }}<a :href="href" rel="nofollow noopener" target="_blank">{{ $ts.showOnRemote }}</a></div>
</template> </template>
<script lang="ts"> <script lang="ts">

View File

@ -1,5 +1,5 @@
<template> <template>
<form class="eppvobhk" :class="{ signing, totpLogin }" @submit.prevent="onSubmit"> <form class="eppvobhk _monolithic_" :class="{ signing, totpLogin }" @submit.prevent="onSubmit">
<div class="auth _section"> <div class="auth _section">
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div> <div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
<div class="normal-signin" v-if="!totpLogin"> <div class="normal-signin" v-if="!totpLogin">
@ -39,16 +39,16 @@
</div> </div>
</div> </div>
<div class="social _section"> <div class="social _section">
<a class="_borderButton _vMargin" v-if="meta && meta.enableTwitterIntegration" :href="`${apiUrl}/signin/twitter`"><Fa :icon="faTwitter" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'Twitter' }) }}</a> <a class="_borderButton _gap" v-if="meta && meta.enableTwitterIntegration" :href="`${apiUrl}/signin/twitter`"><Fa :icon="faTwitter" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'Twitter' }) }}</a>
<a class="_borderButton _vMargin" v-if="meta && meta.enableGithubIntegration" :href="`${apiUrl}/signin/github`"><Fa :icon="faGithub" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'GitHub' }) }}</a> <a class="_borderButton _gap" v-if="meta && meta.enableGithubIntegration" :href="`${apiUrl}/signin/github`"><Fa :icon="faGithub" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'GitHub' }) }}</a>
<a class="_borderButton _vMargin" v-if="meta && meta.enableDiscordIntegration" :href="`${apiUrl}/signin/discord`"><Fa :icon="faDiscord" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'Discord' }) }}</a> <a class="_borderButton _gap" v-if="meta && meta.enableDiscordIntegration" :href="`${apiUrl}/signin/discord`"><Fa :icon="faDiscord" style="margin-right: 4px;"/>{{ $t('signinWith', { x: 'Discord' }) }}</a>
</div> </div>
</form> </form>
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import { toUnicode } from 'punycode'; import { toUnicode } from 'punycode/';
import { faLock, faGavel } from '@fortawesome/free-solid-svg-icons'; import { faLock, faGavel } from '@fortawesome/free-solid-svg-icons';
import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons'; import { faTwitter, faDiscord, faGithub } from '@fortawesome/free-brands-svg-icons';
import MkButton from './ui/button.vue'; import MkButton from './ui/button.vue';

View File

@ -7,9 +7,11 @@
> >
<template #header>{{ $ts.signup }}</template> <template #header>{{ $ts.signup }}</template>
<div class="_monolithic_">
<div class="_section"> <div class="_section">
<XSignup :auto-set="autoSet" @signup="onSignup"/> <XSignup :auto-set="autoSet" @signup="onSignup"/>
</div> </div>
</div>
</XModalWindow> </XModalWindow>
</template> </template>

View File

@ -55,7 +55,7 @@
import { defineComponent, defineAsyncComponent } from 'vue'; import { defineComponent, defineAsyncComponent } from 'vue';
import { faLock, faExclamationTriangle, faSpinner, faCheck, faKey } from '@fortawesome/free-solid-svg-icons'; import { faLock, faExclamationTriangle, faSpinner, faCheck, faKey } from '@fortawesome/free-solid-svg-icons';
const getPasswordStrength = require('syuilo-password-strength'); const getPasswordStrength = require('syuilo-password-strength');
import { toUnicode } from 'punycode'; import { toUnicode } from 'punycode/';
import { host, url } from '@client/config'; import { host, url } from '@client/config';
import MkButton from './ui/button.vue'; import MkButton from './ui/button.vue';
import MkInput from './ui/input.vue'; import MkInput from './ui/input.vue';

View File

@ -9,7 +9,7 @@
<template #header>Req Viewer</template> <template #header>Req Viewer</template>
<div class="rlkneywz"> <div class="rlkneywz">
<MkTab v-model:value="tab" style="border-bottom: solid 1px var(--divider);"> <MkTab v-model:value="tab" style="border-bottom: solid 0.5px var(--divider);">
<option value="req">Request</option> <option value="req">Request</option>
<option value="res">Response</option> <option value="res">Response</option>
</MkTab> </MkTab>

View File

@ -4,7 +4,7 @@
<Fa :icon="faTerminal" style="margin-right: 0.5em;"/>Task Manager <Fa :icon="faTerminal" style="margin-right: 0.5em;"/>Task Manager
</template> </template>
<div class="qljqmnzj _monospace"> <div class="qljqmnzj _monospace">
<MkTab v-model:value="tab" style="border-bottom: solid 1px var(--divider);"> <MkTab v-model:value="tab" style="border-bottom: solid 0.5px var(--divider);">
<option value="windows">Windows</option> <option value="windows">Windows</option>
<option value="stream">Stream</option> <option value="stream">Stream</option>
<option value="streamPool">Stream (Pool)</option> <option value="streamPool">Stream (Pool)</option>
@ -215,7 +215,7 @@ export default defineComponent({
width: 100%; width: 100%;
padding: 8px 16px; padding: 8px 16px;
box-sizing: border-box; box-sizing: border-box;
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
font-size: 0.9em; font-size: 0.9em;
> div { > div {

View File

@ -1,5 +1,5 @@
<template> <template>
<XNotes :class="{ _noGap_: !$store.state.showGapBetweenNotesInTimeline }" ref="tl" :pagination="pagination" @before="$emit('before')" @after="e => $emit('after', e)" @queue="$emit('queue', $event)"/> <XNotes :no-gap="!$store.state.showGapBetweenNotesInTimeline" ref="tl" :pagination="pagination" @before="$emit('before')" @after="e => $emit('after', e)" @queue="$emit('queue', $event)"/>
</template> </template>
<script lang="ts"> <script lang="ts">
@ -56,6 +56,7 @@ export default defineComponent({
includeLocalRenotes: this.$store.state.showLocalRenotes includeLocalRenotes: this.$store.state.showLocalRenotes
}, },
query: {}, query: {},
date: null
}; };
}, },
@ -157,7 +158,7 @@ export default defineComponent({
endpoint: endpoint, endpoint: endpoint,
limit: 10, limit: 10,
params: init => ({ params: init => ({
untilDate: init ? undefined : (this.date ? this.date.getTime() : undefined), untilDate: this.date?.getTime(),
...this.baseQuery, ...this.query ...this.baseQuery, ...this.query
}) })
}; };
@ -171,6 +172,11 @@ export default defineComponent({
methods: { methods: {
focus() { focus() {
this.$refs.tl.focus(); this.$refs.tl.focus();
},
timetravel(date?: Date) {
this.date = date;
this.$refs.tl.reload();
} }
} }
}); });

View File

@ -1,10 +1,10 @@
<template> <template>
<div class="ukygtjoj _panel" :class="{ naked, hideHeader: !showHeader, scrollable, closed: !showBody }" v-size="{ max: [380] }"> <div class="ukygtjoj _block" :class="{ naked, hideHeader: !showHeader, scrollable, closed: !showBody }" v-size="{ max: [380] }">
<header v-if="showHeader" ref="header"> <header v-if="showHeader" ref="header">
<div class="title"><slot name="header"></slot></div> <div class="title"><slot name="header"></slot></div>
<div class="sub"> <div class="sub">
<slot name="func"></slot> <slot name="func"></slot>
<button class="_button" v-if="bodyTogglable" @click="() => showBody = !showBody"> <button class="_button" v-if="foldable" @click="() => showBody = !showBody">
<template v-if="showBody"><Fa :icon="faAngleUp"/></template> <template v-if="showBody"><Fa :icon="faAngleUp"/></template>
<template v-else><Fa :icon="faAngleDown"/></template> <template v-else><Fa :icon="faAngleDown"/></template>
</button> </button>
@ -16,8 +16,11 @@
@leave="leave" @leave="leave"
@after-leave="afterLeave" @after-leave="afterLeave"
> >
<div v-show="showBody"> <div v-show="showBody" class="content" :class="{ omitted }" ref="content">
<slot></slot> <slot></slot>
<button v-if="omitted" class="fade _button" @click="() => { ignoreOmit = true; omitted = false; }">
<span>{{ $ts.showMore }}</span>
</button>
</div> </div>
</transition> </transition>
</div> </div>
@ -39,7 +42,7 @@ export default defineComponent({
required: false, required: false,
default: false default: false
}, },
bodyTogglable: { foldable: {
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
@ -54,10 +57,17 @@ export default defineComponent({
required: false, required: false,
default: false default: false
}, },
maxHeight: {
type: Number,
required: false,
default: null
},
}, },
data() { data() {
return { return {
showBody: this.expanded, showBody: this.expanded,
omitted: null,
ignoreOmit: false,
faAngleUp, faAngleDown faAngleUp, faAngleDown
}; };
}, },
@ -73,10 +83,23 @@ export default defineComponent({
}, { }, {
immediate: true immediate: true
}); });
this.$el.style.setProperty('--maxHeight', this.maxHeight + 'px');
const calcOmit = () => {
if (this.omitted || this.ignoreOmit || this.maxHeight == null) return;
const height = this.$refs.content.offsetHeight;
this.omitted = height > this.maxHeight;
};
calcOmit();
new ResizeObserver((entries, observer) => {
calcOmit();
}).observe(this.$refs.content);
}, },
methods: { methods: {
toggleContent(show: boolean) { toggleContent(show: boolean) {
if (!this.bodyTogglable) return; if (!this.foldable) return;
this.showBody = show; this.showBody = show;
}, },
@ -116,7 +139,7 @@ export default defineComponent({
.ukygtjoj { .ukygtjoj {
position: relative; position: relative;
overflow: hidden; overflow: clip;
&.naked { &.naked {
background: transparent !important; background: transparent !important;
@ -127,16 +150,18 @@ export default defineComponent({
display: flex; display: flex;
flex-direction: column; flex-direction: column;
> div { > .content {
overflow: auto; overflow: auto;
} }
} }
> header { > header {
position: relative; position: sticky;
top: var(--stickyTop, 0px);
left: 0;
color: var(--panelHeaderFg); color: var(--panelHeaderFg);
background: var(--panelHeaderBg); background: var(--panelHeaderBg);
box-shadow: 0 1px 0 0 var(--panelHeaderDivider); border-bottom: solid 0.5px var(--panelHeaderDivider);
z-index: 2; z-index: 2;
line-height: 1.4em; line-height: 1.4em;
@ -167,12 +192,35 @@ export default defineComponent({
} }
} }
> div { > .content {
> ::v-deep(._content) { &.omitted {
padding: 24px; position: relative;
max-height: var(--maxHeight);
overflow: hidden;
& + ._content { > .fade {
border-top: solid 1px var(--divider); display: block;
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 64px;
background: linear-gradient(0deg, var(--panel), var(--X15));
> span {
display: inline-block;
background: var(--panel);
padding: 6px 10px;
font-size: 0.8em;
border-radius: 999px;
box-shadow: 0 2px 6px rgb(0 0 0 / 20%);
}
&:hover {
> span {
background: var(--panelHighlight);
}
}
} }
} }
} }
@ -185,10 +233,7 @@ export default defineComponent({
} }
} }
> div { > .content {
> ::v-deep(._content) {
padding: 16px;
}
} }
} }
} }

View File

@ -98,11 +98,12 @@ export default defineComponent({
> header { > header {
display: flex; display: flex;
position: relative; position: relative;
z-index: 2; z-index: 10;
// TODO position: sticky;
// position: sticky; top: var(--stickyTop, 0px);
// top: var(--stickyTopOffset); background: var(--X17);
// backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(20px);
> .title { > .title {
margin: 0; margin: 0;
@ -137,4 +138,10 @@ export default defineComponent({
} }
} }
} }
._flat_ .ssazuxis {
> header {
padding: 0 16px;
}
}
</style> </style>

View File

@ -53,4 +53,8 @@ export default defineComponent({
margin-right: 4px; margin-right: 4px;
} }
} }
._flat_ .fpezltsf {
border-radius: 0;
}
</style> </style>

View File

@ -1,6 +1,6 @@
<template> <template>
<MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')"> <MkModal ref="modal" @click="$emit('click')" @closed="$emit('closed')">
<div class="ebkgoccj _popup _narrow_" @keydown="onKeydown" :style="{ width: `${width}px`, height: height ? `${height}px` : null }"> <div class="ebkgoccj _popup _narrow_" @keydown="onKeydown" :style="{ width: `${width}px`, height: scroll ? (height ? `${height}px` : null) : (height ? `min(${height}px, 100%)` : '100%') }">
<div class="header"> <div class="header">
<button class="_button" v-if="withOkButton" @click="$emit('close')"><Fa :icon="faTimes"/></button> <button class="_button" v-if="withOkButton" @click="$emit('close')"><Fa :icon="faTimes"/></button>
<span class="title"> <span class="title">
@ -61,6 +61,11 @@ export default defineComponent({
required: false, required: false,
default: true, default: true,
}, },
scroll: {
type: Boolean,
required: false,
default: true,
},
}, },
emits: ['click', 'close', 'closed', 'ok'], emits: ['click', 'close', 'closed', 'ok'],
@ -94,10 +99,10 @@ export default defineComponent({
flex-direction: column; flex-direction: column;
contain: content; contain: content;
--section-padding: 24px; --root-margin: 24px;
@media (max-width: 500px) { @media (max-width: 500px) {
--section-padding: 16px; --root-margin: 16px;
} }
> .header { > .header {

View File

@ -1,5 +1,5 @@
<template> <template>
<transition :name="$store.state.animation ? popup ? 'modal-popup' : 'modal' : ''" appear @after-leave="onClosed" @enter="$emit('opening')" @after-enter="childRendered"> <transition :name="$store.state.animation ? popup ? 'modal-popup' : 'modal' : ''" :duration="$store.state.animation ? popup ? 500 : 300 : 0" appear @after-leave="onClosed" @enter="$emit('opening')" @after-enter="childRendered">
<div v-show="manualShowing != null ? manualShowing : showing" class="mk-modal" v-hotkey.global="keymap" :style="{ pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }"> <div v-show="manualShowing != null ? manualShowing : showing" class="mk-modal" v-hotkey.global="keymap" :style="{ pointerEvents: (manualShowing != null ? manualShowing : showing) ? 'auto' : 'none', '--transformOrigin': transformOrigin }">
<div class="bg _modalBg" @click="onBgClick" @contextmenu.prevent.stop="() => {}"></div> <div class="bg _modalBg" @click="onBgClick" @contextmenu.prevent.stop="() => {}"></div>
<div class="content" :class="{ popup, fixed, top: position === 'top' }" @click.self="onBgClick" ref="content"> <div class="content" :class="{ popup, fixed, top: position === 'top' }" @click.self="onBgClick" ref="content">
@ -183,9 +183,6 @@ export default defineComponent({
<style lang="scss" scoped> <style lang="scss" scoped>
.modal-enter-active, .modal-leave-active { .modal-enter-active, .modal-leave-active {
// CSS的には無意味だけどこれが無いとVueが認識しない
transition: opacity 0.3s, transform 0.3s !important;
> .bg { > .bg {
transition: opacity 0.3s !important; transition: opacity 0.3s !important;
} }
@ -207,9 +204,6 @@ export default defineComponent({
} }
.modal-popup-enter-active, .modal-popup-leave-active { .modal-popup-enter-active, .modal-popup-leave-active {
// CSS的には無意味だけどこれが無いとVueが認識しない
transition: opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1), transform 0.5s cubic-bezier(0.16, 1, 0.3, 1) !important;
> .bg { > .bg {
transition: opacity 0.3s !important; transition: opacity 0.3s !important;
} }

View File

@ -39,7 +39,7 @@ export default defineComponent({
const contentHeight = this.$refs.content.offsetHeight; const contentHeight = this.$refs.content.offsetHeight;
let left = rect.left + window.pageXOffset + (this.source.offsetWidth / 2); let left = rect.left + window.pageXOffset + (this.source.offsetWidth / 2);
let top = rect.top + window.pageYOffset + this.source.offsetHeight; let top = rect.top + window.pageYOffset - contentHeight;
left -= (this.$el.offsetWidth / 2); left -= (this.$el.offsetWidth / 2);
@ -47,9 +47,9 @@ export default defineComponent({
left = window.innerWidth - contentWidth + window.pageXOffset - 1; left = window.innerWidth - contentWidth + window.pageXOffset - 1;
} }
if (top + contentHeight - window.pageYOffset > window.innerHeight) { if (top - window.pageYOffset < 0) {
top = rect.top + window.pageYOffset - contentHeight; top = rect.top + window.pageYOffset + this.source.offsetHeight;
this.$refs.content.style.transformOrigin = 'center bottom'; this.$refs.content.style.transformOrigin = 'center top';
} }
this.$el.style.left = left + 'px'; this.$el.style.left = left + 'px';
@ -81,6 +81,6 @@ export default defineComponent({
text-align: center; text-align: center;
border-radius: 4px; border-radius: 4px;
pointer-events: none; pointer-events: none;
transform-origin: center top; transform-origin: center bottom;
} }
</style> </style>

View File

@ -395,7 +395,7 @@ export default defineComponent({
position: fixed; position: fixed;
top: 0; top: 0;
left: 0; left: 0;
z-index: 5000; z-index: 10000; // mk-modalのと同じでなければならない
&.front { &.front {
z-index: 11000; // front指定の時は、mk-modalのよりも大きくなければならない z-index: 11000; // front指定の時は、mk-modalのよりも大きくなければならない

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="_panel vjnjpkug"> <div class="_panel vjnjpkug">
<div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''"></div> <div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''"></div>
<MkAvatar class="avatar" :user="user" :disable-preview="true"/> <MkAvatar class="avatar" :user="user" :disable-preview="true" :show-indicator="true"/>
<div class="title"> <div class="title">
<MkA class="name" :to="userPage(user)"><MkUserName :user="user" :nowrap="false"/></MkA> <MkA class="name" :to="userPage(user)"><MkUserName :user="user" :nowrap="false"/></MkA>
<p class="username"><MkAcct :user="user"/></p> <p class="username"><MkAcct :user="user"/></p>
@ -104,7 +104,7 @@ export default defineComponent({
> .description { > .description {
padding: 16px; padding: 16px;
font-size: 0.8em; font-size: 0.8em;
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
> .mfm { > .mfm {
display: -webkit-box; display: -webkit-box;
@ -116,7 +116,7 @@ export default defineComponent({
> .status { > .status {
padding: 10px 16px; padding: 10px 16px;
border-top: solid 1px var(--divider); border-top: solid 0.5px var(--divider);
> div { > div {
display: inline-block; display: inline-block;

View File

@ -1,7 +1,7 @@
<template> <template>
<MkError v-if="error" @retry="init()"/> <MkError v-if="error" @retry="init()"/>
<div v-else class="efvhhmdq"> <div v-else class="efvhhmdq _isolated">
<div class="no-users" v-if="empty"> <div class="no-users" v-if="empty">
<p>{{ $ts.noUsers }}</p> <p>{{ $ts.noUsers }}</p>
</div> </div>

View File

@ -0,0 +1,50 @@
<template>
<div class="fzgwjkgc" :class="user.onlineStatus" v-tooltip="text"></div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
props: {
user: {
type: Object,
required: true
},
},
computed: {
text(): string {
switch (this.user.onlineStatus) {
case 'online': return this.$ts.online;
case 'active': return this.$ts.active;
case 'offline': return this.$ts.offline;
case 'unknown': return this.$ts.unknown;
}
}
}
});
</script>
<style lang="scss" scoped>
.fzgwjkgc {
box-shadow: 0 0 0 3px var(--panel);
border-radius: 100%;
&.online {
background: #58d4c9;
}
&.active {
background: #e4bc48;
}
&.offline {
background: #ea5353;
}
&.unknown {
background: #888;
}
}
</style>

View File

@ -3,7 +3,7 @@
<div v-if="showing" class="fxxzrfni _popup _shadow" :style="{ top: top + 'px', left: left + 'px' }" @mouseover="() => { $emit('mouseover'); }" @mouseleave="() => { $emit('mouseleave'); }"> <div v-if="showing" class="fxxzrfni _popup _shadow" :style="{ top: top + 'px', left: left + 'px' }" @mouseover="() => { $emit('mouseover'); }" @mouseleave="() => { $emit('mouseleave'); }">
<div v-if="fetched" class="info"> <div v-if="fetched" class="info">
<div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''"></div> <div class="banner" :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''"></div>
<MkAvatar class="avatar" :user="user" :disable-preview="true"/> <MkAvatar class="avatar" :user="user" :disable-preview="true" :show-indicator="true"/>
<div class="title"> <div class="title">
<MkA class="name" :to="userPage(user)"><MkUserName :user="user" :nowrap="false"/></MkA> <MkA class="name" :to="userPage(user)"><MkUserName :user="user" :nowrap="false"/></MkA>
<p class="username"><MkAcct :user="user"/></p> <p class="username"><MkAcct :user="user"/></p>

View File

@ -17,7 +17,7 @@
<div class="tbhwbxda _section result" v-if="username != '' || host != ''" :class="{ hit: users.length > 0 }"> <div class="tbhwbxda _section result" v-if="username != '' || host != ''" :class="{ hit: users.length > 0 }">
<div class="users" v-if="users.length > 0"> <div class="users" v-if="users.length > 0">
<div class="user" v-for="user in users" :key="user.id" :class="{ selected: selected && selected.id === user.id }" @click="selected = user" @dblclick="ok()"> <div class="user" v-for="user in users" :key="user.id" :class="{ selected: selected && selected.id === user.id }" @click="selected = user" @dblclick="ok()">
<MkAvatar :user="user" class="avatar"/> <MkAvatar :user="user" class="avatar" :show-indicator="true"/>
<div class="body"> <div class="body">
<MkUserName :user="user" class="name"/> <MkUserName :user="user" class="name"/>
<MkAcct :user="user" class="acct"/> <MkAcct :user="user" class="acct"/>
@ -31,7 +31,7 @@
<div class="tbhwbxda _section recent" v-if="username == '' && host == ''"> <div class="tbhwbxda _section recent" v-if="username == '' && host == ''">
<div class="users"> <div class="users">
<div class="user" v-for="user in recentUsers" :key="user.id" :class="{ selected: selected && selected.id === user.id }" @click="selected = user" @dblclick="ok()"> <div class="user" v-for="user in recentUsers" :key="user.id" :class="{ selected: selected && selected.id === user.id }" @click="selected = user" @dblclick="ok()">
<MkAvatar :user="user" class="avatar"/> <MkAvatar :user="user" class="avatar" :show-indicator="true"/>
<div class="body"> <div class="body">
<MkUserName :user="user" class="name"/> <MkUserName :user="user" class="name"/>
<MkAcct :user="user" class="acct"/> <MkAcct :user="user" class="acct"/>
@ -153,7 +153,7 @@ export default defineComponent({
> .user { > .user {
display: flex; display: flex;
align-items: center; align-items: center;
padding: 8px var(--section-padding); padding: 8px var(--root-margin);
font-size: 14px; font-size: 14px;
&:hover { &:hover {

Some files were not shown because too many files have changed in this diff Show More