Compare commits
241 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 255c07d1ab | |||
| 0aa9201770 | |||
| 534e43f72d | |||
| 8f50080647 | |||
| cdc70875e5 | |||
| e6962d6fab | |||
| 3703563939 | |||
| e81b145735 | |||
| 7f4145ee56 | |||
| 3967cf40b3 | |||
| 84b0d56c4c | |||
| e081d8d4ca | |||
| b6ad7149d8 | |||
| 0f36f60cb4 | |||
| 1284eef9e2 | |||
| dec264ee6a | |||
| e25e1d88d6 | |||
| 60a7f7f146 | |||
| 897f7a031d | |||
| 4feff8835c | |||
| 8dfd892b71 | |||
| 9e8cfd76c8 | |||
| a6a4bb6599 | |||
| 5ca8a0d886 | |||
| 6840496791 | |||
| 0128831649 | |||
| 56fa24e401 | |||
| e011870a60 | |||
| 8d78ee08c1 | |||
| 2752319e50 | |||
| a26c19cbd2 | |||
| f14571dc42 | |||
| 484d17f53f | |||
| 924119651a | |||
| c6d49dacbc | |||
| 0be790fa31 | |||
| b7f6eb8290 | |||
| f1bda0b2e1 | |||
| bae44b4708 | |||
| 35115607bc | |||
| 51255bb446 | |||
| bd758a156e | |||
| 51929fb607 | |||
| 9599a31239 | |||
| 9fdb125960 | |||
| 534c0a6001 | |||
| 58bfcfda91 | |||
| 8d0802f05d | |||
| 5cd8c5d229 | |||
| fa3c4436d9 | |||
| d32d95918c | |||
| 34899757d5 | |||
| 111dbdcd7f | |||
| 0c38509f1c | |||
| 652aa1f69b | |||
| dc380c38da | |||
| 8555e04f50 | |||
| c23bbf81f1 | |||
| 7dd7de8ff6 | |||
| 2ca8bafde3 | |||
| 79f6c3f1ca | |||
| fce0b315cf | |||
| 56c7a8f2e4 | |||
| 5ef2f157f2 | |||
| 738afbe475 | |||
| 791a81a4c7 | |||
| aa82d7a2c9 | |||
| f57d2e54d2 | |||
| fea1a2e51b | |||
| bda5347f1e | |||
| 98d9c37922 | |||
| e3bde41a25 | |||
| 5fb2f7749d | |||
| a56bdf2372 | |||
| 9d991df32f | |||
| c4a3f89d1c | |||
| ea223bab51 | |||
| dd94392317 | |||
| baa2845916 | |||
| 97ae4ea13e | |||
| d1c5f0c70f | |||
| 95bff3005f | |||
| c0b06496b1 | |||
| 2105e1f259 | |||
| e546414c2f | |||
| 1f4660a930 | |||
| a2165c2e01 | |||
| 1af920739f | |||
| 868e8228f0 | |||
| 2bbc74560d | |||
| 5d2caa456d | |||
| 9069a99a15 | |||
| fa56a44d85 | |||
| 248acaee75 | |||
| ef75f12abe | |||
| 854814c226 | |||
| b6a322f447 | |||
| 161b9602f4 | |||
| 62669bff07 | |||
| 02bd299714 | |||
| f71dabfbfa | |||
| 8d31cedafc | |||
| a88d6c1c47 | |||
| d35a13fc0b | |||
| 8e4029c1cd | |||
| 9a9f852540 | |||
| c66497a4de | |||
| 1f9ecbf0be | |||
| 423a6f7013 | |||
| ef0ca38362 | |||
| ae9bfd69b0 | |||
| 3d231c3456 | |||
| 95d0d0047a | |||
| d05aee19f2 | |||
| 125765faa6 | |||
| 70c0b1d8c0 | |||
| 72e8660ae3 | |||
| 2127bf32c2 | |||
| 2b9acc239e | |||
| 47a6188097 | |||
| 8abce1469a | |||
| 8a2bee2136 | |||
| e7a532f0cc | |||
| 2cb1678577 | |||
| d249bc6575 | |||
| e409b45873 | |||
| f2d26c1909 | |||
| 898e3d7138 | |||
| 78cc0f7b6f | |||
| b14ca6a464 | |||
| 4691c1259a | |||
| 69f07cb015 | |||
| a426f4c7bd | |||
| 3430a2d093 | |||
| 4ecc8c799d | |||
| fa02a58fc4 | |||
| 2905d172b8 | |||
| 5f6e5e4c8b | |||
| d68c2a0170 | |||
| 76c7ad5e24 | |||
| 1cf65a0145 | |||
| 0c8602f1d5 | |||
| 2dc4990804 | |||
| 47ecd2e900 | |||
| 01d8e9cf4e | |||
| da52f980c4 | |||
| 366b7ef946 | |||
| 0e7c0fd528 | |||
| fb28b238cf | |||
| b375bbc75c | |||
| 74ebd6e4a0 | |||
| 72f2b92d4f | |||
| 178eeec041 | |||
| 7ff950b5e3 | |||
| 11409b723e | |||
| a59c8b4f57 | |||
| 690e273257 | |||
| 0133a1ba97 | |||
| 809b0e67a6 | |||
| a702271efd | |||
| ec4f8ddd3e | |||
| 839f66c82f | |||
| 9ae2775452 | |||
| c9818358ee | |||
| 6e3a88ffcb | |||
| 4c54d68fad | |||
| c351ba7820 | |||
| 3c2d72f611 | |||
| f557407589 | |||
| a0a4ce4dd9 | |||
| 281971f4a4 | |||
| 12b13e974c | |||
| 9d27fa7eaa | |||
| 9f1385b03a | |||
| 8c019a6d0b | |||
| 87faf5942c | |||
| 8c9977c136 | |||
| 1ffa66af4f | |||
| 3d5d2de80b | |||
| 12c313235e | |||
| c63acba0a5 | |||
| 5aaf8e6308 | |||
| f7d6d41a90 | |||
| 0d79a41527 | |||
| fef8c14586 | |||
| 1bfd4cfc34 | |||
| a8e48e06a1 | |||
| d59dd7e44a | |||
| e5431648fd | |||
| 2ddbca4641 | |||
| d944827f3d | |||
| bd01d81d1d | |||
| 9d52bd9ae8 | |||
| 4f782ac219 | |||
| 77377ba63f | |||
| 6afb985121 | |||
| 47fb538311 | |||
| 5644a2ff0b | |||
| c87aeb6cc4 | |||
| 37ce882337 | |||
| afc2efee1b | |||
| 8f79f862b9 | |||
| 016386b350 | |||
| ab16fb3a3f | |||
| 973b1e42ef | |||
| bd1f3a2f01 | |||
| 5d82443389 | |||
| 43eb8bd99b | |||
| 06e77a4f16 | |||
| 0ca2c313ec | |||
| c0b70e87bc | |||
| 5a76716b5a | |||
| 3f9e5fffbe | |||
| 90346a6b5f | |||
| 57fda16c9c | |||
| ae409bdaea | |||
| a560427b95 | |||
| cd57d7035a | |||
| 7753e8f169 | |||
| e352832096 | |||
| 63cc7b5a75 | |||
| 753176588f | |||
| 10c1296a7c | |||
| 76b5c32e31 | |||
| abe14c1665 | |||
| ba1b1a73b6 | |||
| f0b86edb53 | |||
| ce0f405d1e | |||
| f1af362117 | |||
| d2b1b30ef5 | |||
| aa9b8a7ca5 | |||
| e3bd8b1c21 | |||
| 3b67350e8c | |||
| 4db098d01d | |||
| 1133b340e9 | |||
| 4bf5a28804 | |||
| 1872fd4547 | |||
| dc6c5104d4 | |||
| 3a3f3f7663 | |||
| e8b14d5570 | |||
| 9aed2632f7 |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.3 KiB |
@@ -47,7 +47,14 @@ You need to generate config file via `npm run config` command.
|
|||||||
|
|
||||||
*5.* Build Misskey
|
*5.* Build Misskey
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
We need to use `node-gyp` to build the `crypto` module.
|
|
||||||
|
Build misskey with the following:
|
||||||
|
|
||||||
|
`npm run build`
|
||||||
|
|
||||||
|
If you're on Debian, you will need to install the `build-essential` package.
|
||||||
|
|
||||||
|
If you're still encountering errors about some modules, use node-gyp:
|
||||||
|
|
||||||
1. `npm install -g node-gyp`
|
1. `npm install -g node-gyp`
|
||||||
2. `node-gyp configure`
|
2. `node-gyp configure`
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "Deutsch"
|
lang: "Deutsch"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Teile alles mit anderen mithilfe von Misskey"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "Unbekannt"
|
unknown: "Unbekannt"
|
||||||
future: "Zukunft"
|
future: "Zukunft"
|
||||||
@@ -33,32 +35,40 @@ common:
|
|||||||
angry: "Wütend"
|
angry: "Wütend"
|
||||||
confused: "Verwirrt"
|
confused: "Verwirrt"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "Was machst du gerade?"
|
||||||
|
b: "Was ist so passiert?"
|
||||||
|
c: "Was geht dir durch den Kopf?"
|
||||||
|
d: "Willst du etwas sagen?"
|
||||||
|
e: "Schreib hier etwas!"
|
||||||
|
f: "Warte darauf, das du schreibst."
|
||||||
delete: "Löschen"
|
delete: "Löschen"
|
||||||
loading: "Laden"
|
loading: "Laden"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
||||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||||
widgets:
|
widgets:
|
||||||
profile: "プロフィール"
|
analog-clock: "Analoge Uhr"
|
||||||
calendar: "カレンダー"
|
profile: "Profil"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
calendar: "Kalender"
|
||||||
activity: "アクティビティ"
|
timemachine: "Kalender (Zeitmaschiene)"
|
||||||
rss: "RSSリーダー"
|
activity: "Aktivitäten"
|
||||||
memo: "メモ"
|
rss: "RSS Leser"
|
||||||
trends: "トレンド"
|
memo: "Notizen"
|
||||||
photo-stream: "フォトストリーム"
|
trends: "Trends"
|
||||||
slideshow: "スライドショー"
|
photo-stream: "Bilder"
|
||||||
version: "バージョン"
|
slideshow: "Diashow"
|
||||||
|
version: "Version"
|
||||||
broadcast: "ブロードキャスト"
|
broadcast: "ブロードキャスト"
|
||||||
notifications: "通知"
|
notifications: "Benachrichtigungen"
|
||||||
users: "おすすめユーザー"
|
users: "Empfohlene Benutzer"
|
||||||
polls: "投票"
|
polls: "Umfragen"
|
||||||
post-form: "投稿フォーム"
|
post-form: "投稿フォーム"
|
||||||
messaging: "メッセージ"
|
messaging: "Nachrichten"
|
||||||
server: "サーバー情報"
|
server: "Server-Info"
|
||||||
donation: "寄付のお願い"
|
donation: "Spenden"
|
||||||
nav: "ナビゲーション"
|
nav: "Navigation"
|
||||||
tips: "ヒント"
|
tips: "Tipps"
|
||||||
common/views/components/connect-failed.vue:
|
common/views/components/connect-failed.vue:
|
||||||
title: "Verbindung zum Server ist fehlgeschlagen"
|
title: "Verbindung zum Server ist fehlgeschlagen"
|
||||||
description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal."
|
description: "Es gibt entweder ein Problem mit deiner Internetverbindung, der Server ist nicht erreichbar oder wird gerade gewartet. Bitte versuche es später noch einmal."
|
||||||
@@ -113,8 +123,8 @@ common/views/components/nav.vue:
|
|||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
favorite: "Diese Anmerkung favorisieren"
|
favorite: "Diese Anmerkung favorisieren"
|
||||||
pin: "An die Profilseite pinnen"
|
pin: "An die Profilseite pinnen"
|
||||||
delete: "削除"
|
delete: "Löschen"
|
||||||
delete-confirm: "この投稿を削除しますか?"
|
delete-confirm: "Diesen Post löschen?"
|
||||||
remote: "Auf Quelle anzeigen"
|
remote: "Auf Quelle anzeigen"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Stimme für '{}'"
|
vote-to: "Stimme für '{}'"
|
||||||
@@ -175,14 +185,14 @@ common/views/components/twitter-setting.vue:
|
|||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
waiting: "Warten"
|
waiting: "Warten"
|
||||||
common/views/components/visibility-chooser.vue:
|
common/views/components/visibility-chooser.vue:
|
||||||
public: "公開"
|
public: "Öffentlich"
|
||||||
home: "ホーム"
|
home: "Home"
|
||||||
home-desc: "ホームタイムラインにのみ公開"
|
home-desc: "ホームタイムラインにのみ公開"
|
||||||
followers: "フォロワー"
|
followers: "Folgende"
|
||||||
followers-desc: "自分のフォロワーにのみ公開"
|
followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
|
||||||
specified: "ダイレクト"
|
specified: "Direkt"
|
||||||
specified-desc: "指定したユーザーにのみ公開"
|
specified-desc: "Poste nur für bestimmte Benutzer"
|
||||||
private: "非公開"
|
private: "Privat"
|
||||||
common/views/widgets/broadcast.vue:
|
common/views/widgets/broadcast.vue:
|
||||||
fetching: "Laden"
|
fetching: "Laden"
|
||||||
no-broadcasts: "Keine Broadcasts"
|
no-broadcasts: "Keine Broadcasts"
|
||||||
@@ -198,9 +208,9 @@ common/views/widgets/server.vue:
|
|||||||
title: "Serverinformationen"
|
title: "Serverinformationen"
|
||||||
toggle: "Sicht umschalten"
|
toggle: "Sicht umschalten"
|
||||||
common/views/widgets/memo.vue:
|
common/views/widgets/memo.vue:
|
||||||
title: "メモ"
|
title: "Notizen"
|
||||||
memo: "ここに書いて!"
|
memo: "Schreib hier!"
|
||||||
save: "保存"
|
save: "Speichern"
|
||||||
desktop/views/components/activity.chart.vue:
|
desktop/views/components/activity.chart.vue:
|
||||||
total: "Schwarz ... komplett"
|
total: "Schwarz ... komplett"
|
||||||
notes: "Blau ... Hinweise"
|
notes: "Blau ... Hinweise"
|
||||||
@@ -239,29 +249,29 @@ desktop/views/components/drive.file.vue:
|
|||||||
copy-url: "URL kopieren"
|
copy-url: "URL kopieren"
|
||||||
download: "Download"
|
download: "Download"
|
||||||
else-files: "その他..."
|
else-files: "その他..."
|
||||||
set-as-avatar: "アイコンに設定"
|
set-as-avatar: "Als Avatar festlegen"
|
||||||
set-as-banner: "バナーに設定"
|
set-as-banner: "Setze als Banner"
|
||||||
open-in-app: "アプリで開く"
|
open-in-app: "In der App öffnen"
|
||||||
add-app: "アプリを追加"
|
add-app: "App hinzufügen"
|
||||||
rename-file: "ファイル名の変更"
|
rename-file: "Datei umbennen"
|
||||||
input-new-file-name: "新しいファイル名を入力してください"
|
input-new-file-name: "Geben Sie den neuen Dateinamen an"
|
||||||
copied: "コピー完了"
|
copied: "Kopieren erfolgreich"
|
||||||
copied-url-to-clipboard: "URLをクリップボードにコピーしました"
|
copied-url-to-clipboard: "URL wurde in die Zwischenablage kopiert"
|
||||||
desktop/views/components/drive.folder.vue:
|
desktop/views/components/drive.folder.vue:
|
||||||
unable-to-process: "操作を完了できません"
|
unable-to-process: "Der Vorgang konnte nicht beendet werden"
|
||||||
circular-reference-detected: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。"
|
circular-reference-detected: "Das Zielverzeichnis ist ein Unterverzeichnis des Verzeichnisses welches du verschieben möchtest"
|
||||||
unhandled-error: "不明なエラー"
|
unhandled-error: "Unbekannter Fehler"
|
||||||
contextmenu:
|
contextmenu:
|
||||||
move-to-this-folder: "このフォルダへ移動"
|
move-to-this-folder: "Verschiebe in diesen Ordner"
|
||||||
show-in-new-window: "新しいウィンドウで表示"
|
show-in-new-window: "In einem neuen Fenster anzeigen"
|
||||||
rename: "名前を変更"
|
rename: "Umbenennen"
|
||||||
rename-folder: "フォルダ名の変更"
|
rename-folder: "Ordner umbenennen"
|
||||||
input-new-folder-name: "新しいフォルダ名を入力してください"
|
input-new-folder-name: "Namen für neuen Ordner eingeben"
|
||||||
desktop/views/components/drive.nav-folder.vue:
|
desktop/views/components/drive.nav-folder.vue:
|
||||||
drive: "ドライブ"
|
drive: "Laufwerk"
|
||||||
desktop/views/components/drive.vue:
|
desktop/views/components/drive.vue:
|
||||||
search: "検索"
|
search: "Suchen"
|
||||||
load-more: "もっと読み込む"
|
load-more: "Mehr laden"
|
||||||
empty-draghover: "Herzlich Willkommen!"
|
empty-draghover: "Herzlich Willkommen!"
|
||||||
empty-drive: "Dein Speicher ist leer"
|
empty-drive: "Dein Speicher ist leer"
|
||||||
empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen."
|
empty-drive-description: "Du kannst rechts klicken und \"Datei hochladen\" auswählen oder eine Datei per Drag and Drop auf das Fenster ziehen."
|
||||||
@@ -280,12 +290,14 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "Eine Datei hochladen"
|
upload: "Eine Datei hochladen"
|
||||||
url-upload: "Von einer URL hochladen"
|
url-upload: "Von einer URL hochladen"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
empty: "フォロワーはいないようです。"
|
empty: "Dir scheint niemand zu folgen."
|
||||||
desktop/views/components/following-window.vue:
|
desktop/views/components/following-window.vue:
|
||||||
following: "{} のフォロー"
|
following: "{} のフォロー"
|
||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "Ort"
|
location: "Ort"
|
||||||
renote: "Anmerkung"
|
renote: "Anmerkung"
|
||||||
add-reaction: "Reaktion hinzufügen"
|
add-reaction: "Reaktion hinzufügen"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "Auch geteilt von"
|
reposted-by: "Auch geteilt von"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
renote: "Anmerken"
|
renote: "Anmerken"
|
||||||
add-reaction: "Eine Reaktion hinzufügen"
|
add-reaction: "Eine Reaktion hinzufügen"
|
||||||
detail: "Zeige Details"
|
detail: "Zeige Details"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "Laden fehlgeschlagen."
|
error: "Laden fehlgeschlagen."
|
||||||
retry: "Erneut versuchen"
|
retry: "Erneut versuchen"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "Mehr"
|
more: "Mehr"
|
||||||
empty: "Keine Benachrichtigungen"
|
empty: "Keine Benachrichtigungen"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "Was ist bei dir los?"
|
|
||||||
reply-placeholder: "Antworte auf diese Anmerkung..."
|
reply-placeholder: "Antworte auf diese Anmerkung..."
|
||||||
quote-placeholder: "Zitiere diese Anmerkung..."
|
quote-placeholder: "Zitiere diese Anmerkung..."
|
||||||
note: "Post"
|
submit: "投稿"
|
||||||
reply: "Antworten"
|
reply: "Antworten"
|
||||||
renote: "Anmerkung"
|
renote: "Anmerkung"
|
||||||
posted: "Gepostet!"
|
posted: "Gepostet!"
|
||||||
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
no-users: "ミュートしているユーザーはいません"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "Speicher"
|
drive: "Speicher"
|
||||||
favorites: "Favoriten"
|
favorites: "Favoriten"
|
||||||
lists: "Listen"
|
lists: "Listen"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "Anpassen"
|
customize: "Anpassen"
|
||||||
settings: "Einstellungen"
|
settings: "Einstellungen"
|
||||||
signout: "Ausloggen"
|
signout: "Ausloggen"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Einen neuen Post erstellen"
|
post: "Einen neuen Post erstellen"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Suchen"
|
placeholder: "Suchen"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "投稿がありません"
|
empty: "投稿がありません"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "すべて"
|
all: "すべて"
|
||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "English"
|
lang: "English"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Share everything with others using Misskey."
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within Fediverse (a universe where various social media platforms are organized) it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
|
||||||
time:
|
time:
|
||||||
unknown: "unknown"
|
unknown: "unknown"
|
||||||
future: "future"
|
future: "future"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "Angry"
|
angry: "Angry"
|
||||||
confused: "Confused"
|
confused: "Confused"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "What are you doing?"
|
||||||
|
b: "What's happening?"
|
||||||
|
c: "What’s on your mind?"
|
||||||
|
d: "Do you want to say something?"
|
||||||
|
e: "Write here!"
|
||||||
|
f: "Waiting for your writing."
|
||||||
delete: "Delete"
|
delete: "Delete"
|
||||||
loading: "Loading"
|
loading: "Loading"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
update-available: "A new version of Misskey is now available({newer}, current is {current}). Reload the page to apply the update."
|
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
|
||||||
my-token-regenerated: "Your token has been generated. You will now get logged out."
|
my-token-regenerated: "Your token has been renewed so you will be signed out."
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "Analog clock"
|
||||||
profile: "Profile"
|
profile: "Profile"
|
||||||
calendar: "Calendar"
|
calendar: "Calendar"
|
||||||
timemachine: "Calendar (Time Machine)"
|
timemachine: "Calendar (Time Machine)"
|
||||||
@@ -72,9 +82,9 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
checking-internet: "Checking internet connection"
|
checking-internet: "Checking internet connection"
|
||||||
server: "Server connection"
|
server: "Server connection"
|
||||||
checking-server: "Checking server connection"
|
checking-server: "Checking server connection"
|
||||||
finding: "Finding a problem"
|
finding: "Searching for issues"
|
||||||
no-network: "There is no Network connection"
|
no-network: "No connection"
|
||||||
no-network-desc: "Please make sure you are connected to the Network."
|
no-network-desc: "Please make sure you are connected to the network."
|
||||||
no-internet: "There is no Internet connection"
|
no-internet: "There is no Internet connection"
|
||||||
no-internet-desc: "Please make sure you are connected to the Internet."
|
no-internet-desc: "Please make sure you are connected to the Internet."
|
||||||
no-server: "Unable to connect to the Misskey server"
|
no-server: "Unable to connect to the Misskey server"
|
||||||
@@ -84,19 +94,19 @@ common/views/components/connect-failed.troubleshooter.vue:
|
|||||||
flush: "Clean cache"
|
flush: "Clean cache"
|
||||||
set-version: "Specify version"
|
set-version: "Specify version"
|
||||||
common/views/components/messaging.vue:
|
common/views/components/messaging.vue:
|
||||||
search-user: "Find an user"
|
search-user: "Find a user"
|
||||||
you: "You"
|
you: "You"
|
||||||
no-history: "No history"
|
no-history: "No history"
|
||||||
common/views/components/messaging-room.vue:
|
common/views/components/messaging-room.vue:
|
||||||
empty: "No conversations"
|
empty: "You haven't messaged this user"
|
||||||
more: "More"
|
more: "Read more"
|
||||||
no-history: "There is no more history"
|
no-history: "There is no more history"
|
||||||
resize-form: "Drag to resize"
|
resize-form: "Drag to resize"
|
||||||
new-message: "New message"
|
new-message: "New message"
|
||||||
common/views/components/messaging-room.form.vue:
|
common/views/components/messaging-room.form.vue:
|
||||||
input-message-here: "Enter message here"
|
input-message-here: "Enter message here"
|
||||||
send: "Send"
|
send: "Send"
|
||||||
attach-from-local: "Attach files from your pc"
|
attach-from-local: "Attach files from your PC"
|
||||||
attach-from-drive: "Attach files from your Drive"
|
attach-from-drive: "Attach files from your Drive"
|
||||||
common/views/components/messaging-room.message.vue:
|
common/views/components/messaging-room.message.vue:
|
||||||
is-read: "Read"
|
is-read: "Read"
|
||||||
@@ -128,7 +138,7 @@ common/views/components/poll-editor.vue:
|
|||||||
choice-n: "Choice {}"
|
choice-n: "Choice {}"
|
||||||
remove: "Remove this choice"
|
remove: "Remove this choice"
|
||||||
add: "+ Add a choice"
|
add: "+ Add a choice"
|
||||||
destroy: "Destroy this poll"
|
destroy: "Cancel this poll"
|
||||||
common/views/components/reaction-picker.vue:
|
common/views/components/reaction-picker.vue:
|
||||||
choose-reaction: "Choose a reaction"
|
choose-reaction: "Choose a reaction"
|
||||||
common/views/components/signin.vue:
|
common/views/components/signin.vue:
|
||||||
@@ -148,10 +158,10 @@ common/views/components/signup.vue:
|
|||||||
too-long: "Please enter up to 20 characters."
|
too-long: "Please enter up to 20 characters."
|
||||||
password: "Password"
|
password: "Password"
|
||||||
password-placeholder: "We recommend more than 8 characters."
|
password-placeholder: "We recommend more than 8 characters."
|
||||||
weak-password: "Weak"
|
weak-password: "Weak password"
|
||||||
normal-password: "So so"
|
normal-password: "Fair password"
|
||||||
strong-password: "Strong"
|
strong-password: "Strong password"
|
||||||
retype: "Type again"
|
retype: "Re-enter"
|
||||||
retype-placeholder: "Confirm your password"
|
retype-placeholder: "Confirm your password"
|
||||||
password-matched: "OK"
|
password-matched: "OK"
|
||||||
password-not-matched: "Doesn't match"
|
password-not-matched: "Doesn't match"
|
||||||
@@ -168,9 +178,9 @@ common/views/components/stream-indicator.vue:
|
|||||||
common/views/components/twitter-setting.vue:
|
common/views/components/twitter-setting.vue:
|
||||||
description: "If you connect your Twitter account to your Misskey account, you will be able to see your Twitter account information on your profile and you can sign-in using Twitter."
|
description: "If you connect your Twitter account to your Misskey account, you will be able to see your Twitter account information on your profile and you can sign-in using Twitter."
|
||||||
connected-to: "You are connected to this Twitter account"
|
connected-to: "You are connected to this Twitter account"
|
||||||
detail: "Detail..."
|
detail: "Details..."
|
||||||
reconnect: "Reconnect"
|
reconnect: "Reconnect"
|
||||||
connect: "Link your twitter account"
|
connect: "Link your Twitter account"
|
||||||
disconnect: "Disconnect"
|
disconnect: "Disconnect"
|
||||||
common/views/components/uploader.vue:
|
common/views/components/uploader.vue:
|
||||||
waiting: "Waiting"
|
waiting: "Waiting"
|
||||||
@@ -190,7 +200,7 @@ common/views/widgets/broadcast.vue:
|
|||||||
next: "Next"
|
next: "Next"
|
||||||
common/views/widgets/donation.vue:
|
common/views/widgets/donation.vue:
|
||||||
title: "Donation"
|
title: "Donation"
|
||||||
text: "To keep Misskey up and running we spend money for our domain name, servers and so on.. We don't get any money from it, and we would really appreciate it if you could donate. If you're interested contact {}. Thank you for your contribution!"
|
text: "To keep Misskey up and running we spend money for our domain name, servers and so on. Since we don't get money from advertisements, we count on donations from all of you. If you're interested contact {}. Thank you for your contribution!"
|
||||||
common/views/widgets/photo-stream.vue:
|
common/views/widgets/photo-stream.vue:
|
||||||
title: "Photostream"
|
title: "Photostream"
|
||||||
no-photos: "No photos"
|
no-photos: "No photos"
|
||||||
@@ -213,7 +223,7 @@ desktop/views/components/calendar.vue:
|
|||||||
title: "{1} / {2}"
|
title: "{1} / {2}"
|
||||||
prev: "Previous month"
|
prev: "Previous month"
|
||||||
next: "Next month"
|
next: "Next month"
|
||||||
go: "Click to naviguate"
|
go: "Click to navigate"
|
||||||
desktop/views/components/choose-file-from-drive-window.vue:
|
desktop/views/components/choose-file-from-drive-window.vue:
|
||||||
choose-file: "Choosing files"
|
choose-file: "Choosing files"
|
||||||
upload: "Upload files from your PC"
|
upload: "Upload files from your PC"
|
||||||
@@ -280,19 +290,21 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "Upload a file"
|
upload: "Upload a file"
|
||||||
url-upload: "Upload from a URL"
|
url-upload: "Upload from a URL"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "Unfollow"
|
unfollow: "Following"
|
||||||
follow: "Follow"
|
follow: "Follow"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "Follow request"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "Followers of {}"
|
followers: "{}'s followers"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
empty: "Seems that you don’t have any followers."
|
empty: "Seems like you don’t have any followers."
|
||||||
desktop/views/components/following-window.vue:
|
desktop/views/components/following-window.vue:
|
||||||
following: "Following of {}"
|
following: "Following {}"
|
||||||
desktop/views/components/following.vue:
|
desktop/views/components/following.vue:
|
||||||
empty: "You don’t follow anyone."
|
empty: "You don’t follow anyone."
|
||||||
desktop/views/components/friends-maker.vue:
|
desktop/views/components/friends-maker.vue:
|
||||||
title: "Recommended users:"
|
title: "Recommended users:"
|
||||||
empty: "Similar users weren’t found."
|
empty: "Couldn't find any recommended users."
|
||||||
fetching: "Loading…"
|
fetching: "Loading…"
|
||||||
refresh: "More"
|
refresh: "More"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
@@ -313,19 +325,18 @@ desktop/views/components/note-detail.vue:
|
|||||||
more: "Load more conversations"
|
more: "Load more conversations"
|
||||||
private: "this post is private"
|
private: "this post is private"
|
||||||
deleted: "this post has been deleted"
|
deleted: "this post has been deleted"
|
||||||
reposted-by: "Renoted by {}"
|
reposted-by: "Reposted by {}"
|
||||||
location: "Location"
|
location: "Location"
|
||||||
renote: "Renote"
|
renote: "Repost"
|
||||||
add-reaction: "Add a reaction"
|
add-reaction: "Add a reaction"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "this post is private"
|
|
||||||
deleted: "this post has been deleted"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "Reposted by {}"
|
reposted-by: "Reposted by {}"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
renote: "Renote"
|
renote: "Repost"
|
||||||
add-reaction: "Add a reaction"
|
add-reaction: "Add a reaction"
|
||||||
detail: "Show detail"
|
detail: "Show details"
|
||||||
|
private: "this post is private"
|
||||||
|
deleted: "this post has been deleted"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "Loading failed."
|
error: "Loading failed."
|
||||||
retry: "Retry"
|
retry: "Retry"
|
||||||
@@ -333,25 +344,24 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "More"
|
more: "More"
|
||||||
empty: "No notifications"
|
empty: "No notifications"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "What's happening?"
|
|
||||||
reply-placeholder: "Reply to this note..."
|
reply-placeholder: "Reply to this note..."
|
||||||
quote-placeholder: "Quote this note..."
|
quote-placeholder: "Quote this note..."
|
||||||
note: "Post"
|
submit: "Post"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
renote: "Renote"
|
renote: "Repost"
|
||||||
posted: "Posted!"
|
posted: "Posted!"
|
||||||
replied: "Replied!"
|
replied: "Replied!"
|
||||||
reposted: "Reposted!"
|
reposted: "Reposted!"
|
||||||
note-failed: "Failed to note"
|
note-failed: "Failed to note"
|
||||||
reply-failed: "Failed to reply"
|
reply-failed: "Failed to reply"
|
||||||
renote-failed: "Failed to renote"
|
renote-failed: "Failed to repost"
|
||||||
posting: "Posting"
|
posting: "Posting"
|
||||||
attach-media-from-local: "Attach media from your pc"
|
attach-media-from-local: "Attach media from your PC"
|
||||||
attach-media-from-drive: "Attach media from your Drive"
|
attach-media-from-drive: "Attach media from your Drive"
|
||||||
attach-cancel: "Cancel attachment"
|
attach-cancel: "Cancel attachment"
|
||||||
insert-a-kao: "v(‘ω’)v"
|
insert-a-kao: "v(‘ω’)v"
|
||||||
create-poll: "Create a poll"
|
create-poll: "Create a poll"
|
||||||
text-remain: "{} chars remaining"
|
text-remain: "{} characters remaining"
|
||||||
desktop/views/components/post-form-window.vue:
|
desktop/views/components/post-form-window.vue:
|
||||||
note: "New note"
|
note: "New note"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
@@ -362,12 +372,12 @@ desktop/views/components/progress-dialog.vue:
|
|||||||
desktop/views/components/renote-form.vue:
|
desktop/views/components/renote-form.vue:
|
||||||
quote: "Quote..."
|
quote: "Quote..."
|
||||||
cancel: "Cancel"
|
cancel: "Cancel"
|
||||||
renote: "Renote"
|
renote: "Repost"
|
||||||
reposting: "Reposting..."
|
reposting: "Reposting..."
|
||||||
success: "Reposted!"
|
success: "Reposted!"
|
||||||
failure: "Failed to Renote"
|
failure: "Repost failed"
|
||||||
desktop/views/components/renote-form-window.vue:
|
desktop/views/components/renote-form-window.vue:
|
||||||
title: "Are you sure you want to renote this note?"
|
title: "Are you sure you want to repost this?"
|
||||||
desktop/views/components/settings-window.vue:
|
desktop/views/components/settings-window.vue:
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
desktop/views/components/settings.vue:
|
desktop/views/components/settings.vue:
|
||||||
@@ -397,22 +407,22 @@ desktop/views/components/settings.vue:
|
|||||||
gradient-window-header: "Use gradients on window headers"
|
gradient-window-header: "Use gradients on window headers"
|
||||||
post-form-on-timeline: "Display post form at the top of the timeline"
|
post-form-on-timeline: "Display post form at the top of the timeline"
|
||||||
show-reply-target: "Display reply target"
|
show-reply-target: "Display reply target"
|
||||||
show-my-renotes: "Show my renote in the timeline"
|
show-my-renotes: "Show my reposts in the timeline"
|
||||||
show-renoted-my-notes: "Show renoted my post in the timeline"
|
show-renoted-my-notes: "Show my posts that have been shared in the timeline"
|
||||||
show-maps: "Show the map"
|
show-maps: "Show the map"
|
||||||
show-maps-desc: "Show the map of the location attached to the post."
|
show-maps-desc: "Automatically show the map of the location attached to the post."
|
||||||
sound: "Sound"
|
sound: "Sound"
|
||||||
enable-sounds: "Enable sound"
|
enable-sounds: "Enable sound"
|
||||||
enable-sounds-desc: "Play a sound when you received a post/message. This setting is stored in the browser."
|
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
test: "Test"
|
test: "Test"
|
||||||
mobile: "Mobile"
|
mobile: "Mobile"
|
||||||
disable-via-mobile: "Not mark the post as 'from mobile'"
|
disable-via-mobile: "Don't mark the post as 'from mobile'"
|
||||||
language: "Language"
|
language: "Language"
|
||||||
pick-language: "Select a language"
|
pick-language: "Select a language"
|
||||||
recommended: "Recommended"
|
recommended: "Recommended"
|
||||||
auto: "Auto"
|
auto: "Auto"
|
||||||
specify-language: "Specify the language"
|
specify-language: "Specify language"
|
||||||
language-desc: "You need to reload the page for the changes to take effect."
|
language-desc: "You need to reload the page for the changes to take effect."
|
||||||
cache: "Cache"
|
cache: "Cache"
|
||||||
clean-cache: "Cleanup"
|
clean-cache: "Cleanup"
|
||||||
@@ -430,11 +440,11 @@ desktop/views/components/settings.vue:
|
|||||||
do-update: "Check for update"
|
do-update: "Check for update"
|
||||||
update-settings: "Advanced settings"
|
update-settings: "Advanced settings"
|
||||||
prevent-update: "Postpone updates (not recommended)"
|
prevent-update: "Postpone updates (not recommended)"
|
||||||
prevent-update-desc: "You may reflect updates even if you select this setting. This setting is valid only this device."
|
prevent-update-desc: "Even if you turn this setting on updates may apply. This setting is valid only for this device."
|
||||||
no-updates: "No updates available"
|
no-updates: "No updates available"
|
||||||
no-updates-desc: "Your Misskey is up to date."
|
no-updates-desc: "Your Misskey is up to date."
|
||||||
update-available: "New version is available!"
|
update-available: "New version is available!"
|
||||||
update-available-desc: "To reload the page and updates are applied."
|
update-available-desc: "The updates will apply if you reload the page again."
|
||||||
advanced-settings: "Advanced"
|
advanced-settings: "Advanced"
|
||||||
debug-mode: "Enable the debug mode"
|
debug-mode: "Enable the debug mode"
|
||||||
debug-mode-desc: "This setting is stored in the browser."
|
debug-mode-desc: "This setting is stored in the browser."
|
||||||
@@ -468,8 +478,8 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "Regenerate the token"
|
regenerate-token: "Regenerate the token"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Please enter the password"
|
enter-password: "Please enter the password"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "No authorized apps"
|
no-apps: "No linked applications"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "No muted users"
|
no-users: "No muted users"
|
||||||
desktop/views/components/settings.password.vue:
|
desktop/views/components/settings.password.vue:
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
lists: "Lists"
|
lists: "Lists"
|
||||||
|
follow-requests: "Follow requests"
|
||||||
customize: "Customize"
|
customize: "Customize"
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
signout: "Sign out"
|
signout: "Sign out"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Compose new Post"
|
post: "Compose new Post"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Search"
|
placeholder: "Search"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "Follow requests"
|
||||||
|
accept: "Accept"
|
||||||
|
reject: "Reject"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "User lists"
|
||||||
create-list: "Create list"
|
create-list: "Create list"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Posts"
|
notes: "Posts"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "Popout"
|
popout: "Popout"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "about"
|
||||||
|
gotit: "Got it!"
|
||||||
signin: "Log In"
|
signin: "Log In"
|
||||||
signup: "Sign up"
|
signup: "Sign up"
|
||||||
signin-button: "Log in"
|
signin-button: "Log in"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "Post"
|
title: "Post"
|
||||||
note: "Post"
|
note: "Post"
|
||||||
placeholder: "What's happening?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "Click to edit your banner"
|
update-banner: "Click to edit your banner"
|
||||||
update-avatar: "Click to edit your avatar"
|
update-avatar: "Click to edit your avatar"
|
||||||
@@ -624,13 +641,13 @@ mobile/views/components/drive.vue:
|
|||||||
load-more: "Load more"
|
load-more: "Load more"
|
||||||
nothing-in-drive: "Nothing"
|
nothing-in-drive: "Nothing"
|
||||||
folder-is-empty: "This folder is empty"
|
folder-is-empty: "This folder is empty"
|
||||||
prompt: "何をしますか?(数字を入力してください): <1 → ファイルをアップロード | 2 → ファイルをURLでアップロード | 3 → フォルダ作成 | 4 → このフォルダ名を変更 | 5 → このフォルダを移動 | 6 → このフォルダを削除>"
|
prompt: "What do you want to do? (Please enter a number): <1 → Upload a file | 2 → Upload a file from a URL | 3 → Create a folder | 4 → Change this folder's name | 5 → Move this folder | 6 → Delete this folder>"
|
||||||
deletion-alert: "Sorry! Deleting a folder is not yet implemented."
|
deletion-alert: "Sorry! Deleting a folder is not yet implemented."
|
||||||
folder-name: "Folder name"
|
folder-name: "Folder name"
|
||||||
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
|
root-rename-alert: "You're in the root; it can't be renamed because it's not a folder. Navigate to a folder you want to rename and try again."
|
||||||
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
|
root-move-alert: "You're in the root; it can't be moved because it's not a folder. Navigate to a folder you want to move and try again."
|
||||||
url-prompt: "URL of file you want to upload"
|
url-prompt: "URL of file you want to upload"
|
||||||
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
uploading: "Upload requested. It may take some time for the upload to complete."
|
||||||
mobile/views/components/drive-file-detail.vue:
|
mobile/views/components/drive-file-detail.vue:
|
||||||
rename: "Rename"
|
rename: "Rename"
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "Following"
|
||||||
follow: "Follow"
|
follow: "Follow"
|
||||||
unfollow: "Unfollow"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "Follow request"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "Let's follow users"
|
title: "Let's follow users"
|
||||||
empty: "Featured user was not found."
|
empty: "Featured user was not found."
|
||||||
@@ -653,7 +672,7 @@ mobile/views/components/friends-maker.vue:
|
|||||||
refresh: "See more"
|
refresh: "See more"
|
||||||
close: "Close"
|
close: "Close"
|
||||||
mobile/views/components/note.vue:
|
mobile/views/components/note.vue:
|
||||||
reposted-by: "Renoted by {}"
|
reposted-by: "Reposted by {}"
|
||||||
more: "See more"
|
more: "See more"
|
||||||
less: "Hide"
|
less: "Hide"
|
||||||
private: "this post is private"
|
private: "this post is private"
|
||||||
@@ -662,7 +681,7 @@ mobile/views/components/note.vue:
|
|||||||
mobile/views/components/note-detail.vue:
|
mobile/views/components/note-detail.vue:
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
reaction: "Reaction"
|
reaction: "Reaction"
|
||||||
reposted-by: "Renoted by {}"
|
reposted-by: "Reposted by {}"
|
||||||
private: "this post is private"
|
private: "this post is private"
|
||||||
deleted: "this post has been deleted"
|
deleted: "this post has been deleted"
|
||||||
location: "Location"
|
location: "Location"
|
||||||
@@ -684,12 +703,11 @@ mobile/views/components/post-form.vue:
|
|||||||
add-visible-user: "Add a user"
|
add-visible-user: "Add a user"
|
||||||
submit: "Post"
|
submit: "Post"
|
||||||
reply: "Reply"
|
reply: "Reply"
|
||||||
renote: "Renote"
|
renote: "Repost"
|
||||||
renote-placeholder: "Quote this post. (optional)"
|
quote-placeholder: "Quote this post... (optional)"
|
||||||
reply-placeholder: "Reply to this note..."
|
reply-placeholder: "Reply to this note..."
|
||||||
note-placeholder: "What's happening?"
|
cw-placeholder: "Comments about content (optional)"
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
location-alert: "Your device does not support location services"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
|
||||||
error: "Error"
|
error: "Error"
|
||||||
username-prompt: "Enter user name"
|
username-prompt: "Enter user name"
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "No notes"
|
empty: "No notes"
|
||||||
load-more: "More"
|
load-more: "More"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "Home"
|
timeline: "Timeline"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
messaging: "Messages"
|
messaging: "Messages"
|
||||||
|
follow-requests: "Follow requests"
|
||||||
search: "Search"
|
search: "Search"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
favorites: "Favorites"
|
||||||
|
user-lists: "Lists"
|
||||||
|
widgets: "Widgets"
|
||||||
|
game: "Games"
|
||||||
|
darkmode: "Dark mode"
|
||||||
settings: "Settings"
|
settings: "Settings"
|
||||||
about: "About Misskey"
|
about: "About Misskey"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "All"
|
all: "All"
|
||||||
known: "You know"
|
known: "You know"
|
||||||
load-more: "More"
|
load-more: "More"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "Favorites"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "Lists"
|
||||||
|
enter-list-name: "Enter list name"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
more: "Load more"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "Followers of {}"
|
followers-of: "Followers of {}"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "Messaging"
|
messaging: "Messaging"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "Messaging"
|
messaging: "Messaging"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "Follow requests"
|
||||||
|
accept: "Accept"
|
||||||
|
reject: "Reject"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "Post"
|
title: "Post"
|
||||||
prev: "Previous note"
|
prev: "Previous note"
|
||||||
@@ -769,8 +803,8 @@ mobile/views/pages/settings.vue:
|
|||||||
circle-icons: "Use circle icons"
|
circle-icons: "Use circle icons"
|
||||||
timeline: "Timeline"
|
timeline: "Timeline"
|
||||||
show-reply-target: "Show reply target"
|
show-reply-target: "Show reply target"
|
||||||
show-my-renotes: "Show my renotes"
|
show-my-renotes: "Show my reposts"
|
||||||
show-renoted-my-notes: "Show renoted my notes"
|
show-renoted-my-notes: "Show my reposted posts"
|
||||||
post-style: "Post design"
|
post-style: "Post design"
|
||||||
post-style-standard: "Standard"
|
post-style-standard: "Standard"
|
||||||
post-style-smart: "Smart"
|
post-style-smart: "Smart"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "日本語"
|
lang: "日本語"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置情報"
|
location: "位置情報"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "読み込みに失敗しました。"
|
error: "読み込みに失敗しました。"
|
||||||
retry: "リトライ"
|
retry: "リトライ"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
quote-placeholder: "この投稿を引用..."
|
quote-placeholder: "この投稿を引用..."
|
||||||
note: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
no-users: "ミュートしているユーザーはいません"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "カスタマイズ"
|
customize: "カスタマイズ"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "新規投稿"
|
post: "新規投稿"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "投稿がありません"
|
empty: "投稿がありません"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "すべて"
|
all: "すべて"
|
||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "Français"
|
lang: "Français"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Partagez avec les autres en utilisant Misskey"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "inconnu"
|
unknown: "inconnu"
|
||||||
future: "future"
|
future: "future"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "En Colère"
|
angry: "En Colère"
|
||||||
confused: "Confus"
|
confused: "Confus"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
delete: "Supprimer"
|
delete: "Supprimer"
|
||||||
loading: "Chargement"
|
loading: "Chargement"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
update-available: "Une nouvelle version de Misskey est disponible({newer}, version actuelle: {current}). Recharger la page pour appliquer la mise à jour."
|
update-available: "Une nouvelle version de Misskey est disponible({newer}, version actuelle: {current}). Recharger la page pour appliquer la mise à jour."
|
||||||
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
|
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "Uploader un fichier"
|
upload: "Uploader un fichier"
|
||||||
url-upload: "Uploader d'un URL"
|
url-upload: "Uploader d'un URL"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置情報"
|
location: "位置情報"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "Reposté par {}"
|
reposted-by: "Reposté par {}"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "Ajouter votre reaction"
|
add-reaction: "Ajouter votre reaction"
|
||||||
detail: "Afficher les détails"
|
detail: "Afficher les détails"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "読み込みに失敗しました。"
|
error: "読み込みに失敗しました。"
|
||||||
retry: "リトライ"
|
retry: "リトライ"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "Plus"
|
more: "Plus"
|
||||||
empty: "Pas de notifications"
|
empty: "Pas de notifications"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "Qu'est-ce qui se passe?"
|
|
||||||
reply-placeholder: "Répondre à cette note"
|
reply-placeholder: "Répondre à cette note"
|
||||||
quote-placeholder: "Citer cette note"
|
quote-placeholder: "Citer cette note"
|
||||||
note: "Poster"
|
submit: "投稿"
|
||||||
reply: "Répondre"
|
reply: "Répondre"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "Posté!"
|
posted: "Posté!"
|
||||||
@@ -468,8 +478,8 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "Regenerer le token"
|
regenerate-token: "Regenerer le token"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Veuillez entrer le mot de passe"
|
enter-password: "Veuillez entrer le mot de passe"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "Aucune application authorisée"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "Aucun utilisateurs mis en sourdine"
|
no-users: "Aucun utilisateurs mis en sourdine"
|
||||||
desktop/views/components/settings.password.vue:
|
desktop/views/components/settings.password.vue:
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
favorites: "Favorites"
|
favorites: "Favorites"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "Modifications"
|
customize: "Modifications"
|
||||||
settings: "Réglages"
|
settings: "Réglages"
|
||||||
signout: "Déconnexion"
|
signout: "Déconnexion"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Composer un nouveau post"
|
post: "Composer un nouveau post"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Chercher"
|
placeholder: "Chercher"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "Post"
|
title: "Post"
|
||||||
note: "Post"
|
note: "Post"
|
||||||
placeholder: "Qu'est-ce qu'il se passe?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "Suivre"
|
follow: "Suivre"
|
||||||
unfollow: "Ne plus suivre"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "Poster"
|
submit: "Poster"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "Répondre à cette note"
|
reply-placeholder: "Répondre à cette note"
|
||||||
note-placeholder: "Qu'est-ce qu'il se passe?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "Pas de notes"
|
empty: "Pas de notes"
|
||||||
load-more: "Afficher plus"
|
load-more: "Afficher plus"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "Accueil"
|
timeline: "タイムライン"
|
||||||
notifications: "Notifications"
|
notifications: "Notifications"
|
||||||
messaging: "Messages"
|
messaging: "Messages"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "Rechercher"
|
search: "Rechercher"
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "Réglages"
|
settings: "Réglages"
|
||||||
about: "À propose de Misskey"
|
about: "À propose de Misskey"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "Tout"
|
all: "Tout"
|
||||||
known: "Vous connaissez"
|
known: "Vous connaissez"
|
||||||
load-more: "Afficher plus"
|
load-more: "Afficher plus"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Drive"
|
drive: "Drive"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "Abonnés de {}"
|
followers-of: "Abonnés de {}"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "Messagerie"
|
messaging: "Messagerie"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "Messagerie"
|
messaging: "Messagerie"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "Post"
|
title: "Post"
|
||||||
prev: "Note précedante"
|
prev: "Note précedante"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "日本語"
|
lang: "日本語"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置情報"
|
location: "位置情報"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "読み込みに失敗しました。"
|
error: "読み込みに失敗しました。"
|
||||||
retry: "リトライ"
|
retry: "リトライ"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
quote-placeholder: "この投稿を引用..."
|
quote-placeholder: "この投稿を引用..."
|
||||||
note: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
no-users: "ミュートしているユーザーはいません"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "カスタマイズ"
|
customize: "カスタマイズ"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "新規投稿"
|
post: "新規投稿"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "投稿がありません"
|
empty: "投稿がありません"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "すべて"
|
all: "すべて"
|
||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
divider: ""
|
divider: ""
|
||||||
|
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
|
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
@@ -37,6 +39,14 @@ common:
|
|||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
|
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
@@ -44,6 +54,7 @@ common:
|
|||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
|
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -320,8 +331,10 @@ desktop/views/components/drive.vue:
|
|||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
|
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
|
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
@@ -369,10 +382,6 @@ desktop/views/components/note-detail.vue:
|
|||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
|
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
@@ -391,10 +400,9 @@ desktop/views/components/notifications.vue:
|
|||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
|
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
quote-placeholder: "この投稿を引用..."
|
quote-placeholder: "この投稿を引用..."
|
||||||
note: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
@@ -545,7 +553,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
|
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
|
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
@@ -590,6 +598,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "カスタマイズ"
|
customize: "カスタマイズ"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@@ -609,7 +618,13 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
|
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
|
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
@@ -631,6 +646,8 @@ desktop/views/components/window.vue:
|
|||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
|
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -714,7 +731,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
@@ -764,8 +780,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
|
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
|
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
@@ -813,9 +831,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -832,11 +849,17 @@ mobile/views/components/timeline.vue:
|
|||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
|
|
||||||
@@ -850,8 +873,16 @@ mobile/views/components/users-list.vue:
|
|||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
|
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
|
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
@@ -870,6 +901,11 @@ mobile/views/pages/messaging.vue:
|
|||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
|
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "日本語"
|
lang: "日本語"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置情報"
|
location: "位置情報"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "読み込みに失敗しました。"
|
error: "読み込みに失敗しました。"
|
||||||
retry: "リトライ"
|
retry: "リトライ"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
quote-placeholder: "この投稿を引用..."
|
quote-placeholder: "この投稿を引用..."
|
||||||
note: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
no-users: "ミュートしているユーザーはいません"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "カスタマイズ"
|
customize: "カスタマイズ"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "新規投稿"
|
post: "新規投稿"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "投稿がありません"
|
empty: "投稿がありません"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "すべて"
|
all: "すべて"
|
||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "język polski"
|
lang: "język polski"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Dziel się zawartością z innymi korzystając z Misskey."
|
misskey: "Planeta Fediwersum"
|
||||||
|
about-title: "⭐ Fediwersum"
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "nieznany"
|
unknown: "nieznany"
|
||||||
future: "w przyszłości"
|
future: "w przyszłości"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "Wściekły"
|
angry: "Wściekły"
|
||||||
confused: "Zmieszany"
|
confused: "Zmieszany"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "Co robisz?"
|
||||||
|
b: "Co się wydarzyło?"
|
||||||
|
c: "Co Ci chodzi po głowie?"
|
||||||
|
d: "Czy masz coś do powiedzenia?"
|
||||||
|
e: "Napisz coś tutaj!"
|
||||||
|
f: "Czekamy, aż coś napiszesz."
|
||||||
delete: "Usuń"
|
delete: "Usuń"
|
||||||
loading: "Ładowanie"
|
loading: "Ładowanie"
|
||||||
ok: "OK"
|
ok: "OK"
|
||||||
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
|
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
|
||||||
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "Zegar analogowy"
|
||||||
profile: "Profil"
|
profile: "Profil"
|
||||||
calendar: "Kalendarz"
|
calendar: "Kalendarz"
|
||||||
timemachine: "Kalendarz (wehikuł czasu)"
|
timemachine: "Kalendarz (wehikuł czasu)"
|
||||||
@@ -113,8 +123,8 @@ common/views/components/nav.vue:
|
|||||||
common/views/components/note-menu.vue:
|
common/views/components/note-menu.vue:
|
||||||
favorite: "Dodaj do ulubionych"
|
favorite: "Dodaj do ulubionych"
|
||||||
pin: "Przypnij do profilu"
|
pin: "Przypnij do profilu"
|
||||||
delete: "削除"
|
delete: "Usuń"
|
||||||
delete-confirm: "この投稿を削除しますか?"
|
delete-confirm: "Czy na pewno chcesz usunąć ten wpis?"
|
||||||
remote: "Pokaż oryginał"
|
remote: "Pokaż oryginał"
|
||||||
common/views/components/poll.vue:
|
common/views/components/poll.vue:
|
||||||
vote-to: "Zagłosuj na '{}'"
|
vote-to: "Zagłosuj na '{}'"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "Wyślij plik"
|
upload: "Wyślij plik"
|
||||||
url-upload: "Wyślij z adresu URL"
|
url-upload: "Wyślij z adresu URL"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "Przestań śledzić"
|
unfollow: "フォロー中"
|
||||||
follow: "Śledź"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "Śledzący"
|
followers: "Śledzący"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -311,21 +323,20 @@ desktop/views/components/messaging-window.vue:
|
|||||||
title: "Wiadomości"
|
title: "Wiadomości"
|
||||||
desktop/views/components/note-detail.vue:
|
desktop/views/components/note-detail.vue:
|
||||||
more: "Załaduj więcej konwersacji"
|
more: "Załaduj więcej konwersacji"
|
||||||
private: "この投稿は非公開です"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "ten wpis został usunięty"
|
||||||
reposted-by: "Udostępniono przez {}"
|
reposted-by: "Udostępniono przez {}"
|
||||||
location: "Informacje o lokalizacji"
|
location: "Informacje o lokalizacji"
|
||||||
renote: "Udostępnienie"
|
renote: "Udostępnienie"
|
||||||
add-reaction: "Dodaj reakcję"
|
add-reaction: "Dodaj reakcję"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "Udostępniono przez {}"
|
reposted-by: "Udostępniono przez {}"
|
||||||
reply: "Odpowiedz"
|
reply: "Odpowiedz"
|
||||||
renote: "Udostępnij"
|
renote: "Udostępnij"
|
||||||
add-reaction: "Dodaj reakcję"
|
add-reaction: "Dodaj reakcję"
|
||||||
detail: "Pokaż szczegóły"
|
detail: "Pokaż szczegóły"
|
||||||
|
private: "ten wpis jest prywatny"
|
||||||
|
deleted: "ten wpis został usunięty"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "Ładowanie nie powiodło się."
|
error: "Ładowanie nie powiodło się."
|
||||||
retry: "Spróbuj ponownie"
|
retry: "Spróbuj ponownie"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "Więcej"
|
more: "Więcej"
|
||||||
empty: "Brak powiadomień"
|
empty: "Brak powiadomień"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "Co się dzieje?"
|
|
||||||
reply-placeholder: "Odpowiedz na ten wpis…"
|
reply-placeholder: "Odpowiedz na ten wpis…"
|
||||||
quote-placeholder: "Zacytuj ten wpis…"
|
quote-placeholder: "Zacytuj ten wpis…"
|
||||||
note: "Wyślij"
|
submit: "Wyślij"
|
||||||
reply: "Odpowiedz"
|
reply: "Odpowiedz"
|
||||||
renote: "Udostępnienie"
|
renote: "Udostępnienie"
|
||||||
posted: "Opublikowano!"
|
posted: "Opublikowano!"
|
||||||
@@ -419,7 +429,7 @@ desktop/views/components/settings.vue:
|
|||||||
cache-warn: "Pamięć podręczna informacji o koncie/wpisów/odpowiedzi/wiadomości/ustawień przechowywanych w przeglądarce zostanie usunięta. Będziesz musiał odświeżyć stronę po wyczyszczeniu."
|
cache-warn: "Pamięć podręczna informacji o koncie/wpisów/odpowiedzi/wiadomości/ustawień przechowywanych w przeglądarce zostanie usunięta. Będziesz musiał odświeżyć stronę po wyczyszczeniu."
|
||||||
cache-cleared: "Wyczyszczono pamięć podręczną"
|
cache-cleared: "Wyczyszczono pamięć podręczną"
|
||||||
cache-cleared-desc: "Proszę odświeżyć stronę."
|
cache-cleared-desc: "Proszę odświeżyć stronę."
|
||||||
auto-watch: "投稿の自動ウォッチ"
|
auto-watch: "Automatycznie nasłuchuj"
|
||||||
auto-watch-desc: "Otrzymuj natychmiastowo informacje o wpisach/odpowiedziach/reakcjach."
|
auto-watch-desc: "Otrzymuj natychmiastowo informacje o wpisach/odpowiedziach/reakcjach."
|
||||||
about: "O Misskey"
|
about: "O Misskey"
|
||||||
operator: "Administrator instancji"
|
operator: "Administrator instancji"
|
||||||
@@ -442,7 +452,7 @@ desktop/views/components/settings.vue:
|
|||||||
experimental-desc: "Aktywowanie eksperymentalnych funkcji może spowodować niestabilność Misskey. Opcja ta jest przechowywana w przeglądarce."
|
experimental-desc: "Aktywowanie eksperymentalnych funkcji może spowodować niestabilność Misskey. Opcja ta jest przechowywana w przeglądarce."
|
||||||
tools: "Narzędzia"
|
tools: "Narzędzia"
|
||||||
task-manager: "Menedżer zadań"
|
task-manager: "Menedżer zadań"
|
||||||
third-parties: "サードパーティ"
|
third-parties: "Autorzy trzeci"
|
||||||
desktop/views/components/settings.2fa.vue:
|
desktop/views/components/settings.2fa.vue:
|
||||||
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
|
intro: "Jeżeli skonfigurujesz uwierzytelnianie dwuetapowe, aby zablokować się będziesz potrzebować (oprócz hasła) kodu ze skonfigurowanego urządzenia (np. smartfonu), co zwiększy bezpieczeństwo."
|
||||||
detail: "Zobacz szczegóły…"
|
detail: "Zobacz szczegóły…"
|
||||||
@@ -462,13 +472,13 @@ desktop/views/components/settings.2fa.vue:
|
|||||||
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
failed: "Nie udało się skonfigurować uwierzytelniania dwuetapowego, upewnij się że wprowadziłeś prawidłowy token."
|
||||||
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
info: "Od teraz, wprowadzaj token wyświetlany na urządzeniu przy każdym logowaniu do Misskey."
|
||||||
desktop/views/components/settings.api.vue:
|
desktop/views/components/settings.api.vue:
|
||||||
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。"
|
intro: "Aby uzyskać dostęp do API, ustaw ten token jako klucz 'i' parametrów żądań."
|
||||||
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
|
caution: "Nie pokazuj tego tokenu osobom trzecim (nie wprowadzaj go nigdzie indziej), aby konto nie trafiło w niepowołane ręce."
|
||||||
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
|
regeneration-of-token: "W przypadku wycieku tokenu, możesz wygenerować nowy."
|
||||||
regenerate-token: "Wygeneruj nowy token"
|
regenerate-token: "Wygeneruj nowy token"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "Wprowadź hasło"
|
enter-password: "Wprowadź hasło"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "Brak zautoryzowanych aplikacji"
|
no-apps: "Brak zautoryzowanych aplikacji"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "Brak wyciszonych użytkowników"
|
no-users: "Brak wyciszonych użytkowników"
|
||||||
@@ -490,9 +500,9 @@ desktop/views/components/settings.profile.vue:
|
|||||||
is-bot: "To konto jest prowadzone przez bota"
|
is-bot: "To konto jest prowadzone przez bota"
|
||||||
is-cat: "To konto jest prowadzone przez kota"
|
is-cat: "To konto jest prowadzone przez kota"
|
||||||
desktop/views/components/sub-note-content.vue:
|
desktop/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "ten wpis został usunięty"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}zawartości multimedialnej"
|
||||||
poll: "Ankiety"
|
poll: "Ankiety"
|
||||||
desktop/views/components/taskmanager.vue:
|
desktop/views/components/taskmanager.vue:
|
||||||
title: "Menedżer zadań"
|
title: "Menedżer zadań"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
favorites: "Ulubione"
|
favorites: "Ulubione"
|
||||||
lists: "Listy"
|
lists: "Listy"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "Dostosuj"
|
customize: "Dostosuj"
|
||||||
settings: "Ustawienia"
|
settings: "Ustawienia"
|
||||||
signout: "Wyloguj się"
|
signout: "Wyloguj się"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "Utwórz nowy wpis"
|
post: "Utwórz nowy wpis"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "Szukaj"
|
placeholder: "Szukaj"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "Utwórz listę"
|
create-list: "Utwórz listę"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "Wpisy"
|
notes: "Wpisy"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
close: "Zamknij"
|
close: "Zamknij"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "O Misskey"
|
||||||
|
gotit: "Rozumiem!"
|
||||||
signin: "Zaloguj się"
|
signin: "Zaloguj się"
|
||||||
signup: "Zarejestruj się"
|
signup: "Zarejestruj się"
|
||||||
signin-button: "Zaloguj się"
|
signin-button: "Zaloguj się"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "Wpis"
|
title: "Wpis"
|
||||||
note: "Wpis"
|
note: "Wpis"
|
||||||
placeholder: "Co się dzieje?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "Naciśnij, aby zmienić baner"
|
update-banner: "Naciśnij, aby zmienić baner"
|
||||||
update-avatar: "Naciśnij, aby zmienić awatar"
|
update-avatar: "Naciśnij, aby zmienić awatar"
|
||||||
@@ -625,12 +642,12 @@ mobile/views/components/drive.vue:
|
|||||||
nothing-in-drive: "Pusto"
|
nothing-in-drive: "Pusto"
|
||||||
folder-is-empty: "Ten katalog jest pusty"
|
folder-is-empty: "Ten katalog jest pusty"
|
||||||
prompt: "Co chcesz zrobić? (wprowadź odpowiednią cyfrę): <1 → Wysłać plik | 2 → Wysłać plik z adresu URL | 3 → Utworzyć katalog | 4 → Zmienić nazwę tego katalogu | 5 → Przenieść ten katalog | 6 → Usunąć ten katalog>"
|
prompt: "Co chcesz zrobić? (wprowadź odpowiednią cyfrę): <1 → Wysłać plik | 2 → Wysłać plik z adresu URL | 3 → Utworzyć katalog | 4 → Zmienić nazwę tego katalogu | 5 → Przenieść ten katalog | 6 → Usunąć ten katalog>"
|
||||||
deletion-alert: "ごめんなさい!フォルダの削除は未実装です...。"
|
deletion-alert: "Przepraszamy. Usuwanie katalogów nie zostało jeszcze zaimplementowane."
|
||||||
folder-name: "Nazwa katalogu"
|
folder-name: "Nazwa katalogu"
|
||||||
root-rename-alert: "現在いる場所はルートで、フォルダではないため名前の変更はできません。名前を変更したいフォルダに移動してからやってください。"
|
root-rename-alert: "Nie można zmienić nazwy katalogu głównego. Przejdź do katalogu, którego nazwę chcesz zmienić."
|
||||||
root-move-alert: "現在いる場所はルートで、フォルダではないため移動はできません。移動したいフォルダに移動してからやってください。"
|
root-move-alert: "Nie można przenieść tego katalogu, ponieważ jest on katalogiem głównym. Przejdź do katalogu, który chcesz przenieść."
|
||||||
url-prompt: "Adres URL pliku, który chcesz wysłać"
|
url-prompt: "Adres URL pliku, który chcesz wysłać"
|
||||||
uploading: "アップロードをリクエストしました。アップロードが完了するまで時間がかかる場合があります。"
|
uploading: "Rozpoczęto wysyłanie. Może to trochę potrwać."
|
||||||
mobile/views/components/drive-file-detail.vue:
|
mobile/views/components/drive-file-detail.vue:
|
||||||
rename: "Zmień nazwę"
|
rename: "Zmień nazwę"
|
||||||
mobile/views/components/drive-file-chooser.vue:
|
mobile/views/components/drive-file-chooser.vue:
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "Hash (md5)"
|
hash: "Hash (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "Śledź"
|
follow: "Śledź"
|
||||||
unfollow: "Przestań śledzić"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "Zacznij śledzić ludzi takich jak Ty"
|
title: "Zacznij śledzić ludzi takich jak Ty"
|
||||||
empty: "Nie znaleziono podobnych użytkowników."
|
empty: "Nie znaleziono podobnych użytkowników."
|
||||||
@@ -656,15 +675,15 @@ mobile/views/components/note.vue:
|
|||||||
reposted-by: "Udostępniono przez {}"
|
reposted-by: "Udostępniono przez {}"
|
||||||
more: "Rozwiń"
|
more: "Rozwiń"
|
||||||
less: "Zwiń"
|
less: "Zwiń"
|
||||||
private: "この投稿は非公開です"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "ten wpis został usunięty"
|
||||||
location: "Informacje o lokalizacji"
|
location: "Informacje o lokalizacji"
|
||||||
mobile/views/components/note-detail.vue:
|
mobile/views/components/note-detail.vue:
|
||||||
reply: "Odpowiedz"
|
reply: "Odpowiedz"
|
||||||
reaction: "Reakcja"
|
reaction: "Reakcja"
|
||||||
reposted-by: "Udostępniono przez {}"
|
reposted-by: "Udostępniono przez {}"
|
||||||
private: "この投稿は非公開です"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "ten wpis został usunięty"
|
||||||
location: "Informacje o lokalizacji"
|
location: "Informacje o lokalizacji"
|
||||||
mobile/views/components/note-preview.vue:
|
mobile/views/components/note-preview.vue:
|
||||||
admin: "admin"
|
admin: "admin"
|
||||||
@@ -685,27 +704,32 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "Wyślij"
|
submit: "Wyślij"
|
||||||
reply: "Odpowiedz"
|
reply: "Odpowiedz"
|
||||||
renote: "Udostępnij"
|
renote: "Udostępnij"
|
||||||
renote-placeholder: "Zacytuj wpis… (nieobowiązkowe)"
|
quote-placeholder: "Zacytuj ten wpis… (nieobowiązkowe)"
|
||||||
reply-placeholder: "Odpowiedź na ten wpis…"
|
reply-placeholder: "Odpowiedź na ten wpis…"
|
||||||
note-placeholder: "Co się dzieje?"
|
cw-placeholder: "Treść ostrzeżenia (opcjonalnie)"
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
location-alert: "Twoje urządzenie nie pozwala na przekazywanie informacji o lokalizacji"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
|
||||||
error: "Błąd"
|
error: "Błąd"
|
||||||
username-prompt: "Wprowadź nazwę użytkownika"
|
username-prompt: "Wprowadź nazwę użytkownika"
|
||||||
mobile/views/components/sub-note-content.vue:
|
mobile/views/components/sub-note-content.vue:
|
||||||
private: "この投稿は非公開です"
|
private: "ten wpis jest prywatny"
|
||||||
deleted: "この投稿は削除されました"
|
deleted: "ten wpis został usunięty"
|
||||||
media-count: "{}つのメディア"
|
media-count: "{}zawartości multimedialnej"
|
||||||
poll: "Ankieta"
|
poll: "Ankieta"
|
||||||
mobile/views/components/timeline.vue:
|
mobile/views/components/timeline.vue:
|
||||||
empty: "Brak wpisów"
|
empty: "Brak wpisów"
|
||||||
load-more: "Więcej"
|
load-more: "Więcej"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "Strona główna"
|
timeline: "Oś czasu"
|
||||||
notifications: "Powiadomienia"
|
notifications: "Powiadomienia"
|
||||||
messaging: "Wiadomości"
|
messaging: "Wiadomości"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "Szukaj"
|
search: "Szukaj"
|
||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
|
favorites: "Ulubione"
|
||||||
|
user-lists: "Listy"
|
||||||
|
widgets: "Widżety"
|
||||||
|
game: "Gry"
|
||||||
|
darkmode: "Tryb ciemny"
|
||||||
settings: "Ustawienia"
|
settings: "Ustawienia"
|
||||||
about: "O Misskey"
|
about: "O Misskey"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "Wszyscy"
|
all: "Wszyscy"
|
||||||
known: "Znasz"
|
known: "Znasz"
|
||||||
load-more: "Więcej"
|
load-more: "Więcej"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "Ulubione"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "Listy"
|
||||||
|
enter-list-name: "Wprowadź nazwę listy"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "Dysk"
|
drive: "Dysk"
|
||||||
|
more: "Załaduj więcej"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "Śledzący {}"
|
followers-of: "Śledzący {}"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "Wiadomości"
|
messaging: "Wiadomości"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "Wiadomości"
|
messaging: "Wiadomości"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "Wpis"
|
title: "Wpis"
|
||||||
prev: "Poprzedni wpis"
|
prev: "Poprzedni wpis"
|
||||||
@@ -773,7 +807,7 @@ mobile/views/pages/settings.vue:
|
|||||||
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów"
|
show-renoted-my-notes: "Pokazuj udostępnienia moich wpisów"
|
||||||
post-style: "Styl wpisów"
|
post-style: "Styl wpisów"
|
||||||
post-style-standard: "Standardowy"
|
post-style-standard: "Standardowy"
|
||||||
post-style-smart: "スマート"
|
post-style-smart: "Inteligentny"
|
||||||
behavior: "Zachowanie"
|
behavior: "Zachowanie"
|
||||||
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
|
||||||
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "Português"
|
lang: "Português"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置情報"
|
location: "位置情報"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "読み込みに失敗しました。"
|
error: "読み込みに失敗しました。"
|
||||||
retry: "リトライ"
|
retry: "リトライ"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
quote-placeholder: "この投稿を引用..."
|
quote-placeholder: "この投稿を引用..."
|
||||||
note: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
no-users: "ミュートしているユーザーはいません"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "カスタマイズ"
|
customize: "カスタマイズ"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "新規投稿"
|
post: "新規投稿"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "投稿がありません"
|
empty: "投稿がありません"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "すべて"
|
all: "すべて"
|
||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "Русский язык"
|
lang: "Русский язык"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置情報"
|
location: "位置情報"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "読み込みに失敗しました。"
|
error: "読み込みに失敗しました。"
|
||||||
retry: "リトライ"
|
retry: "リトライ"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
quote-placeholder: "この投稿を引用..."
|
quote-placeholder: "この投稿を引用..."
|
||||||
note: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
no-users: "ミュートしているユーザーはいません"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "カスタマイズ"
|
customize: "カスタマイズ"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "新規投稿"
|
post: "新規投稿"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "投稿がありません"
|
empty: "投稿がありません"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "すべて"
|
all: "すべて"
|
||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ meta:
|
|||||||
lang: "中文(简体)"
|
lang: "中文(简体)"
|
||||||
divider: ""
|
divider: ""
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "A planet of fediverse"
|
||||||
|
about-title: "A ⭐ of fediverse."
|
||||||
|
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。"
|
||||||
time:
|
time:
|
||||||
unknown: "なぞのじかん"
|
unknown: "なぞのじかん"
|
||||||
future: "未来"
|
future: "未来"
|
||||||
@@ -33,12 +35,20 @@ common:
|
|||||||
angry: "おこ"
|
angry: "おこ"
|
||||||
confused: "こまこまのこまり"
|
confused: "こまこまのこまり"
|
||||||
pudding: "Pudding"
|
pudding: "Pudding"
|
||||||
|
note-placeholders:
|
||||||
|
a: "今どうしてる?"
|
||||||
|
b: "何かありましたか?"
|
||||||
|
c: "何をお考えですか?"
|
||||||
|
d: "言いたいことは?"
|
||||||
|
e: "ここに書いてください"
|
||||||
|
f: "あなたが書くのを待っています..."
|
||||||
delete: "削除"
|
delete: "削除"
|
||||||
loading: "読み込み中"
|
loading: "読み込み中"
|
||||||
ok: "わかった"
|
ok: "わかった"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
widgets:
|
widgets:
|
||||||
|
analog-clock: "アナログ時計"
|
||||||
profile: "プロフィール"
|
profile: "プロフィール"
|
||||||
calendar: "カレンダー"
|
calendar: "カレンダー"
|
||||||
timemachine: "カレンダー(タイムマシン)"
|
timemachine: "カレンダー(タイムマシン)"
|
||||||
@@ -280,8 +290,10 @@ desktop/views/components/drive.vue:
|
|||||||
upload: "ファイルをアップロード"
|
upload: "ファイルをアップロード"
|
||||||
url-upload: "URLからアップロード"
|
url-upload: "URLからアップロード"
|
||||||
desktop/views/components/follow-button.vue:
|
desktop/views/components/follow-button.vue:
|
||||||
unfollow: "フォロー解除"
|
unfollow: "フォロー中"
|
||||||
follow: "フォローする"
|
follow: "フォロー"
|
||||||
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
desktop/views/components/followers-window.vue:
|
desktop/views/components/followers-window.vue:
|
||||||
followers: "{} のフォロワー"
|
followers: "{} のフォロワー"
|
||||||
desktop/views/components/followers.vue:
|
desktop/views/components/followers.vue:
|
||||||
@@ -317,15 +329,14 @@ desktop/views/components/note-detail.vue:
|
|||||||
location: "位置情報"
|
location: "位置情報"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
desktop/views/components/note-detail.sub.vue:
|
|
||||||
private: "この投稿は非公開です"
|
|
||||||
deleted: "この投稿は削除されました"
|
|
||||||
desktop/views/components/notes.note.vue:
|
desktop/views/components/notes.note.vue:
|
||||||
reposted-by: "{}がRenote"
|
reposted-by: "{}がRenote"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
add-reaction: "リアクション"
|
add-reaction: "リアクション"
|
||||||
detail: "詳細"
|
detail: "詳細"
|
||||||
|
private: "この投稿は非公開です"
|
||||||
|
deleted: "この投稿は削除されました"
|
||||||
desktop/views/components/notes.vue:
|
desktop/views/components/notes.vue:
|
||||||
error: "読み込みに失敗しました。"
|
error: "読み込みに失敗しました。"
|
||||||
retry: "リトライ"
|
retry: "リトライ"
|
||||||
@@ -333,10 +344,9 @@ desktop/views/components/notifications.vue:
|
|||||||
more: "もっと見る"
|
more: "もっと見る"
|
||||||
empty: "ありません!"
|
empty: "ありません!"
|
||||||
desktop/views/components/post-form.vue:
|
desktop/views/components/post-form.vue:
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
quote-placeholder: "この投稿を引用..."
|
quote-placeholder: "この投稿を引用..."
|
||||||
note: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
posted: "投稿しました!"
|
posted: "投稿しました!"
|
||||||
@@ -468,7 +478,7 @@ desktop/views/components/settings.api.vue:
|
|||||||
regenerate-token: "トークンを再生成"
|
regenerate-token: "トークンを再生成"
|
||||||
token: "Token:"
|
token: "Token:"
|
||||||
enter-password: "パスワードを入力してください"
|
enter-password: "パスワードを入力してください"
|
||||||
desktop/views/components/settings.app.vue:
|
desktop/views/components/settings.apps.vue:
|
||||||
no-apps: "連携しているアプリケーションはありません"
|
no-apps: "連携しているアプリケーションはありません"
|
||||||
desktop/views/components/settings.mute.vue:
|
desktop/views/components/settings.mute.vue:
|
||||||
no-users: "ミュートしているユーザーはいません"
|
no-users: "ミュートしているユーザーはいません"
|
||||||
@@ -506,6 +516,7 @@ desktop/views/components/ui.header.account.vue:
|
|||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
favorites: "お気に入り"
|
favorites: "お気に入り"
|
||||||
lists: "リスト"
|
lists: "リスト"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
customize: "カスタマイズ"
|
customize: "カスタマイズ"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
signout: "サインアウト"
|
signout: "サインアウト"
|
||||||
@@ -520,7 +531,12 @@ desktop/views/components/ui.header.post.vue:
|
|||||||
post: "新規投稿"
|
post: "新規投稿"
|
||||||
desktop/views/components/ui.header.search.vue:
|
desktop/views/components/ui.header.search.vue:
|
||||||
placeholder: "検索"
|
placeholder: "検索"
|
||||||
|
desktop/views/components/received-follow-requests-window.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
desktop/views/components/user-lists-window.vue:
|
desktop/views/components/user-lists-window.vue:
|
||||||
|
title: "リスト"
|
||||||
create-list: "リストを作成"
|
create-list: "リストを作成"
|
||||||
desktop/views/components/user-preview.vue:
|
desktop/views/components/user-preview.vue:
|
||||||
notes: "投稿"
|
notes: "投稿"
|
||||||
@@ -537,6 +553,8 @@ desktop/views/components/window.vue:
|
|||||||
popout: "ポップアウト"
|
popout: "ポップアウト"
|
||||||
close: "閉じる"
|
close: "閉じる"
|
||||||
desktop/views/pages/welcome.vue:
|
desktop/views/pages/welcome.vue:
|
||||||
|
about: "詳しく..."
|
||||||
|
gotit: "わかった"
|
||||||
signin: "ログイン"
|
signin: "ログイン"
|
||||||
signup: "新規登録"
|
signup: "新規登録"
|
||||||
signin-button: "やってる"
|
signin-button: "やってる"
|
||||||
@@ -603,7 +621,6 @@ desktop/views/widgets/polls.vue:
|
|||||||
desktop/views/widgets/post-form.vue:
|
desktop/views/widgets/post-form.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
note: "投稿"
|
note: "投稿"
|
||||||
placeholder: "いまどうしてる?"
|
|
||||||
desktop/views/widgets/profile.vue:
|
desktop/views/widgets/profile.vue:
|
||||||
update-banner: "クリックでバナー編集"
|
update-banner: "クリックでバナー編集"
|
||||||
update-avatar: "クリックでアバター編集"
|
update-avatar: "クリックでアバター編集"
|
||||||
@@ -644,8 +661,10 @@ mobile/views/components/drive.file-detail.vue:
|
|||||||
hash: "ハッシュ (md5)"
|
hash: "ハッシュ (md5)"
|
||||||
exif: "EXIF"
|
exif: "EXIF"
|
||||||
mobile/views/components/follow-button.vue:
|
mobile/views/components/follow-button.vue:
|
||||||
|
unfollow: "フォロー中"
|
||||||
follow: "フォロー"
|
follow: "フォロー"
|
||||||
unfollow: "フォロー解除"
|
request-pending: "フォロー許可待ち"
|
||||||
|
follow-request: "フォロー申請"
|
||||||
mobile/views/components/friends-maker.vue:
|
mobile/views/components/friends-maker.vue:
|
||||||
title: "気になるユーザーをフォロー"
|
title: "気になるユーザーをフォロー"
|
||||||
empty: "おすすめのユーザーは見つかりませんでした。"
|
empty: "おすすめのユーザーは見つかりませんでした。"
|
||||||
@@ -685,9 +704,8 @@ mobile/views/components/post-form.vue:
|
|||||||
submit: "投稿"
|
submit: "投稿"
|
||||||
reply: "返信"
|
reply: "返信"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
renote-placeholder: "この投稿を引用... (オプション)"
|
quote-placeholder: "この投稿を引用... (オプション)"
|
||||||
reply-placeholder: "この投稿への返信..."
|
reply-placeholder: "この投稿への返信..."
|
||||||
note-placeholder: "いまどうしてる?"
|
|
||||||
cw-placeholder: "内容への注釈 (オプション)"
|
cw-placeholder: "内容への注釈 (オプション)"
|
||||||
location-alert: "お使いの端末は位置情報に対応していません"
|
location-alert: "お使いの端末は位置情報に対応していません"
|
||||||
error: "エラー"
|
error: "エラー"
|
||||||
@@ -701,11 +719,17 @@ mobile/views/components/timeline.vue:
|
|||||||
empty: "投稿がありません"
|
empty: "投稿がありません"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
mobile/views/components/ui.nav.vue:
|
mobile/views/components/ui.nav.vue:
|
||||||
home: "ホーム"
|
timeline: "タイムライン"
|
||||||
notifications: "通知"
|
notifications: "通知"
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
follow-requests: "フォロー申請"
|
||||||
search: "検索"
|
search: "検索"
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
favorites: "お気に入り"
|
||||||
|
user-lists: "リスト"
|
||||||
|
widgets: "ウィジェット"
|
||||||
|
game: "ゲーム"
|
||||||
|
darkmode: "ダークモード"
|
||||||
settings: "設定"
|
settings: "設定"
|
||||||
about: "Misskeyについて"
|
about: "Misskeyについて"
|
||||||
mobile/views/components/user-timeline.vue:
|
mobile/views/components/user-timeline.vue:
|
||||||
@@ -716,8 +740,14 @@ mobile/views/components/users-list.vue:
|
|||||||
all: "すべて"
|
all: "すべて"
|
||||||
known: "知り合い"
|
known: "知り合い"
|
||||||
load-more: "もっと"
|
load-more: "もっと"
|
||||||
|
mobile/views/pages/favorites.vue:
|
||||||
|
title: "お気に入り"
|
||||||
|
mobile/views/pages/user-lists.vue:
|
||||||
|
title: "リスト"
|
||||||
|
enter-list-name: "リスト名を入力してください"
|
||||||
mobile/views/pages/drive.vue:
|
mobile/views/pages/drive.vue:
|
||||||
drive: "ドライブ"
|
drive: "ドライブ"
|
||||||
|
more: "もっと見る"
|
||||||
mobile/views/pages/followers.vue:
|
mobile/views/pages/followers.vue:
|
||||||
followers-of: "{}のフォロワー"
|
followers-of: "{}のフォロワー"
|
||||||
mobile/views/pages/following.vue:
|
mobile/views/pages/following.vue:
|
||||||
@@ -730,6 +760,10 @@ mobile/views/pages/messaging.vue:
|
|||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
mobile/views/pages/messaging-room.vue:
|
mobile/views/pages/messaging-room.vue:
|
||||||
messaging: "メッセージ"
|
messaging: "メッセージ"
|
||||||
|
mobile/views/pages/received-follow-requests.vue:
|
||||||
|
title: "フォロー申請"
|
||||||
|
accept: "承認"
|
||||||
|
reject: "拒否"
|
||||||
mobile/views/pages/note.vue:
|
mobile/views/pages/note.vue:
|
||||||
title: "投稿"
|
title: "投稿"
|
||||||
prev: "前の投稿"
|
prev: "前の投稿"
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "2.20.1",
|
"version": "2.25.1",
|
||||||
"clientVersion": "1.0.5871",
|
"clientVersion": "1.0.6112",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ init(launch => {
|
|||||||
// Init router
|
// Init router
|
||||||
const router = new VueRouter({
|
const router = new VueRouter({
|
||||||
mode: 'history',
|
mode: 'history',
|
||||||
|
base: '/auth/',
|
||||||
routes: [
|
routes: [
|
||||||
{ path: '/:token', component: Index },
|
{ path: '/:token', component: Index },
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<main v-if="$store.getters.isSignedIn">
|
<main v-if="$store.getters.isSignedIn">
|
||||||
<p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching">読み込み中<mk-ellipsis/></p>
|
||||||
<x-form
|
<x-form
|
||||||
|
class="form"
|
||||||
ref="form"
|
ref="form"
|
||||||
v-if="state == 'waiting'"
|
v-if="state == 'waiting'"
|
||||||
:session="session"
|
:session="session"
|
||||||
@@ -51,7 +52,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (!this.$root.$data.$store.getters.isSignedIn) return;
|
if (!this.$store.getters.isSignedIn) return;
|
||||||
|
|
||||||
// Fetch session
|
// Fetch session
|
||||||
(this as any).api('auth/session/show', {
|
(this as any).api('auth/session/show', {
|
||||||
@@ -62,7 +63,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
// 既に連携していた場合
|
// 既に連携していた場合
|
||||||
if (this.session.app.isAuthorized) {
|
if (this.session.app.isAuthorized) {
|
||||||
this.$root.$data.os.api('auth/accept', {
|
(this as any).api('auth/accept', {
|
||||||
token: this.session.token
|
token: this.session.token
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
this.accepted();
|
this.accepted();
|
||||||
@@ -72,6 +73,7 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
this.state = 'fetch-session-error';
|
this.state = 'fetch-session-error';
|
||||||
|
this.fetching = false;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -101,7 +103,7 @@ export default Vue.extend({
|
|||||||
padding 32px
|
padding 32px
|
||||||
color #555
|
color #555
|
||||||
|
|
||||||
> div
|
> div:not(.form)
|
||||||
padding 64px
|
padding 64px
|
||||||
|
|
||||||
> h1
|
> h1
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ html
|
|||||||
| Misskey
|
| Misskey
|
||||||
|
|
||||||
block desc
|
block desc
|
||||||
meta(name='description' content='A SNS')
|
meta(name='description' content='A planet of fediverse')
|
||||||
|
|
||||||
block meta
|
block meta
|
||||||
|
|
||||||
|
|||||||
@@ -32,9 +32,9 @@
|
|||||||
//#region Detect app name
|
//#region Detect app name
|
||||||
let app = null;
|
let app = null;
|
||||||
|
|
||||||
if (url.pathname == '/docs') app = 'docs';
|
if (url.pathname == '/docs' || url.pathname.startsWith('/docs/')) app = 'docs';
|
||||||
if (url.pathname == '/dev') app = 'dev';
|
if (url.pathname == '/dev' || url.pathname.startsWith('/dev/')) app = 'dev';
|
||||||
if (url.pathname == '/auth') app = 'auth';
|
if (url.pathname == '/auth' || url.pathname.startsWith('/auth/')) app = 'auth';
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
//#region Detect the user language
|
//#region Detect the user language
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export class HomeStream extends Stream {
|
|||||||
}, 1000 * 60);
|
}, 1000 * 60);
|
||||||
|
|
||||||
// 自分の情報が更新されたとき
|
// 自分の情報が更新されたとき
|
||||||
this.on('i_updated', i => {
|
this.on('meUpdated', i => {
|
||||||
if (os.debug) {
|
if (os.debug) {
|
||||||
console.log('I updated:', i);
|
console.log('I updated:', i);
|
||||||
}
|
}
|
||||||
@@ -28,6 +28,30 @@ export class HomeStream extends Stream {
|
|||||||
os.store.dispatch('mergeMe', i);
|
os.store.dispatch('mergeMe', i);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.on('read_all_notifications', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadNotification: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('unread_notification', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadNotification: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('read_all_messaging_messages', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadMessagingMessage: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
this.on('unread_messaging_message', () => {
|
||||||
|
os.store.dispatch('mergeMe', {
|
||||||
|
hasUnreadMessagingMessage: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
this.on('clientSettingUpdated', x => {
|
this.on('clientSettingUpdated', x => {
|
||||||
os.store.commit('settings/set', {
|
os.store.commit('settings/set', {
|
||||||
key: x.key,
|
key: x.key,
|
||||||
|
|||||||
@@ -0,0 +1,127 @@
|
|||||||
|
<template>
|
||||||
|
<svg class="mk-analog-clock" viewBox="0 0 10 10" preserveAspectRatio="none">
|
||||||
|
<circle v-for="angle, i in graduations"
|
||||||
|
:cx="5 + (Math.sin(angle) * (5 - graduationsPadding))"
|
||||||
|
:cy="5 - (Math.cos(angle) * (5 - graduationsPadding))"
|
||||||
|
:r="i % 5 == 0 ? 0.125 : 0.05"
|
||||||
|
:fill="i % 5 == 0 ? majorGraduationColor : minorGraduationColor"/>
|
||||||
|
|
||||||
|
<line
|
||||||
|
:x1="5 - (Math.sin(sAngle) * (sHandLengthRatio * handsTailLength))"
|
||||||
|
:y1="5 + (Math.cos(sAngle) * (sHandLengthRatio * handsTailLength))"
|
||||||
|
:x2="5 + (Math.sin(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
||||||
|
:y2="5 - (Math.cos(sAngle) * ((sHandLengthRatio * 5) - handsPadding))"
|
||||||
|
:stroke="sHandColor"
|
||||||
|
stroke-width="0.05"/>
|
||||||
|
<line
|
||||||
|
:x1="5 - (Math.sin(mAngle) * (mHandLengthRatio * handsTailLength))"
|
||||||
|
:y1="5 + (Math.cos(mAngle) * (mHandLengthRatio * handsTailLength))"
|
||||||
|
:x2="5 + (Math.sin(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
||||||
|
:y2="5 - (Math.cos(mAngle) * ((mHandLengthRatio * 5) - handsPadding))"
|
||||||
|
:stroke="mHandColor"
|
||||||
|
stroke-width="0.1"/>
|
||||||
|
<line
|
||||||
|
:x1="5 - (Math.sin(hAngle) * (hHandLengthRatio * handsTailLength))"
|
||||||
|
:y1="5 + (Math.cos(hAngle) * (hHandLengthRatio * handsTailLength))"
|
||||||
|
:x2="5 + (Math.sin(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
||||||
|
:y2="5 - (Math.cos(hAngle) * ((hHandLengthRatio * 5) - handsPadding))"
|
||||||
|
:stroke="hHandColor"
|
||||||
|
stroke-width="0.1"/>
|
||||||
|
</svg>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { themeColor } from '../../../config';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
dark: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
now: new Date(),
|
||||||
|
clock: null,
|
||||||
|
|
||||||
|
graduationsPadding: 0.5,
|
||||||
|
handsPadding: 1,
|
||||||
|
handsTailLength: 0.7,
|
||||||
|
hHandLengthRatio: 0.75,
|
||||||
|
mHandLengthRatio: 1,
|
||||||
|
sHandLengthRatio: 1
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
majorGraduationColor(): string {
|
||||||
|
return this.dark ? 'rgba(255, 255, 255, 0.3)' : 'rgba(0, 0, 0, 0.3)';
|
||||||
|
},
|
||||||
|
minorGraduationColor(): string {
|
||||||
|
return this.dark ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.2)';
|
||||||
|
},
|
||||||
|
|
||||||
|
sHandColor(): string {
|
||||||
|
return this.dark ? 'rgba(255, 255, 255, 0.5)' : 'rgba(0, 0, 0, 0.3)';
|
||||||
|
},
|
||||||
|
mHandColor(): string {
|
||||||
|
return this.dark ? '#fff' : '#777';
|
||||||
|
},
|
||||||
|
hHandColor(): string {
|
||||||
|
return themeColor;
|
||||||
|
},
|
||||||
|
|
||||||
|
s(): number {
|
||||||
|
return this.now.getSeconds();
|
||||||
|
},
|
||||||
|
m(): number {
|
||||||
|
return this.now.getMinutes();
|
||||||
|
},
|
||||||
|
h(): number {
|
||||||
|
return this.now.getHours();
|
||||||
|
},
|
||||||
|
|
||||||
|
hAngle(): number {
|
||||||
|
return Math.PI * (this.h % 12 + this.m / 60) / 6;
|
||||||
|
},
|
||||||
|
mAngle(): number {
|
||||||
|
return Math.PI * (this.m + this.s / 60) / 30;
|
||||||
|
},
|
||||||
|
sAngle(): number {
|
||||||
|
return Math.PI * this.s / 30;
|
||||||
|
},
|
||||||
|
|
||||||
|
graduations(): any {
|
||||||
|
const angles = [];
|
||||||
|
for (let i = 0; i < 60; i++) {
|
||||||
|
const angle = Math.PI * i / 30;
|
||||||
|
angles.push(angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
return angles;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.clock = setInterval(this.tick, 1000);
|
||||||
|
},
|
||||||
|
|
||||||
|
beforeDestroy() {
|
||||||
|
clearInterval(this.clock);
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
tick() {
|
||||||
|
this.now = new Date();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.mk-analog-clock
|
||||||
|
display block
|
||||||
|
</style>
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
.a
|
.a
|
||||||
display block
|
display block
|
||||||
position absolute
|
position fixed
|
||||||
top 0
|
top 0
|
||||||
right 0
|
right 0
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
import analogClock from './analog-clock.vue';
|
||||||
import signin from './signin.vue';
|
import signin from './signin.vue';
|
||||||
import signup from './signup.vue';
|
import signup from './signup.vue';
|
||||||
import forkit from './forkit.vue';
|
import forkit from './forkit.vue';
|
||||||
@@ -27,6 +28,7 @@ import Switch from './switch.vue';
|
|||||||
import Othello from './othello.vue';
|
import Othello from './othello.vue';
|
||||||
import welcomeTimeline from './welcome-timeline.vue';
|
import welcomeTimeline from './welcome-timeline.vue';
|
||||||
|
|
||||||
|
Vue.component('mk-analog-clock', analogClock);
|
||||||
Vue.component('mk-signin', signin);
|
Vue.component('mk-signin', signin);
|
||||||
Vue.component('mk-signup', signup);
|
Vue.component('mk-signup', signup);
|
||||||
Vue.component('mk-forkit', forkit);
|
Vue.component('mk-forkit', forkit);
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-media-list" :data-count="mediaList.length">
|
<div class="mk-media-list">
|
||||||
<template v-for="media in mediaList">
|
<div :data-count="mediaList.length" ref="grid">
|
||||||
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
|
<template v-for="media in mediaList">
|
||||||
<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
|
<mk-media-video :video="media" :key="media.id" v-if="media.type.startsWith('video')" :inline-playable="mediaList.length === 1"/>
|
||||||
</template>
|
<mk-media-image :image="media" :key="media.id" v-else :raw="raw"/>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -18,47 +20,60 @@ export default Vue.extend({
|
|||||||
raw: {
|
raw: {
|
||||||
default: false
|
default: false
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// for Safari bug
|
||||||
|
this.$refs.grid.style.height = this.$refs.grid.clientHeight ? `${this.$refs.grid.clientHeight}px` : '128px';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-media-list
|
.mk-media-list
|
||||||
display grid
|
width 100%
|
||||||
grid-gap 4px
|
|
||||||
height 256px
|
|
||||||
|
|
||||||
@media (max-width 500px)
|
&:before
|
||||||
height 192px
|
content ''
|
||||||
|
display block
|
||||||
|
padding-top 56.25% // 16:9
|
||||||
|
|
||||||
|
> div
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
right 0
|
||||||
|
bottom 0
|
||||||
|
left 0
|
||||||
|
display grid
|
||||||
|
grid-gap 4px
|
||||||
|
|
||||||
|
&[data-count="1"]
|
||||||
|
grid-template-rows 1fr
|
||||||
|
&[data-count="2"]
|
||||||
|
grid-template-columns 1fr 1fr
|
||||||
|
grid-template-rows 1fr
|
||||||
|
&[data-count="3"]
|
||||||
|
grid-template-columns 1fr 0.5fr
|
||||||
|
grid-template-rows 1fr 1fr
|
||||||
|
:nth-child(1)
|
||||||
|
grid-row 1 / 3
|
||||||
|
:nth-child(3)
|
||||||
|
grid-column 2 / 3
|
||||||
|
grid-row 2 / 3
|
||||||
|
&[data-count="4"]
|
||||||
|
grid-template-columns 1fr 1fr
|
||||||
|
grid-template-rows 1fr 1fr
|
||||||
|
|
||||||
&[data-count="1"]
|
|
||||||
grid-template-rows 1fr
|
|
||||||
&[data-count="2"]
|
|
||||||
grid-template-columns 1fr 1fr
|
|
||||||
grid-template-rows 1fr
|
|
||||||
&[data-count="3"]
|
|
||||||
grid-template-columns 1fr 0.5fr
|
|
||||||
grid-template-rows 1fr 1fr
|
|
||||||
:nth-child(1)
|
:nth-child(1)
|
||||||
grid-row 1 / 3
|
grid-column 1 / 2
|
||||||
:nth-child(3)
|
grid-row 1 / 2
|
||||||
|
:nth-child(2)
|
||||||
grid-column 2 / 3
|
grid-column 2 / 3
|
||||||
grid-row 2/3
|
grid-row 1 / 2
|
||||||
&[data-count="4"]
|
:nth-child(3)
|
||||||
grid-template-columns 1fr 1fr
|
grid-column 1 / 2
|
||||||
grid-template-rows 1fr 1fr
|
grid-row 2 / 3
|
||||||
|
:nth-child(4)
|
||||||
:nth-child(1)
|
grid-column 2 / 3
|
||||||
grid-column 1 / 2
|
grid-row 2 / 3
|
||||||
grid-row 1 / 2
|
|
||||||
:nth-child(2)
|
|
||||||
grid-column 2 / 3
|
|
||||||
grid-row 1 / 2
|
|
||||||
:nth-child(3)
|
|
||||||
grid-column 1 / 2
|
|
||||||
grid-row 2 / 3
|
|
||||||
:nth-child(4)
|
|
||||||
grid-column 2 / 3
|
|
||||||
grid-row 2 / 3
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
<template>
|
||||||
|
<div class="mkw-analog-clock">
|
||||||
|
<mk-widget-container :naked="props.naked" :show-header="false">
|
||||||
|
<div class="mkw-analog-clock--body">
|
||||||
|
<mk-analog-clock :dark="$store.state.device.darkmode"/>
|
||||||
|
</div>
|
||||||
|
</mk-widget-container>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import define from '../../../common/define-widget';
|
||||||
|
export default define({
|
||||||
|
name: 'analog-clock',
|
||||||
|
props: () => ({
|
||||||
|
naked: false
|
||||||
|
})
|
||||||
|
}).extend({
|
||||||
|
methods: {
|
||||||
|
func() {
|
||||||
|
this.props.naked = !this.props.naked;
|
||||||
|
this.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
root(isDark)
|
||||||
|
.mkw-analog-clock--body
|
||||||
|
padding 8px
|
||||||
|
|
||||||
|
.mkw-analog-clock[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mkw-analog-clock:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
|
import wAnalogClock from './analog-clock.vue';
|
||||||
import wVersion from './version.vue';
|
import wVersion from './version.vue';
|
||||||
import wRss from './rss.vue';
|
import wRss from './rss.vue';
|
||||||
import wServer from './server.vue';
|
import wServer from './server.vue';
|
||||||
@@ -12,6 +13,7 @@ import wTips from './tips.vue';
|
|||||||
import wDonation from './donation.vue';
|
import wDonation from './donation.vue';
|
||||||
import wNav from './nav.vue';
|
import wNav from './nav.vue';
|
||||||
|
|
||||||
|
Vue.component('mkw-analog-clock', wAnalogClock);
|
||||||
Vue.component('mkw-nav', wNav);
|
Vue.component('mkw-nav', wNav);
|
||||||
Vue.component('mkw-calendar', wCalendar);
|
Vue.component('mkw-calendar', wCalendar);
|
||||||
Vue.component('mkw-photo-stream', wPhotoStream);
|
Vue.component('mkw-photo-stream', wPhotoStream);
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ root(isDark)
|
|||||||
background isDark ? #282c37 : #fff
|
background isDark ? #282c37 : #fff
|
||||||
border none
|
border none
|
||||||
border-bottom solid 1px isDark ? #1c2023 : #eee
|
border-bottom solid 1px isDark ? #1c2023 : #eee
|
||||||
|
border-radius 0
|
||||||
|
|
||||||
> button
|
> button
|
||||||
display block
|
display block
|
||||||
|
|||||||
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 1021 B |
|
Before Width: | Height: | Size: 946 B |
@@ -6,44 +6,27 @@
|
|||||||
*::input-placeholder
|
*::input-placeholder
|
||||||
color #D8CBC5
|
color #D8CBC5
|
||||||
|
|
||||||
*
|
*:focus
|
||||||
&:focus
|
outline none
|
||||||
outline none
|
|
||||||
|
|
||||||
&::scrollbar
|
|
||||||
width 5px
|
|
||||||
background transparent
|
|
||||||
|
|
||||||
&:horizontal
|
|
||||||
height 5px
|
|
||||||
|
|
||||||
&::scrollbar-button
|
|
||||||
width 0
|
|
||||||
height 0
|
|
||||||
background rgba(0, 0, 0, 0.2)
|
|
||||||
|
|
||||||
&::scrollbar-piece
|
|
||||||
background transparent
|
|
||||||
|
|
||||||
&:start
|
|
||||||
background transparent
|
|
||||||
|
|
||||||
&::scrollbar-thumb
|
|
||||||
background rgba(0, 0, 0, 0.2)
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
background rgba(0, 0, 0, 0.4)
|
|
||||||
|
|
||||||
&:active
|
|
||||||
background $theme-color
|
|
||||||
|
|
||||||
&::scrollbar-corner
|
|
||||||
background rgba(0, 0, 0, 0.2)
|
|
||||||
|
|
||||||
html
|
html
|
||||||
height 100%
|
height 100%
|
||||||
background #f7f7f7
|
background #f7f7f7
|
||||||
|
|
||||||
|
&, *
|
||||||
|
&::-webkit-scrollbar
|
||||||
|
width 6px
|
||||||
|
height 6px
|
||||||
|
|
||||||
|
&::-webkit-scrollbar-thumb
|
||||||
|
background rgba(0, 0, 0, 0.2)
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
background rgba(0, 0, 0, 0.4)
|
||||||
|
|
||||||
|
&:active
|
||||||
|
background $theme-color
|
||||||
|
|
||||||
&[data-darkmode]
|
&[data-darkmode]
|
||||||
background #191B22
|
background #191B22
|
||||||
|
|
||||||
@@ -51,10 +34,6 @@ html
|
|||||||
&::-webkit-scrollbar-track
|
&::-webkit-scrollbar-track
|
||||||
background-color #282C37
|
background-color #282C37
|
||||||
|
|
||||||
&::-webkit-scrollbar
|
|
||||||
width 6px
|
|
||||||
height 6px
|
|
||||||
|
|
||||||
&::-webkit-scrollbar-thumb
|
&::-webkit-scrollbar-thumb
|
||||||
background-color #454954
|
background-color #454954
|
||||||
|
|
||||||
|
|||||||
@@ -1,108 +0,0 @@
|
|||||||
<template>
|
|
||||||
<canvas class="mk-analog-clock" ref="canvas" width="256" height="256"></canvas>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
import { themeColor } from '../../../config';
|
|
||||||
|
|
||||||
const Vec2 = function(this: any, x, y) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
clock: null
|
|
||||||
};
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.tick();
|
|
||||||
this.clock = setInterval(this.tick, 1000);
|
|
||||||
},
|
|
||||||
beforeDestroy() {
|
|
||||||
clearInterval(this.clock);
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
tick() {
|
|
||||||
const canv = this.$refs.canvas as any;
|
|
||||||
|
|
||||||
const now = new Date();
|
|
||||||
const s = now.getSeconds();
|
|
||||||
const m = now.getMinutes();
|
|
||||||
const h = now.getHours();
|
|
||||||
|
|
||||||
const ctx = canv.getContext('2d');
|
|
||||||
const canvW = canv.width;
|
|
||||||
const canvH = canv.height;
|
|
||||||
ctx.clearRect(0, 0, canvW, canvH);
|
|
||||||
|
|
||||||
{ // 背景
|
|
||||||
const center = Math.min((canvW / 2), (canvH / 2));
|
|
||||||
const lineStart = center * 0.90;
|
|
||||||
const shortLineEnd = center * 0.87;
|
|
||||||
const longLineEnd = center * 0.84;
|
|
||||||
for (let i = 0; i < 60; i++) {
|
|
||||||
const angle = Math.PI * i / 30;
|
|
||||||
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.lineWidth = 1;
|
|
||||||
ctx.moveTo((canvW / 2) + uv.x * lineStart, (canvH / 2) + uv.y * lineStart);
|
|
||||||
if (i % 5 == 0) {
|
|
||||||
ctx.strokeStyle = 'rgba(255, 255, 255, 0.2)';
|
|
||||||
ctx.lineTo((canvW / 2) + uv.x * longLineEnd, (canvH / 2) + uv.y * longLineEnd);
|
|
||||||
} else {
|
|
||||||
ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';
|
|
||||||
ctx.lineTo((canvW / 2) + uv.x * shortLineEnd, (canvH / 2) + uv.y * shortLineEnd);
|
|
||||||
}
|
|
||||||
ctx.stroke();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // 分
|
|
||||||
const angle = Math.PI * (m + s / 60) / 30;
|
|
||||||
const length = Math.min(canvW, canvH) / 2.6;
|
|
||||||
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.strokeStyle = '#ffffff';
|
|
||||||
ctx.lineWidth = 2;
|
|
||||||
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
|
|
||||||
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
|
|
||||||
ctx.stroke();
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // 時
|
|
||||||
const angle = Math.PI * (h % 12 + m / 60) / 6;
|
|
||||||
const length = Math.min(canvW, canvH) / 4;
|
|
||||||
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.strokeStyle = themeColor;
|
|
||||||
ctx.lineWidth = 2;
|
|
||||||
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
|
|
||||||
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
|
|
||||||
ctx.stroke();
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // 秒
|
|
||||||
const angle = Math.PI * s / 30;
|
|
||||||
const length = Math.min(canvW, canvH) / 2.6;
|
|
||||||
const uv = new Vec2(Math.sin(angle), -Math.cos(angle));
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.strokeStyle = 'rgba(255, 255, 255, 0.5)';
|
|
||||||
ctx.lineWidth = 1;
|
|
||||||
ctx.moveTo(canvW / 2 - uv.x * length / 5, canvH / 2 - uv.y * length / 5);
|
|
||||||
ctx.lineTo(canvW / 2 + uv.x * length, canvH / 2 + uv.y * length);
|
|
||||||
ctx.stroke();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
.mk-analog-clock
|
|
||||||
display block
|
|
||||||
width 256px
|
|
||||||
height 256px
|
|
||||||
</style>
|
|
||||||
@@ -62,7 +62,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onContextmenu(e) {
|
onContextmenu(e) {
|
||||||
this.isContextmenuShowing = true;
|
this.isContextmenuShowing = true;
|
||||||
contextmenu(e, [{
|
contextmenu((this as any).os)(e, [{
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.rename%',
|
text: '%i18n:@contextmenu.rename%',
|
||||||
icon: '%fa:i-cursor%',
|
icon: '%fa:i-cursor%',
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
onContextmenu(e) {
|
onContextmenu(e) {
|
||||||
this.isContextmenuShowing = true;
|
this.isContextmenuShowing = true;
|
||||||
contextmenu(e, [{
|
contextmenu((this as any).os)(e, [{
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.move-to-this-folder%',
|
text: '%i18n:@contextmenu.move-to-this-folder%',
|
||||||
icon: '%fa:arrow-right%',
|
icon: '%fa:arrow-right%',
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onContextmenu(e) {
|
onContextmenu(e) {
|
||||||
contextmenu(e, [{
|
contextmenu((this as any).os)(e, [{
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.create-folder%',
|
text: '%i18n:@contextmenu.create-folder%',
|
||||||
icon: '%fa:R folder%',
|
icon: '%fa:R folder%',
|
||||||
|
|||||||
@@ -1,19 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<button class="mk-follow-button"
|
<button class="mk-follow-button"
|
||||||
:class="{ wait, follow: !user.isFollowing, unfollow: user.isFollowing, big: size == 'big' }"
|
:class="{ wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou, big: size == 'big' }"
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
:disabled="wait"
|
:disabled="wait"
|
||||||
:title="user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%'"
|
|
||||||
>
|
>
|
||||||
<template v-if="!wait && user.isFollowing">
|
<template v-if="!wait">
|
||||||
<template v-if="size == 'compact'">%fa:minus%</template>
|
<template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template>
|
||||||
<template v-if="size == 'big'">%fa:minus%%i18n:@unfollow%</template>
|
<template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@unfollow%</template></template>
|
||||||
|
<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template>
|
||||||
|
<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="!wait && !user.isFollowing">
|
<template v-else>%fa:spinner .pulse .fw%</template>
|
||||||
<template v-if="size == 'compact'">%fa:plus%</template>
|
|
||||||
<template v-if="size == 'big'">%fa:plus%%i18n:@follow%</template>
|
|
||||||
</template>
|
|
||||||
<template v-if="wait">%fa:spinner .pulse .fw%</template>
|
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -34,6 +31,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
u: this.user,
|
||||||
wait: false,
|
wait: false,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null
|
connectionId: null
|
||||||
@@ -56,39 +54,44 @@ export default Vue.extend({
|
|||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
onFollow(user) {
|
onFollow(user) {
|
||||||
if (user.id == this.user.id) {
|
if (user.id == this.u.id) {
|
||||||
this.user.isFollowing = user.isFollowing;
|
this.user.isFollowing = user.isFollowing;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onUnfollow(user) {
|
onUnfollow(user) {
|
||||||
if (user.id == this.user.id) {
|
if (user.id == this.u.id) {
|
||||||
this.user.isFollowing = user.isFollowing;
|
this.user.isFollowing = user.isFollowing;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onClick() {
|
async onClick() {
|
||||||
this.wait = true;
|
this.wait = true;
|
||||||
if (this.user.isFollowing) {
|
|
||||||
(this as any).api('following/delete', {
|
try {
|
||||||
userId: this.user.id
|
if (this.u.isFollowing) {
|
||||||
}).then(() => {
|
this.u = await (this as any).api('following/delete', {
|
||||||
this.user.isFollowing = false;
|
userId: this.u.id
|
||||||
}).catch(err => {
|
});
|
||||||
console.error(err);
|
} else {
|
||||||
}).then(() => {
|
if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
|
||||||
this.wait = false;
|
this.u = await (this as any).api('following/requests/cancel', {
|
||||||
});
|
userId: this.u.id
|
||||||
} else {
|
});
|
||||||
(this as any).api('following/create', {
|
} else if (this.u.isLocked) {
|
||||||
userId: this.user.id
|
this.u = await (this as any).api('following/create', {
|
||||||
}).then(() => {
|
userId: this.u.id
|
||||||
this.user.isFollowing = true;
|
});
|
||||||
}).catch(err => {
|
} else {
|
||||||
console.error(err);
|
this.u = await (this as any).api('following/create', {
|
||||||
}).then(() => {
|
userId: this.user.id
|
||||||
this.wait = false;
|
});
|
||||||
});
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
} finally {
|
||||||
|
this.wait = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,7 +127,7 @@ root(isDark)
|
|||||||
border 2px solid rgba($theme-color, 0.3)
|
border 2px solid rgba($theme-color, 0.3)
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
|
||||||
&.follow
|
&:not(.active)
|
||||||
color isDark ? #fff : #888
|
color isDark ? #fff : #888
|
||||||
background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
|
background isDark ? linear-gradient(to bottom, #313543 0%, #282c37 100%) : linear-gradient(to bottom, #ffffff 0%, #f5f5f5 100%)
|
||||||
border solid 1px isDark ? #1c2023 : #e2e2e2
|
border solid 1px isDark ? #1c2023 : #e2e2e2
|
||||||
@@ -137,7 +140,7 @@ root(isDark)
|
|||||||
background isDark ? #22262f : #ececec
|
background isDark ? #22262f : #ececec
|
||||||
border-color isDark ? #151a1d : #dcdcdc
|
border-color isDark ? #151a1d : #dcdcdc
|
||||||
|
|
||||||
&.unfollow
|
&.active
|
||||||
color $theme-color-foreground
|
color $theme-color-foreground
|
||||||
background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%)
|
background linear-gradient(to bottom, lighten($theme-color, 25%) 0%, lighten($theme-color, 10%) 100%)
|
||||||
border solid 1px lighten($theme-color, 15%)
|
border solid 1px lighten($theme-color, 15%)
|
||||||
@@ -162,9 +165,6 @@ root(isDark)
|
|||||||
height 38px
|
height 38px
|
||||||
line-height 38px
|
line-height 38px
|
||||||
|
|
||||||
i
|
|
||||||
margin-right 8px
|
|
||||||
|
|
||||||
.mk-follow-button[data-darkmode]
|
.mk-follow-button[data-darkmode]
|
||||||
root(true)
|
root(true)
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
<p>%i18n:@add-widget%</p>
|
<p>%i18n:@add-widget%</p>
|
||||||
<select v-model="widgetAdderSelected">
|
<select v-model="widgetAdderSelected">
|
||||||
<option value="profile">%i18n:common.widgets.profile%</option>
|
<option value="profile">%i18n:common.widgets.profile%</option>
|
||||||
|
<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
|
||||||
<option value="calendar">%i18n:common.widgets.calendar%</option>
|
<option value="calendar">%i18n:common.widgets.calendar%</option>
|
||||||
<option value="timemachine">%i18n:common.widgets.timemachine%</option>
|
<option value="timemachine">%i18n:common.widgets.timemachine%</option>
|
||||||
<option value="activity">%i18n:common.widgets.activity%</option>
|
<option value="activity">%i18n:common.widgets.activity%</option>
|
||||||
@@ -62,9 +63,8 @@
|
|||||||
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
|
<component v-for="widget in widgets[place]" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" @chosen="warp"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="main">
|
<div class="main">
|
||||||
<mk-post-form v-if="$store.state.settings.showPostFormOnTopOfTl"/>
|
<mk-post-form class="form" v-if="$store.state.settings.showPostFormOnTopOfTl"/>
|
||||||
<mk-timeline ref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
|
<mk-timeline class="tl" cref="tl" @loaded="onTlLoaded" v-if="mode == 'timeline'"/>
|
||||||
<mk-mentions @loaded="onTlLoaded" v-if="mode == 'mentions'"/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
@@ -298,11 +298,18 @@ root(isDark)
|
|||||||
width calc(100% - 275px * 2)
|
width calc(100% - 275px * 2)
|
||||||
order 2
|
order 2
|
||||||
|
|
||||||
.mk-post-form
|
> .form
|
||||||
margin-bottom 16px
|
margin-bottom 16px
|
||||||
border solid 1px rgba(#000, 0.075)
|
border solid 1px rgba(#000, 0.075)
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
|
@media (max-width 700px)
|
||||||
|
padding 0
|
||||||
|
|
||||||
|
> .tl
|
||||||
|
border none
|
||||||
|
border-radius 0
|
||||||
|
|
||||||
> *:not(.main)
|
> *:not(.main)
|
||||||
width 275px
|
width 275px
|
||||||
padding 16px 0 16px 0
|
padding 16px 0 16px 0
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import subNoteContent from './sub-note-content.vue';
|
|||||||
import window from './window.vue';
|
import window from './window.vue';
|
||||||
import noteFormWindow from './post-form-window.vue';
|
import noteFormWindow from './post-form-window.vue';
|
||||||
import renoteFormWindow from './renote-form-window.vue';
|
import renoteFormWindow from './renote-form-window.vue';
|
||||||
import analogClock from './analog-clock.vue';
|
|
||||||
import ellipsisIcon from './ellipsis-icon.vue';
|
import ellipsisIcon from './ellipsis-icon.vue';
|
||||||
import mediaImage from './media-image.vue';
|
import mediaImage from './media-image.vue';
|
||||||
import mediaImageDialog from './media-image-dialog.vue';
|
import mediaImageDialog from './media-image-dialog.vue';
|
||||||
@@ -40,7 +39,6 @@ Vue.component('mk-sub-note-content', subNoteContent);
|
|||||||
Vue.component('mk-window', window);
|
Vue.component('mk-window', window);
|
||||||
Vue.component('mk-post-form-window', noteFormWindow);
|
Vue.component('mk-post-form-window', noteFormWindow);
|
||||||
Vue.component('mk-renote-form-window', renoteFormWindow);
|
Vue.component('mk-renote-form-window', renoteFormWindow);
|
||||||
Vue.component('mk-analog-clock', analogClock);
|
|
||||||
Vue.component('mk-ellipsis-icon', ellipsisIcon);
|
Vue.component('mk-ellipsis-icon', ellipsisIcon);
|
||||||
Vue.component('mk-media-image', mediaImage);
|
Vue.component('mk-media-image', mediaImage);
|
||||||
Vue.component('mk-media-image-dialog', mediaImageDialog);
|
Vue.component('mk-media-image-dialog', mediaImageDialog);
|
||||||
|
|||||||
@@ -1,124 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="sub" :title="title">
|
|
||||||
<mk-avatar class="avatar" :user="note.user"/>
|
|
||||||
<div class="main">
|
|
||||||
<header>
|
|
||||||
<div class="left">
|
|
||||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
|
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
|
||||||
</div>
|
|
||||||
<div class="right">
|
|
||||||
<router-link class="time" :to="note | notePage">
|
|
||||||
<mk-time :time="note.createdAt"/>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
<div class="body">
|
|
||||||
<div class="text">
|
|
||||||
<span v-if="note.isHidden" style="opacity: 0.5">%i18n:@private%</span>
|
|
||||||
<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
|
|
||||||
<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
|
|
||||||
</div>
|
|
||||||
<div class="media" v-if="note.mediaIds.length > 0">
|
|
||||||
<mk-media-list :media-list="note.media"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
root(isDark)
|
|
||||||
margin 0
|
|
||||||
padding 20px 32px
|
|
||||||
background isDark ? #21242d : #fdfdfd
|
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
> .main > footer > button
|
|
||||||
color #888
|
|
||||||
|
|
||||||
> .avatar
|
|
||||||
display block
|
|
||||||
float left
|
|
||||||
margin 0 16px 0 0
|
|
||||||
width 44px
|
|
||||||
height 44px
|
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
> .main
|
|
||||||
float left
|
|
||||||
width calc(100% - 60px)
|
|
||||||
|
|
||||||
> header
|
|
||||||
margin-bottom 4px
|
|
||||||
white-space nowrap
|
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
> .left
|
|
||||||
float left
|
|
||||||
|
|
||||||
> .name
|
|
||||||
display inline
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
color isDark ? #fff : #777
|
|
||||||
font-size 1em
|
|
||||||
font-weight 700
|
|
||||||
text-align left
|
|
||||||
text-decoration none
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
text-decoration underline
|
|
||||||
|
|
||||||
> .username
|
|
||||||
text-align left
|
|
||||||
margin 0 0 0 8px
|
|
||||||
color isDark ? #606984 : #ccc
|
|
||||||
|
|
||||||
> .right
|
|
||||||
float right
|
|
||||||
|
|
||||||
> .time
|
|
||||||
font-size 0.9em
|
|
||||||
color isDark ? #606984 : #c0c0c0
|
|
||||||
|
|
||||||
> .body
|
|
||||||
> .text
|
|
||||||
cursor default
|
|
||||||
display block
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
overflow-wrap break-word
|
|
||||||
font-size 1em
|
|
||||||
color isDark ? #959ba7 : #717171
|
|
||||||
|
|
||||||
.sub[data-darkmode]
|
|
||||||
root(true)
|
|
||||||
|
|
||||||
.sub:not([data-darkmode])
|
|
||||||
root(false)
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -89,7 +89,7 @@ import MkPostFormWindow from './post-form-window.vue';
|
|||||||
import MkRenoteFormWindow from './renote-form-window.vue';
|
import MkRenoteFormWindow from './renote-form-window.vue';
|
||||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
||||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
||||||
import XSub from './note-detail.sub.vue';
|
import XSub from './notes.note.sub.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@@ -218,8 +218,6 @@ export default Vue.extend({
|
|||||||
@import '~const.styl'
|
@import '~const.styl'
|
||||||
|
|
||||||
root(isDark)
|
root(isDark)
|
||||||
margin 0 auto
|
|
||||||
padding 0
|
|
||||||
overflow hidden
|
overflow hidden
|
||||||
text-align left
|
text-align left
|
||||||
background isDark ? #282C37 : #fff
|
background isDark ? #282C37 : #fff
|
||||||
|
|||||||
@@ -5,9 +5,18 @@
|
|||||||
<header>
|
<header>
|
||||||
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
|
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
<span class="username"><mk-acct :user="note.user"/></span>
|
||||||
<router-link class="time" :to="note | notePage">
|
<div class="info">
|
||||||
<mk-time :time="note.createdAt"/>
|
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
|
||||||
</router-link>
|
<router-link class="created-at" :to="note | notePage">
|
||||||
|
<mk-time :time="note.createdAt"/>
|
||||||
|
</router-link>
|
||||||
|
<span class="visibility" v-if="note.visibility != 'public'">
|
||||||
|
<template v-if="note.visibility == 'home'">%fa:home%</template>
|
||||||
|
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
|
||||||
|
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
|
||||||
|
<template v-if="note.visibility == 'private'">%fa:lock%</template>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<mk-sub-note-content class="text" :note="note"/>
|
<mk-sub-note-content class="text" :note="note"/>
|
||||||
@@ -32,24 +41,20 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
root(isDark)
|
root(isDark)
|
||||||
|
display flex
|
||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
> .avatar
|
> .avatar
|
||||||
|
flex-shrink 0
|
||||||
display block
|
display block
|
||||||
float left
|
|
||||||
margin 0 12px 0 0
|
margin 0 12px 0 0
|
||||||
width 48px
|
width 48px
|
||||||
height 48px
|
height 48px
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
|
||||||
> .main
|
> .main
|
||||||
float left
|
flex 1
|
||||||
width calc(100% - 60px)
|
min-width 0
|
||||||
|
|
||||||
> header
|
> header
|
||||||
display flex
|
display flex
|
||||||
@@ -75,9 +80,18 @@ root(isDark)
|
|||||||
text-overflow ellipsis
|
text-overflow ellipsis
|
||||||
color isDark ? #606984 : #d1d8da
|
color isDark ? #606984 : #d1d8da
|
||||||
|
|
||||||
> .time
|
> .info
|
||||||
margin-left auto
|
margin-left auto
|
||||||
color isDark ? #606984 : #b2b8bb
|
font-size 0.9em
|
||||||
|
|
||||||
|
> *
|
||||||
|
color isDark ? #606984 : #b2b8bb
|
||||||
|
|
||||||
|
> .mobile
|
||||||
|
margin-right 6px
|
||||||
|
|
||||||
|
> .visibility
|
||||||
|
margin-left 6px
|
||||||
|
|
||||||
> .body
|
> .body
|
||||||
|
|
||||||
|
|||||||
@@ -44,27 +44,23 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
root(isDark)
|
root(isDark)
|
||||||
|
display flex
|
||||||
margin 0
|
margin 0
|
||||||
padding 16px 32px
|
padding 16px 32px
|
||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
background isDark ? #21242d : #fcfcfc
|
background isDark ? #21242d : #fcfcfc
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
> .avatar
|
> .avatar
|
||||||
|
flex-shrink 0
|
||||||
display block
|
display block
|
||||||
float left
|
|
||||||
margin 0 12px 0 0
|
margin 0 12px 0 0
|
||||||
width 48px
|
width 48px
|
||||||
height 48px
|
height 48px
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
|
||||||
> .main
|
> .main
|
||||||
float left
|
flex 1
|
||||||
width calc(100% - 60px)
|
min-width 0
|
||||||
|
|
||||||
> header
|
> header
|
||||||
display flex
|
display flex
|
||||||
@@ -119,8 +115,6 @@ root(isDark)
|
|||||||
margin-left 6px
|
margin-left 6px
|
||||||
|
|
||||||
> .body
|
> .body
|
||||||
max-height 128px
|
|
||||||
overflow hidden
|
|
||||||
|
|
||||||
> .text
|
> .text
|
||||||
cursor default
|
cursor default
|
||||||
|
|||||||
@@ -387,20 +387,16 @@ root(isDark)
|
|||||||
padding-top 8px
|
padding-top 8px
|
||||||
|
|
||||||
> article
|
> article
|
||||||
|
display flex
|
||||||
padding 28px 32px 18px 32px
|
padding 28px 32px 18px 32px
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
> .main > footer > button
|
> .main > footer > button
|
||||||
color isDark ? #707b97 : #888
|
color isDark ? #707b97 : #888
|
||||||
|
|
||||||
> .avatar
|
> .avatar
|
||||||
|
flex-shrink 0
|
||||||
display block
|
display block
|
||||||
float left
|
|
||||||
margin 0 16px 10px 0
|
margin 0 16px 10px 0
|
||||||
width 58px
|
width 58px
|
||||||
height 58px
|
height 58px
|
||||||
@@ -410,8 +406,8 @@ root(isDark)
|
|||||||
//top 74px
|
//top 74px
|
||||||
|
|
||||||
> .main
|
> .main
|
||||||
float left
|
flex 1
|
||||||
width calc(100% - 74px)
|
min-width 0
|
||||||
|
|
||||||
> header
|
> header
|
||||||
display flex
|
display flex
|
||||||
@@ -467,7 +463,7 @@ root(isDark)
|
|||||||
> .app
|
> .app
|
||||||
margin-right 8px
|
margin-right 8px
|
||||||
padding-right 8px
|
padding-right 8px
|
||||||
border-right solid 1px #eaeaea
|
border-right solid 1px isDark ? #1c2023 : #eaeaea
|
||||||
|
|
||||||
> .visibility
|
> .visibility
|
||||||
margin-left 8px
|
margin-left 8px
|
||||||
@@ -556,7 +552,7 @@ root(isDark)
|
|||||||
padding 2px 8px 2px 16px
|
padding 2px 8px 2px 16px
|
||||||
font-size 90%
|
font-size 90%
|
||||||
color #8d969e
|
color #8d969e
|
||||||
background #edf0f3
|
background isDark ? #313543 : #edf0f3
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
&:before
|
&:before
|
||||||
@@ -569,7 +565,7 @@ root(isDark)
|
|||||||
width 8px
|
width 8px
|
||||||
height 8px
|
height 8px
|
||||||
margin auto 0
|
margin auto 0
|
||||||
background #fff
|
background isDark ? #282c37 : #fff
|
||||||
border-radius 100%
|
border-radius 100%
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<template v-for="(notification, i) in _notifications">
|
<template v-for="(notification, i) in _notifications">
|
||||||
<div class="notification" :class="notification.type" :key="notification.id">
|
<div class="notification" :class="notification.type" :key="notification.id">
|
||||||
<mk-time :time="notification.createdAt"/>
|
<mk-time :time="notification.createdAt"/>
|
||||||
|
|
||||||
<template v-if="notification.type == 'reaction'">
|
<template v-if="notification.type == 'reaction'">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
@@ -17,6 +18,7 @@
|
|||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'renote'">
|
<template v-if="notification.type == 'renote'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
@@ -28,6 +30,7 @@
|
|||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'quote'">
|
<template v-if="notification.type == 'quote'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
@@ -37,6 +40,7 @@
|
|||||||
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'follow'">
|
<template v-if="notification.type == 'follow'">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
@@ -45,6 +49,16 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template v-if="notification.type == 'receiveFollowRequest'">
|
||||||
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
|
<div class="text">
|
||||||
|
<p>%fa:user-clock%
|
||||||
|
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'reply'">
|
<template v-if="notification.type == 'reply'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
@@ -54,6 +68,7 @@
|
|||||||
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'mention'">
|
<template v-if="notification.type == 'mention'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
@@ -63,6 +78,7 @@
|
|||||||
<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
|
<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'poll_vote'">
|
<template v-if="notification.type == 'poll_vote'">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
@@ -73,6 +89,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
||||||
<span>%fa:angle-up%{{ notification._datetext }}</span>
|
<span>%fa:angle-up%{{ notification._datetext }}</span>
|
||||||
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
||||||
@@ -251,6 +268,10 @@ root(isDark)
|
|||||||
.text p i
|
.text p i
|
||||||
color #53c7ce
|
color #53c7ce
|
||||||
|
|
||||||
|
&.receiveFollowRequest
|
||||||
|
.text p i
|
||||||
|
color #888
|
||||||
|
|
||||||
&.reply, &.mention
|
&.reply, &.mention
|
||||||
.text p i
|
.text p i
|
||||||
color #555
|
color #555
|
||||||
|
|||||||
@@ -1,21 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal @closed="$destroy">
|
<mk-window class="mk-post-form-window" ref="window" is-modal @closed="$destroy">
|
||||||
<span slot="header">
|
<span slot="header" class="mk-post-form-window--header">
|
||||||
<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span>
|
<span class="icon" v-if="geo">%fa:map-marker-alt%</span>
|
||||||
<span v-if="!reply">%i18n:@note%</span>
|
<span v-if="!reply">%i18n:@note%</span>
|
||||||
<span v-if="reply">%i18n:@reply%</span>
|
<span v-if="reply">%i18n:@reply%</span>
|
||||||
<span :class="$style.count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
|
<span class="count" v-if="media.length != 0">{{ '%i18n:@attaches%'.replace('{}', media.length) }}</span>
|
||||||
<span :class="$style.count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
|
<span class="count" v-if="uploadings.length != 0">{{ '%i18n:@uploading-media%'.replace('{}', uploadings.length) }}<mk-ellipsis/></span>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/>
|
<div class="mk-post-form-window--body">
|
||||||
<mk-post-form ref="form"
|
<mk-note-preview v-if="reply" class="notePreview" :note="reply"/>
|
||||||
:reply="reply"
|
<mk-post-form ref="form"
|
||||||
@posted="onPosted"
|
:reply="reply"
|
||||||
@change-uploadings="onChangeUploadings"
|
@posted="onPosted"
|
||||||
@change-attached-media="onChangeMedia"
|
@change-uploadings="onChangeUploadings"
|
||||||
@geo-attached="onGeoAttached"
|
@change-attached-media="onChangeMedia"
|
||||||
@geo-dettached="onGeoDettached"/>
|
@geo-attached="onGeoAttached"
|
||||||
|
@geo-dettached="onGeoDettached"/>
|
||||||
|
</div>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -56,21 +58,33 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" scoped>
|
||||||
.icon
|
root(isDark)
|
||||||
margin-right 8px
|
.mk-post-form-window--header
|
||||||
|
.icon
|
||||||
|
margin-right 8px
|
||||||
|
|
||||||
.count
|
.count
|
||||||
margin-left 8px
|
margin-left 8px
|
||||||
opacity 0.8
|
opacity 0.8
|
||||||
|
|
||||||
&:before
|
&:before
|
||||||
content '('
|
content '('
|
||||||
|
|
||||||
&:after
|
&:after
|
||||||
content ')'
|
content ')'
|
||||||
|
|
||||||
.notePreview
|
.mk-post-form-window--body
|
||||||
margin 16px 22px 0 22px
|
.notePreview
|
||||||
|
if isDark
|
||||||
|
margin 16px 22px 0 22px
|
||||||
|
else
|
||||||
|
margin 16px 22px
|
||||||
|
|
||||||
|
.mk-post-form-window[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mk-post-form-window:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -86,11 +86,21 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
placeholder(): string {
|
placeholder(): string {
|
||||||
|
const xs = [
|
||||||
|
'%i18n:common.note-placeholders.a%',
|
||||||
|
'%i18n:common.note-placeholders.b%',
|
||||||
|
'%i18n:common.note-placeholders.c%',
|
||||||
|
'%i18n:common.note-placeholders.d%',
|
||||||
|
'%i18n:common.note-placeholders.e%',
|
||||||
|
'%i18n:common.note-placeholders.f%'
|
||||||
|
];
|
||||||
|
const x = xs[Math.floor(Math.random() * xs.length)];
|
||||||
|
|
||||||
return this.renote
|
return this.renote
|
||||||
? '%i18n:@quote-placeholder%'
|
? '%i18n:@quote-placeholder%'
|
||||||
: this.reply
|
: this.reply
|
||||||
? '%i18n:@reply-placeholder%'
|
? '%i18n:@reply-placeholder%'
|
||||||
: '%i18n:@note-placeholder%';
|
: x;
|
||||||
},
|
},
|
||||||
|
|
||||||
submitText(): string {
|
submitText(): string {
|
||||||
@@ -98,7 +108,7 @@ export default Vue.extend({
|
|||||||
? '%i18n:@renote%'
|
? '%i18n:@renote%'
|
||||||
: this.reply
|
: this.reply
|
||||||
? '%i18n:@reply%'
|
? '%i18n:@reply%'
|
||||||
: '%i18n:@note%';
|
: '%i18n:@submit%';
|
||||||
},
|
},
|
||||||
|
|
||||||
canPost(): boolean {
|
canPost(): boolean {
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
<template>
|
||||||
|
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
|
||||||
|
<span slot="header">%fa:envelope R% %i18n:@title%</span>
|
||||||
|
|
||||||
|
<div data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4" :data-darkmode="$store.state.device.darkmode">
|
||||||
|
<div v-for="req in requests">
|
||||||
|
<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
|
||||||
|
<span>
|
||||||
|
<a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</mk-window>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
requests: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
(this as any).api('following/requests/list').then(requests => {
|
||||||
|
this.fetching = false;
|
||||||
|
this.requests = requests;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
accept(user) {
|
||||||
|
(this as any).api('following/requests/accept', { userId: user.id }).then(() => {
|
||||||
|
this.requests = this.requests.filter(r => r.follower.id != user.id);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
reject(user) {
|
||||||
|
(this as any).api('following/requests/reject', { userId: user.id }).then(() => {
|
||||||
|
this.requests = this.requests.filter(r => r.follower.id != user.id);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
(this as any).$refs.window.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
|
||||||
|
root(isDark)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
> button
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
> div
|
||||||
|
display flex
|
||||||
|
padding 16px
|
||||||
|
border solid 1px isDark ? #1c2023 : #eee
|
||||||
|
border-radius 4px
|
||||||
|
|
||||||
|
> span
|
||||||
|
margin 0 0 0 auto
|
||||||
|
|
||||||
|
[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"][data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
[data-id="c1136cec-1278-49b1-9ea7-412c1ef794f4"]:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -23,7 +23,11 @@
|
|||||||
</label>
|
</label>
|
||||||
<button class="ui primary" @click="save">%i18n:@save%</button>
|
<button class="ui primary" @click="save">%i18n:@save%</button>
|
||||||
<section>
|
<section>
|
||||||
<h2>その他</h2>
|
<h2>%i18n:@locked-account%</h2>
|
||||||
|
<mk-switch v-model="$store.state.i.isLocked" @change="onChangeIsLocked" text="%i18n:@is-locked%"/>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h2>%i18n:@other%</h2>
|
||||||
<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
|
<mk-switch v-model="$store.state.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
|
||||||
<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
|
<mk-switch v-model="$store.state.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
|
||||||
</section>
|
</section>
|
||||||
@@ -62,6 +66,11 @@ export default Vue.extend({
|
|||||||
(this as any).apis.notify('プロフィールを更新しました');
|
(this as any).apis.notify('プロフィールを更新しました');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeIsLocked() {
|
||||||
|
(this as any).api('i/update', {
|
||||||
|
isLocked: this.$store.state.i.isLocked
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeIsBot() {
|
onChangeIsBot() {
|
||||||
(this as any).api('i/update', {
|
(this as any).api('i/update', {
|
||||||
isBot: this.$store.state.i.isBot
|
isBot: this.$store.state.i.isBot
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
|
<span v-if="note.deletedAt" style="opacity: 0.5">%i18n:@deleted%</span>
|
||||||
<a class="reply" v-if="note.replyId">%fa:reply%</a>
|
<a class="reply" v-if="note.replyId">%fa:reply%</a>
|
||||||
<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
|
<mk-note-html v-if="note.text" :text="note.text" :i="$store.state.i"/>
|
||||||
<a class="rp" v-if="note.renoteId" :href="`/note:${note.renoteId}`">RP: ...</a>
|
<a class="rp" v-if="note.renoteId" :href="`/notes/${note.renoteId}`">RP: ...</a>
|
||||||
</div>
|
</div>
|
||||||
<details v-if="note.media.length > 0">
|
<details v-if="note.media.length > 0">
|
||||||
<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>
|
<summary>({{ '%i18n:@media-count%'.replace('{}', note.media.length) }})</summary>
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-ui-notification
|
root(isDark)
|
||||||
display block
|
display block
|
||||||
position fixed
|
position fixed
|
||||||
z-index 10000
|
z-index 10000
|
||||||
@@ -46,10 +46,10 @@ export default Vue.extend({
|
|||||||
margin 0 auto
|
margin 0 auto
|
||||||
padding 128px 0 0 0
|
padding 128px 0 0 0
|
||||||
width 500px
|
width 500px
|
||||||
color rgba(#000, 0.6)
|
color rgba(isDark ? #fff : #000, 0.6)
|
||||||
background rgba(#fff, 0.9)
|
background rgba(isDark ? #282C37 : #fff, 0.9)
|
||||||
border-radius 0 0 8px 8px
|
border-radius 0 0 8px 8px
|
||||||
box-shadow 0 2px 4px rgba(#000, 0.2)
|
box-shadow 0 2px 4px rgba(#000, isDark ? 0.4 : 0.2)
|
||||||
transform translateY(-64px)
|
transform translateY(-64px)
|
||||||
opacity 0
|
opacity 0
|
||||||
|
|
||||||
@@ -58,4 +58,10 @@ export default Vue.extend({
|
|||||||
line-height 64px
|
line-height 64px
|
||||||
text-align center
|
text-align center
|
||||||
|
|
||||||
|
.mk-ui-notification[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mk-ui-notification:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -19,6 +19,9 @@
|
|||||||
<li @click="list">
|
<li @click="list">
|
||||||
<p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p>
|
<p>%fa:list%<span>%i18n:@lists%</span>%fa:angle-right%</p>
|
||||||
</li>
|
</li>
|
||||||
|
<li @click="followRequests" v-if="$store.state.i.isLocked">
|
||||||
|
<p>%fa:envelope R%<span>%i18n:@follow-requests%<i v-if="$store.state.i.pendingReceivedFollowRequestsCount">{{ $store.state.i.pendingReceivedFollowRequestsCount }}</i></span>%fa:angle-right%</p>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
@@ -46,6 +49,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import MkUserListsWindow from './user-lists-window.vue';
|
import MkUserListsWindow from './user-lists-window.vue';
|
||||||
|
import MkFollowRequestsWindow from './received-follow-requests-window.vue';
|
||||||
import MkSettingsWindow from './settings-window.vue';
|
import MkSettingsWindow from './settings-window.vue';
|
||||||
import MkDriveWindow from './drive-window.vue';
|
import MkDriveWindow from './drive-window.vue';
|
||||||
import contains from '../../../common/scripts/contains';
|
import contains from '../../../common/scripts/contains';
|
||||||
@@ -91,6 +95,10 @@ export default Vue.extend({
|
|||||||
this.$router.push(`i/lists/${ list.id }`);
|
this.$router.push(`i/lists/${ list.id }`);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
followRequests() {
|
||||||
|
this.close();
|
||||||
|
(this as any).os.new(MkFollowRequestsWindow);
|
||||||
|
},
|
||||||
settings() {
|
settings() {
|
||||||
this.close();
|
this.close();
|
||||||
(this as any).os.new(MkSettingsWindow);
|
(this as any).os.new(MkSettingsWindow);
|
||||||
@@ -225,6 +233,16 @@ root(isDark)
|
|||||||
> span:first-child
|
> span:first-child
|
||||||
padding-left 22px
|
padding-left 22px
|
||||||
|
|
||||||
|
> span:nth-child(2)
|
||||||
|
> i
|
||||||
|
margin-left 4px
|
||||||
|
padding 2px 8px
|
||||||
|
font-size 90%
|
||||||
|
font-style normal
|
||||||
|
background $theme-color
|
||||||
|
color $theme-color-foreground
|
||||||
|
border-radius 8px
|
||||||
|
|
||||||
> [data-fa]:first-child
|
> [data-fa]:first-child
|
||||||
margin-right 6px
|
margin-right 6px
|
||||||
width 16px
|
width 16px
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
</time>
|
</time>
|
||||||
</div>
|
</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<mk-analog-clock/>
|
<mk-analog-clock :dark="true"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<a @click="messaging">
|
<a @click="messaging">
|
||||||
%fa:comments%
|
%fa:comments%
|
||||||
<p>%i18n:@messaging%</p>
|
<p>%i18n:@messaging%</p>
|
||||||
<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>
|
<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="game">
|
<li class="game">
|
||||||
@@ -35,48 +35,33 @@ import MkGameWindow from './game-window.vue';
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hasUnreadMessagingMessages: false,
|
|
||||||
hasGameInvitations: false,
|
hasGameInvitations: false,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null
|
connectionId: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
hasUnreadMessagingMessage(): boolean {
|
||||||
|
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection = (this as any).os.stream.getConnection();
|
this.connection = (this as any).os.stream.getConnection();
|
||||||
this.connectionId = (this as any).os.stream.use();
|
this.connectionId = (this as any).os.stream.use();
|
||||||
|
|
||||||
this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
|
|
||||||
this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
|
|
||||||
this.connection.on('othello_invited', this.onOthelloInvited);
|
this.connection.on('othello_invited', this.onOthelloInvited);
|
||||||
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
|
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
|
||||||
|
|
||||||
// Fetch count of unread messaging messages
|
|
||||||
(this as any).api('messaging/unread').then(res => {
|
|
||||||
if (res.count > 0) {
|
|
||||||
this.hasUnreadMessagingMessages = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
|
|
||||||
this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
|
|
||||||
this.connection.off('othello_invited', this.onOthelloInvited);
|
this.connection.off('othello_invited', this.onOthelloInvited);
|
||||||
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
|
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
|
||||||
(this as any).os.stream.dispose(this.connectionId);
|
(this as any).os.stream.dispose(this.connectionId);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onUnreadMessagingMessage() {
|
|
||||||
this.hasUnreadMessagingMessages = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
onReadAllMessagingMessages() {
|
|
||||||
this.hasUnreadMessagingMessages = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
onOthelloInvited() {
|
onOthelloInvited() {
|
||||||
this.hasGameInvitations = true;
|
this.hasGameInvitations = true;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="notifications">
|
<div class="notifications">
|
||||||
<button :data-active="isOpen" @click="toggle" title="%i18n:@title%">
|
<button :data-active="isOpen" @click="toggle" title="%i18n:@title%">
|
||||||
%fa:R bell%<template v-if="hasUnreadNotifications">%fa:circle%</template>
|
%fa:R bell%<template v-if="hasUnreadNotification">%fa:circle%</template>
|
||||||
</button>
|
</button>
|
||||||
<div class="pop" v-if="isOpen">
|
<div class="pop" v-if="isOpen">
|
||||||
<mk-notifications/>
|
<mk-notifications/>
|
||||||
@@ -16,44 +16,15 @@ import contains from '../../../common/scripts/contains';
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
isOpen: false,
|
isOpen: false
|
||||||
hasUnreadNotifications: false,
|
|
||||||
connection: null,
|
|
||||||
connectionId: null
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
computed: {
|
||||||
if (this.$store.getters.isSignedIn) {
|
hasUnreadNotification(): boolean {
|
||||||
this.connection = (this as any).os.stream.getConnection();
|
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
||||||
this.connectionId = (this as any).os.stream.use();
|
|
||||||
|
|
||||||
this.connection.on('read_all_notifications', this.onReadAllNotifications);
|
|
||||||
this.connection.on('unread_notification', this.onUnreadNotification);
|
|
||||||
|
|
||||||
// Fetch count of unread notifications
|
|
||||||
(this as any).api('notifications/get_unread_count').then(res => {
|
|
||||||
if (res.count > 0) {
|
|
||||||
this.hasUnreadNotifications = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
beforeDestroy() {
|
|
||||||
if (this.$store.getters.isSignedIn) {
|
|
||||||
this.connection.off('read_all_notifications', this.onReadAllNotifications);
|
|
||||||
this.connection.off('unread_notification', this.onUnreadNotification);
|
|
||||||
(this as any).os.stream.dispose(this.connectionId);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onReadAllNotifications() {
|
|
||||||
this.hasUnreadNotifications = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
onUnreadNotification() {
|
|
||||||
this.hasUnreadNotifications = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
toggle() {
|
toggle() {
|
||||||
this.isOpen ? this.close() : this.open();
|
this.isOpen ? this.close() : this.open();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -150,8 +150,8 @@ root(isDark)
|
|||||||
display block
|
display block
|
||||||
width 100%
|
width 100%
|
||||||
height 48px
|
height 48px
|
||||||
background-image url(/assets/desktop/header-logo.svg)
|
background-image isDark ? url('/assets/desktop/header-icon.dark.svg') : url('/assets/desktop/header-icon.light.svg')
|
||||||
background-size 46px
|
background-size 24px
|
||||||
background-position center
|
background-position center
|
||||||
background-repeat no-repeat
|
background-repeat no-repeat
|
||||||
opacity 0.3
|
opacity 0.3
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="mk-ui">
|
||||||
<x-header/>
|
<x-header class="header"/>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
@@ -35,3 +35,9 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.mk-ui
|
||||||
|
> .header
|
||||||
|
@media (max-width 1000px)
|
||||||
|
display none
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
|
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
|
||||||
<span slot="header">%fa:list% リスト</span>
|
<span slot="header">%fa:list% %i18n:@title%</span>
|
||||||
|
|
||||||
<div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode">
|
<div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode">
|
||||||
<button class="ui" @click="add">%i18n:@create-list%</button>
|
<button class="ui" @click="add">%i18n:@create-list%</button>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<mk-ui>
|
<mk-ui>
|
||||||
<main v-if="!fetching">
|
<main v-if="!fetching">
|
||||||
<template v-for="favorite in favorites">
|
<template v-for="favorite in favorites">
|
||||||
<mk-note-detail :note="favorite.note" :key="favorite.note.id"/>
|
<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
|
||||||
</template>
|
</template>
|
||||||
<a v-if="existMore" @click="more">%i18n:@more%</a>
|
<a v-if="existMore" @click="more">%i18n:@more%</a>
|
||||||
</main>
|
</main>
|
||||||
@@ -70,4 +70,7 @@ main
|
|||||||
margin 0 auto
|
margin 0 auto
|
||||||
padding 16px
|
padding 16px
|
||||||
max-width 700px
|
max-width 700px
|
||||||
|
|
||||||
|
> .post
|
||||||
|
margin-bottom 16px
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -4,9 +4,20 @@
|
|||||||
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
|
||||||
<template v-else>%fa:R moon%</template>
|
<template v-else>%fa:R moon%</template>
|
||||||
</button>
|
</button>
|
||||||
<main>
|
<main v-if="about" class="about">
|
||||||
<img :src="$store.state.device.darkmode ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey">
|
<article>
|
||||||
<p><button class="signup" @click="signup">%i18n:@signup-button%</button><button class="signin" @click="signin">%i18n:@signin-button%</button></p>
|
<h1>%i18n:common.about-title%</h1>
|
||||||
|
<p v-html="'%i18n:common.about%'"></p>
|
||||||
|
<span class="gotit" @click="about = false">%i18n:@gotit%</span>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
<main v-else class="index">
|
||||||
|
<img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" alt="Misskey">
|
||||||
|
<p class="desc"><b>%i18n:common.misskey%</b> - <span @click="about = true">%i18n:@about%</span></p>
|
||||||
|
<p class="account">
|
||||||
|
<button class="signup" @click="signup">%i18n:@signup-button%</button>
|
||||||
|
<button class="signin" @click="signin">%i18n:@signin-button%</button>
|
||||||
|
</p>
|
||||||
|
|
||||||
<div class="tl">
|
<div class="tl">
|
||||||
<header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header>
|
<header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header>
|
||||||
@@ -33,12 +44,12 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { docsUrl, copyright, lang } from '../../../config';
|
import { copyright } from '../../../config';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
aboutUrl: `${docsUrl}/${lang}/about`,
|
about: false,
|
||||||
copyright
|
copyright
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@@ -69,13 +80,18 @@ export default Vue.extend({
|
|||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
@import '~const.styl'
|
@import '~const.styl'
|
||||||
|
|
||||||
|
@import url(https://fonts.googleapis.com/earlyaccess/notosansjp.css);
|
||||||
|
|
||||||
root(isDark)
|
root(isDark)
|
||||||
display flex
|
display flex
|
||||||
flex-direction column
|
flex-direction column
|
||||||
flex 1
|
flex 1
|
||||||
|
background-image isDark ? url('/assets/welcome-bg.dark.svg') : url('/assets/welcome-bg.light.svg')
|
||||||
|
background-size cover
|
||||||
|
background-position center
|
||||||
|
|
||||||
> button
|
> button
|
||||||
position absolute
|
position fixed
|
||||||
z-index 1
|
z-index 1
|
||||||
top 0
|
top 0
|
||||||
left 0
|
left 0
|
||||||
@@ -87,81 +103,120 @@ root(isDark)
|
|||||||
flex 1
|
flex 1
|
||||||
padding 64px 0 0 0
|
padding 64px 0 0 0
|
||||||
text-align center
|
text-align center
|
||||||
color isDark ? #9aa4b3 : #555
|
|
||||||
|
|
||||||
> img
|
&.about
|
||||||
width 350px
|
font-family 'Noto Sans JP'
|
||||||
|
color isDark ? #fff : #627574
|
||||||
|
|
||||||
> p
|
> article
|
||||||
margin 8px 0
|
max-width 700px
|
||||||
line-height 2em
|
margin 42px auto 0 auto
|
||||||
|
padding 64px 82px
|
||||||
|
background isDark ? #282C37 : #fff
|
||||||
|
box-shadow 0 8px 32px rgba(#000, 0.15)
|
||||||
|
|
||||||
button
|
> h1
|
||||||
padding 8px 16px
|
margin 0
|
||||||
font-size inherit
|
font-weight 900
|
||||||
|
|
||||||
.signup
|
> p
|
||||||
color $theme-color
|
margin 20px 0
|
||||||
border solid 2px $theme-color
|
line-height 2em
|
||||||
border-radius 4px
|
|
||||||
|
|
||||||
&:focus
|
> .gotit
|
||||||
box-shadow 0 0 0 3px rgba($theme-color, 0.2)
|
color $theme-color
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color $theme-color-foreground
|
text-decoration underline
|
||||||
background $theme-color
|
|
||||||
|
|
||||||
&:active
|
&.index
|
||||||
color $theme-color-foreground
|
color isDark ? #9aa4b3 : #555
|
||||||
background darken($theme-color, 10%)
|
|
||||||
border-color darken($theme-color, 10%)
|
|
||||||
|
|
||||||
.signin
|
> img
|
||||||
&:hover
|
width 350px
|
||||||
color isDark ? #fff : #000
|
|
||||||
|
|
||||||
> .tl
|
> .desc
|
||||||
margin 32px auto 0 auto
|
margin -12px 0 24px 0
|
||||||
width 410px
|
color isDark ? #fff : #555
|
||||||
text-align left
|
|
||||||
background isDark ? #313543 : #fff
|
|
||||||
border-radius 8px
|
|
||||||
box-shadow 0 8px 32px rgba(#000, 0.15)
|
|
||||||
overflow hidden
|
|
||||||
|
|
||||||
> header
|
> span
|
||||||
z-index 1
|
color $theme-color
|
||||||
padding 12px 16px
|
cursor pointer
|
||||||
color isDark ? #e3e5e8 : #888d94
|
|
||||||
box-shadow 0 1px 0px rgba(#000, 0.1)
|
|
||||||
|
|
||||||
> div
|
&:hover
|
||||||
position absolute
|
text-decoration underline
|
||||||
top 0
|
|
||||||
right 0
|
|
||||||
padding inherit
|
|
||||||
|
|
||||||
> span
|
> .account
|
||||||
display inline-block
|
margin 8px 0
|
||||||
height 11px
|
line-height 2em
|
||||||
width 11px
|
|
||||||
margin-left 6px
|
|
||||||
border-radius 100%
|
|
||||||
vertical-align middle
|
|
||||||
|
|
||||||
&:nth-child(1)
|
button
|
||||||
background #5BCC8B
|
padding 8px 16px
|
||||||
|
font-size inherit
|
||||||
|
|
||||||
&:nth-child(2)
|
.signup
|
||||||
background #E6BB46
|
color $theme-color
|
||||||
|
border solid 2px $theme-color
|
||||||
|
border-radius 4px
|
||||||
|
|
||||||
&:nth-child(3)
|
&:focus
|
||||||
background #DF7065
|
box-shadow 0 0 0 3px rgba($theme-color, 0.2)
|
||||||
|
|
||||||
> .mk-welcome-timeline
|
&:hover
|
||||||
max-height 350px
|
color $theme-color-foreground
|
||||||
overflow auto
|
background $theme-color
|
||||||
|
|
||||||
|
&:active
|
||||||
|
color $theme-color-foreground
|
||||||
|
background darken($theme-color, 10%)
|
||||||
|
border-color darken($theme-color, 10%)
|
||||||
|
|
||||||
|
.signin
|
||||||
|
&:hover
|
||||||
|
color isDark ? #fff : #000
|
||||||
|
|
||||||
|
> .tl
|
||||||
|
margin 32px auto 0 auto
|
||||||
|
width 410px
|
||||||
|
text-align left
|
||||||
|
background isDark ? #313543 : #fff
|
||||||
|
border-radius 8px
|
||||||
|
box-shadow 0 8px 32px rgba(#000, 0.15)
|
||||||
|
overflow hidden
|
||||||
|
|
||||||
|
> header
|
||||||
|
z-index 1
|
||||||
|
padding 12px 16px
|
||||||
|
color isDark ? #e3e5e8 : #888d94
|
||||||
|
box-shadow 0 1px 0px rgba(#000, 0.1)
|
||||||
|
|
||||||
|
> div
|
||||||
|
position absolute
|
||||||
|
top 0
|
||||||
|
right 0
|
||||||
|
padding inherit
|
||||||
|
|
||||||
|
> span
|
||||||
|
display inline-block
|
||||||
|
height 11px
|
||||||
|
width 11px
|
||||||
|
margin-left 6px
|
||||||
|
border-radius 100%
|
||||||
|
vertical-align middle
|
||||||
|
|
||||||
|
&:nth-child(1)
|
||||||
|
background #5BCC8B
|
||||||
|
|
||||||
|
&:nth-child(2)
|
||||||
|
background #E6BB46
|
||||||
|
|
||||||
|
&:nth-child(3)
|
||||||
|
background #DF7065
|
||||||
|
|
||||||
|
> .mk-welcome-timeline
|
||||||
|
max-height 350px
|
||||||
|
overflow auto
|
||||||
|
|
||||||
> footer
|
> footer
|
||||||
font-size 12px
|
font-size 12px
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<template v-if="props.design == 0">
|
<template v-if="props.design == 0">
|
||||||
<p class="title">%fa:pencil-alt%%i18n:@title%</p>
|
<p class="title">%fa:pencil-alt%%i18n:@title%</p>
|
||||||
</template>
|
</template>
|
||||||
<textarea :disabled="posting" v-model="text" @keydown="onKeydown" placeholder="%i18n:@placeholder%"></textarea>
|
<textarea :disabled="posting" v-model="text" @keydown="onKeydown" :placeholder="placeholder"></textarea>
|
||||||
<button @click="post" :disabled="posting">%i18n:@note%</button>
|
<button @click="post" :disabled="posting">%i18n:@note%</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -22,6 +22,19 @@ export default define({
|
|||||||
text: ''
|
text: ''
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
placeholder(): string {
|
||||||
|
const xs = [
|
||||||
|
'%i18n:common.note-placeholders.a%',
|
||||||
|
'%i18n:common.note-placeholders.b%',
|
||||||
|
'%i18n:common.note-placeholders.c%',
|
||||||
|
'%i18n:common.note-placeholders.d%',
|
||||||
|
'%i18n:common.note-placeholders.e%',
|
||||||
|
'%i18n:common.note-placeholders.f%'
|
||||||
|
];
|
||||||
|
return xs[Math.floor(Math.random() * xs.length)];
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
func() {
|
func() {
|
||||||
if (this.props.design == 1) {
|
if (this.props.design == 1) {
|
||||||
|
|||||||
@@ -67,14 +67,6 @@ const html = document.documentElement;
|
|||||||
html.setAttribute('lang', lang);
|
html.setAttribute('lang', lang);
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
//#region Set description meta tag
|
|
||||||
const head = document.getElementsByTagName('head')[0];
|
|
||||||
const meta = document.createElement('meta');
|
|
||||||
meta.setAttribute('name', 'description');
|
|
||||||
meta.setAttribute('content', '%i18n:common.misskey%');
|
|
||||||
head.appendChild(meta);
|
|
||||||
//#endregion
|
|
||||||
|
|
||||||
// iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする
|
// iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする
|
||||||
try {
|
try {
|
||||||
localStorage.setItem('kyoppie', 'yuppie');
|
localStorage.setItem('kyoppie', 'yuppie');
|
||||||
|
|||||||
@@ -32,10 +32,14 @@ import MkNotifications from './views/pages/notifications.vue';
|
|||||||
import MkWidgets from './views/pages/widgets.vue';
|
import MkWidgets from './views/pages/widgets.vue';
|
||||||
import MkMessaging from './views/pages/messaging.vue';
|
import MkMessaging from './views/pages/messaging.vue';
|
||||||
import MkMessagingRoom from './views/pages/messaging-room.vue';
|
import MkMessagingRoom from './views/pages/messaging-room.vue';
|
||||||
|
import MkReceivedFollowRequests from './views/pages/received-follow-requests.vue';
|
||||||
import MkNote from './views/pages/note.vue';
|
import MkNote from './views/pages/note.vue';
|
||||||
import MkSearch from './views/pages/search.vue';
|
import MkSearch from './views/pages/search.vue';
|
||||||
import MkFollowers from './views/pages/followers.vue';
|
import MkFollowers from './views/pages/followers.vue';
|
||||||
import MkFollowing from './views/pages/following.vue';
|
import MkFollowing from './views/pages/following.vue';
|
||||||
|
import MkFavorites from './views/pages/favorites.vue';
|
||||||
|
import MkUserLists from './views/pages/user-lists.vue';
|
||||||
|
import MkUserList from './views/pages/user-list.vue';
|
||||||
import MkSettings from './views/pages/settings.vue';
|
import MkSettings from './views/pages/settings.vue';
|
||||||
import MkOthello from './views/pages/othello.vue';
|
import MkOthello from './views/pages/othello.vue';
|
||||||
|
|
||||||
@@ -72,6 +76,10 @@ init((launch) => {
|
|||||||
{ path: '/signup', name: 'signup', component: MkSignup },
|
{ path: '/signup', name: 'signup', component: MkSignup },
|
||||||
{ path: '/i/settings', name: 'settings', component: MkSettings },
|
{ path: '/i/settings', name: 'settings', component: MkSettings },
|
||||||
{ path: '/i/notifications', name: 'notifications', component: MkNotifications },
|
{ path: '/i/notifications', name: 'notifications', component: MkNotifications },
|
||||||
|
{ path: '/i/favorites', name: 'favorites', component: MkFavorites },
|
||||||
|
{ path: '/i/lists', name: 'user-lists', component: MkUserLists },
|
||||||
|
{ path: '/i/lists/:list', name: 'user-list', component: MkUserList },
|
||||||
|
{ path: '/i/received-follow-requests', name: 'received-follow-requests', component: MkReceivedFollowRequests },
|
||||||
{ path: '/i/widgets', name: 'widgets', component: MkWidgets },
|
{ path: '/i/widgets', name: 'widgets', component: MkWidgets },
|
||||||
{ path: '/i/messaging', name: 'messaging', component: MkMessaging },
|
{ path: '/i/messaging', name: 'messaging', component: MkMessaging },
|
||||||
{ path: '/i/messaging/:user', component: MkMessagingRoom },
|
{ path: '/i/messaging/:user', component: MkMessagingRoom },
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
<template>
|
<template>
|
||||||
<button class="mk-follow-button"
|
<button class="mk-follow-button"
|
||||||
:class="{ wait: wait, follow: !user.isFollowing, unfollow: user.isFollowing }"
|
:class="{ wait: wait, active: u.isFollowing || u.hasPendingFollowRequestFromYou }"
|
||||||
@click="onClick"
|
@click="onClick"
|
||||||
:disabled="wait"
|
:disabled="wait"
|
||||||
>
|
>
|
||||||
<template v-if="!wait && user.isFollowing">%fa:minus%</template>
|
<template v-if="!wait">
|
||||||
<template v-if="!wait && !user.isFollowing">%fa:plus%</template>
|
<template v-if="u.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template>
|
||||||
<template v-if="wait">%fa:spinner .pulse .fw%</template>
|
<template v-else-if="u.isFollowing">%fa:minus% %i18n:@unfollow%</template>
|
||||||
{{ user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%' }}
|
<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus% %i18n:@follow-request%</template>
|
||||||
|
<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus% %i18n:@follow%</template>
|
||||||
|
</template>
|
||||||
|
<template v-else>%fa:spinner .pulse .fw%</template>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -22,6 +25,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
u: this.user,
|
||||||
wait: false,
|
wait: false,
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null
|
connectionId: null
|
||||||
@@ -42,39 +46,44 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
|
|
||||||
onFollow(user) {
|
onFollow(user) {
|
||||||
if (user.id == this.user.id) {
|
if (user.id == this.u.id) {
|
||||||
this.user.isFollowing = user.isFollowing;
|
this.u.isFollowing = user.isFollowing;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onUnfollow(user) {
|
onUnfollow(user) {
|
||||||
if (user.id == this.user.id) {
|
if (user.id == this.u.id) {
|
||||||
this.user.isFollowing = user.isFollowing;
|
this.u.isFollowing = user.isFollowing;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onClick() {
|
async onClick() {
|
||||||
this.wait = true;
|
this.wait = true;
|
||||||
if (this.user.isFollowing) {
|
|
||||||
(this as any).api('following/delete', {
|
try {
|
||||||
userId: this.user.id
|
if (this.u.isFollowing) {
|
||||||
}).then(() => {
|
this.u = await (this as any).api('following/delete', {
|
||||||
this.user.isFollowing = false;
|
userId: this.u.id
|
||||||
}).catch(err => {
|
});
|
||||||
console.error(err);
|
} else {
|
||||||
}).then(() => {
|
if (this.u.isLocked && this.u.hasPendingFollowRequestFromYou) {
|
||||||
this.wait = false;
|
this.u = await (this as any).api('following/requests/cancel', {
|
||||||
});
|
userId: this.u.id
|
||||||
} else {
|
});
|
||||||
(this as any).api('following/create', {
|
} else if (this.u.isLocked) {
|
||||||
userId: this.user.id
|
this.u = await (this as any).api('following/create', {
|
||||||
}).then(() => {
|
userId: this.u.id
|
||||||
this.user.isFollowing = true;
|
});
|
||||||
}).catch(err => {
|
} else {
|
||||||
console.error(err);
|
this.u = await (this as any).api('following/create', {
|
||||||
}).then(() => {
|
userId: this.user.id
|
||||||
this.wait = false;
|
});
|
||||||
});
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
} finally {
|
||||||
|
this.wait = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,34 +99,38 @@ export default Vue.extend({
|
|||||||
cursor pointer
|
cursor pointer
|
||||||
padding 0 16px
|
padding 0 16px
|
||||||
margin 0
|
margin 0
|
||||||
height inherit
|
min-width 150px
|
||||||
font-size 16px
|
line-height 36px
|
||||||
|
font-size 14px
|
||||||
|
color $theme-color
|
||||||
|
background transparent
|
||||||
outline none
|
outline none
|
||||||
border solid 1px $theme-color
|
border solid 1px $theme-color
|
||||||
border-radius 4px
|
border-radius 36px
|
||||||
|
|
||||||
*
|
&:hover
|
||||||
pointer-events none
|
background rgba($theme-color, 0.1)
|
||||||
|
|
||||||
&.follow
|
&:active
|
||||||
color $theme-color
|
background rgba($theme-color, 0.2)
|
||||||
background transparent
|
|
||||||
|
|
||||||
&:hover
|
&.active
|
||||||
background rgba($theme-color, 0.1)
|
|
||||||
|
|
||||||
&:active
|
|
||||||
background rgba($theme-color, 0.2)
|
|
||||||
|
|
||||||
&.unfollow
|
|
||||||
color $theme-color-foreground
|
color $theme-color-foreground
|
||||||
background $theme-color
|
background $theme-color
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
background lighten($theme-color, 10%)
|
||||||
|
border-color lighten($theme-color, 10%)
|
||||||
|
|
||||||
|
&:active
|
||||||
|
background darken($theme-color, 10%)
|
||||||
|
border-color darken($theme-color, 10%)
|
||||||
|
|
||||||
&.wait
|
&.wait
|
||||||
cursor wait !important
|
cursor wait !important
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
|
|
||||||
> [data-fa]
|
*
|
||||||
margin-right 4px
|
pointer-events none
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -1,101 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div class="root sub">
|
|
||||||
<mk-avatar class="avatar" :user="note.user"/>
|
|
||||||
<div class="main">
|
|
||||||
<header>
|
|
||||||
<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
|
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
|
||||||
<router-link class="time" :to="note | notePage">
|
|
||||||
<mk-time :time="note.createdAt"/>
|
|
||||||
</router-link>
|
|
||||||
</header>
|
|
||||||
<div class="body">
|
|
||||||
<mk-sub-note-content class="text" :note="note"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import Vue from 'vue';
|
|
||||||
|
|
||||||
export default Vue.extend({
|
|
||||||
props: ['note']
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
|
||||||
root(isDark)
|
|
||||||
padding 8px
|
|
||||||
font-size 0.9em
|
|
||||||
background isDark ? #21242d : #fdfdfd
|
|
||||||
|
|
||||||
@media (min-width 500px)
|
|
||||||
padding 12px
|
|
||||||
|
|
||||||
@media (min-width 600px)
|
|
||||||
padding 24px 32px
|
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
> .avatar
|
|
||||||
display block
|
|
||||||
float left
|
|
||||||
margin 0 12px 0 0
|
|
||||||
width 48px
|
|
||||||
height 48px
|
|
||||||
border-radius 8px
|
|
||||||
|
|
||||||
> .main
|
|
||||||
float left
|
|
||||||
width calc(100% - 60px)
|
|
||||||
|
|
||||||
> header
|
|
||||||
display flex
|
|
||||||
align-items baseline
|
|
||||||
margin-bottom 4px
|
|
||||||
white-space nowrap
|
|
||||||
|
|
||||||
> .name
|
|
||||||
display block
|
|
||||||
margin 0 .5em 0 0
|
|
||||||
padding 0
|
|
||||||
overflow hidden
|
|
||||||
color isDark ? #fff : #607073
|
|
||||||
font-size 1em
|
|
||||||
font-weight 700
|
|
||||||
text-align left
|
|
||||||
text-decoration none
|
|
||||||
text-overflow ellipsis
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
text-decoration underline
|
|
||||||
|
|
||||||
> .username
|
|
||||||
text-align left
|
|
||||||
margin 0 .5em 0 0
|
|
||||||
color isDark ? #606984 : #d1d8da
|
|
||||||
|
|
||||||
> .time
|
|
||||||
margin-left auto
|
|
||||||
color isDark ? #606984 : #b2b8bb
|
|
||||||
|
|
||||||
> .body
|
|
||||||
|
|
||||||
> .text
|
|
||||||
cursor default
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
font-size 1.1em
|
|
||||||
color isDark ? #959ba7 : #717171
|
|
||||||
|
|
||||||
.root.sub[data-darkmode]
|
|
||||||
root(true)
|
|
||||||
|
|
||||||
.root.sub:not([data-darkmode])
|
|
||||||
root(false)
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@@ -87,7 +87,7 @@ import parse from '../../../../../text/parse';
|
|||||||
|
|
||||||
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
import MkNoteMenu from '../../../common/views/components/note-menu.vue';
|
||||||
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
import MkReactionPicker from '../../../common/views/components/reaction-picker.vue';
|
||||||
import XSub from './note-detail.sub.vue';
|
import XSub from './note.sub.vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
components: {
|
components: {
|
||||||
@@ -172,7 +172,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
fetchContext() {
|
fetchConversation() {
|
||||||
this.conversationFetching = true;
|
this.conversationFetching = true;
|
||||||
|
|
||||||
// Fetch conversation
|
// Fetch conversation
|
||||||
@@ -216,8 +216,6 @@ export default Vue.extend({
|
|||||||
|
|
||||||
root(isDark)
|
root(isDark)
|
||||||
overflow hidden
|
overflow hidden
|
||||||
margin 0 auto
|
|
||||||
padding 0
|
|
||||||
width 100%
|
width 100%
|
||||||
text-align left
|
text-align left
|
||||||
background isDark ? #282C37 : #fff
|
background isDark ? #282C37 : #fff
|
||||||
|
|||||||
@@ -9,9 +9,18 @@
|
|||||||
<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
|
<span class="is-bot" v-if="note.user.isBot">%i18n:@bot%</span>
|
||||||
<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
|
<span class="is-cat" v-if="note.user.isCat">%i18n:@cat%</span>
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
<span class="username"><mk-acct :user="note.user"/></span>
|
||||||
<router-link class="time" :to="note | notePage">
|
<div class="info">
|
||||||
<mk-time :time="note.createdAt"/>
|
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
|
||||||
</router-link>
|
<router-link class="created-at" :to="note | notePage">
|
||||||
|
<mk-time :time="note.createdAt"/>
|
||||||
|
</router-link>
|
||||||
|
<span class="visibility" v-if="note.visibility != 'public'">
|
||||||
|
<template v-if="note.visibility == 'home'">%fa:home%</template>
|
||||||
|
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
|
||||||
|
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
|
||||||
|
<template v-if="note.visibility == 'private'">%fa:lock%</template>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<mk-sub-note-content class="text" :note="note"/>
|
<mk-sub-note-content class="text" :note="note"/>
|
||||||
@@ -30,14 +39,16 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
root(isDark)
|
root(isDark)
|
||||||
|
display flex
|
||||||
margin 0
|
margin 0
|
||||||
padding 0
|
padding 0
|
||||||
font-size 0.9em
|
font-size 10px
|
||||||
|
|
||||||
&:after
|
@media (min-width 350px)
|
||||||
content ""
|
font-size 12px
|
||||||
display block
|
|
||||||
clear both
|
@media (min-width 500px)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
&.smart
|
&.smart
|
||||||
> .main
|
> .main
|
||||||
@@ -47,24 +58,26 @@ root(isDark)
|
|||||||
align-items center
|
align-items center
|
||||||
|
|
||||||
> .avatar
|
> .avatar
|
||||||
|
flex-shrink 0
|
||||||
display block
|
display block
|
||||||
float left
|
margin 0 10px 0 0
|
||||||
margin 0 12px 0 0
|
width 40px
|
||||||
width 48px
|
height 40px
|
||||||
height 48px
|
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
|
||||||
@media (max-width 500px)
|
@media (min-width 350px)
|
||||||
margin 0 10px 0 0
|
margin 0 10px 0 0
|
||||||
width 44px
|
width 44px
|
||||||
height 44px
|
height 44px
|
||||||
|
|
||||||
> .main
|
@media (min-width 500px)
|
||||||
float left
|
margin 0 12px 0 0
|
||||||
width calc(100% - 60px)
|
width 48px
|
||||||
|
height 48px
|
||||||
|
|
||||||
@media (max-width 500px)
|
> .main
|
||||||
width calc(100% - 54px)
|
flex 1
|
||||||
|
min-width 0
|
||||||
|
|
||||||
> header
|
> header
|
||||||
display flex
|
display flex
|
||||||
@@ -97,7 +110,7 @@ root(isDark)
|
|||||||
align-self center
|
align-self center
|
||||||
margin 0 0.5em 0 0
|
margin 0 0.5em 0 0
|
||||||
padding 1px 6px
|
padding 1px 6px
|
||||||
font-size 10px
|
font-size 0.8em
|
||||||
color isDark ? #758188 : #aaa
|
color isDark ? #758188 : #aaa
|
||||||
border solid 1px isDark ? #57616f : #ddd
|
border solid 1px isDark ? #57616f : #ddd
|
||||||
border-radius 3px
|
border-radius 3px
|
||||||
@@ -112,9 +125,18 @@ root(isDark)
|
|||||||
text-overflow ellipsis
|
text-overflow ellipsis
|
||||||
color isDark ? #606984 : #d1d8da
|
color isDark ? #606984 : #d1d8da
|
||||||
|
|
||||||
> .time
|
> .info
|
||||||
margin-left auto
|
margin-left auto
|
||||||
color isDark ? #606984 : #b2b8bb
|
font-size 0.9em
|
||||||
|
|
||||||
|
> *
|
||||||
|
color isDark ? #606984 : #b2b8bb
|
||||||
|
|
||||||
|
> .mobile
|
||||||
|
margin-right 6px
|
||||||
|
|
||||||
|
> .visibility
|
||||||
|
margin-left 6px
|
||||||
|
|
||||||
> .body
|
> .body
|
||||||
|
|
||||||
|
|||||||
@@ -33,16 +33,33 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: ['note']
|
props: {
|
||||||
|
note: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
// TODO
|
||||||
|
truncate: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
root(isDark)
|
root(isDark)
|
||||||
|
display flex
|
||||||
padding 16px
|
padding 16px
|
||||||
font-size 0.9em
|
font-size 10px
|
||||||
background isDark ? #21242d : #fcfcfc
|
background isDark ? #21242d : #fcfcfc
|
||||||
|
|
||||||
|
@media (min-width 350px)
|
||||||
|
font-size 12px
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
font-size 14px
|
||||||
|
|
||||||
@media (min-width 600px)
|
@media (min-width 600px)
|
||||||
padding 24px 32px
|
padding 24px 32px
|
||||||
|
|
||||||
@@ -53,30 +70,27 @@ root(isDark)
|
|||||||
> header
|
> header
|
||||||
align-items center
|
align-items center
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
> .avatar
|
> .avatar
|
||||||
|
flex-shrink 0
|
||||||
display block
|
display block
|
||||||
float left
|
margin 0 8px 0 0
|
||||||
margin 0 10px 0 0
|
width 38px
|
||||||
width 42px
|
height 38px
|
||||||
height 42px
|
|
||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
|
||||||
|
@media (min-width 350px)
|
||||||
|
margin-right 10px
|
||||||
|
width 42px
|
||||||
|
height 42px
|
||||||
|
|
||||||
@media (min-width 500px)
|
@media (min-width 500px)
|
||||||
margin-right 14px
|
margin-right 14px
|
||||||
width 50px
|
width 50px
|
||||||
height 50px
|
height 50px
|
||||||
|
|
||||||
> .main
|
> .main
|
||||||
float left
|
flex 1
|
||||||
width calc(100% - 52px)
|
min-width 0
|
||||||
|
|
||||||
@media (min-width 500px)
|
|
||||||
width calc(100% - 64px)
|
|
||||||
|
|
||||||
> header
|
> header
|
||||||
display flex
|
display flex
|
||||||
@@ -112,7 +126,7 @@ root(isDark)
|
|||||||
align-self center
|
align-self center
|
||||||
margin 0 0.5em 0 0
|
margin 0 0.5em 0 0
|
||||||
padding 1px 5px
|
padding 1px 5px
|
||||||
font-size 10px
|
font-size 0.8em
|
||||||
color isDark ? #758188 : #aaa
|
color isDark ? #758188 : #aaa
|
||||||
border solid 1px isDark ? #57616f : #ddd
|
border solid 1px isDark ? #57616f : #ddd
|
||||||
border-radius 3px
|
border-radius 3px
|
||||||
@@ -140,11 +154,8 @@ root(isDark)
|
|||||||
margin-left 6px
|
margin-left 6px
|
||||||
|
|
||||||
> .body
|
> .body
|
||||||
max-height 128px
|
|
||||||
overflow hidden
|
|
||||||
|
|
||||||
> .text
|
> .text
|
||||||
cursor default
|
|
||||||
margin 0
|
margin 0
|
||||||
padding 0
|
padding 0
|
||||||
color isDark ? #959ba7 : #717171
|
color isDark ? #959ba7 : #717171
|
||||||
|
|||||||
@@ -269,8 +269,6 @@ root(isDark)
|
|||||||
&.smart
|
&.smart
|
||||||
> article
|
> article
|
||||||
> .main
|
> .main
|
||||||
width 100%
|
|
||||||
|
|
||||||
> header
|
> header
|
||||||
align-items center
|
align-items center
|
||||||
margin-bottom 4px
|
margin-bottom 4px
|
||||||
@@ -328,27 +326,28 @@ root(isDark)
|
|||||||
padding-top 8px
|
padding-top 8px
|
||||||
|
|
||||||
> article
|
> article
|
||||||
|
display flex
|
||||||
padding 16px 16px 9px
|
padding 16px 16px 9px
|
||||||
|
|
||||||
@media (min-width 600px)
|
@media (min-width 600px)
|
||||||
padding 32px 32px 22px
|
padding 32px 32px 22px
|
||||||
|
|
||||||
&:after
|
|
||||||
content ""
|
|
||||||
display block
|
|
||||||
clear both
|
|
||||||
|
|
||||||
> .avatar
|
> .avatar
|
||||||
|
flex-shrink 0
|
||||||
display block
|
display block
|
||||||
float left
|
|
||||||
margin 0 10px 8px 0
|
margin 0 10px 8px 0
|
||||||
width 48px
|
width 42px
|
||||||
height 48px
|
height 42px
|
||||||
border-radius 6px
|
border-radius 6px
|
||||||
//position -webkit-sticky
|
//position -webkit-sticky
|
||||||
//position sticky
|
//position sticky
|
||||||
//top 62px
|
//top 62px
|
||||||
|
|
||||||
|
@media (min-width 350px)
|
||||||
|
width 48px
|
||||||
|
height 48px
|
||||||
|
border-radius 6px
|
||||||
|
|
||||||
@media (min-width 500px)
|
@media (min-width 500px)
|
||||||
margin-right 16px
|
margin-right 16px
|
||||||
width 58px
|
width 58px
|
||||||
@@ -356,11 +355,8 @@ root(isDark)
|
|||||||
border-radius 8px
|
border-radius 8px
|
||||||
|
|
||||||
> .main
|
> .main
|
||||||
float left
|
flex 1
|
||||||
width calc(100% - 58px)
|
min-width 0
|
||||||
|
|
||||||
@media (min-width 500px)
|
|
||||||
width calc(100% - 74px)
|
|
||||||
|
|
||||||
> header
|
> header
|
||||||
display flex
|
display flex
|
||||||
@@ -393,7 +389,7 @@ root(isDark)
|
|||||||
align-self center
|
align-self center
|
||||||
margin 0 0.5em 0 0
|
margin 0 0.5em 0 0
|
||||||
padding 1px 6px
|
padding 1px 6px
|
||||||
font-size 12px
|
font-size 0.8em
|
||||||
color isDark ? #758188 : #aaa
|
color isDark ? #758188 : #aaa
|
||||||
border solid 1px isDark ? #57616f : #ddd
|
border solid 1px isDark ? #57616f : #ddd
|
||||||
border-radius 3px
|
border-radius 3px
|
||||||
@@ -422,6 +418,8 @@ root(isDark)
|
|||||||
margin-left 6px
|
margin-left 6px
|
||||||
|
|
||||||
> .body
|
> .body
|
||||||
|
@media (min-width 700px)
|
||||||
|
font-size 1.1em
|
||||||
|
|
||||||
> .cw
|
> .cw
|
||||||
cursor default
|
cursor default
|
||||||
@@ -504,7 +502,7 @@ root(isDark)
|
|||||||
padding 2px 8px 2px 16px
|
padding 2px 8px 2px 16px
|
||||||
font-size 90%
|
font-size 90%
|
||||||
color #8d969e
|
color #8d969e
|
||||||
background #edf0f3
|
background isDark ? #313543 : #edf0f3
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
&:before
|
&:before
|
||||||
@@ -517,7 +515,7 @@ root(isDark)
|
|||||||
width 8px
|
width 8px
|
||||||
height 8px
|
height 8px
|
||||||
margin auto 0
|
margin auto 0
|
||||||
background #fff
|
background isDark ? #282c37 : #fff
|
||||||
border-radius 100%
|
border-radius 100%
|
||||||
|
|
||||||
> .media
|
> .media
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-notification-preview" :class="notification.type">
|
<div class="mk-notification-preview" :class="notification.type">
|
||||||
<template v-if="notification.type == 'reaction'">
|
<template v-if="notification.type == 'reaction'">
|
||||||
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p><mk-reaction-icon :reaction="notification.reaction"/>{{ notification.user | userName }}</p>
|
<p><mk-reaction-icon :reaction="notification.reaction"/>{{ notification.user | userName }}</p>
|
||||||
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
|
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'renote'">
|
<template v-if="notification.type == 'renote'">
|
||||||
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:retweet%{{ notification.note.user | userName }}</p>
|
<p>%fa:retweet%{{ notification.note.user | userName }}</p>
|
||||||
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%</p>
|
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%</p>
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'quote'">
|
<template v-if="notification.type == 'quote'">
|
||||||
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:quote-left%{{ notification.note.user | userName }}</p>
|
<p>%fa:quote-left%{{ notification.note.user | userName }}</p>
|
||||||
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
|
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
|
||||||
@@ -25,14 +25,21 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'follow'">
|
<template v-if="notification.type == 'follow'">
|
||||||
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:user-plus%{{ notification.user | userName }}</p>
|
<p>%fa:user-plus%{{ notification.user | userName }}</p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template v-if="notification.type == 'receiveFollowRequest'">
|
||||||
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
|
<div class="text">
|
||||||
|
<p>%fa:user-clock%{{ notification.user | userName }}</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'reply'">
|
<template v-if="notification.type == 'reply'">
|
||||||
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:reply%{{ notification.note.user | userName }}</p>
|
<p>%fa:reply%{{ notification.note.user | userName }}</p>
|
||||||
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
|
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
|
||||||
@@ -40,7 +47,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'mention'">
|
<template v-if="notification.type == 'mention'">
|
||||||
<img class="avatar" :src="`${notification.note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:at%{{ notification.note.user | userName }}</p>
|
<p>%fa:at%{{ notification.note.user | userName }}</p>
|
||||||
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
|
<p class="note-preview">{{ getNoteSummary(notification.note) }}</p>
|
||||||
@@ -48,7 +55,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'poll_vote'">
|
<template v-if="notification.type == 'poll_vote'">
|
||||||
<img class="avatar" :src="`${notification.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:chart-pie%{{ notification.user | userName }}</p>
|
<p>%fa:chart-pie%{{ notification.user | userName }}</p>
|
||||||
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
|
<p class="note-ref">%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%</p>
|
||||||
@@ -83,16 +90,14 @@ export default Vue.extend({
|
|||||||
display block
|
display block
|
||||||
clear both
|
clear both
|
||||||
|
|
||||||
img
|
> .avatar
|
||||||
display block
|
display block
|
||||||
float left
|
float left
|
||||||
min-width 36px
|
width 36px
|
||||||
min-height 36px
|
height 36px
|
||||||
max-width 36px
|
|
||||||
max-height 36px
|
|
||||||
border-radius 6px
|
border-radius 6px
|
||||||
|
|
||||||
.text
|
> .text
|
||||||
float right
|
float right
|
||||||
width calc(100% - 36px)
|
width calc(100% - 36px)
|
||||||
padding-left 8px
|
padding-left 8px
|
||||||
@@ -120,6 +125,10 @@ export default Vue.extend({
|
|||||||
.text p i
|
.text p i
|
||||||
color #53c7ce
|
color #53c7ce
|
||||||
|
|
||||||
|
&.receiveFollowRequest
|
||||||
|
.text p i
|
||||||
|
color #888
|
||||||
|
|
||||||
&.reply, &.mention
|
&.reply, &.mention
|
||||||
.text p i
|
.text p i
|
||||||
color #fff
|
color #fff
|
||||||
|
|||||||
@@ -40,6 +40,17 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="notification followRequest" v-if="notification.type == 'receiveFollowRequest'">
|
||||||
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
|
<div>
|
||||||
|
<header>
|
||||||
|
%fa:user-clock%
|
||||||
|
<router-link :to="notification.user | userPage">{{ notification.user | userName }}</router-link>
|
||||||
|
<mk-time :time="notification.createdAt"/>
|
||||||
|
</header>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="notification poll_vote" v-if="notification.type == 'poll_vote'">
|
<div class="notification poll_vote" v-if="notification.type == 'poll_vote'">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div>
|
<div>
|
||||||
@@ -55,15 +66,15 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<template v-if="notification.type == 'quote'">
|
<template v-if="notification.type == 'quote'">
|
||||||
<mk-note :note="notification.note"/>
|
<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'reply'">
|
<template v-if="notification.type == 'reply'">
|
||||||
<mk-note :note="notification.note"/>
|
<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template v-if="notification.type == 'mention'">
|
<template v-if="notification.type == 'mention'">
|
||||||
<mk-note :note="notification.note"/>
|
<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -78,6 +89,17 @@ export default Vue.extend({
|
|||||||
return {
|
return {
|
||||||
getNoteSummary
|
getNoteSummary
|
||||||
};
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onNoteUpdated(note) {
|
||||||
|
switch (this.notification.type) {
|
||||||
|
case 'quote':
|
||||||
|
case 'reply':
|
||||||
|
case 'mention':
|
||||||
|
Vue.set(this.notification, 'note', note);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
@@ -156,6 +178,10 @@ root(isDark)
|
|||||||
> div > header i
|
> div > header i
|
||||||
color #53c7ce
|
color #53c7ce
|
||||||
|
|
||||||
|
&.receiveFollowRequest
|
||||||
|
> div > header i
|
||||||
|
color #888
|
||||||
|
|
||||||
.mk-notification[data-darkmode]
|
.mk-notification[data-darkmode]
|
||||||
root(true)
|
root(true)
|
||||||
|
|
||||||
|
|||||||
@@ -5,11 +5,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span>
|
<span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span>
|
||||||
<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
|
<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
|
||||||
<button class="submit" :disabled="posting" @click="post">
|
<button class="submit" :disabled="posting" @click="post">{{ submitText }}</button>
|
||||||
<template v-if="reply">%i18n:@reply%</template>
|
|
||||||
<template v-else-if="renote">%i18n:@renote%</template>
|
|
||||||
<template v-else>%i18n:@submit%</template>
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="form">
|
<div class="form">
|
||||||
@@ -20,7 +16,7 @@
|
|||||||
<a @click="addVisibleUser">+%i18n:@add-visible-user%</a>
|
<a @click="addVisibleUser">+%i18n:@add-visible-user%</a>
|
||||||
</div>
|
</div>
|
||||||
<input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%">
|
<input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%">
|
||||||
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-placeholder%'"></textarea>
|
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder"></textarea>
|
||||||
<div class="attaches" v-show="files.length != 0">
|
<div class="attaches" v-show="files.length != 0">
|
||||||
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
|
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
|
||||||
<div class="file" v-for="file in files" :key="file.id">
|
<div class="file" v-for="file in files" :key="file.id">
|
||||||
@@ -74,6 +70,46 @@ export default Vue.extend({
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
draftId(): string {
|
||||||
|
return this.renote
|
||||||
|
? 'renote:' + this.renote.id
|
||||||
|
: this.reply
|
||||||
|
? 'reply:' + this.reply.id
|
||||||
|
: 'note';
|
||||||
|
},
|
||||||
|
|
||||||
|
placeholder(): string {
|
||||||
|
const xs = [
|
||||||
|
'%i18n:common.note-placeholders.a%',
|
||||||
|
'%i18n:common.note-placeholders.b%',
|
||||||
|
'%i18n:common.note-placeholders.c%',
|
||||||
|
'%i18n:common.note-placeholders.d%',
|
||||||
|
'%i18n:common.note-placeholders.e%',
|
||||||
|
'%i18n:common.note-placeholders.f%'
|
||||||
|
];
|
||||||
|
const x = xs[Math.floor(Math.random() * xs.length)];
|
||||||
|
|
||||||
|
return this.renote
|
||||||
|
? '%i18n:@quote-placeholder%'
|
||||||
|
: this.reply
|
||||||
|
? '%i18n:@reply-placeholder%'
|
||||||
|
: x;
|
||||||
|
},
|
||||||
|
|
||||||
|
submitText(): string {
|
||||||
|
return this.renote
|
||||||
|
? '%i18n:@renote%'
|
||||||
|
: this.reply
|
||||||
|
? '%i18n:@reply%'
|
||||||
|
: '%i18n:@submit%';
|
||||||
|
},
|
||||||
|
|
||||||
|
canPost(): boolean {
|
||||||
|
return !this.posting && (this.text.length != 0 || this.files.length != 0 || this.poll || this.renote);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.reply && this.reply.user.host != null) {
|
if (this.reply && this.reply.user.host != null) {
|
||||||
this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
|
this.text = `@${this.reply.user.username}@${this.reply.user.host} `;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p>
|
<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい、<b>{{ $store.state.i | userName }}</b>さん</p>
|
||||||
<div class="content" ref="mainContainer">
|
<div class="content" ref="mainContainer">
|
||||||
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
|
<button class="nav" @click="$parent.isDrawerOpening = true">%fa:bars%</button>
|
||||||
<template v-if="hasUnreadNotifications || hasUnreadMessagingMessages || hasGameInvitations">%fa:circle%</template>
|
<template v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation">%fa:circle%</template>
|
||||||
<h1>
|
<h1>
|
||||||
<slot>Misskey</slot>
|
<slot>Misskey</slot>
|
||||||
</h1>
|
</h1>
|
||||||
@@ -25,13 +25,19 @@ export default Vue.extend({
|
|||||||
props: ['func'],
|
props: ['func'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hasUnreadNotifications: false,
|
hasGameInvitation: false,
|
||||||
hasUnreadMessagingMessages: false,
|
|
||||||
hasGameInvitations: false,
|
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null
|
connectionId: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
hasUnreadNotification(): boolean {
|
||||||
|
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
||||||
|
},
|
||||||
|
hasUnreadMessagingMessage(): boolean {
|
||||||
|
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$store.commit('setUiHeaderHeight', 48);
|
this.$store.commit('setUiHeaderHeight', 48);
|
||||||
|
|
||||||
@@ -39,27 +45,9 @@ export default Vue.extend({
|
|||||||
this.connection = (this as any).os.stream.getConnection();
|
this.connection = (this as any).os.stream.getConnection();
|
||||||
this.connectionId = (this as any).os.stream.use();
|
this.connectionId = (this as any).os.stream.use();
|
||||||
|
|
||||||
this.connection.on('read_all_notifications', this.onReadAllNotifications);
|
|
||||||
this.connection.on('unread_notification', this.onUnreadNotification);
|
|
||||||
this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
|
|
||||||
this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
|
|
||||||
this.connection.on('othello_invited', this.onOthelloInvited);
|
this.connection.on('othello_invited', this.onOthelloInvited);
|
||||||
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
|
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
|
||||||
|
|
||||||
// Fetch count of unread notifications
|
|
||||||
(this as any).api('notifications/get_unread_count').then(res => {
|
|
||||||
if (res.count > 0) {
|
|
||||||
this.hasUnreadNotifications = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Fetch count of unread messaging messages
|
|
||||||
(this as any).api('messaging/unread').then(res => {
|
|
||||||
if (res.count > 0) {
|
|
||||||
this.hasUnreadMessagingMessages = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
|
const ago = (new Date().getTime() - new Date(this.$store.state.i.lastUsedAt).getTime()) / 1000;
|
||||||
const isHisasiburi = ago >= 3600;
|
const isHisasiburi = ago >= 3600;
|
||||||
this.$store.state.i.lastUsedAt = new Date();
|
this.$store.state.i.lastUsedAt = new Date();
|
||||||
@@ -110,33 +98,17 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection.off('read_all_notifications', this.onReadAllNotifications);
|
|
||||||
this.connection.off('unread_notification', this.onUnreadNotification);
|
|
||||||
this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
|
|
||||||
this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
|
|
||||||
this.connection.off('othello_invited', this.onOthelloInvited);
|
this.connection.off('othello_invited', this.onOthelloInvited);
|
||||||
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
|
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
|
||||||
(this as any).os.stream.dispose(this.connectionId);
|
(this as any).os.stream.dispose(this.connectionId);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onReadAllNotifications() {
|
|
||||||
this.hasUnreadNotifications = false;
|
|
||||||
},
|
|
||||||
onUnreadNotification() {
|
|
||||||
this.hasUnreadNotifications = true;
|
|
||||||
},
|
|
||||||
onReadAllMessagingMessages() {
|
|
||||||
this.hasUnreadMessagingMessages = false;
|
|
||||||
},
|
|
||||||
onUnreadMessagingMessage() {
|
|
||||||
this.hasUnreadMessagingMessages = true;
|
|
||||||
},
|
|
||||||
onOthelloInvited() {
|
onOthelloInvited() {
|
||||||
this.hasGameInvitations = true;
|
this.hasGameInvitation = true;
|
||||||
},
|
},
|
||||||
onOthelloNoInvites() {
|
onOthelloNoInvites() {
|
||||||
this.hasGameInvitations = false;
|
this.hasGameInvitation = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -15,21 +15,22 @@
|
|||||||
</router-link>
|
</router-link>
|
||||||
<div class="links">
|
<div class="links">
|
||||||
<ul>
|
<ul>
|
||||||
<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@home%%fa:angle-right%</router-link></li>
|
<li><router-link to="/" :data-active="$route.name == 'index'">%fa:home%%i18n:@timeline%%fa:angle-right%</router-link></li>
|
||||||
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotifications">%fa:circle%</template>%fa:angle-right%</router-link></li>
|
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'">%fa:R bell%%i18n:@notifications%<template v-if="hasUnreadNotification">%fa:circle%</template>%fa:angle-right%</router-link></li>
|
||||||
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessages">%fa:circle%</template>%fa:angle-right%</router-link></li>
|
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'">%fa:R comments%%i18n:@messaging%<template v-if="hasUnreadMessagingMessage">%fa:circle%</template>%fa:angle-right%</router-link></li>
|
||||||
<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%ゲーム<template v-if="hasGameInvitations">%fa:circle%</template>%fa:angle-right%</router-link></li>
|
<li v-if="$store.getters.isSignedIn && $store.state.i.isLocked"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'">%fa:R envelope%%i18n:@follow-requests%<template v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount">%fa:circle%</template>%fa:angle-right%</router-link></li>
|
||||||
|
<li><router-link to="/othello" :data-active="$route.name == 'othello'">%fa:gamepad%%i18n:@game%<template v-if="hasGameInvitation">%fa:circle%</template>%fa:angle-right%</router-link></li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:quidditch%%i18n:@widgets%%fa:angle-right%</router-link></li>
|
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'">%fa:R calendar-alt%%i18n:@widgets%%fa:angle-right%</router-link></li>
|
||||||
|
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'">%fa:star%%i18n:@favorites%%fa:angle-right%</router-link></li>
|
||||||
|
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'">%fa:list%%i18n:@user-lists%%fa:angle-right%</router-link></li>
|
||||||
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li>
|
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'">%fa:cloud%%i18n:@drive%%fa:angle-right%</router-link></li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>
|
<li><a @click="search">%fa:search%%i18n:@search%%fa:angle-right%</a></li>
|
||||||
</ul>
|
|
||||||
<ul>
|
|
||||||
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
|
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'">%fa:cog%%i18n:@settings%%fa:angle-right%</router-link></li>
|
||||||
<li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li>
|
<li @click="dark"><p><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>%i18n:@darkmode%</span></p></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<a :href="aboutUrl"><p class="about">%i18n:@about%</p></a>
|
<a :href="aboutUrl"><p class="about">%i18n:@about%</p></a>
|
||||||
@@ -46,47 +47,31 @@ export default Vue.extend({
|
|||||||
props: ['isOpen'],
|
props: ['isOpen'],
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
hasUnreadNotifications: false,
|
hasGameInvitation: false,
|
||||||
hasUnreadMessagingMessages: false,
|
|
||||||
hasGameInvitations: false,
|
|
||||||
connection: null,
|
connection: null,
|
||||||
connectionId: null,
|
connectionId: null,
|
||||||
aboutUrl: `${docsUrl}/${lang}/about`
|
aboutUrl: `${docsUrl}/${lang}/about`
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
hasUnreadNotification(): boolean {
|
||||||
|
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
||||||
|
},
|
||||||
|
hasUnreadMessagingMessage(): boolean {
|
||||||
|
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection = (this as any).os.stream.getConnection();
|
this.connection = (this as any).os.stream.getConnection();
|
||||||
this.connectionId = (this as any).os.stream.use();
|
this.connectionId = (this as any).os.stream.use();
|
||||||
|
|
||||||
this.connection.on('read_all_notifications', this.onReadAllNotifications);
|
|
||||||
this.connection.on('unread_notification', this.onUnreadNotification);
|
|
||||||
this.connection.on('read_all_messaging_messages', this.onReadAllMessagingMessages);
|
|
||||||
this.connection.on('unread_messaging_message', this.onUnreadMessagingMessage);
|
|
||||||
this.connection.on('othello_invited', this.onOthelloInvited);
|
this.connection.on('othello_invited', this.onOthelloInvited);
|
||||||
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
|
this.connection.on('othello_no_invites', this.onOthelloNoInvites);
|
||||||
|
|
||||||
// Fetch count of unread notifications
|
|
||||||
(this as any).api('notifications/get_unread_count').then(res => {
|
|
||||||
if (res.count > 0) {
|
|
||||||
this.hasUnreadNotifications = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Fetch count of unread messaging messages
|
|
||||||
(this as any).api('messaging/unread').then(res => {
|
|
||||||
if (res.count > 0) {
|
|
||||||
this.hasUnreadMessagingMessages = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
beforeDestroy() {
|
beforeDestroy() {
|
||||||
if (this.$store.getters.isSignedIn) {
|
if (this.$store.getters.isSignedIn) {
|
||||||
this.connection.off('read_all_notifications', this.onReadAllNotifications);
|
|
||||||
this.connection.off('unread_notification', this.onUnreadNotification);
|
|
||||||
this.connection.off('read_all_messaging_messages', this.onReadAllMessagingMessages);
|
|
||||||
this.connection.off('unread_messaging_message', this.onUnreadMessagingMessage);
|
|
||||||
this.connection.off('othello_invited', this.onOthelloInvited);
|
this.connection.off('othello_invited', this.onOthelloInvited);
|
||||||
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
|
this.connection.off('othello_no_invites', this.onOthelloNoInvites);
|
||||||
(this as any).os.stream.dispose(this.connectionId);
|
(this as any).os.stream.dispose(this.connectionId);
|
||||||
@@ -98,23 +83,11 @@ export default Vue.extend({
|
|||||||
if (query == null || query == '') return;
|
if (query == null || query == '') return;
|
||||||
this.$router.push('/search?q=' + encodeURIComponent(query));
|
this.$router.push('/search?q=' + encodeURIComponent(query));
|
||||||
},
|
},
|
||||||
onReadAllNotifications() {
|
|
||||||
this.hasUnreadNotifications = false;
|
|
||||||
},
|
|
||||||
onUnreadNotification() {
|
|
||||||
this.hasUnreadNotifications = true;
|
|
||||||
},
|
|
||||||
onReadAllMessagingMessages() {
|
|
||||||
this.hasUnreadMessagingMessages = false;
|
|
||||||
},
|
|
||||||
onUnreadMessagingMessage() {
|
|
||||||
this.hasUnreadMessagingMessages = true;
|
|
||||||
},
|
|
||||||
onOthelloInvited() {
|
onOthelloInvited() {
|
||||||
this.hasGameInvitations = true;
|
this.hasGameInvitation = true;
|
||||||
},
|
},
|
||||||
onOthelloNoInvites() {
|
onOthelloNoInvites() {
|
||||||
this.hasGameInvitations = false;
|
this.hasGameInvitation = false;
|
||||||
},
|
},
|
||||||
dark() {
|
dark() {
|
||||||
this.$store.commit('device/set', {
|
this.$store.commit('device/set', {
|
||||||
@@ -186,7 +159,10 @@ root(isDark)
|
|||||||
&:first-child
|
&:first-child
|
||||||
margin-top 0
|
margin-top 0
|
||||||
|
|
||||||
li
|
&:last-child
|
||||||
|
margin-bottom 0
|
||||||
|
|
||||||
|
> li
|
||||||
display block
|
display block
|
||||||
font-size 1em
|
font-size 1em
|
||||||
line-height 1em
|
line-height 1em
|
||||||
@@ -209,6 +185,8 @@ root(isDark)
|
|||||||
|
|
||||||
> [data-fa]:first-child
|
> [data-fa]:first-child
|
||||||
margin-right 0.5em
|
margin-right 0.5em
|
||||||
|
width 20px
|
||||||
|
text-align center
|
||||||
|
|
||||||
> [data-fa].circle
|
> [data-fa].circle
|
||||||
margin-left 6px
|
margin-left 6px
|
||||||
@@ -226,7 +204,7 @@ root(isDark)
|
|||||||
opacity 0.5
|
opacity 0.5
|
||||||
|
|
||||||
.about
|
.about
|
||||||
margin 0
|
margin 0 0 8px 0
|
||||||
padding 1em 0
|
padding 1em 0
|
||||||
text-align center
|
text-align center
|
||||||
font-size 0.8em
|
font-size 0.8em
|
||||||
|
|||||||
@@ -0,0 +1,94 @@
|
|||||||
|
<template>
|
||||||
|
<mk-ui>
|
||||||
|
<span slot="header">%fa:star%%i18n:@title%</span>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<template v-for="favorite in favorites">
|
||||||
|
<mk-note-detail class="post" :note="favorite.note" :key="favorite.note.id"/>
|
||||||
|
</template>
|
||||||
|
<a v-if="existMore" @click="more">%i18n:@more%</a>
|
||||||
|
</main>
|
||||||
|
</mk-ui>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import Progress from '../../../common/scripts/loading';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
favorites: [],
|
||||||
|
existMore: false,
|
||||||
|
moreFetching: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
document.title = 'Misskey | %i18n:@notifications%';
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
Progress.start();
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
(this as any).api('i/favorites', {
|
||||||
|
limit: 11
|
||||||
|
}).then(favorites => {
|
||||||
|
if (favorites.length == 11) {
|
||||||
|
this.existMore = true;
|
||||||
|
favorites.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.favorites = favorites;
|
||||||
|
this.fetching = false;
|
||||||
|
|
||||||
|
Progress.done();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
more() {
|
||||||
|
this.moreFetching = true;
|
||||||
|
(this as any).api('i/favorites', {
|
||||||
|
limit: 11,
|
||||||
|
maxId: this.favorites[this.favorites.length - 1].id
|
||||||
|
}).then(favorites => {
|
||||||
|
if (favorites.length == 11) {
|
||||||
|
this.existMore = true;
|
||||||
|
favorites.pop();
|
||||||
|
} else {
|
||||||
|
this.existMore = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.favorites = this.favorites.concat(favorites);
|
||||||
|
this.moreFetching = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
main
|
||||||
|
width 100%
|
||||||
|
max-width 680px
|
||||||
|
margin 0 auto
|
||||||
|
padding 8px
|
||||||
|
|
||||||
|
> .post
|
||||||
|
margin-bottom 8px
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
> .post
|
||||||
|
margin-bottom 16px
|
||||||
|
|
||||||
|
@media (min-width 600px)
|
||||||
|
padding 32px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
<template>
|
||||||
|
<mk-ui>
|
||||||
|
<span slot="header">%fa:envelope R%%i18n:@title%</span>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<div v-for="req in requests">
|
||||||
|
<router-link :key="req.id" :to="req.follower | userPage">{{ req.follower | userName }}</router-link>
|
||||||
|
<span>
|
||||||
|
<a @click="accept(req.follower)">%i18n:@accept%</a>|<a @click="reject(req.follower)">%i18n:@reject%</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</mk-ui>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import Progress from '../../../common/scripts/loading';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
requests: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
document.title = 'Misskey | %i18n:@title%';
|
||||||
|
|
||||||
|
Progress.start();
|
||||||
|
|
||||||
|
(this as any).api('following/requests/list').then(requests => {
|
||||||
|
this.fetching = false;
|
||||||
|
this.requests = requests;
|
||||||
|
|
||||||
|
Progress.done();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
accept(user) {
|
||||||
|
(this as any).api('following/requests/accept', { userId: user.id }).then(() => {
|
||||||
|
this.requests = this.requests.filter(r => r.follower.id != user.id);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
reject(user) {
|
||||||
|
(this as any).api('following/requests/reject', { userId: user.id }).then(() => {
|
||||||
|
this.requests = this.requests.filter(r => r.follower.id != user.id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
main
|
||||||
|
width 100%
|
||||||
|
max-width 680px
|
||||||
|
margin 0 auto
|
||||||
|
padding 8px
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
@media (min-width 600px)
|
||||||
|
padding 32px
|
||||||
|
|
||||||
|
> div
|
||||||
|
display flex
|
||||||
|
padding 16px
|
||||||
|
border solid 1px isDark ? #1c2023 : #eee
|
||||||
|
border-radius 4px
|
||||||
|
|
||||||
|
> span
|
||||||
|
margin 0 0 0 auto
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
<template>
|
||||||
|
<mk-ui>
|
||||||
|
<span slot="header" v-if="!fetching">%fa:list%{{ list.title }}</span>
|
||||||
|
|
||||||
|
<main v-if="!fetching">
|
||||||
|
<ul>
|
||||||
|
<li v-for="user in users" :key="user.id"><router-link :to="user | userPage">{{ user | userName }}</router-link></li>
|
||||||
|
</ul>
|
||||||
|
</main>
|
||||||
|
</mk-ui>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import Progress from '../../../common/scripts/loading';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
list: null,
|
||||||
|
users: null
|
||||||
|
};
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
$route: 'fetch'
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetch();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
fetch() {
|
||||||
|
Progress.start();
|
||||||
|
this.fetching = true;
|
||||||
|
|
||||||
|
(this as any).api('users/lists/show', {
|
||||||
|
listId: this.$route.params.list
|
||||||
|
}).then(list => {
|
||||||
|
this.list = list;
|
||||||
|
this.fetching = false;
|
||||||
|
|
||||||
|
Progress.done();
|
||||||
|
|
||||||
|
(this as any).api('users/show', {
|
||||||
|
userIds: this.list.userIds
|
||||||
|
}).then(users => {
|
||||||
|
this.users = users;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
main
|
||||||
|
width 100%
|
||||||
|
max-width 680px
|
||||||
|
margin 0 auto
|
||||||
|
padding 8px
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
@media (min-width 600px)
|
||||||
|
padding 32px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
<template>
|
||||||
|
<mk-ui>
|
||||||
|
<span slot="header">%fa:list%%i18n:@title%</span>
|
||||||
|
<template slot="func"><button @click="fn">%fa:plus%</button></template>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<ul>
|
||||||
|
<li v-for="list in lists" :key="list.id"><router-link :to="`/i/lists/${list.id}`">{{ list.title }}</router-link></li>
|
||||||
|
</ul>
|
||||||
|
</main>
|
||||||
|
</mk-ui>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import Progress from '../../../common/scripts/loading';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
fetching: true,
|
||||||
|
lists: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
document.title = 'Misskey | %i18n:@title%';
|
||||||
|
|
||||||
|
Progress.start();
|
||||||
|
|
||||||
|
(this as any).api('users/lists/list').then(lists => {
|
||||||
|
this.fetching = false;
|
||||||
|
this.lists = lists;
|
||||||
|
|
||||||
|
Progress.done();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
fn() {
|
||||||
|
(this as any).apis.input({
|
||||||
|
title: '%i18n:@enter-list-name%',
|
||||||
|
}).then(async title => {
|
||||||
|
const list = await (this as any).api('users/lists/create', {
|
||||||
|
title
|
||||||
|
});
|
||||||
|
|
||||||
|
this.$router.push('/i/lists/' + list.id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
@import '~const.styl'
|
||||||
|
|
||||||
|
main
|
||||||
|
width 100%
|
||||||
|
max-width 680px
|
||||||
|
margin 0 auto
|
||||||
|
padding 8px
|
||||||
|
|
||||||
|
@media (min-width 500px)
|
||||||
|
padding 16px
|
||||||
|
|
||||||
|
@media (min-width 600px)
|
||||||
|
padding 32px
|
||||||
|
|
||||||
|
</style>
|
||||||
@@ -184,7 +184,6 @@ root(isDark)
|
|||||||
|
|
||||||
> .mk-follow-button
|
> .mk-follow-button
|
||||||
float right
|
float right
|
||||||
height 40px
|
|
||||||
|
|
||||||
> .title
|
> .title
|
||||||
margin 8px 0
|
margin 8px 0
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<select v-model="widgetAdderSelected">
|
<select v-model="widgetAdderSelected">
|
||||||
<option value="profile">%i18n:common.widgets.profile%</option>
|
<option value="profile">%i18n:common.widgets.profile%</option>
|
||||||
|
<option value="analog-clock">%i18n:common.widgets.analog-clock%</option>
|
||||||
<option value="calendar">%i18n:common.widgets.calendar%</option>
|
<option value="calendar">%i18n:common.widgets.calendar%</option>
|
||||||
<option value="activity">%i18n:common.widgets.activity%</option>
|
<option value="activity">%i18n:common.widgets.activity%</option>
|
||||||
<option value="rss">%i18n:common.widgets.rss%</option>
|
<option value="rss">%i18n:common.widgets.rss%</option>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,87 @@
|
|||||||
|
import * as mongo from 'mongodb';
|
||||||
|
import * as deepcopy from 'deepcopy';
|
||||||
|
import db from '../db/mongodb';
|
||||||
|
import { pack as packUser } from './user';
|
||||||
|
|
||||||
|
const FollowRequest = db.get<IFollowRequest>('followRequests');
|
||||||
|
FollowRequest.createIndex(['followerId', 'followeeId'], { unique: true });
|
||||||
|
export default FollowRequest;
|
||||||
|
|
||||||
|
export type IFollowRequest = {
|
||||||
|
_id: mongo.ObjectID;
|
||||||
|
createdAt: Date;
|
||||||
|
followeeId: mongo.ObjectID;
|
||||||
|
followerId: mongo.ObjectID;
|
||||||
|
|
||||||
|
// 非正規化
|
||||||
|
_followee: {
|
||||||
|
host: string;
|
||||||
|
inbox?: string;
|
||||||
|
},
|
||||||
|
_follower: {
|
||||||
|
host: string;
|
||||||
|
inbox?: string;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FollowRequestを物理削除します
|
||||||
|
*/
|
||||||
|
export async function deleteFollowRequest(followRequest: string | mongo.ObjectID | IFollowRequest) {
|
||||||
|
let f: IFollowRequest;
|
||||||
|
|
||||||
|
// Populate
|
||||||
|
if (mongo.ObjectID.prototype.isPrototypeOf(followRequest)) {
|
||||||
|
f = await FollowRequest.findOne({
|
||||||
|
_id: followRequest
|
||||||
|
});
|
||||||
|
} else if (typeof followRequest === 'string') {
|
||||||
|
f = await FollowRequest.findOne({
|
||||||
|
_id: new mongo.ObjectID(followRequest)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
f = followRequest as IFollowRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f == null) return;
|
||||||
|
|
||||||
|
// このFollowingを削除
|
||||||
|
await FollowRequest.remove({
|
||||||
|
_id: f._id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pack a request for API response
|
||||||
|
*/
|
||||||
|
export const pack = (
|
||||||
|
request: any,
|
||||||
|
me?: any
|
||||||
|
) => new Promise<any>(async (resolve, reject) => {
|
||||||
|
let _request: any;
|
||||||
|
|
||||||
|
// Populate the request if 'request' is ID
|
||||||
|
if (mongo.ObjectID.prototype.isPrototypeOf(request)) {
|
||||||
|
_request = await FollowRequest.findOne({
|
||||||
|
_id: request
|
||||||
|
});
|
||||||
|
} else if (typeof request === 'string') {
|
||||||
|
_request = await FollowRequest.findOne({
|
||||||
|
_id: new mongo.ObjectID(request)
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
_request = deepcopy(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rename _id to id
|
||||||
|
_request.id = _request._id;
|
||||||
|
delete _request._id;
|
||||||
|
|
||||||
|
// Populate follower
|
||||||
|
_request.follower = await packUser(_request.followerId, me);
|
||||||
|
|
||||||
|
// Populate followee
|
||||||
|
_request.followee = await packUser(_request.followeeId, me);
|
||||||
|
|
||||||
|
resolve(_request);
|
||||||
|
});
|
||||||
@@ -77,6 +77,7 @@ export type INote = {
|
|||||||
host: string;
|
host: string;
|
||||||
inbox?: string;
|
inbox?: string;
|
||||||
};
|
};
|
||||||
|
_replyIds?: mongo.ObjectID[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ export const pack = (notification: any) => new Promise<any>(async (resolve, reje
|
|||||||
|
|
||||||
switch (_notification.type) {
|
switch (_notification.type) {
|
||||||
case 'follow':
|
case 'follow':
|
||||||
|
case 'receiveFollowRequest':
|
||||||
// nope
|
// nope
|
||||||
break;
|
break;
|
||||||
case 'mention':
|
case 'mention':
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import FollowedLog, { deleteFollowedLog } from './followed-log';
|
|||||||
import SwSubscription, { deleteSwSubscription } from './sw-subscription';
|
import SwSubscription, { deleteSwSubscription } from './sw-subscription';
|
||||||
import Notification, { deleteNotification } from './notification';
|
import Notification, { deleteNotification } from './notification';
|
||||||
import UserList, { deleteUserList } from './user-list';
|
import UserList, { deleteUserList } from './user-list';
|
||||||
|
import FollowRequest, { deleteFollowRequest } from './follow-request';
|
||||||
|
|
||||||
const User = db.get<IUser>('users');
|
const User = db.get<IUser>('users');
|
||||||
|
|
||||||
@@ -50,7 +51,22 @@ type IUserBase = {
|
|||||||
data: any;
|
data: any;
|
||||||
description: string;
|
description: string;
|
||||||
pinnedNoteId: mongo.ObjectID;
|
pinnedNoteId: mongo.ObjectID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 凍結されているか否か
|
||||||
|
*/
|
||||||
isSuspended: boolean;
|
isSuspended: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 鍵アカウントか否か
|
||||||
|
*/
|
||||||
|
isLocked: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* このアカウントに届いているフォローリクエストの数
|
||||||
|
*/
|
||||||
|
pendingReceivedFollowRequestsCount: number;
|
||||||
|
|
||||||
host: string;
|
host: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -84,6 +100,8 @@ export interface ILocalUser extends IUserBase {
|
|||||||
twoFactorTempSecret?: string;
|
twoFactorTempSecret?: string;
|
||||||
clientSettings: any;
|
clientSettings: any;
|
||||||
settings: any;
|
settings: any;
|
||||||
|
hasUnreadNotification: boolean;
|
||||||
|
hasUnreadMessagingMessage: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IRemoteUser extends IUserBase {
|
export interface IRemoteUser extends IUserBase {
|
||||||
@@ -238,6 +256,16 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) {
|
|||||||
await Following.find({ followeeId: u._id })
|
await Following.find({ followeeId: u._id })
|
||||||
).map(x => deleteFollowing(x)));
|
).map(x => deleteFollowing(x)));
|
||||||
|
|
||||||
|
// このユーザーのFollowRequestをすべて削除
|
||||||
|
await Promise.all((
|
||||||
|
await FollowRequest.find({ followerId: u._id })
|
||||||
|
).map(x => deleteFollowRequest(x)));
|
||||||
|
|
||||||
|
// このユーザーへのFollowRequestをすべて削除
|
||||||
|
await Promise.all((
|
||||||
|
await FollowRequest.find({ followeeId: u._id })
|
||||||
|
).map(x => deleteFollowRequest(x)));
|
||||||
|
|
||||||
// このユーザーのFollowingLogをすべて削除
|
// このユーザーのFollowingLogをすべて削除
|
||||||
await Promise.all((
|
await Promise.all((
|
||||||
await FollowingLog.find({ userId: u._id })
|
await FollowingLog.find({ userId: u._id })
|
||||||
@@ -387,12 +415,13 @@ export const pack = (
|
|||||||
if (!meId || !meId.equals(_user.id) || !opts.detail) {
|
if (!meId || !meId.equals(_user.id) || !opts.detail) {
|
||||||
delete _user.avatarId;
|
delete _user.avatarId;
|
||||||
delete _user.bannerId;
|
delete _user.bannerId;
|
||||||
|
|
||||||
delete _user.driveCapacity;
|
delete _user.driveCapacity;
|
||||||
|
delete _user.hasUnreadMessagingMessage;
|
||||||
|
delete _user.hasUnreadNotification;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (meId && !meId.equals(_user.id)) {
|
if (meId && !meId.equals(_user.id)) {
|
||||||
const [following1, following2, mute] = await Promise.all([
|
const [following1, following2, followReq1, followReq2, mute] = await Promise.all([
|
||||||
Following.findOne({
|
Following.findOne({
|
||||||
followerId: meId,
|
followerId: meId,
|
||||||
followeeId: _user.id
|
followeeId: _user.id
|
||||||
@@ -401,6 +430,14 @@ export const pack = (
|
|||||||
followerId: _user.id,
|
followerId: _user.id,
|
||||||
followeeId: meId
|
followeeId: meId
|
||||||
}),
|
}),
|
||||||
|
_user.isLocked ? FollowRequest.findOne({
|
||||||
|
followerId: meId,
|
||||||
|
followeeId: _user.id
|
||||||
|
}) : Promise.resolve(null),
|
||||||
|
FollowRequest.findOne({
|
||||||
|
followerId: _user.id,
|
||||||
|
followeeId: meId
|
||||||
|
}),
|
||||||
Mute.findOne({
|
Mute.findOne({
|
||||||
muterId: meId,
|
muterId: meId,
|
||||||
muteeId: _user.id
|
muteeId: _user.id
|
||||||
@@ -411,6 +448,9 @@ export const pack = (
|
|||||||
_user.isFollowing = following1 !== null;
|
_user.isFollowing = following1 !== null;
|
||||||
_user.isStalking = following1 && following1.stalk;
|
_user.isStalking = following1 && following1.stalk;
|
||||||
|
|
||||||
|
_user.hasPendingFollowRequestFromYou = followReq1 !== null;
|
||||||
|
_user.hasPendingFollowRequestToYou = followReq2 !== null;
|
||||||
|
|
||||||
// Whether the user is followed
|
// Whether the user is followed
|
||||||
_user.isFollowed = following2 !== null;
|
_user.isFollowed = following2 !== null;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import Notification from '../models/notification';
|
|||||||
import Mute from '../models/mute';
|
import Mute from '../models/mute';
|
||||||
import { pack } from '../models/notification';
|
import { pack } from '../models/notification';
|
||||||
import stream from './stream';
|
import stream from './stream';
|
||||||
|
import User from '../models/user';
|
||||||
|
|
||||||
export default (
|
export default (
|
||||||
notifiee: mongo.ObjectID,
|
notifiee: mongo.ObjectID,
|
||||||
@@ -29,6 +30,13 @@ export default (
|
|||||||
stream(notifiee, 'notification',
|
stream(notifiee, 'notification',
|
||||||
await pack(notification));
|
await pack(notification));
|
||||||
|
|
||||||
|
// Update flag
|
||||||
|
User.update({ _id: notifiee }, {
|
||||||
|
$set: {
|
||||||
|
hasUnreadNotification: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// 3秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する
|
// 3秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する
|
||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true });
|
const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true });
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import * as mongo from 'mongodb';
|
||||||
|
import User, { IRemoteUser } from '../../../../models/user';
|
||||||
|
import config from '../../../../config';
|
||||||
|
import accept from '../../../../services/following/requests/accept';
|
||||||
|
import { IFollow } from '../../type';
|
||||||
|
|
||||||
|
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
|
||||||
|
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
|
||||||
|
|
||||||
|
if (!id.startsWith(config.url + '/')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const follower = await User.findOne({
|
||||||
|
_id: new mongo.ObjectID(id.split('/').pop())
|
||||||
|
});
|
||||||
|
|
||||||
|
if (follower === null) {
|
||||||
|
throw new Error('follower not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (follower.host != null) {
|
||||||
|
throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません');
|
||||||
|
}
|
||||||
|
|
||||||
|
await accept(actor, follower);
|
||||||
|
};
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import * as debug from 'debug';
|
||||||
|
|
||||||
|
import Resolver from '../../resolver';
|
||||||
|
import { IRemoteUser } from '../../../../models/user';
|
||||||
|
import acceptFollow from './follow';
|
||||||
|
import { IAccept } from '../../type';
|
||||||
|
|
||||||
|
const log = debug('misskey:activitypub');
|
||||||
|
|
||||||
|
export default async (actor: IRemoteUser, activity: IAccept): Promise<void> => {
|
||||||
|
const uri = activity.id || activity;
|
||||||
|
|
||||||
|
log(`Accept: ${uri}`);
|
||||||
|
|
||||||
|
const resolver = new Resolver();
|
||||||
|
|
||||||
|
let object;
|
||||||
|
|
||||||
|
try {
|
||||||
|
object = await resolver.resolve(activity.object);
|
||||||
|
} catch (e) {
|
||||||
|
log(`Resolution failed: ${e}`);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (object.type) {
|
||||||
|
case 'Follow':
|
||||||
|
acceptFollow(actor, object);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.warn(`Unknown accept type: ${object.type}`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -23,5 +23,5 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
|
|||||||
throw new Error('フォローしようとしているユーザーはローカルユーザーではありません');
|
throw new Error('フォローしようとしているユーザーはローカルユーザーではありません');
|
||||||
}
|
}
|
||||||
|
|
||||||
await follow(actor, followee, activity);
|
await follow(actor, followee);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import follow from './follow';
|
|||||||
import undo from './undo';
|
import undo from './undo';
|
||||||
import like from './like';
|
import like from './like';
|
||||||
import announce from './announce';
|
import announce from './announce';
|
||||||
|
import accept from './accept';
|
||||||
|
import reject from './reject';
|
||||||
|
|
||||||
const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
|
const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
|
||||||
switch (activity.type) {
|
switch (activity.type) {
|
||||||
@@ -22,7 +24,11 @@ const self = async (actor: IRemoteUser, activity: Object): Promise<void> => {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'Accept':
|
case 'Accept':
|
||||||
// noop
|
await accept(actor, activity);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'Reject':
|
||||||
|
await reject(actor, activity);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'Announce':
|
case 'Announce':
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import * as mongo from 'mongodb';
|
||||||
|
import User, { IRemoteUser } from '../../../../models/user';
|
||||||
|
import config from '../../../../config';
|
||||||
|
import reject from '../../../../services/following/requests/reject';
|
||||||
|
import { IFollow } from '../../type';
|
||||||
|
|
||||||
|
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
|
||||||
|
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
|
||||||
|
|
||||||
|
if (!id.startsWith(config.url + '/')) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const follower = await User.findOne({
|
||||||
|
_id: new mongo.ObjectID(id.split('/').pop())
|
||||||
|
});
|
||||||
|
|
||||||
|
if (follower === null) {
|
||||||
|
throw new Error('follower not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (follower.host != null) {
|
||||||
|
throw new Error('フォローリクエストしたユーザーはローカルユーザーではありません');
|
||||||
|
}
|
||||||
|
|
||||||
|
await reject(actor, follower);
|
||||||
|
};
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import * as debug from 'debug';
|
||||||
|
|
||||||
|
import Resolver from '../../resolver';
|
||||||
|
import { IRemoteUser } from '../../../../models/user';
|
||||||
|
import rejectFollow from './follow';
|
||||||
|
import { IReject } from '../../type';
|
||||||
|
|
||||||
|
const log = debug('misskey:activitypub');
|
||||||
|
|
||||||
|
export default async (actor: IRemoteUser, activity: IReject): Promise<void> => {
|
||||||
|
const uri = activity.id || activity;
|
||||||
|
|
||||||
|
log(`Reject: ${uri}`);
|
||||||
|
|
||||||
|
const resolver = new Resolver();
|
||||||
|
|
||||||
|
let object;
|
||||||
|
|
||||||
|
try {
|
||||||
|
object = await resolver.resolve(activity.object);
|
||||||
|
} catch (e) {
|
||||||
|
log(`Resolution failed: ${e}`);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (object.type) {
|
||||||
|
case 'Follow':
|
||||||
|
rejectFollow(actor, object);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
console.warn(`Unknown reject type: ${object.type}`);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -2,7 +2,9 @@ import * as mongo from 'mongodb';
|
|||||||
import User, { IRemoteUser } from '../../../../models/user';
|
import User, { IRemoteUser } from '../../../../models/user';
|
||||||
import config from '../../../../config';
|
import config from '../../../../config';
|
||||||
import unfollow from '../../../../services/following/delete';
|
import unfollow from '../../../../services/following/delete';
|
||||||
|
import cancelRequest from '../../../../services/following/requests/cancel';
|
||||||
import { IFollow } from '../../type';
|
import { IFollow } from '../../type';
|
||||||
|
import FollowRequest from '../../../../models/follow-request';
|
||||||
|
|
||||||
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
|
export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
|
||||||
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
|
const id = typeof activity.object == 'string' ? activity.object : activity.object.id;
|
||||||
@@ -23,5 +25,14 @@ export default async (actor: IRemoteUser, activity: IFollow): Promise<void> => {
|
|||||||
throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません');
|
throw new Error('フォロー解除しようとしているユーザーはローカルユーザーではありません');
|
||||||
}
|
}
|
||||||
|
|
||||||
await unfollow(actor, followee, activity);
|
const req = await FollowRequest.findOne({
|
||||||
|
followerId: actor._id,
|
||||||
|
followeeId: followee._id
|
||||||
|
});
|
||||||
|
|
||||||
|
if (req) {
|
||||||
|
await cancelRequest(actor, followee);
|
||||||
|
} else {
|
||||||
|
await unfollow(actor, followee);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
|
|||||||
notesCount,
|
notesCount,
|
||||||
name: person.name,
|
name: person.name,
|
||||||
driveCapacity: 1024 * 1024 * 8, // 8MiB
|
driveCapacity: 1024 * 1024 * 8, // 8MiB
|
||||||
|
isLocked: person.manuallyApprovesFollowers,
|
||||||
username: person.preferredUsername,
|
username: person.preferredUsername,
|
||||||
usernameLower: person.preferredUsername.toLowerCase(),
|
usernameLower: person.preferredUsername.toLowerCase(),
|
||||||
host,
|
host,
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import config from '../../../config';
|
import config from '../../../config';
|
||||||
import { IRemoteUser, ILocalUser } from '../../../models/user';
|
import { IUser, isLocalUser } from '../../../models/user';
|
||||||
|
|
||||||
export default (follower: ILocalUser, followee: IRemoteUser) => ({
|
export default (follower: IUser, followee: IUser) => ({
|
||||||
type: 'Follow',
|
type: 'Follow',
|
||||||
actor: `${config.url}/users/${follower._id}`,
|
actor: isLocalUser(follower) ? `${config.url}/users/${follower._id}` : follower.uri,
|
||||||
object: followee.uri
|
object: isLocalUser(followee) ? `${config.url}/users/${followee._id}` : followee.uri
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import renderImage from './image';
|
import renderImage from './image';
|
||||||
import renderKey from './key';
|
import renderKey from './key';
|
||||||
import config from '../../../config';
|
import config from '../../../config';
|
||||||
|
import { ILocalUser } from '../../../models/user';
|
||||||
|
|
||||||
export default user => {
|
export default (user: ILocalUser) => {
|
||||||
const id = `${config.url}/users/${user._id}`;
|
const id = `${config.url}/users/${user._id}`;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
@@ -17,6 +18,7 @@ export default user => {
|
|||||||
summary: user.description,
|
summary: user.description,
|
||||||
icon: user.avatarId && renderImage({ _id: user.avatarId }),
|
icon: user.avatarId && renderImage({ _id: user.avatarId }),
|
||||||
image: user.bannerId && renderImage({ _id: user.bannerId }),
|
image: user.bannerId && renderImage({ _id: user.bannerId }),
|
||||||
|
manuallyApprovesFollowers: user.isLocked,
|
||||||
publicKey: renderKey(user)
|
publicKey: renderKey(user)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||