Compare commits
127 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b24e32e14e | ||
![]() |
943805bdcd | ||
![]() |
a73c65da07 | ||
![]() |
a3cf63823f | ||
![]() |
33469ff87a | ||
![]() |
23b0723168 | ||
![]() |
fda1ab3e05 | ||
![]() |
490c05a869 | ||
![]() |
f0137daebe | ||
![]() |
b9fc0e6d71 | ||
![]() |
979efee412 | ||
![]() |
9e41fddea3 | ||
![]() |
8384efc8c7 | ||
![]() |
7797c86581 | ||
![]() |
4da8cc478f | ||
![]() |
285deeec52 | ||
![]() |
2916e49422 | ||
![]() |
41e5b9134b | ||
![]() |
d0d853dcb2 | ||
![]() |
be46c7e4c5 | ||
![]() |
8e0f41d608 | ||
![]() |
a7b438072c | ||
![]() |
99958e2fce | ||
![]() |
b82843d359 | ||
![]() |
4dfc2dfa89 | ||
![]() |
50c945607f | ||
![]() |
01f28b21dd | ||
![]() |
2cb39a8882 | ||
![]() |
6ddb6bc160 | ||
![]() |
92befbb4cc | ||
![]() |
ab701bb93e | ||
![]() |
7f9a88fd1c | ||
![]() |
c5073b33ef | ||
![]() |
765b922a8b | ||
![]() |
9b7d6274fa | ||
![]() |
26b384aef1 | ||
![]() |
0b1e5e3e08 | ||
![]() |
5b7506756e | ||
![]() |
1f28a0dfeb | ||
![]() |
f56ec82f6b | ||
![]() |
8ccbabf5ca | ||
![]() |
7c763600b7 | ||
![]() |
499491003b | ||
![]() |
3a77d871d5 | ||
![]() |
4ee6d0b549 | ||
![]() |
64aa733b16 | ||
![]() |
c8c4ec6ad4 | ||
![]() |
c9ee737078 | ||
![]() |
ebc2cca0b4 | ||
![]() |
fc94df06eb | ||
![]() |
190a03103e | ||
![]() |
0d75ae9d9a | ||
![]() |
3129f8f073 | ||
![]() |
7f751d3f20 | ||
![]() |
0b5b834f8b | ||
![]() |
0f649f7d37 | ||
![]() |
a1b100d412 | ||
![]() |
dd4ee1627e | ||
![]() |
1da0fdcf78 | ||
![]() |
800eec73b8 | ||
![]() |
166cb5e179 | ||
![]() |
4a5e145048 | ||
![]() |
be68f42220 | ||
![]() |
7942aa677f | ||
![]() |
2fcf9288a5 | ||
![]() |
9bc17974f2 | ||
![]() |
19c872a1f3 | ||
![]() |
9252c59d90 | ||
![]() |
a8f142096c | ||
![]() |
3c90abfb96 | ||
![]() |
12037fab9b | ||
![]() |
73cc425093 | ||
![]() |
5c97da935d | ||
![]() |
0b154ac7ba | ||
![]() |
d4eb0c8df9 | ||
![]() |
5ba6f20701 | ||
![]() |
695a082582 | ||
![]() |
a52c588f49 | ||
![]() |
fa469725c7 | ||
![]() |
a1f0cb1bc7 | ||
![]() |
fbbd33ded2 | ||
![]() |
9658e2b3fb | ||
![]() |
3d10b19727 | ||
![]() |
ab7725ff69 | ||
![]() |
6372451d17 | ||
![]() |
2c11cc3f0a | ||
![]() |
7f65f896f9 | ||
![]() |
def823ceea | ||
![]() |
454d294cf3 | ||
![]() |
1affdbdbab | ||
![]() |
52286f4be8 | ||
![]() |
1b9f293959 | ||
![]() |
7289d5b401 | ||
![]() |
5bdbf98f8c | ||
![]() |
4e915e96a5 | ||
![]() |
e148f6ce5e | ||
![]() |
652d7d2c05 | ||
![]() |
0b0111fe23 | ||
![]() |
5d097fb29d | ||
![]() |
f29fe986af | ||
![]() |
0c774979c0 | ||
![]() |
f0bc2ed1d7 | ||
![]() |
b174e5e57a | ||
![]() |
ae50b71c07 | ||
![]() |
b2eb50f260 | ||
![]() |
790c7f2249 | ||
![]() |
6a0f34c283 | ||
![]() |
d151445db7 | ||
![]() |
18a3007273 | ||
![]() |
bea8c3c65c | ||
![]() |
391ee01fe3 | ||
![]() |
be7cf9f731 | ||
![]() |
b92c2aa40e | ||
![]() |
45ebcbf785 | ||
![]() |
5f32484be0 | ||
![]() |
e245122f12 | ||
![]() |
21570e2111 | ||
![]() |
63e1165a01 | ||
![]() |
89b5a69127 | ||
![]() |
1152a9d03a | ||
![]() |
10092d4570 | ||
![]() |
429b4bec64 | ||
![]() |
99f96583b6 | ||
![]() |
5adb765f85 | ||
![]() |
0eb787e0d0 | ||
![]() |
4493c856a9 | ||
![]() |
59d3d4a749 |
4
.vsls.json
Normal file
4
.vsls.json
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json.schemastore.org/vsls",
|
||||||
|
"gitignore": "exclude"
|
||||||
|
}
|
@@ -1,26 +0,0 @@
|
|||||||
FROM base/archlinux
|
|
||||||
|
|
||||||
MAINTAINER Aya Morisawa
|
|
||||||
|
|
||||||
RUN rm /etc/pacman.d/mirrorlist
|
|
||||||
RUN echo 'Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist
|
|
||||||
RUN echo 'Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch' >> /etc/pacman.d/mirrorlist
|
|
||||||
|
|
||||||
RUN rm /etc/localtime
|
|
||||||
RUN ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
|
|
||||||
|
|
||||||
RUN pacman -Sy --noconfirm
|
|
||||||
RUN pacman -S --noconfirm pacman
|
|
||||||
RUN pacman-db-upgrade
|
|
||||||
RUN pacman -S --noconfirm archlinux-keyring
|
|
||||||
RUN pacman -Syyu --noconfirm
|
|
||||||
RUN pacman -S --noconfirm git nodejs npm mongodb redis
|
|
||||||
|
|
||||||
COPY misskey.sh /root/misskey.sh
|
|
||||||
RUN chmod u+x /root/misskey.sh
|
|
||||||
|
|
||||||
EXPOSE 80
|
|
||||||
EXPOSE 443
|
|
||||||
EXPOSE 27017
|
|
||||||
|
|
||||||
CMD ["/root/misskey.sh"]
|
|
@@ -1,6 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
redis-server --daemonize yes
|
|
||||||
mongod > /dev/null &
|
|
||||||
cd /root/misskey
|
|
||||||
npm start
|
|
||||||
tail -f /dev/null
|
|
@@ -1,29 +0,0 @@
|
|||||||
Setup with Docker :whale:
|
|
||||||
================================================================
|
|
||||||
|
|
||||||
Ensure that the working directory is the repository root directory.
|
|
||||||
|
|
||||||
To create misskey image:
|
|
||||||
``` console
|
|
||||||
$ sudo docker build -t misskey ./docker
|
|
||||||
```
|
|
||||||
|
|
||||||
To run misskey:
|
|
||||||
``` console
|
|
||||||
$ sudo docker run --rm -i -t -p $PORT:80 -v $(pwd):/root/misskey -v $DBPATH:/data/db misskey
|
|
||||||
```
|
|
||||||
|
|
||||||
where `$PORT` is the port used to access Misskey Web from host browser
|
|
||||||
and `$DBPATH` is the path of MongoDB database on the host for data persistence.
|
|
||||||
|
|
||||||
ex:
|
|
||||||
``` console
|
|
||||||
$ sudo docker run --rm -i -t -p 80:80 -v $(pwd):/root/misskey -v /data/db:/data/db misskey
|
|
||||||
```
|
|
||||||
|
|
||||||
If you want to run misskey in production mode, add `--env NODE_ENV=production` like this:
|
|
||||||
``` console
|
|
||||||
$ sudo docker run --rm -i -t -p 80:80 -v $(pwd):/root/misskey -v /data/db:/data/db --env NODE_ENV=production misskey
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that `$(pwd)` is the working directory.
|
|
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "おめでとう"
|
congrats: "おめでとう"
|
||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "今どうしてる?"
|
a: "今どうしてる?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "Glückwunsch!"
|
congrats: "Glückwunsch!"
|
||||||
angry: "Wütend"
|
angry: "Wütend"
|
||||||
confused: "Verwirrt"
|
confused: "Verwirrt"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "Was machst du gerade?"
|
a: "Was machst du gerade?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@@ -11,7 +11,7 @@ common:
|
|||||||
warning: "<strong>Misskey is not running ads</strong>, but some features may be unavailable or malfunctioning if ad blocking features are enabled."
|
warning: "<strong>Misskey is not running ads</strong>, but some features may be unavailable or malfunctioning if ad blocking features are enabled."
|
||||||
application-authorization: "Application authorizations."
|
application-authorization: "Application authorizations."
|
||||||
close: "Close"
|
close: "Close"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "Please do not enter or paste the code here. Account may be compromised."
|
||||||
got-it: "Got it!"
|
got-it: "Got it!"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Customization tips"
|
title: "Customization tips"
|
||||||
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "Congrats!"
|
congrats: "Congrats!"
|
||||||
angry: "Angry"
|
angry: "Angry"
|
||||||
confused: "Confused"
|
confused: "Confused"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "What are you doing?"
|
a: "What are you doing?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "Surrender"
|
surrender: "Surrender"
|
||||||
surrendered: "By surrender"
|
surrendered: "By surrender"
|
||||||
|
is-llotheo: "The lesser one wins"
|
||||||
|
looped-map: "Looped map"
|
||||||
|
can-put-everywhere: "Can put everywhere"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Play reversi with your friends!"
|
sub-title: "Play reversi with your friends!"
|
||||||
@@ -235,13 +239,13 @@ common/views/components/messaging-room.vue:
|
|||||||
no-history: "There is no further history"
|
no-history: "There is no further history"
|
||||||
resize-form: "Drag to resize"
|
resize-form: "Drag to resize"
|
||||||
new-message: "New message"
|
new-message: "New message"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "Only one file can be attached to a message."
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Enter message here"
|
input-message-here: "Enter message here"
|
||||||
send: "Send"
|
send: "Send"
|
||||||
attach-from-local: "Attach files from your device"
|
attach-from-local: "Attach files from your device"
|
||||||
attach-from-drive: "Attach files from your Drive"
|
attach-from-drive: "Attach files from your Drive"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "Only one file can be attached to a message."
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "Read"
|
is-read: "Read"
|
||||||
deleted: "This message has been deleted"
|
deleted: "This message has been deleted"
|
||||||
@@ -736,7 +740,7 @@ desktop/views/components/timeline.vue:
|
|||||||
list: "Lists"
|
list: "Lists"
|
||||||
desktop/views/components/ui.header.vue:
|
desktop/views/components/ui.header.vue:
|
||||||
welcome-back: "Welcome back,"
|
welcome-back: "Welcome back,"
|
||||||
adjective: "さん"
|
adjective: "Ms."
|
||||||
desktop/views/components/ui.header.account.vue:
|
desktop/views/components/ui.header.account.vue:
|
||||||
profile: "Your profile"
|
profile: "Your profile"
|
||||||
drive: "Media storage"
|
drive: "Media storage"
|
||||||
@@ -977,7 +981,7 @@ mobile/views/components/timeline.vue:
|
|||||||
load-more: "More"
|
load-more: "More"
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
welcome-back: "Welcome back, "
|
welcome-back: "Welcome back, "
|
||||||
adjective: "さん"
|
adjective: "Ms."
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
@@ -1066,7 +1070,7 @@ mobile/views/pages/settings/settings.profile.vue:
|
|||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Search"
|
search: "Search"
|
||||||
empty: "No posts were found for '{}'"
|
empty: "No posts were found for '{}'"
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "No posts were found for \"{}\"."
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Choose files"
|
select-file: "Choose files"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
|
160
locales/es.yml
160
locales/es.yml
@@ -39,7 +39,7 @@ common:
|
|||||||
weeks_ago: "Hace {} semana(s)"
|
weeks_ago: "Hace {} semana(s)"
|
||||||
months_ago: "Hace {} mes(es)"
|
months_ago: "Hace {} mes(es)"
|
||||||
years_ago: "Hace {} año(s)"
|
years_ago: "Hace {} año(s)"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{day} de {month}"
|
||||||
trash: "Papelera"
|
trash: "Papelera"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "domingo"
|
sunday: "domingo"
|
||||||
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "felicidades"
|
congrats: "felicidades"
|
||||||
angry: "enfadado"
|
angry: "enfadado"
|
||||||
confused: "confundido"
|
confused: "confundido"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Chafado"
|
pudding: "Chafado"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "¿Qué haces?"
|
a: "¿Qué haces?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "Rendirse"
|
surrender: "Rendirse"
|
||||||
surrendered: "Por rendirse"
|
surrendered: "Por rendirse"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "¡Juega Reversi con tus amigos!"
|
sub-title: "¡Juega Reversi con tus amigos!"
|
||||||
@@ -235,13 +239,13 @@ common/views/components/messaging-room.vue:
|
|||||||
no-history: "El historial se ha acabado"
|
no-history: "El historial se ha acabado"
|
||||||
resize-form: "Arrastra para redimensionar"
|
resize-form: "Arrastra para redimensionar"
|
||||||
new-message: "Nuevo mensaje"
|
new-message: "Nuevo mensaje"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Escribe el mensaje aquí"
|
input-message-here: "Escribe el mensaje aquí"
|
||||||
send: "Enviar"
|
send: "Enviar"
|
||||||
attach-from-local: "Adjunta ficheros desde tu PC"
|
attach-from-local: "Adjunta ficheros desde tu PC"
|
||||||
attach-from-drive: "Adjunta ficheros desde tu disco"
|
attach-from-drive: "Adjunta ficheros desde tu disco"
|
||||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
only-one-file-attached: "Un único archivo se puede conectar al mensaje"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "Leer"
|
is-read: "Leer"
|
||||||
deleted: "El mensaje se ha borrado"
|
deleted: "El mensaje se ha borrado"
|
||||||
@@ -378,56 +382,56 @@ common/views/widgets/tips.vue:
|
|||||||
tips-line10: "Usando el accesorio de Máquina del Tiempo puedes encontrar publicaciones antiguas"
|
tips-line10: "Usando el accesorio de Máquina del Tiempo puedes encontrar publicaciones antiguas"
|
||||||
tips-line11: "Puedes resaltar publicaciones en la página de usuario haciendo click en \"...\""
|
tips-line11: "Puedes resaltar publicaciones en la página de usuario haciendo click en \"...\""
|
||||||
tips-line13: "Todos los archivos añadidos a la publicación se han guardado en tu unidad."
|
tips-line13: "Todos los archivos añadidos a la publicación se han guardado en tu unidad."
|
||||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
tips-line14: "Cuando personalizas el inicio puedas dar click derecho a un accesorio y cambiar el diseño."
|
||||||
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
|
tips-line17: "Al colocar ** delante y luego del texto, lo estarás destacando en negrillas"
|
||||||
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
|
tips-line19: "Algunas ventanas pueden ser separadas fuera del navegador"
|
||||||
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
|
tips-line20: "El porcentaje mostrando en el accesorio de calendario indica el porcentaje de tiempo transcurrido."
|
||||||
tips-line21: "APIを利用してbotの開発なども行えます"
|
tips-line21: "También puedes usar la API para desarrollar tus propios bots."
|
||||||
tips-line23: "まゆかわいいよまゆ"
|
tips-line23: "Mayu is tan bonito con sus cejas."
|
||||||
tips-line24: "Misskeyは2014年にサービスを開始しました"
|
tips-line24: "Misskey inició en 2014."
|
||||||
tips-line25: "対応ブラウザではMisskeyを開いていなくても通知を受け取れます"
|
tips-line25: "Puedes recibir notificaciones incluso si Misskey no está abierto en un navegador compatible."
|
||||||
common/views/pages/follow.vue:
|
common/views/pages/follow.vue:
|
||||||
signed-in-as: "{}としてサインイン中"
|
signed-in-as: "Autenticado como {}"
|
||||||
following: "フォロー中"
|
following: "Siguiendo"
|
||||||
follow: "フォロー"
|
follow: "Seguir"
|
||||||
request-pending: "フォロー許可待ち"
|
request-pending: "Solicitud pendiente"
|
||||||
follow-request: "フォロー申請"
|
follow-request: "Solicitar suscripción"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "バナーとして表示する部分を選択"
|
banner-crop-title: "Corta la parte que aparece como un banner"
|
||||||
banner: "バナー"
|
banner: "Banner"
|
||||||
uploading-banner: "新しいバナーをアップロードしています"
|
uploading-banner: "Cargando un nuevo banner"
|
||||||
banner-updated: "バナーを更新しました"
|
banner-updated: "Banner actualizado"
|
||||||
choose-banner: "バナーにする画像を選択"
|
choose-banner: "Escoge un banner"
|
||||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
avatar-crop-title: "Corta la parte que aparece como un avatar"
|
||||||
avatar: "アバター"
|
avatar: "Avatar"
|
||||||
uploading-avatar: "新しいアバターをアップロードしています"
|
uploading-avatar: "Cargando un nuevo avatar"
|
||||||
avatar-updated: "アバターを更新しました"
|
avatar-updated: "Avatar actualizado"
|
||||||
choose-avatar: "アバターにする画像を選択"
|
choose-avatar: "Escoge una imagen de avatar"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Black ... Total"
|
total: "Negro ... Total"
|
||||||
notes: "Blue ... Notes"
|
notes: "Azul ... Notas"
|
||||||
replies: "Red ... Replies"
|
replies: "Rojo ... Respuestas"
|
||||||
renotes: "Green ... Renotes"
|
renotes: "Verde ... Republicaciones"
|
||||||
desktop/views/components/activity.vue:
|
desktop/views/components/activity.vue:
|
||||||
title: "アクティビティ"
|
title: "Actividad"
|
||||||
toggle: "表示を切り替え"
|
toggle: "Alternar vistas"
|
||||||
desktop/views/components/calendar.vue:
|
desktop/views/components/calendar.vue:
|
||||||
title: "{1}年 {2}月"
|
title: "{1} / {2}"
|
||||||
prev: "前の月"
|
prev: "Mes anterior"
|
||||||
next: "次の月"
|
next: "Próximo mes"
|
||||||
go: "クリックして時間遡行"
|
go: "Click para navegar"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "ファイル選択中"
|
choose-file: "Escoger archivos"
|
||||||
upload: "PCからドライブにファイルをアップロード"
|
upload: "Cargar archivos de tu dispositivo"
|
||||||
cancel: "キャンセル"
|
cancel: "Cancelar"
|
||||||
ok: "決定"
|
ok: "OK"
|
||||||
choose-prompt: "ファイルを選択"
|
choose-prompt: "Escoger archivos"
|
||||||
desktop/views/components/choose-folder-from-drive-window.vue:
|
desktop/views/components/choose-folder-from-drive-window.vue:
|
||||||
cancel: "キャンセル"
|
cancel: "Cancelar"
|
||||||
ok: "決定"
|
ok: "OK"
|
||||||
choose-prompt: "Escoge una Carpeta"
|
choose-prompt: "Escoge una Carpeta"
|
||||||
desktop/views/components/crop-window.vue:
|
desktop/views/components/crop-window.vue:
|
||||||
skip: "クロップをスキップ"
|
skip: "Ignorar el cortado"
|
||||||
cancel: "Cancelar"
|
cancel: "Cancelar"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
desktop/views/components/drive-window.vue:
|
desktop/views/components/drive-window.vue:
|
||||||
@@ -438,8 +442,8 @@ desktop/views/components/drive.file.vue:
|
|||||||
banner: "Banner"
|
banner: "Banner"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
rename: "Renombrar"
|
rename: "Renombrar"
|
||||||
mark-as-sensitive: "閲覧注意に設定"
|
mark-as-sensitive: "Marcar como 'sensible'"
|
||||||
unmark-as-sensitive: "閲覧注意を解除"
|
unmark-as-sensitive: "Desmarcar como 'sensible'"
|
||||||
copy-url: "Copia la URL"
|
copy-url: "Copia la URL"
|
||||||
download: "Descargar"
|
download: "Descargar"
|
||||||
else-files: "Otros"
|
else-files: "Otros"
|
||||||
@@ -484,8 +488,8 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "Subir fichero"
|
upload: "Subir fichero"
|
||||||
url-upload: "Subir desde una URL"
|
url-upload: "Subir desde una URL"
|
||||||
desktop/views/components/media-image.vue:
|
desktop/views/components/media-image.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "El contenido es NSFW (no seguro para ver en el trabajo, 'not safe for work')"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "Click para mostrar"
|
||||||
desktop/views/components/media-video.vue:
|
desktop/views/components/media-video.vue:
|
||||||
sensitive: "閲覧注意"
|
sensitive: "閲覧注意"
|
||||||
click-to-show: "クリックして表示"
|
click-to-show: "クリックして表示"
|
||||||
@@ -652,26 +656,26 @@ desktop/views/components/settings.vue:
|
|||||||
version: "バージョン:"
|
version: "バージョン:"
|
||||||
latest-version: "最新のバージョン:"
|
latest-version: "最新のバージョン:"
|
||||||
update-checking: "アップデートを確認中"
|
update-checking: "アップデートを確認中"
|
||||||
do-update: "アップデートを確認"
|
do-update: "Chequear por actualizaciones"
|
||||||
update-settings: "詳細設定"
|
update-settings: "Configuración avanzada"
|
||||||
prevent-update: "アップデートを延期する(非推奨)"
|
prevent-update: "Posponer actualizaciones (no recomendado)"
|
||||||
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。"
|
prevent-update-desc: "Incluso si activas esta configuración, algunas actualizaciones podrían aplicarse. Esta configuración está habilitada sólo para este dispositivo."
|
||||||
no-updates: "利用可能な更新はありません"
|
no-updates: "No hay actualizaciones disponibles"
|
||||||
no-updates-desc: "お使いのMisskeyは最新です。"
|
no-updates-desc: "Tu Misskey está actualizado"
|
||||||
update-available: "新しいバージョンが利用可能です"
|
update-available: "Una nueva versión está disponible"
|
||||||
update-available-desc: "ページを再度読み込みすると更新が適用されます。"
|
update-available-desc: "Las actualizaciones se aplicarán cuando actualices la página nuevamente."
|
||||||
advanced-settings: "高度な設定"
|
advanced-settings: "Avanzado"
|
||||||
debug-mode: "デバッグモードを有効にする"
|
debug-mode: "Habilitar modo de depuración"
|
||||||
debug-mode-desc: "この設定はブラウザに記憶されます。"
|
debug-mode-desc: "Esta configuración se ha guardado en el navegador."
|
||||||
experimental: "実験的機能を有効にする"
|
experimental: "Habilitar herramientas experimentales"
|
||||||
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
|
experimental-desc: "Activar esto puede hacer que tu cliente de Misskey se vuelva inestable. La configuración se ha guardado en el navegador."
|
||||||
tools: "ツール"
|
tools: "Herramientas"
|
||||||
task-manager: "タスクマネージャ"
|
task-manager: "Navegador de tareas"
|
||||||
third-parties: "サードパーティ"
|
third-parties: "Servicios externos"
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
|
intro: "二段階認証を設定すると、サインイン時にパスワードだけでなく、予め登録しておいた物理的なデバイス(例えばあなたのスマートフォンなど)も必要になり、よりセキュリティが向上します。"
|
||||||
detail: "詳細..."
|
detail: "Ver detalles..."
|
||||||
url: "https://www.google.co.jp/intl/ja/landing/2step/"
|
url: "https://www.google.com/landing/2step/"
|
||||||
caution: "Si pierdes acceso al dispositivo, no podrás conectarte a Misskey."
|
caution: "Si pierdes acceso al dispositivo, no podrás conectarte a Misskey."
|
||||||
register: "Registrar un dispositivo"
|
register: "Registrar un dispositivo"
|
||||||
already-registered: "Un dispositivo ya fue registrado"
|
already-registered: "Un dispositivo ya fue registrado"
|
||||||
@@ -704,19 +708,19 @@ desktop/views/components/settings.password.vue:
|
|||||||
reset: "Cambiar contraseña"
|
reset: "Cambiar contraseña"
|
||||||
enter-current-password: "Ingresar contraseña actual"
|
enter-current-password: "Ingresar contraseña actual"
|
||||||
enter-new-password: "Ingresar nueva contraseña"
|
enter-new-password: "Ingresar nueva contraseña"
|
||||||
enter-new-password-again: "もう一度新しいパスワードを入力してください"
|
enter-new-password-again: "Ingresar nueva contraseña de nuevo"
|
||||||
not-match: "新しいパスワードが一致しません"
|
not-match: "Las nuevas contraseñas no se corresponden consigo mismas"
|
||||||
changed: "パスワードを変更しました"
|
changed: "Contraseña actualizada"
|
||||||
desktop/views/components/settings.profile.vue:
|
desktop/views/components/settings.profile.vue:
|
||||||
avatar: "アイコン"
|
avatar: "Avatar"
|
||||||
choice-avatar: "画像を選択"
|
choice-avatar: "Escoger una imagen"
|
||||||
name: "名前"
|
name: "Nombre"
|
||||||
location: "場所"
|
location: "Localización"
|
||||||
description: "自己紹介"
|
description: "Descripción"
|
||||||
birthday: "誕生日"
|
birthday: "Fecha de nacimiento"
|
||||||
save: "保存"
|
save: "Perfil actualizado"
|
||||||
locked-account: "アカウントの保護"
|
locked-account: "Protege tu cuenta"
|
||||||
is-locked: "投稿を非公開にする"
|
is-locked: "Crear una nota privada"
|
||||||
other: "その他"
|
other: "その他"
|
||||||
is-bot: "このアカウントはBotです"
|
is-bot: "このアカウントはBotです"
|
||||||
is-cat: "このアカウントはCatです"
|
is-cat: "このアカウントはCatです"
|
||||||
|
@@ -11,7 +11,7 @@ common:
|
|||||||
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
warning: "<strong>Misskey n'utilise pas de publicités</strong>, mais quelques options peuvent être non disponibles ou fonctionneraient mal si un bloqueur de publicités est activé."
|
||||||
application-authorization: "Permissions de l'application"
|
application-authorization: "Permissions de l'application"
|
||||||
close: "Fermer"
|
close: "Fermer"
|
||||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
do-not-copy-paste: "Veuillez ne pas entrer ou coller le code ici. Le compte peut être compromis."
|
||||||
got-it: "J'ai compris !"
|
got-it: "J'ai compris !"
|
||||||
customization-tips:
|
customization-tips:
|
||||||
title: "Conseils de personnalisation"
|
title: "Conseils de personnalisation"
|
||||||
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "Félicitations !"
|
congrats: "Félicitations !"
|
||||||
angry: "En colère"
|
angry: "En colère"
|
||||||
confused: "Confus"
|
confused: "Confus"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "Que faîtes vous maintenant ?"
|
a: "Que faîtes vous maintenant ?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "Se rendre"
|
surrender: "Se rendre"
|
||||||
surrendered: "Par abandon"
|
surrendered: "Par abandon"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "Carte en boucle"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Jouer à Reversi avec vos amis·es !"
|
sub-title: "Jouer à Reversi avec vos amis·es !"
|
||||||
@@ -817,7 +821,7 @@ desktop/views/pages/search.vue:
|
|||||||
desktop/views/pages/share.vue:
|
desktop/views/pages/share.vue:
|
||||||
share-with: "Partager avec {}"
|
share-with: "Partager avec {}"
|
||||||
desktop/views/pages/tag.vue:
|
desktop/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "Pas de message avec un hashtag {} trouvé."
|
||||||
desktop/views/pages/user-list.users.vue:
|
desktop/views/pages/user-list.users.vue:
|
||||||
users: "Utilisateurs"
|
users: "Utilisateurs"
|
||||||
add-user: "Ajouter un utilisateur"
|
add-user: "Ajouter un utilisateur"
|
||||||
@@ -842,7 +846,7 @@ desktop/views/pages/user/user.photos.vue:
|
|||||||
no-photos: "Pas de photos"
|
no-photos: "Pas de photos"
|
||||||
desktop/views/pages/user/user.profile.vue:
|
desktop/views/pages/user/user.profile.vue:
|
||||||
follows-you: "Vous suis"
|
follows-you: "Vous suis"
|
||||||
stalk: "ストークする"
|
stalk: "Traquer"
|
||||||
stalking: "ストーキングしています"
|
stalking: "ストーキングしています"
|
||||||
unstalk: "ストーク解除"
|
unstalk: "ストーク解除"
|
||||||
mute: "Mettre en sourdine"
|
mute: "Mettre en sourdine"
|
||||||
@@ -892,11 +896,11 @@ mobile/views/components/drive.vue:
|
|||||||
load-more: "Charger plus"
|
load-more: "Charger plus"
|
||||||
nothing-in-drive: "Rien"
|
nothing-in-drive: "Rien"
|
||||||
folder-is-empty: "Ce dossier est vide"
|
folder-is-empty: "Ce dossier est vide"
|
||||||
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
|
prompt: "Que veux-tu faire ? (Entrez un nombre): <1 → Télécharger le fichier | 2 → Télécharger le fichier avec l'URL | 3 → Créer le dossier | 4 → Modifier le nom du dossier | 5 → Déplacer ce dossier | 6 → Supprimer ce dossier >"
|
||||||
deletion-alert: "Désolé ! La suppression d’un dossier n’est pas encore implémentée."
|
deletion-alert: "Désolé ! La suppression d’un dossier n’est pas encore implémentée."
|
||||||
folder-name: "Nom du dossier"
|
folder-name: "Nom du dossier"
|
||||||
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
|
root-rename-alert: "L'emplacement actuel est la racine, pas le dossier, vous ne pouvez donc pas le renommer. Veuillez vous déplacer dans le dossier dont vous souhaitez modifier le nom."
|
||||||
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
|
root-move-alert: "L'emplacement actuel est la racine, ce n'est pas un dossier et il ne peut pas être déplacé. Veuillez vous déplacer dans le dossier que vous souhaitez déplacer."
|
||||||
url-prompt: "URL du fichier que vous souhaitez téléverser"
|
url-prompt: "URL du fichier que vous souhaitez téléverser"
|
||||||
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
||||||
mobile/views/components/drive-file-detail.vue:
|
mobile/views/components/drive-file-detail.vue:
|
||||||
@@ -976,7 +980,7 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "Pas de notes"
|
empty: "Pas de notes"
|
||||||
load-more: "Afficher plus"
|
load-more: "Afficher plus"
|
||||||
mobile/views/components/ui.header.vue:
|
mobile/views/components/ui.header.vue:
|
||||||
welcome-back: "Bon retour parmi nous !"
|
welcome-back: "Content de vous revoir ! "
|
||||||
adjective: "さん"
|
adjective: "さん"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
timeline: "Fil d'actualité"
|
timeline: "Fil d'actualité"
|
||||||
@@ -1020,7 +1024,7 @@ mobile/views/pages/home.vue:
|
|||||||
hybrid: "Social"
|
hybrid: "Social"
|
||||||
global: "Global"
|
global: "Global"
|
||||||
mobile/views/pages/tag.vue:
|
mobile/views/pages/tag.vue:
|
||||||
no-posts-found: "ハッシュタグ「{}」が付けられた投稿は見つかりませんでした。"
|
no-posts-found: "Pas de message avec un hashtag {} trouvé."
|
||||||
mobile/views/pages/welcome.vue:
|
mobile/views/pages/welcome.vue:
|
||||||
signup: "S'enregistrer"
|
signup: "S'enregistrer"
|
||||||
mobile/views/pages/widgets.vue:
|
mobile/views/pages/widgets.vue:
|
||||||
@@ -1066,7 +1070,7 @@ mobile/views/pages/settings/settings.profile.vue:
|
|||||||
mobile/views/pages/search.vue:
|
mobile/views/pages/search.vue:
|
||||||
search: "Chercher"
|
search: "Chercher"
|
||||||
empty: "Aucun message trouvé pour '{}' "
|
empty: "Aucun message trouvé pour '{}' "
|
||||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
not-found: "Aucun post pour {} n'a été trouvé."
|
||||||
mobile/views/pages/selectdrive.vue:
|
mobile/views/pages/selectdrive.vue:
|
||||||
select-file: "Choisissez un fichier"
|
select-file: "Choisissez un fichier"
|
||||||
mobile/views/pages/settings.vue:
|
mobile/views/pages/settings.vue:
|
||||||
|
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "おめでとう"
|
congrats: "おめでとう"
|
||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "今どうしてる?"
|
a: "今どうしてる?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@@ -70,6 +70,7 @@ common:
|
|||||||
congrats: "おめでとう"
|
congrats: "おめでとう"
|
||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
@@ -181,6 +182,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
|
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
|
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "받으세요"
|
congrats: "받으세요"
|
||||||
angry: "화냈어"
|
angry: "화냈어"
|
||||||
confused: "곤란하고 있어"
|
confused: "곤란하고 있어"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "지금 어떻게하고있어?"
|
a: "지금 어떻게하고있어?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@@ -39,7 +39,7 @@ common:
|
|||||||
weeks_ago: "{} tyg. temu"
|
weeks_ago: "{} tyg. temu"
|
||||||
months_ago: "{} mies. temu"
|
months_ago: "{} mies. temu"
|
||||||
years_ago: "{} lat temu"
|
years_ago: "{} lat temu"
|
||||||
month-and-day: "{month}月 {day}日"
|
month-and-day: "{month}-{day}"
|
||||||
trash: "Kosz"
|
trash: "Kosz"
|
||||||
weekday-short:
|
weekday-short:
|
||||||
sunday: "N"
|
sunday: "N"
|
||||||
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "Gratuluję!"
|
congrats: "Gratuluję!"
|
||||||
angry: "Wściekły"
|
angry: "Wściekły"
|
||||||
confused: "Zmieszany"
|
confused: "Zmieszany"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "Co robisz?"
|
a: "Co robisz?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "Zagraj w Reversi ze znajomymi!"
|
sub-title: "Zagraj w Reversi ze znajomymi!"
|
||||||
@@ -394,15 +398,15 @@ common/views/pages/follow.vue:
|
|||||||
follow-request: "Poproś o śledzenie"
|
follow-request: "Poproś o śledzenie"
|
||||||
desktop:
|
desktop:
|
||||||
banner-crop-title: "バナーとして表示する部分を選択"
|
banner-crop-title: "バナーとして表示する部分を選択"
|
||||||
banner: "バナー"
|
banner: "Baner"
|
||||||
uploading-banner: "新しいバナーをアップロードしています"
|
uploading-banner: "Wysyłanie baneru"
|
||||||
banner-updated: "バナーを更新しました"
|
banner-updated: "Zmieniono baner"
|
||||||
choose-banner: "バナーにする画像を選択"
|
choose-banner: "Wybierz baner"
|
||||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
avatar-crop-title: "Wybierz część obrazu, która zostanie użyta jako awatar"
|
||||||
avatar: "アバター"
|
avatar: "Awatar"
|
||||||
uploading-avatar: "新しいアバターをアップロードしています"
|
uploading-avatar: "Wysyłanie awatara"
|
||||||
avatar-updated: "アバターを更新しました"
|
avatar-updated: "Wysłano awatar"
|
||||||
choose-avatar: "アバターにする画像を選択"
|
choose-avatar: "Wybierz awatar"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Czarny … Łącznie"
|
total: "Czarny … Łącznie"
|
||||||
notes: "Niebieski … Wpisy"
|
notes: "Niebieski … Wpisy"
|
||||||
@@ -1162,4 +1166,4 @@ docs:
|
|||||||
type: "Rodzaj"
|
type: "Rodzaj"
|
||||||
description: "Opis"
|
description: "Opis"
|
||||||
dev/views/index.vue:
|
dev/views/index.vue:
|
||||||
manage-apps: "アプリの管理"
|
manage-apps: "Zarządzaj aplikacjami"
|
||||||
|
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "おめでとう"
|
congrats: "おめでとう"
|
||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "今どうしてる?"
|
a: "今どうしてる?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "おめでとう"
|
congrats: "おめでとう"
|
||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "今どうしてる?"
|
a: "今どうしてる?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
@@ -66,6 +66,7 @@ common:
|
|||||||
congrats: "おめでとう"
|
congrats: "おめでとう"
|
||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
|
rip: "RIP"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
note-placeholders:
|
note-placeholders:
|
||||||
a: "今どうしてる?"
|
a: "今どうしてる?"
|
||||||
@@ -168,6 +169,9 @@ common/views/components/games/reversi/reversi.vue:
|
|||||||
common/views/components/games/reversi/reversi.game.vue:
|
common/views/components/games/reversi/reversi.game.vue:
|
||||||
surrender: "投了"
|
surrender: "投了"
|
||||||
surrendered: "投了により"
|
surrendered: "投了により"
|
||||||
|
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||||
|
looped-map: "ループマップ"
|
||||||
|
can-put-everywhere: "どこでも置けるモード"
|
||||||
common/views/components/games/reversi/reversi.index.vue:
|
common/views/components/games/reversi/reversi.index.vue:
|
||||||
title: "Misskey Reversi"
|
title: "Misskey Reversi"
|
||||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||||
|
21
package.json
21
package.json
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "5.20.0",
|
"version": "5.23.0",
|
||||||
"clientVersion": "1.0.8099",
|
"clientVersion": "1.0.8226",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
"@types/mocha": "5.2.3",
|
"@types/mocha": "5.2.3",
|
||||||
"@types/mongodb": "3.1.3",
|
"@types/mongodb": "3.1.3",
|
||||||
"@types/ms": "0.7.30",
|
"@types/ms": "0.7.30",
|
||||||
"@types/node": "10.5.7",
|
"@types/node": "10.5.8",
|
||||||
"@types/portscanner": "2.1.0",
|
"@types/portscanner": "2.1.0",
|
||||||
"@types/pug": "2.0.4",
|
"@types/pug": "2.0.4",
|
||||||
"@types/qrcode": "1.2.0",
|
"@types/qrcode": "1.2.0",
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
"diskusage": "0.2.4",
|
"diskusage": "0.2.4",
|
||||||
"dompurify": "1.0.5",
|
"dompurify": "1.0.5",
|
||||||
"elasticsearch": "15.1.1",
|
"elasticsearch": "15.1.1",
|
||||||
"element-ui": "2.4.5",
|
"element-ui": "2.4.6",
|
||||||
"emojilib": "2.3.0",
|
"emojilib": "2.3.0",
|
||||||
"escape-regexp": "0.0.1",
|
"escape-regexp": "0.0.1",
|
||||||
"eslint": "5.0.1",
|
"eslint": "5.0.1",
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
"eventemitter3": "3.1.0",
|
"eventemitter3": "3.1.0",
|
||||||
"exif-js": "2.3.0",
|
"exif-js": "2.3.0",
|
||||||
"file-loader": "1.1.11",
|
"file-loader": "1.1.11",
|
||||||
"file-type": "8.1.0",
|
"file-type": "9.0.0",
|
||||||
"fuckadblock": "3.2.1",
|
"fuckadblock": "3.2.1",
|
||||||
"gulp": "3.9.1",
|
"gulp": "3.9.1",
|
||||||
"gulp-cssnano": "2.1.3",
|
"gulp-cssnano": "2.1.3",
|
||||||
@@ -145,6 +145,7 @@
|
|||||||
"koa-slow": "2.1.0",
|
"koa-slow": "2.1.0",
|
||||||
"koa-views": "6.1.4",
|
"koa-views": "6.1.4",
|
||||||
"loader-utils": "1.1.0",
|
"loader-utils": "1.1.0",
|
||||||
|
"lodash.assign": "4.2.0",
|
||||||
"mecab-async": "0.1.2",
|
"mecab-async": "0.1.2",
|
||||||
"minio": "6.0.0",
|
"minio": "6.0.0",
|
||||||
"mkdirp": "0.5.1",
|
"mkdirp": "0.5.1",
|
||||||
@@ -154,7 +155,7 @@
|
|||||||
"monk": "6.0.6",
|
"monk": "6.0.6",
|
||||||
"ms": "2.1.1",
|
"ms": "2.1.1",
|
||||||
"nan": "2.10.0",
|
"nan": "2.10.0",
|
||||||
"node-sass": "4.9.2",
|
"node-sass": "4.9.3",
|
||||||
"node-sass-json-importer": "3.3.1",
|
"node-sass-json-importer": "3.3.1",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"object-assign-deep": "0.4.0",
|
"object-assign-deep": "0.4.0",
|
||||||
@@ -171,7 +172,7 @@
|
|||||||
"recaptcha-promise": "0.1.3",
|
"recaptcha-promise": "0.1.3",
|
||||||
"reconnecting-websocket": "3.2.2",
|
"reconnecting-websocket": "3.2.2",
|
||||||
"redis": "2.8.0",
|
"redis": "2.8.0",
|
||||||
"request": "2.87.0",
|
"request": "2.88.0",
|
||||||
"request-promise-native": "1.0.5",
|
"request-promise-native": "1.0.5",
|
||||||
"rimraf": "2.6.2",
|
"rimraf": "2.6.2",
|
||||||
"rndstr": "1.0.0",
|
"rndstr": "1.0.0",
|
||||||
@@ -187,13 +188,13 @@
|
|||||||
"style-loader": "0.22.1",
|
"style-loader": "0.22.1",
|
||||||
"stylus": "0.54.5",
|
"stylus": "0.54.5",
|
||||||
"stylus-loader": "3.0.2",
|
"stylus-loader": "3.0.2",
|
||||||
"summaly": "2.0.6",
|
"summaly": "2.1.2",
|
||||||
"systeminformation": "3.42.9",
|
"systeminformation": "3.42.9",
|
||||||
"syuilo-password-strength": "0.0.1",
|
"syuilo-password-strength": "0.0.1",
|
||||||
"textarea-caret": "3.1.0",
|
"textarea-caret": "3.1.0",
|
||||||
"tmp": "0.0.33",
|
"tmp": "0.0.33",
|
||||||
"ts-loader": "4.4.1",
|
"ts-loader": "4.4.1",
|
||||||
"ts-node": "7.0.0",
|
"ts-node": "7.0.1",
|
||||||
"tslint": "5.10.0",
|
"tslint": "5.10.0",
|
||||||
"typescript": "2.9.2",
|
"typescript": "2.9.2",
|
||||||
"typescript-eslint-parser": "18.0.0",
|
"typescript-eslint-parser": "18.0.0",
|
||||||
@@ -203,7 +204,7 @@
|
|||||||
"v-animate-css": "0.0.2",
|
"v-animate-css": "0.0.2",
|
||||||
"vue": "2.5.17",
|
"vue": "2.5.17",
|
||||||
"vue-cropperjs": "2.2.1",
|
"vue-cropperjs": "2.2.1",
|
||||||
"vue-js-modal": "1.3.16",
|
"vue-js-modal": "1.3.17",
|
||||||
"vue-json-tree-view": "2.1.4",
|
"vue-json-tree-view": "2.1.4",
|
||||||
"vue-loader": "15.3.0",
|
"vue-loader": "15.3.0",
|
||||||
"vue-router": "3.0.1",
|
"vue-router": "3.0.1",
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-if="disablePreview"></router-link>
|
<span class="mk-avatar" :title="user | acct" :style="style" v-if="disableLink && !disablePreview" v-user-preview="user.id" @click="onClick"></span>
|
||||||
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else v-user-preview="user.id"></router-link>
|
<span class="mk-avatar" :title="user | acct" :style="style" v-else-if="disableLink && disablePreview" @click="onClick"></span>
|
||||||
|
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else-if="!disableLink && !disablePreview" v-user-preview="user.id"></router-link>
|
||||||
|
<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else-if="!disableLink && disablePreview"></router-link>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@@ -15,6 +17,10 @@ export default Vue.extend({
|
|||||||
required: false,
|
required: false,
|
||||||
default: null
|
default: null
|
||||||
},
|
},
|
||||||
|
disableLink: {
|
||||||
|
required: false,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
disablePreview: {
|
disablePreview: {
|
||||||
required: false,
|
required: false,
|
||||||
default: false
|
default: false
|
||||||
@@ -35,6 +41,11 @@ export default Vue.extend({
|
|||||||
borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
|
borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onClick(e) {
|
||||||
|
this.$emit('click', e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@@ -60,6 +60,12 @@
|
|||||||
<el-button type="primary" @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</el-button>
|
<el-button type="primary" @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</el-button>
|
||||||
</el-button-group>
|
</el-button-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="info">
|
||||||
|
<p v-if="game.settings.isLlotheo">%i18n:@is-llotheo%</p>
|
||||||
|
<p v-if="game.settings.loopedBoard">%i18n:@looped-map%</p>
|
||||||
|
<p v-if="game.settings.canPutEverywhere">%i18n:@can-put-everywhere%</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
<img v-if="reaction == 'congrats'" src="/assets/reactions/congrats.png" alt="%i18n:common.reactions.congrats%">
|
<img v-if="reaction == 'congrats'" src="/assets/reactions/congrats.png" alt="%i18n:common.reactions.congrats%">
|
||||||
<img v-if="reaction == 'angry'" src="/assets/reactions/angry.png" alt="%i18n:common.reactions.angry%">
|
<img v-if="reaction == 'angry'" src="/assets/reactions/angry.png" alt="%i18n:common.reactions.angry%">
|
||||||
<img v-if="reaction == 'confused'" src="/assets/reactions/confused.png" alt="%i18n:common.reactions.confused%">
|
<img v-if="reaction == 'confused'" src="/assets/reactions/confused.png" alt="%i18n:common.reactions.confused%">
|
||||||
|
<img v-if="reaction == 'rip'" src="/assets/reactions/rip.png" alt="%i18n:common.reactions.rip%">
|
||||||
<template v-if="reaction == 'pudding'">
|
<template v-if="reaction == 'pudding'">
|
||||||
<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="/assets/reactions/sushi.png" alt="%i18n:common.reactions.pudding%">
|
<img v-if="$store.getters.isSignedIn && $store.state.settings.iLikeSushi" src="/assets/reactions/sushi.png" alt="%i18n:common.reactions.pudding%">
|
||||||
<img v-else src="/assets/reactions/pudding.png" alt="%i18n:common.reactions.pudding%">
|
<img v-else src="/assets/reactions/pudding.png" alt="%i18n:common.reactions.pudding%">
|
||||||
|
@@ -10,9 +10,10 @@
|
|||||||
<button @click="react('hmm')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" title="%i18n:common.reactions.hmm%"><mk-reaction-icon reaction='hmm'/></button>
|
<button @click="react('hmm')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" title="%i18n:common.reactions.hmm%"><mk-reaction-icon reaction='hmm'/></button>
|
||||||
<button @click="react('surprise')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" title="%i18n:common.reactions.surprise%"><mk-reaction-icon reaction='surprise'/></button>
|
<button @click="react('surprise')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" title="%i18n:common.reactions.surprise%"><mk-reaction-icon reaction='surprise'/></button>
|
||||||
<button @click="react('congrats')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" title="%i18n:common.reactions.congrats%"><mk-reaction-icon reaction='congrats'/></button>
|
<button @click="react('congrats')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" title="%i18n:common.reactions.congrats%"><mk-reaction-icon reaction='congrats'/></button>
|
||||||
<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="4" title="%i18n:common.reactions.angry%"><mk-reaction-icon reaction='angry'/></button>
|
<button @click="react('angry')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="7" title="%i18n:common.reactions.angry%"><mk-reaction-icon reaction='angry'/></button>
|
||||||
<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="5" title="%i18n:common.reactions.confused%"><mk-reaction-icon reaction='confused'/></button>
|
<button @click="react('confused')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="8" title="%i18n:common.reactions.confused%"><mk-reaction-icon reaction='confused'/></button>
|
||||||
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="6" title="%i18n:common.reactions.pudding%"><mk-reaction-icon reaction='pudding'/></button>
|
<button @click="react('rip')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="9" title="%i18n:common.reactions.rip%"><mk-reaction-icon reaction='rip'/></button>
|
||||||
|
<button @click="react('pudding')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="10" title="%i18n:common.reactions.pudding%"><mk-reaction-icon reaction='pudding'/></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
<span v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span>
|
<span v-if="reactions.congrats"><mk-reaction-icon reaction="congrats"/><span>{{ reactions.congrats }}</span></span>
|
||||||
<span v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span>
|
<span v-if="reactions.angry"><mk-reaction-icon reaction="angry"/><span>{{ reactions.angry }}</span></span>
|
||||||
<span v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span>
|
<span v-if="reactions.confused"><mk-reaction-icon reaction="confused"/><span>{{ reactions.confused }}</span></span>
|
||||||
|
<span v-if="reactions.rip"><mk-reaction-icon reaction="rip"/><span>{{ reactions.rip }}</span></span>
|
||||||
<span v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span>
|
<span v-if="reactions.pudding"><mk-reaction-icon reaction="pudding"/><span>{{ reactions.pudding }}</span></span>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -12,13 +12,13 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
|
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required/>
|
||||||
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
||||||
<p style="margin: 8px 0;">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
<p style="margin: 8px 0;" v-if="twitterIntegration">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||||
</form>
|
</form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { apiUrl, host } from '../../../config';
|
import { apiUrl, host, twitterIntegration } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
@@ -36,7 +36,8 @@ export default Vue.extend({
|
|||||||
password: '',
|
password: '',
|
||||||
token: '',
|
token: '',
|
||||||
apiUrl,
|
apiUrl,
|
||||||
host
|
host,
|
||||||
|
twitterIntegration
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@@ -1,13 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<iframe v-if="youtubeId" type="text/html" height="250"
|
<iframe v-if="player" :src="player" heigth="250" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen />
|
||||||
:src="`https://www.youtube.com/embed/${youtubeId}?origin=${misskeyUrl}`"
|
|
||||||
frameborder="0"/>
|
|
||||||
<iframe v-else-if="spotifyId"
|
|
||||||
:src="`https://open.spotify.com/embed/track/${spotifyId}`"
|
|
||||||
frameborder="0" allowtransparency="true" allow="encrypted-media" />
|
|
||||||
<iframe v-else-if="nicovideoId"
|
|
||||||
:src="`https://embed.nicovideo.jp/watch/${nicovideoId}?oldScript=1&referer=${misskeyUrl}&from=${position || '0'}&allowProgrammaticFullScreen=1`"
|
|
||||||
frameborder="0" allow="autoplay; encrypted-media" allowfullscreen />
|
|
||||||
<div v-else-if="tweetUrl && detail" class="twitter">
|
<div v-else-if="tweetUrl && detail" class="twitter">
|
||||||
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
|
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
|
||||||
<a :href="url"></a>
|
<a :href="url"></a>
|
||||||
@@ -54,10 +46,7 @@ export default Vue.extend({
|
|||||||
thumbnail: null,
|
thumbnail: null,
|
||||||
icon: null,
|
icon: null,
|
||||||
sitename: null,
|
sitename: null,
|
||||||
youtubeId: null,
|
player: null,
|
||||||
spotifyId: null,
|
|
||||||
nicovideoId: null,
|
|
||||||
position: null,
|
|
||||||
tweetUrl: null,
|
tweetUrl: null,
|
||||||
misskeyUrl
|
misskeyUrl
|
||||||
};
|
};
|
||||||
@@ -65,23 +54,7 @@ export default Vue.extend({
|
|||||||
created() {
|
created() {
|
||||||
const url = new URL(this.url);
|
const url = new URL(this.url);
|
||||||
|
|
||||||
if (url.hostname == 'www.youtube.com') {
|
if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) {
|
||||||
this.youtubeId = url.searchParams.get('v');
|
|
||||||
return;
|
|
||||||
} else if (url.hostname == 'youtu.be') {
|
|
||||||
this.youtubeId = url.pathname;
|
|
||||||
return;
|
|
||||||
} else if (url.hostname == 'open.spotify.com') {
|
|
||||||
this.spotifyId = url.pathname.split('/').reverse().filter(x => x !== '')[0];
|
|
||||||
return;
|
|
||||||
} else if (['nicovideo.jp', 'www.nicovideo.jp', 'nico.ms'].includes(url.hostname)) {
|
|
||||||
const id = url.pathname.split('/').reverse().filter(x => x !== '')[0];
|
|
||||||
if (['sm', 'nm', 'ax', 'ca', 'cd', 'cw', 'fx', 'ig', 'na', 'om', 'sd', 'sk', 'yk', 'yo', 'za', 'zb', 'zc', 'zd', 'ze', 'nl', 'so', ...Array(10).keys()].some(x => id.startsWith(x)) {
|
|
||||||
this.nicovideoId = id;
|
|
||||||
this.position = url.searchParams.get('from');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) {
|
|
||||||
this.tweetUrl = url;
|
this.tweetUrl = url;
|
||||||
const twttr = (window as any).twttr || {};
|
const twttr = (window as any).twttr || {};
|
||||||
const loadTweet = () => twttr.widgets.load(this.$refs.tweet);
|
const loadTweet = () => twttr.widgets.load(this.$refs.tweet);
|
||||||
@@ -104,15 +77,92 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
|
fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
|
||||||
res.json().then(info => {
|
res.json().then(info => {
|
||||||
this.title = info.title;
|
if (info.url != null) {
|
||||||
this.description = info.description;
|
this.title = info.title;
|
||||||
this.thumbnail = info.thumbnail;
|
this.description = info.description;
|
||||||
this.icon = info.icon;
|
this.thumbnail = info.thumbnail;
|
||||||
this.sitename = info.sitename;
|
this.icon = info.icon;
|
||||||
|
this.sitename = info.sitename;
|
||||||
this.fetching = false;
|
this.fetching = false;
|
||||||
|
if ([ // THIS IS THE WHITELIST FOR THE EMBED PLAYER
|
||||||
|
'afreecatv.com',
|
||||||
|
'aparat.com',
|
||||||
|
'applemusic.com',
|
||||||
|
'amazon.com',
|
||||||
|
'awa.fm',
|
||||||
|
'bandcamp.com',
|
||||||
|
'bbc.co.uk',
|
||||||
|
'beatport.com',
|
||||||
|
'bilibili.com',
|
||||||
|
'boomstream.com',
|
||||||
|
'breakers.tv',
|
||||||
|
'cam4.com',
|
||||||
|
'cavelis.net',
|
||||||
|
'chaturbate.com',
|
||||||
|
'cnn.com',
|
||||||
|
'cybergame.tv',
|
||||||
|
'dailymotion.com',
|
||||||
|
'deezer.com',
|
||||||
|
'djlive.pl',
|
||||||
|
'e-onkyo.com',
|
||||||
|
'eventials.com',
|
||||||
|
'facebook.com',
|
||||||
|
'fc2.com',
|
||||||
|
'gameplank.tv',
|
||||||
|
'goodgame.ru',
|
||||||
|
'google.com',
|
||||||
|
'hardtunes.com',
|
||||||
|
'instagram.com',
|
||||||
|
'johnnylooch.com',
|
||||||
|
'kexp.org',
|
||||||
|
'lahzenegar.com',
|
||||||
|
'liveedu.tv',
|
||||||
|
'livetube.cc',
|
||||||
|
'livestream.com',
|
||||||
|
'meridix.com',
|
||||||
|
'mixcloud.com',
|
||||||
|
'mixer.com',
|
||||||
|
'mobcrush.com',
|
||||||
|
'mylive.in.th',
|
||||||
|
'myspace.com',
|
||||||
|
'netflix.com',
|
||||||
|
'newretrowave.com',
|
||||||
|
'nhk.or.jp',
|
||||||
|
'nicovideo.jp',
|
||||||
|
'noisetrade.com',
|
||||||
|
'nood.tv',
|
||||||
|
'npr.org',
|
||||||
|
'openrec.tv',
|
||||||
|
'pandora.com',
|
||||||
|
'pandora.tv',
|
||||||
|
'picarto.tv',
|
||||||
|
'pscp.tv',
|
||||||
|
'restream.io',
|
||||||
|
'reverbnation.com',
|
||||||
|
'sermonaudio.com',
|
||||||
|
'smashcast.tv',
|
||||||
|
'songkick.com',
|
||||||
|
'soundcloud.com',
|
||||||
|
'spinninrecords.com',
|
||||||
|
'stitcher.com',
|
||||||
|
'stream.me',
|
||||||
|
'switchboard.live',
|
||||||
|
'tunein.com',
|
||||||
|
'twitcasting.tv',
|
||||||
|
'twitch.tv',
|
||||||
|
'twitter.com',
|
||||||
|
'vaughnlive.tv',
|
||||||
|
'veoh.com',
|
||||||
|
'vimeo.com',
|
||||||
|
'watchpeoplecode.com',
|
||||||
|
'web.tv',
|
||||||
|
'youtube.com',
|
||||||
|
'youtu.be'
|
||||||
|
].some(x => x == url.hostname || url.hostname.endsWith(`.${x}`))))
|
||||||
|
this.player = info.player;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@@ -22,6 +22,7 @@ declare const _CODENAME_: string;
|
|||||||
declare const _LICENSE_: string;
|
declare const _LICENSE_: string;
|
||||||
declare const _GOOGLE_MAPS_API_KEY_: string;
|
declare const _GOOGLE_MAPS_API_KEY_: string;
|
||||||
declare const _WELCOME_BG_URL_: string;
|
declare const _WELCOME_BG_URL_: string;
|
||||||
|
declare const _TWITTER_INTEGRATION_: boolean;
|
||||||
|
|
||||||
export const host = _HOST_;
|
export const host = _HOST_;
|
||||||
export const hostname = _HOSTNAME_;
|
export const hostname = _HOSTNAME_;
|
||||||
@@ -47,3 +48,4 @@ export const codename = _CODENAME_;
|
|||||||
export const license = _LICENSE_;
|
export const license = _LICENSE_;
|
||||||
export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
|
export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_;
|
||||||
export const welcomeBgUrl = _WELCOME_BG_URL_;
|
export const welcomeBgUrl = _WELCOME_BG_URL_;
|
||||||
|
export const twitterIntegration = _TWITTER_INTEGRATION_;
|
||||||
|
@@ -99,7 +99,7 @@ export default Vue.extend({
|
|||||||
text: '%i18n:@contextmenu.set-as-banner%',
|
text: '%i18n:@contextmenu.set-as-banner%',
|
||||||
action: this.setAsBanner
|
action: this.setAsBanner
|
||||||
}]
|
}]
|
||||||
}, {
|
}, /*{
|
||||||
type: 'nest',
|
type: 'nest',
|
||||||
text: '%i18n:@contextmenu.open-in-app%',
|
text: '%i18n:@contextmenu.open-in-app%',
|
||||||
menu: [{
|
menu: [{
|
||||||
@@ -107,11 +107,11 @@ export default Vue.extend({
|
|||||||
text: '%i18n:@contextmenu.add-app%...',
|
text: '%i18n:@contextmenu.add-app%...',
|
||||||
action: this.addApp
|
action: this.addApp
|
||||||
}]
|
}]
|
||||||
}], {
|
}*/], {
|
||||||
closed: () => {
|
closed: () => {
|
||||||
this.isContextmenuShowing = false;
|
this.isContextmenuShowing = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onDragstart(e) {
|
onDragstart(e) {
|
||||||
|
@@ -67,16 +67,16 @@ export default Vue.extend({
|
|||||||
text: '%i18n:@contextmenu.rename%',
|
text: '%i18n:@contextmenu.rename%',
|
||||||
icon: '%fa:i-cursor%',
|
icon: '%fa:i-cursor%',
|
||||||
action: this.rename
|
action: this.rename
|
||||||
}, null, {
|
}/*, null, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:common.delete%',
|
text: '%i18n:common.delete%',
|
||||||
icon: '%fa:R trash-alt%',
|
icon: '%fa:R trash-alt%',
|
||||||
action: this.deleteFolder
|
action: this.deleteFolder
|
||||||
}], {
|
}*/], {
|
||||||
closed: () => {
|
closed: () => {
|
||||||
this.isContextmenuShowing = false;
|
this.isContextmenuShowing = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onMouseover() {
|
onMouseover() {
|
||||||
|
@@ -567,6 +567,7 @@ export default Vue.extend({
|
|||||||
// ファイル一覧取得
|
// ファイル一覧取得
|
||||||
(this as any).api('drive/files', {
|
(this as any).api('drive/files', {
|
||||||
folderId: this.folder ? this.folder.id : null,
|
folderId: this.folder ? this.folder.id : null,
|
||||||
|
untilId: this.files[this.files.length - 1].id,
|
||||||
limit: max + 1
|
limit: max + 1
|
||||||
}).then(files => {
|
}).then(files => {
|
||||||
if (files.length == max + 1) {
|
if (files.length == max + 1) {
|
||||||
|
@@ -155,10 +155,12 @@ root(isDark)
|
|||||||
max-width 1300px
|
max-width 1300px
|
||||||
margin 0 auto
|
margin 0 auto
|
||||||
|
|
||||||
> .center
|
> *
|
||||||
margin auto
|
position absolute
|
||||||
|
height 48px
|
||||||
|
|
||||||
> .icon
|
> .icon
|
||||||
|
margin auto
|
||||||
display block
|
display block
|
||||||
width 48px
|
width 48px
|
||||||
height 48px
|
height 48px
|
||||||
@@ -169,11 +171,13 @@ root(isDark)
|
|||||||
opacity 0.3
|
opacity 0.3
|
||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
> .left
|
> .left,
|
||||||
height 48px
|
> .center
|
||||||
|
left 0
|
||||||
|
|
||||||
> .right
|
> .right,
|
||||||
height 48px
|
> .center
|
||||||
|
right 0
|
||||||
|
|
||||||
> *
|
> *
|
||||||
display inline-block
|
display inline-block
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
<div class="about">
|
<div class="about">
|
||||||
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
|
<h1 v-if="name != 'Misskey'">{{ name }}</h1>
|
||||||
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
|
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
|
||||||
<p class="powerd-by" v-if="name != 'Misskey'">%i18n:@powered-by-misskey%</p>
|
<p class="powerd-by" v-if="name != 'Misskey'" v-html="'%i18n:@powered-by-misskey%'"></p>
|
||||||
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
|
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
|
||||||
<a ref="signup" @click="signup">📦 %i18n:@signup%</a>
|
<a ref="signup" @click="signup">📦 %i18n:@signup%</a>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -6,10 +6,11 @@
|
|||||||
<div class="banner"
|
<div class="banner"
|
||||||
:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''"
|
:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''"
|
||||||
title="%i18n:@update-banner%"
|
title="%i18n:@update-banner%"
|
||||||
@click="os.apis.updateBanner"
|
@click="() => os.apis.updateBanner()"
|
||||||
></div>
|
></div>
|
||||||
<mk-avatar class="avatar" :user="$store.state.i"
|
<mk-avatar class="avatar" :user="$store.state.i"
|
||||||
@click="os.apis.updateAvatar"
|
:disable-link="true"
|
||||||
|
@click="() => os.apis.updateAvatar()"
|
||||||
title="%i18n:@update-avatar%"
|
title="%i18n:@update-avatar%"
|
||||||
/>
|
/>
|
||||||
<router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link>
|
<router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link>
|
||||||
|
BIN
src/client/assets/reactions/rip.png
Normal file
BIN
src/client/assets/reactions/rip.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.6 KiB |
@@ -3,9 +3,7 @@ import config from '../config';
|
|||||||
const u = config.mongodb.user ? encodeURIComponent(config.mongodb.user) : null;
|
const u = config.mongodb.user ? encodeURIComponent(config.mongodb.user) : null;
|
||||||
const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null;
|
const p = config.mongodb.pass ? encodeURIComponent(config.mongodb.pass) : null;
|
||||||
|
|
||||||
const uri = u && p
|
const uri = `mongodb://${u && p ? `${u}:${p}@` : ''}${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
|
||||||
? `mongodb://${u}:${p}@${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`
|
|
||||||
: `mongodb://${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.db}`;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* monk
|
* monk
|
||||||
|
41
src/docs/api/entities/drive-folder.yaml
Normal file
41
src/docs/api/entities/drive-folder.yaml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: "DriveFolder"
|
||||||
|
|
||||||
|
desc:
|
||||||
|
ja: "ドライブのフォルダを表します。"
|
||||||
|
en: "A folder of Drive."
|
||||||
|
|
||||||
|
props:
|
||||||
|
id:
|
||||||
|
type: "id"
|
||||||
|
optional: false
|
||||||
|
desc:
|
||||||
|
ja: "フォルダID"
|
||||||
|
en: "The ID of this folder"
|
||||||
|
|
||||||
|
createdAt:
|
||||||
|
type: "date"
|
||||||
|
optional: false
|
||||||
|
desc:
|
||||||
|
ja: "作成日時"
|
||||||
|
en: "The created date of this folder"
|
||||||
|
|
||||||
|
userId:
|
||||||
|
type: "id(User)"
|
||||||
|
optional: false
|
||||||
|
desc:
|
||||||
|
ja: "所有者ID"
|
||||||
|
en: "The ID of the owner of this folder"
|
||||||
|
|
||||||
|
parentId:
|
||||||
|
type: "entity(DriveFolder)"
|
||||||
|
optional: false
|
||||||
|
desc:
|
||||||
|
ja: "親フォルダのID (ルートなら null)"
|
||||||
|
en: "The ID of parent folder"
|
||||||
|
|
||||||
|
name:
|
||||||
|
type: "string"
|
||||||
|
optional: false
|
||||||
|
desc:
|
||||||
|
ja: "フォルダ名"
|
||||||
|
en: "The name of this folder"
|
@@ -8,6 +8,7 @@ export default function(reaction: string): string {
|
|||||||
case 'congrats': return '🎉';
|
case 'congrats': return '🎉';
|
||||||
case 'angry': return '💢';
|
case 'angry': return '💢';
|
||||||
case 'confused': return '😥';
|
case 'confused': return '😥';
|
||||||
|
case 'rip': return '😇';
|
||||||
case 'pudding': return '🍮';
|
case 'pudding': return '🍮';
|
||||||
default: return '';
|
default: return '';
|
||||||
}
|
}
|
||||||
|
@@ -13,7 +13,7 @@ export default App;
|
|||||||
export type IApp = {
|
export type IApp = {
|
||||||
_id: mongo.ObjectID;
|
_id: mongo.ObjectID;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
userId: mongo.ObjectID;
|
userId: mongo.ObjectID | null;
|
||||||
secret: string;
|
secret: string;
|
||||||
name: string;
|
name: string;
|
||||||
nameId: string;
|
nameId: string;
|
||||||
|
@@ -10,7 +10,7 @@ import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumb
|
|||||||
|
|
||||||
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
|
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
|
||||||
DriveFile.createIndex('md5');
|
DriveFile.createIndex('md5');
|
||||||
DriveFile.createIndex('metadata.uri', { sparse: true, unique: true });
|
DriveFile.createIndex('metadata.uri');
|
||||||
export default DriveFile;
|
export default DriveFile;
|
||||||
|
|
||||||
export const DriveFileChunk = monkDb.get('driveFiles.chunks');
|
export const DriveFileChunk = monkDb.get('driveFiles.chunks');
|
||||||
|
@@ -26,6 +26,7 @@ export const validateReaction = $.str.or([
|
|||||||
'congrats',
|
'congrats',
|
||||||
'angry',
|
'angry',
|
||||||
'confused',
|
'confused',
|
||||||
|
'rip',
|
||||||
'pudding'
|
'pudding'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@@ -340,7 +340,7 @@ export const pack = async (
|
|||||||
_note = await rap(_note);
|
_note = await rap(_note);
|
||||||
|
|
||||||
if (_note.user.isCat && _note.text) {
|
if (_note.user.isCat && _note.text) {
|
||||||
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ');
|
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ').replace(/ナ/g, 'ニャ');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hide) {
|
if (hide) {
|
||||||
|
@@ -7,7 +7,7 @@ export default async (job: bq.Job, done: any): Promise<void> => {
|
|||||||
await request(job.data.user, job.data.to, job.data.content);
|
await request(job.data.user, job.data.to, job.data.content);
|
||||||
done();
|
done();
|
||||||
} catch (res) {
|
} catch (res) {
|
||||||
if (!res.hasOwnProperty('statusCode')) {
|
if (res == null || !res.hasOwnProperty('statusCode')) {
|
||||||
console.warn(`deliver failed (unknown): ${res}`);
|
console.warn(`deliver failed (unknown): ${res}`);
|
||||||
return done();
|
return done();
|
||||||
}
|
}
|
||||||
|
@@ -69,12 +69,13 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
|
|||||||
if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
if (!note.to.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
||||||
if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
if (note.cc.includes('https://www.w3.org/ns/activitystreams#Public')) {
|
||||||
visibility = 'home';
|
visibility = 'home';
|
||||||
|
} else if (note.to.includes(`${actor.uri}/followers`)) { // TODO: person.followerと照合するべき?
|
||||||
|
visibility = 'followers';
|
||||||
} else {
|
} else {
|
||||||
visibility = 'specified';
|
visibility = 'specified';
|
||||||
visibleUsers = await Promise.all(note.to.map(uri => resolvePerson(uri)));
|
visibleUsers = await Promise.all(note.to.map(uri => resolvePerson(uri)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (note.cc.length == 0) visibility = 'followers';
|
|
||||||
//#endergion
|
//#endergion
|
||||||
|
|
||||||
// 添付メディア
|
// 添付メディア
|
||||||
|
@@ -4,5 +4,5 @@ import { IDriveFile } from '../../../models/drive-file';
|
|||||||
export default (file: IDriveFile) => ({
|
export default (file: IDriveFile) => ({
|
||||||
type: 'Document',
|
type: 'Document',
|
||||||
mediaType: file.contentType,
|
mediaType: file.contentType,
|
||||||
url: `${config.drive_url}/${file._id}`
|
url: file.metadata.url || `${config.drive_url}/${file._id}`
|
||||||
});
|
});
|
||||||
|
@@ -3,6 +3,6 @@ import { IDriveFile } from '../../../models/drive-file';
|
|||||||
|
|
||||||
export default (file: IDriveFile) => ({
|
export default (file: IDriveFile) => ({
|
||||||
type: 'Image',
|
type: 'Image',
|
||||||
url: `${config.drive_url}/${file._id}`,
|
url: file.metadata.url || `${config.drive_url}/${file._id}`,
|
||||||
sensitive: file.metadata.isSensitive
|
sensitive: file.metadata.isSensitive
|
||||||
});
|
});
|
||||||
|
@@ -4,7 +4,7 @@ import App, { isValidNameId, pack } from '../../../../models/app';
|
|||||||
import { ILocalUser } from '../../../../models/user';
|
import { ILocalUser } from '../../../../models/user';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
requireCredential: true
|
requireCredential: false
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -38,7 +38,7 @@ export default async (params: any, user: ILocalUser) => new Promise(async (res,
|
|||||||
// Create account
|
// Create account
|
||||||
const app = await App.insert({
|
const app = await App.insert({
|
||||||
createdAt: new Date(),
|
createdAt: new Date(),
|
||||||
userId: user._id,
|
userId: user && user._id,
|
||||||
name: name,
|
name: name,
|
||||||
nameId: nameId,
|
nameId: nameId,
|
||||||
nameIdLower: nameId.toLowerCase(),
|
nameIdLower: nameId.toLowerCase(),
|
||||||
|
@@ -40,6 +40,5 @@ export default (params: any, user: ILocalUser) => new Promise(async (res, rej) =
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Serialize
|
// Serialize
|
||||||
res(await Promise.all(history.map(async h =>
|
res(await Promise.all(history.map(h => pack(h.messageId, user))));
|
||||||
await pack(h.messageId, user))));
|
|
||||||
});
|
});
|
||||||
|
43
src/server/api/endpoints/messaging/messages/read.ts
Normal file
43
src/server/api/endpoints/messaging/messages/read.ts
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
|
||||||
|
import Message from '../../../../../models/messaging-message';
|
||||||
|
import { ILocalUser } from '../../../../../models/user';
|
||||||
|
import read from '../../../common/read-messaging-message';
|
||||||
|
import getParams from '../../../get-params';
|
||||||
|
|
||||||
|
export const meta = {
|
||||||
|
desc: {
|
||||||
|
ja: '指定した自分宛てのメッセージを既読にします。',
|
||||||
|
en: 'Mark as read a message of messaging.'
|
||||||
|
},
|
||||||
|
|
||||||
|
requireCredential: true,
|
||||||
|
|
||||||
|
kind: 'messaging-write',
|
||||||
|
|
||||||
|
params: {
|
||||||
|
messageId: $.type(ID).note({
|
||||||
|
desc: {
|
||||||
|
ja: '既読にするメッセージのID',
|
||||||
|
en: 'The ID of a message that you want to mark as read'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
|
||||||
|
const [ps, psErr] = getParams(meta, params);
|
||||||
|
if (psErr) throw psErr;
|
||||||
|
|
||||||
|
const message = await Message.findOne({
|
||||||
|
_id: ps.messageId,
|
||||||
|
recipientId: user._id
|
||||||
|
});
|
||||||
|
|
||||||
|
if (message == null) {
|
||||||
|
return rej('message not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
read(user._id, message.userId, message);
|
||||||
|
|
||||||
|
res();
|
||||||
|
});
|
@@ -8,7 +8,8 @@ import getParams from '../../get-params';
|
|||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
desc: {
|
desc: {
|
||||||
ja: 'タイムラインを取得します。'
|
ja: 'タイムラインを取得します。',
|
||||||
|
en: 'Get timeline of myself.'
|
||||||
},
|
},
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
@@ -67,9 +68,6 @@ export const meta = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Get timeline of myself
|
|
||||||
*/
|
|
||||||
export default async (params: any, user: ILocalUser) => {
|
export default async (params: any, user: ILocalUser) => {
|
||||||
const [ps, psErr] = getParams(meta, params);
|
const [ps, psErr] = getParams(meta, params);
|
||||||
if (psErr) throw psErr;
|
if (psErr) throw psErr;
|
||||||
|
@@ -14,7 +14,9 @@ module.exports = async (ctx: Koa.Context) => {
|
|||||||
|
|
||||||
ctx.body = summary;
|
ctx.body = summary;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ctx.status = 500;
|
ctx.status = 200;
|
||||||
|
ctx.set('Cache-Control', 'max-age=86400, immutable');
|
||||||
|
ctx.body = '{}';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -294,16 +294,35 @@ export default async function(
|
|||||||
metadata.uri = uri;
|
metadata.uri = uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
const driveFile = isLink
|
let driveFile: IDriveFile;
|
||||||
? await DriveFile.insert({
|
|
||||||
length: 0,
|
if (isLink) {
|
||||||
uploadDate: new Date(),
|
try {
|
||||||
md5: hash,
|
driveFile = await DriveFile.insert({
|
||||||
filename: detectedName,
|
length: 0,
|
||||||
metadata: metadata,
|
uploadDate: new Date(),
|
||||||
contentType: mime
|
md5: hash,
|
||||||
})
|
filename: detectedName,
|
||||||
: await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata));
|
metadata: metadata,
|
||||||
|
contentType: mime
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
// duplicate key error (when already registered)
|
||||||
|
if (e.code === 11000) {
|
||||||
|
log(`already registered ${metadata.uri}`);
|
||||||
|
|
||||||
|
driveFile = await DriveFile.findOne({
|
||||||
|
'metadata.uri': metadata.uri,
|
||||||
|
'metadata.userId': user._id
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error(e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
driveFile = await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata));
|
||||||
|
}
|
||||||
|
|
||||||
log(`drive file has been created ${driveFile._id}`);
|
log(`drive file has been created ${driveFile._id}`);
|
||||||
|
|
||||||
|
@@ -188,6 +188,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
|
|||||||
// 通知
|
// 通知
|
||||||
if (isLocalUser(data.reply._user)) {
|
if (isLocalUser(data.reply._user)) {
|
||||||
nm.push(data.reply.userId, 'reply');
|
nm.push(data.reply.userId, 'reply');
|
||||||
|
publishUserStream(data.reply.userId, 'reply', noteObj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,7 +210,7 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Publish event
|
// Publish event
|
||||||
if (!user._id.equals(data.renote.userId)) {
|
if (!user._id.equals(data.renote.userId) && isLocalUser(data.renote._user)) {
|
||||||
publishUserStream(data.renote.userId, 'renote', noteObj);
|
publishUserStream(data.renote.userId, 'renote', noteObj);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -95,7 +95,8 @@ const consts = {
|
|||||||
_URL_: config.url,
|
_URL_: config.url,
|
||||||
_LICENSE_: licenseHtml,
|
_LICENSE_: licenseHtml,
|
||||||
_GOOGLE_MAPS_API_KEY_: config.google_maps_api_key,
|
_GOOGLE_MAPS_API_KEY_: config.google_maps_api_key,
|
||||||
_WELCOME_BG_URL_: config.welcome_bg_url
|
_WELCOME_BG_URL_: config.welcome_bg_url,
|
||||||
|
_TWITTER_INTEGRATION_: config.twitter != null
|
||||||
};
|
};
|
||||||
|
|
||||||
const _consts: { [ key: string ]: any } = {};
|
const _consts: { [ key: string ]: any } = {};
|
||||||
|
Reference in New Issue
Block a user