Compare commits

..

142 Commits

Author SHA1 Message Date
syuilo
de55794761 4.15.0 2018-06-28 16:24:55 +09:00
syuilo
a23ef386ea Fix bug 2018-06-28 16:21:35 +09:00
syuilo
572aa662f6 Merge pull request #1793 from syuilo/l10n_master
New Crowdin translations
2018-06-28 13:54:58 +09:00
syuilo
8b10bee881 Merge pull request #1807 from syuilo/greenkeeper/@types/webpack-4.4.4
Update @types/webpack to the latest version 🚀
2018-06-28 13:51:39 +09:00
syuilo
f492458d85 Merge pull request #1802 from syuilo/greenkeeper/@types/node-10.5.0
Update @types/node to the latest version 🚀
2018-06-28 13:51:32 +09:00
syuilo
d2289039d6 Merge pull request #1801 from syuilo/greenkeeper/@types/mongodb-3.0.22
Update @types/mongodb to the latest version 🚀
2018-06-28 13:51:20 +09:00
greenkeeper[bot]
019fbf5268 fix(package): update @types/webpack to version 4.4.4 2018-06-28 00:39:26 +00:00
syuilo
8d7b04b0e2 New translations ja.yml (English) 2018-06-28 08:20:54 +09:00
syuilo
6e1f8d0533 New translations ja.yml (English) 2018-06-28 06:40:49 +09:00
syuilo
b412d2a30a New translations ja.yml (French) 2018-06-28 06:31:00 +09:00
syuilo
cbd9f57468 New translations ja.yml (English) 2018-06-28 05:23:19 +09:00
syuilo
2e0ee21964 New translations ja.yml (English) 2018-06-28 05:11:06 +09:00
greenkeeper[bot]
24b20b8d32 fix(package): update @types/node to version 10.5.0 2018-06-27 18:36:19 +00:00
greenkeeper[bot]
d1843e2e27 fix(package): update @types/mongodb to version 3.0.22 2018-06-27 18:24:42 +00:00
syuilo
30e7aa23d8 New translations ja.yml (Polish) 2018-06-28 03:10:50 +09:00
syuilo
9f5c22e7c2 New translations ja.yml (English) 2018-06-28 02:50:57 +09:00
syuilo
4f88739b01 New translations ja.yml (English) 2018-06-28 02:41:14 +09:00
syuilo
18c50c82bc New translations ja.yml (English) 2018-06-28 02:31:00 +09:00
syuilo
0b87b16cba New translations ja.yml (English) 2018-06-28 02:20:49 +09:00
syuilo
d454cf7493 New translations ja.yml (English) 2018-06-28 02:11:01 +09:00
syuilo
66e5b36d16 New translations ja.yml (English) 2018-06-28 02:01:15 +09:00
syuilo
f582cd5c71 New translations ja.yml (English) 2018-06-28 01:51:01 +09:00
syuilo
bf731897a3 New translations ja.yml (English) 2018-06-28 01:41:33 +09:00
syuilo
a823792d8d New translations ja.yml (English) 2018-06-28 01:31:12 +09:00
syuilo
9e894dfd55 New translations ja.yml (English) 2018-06-28 01:29:28 +09:00
syuilo
bd90ebeafd Merge pull request #1800 from syuilo/greenkeeper/typescript-eslint-parser-16.0.1
Update typescript-eslint-parser to the latest version 🚀
2018-06-27 23:20:00 +09:00
greenkeeper[bot]
ee12027739 fix(package): update typescript-eslint-parser to version 16.0.1 2018-06-27 13:50:04 +00:00
syuilo
e02f3558eb Merge pull request #1797 from syuilo/greenkeeper/webpack-4.12.2
Update webpack to the latest version 🚀
2018-06-27 22:30:03 +09:00
syuilo
f410e1c4fa Merge pull request #1799 from syuilo/greenkeeper/mongodb-3.1.0
Update mongodb to the latest version 🚀
2018-06-27 22:29:35 +09:00
greenkeeper[bot]
e41bc54d43 fix(package): update mongodb to version 3.1.0 2018-06-27 13:14:20 +00:00
greenkeeper[bot]
1599e06ffb fix(package): update webpack to version 4.12.2 2018-06-27 05:44:28 +00:00
syuilo
84c49a23c9 New translations ja.yml (French) 2018-06-27 09:20:47 +09:00
syuilo
95c94758cb New translations ja.yml (French) 2018-06-27 09:10:46 +09:00
syuilo
3bc5c5914b New translations ja.yml (English) 2018-06-27 04:20:49 +09:00
syuilo
69d2cd3b6d New translations ja.yml (English) 2018-06-27 04:11:12 +09:00
syuilo
4bca467bd3 New translations ja.yml (English) 2018-06-27 04:01:19 +09:00
syuilo
20061ae5a1 New translations ja.yml (English) 2018-06-27 03:51:28 +09:00
syuilo
78867c3cc9 New translations ja.yml (English) 2018-06-27 03:41:33 +09:00
syuilo
f8911cad32 New translations ja.yml (English) 2018-06-27 03:11:33 +09:00
syuilo
dd9a461cf5 New translations ja.yml (English) 2018-06-27 03:00:17 +09:00
syuilo
1516ce86f4 New translations ja.yml (English) 2018-06-27 02:39:35 +09:00
syuilo
58ab04f2f4 New translations ja.yml (English) 2018-06-27 02:21:32 +09:00
syuilo
3e651e3ea2 New translations ja.yml (English) 2018-06-27 02:01:28 +09:00
syuilo
b02c00eb41 New translations ja.yml (English) 2018-06-27 01:37:47 +09:00
syuilo
a9ee45d977 Merge pull request #1786 from syuilo/greenkeeper/element-ui-2.4.2
Update element-ui to the latest version 🚀
2018-06-27 01:23:18 +09:00
syuilo
156e66438a Merge pull request #1788 from syuilo/l10n_master
New Crowdin translations
2018-06-27 00:55:52 +09:00
syuilo
9ac34badad Merge branch 'master' into l10n_master 2018-06-27 00:55:44 +09:00
syuilo
fdf145657d Merge pull request #1789 from syuilo/greenkeeper/uuid-3.3.0
Update uuid to the latest version 🚀
2018-06-26 22:42:03 +09:00
syuilo
f93e0a624e New translations ja.yml (Portuguese) 2018-06-26 22:33:03 +09:00
syuilo
c8e3af32be New translations ja.yml (Korean) 2018-06-26 22:33:00 +09:00
syuilo
62b3a49b5f New translations ja.yml (Polish) 2018-06-26 22:32:58 +09:00
syuilo
be88eee8f6 New translations ja.yml (Chinese Simplified) 2018-06-26 22:32:56 +09:00
syuilo
e7fb192f5d New translations ja.yml (Italian) 2018-06-26 22:32:54 +09:00
syuilo
18e2ca89b7 New translations ja.yml (Russian) 2018-06-26 22:32:51 +09:00
syuilo
ec8c388f99 New translations ja.yml (English) 2018-06-26 22:32:49 +09:00
syuilo
a1518df41a New translations ja.yml (Spanish) 2018-06-26 22:32:47 +09:00
syuilo
312ef38d62 New translations ja.yml (German) 2018-06-26 22:32:45 +09:00
syuilo
ed3e0a9d9c New translations ja.yml (French) 2018-06-26 22:32:43 +09:00
syuilo
d7ca93b9fa Merge pull request #1787 from l2dy/i18n
i18n
2018-06-26 22:30:56 +09:00
greenkeeper[bot]
910dfd6ad2 fix(package): update uuid to version 3.3.0 2018-06-26 13:28:53 +00:00
Zero King
041415519b i18n 2018-06-26 13:27:52 +00:00
greenkeeper[bot]
0ba877fef1 fix(package): update element-ui to version 2.4.2 2018-06-26 11:33:41 +00:00
syuilo
839c93961c 4.14.0 2018-06-26 18:53:35 +09:00
syuilo
30b1be97dd 🎨 2018-06-26 18:53:06 +09:00
syuilo
55be57ad21 Clean up 2018-06-26 18:47:09 +09:00
syuilo
58064ec633 MFM: Improve title syntax 2018-06-26 18:42:00 +09:00
syuilo
d63044a15e Fix #1781 2018-06-26 18:34:17 +09:00
syuilo
5422697397 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-26 18:25:50 +09:00
syuilo
36c2f8fe5d Improve usability 2018-06-26 18:25:27 +09:00
syuilo
2defddc153 Merge pull request #1784 from syuilo/greenkeeper/@types/webpack-4.4.3
Update @types/webpack to the latest version 🚀
2018-06-26 13:00:54 +09:00
syuilo
fb9a219349 Merge pull request #1783 from syuilo/greenkeeper/@types/node-10.3.6
Update @types/node to the latest version 🚀
2018-06-26 13:00:46 +09:00
syuilo
3b5e4276c8 Merge pull request #1782 from syuilo/greenkeeper/html-minifier-3.5.17
Update html-minifier to the latest version 🚀
2018-06-26 13:00:37 +09:00
syuilo
fab2e08a0d Merge pull request #1785 from syuilo/greenkeeper/eslint-5.0.1
Update eslint to the latest version 🚀
2018-06-26 13:00:18 +09:00
greenkeeper[bot]
19e9099a78 fix(package): update eslint to version 5.0.1 2018-06-26 03:50:37 +00:00
greenkeeper[bot]
91c2b07cd8 fix(package): update @types/webpack to version 4.4.3 2018-06-26 03:06:03 +00:00
greenkeeper[bot]
fd00c7bd81 fix(package): update @types/node to version 10.3.6 2018-06-26 01:40:05 +00:00
greenkeeper[bot]
8919082179 fix(package): update html-minifier to version 3.5.17 2018-06-25 20:53:04 +00:00
syuilo
2f7c191547 Merge pull request #1780 from syuilo/l10n_master
New Crowdin translations
2018-06-26 02:10:31 +09:00
syuilo
80519dc366 New translations ja.yml (Portuguese) 2018-06-25 21:52:24 +09:00
syuilo
4d53c813e4 New translations ja.yml (Korean) 2018-06-25 21:52:22 +09:00
syuilo
750f479d58 New translations ja.yml (Polish) 2018-06-25 21:52:20 +09:00
syuilo
e9a7e99108 New translations ja.yml (Chinese Simplified) 2018-06-25 21:52:17 +09:00
syuilo
ebf10b3452 New translations ja.yml (Italian) 2018-06-25 21:52:15 +09:00
syuilo
5d621f5318 New translations ja.yml (Russian) 2018-06-25 21:52:12 +09:00
syuilo
35dedfc7e4 New translations ja.yml (English) 2018-06-25 21:52:10 +09:00
syuilo
39094adfcf New translations ja.yml (Spanish) 2018-06-25 21:52:07 +09:00
syuilo
74a25bfaa0 New translations ja.yml (German) 2018-06-25 21:52:05 +09:00
syuilo
04ef2f0c8d New translations ja.yml (French) 2018-06-25 21:52:02 +09:00
syuilo
fb99906a8c Merge pull request #1779 from otya128/master
Fix v('ω')v
2018-06-25 21:49:35 +09:00
otya
da0d3e4129 正しいv('ω')v 2018-06-25 21:05:12 +09:00
syuilo
3ffe90146c Update README.md 2018-06-25 13:47:22 +09:00
syuilo
81cea41154 Merge pull request #1774 from syuilo/greenkeeper/webpack-4.12.1
Update webpack to the latest version 🚀
2018-06-24 18:12:37 +09:00
greenkeeper[bot]
3ff4f53bbd fix(package): update webpack to version 4.12.1 2018-06-24 08:49:27 +00:00
syuilo
a77f67fc32 4.13.1 2018-06-24 16:09:41 +09:00
syuilo
47c45d48b1 4.13.0 2018-06-24 15:56:18 +09:00
syuilo
cdd9585cb8 🎨 2018-06-24 15:55:41 +09:00
syuilo
db60188847 Fix bug 2018-06-24 15:51:03 +09:00
syuilo
21a2e5f415 4.12.0 2018-06-24 13:23:57 +09:00
syuilo
2377c9b4cb Merge pull request #1773 from syuilo/l10n_master
New Crowdin translations
2018-06-24 13:22:57 +09:00
syuilo
296f6b1553 New translations ja.yml (English) 2018-06-24 13:20:48 +09:00
syuilo
e15643ca46 Better reversi labels 2018-06-24 13:18:22 +09:00
syuilo
9632ba40cc New translations ja.yml (Portuguese) 2018-06-24 13:11:11 +09:00
syuilo
a2cdeeb6c7 New translations ja.yml (Korean) 2018-06-24 13:11:10 +09:00
syuilo
a23857ce3c New translations ja.yml (Polish) 2018-06-24 13:11:08 +09:00
syuilo
78677b3aa7 New translations ja.yml (Chinese Simplified) 2018-06-24 13:11:06 +09:00
syuilo
7dd264953f New translations ja.yml (Italian) 2018-06-24 13:11:04 +09:00
syuilo
17af9c3ab6 New translations ja.yml (Russian) 2018-06-24 13:11:02 +09:00
syuilo
4b49f8fbb8 New translations ja.yml (English) 2018-06-24 13:11:00 +09:00
syuilo
e253225c66 New translations ja.yml (Spanish) 2018-06-24 13:10:58 +09:00
syuilo
6abb6f90f6 New translations ja.yml (German) 2018-06-24 13:10:56 +09:00
syuilo
9fb2743a38 New translations ja.yml (French) 2018-06-24 13:10:55 +09:00
syuilo
17792716a7 4.11.0 2018-06-24 13:09:22 +09:00
syuilo
ae7282358e Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-24 13:08:50 +09:00
syuilo
abc082f7c0 リモートフォローフォームを実装するなど 2018-06-24 13:08:48 +09:00
syuilo
bf1163ae84 Merge pull request #1772 from syuilo/greenkeeper/ws-5.2.1
Update ws to the latest version 🚀
2018-06-24 03:19:48 +09:00
greenkeeper[bot]
be74ca472a fix(package): update ws to version 5.2.1 2018-06-23 17:55:11 +00:00
syuilo
31b472fa47 4.10.0 2018-06-23 23:19:15 +09:00
syuilo
b502627494 Fix nado 2018-06-23 23:18:39 +09:00
syuilo
a8017369d0 4.9.0 2018-06-23 23:04:49 +09:00
syuilo
3f0b5e4318 ✌️ 2018-06-23 23:03:25 +09:00
syuilo
aea8f93e02 Merge branch 'master' of https://github.com/syuilo/misskey 2018-06-23 22:55:57 +09:00
syuilo
874411990b ✌️ 2018-06-23 22:55:32 +09:00
syuilo
780268f70e Merge pull request #1771 from syuilo/patch-1
Use capital letters for othello label
2018-06-23 22:50:53 +09:00
Aya Morisawa
3a8a374e87 Use capital letters for othello label 2018-06-23 22:25:22 +09:00
syuilo
488f36d491 i18n 2018-06-23 21:56:47 +09:00
syuilo
4d48b0be99 Fix type 2018-06-23 21:48:36 +09:00
syuilo
44f3888c24 スペイン語を追加 2018-06-23 19:57:23 +09:00
syuilo
a76fb4c173 i18n 2018-06-23 19:35:19 +09:00
syuilo
e4aa003157 MFM: Improve search syntax 2018-06-23 19:31:28 +09:00
syuilo
247f334334 Fix 2018-06-23 19:18:14 +09:00
syuilo
509cdae832 Fix bug 2018-06-23 19:16:50 +09:00
syuilo
5ff59b3339 4.8.0 2018-06-23 17:00:28 +09:00
syuilo
2b1a785f24 きゃー 2018-06-23 16:58:54 +09:00
syuilo
2c0b137848 リバーシのラベルを表示できるように 2018-06-23 16:55:52 +09:00
syuilo
ef68e633cf Merge pull request #1768 from syuilo/greenkeeper/eslint-5.0.0
Update eslint to the latest version 🚀
2018-06-23 12:11:49 +09:00
syuilo
e9e63ba950 Merge pull request #1767 from syuilo/greenkeeper/hard-source-webpack-plugin-0.9.0
Update hard-source-webpack-plugin to the latest version 🚀
2018-06-23 12:11:31 +09:00
syuilo
3fd6167e71 Merge pull request #1766 from syuilo/greenkeeper/@types/node-10.3.5
Update @types/node to the latest version 🚀
2018-06-23 12:11:15 +09:00
syuilo
6b0573ded1 Merge pull request #1769 from syuilo/greenkeeper/ts-node-7.0.0
fix(package): update ts-node to version 7.0.0
2018-06-23 12:11:08 +09:00
greenkeeper[bot]
e2c3d4f2fb fix(package): update eslint to version 5.0.0 2018-06-23 02:46:37 +00:00
greenkeeper[bot]
60229d73c9 fix(package): update hard-source-webpack-plugin to version 0.9.0 2018-06-23 02:35:38 +00:00
greenkeeper[bot]
c6cbadc514 fix(package): update @types/node to version 10.3.5 2018-06-23 00:27:09 +00:00
greenkeeper[bot]
3c3c67a34c fix(package): update ts-node to version 7.0.0
Closes #1765
2018-06-22 19:17:54 +00:00
43 changed files with 943 additions and 496 deletions

