Compare commits
142 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
de55794761 | ||
![]() |
a23ef386ea | ||
![]() |
572aa662f6 | ||
![]() |
8b10bee881 | ||
![]() |
f492458d85 | ||
![]() |
d2289039d6 | ||
![]() |
019fbf5268 | ||
![]() |
8d7b04b0e2 | ||
![]() |
6e1f8d0533 | ||
![]() |
b412d2a30a | ||
![]() |
cbd9f57468 | ||
![]() |
2e0ee21964 | ||
![]() |
24b20b8d32 | ||
![]() |
d1843e2e27 | ||
![]() |
30e7aa23d8 | ||
![]() |
9f5c22e7c2 | ||
![]() |
4f88739b01 | ||
![]() |
18c50c82bc | ||
![]() |
0b87b16cba | ||
![]() |
d454cf7493 | ||
![]() |
66e5b36d16 | ||
![]() |
f582cd5c71 | ||
![]() |
bf731897a3 | ||
![]() |
a823792d8d | ||
![]() |
9e894dfd55 | ||
![]() |
bd90ebeafd | ||
![]() |
ee12027739 | ||
![]() |
e02f3558eb | ||
![]() |
f410e1c4fa | ||
![]() |
e41bc54d43 | ||
![]() |
1599e06ffb | ||
![]() |
84c49a23c9 | ||
![]() |
95c94758cb | ||
![]() |
3bc5c5914b | ||
![]() |
69d2cd3b6d | ||
![]() |
4bca467bd3 | ||
![]() |
20061ae5a1 | ||
![]() |
78867c3cc9 | ||
![]() |
f8911cad32 | ||
![]() |
dd9a461cf5 | ||
![]() |
1516ce86f4 | ||
![]() |
58ab04f2f4 | ||
![]() |
3e651e3ea2 | ||
![]() |
b02c00eb41 | ||
![]() |
a9ee45d977 | ||
![]() |
156e66438a | ||
![]() |
9ac34badad | ||
![]() |
fdf145657d | ||
![]() |
f93e0a624e | ||
![]() |
c8e3af32be | ||
![]() |
62b3a49b5f | ||
![]() |
be88eee8f6 | ||
![]() |
e7fb192f5d | ||
![]() |
18e2ca89b7 | ||
![]() |
ec8c388f99 | ||
![]() |
a1518df41a | ||
![]() |
312ef38d62 | ||
![]() |
ed3e0a9d9c | ||
![]() |
d7ca93b9fa | ||
![]() |
910dfd6ad2 | ||
![]() |
041415519b | ||
![]() |
0ba877fef1 | ||
![]() |
839c93961c | ||
![]() |
30b1be97dd | ||
![]() |
55be57ad21 | ||
![]() |
58064ec633 | ||
![]() |
d63044a15e | ||
![]() |
5422697397 | ||
![]() |
36c2f8fe5d | ||
![]() |
2defddc153 | ||
![]() |
fb9a219349 | ||
![]() |
3b5e4276c8 | ||
![]() |
fab2e08a0d | ||
![]() |
19e9099a78 | ||
![]() |
91c2b07cd8 | ||
![]() |
fd00c7bd81 | ||
![]() |
8919082179 | ||
![]() |
2f7c191547 | ||
![]() |
80519dc366 | ||
![]() |
4d53c813e4 | ||
![]() |
750f479d58 | ||
![]() |
e9a7e99108 | ||
![]() |
ebf10b3452 | ||
![]() |
5d621f5318 | ||
![]() |
35dedfc7e4 | ||
![]() |
39094adfcf | ||
![]() |
74a25bfaa0 | ||
![]() |
04ef2f0c8d | ||
![]() |
fb99906a8c | ||
![]() |
da0d3e4129 | ||
![]() |
3ffe90146c | ||
![]() |
81cea41154 | ||
![]() |
3ff4f53bbd | ||
![]() |
a77f67fc32 | ||
![]() |
47c45d48b1 | ||
![]() |
cdd9585cb8 | ||
![]() |
db60188847 | ||
![]() |
21a2e5f415 | ||
![]() |
2377c9b4cb | ||
![]() |
296f6b1553 | ||
![]() |
e15643ca46 | ||
![]() |
9632ba40cc | ||
![]() |
a2cdeeb6c7 | ||
![]() |
a23857ce3c | ||
![]() |
78677b3aa7 | ||
![]() |
7dd264953f | ||
![]() |
17af9c3ab6 | ||
![]() |
4b49f8fbb8 | ||
![]() |
e253225c66 | ||
![]() |
6abb6f90f6 | ||
![]() |
9fb2743a38 | ||
![]() |
17792716a7 | ||
![]() |
ae7282358e | ||
![]() |
abc082f7c0 | ||
![]() |
bf1163ae84 | ||
![]() |
be74ca472a | ||
![]() |
31b472fa47 | ||
![]() |
b502627494 | ||
![]() |
a8017369d0 | ||
![]() |
3f0b5e4318 | ||
![]() |
aea8f93e02 | ||
![]() |
874411990b | ||
![]() |
780268f70e | ||
![]() |
3a8a374e87 | ||
![]() |
488f36d491 | ||
![]() |
4d48b0be99 | ||
![]() |
44f3888c24 | ||
![]() |
a76fb4c173 | ||
![]() |
e4aa003157 | ||
![]() |
247f334334 | ||
![]() |
509cdae832 | ||
![]() |
5ff59b3339 | ||
![]() |
2b1a785f24 | ||
![]() |
2c0b137848 | ||
![]() |
ef68e633cf | ||
![]() |
e9e63ba950 | ||
![]() |
3fd6167e71 | ||
![]() |
6b0573ded1 | ||
![]() |
e2c3d4f2fb | ||
![]() |
60229d73c9 | ||
![]() |
c6cbadc514 | ||
![]() |
3c3c67a34c |
@@ -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>
|
||||
|
||||

