Compare commits

...

66 Commits

Author SHA1 Message Date
syuilo c81a204e0c 2.16.6 2018-05-24 06:21:04 +09:00
syuilo fce1d619e8 Fix bug 2018-05-24 06:20:36 +09:00
syuilo 3e146d5f94 2.16.5 2018-05-24 06:09:24 +09:00
syuilo cb5c0ac2f5 Fix bug 2018-05-24 06:08:23 +09:00
syuilo 4798657b70 Refactor 2018-05-24 05:57:27 +09:00
syuilo f565e60bcf Darken 2018-05-24 05:46:09 +09:00
syuilo 89461c598f Refactor 2018-05-24 05:28:46 +09:00
syuilo b320d08a5e 🎨 2018-05-24 04:56:58 +09:00
syuilo a930d4fc7b Fix bug 2018-05-24 04:55:29 +09:00
syuilo d42197fc2e Merge pull request #1642 from syuilo/l10n_master
New Crowdin translations
2018-05-23 20:52:32 +09:00
syuilo 2d3138af76 New translations ja.yml (English) 2018-05-23 20:51:44 +09:00
syuilo 4ee4b6f332 Update docs 2018-05-23 19:03:25 +09:00
syuilo fc6c048fad Update setup.ja.md 2018-05-23 19:00:23 +09:00
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
45 changed files with 427 additions and 394 deletions
+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

