Compare commits

..

32 Commits

Author SHA1 Message Date
syuilo
16e446c121 2.32.0 2018-06-08 11:47:33 +09:00
syuilo
8f232a9da9 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-08 11:46:48 +09:00
syuilo
ebeb7f8578 ✌️ 2018-06-08 11:46:45 +09:00
syuilo
f790673068 Merge pull request #1684 from syuilo/l10n_master
New Crowdin translations
2018-06-08 11:17:44 +09:00
syuilo
335ab5ab54 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-08 11:17:30 +09:00
syuilo
00e0d6ce2c Improve usability 2018-06-08 11:17:22 +09:00
syuilo
414fb6d303 New translations ja.yml (French) 2018-06-08 10:41:25 +09:00
syuilo
9c35a12211 New translations ja.yml (French) 2018-06-08 10:12:39 +09:00
syuilo
bb4fe5174f Update README.md 2018-06-08 09:08:09 +09:00
syuilo
3ffd6ff5a2 2.31.0 2018-06-08 08:39:04 +09:00
syuilo
b05feb5bf7 MisskeyDeck: ドラッグでカラムを入れ替えられるように 2018-06-08 08:38:32 +09:00
syuilo
fa171f237d 2.30.2 2018-06-08 08:06:19 +09:00
syuilo
f2ccb684eb 🎨 2018-06-08 08:05:25 +09:00
syuilo
ffea6522ac Merge pull request #1683 from syuilo/l10n_master
New Crowdin translations
2018-06-08 07:44:17 +09:00
syuilo
3d40a7df00 ✌️ 2018-06-08 07:43:12 +09:00
syuilo
638c41476b New translations ja.yml (German) 2018-06-08 07:40:48 +09:00
syuilo
c6d3088374 Merge pull request #1682 from syuilo/l10n_master
New Crowdin translations
2018-06-08 07:26:58 +09:00
syuilo
0f93be9dd4 New translations ja.yml (German) 2018-06-08 07:01:06 +09:00
syuilo
f59982c9c5 New translations ja.yml (German) 2018-06-08 06:51:25 +09:00
syuilo
dff67a5e54 New translations ja.yml (German) 2018-06-08 06:41:05 +09:00
syuilo
6adcc3b2ed New translations ja.yml (German) 2018-06-08 06:31:09 +09:00
syuilo
877ed3663c New translations ja.yml (German) 2018-06-08 06:21:24 +09:00
syuilo
6000a82917 New translations ja.yml (German) 2018-06-08 06:11:02 +09:00
syuilo
6805f9b3e0 New translations ja.yml (German) 2018-06-08 06:01:10 +09:00
syuilo
1366c785f9 Update README.md 2018-06-08 05:54:42 +09:00
syuilo
70540b4500 New translations ja.yml (German) 2018-06-08 05:51:01 +09:00
syuilo
0967f23b6e 2.30.1 2018-06-08 05:49:19 +09:00
syuilo
1f7d66169c Merge pull request #1681 from syuilo/l10n_master
New Crowdin translations
2018-06-08 05:48:51 +09:00
syuilo
af501f5eeb Fix bug 2018-06-08 05:48:27 +09:00
syuilo
60be60c923 New translations ja.yml (German) 2018-06-08 05:41:56 +09:00
syuilo
48746101e0 New translations ja.yml (Polish) 2018-06-08 05:20:55 +09:00
syuilo
af9c5c6ab7 typo 2018-06-08 05:07:19 +09:00
19 changed files with 355 additions and 218 deletions

View File

