Compare commits
130 Commits
Author | SHA1 | Date | |
---|---|---|---|
196c55edbc | |||
e724c1e7e8 | |||
869c19c666 | |||
86a5f715d3 | |||
514aeac2d8 | |||
8980a26713 | |||
a39e2b28d1 | |||
bef617cb7c | |||
1dc1feca0f | |||
90eed0ea0d | |||
c730e5edfa | |||
7bd33ecc72 | |||
d4f7058574 | |||
980ae3dcb3 | |||
3a76113b78 | |||
ec8105b2ae | |||
bf05785345 | |||
82346d788b | |||
d86cfa86e4 | |||
b85f13dad3 | |||
eb8c3fe884 | |||
ff325d9588 | |||
a98392ff27 | |||
22b8aab7a0 | |||
24de518922 | |||
a169c7756f | |||
249a7f4f68 | |||
4f590e0a96 | |||
f5b5b290e4 | |||
1f75cf4ace | |||
1e4f11a979 | |||
be12e23aa1 | |||
790e6ceca4 | |||
a303d52990 | |||
096fab575c | |||
a256393b81 | |||
e8eee9057a | |||
d81acae17e | |||
313715bc75 | |||
94dabd2038 | |||
a3d58e5bc7 | |||
bfdfd026a2 | |||
b713f06599 | |||
2172c5edca | |||
9bc0cfacfa | |||
546cfeadbe | |||
2413583ce9 | |||
d7510491a5 | |||
61db07edf4 | |||
5c3ac8f952 | |||
5bfcb75ec3 | |||
d733a1b445 | |||
75c44cd349 | |||
f4d247cfae | |||
4260ec713f | |||
99f4ab7000 | |||
b6157e0012 | |||
4405c19852 | |||
5f208a7d99 | |||
2ec4cc9a07 | |||
06390380f8 | |||
752186066b | |||
10f9549a04 | |||
84a4174883 | |||
ee765d0812 | |||
1ccd2def50 | |||
0d9782571f | |||
973018fc98 | |||
d0926a3ba1 | |||
be67f5f422 | |||
b70b607c4f | |||
2bd38fa052 | |||
43b6140dbe | |||
813804a43e | |||
bec9604445 | |||
2e454dad2d | |||
7d64435e56 | |||
6ef28214df | |||
5bbc95d659 | |||
83794f254c | |||
005d25a07b | |||
255222bfb4 | |||
9e5e3c2f2e | |||
5bd80f115f | |||
c86e1a3e9b | |||
128a201b9d | |||
b68f74f39c | |||
cd28504dd8 | |||
911762fedf | |||
de448fc99f | |||
a3531981ee | |||
fc8d06a9ab | |||
5de8edf15f | |||
f762cf2770 | |||
d84cae9358 | |||
9c54721010 | |||
16f35c81a1 | |||
d0dbb62a54 | |||
9fa68f4478 | |||
0d76625868 | |||
5a8a701188 | |||
121344afbb | |||
d647cf3446 | |||
04a23b3f2f | |||
08826e1c41 | |||
2e31e3c7cb | |||
7aed50f9fa | |||
2de782dbe4 | |||
50693fbe25 | |||
9a2ff56a79 | |||
daed63d66c | |||
f2241a47b7 | |||
de95aac59b | |||
8612ac0c6a | |||
2118e500a8 | |||
a7063eab85 | |||
5b5ae0e47f | |||
b19ecc1a0d | |||
ac9223957f | |||
e580adc41e | |||
607a105b78 | |||
cc601cf600 | |||
be9f6ad294 | |||
a2952c02cf | |||
244d567b3a | |||
61a9ad23f1 | |||
4f7c19461e | |||
4ba6e1c2b2 | |||
864d1a39cd | |||
e14f244e83 |
@ -11,6 +11,7 @@ common:
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "{}ヶ月前"
|
||||
years_ago: "{}年前"
|
||||
trash: "ゴミ箱"
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "トークン"
|
||||
signing-in: "やってます..."
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
@ -11,6 +11,7 @@ common:
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "vor {0} Monat{0:en}"
|
||||
years_ago: "vor {} Jahr{0:en}"
|
||||
trash: "ゴミ箱"
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
weekday-short:
|
||||
sunday: "So"
|
||||
monday: "Mo"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "Token"
|
||||
signing-in: "Melde an..."
|
||||
signin: "Anmelden"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "Benutzername"
|
||||
checking: "Überprüfung..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Schwarz ... komplett"
|
||||
notes: "Blau ... Hinweise"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
@ -11,6 +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."
|
||||
application-authorization: "Application authorizations."
|
||||
close: "Close"
|
||||
got-it: "Got it!"
|
||||
customization-tips:
|
||||
title: "Customization tips"
|
||||
paragraph1: "Home customization allows you to add/delete, drag and drop and rearrange widgets."
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "{}month(s) ago"
|
||||
years_ago: "{}year(s) ago"
|
||||
trash: "Trash"
|
||||
date:
|
||||
full-year: "Year"
|
||||
month: "Month"
|
||||
day: "Day"
|
||||
hours: "Hour"
|
||||
minutes: "Minutes"
|
||||
weekday-short:
|
||||
sunday: "S"
|
||||
monday: "M"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "I prefer sushi rather than pudding"
|
||||
show-reversi-board-labels: "Show row and column labels in Reversi"
|
||||
verified-user: "Verified user"
|
||||
disable-animated-mfm: "Disable animated texts in a post"
|
||||
reversi:
|
||||
drawn: "Draw"
|
||||
my-turn: "Your turn"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Waiting for {}"
|
||||
cancel: "Cancel"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Surrender"
|
||||
surrendered: "By surrender"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "Play reversi with your friends!"
|
||||
@ -203,7 +202,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
||||
cancel-ready: "Cancel \"Ready\""
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "Unable to connect to the server"
|
||||
description: "There is a problem with your Internet connection, or the server may be down or under maintenance. Please try again later."
|
||||
description: "There is a problem with your Internet connection, or the server may be down or under maintenance. Please {try again} later."
|
||||
thanks: "Thank you for using Misskey."
|
||||
troubleshoot: "Troubleshoot"
|
||||
common/views/components/connect-failed.troubleshooter.vue:
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "Token"
|
||||
signing-in: "Signing in..."
|
||||
signin: "Sign in"
|
||||
or: "Or"
|
||||
signin-with-twitter: "Log in with Twitter"
|
||||
common/views/components/signup.vue:
|
||||
username: "Username"
|
||||
checking: "Checking..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "Follow"
|
||||
request-pending: "Pending follow request"
|
||||
follow-request: "Follow request"
|
||||
desktop:
|
||||
banner-crop-title: "Crop the part that appears as a banner"
|
||||
banner: "Banner"
|
||||
uploading-banner: "Uploading a new banner"
|
||||
banner-updated: "Updated the banner"
|
||||
choose-banner: "Choose the banner"
|
||||
avatar-crop-title: "Crop the part that appears as an avatar"
|
||||
avatar: "Avatar"
|
||||
uploading-avatar: "Uploading a new avatar"
|
||||
avatar-updated: "Updated the avatar"
|
||||
choose-avatar: "Choose an avatar image"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "User lists"
|
||||
create-list: "Create new list"
|
||||
list-name: "List name"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Posts"
|
||||
following: "Following"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "Mute"
|
||||
muted: "Muting"
|
||||
unmute: "Unmute"
|
||||
push-to-a-list: "Add to list"
|
||||
list-pushed: "You added {user} to {list}."
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Notes"
|
||||
following: "Following"
|
||||
@ -1002,7 +1017,7 @@ mobile/views/pages/welcome.vue:
|
||||
signup: "Sign up"
|
||||
mobile/views/pages/widgets.vue:
|
||||
dashboard: "Dashboard"
|
||||
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
|
||||
widgets-hints: "You can add/delete/rearrange widgets. To move the widget, drag \"三\". Tap \"x\" to delete the widget. Some widgets can change display by tapping."
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
activity: "Activity"
|
||||
mobile/views/pages/share.vue:
|
||||
|
@ -11,6 +11,7 @@ common:
|
||||
warning: "<strong>Misskey no tiene anuncios publicitarios.</strong> Sin embargo, algunas características podrían no estar disponibles si el bloqueador de publicidad está habilitado."
|
||||
application-authorization: "Autorizaciones de la aplicación."
|
||||
close: "Cerrar"
|
||||
got-it: "¡Listo!"
|
||||
customization-tips:
|
||||
title: "Consejos de personalización"
|
||||
paragraph1: "Customización de inicio le permite agregar, borrar, o reorganizar los accesorios."
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "Hace {} mes(es)"
|
||||
years_ago: "Hace {} año(s)"
|
||||
trash: "Papelera"
|
||||
date:
|
||||
full-year: "Año"
|
||||
month: "Mes"
|
||||
day: "Día"
|
||||
hours: "horas"
|
||||
minutes: "minutos"
|
||||
weekday-short:
|
||||
sunday: "domingo"
|
||||
monday: "lunes"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "Prefiero sushi a pudín"
|
||||
show-reversi-board-labels: "Mostrar etiquetas de filas y columnas en Reversi"
|
||||
verified-user: "Usuario verificado"
|
||||
disable-animated-mfm: "Desactivar texto animado en una publicación"
|
||||
reversi:
|
||||
drawn: "Empatado"
|
||||
my-turn: "Mi turno"
|
||||
@ -168,21 +164,24 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "Esperando por {}"
|
||||
cancel: "Cancelar"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Rendirse"
|
||||
surrendered: "Por rendirse"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
invite: "招待"
|
||||
rule: "遊び方"
|
||||
sub-title: "¡Juega Reversi con tus amigos!"
|
||||
invite: "Invitar"
|
||||
rule: "Cómo jugar"
|
||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||
mode-invite: "招待"
|
||||
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
||||
invitations: "対局の招待があります!"
|
||||
my-games: "自分の対局"
|
||||
all-games: "みんなの対局"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
mode-invite: "Invitar"
|
||||
mode-invite-desc: "Invitar un usuario al juego."
|
||||
invitations: "¡Has recibido una invitación!"
|
||||
my-games: "Mis juegos"
|
||||
all-games: "Todos los juegos"
|
||||
enter-username: "Ingresar nombre de usuario"
|
||||
game-state:
|
||||
ended: "終了"
|
||||
playing: "進行中"
|
||||
ended: "Finalizado"
|
||||
playing: "En progreso"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
settings-of-the-game: "Configuración de juego"
|
||||
choose-map: "Elije un mapa"
|
||||
@ -194,7 +193,7 @@ common/views/components/games/reversi/reversi.room.vue:
|
||||
looped-map: "Mapa en bucle"
|
||||
can-put-everywhere: "Puedes colocar donde quieras"
|
||||
settings-of-the-bot: "Configuración de bot"
|
||||
this-game-is-started-soon: "ゲームは数秒後に開始されます"
|
||||
this-game-is-started-soon: "El juego comenzará pronto"
|
||||
waiting-for-other: "Esperando a que se prepare el adversario"
|
||||
waiting-for-me: "Esperando por la preparación"
|
||||
waiting-for-both: "Esperando por ti"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "Identificador"
|
||||
signing-in: "Entrando..."
|
||||
signin: "Entra"
|
||||
or: "O"
|
||||
signin-with-twitter: "Ingresar con Twitter"
|
||||
common/views/components/signup.vue:
|
||||
username: "Usuario"
|
||||
checking: "Comprobando..."
|
||||
@ -373,7 +374,7 @@ common/views/widgets/tips.vue:
|
||||
tips-line9: "Misskey está hecho bajo licencia AGPLv3"
|
||||
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-line13: "投稿に添付したファイルは全てドライブに保存されます"
|
||||
tips-line13: "Todos los archivos añadidos a la publicación se han guardado en tu unidad."
|
||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
|
||||
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
@ -11,6 +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é."
|
||||
application-authorization: "Permissions de l'application"
|
||||
close: "Fermer"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "Conseils de personnalisation"
|
||||
paragraph1: "La personnalisation à la maison vous permet d'ajouter / supprimer, glisser et déposer et réorganiser les widgets."
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "Il y a {} mois"
|
||||
years_ago: "Il y a {} an·s"
|
||||
trash: "Corbeille"
|
||||
date:
|
||||
full-year: "Année "
|
||||
month: "Mois"
|
||||
day: "Jour"
|
||||
hours: "heures"
|
||||
minutes: "minutes"
|
||||
weekday-short:
|
||||
sunday: "D"
|
||||
monday: "L"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "Je préfère les sushis (au pudding)"
|
||||
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
|
||||
verified-user: "Utilisateur·trice vérifié·e"
|
||||
disable-animated-mfm: "Désactiver les textes animés dans les publications"
|
||||
reversi:
|
||||
drawn: "Partie nulle"
|
||||
my-turn: "C’est votre tour"
|
||||
@ -98,7 +94,7 @@ common:
|
||||
black: "Noirs"
|
||||
white: "Blancs"
|
||||
total: "Total"
|
||||
this-turn: "Tour de {}"
|
||||
this-turn: "Tour {}"
|
||||
widgets:
|
||||
analog-clock: "Horloge analogique"
|
||||
profile: "Profil"
|
||||
@ -116,7 +112,7 @@ common:
|
||||
notifications: "Notifications"
|
||||
users: "Utilisateurs"
|
||||
polls: "Sondages"
|
||||
post-form: "投稿フォーム"
|
||||
post-form: "Formulaire de publication"
|
||||
messaging: "Messagerie"
|
||||
server: "Info sur le serveur"
|
||||
donation: "Dons"
|
||||
@ -156,7 +152,7 @@ auth/views/form.vue:
|
||||
accept: "Autoriser l’accès"
|
||||
auth/views/index.vue:
|
||||
loading: "Chargement en cours"
|
||||
denied: "アプリケーションの連携をキャンセルしました。"
|
||||
denied: "L'autorisation de l'application a été refusée."
|
||||
denied-paragraph: "Cette application ne va pas accéder à votre compte."
|
||||
already-authorized: "Cette application est déjà autorisée"
|
||||
allowed: "アプリケーションの連携を許可しました"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "En attente de {}"
|
||||
cancel: "Annuler"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "Se rendre"
|
||||
surrendered: "Par abandon"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "Jouer à Reversi avec vos amis·es !"
|
||||
@ -197,10 +196,10 @@ common/views/components/games/reversi/reversi.room.vue:
|
||||
this-game-is-started-soon: "La partie commencera dans quelques instants"
|
||||
waiting-for-other: "En attente que l'adversaire soit prêt"
|
||||
waiting-for-me: "En attente que vous soyez prêt"
|
||||
waiting-for-both: "準備中"
|
||||
waiting-for-both: "En attente que vous soyez prêt"
|
||||
cancel: "Annuler"
|
||||
ready: "Prêt"
|
||||
cancel-ready: "準備続行"
|
||||
cancel-ready: "Annuler \"Je suis prêt\""
|
||||
common/views/components/connect-failed.vue:
|
||||
title: "Impossible de se connecter au server."
|
||||
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "Token"
|
||||
signing-in: "Connexion...."
|
||||
signin: "Se connecter"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "Nom d'utilisateur"
|
||||
checking: "Vérification"
|
||||
@ -364,15 +365,15 @@ common/views/widgets/slideshow.vue:
|
||||
common/views/widgets/tips.vue:
|
||||
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
|
||||
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
||||
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
|
||||
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
|
||||
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
||||
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
||||
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
|
||||
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
||||
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
||||
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
||||
tips-line9: "Misskey est sous licence AGPLv3"
|
||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
||||
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
|
||||
tips-line11: "Vous pouvez épingler des notes sur votre page en appuyant sur \"…\""
|
||||
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "Suivre"
|
||||
request-pending: "Demande d'abonnement en attente"
|
||||
follow-request: "Demande d'abonnement"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Noirs ... Total"
|
||||
notes: "Bleu ... Notes"
|
||||
@ -717,7 +729,7 @@ desktop/views/components/timeline.vue:
|
||||
global: "Global"
|
||||
list: "Listes"
|
||||
desktop/views/components/ui.header.vue:
|
||||
welcome-back: "Vous êtes de retour !"
|
||||
welcome-back: "Content de vous revoir !"
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "Votre profil"
|
||||
drive: "Drive"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Listes de l'utilisateur"
|
||||
create-list: "Créer une liste"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Publications"
|
||||
following: "Abonné à"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "Mettre en sourdine"
|
||||
muted: "Muting"
|
||||
unmute: "Enlever la sourdine"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Notes"
|
||||
following: "Suit"
|
||||
@ -986,7 +1001,7 @@ mobile/views/pages/drive.vue:
|
||||
drive: "Drive"
|
||||
more: "Afficher plus ..."
|
||||
mobile/views/pages/signup.vue:
|
||||
lets-start: "📦 始めましょう"
|
||||
lets-start: "Commençons ! 📦"
|
||||
mobile/views/pages/followers.vue:
|
||||
followers-of: "Abonné·e·s de {}"
|
||||
mobile/views/pages/following.vue:
|
||||
@ -1055,9 +1070,9 @@ mobile/views/pages/settings.vue:
|
||||
i-am-under-limited-internet: "J'ai un accès Internet limité"
|
||||
circle-icons: "Utiliser des icônes circulaires"
|
||||
timeline: "Fil d'actualité"
|
||||
show-reply-target: "リプライ先を表示する"
|
||||
show-reply-target: "Afficher les réponses"
|
||||
show-my-renotes: "Afficher mes republications"
|
||||
show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
|
||||
show-renoted-my-notes: "Afficher les notes que j'ai repartagé"
|
||||
post-style: "Style de la publication"
|
||||
post-style-standard: "Standard"
|
||||
post-style-smart: "Intelligent"
|
||||
|
@ -11,6 +11,7 @@ common:
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "{}ヶ月前"
|
||||
years_ago: "{}年前"
|
||||
trash: "ゴミ箱"
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "トークン"
|
||||
signing-in: "やってます..."
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
@ -11,6 +11,8 @@ common:
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
do-not-copy-paste: "ここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
@ -26,7 +28,6 @@ common:
|
||||
notified-by: "{}さんから"
|
||||
reply-from: "{}さんから返信:"
|
||||
quoted-by: "{}さんが引用:"
|
||||
name: "Misskey"
|
||||
time:
|
||||
unknown: "なぞのじかん"
|
||||
future: "未来"
|
||||
@ -38,16 +39,10 @@ common:
|
||||
weeks_ago: "{}週間前"
|
||||
months_ago: "{}ヶ月前"
|
||||
years_ago: "{}年前"
|
||||
month-and-day: "{month}月 {day}日"
|
||||
|
||||
trash: "ゴミ箱"
|
||||
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -95,6 +90,7 @@ common:
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
@ -182,6 +178,10 @@ common/views/components/games/reversi/reversi.vue:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -254,12 +254,14 @@ common/views/components/messaging-room.vue:
|
||||
no-history: "これより過去の履歴はありません"
|
||||
resize-form: "ドラッグしてフォームの広さを調整"
|
||||
new-message: "新しいメッセージがあります"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
|
||||
common/views/components/messaging-room.form.vue:
|
||||
input-message-here: "ここにメッセージを入力"
|
||||
send: "送信"
|
||||
attach-from-local: "PCからファイルを添付する"
|
||||
attach-from-drive: "ドライブからファイルを添付する"
|
||||
only-one-file-attached: "メッセージに添付できるのはひとつのファイルのみです"
|
||||
|
||||
common/views/components/messaging-room.message.vue:
|
||||
is-read: "既読"
|
||||
@ -306,6 +308,8 @@ common/views/components/signin.vue:
|
||||
token: "トークン"
|
||||
signing-in: "やってます..."
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
@ -433,6 +437,18 @@ common/views/pages/follow.vue:
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -592,6 +608,8 @@ desktop/views/components/notes.note.vue:
|
||||
detail: "詳細"
|
||||
private: "この投稿は非公開です"
|
||||
deleted: "この投稿は削除されました"
|
||||
hide: "隠す"
|
||||
see-more: "もっと見る"
|
||||
|
||||
desktop/views/components/notes.vue:
|
||||
error: "読み込みに失敗しました。"
|
||||
@ -630,6 +648,7 @@ desktop/views/components/post-form.vue:
|
||||
geolocation-alert: "お使いの端末は位置情報に対応していません"
|
||||
error: "エラー"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
annotations: "内容への注釈 (オプション)"
|
||||
|
||||
desktop/views/components/post-form-window.vue:
|
||||
note: "新規投稿"
|
||||
@ -818,6 +837,7 @@ desktop/views/components/timeline.vue:
|
||||
|
||||
desktop/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
|
||||
desktop/views/components/ui.header.account.vue:
|
||||
profile: "プロフィール"
|
||||
@ -850,11 +870,10 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
accept: "承認"
|
||||
reject: "拒否"
|
||||
|
||||
|
||||
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
@ -959,6 +978,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
@ -1114,6 +1135,7 @@ mobile/views/components/timeline.vue:
|
||||
|
||||
mobile/views/components/ui.header.vue:
|
||||
welcome-back: "おかえりなさい、"
|
||||
adjective: "さん"
|
||||
|
||||
mobile/views/components/ui.nav.vue:
|
||||
timeline: "タイムライン"
|
||||
@ -1175,6 +1197,8 @@ mobile/views/pages/welcome.vue:
|
||||
mobile/views/pages/widgets.vue:
|
||||
dashboard: "ダッシュボード"
|
||||
widgets-hints: "ウィジェットを追加/削除したり並べ替えたりできます。ウィジェットを移動するには「三」をドラッグします。ウィジェットを削除するには「x」をタップします。いくつかのウィジェットはタップすることで表示を変更できます。"
|
||||
add-widget: "追加"
|
||||
customization-tips: "カスタマイズのヒント"
|
||||
|
||||
mobile/views/pages/widgets/activity.vue:
|
||||
activity: "アクティビティ"
|
||||
@ -1223,6 +1247,7 @@ mobile/views/pages/settings/settings.profile.vue:
|
||||
mobile/views/pages/search.vue:
|
||||
search: "検索"
|
||||
empty: "「{}」に関する投稿は見つかりませんでした。"
|
||||
not-found: "「{}」に関する投稿は見つかりませんでした。"
|
||||
|
||||
mobile/views/pages/selectdrive.vue:
|
||||
select-file: "ファイルを選択"
|
||||
@ -1327,3 +1352,7 @@ docs:
|
||||
name: "名前"
|
||||
type: "型"
|
||||
description: "説明"
|
||||
|
||||
|
||||
dev/views/index.vue:
|
||||
manage-apps: "アプリの管理"
|
||||
|
227
locales/ko.yml
227
locales/ko.yml
@ -1,128 +1,124 @@
|
||||
---
|
||||
meta:
|
||||
lang: "日本語"
|
||||
lang: "한국어"
|
||||
divider: ""
|
||||
common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
about-title: "A ⭐ of fediverse."
|
||||
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||
about: "Misskey를 찾아 주셔서 감사합니다. Misskey은 지구에서 태어난 <b>분산 마이크로 블로그 SNS </b> 입니다. Fediverse (다양한 SNS로 구성되는 우주)에 존재하는 다른 SNS와 상호 연결되어 있습니다. 잠시 도시의 번잡함에서 벗어나 새로운 인터넷에 다이브 해 보지 않겠습니까."
|
||||
adblock:
|
||||
detected: "広告ブロッカーを無効にしてください"
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
detected: "광고 차단기를 해제하십시오"
|
||||
warning: "<strong>Misskey는 광고를 게재하지 않습니다</strong> 그러나 광고를 차단하는 기능 기능을 사용할 경우 일부 기능을 사용할 수 없게 될 가능성이나 결함이 발생하는 경우가 있습니다."
|
||||
application-authorization: "앱의 연계"
|
||||
close: "닫기"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
|
||||
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
|
||||
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
|
||||
title: "사용자 정의 팁"
|
||||
paragraph1: "홈 정의는 위젯을 추가 / 삭제하거나 드래그 앤 드롭하여 정렬 할 수 있습니다."
|
||||
paragraph2: "일부 위젯은 <strong>오른쪽 클릭</strong> 하여 모양을 변경할 수 있습니다."
|
||||
paragraph3: "위젯을 삭제하려면 헤더 <strong>\"휴지통\"</strong> 라고 쓰여진 영역으로 끌어다 놓습니다."
|
||||
paragraph4: "사용자 정의를 종료하려면 오른쪽 상단의 '완료' 를 클릭합니다."
|
||||
gotit: "Got it!"
|
||||
notification:
|
||||
file-uploaded: "ファイルがアップロードされました"
|
||||
message-from: "{}さんからメッセージ:"
|
||||
reversi-invited: "対局への招待があります"
|
||||
reversi-invited-by: "{}さんから"
|
||||
notified-by: "{}さんから"
|
||||
reply-from: "{}さんから返信:"
|
||||
quoted-by: "{}さんが引用:"
|
||||
file-uploaded: "파일이 업로드되었습니다"
|
||||
message-from: "{}씨로부터 메시지:"
|
||||
reversi-invited: "대결에 초대되어 있습니다"
|
||||
reversi-invited-by: "{}님"
|
||||
notified-by: "{}님"
|
||||
reply-from: "{}님으로부터 답글:"
|
||||
quoted-by: "{}씨가 인용:"
|
||||
name: "Misskey"
|
||||
time:
|
||||
unknown: "なぞのじかん"
|
||||
future: "未来"
|
||||
just_now: "たった今"
|
||||
seconds_ago: "{}秒前"
|
||||
minutes_ago: "{}分前"
|
||||
hours_ago: "{}時間前"
|
||||
days_ago: "{}日前"
|
||||
weeks_ago: "{}週間前"
|
||||
months_ago: "{}ヶ月前"
|
||||
years_ago: "{}年前"
|
||||
trash: "ゴミ箱"
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
unknown: "수수께끼의 시간"
|
||||
future: "미래"
|
||||
just_now: "방금"
|
||||
seconds_ago: "{}초전"
|
||||
minutes_ago: "{}분전"
|
||||
hours_ago: "{}시간전"
|
||||
days_ago: "{}일전"
|
||||
weeks_ago: "{}주전"
|
||||
months_ago: "{}개월전"
|
||||
years_ago: "{}년전"
|
||||
trash: "휴지통"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
tuesday: "火"
|
||||
wednesday: "水"
|
||||
thursday: "木"
|
||||
friday: "金"
|
||||
saturday: "土"
|
||||
sunday: "일"
|
||||
monday: "월"
|
||||
tuesday: "화"
|
||||
wednesday: "수"
|
||||
thursday: "목"
|
||||
friday: "금"
|
||||
saturday: "토"
|
||||
weekday:
|
||||
sunday: "日曜日"
|
||||
monday: "月曜日"
|
||||
tuesday: "火曜日"
|
||||
wednesday: "水曜日"
|
||||
thursday: "木曜日"
|
||||
friday: "金曜日"
|
||||
saturday: "土曜日"
|
||||
sunday: "일요일"
|
||||
monday: "월요일"
|
||||
tuesday: "화요일"
|
||||
wednesday: "수요일"
|
||||
thursday: "목요일"
|
||||
friday: "금요일"
|
||||
saturday: "토요일"
|
||||
reactions:
|
||||
like: "いいね"
|
||||
love: "しゅき"
|
||||
laugh: "笑"
|
||||
hmm: "ふぅ~む"
|
||||
surprise: "わお"
|
||||
congrats: "おめでとう"
|
||||
angry: "おこ"
|
||||
confused: "こまこまのこまり"
|
||||
like: "좋네"
|
||||
love: "좋아"
|
||||
laugh: "크크"
|
||||
hmm: "음..."
|
||||
surprise: "와우"
|
||||
congrats: "받으세요"
|
||||
angry: "화냈어"
|
||||
confused: "곤란하고 있어"
|
||||
pudding: "Pudding"
|
||||
note-placeholders:
|
||||
a: "今どうしてる?"
|
||||
b: "何かありましたか?"
|
||||
c: "何をお考えですか?"
|
||||
d: "言いたいことは?"
|
||||
e: "ここに書いてください"
|
||||
f: "あなたが書くのを待っています..."
|
||||
search: "検索"
|
||||
delete: "削除"
|
||||
loading: "読み込み中"
|
||||
ok: "わかった"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
a: "지금 어떻게하고있어?"
|
||||
b: "뭔가 있었습니까?"
|
||||
c: "무엇을 생각하십니까?"
|
||||
d: "말하고 싶은 것은?"
|
||||
e: "여기에 써주십시오"
|
||||
f: "당신이 쓸 것을 당신 기다리고 있습니다..."
|
||||
search: "검색"
|
||||
delete: "삭제"
|
||||
loading: "로드 중"
|
||||
ok: "확인"
|
||||
update-available-title: "갱신이 있습니다"
|
||||
update-available: "Misskey의 새로운 버전이 있습니다 ({newer} 현재 {current}을 사용 중). 페이지를 다시로드하면 업데이트가 적용됩니다."
|
||||
my-token-regenerated: "당신의 토큰이 업데이트되어 있기 때문에 로그 아웃합니다."
|
||||
i-like-sushi: "나는(푸딩보다 오히려)스시가 좋아"
|
||||
show-reversi-board-labels: "리버시 보드의 행과 열 레이블을 표시"
|
||||
verified-user: "인증 된 사용자"
|
||||
disable-animated-mfm: "게시물의 문자 애니메이션을 비활성화 할"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
opponent-turn: "相手のターンです"
|
||||
turn-of: "{}のターンです"
|
||||
past-turn-of: "{}のターン"
|
||||
won: "{}の勝ち"
|
||||
black: "黒"
|
||||
white: "白"
|
||||
total: "合計"
|
||||
this-turn: "{}ターン目"
|
||||
drawn: "무승부"
|
||||
my-turn: "당신의 차례입니다"
|
||||
opponent-turn: "상대의 차례입니다"
|
||||
turn-of: "{}의 차례입니다"
|
||||
past-turn-of: "{} 턴"
|
||||
won: "{} 승리"
|
||||
black: "검정"
|
||||
white: "흰색"
|
||||
total: "합계"
|
||||
this-turn: "{}턴눈"
|
||||
widgets:
|
||||
analog-clock: "アナログ時計"
|
||||
profile: "プロフィール"
|
||||
calendar: "カレンダー"
|
||||
timemachine: "カレンダー(タイムマシン)"
|
||||
activity: "アクティビティ"
|
||||
rss: "RSSリーダー"
|
||||
memo: "付箋"
|
||||
trends: "トレンド"
|
||||
photo-stream: "フォトストリーム"
|
||||
posts-monitor: "投稿チャート"
|
||||
slideshow: "スライドショー"
|
||||
version: "バージョン"
|
||||
broadcast: "ブロードキャスト"
|
||||
notifications: "通知"
|
||||
users: "おすすめユーザー"
|
||||
polls: "アンケート"
|
||||
post-form: "投稿フォーム"
|
||||
messaging: "メッセージ"
|
||||
server: "サーバー情報"
|
||||
donation: "寄付のお願い"
|
||||
nav: "ナビゲーション"
|
||||
tips: "ヒント"
|
||||
hashtags: "ハッシュタグ"
|
||||
analog-clock: "아날로그 시계"
|
||||
profile: "프로필"
|
||||
calendar: "달력"
|
||||
timemachine: "달력(타임머신)"
|
||||
activity: "활동"
|
||||
rss: "RSS 리더"
|
||||
memo: "끈끈이"
|
||||
trends: "트렌드"
|
||||
photo-stream: "포토 스트림"
|
||||
posts-monitor: "게시물 차트"
|
||||
slideshow: "슬라이드 쇼"
|
||||
version: "버전"
|
||||
broadcast: "브로드 캐스트"
|
||||
notifications: "통지"
|
||||
users: "추천 사용자"
|
||||
polls: "설문"
|
||||
post-form: "게시 양식"
|
||||
messaging: "메시지"
|
||||
server: "서버 정보"
|
||||
donation: "기부 요청"
|
||||
nav: "네비게이션"
|
||||
tips: "팁"
|
||||
hashtags: "해시 태그"
|
||||
deck:
|
||||
widgets: "ウィジェット"
|
||||
home: "ホーム"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "トークン"
|
||||
signing-in: "やってます..."
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
127
locales/pl.yml
127
locales/pl.yml
@ -11,12 +11,13 @@ common:
|
||||
warning: "<strong>Misskey nie zawiera reklam</strong>, ale część funkcji może nie działać prawidłowo z włączonym blokowaniem reklam."
|
||||
application-authorization: "アプリの連携"
|
||||
close: "Zamknij"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "Wskazówki o dostosowywaniu"
|
||||
paragraph1: "Dostosowywanie strony głównej pozwala na dodawanie, usuwanie, przeciąganie i zmienianie kolejności widżetów."
|
||||
paragraph2: "一部のウィジェットは、<strong><strong>右</strong>クリック</strong>することで表示を変更することができます。"
|
||||
paragraph3: "ウィジェットを削除するには、ヘッダーの<strong>「ゴミ箱」</strong>と書かれたエリアにウィジェットをドラッグ&ドロップします。"
|
||||
paragraph4: "カスタマイズを終了するには、右上の「完了」をクリックします。"
|
||||
paragraph3: "Aby usunąć widżet, <strong>przeciągnij i upuść widżet do części nazwanej „Kosz”</strong> w nagłówku."
|
||||
paragraph4: "Aby zakończyć dostosowywanie, naciśnij „Zakończ” w w prawym górnym rogu."
|
||||
gotit: "Rozumiem!"
|
||||
notification:
|
||||
file-uploaded: "Wysłano plik!"
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "{} mies. temu"
|
||||
years_ago: "{} lat temu"
|
||||
trash: "Kosz"
|
||||
date:
|
||||
full-year: "Rok"
|
||||
month: "Miesiąc"
|
||||
day: "Dzień"
|
||||
hours: "Godzina"
|
||||
minutes: "Minuty"
|
||||
weekday-short:
|
||||
sunday: "N"
|
||||
monday: "Pn"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "Wolę sushi od puddingu"
|
||||
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
|
||||
verified-user: "Zweryfikowany użytkownik"
|
||||
disable-animated-mfm: "Wyłącz animowany tekst we wpisach"
|
||||
reversi:
|
||||
drawn: "Remis"
|
||||
my-turn: "Twoja kolej"
|
||||
@ -141,55 +137,58 @@ common:
|
||||
stack-left: "Przypnij do lewej"
|
||||
pop-right: "Odepnij w prawo"
|
||||
auth/views/form.vue:
|
||||
share-access: "<i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか?"
|
||||
permission-ask: "このアプリは次の権限を要求しています:"
|
||||
account-read: "アカウントの情報を見る。"
|
||||
account-write: "アカウントの情報を操作する。"
|
||||
note-write: "投稿する。"
|
||||
like-write: "いいねしたりいいね解除する。"
|
||||
following-write: "フォローしたりフォロー解除する。"
|
||||
drive-read: "ドライブを見る。"
|
||||
drive-write: "ドライブを操作する。"
|
||||
notification-read: "通知を見る。"
|
||||
notification-write: "通知を操作する。"
|
||||
cancel: "キャンセル"
|
||||
accept: "アクセスを許可"
|
||||
share-access: "Czy chcesz <b>zezwolić</b> <i>{{ app.name }}</i> na dostęp do Twojego konta?"
|
||||
permission-ask: "Ta aplikacja wymaga następujących uprawnień:"
|
||||
account-read: "Wyświetlanie informacji o koncie:"
|
||||
account-write: "Modyfikowanie informacji o koncie:"
|
||||
note-write: "Publikacja."
|
||||
like-write: "Reagowanie na wpisy."
|
||||
following-write: "Śledzenie i cofanie śledzenia."
|
||||
drive-read: "Odczytywanie Twojego dysku."
|
||||
drive-write: "Wysyłanie i usuwanie plików na Twoim dysku."
|
||||
notification-read: "Odczytywanie Twoich powiadomień."
|
||||
notification-write: "Zarządzanie Twoimi powiadomieniami."
|
||||
cancel: "Anuluj"
|
||||
accept: "Przyznaj dostęp."
|
||||
auth/views/index.vue:
|
||||
loading: "読み込み中"
|
||||
denied: "アプリケーションの連携をキャンセルしました。"
|
||||
denied-paragraph: "このアプリがあなたのアカウントにアクセスすることはありません。"
|
||||
already-authorized: "このアプリは既に連携済みです"
|
||||
loading: "Ładowanie"
|
||||
denied: "Odrzucono uwierzytelnianie aplikacji."
|
||||
denied-paragraph: "Ta aplikacja nie uzyska dostępu do Twojego konta."
|
||||
already-authorized: "Ta aplikacja została już uwierzytelniona."
|
||||
allowed: "アプリケーションの連携を許可しました"
|
||||
callback-url: "アプリケーションに戻っています"
|
||||
please-go-back: "アプリケーションに戻って、やっていってください。"
|
||||
error: "セッションが存在しません。"
|
||||
sign-in: "サインインしてください"
|
||||
callback-url: "Powracam do aplikacji."
|
||||
please-go-back: "Wróć do aplikacji."
|
||||
error: "Sesja nie istnieje."
|
||||
sign-in: "Proszę zalogować się."
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
waiting-for: "Oczekiwanie na {}"
|
||||
cancel: "Anuluj"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
invite: "招待"
|
||||
rule: "遊び方"
|
||||
sub-title: "Zagraj w Reversi ze znajomymi!"
|
||||
invite: "Zaproś"
|
||||
rule: "Jak grać"
|
||||
rule-desc: "リバーシは、相手と交互に石をボードに置いて、相手の石を挟んで自分の色に変えてゆき、最終的に残った石が多い方が勝ちというボードゲームです。"
|
||||
mode-invite: "招待"
|
||||
mode-invite-desc: "指定したユーザーと対戦するモードです。"
|
||||
invitations: "対局の招待があります!"
|
||||
my-games: "自分の対局"
|
||||
all-games: "みんなの対局"
|
||||
enter-username: "ユーザー名を入力してください"
|
||||
mode-invite: "Zaproś"
|
||||
mode-invite-desc: "Zaproś użytkownika do gry."
|
||||
invitations: "Otrzymałeś(-aś) zaproszenie!"
|
||||
my-games: "Moje gry"
|
||||
all-games: "Wszystkie gry"
|
||||
enter-username: "Wprowadź nazwę użytkownika"
|
||||
game-state:
|
||||
ended: "終了"
|
||||
playing: "進行中"
|
||||
ended: "Zakończono"
|
||||
playing: "W trakcie"
|
||||
common/views/components/games/reversi/reversi.room.vue:
|
||||
settings-of-the-game: "ゲームの設定"
|
||||
choose-map: "マップを選択"
|
||||
random: "ランダム"
|
||||
black-or-white: "先手/後手"
|
||||
settings-of-the-game: "Ustawienia gry"
|
||||
choose-map: "Wybierz mapę"
|
||||
random: "Losowy"
|
||||
black-or-white: "Czarny/biały"
|
||||
black-is: "{}が黒"
|
||||
rules: "ルール"
|
||||
rules: "Zasady"
|
||||
is-llotheo: "石の少ない方が勝ち(ロセオ)"
|
||||
looped-map: "ループマップ"
|
||||
can-put-everywhere: "どこでも置けるモード"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "Token"
|
||||
signing-in: "Logowanie…"
|
||||
signin: "Zaloguj"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "Nazwa użytkownika"
|
||||
checking: "Sprawdzanie…"
|
||||
@ -362,23 +363,23 @@ common/views/widgets/slideshow.vue:
|
||||
folder: "Naciśnij i wybierz folder"
|
||||
no-image: "Brak obrazu w tym folderze"
|
||||
common/views/widgets/tips.vue:
|
||||
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
|
||||
tips-line2: "<kbd>p</kbd>または<kbd>n</kbd>で投稿フォームを開きます"
|
||||
tips-line3: "投稿フォームにはファイルをドラッグ&ドロップできます"
|
||||
tips-line1: "Możesz przejść do osi czasu używając <kbd>t</kbd>."
|
||||
tips-line2: "Otwórz formularz nowego wpisu używając <kbd>p</kbd> lub <kbd>n</kbd>."
|
||||
tips-line3: "Możesz przeciągnąć i upuścić pliki w formularzu wpisu."
|
||||
tips-line4: "投稿フォームにクリップボードにある画像データをペーストできます"
|
||||
tips-line5: "ドライブにファイルをドラッグ&ドロップしてアップロードできます"
|
||||
tips-line6: "ドライブでファイルをドラッグしてフォルダ移動できます"
|
||||
tips-line5: "Możesz wysłać pliki przeciągając i upuszczając je w Dysku."
|
||||
tips-line6: "Możesz przenieść katalog przeciągając go w Dysku."
|
||||
tips-line7: "ドライブでフォルダをドラッグしてフォルダ移動できます"
|
||||
tips-line8: "Strona główna może zostać dostosowana w ustawieniach."
|
||||
tips-line9: "Misskey jest dostępny na licencji AGPLv3."
|
||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
||||
tips-line11: "投稿の ... をクリックして、投稿をユーザーページにピン留めできます"
|
||||
tips-line11: "Możesz przypiąć wpis na stronie użytkownika klikając na „…”"
|
||||
tips-line13: "投稿に添付したファイルは全てドライブに保存されます"
|
||||
tips-line14: "ホームのカスタマイズ中、ウィジェットを右クリックしてデザインを変更できます"
|
||||
tips-line17: "「**」でテキストを囲むと**強調表示**されます"
|
||||
tips-line19: "いくつかのウィンドウはブラウザの外に切り離すことができます"
|
||||
tips-line17: "Oznaczenie tekstu **w ten sposób** wyróżni go."
|
||||
tips-line19: "Część okien może zostać odłączona z przeglądarki."
|
||||
tips-line20: "カレンダーウィジェットのパーセンテージは、経過の割合を示しています"
|
||||
tips-line21: "APIを利用してbotの開発なども行えます"
|
||||
tips-line21: "Możesz też używać API, aby tworzyć boty."
|
||||
tips-line23: "まゆかわいいよまゆ"
|
||||
tips-line24: "Misskey zaczął działać w 2014."
|
||||
tips-line25: "Możesz otrzymywać powiadomienia nawet jeżeli Misskey nie jest otwarty w obsługiwanej przeglądarce."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "Śledź"
|
||||
request-pending: "Oczekiwanie na pozwolenie"
|
||||
follow-request: "Poproś o śledzenie"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Czarny … Łącznie"
|
||||
notes: "Niebieski … Wpisy"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "Listy"
|
||||
create-list: "Utwórz listę"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "Wpisy"
|
||||
following: "Śledzeni"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "Wycisz"
|
||||
muted: "Wyciszyłeś"
|
||||
unmute: "Cofnij wyciszenie"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "Wpisy"
|
||||
following: "Śledzeni"
|
||||
|
@ -11,6 +11,7 @@ common:
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "{}ヶ月前"
|
||||
years_ago: "{}年前"
|
||||
trash: "ゴミ箱"
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "トークン"
|
||||
signing-in: "やってます..."
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
@ -11,6 +11,7 @@ common:
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "{}ヶ月前"
|
||||
years_ago: "{}年前"
|
||||
trash: "ゴミ箱"
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "トークン"
|
||||
signing-in: "やってます..."
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
@ -11,6 +11,7 @@ common:
|
||||
warning: "<strong>Misskeyは広告を掲載していません</strong>が、広告をブロックする機能が有効だと一部の機能が利用できなかったり、不具合が発生する場合があります。"
|
||||
application-authorization: "アプリの連携"
|
||||
close: "閉じる"
|
||||
got-it: "わかった"
|
||||
customization-tips:
|
||||
title: "カスタマイズのヒント"
|
||||
paragraph1: "ホームのカスタマイズでは、ウィジェットを追加/削除したり、ドラッグ&ドロップして並べ替えたりすることができます。"
|
||||
@ -39,12 +40,6 @@ common:
|
||||
months_ago: "{}ヶ月前"
|
||||
years_ago: "{}年前"
|
||||
trash: "ゴミ箱"
|
||||
date:
|
||||
full-year: "年"
|
||||
month: "月"
|
||||
day: "日"
|
||||
hours: "時"
|
||||
minutes: "分"
|
||||
weekday-short:
|
||||
sunday: "日"
|
||||
monday: "月"
|
||||
@ -88,6 +83,7 @@ common:
|
||||
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
|
||||
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
|
||||
verified-user: "認証済みのユーザー"
|
||||
disable-animated-mfm: "投稿内の動きのあるテキストを無効にする"
|
||||
reversi:
|
||||
drawn: "引き分け"
|
||||
my-turn: "あなたのターンです"
|
||||
@ -168,6 +164,9 @@ common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "{}を待っています"
|
||||
cancel: "キャンセル"
|
||||
common/views/components/games/reversi/reversi.game.vue:
|
||||
surrender: "投了"
|
||||
surrendered: "投了により"
|
||||
common/views/components/games/reversi/reversi.index.vue:
|
||||
title: "Misskey Reversi"
|
||||
sub-title: "他のMisskeyユーザーとリバーシで対戦しよう"
|
||||
@ -279,6 +278,8 @@ common/views/components/signin.vue:
|
||||
token: "トークン"
|
||||
signing-in: "やってます..."
|
||||
signin: "サインイン"
|
||||
or: "または"
|
||||
signin-with-twitter: "Twitterでログイン"
|
||||
common/views/components/signup.vue:
|
||||
username: "ユーザー名"
|
||||
checking: "確認しています..."
|
||||
@ -388,6 +389,17 @@ common/views/pages/follow.vue:
|
||||
follow: "フォロー"
|
||||
request-pending: "フォロー許可待ち"
|
||||
follow-request: "フォロー申請"
|
||||
desktop:
|
||||
banner-crop-title: "バナーとして表示する部分を選択"
|
||||
banner: "バナー"
|
||||
uploading-banner: "新しいバナーをアップロードしています"
|
||||
banner-updated: "バナーを更新しました"
|
||||
choose-banner: "バナーにする画像を選択"
|
||||
avatar-crop-title: "アバターとして表示する部分を選択"
|
||||
avatar: "アバター"
|
||||
uploading-avatar: "新しいアバターをアップロードしています"
|
||||
avatar-updated: "アバターを更新しました"
|
||||
choose-avatar: "アバターにする画像を選択"
|
||||
desktop/views/components/activity.chart.vue:
|
||||
total: "Black ... Total"
|
||||
notes: "Blue ... Notes"
|
||||
@ -746,6 +758,7 @@ desktop/views/components/received-follow-requests-window.vue:
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
title: "リスト"
|
||||
create-list: "リストを作成"
|
||||
list-name: "リスト名"
|
||||
desktop/views/components/user-preview.vue:
|
||||
notes: "投稿"
|
||||
following: "フォロー"
|
||||
@ -828,6 +841,8 @@ desktop/views/pages/user/user.profile.vue:
|
||||
mute: "ミュートする"
|
||||
muted: "ミュートしています"
|
||||
unmute: "ミュート解除"
|
||||
push-to-a-list: "リストに追加"
|
||||
list-pushed: "{user}を{list}に追加しました。"
|
||||
desktop/views/pages/user/user.header.vue:
|
||||
posts: "投稿"
|
||||
following: "フォロー"
|
||||
|
19
package.json
19
package.json
@ -1,8 +1,8 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "5.13.0",
|
||||
"clientVersion": "1.0.7963",
|
||||
"version": "5.19.0",
|
||||
"clientVersion": "1.0.8052",
|
||||
"codename": "nighthike",
|
||||
"main": "./built/index.js",
|
||||
"private": true,
|
||||
@ -59,7 +59,7 @@
|
||||
"@types/mocha": "5.2.3",
|
||||
"@types/mongodb": "3.1.3",
|
||||
"@types/ms": "0.7.30",
|
||||
"@types/node": "10.5.5",
|
||||
"@types/node": "10.5.7",
|
||||
"@types/portscanner": "2.1.0",
|
||||
"@types/pug": "2.0.4",
|
||||
"@types/qrcode": "1.2.0",
|
||||
@ -88,7 +88,7 @@
|
||||
"bootstrap-vue": "2.0.0-rc.11",
|
||||
"cafy": "11.3.0",
|
||||
"chalk": "2.4.1",
|
||||
"commander": "2.16.0",
|
||||
"commander": "2.17.1",
|
||||
"crc-32": "1.2.0",
|
||||
"css-loader": "1.0.0",
|
||||
"dateformat": "3.0.3",
|
||||
@ -183,11 +183,12 @@
|
||||
"showdown-highlightjs-extension": "0.1.2",
|
||||
"single-line-log": "1.1.2",
|
||||
"speakeasy": "2.0.0",
|
||||
"style-loader": "0.21.0",
|
||||
"stringz": "1.0.0",
|
||||
"style-loader": "0.22.1",
|
||||
"stylus": "0.54.5",
|
||||
"stylus-loader": "3.0.2",
|
||||
"summaly": "2.0.6",
|
||||
"systeminformation": "3.42.8",
|
||||
"systeminformation": "3.42.9",
|
||||
"syuilo-password-strength": "0.0.1",
|
||||
"textarea-caret": "3.1.0",
|
||||
"tmp": "0.0.33",
|
||||
@ -195,7 +196,7 @@
|
||||
"ts-node": "7.0.0",
|
||||
"tslint": "5.10.0",
|
||||
"typescript": "2.9.2",
|
||||
"typescript-eslint-parser": "17.0.1",
|
||||
"typescript-eslint-parser": "18.0.0",
|
||||
"uglify-es": "3.3.9",
|
||||
"url-loader": "1.0.1",
|
||||
"uuid": "3.3.2",
|
||||
@ -204,7 +205,7 @@
|
||||
"vue-cropperjs": "2.2.1",
|
||||
"vue-js-modal": "1.3.16",
|
||||
"vue-json-tree-view": "2.1.4",
|
||||
"vue-loader": "15.2.6",
|
||||
"vue-loader": "15.3.0",
|
||||
"vue-router": "3.0.1",
|
||||
"vue-style-loader": "4.1.1",
|
||||
"vue-template-compiler": "2.5.17",
|
||||
@ -213,7 +214,7 @@
|
||||
"vuex-persistedstate": "2.5.4",
|
||||
"web-push": "3.3.2",
|
||||
"webfinger.js": "2.6.6",
|
||||
"webpack": "4.16.4",
|
||||
"webpack": "4.16.5",
|
||||
"webpack-cli": "3.1.0",
|
||||
"websocket": "1.0.26",
|
||||
"ws": "6.0.0",
|
||||
|
@ -8,14 +8,14 @@ import VueRouter from 'vue-router';
|
||||
import './style.styl';
|
||||
|
||||
import init from '../init';
|
||||
|
||||
import Index from './views/index.vue';
|
||||
import * as config from '../config';
|
||||
|
||||
/**
|
||||
* init
|
||||
*/
|
||||
init(launch => {
|
||||
document.title = '%i18n:common.name% | %i18n:common.application-authorization%';
|
||||
document.title = `${config.name} | %i18n:common.application-authorization%`;
|
||||
|
||||
// Init router
|
||||
const router = new VueRouter({
|
||||
|
@ -38,7 +38,7 @@ export default function(type, data): Notification {
|
||||
switch (data.type) {
|
||||
case 'mention':
|
||||
return {
|
||||
title: '%i18n:common.notification.notified-by%'.split("{}")[0] + `${getUserName(data.user)}さんから:` + '%i18n:common.notification.notified-by%'.split("{}")[1],
|
||||
title: '%i18n:common.notification.notified-by%'.split("{}")[0] + `${getUserName(data.user)}:` + '%i18n:common.notification.notified-by%'.split("{}")[1],
|
||||
body: getNoteSummary(data),
|
||||
icon: data.user.avatarUrl
|
||||
};
|
||||
|
@ -1,13 +0,0 @@
|
||||
export default date => {
|
||||
if (typeof date == 'string') date = new Date(date);
|
||||
return (
|
||||
date.getFullYear() + '%i18n:common.date.full-year%' +
|
||||
(date.getMonth() + 1) + '%i18n:common.date.month%' +
|
||||
date.getDate() + '%i18n:common.date.day%' +
|
||||
' ' +
|
||||
date.getHours() + '%i18n:common.date.hours%' +
|
||||
date.getMinutes() + '%i18n:common.date.minutes%' +
|
||||
' ' +
|
||||
`(${['日', '月', '火', '水', '木', '金', '土'][date.getDay()]})`
|
||||
);
|
||||
};
|
@ -132,7 +132,7 @@ export default Vue.extend({
|
||||
this.users = users;
|
||||
this.fetching = false;
|
||||
} else {
|
||||
(this as any).api('users/search_by_username', {
|
||||
(this as any).api('users/search', {
|
||||
query: this.q,
|
||||
limit: 30
|
||||
}).then(users => {
|
||||
|
@ -1,14 +1,18 @@
|
||||
<template>
|
||||
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
||||
<header><b>{{ blackUser | userName }}</b>(%i18n:common.reversi.black%) vs <b>{{ whiteUser | userName }}</b>(%i18n:common.reversi.white%)</header>
|
||||
<button class="go-index" v-if="selfNav" @click="goIndex">%fa:arrow-left%</button>
|
||||
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
||||
|
||||
<div style="overflow: hidden">
|
||||
<div style="overflow: hidden; line-height: 28px;">
|
||||
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}<mk-ellipsis/></p>
|
||||
<p class="turn" v-if="logPos != logs.length">{{ '%i18n:common.reversi.past-turn-of%'.replace('{}', $options.filters.userName(turnUser)) }}</p>
|
||||
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p>
|
||||
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p>
|
||||
<p class="result" v-if="game.isEnded && logPos == logs.length">
|
||||
<template v-if="game.winner">{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}{{ game.settings.isLlotheo ? ' (ロセオ)' : '' }}</template>
|
||||
<template v-if="game.winner">
|
||||
<span>{{ '%i18n:common.reversi.won%'.replace('{}', $options.filters.userName(game.winner)) }}</span>
|
||||
<span v-if="game.surrendered != null"> (%i18n:@surrendered%)</span>
|
||||
</template>
|
||||
<template v-else>%i18n:common.reversi.drawn%</template>
|
||||
</p>
|
||||
</div>
|
||||
@ -41,6 +45,10 @@
|
||||
|
||||
<p class="status"><b>{{ '%i18n:common.reversi.this-turn%'.split('{}')[0] }}{{ logPos }}{{ '%i18n:common.reversi.this-turn%'.split('{}')[1] }}</b> %i18n:common.reversi.black%:{{ o.blackCount }} %i18n:common.reversi.white%:{{ o.whiteCount }} %i18n:common.reversi.total%:{{ o.blackCount + o.whiteCount }}</p>
|
||||
|
||||
<div class="actions" v-if="!game.isEnded && iAmPlayer">
|
||||
<form-button @click="surrender">%i18n:@surrender%</form-button>
|
||||
</div>
|
||||
|
||||
<div class="player" v-if="game.isEnded">
|
||||
<el-button-group>
|
||||
<el-button type="primary" @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</el-button>
|
||||
@ -62,7 +70,20 @@ import Reversi, { Color } from '../../../../../../../games/reversi/core';
|
||||
import { url } from '../../../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['initGame', 'connection'],
|
||||
props: {
|
||||
initGame: {
|
||||
type: Object,
|
||||
require: true
|
||||
},
|
||||
connection: {
|
||||
type: Object,
|
||||
require: true
|
||||
},
|
||||
selfNav: {
|
||||
type: Boolean,
|
||||
require: true
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
@ -79,22 +100,27 @@ export default Vue.extend({
|
||||
if (!this.$store.getters.isSignedIn) return false;
|
||||
return this.game.user1Id == this.$store.state.i.id || this.game.user2Id == this.$store.state.i.id;
|
||||
},
|
||||
|
||||
myColor(): Color {
|
||||
if (!this.iAmPlayer) return null;
|
||||
if (this.game.user1Id == this.$store.state.i.id && this.game.black == 1) return true;
|
||||
if (this.game.user2Id == this.$store.state.i.id && this.game.black == 2) return true;
|
||||
return false;
|
||||
},
|
||||
|
||||
opColor(): Color {
|
||||
if (!this.iAmPlayer) return null;
|
||||
return this.myColor === true ? false : true;
|
||||
},
|
||||
|
||||
blackUser(): any {
|
||||
return this.game.black == 1 ? this.game.user1 : this.game.user2;
|
||||
},
|
||||
|
||||
whiteUser(): any {
|
||||
return this.game.black == 1 ? this.game.user2 : this.game.user1;
|
||||
},
|
||||
|
||||
turnUser(): any {
|
||||
if (this.o.turn === true) {
|
||||
return this.game.black == 1 ? this.game.user1 : this.game.user2;
|
||||
@ -104,11 +130,13 @@ export default Vue.extend({
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
isMyTurn(): boolean {
|
||||
if (!this.iAmPlayer) return false;
|
||||
if (this.turnUser == null) return false;
|
||||
return this.turnUser.id == this.$store.state.i.id;
|
||||
},
|
||||
|
||||
cellsStyle(): any {
|
||||
return {
|
||||
'grid-template-rows': `repeat(${this.game.settings.map.length}, 1fr)`,
|
||||
@ -165,11 +193,13 @@ export default Vue.extend({
|
||||
mounted() {
|
||||
this.connection.on('set', this.onSet);
|
||||
this.connection.on('rescue', this.onRescue);
|
||||
this.connection.on('ended', this.onEnded);
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
this.connection.off('set', this.onSet);
|
||||
this.connection.off('rescue', this.onRescue);
|
||||
this.connection.off('ended', this.onEnded);
|
||||
|
||||
clearInterval(this.pollingClock);
|
||||
},
|
||||
@ -215,6 +245,10 @@ export default Vue.extend({
|
||||
}
|
||||
},
|
||||
|
||||
onEnded(x) {
|
||||
this.game = x.game;
|
||||
},
|
||||
|
||||
checkEnd() {
|
||||
this.game.isEnded = this.o.isEnded;
|
||||
if (this.game.isEnded) {
|
||||
@ -250,6 +284,16 @@ export default Vue.extend({
|
||||
|
||||
this.checkEnd();
|
||||
this.$forceUpdate();
|
||||
},
|
||||
|
||||
surrender() {
|
||||
(this as any).api('games/reversi/games/surrender', {
|
||||
gameId: this.game.id
|
||||
});
|
||||
},
|
||||
|
||||
goIndex() {
|
||||
this.$emit('go-index');
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -261,10 +305,21 @@ export default Vue.extend({
|
||||
root(isDark)
|
||||
text-align center
|
||||
|
||||
> .go-index
|
||||
position absolute
|
||||
top 0
|
||||
left 0
|
||||
z-index 1
|
||||
width 42px
|
||||
height 42px
|
||||
|
||||
> header
|
||||
padding 8px
|
||||
border-bottom dashed 1px isDark ? #4c5761 : #c4cdd4
|
||||
|
||||
a
|
||||
color inherit
|
||||
|
||||
> .board
|
||||
width calc(100% - 16px)
|
||||
max-width 500px
|
||||
@ -381,6 +436,9 @@ root(isDark)
|
||||
margin 0
|
||||
padding 16px 0
|
||||
|
||||
> .actions
|
||||
padding-bottom 16px
|
||||
|
||||
> .player
|
||||
padding-bottom 32px
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<x-room v-if="!g.isStarted" :game="g" :connection="connection"/>
|
||||
<x-game v-else :init-game="g" :connection="connection"/>
|
||||
<x-game v-else :init-game="g" :connection="connection" :self-nav="selfNav" @go-index="goIndex"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@ -16,7 +16,16 @@ export default Vue.extend({
|
||||
XGame,
|
||||
XRoom
|
||||
},
|
||||
props: ['game'],
|
||||
props: {
|
||||
game: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
selfNav: {
|
||||
type: Boolean,
|
||||
require: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
connection: null,
|
||||
@ -36,6 +45,9 @@ export default Vue.extend({
|
||||
onStarted(game) {
|
||||
Object.assign(this.g, game);
|
||||
this.$forceUpdate();
|
||||
},
|
||||
goIndex() {
|
||||
this.$emit('go-index');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -96,11 +96,7 @@ export default Vue.extend({
|
||||
|
||||
methods: {
|
||||
go(game) {
|
||||
(this as any).api('games/reversi/games/show', {
|
||||
gameId: game.id
|
||||
}).then(game => {
|
||||
this.$emit('go', game);
|
||||
});
|
||||
this.$emit('go', game);
|
||||
},
|
||||
|
||||
match() {
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="vchtoekanapleubgzioubdtmlkribzfd">
|
||||
<div v-if="game">
|
||||
<x-gameroom :game="game"/>
|
||||
<x-gameroom :game="game" :self-nav="selfNav" @go-index="goIndex"/>
|
||||
</div>
|
||||
<div class="matching" v-else-if="matching">
|
||||
<h1>{{ '%i18n:@matching.waiting-for%'.split('{}')[0] }}<b>{{ matching | userName }}</b>{{ '%i18n:@matching.waiting-for%'.split('{}')[1] }}<mk-ellipsis/></h1>
|
||||
@ -34,6 +34,11 @@ export default Vue.extend({
|
||||
gameId: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
selfNav: {
|
||||
type: Boolean,
|
||||
require: false,
|
||||
default: true
|
||||
}
|
||||
},
|
||||
|
||||
@ -48,6 +53,10 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
watch: {
|
||||
game() {
|
||||
this.$emit('gamed', this.game);
|
||||
},
|
||||
|
||||
gameId() {
|
||||
this.fetch();
|
||||
}
|
||||
@ -91,18 +100,24 @@ export default Vue.extend({
|
||||
(this as any).api('games/reversi/games/show', {
|
||||
gameId: this.gameId
|
||||
}).then(game => {
|
||||
this.nav(game, true);
|
||||
this.game = game;
|
||||
Progress.done();
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
nav(game, silent) {
|
||||
this.matching = null;
|
||||
this.game = game;
|
||||
async nav(game, actualNav = true) {
|
||||
if (this.selfNav) {
|
||||
// 受け取ったゲーム情報が省略されたものなら完全な情報を取得する
|
||||
if (game != null && (game.settings == null || game.settings.map == null)) {
|
||||
game = await (this as any).api('games/reversi/games/show', {
|
||||
gameId: game.id
|
||||
});
|
||||
}
|
||||
|
||||
if (!silent) {
|
||||
this.$emit('nav', this.game);
|
||||
this.game = game;
|
||||
} else {
|
||||
this.$emit('nav', game, actualNav);
|
||||
}
|
||||
},
|
||||
|
||||
@ -121,7 +136,8 @@ export default Vue.extend({
|
||||
}).then(game => {
|
||||
if (game) {
|
||||
this.matching = null;
|
||||
this.game = game;
|
||||
|
||||
this.nav(game);
|
||||
}
|
||||
});
|
||||
},
|
||||
@ -129,6 +145,11 @@ export default Vue.extend({
|
||||
onMatched(game) {
|
||||
this.matching = null;
|
||||
this.game = game;
|
||||
this.nav(game, false);
|
||||
},
|
||||
|
||||
goIndex() {
|
||||
this.nav(null);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -83,7 +83,7 @@ export default Vue.extend({
|
||||
}
|
||||
} else {
|
||||
if (items[0].kind == 'file') {
|
||||
alert('メッセージに添付できるのはひとつのファイルのみです');
|
||||
alert('%i18n:only-one-file-attached%');
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -105,7 +105,7 @@ export default Vue.extend({
|
||||
return;
|
||||
} else if (e.dataTransfer.files.length > 1) {
|
||||
e.preventDefault();
|
||||
alert('メッセージに添付できるのはひとつのファイルのみです');
|
||||
alert('%i18n:only-one-file-attached%');
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -61,7 +61,7 @@ export default Vue.extend({
|
||||
const date = new Date(message.createdAt).getDate();
|
||||
const month = new Date(message.createdAt).getMonth() + 1;
|
||||
message._date = date;
|
||||
message._datetext = `${month}月 ${date}日`;
|
||||
message._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
|
||||
return message;
|
||||
});
|
||||
},
|
||||
@ -111,7 +111,7 @@ export default Vue.extend({
|
||||
this.form.upload(e.dataTransfer.files[0]);
|
||||
return;
|
||||
} else if (e.dataTransfer.files.length > 1) {
|
||||
alert('メッセージに添付できるのはひとつのファイルのみです');
|
||||
alert('%i18n:@only-one-file-attached%');
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
import Vue from 'vue';
|
||||
import * as emojilib from 'emojilib';
|
||||
import { length } from 'stringz';
|
||||
import parse from '../../../../../mfm/parse';
|
||||
import getAcct from '../../../../../misc/acct/render';
|
||||
import { url } from '../../../config';
|
||||
@ -40,10 +41,13 @@ export default Vue.component('misskey-flavored-markdown', {
|
||||
ast = this.ast;
|
||||
}
|
||||
|
||||
let bigCount = 0;
|
||||
let motionCount = 0;
|
||||
|
||||
// Parse ast to DOM
|
||||
const els = flatten(ast.map(token => {
|
||||
switch (token.type) {
|
||||
case 'text':
|
||||
case 'text': {
|
||||
const text = token.content.replace(/(\r\n|\n|\r)/g, '\n');
|
||||
|
||||
if (this.shouldBreak) {
|
||||
@ -54,30 +58,52 @@ export default Vue.component('misskey-flavored-markdown', {
|
||||
} else {
|
||||
return createElement('span', text.replace(/\n/g, ' '));
|
||||
}
|
||||
}
|
||||
|
||||
case 'bold':
|
||||
case 'bold': {
|
||||
return createElement('b', token.bold);
|
||||
}
|
||||
|
||||
case 'big':
|
||||
case 'big': {
|
||||
bigCount++;
|
||||
const isLong = length(token.big) > 10;
|
||||
const isMany = bigCount > 3;
|
||||
return (createElement as any)('strong', {
|
||||
attrs: {
|
||||
style: 'display: inline-block; font-size: 200%;'
|
||||
style: `display: inline-block; font-size: ${ isMany ? '100%' : '150%' };`
|
||||
},
|
||||
directives: [{
|
||||
directives: [this.$store.state.settings.disableAnimatedMfm || isLong || isMany ? {} : {
|
||||
name: 'animate-css',
|
||||
value: { classes: 'tada', iteration: 'infinite' }
|
||||
}]
|
||||
}, token.big);
|
||||
}
|
||||
|
||||
case 'url':
|
||||
case 'motion': {
|
||||
motionCount++;
|
||||
const isLong = length(token.motion) > 10;
|
||||
const isMany = motionCount > 3;
|
||||
return (createElement as any)('span', {
|
||||
attrs: {
|
||||
style: 'display: inline-block;'
|
||||
},
|
||||
directives: [this.$store.state.settings.disableAnimatedMfm || isLong || isMany ? {} : {
|
||||
name: 'animate-css',
|
||||
value: { classes: 'rubberBand', iteration: 'infinite' }
|
||||
}]
|
||||
}, token.motion);
|
||||
}
|
||||
|
||||
case 'url': {
|
||||
return createElement(MkUrl, {
|
||||
props: {
|
||||
url: token.content,
|
||||
target: '_blank'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
case 'link':
|
||||
case 'link': {
|
||||
return createElement('a', {
|
||||
attrs: {
|
||||
class: 'link',
|
||||
@ -86,8 +112,9 @@ export default Vue.component('misskey-flavored-markdown', {
|
||||
title: token.url
|
||||
}
|
||||
}, token.title);
|
||||
}
|
||||
|
||||
case 'mention':
|
||||
case 'mention': {
|
||||
return (createElement as any)('a', {
|
||||
attrs: {
|
||||
href: `${url}/@${getAcct(token)}`,
|
||||
@ -99,16 +126,18 @@ export default Vue.component('misskey-flavored-markdown', {
|
||||
value: token.content
|
||||
}]
|
||||
}, token.content);
|
||||
}
|
||||
|
||||
case 'hashtag':
|
||||
case 'hashtag': {
|
||||
return createElement('a', {
|
||||
attrs: {
|
||||
href: `${url}/tags/${encodeURIComponent(token.hashtag)}`,
|
||||
target: '_blank'
|
||||
}
|
||||
}, token.content);
|
||||
}
|
||||
|
||||
case 'code':
|
||||
case 'code': {
|
||||
return createElement('pre', {
|
||||
class: 'code'
|
||||
}, [
|
||||
@ -118,15 +147,17 @@ export default Vue.component('misskey-flavored-markdown', {
|
||||
}
|
||||
})
|
||||
]);
|
||||
}
|
||||
|
||||
case 'inline-code':
|
||||
case 'inline-code': {
|
||||
return createElement('code', {
|
||||
domProps: {
|
||||
innerHTML: token.html
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
case 'quote':
|
||||
case 'quote': {
|
||||
const text2 = token.quote.replace(/(\r\n|\n|\r)/g, '\n');
|
||||
|
||||
if (this.shouldBreak) {
|
||||
@ -145,27 +176,32 @@ export default Vue.component('misskey-flavored-markdown', {
|
||||
}
|
||||
}, text2.replace(/\n/g, ' '));
|
||||
}
|
||||
}
|
||||
|
||||
case 'title':
|
||||
case 'title': {
|
||||
return createElement('div', {
|
||||
attrs: {
|
||||
class: 'title'
|
||||
}
|
||||
}, token.title);
|
||||
}
|
||||
|
||||
case 'emoji':
|
||||
case 'emoji': {
|
||||
const emoji = emojilib.lib[token.emoji];
|
||||
return createElement('span', emoji ? emoji.char : token.content);
|
||||
}
|
||||
|
||||
case 'search':
|
||||
case 'search': {
|
||||
return createElement(MkGoogle, {
|
||||
props: {
|
||||
q: token.query
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
default:
|
||||
default: {
|
||||
console.log('unknown ast type:', token.type);
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
</ui-input>
|
||||
<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>
|
||||
<p style="margin: 8px 0;">または<a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a></p>
|
||||
<p style="margin: 8px 0;">%i18n:@or%<a :href="`${apiUrl}/signin/twitter`">%i18n:@signin-with-twitter%</a></p>
|
||||
</form>
|
||||
</template>
|
||||
|
||||
|
@ -45,6 +45,9 @@ root(isDark)
|
||||
color isDark ? #fff : #606266
|
||||
transition 0.1s
|
||||
|
||||
*
|
||||
pointer-events none
|
||||
|
||||
&:hover
|
||||
&:focus
|
||||
color $theme-color
|
||||
|
@ -2,6 +2,9 @@
|
||||
<iframe v-if="youtubeId" type="text/html" height="250"
|
||||
: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" />
|
||||
<div v-else-if="tweetUrl && detail" class="twitter">
|
||||
<blockquote ref="tweet" class="twitter-tweet" :data-theme="$store.state.device.darkmode ? 'dark' : null">
|
||||
<a :href="url"></a>
|
||||
@ -60,6 +63,8 @@ export default Vue.extend({
|
||||
this.youtubeId = url.searchParams.get('v');
|
||||
} else if (url.hostname == 'youtu.be') {
|
||||
this.youtubeId = url.pathname;
|
||||
} else if (url.hostname == 'open.spotify.com') {
|
||||
this.spotifyId = url.pathname.split('/').reverse().filter(x => x !== '')[0];
|
||||
} else if (this.detail && url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) {
|
||||
this.tweetUrl = url;
|
||||
const twttr = (window as any).twttr || {};
|
||||
|
@ -71,7 +71,6 @@ export default Vue.extend({
|
||||
this.user = user;
|
||||
this.fetching = false;
|
||||
Progress.done();
|
||||
document.title = getUserName(this.user) + ' | %i18n:common.name%';
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
<div>
|
||||
<p>%fa:R hdd%Storage</p>
|
||||
<p>Total: {{ total | bytes(1) }}</p>
|
||||
<p>Available: {{ available | bytes(1) }}</p>
|
||||
<p>Free: {{ available | bytes(1) }}</p>
|
||||
<p>Used: {{ used | bytes(1) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -8,7 +8,7 @@ export default (os: OS) => (cb, file = null) => {
|
||||
|
||||
const w = os.new(CropWindow, {
|
||||
image: file,
|
||||
title: 'アバターとして表示する部分を選択',
|
||||
title: '%i18n:desktop.avatar-crop-title%',
|
||||
aspectRatio: 1 / 1
|
||||
});
|
||||
|
||||
@ -18,11 +18,11 @@ export default (os: OS) => (cb, file = null) => {
|
||||
data.append('file', blob, file.name + '.cropped.png');
|
||||
|
||||
os.api('drive/folders/find', {
|
||||
name: 'アイコン'
|
||||
name: '%i18n:desktop.avatar%'
|
||||
}).then(iconFolder => {
|
||||
if (iconFolder.length === 0) {
|
||||
os.api('drive/folders/create', {
|
||||
name: 'アイコン'
|
||||
name: '%i18n:desktop.avatar%'
|
||||
}).then(iconFolder => {
|
||||
upload(data, iconFolder);
|
||||
});
|
||||
@ -41,7 +41,7 @@ export default (os: OS) => (cb, file = null) => {
|
||||
|
||||
const upload = (data, folder) => {
|
||||
const dialog = os.new(ProgressDialog, {
|
||||
title: '新しいアバターをアップロードしています'
|
||||
title: '%i18n:desktop.uploading-avatar%'
|
||||
});
|
||||
document.body.appendChild(dialog.$el);
|
||||
|
||||
@ -76,10 +76,10 @@ export default (os: OS) => (cb, file = null) => {
|
||||
});
|
||||
|
||||
os.apis.dialog({
|
||||
title: '%fa:info-circle%アバターを更新しました',
|
||||
text: '新しいアバターが反映されるまで時間がかかる場合があります。',
|
||||
title: '%fa:info-circle% %i18n:desktop.avatar-updated%',
|
||||
text: null,
|
||||
actions: [{
|
||||
text: 'わかった'
|
||||
text: '%i18n:common.got-it%'
|
||||
}]
|
||||
});
|
||||
|
||||
@ -92,7 +92,7 @@ export default (os: OS) => (cb, file = null) => {
|
||||
} else {
|
||||
os.apis.chooseDriveFile({
|
||||
multiple: false,
|
||||
title: '%fa:image%アバターにする画像を選択'
|
||||
title: '%fa:image% %i18n:desktop.choose-avatar%'
|
||||
}).then(file => {
|
||||
fileSelected(file);
|
||||
});
|
||||
|
@ -8,7 +8,7 @@ export default (os: OS) => {
|
||||
const cropImage = file => new Promise((resolve, reject) => {
|
||||
const w = os.new(CropWindow, {
|
||||
image: file,
|
||||
title: 'バナーとして表示する部分を選択',
|
||||
title: '%i18n:desktop.banner-crop-title%',
|
||||
aspectRatio: 16 / 9
|
||||
});
|
||||
|
||||
@ -18,11 +18,11 @@ export default (os: OS) => {
|
||||
data.append('file', blob, file.name + '.cropped.png');
|
||||
|
||||
os.api('drive/folders/find', {
|
||||
name: 'バナー'
|
||||
name: '%i18n:desktop.banner%'
|
||||
}).then(bannerFolder => {
|
||||
if (bannerFolder.length === 0) {
|
||||
os.api('drive/folders/create', {
|
||||
name: 'バナー'
|
||||
name: '%i18n:desktop.banner%'
|
||||
}).then(iconFolder => {
|
||||
resolve(upload(data, iconFolder));
|
||||
});
|
||||
@ -43,7 +43,7 @@ export default (os: OS) => {
|
||||
|
||||
const upload = (data, folder) => new Promise((resolve, reject) => {
|
||||
const dialog = os.new(ProgressDialog, {
|
||||
title: '新しいバナーをアップロードしています'
|
||||
title: '%i18n:desktop.uploading-banner%'
|
||||
});
|
||||
document.body.appendChild(dialog.$el);
|
||||
|
||||
@ -79,10 +79,10 @@ export default (os: OS) => {
|
||||
});
|
||||
|
||||
os.apis.dialog({
|
||||
title: '%fa:info-circle%バナーを更新しました',
|
||||
text: '新しいバナーが反映されるまで時間がかかる場合があります。',
|
||||
title: '%fa:info-circle% %i18n:desktop.banner-updated%',
|
||||
text: null,
|
||||
actions: [{
|
||||
text: 'わかった'
|
||||
text: '%i18n:common.got-it%'
|
||||
}]
|
||||
});
|
||||
|
||||
@ -95,7 +95,7 @@ export default (os: OS) => {
|
||||
? Promise.resolve(file)
|
||||
: os.apis.chooseDriveFile({
|
||||
multiple: false,
|
||||
title: '%fa:image%バナーにする画像を選択'
|
||||
title: '%fa:image% %i18n:desktop.choose-banner%'
|
||||
});
|
||||
|
||||
return selectedFile
|
||||
|
@ -79,7 +79,6 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import dateStringify from '../../../common/scripts/date-stringify';
|
||||
import parse from '../../../../../mfm/parse';
|
||||
|
||||
import MkPostFormWindow from './post-form-window.vue';
|
||||
@ -129,7 +128,7 @@ export default Vue.extend({
|
||||
: 0;
|
||||
},
|
||||
title(): string {
|
||||
return dateStringify(this.p.createdAt);
|
||||
return new Date(this.p.createdAt).toLocaleString();
|
||||
},
|
||||
urls(): string[] {
|
||||
if (this.p.text) {
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import dateStringify from '../../../common/scripts/date-stringify';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
@ -28,7 +27,7 @@ export default Vue.extend({
|
||||
},
|
||||
computed: {
|
||||
title(): string {
|
||||
return dateStringify(this.note.createdAt);
|
||||
return new Date(this.note.createdAt).toLocaleString();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -12,13 +12,12 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import dateStringify from '../../../common/scripts/date-stringify';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['note'],
|
||||
computed: {
|
||||
title(): string {
|
||||
return dateStringify(this.note.createdAt);
|
||||
return new Date(this.note.createdAt).toLocaleString();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -18,7 +18,7 @@
|
||||
<div class="body">
|
||||
<p v-if="p.cw != null" class="cw">
|
||||
<span class="text" v-if="p.cw != ''">{{ p.cw }}</span>
|
||||
<span class="toggle" @click="showContent = !showContent">{{ showContent ? '隠す' : 'もっと見る' }}</span>
|
||||
<span class="toggle" @click="showContent = !showContent">{{ showContent ? '%i18n:@hide%' : '%i18n:@see-more%' }}</span>
|
||||
</p>
|
||||
<div class="content" v-show="p.cw == null || showContent">
|
||||
<div class="text">
|
||||
@ -71,7 +71,6 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import dateStringify from '../../../common/scripts/date-stringify';
|
||||
import parse from '../../../../../mfm/parse';
|
||||
|
||||
import MkPostFormWindow from './post-form-window.vue';
|
||||
@ -128,7 +127,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
title(): string {
|
||||
return dateStringify(this.p.createdAt);
|
||||
return new Date(this.p.createdAt).toLocaleString();
|
||||
},
|
||||
|
||||
urls(): string[] {
|
||||
|
@ -33,7 +33,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import { url } from '../../../config';
|
||||
import * as config from '../../../config';
|
||||
import getNoteSummary from '../../../../../misc/get-note-summary';
|
||||
|
||||
import XNote from './notes.note.vue';
|
||||
@ -69,7 +69,7 @@ export default Vue.extend({
|
||||
const date = new Date(note.createdAt).getDate();
|
||||
const month = new Date(note.createdAt).getMonth() + 1;
|
||||
note._date = date;
|
||||
note._datetext = `${month}月 ${date}日`;
|
||||
note._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
|
||||
return note;
|
||||
});
|
||||
}
|
||||
@ -149,7 +149,7 @@ export default Vue.extend({
|
||||
|
||||
// サウンドを再生する
|
||||
if (this.$store.state.device.enableSounds && !silent) {
|
||||
const sound = new Audio(`${url}/assets/post.mp3`);
|
||||
const sound = new Audio(`${config.url}/assets/post.mp3`);
|
||||
sound.volume = this.$store.state.device.soundVolume;
|
||||
sound.play();
|
||||
}
|
||||
@ -187,7 +187,7 @@ export default Vue.extend({
|
||||
|
||||
clearNotification() {
|
||||
this.unreadCount = 0;
|
||||
document.title = '%i18n:common.name%';
|
||||
document.title = config.name;
|
||||
},
|
||||
|
||||
onVisibilitychange() {
|
||||
|
@ -130,7 +130,7 @@ export default Vue.extend({
|
||||
const date = new Date(notification.createdAt).getDate();
|
||||
const month = new Date(notification.createdAt).getMonth() + 1;
|
||||
notification._date = date;
|
||||
notification._datetext = `${month}月 ${date}日`;
|
||||
notification._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
|
||||
return notification;
|
||||
});
|
||||
}
|
||||
|
@ -14,7 +14,7 @@
|
||||
<b>%i18n:@recent-tags%:</b>
|
||||
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
|
||||
</div>
|
||||
<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)">
|
||||
<input v-show="useCw" v-model="cw" placeholder="%i18n:@annotations%">
|
||||
<textarea :class="{ with: (files.length != 0 || poll) }"
|
||||
ref="text" v-model="text" :disabled="posting"
|
||||
@keydown="onKeydown" @paste="onPaste" :placeholder="placeholder"
|
||||
|
@ -55,6 +55,7 @@
|
||||
<span>%i18n:@show-maps-desc%</span>
|
||||
</mk-switch>
|
||||
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
|
||||
<mk-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm" text="%i18n:common.disable-animated-mfm%"/>
|
||||
</section>
|
||||
|
||||
<section class="web" v-show="page == 'web'">
|
||||
@ -376,6 +377,12 @@ export default Vue.extend({
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeDisableAnimatedMfm(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'disableAnimatedMfm',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
onChangeGradientWindowHeader(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'gradientWindowHeader',
|
||||
|
@ -4,7 +4,7 @@
|
||||
<div class="main" ref="main">
|
||||
<div class="backdrop"></div>
|
||||
<div class="main">
|
||||
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>さん</p>
|
||||
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>%i18n:@adjective%</p>
|
||||
<div class="container" ref="mainContainer">
|
||||
<div class="left">
|
||||
<x-nav/>
|
||||
|
@ -27,7 +27,7 @@ export default Vue.extend({
|
||||
methods: {
|
||||
add() {
|
||||
(this as any).apis.input({
|
||||
title: 'リスト名',
|
||||
title: '%i18n:@list-name%',
|
||||
}).then(async title => {
|
||||
const list = await (this as any).api('users/lists/create', {
|
||||
title
|
||||
|
@ -72,7 +72,7 @@ export default Vue.extend({
|
||||
const date = new Date(note.createdAt).getDate();
|
||||
const month = new Date(note.createdAt).getMonth() + 1;
|
||||
note._date = date;
|
||||
note._datetext = `${month}月 ${date}日`;
|
||||
note._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
|
||||
return note;
|
||||
});
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ export default Vue.extend({
|
||||
const date = new Date(notification.createdAt).getDate();
|
||||
const month = new Date(notification.createdAt).getMonth() + 1;
|
||||
notification._date = date;
|
||||
notification._datetext = `${month}月 ${date}日`;
|
||||
notification._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
|
||||
return notification;
|
||||
});
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<component :is="ui ? 'mk-ui' : 'div'">
|
||||
<mk-reversi :game-id="$route.params.game" @nav="nav"/>
|
||||
<mk-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/>
|
||||
</component>
|
||||
</template>
|
||||
|
||||
@ -14,9 +14,14 @@ export default Vue.extend({
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
nav(game) {
|
||||
history.pushState(null, null, '/reversi/' + game.id);
|
||||
},
|
||||
nav(game, actualNav) {
|
||||
if (actualNav) {
|
||||
this.$router.push('/reversi/' + game.id);
|
||||
} else {
|
||||
// TODO: https://github.com/vuejs/vue-router/issues/703
|
||||
this.$router.push('/reversi/' + game.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -4,9 +4,11 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% - %i18n:@title%';
|
||||
document.title = `${config.name} - %i18n:@title%`;
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
@ -7,6 +7,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
props: {
|
||||
@ -16,7 +17,7 @@ export default Vue.extend({
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name%';
|
||||
document.title = config.name;
|
||||
|
||||
Progress.start();
|
||||
},
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="pptjhabgjtt7kwskbfv4y3uml6fpuhmr">
|
||||
<h1>{{'%i18n:@share-with%'.split("{}")[0] + '%i18n:common.name%' + '%i18n:@share-with%'.split("{}")[1]}}</h1>
|
||||
<h1>{{ '%i18n:@share-with%'.replace('{}', name) }}</h1>
|
||||
<div>
|
||||
<mk-signin v-if="!$store.getters.isSignedIn"/>
|
||||
<mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/>
|
||||
@ -12,10 +12,12 @@
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
name: config.name,
|
||||
posted: false,
|
||||
text: new URLSearchParams(location.search).get('text')
|
||||
};
|
||||
|
@ -13,7 +13,7 @@
|
||||
<span v-if="user.isMuted">%fa:eye% %i18n:@unmute%</span>
|
||||
<span v-if="!user.isMuted">%fa:eye-slash% %i18n:@mute%</span>
|
||||
</button>
|
||||
<button class="mute ui" @click="list">%fa:list% リストに追加</button>
|
||||
<button class="mute ui" @click="list">%fa:list% %i18n:@push-to-a-list%</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -76,7 +76,7 @@ export default Vue.extend({
|
||||
});
|
||||
(this as any).apis.dialog({
|
||||
title: 'Done!',
|
||||
text: `${this.user.name}を${list.title}に追加しました。`
|
||||
text: '%i18n:@list-pushed%'.replace('{user}', this.user.name).replace('{list}', list.title)
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -68,7 +68,6 @@ export default Vue.extend({
|
||||
this.user = user;
|
||||
this.fetching = false;
|
||||
Progress.done();
|
||||
document.title = getUserName(this.user) + ' | %i18n:common.name%';
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
<div class="body" :style="{ backgroundImage: `url('${ welcomeBgUrl }')` }">
|
||||
<div class="container">
|
||||
<div class="info">
|
||||
<span>%i18n:common.name% <b>{{ host }}</b></span>
|
||||
<span><b>{{ host }}</b></span>
|
||||
<span class="stats" v-if="stats">
|
||||
<span>%fa:user% {{ stats.originalUsersCount | number }}</span>
|
||||
<span>%fa:pencil-alt% {{ stats.originalNotesCount | number }}</span>
|
||||
@ -16,9 +16,9 @@
|
||||
</div>
|
||||
<main>
|
||||
<div class="about">
|
||||
<h1 v-if="name">{{ name }}</h1>
|
||||
<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="%i18n:common.name%"></h1>
|
||||
<p class="powerd-by" v-if="name">%i18n:@powered-by-misskey%</p>
|
||||
<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>
|
||||
<p class="powerd-by" v-if="name != 'Misskey'">%i18n:@powered-by-misskey%</p>
|
||||
<p class="desc" v-html="description || '%i18n:common.about%'"></p>
|
||||
<a ref="signup" @click="signup">📦 %i18n:@signup%</a>
|
||||
</div>
|
||||
@ -32,7 +32,7 @@
|
||||
<mk-nav class="nav"/>
|
||||
</div>
|
||||
<mk-forkit class="forkit"/>
|
||||
<img src="assets/title.dark.svg" alt="%i18n:common.name%">
|
||||
<img src="assets/title.dark.svg" :alt="name">
|
||||
</div>
|
||||
<div class="tl">
|
||||
<mk-welcome-timeline :max="20"/>
|
||||
|
@ -55,7 +55,7 @@ export default define({
|
||||
}).then(data => {
|
||||
this.clear();
|
||||
}).catch(err => {
|
||||
alert('失敗した');
|
||||
alert('Something happened');
|
||||
}).then(() => {
|
||||
this.posting = false;
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<mk-ui>
|
||||
<p v-if="fetching">読み込み中</p>
|
||||
<p v-if="fetching">%i18n:common.loading%</p>
|
||||
<b-card v-if="!fetching" :header="app.name">
|
||||
<b-form-group label="App Secret">
|
||||
<b-input :value="app.secret" readonly/>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<mk-ui>
|
||||
<b-button to="/apps" variant="primary">アプリの管理</b-button>
|
||||
<b-button to="/apps" variant="primary">%i18n:@manage-apps%</b-button>
|
||||
</mk-ui>
|
||||
</template>
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<b-navbar toggleable="md" type="dark" variant="info">
|
||||
<b-navbar-brand>%i18n:common.name% Developers</b-navbar-brand>
|
||||
<b-navbar-brand>Developers</b-navbar-brand>
|
||||
<b-navbar-nav>
|
||||
<b-nav-item to="/">Home</b-nav-item>
|
||||
<b-nav-item to="/apps">Apps</b-nav-item>
|
||||
|
@ -55,7 +55,7 @@ Vue.mixin({
|
||||
|
||||
console.info(`Misskey v${version} (${codename})`);
|
||||
console.info(
|
||||
'%cここにコードを入力したり張り付けたりしないでください。アカウントが不正利用される可能性があります。',
|
||||
'%c%i18n:common.do-not-copy-paste%',
|
||||
'color: red; background: yellow; font-size: 16px; font-weight: bold;');
|
||||
|
||||
// BootTimer解除
|
||||
|
@ -38,6 +38,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import getNoteSummary from '../../../../../misc/get-note-summary';
|
||||
import * as config from '../../../config';
|
||||
|
||||
const displayLimit = 30;
|
||||
|
||||
@ -66,7 +67,7 @@ export default Vue.extend({
|
||||
const date = new Date(note.createdAt).getDate();
|
||||
const month = new Date(note.createdAt).getMonth() + 1;
|
||||
note._date = date;
|
||||
note._datetext = `${month}月 ${date}日`;
|
||||
note._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
|
||||
return note;
|
||||
});
|
||||
}
|
||||
@ -183,7 +184,7 @@ export default Vue.extend({
|
||||
|
||||
clearNotification() {
|
||||
this.unreadCount = 0;
|
||||
document.title = '%i18n:common.name%';
|
||||
document.title = config.name;
|
||||
},
|
||||
|
||||
onVisibilitychange() {
|
||||
|
@ -42,7 +42,7 @@ export default Vue.extend({
|
||||
const date = new Date(notification.createdAt).getDate();
|
||||
const month = new Date(notification.createdAt).getMonth() + 1;
|
||||
notification._date = date;
|
||||
notification._datetext = `${month}月 ${date}日`;
|
||||
notification._datetext = '%i18n:common.month-and-day%'.replace('{month}', month.toString()).replace('{day}', date.toString());
|
||||
return notification;
|
||||
});
|
||||
}
|
||||
|
@ -3,12 +3,12 @@
|
||||
<mk-special-message/>
|
||||
<div class="main" ref="main">
|
||||
<div class="backdrop"></div>
|
||||
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>さん</p>
|
||||
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>%i18n:@adjective%</p>
|
||||
<div class="content" ref="mainContainer">
|
||||
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
|
||||
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
|
||||
<h1>
|
||||
<slot>%i18n:common.name%</slot>
|
||||
<slot>config.name</slot>
|
||||
</h1>
|
||||
<slot name="func"></slot>
|
||||
</div>
|
||||
@ -20,11 +20,13 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as anime from 'animejs';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
props: ['func'],
|
||||
data() {
|
||||
return {
|
||||
config,
|
||||
hasGameInvitation: false,
|
||||
connection: null,
|
||||
connectionId: null
|
||||
|
@ -25,6 +25,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
@ -43,7 +44,7 @@ export default Vue.extend({
|
||||
window.addEventListener('popstate', this.onPopState);
|
||||
},
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% Drive';
|
||||
document.title = `${config.name} Drive`;
|
||||
document.documentElement.style.background = '#fff';
|
||||
},
|
||||
beforeDestroy() {
|
||||
@ -63,7 +64,7 @@ export default Vue.extend({
|
||||
(this.$refs as any).browser.openContextMenu();
|
||||
},
|
||||
onMoveRoot(silent) {
|
||||
const title = '%i18n:common.name% Drive';
|
||||
const title = `${config.name} Drive`;
|
||||
|
||||
if (!silent) {
|
||||
// Rewrite URL
|
||||
@ -76,7 +77,7 @@ export default Vue.extend({
|
||||
this.folder = null;
|
||||
},
|
||||
onOpenFolder(folder, silent) {
|
||||
const title = folder.name + ' | %i18n:common.name% Drive';
|
||||
const title = `${folder.name} | ${config.name} Drive`;
|
||||
|
||||
if (!silent) {
|
||||
// Rewrite URL
|
||||
@ -89,7 +90,7 @@ export default Vue.extend({
|
||||
this.folder = folder;
|
||||
},
|
||||
onOpenFile(file, silent) {
|
||||
const title = file.name + ' | %i18n:common.name% Drive';
|
||||
const title = `${file.name} | ${config.name} Drive`;
|
||||
|
||||
if (!silent) {
|
||||
// Rewrite URL
|
||||
|
@ -14,6 +14,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
@ -28,7 +29,7 @@ export default Vue.extend({
|
||||
this.fetch();
|
||||
},
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% | %i18n:@notifications%';
|
||||
document.title = `${config.name} | %i18n:@notifications%`;
|
||||
},
|
||||
methods: {
|
||||
fetch() {
|
||||
|
@ -21,6 +21,7 @@ import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import parseAcct from '../../../../../misc/acct/parse';
|
||||
import getUserName from '../../../../../misc/get-user-name';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
@ -49,7 +50,7 @@ export default Vue.extend({
|
||||
this.user = user;
|
||||
this.fetching = false;
|
||||
|
||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | %i18n:common.name%';
|
||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
|
||||
});
|
||||
},
|
||||
onLoaded() {
|
||||
|
@ -20,6 +20,7 @@
|
||||
import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import parseAcct from '../../../../../misc/acct/parse';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
@ -48,7 +49,7 @@ export default Vue.extend({
|
||||
this.user = user;
|
||||
this.fetching = false;
|
||||
|
||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | %i18n:common.name%';
|
||||
document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | ' + config.name;
|
||||
});
|
||||
},
|
||||
onLoaded() {
|
||||
|
@ -1,21 +1,27 @@
|
||||
<template>
|
||||
<mk-ui>
|
||||
<span slot="header">%fa:gamepad%%i18n:@reversi%</span>
|
||||
<mk-reversi :game-id="$route.params.game" @nav="nav"/>
|
||||
<mk-reversi :game-id="$route.params.game" @nav="nav" :self-nav="false"/>
|
||||
</mk-ui>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as config from '../../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% %i18n:@reversi%';
|
||||
document.title = `${config.name} %i18n:@reversi%`;
|
||||
document.documentElement.style.background = '#fff';
|
||||
},
|
||||
methods: {
|
||||
nav(game) {
|
||||
history.pushState(null, null, '/reversi/' + game.id);
|
||||
nav(game, actualNav) {
|
||||
if (actualNav) {
|
||||
this.$router.push('/reversi/' + game.id);
|
||||
} else {
|
||||
// TODO: https://github.com/vuejs/vue-router/issues/703
|
||||
this.$router.push('/reversi/' + game.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -49,6 +49,7 @@
|
||||
import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import XTl from './home.timeline.vue';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -96,7 +97,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name%';
|
||||
document.title = config.name;
|
||||
|
||||
Progress.start();
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import parseAcct from '../../../../../misc/acct/parse';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
@ -47,7 +48,7 @@ export default Vue.extend({
|
||||
this.user = user;
|
||||
this.fetching = false;
|
||||
|
||||
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | %i18n:common.name%`;
|
||||
document.title = `%i18n:@messaging%: ${Vue.filter('userName')(this.user)} | ${config.name}`;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -8,10 +8,11 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import getAcct from '../../../../../misc/acct/render';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% %i18n:@messaging%';
|
||||
document.title = `${config.name} %i18n:@messaging%`;
|
||||
},
|
||||
methods: {
|
||||
navigate(user) {
|
||||
|
@ -16,6 +16,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
@ -31,7 +32,7 @@ export default Vue.extend({
|
||||
this.fetch();
|
||||
},
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name%';
|
||||
document.title = config.name;
|
||||
},
|
||||
methods: {
|
||||
fetch() {
|
||||
|
@ -15,7 +15,7 @@ import Progress from '../../../common/scripts/loading';
|
||||
|
||||
export default Vue.extend({
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% | %i18n:@notifications%';
|
||||
document.title = '%i18n:@notifications%';
|
||||
|
||||
Progress.start();
|
||||
},
|
||||
|
@ -25,7 +25,7 @@ export default Vue.extend({
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% | %i18n:@title%';
|
||||
document.title = '%i18n:@title%';
|
||||
|
||||
Progress.start();
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
<span slot="header">%fa:search% {{ q }}</span>
|
||||
|
||||
<main>
|
||||
<p v-if="!fetching && empty">%fa:search%「{{ q }}」に関する投稿は見つかりませんでした。</p>
|
||||
<p :class="$style.empty" v-if="!fetching && empty">%fa:search% {{ '%i18n:not-found%'.split('{}')[0] }}{{ q }}{{ '%i18n:not-found%'.split('{}')[1] }}</p>
|
||||
<mk-notes ref="timeline" :more="existMore ? more : null"/>
|
||||
</main>
|
||||
</mk-ui>
|
||||
@ -12,6 +12,7 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import * as config from '../../../config';
|
||||
|
||||
const limit = 20;
|
||||
|
||||
@ -34,7 +35,7 @@ export default Vue.extend({
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
document.title = `%i18n:@search%: ${this.q} | %i18n:common.name%`;
|
||||
document.title = `%i18n:@search%: ${this.q} | ${config.name}`;
|
||||
|
||||
this.fetch();
|
||||
},
|
||||
|
@ -14,6 +14,7 @@
|
||||
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
|
||||
<ui-switch v-model="$store.state.settings.disableAnimatedMfm" @change="onChangeDisableAnimatedMfm">%i18n:common.disable-animated-mfm%</ui-switch>
|
||||
|
||||
<div>
|
||||
<div>%i18n:@timeline%</div>
|
||||
@ -142,7 +143,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% | %i18n:@settings%';
|
||||
document.title = '%i18n:@settings%';
|
||||
},
|
||||
|
||||
methods: {
|
||||
@ -192,6 +193,13 @@ export default Vue.extend({
|
||||
});
|
||||
},
|
||||
|
||||
onChangeDisableAnimatedMfm(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'disableAnimatedMfm',
|
||||
value: v
|
||||
});
|
||||
},
|
||||
|
||||
onChangeShowReplyTarget(v) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
key: 'showReplyTarget',
|
||||
|
@ -1,21 +1,23 @@
|
||||
<template>
|
||||
<div class="azibmfpleajagva420swmu4c3r7ni7iw">
|
||||
<h1>{{'%i18n:@share-with%'.split("{}")[0] + '%i18n:common.name%' + '%i18n:@share-with%'.split("{}")[1]}}</h1>
|
||||
<h1>{{ '%i18n:@share-with%'.replace('{}', name) }}</h1>
|
||||
<div>
|
||||
<mk-signin v-if="!$store.getters.isSignedIn"/>
|
||||
<mk-post-form v-else-if="!posted" :initial-text="text" :instant="true" @posted="posted = true"/>
|
||||
<p v-if="posted" class="posted">%fa:check%</p>
|
||||
</div>
|
||||
<ui-button class="close" v-if="posted" @click="close">閉じる</ui-button>
|
||||
<ui-button class="close" v-if="posted" @click="close">%i18n:common.close%</ui-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
data() {
|
||||
return {
|
||||
name: config.name,
|
||||
posted: false,
|
||||
text: new URLSearchParams(location.search).get('text')
|
||||
};
|
||||
|
@ -23,7 +23,7 @@ export default Vue.extend({
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name% | %i18n:@title%';
|
||||
document.title = '%i18n:@title%';
|
||||
|
||||
Progress.start();
|
||||
|
||||
|
@ -67,6 +67,7 @@ import * as age from 's-age';
|
||||
import parseAcct from '../../../../../misc/acct/parse';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
import XHome from './user/home.vue';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -106,7 +107,7 @@ export default Vue.extend({
|
||||
this.fetching = false;
|
||||
|
||||
Progress.done();
|
||||
document.title = Vue.filter('userName')(this.user) + ' | %i18n:common.name%';
|
||||
document.title = Vue.filter('userName')(this.user) + ' | ' + config.name;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,10 @@
|
||||
<template>
|
||||
<div class="welcome">
|
||||
<div>
|
||||
<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="%i18n:common.name%">
|
||||
<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name">
|
||||
<p class="host">{{ host }}</p>
|
||||
<div class="about">
|
||||
<h2>{{ name || 'unidentified' }}</h2>
|
||||
<h2>{{ name }}</h2>
|
||||
<p v-html="description || '%i18n:common.about%'"></p>
|
||||
<router-link class="signup" to="/signup">%i18n:@signup%</router-link>
|
||||
</div>
|
||||
|
@ -24,8 +24,8 @@
|
||||
<option value="nav">%i18n:common.widgets.nav%</option>
|
||||
<option value="tips">%i18n:common.widgets.tips%</option>
|
||||
</select>
|
||||
<button @click="addWidget">追加</button>
|
||||
<p><a @click="hint">カスタマイズのヒント</a></p>
|
||||
<button @click="addWidget">%i18n:add-widget%</button>
|
||||
<p><a @click="hint">%i18n:customization-tips%</a></p>
|
||||
</header>
|
||||
<x-draggable
|
||||
:list="widgets"
|
||||
@ -53,6 +53,7 @@
|
||||
import Vue from 'vue';
|
||||
import * as XDraggable from 'vuedraggable';
|
||||
import * as uuid from 'uuid';
|
||||
import * as config from '../../../config';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
@ -102,7 +103,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
document.title = '%i18n:common.name%';
|
||||
document.title = config.name;
|
||||
},
|
||||
|
||||
methods: {
|
||||
|
@ -47,6 +47,8 @@ export default function load() {
|
||||
if (config.localDriveCapacityMb == null) config.localDriveCapacityMb = 256;
|
||||
if (config.remoteDriveCapacityMb == null) config.remoteDriveCapacityMb = 8;
|
||||
|
||||
if (config.name == null) config.name = 'Misskey';
|
||||
|
||||
return Object.assign(config, mixin);
|
||||
}
|
||||
|
||||
|
@ -172,3 +172,6 @@ type: `textbox`
|
||||
}
|
||||
```
|
||||
メッセージの種類: `success`, `info`, `warning`, `error`。
|
||||
|
||||
## 投了する
|
||||
投了をするには、<a href="./api/endpoints/games/reversi/games/surrender">このエンドポイント</a>にリクエストします。
|
||||
|
@ -4,6 +4,8 @@
|
||||
|
||||
Error.stackTraceLimit = Infinity;
|
||||
|
||||
require('events').EventEmitter.defaultMaxListeners = 128;
|
||||
|
||||
import * as os from 'os';
|
||||
import * as cluster from 'cluster';
|
||||
import * as debug from 'debug';
|
||||
|
@ -1,5 +1,6 @@
|
||||
const { lib: emojilib } = require('emojilib');
|
||||
const JSDOM = require('jsdom');
|
||||
const jsdom = require('jsdom');
|
||||
const { JSDOM } = jsdom;
|
||||
import config from '../config';
|
||||
import { INote } from '../models/note';
|
||||
import { TextElement } from './parse';
|
||||
@ -17,6 +18,12 @@ const handlers: { [key: string]: (window: any, token: any, mentionedRemoteUsers:
|
||||
document.body.appendChild(b);
|
||||
},
|
||||
|
||||
motion({ document }, { big }) {
|
||||
const b = document.createElement('strong');
|
||||
b.textContent = big;
|
||||
document.body.appendChild(b);
|
||||
},
|
||||
|
||||
code({ document }, { code }) {
|
||||
const pre = document.createElement('pre');
|
||||
const inner = document.createElement('code');
|
||||
|
@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Bold
|
||||
* Big
|
||||
*/
|
||||
|
||||
export type TextElementBig = {
|
||||
|
20
src/mfm/parse/elements/motion.ts
Normal file
20
src/mfm/parse/elements/motion.ts
Normal file
@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Motion
|
||||
*/
|
||||
|
||||
export type TextElementMotion = {
|
||||
type: 'motion'
|
||||
content: string
|
||||
motion: string
|
||||
};
|
||||
|
||||
export default function(text: string) {
|
||||
const match = text.match(/^\(\(\((.+?)\)\)\)/) || text.match(/^<motion>(.+?)<\/motion>/);
|
||||
if (!match) return null;
|
||||
const motion = match[0];
|
||||
return {
|
||||
type: 'motion',
|
||||
content: motion,
|
||||
motion: match[1]
|
||||
} as TextElementMotion;
|
||||
}
|
@ -14,6 +14,7 @@ import { TextElementQuote } from './elements/quote';
|
||||
import { TextElementSearch } from './elements/search';
|
||||
import { TextElementTitle } from './elements/title';
|
||||
import { TextElementUrl } from './elements/url';
|
||||
import { TextElementMotion } from './elements/motion';
|
||||
|
||||
const elements = [
|
||||
require('./elements/big'),
|
||||
@ -27,7 +28,8 @@ const elements = [
|
||||
require('./elements/inline-code'),
|
||||
require('./elements/quote'),
|
||||
require('./elements/emoji'),
|
||||
require('./elements/search')
|
||||
require('./elements/search'),
|
||||
require('./elements/motion')
|
||||
].map(element => element.default as TextElementProcessor);
|
||||
|
||||
export type TextElement = { type: 'text', content: string }
|
||||
@ -42,7 +44,8 @@ export type TextElement = { type: 'text', content: string }
|
||||
| TextElementQuote
|
||||
| TextElementSearch
|
||||
| TextElementTitle
|
||||
| TextElementUrl;
|
||||
| TextElementUrl
|
||||
| TextElementMotion;
|
||||
export type TextElementProcessor = (text: string, i: number) => TextElement | TextElement[];
|
||||
|
||||
export default (source: string): TextElement[] => {
|
||||
|
@ -25,6 +25,7 @@ export interface IReversiGame {
|
||||
isStarted: boolean;
|
||||
isEnded: boolean;
|
||||
winnerId: mongo.ObjectID;
|
||||
surrendered: mongo.ObjectID;
|
||||
logs: Array<{
|
||||
at: Date;
|
||||
color: boolean;
|
||||
|
@ -7,6 +7,11 @@ export default async (job: bq.Job, done: any): Promise<void> => {
|
||||
await request(job.data.user, job.data.to, job.data.content);
|
||||
done();
|
||||
} catch (res) {
|
||||
if (!res.hasOwnProperty('statusCode')) {
|
||||
console.warn(`deliver failed (unknown): ${res}`);
|
||||
return done();
|
||||
}
|
||||
|
||||
if (res.statusCode == null) return done();
|
||||
if (res.statusCode >= 400 && res.statusCode < 500) {
|
||||
// HTTPステータスコード4xxはクライアントエラーであり、それはつまり
|
||||
|
59
src/server/api/endpoints/games/reversi/games/surrender.ts
Normal file
59
src/server/api/endpoints/games/reversi/games/surrender.ts
Normal file
@ -0,0 +1,59 @@
|
||||
import $ from 'cafy'; import ID from '../../../../../../misc/cafy-id';
|
||||
import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
|
||||
import { ILocalUser } from '../../../../../../models/user';
|
||||
import getParams from '../../../../get-params';
|
||||
import { publishReversiGameStream } from '../../../../../../stream';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
ja: '指定したリバーシの対局で投了します。'
|
||||
},
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
params: {
|
||||
gameId: $.type(ID).note({
|
||||
desc: {
|
||||
ja: '投了したい対局'
|
||||
}
|
||||
})
|
||||
}
|
||||
};
|
||||
|
||||
export default (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
const game = await ReversiGame.findOne({ _id: ps.gameId });
|
||||
|
||||
if (game == null) {
|
||||
return rej('game not found');
|
||||
}
|
||||
|
||||
if (game.isEnded) {
|
||||
return rej('this game is already ended');
|
||||
}
|
||||
|
||||
if (!game.user1Id.equals(user._id) && !game.user2Id.equals(user._id)) {
|
||||
return rej('access denied');
|
||||
}
|
||||
|
||||
const winnerId = game.user1Id.equals(user._id) ? game.user2Id : game.user1Id;
|
||||
|
||||
await ReversiGame.update({
|
||||
_id: game._id
|
||||
}, {
|
||||
$set: {
|
||||
surrendered: user._id,
|
||||
isEnded: true,
|
||||
winnerId: winnerId
|
||||
}
|
||||
});
|
||||
|
||||
publishReversiGameStream(game._id, 'ended', {
|
||||
winnerId: winnerId,
|
||||
game: await pack(game._id, user)
|
||||
});
|
||||
|
||||
res();
|
||||
});
|
@ -1,33 +1,156 @@
|
||||
import $ from 'cafy';
|
||||
import User, { pack, ILocalUser } from '../../../../models/user';
|
||||
const escapeRegexp = require('escape-regexp');
|
||||
import User, { pack, ILocalUser, validateUsername, IUser } from '../../../../models/user';
|
||||
import getParams from '../../get-params';
|
||||
|
||||
export const meta = {
|
||||
desc: {
|
||||
ja: 'ユーザーを検索します。'
|
||||
},
|
||||
|
||||
requireCredential: false,
|
||||
|
||||
params: {
|
||||
query: $.str.note({
|
||||
desc: {
|
||||
ja: 'クエリ'
|
||||
}
|
||||
}),
|
||||
|
||||
offset: $.num.optional.min(0).note({
|
||||
default: 0,
|
||||
desc: {
|
||||
ja: 'オフセット'
|
||||
}
|
||||
}),
|
||||
|
||||
limit: $.num.optional.range(1, 100).note({
|
||||
default: 10,
|
||||
desc: {
|
||||
ja: '取得する数'
|
||||
}
|
||||
}),
|
||||
|
||||
localOnly: $.bool.optional.note({
|
||||
default: false,
|
||||
desc: {
|
||||
ja: 'ローカルユーザーのみ検索対象にするか否か'
|
||||
}
|
||||
}),
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* Search a user
|
||||
*/
|
||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
// Get 'query' parameter
|
||||
const [query, queryError] = $.str.pipe(x => x != '').get(params.query);
|
||||
if (queryError) return rej('invalid query param');
|
||||
const [ps, psErr] = getParams(meta, params);
|
||||
if (psErr) return rej(psErr);
|
||||
|
||||
// Get 'max' parameter
|
||||
const [max = 10, maxErr] = $.num.optional.range(1, 30).get(params.max);
|
||||
if (maxErr) return rej('invalid max param');
|
||||
const isUsername = validateUsername(ps.query.replace('@', ''));
|
||||
|
||||
const escapedQuery = escapeRegexp(query);
|
||||
let users: IUser[] = [];
|
||||
|
||||
// Search users
|
||||
const users = await User
|
||||
.find({
|
||||
host: null,
|
||||
$or: [{
|
||||
usernameLower: new RegExp(escapedQuery.replace('@', '').toLowerCase())
|
||||
if (isUsername) {
|
||||
users = await User
|
||||
.find({
|
||||
host: null,
|
||||
usernameLower: new RegExp('^' + escapeRegexp(ps.query.replace('@', '').toLowerCase()))
|
||||
}, {
|
||||
name: new RegExp(escapedQuery)
|
||||
}]
|
||||
}, {
|
||||
limit: max
|
||||
});
|
||||
limit: ps.limit,
|
||||
skip: ps.offset
|
||||
});
|
||||
|
||||
if (users.length < ps.limit && !ps.localOnly) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
host: { $ne: null },
|
||||
usernameLower: new RegExp('^' + escapeRegexp(ps.query.replace('@', '').toLowerCase()))
|
||||
}, {
|
||||
limit: ps.limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
if (users.length < ps.limit) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: null,
|
||||
usernameLower: new RegExp(escapeRegexp(ps.query.replace('@', '').toLowerCase()))
|
||||
}, {
|
||||
limit: ps.limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
if (users.length < ps.limit && !ps.localOnly) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: { $ne: null },
|
||||
usernameLower: new RegExp(escapeRegexp(ps.query.replace('@', '').toLowerCase()))
|
||||
}, {
|
||||
limit: ps.limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
}
|
||||
|
||||
if (users.length < ps.limit) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: null,
|
||||
name: new RegExp('^' + escapeRegexp(ps.query.toLowerCase()))
|
||||
}, {
|
||||
limit: ps.limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
if (users.length < ps.limit && !ps.localOnly) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: { $ne: null },
|
||||
name: new RegExp('^' + escapeRegexp(ps.query.toLowerCase()))
|
||||
}, {
|
||||
limit: ps.limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
if (users.length < ps.limit) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: null,
|
||||
name: new RegExp(escapeRegexp(ps.query.toLowerCase()))
|
||||
}, {
|
||||
limit: ps.limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
if (users.length < ps.limit && !ps.localOnly) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: { $ne: null },
|
||||
name: new RegExp(escapeRegexp(ps.query.toLowerCase()))
|
||||
}, {
|
||||
limit: ps.limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
// Serialize
|
||||
res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
|
||||
|
@ -1,70 +0,0 @@
|
||||
import $ from 'cafy';
|
||||
import User, { pack, ILocalUser } from '../../../../models/user';
|
||||
const escapeRegexp = require('escape-regexp');
|
||||
|
||||
/**
|
||||
* Search a user by username
|
||||
*/
|
||||
export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
|
||||
// Get 'query' parameter
|
||||
const [query, queryError] = $.str.get(params.query);
|
||||
if (queryError) return rej('invalid query param');
|
||||
|
||||
// Get 'offset' parameter
|
||||
const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
|
||||
if (offsetErr) return rej('invalid offset param');
|
||||
|
||||
// Get 'limit' parameter
|
||||
const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
|
||||
if (limitErr) return rej('invalid limit param');
|
||||
|
||||
let users = await User
|
||||
.find({
|
||||
host: null,
|
||||
usernameLower: new RegExp('^' + escapeRegexp(query.toLowerCase()))
|
||||
}, {
|
||||
limit: limit,
|
||||
skip: offset
|
||||
});
|
||||
|
||||
if (users.length < limit) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
host: { $ne: null },
|
||||
usernameLower: new RegExp('^' + escapeRegexp(query.toLowerCase()))
|
||||
}, {
|
||||
limit: limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
if (users.length < limit) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: null,
|
||||
usernameLower: new RegExp(escapeRegexp(query.toLowerCase()))
|
||||
}, {
|
||||
limit: limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
if (users.length < limit) {
|
||||
const otherUsers = await User
|
||||
.find({
|
||||
_id: { $nin: users.map(u => u._id) },
|
||||
host: { $ne: null },
|
||||
usernameLower: new RegExp(escapeRegexp(query.toLowerCase()))
|
||||
}, {
|
||||
limit: limit - users.length
|
||||
});
|
||||
|
||||
users = users.concat(otherUsers);
|
||||
}
|
||||
|
||||
// Serialize
|
||||
res(await Promise.all(users.map(user => pack(user, me, { detail: true }))));
|
||||
});
|
@ -11,7 +11,7 @@ const handler = new EventEmitter();
|
||||
|
||||
let bot: IUser;
|
||||
|
||||
const post = async (text: string) => {
|
||||
const post = async (text: string, home = true) => {
|
||||
if (bot == null) {
|
||||
const account = await User.findOne({
|
||||
usernameLower: config.github_bot.username.toLowerCase()
|
||||
@ -25,7 +25,7 @@ const post = async (text: string) => {
|
||||
}
|
||||
}
|
||||
|
||||
createNote(bot, { text, visibility: 'home' });
|
||||
createNote(bot, { text, visibility: home ? 'home' : 'public' });
|
||||
};
|
||||
|
||||
// Init router
|
||||
@ -130,7 +130,7 @@ handler.on('issue_comment', event => {
|
||||
|
||||
handler.on('watch', event => {
|
||||
const sender = event.sender;
|
||||
post(`⭐️ Starred by **${sender.login}** ⭐️`);
|
||||
post(`(((⭐️))) Starred by **${sender.login}** (((⭐️)))`, false);
|
||||
});
|
||||
|
||||
handler.on('fork', event => {
|
||||
|
@ -103,6 +103,24 @@ export default async (user: IUser, data: Option, silent = false) => new Promise<
|
||||
data.visibleUsers = data.visibleUsers.filter(x => x != null);
|
||||
}
|
||||
|
||||
if (data.reply && data.reply.deletedAt != null) {
|
||||
return rej();
|
||||
}
|
||||
|
||||
if (data.renote && data.renote.deletedAt != null) {
|
||||
return rej();
|
||||
}
|
||||
|
||||
// リプライ先が自分以外の非公開の投稿なら禁止
|
||||
if (data.reply && data.reply.visibility == 'private' && !data.reply.userId.equals(user._id)) {
|
||||
return rej();
|
||||
}
|
||||
|
||||
// Renote先が自分以外の非公開の投稿なら禁止
|
||||
if (data.renote && data.renote.visibility == 'private' && !data.renote.userId.equals(user._id)) {
|
||||
return rej();
|
||||
}
|
||||
|
||||
if (data.text) {
|
||||
data.text = data.text.trim();
|
||||
}
|
||||
|
16
test/mfm.ts
16
test/mfm.ts
@ -34,11 +34,25 @@ describe('Text', () => {
|
||||
it('big', () => {
|
||||
const tokens = analyze('***Strawberry*** Pasta');
|
||||
assert.deepEqual([
|
||||
{ type: 'big', content: '***Strawberry***', bold: 'Strawberry' },
|
||||
{ type: 'big', content: '***Strawberry***', big: 'Strawberry' },
|
||||
{ type: 'text', content: ' Pasta' }
|
||||
], tokens);
|
||||
});
|
||||
|
||||
it('motion', () => {
|
||||
const tokens1 = analyze('(((Strawberry))) Pasta');
|
||||
assert.deepEqual([
|
||||
{ type: 'motion', content: '(((Strawberry)))', motion: 'Strawberry' },
|
||||
{ type: 'text', content: ' Pasta' }
|
||||
], tokens1);
|
||||
|
||||
const tokens2 = analyze('<motion>Strawberry</motion> Pasta');
|
||||
assert.deepEqual([
|
||||
{ type: 'motion', content: '<motion>Strawberry</motion>', motion: 'Strawberry' },
|
||||
{ type: 'text', content: ' Pasta' }
|
||||
], tokens2);
|
||||
});
|
||||
|
||||
it('mention', () => {
|
||||
const tokens = analyze('@himawari お腹ペコい');
|
||||
assert.deepEqual([
|
||||
|
Reference in New Issue
Block a user