+1 -7
View File
@@ -43,13 +43,7 @@ Please install and setup these softwares:
*4.* Prepare configuration *4.* Prepare configuration
---------------------------------------------------------------- ----------------------------------------------------------------
1. Copy `example.yml` of `.config` directory You need to generate config file via `npm run config` command.
2. Rename it to `default.yml`
3. Edit it
---
Or you can generate config file via `npm run config` command.
*5.* Build Misskey *5.* Build Misskey
---------------------------------------------------------------- ----------------------------------------------------------------
+5 -9
View File
@@ -43,18 +43,14 @@ web-push generate-vapid-keys
*4.* 設定ファイルを用意する *4.* 設定ファイルを用意する
---------------------------------------------------------------- ----------------------------------------------------------------
1. `.config`ディレクトリ内の`example.yml`をコピー `npm run config`コマンドを利用して、ガイドに従って情報を入力してください。
2. `default.yml`にリネーム
3. 編集する
---
または、`npm run config`コマンドを利用して、ガイドに従って情報を
入力して設定ファイルを生成することもできます。
*5.* Misskeyのビルド *5.* Misskeyのビルド
---------------------------------------------------------------- ----------------------------------------------------------------
1. `npm run build` 1. `npm install -g node-gyp`
2. `node-gyp configure`
3. `node-gyp build`
4. `npm run build`
*6.* 以上です! *6.* 以上です!
---------------------------------------------------------------- ----------------------------------------------------------------
+7 -2
View File
@@ -1,7 +1,7 @@
--- ---
meta: meta:
lang: "Deutsch" lang: "Deutsch"
divider: "" divider: " "
common: common:
misskey: "Teile alles mit anderen mithilfe von Misskey" misskey: "Teile alles mit anderen mithilfe von Misskey"
time: time:
@@ -523,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:
@@ -676,7 +682,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+25 -20
View File
@@ -56,9 +56,9 @@ common/views/components/connect-failed.troubleshooter.vue:
no-network-desc: "Please make sure you are connected to the Network." no-network-desc: "Please make sure you are connected to the Network."
no-internet: "There is no Internet connection" no-internet: "There is no Internet connection"
no-internet-desc: "Please make sure you are connected to the Internet." no-internet-desc: "Please make sure you are connected to the Internet."
no-server: "Unable to connect to the server" no-server: "Unable to connect to the Misskey server"
no-server-desc: "The network connection of your PC is normal, but you could not connect to Misskey's server. There is a possibility that the server is either down or under maintenance, please try again later." no-server-desc: "The network connection of your PC is normal, but you could not connect to the Misskey server. There is a possibility that the server is either down or under maintenance, please try again later."
success: "Successfully connected to Misskey's server" success: "Successfully connected to the Misskey server"
success-desc: "It seems to be able to connect. Please reload the page." success-desc: "It seems to be able to connect. Please reload the page."
flush: "Clean cache" flush: "Clean cache"
set-version: "Specify version" set-version: "Specify version"
@@ -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."
@@ -166,14 +166,14 @@ common/views/widgets/server.vue:
title: "Server info" title: "Server info"
toggle: "Toggle views" toggle: "Toggle views"
common/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "Public"
home: "ホーム" home: "Home"
home-desc: "ホームタイムラインにのみ公開" home-desc: "Post to the home timeline only"
followers: "フォロワー" followers: "Followers"
followers-desc: "自分のフォロワーにのみ公開" followers-desc: "Post to followers only"
specified: "ダイレクト" specified: "Direct"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "Post to specified users only"
private: "非公開" private: "Private"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Black ... Total" total: "Black ... Total"
notes: "Blue ... Notes" notes: "Blue ... Notes"
@@ -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"
@@ -417,8 +417,8 @@ desktop/views/components/settings.vue:
update-checking: "Checking for updates" update-checking: "Checking for updates"
do-update: "Check for update" do-update: "Check for update"
update-settings: "Advanced settings" update-settings: "Advanced settings"
prevent-update: "アップデートを延期する(非推奨)" prevent-update: "Postpone updates (not recommended)"
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 available" no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date." no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!" update-available: "New version is available!"
@@ -475,8 +475,8 @@ desktop/views/components/settings.profile.vue:
description: "Description" description: "Description"
birthday: "Birthday" birthday: "Birthday"
save: "Update profile" save: "Update profile"
is-bot: "このアカウントはBotです" is-bot: "This account is a Bot"
is-cat: "このアカウントはCatです" is-cat: "This account is a Cat"
desktop/views/components/sub-note-content.vue: desktop/views/components/sub-note-content.vue:
hidden: "(this post is private)" hidden: "(this post is private)"
media: " media" media: " media"
@@ -523,6 +523,12 @@ desktop/views/components/users-list-item.vue:
desktop/views/components/window.vue: desktop/views/components/window.vue:
popout: "Popout" popout: "Popout"
close: "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:
@@ -676,7 +682,6 @@ mobile/views/pages/notifications.vue:
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: "Profile" title: "Profile"
will-be-published: "※公開されます"
name: "Name" name: "Name"
account: "Account" account: "Account"
location: "Location" location: "Location"
@@ -684,7 +689,7 @@ mobile/views/pages/settings/settings.profile.vue:
birthday: "Birthday" birthday: "Birthday"
avatar: "Avatar" avatar: "Avatar"
banner: "Banner" banner: "Banner"
is-cat: "このアカウントはCatです" 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"
+6 -1
View File
@@ -523,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:
@@ -676,7 +682,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+8 -3
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:
@@ -523,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:
@@ -676,7 +682,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+6 -1
View File
@@ -523,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:
@@ -676,7 +682,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+7 -1
View File
@@ -612,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"
@@ -807,7 +814,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+6 -1
View File
@@ -523,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:
@@ -676,7 +682,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+16 -11
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:
@@ -166,14 +166,14 @@ common/views/widgets/server.vue:
title: "Informacje o serwerze" title: "Informacje o serwerze"
toggle: "Przełącz widok" toggle: "Przełącz widok"
common/views/widgets/visibility-chooser.vue: common/views/widgets/visibility-chooser.vue:
public: "公開" public: "Publiczny"
home: "ホーム" home: "Lokalny"
home-desc: "ホームタイムラインにのみ公開" home-desc: "Widoczny tylko na tej instancji"
followers: "フォロワー" followers: "Dla śledzących"
followers-desc: "自分のフォロワーにのみ公開" followers-desc: "Widoczny tylko dla osób, które Cię śledzą"
specified: "ダイレクト" specified: "Bezpośredni"
specified-desc: "指定したユーザーにのみ公開" specified-desc: "Tylko dla określonych użytkowników"
private: "非公開" private: "Prywatny"
desktop/views/components/activity.chart.vue: desktop/views/components/activity.chart.vue:
total: "Czarny … Łącznie" total: "Czarny … Łącznie"
notes: "Niebieski … Wpisy" notes: "Niebieski … Wpisy"
@@ -523,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: "Dysk Misskey" title: "Dysk Misskey"
desktop/views/pages/favorites.vue: desktop/views/pages/favorites.vue:
@@ -676,7 +682,6 @@ mobile/views/pages/notifications.vue:
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: "Profil" title: "Profil"
will-be-published: "※公開されます"
name: "Nazwa" name: "Nazwa"
account: "Konto" account: "Konto"
location: "Lokalizacja" location: "Lokalizacja"
+8 -3
View File
@@ -1,7 +1,7 @@
--- ---
meta: meta:
lang: "日本語" lang: "Русский язык"
divider: "" divider: " "
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "Misskeyで皆と共有しよう。"
time: time:
@@ -523,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:
@@ -676,7 +682,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+7 -2
View File
@@ -1,6 +1,6 @@
--- ---
meta: meta:
lang: "日本語" lang: "中文(简体)"
divider: "" divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "Misskeyで皆と共有しよう。"
@@ -523,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:
@@ -676,7 +682,6 @@ 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: "アカウント" account: "アカウント"
location: "場所" location: "場所"
+2 -2
View File
@@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "2.15.0", "version": "2.16.6",
"clientVersion": "1.0.5620", "clientVersion": "1.0.5686",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,
+14 -9
View File
@@ -18,6 +18,14 @@
return; return;
} }
//#region Load settings
let settings = null;
const vuex = localStorage.getItem('vuex');
if (vuex) {
settings = JSON.parse(vuex);
}
//#endregion
// Get the current url information // Get the current url information
const url = new URL(location.href); const url = new URL(location.href);
@@ -35,14 +43,9 @@
// The default language is English // The default language is English
if (!LANGS.includes(lang)) lang = 'en'; if (!LANGS.includes(lang)) lang = 'en';
const vuex = localStorage.getItem('vuex'); if (settings) {
if (vuex) { if (settings.device.lang) lang = settings.device.lang;
const data = JSON.parse(vuex);
if (data.device.lang) lang = data.device.lang;
} }
const storedLang = localStorage.getItem('lang');
if (storedLang) lang = storedLang;
//#endregion //#endregion
// Detect the user agent // Detect the user agent
@@ -71,8 +74,10 @@
} }
// Dark/Light // Dark/Light
if (localStorage.getItem('darkmode') == 'true') { if (settings) {
document.documentElement.setAttribute('data-darkmode', 'true'); if (settings.device.darkmode) {
document.documentElement.setAttribute('data-darkmode', 'true');
}
} }
// Script version // Script version
@@ -26,7 +26,11 @@ export default Vue.extend({
}, },
style(): any { style(): any {
return { return {
backgroundColor: this.user.avatarColor && this.user.avatarColor.length == 3 ? `rgb(${ this.user.avatarColor.join(',') })` : null, backgroundColor: this.lightmode
? `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)`, 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
}; };
@@ -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() {
@@ -197,7 +197,7 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
@import '~const.styl' @import '~const.styl'
.mk-messaging-form root(isDark)
> textarea > textarea
cursor auto cursor auto
display block display block
@@ -209,10 +209,10 @@ export default Vue.extend({
padding 8px padding 8px
resize none resize none
font-size 1em font-size 1em
color #000 color isDark ? #fff : #000
outline none outline none
border none border none
border-top solid 1px #eee border-top solid 1px isDark ? #4b5056 : #eee
border-radius 0 border-radius 0
box-shadow none box-shadow none
background transparent background transparent
@@ -302,4 +302,10 @@ export default Vue.extend({
input[type=file] input[type=file]
display none display none
.mk-messaging-form[data-darkmode]
root(true)
.mk-messaging-form:not([data-darkmode])
root(false)
</style> </style>
@@ -59,8 +59,10 @@ export default Vue.extend({
</script> </script>
<style lang="stylus" scoped> <style lang="stylus" scoped>
.message @import '~const.styl'
$me-balloon-color = #23A7B6
root(isDark)
$me-balloon-color = $theme-color
padding 10px 12px 10px 12px padding 10px 12px 10px 12px
background-color transparent background-color transparent
@@ -126,7 +128,7 @@ export default Vue.extend({
bottom -4px bottom -4px
left -12px left -12px
margin 0 margin 0
color rgba(#000, 0.5) color isDark ? rgba(#fff, 0.5) : rgba(#000, 0.5)
font-size 11px font-size 11px
> .content > .content
@@ -187,7 +189,7 @@ export default Vue.extend({
display block display block
margin 2px 0 0 0 margin 2px 0 0 0
font-size 10px font-size 10px
color rgba(#000, 0.4) color isDark ? rgba(#fff, 0.4) : rgba(#000, 0.4)
> [data-fa] > [data-fa]
margin-left 4px margin-left 4px
@@ -200,8 +202,9 @@ export default Vue.extend({
padding-left 66px padding-left 66px
> .balloon > .balloon
$color = isDark ? #2d3338 : #eee
float left float left
background #eee background $color
&[data-no-text] &[data-no-text]
background transparent background transparent
@@ -209,10 +212,15 @@ export default Vue.extend({
&:not([data-no-text]):before &:not([data-no-text]):before
left -14px left -14px
border-top solid 8px transparent border-top solid 8px transparent
border-right solid 8px #eee border-right solid 8px $color
border-bottom solid 8px transparent border-bottom solid 8px transparent
border-left solid 8px transparent border-left solid 8px transparent
> .content
> .text
if isDark
color #fff
> footer > footer
text-align left text-align left
@@ -241,7 +249,7 @@ export default Vue.extend({
> .content > .content
> p.is-deleted > p.is-deleted
color rgba(255, 255, 255, 0.5) color rgba(#fff, 0.5)
> .text >>> > .text >>>
&, * &, *
@@ -254,4 +262,10 @@ export default Vue.extend({
> .baloon > .baloon
opacity 0.5 opacity 0.5
.message[data-darkmode]
root(true)
.message:not([data-darkmode])
root(false)
</style> </style>
@@ -18,7 +18,11 @@
</template> </template>
</div> </div>
<footer> <footer>
<div ref="notifications" class="notifications"></div> <transition name="fade">
<div class="new-message" v-show="showIndicator">
<button @click="onIndicatorClick">%fa:arrow-circle-down%%i18n:@new-message%</button>
</div>
</transition>
<x-form :user="user" ref="form"/> <x-form :user="user" ref="form"/>
</footer> </footer>
</div> </div>
@@ -45,7 +49,9 @@ export default Vue.extend({
fetchingMoreMessages: false, fetchingMoreMessages: false,
messages: [], messages: [],
existMoreMessages: false, existMoreMessages: false,
connection: null connection: null,
showIndicator: false,
timer: null
}; };
}, },
@@ -172,7 +178,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.notifyNewMessage();
} }
}, },
@@ -205,18 +211,18 @@ export default Vue.extend({
} }
}, },
notify(message) { onIndicatorClick() {
const n = document.createElement('p') as any; this.showIndicator = false;
n.innerHTML = '%fa:arrow-circle-down%' + message; this.scrollToBottom();
n.onclick = () => { },
this.scrollToBottom();
n.parentNode.removeChild(n);
};
(this.$refs.notifications as any).appendChild(n);
setTimeout(() => { notifyNewMessage() {
n.style.opacity = 0; this.showIndicator = true;
setTimeout(() => n.parentNode.removeChild(n), 1000);
if (this.timer) clearTimeout(this.timer);
this.timer = setTimeout(() => {
this.showIndicator = false;
}, 4000); }, 4000);
}, },
@@ -238,11 +244,12 @@ export default Vue.extend({
<style lang="stylus" scoped> <style lang="stylus" scoped>
@import '~const.styl' @import '~const.styl'
.mk-messaging-room root(isDark)
display flex display flex
flex 1 flex 1
flex-direction column flex-direction column
height 100% height 100%
background isDark ? #191b22 : #fff
> .stream > .stream
width 100% width 100%
@@ -267,7 +274,7 @@ export default Vue.extend({
padding 16px 8px 8px 8px padding 16px 8px 8px 8px
text-align center text-align center
font-size 0.8em font-size 0.8em
color rgba(#000, 0.4) color rgba(isDark ? #fff : #000, 0.4)
[data-fa] [data-fa]
margin-right 4px margin-right 4px
@@ -278,7 +285,7 @@ export default Vue.extend({
padding 16px padding 16px
text-align center text-align center
font-size 0.8em font-size 0.8em
color rgba(#000, 0.4) color rgba(isDark ? #fff : #000, 0.4)
[data-fa] [data-fa]
margin-right 4px margin-right 4px
@@ -322,7 +329,7 @@ export default Vue.extend({
left 0 left 0
right 0 right 0
margin 0 auto margin 0 auto
background rgba(#000, 0.1) background rgba(isDark ? #fff : #000, 0.1)
> span > span
display inline-block display inline-block
@@ -331,7 +338,7 @@ export default Vue.extend({
//font-weight bold //font-weight bold
line-height 32px line-height 32px
color rgba(#000, 0.3) color rgba(#000, 0.3)
background #fff background isDark ? #191b22 : #fff
> footer > footer
position -webkit-sticky position -webkit-sticky
@@ -342,30 +349,32 @@ export default Vue.extend({
max-width 600px max-width 600px
margin 0 auto margin 0 auto
padding 0 padding 0
background rgba(255, 255, 255, 0.95) background rgba(isDark ? #282c37 : #fff, 0.95)
background-clip content-box background-clip content-box
> .notifications > .new-message
position absolute position absolute
top -48px top -48px
width 100% width 100%
padding 8px 0 padding 8px 0
text-align center text-align center
&:empty > button
display none
> p
display inline-block display inline-block
margin 0 margin 0
padding 0 12px 0 28px padding 0 12px 0 30px
cursor pointer cursor pointer
line-height 32px line-height 32px
font-size 12px font-size 12px
color $theme-color-foreground color $theme-color-foreground
background $theme-color background $theme-color
border-radius 16px border-radius 16px
transition opacity 1s ease
&:hover
background lighten($theme-color, 10%)
&:active
background darken($theme-color, 10%)
> [data-fa] > [data-fa]
position absolute position absolute
@@ -374,4 +383,17 @@ export default Vue.extend({
line-height 32px line-height 32px
font-size 16px font-size 16px
.fade-enter-active, .fade-leave-active
transition opacity 0.1s
.fade-enter, .fade-leave-to
transition opacity 0.5s
opacity 0
.mk-messaging-room[data-darkmode]
root(true)
.mk-messaging-room:not([data-darkmode])
root(false)
</style> </style>
@@ -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>
@@ -227,8 +227,7 @@ export default Vue.extend({
version, version,
langs, langs,
latestVersion: undefined, latestVersion: undefined,
checkingForUpdate: false, checkingForUpdate: false
darkmode: localStorage.getItem('darkmode') == 'true'
}; };
}, },
computed: { computed: {
@@ -246,6 +245,11 @@ export default Vue.extend({
set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); } set(value) { this.$store.commit('device/set', { key: 'autoPopout', value }); }
}, },
darkmode: {
get() { return this.$store.state.device.darkmode; },
set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); }
},
enableSounds: { enableSounds: {
get() { return this.$store.state.device.enableSounds; }, get() { return this.$store.state.device.enableSounds; },
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); } set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
@@ -276,11 +280,6 @@ export default Vue.extend({
set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); } set(value) { this.$store.commit('device/set', { key: 'enableExperimentalFeatures', value }); }
} }
}, },
watch: {
darkmode() {
(this as any)._updateDarkmode_(this.darkmode);
}
},
created() { created() {
(this as any).os.getMeta().then(meta => { (this as any).os.getMeta().then(meta => {
this.meta = meta; this.meta = meta;
@@ -35,7 +35,7 @@
</ul> </ul>
<ul> <ul>
<li @click="dark"> <li @click="dark">
<p><span>%i18n:@dark%</span><template v-if="_darkmode_">%fa:moon%</template><template v-else>%fa:R moon%</template></p> <p><span>%i18n:@dark%</span><template v-if="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template></p>
</li> </li>
</ul> </ul>
</div> </div>
@@ -99,7 +99,10 @@ export default Vue.extend({
(this as any).os.signout(); (this as any).os.signout();
}, },
dark() { dark() {
(this as any)._updateDarkmode_(!(this as any)._darkmode_); this.$store.commit('device/set', {
key: 'darkmode',
value: !this.$store.state.device.darkmode
});
} }
} }
}); });
@@ -2,7 +2,7 @@
<mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy"> <mk-window ref="window" is-modal width="450px" height="500px" @closed="$destroy">
<span slot="header">%fa:list% リスト</span> <span slot="header">%fa:list% リスト</span>
<div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="_darkmode_"> <div data-id="6e4caea3-d8f9-4ab7-96de-ab67fe8d5c82" :data-darkmode="$store.state.device.darkmode">
<button class="ui" @click="add">%i18n:@create-list%</button> <button class="ui" @click="add">%i18n:@create-list%</button>
<a v-for="list in lists" :key="list.id" @click="choice(list)">{{ list.title }}</a> <a v-for="list in lists" :key="list.id" @click="choice(list)">{{ list.title }}</a>
</div> </div>
@@ -21,10 +21,20 @@ export default Vue.extend({
$route: 'fetch' $route: 'fetch'
}, },
created() { created() {
const applyBg = v =>
document.documentElement.style.setProperty('background', v ? '#191b22' : '#fff', 'important');
applyBg(this.$store.state.device.darkmode);
this.unwatchDarkmode = this.$store.watch(s => {
return s.device.darkmode;
}, applyBg);
this.fetch(); this.fetch();
}, },
mounted() { beforeDestroy() {
document.documentElement.style.background = '#fff'; document.documentElement.style.removeProperty('background');
this.unwatchDarkmode();
}, },
methods: { methods: {
fetch() { fetch() {
@@ -50,6 +60,5 @@ export default Vue.extend({
flex 1 flex 1
flex-direction column flex-direction column
min-height 100% min-height 100%
background #fff
</style> </style>
+92 -190
View File
@@ -1,23 +1,16 @@
<template> <template>
<div class="mk-welcome"> <div class="mk-welcome">
<button @click="dark">
<template v-if="$store.state.device.darkmode">%fa:moon%</template>
<template v-else>%fa:R moon%</template>
</button>
<main> <main>
<div class="top"> <img :src="$store.state.device.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,21 @@
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() {
} }
} }
}); });
@@ -115,161 +65,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 +173,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>
@@ -4,7 +4,7 @@
<template slot="header">%fa:chart-pie%%i18n:@title%</template> <template slot="header">%fa:chart-pie%%i18n:@title%</template>
<button slot="func" title="%i18n:@refresh%" @click="fetch">%fa:sync%</button> <button slot="func" title="%i18n:@refresh%" @click="fetch">%fa:sync%</button>
<div class="mkw-polls--body" :data-darkmode="_darkmode_"> <div class="mkw-polls--body" :data-darkmode="$store.state.device.darkmode">
<div class="poll" v-if="!fetching && poll != null"> <div class="poll" v-if="!fetching && poll != null">
<p v-if="poll.text"><router-link to="poll | notePage">{{ poll.text }}</router-link></p> <p v-if="poll.text"><router-link to="poll | notePage">{{ poll.text }}</router-link></p>
<p v-if="!poll.text"><router-link to="poll | notePage">%fa:link%</router-link></p> <p v-if="!poll.text"><router-link to="poll | notePage">%fa:link%</router-link></p>
+37 -42
View File
@@ -49,48 +49,6 @@ Vue.mixin({
} }
}); });
// Dark/Light
const bus = new Vue();
Vue.mixin({
data() {
return {
_darkmode_: localStorage.getItem('darkmode') == 'true'
};
},
beforeCreate() {
// なぜか警告が出るので
this._darkmode_ = localStorage.getItem('darkmode') == 'true';
},
beforeDestroy() {
bus.$off('updated', this._onDarkmodeUpdated_);
},
mounted() {
this._onDarkmodeUpdated_(this._darkmode_);
bus.$on('updated', this._onDarkmodeUpdated_);
},
methods: {
_updateDarkmode_(v) {
localStorage.setItem('darkmode', v.toString());
if (v) {
document.documentElement.setAttribute('data-darkmode', 'true');
} else {
document.documentElement.removeAttribute('data-darkmode');
}
bus.$emit('updated', v);
},
_onDarkmodeUpdated_(v) {
if (!this.$el || !this.$el.setAttribute) return;
if (v) {
this.$el.setAttribute('data-darkmode', 'true');
} else {
this.$el.removeAttribute('data-darkmode');
}
this._darkmode_ = v;
this.$forceUpdate();
}
}
});
/** /**
* APP ENTRY POINT! * APP ENTRY POINT!
*/ */
@@ -141,6 +99,43 @@ export default (callback: (launch: (router: VueRouter, api?: (os: MiOS) => API)
const launch = (router: VueRouter, api?: (os: MiOS) => API) => { const launch = (router: VueRouter, api?: (os: MiOS) => API) => {
os.apis = api ? api(os) : null; os.apis = api ? api(os) : null;
//#region Dark/Light
Vue.mixin({
data() {
_unwatchDarkmode_: null
},
created() {
const apply = v => {
if (this.$el.setAttribute == null) return;
if (v) {
this.$el.setAttribute('data-darkmode', 'true');
} else {
this.$el.removeAttribute('data-darkmode');
}
};
this.$nextTick(() => apply(os.store.state.device.darkmode));
this._unwatchDarkmode_ = os.store.watch(s => {
return s.device.darkmode;
}, apply);
},
beforeDestroy() {
this._unwatchDarkmode_();
}
});
os.store.watch(s => {
return s.device.darkmode;
}, v => {
if (v) {
document.documentElement.setAttribute('data-darkmode', 'true');
} else {
document.documentElement.removeAttribute('data-darkmode');
}
});
//#endregion
Vue.mixin({ Vue.mixin({
data() { data() {
return { return {
+1 -1
View File
@@ -70,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 },
@@ -28,8 +28,8 @@
<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="$store.state.device.darkmode">%fa:moon%</template><template v-else>%fa:R moon%</template><span>ダークモード</span></p></li>
</ul> </ul>
</div> </div>
<a :href="aboutUrl"><p class="about">%i18n:@about%</p></a> <a :href="aboutUrl"><p class="about">%i18n:@about%</p></a>
@@ -117,7 +117,10 @@ export default Vue.extend({
this.hasGameInvitations = false; this.hasGameInvitations = false;
}, },
dark() { dark() {
(this as any)._updateDarkmode_(!(this as any)._darkmode_); this.$store.commit('device/set', {
key: 'darkmode',
value: !this.$store.state.device.darkmode
});
} }
} }
}); });
+1 -1
View File
@@ -17,7 +17,7 @@
<button @click="fn">%fa:pencil-alt%</button> <button @click="fn">%fa:pencil-alt%</button>
</template> </template>
<main :data-darkmode="_darkmode_"> <main :data-darkmode="$store.state.device.darkmode">
<div class="nav" v-if="showNav"> <div class="nav" v-if="showNav">
<div class="bg" @click="showNav = false"></div> <div class="bg" @click="showNav = false"></div>
<div class="body"> <div class="body">
@@ -16,16 +16,29 @@ export default Vue.extend({
data() { data() {
return { return {
fetching: true, fetching: true,
user: null user: null,
unwatchDarkmode: null
}; };
}, },
watch: { watch: {
$route: 'fetch' $route: 'fetch'
}, },
created() { created() {
document.documentElement.style.background = '#fff'; const applyBg = v =>
document.documentElement.style.setProperty('background', v ? '#191b22' : '#fff', 'important');
applyBg(this.$store.state.device.darkmode);
this.unwatchDarkmode = this.$store.watch(s => {
return s.device.darkmode;
}, applyBg);
this.fetch(); this.fetch();
}, },
beforeDestroy() {
document.documentElement.style.removeProperty('background');
this.unwatchDarkmode();
},
methods: { methods: {
fetch() { fetch() {
this.fetching = true; this.fetching = true;
@@ -39,4 +52,3 @@ export default Vue.extend({
} }
}); });
</script> </script>
@@ -12,7 +12,6 @@ import getAcct from '../../../../../acct/render';
export default Vue.extend({ export default Vue.extend({
mounted() { mounted() {
document.title = 'Misskey %i18n:@messaging%'; document.title = 'Misskey %i18n:@messaging%';
document.documentElement.style.background = '#fff';
}, },
methods: { methods: {
navigate(user) { navigate(user) {
@@ -141,7 +141,6 @@ export default Vue.extend({
version, version,
codename, codename,
langs, langs,
darkmode: localStorage.getItem('darkmode') == 'true',
latestVersion: undefined, latestVersion: undefined,
checkingForUpdate: false checkingForUpdate: false
}; };
@@ -152,6 +151,11 @@ export default Vue.extend({
return Vue.filter('userName')((this as any).os.i); return Vue.filter('userName')((this as any).os.i);
}, },
darkmode: {
get() { return this.$store.state.device.darkmode; },
set(value) { this.$store.commit('device/set', { key: 'darkmode', value }); }
},
postStyle: { postStyle: {
get() { return this.$store.state.device.postStyle; }, get() { return this.$store.state.device.postStyle; },
set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); } set(value) { this.$store.commit('device/set', { key: 'postStyle', value }); }
@@ -168,12 +172,6 @@ export default Vue.extend({
}, },
}, },
watch: {
darkmode() {
(this as any)._updateDarkmode_(this.darkmode);
}
},
mounted() { mounted() {
document.title = 'Misskey | %i18n:@settings%'; document.title = 'Misskey | %i18n:@settings%';
}, },
@@ -27,7 +27,6 @@
<md-icon>%fa:birthday-cake%</md-icon> <md-icon>%fa:birthday-cake%</md-icon>
<label>%i18n:@birthday%</label> <label>%i18n:@birthday%</label>
<md-input type="date" v-model="birthday" :disabled="saving"/> <md-input type="date" v-model="birthday" :disabled="saving"/>
<span class="md-helper-text">%i18n:@will-be-published%</span>
</md-field> </md-field>
<md-field> <md-field>
+1 -1
View File
@@ -1,7 +1,7 @@
<template> <template>
<mk-ui> <mk-ui>
<template slot="header" v-if="!fetching"><img :src="`${user.avatarUrl}?thumbnail&size=64`" alt="">{{ user | userName }}</template> <template slot="header" v-if="!fetching"><img :src="`${user.avatarUrl}?thumbnail&size=64`" alt="">{{ user | userName }}</template>
<main v-if="!fetching" :data-darkmode="_darkmode_"> <main v-if="!fetching" :data-darkmode="$store.state.device.darkmode">
<div class="is-suspended" v-if="user.isSuspended"><p>%fa:exclamation-triangle% %i18n:@is-suspended%</p></div> <div class="is-suspended" v-if="user.isSuspended"><p>%fa:exclamation-triangle% %i18n:@is-suspended%</p></div>
<div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div> <div class="is-remote" v-if="user.host != null"><p>%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></p></div>
<header> <header>
+1
View File
@@ -19,6 +19,7 @@ const defaultSettings = {
const defaultDeviceSettings = { const defaultDeviceSettings = {
apiViaStream: true, apiViaStream: true,
autoPopout: false, autoPopout: false,
darkmode: false,
enableSounds: true, enableSounds: true,
soundVolume: 0.5, soundVolume: 0.5,
lang: null, lang: null,
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);
@@ -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) {
+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'),