@@ -16,11 +16,13 @@ ultimately sophisticated new type of mini-blog based SNS.
<a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a> <a href="https://www.patreon.com/syuilo"><img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" alt="Become a Patron!" width="160" /></a>
![](https://c10.patreonusercontent.com/3/e30%3D/patreon-posts/RsKWEDEKf8D_wYDQWAbex9CSb-1DnXW1nfqfLvuys5ROj2k0VF6_luuzHMTyf95n.png?token-time=1529539200&token-hash=RmcSP0947mw5o2-B6g1L6aU_OoDXANe198kLU6HMO30%3D)
:sparkles: Features :sparkles: Features
---------------------------------------------------------------- ----------------------------------------------------------------
* Reactions * Reactions
* User lists * User lists
* Cusromizable column view (known as MisskeyDeck) * Customizable column view (known as MisskeyDeck)
* Private messages * Private messages
* Mute * Mute
* Streaming * Streaming
@@ -46,18 +48,9 @@ If you want to...
[![Backers][backers-image]][support-url] [![Backers][backers-image]][support-url]
[![Sponsors][sponsors-image]][support-url] [![Sponsors][sponsors-image]][support-url]
:mortar_board: Notable contributors | ![][ooo-icon] |
---------------------------------------------------------------- |:-:|
| ![syuilo][syuilo-icon] | ![Morisawa Aya][ayamorisawa-icon] | ![otofune][otofune-icon] | ![akihikodaki][akihikodaki-icon] | ![tamaina][tamaina-icon] | ![rinsuki][rinsuki-icon] | | [ooo][ooo-link] |
|:-:|:-:|:-:|:-:|:-:|:-:|
| [syuilo][syuilo-link]<br>Owner | [Aya Morisawa][ayamorisawa-link]<br>Collaborator | [otofune][otofune-link]<br>Collaborator | [akihikodaki][akihikodaki-link] | [tamaina][tamaina-link] | [rinsuki][rinsuki-link] |
[List of all contributors](https://github.com/syuilo/misskey/graphs/contributors)
### :earth_americas: Translators
| ![][mirro-san-icon] | ![][Conan-kun-icon] | ![][m4sk1n-icon] |
|:-:|:-:|:-:|
| [Mirro][mirro-san-link]<br>English, French | [Asriel][Conan-kun-link]<br>English, French | [Marcin Mikołajczak][m4sk1n-link]<br>Polish |
:four_leaf_clover: Copyright :four_leaf_clover: Copyright
---------------------------------------------------------------- ----------------------------------------------------------------
@@ -85,23 +78,8 @@ Misskey is an open-source software licensed under [GNU AGPLv3](LICENSE).
[sponsors-image]: https://opencollective.com/misskey/sponsors.svg [sponsors-image]: https://opencollective.com/misskey/sponsors.svg
[support-url]: https://opencollective.com/misskey#support [support-url]: https://opencollective.com/misskey#support
<!-- Contributors Info -->
[syuilo-link]: https://syuilo.com [syuilo-link]: https://syuilo.com
[syuilo-icon]: https://avatars2.githubusercontent.com/u/4439005?v=3&s=70 [syuilo-icon]: https://avatars2.githubusercontent.com/u/4439005?v=3&s=70
[ayamorisawa-link]: https://github.com/ayamorisawa
[ayamorisawa-icon]: https://avatars0.githubusercontent.com/u/10798641?v=3&s=70
[otofune-link]: https://github.com/otofune
[otofune-icon]: https://avatars0.githubusercontent.com/u/15062473?v=3&s=70
[akihikodaki-link]: https://github.com/akihikodaki
[akihikodaki-icon]: https://avatars2.githubusercontent.com/u/17036990?s=70&v=4
[rinsuki-link]: https://github.com/rinsuki
[rinsuki-icon]: https://avatars0.githubusercontent.com/u/6533808?s=70&v=4
[tamaina-link]: https://github.com/tamaina
[tamaina-icon]: https://avatars1.githubusercontent.com/u/7973572?s=70&v=4
[mirro-san-link]: https://github.com/mirro-san [ooo-link]: https://www.patreon.com/user/creators?u=11601413
[mirro-san-icon]: https://avatars1.githubusercontent.com/u/17948612?s=70&v=4 [ooo-icon]: https://c10.patreonusercontent.com/3/eyJ2IjoiMSIsInciOjIwMH0%3D/patreon-media/user/11601413/20cb15f209924302b399b99d3c98b850?token-time=2145916800&token-hash=IO31nK6VZCMWBWU2VAk2c824BX2QZ4DNPKyHHZXS0iw%3D
[Conan-kun-link]: https://github.com/Conan-kun
[Conan-kun-icon]: https://avatars3.githubusercontent.com/u/30003708?s=70&v=4
[m4sk1n-link]: https://github.com/m4sk1n
[m4sk1n-icon]: https://avatars3.githubusercontent.com/u/21127288?s=70&v=4

View File

@@ -70,19 +70,19 @@ common:
nav: "Navigation" nav: "Navigation"
tips: "Tipps" tips: "Tipps"
deck: deck:
widgets: "ウィジェット" widgets: "Widget hinzufügen:"
home: "ホーム" home: "Startseite"
local: "ローカル" local: "Lokal"
global: "グローバル" global: "Global"
notifications: "通知" notifications: "Mitteilungen"
list: "リスト" list: "Listen"
swap-left: "左に移動" swap-left: "Nach links"
swap-right: "右に移動" swap-right: "Nach rechts"
swap-up: "上に移動" swap-up: "Nach oben"
swap-down: "下に移動" swap-down: "Nach unten"
remove: "カラムを削除" remove: "Spalte löschen"
add-column: "カラムを追加" add-column: "Eine Spalte hinzufügen"
rename: "名前を変更" rename: "Umbenennen"
stack-left: "左に重ねる" stack-left: "左に重ねる"
pop-right: "右に出す" pop-right: "右に出す"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
@@ -203,7 +203,7 @@ common/views/components/uploader.vue:
common/views/components/visibility-chooser.vue: common/views/components/visibility-chooser.vue:
public: "Öffentlich" public: "Öffentlich"
home: "Home" home: "Home"
home-desc: "ホームタイムラインにのみ公開" home-desc: "Nur auf die Startseite posten"
followers: "Folgende" followers: "Folgende"
followers-desc: "Nur für diejenigen sichtbar, die dir folgen" followers-desc: "Nur für diejenigen sichtbar, die dir folgen"
specified: "Direkt" specified: "Direkt"
@@ -264,7 +264,7 @@ desktop/views/components/drive.file.vue:
rename: "Umbenennen" rename: "Umbenennen"
copy-url: "URL kopieren" copy-url: "URL kopieren"
download: "Download" download: "Download"
else-files: "その他..." else-files: "Anderes…"
set-as-avatar: "Als Avatar festlegen" set-as-avatar: "Als Avatar festlegen"
set-as-banner: "Setze als Banner" set-as-banner: "Setze als Banner"
open-in-app: "In der App öffnen" open-in-app: "In der App öffnen"
@@ -306,10 +306,10 @@ desktop/views/components/drive.vue:
upload: "Eine Datei hochladen" upload: "Eine Datei hochladen"
url-upload: "Von einer URL hochladen" url-upload: "Von einer URL hochladen"
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
following: "フォロー中" following: "Folge ich"
follow: "フォロー" follow: "Folgen"
request-pending: "フォロー許可待ち" request-pending: "Ausstehend"
follow-request: "フォロー申請" follow-request: "Follower-Anfragen"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} のフォロワー" followers: "{} のフォロワー"
desktop/views/components/followers.vue: desktop/views/components/followers.vue:
@@ -317,18 +317,18 @@ desktop/views/components/followers.vue:
desktop/views/components/following-window.vue: desktop/views/components/following-window.vue:
following: "{} のフォロー" following: "{} のフォロー"
desktop/views/components/following.vue: desktop/views/components/following.vue:
empty: "フォロー中のユーザーはいないようです。" empty: "Du folgst niemanden"
desktop/views/components/friends-maker.vue: desktop/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー:" title: "Wem folgen?"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "Der ausgewählte Benutzer konnte nicht gefunden werden."
fetching: "読み込んでいます" fetching: "Lade…"
refresh: "もっと見る" refresh: "Mehr"
close: "閉じる" close: "Schließen"
desktop/views/components/game-window.vue: desktop/views/components/game-window.vue:
game: "オセロ" game: "オセロ"
desktop/views/components/home.vue: desktop/views/components/home.vue:
done: "完了" done: "Verbunden"
add-widget: "ウィジェットを追加:" add-widget: "Widget hinzufügen:"
add: "Hinzufügen" add: "Hinzufügen"
desktop/views/input-dialog.vue: desktop/views/input-dialog.vue:
cancel: "Abbrechen" cancel: "Abbrechen"
@@ -339,9 +339,9 @@ desktop/views/components/messaging-window.vue:
title: "Nachrichten" title: "Nachrichten"
desktop/views/components/note-detail.vue: desktop/views/components/note-detail.vue:
more: "Lade weitere Konversationen" more: "Lade weitere Konversationen"
private: "この投稿は非公開です" private: "Dieser Post ist privat"
deleted: "この投稿は削除されました" deleted: "Dieser Beitrag wurde entfernt"
reposted-by: "{}がRenote" reposted-by: "Repostet von {}"
location: "Ort" location: "Ort"
renote: "Anmerkung" renote: "Anmerkung"
add-reaction: "Reaktion hinzufügen" add-reaction: "Reaktion hinzufügen"
@@ -351,8 +351,8 @@ desktop/views/components/notes.note.vue:
renote: "Anmerken" renote: "Anmerken"
add-reaction: "Eine Reaktion hinzufügen" add-reaction: "Eine Reaktion hinzufügen"
detail: "Zeige Details" detail: "Zeige Details"
private: "この投稿は非公開です" private: "Dieser Beitrag ist eine privat"
deleted: "この投稿は削除されました" deleted: "Dieser Beitrag wurde entfernt"
desktop/views/components/notes.vue: desktop/views/components/notes.vue:
error: "Laden fehlgeschlagen." error: "Laden fehlgeschlagen."
retry: "Erneut versuchen" retry: "Erneut versuchen"
@@ -393,34 +393,34 @@ desktop/views/components/renote-form.vue:
success: "Weitergesagt!" success: "Weitergesagt!"
failure: "Weitersagen fehlgeschlagen" failure: "Weitersagen fehlgeschlagen"
desktop/views/components/renote-form-window.vue: desktop/views/components/renote-form-window.vue:
title: "この投稿をRenoteしますか" title: "Bist du dir sicher, dass du das reposten willst?"
desktop/views/components/settings-window.vue: desktop/views/components/settings-window.vue:
settings: "設定" settings: "Experimentelles"
desktop/views/components/settings.vue: desktop/views/components/settings.vue:
profile: "プロフィール" profile: "プロフィール"
notification: "通知" notification: "Mitteilungen"
apps: "アプリ" apps: "In App öffnen"
mute: "ミュート" mute: "Stummschalten"
drive: "ドライブ" drive: "Dateien vom Drive anfügen"
security: "セキュリティ" security: "セキュリティ"
signin: "サインイン履歴" signin: "サインイン履歴"
password: "パスワード" password: "パスワード"
2fa: "二段階認証" 2fa: "二段階認証"
other: "その他" other: "その他"
license: "ライセンス" license: "ライセンス"
behaviour: "動作" behaviour: "Verhalten"
fetch-on-scroll: "スクロールで自動読み込み" fetch-on-scroll: "スクロールで自動読み込み"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト" auto-popout: "ウィンドウの自動ポップアウト"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "詳細設定" advanced: "Erweiterte Einstellungen"
api-via-stream: "ストリームを経由したAPIリクエスト" api-via-stream: "API-Anfrage via stream"
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。" api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "デザインと表示" display: "Erscheinungsbild und Anzeige"
customize: "ホームをカスタマイズ" customize: "Startseite anpassen"
dark-mode: "ダークモード" dark-mode: "Nacht Modus"
circle-icons: "円形のアイコンを使用" circle-icons: "Kreisförmige Icons"
gradient-window-header: "ウィンドウのタイトルバーにグラデーションを使用" gradient-window-header: "Übergang in Fensterköpfen"
post-form-on-timeline: "タイムライン上部に投稿フォームを表示する" post-form-on-timeline: "タイムライン上部に投稿フォームを表示する"
show-reply-target: "リプライ先を表示する" show-reply-target: "リプライ先を表示する"
show-my-renotes: "自分の行ったRenoteをタイムラインに表示する" show-my-renotes: "自分の行ったRenoteをタイムラインに表示する"
@@ -432,12 +432,12 @@ desktop/views/components/settings.vue:
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。" enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
volume: "ボリューム" volume: "ボリューム"
test: "テスト" test: "テスト"
mobile: "モバイル" mobile: "Mobil"
disable-via-mobile: "「モバイルからの投稿」フラグを付けない" disable-via-mobile: "Diesen Beitrag nicht mit 'vom Handy' absenden"
language: "言語" language: "Sprache"
pick-language: "言語を選択" pick-language: "Sprache auswählen"
recommended: "推奨" recommended: "Empfohlen"
auto: "自動" auto: "Automatisch"
specify-language: "言語を指定" specify-language: "言語を指定"
language-desc: "変更はページの再度読み込み後に反映されます。" language-desc: "変更はページの再度読み込み後に反映されます。"
cache: "キャッシュ" cache: "キャッシュ"
@@ -563,7 +563,7 @@ desktop/views/components/users-list.vue:
all: "すべて" all: "すべて"
iknow: "知り合い" iknow: "知り合い"
load-more: "もっと" load-more: "もっと"
fetching: "読み込んでいます" fetching: "Lade…"
desktop/views/components/users-list-item.vue: desktop/views/components/users-list-item.vue:
followed: "フォローされています" followed: "フォローされています"
desktop/views/components/window.vue: desktop/views/components/window.vue:
@@ -685,7 +685,7 @@ mobile/views/components/follow-button.vue:
mobile/views/components/friends-maker.vue: mobile/views/components/friends-maker.vue:
title: "気になるユーザーをフォロー" title: "気になるユーザーをフォロー"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "おすすめのユーザーは見つかりませんでした。"
fetching: "読み込んでいます" fetching: "Lade…"
refresh: "もっと見る" refresh: "もっと見る"
close: "閉じる" close: "閉じる"
mobile/views/components/note.vue: mobile/views/components/note.vue:

View File

@@ -5,7 +5,7 @@ meta:
common: common:
misskey: "Une planète du fédiverse" misskey: "Une planète du fédiverse"
about-title: "Une ⭐ du fédiverse." about-title: "Une ⭐ du fédiverse."
about: "Misskeyを見つけていただき、ありがとうございます。Misskeyは、地球で生まれた<b>分散マイクロブログSNS</b>です。Fediverse(様々なSNSで構成される宇宙)の中に存在するため、他のSNSと相互に繋がっています。暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。" about: "Merci d'avoir découvert Misskey. Misskey est une <b>plateforme de micro-blogging distribuée</b> née sur Terre. Parce qu'il fait partie du Fédiverse (un univers composé de diverses plateformes de réseaux sociaux organisées), il est mutuellement connecté avec d'autres plateformes de réseaux sociaux. Désirez-vous prendre une pause, pendant un instant, loin de l'agitation de la ville et plonger dans un nouvel Internet ?"
time: time:
unknown: "inconnu" unknown: "inconnu"
future: "future" future: "future"
@@ -24,7 +24,7 @@ common:
wednesday: "M" wednesday: "M"
thursday: "J" thursday: "J"
friday: "V" friday: "V"
saturday: "" saturday: "S"
reactions: reactions:
like: "Aime" like: "Aime"
love: "Adore" love: "Adore"
@@ -78,13 +78,13 @@ common:
list: "Liste" list: "Liste"
swap-left: "Déplacer à gauche" swap-left: "Déplacer à gauche"
swap-right: "Déplacer à droite" swap-right: "Déplacer à droite"
swap-up: "上に移動" swap-up: "Vers le haut"
swap-down: "下に移動" swap-down: "Vers le bas"
remove: "Supprimer" remove: "Supprimer"
add-column: "Ajouter une colonne" add-column: "Ajouter une colonne"
rename: "Renommer" rename: "Renommer"
stack-left: "左に重ねる" stack-left: "Vers la gauche"
pop-right: "右に出す" pop-right: "Vers la droite"
common/views/components/connect-failed.vue: common/views/components/connect-failed.vue:
title: "Impossible de se connecter au server." title: "Impossible de se connecter au server."
description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard." description: "Il y a soit un problème avec votre connexion internet, soit le serveur est hors-ligne ou en maintenance. Veuillez {ressayer} plus tard."
@@ -308,7 +308,7 @@ desktop/views/components/drive.vue:
desktop/views/components/follow-button.vue: desktop/views/components/follow-button.vue:
following: "Abonnements" following: "Abonnements"
follow: "Suivre" follow: "Suivre"
request-pending: "フォロー許可待ち" request-pending: "En attente d'approbation"
follow-request: "Demande d'abonnement" follow-request: "Demande d'abonnement"
desktop/views/components/followers-window.vue: desktop/views/components/followers-window.vue:
followers: "{} abonnés" followers: "{} abonnés"
@@ -320,7 +320,7 @@ desktop/views/components/following.vue:
empty: "Vous ne suivez aucun compte." empty: "Vous ne suivez aucun compte."
desktop/views/components/friends-maker.vue: desktop/views/components/friends-maker.vue:
title: "Utilisateurs recommandés :" title: "Utilisateurs recommandés :"
empty: "おすすめのユーザーは見つかりませんでした。" empty: "Impossible de trouver des utilisateurs à recommander."
fetching: "Chargement" fetching: "Chargement"
refresh: "Plus" refresh: "Plus"
close: "Fermer" close: "Fermer"
@@ -411,7 +411,7 @@ desktop/views/components/settings.vue:
behaviour: "Comportement" behaviour: "Comportement"
fetch-on-scroll: "Chargement lors du défilement" fetch-on-scroll: "Chargement lors du défilement"
fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。" fetch-on-scroll-desc: "ページを下までスクロールしたときに自動で追加のコンテンツを読み込みます。"
auto-popout: "ウィンドウの自動ポップアウト" auto-popout: "Fenêtre contextuelle automatique"
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。" auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
advanced: "Paramètres avancés" advanced: "Paramètres avancés"
api-via-stream: "Requête API via le flux" api-via-stream: "Requête API via le flux"
@@ -810,7 +810,7 @@ mobile/views/pages/selectdrive.vue:
mobile/views/pages/settings.vue: mobile/views/pages/settings.vue:
signed-in-as: "Connecté en tant que {}" signed-in-as: "Connecté en tant que {}"
lang: "Langue" lang: "Langue"
lang-tip: "変更はページの再読み込み後に反映されます。" lang-tip: "Le rechargement de la page est requis afin d'appliquer les modifications."
recommended: "Recommandé" recommended: "Recommandé"
auto: "Automatique" auto: "Automatique"
specify-language: "Spécifier la langue" specify-language: "Spécifier la langue"

View File

@@ -78,8 +78,8 @@ common:
list: "Listy" list: "Listy"
swap-left: "Przesuń w lewo" swap-left: "Przesuń w lewo"
swap-right: "Przesuń w prawo" swap-right: "Przesuń w prawo"
swap-up: "上に移動" swap-up: "Przenieś w górę"
swap-down: "下に移動" swap-down: "Przenieś w dół"
remove: "Usuń" remove: "Usuń"
add-column: "Dodaj kolumnę" add-column: "Dodaj kolumnę"
rename: "Zmień nazwę" rename: "Zmień nazwę"
@@ -539,7 +539,7 @@ desktop/views/components/ui.header.account.vue:
dark: "Sprowadź ciemność" dark: "Sprowadź ciemność"
desktop/views/components/ui.header.nav.vue: desktop/views/components/ui.header.nav.vue:
home: "Strona główna" home: "Strona główna"
deck: "デッキ" deck: "Talia"
messaging: "Wiadomości" messaging: "Wiadomości"
game: "Gra" game: "Gra"
desktop/views/components/ui.header.notifications.vue: desktop/views/components/ui.header.notifications.vue:

View File

@@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "2.30.0", "version": "2.32.0",
"clientVersion": "1.0.6253", "clientVersion": "1.0.6285",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,

View File

@@ -4,7 +4,7 @@
<div class="popover" :class="{ hukidasi }" ref="popover"> <div class="popover" :class="{ hukidasi }" ref="popover">
<template v-for="item in items"> <template v-for="item in items">
<div v-if="item === null"></div> <div v-if="item === null"></div>
<button v-if="item" @click="clicked(item.onClick)" v-html="item.content"></button> <button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text"></button>
</template> </template>
</div> </div>
</div> </div>

View File

@@ -13,23 +13,23 @@ export default Vue.extend({
items() { items() {
const items = []; const items = [];
items.push({ items.push({
content: '%i18n:@favorite%', text: '%i18n:@favorite%',
onClick: this.favorite action: this.favorite
}); });
if (this.note.userId == this.$store.state.i.id) { if (this.note.userId == this.$store.state.i.id) {
items.push({ items.push({
content: '%i18n:@pin%', text: '%i18n:@pin%',
onClick: this.pin action: this.pin
}); });
items.push({ items.push({
content: '%i18n:@delete%', text: '%i18n:@delete%',
onClick: this.del action: this.del
}); });
} }
if (this.note.uri) { if (this.note.uri) {
items.push({ items.push({
content: '%i18n:@remote%', text: '%i18n:@remote%',
onClick: () => { action: () => {
window.open(this.note.uri, '_blank'); window.open(this.note.uri, '_blank');
} }
}); });

View File

@@ -1,15 +1,17 @@
<template> <template>
<ul class="menu"> <ul class="menu">
<li v-for="(item, i) in menu" :class="item.type"> <li v-for="(item, i) in menu" :class="item ? item.type : item === null ? 'divider' : null">
<template v-if="item.type == 'item'"> <template v-if="item">
<p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p> <template v-if="item.type == null || item.type == 'item'">
</template> <p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p>
<template v-if="item.type == 'link'"> </template>
<a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a> <template v-else-if="item.type == 'link'">
</template> <a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a>
<template v-else-if="item.type == 'nest'"> </template>
<p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p> <template v-else-if="item.type == 'nest'">
<me-nu :menu="item.menu" @x="click"/> <p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p>
<me-nu :menu="item.menu" @x="click"/>
</template>
</template> </template>
</li> </li>
</ul> </ul>

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="context-menu" :style="{ left: `${x}px`, top: `${y}px` }" @contextmenu.prevent="() => {}"> <div class="context-menu" @contextmenu.prevent="() => {}">
<x-menu :menu="menu" @x="click"/> <x-menu :menu="menu" @x="click"/>
</div> </div>
</template> </template>
@@ -17,6 +17,23 @@ export default Vue.extend({
props: ['x', 'y', 'menu'], props: ['x', 'y', 'menu'],
mounted() { mounted() {
this.$nextTick(() => { this.$nextTick(() => {
const width = this.$el.offsetWidth;
const height = this.$el.offsetHeight;
let x = this.x;
let y = this.y;
if (x + width > window.innerWidth) {
x = window.innerWidth - width;
}
if (y + height > window.innerHeight) {
y = window.innerHeight - height;
}
this.$el.style.left = x + 'px';
this.$el.style.top = y + 'px';
Array.from(document.querySelectorAll('body *')).forEach(el => { Array.from(document.querySelectorAll('body *')).forEach(el => {
el.addEventListener('mousedown', this.onMousedown); el.addEventListener('mousedown', this.onMousedown);
}); });
@@ -38,7 +55,7 @@ export default Vue.extend({
return false; return false;
}, },
click(item) { click(item) {
if (item.onClick) item.onClick(); if (item.action) item.action();
this.close(); this.close();
}, },
close() { close() {
@@ -59,7 +76,6 @@ root(isDark)
$item-height = 38px $item-height = 38px
$padding = 10px $padding = 10px
display none
position fixed position fixed
top 0 top 0
left 0 left 0

View File

@@ -66,37 +66,33 @@ export default Vue.extend({
type: 'item', type: 'item',
text: '%i18n:@contextmenu.rename%', text: '%i18n:@contextmenu.rename%',
icon: '%fa:i-cursor%', icon: '%fa:i-cursor%',
onClick: this.rename action: 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 action: 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%',
}, { }, null, {
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 action: this.deleteFile
}, { }, null, {
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 action: this.setAsAvatar
}, { }, {
type: 'item', type: 'item',
text: '%i18n:@contextmenu.set-as-banner%', text: '%i18n:@contextmenu.set-as-banner%',
onClick: this.setAsBanner action: this.setAsBanner
}] }]
}, { }, {
type: 'nest', type: 'nest',
@@ -104,7 +100,7 @@ export default Vue.extend({
menu: [{ menu: [{
type: 'item', type: 'item',
text: '%i18n:@contextmenu.add-app%...', text: '%i18n:@contextmenu.add-app%...',
onClick: this.addApp action: this.addApp
}] }]
}], { }], {
closed: () => { closed: () => {

View File

@@ -56,26 +56,22 @@ export default Vue.extend({
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 action: 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 action: this.newWindow
}, { }, null, {
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 action: this.rename
}, { }, null, {
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 action: this.deleteFolder
}], { }], {
closed: () => { closed: () => {
this.isContextmenuShowing = false; this.isContextmenuShowing = false;

View File

@@ -140,17 +140,17 @@ export default Vue.extend({
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 action: this.createFolder
}, { }, {
type: 'item', type: 'item',
text: '%i18n:@contextmenu.upload%', text: '%i18n:@contextmenu.upload%',
icon: '%fa:upload%', icon: '%fa:upload%',
onClick: this.selectLocalFile action: 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 action: this.urlUpload
}]); }]);
}, },

View File

@@ -1,10 +1,10 @@
<template> <template>
<x-widgets-column v-if="column.type == 'widgets'"/> <x-widgets-column v-if="column.type == 'widgets'" :column="column" :is-stacked="isStacked"/>
<x-notifications-column v-else-if="column.type == 'notifications'"/> <x-notifications-column v-else-if="column.type == 'notifications'" :column="column" :is-stacked="isStacked"/>
<x-tl-column v-else-if="column.type == 'home'"/> <x-tl-column v-else-if="column.type == 'home'" :column="column" :is-stacked="isStacked"/>
<x-tl-column v-else-if="column.type == 'local'"/> <x-tl-column v-else-if="column.type == 'local'" :column="column" :is-stacked="isStacked"/>
<x-tl-column v-else-if="column.type == 'global'"/> <x-tl-column v-else-if="column.type == 'global'" :column="column" :is-stacked="isStacked"/>
<x-tl-column v-else-if="column.type == 'list'"/> <x-tl-column v-else-if="column.type == 'list'" :column="column" :is-stacked="isStacked"/>
</template> </template>
<script lang="ts"> <script lang="ts">
@@ -29,20 +29,7 @@ export default Vue.extend({
type: Boolean, type: Boolean,
required: false, required: false,
default: false default: false
},
isActive: {
type: Boolean,
required: false,
default: true
} }
},
provide() {
return {
column: this.column,
isStacked: this.isStacked,
isActive: this.isActive
};
} }
}); });
</script> </script>

View File

@@ -1,11 +1,22 @@
<template> <template>
<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, isActive, isStacked }"> <div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging, dropready }"
<header :class="{ indicate: count > 0 }" @click="toggleActive"> @dragover.prevent.stop="onDragover"
@dragenter.prevent="onDragenter"
@dragleave="onDragleave"
@drop.prevent.stop="onDrop"
>
<header :class="{ indicate: count > 0 }"
draggable="true"
@click="toggleActive"
@dragstart="onDragstart"
@dragend="onDragend"
@contextmenu.prevent.stop="onContextmenu"
>
<slot name="header"></slot> <slot name="header"></slot>
<span class="count" v-if="count > 0">({{ count }})</span> <span class="count" v-if="count > 0">({{ count }})</span>
<button ref="menu" @click.stop="showMenu">%fa:caret-down%</button> <button ref="menu" @click.stop="showMenu">%fa:caret-down%</button>
</header> </header>
<div ref="body" v-show="isActive"> <div ref="body" v-show="active">
<slot></slot> <slot></slot>
</div> </div>
</div> </div>
@@ -14,9 +25,18 @@
<script lang="ts"> <script lang="ts">
import Vue from 'vue'; import Vue from 'vue';
import Menu from '../../../../common/views/components/menu.vue'; import Menu from '../../../../common/views/components/menu.vue';
import contextmenu from '../../../api/contextmenu';
export default Vue.extend({ export default Vue.extend({
props: { props: {
column: {
type: Object,
required: true
},
isStacked: {
type: Boolean,
required: true
},
name: { name: {
type: String, type: String,
required: false required: false
@@ -39,24 +59,27 @@ export default Vue.extend({
}, },
inject: { inject: {
column: { from: 'column' },
_isActive: { from: 'isActive' },
isStacked: { from: 'isStacked' },
getColumnVm: { from: 'getColumnVm' } getColumnVm: { from: 'getColumnVm' }
}, },
data() { data() {
return { return {
count: 0, count: 0,
isActive: this._isActive active: true,
dragging: false,
draghover: false,
dropready: false
}; };
}, },
watch: { watch: {
isActive(v) { active(v) {
if (v && this.isScrollTop()) { if (v && this.isScrollTop()) {
this.$emit('top'); this.$emit('top');
} }
},
dragging(v) {
this.$root.$emit(v ? 'deck.column.dragStart' : 'deck.column.dragEnd');
} }
}, },
@@ -70,21 +93,34 @@ export default Vue.extend({
mounted() { mounted() {
this.$refs.body.addEventListener('scroll', this.onScroll, { passive: true }); this.$refs.body.addEventListener('scroll', this.onScroll, { passive: true });
this.$root.$on('deck.column.dragStart', this.onOtherDragStart);
this.$root.$on('deck.column.dragEnd', this.onOtherDragEnd);
}, },
beforeDestroy() { beforeDestroy() {
this.$refs.body.removeEventListener('scroll', this.onScroll); this.$refs.body.removeEventListener('scroll', this.onScroll);
this.$root.$off('deck.column.dragStart', this.onOtherDragStart);
this.$root.$off('deck.column.dragEnd', this.onOtherDragEnd);
}, },
methods: { methods: {
onOtherDragStart() {
this.dropready = true;
},
onOtherDragEnd() {
this.dropready = false;
},
toggleActive() { toggleActive() {
if (!this.isStacked) return; if (!this.isStacked) return;
const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id)); const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id));
if (this.isActive && vms.filter(vm => vm.$el.classList.contains('isActive')).length == 1) return; if (this.active && vms.filter(vm => vm.$el.classList.contains('active')).length == 1) return;
this.isActive = !this.isActive; this.active = !this.active;
}, },
isScrollTop() { isScrollTop() {
return this.isActive && this.$refs.body.scrollTop == 0; return this.active && this.$refs.body.scrollTop == 0;
}, },
onScroll() { onScroll() {
@@ -98,10 +134,11 @@ export default Vue.extend({
} }
}, },
showMenu() { getMenu() {
const items = [{ const items = [{
content: '%fa:pencil-alt% %i18n:common.deck.rename%', icon: '%fa:pencil-alt%',
onClick: () => { text: '%i18n:common.deck.rename%',
action: () => {
(this as any).apis.input({ (this as any).apis.input({
title: '%i18n:common.deck.rename%', title: '%i18n:common.deck.rename%',
default: this.name, default: this.name,
@@ -111,38 +148,45 @@ export default Vue.extend({
}); });
} }
}, null, { }, null, {
content: '%fa:arrow-left% %i18n:common.deck.swap-left%', icon: '%fa:arrow-left%',
onClick: () => { text: '%i18n:common.deck.swap-left%',
action: () => {
this.$store.dispatch('settings/swapLeftDeckColumn', this.column.id); this.$store.dispatch('settings/swapLeftDeckColumn', this.column.id);
} }
}, { }, {
content: '%fa:arrow-right% %i18n:common.deck.swap-right%', icon: '%fa:arrow-right%',
onClick: () => { text: '%i18n:common.deck.swap-right%',
action: () => {
this.$store.dispatch('settings/swapRightDeckColumn', this.column.id); this.$store.dispatch('settings/swapRightDeckColumn', this.column.id);
} }
}, this.isStacked ? { }, this.isStacked ? {
content: '%fa:arrow-up% %i18n:common.deck.swap-up%', icon: '%fa:arrow-up%',
onClick: () => { text: '%i18n:common.deck.swap-up%',
action: () => {
this.$store.dispatch('settings/swapUpDeckColumn', this.column.id); this.$store.dispatch('settings/swapUpDeckColumn', this.column.id);
} }
} : undefined, this.isStacked ? { } : undefined, this.isStacked ? {
content: '%fa:arrow-down% %i18n:common.deck.swap-down%', icon: '%fa:arrow-down%',
onClick: () => { text: '%i18n:common.deck.swap-down%',
action: () => {
this.$store.dispatch('settings/swapDownDeckColumn', this.column.id); this.$store.dispatch('settings/swapDownDeckColumn', this.column.id);
} }
} : undefined, null, { } : undefined, null, {
content: '%fa:window-restore R% %i18n:common.deck.stack-left%', icon: '%fa:window-restore R%',
onClick: () => { text: '%i18n:common.deck.stack-left%',
action: () => {
this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id); this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id);
} }
}, this.isStacked ? { }, this.isStacked ? {
content: '%fa:window-maximize R% %i18n:common.deck.pop-right%', icon: '%fa:window-maximize R%',
onClick: () => { text: '%i18n:common.deck.pop-right%',
action: () => {
this.$store.dispatch('settings/popRightDeckColumn', this.column.id); this.$store.dispatch('settings/popRightDeckColumn', this.column.id);
} }
} : undefined, null, { } : undefined, null, {
content: '%fa:trash-alt R% %i18n:common.deck.remove%', icon: '%fa:trash-alt R%',
onClick: () => { text: '%i18n:common.deck.remove%',
action: () => {
this.$store.dispatch('settings/removeDeckColumn', this.column.id); this.$store.dispatch('settings/removeDeckColumn', this.column.id);
} }
}]; }];
@@ -152,11 +196,63 @@ export default Vue.extend({
this.menu.reverse().forEach(i => items.unshift(i)); this.menu.reverse().forEach(i => items.unshift(i));
} }
return items;
},
onContextmenu(e) {
contextmenu((this as any).os)(e, this.getMenu());
},
showMenu() {
this.os.new(Menu, { this.os.new(Menu, {
source: this.$refs.menu, source: this.$refs.menu,
compact: false, compact: false,
items items: this.getMenu()
}); });
},
onDragstart(e) {
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('mk-deck-column', this.column.id);
this.dragging = true;
},
onDragend(e) {
this.dragging = false;
},
onDragover(e) {
// 自分自身がドラッグされている場合
if (this.dragging) {
// 自分自身にはドロップさせない
e.dataTransfer.dropEffect = 'none';
return;
}
const isDeckColumn = e.dataTransfer.types[0] == 'mk-deck-column';
e.dataTransfer.dropEffect = isDeckColumn ? 'move' : 'none';
},
onDragenter() {
if (!this.dragging) this.draghover = true;
},
onDragleave() {
this.draghover = false;
},
onDrop(e) {
this.draghover = false;
this.$root.$emit('deck.column.dragEnd');
const id = e.dataTransfer.getData('mk-deck-column');
if (id != null && id != '') {
this.$store.dispatch('settings/swapDeckColumn', {
a: this.column.id,
b: id
});
}
} }
} }
}); });
@@ -176,7 +272,17 @@ root(isDark)
box-shadow 0 2px 16px rgba(#000, 0.1) box-shadow 0 2px 16px rgba(#000, 0.1)
overflow hidden overflow hidden
&:not(.isActive) &.draghover
box-shadow 0 0 0 2px rgba($theme-color, 0.8)
&.dragging
box-shadow 0 0 0 2px rgba($theme-color, 0.4)
&.dropready
*
pointer-events none
&:not(.active)
flex-basis $header-height flex-basis $header-height
min-height $header-height min-height $header-height
@@ -203,10 +309,14 @@ root(isDark)
color isDark ? #e3e5e8 : #888 color isDark ? #e3e5e8 : #888
background isDark ? #313543 : #fff background isDark ? #313543 : #fff
box-shadow 0 1px rgba(#000, 0.15) box-shadow 0 1px rgba(#000, 0.15)
cursor pointer
&, * &, *
user-select none user-select none
*:not(button)
pointer-events none
&.indicate &.indicate
box-shadow 0 3px 0 0 $theme-color box-shadow 0 3px 0 0 $theme-color
@@ -224,6 +334,7 @@ root(isDark)
right 0 right 0
width $header-height width $header-height
line-height $header-height line-height $header-height
font-size 16px
color isDark ? #9baec8 : #ccc color isDark ? #9baec8 : #ccc
&:hover &:hover

View File

@@ -1,5 +1,5 @@
<template> <template>
<x-column :name="name"> <x-column :name="name" :column="column" :is-stacked="isStacked">
<span slot="header">%fa:bell R%{{ name }}</span> <span slot="header">%fa:bell R%{{ name }}</span>
<x-notifications/> <x-notifications/>
@@ -17,7 +17,16 @@ export default Vue.extend({
XNotifications XNotifications
}, },
inject: ['column'], props: {
column: {
type: Object,
required: true
},
isStacked: {
type: Boolean,
required: true
}
},
computed: { computed: {
name(): string { name(): string {

View File

@@ -1,5 +1,5 @@
<template> <template>
<x-column :menu="menu" :name="name"> <x-column :menu="menu" :name="name" :column="column" :is-stacked="isStacked">
<span slot="header"> <span slot="header">
<template v-if="column.type == 'home'">%fa:home%</template> <template v-if="column.type == 'home'">%fa:home%</template>
<template v-if="column.type == 'local'">%fa:R comments%</template> <template v-if="column.type == 'local'">%fa:R comments%</template>
@@ -30,14 +30,24 @@ export default Vue.extend({
XListTl XListTl
}, },
inject: ['column'], props: {
column: {
type: Object,
required: true
},
isStacked: {
type: Boolean,
required: true
}
},
data() { data() {
return { return {
edit: false, edit: false,
menu: [{ menu: [{
content: '%fa:cog% %i18n:@edit%', icon: '%fa:cog%',
onClick: () => { text: '%i18n:@edit%',
action: () => {
this.edit = !this.edit; this.edit = !this.edit;
} }
}] }]

View File

@@ -4,7 +4,7 @@
<template v-for="ids in layout"> <template v-for="ids in layout">
<div v-if="ids.length > 1" class="folder"> <div v-if="ids.length > 1" class="folder">
<template v-for="id, i in ids"> <template v-for="id, i in ids">
<x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true" :is-active="i == 0"/> <x-column-core :ref="id" :key="id" :column="columns.find(c => c.id == id)" :is-stacked="true"/>
</template> </template>
</div> </div>
<x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])"/> <x-column-core v-else :ref="ids[0]" :key="ids[0]" :column="columns.find(c => c.id == ids[0])"/>
@@ -102,32 +102,36 @@ export default Vue.extend({
source: this.$refs.add, source: this.$refs.add,
compact: true, compact: true,
items: [{ items: [{
content: '%i18n:common.deck.home%', icon: '%fa:home%',
onClick: () => { text: '%i18n:common.deck.home%',
action: () => {
this.$store.dispatch('settings/addDeckColumn', { this.$store.dispatch('settings/addDeckColumn', {
id: uuid(), id: uuid(),
type: 'home' type: 'home'
}); });
} }
}, { }, {
content: '%i18n:common.deck.local%', icon: '%fa:comments R%',
onClick: () => { text: '%i18n:common.deck.local%',
action: () => {
this.$store.dispatch('settings/addDeckColumn', { this.$store.dispatch('settings/addDeckColumn', {
id: uuid(), id: uuid(),
type: 'local' type: 'local'
}); });
} }
}, { }, {
content: '%i18n:common.deck.global%', icon: '%fa:globe%',
onClick: () => { text: '%i18n:common.deck.global%',
action: () => {
this.$store.dispatch('settings/addDeckColumn', { this.$store.dispatch('settings/addDeckColumn', {
id: uuid(), id: uuid(),
type: 'global' type: 'global'
}); });
} }
}, { }, {
content: '%i18n:common.deck.list%', icon: '%fa:list%',
onClick: () => { text: '%i18n:common.deck.list%',
action: () => {
const w = (this as any).os.new(MkUserListsWindow); const w = (this as any).os.new(MkUserListsWindow);
w.$once('choosen', list => { w.$once('choosen', list => {
this.$store.dispatch('settings/addDeckColumn', { this.$store.dispatch('settings/addDeckColumn', {
@@ -139,16 +143,18 @@ export default Vue.extend({
}); });
} }
}, { }, {
content: '%i18n:common.deck.notifications%', icon: '%fa:bell R%',
onClick: () => { text: '%i18n:common.deck.notifications%',
action: () => {
this.$store.dispatch('settings/addDeckColumn', { this.$store.dispatch('settings/addDeckColumn', {
id: uuid(), id: uuid(),
type: 'notifications' type: 'notifications'
}); });
} }
}, { }, {
content: '%i18n:common.deck.widgets%', icon: '%fa:calculator%',
onClick: () => { text: '%i18n:common.deck.widgets%',
action: () => {
this.$store.dispatch('settings/addDeckColumn', { this.$store.dispatch('settings/addDeckColumn', {
id: uuid(), id: uuid(),
type: 'widgets', type: 'widgets',

View File

@@ -1,5 +1,5 @@
<template> <template>
<x-column :menu="menu" :naked="true" :narrow="true" :name="name" class="wtdtxvecapixsepjtcupubtsmometobz"> <x-column :menu="menu" :naked="true" :narrow="true" :name="name" :column="column" :is-stacked="isStacked" class="wtdtxvecapixsepjtcupubtsmometobz">
<span slot="header">%fa:calculator%{{ name }}</span> <span slot="header">%fa:calculator%{{ name }}</span>
<div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq"> <div class="gqpwvtwtprsbmnssnbicggtwqhmylhnq">
@@ -64,7 +64,16 @@ export default Vue.extend({
XDraggable XDraggable
}, },
inject: ['column'], props: {
column: {
type: Object,
required: true
},
isStacked: {
type: Boolean,
required: true
}
},
data() { data() {
return { return {
@@ -83,8 +92,9 @@ export default Vue.extend({
created() { created() {
this.menu = [{ this.menu = [{
content: '%fa:cog% %i18n:@edit%', icon: '%fa:cog%',
onClick: () => { text: '%i18n:@edit%',
action: () => {
this.edit = !this.edit; this.edit = !this.edit;
} }
}]; }];

View File

@@ -182,6 +182,17 @@ export default (os: MiOS) => new Vuex.Store({
state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id)); state.deck.layout = state.deck.layout.map(ids => ids.filter(x => x != id));
}, },
swapDeckColumn(state, x) {
const a = x.a;
const b = x.b;
const aX = state.deck.layout.findIndex(ids => ids.indexOf(a) != -1);
const aY = state.deck.layout[aX].findIndex(id => id == a);
const bX = state.deck.layout.findIndex(ids => ids.indexOf(b) != -1);
const bY = state.deck.layout[bX].findIndex(id => id == b);
state.deck.layout[aX][aY] = b;
state.deck.layout[bX][bY] = a;
},
swapLeftDeckColumn(state, id) { swapLeftDeckColumn(state, id) {
state.deck.layout.some((ids, i) => { state.deck.layout.some((ids, i) => {
if (ids.indexOf(id) != -1) { if (ids.indexOf(id) != -1) {
@@ -306,6 +317,11 @@ export default (os: MiOS) => new Vuex.Store({
ctx.dispatch('saveDeck'); ctx.dispatch('saveDeck');
}, },
swapDeckColumn(ctx, id) {
ctx.commit('swapDeckColumn', id);
ctx.dispatch('saveDeck');
},
swapLeftDeckColumn(ctx, id) { swapLeftDeckColumn(ctx, id) {
ctx.commit('swapLeftDeckColumn', id); ctx.commit('swapLeftDeckColumn', id);
ctx.dispatch('saveDeck'); ctx.dispatch('saveDeck');