|
||||

|
||||
|
||||
:sparkles: Features
|
||||
----------------------------------------------------------------
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
209
locales/en.yml
209
locales/en.yml
@@ -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: "What’s 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"
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
@@ -3,7 +3,7 @@ meta:
|
||||
lang: "Français"
|
||||
divider: ""
|
||||
common:
|
||||
misskey: "A ⭐ of fediverse"
|
||||
misskey: "Une ⭐ du 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: "C’est votre tour"
|
||||
opponent-turn: "Tour de l’adversaire"
|
||||
turn-of: "C’est 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"
|
||||
|
@@ -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]) => {
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
@@ -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"
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
@@ -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: "投稿と返信"
|
||||
|
30
package.json
30
package.json
@@ -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": {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
export default () => [
|
||||
'(=^・・^=)',
|
||||
'v(‘ω’)v',
|
||||
'v(\'ω\')v',
|
||||
'🐡( \'-\' 🐡 )フグパンチ!!!!'
|
||||
][Math.floor(Math.random() * 3)];
|
||||
|
@@ -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>
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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>
|
||||
|
215
src/client/app/common/views/pages/follow.vue
Normal file
215
src/client/app/common/views/pages/follow.vue
Normal 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>
|
@@ -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 }
|
||||
]
|
||||
});
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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',
|
||||
|
@@ -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/>
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
|
26
src/client/app/desktop/views/pages/user/user.twitter.vue
Normal file
26
src/client/app/desktop/views/pages/user/user.twitter.vue
Normal 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>
|
@@ -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>
|
||||
|
@@ -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 }
|
||||
]
|
||||
});
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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',
|
||||
|
@@ -19,7 +19,8 @@ const defaultSettings = {
|
||||
loadRemoteMedia: true,
|
||||
disableViaMobile: false,
|
||||
memo: null,
|
||||
iLikeSushi: false
|
||||
iLikeSushi: false,
|
||||
reversiBoardLabels: false
|
||||
};
|
||||
|
||||
const defaultDeviceSettings = {
|
||||
|
@@ -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',
|
||||
|
@@ -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 {
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
34
test/mfm.ts
34
test/mfm.ts
@@ -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', () => {
|
||||
|
Reference in New Issue
Block a user