View File

@@ -14,7 +14,7 @@ ultimately sophisticated professional microblogging software.
<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)
![](https://ja.mstdn.wiki/images/e/ed/Deck.jpg)
:sparkles: Features
----------------------------------------------------------------

View File

@@ -42,6 +42,7 @@ common:
d: "Willst du etwas sagen?"
e: "Schreib hier etwas!"
f: "Warte darauf, das du schreibst."
search: "検索"
delete: "Löschen"
loading: "Laden"
ok: "OK"
@@ -49,6 +50,13 @@ common:
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "Analoge Uhr"
profile: "Profil"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "Notizen"
memo: "Schreib hier!"
save: "Speichern"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Schwarz ... komplett"
notes: "Blau ... Hinweise"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "Medien von deinem PC hinzufügen"
attach-media-from-drive: "Medien von deinem Speicher hinzufügen"
attach-cancel: "Hinzufügen abbrechen"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Eine Abstimmung erstellen"
text-remain: "{} Zeichen verbleibend"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "Lokal"
global: "Global"
list: "Listen"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "Dein Profil"
drive: "Speicher"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -3,9 +3,9 @@ meta:
lang: "English"
divider: ""
common:
misskey: "A ⭐ of fediverse"
misskey: "A ⭐ of the fediverse"
about-title: "A ⭐ of fediverse."
about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within Fediverse (a universe where various social media platforms are organized) it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
about: "Thanks for finding Misskey. Misskey is a <b>decentralized microblogging platform</b> born on Earth. Since it exists within the Fediverse (a universe where various social media platforms are organized), it is mutually linked with other social media platforms. Why don't you take a short break from the hustle and bustle of the city, and dive into a new Internet?"
time:
unknown: "unknown"
future: "future"
@@ -39,16 +39,24 @@ common:
a: "What are you doing?"
b: "What's happening?"
c: "Whats on your mind?"
d: "Do you want to say something?"
d: "What do you want to talk about?"
e: "Write here!"
f: "Waiting for your writing."
f: "Waiting for your writing..."
search: "Search"
delete: "Delete"
loading: "Loading"
ok: "OK"
update-available-title: "Update available"
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
my-token-regenerated: "Your token has been renewed so you will be signed out."
update-available: "A new version of Misskey, ({newer}, is now available. You are currently using {current}). Reloading the page will apply the update."
my-token-regenerated: "Your token has been regenerated so you will be signed out."
i-like-sushi: "I like sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi"
reversi:
drawn: "Draw"
my-turn: "Your turn"
opponent-turn: "Opponent's turn"
turn-of: "{}'s turn"
past-turn-of: "{}'s turn"
widgets:
analog-clock: "Analog clock"
profile: "Profile"
@@ -58,7 +66,7 @@ common:
rss: "RSS reader"
memo: "Sticky note"
trends: "Trends"
photo-stream: "Photo stream"
photo-stream: "Photostream"
posts-monitor: "Chart of posts"
slideshow: "Slideshow"
version: "Version"
@@ -88,10 +96,10 @@ common:
add-column: "Add a column"
rename: "Rename"
stack-left: "Stack to left"
pop-right: "Pop to right"
pop-right: "Stack to right"
common/views/components/connect-failed.vue:
title: "Unable to connect to the server"
description: "There is a problem either with your Internet connection, or the server may be down or under maintenance. Please {try again} later."
description: "There is a problem with your Internet connection, or the server may be down or under maintenance. Please try again later."
thanks: "Thank you for using Misskey."
troubleshoot: "Troubleshoot"
common/views/components/connect-failed.troubleshooter.vue:
@@ -118,7 +126,7 @@ common/views/components/messaging.vue:
you: "You"
no-history: "No history"
common/views/components/messaging-room.vue:
empty: "You haven't messaged this user"
empty: "No conversations"
more: "Read more"
no-history: "There is no more history"
resize-form: "Drag to resize"
@@ -142,10 +150,10 @@ common/views/components/nav.vue:
feedback: "Feedback"
common/views/components/note-menu.vue:
favorite: "Favorite this note"
pin: "Pin to profile page"
pin: "Pin to your profile page"
delete: "Delete"
delete-confirm: "Are you sure you want to delete this post?"
remote: "Show on origin"
delete-confirm: "Delete this post for sure?"
remote: "Show original note"
common/views/components/poll.vue:
vote-to: "Vote for '{}'"
vote-count: "{} votes"
@@ -154,11 +162,11 @@ common/views/components/poll.vue:
show-result: "Show results"
voted: "Voted"
common/views/components/poll-editor.vue:
no-only-one-choice: "You need to enter two or more choices."
no-only-one-choice: "At least two choices are required"
choice-n: "Choice {}"
remove: "Remove this choice"
remove: "Delete this choice"
add: "+ Add a choice"
destroy: "Cancel this poll"
destroy: "Discard the poll"
common/views/components/reaction-picker.vue:
choose-reaction: "Choose a reaction"
common/views/components/signin.vue:
@@ -185,9 +193,9 @@ common/views/components/signup.vue:
retype-placeholder: "Confirm your password"
password-matched: "OK"
password-not-matched: "Doesn't match"
recaptcha: "Verify"
recaptcha: "Verification"
create: "Create an Account"
some-error: "Account creation failed for some reason. Please try again."
some-error: "Account creation has failed for some reason. Please try again."
common/views/components/special-message.vue:
new-year: "Happy New Year!"
christmas: "Merry Christmas!"
@@ -196,7 +204,7 @@ common/views/components/stream-indicator.vue:
reconnecting: "Reconnecting"
connected: "Connected"
common/views/components/twitter-setting.vue:
description: "If you connect your Twitter account to your Misskey account, you will be able to see your Twitter account information on your profile and you can sign-in using Twitter."
description: "Once you connect your Twitter account to your Misskey account, you will be able to see information about your Twitter account on your profile, and you will be able to sign-in using Twitter."
connected-to: "You are connected to this Twitter account"
detail: "Details..."
reconnect: "Reconnect"
@@ -215,12 +223,12 @@ common/views/components/visibility-chooser.vue:
private: "Private"
common/views/widgets/broadcast.vue:
fetching: "Fetching"
no-broadcasts: "No broadcasts"
no-broadcasts: "No announcements"
have-a-nice-day: "Have a nice day!"
next: "Next"
common/views/widgets/donation.vue:
title: "Donation"
text: "To keep Misskey up and running we spend money for our domain name, servers and so on. Since we don't get money from advertisements, we count on donations from all of you. If you're interested contact {}. Thank you for your contribution!"
title: "Request for dnations"
text: "To keep Misskey up and running, we have to spend money on our domain name, the server costs and so on. Since we don't receive money from advertisements, we count on donations from all of you. If you're interested contact {}. Thank you for your contribution!"
common/views/widgets/photo-stream.vue:
title: "Photostream"
no-photos: "No photos"
@@ -230,7 +238,7 @@ common/views/widgets/posts-monitor.vue:
common/views/widgets/hashtags.vue:
title: "Hashtags"
count: "{} users mentioned"
empty: "No trend"
empty: "No popular hashtag trends"
common/views/widgets/server.vue:
title: "Server info"
toggle: "Toggle views"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "Sticky note"
memo: "Write here!"
save: "Save"
common/views/pages/follow.vue:
signed-in-as: "Signed in as {}"
following: "Following"
follow: "Follow"
request-pending: "Pending follow request"
follow-request: "Follow request"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -252,7 +266,7 @@ desktop/views/components/calendar.vue:
next: "Next month"
go: "Click to navigate"
desktop/views/components/choose-file-from-drive-window.vue:
choose-file: "Choosing files"
choose-file: "Choose files"
upload: "Upload files from your PC"
cancel: "Cancel"
ok: "OK"
@@ -299,9 +313,9 @@ desktop/views/components/drive.nav-folder.vue:
desktop/views/components/drive.vue:
search: "Search"
load-more: "Load more"
empty-draghover: "Drop Welcome!"
empty-draghover: "Drop here, don't I look cute?"
empty-drive: "Your drive is empty"
empty-drive-description: "You can also upload by right clicking and selecting \"Upload file\" or you can drag and drop a file onto the window."
empty-drive-description: "You can also upload by right clicking and selecting \"Upload file\", or you can drag and drop a file onto the window."
empty-folder: "This folder is empty"
unable-to-process: "The operation could not be completed."
circular-reference-detected: "The destination folder is a subfolder of the folder you wish to move."
@@ -332,7 +346,7 @@ desktop/views/components/following.vue:
desktop/views/components/friends-maker.vue:
title: "Recommended users:"
empty: "Couldn't find any recommended users."
fetching: "Loading"
fetching: "Loading"
refresh: "More"
close: "Close"
desktop/views/components/game-window.vue:
@@ -350,8 +364,8 @@ desktop/views/components/messaging-window.vue:
title: "Messaging"
desktop/views/components/note-detail.vue:
more: "Load more conversations"
private: "this post is private"
deleted: "this post has been deleted"
private: "This post is private"
deleted: "This post has been removed"
reposted-by: "Reposted by {}"
location: "Location"
renote: "Repost"
@@ -362,14 +376,14 @@ desktop/views/components/notes.note.vue:
renote: "Repost"
add-reaction: "Add a reaction"
detail: "Show details"
private: "this post is private"
deleted: "this post has been deleted"
private: "This post is private"
deleted: "This post has been deleted"
desktop/views/components/notes.vue:
error: "Loading failed."
retry: "Retry"
desktop/views/components/notifications.vue:
more: "More"
empty: "No notifications"
empty: "No notifications!"
desktop/views/components/post-form.vue:
reply-placeholder: "Reply to this note..."
quote-placeholder: "Quote this note..."
@@ -379,14 +393,14 @@ desktop/views/components/post-form.vue:
posted: "Posted!"
replied: "Replied!"
reposted: "Reposted!"
note-failed: "Failed to note"
note-failed: "Failed to post the note"
reply-failed: "Failed to reply"
renote-failed: "Failed to repost"
posting: "Posting"
attach-media-from-local: "Attach media from your PC"
attach-media-from-local: "Attach media from your computer"
attach-media-from-drive: "Attach media from your Drive"
attach-cancel: "Cancel attachment"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Create a poll"
text-remain: "{} characters remaining"
desktop/views/components/post-form-window.vue:
@@ -420,15 +434,15 @@ desktop/views/components/settings.vue:
other: "Other"
license: "License"
behaviour: "Behavior"
fetch-on-scroll: "Fetch on scroll"
fetch-on-scroll-desc: "When you scroll down the page automatically fetches additional content."
fetch-on-scroll: "Endless loading on scroll"
fetch-on-scroll-desc: "When you scroll down the page, it automatically fetches additional content."
auto-popout: "Auto pop-out window"
auto-popout-desc: "Pop-out an opened window if possible. This setting is stored in the browser."
auto-popout-desc: "Pops-out a newly opened window (onto a new tab), if possible. This setting is stored in the browser."
advanced: "Advanced settings"
api-via-stream: "API request via stream"
api-via-stream-desc: "API request is performed via the WebSocket connection instead of native fetch API (for better performance). This setting is stored in the browser."
display: "Design and display"
customize: "Customize Home"
customize: "Customize home layout"
dark-mode: "Dark Mode"
circle-icons: "Use circle icons"
gradient-window-header: "Use gradients on window headers"
@@ -448,15 +462,15 @@ desktop/views/components/settings.vue:
language: "Language"
pick-language: "Select a language"
recommended: "Recommended"
auto: "Auto"
auto: "Automatic"
specify-language: "Specify language"
language-desc: "You need to reload the page for the changes to take effect."
cache: "Cache"
clean-cache: "Cleanup"
clean-cache: "Clear cache"
cache-warn: "The cache of account info/posts/replies/messages/settings stored in the browser will be deleted. You need to reload the page after cleaning up."
cache-cleared: "Cache cleared"
cache-cleared-desc: "Please reload the page."
auto-watch: "Auto watch"
auto-watch: "Automatic watch"
auto-watch-desc: "Receive notifications about the post/reply/reaction automatically."
about: "About Misskey"
operator: "The admin of this instance"
@@ -464,13 +478,13 @@ desktop/views/components/settings.vue:
version: "Version:"
latest-version: "Latest version:"
update-checking: "Checking for updates"
do-update: "Check for update"
do-update: "Check for updates"
update-settings: "Advanced settings"
prevent-update: "Postpone updates (not recommended)"
prevent-update-desc: "Even if you turn this setting on updates may apply. This setting is valid only for this device."
prevent-update-desc: "Even if you turn this setting on, updates may apply. This setting is enabled only for this device."
no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!"
update-available: "A new version is available"
update-available-desc: "The updates will apply if you reload the page again."
advanced-settings: "Advanced"
debug-mode: "Enable the debug mode"
@@ -479,7 +493,7 @@ desktop/views/components/settings.vue:
experimental-desc: "It would make Misskey client unstable. This setting is stored in the browser."
tools: "Tools"
task-manager: "Task Manager"
third-parties: "Third-party"
third-parties: "Third-parties"
desktop/views/components/settings.2fa.vue:
intro: "If you set up 2-step verification, you will need not only a password at sign-in but also a pre-registered physical device (such as your smartphone), which will improve security. "
detail: "See details..."
@@ -488,20 +502,20 @@ desktop/views/components/settings.2fa.vue:
register: "Register a device"
already-registered: "A device is already registered"
unregister: "Disable"
unregistered: "Two-step authentication has been disabled."
unregistered: "Two-factor authentication has been disabled."
enter-password: "Enter the password"
authenticator: "First, you need install Google Authenticator on your device:"
howtoinstall: "How to install"
scan: "And then, scan the QR code:"
done: "Please enter the token displaying on your device:"
submit: "Submit"
success: "Setup completed successfully!"
failed: "Failed to setup. please ensure that the token is correct."
success: "Settings saved!"
failed: "Failed to setup. Please ensure that the token is correct."
info: "From now on, enter the token that is displayed on your device in addition to your password when signing-in to Misskey."
desktop/views/components/settings.api.vue:
intro: "To access the API, set this token as the key 'i' of request parameters."
caution: "Please do not show this token to third parties (do not enter it somewhere else other than here) otherwise your account could get compromised."
regeneration-of-token: "In the unlikely event that this token leaks out you can regenerate it."
regeneration-of-token: "In the unlikely event that this token leaks out, you can regenerate it."
regenerate-token: "Regenerate the token"
token: "Token:"
enter-password: "Please enter the password"
@@ -510,12 +524,12 @@ desktop/views/components/settings.apps.vue:
desktop/views/components/settings.mute.vue:
no-users: "No muted users"
desktop/views/components/settings.password.vue:
reset: "Change your password"
reset: "Change password"
enter-current-password: "Enter the current password"
enter-new-password: "Enter the new password"
enter-new-password-again: "Enter the new password again"
enter-new-password-again: "Enter new password again"
not-match: "New password doesn't match"
changed: "Password updated successfully"
changed: "Password updated"
desktop/views/components/settings.profile.vue:
avatar: "Avatar"
choice-avatar: "Choose an image"
@@ -527,8 +541,8 @@ desktop/views/components/settings.profile.vue:
is-bot: "This account is a Bot"
is-cat: "This account is a Cat"
desktop/views/components/sub-note-content.vue:
private: "this post is private"
deleted: "this post has been deleted"
private: "This post is private"
deleted: "This post has been deleted"
media-count: "{} media attached"
poll: "Poll"
desktop/views/components/taskmanager.vue:
@@ -538,16 +552,18 @@ desktop/views/components/timeline.vue:
local: "Local"
global: "Global"
list: "Lists"
desktop/views/components/ui.header.vue:
welcome-back: "Welcome back,"
desktop/views/components/ui.header.account.vue:
profile: "Your profile"
drive: "Drive"
favorites: "Favorites"
lists: "Lists"
follow-requests: "Follow requests"
customize: "Customize"
customize: "Customize Layout"
settings: "Settings"
signout: "Sign out"
dark: "Fall in dark"
dark: "Fall into dark"
desktop/views/components/ui.header.nav.vue:
home: "Home"
deck: "Deck"
@@ -565,7 +581,7 @@ desktop/views/components/received-follow-requests-window.vue:
reject: "Reject"
desktop/views/components/user-lists-window.vue:
title: "User lists"
create-list: "Create list"
create-list: "Create a list"
desktop/views/components/user-preview.vue:
notes: "Posts"
following: "Following"
@@ -578,17 +594,17 @@ desktop/views/components/users-list.vue:
desktop/views/components/users-list-item.vue:
followed: "Follows you"
desktop/views/components/window.vue:
popout: "Popout"
popout: "Pop-out"
close: "Close"
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Only media posts"
is-media-view: "Media view"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposted by {}"
private: "this post is private"
deleted: "this post has been deleted"
private: "This post is private"
deleted: "This post has been deleted"
desktop/views/pages/welcome.vue:
about: "about"
about: "More details..."
gotit: "Got it!"
signin: "Log In"
signup: "Sign up"
@@ -598,9 +614,9 @@ desktop/views/pages/welcome.vue:
desktop/views/pages/drive.vue:
title: "Misskey Drive"
desktop/views/pages/favorites.vue:
more: "Load More"
more: "Load more"
desktop/views/pages/home-customize.vue:
title: "Customize home"
title: "Customize home layout"
desktop/views/pages/note.vue:
prev: "Previous note"
next: "Next note"
@@ -608,7 +624,7 @@ desktop/views/pages/selectdrive.vue:
title: "Choose file(s)"
ok: "OK"
cancel: "Cancel"
upload: "Upload files from you PC"
upload: "Upload files from your PC"
desktop/views/pages/user-list.users.vue:
users: "User"
add-user: "Add a user"
@@ -616,17 +632,17 @@ desktop/views/pages/user-list.users.vue:
desktop/views/pages/user/user.followers-you-know.vue:
title: "Followers you know"
loading: "Loading"
no-users: "No users"
no-users: "No followers you know"
desktop/views/pages/user/user.friends.vue:
title: "Frequently replied"
loading: "Loading"
no-users: "No users"
desktop/views/pages/user/user.vue:
is-suspended: "This account has been suspended."
is-remote: "This user is a remote user, so the information is not accurate. "
view-remote: "See accurate information"
is-remote: "This user is a remote user, so the information about them that you see here is not complete."
view-remote: "See their complete profile"
desktop/views/pages/user/user.home.vue:
last-used-at: "Last active: "
last-used-at: "Last active:"
desktop/views/pages/user/user.photos.vue:
title: "Photos"
loading: "Loading"
@@ -639,11 +655,16 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mute"
muted: "Muting"
unmute: "Unmute"
desktop/views/pages/user/user.header.vue:
posts: "Notes"
following: "Following"
followers: "Followers"
is-bot: "This account is a Bot"
desktop/views/pages/user/user.timeline.vue:
default: "Posts"
with-replies: "Posts and replies"
with-replies: "Notes and replies"
with-media: "Media"
empty: "This user has never posted yet."
empty: "This user doesn't seem to have posted anything yet."
desktop/views/widgets/messaging.vue:
title: "Messaging"
desktop/views/widgets/notifications.vue:
@@ -710,15 +731,15 @@ mobile/views/components/note.vue:
reposted-by: "Reposted by {}"
more: "See more"
less: "Hide"
private: "this post is private"
deleted: "this post has been deleted"
private: "This post is private"
deleted: "This post has been deleted"
location: "Location"
mobile/views/components/note-detail.vue:
reply: "Reply"
reaction: "Reaction"
reposted-by: "Reposted by {}"
private: "this post is private"
deleted: "this post has been deleted"
private: "This post is private"
deleted: "This post has been deleted"
location: "Location"
mobile/views/components/note-preview.vue:
admin: "admin"
@@ -729,7 +750,7 @@ mobile/views/components/note-sub.vue:
bot: "bot"
cat: "cat"
mobile/views/components/notes.vue:
failed: "Failed to load."
failed: "Failed to load"
retry: "Retry"
mobile/views/components/notifications.vue:
more: "More"
@@ -738,7 +759,7 @@ mobile/views/components/post-form.vue:
add-visible-user: "Add a user"
submit: "Post"
reply: "Reply"
renote: "Repost"
renote: "Renote"
quote-placeholder: "Quote this post... (optional)"
reply-placeholder: "Reply to this note..."
cw-placeholder: "Comments about content (optional)"
@@ -746,8 +767,8 @@ mobile/views/components/post-form.vue:
error: "Error"
username-prompt: "Enter user name"
mobile/views/components/sub-note-content.vue:
private: "this post is private"
deleted: "this post has been deleted"
private: "This post is private"
deleted: "This post has been deleted"
media-count: "{} media attached"
poll: "Poll"
mobile/views/components/timeline.vue:
@@ -811,15 +832,15 @@ mobile/views/pages/settings/settings.profile.vue:
name: "Name"
account: "Account"
location: "Location"
description: "Description"
description: "Biography"
birthday: "Birthday"
avatar: "Avatar"
banner: "Banner"
is-cat: "This account is a Cat"
save: "Update profile"
saved: "Profile updated successfully"
saved: "Profile updated"
uploading: "Uploading"
upload-failed: "Upload failed"
upload-failed: "Failed to upload"
mobile/views/pages/search.vue:
search: "Search"
empty: "No posts were found for '{}'"
@@ -831,7 +852,7 @@ mobile/views/pages/settings.vue:
lang-tip: "You will need to reload the page for the changes to take effect."
recommended: "Recommended"
auto: "Auto"
specify-language: "Specify the language"
specify-language: "Select your language"
design: "Design and display"
dark-mode: "Dark Mode"
i-am-under-limited-internet: "I'm under limited internet"
@@ -844,9 +865,9 @@ mobile/views/pages/settings.vue:
post-style-standard: "Standard"
post-style-smart: "Smart"
behavior: "Behavior"
fetch-on-scroll: "Fetch on scroll"
disable-via-mobile: "Without the \"mobile posts\" flag"
load-raw-images: "Show attached pictures in high-quality"
fetch-on-scroll: "Endless loading on scroll"
disable-via-mobile: "Don't mark the post as 'from mobile'"
load-raw-images: "Show attached images in high-quality"
load-remote-media: "Show media on a remote server"
twitter: "Twitter integration"
twitter-connect: "Connect to your Twitter account"
@@ -856,24 +877,24 @@ mobile/views/pages/settings.vue:
version: "Current version:"
latest-version: "Latest version:"
update-checking: "Checking for updates"
check-for-updates: "Check for update"
check-for-updates: "Check for updates"
no-updates: "No updates available"
no-updates-desc: "Your Misskey is up to date."
update-available: "New version is available!"
update-available-desc: "To reload the page and updates are applied."
update-available: "A new version is available"
update-available-desc: "Updates will be applied after reloading the page"
settings: "Settings"
signout: "Sign out"
mobile/views/pages/user.vue:
follows-you: "Follows you"
following: "Following"
followers: "Followers"
notes: "Posts"
notes: "Notes"
overview: "Overview"
timeline: "Timeline"
media: "Media"
is-suspended: "This account has been suspended."
is-remote: "This user is a remote user, so the information is not accurate. "
view-remote: "See accurate information"
is-remote: "This user is a remote user, so the information about them that you see here is not complete."
view-remote: "See their complete profile"
mobile/views/pages/user/home.vue:
recent-notes: "Recent notes"
images: "Images"
@@ -885,10 +906,10 @@ mobile/views/pages/user/home.vue:
last-used-at: "Last active:"
mobile/views/pages/user/home.followers-you-know.vue:
loading: "Loading"
no-users: "No users"
no-users: "No users you know"
mobile/views/pages/user/home.friends.vue:
loading: "Loading"
no-users: "No users"
no-users: "There are no users that you know"
mobile/views/pages/user/home.notes.vue:
loading: "Loading"
no-notes: "No notes"

View File

@@ -42,6 +42,7 @@ common:
d: "¿Quieres decir algo?"
e: "¡Escribe aquí!"
f: "Esperando a que escribas algo..."
search: "検索"
delete: "eliminar"
loading: "cargando"
ok: "OK"
@@ -49,6 +50,13 @@ common:
update-available: "Hay disponible una nueva versión de Misskey ({newer}, la versión actual es {current}). Refresca la página para aplicar las actualizaciones."
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "Reloj analógico"
profile: "Perfil"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "Adjunta multimedia desde tu Disco"
attach-cancel: "Quitar el archivo adjunto"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Crea una encuesta"
text-remain: "quedan {} caracteres"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -3,7 +3,7 @@ meta:
lang: "Français"
divider: ""
common:
misskey: "Aof fediverse"
misskey: "Unedu fédiverse"
about-title: "Une ⭐ du fédiverse."
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:
@@ -42,13 +42,21 @@ common:
d: "Voulez-vous exprimer quelque chose ?"
e: "Écrivez ici"
f: "En attente de vos écrits"
search: "Recherche"
delete: "Supprimer"
loading: "Chargement"
ok: "OK"
update-available-title: "更新があります"
update-available-title: "Mise à jour disponible"
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "Cest votre tour"
opponent-turn: "Tour de ladversaire"
turn-of: "Cest le tour de {}"
past-turn-of: "{}のターン"
widgets:
analog-clock: "Horloge analogique"
profile: "Profil"
@@ -145,7 +153,7 @@ common/views/components/note-menu.vue:
pin: "Épingler sur votre profile"
delete: "Supprimer"
delete-confirm: "Supprimer cette publication ?"
remote: "投稿元で見る"
remote: "Afficher les note originale"
common/views/components/poll.vue:
vote-to: "Voter pour '{}'"
vote-count: "{} votes"
@@ -226,11 +234,11 @@ common/views/widgets/photo-stream.vue:
no-photos: "Pas de photos"
common/views/widgets/posts-monitor.vue:
title: "Graph des publications"
toggle: "表示を切り替え"
toggle: "Basculer les vues"
common/views/widgets/hashtags.vue:
title: "Étiquettes"
count: "{}人が投稿"
empty: "トレンドなし"
count: "{} utilisateurs mentionnés"
empty: "Aucune tendance"
common/views/widgets/server.vue:
title: "Info sur le serveur"
toggle: "Afficher les vues"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "Pense-bête"
memo: "Écrivez ici !"
save: "Enregistrer"
common/views/pages/follow.vue:
signed-in-as: "Connecté en tant que {}"
following: "Suit"
follow: "フォロー"
request-pending: "Demande d'abonnement en attente"
follow-request: "Demande d'abonnement"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Bleu ... Notes"
@@ -336,7 +350,7 @@ desktop/views/components/friends-maker.vue:
refresh: "Plus"
close: "Fermer"
desktop/views/components/game-window.vue:
game: "リバーシ"
game: "Reversi"
desktop/views/components/home.vue:
done: "Envoyer"
add-widget: "Ajouter un widget"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "Joindre un media depuis votre PC"
attach-media-from-drive: "Joindre un media depuis votre Drive"
attach-cancel: "Annuler la jointure de fichier"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Créer un sondage"
text-remain: "{} charactères restants"
desktop/views/components/post-form-window.vue:
@@ -414,7 +428,7 @@ desktop/views/components/settings.vue:
mute: "Mettre en sourdine"
drive: "Drive"
security: "Sécurité"
signin: "サインイン履歴"
signin: "Historique de connexion"
password: "Mot de Passe"
2fa: "Vérification en deux étapes"
other: "Autres"
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "Local"
global: "Global"
list: "Listes"
desktop/views/components/ui.header.vue:
welcome-back: "Vous êtes de retour !"
desktop/views/components/ui.header.account.vue:
profile: "Votre profil"
drive: "Drive"
@@ -622,7 +638,7 @@ desktop/views/pages/user/user.friends.vue:
loading: "Chargement en cours"
no-users: "Pas d'utilisateurs"
desktop/views/pages/user/user.vue:
is-suspended: "このユーザーは凍結されています。"
is-suspended: "Ce compte a été suspendu."
is-remote: "Cet utilisateur n'est pas un utilisateur de Misskey. Certaines informations peuvent être erronées"
view-remote: "Voir les informations détaillées"
desktop/views/pages/user/user.home.vue:
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "Mettre en sourdine"
muted: "Muting"
unmute: "Enlever la sourdine"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "Ce compte est un Bot"
desktop/views/pages/user/user.timeline.vue:
default: "Publications"
with-replies: "Publications et réponses"

View File

@@ -5,7 +5,7 @@
import * as fs from 'fs';
import * as yaml from 'js-yaml';
export type LangKey = 'de' | 'en' | 'fr' | 'ja' | 'pl';
export type LangKey = 'de' | 'en' | 'fr' | 'ja' | 'pl' | 'es';
export type LocaleObject = { [key: string]: any };
const loadLang = (lang: LangKey) => yaml.safeLoad(
@@ -18,7 +18,8 @@ const langs: { [key: string]: LocaleObject } = {
'en': loadLang('en'),
'fr': loadLang('fr'),
'ja': native,
'pl': loadLang('pl')
'pl': loadLang('pl'),
'es': loadLang('es')
};
Object.entries(langs).map(([, locale]) => {

View File

@@ -42,6 +42,7 @@ common:
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
search: "検索"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
@@ -49,6 +50,13 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -47,6 +47,7 @@ common:
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
search: "検索"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
@@ -54,6 +55,14 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "アナログ時計"
@@ -271,6 +280,13 @@ common/views/widgets/memo.vue:
memo: "ここに書いて!"
save: "保存"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -445,7 +461,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
@@ -623,6 +639,9 @@ desktop/views/components/timeline.vue:
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@@ -750,6 +769,12 @@ desktop/views/pages/user/user.profile.vue:
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -42,6 +42,7 @@ common:
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
search: "検索"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
@@ -49,6 +50,13 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -42,6 +42,7 @@ common:
d: "Czy masz coś do powiedzenia?"
e: "Napisz coś tutaj!"
f: "Czekamy, aż coś napiszesz."
search: "Szukaj"
delete: "Usuń"
loading: "Ładowanie"
ok: "OK"
@@ -49,6 +50,13 @@ common:
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
reversi:
drawn: "Remis"
my-turn: "Twoja kolej"
opponent-turn: "Kolej na przeciwnika"
turn-of: "Kolej na {}"
past-turn-of: "Kolej {}"
widgets:
analog-clock: "Zegar analogowy"
profile: "Profil"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "Notatka"
memo: "Napisz tutaj!"
save: "Zapisz"
common/views/pages/follow.vue:
signed-in-as: "Zalogowany jako {}"
following: "Śledzisz"
follow: "Śledź"
request-pending: "Oczekiwanie na pozwolenie"
follow-request: "Poproś o śledzenie"
desktop/views/components/activity.chart.vue:
total: "Czarny … Łącznie"
notes: "Niebieski … Wpisy"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "Załącz zawartość multimedialną z komputera"
attach-media-from-drive: "Załącz zawartość multimedialną z dysku"
attach-cancel: "Usuń załącznik"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "Utwórz ankietę"
text-remain: "pozostałe znaki: {}"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "Lokalne"
global: "Globalne"
list: "Listy"
desktop/views/components/ui.header.vue:
welcome-back: "Witaj ponownie,"
desktop/views/components/ui.header.account.vue:
profile: "Twój profil"
drive: "Dysk"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "Wycisz"
muted: "Wyciszyłeś"
unmute: "Cofnij wyciszenie"
desktop/views/pages/user/user.header.vue:
posts: "Wpisy"
following: "Śledzeni"
followers: "Śledzący"
is-bot: "To konto jest botem"
desktop/views/pages/user/user.timeline.vue:
default: "Wpisy"
with-replies: "Wpisy i odpowiedzi"

View File

@@ -42,6 +42,7 @@ common:
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
search: "検索"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
@@ -49,6 +50,13 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -42,6 +42,7 @@ common:
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
search: "検索"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
@@ -49,6 +50,13 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -42,6 +42,7 @@ common:
d: "言いたいことは?"
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
search: "検索"
delete: "削除"
loading: "読み込み中"
ok: "わかった"
@@ -49,6 +50,13 @@ common:
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
opponent-turn: "相手のターンです"
turn-of: "{}のターンです"
past-turn-of: "{}のターン"
widgets:
analog-clock: "アナログ時計"
profile: "プロフィール"
@@ -238,6 +246,12 @@ common/views/widgets/memo.vue:
title: "付箋"
memo: "ここに書いて!"
save: "保存"
common/views/pages/follow.vue:
signed-in-as: "{}としてサインイン中"
following: "フォロー中"
follow: "フォロー"
request-pending: "フォロー許可待ち"
follow-request: "フォロー申請"
desktop/views/components/activity.chart.vue:
total: "Black ... Total"
notes: "Blue ... Notes"
@@ -386,7 +400,7 @@ desktop/views/components/post-form.vue:
attach-media-from-local: "PCからメディアを添付"
attach-media-from-drive: "ドライブからメディアを添付"
attach-cancel: "添付取り消し"
insert-a-kao: "v(‘ω’)v"
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
desktop/views/components/post-form-window.vue:
@@ -538,6 +552,8 @@ desktop/views/components/timeline.vue:
local: "ローカル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
welcome-back: "おかえりなさい、"
desktop/views/components/ui.header.account.vue:
profile: "プロフィール"
drive: "ドライブ"
@@ -639,6 +655,11 @@ desktop/views/pages/user/user.profile.vue:
mute: "ミュートする"
muted: "ミュートしています"
unmute: "ミュート解除"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
following: "フォロー"
followers: "フォロワー"
is-bot: "このアカウントはBotです"
desktop/views/pages/user/user.timeline.vue:
default: "投稿"
with-replies: "投稿と返信"

View File

@@ -1,8 +1,8 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "4.7.1",
"clientVersion": "1.0.6735",
"version": "4.15.0",
"clientVersion": "1.0.6878",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
@@ -63,9 +63,9 @@
"@types/license-checker": "15.0.0",
"@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.3",
"@types/mongodb": "3.0.21",
"@types/mongodb": "3.0.22",
"@types/ms": "0.7.30",
"@types/node": "10.3.4",
"@types/node": "10.5.0",
"@types/nopt": "3.0.29",
"@types/parse5": "5.0.0",
"@types/pug": "2.0.4",
@@ -80,7 +80,7 @@
"@types/speakeasy": "2.0.2",
"@types/tmp": "0.0.33",
"@types/uuid": "3.4.3",
"@types/webpack": "4.4.2",
"@types/webpack": "4.4.4",
"@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.39",
"@types/ws": "5.1.2",
@@ -99,10 +99,10 @@
"diskusage": "0.2.4",
"dompurify": "1.0.5",
"elasticsearch": "15.0.0",
"element-ui": "2.4.1",
"element-ui": "2.4.2",
"emojilib": "2.2.12",
"escape-regexp": "0.0.1",
"eslint": "4.19.1",
"eslint": "5.0.1",
"eslint-plugin-vue": "4.5.0",
"eventemitter3": "3.1.0",
"exif-js": "2.3.0",
@@ -124,9 +124,9 @@
"gulp-typescript": "4.0.2",
"gulp-uglify": "3.0.0",
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.8.1",
"hard-source-webpack-plugin": "0.9.0",
"highlight.js": "9.12.0",
"html-minifier": "3.5.16",
"html-minifier": "3.5.17",
"http-signature": "1.2.0",
"inquirer": "6.0.0",
"is-root": "2.0.0",
@@ -152,7 +152,7 @@
"mkdirp": "0.5.1",
"mocha": "5.2.0",
"moji": "0.5.1",
"mongodb": "3.0.10",
"mongodb": "3.1.0",
"monk": "6.0.6",
"ms": "2.1.1",
"nan": "2.10.0",
@@ -193,13 +193,13 @@
"textarea-caret": "3.1.0",
"tmp": "0.0.33",
"ts-loader": "4.4.1",
"ts-node": "6.1.2",
"ts-node": "7.0.0",
"tslint": "5.10.0",
"typescript": "2.9.2",
"typescript-eslint-parser": "16.0.0",
"typescript-eslint-parser": "16.0.1",
"uglify-es": "3.3.9",
"url-loader": "1.0.1",
"uuid": "3.2.1",
"uuid": "3.3.0",
"v-animate-css": "0.0.2",
"vue": "2.5.16",
"vue-cropperjs": "2.2.1",
@@ -213,10 +213,10 @@
"vuex-persistedstate": "^2.5.4",
"web-push": "3.3.2",
"webfinger.js": "2.6.6",
"webpack": "4.12.0",
"webpack": "4.12.2",
"webpack-cli": "3.0.8",
"websocket": "1.0.26",
"ws": "5.2.0",
"ws": "5.2.1",
"xev": "2.0.1"
},
"greenkeeper": {

View File

@@ -1,5 +1,5 @@
export default () => [
'(=^・・^=)',
'v(‘ω’)v',
'v(\'ω\')v',
'🐡( \'-\' 🐡 )フグパンチ!!!!'
][Math.floor(Math.random() * 3)];

View File

@@ -1,7 +1,7 @@
<template>
<div class="mk-google">
<input type="search" v-model="query" :placeholder="q">
<button @click="search">検索</button>
<button @click="search">%fa:search% %i18n:common.search%</button>
</div>
</template>

View File

@@ -40,17 +40,6 @@ export default Vue.component('misskey-flavored-markdown', {
ast = this.ast;
}
if (ast.filter(x => x.type != 'hashtag').length == 0) {
return;
}
while (ast[ast.length - 1] && (
ast[ast.length - 1].type == 'hashtag' ||
(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == ' ') ||
(ast[ast.length - 1].type == 'text' && ast[ast.length - 1].content == '\n'))) {
ast.pop();
}
// Parse ast to DOM
const els = flatten(ast.map(token => {
switch (token.type) {

View File

@@ -1,7 +1,7 @@
<template>
<div class="mk-reaction-picker">
<div class="backdrop" ref="backdrop" @click="close"></div>
<div class="popover" :class="{ compact }" ref="popover">
<div class="popover" :class="{ compact, big }" ref="popover">
<p v-if="!compact">{{ title }}</p>
<div>
<button @click="react('like')" @mouseover="onMouseover" @mouseout="onMouseout" tabindex="1" title="%i18n:common.reactions.like%"><mk-reaction-icon reaction='like'/></button>
@@ -25,7 +25,28 @@ import * as anime from 'animejs';
const placeholder = '%i18n:@choose-reaction%';
export default Vue.extend({
props: ['note', 'source', 'compact', 'cb'],
props: {
note: {
type: Object,
required: true
},
source: {
required: true
},
compact: {
type: Boolean,
required: false,
default: false
},
cb: {
required: false
},
big: {
type: Boolean,
required: false,
default: false
}
},
data() {
return {
title: placeholder
@@ -162,6 +183,16 @@ root(isDark)
border-right solid $balloon-size transparent
border-bottom solid $balloon-size $bgcolor
&.compact
> div
width 280px
> button
width 50px
height 50px
font-size 28px
border-radius 4px
> p
display block
margin 0

View File

@@ -3,24 +3,39 @@
<header><b>{{ blackUser.name }}</b>() vs <b>{{ whiteUser.name }}</b>()</header>
<div style="overflow: hidden">
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ turnUser.name }}のターンです<mk-ellipsis/></p>
<p class="turn" v-if="logPos != logs.length">{{ turnUser.name }}のターン</p>
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">相手のターンです<mk-ellipsis/></p>
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">あなたのターンです</p>
<p class="turn" v-if="!iAmPlayer && !game.isEnded">{{ '%i18n:common.reversi.turn-of%'.replace('{}', turnUser.name) }}<mk-ellipsis/></p>
<p class="turn" v-if="logPos != logs.length">{{ '%i18n:common.reversi.past-turn-of%'.replace('{}', turnUser.name) }}</p>
<p class="turn1" v-if="iAmPlayer && !game.isEnded && !isMyTurn">%i18n:common.reversi.opponent-turn%<mk-ellipsis/></p>
<p class="turn2" v-if="iAmPlayer && !game.isEnded && isMyTurn" v-animate-css="{ classes: 'tada', iteration: 'infinite' }">%i18n:common.reversi.my-turn%</p>
<p class="result" v-if="game.isEnded && logPos == logs.length">
<template v-if="game.winner"><b>{{ game.winner.name }}</b>の勝ち{{ game.settings.isLlotheo ? ' (ロセオ)' : '' }}</template>
<template v-else>引き分け</template>
<template v-else>%i18n:common.reversi.drawn%</template>
</p>
</div>
<div class="board" :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
<div v-for="(stone, i) in o.board"
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
@click="set(i)"
:title="'[' + (o.transformPosToXy(i)[0] + 1) + ', ' + (o.transformPosToXy(i)[1] + 1) + '] (' + i + ')'"
>
<img v-if="stone === true" :src="`${blackUser.avatarUrl}?thumbnail&size=128`" alt="">
<img v-if="stone === false" :src="`${whiteUser.avatarUrl}?thumbnail&size=128`" alt="">
<div class="board">
<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels">
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
</div>
<div class="flex">
<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels">
<div v-for="i in game.settings.map.length">{{ i }}</div>
</div>
<div class="cells" :style="cellsStyle">
<div v-for="(stone, i) in o.board"
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
@click="set(i)"
:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
<img v-if="stone === true" :src="`${blackUser.avatarUrl}?thumbnail&size=128`" alt="">
<img v-if="stone === false" :src="`${whiteUser.avatarUrl}?thumbnail&size=128`" alt="">
</div>
</div>
<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels">
<div v-for="i in game.settings.map.length">{{ i }}</div>
</div>
</div>
<div class="labels-x" v-if="this.$store.state.settings.reversiBoardLabels">
<span v-for="i in game.settings.map[0].length">{{ String.fromCharCode(64 + i) }}</span>
</div>
</div>
@@ -92,6 +107,12 @@ export default Vue.extend({
isMyTurn(): boolean {
if (this.turnUser == null) return null;
return this.turnUser.id == this.$store.state.i.id;
},
cellsStyle(): any {
return {
'grid-template-rows': `repeat(${ this.game.settings.map.length }, 1fr)`,
'grid-template-columns': `repeat(${ this.game.settings.map[0].length }, 1fr)`
};
}
},
@@ -244,54 +265,99 @@ export default Vue.extend({
border-bottom dashed 1px #c4cdd4
> .board
display grid
grid-gap 4px
width 350px
height 350px
width calc(100% - 16px)
max-width 500px
margin 0 auto
> div
background transparent
border-radius 6px
overflow hidden
$label-size = 16px
$gap = 4px
*
pointer-events none
user-select none
> .labels-x
height $label-size
padding 0 $label-size
display flex
&.empty
border solid 2px #eee
> *
flex 1
display flex
align-items center
justify-content center
font-size 12px
&.empty.can
background #eee
&:first-child
margin-left -($gap / 2)
&.empty.myTurn
border-color #ddd
&:last-child
margin-right -($gap / 2)
&.can
background #eee
cursor pointer
> .flex
display flex
&:hover
border-color darken($theme-color, 10%)
background $theme-color
> .labels-y
width $label-size
display flex
flex-direction column
&:active
background darken($theme-color, 10%)
> *
flex 1
display flex
align-items center
justify-content center
font-size 12px
&.prev
box-shadow 0 0 0 4px rgba($theme-color, 0.7)
&:first-child
margin-top -($gap / 2)
&.isEnded
border-color #ddd
&:last-child
margin-bottom -($gap / 2)
&.none
border-color transparent !important
> .cells
flex 1
display grid
grid-gap $gap
> img
display block
width 100%
height 100%
> div
background transparent
border-radius 6px
overflow hidden
*
pointer-events none
user-select none
&.empty
border solid 2px #eee
&.empty.can
background #eee
&.empty.myTurn
border-color #ddd
&.can
background #eee
cursor pointer
&:hover
border-color darken($theme-color, 10%)
background $theme-color
&:active
background darken($theme-color, 10%)
&.prev
box-shadow 0 0 0 4px rgba($theme-color, 0.7)
&.isEnded
border-color #ddd
&.none
border-color transparent !important
> img
display block
width 100%
height 100%
> .graph
display grid

View File

@@ -10,7 +10,7 @@
</div>
</div>
<div class="index" v-else>
<h1>Misskey %fa:circle%thell%fa:circle R%</h1>
<h1>Misskey Reversi</h1>
<p>他のMisskeyユーザーとリバーシで対戦しよう</p>
<div class="play">
<el-button round>フリーマッチ(準備中)</el-button>

View File

@@ -0,0 +1,215 @@
<template>
<div class="syxhndwprovvuqhmyvveewmbqayniwkv" v-if="!fetching" :data-darkmode="$store.state.device.darkmode">
<div class="signed-in-as" v-html="'%i18n:@signed-in-as%'.replace('{}', '<b>' + myName + '</b>')"></div>
<main>
<div class="banner" :style="bannerStyle"></div>
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
<div class="body">
<router-link :to="user | userPage" class="name">{{ user | userName }}</router-link>
<span class="username">@{{ user | acct }}</span>
<div class="description">
<misskey-flavored-markdown v-if="user.description" :text="user.description" :i="$store.state.i"/>
</div>
</div>
</main>
<button
:class="{ wait: followWait, active: user.isFollowing || user.hasPendingFollowRequestFromYou }"
@click="onClick"
:disabled="followWait">
<template v-if="!followWait">
<template v-if="user.hasPendingFollowRequestFromYou">%fa:hourglass-half% %i18n:@request-pending%</template>
<template v-else-if="user.isFollowing">%fa:minus% %i18n:@following%</template>
<template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template>
<template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template>
</template>
<template v-else>%fa:spinner .pulse .fw%</template>
</button>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import parseAcct from '../../../../../acct/parse';
import getUserName from '../../../../../renderers/get-user-name';
import Progress from '../../../common/scripts/loading';
export default Vue.extend({
data() {
return {
fetching: true,
user: null,
followWait: false
};
},
computed: {
myName(): string {
return Vue.filter('userName')(this.$store.state.i);
},
bannerStyle(): any {
if (this.user.bannerUrl == null) return {};
return {
backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null,
backgroundImage: `url(${ this.user.bannerUrl })`
};
}
},
created() {
this.fetch();
},
methods: {
fetch() {
const acct = new URL(location.href).searchParams.get('acct');
this.fetching = true;
Progress.start();
(this as any).api('users/show', parseAcct(acct)).then(user => {
this.user = user;
this.fetching = false;
Progress.done();
document.title = getUserName(this.user) + ' | Misskey';
});
},
async onClick() {
this.followWait = true;
try {
if (this.user.isFollowing) {
this.user = await (this as any).api('following/delete', {
userId: this.user.id
});
} else {
if (this.user.isLocked && this.user.hasPendingFollowRequestFromYou) {
this.user = await (this as any).api('following/requests/cancel', {
userId: this.user.id
});
} else if (this.user.isLocked) {
this.user = await (this as any).api('following/create', {
userId: this.user.id
});
} else {
this.user = await (this as any).api('following/create', {
userId: this.user.id
});
}
}
} catch (e) {
console.error(e);
} finally {
this.followWait = false;
}
}
}
});
</script>
<style lang="stylus" scoped>
@import '~const.styl'
root(isDark)
padding 32px
max-width 500px
margin 0 auto
text-align center
color isDark ? #9baec8 : #868c8c
$bg = isDark ? #282C37 : #fff
@media (max-width 400px)
padding 16px
> .signed-in-as
margin-bottom 16px
font-size 14px
color isDark ? #9baec8 : #9daab3
> main
margin-bottom 16px
background $bg
border-radius 8px
box-shadow 0 4px 12px rgba(#000, 0.1)
overflow hidden
> .banner
height 128px
background-position center
background-size cover
> .avatar
display block
margin -50px auto 0 auto
width 100px
height 100px
border-radius 100%
border solid 4px $bg
> .body
padding 4px 32px 32px 32px
@media (max-width 400px)
padding 4px 16px 16px 16px
> .name
font-size 20px
font-weight bold
> .username
display block
opacity 0.7
> .description
margin-top 16px
> button
display block
user-select none
cursor pointer
padding 10px 16px
margin 0
width 100%
min-width 150px
font-size 14px
font-weight bold
color $theme-color
background transparent
outline none
border solid 1px $theme-color
border-radius 36px
&:hover
background rgba($theme-color, 0.1)
&:active
background rgba($theme-color, 0.2)
&.active
color $theme-color-foreground
background $theme-color
&:hover
background lighten($theme-color, 10%)
border-color lighten($theme-color, 10%)
&:active
background darken($theme-color, 10%)
border-color darken($theme-color, 10%)
&.wait
cursor wait !important
opacity 0.7
*
pointer-events none
.syxhndwprovvuqhmyvveewmbqayniwkv[data-darkmode]
root(true)
.syxhndwprovvuqhmyvveewmbqayniwkv:not([data-darkmode])
root(false)
</style>

View File

@@ -36,6 +36,7 @@ import MkSearch from './views/pages/search.vue';
import MkTag from './views/pages/tag.vue';
import MkReversi from './views/pages/reversi.vue';
import MkShare from './views/pages/share.vue';
import MkFollow from '../common/views/pages/follow.vue';
/**
* init
@@ -67,7 +68,8 @@ init(async (launch) => {
{ path: '/reversi', component: MkReversi },
{ path: '/reversi/:game', component: MkReversi },
{ path: '/@:user', component: MkUser },
{ path: '/notes/:note', component: MkNote }
{ path: '/notes/:note', component: MkNote },
{ path: '/authorize-follow', component: MkFollow }
]
});

View File

@@ -47,9 +47,6 @@
</div>
<mk-poll v-if="p.poll" :note="p"/>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote">
@@ -363,35 +360,6 @@ root(isDark)
> .mk-url-preview
margin-top 8px
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 8px 0 0
padding 2px 8px 2px 16px
font-size 90%
color #8d969e
background #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background #fff
border-radius 100%
&:hover
text-decoration none
background #e2e7ec
> footer
font-size 1.2em

View File

@@ -32,9 +32,6 @@
<mk-media-list :media-list="p.media"/>
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
<div class="map" v-if="p.geo" ref="map"></div>
<div class="renote" v-if="p.renote">
@@ -465,35 +462,6 @@ root(isDark)
&:empty
display none
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 0 4px 6px
padding 2px 8px 2px 16px
font-size 90%
color $theme-color
background isDark ? #313543 : #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background isDark ? #282c37 : #fff
border-radius 100%
&:hover
text-decoration none
background #e2e7ec
.mk-url-preview
margin-top 8px

View File

@@ -54,6 +54,7 @@
<mk-switch v-model="$store.state.settings.showMaps" @change="onChangeShowMaps" text="%i18n:@show-maps%">
<span>%i18n:@show-maps-desc%</span>
</mk-switch>
<mk-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels" text="%i18n:common.show-reversi-board-labels%"/>
</section>
<section class="web" v-show="page == 'web'">
@@ -369,6 +370,12 @@ export default Vue.extend({
value: v
});
},
onChangeReversiBoardLabels(v) {
this.$store.dispatch('settings/set', {
key: 'reversiBoardLabels',
value: v
});
},
onChangeGradientWindowHeader(v) {
this.$store.dispatch('settings/set', {
key: 'gradientWindowHeader',

View File

@@ -4,7 +4,7 @@
<div class="main" ref="main">
<div class="backdrop"></div>
<div class="main">
<p ref="welcomeback" v-if="$store.getters.isSignedIn">おかえりなさい<b>{{ $store.state.i | userName }}</b>さん</p>
<p ref="welcomeback" v-if="$store.getters.isSignedIn">%i18n:@welcome-back%<b>{{ $store.state.i | userName }}</b>さん</p>
<div class="container" ref="mainContainer">
<div class="left">
<x-nav/>

View File

@@ -32,9 +32,6 @@
<mk-media-list :media-list="p.media"/>
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="renote" v-if="p.renote">
<mk-note-preview :note="p.renote" :mini="true"/>
@@ -373,31 +370,6 @@ root(isDark)
.mk-url-preview
margin-top 8px
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 0 4px 6px
padding 2px 8px 2px 16px
font-size 90%
color $theme-color
background isDark ? #313543 : #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background isDark ? #282c37 : #fff
border-radius 100%
> .media
> img
display block

View File

@@ -5,19 +5,33 @@
<div class="fade"></div>
<div class="title">
<p class="name">{{ user | userName }}</p>
<p class="username"><mk-acct :user="user"/></p>
<p class="location" v-if="user.host === null && user.profile.location">%fa:map-marker%{{ user.profile.location }}</p>
<div>
<span class="username"><mk-acct :user="user"/></span>
<span v-if="user.isBot" title="%i18n:@is-bot%">%fa:robot%</span>
<span class="location" v-if="user.host === null && user.profile.location">%fa:map-marker% {{ user.profile.location }}</span>
<span class="birthday" v-if="user.host === null && user.profile.birthday">%fa:birthday-cake% {{ user.profile.birthday.replace('-', '').replace('-', '') + '' }} ({{ age }})</span>
</div>
</div>
</div>
<mk-avatar class="avatar" :user="user" :disable-preview="true"/>
<div class="body">
<misskey-flavored-markdown v-if="user.description" :text="user.description" :i="$store.state.i"/>
<div class="description">
<misskey-flavored-markdown v-if="user.description" :text="user.description" :i="$store.state.i"/>
</div>
<div class="status">
<span class="notes-count"><b>{{ user.notesCount | number }}</b>%i18n:@posts%</span>
<span class="following clickable" @click="showFollowing"><b>{{ user.followingCount | number }}</b>%i18n:@following%</span>
<span class="followers clickable" @click="showFollowers"><b>{{ user.followersCount | number }}</b>%i18n:@followers%</span>
</div>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import MkFollowingWindow from '../../components/following-window.vue';
import MkFollowersWindow from '../../components/followers-window.vue';
import * as age from 's-age';
export default Vue.extend({
props: ['user'],
@@ -28,6 +42,10 @@ export default Vue.extend({
backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null,
backgroundImage: `url(${ this.user.bannerUrl })`
};
},
age(): number {
return age(this.user.profile.birthday);
}
},
mounted() {
@@ -64,7 +82,19 @@ export default Vue.extend({
(this as any).apis.updateBanner().then(i => {
this.user.bannerUrl = i.bannerUrl;
});
}
},
showFollowing() {
(this as any).os.new(MkFollowingWindow, {
user: this.user
});
},
showFollowers() {
(this as any).os.new(MkFollowersWindow, {
user: this.user
});
},
}
});
</script>
@@ -118,7 +148,6 @@ root(isDark)
width 100%
padding 0 0 8px 154px
color #5e6367
font-family '游ゴシック', 'YuGothic', 'ヒラギノ角ゴ ProN W3', 'Hiragino Kaku Gothic ProN', 'Meiryo', 'メイリオ', sans-serif
> .name
display block
@@ -127,15 +156,15 @@ root(isDark)
font-weight bold
font-size 1.8em
> .username
> .location
display inline-block
margin 0 16px 0 0
line-height 20px
opacity 0.8
> div
> *
display inline-block
margin-right 16px
line-height 20px
opacity 0.8
> i
margin-right 4px
&.username
font-weight bold
> .avatar
display block
@@ -151,6 +180,32 @@ root(isDark)
padding 16px 16px 16px 154px
color isDark ? #c5ced6 : #555
> .status
margin-top 16px
padding-top 16px
border-top solid 1px rgba(#000, isDark ? 0.2 : 0.1)
font-size 80%
> *
display inline-block
padding-right 16px
margin-right 16px
&:not(:last-child)
border-right solid 1px rgba(#000, isDark ? 0.2 : 0.1)
&.clickable
cursor pointer
&:hover
color isDark ? #fff : #000
> b
margin-right 4px
font-size 1rem
font-weight bold
color $theme-color
.header[data-darkmode]
root(true)

View File

@@ -15,47 +15,17 @@
</button>
<button class="mute ui" @click="list">%fa:list% リストに追加</button>
</div>
<div class="birthday" v-if="user.host === null && user.profile.birthday">
<p>%fa:birthday-cake%{{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' }} ({{ age }})</p>
</div>
<div class="twitter" v-if="user.host === null && user.twitter">
<p>%fa:B twitter%<a :href="`https://twitter.com/${user.twitter.screenName}`" target="_blank">@{{ user.twitter.screenName }}</a></p>
</div>
<div class="status">
<p class="notes-count">%fa:angle-right%<a>{{ user.notesCount }}</a><b>投稿</b></p>
<p class="following">%fa:angle-right%<a @click="showFollowing">{{ user.followingCount }}</a>人を<b>フォロー</b></p>
<p class="followers">%fa:angle-right%<a @click="showFollowers">{{ user.followersCount }}</a>人の<b>フォロワー</b></p>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import * as age from 's-age';
import MkFollowingWindow from '../../components/following-window.vue';
import MkFollowersWindow from '../../components/followers-window.vue';
import MkUserListsWindow from '../../components/user-lists-window.vue';
export default Vue.extend({
props: ['user'],
computed: {
age(): number {
return age(this.user.profile.birthday);
}
},
methods: {
showFollowing() {
(this as any).os.new(MkFollowingWindow, {
user: this.user
});
},
showFollowers() {
(this as any).os.new(MkFollowersWindow, {
user: this.user
});
},
stalk() {
(this as any).api('following/stalk', {
userId: this.user.id
@@ -152,40 +122,6 @@ root(isDark)
&:not(:last-child)
margin-bottom 12px
> .birthday
padding 16px
color isDark ? #e3e7ea : #555
border-bottom solid 1px isDark ? #21242f : #eee
> p
margin 0
> i
margin-right 8px
> .twitter
padding 16px
color isDark ? #e3e7ea : #555
border-bottom solid 1px isDark ? #21242f : #eee
> p
margin 0
> i
margin-right 8px
> .status
padding 16px
color isDark ? #e3e7ea : #555
border-bottom solid 1px isDark ? #21242f : #eee
> p
margin 8px 0
> i
margin-left 8px
margin-right 8px
.profile[data-darkmode]
root(true)

View File

@@ -0,0 +1,26 @@
<template>
<div class="adsvaidqfznoartcbplullnejvxjphcn">
<span>%fa:B twitter%<a :href="`https://twitter.com/${user.twitter.screenName}`" target="_blank">@{{ user.twitter.screenName }}</a></span>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: ['user']
});
</script>
<style lang="stylus" scoped>
.adsvaidqfznoartcbplullnejvxjphcn
padding 32px
background #1a94f2
border-radius 6px
color #fff
a
margin-left 8px
color #fff
</style>

View File

@@ -1,6 +1,6 @@
<template>
<mk-ui>
<div class="zwwan0di1v4356rmdbjmwnn32tptpdp2" v-if="!fetching" :data-darkmode="$store.state.device.darkmode">
<div class="xygkxeaeontfaokvqmiblezmhvhostak" v-if="!fetching" :data-darkmode="$store.state.device.darkmode">
<div class="is-suspended" v-if="user.isSuspended">%fa:exclamation-triangle% %i18n:@is-suspended%</div>
<div class="is-remote" v-if="user.host != null">%fa:exclamation-triangle% %i18n:@is-remote%<a :href="user.url || user.uri" target="_blank">%i18n:@view-remote%</a></div>
<main>
@@ -11,6 +11,7 @@
</div>
<div class="side">
<x-profile :user="user"/>
<x-twitter :user="user" v-if="user.host === null && user.twitter"/>
<mk-calendar @chosen="warp" :start="new Date(user.createdAt)"/>
<mk-activity :user="user"/>
<x-photos :user="user"/>
@@ -35,6 +36,7 @@ import XProfile from './user.profile.vue';
import XPhotos from './user.photos.vue';
import XFollowersYouKnow from './user.followers-you-know.vue';
import XFriends from './user.friends.vue';
import XTwitter from './user.twitter.vue';
export default Vue.extend({
components: {
@@ -43,7 +45,8 @@ export default Vue.extend({
XProfile,
XPhotos,
XFollowersYouKnow,
XFriends
XFriends,
XTwitter
},
data() {
return {
@@ -146,10 +149,10 @@ root(isDark)
i
color #ccc
.zwwan0di1v4356rmdbjmwnn32tptpdp2[data-darkmode]
.xygkxeaeontfaokvqmiblezmhvhostak[data-darkmode]
root(true)
.zwwan0di1v4356rmdbjmwnn32tptpdp2:not([data-darkmode])
.xygkxeaeontfaokvqmiblezmhvhostak:not([data-darkmode])
root(false)
</style>

View File

@@ -38,6 +38,7 @@ import MkSettings from './views/pages/settings.vue';
import MkReversi from './views/pages/reversi.vue';
import MkTag from './views/pages/tag.vue';
import MkShare from './views/pages/share.vue';
import MkFollow from '../common/views/pages/follow.vue';
/**
* init
@@ -80,7 +81,8 @@ init((launch) => {
{ path: '/@:user', component: MkUser },
{ path: '/@:user/followers', component: MkFollowers },
{ path: '/@:user/following', component: MkFollowing },
{ path: '/notes/:note', component: MkNote }
{ path: '/notes/:note', component: MkNote },
{ path: '/authorize-follow', component: MkFollow }
]
});

View File

@@ -40,9 +40,6 @@
<span v-if="p.deletedAt" style="opacity: 0.5">(%i18n:@deleted%)</span>
<misskey-flavored-markdown v-if="p.text" :text="p.text" :i="$store.state.i"/>
</div>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<div class="media" v-if="p.media.length > 0">
<mk-media-list :media-list="p.media" :raw="true"/>
</div>
@@ -197,7 +194,8 @@ export default Vue.extend({
(this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.p,
compact: true
compact: true,
big: true
});
},
menu() {
@@ -369,31 +367,6 @@ root(isDark)
display block
max-width 100%
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 8px 0 0
padding 2px 8px 2px 16px
font-size 90%
color #8d969e
background #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background #fff
border-radius 100%
> .time
font-size 16px
color isDark ? #606984 : #c0c0c0

View File

@@ -32,9 +32,6 @@
<mk-media-list :media-list="p.media"/>
</div>
<mk-poll v-if="p.poll" :note="p" ref="pollViewer"/>
<div class="tags" v-if="p.tags && p.tags.length > 0">
<router-link v-for="tag in p.tags" :key="tag" :to="`/tags/${tag}`">{{ tag }}</router-link>
</div>
<mk-url-preview v-for="url in urls" :url="url" :key="url"/>
<a class="location" v-if="p.geo" :href="`http://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
<div class="map" v-if="p.geo" ref="map"></div>
@@ -213,7 +210,8 @@ export default Vue.extend({
(this as any).os.new(MkReactionPicker, {
source: this.$refs.reactButton,
note: this.p,
compact: true
compact: true,
big: true
});
},
@@ -416,31 +414,6 @@ root(isDark)
.mk-url-preview
margin-top 8px
> .tags
margin 4px 0 0 0
> *
display inline-block
margin 0 0 4px 6px
padding 2px 8px 2px 16px
font-size 90%
color $theme-color
background isDark ? #313543 : #edf0f3
border-radius 4px
&:before
content ""
display block
position absolute
top 0
bottom 0
left 4px
width 8px
height 8px
margin auto 0
background isDark ? #282c37 : #fff
border-radius 100%
> .media
> img
display block

View File

@@ -13,6 +13,7 @@
<ui-switch v-model="darkmode">%i18n:@dark-mode%</ui-switch>
<ui-switch v-model="$store.state.settings.circleIcons" @change="onChangeCircleIcons">%i18n:@circle-icons%</ui-switch>
<ui-switch v-model="$store.state.settings.iLikeSushi" @change="onChangeILikeSushi">%i18n:common.i-like-sushi%</ui-switch>
<ui-switch v-model="$store.state.settings.reversiBoardLabels" @change="onChangeReversiBoardLabels">%i18n:common.show-reversi-board-labels%</ui-switch>
<div>
<div>%i18n:@timeline%</div>
@@ -182,6 +183,13 @@ export default Vue.extend({
});
},
onChangeReversiBoardLabels(v) {
this.$store.dispatch('settings/set', {
key: 'reversiBoardLabels',
value: v
});
},
onChangeShowReplyTarget(v) {
this.$store.dispatch('settings/set', {
key: 'showReplyTarget',

View File

@@ -19,7 +19,8 @@ const defaultSettings = {
loadRemoteMedia: true,
disableViaMobile: false,
memo: null,
iLikeSushi: false
iLikeSushi: false,
reversiBoardLabels: false
};
const defaultDeviceSettings = {

View File

@@ -9,7 +9,7 @@ export type TextElementSearch = {
};
export default function(text: string) {
const match = text.match(/^(.+?) 検索(\n|$)/);
const match = text.match(/^(.+?) (検索|Search)(\n|$)/i);
if (!match) return null;
return {
type: 'search',

View File

@@ -9,7 +9,7 @@ export type TextElementTitle = {
};
export default function(text: string) {
const match = text.match(/^【(.+?)】\n/);
const match = text.match(/^(【|\[)(.+?)(】|])\n/);
if (!match) return null;
const title = match[0];
return {

View File

@@ -47,16 +47,28 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
const object = await resolver.resolve(value) as any;
if (
object == null ||
object.type !== 'Person' ||
typeof object.preferredUsername !== 'string' ||
typeof object.inbox !== 'string' ||
!validateUsername(object.preferredUsername) ||
!isValidName(object.name == '' ? null : object.name)
) {
log(`invalid person: ${JSON.stringify(object, null, 2)}`);
throw new Error('invalid person');
if (object == null) {
throw new Error('invalid person: object is null');
}
if (object.type != 'Person' && object.type != 'Service') {
throw new Error('invalid person: object is not a person or service');
}
if (typeof object.preferredUsername !== 'string') {
throw new Error('invalid person: preferredUsername is not a string');
}
if (typeof object.inbox !== 'string') {
throw new Error('invalid person: inbox is not a string');
}
if (!validateUsername(object.preferredUsername)) {
throw new Error('invalid person: invalid username');
}
if (!isValidName(object.name == '' ? null : object.name)) {
throw new Error('invalid person: invalid name');
}
const person: IPerson = object;
@@ -81,6 +93,8 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
const host = toUnicode(finger.subject.replace(/^.*?@/, '')).toLowerCase();
const isBot = object.type == 'Service';
// Create user
let user: IRemoteUser;
try {
@@ -105,7 +119,8 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
inbox: person.inbox,
endpoints: person.endpoints,
uri: person.id,
url: person.url
url: person.url,
isBot
}) as IRemoteUser;
} catch (e) {
// duplicate key error

View File

@@ -2,12 +2,14 @@ import renderImage from './image';
import renderKey from './key';
import config from '../../../config';
import { ILocalUser } from '../../../models/user';
import toHtml from '../../../mfm/html';
import parse from '../../../mfm/parse';
export default (user: ILocalUser) => {
const id = `${config.url}/users/${user._id}`;
return {
type: 'Person',
type: user.isBot ? 'Service' : 'Person',
id,
inbox: `${id}/inbox`,
outbox: `${id}/outbox`,
@@ -15,7 +17,7 @@ export default (user: ILocalUser) => {
url: `${config.url}/@${user.username}`,
preferredUsername: user.username,
name: user.name,
summary: user.description,
summary: toHtml(parse(user.description)),
icon: user.avatarId && renderImage(user.avatarId),
image: user.bannerId && renderImage(user.bannerId),
manuallyApprovesFollowers: user.isLocked,

View File

@@ -11,7 +11,7 @@ import renderNote from '../remote/activitypub/renderer/note';
import renderKey from '../remote/activitypub/renderer/key';
import renderPerson from '../remote/activitypub/renderer/person';
import renderOrderedCollection from '../remote/activitypub/renderer/ordered-collection';
//import parseAcct from '../acct/parse';
import parseAcct from '../acct/parse';
import config from '../config';
// Init router
@@ -142,20 +142,6 @@ router.get('/@:user', async (ctx, next) => {
userInfo(ctx, user);
});
// follow form
router.get('/authorize-follow', async ctx => {
/* TODO
const { username, host } = parseAcct(ctx.query.acct);
if (host === null) {
res.sendStatus(422);
return;
}
const finger = await request(`https://${host}`)
*/
});
//#endregion
export default router;

View File

@@ -26,52 +26,31 @@ type Type = 'reply' | 'renote' | 'quote' | 'mention';
*/
class NotificationManager {
private notifier: IUser;
private note: any;
private queue: Array<{
notifiee: ILocalUser['_id'],
type: Type;
}> = [];
private note: INote;
constructor(notifier: IUser, note: any) {
constructor(notifier: IUser, note: INote) {
this.notifier = notifier;
this.note = note;
}
public push(notifiee: ILocalUser['_id'], type: Type) {
public async push(notifiee: ILocalUser['_id'], type: Type) {
// 自分自身へは通知しない
if (this.notifier._id.equals(notifiee)) return;
const exist = this.queue.find(x => x.notifiee.equals(notifiee));
// ミュート情報を取得
const mentioneeMutes = await Mute.find({
muterId: notifiee
});
if (exist) {
// 「メンションされているかつ返信されている」場合は、メンションとしての通知ではなく返信としての通知にする
if (type != 'mention') {
exist.type = type;
}
} else {
this.queue.push({
notifiee, type
const mentioneesMutedUserIds = mentioneeMutes.map(m => m.muteeId.toString());
// 通知される側のユーザーが通知する側のユーザーをミュートしていない限りは通知する
if (!mentioneesMutedUserIds.includes(this.notifier._id.toString())) {
notify(notifiee, this.notifier._id, type, {
noteId: this.note._id
});
}
}
public deliver() {
this.queue.forEach(async x => {
// ミュート情報を取得
const mentioneeMutes = await Mute.find({
muterId: x.notifiee
});
const mentioneesMutedUserIds = mentioneeMutes.map(m => m.muteeId.toString());
// 通知される側のユーザーが通知する側のユーザーをミュートしていない限りは通知する
if (!mentioneesMutedUserIds.includes(this.notifier._id.toString())) {
notify(x.notifiee, this.notifier._id, x.type, {
noteId: this.note._id
});
}
});
}
}
export default async (user: IUser, data: {
@@ -213,7 +192,7 @@ export default async (user: IUser, data: {
// Serialize
const noteObj = await pack(note);
const nm = new NotificationManager(user, noteObj);
const nm = new NotificationManager(user, note);
const render = async () => {
const content = data.renote && data.text == null

View File

@@ -93,6 +93,40 @@ describe('Text', () => {
assert.equal(tokens[0].type, 'inline-code');
assert.equal(tokens[0].content, '`var x = "Strawberry Pasta";`');
});
it('search', () => {
const tokens1 = analyze('a b c 検索');
assert.deepEqual([
{ type: 'search', content: 'a b c 検索', query: 'a b c'}
], tokens1);
const tokens2 = analyze('a b c Search');
assert.deepEqual([
{ type: 'search', content: 'a b c Search', query: 'a b c'}
], tokens2);
const tokens3 = analyze('a b c search');
assert.deepEqual([
{ type: 'search', content: 'a b c search', query: 'a b c'}
], tokens3);
const tokens4 = analyze('a b c SEARCH');
assert.deepEqual([
{ type: 'search', content: 'a b c SEARCH', query: 'a b c'}
], tokens4);
});
it('title', () => {
const tokens1 = analyze('【yee】\nhaw');
assert.deepEqual(
{ type: 'title', content: '【yee】\n', title: 'yee'}
, tokens1[0]);
const tokens2 = analyze('[yee]\nhaw');
assert.deepEqual(
{ type: 'title', content: '[yee]\n', title: 'yee'}
, tokens2[0]);
});
});
describe('syntax highlighting', () => {