Compare commits

..

156 Commits

Author SHA1 Message Date
syuilo dae9c4288d 2.16.4 2018-05-23 16:00:08 +09:00
syuilo 9f37149369 🎨 2018-05-23 15:58:53 +09:00
syuilo e476647ab8 🎨 2018-05-23 15:48:41 +09:00
syuilo eb23be979c oops 2018-05-23 15:47:51 +09:00
syuilo 6d9d6a6779 oops 2018-05-23 15:46:20 +09:00
syuilo 1c0cb1ae71 2.16.3 2018-05-23 15:27:31 +09:00
syuilo 0ba5dc3900 Only show local posts in the timeline of top page 2018-05-23 15:25:15 +09:00
syuilo 872717feeb Merge pull request #1638 from syuilo/l10n_master
New Crowdin translations
2018-05-23 14:07:36 +09:00
syuilo 85b51f06a4 New translations ja.yml (English) 2018-05-23 14:01:15 +09:00
syuilo 94df60d054 Merge pull request #1637 from syuilo/l10n_master
New Crowdin translations
2018-05-23 13:51:19 +09:00
syuilo 7395284480 New translations ja.yml (English) 2018-05-23 13:50:54 +09:00
syuilo b537fa5467 Merge pull request #1636 from syuilo/l10n_master
New Crowdin translations
2018-05-22 23:55:42 +09:00
syuilo dca58c20d2 New translations ja.yml (Chinese Simplified) 2018-05-22 23:54:36 +09:00
syuilo 0a3030f7d0 New translations ja.yml (English) 2018-05-22 19:35:05 +09:00
syuilo 81cc6f3104 2.16.2 2018-05-22 18:20:49 +09:00
syuilo cc0b9c6933 oops 2018-05-22 18:19:02 +09:00
syuilo 5671f1c6a4 2.16.1 2018-05-22 11:47:23 +09:00
syuilo 89dee86f39 Fix bug and remove unnecessary query 2018-05-22 11:45:49 +09:00
syuilo b414068ada Refactor 2018-05-22 11:39:48 +09:00
syuilo 3be7952e9f Improve avatar rendering 2018-05-22 11:34:40 +09:00
syuilo 137b5da4aa Fix bug 2018-05-22 11:31:06 +09:00
syuilo 2ee1639acb Merge pull request #1631 from syuilo/l10n_master
New Crowdin translations
2018-05-22 07:13:58 +09:00
syuilo a05b184595 New translations ja.yml (Polish) 2018-05-22 06:00:58 +09:00
syuilo f3bacae1dc 2.16.0 2018-05-21 21:52:10 +09:00
syuilo af5fb99fe6 Merge pull request #1629 from syuilo/l10n_master
New Crowdin translations
2018-05-21 21:51:39 +09:00
syuilo 0ebe4ad7a3 New translations ja.yml (English) 2018-05-21 21:51:24 +09:00
syuilo 0cf99037c8 Merge pull request #1628 from syuilo/l10n_master
New Crowdin translations
2018-05-21 21:41:46 +09:00
syuilo b913debc57 New translations ja.yml (Korean) 2018-05-21 21:41:26 +09:00
syuilo abe3f1f5e9 New translations ja.yml (Polish) 2018-05-21 21:41:23 +09:00
syuilo d30b88364c New translations ja.yml (Chinese Simplified) 2018-05-21 21:41:21 +09:00
syuilo 4840b7acf7 New translations ja.yml (Italian) 2018-05-21 21:41:19 +09:00
syuilo f5bac11fae New translations ja.yml (Russian) 2018-05-21 21:41:17 +09:00
syuilo 68a70a94fc New translations ja.yml (English) 2018-05-21 21:41:15 +09:00
syuilo bf7436ddf8 New translations ja.yml (Spanish) 2018-05-21 21:41:13 +09:00
syuilo b99155a084 New translations ja.yml (German) 2018-05-21 21:41:11 +09:00
syuilo 027e62a6ea New translations ja.yml (French) 2018-05-21 21:41:08 +09:00
syuilo c6b6c8afbd Clean up 2018-05-21 21:41:06 +09:00
syuilo 1236a09247 New welcome page 2018-05-21 21:39:46 +09:00
syuilo 6a4d38045e Merge branch 'master' of https://github.com/syuilo/misskey 2018-05-21 20:54:54 +09:00
syuilo 281aed2797 Fix bug 2018-05-21 20:54:52 +09:00
syuilo 3e47f9943a Merge pull request #1627 from syuilo/l10n_master
New Crowdin translations
2018-05-21 20:36:36 +09:00
syuilo f6d27dd17d [travis] Ignore l10n_master 2018-05-21 20:36:14 +09:00
syuilo 073704c7af New translations ja.yml (Korean) 2018-05-21 20:31:48 +09:00
syuilo 809db02ca2 New translations ja.yml (Polish) 2018-05-21 20:31:47 +09:00
syuilo 2e45ff6a32 New translations ja.yml (Chinese Simplified) 2018-05-21 20:31:45 +09:00
syuilo 02d6974be9 New translations ja.yml (Italian) 2018-05-21 20:31:43 +09:00
syuilo e530afb2fe New translations ja.yml (Russian) 2018-05-21 20:31:41 +09:00
syuilo dba15f0e8b New translations ja.yml (English) 2018-05-21 20:31:39 +09:00
syuilo 8f771c60c5 New translations ja.yml (Spanish) 2018-05-21 20:31:37 +09:00
syuilo d9b1ca8c48 New translations ja.yml (German) 2018-05-21 20:31:35 +09:00
syuilo 9e247c119a New translations ja.yml (French) 2018-05-21 20:31:33 +09:00
syuilo 08b5e21e96 ✌️ 2018-05-21 20:30:42 +09:00
syuilo 2101d3aa5b Update locales 2018-05-21 20:28:33 +09:00
syuilo aa80fb5d4a 2.15.0 2018-05-21 15:18:27 +09:00
syuilo 63727f6514 Merge pull request #1626 from syuilo/l10n_master
New Crowdin translations
2018-05-21 15:11:13 +09:00
syuilo ade35cbb2d New translations ja.yml (Korean) 2018-05-21 15:10:59 +09:00
syuilo 6ec9059ccc New translations ja.yml (Polish) 2018-05-21 15:10:57 +09:00
syuilo c93d1711cf New translations ja.yml (Chinese Simplified) 2018-05-21 15:10:55 +09:00
syuilo e734ad0413 New translations ja.yml (Italian) 2018-05-21 15:10:54 +09:00
syuilo 047dee3a70 New translations ja.yml (Russian) 2018-05-21 15:10:52 +09:00
syuilo 8c76089caf New translations ja.yml (English) 2018-05-21 15:10:50 +09:00
syuilo ab6cf2dba3 New translations ja.yml (Spanish) 2018-05-21 15:10:48 +09:00
syuilo 65a309e605 New translations ja.yml (German) 2018-05-21 15:10:46 +09:00
syuilo f37e713640 New translations ja.yml (French) 2018-05-21 15:10:44 +09:00
syuilo bc1e9245bd ✌️ 2018-05-21 15:00:42 +09:00
syuilo 2fa82bde16 🎨 2018-05-21 14:57:27 +09:00
syuilo 140249172c Display isAdmin badge 2018-05-21 14:47:21 +09:00
syuilo 9677d1288a 2.14.0 2018-05-21 11:16:17 +09:00
syuilo 133ae7d171 Merge pull request #1625 from syuilo/l10n_master
New Crowdin translations
2018-05-21 11:15:45 +09:00
syuilo 5b92a43361 Fix bug 2018-05-21 11:14:57 +09:00
syuilo b839bf6918 New translations ja.yml (Korean) 2018-05-21 11:11:10 +09:00
syuilo 7ea4ba1d5a New translations ja.yml (Polish) 2018-05-21 11:11:08 +09:00
syuilo f000dbd657 New translations ja.yml (Chinese Simplified) 2018-05-21 11:11:06 +09:00
syuilo 36e4a24527 New translations ja.yml (Italian) 2018-05-21 11:11:04 +09:00
syuilo 861cc83014 New translations ja.yml (Russian) 2018-05-21 11:11:02 +09:00
syuilo d2b273dc3b New translations ja.yml (English) 2018-05-21 11:11:00 +09:00
syuilo e49ad120f3 New translations ja.yml (Spanish) 2018-05-21 11:10:58 +09:00
syuilo 6f441f35ec New translations ja.yml (German) 2018-05-21 11:10:56 +09:00
syuilo 14a5c429bb New translations ja.yml (French) 2018-05-21 11:10:54 +09:00
syuilo 100125ad5a Fix bug 2018-05-21 11:08:14 +09:00
syuilo f8c414aafc #1621 2018-05-21 11:08:08 +09:00
syuilo 14aedb07aa Update .eslintrc 2018-05-21 10:35:42 +09:00
syuilo 40b01e0ad3 Merge pull request #1624 from syuilo/l10n_master
New Crowdin translations
2018-05-21 09:31:11 +09:00
syuilo f9f6718174 New translations ja.yml (Korean) 2018-05-21 09:30:52 +09:00
syuilo c41723b09f New translations ja.yml (Polish) 2018-05-21 09:30:50 +09:00
syuilo 1b6effd369 New translations ja.yml (Chinese Simplified) 2018-05-21 09:30:49 +09:00
syuilo 1bbf7a45a8 New translations ja.yml (Italian) 2018-05-21 09:30:47 +09:00
syuilo 0a5e021128 New translations ja.yml (Russian) 2018-05-21 09:30:45 +09:00
syuilo 52ebde60fc New translations ja.yml (English) 2018-05-21 09:30:43 +09:00
syuilo c77cf79f5d New translations ja.yml (Spanish) 2018-05-21 09:30:41 +09:00
syuilo 1233abe5b0 New translations ja.yml (German) 2018-05-21 09:30:39 +09:00
syuilo f2f2b09ff1 New translations ja.yml (French) 2018-05-21 09:30:36 +09:00
syuilo 5bf87b7efe Merge pull request #1623 from syuilo/l10n_master
New Crowdin translations
2018-05-21 09:27:57 +09:00
syuilo 526321adb6 Merge pull request #1622 from m4sk1n/master
fix typo
2018-05-21 09:27:25 +09:00
syuilo f816daa59e New translations ja.yml (Polish) 2018-05-21 05:50:41 +09:00
syuilo 5d6f75ec05 New translations ja.yml (Polish) 2018-05-21 05:41:13 +09:00
Marcin Mikołajczak 28994d001c fix typo
Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
2018-05-20 22:37:03 +02:00
syuilo 9e7b6790fd 2.13.0 2018-05-21 03:21:47 +09:00
syuilo 8fae064156 Merge pull request #1619 from syuilo/l10n_master
New Crowdin translations
2018-05-21 03:21:09 +09:00
syuilo 8451f4830c New translations ja.yml (English) 2018-05-21 03:20:57 +09:00
syuilo deded2bcf7 Merge pull request #1618 from syuilo/l10n_master
New Crowdin translations
2018-05-21 03:11:52 +09:00
syuilo 51fcaff90e New translations ja.yml (Korean) 2018-05-21 03:11:11 +09:00
syuilo ce8794f7dd New translations ja.yml (Polish) 2018-05-21 03:11:09 +09:00
syuilo c61abc3327 New translations ja.yml (Chinese Simplified) 2018-05-21 03:11:07 +09:00
syuilo 2bff683d52 New translations ja.yml (Italian) 2018-05-21 03:11:05 +09:00
syuilo 4c408c7330 New translations ja.yml (Russian) 2018-05-21 03:11:03 +09:00
syuilo 4505a80383 New translations ja.yml (English) 2018-05-21 03:11:01 +09:00
syuilo ed3e46953d New translations ja.yml (Spanish) 2018-05-21 03:10:58 +09:00
syuilo 79fd6c202b New translations ja.yml (German) 2018-05-21 03:10:56 +09:00
syuilo aef25ef565 New translations ja.yml (French) 2018-05-21 03:10:54 +09:00
syuilo a53d786515 投稿の表示スタイルを選択できるように 2018-05-21 03:08:51 +09:00
syuilo 27b8b81d4e New translations ja.yml (Korean) 2018-05-21 02:21:21 +09:00
syuilo 369d9d5641 New translations ja.yml (Polish) 2018-05-21 02:21:19 +09:00
syuilo 56b77d3cf8 New translations ja.yml (Chinese Simplified) 2018-05-21 02:21:17 +09:00
syuilo 0d2eb2c07c New translations ja.yml (Italian) 2018-05-21 02:21:15 +09:00
syuilo 5bc1fe1f2c New translations ja.yml (Russian) 2018-05-21 02:21:13 +09:00
syuilo 83bf229f5b New translations ja.yml (English) 2018-05-21 02:21:11 +09:00
syuilo 492d550410 New translations ja.yml (Spanish) 2018-05-21 02:21:09 +09:00
syuilo 22a72d87ea New translations ja.yml (German) 2018-05-21 02:21:08 +09:00
syuilo d5ef52ec17 New translations ja.yml (French) 2018-05-21 02:21:06 +09:00
syuilo 42c811a523 Refactor 2018-05-21 02:13:39 +09:00
syuilo 51e3c11acb Merge pull request #1617 from syuilo/l10n_master
New Crowdin translations
2018-05-21 00:08:58 +09:00
syuilo b9ab18f5a9 New translations ja.yml (English) 2018-05-20 23:30:48 +09:00
syuilo 00357c2f07 New translations ja.yml (English) 2018-05-20 23:20:36 +09:00
syuilo 2f756c9988 New translations ja.yml (English) 2018-05-20 23:16:48 +09:00
syuilo 4c55a19c6d New translations ja.yml (English) 2018-05-20 23:00:53 +09:00
syuilo a6eb0971a4 New translations ja.yml (German) 2018-05-20 22:50:55 +09:00
syuilo 2e25e000de New translations ja.yml (Polish) 2018-05-20 22:40:46 +09:00
syuilo e3a15532bf New translations ja.yml (German) 2018-05-20 22:40:44 +09:00
syuilo 3dcf721c53 New translations ja.yml (Polish) 2018-05-20 22:30:56 +09:00
syuilo b20b975935 Fix bug 2018-05-20 20:26:38 +09:00
syuilo 2e6905c74c Fix bug 2018-05-20 19:51:51 +09:00
syuilo 8bb97f2e4c Better error reporting 2018-05-20 19:24:54 +09:00
syuilo 684a8531b6 2.12.0 2018-05-20 18:00:29 +09:00
syuilo 0b6ee98f05 Merge pull request #1615 from syuilo/l10n_master
New Crowdin translations
2018-05-20 17:59:32 +09:00
syuilo a66225c67f New translations ja.yml (Korean) 2018-05-20 17:51:42 +09:00
syuilo 67f1d76efe New translations ja.yml (Polish) 2018-05-20 17:51:40 +09:00
syuilo fdd14c601a New translations ja.yml (Chinese Simplified) 2018-05-20 17:51:38 +09:00
syuilo 5fb31512c4 New translations ja.yml (Italian) 2018-05-20 17:51:36 +09:00
syuilo 8ab0581661 New translations ja.yml (Russian) 2018-05-20 17:51:34 +09:00
syuilo f71d9adb75 New translations ja.yml (English) 2018-05-20 17:51:33 +09:00
syuilo 26f44edfd2 New translations ja.yml (Spanish) 2018-05-20 17:51:31 +09:00
syuilo 71d3265ddd New translations ja.yml (German) 2018-05-20 17:51:29 +09:00
syuilo 484fe48076 New translations ja.yml (French) 2018-05-20 17:51:27 +09:00
syuilo b6f60f3785 Merge pull request #1614 from syuilo/l10n_master
New Crowdin translations
2018-05-20 17:45:22 +09:00
syuilo eb1aa1ef47 Improve mobile settings 2018-05-20 17:45:06 +09:00
syuilo 1f1955490d New translations ja.yml (Korean) 2018-05-20 17:41:22 +09:00
syuilo 533af40ac6 New translations ja.yml (Polish) 2018-05-20 17:41:20 +09:00
syuilo e2f61e36e1 New translations ja.yml (Chinese Simplified) 2018-05-20 17:41:18 +09:00
syuilo aeb59f5bb8 New translations ja.yml (Italian) 2018-05-20 17:41:16 +09:00
syuilo 501bb9638f New translations ja.yml (Russian) 2018-05-20 17:41:15 +09:00
syuilo 2f96db4e45 New translations ja.yml (English) 2018-05-20 17:41:13 +09:00
syuilo c88dba2364 New translations ja.yml (Spanish) 2018-05-20 17:41:11 +09:00
syuilo f146d7bcb6 New translations ja.yml (German) 2018-05-20 17:41:09 +09:00
syuilo 5b4de85926 New translations ja.yml (French) 2018-05-20 17:41:07 +09:00
syuilo f6449a7f32 Improve mobile settings 2018-05-20 17:37:30 +09:00
93 changed files with 964 additions and 786 deletions
+2 -1
View File
@@ -22,6 +22,7 @@
"globals": { "globals": {
"ENV": true, "ENV": true,
"VERSION": true, "VERSION": true,
"API": true "API": true,
"LANGS": true
} }
} }
+4
View File
@@ -4,6 +4,10 @@
notifications: notifications:
email: false email: false
branches:
except:
- l10n_master
language: node_js language: node_js
node_js: node_js:
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+77 -68
View File
@@ -1,7 +1,7 @@
--- ---
meta: meta:
lang: "日本語" lang: "Deutsch"
divider: "" divider: " "
common: common:
misskey: "Teile alles mit anderen mithilfe von Misskey" misskey: "Teile alles mit anderen mithilfe von Misskey"
time: time:
@@ -143,29 +143,29 @@ common/views/components/stream-indicator.vue:
reconnecting: "Erneut verbinden" reconnecting: "Erneut verbinden"
connected: "Verbindung hergestellt" connected: "Verbindung hergestellt"
common/views/components/twitter-setting.vue: common/views/components/twitter-setting.vue:
description: "お使いのTwitterアカウントをお使いのMisskeyアカウントに接続しておくと、プロフィールでTwitterアカウント情報が表示されるようになったり、Twitterを用いた便利なサインインを利用できるようになります。" description: "Wenn du deinen Twitter-Account mit deinem Misskey-Account verbindest, siehst du deine Twitter Account-Informationen auf deinem Profil und du kannst dich mit Twitter einloggen."
connected-to: "次のTwitterアカウントに接続されています" connected-to: "Du bist mit diesem Twitter-Account verbunden"
detail: "Mehr..." detail: "Mehr..."
reconnect: "Erneut verbinden" reconnect: "Erneut verbinden"
connect: "Mit Twitter verbinden" connect: "Mit Twitter verbinden"
disconnect: "Trennen" disconnect: "Trennen"
common/views/components/uploader.vue: common/views/components/uploader.vue:
waiting: "待機中" waiting: "Warten"
common/views/widgets/broadcast.vue: common/views/widgets/broadcast.vue:
fetching: "確認中" fetching: "Laden"
no-broadcasts: "お知らせはありません" no-broadcasts: "Keine Broadcasts"
have-a-nice-day: "良い一日を!" have-a-nice-day: "Schönen Tag!"
next: "" next: "Nächster"
common/views/widgets/donation.vue: common/views/widgets/donation.vue:
title: "寄付のお願い" title: "Spende"
text: "Misskeyの運営にはドメイン、サーバー等のコストが掛かります。Misskeyは広告を掲載したりしないため、収入を皆様からの寄付に頼っています。もしご興味があれば、{}までご連絡ください。ご協力ありがとうございます。" text: "Um Misskey am Laufen zu halten geben wir Geld für Domain, Server usw. aus. Wir bekommen dafür kein Geld und würden uns freuen, wenn du spenden würdest. Wenn du interessiert bist, dann kontaktiere {}. Danke für deine Unterstützung!"
common/views/widgets/photo-stream.vue: common/views/widgets/photo-stream.vue:
title: "フォトストリーム" title: "Fotostream"
no-photos: "写真はありません" no-photos: "Keine Fotos"
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "Serverinformationen"
toggle: "表示を切り替え" toggle: "Sicht umschalten"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -175,42 +175,42 @@ commons/views/widgets/visibility-chooser.vue:
specified-desc: "指定したユーザーにのみ公開" specified-desc: "指定したユーザーにのみ公開"
private: "非公開" private: "非公開"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Schwarz ... komplett"
notes: "Blue ... Notes" notes: "Blau ... Hinweise"
replies: "Red ... Replies" replies: "Rot ... Antworten"
renotes: "Green ... Renotes" renotes: "Grün ... Anmerkungen"
desktop/views/components/activity.vue: desktop/views/components/activity.vue:
title: "アクティビティ" title: "Aktivität"
toggle: "表示を切り替え" toggle: "Sichten umschalten"
desktop/views/components/calendar.vue: desktop/views/components/calendar.vue:
title: "{1} {2}" title: "{1} / {2}"
prev: "前の月" prev: "Vorheriger Monat"
next: "次の月" next: "Nächster Monat"
go: "クリックして時間遡行" go: "Klicke zur Navigation"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "Datei auswählen"
upload: "PCからドライブにファイルをアップロード" upload: "Dateien von deinem PC hochladen"
cancel: "キャンセル" cancel: "Abbrechen"
ok: "決定" ok: "OK"
choose-prompt: "ファイルを選択" choose-prompt: "Wähle eine Datei aus"
desktop/views/components/choose-folder-from-drive-window.vue: desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "キャンセル" cancel: "Abbrechen"
ok: "決定" ok: "OK"
choose-prompt: "フォルダを選択" choose-prompt: "Wähle einen Ordner"
desktop/views/components/crop-window.vue: desktop/views/components/crop-window.vue:
skip: "クロップをスキップ" skip: "Zuschneiden überspringen"
cancel: "キャンセル" cancel: "Abbrechen"
ok: "決定" ok: "OK"
desktop/views/components/drive-window.vue: desktop/views/components/drive-window.vue:
used: "使用中" used: "benutzt"
drive: "ドライブ" drive: "Speicher"
desktop/views/components/drive.file.vue: desktop/views/components/drive.file.vue:
avatar: "アイコン" avatar: "Avatar"
banner: "バナー" banner: "Banner"
contextmenu: contextmenu:
rename: "名前を変更" rename: "Umbenennen"
copy-url: "URLをコピー" copy-url: "URL kopieren"
download: "ダウンロード" download: "Download"
else-files: "その他..." else-files: "その他..."
set-as-avatar: "アイコンに設定" set-as-avatar: "アイコンに設定"
set-as-banner: "バナーに設定" set-as-banner: "バナーに設定"
@@ -290,26 +290,26 @@ desktop/views/components/home.vue:
post-form: "投稿フォーム" post-form: "投稿フォーム"
messaging: "メッセージ" messaging: "メッセージ"
server: "サーバー情報" server: "サーバー情報"
donation: "寄付のお願い" donation: "Spende"
nav: "ナビゲーション" nav: "Navigation"
tips: "ヒント" tips: "Tipps"
add: "追加" add: "Hinzufügen"
desktop/views/input-dialog.vue: desktop/views/input-dialog.vue:
cancel: "キャンセル" cancel: "Abbrechen"
ok: "決定" ok: "OK"
desktop/views/components/messaging-room-window.vue: desktop/views/components/messaging-room-window.vue:
title: "メッセージ:" title: "Nachrichten:"
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "Nachrichten" title: "Nachrichten"
desktop/views/components/note-detail.vue: desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む" more: "Lade weitere Konversationen"
private: "(この投稿は非公開です)" private: "(Dieser Post ist privat)"
is-renote: "がRenote" is-renote: "がRenote"
location: "位置情報" location: "Ort"
renote: "Renote" renote: "Anmerkung"
add-reaction: "リアクション" add-reaction: "Reaktion hinzufügen"
desktop/views/components/note-detail.sub.vue: desktop/views/components/note-detail.sub.vue:
private: "(この投稿は非公開です)" private: "(Dieser Post ist privat)"
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"
@@ -317,8 +317,8 @@ desktop/views/components/notes.note.vue:
add-reaction: "Eine Reaktion hinzufügen" add-reaction: "Eine Reaktion hinzufügen"
detail: "Zeige Details" detail: "Zeige Details"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "読み込みに失敗しました。" error: "Laden fehlgeschlagen."
retry: "リトライ" retry: "Erneut versuchen"
desktop/views/components/notifications.vue: desktop/views/components/notifications.vue:
more: "Mehr" more: "Mehr"
empty: "Keine Benachrichtigungen" empty: "Keine Benachrichtigungen"
@@ -348,14 +348,14 @@ desktop/views/components/post-form-window.vue:
attaches: "{} Medien hinzugefügt" attaches: "{} Medien hinzugefügt"
uploading-media: "Lade {} Medien hoch" uploading-media: "Lade {} Medien hoch"
desktop/views/components/progress-dialog.vue: desktop/views/components/progress-dialog.vue:
waiting: "待機中" waiting: "Warten"
desktop/views/components/renote-form.vue: desktop/views/components/renote-form.vue:
quote: "Zitieren..." quote: "Zitieren..."
cancel: "Abbrechen" cancel: "Abbrechen"
renote: "Anmerkung" renote: "Anmerkung"
reposting: "しています..." reposting: "Weitersagen..."
success: "Renoteしました!" success: "Weitergesagt!"
failure: "Renoteに失敗しました" failure: "Weitersagen fehlgeschlagen"
desktop/views/components/renote-form-window.vue: desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか?" title: "この投稿をRenoteしますか?"
desktop/views/components/settings.vue: desktop/views/components/settings.vue:
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "Profil aktualisieren" save: "Profil aktualisieren"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -677,14 +682,14 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -703,11 +708,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+58 -49
View File
@@ -121,7 +121,7 @@ common/views/components/signup.vue:
unavailable: "Unavailable" unavailable: "Unavailable"
error: "Network error" error: "Network error"
invalid-format: "Only use letters, numbers and -." invalid-format: "Only use letters, numbers and -."
too-short: "Please enter at least 1 character" too-short: "Please enter at least 1 character!"
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."
@@ -165,14 +165,14 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "Server info" title: "Server info"
toggle: "Toggle views" toggle: "Toggle views"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "Public" public: "Public"
home: "Home" home: "Home"
home-desc: "ホームタイムラインにのみ公開" home-desc: "Post to the home timeline only"
followers: "Followers" followers: "Followers"
followers-desc: "自分のフォロワーにのみ公開" followers-desc: "Post to followers only"
specified: "Direct" specified: "Direct"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "Post to specified users only"
private: "Private" private: "Private"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
@@ -188,7 +188,7 @@ desktop/views/components/calendar.vue:
next: "Next month" next: "Next month"
go: "Click to naviguate" go: "Click to naviguate"
desktop/views/components/choose-file-from-drive-window.vue: desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "ファイル選択中" choose-file: "Choosing files"
upload: "Upload files from your PC" upload: "Upload files from your PC"
cancel: "Cancel" cancel: "Cancel"
ok: "OK" ok: "OK"
@@ -264,7 +264,7 @@ desktop/views/components/following-window.vue:
desktop/views/components/following.vue: desktop/views/components/following.vue:
empty: "You dont follow anyone." empty: "You dont follow anyone."
desktop/views/components/friends-maker.vue: desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:" title: "Recommended users:"
empty: "Similar users werent found." empty: "Similar users werent found."
fetching: "Loading…" fetching: "Loading…"
refresh: "More" refresh: "More"
@@ -287,7 +287,7 @@ desktop/views/components/home.vue:
notifications: "Notifications" notifications: "Notifications"
users: "Recommended users" users: "Recommended users"
polls: "Polls" polls: "Polls"
post-form: "投稿フォーム" post-form: "Post form"
messaging: "Messaging" messaging: "Messaging"
server: "Server info" server: "Server info"
donation: "Donation" donation: "Donation"
@@ -302,10 +302,10 @@ desktop/views/components/messaging-room-window.vue:
desktop/views/components/messaging-window.vue: desktop/views/components/messaging-window.vue:
title: "Messaging" title: "Messaging"
desktop/views/components/note-detail.vue: desktop/views/components/note-detail.vue:
more: "会話をもっと読み込む" more: "Load more conversations"
private: "(この投稿は非公開です)" private: "(this post is private)"
is-renote: "がRenote" is-renote: "がRenote"
location: "位置情報" location: "Location"
renote: "Renote" renote: "Renote"
add-reaction: "リアクション" add-reaction: "リアクション"
desktop/views/components/note-detail.sub.vue: desktop/views/components/note-detail.sub.vue:
@@ -373,11 +373,11 @@ desktop/views/components/settings.vue:
behaviour: "Behavior" behaviour: "Behavior"
fetch-on-scroll: "Fetch on scroll" fetch-on-scroll: "Fetch on scroll"
fetch-on-scroll-desc: "When you scroll down the page automatically fetches additional content." fetch-on-scroll-desc: "When you scroll down the page automatically fetches additional content."
auto-popout: "ウィンドウの自動ポップアウト" auto-popout: "Auto pop-out window"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" auto-popout-desc: "Pop-out an opened window if possible. This setting is stored in the browser."
advanced: "Advanced settings" advanced: "Advanced settings"
api-via-stream: "ストリームを経由したAPIリクエスト" api-via-stream: "API request via stream"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。" api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
display: "Design and display" display: "Design and display"
customize: "Customize Home" customize: "Customize Home"
dark-mode: "Dark Mode" dark-mode: "Dark Mode"
@@ -387,28 +387,28 @@ desktop/views/components/settings.vue:
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 renote in the timeline"
show-renoted-my-notes: "Show renoted my post in the timeline" show-renoted-my-notes: "Show renoted my post in the timeline"
show-maps: "マップの自動展開" show-maps: "Show the map"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" show-maps-desc: "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: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "Play a sound when you received 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: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "Not 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 the language"
language-desc: "変更はページの再度読み込み後に反映されます。" language-desc: "You need to reload the page for the changes to take effect."
cache: "Cache" cache: "Cache"
clean-cache: "Cleanup" clean-cache: "Cleanup"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。" cache-warn: "The cache of account info/posts/replies/messages/settings stored in the browser will be deleted. You need to reload the page after cleaning up."
cache-cleared: "キャッシュを削除しました" cache-cleared: "Cache cleared"
cache-cleared-desc: "Please reload the page." cache-cleared-desc: "Please reload the page."
auto-watch: "Auto watch" auto-watch: "Auto watch"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。" auto-watch-desc: "Receive notifications about the post/reply/reaction automatically."
about: "About Misskey" about: "About Misskey"
operator: "The admin of this instance" operator: "The admin of this instance"
update: "Misskey Update" update: "Misskey Update"
@@ -418,19 +418,16 @@ 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: "アップデートを延期する(非推奨)" prevent-update: "アップデートを延期する(非推奨)"
prevent-update-desc: "この設定をオンにしてもアップデートが反映される場合があります。この設定はこのデバイスのみ有効です。" prevent-update-desc: "You may reflect updates even if you select this setting. This setting is valid only this device."
no-updates: "利用可能な更新はありません" 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: "To reload the page and updates are applied."
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."
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "Enable experimental features" experimental: "Enable experimental features"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "It would make Misskey client unstable. This setting is stored in the browser."
tools: "Tools" tools: "Tools"
task-manager: "Task Manager" task-manager: "Task Manager"
third-parties: "Third-party" third-parties: "Third-party"
@@ -453,7 +450,7 @@ desktop/views/components/settings.2fa.vue:
failed: "Failed to setup. please ensure that the token is correct." failed: "Failed to setup. please ensure that the token is correct."
info: "From now on, enter the token that is displayed on your device in addition to your password when signing-in to Misskey." info: "From now on, enter the token that is displayed on your device in addition to your password when signing-in to Misskey."
desktop/views/components/settings.api.vue: desktop/views/components/settings.api.vue:
intro: "APIを利用するには、上記のトークンを「i」というキーでパラメータに付加してリクエストします。" intro: "To access the API, set this token as the key 'i' of request parameters."
caution: "Please do not show this token to third parties (do not enter it somewhere else other than here) otherwise your account could get compromised." caution: "Please do not show this token to third parties (do not enter it somewhere else other than here) otherwise your account could get compromised."
regeneration-of-token: "In the unlikely event that this token leaks out you can regenerate it." regeneration-of-token: "In the unlikely event that this token leaks out you can regenerate it."
regenerate-token: "Regenerate the token" regenerate-token: "Regenerate the token"
@@ -478,10 +475,12 @@ desktop/views/components/settings.profile.vue:
description: "Description" description: "Description"
birthday: "Birthday" birthday: "Birthday"
save: "Update profile" save: "Update profile"
is-bot: "This account is a Bot"
is-cat: "This account is a Cat"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(this post is private)"
media: "つのメディア" media: " media"
poll: "投票" poll: "Polls"
desktop/views/components/taskmanager.vue: desktop/views/components/taskmanager.vue:
title: "Task Manager" title: "Task Manager"
desktop/views/components/timeline.vue: desktop/views/components/timeline.vue:
@@ -520,14 +519,20 @@ desktop/views/components/users-list.vue:
load-more: "More" load-more: "More"
fetching: "Loading…" fetching: "Loading…"
desktop/views/components/users-list-item.vue: desktop/views/components/users-list-item.vue:
followed: "フォローされています" followed: "Follows you"
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "Popout"
close: "閉じる" close: "Close"
desktop/views/pages/welcome.vue:
signin: "Log In"
signup: "Sign up"
signin-button: "Log in"
signup-button: "Sign up"
timeline: "Timeline"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
more: "さらに読み込む" more: "Load More"
desktop/views/pages/home-customize.vue: desktop/views/pages/home-customize.vue:
title: "Customize home" title: "Customize home"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
@@ -570,9 +575,9 @@ desktop/views/pages/user/user.profile.vue:
unmute: "Unmute" unmute: "Unmute"
desktop/views/pages/user/user.timeline.vue: desktop/views/pages/user/user.timeline.vue:
default: "Posts" default: "Posts"
with-replies: "投稿と返信" with-replies: "Posts and replies"
with-media: "メディア" with-media: "Media"
empty: "このユーザーはまだ何も投稿していないようです。" empty: "This user has never posted yet."
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "Messaging" title: "Messaging"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@@ -587,8 +592,8 @@ desktop/views/widgets/post-form.vue:
note: "Post" note: "Post"
placeholder: "What's happening?" placeholder: "What's happening?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "Click to edit your banner"
update-avatar: "クリックでアバター編集" update-avatar: "Click to edit your avatar"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "Trend" title: "Trend"
refresh: "Show others" refresh: "Show others"
@@ -676,15 +681,15 @@ mobile/views/pages/notifications.vue:
notifications: "Notifications" notifications: "Notifications"
read-all: "Are you sure you want to mark all unread notifications as read?" read-all: "Are you sure you want to mark all unread notifications as read?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "Profile"
will-be-published: "これらのプロフィールは公開されます。" name: "Name"
name: "名前" account: "Account"
location: "場所" location: "Location"
description: "自己紹介" description: "Description"
birthday: "Birthday" birthday: "Birthday"
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
is-bot: "This account is a Bot" is-cat: "This account is a Cat"
save: "Update profile" save: "Update profile"
saved: "Profile updated successfully" saved: "Profile updated successfully"
uploading: "Uploading" uploading: "Uploading"
@@ -697,17 +702,21 @@ mobile/views/pages/selectdrive.vue:
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "Signed in as {}" signed-in-as: "Signed in as {}"
lang: "Language" lang: "Language"
lang-tip: "変更はページの再読み込み後に反映されます。" lang-tip: "You will need to reload the page for the changes to take effect."
recommended: "Recommended" recommended: "Recommended"
auto: "Auto" auto: "Auto"
specify-language: "Specify the language" specify-language: "Specify the language"
design: "Design and display" design: "Design and display"
dark-mode: "Dark Mode" dark-mode: "Dark Mode"
i-am-under-limited-internet: "I'm under limited internet"
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 renotes"
show-renoted-my-notes: "Show renoted my notes" show-renoted-my-notes: "Show renoted my notes"
post-style: "Post design"
post-style-standard: "Standard"
post-style-smart: "Smart"
behavior: "Behavior" behavior: "Behavior"
fetch-on-scroll: "Fetch on scroll" fetch-on-scroll: "Fetch on scroll"
disable-via-mobile: "Without the \"mobile posts\" flag" disable-via-mobile: "Without the \"mobile posts\" flag"
+15 -6
View File
@@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -677,14 +682,14 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -703,11 +708,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+17 -8
View File
@@ -1,7 +1,7 @@
--- ---
meta: meta:
lang: "日本語" lang: "Français"
divider: "" divider: " "
common: common:
misskey: "Partagez avec les autres en utilisant Misskey" misskey: "Partagez avec les autres en utilisant Misskey"
time: time:
@@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "Info sur le serveur" title: "Info sur le serveur"
toggle: "Afficher les vues" toggle: "Afficher les vues"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "Description" description: "Description"
birthday: "Date de naissance" birthday: "Date de naissance"
save: "Mettre à jour le profil" save: "Mettre à jour le profil"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -677,14 +682,14 @@ mobile/views/pages/notifications.vue:
read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?" read-all: "Êtes vous sûr de vouloir marqués toutes les notifications non-lus en tant que lus?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -703,11 +708,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+15 -6
View File
@@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -677,14 +682,14 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -703,11 +708,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+16 -6
View File
@@ -191,7 +191,7 @@ common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -495,9 +495,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -553,6 +550,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
@@ -613,6 +612,13 @@ desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
@@ -808,14 +814,14 @@ mobile/views/pages/notifications.vue:
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -837,11 +843,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+15 -6
View File
@@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -677,14 +682,14 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -703,11 +708,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+102 -93
View File
@@ -1,7 +1,7 @@
--- ---
meta: meta:
lang: "japoński" lang: "język polski"
divider: "" divider: " "
common: common:
misskey: "Dziel się zawartością z innymi korzystając z Misskey." misskey: "Dziel się zawartością z innymi korzystając z Misskey."
time: time:
@@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "Informacje o serwerze" title: "Informacje o serwerze"
toggle: "Przełącz widok" toggle: "Przełącz widok"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "Publiczny" public: "Publiczny"
home: "Lokalny" home: "Lokalny"
home-desc: "Widoczny tylko na tej instancji" home-desc: "Widoczny tylko na tej instancji"
@@ -287,7 +287,7 @@ desktop/views/components/home.vue:
notifications: "Powiadomienia" notifications: "Powiadomienia"
users: "Polecani użytkownicy" users: "Polecani użytkownicy"
polls: "Ankiety" polls: "Ankiety"
post-form: "投稿フォーム" post-form: "Formularz tworzenia"
messaging: "Wiadomości" messaging: "Wiadomości"
server: "Informacje o serwerze" server: "Informacje o serwerze"
donation: "Dotacje" donation: "Dotacje"
@@ -302,12 +302,12 @@ desktop/views/components/messaging-room-window.vue:
desktop/views/components/messaging-window.vue: 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: "会話をもっと読み込む" more: "Załaduj więcej konwersacji"
private: "(この投稿は非公開です)" private: "(ten wpis jest prywatny)"
is-renote: "がRenote" is-renote: "がRenote"
location: "位置情報" location: "Informacje o lokalizacji"
renote: "Renote" renote: "Przeredaguj"
add-reaction: "リアクション" add-reaction: "Dodaj reakcję"
desktop/views/components/note-detail.sub.vue: desktop/views/components/note-detail.sub.vue:
private: "(ten wpis jest prywatny)" private: "(ten wpis jest prywatny)"
desktop/views/components/notes.note.vue: desktop/views/components/notes.note.vue:
@@ -375,49 +375,49 @@ desktop/views/components/settings.vue:
fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści." fetch-on-scroll-desc: "Po przewinięciu na dół strony automatycznie zostaną załadowane nowe treści."
auto-popout: "Automatycznie pojawiające się okna" auto-popout: "Automatycznie pojawiające się okna"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定" advanced: "Ustawienia zaawansowane"
api-via-stream: "ストリームを経由したAPIリクエスト" api-via-stream: "ストリームを経由したAPIリクエスト"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。" api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示" display: "Wygląd i wyświetlanie"
customize: "ホームをカスタマイズ" customize: "Dostosuj stronę główną"
dark-mode: "ダークモード" dark-mode: "Tryb ciemny"
circle-icons: "円形のアイコンを使用" circle-icons: "Używaj okrągłych ikon"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "Używaj gradientów na pasku tytułu okna"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu"
show-reply-target: "リプライ先を表示する" show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する" show-renoted-my-notes: "Renoteされた自分の投稿をタイムラインに表示する"
show-maps: "マップの自動展開" show-maps: "Automatycznie pokazuj mapę"
show-maps-desc: "位置情報が添付された投稿のマップを自動的に展開します。" show-maps-desc: "Mapa będzie automatycznie rozwijana dla wpisów zawierających informacje o lokalizacji."
sound: "サウンド" sound: "Dźwięk"
enable-sounds: "サウンドを有効にする" enable-sounds: "Włącz dźwięk"
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
volume: "ボリューム" volume: "Głośność"
test: "テスト" test: "Test"
mobile: "モバイル" mobile: "Wersja mobilna"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
language: "Język" language: "Język"
pick-language: "Wybierz język" pick-language: "Wybierz język"
recommended: "Zalecane" recommended: "Zalecane"
auto: "Automatycznie" auto: "Automatycznie"
specify-language: "Wybierz język" specify-language: "Wybierz język"
language-desc: "変更はページの再度読み込み後に反映されます。" language-desc: "Aby zmiany zostały uwzględnione, odśwież stronę."
cache: "キャッシュ" cache: "Pamięć podręczna"
clean-cache: "Wyczyść" clean-cache: "Wyczyść"
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。" cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "キャッシュを削除しました" cache-cleared: "Wyczyszczono pamięć podręczną"
cache-cleared-desc: "ページを再度読み込みしてください。" cache-cleared-desc: "Proszę odświeżyć stronę."
auto-watch: "投稿の自動ウォッチ" auto-watch: "投稿の自動ウォッチ"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。" auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "Misskeyについて" about: "O Misskey"
operator: "このサーバーの運営者" operator: "Administrator instancji"
update: "Misskey Update" update: "Aktualizacja Misskey"
version: "バージョン:" version: "Wersja:"
latest-version: "最新のバージョン:" latest-version: "Najnowsza wersja:"
update-checking: "アップデートを確認中" update-checking: "Sprawdzanie dostępności aktualizacji"
do-update: "アップデートを確認" do-update: "Sprawdź dostępność aktualizacji"
update-settings: "詳細設定" update-settings: "Ustawienia zaawansowane"
prevent-update: "アップデートを延期する(非推奨)" prevent-update: "Unikaj aktualizacji (niezalecane)"
prevent-update-desc: "Nawet jeżeli opcja jest zaznaczona, aktualizacje mogą zostać wykonane. Opcja dotyczy tylko tego urządzenia." prevent-update-desc: "Nawet jeżeli opcja jest zaznaczona, aktualizacje mogą zostać wykonane. Opcja dotyczy tylko tego urządzenia."
no-updates: "Brak dostępnych aktualizacji" no-updates: "Brak dostępnych aktualizacji"
no-updates-desc: "Twój Misskey jest aktualny." no-updates-desc: "Twój Misskey jest aktualny."
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "Ustawienia zaawansowane" advanced-settings: "Ustawienia zaawansowane"
debug-mode: "Włącz tryb debugowania" debug-mode: "Włącz tryb debugowania"
debug-mode-desc: "To ustawienie jest przechowywane w przeglądarce." debug-mode-desc: "To ustawienie jest przechowywane w przeglądarce."
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "Włącz eksperymentalne funkcje" experimental: "Włącz eksperymentalne funkcje"
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"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "Opis" description: "Opis"
birthday: "Data urodzenia" birthday: "Data urodzenia"
save: "Aktualizuj profil" save: "Aktualizuj profil"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,12 +523,18 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Dysk Misskey"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
more: "さらに読み込む" more: "Załaduj więcej"
desktop/views/pages/home-customize.vue: desktop/views/pages/home-customize.vue:
title: "ホームのカスタマイズ" title: "Dostosuj stronę główną"
desktop/views/pages/note.vue: desktop/views/pages/note.vue:
prev: "Poprzedni wpis" prev: "Poprzedni wpis"
next: "Następny wpis" next: "Następny wpis"
@@ -539,9 +544,9 @@ desktop/views/pages/selectdrive.vue:
cancel: "Anuluj" cancel: "Anuluj"
upload: "Wyślij pliki z Twojego komputera" upload: "Wyślij pliki z Twojego komputera"
desktop/views/pages/user-list.users.vue: desktop/views/pages/user-list.users.vue:
users: "ユーザー" users: "Użytkownicy"
add-user: "ユーザーを追加" add-user: "Dodaj użytkownika"
username: "ユーザー名" username: "Nazwa użytkownika"
desktop/views/pages/user/user.followers-you-know.vue: desktop/views/pages/user/user.followers-you-know.vue:
title: "Śledzący których znasz" title: "Śledzący których znasz"
loading: "Ładowanie" loading: "Ładowanie"
@@ -569,10 +574,10 @@ desktop/views/pages/user/user.profile.vue:
muted: "Wyciszyłeś" muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie" unmute: "Cofnij wyciszenie"
desktop/views/pages/user/user.timeline.vue: desktop/views/pages/user/user.timeline.vue:
default: "投稿" default: "Wpisy"
with-replies: "投稿と返信" with-replies: "Wpisy i odpowiedzi"
with-media: "メディア" with-media: "Zawartość multimedialna"
empty: "このユーザーはまだ何も投稿していないようです。" empty: "Ten użytkownik nie umieścił jeszcze niczego."
desktop/views/widgets/messaging.vue: desktop/views/widgets/messaging.vue:
title: "Wiadomości" title: "Wiadomości"
desktop/views/widgets/notifications.vue: desktop/views/widgets/notifications.vue:
@@ -587,8 +592,8 @@ desktop/views/widgets/post-form.vue:
note: "Wpis" note: "Wpis"
placeholder: "Co się dzieje?" placeholder: "Co się dzieje?"
desktop/views/widgets/profile.vue: desktop/views/widgets/profile.vue:
update-banner: "クリックでバナー編集" update-banner: "Naciśnij, aby zmienić baner"
update-avatar: "クリックでアバター編集" update-avatar: "Naciśnij, aby zmienić awatar"
desktop/views/widgets/trends.vue: desktop/views/widgets/trends.vue:
title: "Na czasie" title: "Na czasie"
refresh: "Pokaż inne" refresh: "Pokaż inne"
@@ -669,26 +674,26 @@ mobile/views/pages/messaging.vue:
mobile/views/pages/messaging-room.vue: mobile/views/pages/messaging-room.vue:
messaging: "Wiadomości" messaging: "Wiadomości"
mobile/views/pages/note.vue: mobile/views/pages/note.vue:
title: "Wyślij" title: "Wpis"
prev: "Poprzedni wpis" prev: "Poprzedni wpis"
next: "Następny wpis" next: "Następny wpis"
mobile/views/pages/notifications.vue: mobile/views/pages/notifications.vue:
notifications: "Powiadomienia" notifications: "Powiadomienia"
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?" read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "Profil"
will-be-published: "これらのプロフィールは公開されます。" name: "Nazwa"
name: "名前" account: "Konto"
location: "場所" location: "Lokalizacja"
description: "自己紹介" description: "Opis"
birthday: "誕生日" birthday: "Data urodzenia"
avatar: "アイコン" avatar: "Awatar"
banner: "バナー" banner: "Baner"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "Aktualizuj profil"
saved: "プロフィールを保存しました" saved: "Pomyślnie zaktualizowano profil"
uploading: "アップロード中" uploading: "Wysyłanie"
upload-failed: "アップロードに失敗しました" upload-failed: "Wysyłanie nie powiodło się"
mobile/views/pages/search.vue: mobile/views/pages/search.vue:
search: "Szukaj" search: "Szukaj"
empty: "Nie znaleziono wpisów zawierających '{}'" empty: "Nie znaleziono wpisów zawierających '{}'"
@@ -696,34 +701,38 @@ mobile/views/pages/selectdrive.vue:
select-file: "Wybierz plik" select-file: "Wybierz plik"
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "Zalogowany jako {}" signed-in-as: "Zalogowany jako {}"
lang: "言語" lang: "Język"
lang-tip: "変更はページの再読み込み後に反映されます。" lang-tip: "Aby zmiany zostały uwzględnione, odśwież stronę."
recommended: "推奨" recommended: "Zalecany"
auto: "自動" auto: "Automatycznie"
specify-language: "言語を指定" specify-language: "Wybierz język"
design: "デザインと表示" design: "Wygląd i wyświetlanie"
dark-mode: "ダークモード" dark-mode: "Tryb ciemny"
circle-icons: "円形のアイコンを使用" i-am-under-limited-internet: "Ograniczaj zużycie transferu"
timeline: "タイムライン" circle-icons: "Używaj okrągłych ikon"
show-reply-target: "リプライ先を表示する" timeline: "Oś czasu"
show-reply-target: "Pokazuj cel odpowiedzi"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
behavior: "動作" post-style: "Styl wpisów"
fetch-on-scroll: "スクロールで自動読み込み" post-style-standard: "Standardowy"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" post-style-smart: "スマート"
behavior: "Zachowanie"
fetch-on-scroll: "Automatycznie ładuj po przeciągnięciu w dół"
disable-via-mobile: "Nie oznaczaj wpisów jako „wysłane z telefonu”"
twitter: "Połączenie z Twitterem" twitter: "Połączenie z Twitterem"
twitter-connect: "Twitterアカウントに接続する" twitter-connect: "Połącz z Twitterem"
twitter-reconnect: "再接続する" twitter-reconnect: "Połącz ponownie"
twitter-disconnect: "切断する" twitter-disconnect: "Rozłącz"
update: "Misskey Update" update: "Aktualizacja Misskey"
version: "バージョン:" version: "Wersja:"
latest-version: "最新のバージョン:" latest-version: "Najnowsza wersja:"
update-checking: "アップデートを確認中" update-checking: "Sprawdzanie dostępności aktualizacji"
check-for-updates: "アップデートを確認" check-for-updates: "Sprawdź dostępność aktualizacji"
no-updates: "利用可能な更新はありません" no-updates: "Brak dostępnych aktualizacji"
no-updates-desc: "お使いのMisskeyは最新です。" no-updates-desc: "Twój Misskey jest aktualny."
update-available: "新しいバージョンが利用可能です" update-available: "Dostępna jest nowa wersja"
update-available-desc: "ページを再度読み込みすると更新が適用されます。" update-available-desc: "Odśwież stronę, aby zastosować aktualizację."
settings: "Ustawienia" settings: "Ustawienia"
signout: "Wyloguj" signout: "Wyloguj"
mobile/views/pages/user.vue: mobile/views/pages/user.vue:
+17 -8
View File
@@ -1,7 +1,7 @@
--- ---
meta: meta:
lang: "日本語" lang: "Русский язык"
divider: "" divider: " "
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "Misskeyで皆と共有しよう。"
time: time:
@@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -677,14 +682,14 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -703,11 +708,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+16 -7
View File
@@ -1,6 +1,6 @@
--- ---
meta: meta:
lang: "日本語" lang: "中文(简体)"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "Misskeyで皆と共有しよう。"
@@ -165,7 +165,7 @@ common/views/widgets/photo-stream.vue:
common/views/widgets/server.vue: common/views/widgets/server.vue:
title: "サーバー情報" title: "サーバー情報"
toggle: "表示を切り替え" toggle: "表示を切り替え"
commons/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "公開"
home: "ホーム" home: "ホーム"
home-desc: "ホームタイムラインにのみ公開" home-desc: "ホームタイムラインにのみ公開"
@@ -426,9 +426,6 @@ desktop/views/components/settings.vue:
advanced-settings: "高度な設定" advanced-settings: "高度な設定"
debug-mode: "デバッグモードを有効にする" debug-mode: "デバッグモードを有効にする"
debug-mode-desc: "この設定はブラウザに記憶されます。" debug-mode-desc: "この設定はブラウザに記憶されます。"
use-raw-script: "生のスクリプトを読み込む"
use-raw-script-desc: "圧縮されていない「生の」スクリプトを使用します。サイズが大きいため、読み込みに時間がかかる場合があります。この設定はブラウザに記憶されます。"
source-info: "Misskeyはソースマップも提供しています。"
experimental: "実験的機能を有効にする" experimental: "実験的機能を有効にする"
experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。" experimental-desc: "実験的機能を有効にするとMisskeyの動作が不安定になる可能性があります。この設定はブラウザに記憶されます。"
tools: "ツール" tools: "ツール"
@@ -478,6 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
save: "保存" save: "保存"
is-bot: "このアカウントはBotです"
is-cat: "このアカウントはCatです"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(この投稿は非公開です)" hidden: "(この投稿は非公開です)"
media: "つのメディア" media: "つのメディア"
@@ -524,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "ポップアウト" popout: "ポップアウト"
close: "閉じる" close: "閉じる"
desktop/views/pages/welcome.vue:
signin: "ログイン"
signup: "新規登録"
signin-button: "やってる"
signup-button: "やる"
timeline: "タイムライン"
desktop/views/pages/drive.vue: desktop/views/pages/drive.vue:
title: "Misskey Drive" title: "Misskey Drive"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -677,14 +682,14 @@ mobile/views/pages/notifications.vue:
read-all: "すべての通知を既読にしますか?" read-all: "すべての通知を既読にしますか?"
mobile/views/pages/settings/settings.profile.vue: mobile/views/pages/settings/settings.profile.vue:
title: "プロフィール" title: "プロフィール"
will-be-published: "これらのプロフィールは公開されます。"
name: "名前" name: "名前"
account: "アカウント"
location: "場所" location: "場所"
description: "自己紹介" description: "自己紹介"
birthday: "誕生日" birthday: "誕生日"
avatar: "アイコン" avatar: "アイコン"
banner: "バナー" banner: "バナー"
is-bot: "このアカウントはBotです" is-cat: "このアカウントはCatです"
save: "保存" save: "保存"
saved: "プロフィールを保存しました" saved: "プロフィールを保存しました"
uploading: "アップロード中" uploading: "アップロード中"
@@ -703,11 +708,15 @@ mobile/views/pages/settings.vue:
specify-language: "言語を指定" specify-language: "言語を指定"
design: "デザインと表示" design: "デザインと表示"
dark-mode: "ダークモード" dark-mode: "ダークモード"
i-am-under-limited-internet: "私は通信を制限されている"
circle-icons: "円形のアイコンを使用" circle-icons: "円形のアイコンを使用"
timeline: "タイムライン" timeline: "タイムライン"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteを表示する" show-my-renotes: "自分の行ったRenoteを表示する"
show-renoted-my-notes: "Renoteされた自分の投稿を表示する" show-renoted-my-notes: "Renoteされた自分の投稿を表示する"
post-style: "投稿の表示スタイル"
post-style-standard: "標準"
post-style-smart: "スマート"
behavior: "動作" behavior: "動作"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "「モバイルからの投稿」フラグを付けない"
+3 -2
View File
@@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "2.11.0", "version": "2.16.4",
"clientVersion": "1.0.5516", "clientVersion": "1.0.5673",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
@@ -211,6 +211,7 @@
"vue-template-compiler": "2.5.16", "vue-template-compiler": "2.5.16",
"vuedraggable": "2.16.0", "vuedraggable": "2.16.0",
"vuex": "3.0.1", "vuex": "3.0.1",
"vuex-persistedstate": "^2.5.4",
"web-push": "3.3.1", "web-push": "3.3.1",
"webfinger.js": "2.6.6", "webfinger.js": "2.6.6",
"webpack": "4.8.3", "webpack": "4.8.3",
+2 -9
View File
@@ -7,7 +7,7 @@ import locale from '../../locales';
export default class Replacer { export default class Replacer {
private lang: string; private lang: string;
public pattern = /%i18n:([a-z0-9_\-\.\/\|\!]+?)%/g; public pattern = /%i18n:([a-z0-9_\-\.\/\|]+?)%/g;
constructor(lang: string) { constructor(lang: string) {
this.lang = lang; this.lang = lang;
@@ -56,11 +56,6 @@ export default class Replacer {
public replacement(match, key) { public replacement(match, key) {
let path = null; let path = null;
const shouldEscape = key[0] == '!';
if (shouldEscape) {
key = key.substr(1);
}
if (key.indexOf('|') != -1) { if (key.indexOf('|') != -1) {
path = key.split('|')[0]; path = key.split('|')[0];
key = key.split('|')[1]; key = key.split('|')[1];
@@ -68,8 +63,6 @@ export default class Replacer {
const txt = this.get(path, key); const txt = this.get(path, key);
return shouldEscape return txt.replace(/'/g, '\\x27').replace(/"/g, '\\x22');
? txt.replace(/'/g, '\\x27').replace(/"/g, '\\x22')
: txt.replace(/"/g, '&quot;');
} }
} }
+11 -11
View File
@@ -29,11 +29,18 @@
if (url.pathname == '/auth') app = 'auth'; if (url.pathname == '/auth') app = 'auth';
//#endregion //#endregion
// Detect the user language //#region Detect the user language
// Note: The default language is Japanese
let lang = navigator.language.split('-')[0]; let lang = navigator.language.split('-')[0];
// The default language is English
if (!LANGS.includes(lang)) lang = 'en'; if (!LANGS.includes(lang)) lang = 'en';
if (localStorage.getItem('lang')) lang = localStorage.getItem('lang');
const vuex = localStorage.getItem('vuex');
if (vuex) {
const data = JSON.parse(vuex);
if (data.device.lang) lang = data.device.lang;
}
//#endregion
// Detect the user agent // Detect the user agent
const ua = navigator.userAgent.toLowerCase(); const ua = navigator.userAgent.toLowerCase();
@@ -68,13 +75,6 @@
// Script version // Script version
const ver = localStorage.getItem('v') || VERSION; const ver = localStorage.getItem('v') || VERSION;
// Whether in debug mode
const isDebug = localStorage.getItem('debug') == 'true';
// Whether use raw version script
const raw = (localStorage.getItem('useRawScript') == 'true' && isDebug)
|| ENV != 'production';
// Get salt query // Get salt query
const salt = localStorage.getItem('salt') const salt = localStorage.getItem('salt')
? '?salt=' + localStorage.getItem('salt') ? '?salt=' + localStorage.getItem('salt')
@@ -84,7 +84,7 @@
// Note: 'async' make it possible to load the script asyncly. // Note: 'async' make it possible to load the script asyncly.
// 'defer' make it possible to run the script when the dom loaded. // 'defer' make it possible to run the script when the dom loaded.
const script = document.createElement('script'); const script = document.createElement('script');
script.setAttribute('src', `/assets/${app}.${ver}.${lang}.${raw ? 'raw' : 'min'}.js${salt}`); script.setAttribute('src', `/assets/${app}.${ver}.${lang}.js${salt}`);
script.setAttribute('async', 'true'); script.setAttribute('async', 'true');
script.setAttribute('defer', 'true'); script.setAttribute('defer', 'true');
head.appendChild(script); head.appendChild(script);
@@ -23,7 +23,7 @@ export default async function(mios: MiOS, force = false, silent = false) {
} }
if (!silent) { if (!silent) {
alert('%i18n:!common.update-available%'.replace('{newer}', newer).replace('{current}', current)); alert('%i18n:common.update-available%'.replace('{newer}', newer).replace('{current}', current));
} }
return newer; return newer;
@@ -62,7 +62,7 @@ export class HomeStream extends Stream {
// トークンが再生成されたとき // トークンが再生成されたとき
// このままではMisskeyが利用できないので強制的にサインアウトさせる // このままではMisskeyが利用できないので強制的にサインアウトさせる
this.on('my_token_regenerated', () => { this.on('my_token_regenerated', () => {
alert('%i18n:!common.my-token-regenerated%'); alert('%i18n:common.my-token-regenerated%');
os.signout(); os.signout();
}); });
} }
@@ -21,10 +21,17 @@ export default Vue.extend({
} }
}, },
computed: { computed: {
lightmode(): boolean {
return this.$store.state.device.lightmode;
},
style(): any { style(): any {
return { return {
backgroundColor: this.user.avatarColor && this.user.avatarColor.length == 3 ? `rgb(${ this.user.avatarColor.join(',') })` : null, backgroundColor: this.lightmode
backgroundImage: `url(${ this.user.avatarUrl }?thumbnail)`, ? `rgb(${ this.user.avatarColor.slice(0, 3).join(',') })`
: this.user.avatarColor && this.user.avatarColor.length == 3
? `rgb(${ this.user.avatarColor.join(',') })`
: null,
backgroundImage: this.lightmode ? null : `url(${ this.user.avatarUrl }?thumbnail)`,
borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null
}; };
} }
@@ -8,21 +8,21 @@
<template v-if="network">%fa:check%</template> <template v-if="network">%fa:check%</template>
<template v-if="!network">%fa:times%</template> <template v-if="!network">%fa:times%</template>
</template> </template>
{{ network == null ? '%i18n:!@checking-network%' : '%i18n:!@network%' }}<mk-ellipsis v-if="network == null"/> {{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
</p> </p>
<p v-if="network == true" :data-wip="internet == null"> <p v-if="network == true" :data-wip="internet == null">
<template v-if="internet != null"> <template v-if="internet != null">
<template v-if="internet">%fa:check%</template> <template v-if="internet">%fa:check%</template>
<template v-if="!internet">%fa:times%</template> <template v-if="!internet">%fa:times%</template>
</template> </template>
{{ internet == null ? '%i18n:!@checking-internet%' : '%i18n:!@internet%' }}<mk-ellipsis v-if="internet == null"/> {{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
</p> </p>
<p v-if="internet == true" :data-wip="server == null"> <p v-if="internet == true" :data-wip="server == null">
<template v-if="server != null"> <template v-if="server != null">
<template v-if="server">%fa:check%</template> <template v-if="server">%fa:check%</template>
<template v-if="!server">%fa:times%</template> <template v-if="!server">%fa:times%</template>
</template> </template>
{{ server == null ? '%i18n:!@checking-server%' : '%i18n:!@server%' }}<mk-ellipsis v-if="server == null"/> {{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
</p> </p>
</div> </div>
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p> <p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
@@ -3,9 +3,9 @@
<img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/> <img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/>
<h1>%i18n:@title%</h1> <h1>%i18n:@title%</h1>
<p class="text"> <p class="text">
<span>{{ '%i18n:!@description%'.substr(0, '%i18n:!@description%'.indexOf('{')) }}</span> <span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
<a @click="reload">{{ '%i18n:!@description%'.match(/\{(.+?)\}/)[1] }}</a> <a @click="reload">{{ '%i18n:@description%'.match(/\{(.+?)\}/)[1] }}</a>
<span>{{ '%i18n:!@description%'.substr('%i18n:!@description%'.indexOf('}') + 1) }}</span> <span>{{ '%i18n:@description%'.substr('%i18n:@description%'.indexOf('}') + 1) }}</span>
</p> </p>
<button v-if="!troubleshooting" @click="troubleshooting = true">%i18n:@troubleshoot%</button> <button v-if="!troubleshooting" @click="troubleshooting = true">%i18n:@troubleshoot%</button>
<x-troubleshooter v-if="troubleshooting"/> <x-troubleshooter v-if="troubleshooting"/>
@@ -28,7 +28,7 @@ export default Vue.extend({
}, },
mounted() { mounted() {
document.title = 'Oops!'; document.title = 'Oops!';
document.documentElement.style.background = '#f8f8f8'; document.documentElement.style.setProperty('background', '#f8f8f8', 'important');
}, },
methods: { methods: {
reload() { reload() {
@@ -8,7 +8,7 @@
<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p> <p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p>
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p> <p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p>
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages"> <button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:!common.loading%' : '%i18n:!@more%' }} <template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
</button> </button>
<template v-for="(message, i) in _messages"> <template v-for="(message, i) in _messages">
<x-message :message="message" :key="message.id"/> <x-message :message="message" :key="message.id"/>
@@ -149,9 +149,9 @@ export default Vue.extend({
onMessage(message) { onMessage(message) {
// サウンドを再生する // サウンドを再生する
if ((this as any).os.isEnableSounds) { if (this.$store.state.device.enableSounds) {
const sound = new Audio(`${url}/assets/message.mp3`); const sound = new Audio(`${url}/assets/message.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5; sound.volume = this.$store.state.device.soundVolume;
sound.play(); sound.play();
} }
@@ -172,7 +172,7 @@ export default Vue.extend({
}); });
} else if (message.userId != (this as any).os.i.id) { } else if (message.userId != (this as any).os.i.id) {
// Notify // Notify
this.notify('%i18n:!@new-message%'); this.notify('%i18n:@new-message%');
} }
}, },
@@ -162,9 +162,9 @@ export default Vue.extend({
this.o.put(this.myColor, pos); this.o.put(this.myColor, pos);
// サウンドを再生する // サウンドを再生する
if ((this as any).os.isEnableSounds) { if (this.$store.state.device.enableSounds) {
const sound = new Audio(`${url}/assets/othello-put-me.mp3`); const sound = new Audio(`${url}/assets/othello-put-me.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5; sound.volume = this.$store.state.device.soundVolume;
sound.play(); sound.play();
} }
@@ -186,9 +186,9 @@ export default Vue.extend({
this.$forceUpdate(); this.$forceUpdate();
// サウンドを再生する // サウンドを再生する
if ((this as any).os.isEnableSounds && x.color != this.myColor) { if (this.$store.state.device.enableSounds && x.color != this.myColor) {
const sound = new Audio(`${url}/assets/othello-put-you.mp3`); const sound = new Audio(`${url}/assets/othello-put-you.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5; sound.volume = this.$store.state.device.soundVolume;
sound.play(); sound.play();
} }
}, },
@@ -5,7 +5,7 @@
</p> </p>
<ul ref="choices"> <ul ref="choices">
<li v-for="(choice, i) in choices"> <li v-for="(choice, i) in choices">
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:!@choice-n%'.replace('{}', i + 1)"> <input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
<button @click="remove(i)" title="%i18n:@remove%"> <button @click="remove(i)" title="%i18n:@remove%">
%fa:times% %fa:times%
</button> </button>
@@ -1,19 +1,19 @@
<template> <template>
<div class="mk-poll" :data-is-voted="isVoted"> <div class="mk-poll" :data-is-voted="isVoted">
<ul> <ul>
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:!@vote-to%'.replace('{}', choice.text) : ''"> <li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div> <div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
<span> <span>
<template v-if="choice.isVoted">%fa:check%</template> <template v-if="choice.isVoted">%fa:check%</template>
<span>{{ choice.text }}</span> <span>{{ choice.text }}</span>
<span class="votes" v-if="showResult">({{ '%i18n:!@vote-count%'.replace('{}', choice.votes) }})</span> <span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
</span> </span>
</li> </li>
</ul> </ul>
<p v-if="total > 0"> <p v-if="total > 0">
<span>{{ '%i18n:!@total-users%'.replace('{}', total) }}</span> <span>{{ '%i18n:@total-users%'.replace('{}', total) }}</span>
<span></span> <span></span>
<a v-if="!isVoted" @click="toggleShowResult">{{ showResult ? '%i18n:!@vote%' : '%i18n:!@show-result%' }}</a> <a v-if="!isVoted" @click="toggleShowResult">{{ showResult ? '%i18n:@vote%' : '%i18n:@show-result%' }}</a>
<span v-if="isVoted">%i18n:@voted%</span> <span v-if="isVoted">%i18n:@voted%</span>
</p> </p>
</div> </div>
@@ -22,7 +22,7 @@
import Vue from 'vue'; import Vue from 'vue';
import * as anime from 'animejs'; import * as anime from 'animejs';
const placeholder = '%i18n:!@choose-reaction%'; const placeholder = '%i18n:@choose-reaction%';
export default Vue.extend({ export default Vue.extend({
props: ['note', 'source', 'compact', 'cb'], props: ['note', 'source', 'compact', 'cb'],
@@ -9,7 +9,7 @@
<label class="token" v-if="user && user.twoFactorEnabled"> <label class="token" v-if="user && user.twoFactorEnabled">
<input v-model="token" type="number" placeholder="%i18n:@token%" required/>%fa:lock% <input v-model="token" type="number" placeholder="%i18n:@token%" required/>%fa:lock%
</label> </label>
<button type="submit" :disabled="signing">{{ signing ? '%i18n:!@signing-in%' : '%i18n:!@signin%' }}</button> <button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</button>
もしくは <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a> もしくは <a :href="`${apiUrl}/signin/twitter`">Twitterでログイン</a>
</form> </form>
</template> </template>
@@ -127,7 +127,7 @@ export default Vue.extend({
location.href = '/'; location.href = '/';
}); });
}).catch(() => { }).catch(() => {
alert('%i18n:!@some-error%'); alert('%i18n:@some-error%');
(window as any).grecaptcha.reset(); (window as any).grecaptcha.reset();
this.recaptchaed = false; this.recaptchaed = false;
+10 -10
View File
@@ -44,16 +44,16 @@ export default Vue.extend({
const time = this._time; const time = this._time;
const ago = (this.now.getTime() - time.getTime()) / 1000/*ms*/; const ago = (this.now.getTime() - time.getTime()) / 1000/*ms*/;
return ( return (
ago >= 31536000 ? '%i18n:!common.time.years_ago%' .replace('{}', (~~(ago / 31536000)).toString()) : ago >= 31536000 ? '%i18n:common.time.years_ago%' .replace('{}', (~~(ago / 31536000)).toString()) :
ago >= 2592000 ? '%i18n:!common.time.months_ago%' .replace('{}', (~~(ago / 2592000)).toString()) : ago >= 2592000 ? '%i18n:common.time.months_ago%' .replace('{}', (~~(ago / 2592000)).toString()) :
ago >= 604800 ? '%i18n:!common.time.weeks_ago%' .replace('{}', (~~(ago / 604800)).toString()) : ago >= 604800 ? '%i18n:common.time.weeks_ago%' .replace('{}', (~~(ago / 604800)).toString()) :
ago >= 86400 ? '%i18n:!common.time.days_ago%' .replace('{}', (~~(ago / 86400)).toString()) : ago >= 86400 ? '%i18n:common.time.days_ago%' .replace('{}', (~~(ago / 86400)).toString()) :
ago >= 3600 ? '%i18n:!common.time.hours_ago%' .replace('{}', (~~(ago / 3600)).toString()) : ago >= 3600 ? '%i18n:common.time.hours_ago%' .replace('{}', (~~(ago / 3600)).toString()) :
ago >= 60 ? '%i18n:!common.time.minutes_ago%'.replace('{}', (~~(ago / 60)).toString()) : ago >= 60 ? '%i18n:common.time.minutes_ago%'.replace('{}', (~~(ago / 60)).toString()) :
ago >= 10 ? '%i18n:!common.time.seconds_ago%'.replace('{}', (~~(ago % 60)).toString()) : ago >= 10 ? '%i18n:common.time.seconds_ago%'.replace('{}', (~~(ago % 60)).toString()) :
ago >= 0 ? '%i18n:!common.time.just_now%' : ago >= 0 ? '%i18n:common.time.just_now%' :
ago < 0 ? '%i18n:!common.time.future%' : ago < 0 ? '%i18n:common.time.future%' :
'%i18n:!common.time.unknown%'); '%i18n:common.time.unknown%');
} }
}, },
created() { created() {
@@ -3,7 +3,7 @@
<p>%i18n:@description%<a :href="`${docsUrl}/link-to-twitter`" target="_blank">%i18n:@detail%</a></p> <p>%i18n:@description%<a :href="`${docsUrl}/link-to-twitter`" target="_blank">%i18n:@detail%</a></p>
<p class="account" v-if="os.i.twitter" :title="`Twitter ID: ${os.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p> <p class="account" v-if="os.i.twitter" :title="`Twitter ID: ${os.i.twitter.userId}`">%i18n:@connected-to%: <a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p>
<p> <p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:!@reconnect%' : '%i18n:!@connect%' }}</a> <a :href="`${apiUrl}/connect/twitter`" target="_blank" @click.prevent="connect">{{ os.i.twitter ? '%i18n:@reconnect%' : '%i18n:@connect%' }}</a>
<span v-if="os.i.twitter"> or </span> <span v-if="os.i.twitter"> or </span>
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a> <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter" @click.prevent="disconnect">%i18n:@disconnect%</a>
</p> </p>
@@ -37,6 +37,7 @@ export default Vue.extend({
fetch(cb?) { fetch(cb?) {
this.fetching = true; this.fetching = true;
(this as any).api('notes', { (this as any).api('notes', {
local: true,
reply: false, reply: false,
renote: false, renote: false,
media: false, media: false,
@@ -52,15 +53,15 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.mk-welcome-timeline root(isDark)
background #fff background isDark ? #282C37 : #fff
> div > div
padding 16px padding 16px
overflow-wrap break-word overflow-wrap break-word
font-size .9em font-size .9em
color #4C4C4C color isDark ? #fff : #4C4C4C
border-bottom 1px solid rgba(#000, 0.05) border-bottom 1px solid isDark ? rgba(#000, 0.1) : rgba(#000, 0.05)
&:after &:after
content "" content ""
@@ -95,17 +96,23 @@ export default Vue.extend({
overflow hidden overflow hidden
font-weight bold font-weight bold
text-overflow ellipsis text-overflow ellipsis
color #627079 color isDark ? #fff : #627079
> .username > .username
margin 0 .5em 0 0 margin 0 .5em 0 0
color #ccc color isDark ? #606984 : #ccc
> .info > .info
margin-left auto margin-left auto
font-size 0.9em font-size 0.9em
> .created-at > .created-at
color #c0c0c0 color isDark ? #606984 : #c0c0c0
.mk-welcome-timeline[data-darkmode]
root(true)
.mk-welcome-timeline:not([data-darkmode])
root(false)
</style> </style>
@@ -14,7 +14,7 @@
</svg> </svg>
</div> </div>
<p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p> <p class="fetching" v-if="fetching">%i18n:@fetching%<mk-ellipsis/></p>
<h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:!@no-broadcasts%' : broadcasts[i].title }}</h1> <h1 v-if="!fetching">{{ broadcasts.length == 0 ? '%i18n:@no-broadcasts%' : broadcasts[i].title }}</h1>
<p v-if="!fetching"> <p v-if="!fetching">
<span v-if="broadcasts.length != 0" v-html="broadcasts[i].text"></span> <span v-if="broadcasts.length != 0" v-html="broadcasts[i].text"></span>
<template v-if="broadcasts.length == 0">%i18n:@have-a-nice-day%</template> <template v-if="broadcasts.length == 0">%i18n:@have-a-nice-day%</template>
@@ -3,9 +3,9 @@
<article> <article>
<h1>%fa:heart%%i18n:@title%</h1> <h1>%fa:heart%%i18n:@title%</h1>
<p> <p>
{{ '%i18n:!@text%'.substr(0, '%i18n:!@text%'.indexOf('{')) }} {{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }}
<a href="https://syuilo.com">@syuilo</a> <a href="https://syuilo.com">@syuilo</a>
{{ '%i18n:!@text%'.substr('%i18n:!@text%'.indexOf('}') + 1) }} {{ '%i18n:@text%'.substr('%i18n:@text%'.indexOf('}') + 1) }}
</p> </p>
</article> </article>
</div> </div>
+2
View File
@@ -8,6 +8,7 @@ declare const _STATS_URL_: string;
declare const _STATUS_URL_: string; declare const _STATUS_URL_: string;
declare const _DEV_URL_: string; declare const _DEV_URL_: string;
declare const _LANG_: string; declare const _LANG_: string;
declare const _LANGS_: string;
declare const _RECAPTCHA_SITEKEY_: string; declare const _RECAPTCHA_SITEKEY_: string;
declare const _SW_PUBLICKEY_: string; declare const _SW_PUBLICKEY_: string;
declare const _THEME_COLOR_: string; declare const _THEME_COLOR_: string;
@@ -27,6 +28,7 @@ export const statsUrl = _STATS_URL_;
export const statusUrl = _STATUS_URL_; export const statusUrl = _STATUS_URL_;
export const devUrl = _DEV_URL_; export const devUrl = _DEV_URL_;
export const lang = _LANG_; export const lang = _LANG_;
export const langs = _LANGS_;
export const recaptchaSitekey = _RECAPTCHA_SITEKEY_; export const recaptchaSitekey = _RECAPTCHA_SITEKEY_;
export const swPublickey = _SW_PUBLICKEY_; export const swPublickey = _SW_PUBLICKEY_;
export const themeColor = _THEME_COLOR_; export const themeColor = _THEME_COLOR_;
@@ -2,7 +2,7 @@
<div class="mk-calendar" :data-melt="design == 4 || design == 5"> <div class="mk-calendar" :data-melt="design == 4 || design == 5">
<template v-if="design == 0 || design == 1"> <template v-if="design == 0 || design == 1">
<button @click="prev" title="%i18n:@prev%">%fa:chevron-circle-left%</button> <button @click="prev" title="%i18n:@prev%">%fa:chevron-circle-left%</button>
<p class="title">{{ '%i18n:!@title%'.replace('{1}', year).replace('{2}', month) }}</p> <p class="title">{{ '%i18n:@title%'.replace('{1}', year).replace('{2}', month) }}</p>
<button @click="next" title="%i18n:@next%">%fa:chevron-circle-right%</button> <button @click="next" title="%i18n:@next%">%fa:chevron-circle-right%</button>
</template> </template>
@@ -21,7 +21,7 @@
:data-is-out-of-range="isOutOfRange(i + 1)" :data-is-out-of-range="isOutOfRange(i + 1)"
:data-is-donichi="isDonichi(i + 1)" :data-is-donichi="isDonichi(i + 1)"
@click="go(i + 1)" @click="go(i + 1)"
:title="isOutOfRange(i + 1) ? null : '%i18n:!@go%'" :title="isOutOfRange(i + 1) ? null : '%i18n:@go%'"
> >
<div>{{ i + 1 }}</div> <div>{{ i + 1 }}</div>
</div> </div>
@@ -58,13 +58,13 @@ export default Vue.extend({
month: new Date().getMonth() + 1, month: new Date().getMonth() + 1,
selected: new Date(), selected: new Date(),
weekdayText: [ weekdayText: [
'%i18n:!common.weekday-short.sunday%', '%i18n:common.weekday-short.sunday%',
'%i18n:!common.weekday-short.monday%', '%i18n:common.weekday-short.monday%',
'%i18n:!common.weekday-short.tuesday%', '%i18n:common.weekday-short.tuesday%',
'%i18n:!common.weekday-short.wednesday%', '%i18n:common.weekday-short.wednesday%',
'%i18n:!common.weekday-short.thursday%', '%i18n:common.weekday-short.thursday%',
'%i18n:!common.weekday-short.friday%', '%i18n:common.weekday-short.friday%',
'%i18n:!common.weekday-short.saturday%' '%i18n:common.weekday-short.saturday%'
] ]
}; };
}, },
@@ -64,46 +64,46 @@ export default Vue.extend({
this.isContextmenuShowing = true; this.isContextmenuShowing = true;
contextmenu(e, [{ contextmenu(e, [{
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.rename%', text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%', icon: '%fa:i-cursor%',
onClick: this.rename onClick: this.rename
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.copy-url%', text: '%i18n:@contextmenu.copy-url%',
icon: '%fa:link%', icon: '%fa:link%',
onClick: this.copyUrl onClick: this.copyUrl
}, { }, {
type: 'link', type: 'link',
href: `${this.file.url}?download`, href: `${this.file.url}?download`,
text: '%i18n:!@contextmenu.download%', text: '%i18n:@contextmenu.download%',
icon: '%fa:download%', icon: '%fa:download%',
}, { }, {
type: 'divider', type: 'divider',
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!common.delete%', text: '%i18n:common.delete%',
icon: '%fa:R trash-alt%', icon: '%fa:R trash-alt%',
onClick: this.deleteFile onClick: this.deleteFile
}, { }, {
type: 'divider', type: 'divider',
}, { }, {
type: 'nest', type: 'nest',
text: '%i18n:!@contextmenu.else-files%', text: '%i18n:@contextmenu.else-files%',
menu: [{ menu: [{
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.set-as-avatar%', text: '%i18n:@contextmenu.set-as-avatar%',
onClick: this.setAsAvatar onClick: this.setAsAvatar
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.set-as-banner%', text: '%i18n:@contextmenu.set-as-banner%',
onClick: this.setAsBanner onClick: this.setAsBanner
}] }]
}, { }, {
type: 'nest', type: 'nest',
text: '%i18n:!@contextmenu.open-in-app%', text: '%i18n:@contextmenu.open-in-app%',
menu: [{ menu: [{
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.add-app%...', text: '%i18n:@contextmenu.add-app%...',
onClick: this.addApp onClick: this.addApp
}] }]
}], { }], {
@@ -141,8 +141,8 @@ export default Vue.extend({
rename() { rename() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@contextmenu.rename-file%', title: '%i18n:@contextmenu.rename-file%',
placeholder: '%i18n:!@contextmenu.input-new-file-name%', placeholder: '%i18n:@contextmenu.input-new-file-name%',
default: this.file.name, default: this.file.name,
allowEmpty: false allowEmpty: false
}).then(name => { }).then(name => {
@@ -157,9 +157,9 @@ export default Vue.extend({
copyToClipboard(this.file.url); copyToClipboard(this.file.url);
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%fa:check%%i18n:@contextmenu.copied%', title: '%fa:check%%i18n:@contextmenu.copied%',
text: '%i18n:!@contextmenu.copied-url-to-clipboard%', text: '%i18n:@contextmenu.copied-url-to-clipboard%',
actions: [{ actions: [{
text: '%i18n:!common.ok%' text: '%i18n:common.ok%'
}] }]
}); });
}, },
@@ -54,26 +54,26 @@ export default Vue.extend({
this.isContextmenuShowing = true; this.isContextmenuShowing = true;
contextmenu(e, [{ contextmenu(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%',
onClick: this.go onClick: this.go
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.show-in-new-window%', text: '%i18n:@contextmenu.show-in-new-window%',
icon: '%fa:R window-restore%', icon: '%fa:R window-restore%',
onClick: this.newWindow onClick: this.newWindow
}, { }, {
type: 'divider', type: 'divider',
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.rename%', text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%', icon: '%fa:i-cursor%',
onClick: this.rename onClick: this.rename
}, { }, {
type: 'divider', type: 'divider',
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!common.delete%', text: '%i18n:common.delete%',
icon: '%fa:R trash-alt%', icon: '%fa:R trash-alt%',
onClick: this.deleteFolder onClick: this.deleteFolder
}], { }], {
@@ -159,15 +159,15 @@ export default Vue.extend({
switch (err) { switch (err) {
case 'detected-circular-definition': case 'detected-circular-definition':
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%', title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
text: '%i18n:!@circular-reference-detected%', text: '%i18n:@circular-reference-detected%',
actions: [{ actions: [{
text: '%i18n:!common.ok%' text: '%i18n:common.ok%'
}] }]
}); });
break; break;
default: default:
alert('%i18n:!@unhandled-error% ' + err); alert('%i18n:@unhandled-error% ' + err);
} }
}); });
} }
@@ -199,8 +199,8 @@ export default Vue.extend({
rename() { rename() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@contextmenu.rename-folder%', title: '%i18n:@contextmenu.rename-folder%',
placeholder: '%i18n:!@contextmenu.input-new-folder-name%', placeholder: '%i18n:@contextmenu.input-new-folder-name%',
default: this.folder.name default: this.folder.name
}).then(name => { }).then(name => {
(this as any).api('drive/folders/update', { (this as any).api('drive/folders/update', {
@@ -8,7 +8,7 @@
@drop.stop="onDrop" @drop.stop="onDrop"
> >
<template v-if="folder == null">%fa:cloud%</template> <template v-if="folder == null">%fa:cloud%</template>
<span>{{ folder == null ? '%i18n:!@drive%' : folder.name }}</span> <span>{{ folder == null ? '%i18n:@drive%' : folder.name }}</span>
</div> </div>
</template> </template>
@@ -138,17 +138,17 @@ export default Vue.extend({
onContextmenu(e) { onContextmenu(e) {
contextmenu(e, [{ contextmenu(e, [{
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.create-folder%', text: '%i18n:@contextmenu.create-folder%',
icon: '%fa:R folder%', icon: '%fa:R folder%',
onClick: this.createFolder onClick: this.createFolder
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.upload%', text: '%i18n:@contextmenu.upload%',
icon: '%fa:upload%', icon: '%fa:upload%',
onClick: this.selectLocalFile onClick: this.selectLocalFile
}, { }, {
type: 'item', type: 'item',
text: '%i18n:!@contextmenu.url-upload%', text: '%i18n:@contextmenu.url-upload%',
icon: '%fa:cloud-upload-alt%', icon: '%fa:cloud-upload-alt%',
onClick: this.urlUpload onClick: this.urlUpload
}]); }]);
@@ -306,15 +306,15 @@ export default Vue.extend({
switch (err) { switch (err) {
case 'detected-circular-definition': case 'detected-circular-definition':
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%fa:exclamation-triangle%%i18n:!@unable-to-process%', title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
text: '%i18n:!@circular-reference-detected%', text: '%i18n:@circular-reference-detected%',
actions: [{ actions: [{
text: '%i18n:!common.ok%' text: '%i18n:common.ok%'
}] }]
}); });
break; break;
default: default:
alert('%i18n:!@unhandled-error% ' + err); alert('%i18n:@unhandled-error% ' + err);
} }
}); });
} }
@@ -327,8 +327,8 @@ export default Vue.extend({
urlUpload() { urlUpload() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@url-upload%', title: '%i18n:@url-upload%',
placeholder: '%i18n:!@url-of-file%' placeholder: '%i18n:@url-of-file%'
}).then(url => { }).then(url => {
(this as any).api('drive/files/upload_from_url', { (this as any).api('drive/files/upload_from_url', {
url: url, url: url,
@@ -337,9 +337,9 @@ export default Vue.extend({
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%fa:check%%i18n:@url-upload-requested%', title: '%fa:check%%i18n:@url-upload-requested%',
text: '%i18n:!@may-take-time%', text: '%i18n:@may-take-time%',
actions: [{ actions: [{
text: '%i18n:!common.ok%' text: '%i18n:common.ok%'
}] }]
}); });
}); });
@@ -347,8 +347,8 @@ export default Vue.extend({
createFolder() { createFolder() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@create-folder%', title: '%i18n:@create-folder%',
placeholder: '%i18n:!@folder-name%' placeholder: '%i18n:@folder-name%'
}).then(name => { }).then(name => {
(this as any).api('drive/folders/create', { (this as any).api('drive/folders/create', {
name: name, name: name,
@@ -1,7 +1,7 @@
<template> <template>
<mk-window width="400px" height="550px" @closed="$destroy"> <mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header"> <span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@followers%.replace('{}', {{ user | userName }}) <img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ '%i18n:@followers%'.replace('{}', name) }}
</span> </span>
<mk-followers :user="user"/> <mk-followers :user="user"/>
</mk-window> </mk-window>
@@ -11,7 +11,12 @@
import Vue from 'vue'; import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
props: ['user'] props: ['user'],
computed: {
name(): string {
return Vue.filter('userName')(this.user);
}
}
}); });
</script> </script>
@@ -1,7 +1,7 @@
<template> <template>
<mk-window width="400px" height="550px" @closed="$destroy"> <mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header"> <span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>%i18n:!@following%.replace('{}', {{ user | userName }}) <img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ '%i18n:@following%'.replace('{}', name) }}
</span> </span>
<mk-following :user="user"/> <mk-following :user="user"/>
</mk-window> </mk-window>
@@ -11,7 +11,12 @@
import Vue from 'vue'; import Vue from 'vue';
export default Vue.extend({ export default Vue.extend({
props: ['user'] props: ['user'],
computed: {
name(): string {
return Vue.filter('userName')(this.user);
}
}
}); });
</script> </script>
@@ -102,7 +102,7 @@ export default Vue.extend({
computed: { computed: {
home(): any[] { home(): any[] {
return this.$store.state.settings.data.home; return this.$store.state.settings.home;
}, },
left(): any[] { left(): any[] {
return this.home.filter(w => w.place == 'left'); return this.home.filter(w => w.place == 'left');
@@ -59,7 +59,7 @@
<template v-else>%fa:reply%</template> <template v-else>%fa:reply%</template>
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p> <p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
</button> </button>
<button @click="renote" title="%i18n:@renote%> <button @click="renote" title="%i18n:@renote%">
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p> %fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
</button> </button>
<button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%"> <button :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
@@ -4,6 +4,9 @@
<div class="main"> <div class="main">
<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="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span>
<span class="username"><mk-acct :user="note.user"/></span> <span class="username"><mk-acct :user="note.user"/></span>
<div class="info"> <div class="info">
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
@@ -68,7 +71,6 @@ root(isDark)
align-items baseline align-items baseline
margin-bottom 2px margin-bottom 2px
white-space nowrap white-space nowrap
line-height 21px
> .name > .name
display block display block
@@ -84,6 +86,20 @@ root(isDark)
&:hover &:hover
text-decoration underline text-decoration underline
> .is-admin
> .is-bot
> .is-cat
margin 0 0.5em 0 0
padding 1px 5px
font-size 10px
color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username > .username
margin 0 .5em 0 0 margin 0 .5em 0 0
color isDark ? #606984 : #d1d8da color isDark ? #606984 : #d1d8da
@@ -6,9 +6,9 @@
<div class="renote" v-if="isRenote"> <div class="renote" v-if="isRenote">
<mk-avatar class="avatar" :user="note.user"/> <mk-avatar class="avatar" :user="note.user"/>
%fa:retweet% %fa:retweet%
<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span> <span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a> <a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
<span>{{ '%i18n:!@reposted-by%'.substr('%i18n:!@reposted-by%'.indexOf('}') + 1) }}</span> <span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
<mk-time :time="note.createdAt"/> <mk-time :time="note.createdAt"/>
</div> </div>
<article> <article>
@@ -16,7 +16,9 @@
<div class="main"> <div class="main">
<header> <header>
<router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link> <router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link>
<span class="is-bot" v-if="p.user.host === null && p.user.isBot">bot</span> <span class="is-admin" v-if="p.user.isAdmin">admin</span>
<span class="is-bot" v-if="p.user.isBot">bot</span>
<span class="is-cat" v-if="p.user.isCat">cat</span>
<span class="username"><mk-acct :user="p.user"/></span> <span class="username"><mk-acct :user="p.user"/></span>
<div class="info"> <div class="info">
<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>
@@ -430,7 +432,9 @@ root(isDark)
&:hover &:hover
text-decoration underline text-decoration underline
> .is-admin
> .is-bot > .is-bot
> .is-cat
margin 0 .5em 0 0 margin 0 .5em 0 0
padding 1px 6px padding 1px 6px
font-size 12px font-size 12px
@@ -438,6 +442,10 @@ root(isDark)
border solid 1px isDark ? #57616f : #ddd border solid 1px isDark ? #57616f : #ddd
border-radius 3px border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username > .username
margin 0 .5em 0 0 margin 0 .5em 0 0
overflow hidden overflow hidden
@@ -145,9 +145,9 @@ export default Vue.extend({
this.notes.unshift(note); this.notes.unshift(note);
// サウンドを再生する // サウンドを再生する
if ((this as any).os.isEnableSounds && !silent) { if (this.$store.state.device.enableSounds && !silent) {
const sound = new Audio(`${url}/assets/post.mp3`); const sound = new Audio(`${url}/assets/post.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5; sound.volume = this.$store.state.device.soundVolume;
sound.play(); sound.play();
} }
@@ -81,7 +81,7 @@
</transition-group> </transition-group>
</div> </div>
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:!common.loading%' : '%i18n:!@more%' }} <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
</button> </button>
<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p> <p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>
<p class="loading" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p> <p class="loading" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
@@ -4,8 +4,8 @@
<span :class="$style.icon" v-if="geo">%fa:map-marker-alt%</span> <span :class="$style.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="$style.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="$style.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"/> <mk-note-preview v-if="reply" :class="$style.notePreview" :note="reply"/>
@@ -37,7 +37,7 @@
<button class="visibility" title="公開範囲" @click="setVisibility" ref="visibilityButton">%fa:lock%</button> <button class="visibility" title="公開範囲" @click="setVisibility" ref="visibilityButton">%fa:lock%</button>
<p class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</p> <p class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</p>
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post"> <button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
{{ posting ? '%i18n:!@posting%' : submitText }}<mk-ellipsis v-if="posting"/> {{ posting ? '%i18n:@posting%' : submitText }}<mk-ellipsis v-if="posting"/>
</button> </button>
<input ref="file" type="file" accept="image/*" multiple="multiple" tabindex="-1" @change="onChangeFile"/> <input ref="file" type="file" accept="image/*" multiple="multiple" tabindex="-1" @change="onChangeFile"/>
<div class="dropzone" v-if="draghover"></div> <div class="dropzone" v-if="draghover"></div>
@@ -86,18 +86,18 @@ export default Vue.extend({
placeholder(): string { placeholder(): string {
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%'; : '%i18n:@note-placeholder%';
}, },
submitText(): string { submitText(): string {
return this.renote return this.renote
? '%i18n:!@renote%' ? '%i18n:@renote%'
: this.reply : this.reply
? '%i18n:!@reply%' ? '%i18n:@reply%'
: '%i18n:!@note%'; : '%i18n:@note%';
}, },
canPost(): boolean { canPost(): boolean {
@@ -304,16 +304,16 @@ export default Vue.extend({
this.deleteDraft(); this.deleteDraft();
this.$emit('posted'); this.$emit('posted');
(this as any).apis.notify(this.renote (this as any).apis.notify(this.renote
? '%i18n:!@reposted%' ? '%i18n:@reposted%'
: this.reply : this.reply
? '%i18n:!@replied%' ? '%i18n:@replied%'
: '%i18n:!@posted%'); : '%i18n:@posted%');
}).catch(err => { }).catch(err => {
(this as any).apis.notify(this.renote (this as any).apis.notify(this.renote
? '%i18n:!@renote-failed%' ? '%i18n:@renote-failed%'
: this.reply : this.reply
? '%i18n:!@reply-failed%' ? '%i18n:@reply-failed%'
: '%i18n:!@note-failed%'); : '%i18n:@note-failed%');
}).then(() => { }).then(() => {
this.posting = false; this.posting = false;
}); });
@@ -5,7 +5,7 @@
<footer> <footer>
<a class="quote" v-if="!quote" @click="onQuote">%i18n:@quote%</a> <a class="quote" v-if="!quote" @click="onQuote">%i18n:@quote%</a>
<button class="ui cancel" @click="cancel">%i18n:@cancel%</button> <button class="ui cancel" @click="cancel">%i18n:@cancel%</button>
<button class="ui primary ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:!@reposting%' : '%i18n:!@renote%' }}</button> <button class="ui primary ok" @click="ok" :disabled="wait">{{ wait ? '%i18n:@reposting%' : '%i18n:@renote%' }}</button>
</footer> </footer>
</template> </template>
<template v-if="quote"> <template v-if="quote">
@@ -32,9 +32,9 @@ export default Vue.extend({
renoteId: this.note.id renoteId: this.note.id
}).then(data => { }).then(data => {
this.$emit('posted'); this.$emit('posted');
(this as any).apis.notify('%i18n:!@success%'); (this as any).apis.notify('%i18n:@success%');
}).catch(err => { }).catch(err => {
(this as any).apis.notify('%i18n:!@failure%'); (this as any).apis.notify('%i18n:@failure%');
}).then(() => { }).then(() => {
this.wait = false; this.wait = false;
}); });
@@ -34,7 +34,7 @@ export default Vue.extend({
methods: { methods: {
register() { register() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@enter-password%', title: '%i18n:@enter-password%',
type: 'password' type: 'password'
}).then(password => { }).then(password => {
(this as any).api('i/2fa/register', { (this as any).api('i/2fa/register', {
@@ -47,13 +47,13 @@ export default Vue.extend({
unregister() { unregister() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@enter-password%', title: '%i18n:@enter-password%',
type: 'password' type: 'password'
}).then(password => { }).then(password => {
(this as any).api('i/2fa/unregister', { (this as any).api('i/2fa/unregister', {
password: password password: password
}).then(() => { }).then(() => {
(this as any).apis.notify('%i18n:!@unregistered%'); (this as any).apis.notify('%i18n:@unregistered%');
(this as any).os.i.twoFactorEnabled = false; (this as any).os.i.twoFactorEnabled = false;
}); });
}); });
@@ -63,10 +63,10 @@ export default Vue.extend({
(this as any).api('i/2fa/done', { (this as any).api('i/2fa/done', {
token: this.token token: this.token
}).then(() => { }).then(() => {
(this as any).apis.notify('%i18n:!@success%'); (this as any).apis.notify('%i18n:@success%');
(this as any).os.i.twoFactorEnabled = true; (this as any).os.i.twoFactorEnabled = true;
}).catch(() => { }).catch(() => {
(this as any).apis.notify('%i18n:!@failed%'); (this as any).apis.notify('%i18n:@failed%');
}); });
} }
} }
@@ -15,7 +15,7 @@ export default Vue.extend({
methods: { methods: {
regenerateToken() { regenerateToken() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@enter-password%', title: '%i18n:@enter-password%',
type: 'password' type: 'password'
}).then(password => { }).then(password => {
(this as any).api('i/regenerate_token', { (this as any).api('i/regenerate_token', {
@@ -11,21 +11,21 @@ export default Vue.extend({
methods: { methods: {
reset() { reset() {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@enter-current-password%', title: '%i18n:@enter-current-password%',
type: 'password' type: 'password'
}).then(currentPassword => { }).then(currentPassword => {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@enter-new-password%', title: '%i18n:@enter-new-password%',
type: 'password' type: 'password'
}).then(newPassword => { }).then(newPassword => {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:!@enter-new-password-again%', title: '%i18n:@enter-new-password-again%',
type: 'password' type: 'password'
}).then(newPassword2 => { }).then(newPassword2 => {
if (newPassword !== newPassword2) { if (newPassword !== newPassword2) {
(this as any).apis.dialog({ (this as any).apis.dialog({
title: null, title: null,
text: '%i18n:!@not-match%', text: '%i18n:@not-match%',
actions: [{ actions: [{
text: 'OK' text: 'OK'
}] }]
@@ -36,7 +36,7 @@ export default Vue.extend({
currentPasword: currentPassword, currentPasword: currentPassword,
newPassword: newPassword newPassword: newPassword
}).then(() => { }).then(() => {
(this as any).apis.notify('%i18n:!@changed%'); (this as any).apis.notify('%i18n:@changed%');
}); });
}); });
}); });
@@ -24,7 +24,8 @@
<button class="ui primary" @click="save">%i18n:@save%</button> <button class="ui primary" @click="save">%i18n:@save%</button>
<section> <section>
<h2>その他</h2> <h2>その他</h2>
<mk-switch v-model="os.i.isBot" @change="onChangeIsBot" text="このアカウントはbotです"/> <mk-switch v-model="os.i.isBot" @change="onChangeIsBot" text="%i18n:@is-bot%"/>
<mk-switch v-model="os.i.isCat" @change="onChangeIsCat" text="%i18n:@is-cat%"/>
</section> </section>
</div> </div>
</template> </template>
@@ -65,6 +66,11 @@ export default Vue.extend({
(this as any).api('i/update', { (this as any).api('i/update', {
isBot: (this as any).os.i.isBot isBot: (this as any).os.i.isBot
}); });
},
onChangeIsCat() {
(this as any).api('i/update', {
isCat: (this as any).os.i.isCat
});
} }
} }
}); });
@@ -62,8 +62,10 @@
<el-slider <el-slider
v-model="soundVolume" v-model="soundVolume"
:show-input="true" :show-input="true"
:format-tooltip="v => `${v}%`" :format-tooltip="v => `${v * 100}%`"
:disabled="!enableSounds" :disabled="!enableSounds"
:max="1"
:step="0.1"
/> />
<button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button> <button class="ui button" @click="soundTest">%fa:volume-up% %i18n:@test%</button>
</section> </section>
@@ -77,14 +79,10 @@
<h1>%i18n:@language%</h1> <h1>%i18n:@language%</h1>
<el-select v-model="lang" placeholder="%i18n:@pick-language%"> <el-select v-model="lang" placeholder="%i18n:@pick-language%">
<el-option-group label="%i18n:@recommended%"> <el-option-group label="%i18n:@recommended%">
<el-option label="%i18n:@auto%" value=""/> <el-option label="%i18n:@auto%" :value="null"/>
</el-option-group> </el-option-group>
<el-option-group label="%i18n:@specify-language%"> <el-option-group label="%i18n:@specify-language%">
<el-option label="日本語" value="ja"/> <el-option v-for="x in langs" :label="x[1]" :value="x[0]" :key="x[0]"/>
<el-option label="English" value="en"/>
<el-option label="Français" value="fr"/>
<el-option label="Polski" value="pl"/>
<el-option label="Deutsch" value="de"/>
</el-option-group> </el-option-group>
</el-select> </el-select>
<div class="none ui info"> <div class="none ui info">
@@ -178,15 +176,7 @@
<mk-switch v-model="debug" text="%i18n:@debug-mode%"> <mk-switch v-model="debug" text="%i18n:@debug-mode%">
<span>%i18n:@debug-mode-desc%</span> <span>%i18n:@debug-mode-desc%</span>
</mk-switch> </mk-switch>
<template v-if="debug"> <mk-switch v-model="enableExperimentalFeatures" text="%i18n:@experimental%">
<mk-switch v-model="useRawScript" text="%i18n:@use-raw-script%">
<span>%i18n:@use-raw-script-desc%</span>
</mk-switch>
<div class="none ui info">
<p>%fa:info-circle%%i18n:@source-info%</p>
</div>
</template>
<mk-switch v-model="enableExperimental" text="%i18n:@experimental%">
<span>%i18n:@experimental-desc%</span> <span>%i18n:@experimental-desc%</span>
</mk-switch> </mk-switch>
<details v-if="debug"> <details v-if="debug">
@@ -214,7 +204,7 @@ import XApi from './settings.api.vue';
import XApps from './settings.apps.vue'; import XApps from './settings.apps.vue';
import XSignins from './settings.signins.vue'; import XSignins from './settings.signins.vue';
import XDrive from './settings.drive.vue'; import XDrive from './settings.drive.vue';
import { url, docsUrl, license, lang, version } from '../../../config'; import { url, docsUrl, license, lang, langs, version } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update'; import checkForUpdate from '../../../common/scripts/check-for-update';
import MkTaskManager from './taskmanager.vue'; import MkTaskManager from './taskmanager.vue';
@@ -235,55 +225,60 @@ export default Vue.extend({
meta: null, meta: null,
license, license,
version, version,
langs,
latestVersion: undefined, latestVersion: undefined,
checkingForUpdate: false, checkingForUpdate: false,
darkmode: localStorage.getItem('darkmode') == 'true', darkmode: localStorage.getItem('darkmode') == 'true'
enableSounds: localStorage.getItem('enableSounds') == 'true',
autoPopout: localStorage.getItem('autoPopout') == 'true',
apiViaStream: localStorage.getItem('apiViaStream') ? localStorage.getItem('apiViaStream') == 'true' : true,
soundVolume: localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) : 50,
lang: localStorage.getItem('lang') || '',
preventUpdate: localStorage.getItem('preventUpdate') == 'true',
debug: localStorage.getItem('debug') == 'true',
useRawScript: localStorage.getItem('useRawScript') == 'true',
enableExperimental: localStorage.getItem('enableExperimental') == 'true'
}; };
}, },
computed: { computed: {
licenseUrl(): string { licenseUrl(): string {
return `${docsUrl}/${lang}/license`; return `${docsUrl}/${lang}/license`;
},
apiViaStream: {
get() { return this.$store.state.device.apiViaStream; },
set(value) { this.$store.commit('device/set', { key: 'apiViaStream', value }); }
},
autoPopout: {
get() { return this.$store.state.device.autoPopout; },
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
},
enableSounds: {
get() { return this.$store.state.device.enableSounds; },
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
},
soundVolume: {
get() { return this.$store.state.device.soundVolume; },
set(value) { this.$store.commit('device/set', { key: 'soundVolume', value }); }
},
lang: {
get() { return this.$store.state.device.lang; },
set(value) { this.$store.commit('device/set', { key: 'lang', value }); }
},
preventUpdate: {
get() { return this.$store.state.device.preventUpdate; },
set(value) { this.$store.commit('device/set', { key: 'preventUpdate', value }); }
},
debug: {
get() { return this.$store.state.device.debug; },
set(value) { this.$store.commit('device/set', { key: 'debug', value }); }
},
enableExperimentalFeatures: {
get() { return this.$store.state.device.enableExperimentalFeatures; },
set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); }
} }
}, },
watch: { watch: {
autoPopout() {
localStorage.setItem('autoPopout', this.autoPopout ? 'true' : 'false');
},
apiViaStream() {
localStorage.setItem('apiViaStream', this.apiViaStream ? 'true' : 'false');
},
darkmode() { darkmode() {
(this as any)._updateDarkmode_(this.darkmode); (this as any)._updateDarkmode_(this.darkmode);
},
enableSounds() {
localStorage.setItem('enableSounds', this.enableSounds ? 'true' : 'false');
},
soundVolume() {
localStorage.setItem('soundVolume', this.soundVolume.toString());
},
lang() {
localStorage.setItem('lang', this.lang);
},
preventUpdate() {
localStorage.setItem('preventUpdate', this.preventUpdate ? 'true' : 'false');
},
debug() {
localStorage.setItem('debug', this.debug ? 'true' : 'false');
},
useRawScript() {
localStorage.setItem('useRawScript', this.useRawScript ? 'true' : 'false');
},
enableExperimental() {
localStorage.setItem('enableExperimental', this.enableExperimental ? 'true' : 'false');
} }
}, },
created() { created() {
@@ -371,13 +366,13 @@ export default Vue.extend({
this.latestVersion = newer; this.latestVersion = newer;
if (newer == null) { if (newer == null) {
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%i18n:!@no-updates%', title: '%i18n:@no-updates%',
text: '%i18n:!@no-updates-desc%' text: '%i18n:@no-updates-desc%'
}); });
} else { } else {
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%i18n:!@update-available%', title: '%i18n:@update-available%',
text: '%i18n:!@update-available-desc%' text: '%i18n:@update-available-desc%'
}); });
} }
}); });
@@ -385,13 +380,13 @@ export default Vue.extend({
clean() { clean() {
localStorage.clear(); localStorage.clear();
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%i18n:!@cache-cleared%', title: '%i18n:@cache-cleared%',
text: '%i18n:!@caache-cleared-desc%' text: '%i18n:@caache-cleared-desc%'
}); });
}, },
soundTest() { soundTest() {
const sound = new Audio(`${url}/assets/message.mp3`); const sound = new Audio(`${url}/assets/message.mp3`);
sound.volume = localStorage.getItem('soundVolume') ? parseInt(localStorage.getItem('soundVolume'), 10) / 100 : 0.5; sound.volume = this.$store.state.device.soundVolume;
sound.play(); sound.play();
} }
} }
@@ -95,7 +95,7 @@ export default Vue.extend({
}, },
created() { created() {
if (localStorage.getItem('autoPopout') == 'true' && this.popoutUrl) { if (this.$store.state.device.autoPopout && this.popoutUrl) {
this.popout(); this.popout();
this.preventMount = true; this.preventMount = true;
} else { } else {
@@ -29,7 +29,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
document.title = '%i18n:!@title%'; document.title = '%i18n:@title%';
}, },
methods: { methods: {
onSelected(file) { onSelected(file) {
+93 -190
View File
@@ -1,23 +1,16 @@
<template> <template>
<div class="mk-welcome"> <div class="mk-welcome">
<button @click="dark">
<template v-if="_darkmode_">%fa:moon%</template>
<template v-else>%fa:R moon%</template>
</button>
<main> <main>
<div class="top"> <img :src="_darkmode_ ? 'assets/title-dark.svg' : 'assets/title.svg'" alt="Misskey">
<div> <p><button class="signup" @click="signup">%i18n:@signup-button%</button><button class="signin" @click="signin">%i18n:@signin-button%</button></p>
<div>
<h1>Share<br><span ref="share">Everything!</span><span class="cursor">_</span></h1> <div class="tl">
<p>ようこそ <b>Misskey</b>はTwitter風ミニブログSNSです思ったことや皆と共有したいことを投稿しましょうタイムラインを見れば皆の関心事をすぐにチェックすることもできます<a :href="aboutUrl">詳しく...</a></p> <header>%fa:comments R% %i18n:@timeline%<div><span></span><span></span><span></span></div></header>
<p><button class="signup" @click="signup">はじめる</button><button class="signin" @click="signin">ログイン</button></p> <mk-welcome-timeline/>
<div class="users">
<mk-avatar class="avatar" v-for="user in users" :key="user.id" :user="user"/>
</div>
</div>
<div>
<div>
<header>%fa:comments R% タイムライン<div><span></span><span></span><span></span></div></header>
<mk-welcome-timeline/>
</div>
</div>
</div>
</div> </div>
</main> </main>
<mk-forkit/> <mk-forkit/>
@@ -28,11 +21,11 @@
</div> </div>
</footer> </footer>
<modal name="signup" width="500px" height="auto" scrollable> <modal name="signup" width="500px" height="auto" scrollable>
<header :class="$style.signupFormHeader">新規登録</header> <header :class="$style.signupFormHeader">%i18n:@signup%</header>
<mk-signup :class="$style.signupForm"/> <mk-signup :class="$style.signupForm"/>
</modal> </modal>
<modal name="signin" width="500px" height="auto" scrollable> <modal name="signin" width="500px" height="auto" scrollable>
<header :class="$style.signinFormHeader">ログイン</header> <header :class="$style.signinFormHeader">%i18n:@signin%</header>
<mk-signin :class="$style.signinForm"/> <mk-signin :class="$style.signinForm"/>
</modal> </modal>
</div> </div>
@@ -42,64 +35,22 @@
import Vue from 'vue'; import Vue from 'vue';
import { docsUrl, copyright, lang } from '../../../config'; import { docsUrl, copyright, lang } from '../../../config';
const shares = [
'Everything!',
'Webpages',
'Photos',
'Interests',
'Favorites'
];
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
aboutUrl: `${docsUrl}/${lang}/about`, aboutUrl: `${docsUrl}/${lang}/about`,
copyright, copyright
users: [],
clock: null,
i: 0
}; };
}, },
mounted() {
(this as any).api('users', {
sort: '+follower',
limit: 20
}).then(users => {
this.users = users;
});
this.clock = setInterval(() => {
if (++this.i == shares.length) this.i = 0;
const speed = 70;
const text = (this.$refs.share as any).innerText;
for (let i = 0; i < text.length; i++) {
setTimeout(() => {
if (this.$refs.share) {
(this.$refs.share as any).innerText = text.substr(0, text.length - i);
}
}, i * speed)
}
setTimeout(() => {
const newText = shares[this.i];
for (let i = 0; i <= newText.length; i++) {
setTimeout(() => {
if (this.$refs.share) {
(this.$refs.share as any).innerText = newText.substr(0, i);
}
}, i * speed)
}
}, text.length * speed);
}, 4000);
},
beforeDestroy() {
clearInterval(this.clock);
},
methods: { methods: {
signup() { signup() {
this.$modal.show('signup'); this.$modal.show('signup');
}, },
signin() { signin() {
this.$modal.show('signin'); this.$modal.show('signin');
},
dark() {
(this as any)._updateDarkmode_(!(this as any)._darkmode_);
} }
} }
}); });
@@ -115,161 +66,107 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
@import '~const.styl' @import '~const.styl'
@import url('https://fonts.googleapis.com/css?family=Sarpanch:700') root(isDark)
.mk-welcome
display flex display flex
flex-direction column flex-direction column
flex 1 flex 1
$width = 1000px
background linear-gradient(to bottom, #1e1d65, #bd6659) > button
//background-image url('/assets/welcome-bg.svg') position absolute
background-size cover z-index 1
background-position top center top 0
&:before
content ""
display block
position fixed
bottom 0
left 0 left 0
width 100% padding 16px
height 100% font-size 18px
background-image url('/assets/welcome-fg.svg') color isDark ? #fff : #555
background-size cover
background-position bottom center
> main > main
display flex
flex 1 flex 1
padding 64px 0 0 0
text-align center
color isDark ? #9aa4b3 : #555
> .top > img
display flex width 350px
width 100%
> div > p
display flex margin 8px 0
max-width $width + 64px line-height 2em
margin 0 auto
padding 80px 32px 0 32px
> * button
margin-bottom 48px padding 8px 16px
font-size inherit
> div:first-child .signup
margin-right 48px color $theme-color
color #fff border solid 2px $theme-color
text-shadow 0 0 12px #172062 border-radius 4px
> h1 &:focus
margin 0 box-shadow 0 0 0 3px rgba($theme-color, 0.2)
font-weight bold
//font-variant small-caps
letter-spacing 12px
font-family 'Sarpanch', sans-serif
font-size 42px
line-height 48px
> .cursor &:hover
animation cursor 1s infinite linear both color $theme-color-foreground
background $theme-color
@keyframes cursor &:active
0% color $theme-color-foreground
opacity 1 background darken($theme-color, 10%)
50% border-color darken($theme-color, 10%)
opacity 0
> p .signin
margin 1em 0 &:hover
line-height 2em color isDark ? #fff : #000
button > .tl
padding 8px 16px margin 32px auto 0 auto
font-size inherit width 410px
text-align left
background isDark ? #313543 : #fff
border-radius 8px
box-shadow 0 8px 32px rgba(#000, 0.15)
overflow hidden
.signup > header
color $theme-color z-index 1
border solid 2px $theme-color padding 12px 16px
border-radius 4px color isDark ? #e3e5e8 : #888d94
box-shadow 0 1px 0px rgba(#000, 0.1)
&:focus > div
box-shadow 0 0 0 3px rgba($theme-color, 0.2) position absolute
top 0
right 0
padding inherit
&:hover > span
color $theme-color-foreground display inline-block
background $theme-color height 11px
width 11px
margin-left 6px
border-radius 100%
vertical-align middle
&:active &:nth-child(1)
color $theme-color-foreground background #5BCC8B
background darken($theme-color, 10%)
border-color darken($theme-color, 10%)
.signin &:nth-child(2)
&:hover background #E6BB46
color #fff
> .users &:nth-child(3)
margin 16px 0 0 0 background #DF7065
> * > .mk-welcome-timeline
display inline-block max-height 350px
margin 4px overflow auto
width 38px
height 38px
border-radius 6px
> div:last-child
> div
width 410px
background #fff
border-radius 8px
box-shadow 0 0 0 12px rgba(#000, 0.1)
overflow hidden
> header
z-index 1
padding 12px 16px
color #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
background #ccc
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
color #949ea5 color isDark ? #949ea5 : #737c82
> div > div
max-width $width
margin 0 auto margin 0 auto
padding 0 0 42px 0 padding 64px
text-align center text-align center
> .c > .c
@@ -277,6 +174,12 @@ export default Vue.extend({
font-size 10px font-size 10px
opacity 0.7 opacity 0.7
.mk-welcome[data-darkmode]
root(true)
.mk-welcome:not([data-darkmode])
root(false)
</style> </style>
<style lang="stylus" module> <style lang="stylus" module>
+3 -3
View File
@@ -113,7 +113,7 @@ html.setAttribute('lang', lang);
const head = document.getElementsByTagName('head')[0]; const head = document.getElementsByTagName('head')[0];
const meta = document.createElement('meta'); const meta = document.createElement('meta');
meta.setAttribute('name', 'description'); meta.setAttribute('name', 'description');
meta.setAttribute('content', '%i18n:!common.misskey%'); meta.setAttribute('content', '%i18n:common.misskey%');
head.appendChild(meta); head.appendChild(meta);
//#endregion //#endregion
@@ -147,7 +147,7 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
os, os,
api: os.api, api: os.api,
apis: os.apis, apis: os.apis,
clientSettings: os.store.state.settings.data clientSettings: os.store.state.settings
}; };
} }
}); });
@@ -173,7 +173,7 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
} }
//#region 更新チェック //#region 更新チェック
const preventUpdate = localStorage.getItem('preventUpdate') == 'true'; const preventUpdate = os.store.state.device.preventUpdate;
if (!preventUpdate) { if (!preventUpdate) {
setTimeout(() => { setTimeout(() => {
checkForUpdate(os); checkForUpdate(os);
+3 -15
View File
@@ -98,14 +98,7 @@ export default class MiOS extends EventEmitter {
* Whether is debug mode * Whether is debug mode
*/ */
public get debug() { public get debug() {
return localStorage.getItem('debug') == 'true'; return this.store ? this.store.state.device.debug : false;
}
/**
* Whether enable sounds
*/
public get isEnableSounds() {
return localStorage.getItem('enableSounds') == 'true';
} }
public store: ReturnType<typeof initStore>; public store: ReturnType<typeof initStore>;
@@ -435,12 +428,8 @@ export default class MiOS extends EventEmitter {
}); });
}); });
// Whether use raw version script
const raw = (localStorage.getItem('useRawScript') == 'true' && this.debug)
|| process.env.NODE_ENV != 'production';
// The path of service worker script // The path of service worker script
const sw = `/sw.${version}.${lang}.${raw ? 'raw' : 'min'}.js`; const sw = `/sw.${version}.${lang}.js`;
// Register service worker // Register service worker
navigator.serviceWorker.register(sw).then(registration => { navigator.serviceWorker.register(sw).then(registration => {
@@ -471,8 +460,7 @@ export default class MiOS extends EventEmitter {
}; };
const promise = new Promise((resolve, reject) => { const promise = new Promise((resolve, reject) => {
const viaStream = this.stream && this.stream.hasConnection && const viaStream = this.stream && this.stream.hasConnection && this.store.state.device.apiViaStream;
(localStorage.getItem('apiViaStream') ? localStorage.getItem('apiViaStream') == 'true' : true);
if (viaStream) { if (viaStream) {
const stream = this.stream.borrow(); const stream = this.stream.borrow();
+3 -2
View File
@@ -5,7 +5,7 @@
import Vue from 'vue'; import Vue from 'vue';
import VueRouter from 'vue-router'; import VueRouter from 'vue-router';
import { MdCard, MdButton, MdField, MdMenu, MdList, MdSwitch, MdSubheader, MdDialog, MdDialogAlert } from 'vue-material/dist/components'; import { MdCard, MdButton, MdField, MdMenu, MdList, MdSwitch, MdSubheader, MdDialog, MdDialogAlert, MdRadio } from 'vue-material/dist/components';
import 'vue-material/dist/vue-material.min.css'; import 'vue-material/dist/vue-material.min.css';
import 'vue-material/dist/theme/default.css'; import 'vue-material/dist/theme/default.css';
@@ -48,6 +48,7 @@ Vue.use(MdSwitch);
Vue.use(MdSubheader); Vue.use(MdSubheader);
Vue.use(MdDialog); Vue.use(MdDialog);
Vue.use(MdDialogAlert); Vue.use(MdDialogAlert);
Vue.use(MdRadio);
/** /**
* init * init
@@ -69,7 +70,7 @@ init((launch) => {
routes: [ routes: [
{ path: '/', name: 'index', component: MkIndex }, { path: '/', name: 'index', component: MkIndex },
{ path: '/signup', name: 'signup', component: MkSignup }, { path: '/signup', name: 'signup', component: MkSignup },
{ path: '/i/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/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 },
@@ -32,7 +32,7 @@
<div class="files" v-if="files.length > 0"> <div class="files" v-if="files.length > 0">
<x-file v-for="file in files" :key="file.id" :file="file"/> <x-file v-for="file in files" :key="file.id" :file="file"/>
<button class="more" v-if="moreFiles" @click="fetchMoreFiles"> <button class="more" v-if="moreFiles" @click="fetchMoreFiles">
{{ fetchingMoreFiles ? '%i18n:!common.loading%' : '%i18n:!@load-more%' }} {{ fetchingMoreFiles ? '%i18n:common.loading%' : '%i18n:@load-more%' }}
</button> </button>
</div> </div>
<div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching"> <div class="empty" v-if="files.length == 0 && folders.length == 0 && !fetching">
@@ -7,7 +7,7 @@
<template v-if="!wait && user.isFollowing">%fa:minus%</template> <template v-if="!wait && user.isFollowing">%fa:minus%</template>
<template v-if="!wait && !user.isFollowing">%fa:plus%</template> <template v-if="!wait && !user.isFollowing">%fa:plus%</template>
<template v-if="wait">%fa:spinner .pulse .fw%</template> <template v-if="wait">%fa:spinner .pulse .fw%</template>
{{ user.isFollowing ? '%i18n:!@unfollow%' : '%i18n:!@follow%' }} {{ user.isFollowing ? '%i18n:@unfollow%' : '%i18n:@follow%' }}
</button> </button>
</template> </template>
@@ -16,10 +16,13 @@ export default Vue.extend({
} }
}, },
computed: { computed: {
lightmode(): boolean {
return this.$store.state.device.lightmode;
},
style(): any { style(): any {
return { return {
'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent', 'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)` 'background-image': this.lightmode ? null : this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)`
}; };
} }
} }
@@ -1,9 +1,13 @@
<template> <template>
<div class="sub"> <div class="sub" :class="{ smart: $store.state.device.postStyle == 'smart' }">
<mk-avatar class="avatar" :user="note.user"/> <mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
<div class="main"> <div class="main">
<header> <header>
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span>
<span class="username"><mk-acct :user="note.user"/></span> <span class="username"><mk-acct :user="note.user"/></span>
<div class="info"> <div class="info">
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
@@ -42,6 +46,13 @@ root(isDark)
@media (min-width 600px) @media (min-width 600px)
padding 24px 32px padding 24px 32px
&.smart
> .main
width 100%
> header
align-items center
&:after &:after
content "" content ""
display block display block
@@ -73,6 +84,13 @@ root(isDark)
margin-bottom 2px margin-bottom 2px
white-space nowrap white-space nowrap
> .avatar
flex-shrink 0
margin-right 8px
width 18px
height 18px
border-radius 100%
> .name > .name
display block display block
margin 0 0.5em 0 0 margin 0 0.5em 0 0
@@ -88,6 +106,20 @@ root(isDark)
&:hover &:hover
text-decoration underline text-decoration underline
> .is-admin
> .is-bot
> .is-cat
margin 0 0.5em 0 0
padding 1px 5px
font-size 10px
color isDark ? #758188 : #aaa
border solid 1px isDark ? #57616f : #ddd
border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username > .username
text-align left text-align left
margin 0 margin 0
@@ -1,22 +1,25 @@
<template> <template>
<div class="note" :class="{ renote: isRenote }"> <div class="note" :class="{ renote: isRenote, smart: $store.state.device.postStyle == 'smart' }">
<div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)"> <div class="reply-to" v-if="p.reply && (!os.isSignedIn || clientSettings.showReplyTarget)">
<x-sub :note="p.reply"/> <x-sub :note="p.reply"/>
</div> </div>
<div class="renote" v-if="isRenote"> <div class="renote" v-if="isRenote">
<mk-avatar class="avatar" :user="note.user"/> <mk-avatar class="avatar" :user="note.user"/>
%fa:retweet% %fa:retweet%
<span>{{ '%i18n:!@reposted-by%'.substr(0, '%i18n:!@reposted-by%'.indexOf('{')) }}</span> <span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
<router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage">{{ note.user | userName }}</router-link>
<span>{{ '%i18n:!@reposted-by%'.substr('%i18n:!@reposted-by%'.indexOf('}') + 1) }}</span> <span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
<mk-time :time="note.createdAt"/> <mk-time :time="note.createdAt"/>
</div> </div>
<article> <article>
<mk-avatar class="avatar" :user="p.user"/> <mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle != 'smart'"/>
<div class="main"> <div class="main">
<header> <header>
<mk-avatar class="avatar" :user="p.user" v-if="$store.state.device.postStyle == 'smart'"/>
<router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link> <router-link class="name" :to="p.user | userPage">{{ p.user | userName }}</router-link>
<span class="is-bot" v-if="p.user.host === null && p.user.isBot">bot</span> <span class="is-admin" v-if="p.user.isAdmin">admin</span>
<span class="is-bot" v-if="p.user.isBot">bot</span>
<span class="is-cat" v-if="p.user.isCat">cat</span>
<span class="username"><mk-acct :user="p.user"/></span> <span class="username"><mk-acct :user="p.user"/></span>
<div class="info"> <div class="info">
<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span> <span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
@@ -262,6 +265,15 @@ root(isDark)
@media (min-width 500px) @media (min-width 500px)
font-size 16px font-size 16px
&.smart
> article
> .main
width 100%
> header
align-items center
margin-bottom 4px
> .renote > .renote
display flex display flex
align-items center align-items center
@@ -278,12 +290,17 @@ root(isDark)
padding 16px 32px padding 16px 32px
.avatar .avatar
flex-shrink 0
display inline-block display inline-block
width 28px width 20px
height 28px height 20px
margin 0 8px 0 0 margin 0 8px 0 0
border-radius 6px border-radius 6px
@media (min-width 500px)
width 28px
height 28px
[data-fa] [data-fa]
margin-right 4px margin-right 4px
@@ -352,13 +369,19 @@ root(isDark)
@media (min-width 500px) @media (min-width 500px)
margin-bottom 2px margin-bottom 2px
> .avatar
flex-shrink 0
margin-right 8px
width 20px
height 20px
border-radius 100%
> .name > .name
display block display block
margin 0 0.5em 0 0 margin 0 0.5em 0 0
padding 0 padding 0
overflow hidden overflow hidden
color isDark ? #fff : #627079 color isDark ? #fff : #627079
font-size 1em
font-weight bold font-weight bold
text-decoration none text-decoration none
text-overflow ellipsis text-overflow ellipsis
@@ -366,7 +389,9 @@ root(isDark)
&:hover &:hover
text-decoration underline text-decoration underline
> .is-admin
> .is-bot > .is-bot
> .is-cat
margin 0 0.5em 0 0 margin 0 0.5em 0 0
padding 1px 6px padding 1px 6px
font-size 12px font-size 12px
@@ -374,6 +399,10 @@ root(isDark)
border solid 1px isDark ? #57616f : #ddd border solid 1px isDark ? #57616f : #ddd
border-radius 3px border-radius 3px
&.is-admin
border-color isDark ? #d42c41 : #f56a7b
color isDark ? #d42c41 : #f56a7b
> .username > .username
margin 0 0.5em 0 0 margin 0 0.5em 0 0
overflow hidden overflow hidden
@@ -12,7 +12,7 @@
<button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications"> <button class="more" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template> <template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>
{{ fetchingMoreNotifications ? '%i18n:!common.loading%' : '%i18n:!@more%' }} {{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
</button> </button>
<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p> <p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>
@@ -20,7 +20,7 @@
<a @click="addVisibleUser">+ユーザーを追加</a> <a @click="addVisibleUser">+ユーザーを追加</a>
</div> </div>
<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)"> <input v-show="useCw" v-model="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="reply ? '%i18n:@reply-placeholder%' : renote ? '%i18n:@renote-placeholder%' : '%i18n:@note-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">
@@ -28,7 +28,7 @@
<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>
<ul> <ul>
<li><router-link to="/i/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="_darkmode_">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li> <li @click="dark"><p><template v-if="_darkmode_">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li>
</ul> </ul>
</div> </div>
@@ -94,7 +94,7 @@ export default Vue.extend({
}, },
methods: { methods: {
search() { search() {
const query = window.prompt('%i18n:!@search%'); const query = window.prompt('%i18n:@search%');
if (query == null || query == '') return; if (query == null || query == '') return;
this.$router.push('/search?q=' + encodeURIComponent(query)); this.$router.push('/search?q=' + encodeURIComponent(query));
}, },
@@ -3,7 +3,7 @@
<mk-notes ref="timeline" :more="existMore ? more : null"> <mk-notes ref="timeline" :more="existMore ? more : null">
<div slot="empty"> <div slot="empty">
%fa:R comments% %fa:R comments%
{{ withMedia ? '%i18n:!@no-notes-with-media%' : '%i18n:!@no-notes%' }} {{ withMedia ? '%i18n:@no-notes-with-media%' : '%i18n:@no-notes%' }}
</div> </div>
</mk-notes> </mk-notes>
</div> </div>
@@ -2,7 +2,7 @@
<mk-ui> <mk-ui>
<template slot="header" v-if="!fetching"> <template slot="header" v-if="!fetching">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""> <img :src="`${user.avatarUrl}?thumbnail&size=64`" alt="">
{{ '%i18n:!@followers-of%'.replace('{}', name) }} {{ '%i18n:@followers-of%'.replace('{}', name) }}
</template> </template>
<mk-users-list <mk-users-list
v-if="!fetching" v-if="!fetching"
@@ -49,7 +49,7 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
document.title = '%i18n:!@followers-of%'.replace('{}', this.name) + ' | Misskey'; document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | Misskey';
}); });
}, },
onLoaded() { onLoaded() {
@@ -2,7 +2,7 @@
<mk-ui> <mk-ui>
<template slot="header" v-if="!fetching"> <template slot="header" v-if="!fetching">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""> <img :src="`${user.avatarUrl}?thumbnail&size=64`" alt="">
{{ '%i18n:!@following-of%'.replace('{}', name) }} {{ '%i18n:@following-of%'.replace('{}', name) }}
</template> </template>
<mk-users-list <mk-users-list
v-if="!fetching" v-if="!fetching"
@@ -48,7 +48,7 @@ export default Vue.extend({
this.user = user; this.user = user;
this.fetching = false; this.fetching = false;
document.title = '%i18n:!@followers-of%'.replace('{}', this.name) + ' | Misskey'; document.title = '%i18n:@followers-of%'.replace('{}', this.name) + ' | Misskey';
}); });
}, },
onLoaded() { onLoaded() {
@@ -21,7 +21,7 @@ export default Vue.extend({
}, },
methods: { methods: {
fn() { fn() {
const ok = window.confirm('%i18n:!@read-all%'); const ok = window.confirm('%i18n:@read-all%');
if (!ok) return; if (!ok) return;
(this as any).api('notifications/markAsRead_all'); (this as any).api('notifications/markAsRead_all');
+1 -1
View File
@@ -3,7 +3,7 @@
<span slot="header">%fa:search% {{ q }}</span> <span slot="header">%fa:search% {{ q }}</span>
<main v-if="!fetching"> <main v-if="!fetching">
<mk-notes :class="$style.notes" :notes="notes"> <mk-notes :class="$style.notes" :notes="notes">
<span v-if="notes.length == 0">{{ '%i18n:!@empty%'.replace('{}', q) }}</span> <span v-if="notes.length == 0">{{ '%i18n:@empty%'.replace('{}', q) }}</span>
<button v-if="existMore" @click="more" :disabled="fetching" slot="tail"> <button v-if="existMore" @click="more" :disabled="fetching" slot="tail">
<span v-if="!fetching">%i18n:@load-more%</span> <span v-if="!fetching">%i18n:@load-more%</span>
<span v-if="fetching">%i18n:common.loading%<mk-ellipsis/></span> <span v-if="fetching">%i18n:common.loading%<mk-ellipsis/></span>
@@ -25,7 +25,7 @@ export default Vue.extend({
} }
}, },
mounted() { mounted() {
document.title = '%i18n:!@title%'; document.title = '%i18n:@title%';
}, },
methods: { methods: {
onSelected(file) { onSelected(file) {
+36 -17
View File
@@ -2,7 +2,7 @@
<mk-ui> <mk-ui>
<span slot="header">%fa:cog%%i18n:@settings%</span> <span slot="header">%fa:cog%%i18n:@settings%</span>
<main> <main>
<p v-html="'%i18n:!@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p> <p v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + name + '</b>')"></p>
<div> <div>
<x-profile/> <x-profile/>
@@ -35,6 +35,13 @@
<md-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch> <md-switch v-model="clientSettings.showRenotedMyNotes" @change="onChangeShowRenotedMyNotes">%i18n:@show-renoted-my-notes%</md-switch>
</div> </div>
</div> </div>
<div>
<div class="md-body-2">%i18n:@post-style%</div>
<md-radio v-model="postStyle" value="standard">%i18n:@post-style-standard%</md-radio>
<md-radio v-model="postStyle" value="smart">%i18n:@post-style-smart%</md-radio>
</div>
</md-card-content> </md-card-content>
</md-card> </md-card>
@@ -51,6 +58,10 @@
<div> <div>
<md-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch> <md-switch v-model="clientSettings.disableViaMobile" @change="onChangeDisableViaMobile">%i18n:@disable-via-mobile%</md-switch>
</div> </div>
<div>
<md-switch v-model="lightmode">%i18n:@i-am-under-limited-internet%</md-switch>
</div>
</md-card-content> </md-card-content>
</md-card> </md-card>
@@ -67,11 +78,7 @@
</md-optgroup> </md-optgroup>
<md-optgroup label="%i18n:@specify-language%"> <md-optgroup label="%i18n:@specify-language%">
<md-option value="ja">日本語</md-option> <md-option v-for="x in langs" :value="x[0]" :key="x[0]">{{ x[1] }}</md-option>
<md-option value="en">English</md-option>
<md-option value="fr">Français</md-option>
<md-option value="pl">Polski</md-option>
<md-option value="de">Deutsch</md-option>
</md-optgroup> </md-optgroup>
</md-select> </md-select>
</md-field> </md-field>
@@ -87,7 +94,7 @@
<md-card-content> <md-card-content>
<p class="account" v-if="os.i.twitter"><a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p> <p class="account" v-if="os.i.twitter"><a :href="`https://twitter.com/${os.i.twitter.screenName}`" target="_blank">@{{ os.i.twitter.screenName }}</a></p>
<p> <p>
<a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:!@twitter-reconnect%' : '%i18n:!@twitter-connect%' }}</a> <a :href="`${apiUrl}/connect/twitter`" target="_blank">{{ os.i.twitter ? '%i18n:@twitter-reconnect%' : '%i18n:@twitter-connect%' }}</a>
<span v-if="os.i.twitter"> or </span> <span v-if="os.i.twitter"> or </span>
<a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter">%i18n:@twitter-disconnect%</a> <a :href="`${apiUrl}/disconnect/twitter`" target="_blank" v-if="os.i.twitter">%i18n:@twitter-disconnect%</a>
</p> </p>
@@ -118,7 +125,7 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { apiUrl, version, codename } from '../../../config'; import { apiUrl, version, codename, langs } from '../../../config';
import checkForUpdate from '../../../common/scripts/check-for-update'; import checkForUpdate from '../../../common/scripts/check-for-update';
import XProfile from './settings/settings.profile.vue'; import XProfile from './settings/settings.profile.vue';
@@ -133,8 +140,8 @@ export default Vue.extend({
apiUrl, apiUrl,
version, version,
codename, codename,
langs,
darkmode: localStorage.getItem('darkmode') == 'true', darkmode: localStorage.getItem('darkmode') == 'true',
lang: localStorage.getItem('lang') || '',
latestVersion: undefined, latestVersion: undefined,
checkingForUpdate: false checkingForUpdate: false
}; };
@@ -143,15 +150,27 @@ export default Vue.extend({
computed: { computed: {
name(): string { name(): string {
return Vue.filter('userName')((this as any).os.i); return Vue.filter('userName')((this as any).os.i);
} },
postStyle: {
get() { return this.$store.state.device.postStyle; },
set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); }
},
lightmode: {
get() { return this.$store.state.device.lightmode; },
set(value) { this.$store.commit('device/set', { key: 'lightmode', value }); }
},
lang: {
get() { return this.$store.state.device.lang; },
set(value) { this.$store.commit('device/set', { key: 'lang', value }); }
},
}, },
watch: { watch: {
darkmode() { darkmode() {
(this as any)._updateDarkmode_(this.darkmode); (this as any)._updateDarkmode_(this.darkmode);
},
lang() {
localStorage.setItem('lang', this.lang);
} }
}, },
@@ -213,13 +232,13 @@ export default Vue.extend({
this.latestVersion = newer; this.latestVersion = newer;
if (newer == null) { if (newer == null) {
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%i18n:!@no-updates%', title: '%i18n:@no-updates%',
text: '%i18n:!@no-updates-desc%' text: '%i18n:@no-updates-desc%'
}); });
} else { } else {
(this as any).apis.dialog({ (this as any).apis.dialog({
title: '%i18n:!@update-available%', title: '%i18n:@update-available%',
text: '%i18n:!@update-available-desc%' text: '%i18n:@update-available-desc%'
}); });
} }
}); });
@@ -7,7 +7,14 @@
<md-card-content> <md-card-content>
<md-field> <md-field>
<label>%i18n:@name%</label> <label>%i18n:@name%</label>
<md-input v-model="name" :disabled="saving"/> <md-input v-model="name" :disabled="saving" md-counter="30"/>
</md-field>
<md-field>
<label>%i18n:@account%</label>
<span class="md-prefix">@</span>
<md-input v-model="username" readonly></md-input>
<span class="md-suffix">@{{ host }}</span>
</md-field> </md-field>
<md-field> <md-field>
@@ -24,7 +31,7 @@
<md-field> <md-field>
<label>%i18n:@description%</label> <label>%i18n:@description%</label>
<md-textarea v-model="description" :disabled="saving"/> <md-textarea v-model="description" :disabled="saving" md-counter="500"/>
</md-field> </md-field>
<md-field> <md-field>
@@ -42,7 +49,7 @@
md-content="%18n:!@uploading%"/> md-content="%18n:!@uploading%"/>
<div> <div>
<md-switch v-model="os.i.isBot" @change="onChangeIsBot">%i18n:@is-bot%</md-switch> <md-switch v-model="isCat">%i18n:@is-cat%</md-switch>
</div> </div>
</md-card-content> </md-card-content>
@@ -54,17 +61,21 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import { apiUrl } from '../../../../config'; import { apiUrl, host } from '../../../../config';
export default Vue.extend({ export default Vue.extend({
data() { data() {
return { return {
host,
name: null, name: null,
username: null,
location: null, location: null,
description: null, description: null,
birthday: null, birthday: null,
avatarId: null, avatarId: null,
bannerId: null, bannerId: null,
isBot: false,
isCat: false,
saving: false, saving: false,
uploading: false uploading: false
}; };
@@ -72,20 +83,17 @@ export default Vue.extend({
created() { created() {
this.name = (this as any).os.i.name || ''; this.name = (this as any).os.i.name || '';
this.username = (this as any).os.i.username;
this.location = (this as any).os.i.profile.location; this.location = (this as any).os.i.profile.location;
this.description = (this as any).os.i.description; this.description = (this as any).os.i.description;
this.birthday = (this as any).os.i.profile.birthday; this.birthday = (this as any).os.i.profile.birthday;
this.avatarId = (this as any).os.i.avatarId; this.avatarId = (this as any).os.i.avatarId;
this.bannerId = (this as any).os.i.bannerId; this.bannerId = (this as any).os.i.bannerId;
this.isBot = (this as any).os.i.isBot;
this.isCat = (this as any).os.i.isCat;
}, },
methods: { methods: {
onChangeIsBot() {
(this as any).api('i/update', {
isBot: (this as any).os.i.isBot
});
},
onAvatarChange([file]) { onAvatarChange([file]) {
this.uploading = true; this.uploading = true;
@@ -139,7 +147,9 @@ export default Vue.extend({
description: this.description || null, description: this.description || null,
birthday: this.birthday || null, birthday: this.birthday || null,
avatarId: this.avatarId, avatarId: this.avatarId,
bannerId: this.bannerId bannerId: this.bannerId,
isBot: this.isBot,
isCat: this.isCat
}).then(i => { }).then(i => {
this.saving = false; this.saving = false;
(this as any).os.i.avatarId = i.avatarId; (this as any).os.i.avatarId = i.avatarId;
@@ -147,7 +157,7 @@ export default Vue.extend({
(this as any).os.i.bannerId = i.bannerId; (this as any).os.i.bannerId = i.bannerId;
(this as any).os.i.bannerUrl = i.bannerUrl; (this as any).os.i.bannerUrl = i.bannerUrl;
alert('%i18n:!@saved%'); alert('%i18n:@saved%');
}); });
} }
} }
@@ -65,7 +65,7 @@ export default Vue.extend({
computed: { computed: {
widgets(): any[] { widgets(): any[] {
return this.$store.state.settings.data.mobileHome; return this.$store.state.settings.mobileHome;
} }
}, },
+3
View File
@@ -1,3 +1,6 @@
input
min-width 0px
input:not([type]) input:not([type])
input[type='text'] input[type='text']
input[type='password'] input[type='password']
+44 -17
View File
@@ -1,4 +1,6 @@
import Vuex from 'vuex'; import Vuex from 'vuex';
import createPersistedState from 'vuex-persistedstate';
import MiOS from './mios'; import MiOS from './mios';
const defaultSettings = { const defaultSettings = {
@@ -14,14 +16,29 @@ const defaultSettings = {
showRenotedMyNotes: true showRenotedMyNotes: true
}; };
const defaultDeviceSettings = {
apiViaStream: true,
autoPopout: false,
enableSounds: true,
soundVolume: 0.5,
lang: null,
preventUpdate: false,
debug: false,
lightmode: false,
postStyle: 'standard'
};
export default (os: MiOS) => new Vuex.Store({ export default (os: MiOS) => new Vuex.Store({
plugins: [store => { plugins: [store => {
store.subscribe((mutation, state) => { store.subscribe((mutation, state) => {
if (mutation.type.startsWith('settings/')) { if (mutation.type.startsWith('settings/')) {
localStorage.setItem('settings', JSON.stringify(state.settings.data)); localStorage.setItem('settings', JSON.stringify(state.settings));
} }
}); });
}], }, createPersistedState({
paths: ['device'],
filter: mut => mut.type.startsWith('device/')
})],
state: { state: {
indicate: false, indicate: false,
@@ -39,50 +56,60 @@ export default (os: MiOS) => new Vuex.Store({
}, },
modules: { modules: {
settings: { device: {
namespaced: true, namespaced: true,
state: { state: defaultDeviceSettings,
data: defaultSettings
},
mutations: { mutations: {
set(state, x: { key: string; value: any }) { set(state, x: { key: string; value: any }) {
state.data[x.key] = x.value; state[x.key] = x.value;
}
}
},
settings: {
namespaced: true,
state: defaultSettings,
mutations: {
set(state, x: { key: string; value: any }) {
state[x.key] = x.value;
}, },
setHome(state, data) { setHome(state, data) {
state.data.home = data; state.home = data;
}, },
setHomeWidget(state, x) { setHomeWidget(state, x) {
const w = state.data.home.find(w => w.id == x.id); const w = state.home.find(w => w.id == x.id);
if (w) { if (w) {
w.data = x.data; w.data = x.data;
} }
}, },
addHomeWidget(state, widget) { addHomeWidget(state, widget) {
state.data.home.unshift(widget); state.home.unshift(widget);
}, },
setMobileHome(state, data) { setMobileHome(state, data) {
state.data.mobileHome = data; state.mobileHome = data;
}, },
setMobileHomeWidget(state, x) { setMobileHomeWidget(state, x) {
const w = state.data.mobileHome.find(w => w.id == x.id); const w = state.mobileHome.find(w => w.id == x.id);
if (w) { if (w) {
w.data = x.data; w.data = x.data;
} }
}, },
addMobileHomeWidget(state, widget) { addMobileHomeWidget(state, widget) {
state.data.mobileHome.unshift(widget); state.mobileHome.unshift(widget);
}, },
removeMobileHomeWidget(state, widget) { removeMobileHomeWidget(state, widget) {
state.data.mobileHome = state.data.mobileHome.filter(w => w.id != widget.id); state.mobileHome = state.mobileHome.filter(w => w.id != widget.id);
} }
}, },
@@ -108,7 +135,7 @@ export default (os: MiOS) => new Vuex.Store({
ctx.commit('addHomeWidget', widget); ctx.commit('addHomeWidget', widget);
os.api('i/update_home', { os.api('i/update_home', {
home: ctx.state.data.home home: ctx.state.home
}); });
}, },
@@ -116,7 +143,7 @@ export default (os: MiOS) => new Vuex.Store({
ctx.commit('addMobileHomeWidget', widget); ctx.commit('addMobileHomeWidget', widget);
os.api('i/update_mobile_home', { os.api('i/update_mobile_home', {
home: ctx.state.data.mobileHome home: ctx.state.mobileHome
}); });
}, },
@@ -124,7 +151,7 @@ export default (os: MiOS) => new Vuex.Store({
ctx.commit('removeMobileHomeWidget', widget); ctx.commit('removeMobileHomeWidget', widget);
os.api('i/update_mobile_home', { os.api('i/update_mobile_home', {
home: ctx.state.data.mobileHome.filter(w => w.id != widget.id) home: ctx.state.mobileHome.filter(w => w.id != widget.id)
}); });
} }
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1021 B

-5
View File
@@ -10,11 +10,6 @@
localStorage.setItem('v', v); localStorage.setItem('v', v);
} }
const lang = window.prompt('Enter language (optional):');
if (lang && lang.length > 0) {
localStorage.setItem('lang', lang);
}
setTimeout(() => { setTimeout(() => {
location.href = '/'; location.href = '/';
}, 500); }, 500);
+8 -3
View File
@@ -194,7 +194,12 @@ cluster.on('exit', worker => {
// Display detail of unhandled promise rejection // Display detail of unhandled promise rejection
process.on('unhandledRejection', console.dir); process.on('unhandledRejection', console.dir);
// Dying away... // Display detail of uncaught exception
process.on('exit', () => { process.on('uncaughtException', err => {
Logger.info('The process is going exit'); console.error(err);
});
// Dying away...
process.on('exit', code => {
Logger.info(`The process is going exit (${code})`);
}); });
+4
View File
@@ -324,6 +324,10 @@ export const pack = async (
// resolve promises in _note object // resolve promises in _note object
_note = await rap(_note); _note = await rap(_note);
if (_note.user.isCat && _note.text) {
_note.text = _note.text.replace(/な/g, 'にゃ').replace(/ナ/g, 'ニャ');
}
if (hide) { if (hide) {
_note.mediaIds = []; _note.mediaIds = [];
_note.text = null; _note.text = null;
+1
View File
@@ -77,6 +77,7 @@ export interface ILocalUser extends IUserBase {
}; };
lastUsedAt: Date; lastUsedAt: Date;
isBot: boolean; isBot: boolean;
isCat: boolean;
isPro: boolean; isPro: boolean;
twoFactorSecret: string; twoFactorSecret: string;
twoFactorEnabled: boolean; twoFactorEnabled: boolean;
@@ -1,6 +1,7 @@
import * as mongo from 'mongodb'; import * as mongo from 'mongodb';
import { default as Notification, INotification } from '../../../models/notification'; import { default as Notification, INotification } from '../../../models/notification';
import publishUserStream from '../../../publishers/stream'; import publishUserStream from '../../../publishers/stream';
import Mute from '../../../models/mute';
/** /**
* Mark as read notification(s) * Mark as read notification(s)
@@ -26,6 +27,11 @@ export default (
? [new mongo.ObjectID(message)] ? [new mongo.ObjectID(message)]
: [(message as INotification)._id]; : [(message as INotification)._id];
const mute = await Mute.find({
muterId: userId
});
const mutedUserIds = mute.map(m => m.muteeId);
// Update documents // Update documents
await Notification.update({ await Notification.update({
_id: { $in: ids }, _id: { $in: ids },
@@ -42,6 +48,9 @@ export default (
const count = await Notification const count = await Notification
.count({ .count({
notifieeId: userId, notifieeId: userId,
notifierId: {
$nin: mutedUserIds
},
isRead: false isRead: false
}, { }, {
limit: 1 limit: 1
+1 -2
View File
@@ -96,8 +96,7 @@ module.exports = (params, user) => new Promise(async (res, rej) => {
}); });
// Serialize // Serialize
res(await Promise.all(notifications.map(async notification => res(await Promise.all(notifications.map(notification => pack(notification))));
await pack(notification))));
// Mark as read all // Mark as read all
if (notifications.length > 0 && markAsRead) { if (notifications.length > 0 && markAsRead) {
+6
View File
@@ -47,6 +47,11 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
if (isBotErr) return rej('invalid isBot param'); if (isBotErr) return rej('invalid isBot param');
if (isBot != null) user.isBot = isBot; if (isBot != null) user.isBot = isBot;
// Get 'isCat' parameter
const [isCat, isCatErr] = $.bool.optional().get(params.isCat);
if (isCatErr) return rej('invalid isCat param');
if (isCat != null) user.isCat = isCat;
// Get 'autoWatch' parameter // Get 'autoWatch' parameter
const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch); const [autoWatch, autoWatchErr] = $.bool.optional().get(params.autoWatch);
if (autoWatchErr) return rej('invalid autoWatch param'); if (autoWatchErr) return rej('invalid autoWatch param');
@@ -82,6 +87,7 @@ module.exports = async (params, user, app) => new Promise(async (res, rej) => {
bannerColor: user.bannerColor, bannerColor: user.bannerColor,
profile: user.profile, profile: user.profile,
isBot: user.isBot, isBot: user.isBot,
isCat: user.isCat,
settings: user.settings settings: user.settings
} }
}); });
+8
View File
@@ -8,6 +8,10 @@ import Note, { pack } from '../../../models/note';
* Get all notes * Get all notes
*/ */
module.exports = (params) => new Promise(async (res, rej) => { module.exports = (params) => new Promise(async (res, rej) => {
// Get 'local' parameter
const [local, localErr] = $.bool.optional().get(params.local);
if (localErr) return rej('invalid local param');
// Get 'reply' parameter // Get 'reply' parameter
const [reply, replyErr] = $.bool.optional().get(params.reply); const [reply, replyErr] = $.bool.optional().get(params.reply);
if (replyErr) return rej('invalid reply param'); if (replyErr) return rej('invalid reply param');
@@ -61,6 +65,10 @@ module.exports = (params) => new Promise(async (res, rej) => {
}; };
} }
if (local) {
query['_user.host'] = null;
}
if (reply != undefined) { if (reply != undefined) {
query.replyId = reply ? { $exists: true, $ne: null } : null; query.replyId = reply ? { $exists: true, $ne: null } : null;
} }
@@ -9,8 +9,7 @@ import Mute from '../../../../models/mute';
*/ */
module.exports = (params, user) => new Promise(async (res, rej) => { module.exports = (params, user) => new Promise(async (res, rej) => {
const mute = await Mute.find({ const mute = await Mute.find({
muterId: user._id, muterId: user._id
deletedAt: { $exists: false }
}); });
const mutedUserIds = mute.map(m => m.muteeId); const mutedUserIds = mute.map(m => m.muteeId);
+2 -2
View File
@@ -49,8 +49,8 @@ const router = new Router();
//#region static assets //#region static assets
router.get('/assets/*', async ctx => { router.get('/assets/*', async ctx => {
// 無圧縮スクリプトを用意するのは大変なので一時的に無効化 // 互換性のため
const path = process.env.NODE_ENV == 'production' ? ctx.path.replace('raw.js', 'min.js') : ctx.path.replace('min.js', 'raw.js'); const path = ctx.path.replace('.raw.js', '.js').replace('.min.js', '.js');
await send(ctx, path, { await send(ctx, path, {
root: client, root: client,
maxage: ms('7 days'), maxage: ms('7 days'),
+4 -3
View File
@@ -60,7 +60,7 @@ const entry = {
const output = { const output = {
path: __dirname + '/built/client/assets', path: __dirname + '/built/client/assets',
filename: `[name].${version}.-.${isProduction ? 'min' : 'raw'}.js` filename: `[name].${version}.-.js`
}; };
//#region Define consts //#region Define consts
@@ -78,6 +78,7 @@ const consts = {
_WS_URL_: config.ws_url, _WS_URL_: config.ws_url,
_DEV_URL_: config.dev_url, _DEV_URL_: config.dev_url,
_LANG_: '%lang%', _LANG_: '%lang%',
_LANGS_: Object.keys(locales).map(l => [l, locales[l].meta.lang]),
_HOST_: config.host, _HOST_: config.host,
_HOSTNAME_: config.hostname, _HOSTNAME_: config.hostname,
_URL_: config.url, _URL_: config.url,
@@ -110,14 +111,14 @@ const plugins = [
//#region i18n //#region i18n
langs.forEach(lang => { langs.forEach(lang => {
Object.keys(entry).forEach(file => { Object.keys(entry).forEach(file => {
let src = fs.readFileSync(`${__dirname}/built/client/assets/${file}.${version}.-.${isProduction ? 'min' : 'raw'}.js`, 'utf-8'); let src = fs.readFileSync(`${__dirname}/built/client/assets/${file}.${version}.-.js`, 'utf-8');
const i18nReplacer = new I18nReplacer(lang); const i18nReplacer = new I18nReplacer(lang);
src = src.replace(i18nReplacer.pattern, i18nReplacer.replacement); src = src.replace(i18nReplacer.pattern, i18nReplacer.replacement);
src = src.replace('%lang%', lang); src = src.replace('%lang%', lang);
fs.writeFileSync(`${__dirname}/built/client/assets/${file}.${version}.${lang}.${isProduction ? 'min' : 'raw'}.js`, src, 'utf-8'); fs.writeFileSync(`${__dirname}/built/client/assets/${file}.${version}.${lang}.js`, src, 'utf-8');
}); });
}); });
//#endregion //#endregion
+2 -7
View File
@@ -2,17 +2,12 @@
* Replace i18n texts * Replace i18n texts
*/ */
export const pattern = /%i18n:([a-z0-9_\-@\.\!]+?)%/g; export const pattern = /%i18n:([a-z0-9_\-@\.]+?)%/g;
export const replacement = (ctx, match, key) => { export const replacement = (ctx, match, key) => {
const client = '/src/client/app/'; const client = '/src/client/app/';
let name = null; let name = null;
const shouldEscape = key[0] == '!';
if (shouldEscape) {
key = key.substr(1);
}
if (key[0] == '@') { if (key[0] == '@') {
name = ctx.src.substr(ctx.src.indexOf(client) + client.length); name = ctx.src.substr(ctx.src.indexOf(client) + client.length);
key = key.substr(1); key = key.substr(1);
@@ -20,5 +15,5 @@ export const replacement = (ctx, match, key) => {
const path = name ? `${name}|${key}` : key; const path = name ? `${name}|${key}` : key;
return shouldEscape ? `%i18n:!${path}%` : `%i18n:${path}%`; return `%i18n:${path}%`;
}; };