mirror of https://github.com/andrigamerita/simpkey
v1.1.0: English translation
This commit is contained in:
parent
3ac67e3fca
commit
725abcf62f
2
LICENSE
2
LICENSE
|
@ -1,5 +1,5 @@
|
||||||
simpkey
|
simpkey
|
||||||
Copyright (C) 2020 Xeltica
|
Copyright (C) 2020 Xeltica, 2022 OctoSpacc
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU Affero General Public License as
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
|
25
README.md
25
README.md
|
@ -2,26 +2,21 @@
|
||||||
|
|
||||||
**Use misskey without JavaScript 🥴**
|
**Use misskey without JavaScript 🥴**
|
||||||
|
|
||||||
Simpkey is a HTML-Form based server-side-processing misskey client.
|
_English-translated fork - Original Japanese repo at <https://github.com/EbiseLutica/simpkey>_
|
||||||
|
|
||||||
It is suitable if you are using a legacy computer, or you are not prefer to enable JavaScript.
|
Simpkey is a HTML-Form based server-side-processing Misskey client.
|
||||||
|
It is suitable if you're using a legacy computer, or you prefer not to enable JavaScript.
|
||||||
|
|
||||||
## build
|
## Usage
|
||||||
|
|
||||||
```
|
```sh
|
||||||
# ???????????
|
yarn install # Get dependencies
|
||||||
yarn install
|
yarn build # Get
|
||||||
|
|
||||||
# ????????
|
yarn start # Finally, run normally
|
||||||
yarn build
|
yarn watch # Finally, run in development status (with hot reload)
|
||||||
|
|
||||||
# ???????
|
|
||||||
yarn start
|
|
||||||
|
|
||||||
# watch ????????????????????
|
|
||||||
yarn watch
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## LICENSE
|
## LICENSE
|
||||||
|
|
||||||
[AGPL 3.0](LICENSE)
|
[AGPL 3.0](LICENSE)
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
export default {
|
export default {
|
||||||
version: '1.0.0',
|
version: '1.1.0',
|
||||||
changelog: [
|
changelog: [
|
||||||
'きりがなかったので正式リリース',
|
'Translate the software interface to English.',
|
||||||
'Misskeyにアクセスする際にUserAgentを正しく送るように',
|
'Official release because there was no end to it.',
|
||||||
|
'Correctly send UserAgent when accessing Misskey.',
|
||||||
],
|
],
|
||||||
};
|
};
|
|
@ -7,11 +7,11 @@ import { die } from './die';
|
||||||
export const router = new Router<DefaultState, Context>();
|
export const router = new Router<DefaultState, Context>();
|
||||||
|
|
||||||
const staticRouting = [
|
const staticRouting = [
|
||||||
[ 'about', 'Simpkey について' ],
|
[ 'about', 'About Simpkey' ],
|
||||||
[ 'terms', '利用規約' ],
|
[ 'terms', 'Terms of Use' ],
|
||||||
[ 'privacy-policy', 'プライバシーポリシー' ],
|
[ 'privacy-policy', 'Privacy Policy' ],
|
||||||
[ 'settings', '設定' ],
|
[ 'settings', 'Settings' ],
|
||||||
[ 'help', 'ヘルプ' ],
|
[ 'help', 'Help' ],
|
||||||
];
|
];
|
||||||
|
|
||||||
for (const [ name, title ] of staticRouting) {
|
for (const [ name, title ] of staticRouting) {
|
||||||
|
@ -46,21 +46,21 @@ router.get('/', async ctx => {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await timeline(ctx, host, 'notes/timeline', 'ホームタイムライン', token);
|
await timeline(ctx, host, 'notes/timeline', 'Home Timeline', token);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/ltl', async ctx => {
|
router.get('/ltl', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const meta = await api<any>(host, 'meta', { i: token });
|
const meta = await api<any>(host, 'meta', { i: token });
|
||||||
if (meta.disableLocalTimeline) {
|
if (meta.disableLocalTimeline) {
|
||||||
await die(ctx, 'ローカルタイムラインは無効化されています');
|
await die(ctx, 'Local timeline has been disabled');
|
||||||
} else {
|
} else {
|
||||||
await timeline(ctx, host, 'notes/local-timeline', 'ローカルタイムライン', token);
|
await timeline(ctx, host, 'notes/local-timeline', 'Local Timeline', token);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -68,14 +68,14 @@ router.get('/stl', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const meta = await api<any>(host, 'meta', { i: token });
|
const meta = await api<any>(host, 'meta', { i: token });
|
||||||
if (meta.disableLocalTimeline) {
|
if (meta.disableLocalTimeline) {
|
||||||
await die(ctx, 'ソーシャルタイムラインは無効化されています');
|
await die(ctx, 'Social timeline has been disabled');
|
||||||
} else {
|
} else {
|
||||||
await timeline(ctx, host, 'notes/hybrid-timeline', 'ソーシャルタイムライン', token);
|
await timeline(ctx, host, 'notes/hybrid-timeline', 'Social Timeline', token);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -83,15 +83,15 @@ router.get('/gtl', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const meta = await api<any>(host, 'meta', { i: token });
|
const meta = await api<any>(host, 'meta', { i: token });
|
||||||
if (meta.disableGlobalTimeline) {
|
if (meta.disableGlobalTimeline) {
|
||||||
await die(ctx, 'グローバルタイムラインは無効化されています');
|
await die(ctx, 'Global timeline has been disabled');
|
||||||
} else {
|
} else {
|
||||||
await timeline(ctx, host, 'notes/global-timeline', 'グローバルタイムライン', token);
|
await timeline(ctx, host, 'notes/global-timeline', 'Global Timeline', token);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ router.get('/notifications', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ router.get('/renote/:noteId', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ router.get('/reply/:noteId', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +153,7 @@ router.get('/react/:noteId', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,7 +174,7 @@ router.get('/@:acct', async ctx => {
|
||||||
const token = ctx.cookies.get('i');
|
const token = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!token || !host) {
|
if (!token || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ router.post('/', async ctx => {
|
||||||
token
|
token
|
||||||
} = ctx.request.body;
|
} = ctx.request.body;
|
||||||
if (!host || !username || !password) {
|
if (!host || !username || !password) {
|
||||||
await die(ctx, 'パラメータが足りません');
|
await die(ctx, 'Some parameters are missing. Please retry.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -221,7 +221,7 @@ router.post('/action/:action', async ctx => {
|
||||||
const i = ctx.cookies.get('i');
|
const i = ctx.cookies.get('i');
|
||||||
const host = ctx.cookies.get('host');
|
const host = ctx.cookies.get('host');
|
||||||
if (!i || !host) {
|
if (!i || !host) {
|
||||||
await die(ctx, 'ログインしてください');
|
await die(ctx, 'Please login');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ router.post('/action/:action', async ctx => {
|
||||||
case 'react': {
|
case 'react': {
|
||||||
const { noteId, reaction, customReaction } = ctx.request.body;
|
const { noteId, reaction, customReaction } = ctx.request.body;
|
||||||
if (!noteId) throw new Error('noteId required');
|
if (!noteId) throw new Error('noteId required');
|
||||||
if (!reaction) throw new Error('絵文字が指定されていません');
|
if (!reaction) throw new Error('No emoji was specified');
|
||||||
await api(host, 'notes/reactions/create', { i, noteId, reaction: reaction === 'custom' ? customReaction : reaction });
|
await api(host, 'notes/reactions/create', { i, noteId, reaction: reaction === 'custom' ? customReaction : reaction });
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -270,5 +270,5 @@ router.post('/logout', ctx => {
|
||||||
// Return 404 for other pages
|
// Return 404 for other pages
|
||||||
router.all('(.*)', async ctx => {
|
router.all('(.*)', async ctx => {
|
||||||
ctx.status = 404;
|
ctx.status = 404;
|
||||||
await die(ctx, 'ページが見つかりませんでした');
|
await die(ctx, 'Resource not found');
|
||||||
});
|
});
|
|
@ -1,32 +1,32 @@
|
||||||
include _components
|
include _components
|
||||||
|
|
||||||
html
|
html
|
||||||
head
|
head
|
||||||
meta(charset="UTF-8")
|
meta(charset="UTF-8")
|
||||||
link(href='https://unpkg.com/sanitize.css' rel='stylesheet')
|
link(href='https://unpkg.com/sanitize.css' rel='stylesheet')
|
||||||
meta(name="viewport", content="width=device-width, initial-scale=1.0")
|
meta(name="viewport", content="width=device-width, initial-scale=1.0")
|
||||||
block meta
|
block meta
|
||||||
title= title
|
title= title
|
||||||
style.
|
style.
|
||||||
body {
|
body {
|
||||||
font-family: "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif;
|
font-family: "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN", "Hiragino Sans", Meiryo, sans-serif;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
}
|
}
|
||||||
body
|
body
|
||||||
header
|
header
|
||||||
h1: a(href="/") Simpkey
|
h1: a(href="/") Simpkey
|
||||||
block header
|
block header
|
||||||
main
|
main
|
||||||
block content
|
block content
|
||||||
|
|
||||||
footer
|
footer
|
||||||
hr
|
hr
|
||||||
div
|
div
|
||||||
a(href="/privacy-policy") プライバシーポリシー
|
a(href="/privacy-policy") Privacy Policy
|
||||||
| ・
|
| ・
|
||||||
a(href="/terms") 利用規約
|
a(href="/terms") Terms of Use
|
||||||
| ・
|
| ・
|
||||||
a(href="/help") ヘルプ
|
a(href="/help") Help
|
||||||
p (C)2020 Xeltica -
|
p (C) 2020 Xeltica, 2022 OctoSpacc ・
|
||||||
a(href="/about") version #{version}
|
a(href="/about") v#{version}
|
||||||
block footer
|
block footer
|
|
@ -1,20 +1,21 @@
|
||||||
|
|
||||||
mixin avatar(user)
|
mixin avatar(user)
|
||||||
img.avatar(src=user.avatarUrl, alt="avatar for " + user.username style="width: 64px; height: 64px; border-radius: 50%")&attributes(attributes)
|
img.avatar(src=user.avatarUrl, alt="Avatar for " + user.username style="width:64px; height:64px; border-radius:50%;")&attributes(attributes)
|
||||||
|
|
||||||
mixin note-header(note)
|
mixin note-header(note)
|
||||||
header&attributes(attributes)
|
header&attributes(attributes)
|
||||||
a(href="/" + getAcct(note.user))
|
a(href="/" + getAcct(note.user))
|
||||||
span.name= getUserName(note.user)
|
span.name= getUserName(note.user)
|
||||||
span.acct(style="color: gray")= getAcct(note.user)
|
spamn
|
||||||
|
span.acct(style="color:gray;")= getAcct(note.user)
|
||||||
if note.user.isAdmin
|
if note.user.isAdmin
|
||||||
span.bot [ADMIN]
|
span.bot [ADMIN]
|
||||||
else if note.user.isModerator
|
else if note.user.isModerator
|
||||||
span.bot [MOD]
|
span.bot [MOD]
|
||||||
if note.user.isBot
|
if note.user.isBot
|
||||||
span.bot [BOT]
|
span.bot [BOT]
|
||||||
if note.user.isCat
|
if note.user.isCat
|
||||||
span.bot [CAT]
|
span.bot [CAT]
|
||||||
|
|
||||||
mixin sub-note(note)
|
mixin sub-note(note)
|
||||||
.sub-note
|
.sub-note
|
||||||
|
@ -33,9 +34,11 @@ mixin sub-note(note)
|
||||||
|
|
||||||
mixin note(note)
|
mixin note(note)
|
||||||
if note.reply
|
if note.reply
|
||||||
+sub-note(note.reply)(style="opacity: 0.5")
|
+sub-note(note.reply)(style="opacity:0.5;")
|
||||||
if note.renote && !note.text
|
if note.renote && !note.text
|
||||||
p: b 🔁 #{getUserName(note.user)} がRenote
|
p
|
||||||
|
b 🔁 #{getUserName(note.user)}
|
||||||
|
span renoted
|
||||||
+note(note.renote)
|
+note(note.renote)
|
||||||
else
|
else
|
||||||
.note&attributes(attributes)
|
.note&attributes(attributes)
|
||||||
|
@ -61,16 +64,16 @@ mixin note(note)
|
||||||
span(class=(key === note.myReaction ? 'my reaction' : 'reaction'))=`${key} ${val}`
|
span(class=(key === note.myReaction ? 'my reaction' : 'reaction'))=`${key} ${val}`
|
||||||
footer
|
footer
|
||||||
|[
|
|[
|
||||||
a(href="/reply/" + note.id) 返信 #{note.repliesCount}
|
a(href="/reply/" + note.id) #{note.repliesCount} Replies
|
||||||
|]
|
|]
|
||||||
if canRenote && canRenote(note)
|
if canRenote && canRenote(note)
|
||||||
|[
|
|[
|
||||||
a(href="/renote/" + note.id) リノート #{note.renoteCount}
|
a(href="/renote/" + note.id) #{note.renoteCount} Renotes
|
||||||
|]
|
|]
|
||||||
if canReact && canReact(note)
|
if canReact && canReact(note)
|
||||||
if !note.myReaction
|
if !note.myReaction
|
||||||
| [
|
| [
|
||||||
a(href="/react/" + note.id) リアクション
|
a(href="/react/" + note.id) React
|
||||||
| ]
|
| ]
|
||||||
else
|
else
|
||||||
form(action="action/unreact", method="post" style="display: inline")
|
form(action="action/unreact", method="post" style="display: inline")
|
||||||
|
@ -81,61 +84,60 @@ mixin post-form(url, placeholder, buttonText)
|
||||||
form(action=url, method="post")
|
form(action=url, method="post")
|
||||||
div: label
|
div: label
|
||||||
input(type="checkbox", name="useCw")
|
input(type="checkbox", name="useCw")
|
||||||
span CW
|
span CW
|
||||||
input(type="text", name="cw" placeholder="注釈(省略可能)" style="max-width: 100%; min-width: 100%;")
|
input(type="text", name="cw" placeholder="Title/Warning (optional)" style="max-width:100%; min-width:100%;")
|
||||||
textarea(name="text", placeholder=placeholder style="max-width: 100%; min-width: 100%; height: 6em; margin-bottom: 8px")
|
textarea(name="text", placeholder=placeholder style="max-width:100%; min-width:100%; height:6em; margin-bottom:8px;")
|
||||||
|
|
||||||
div: label 公開範囲:
|
div: label Privacy:
|
||||||
select(name="visibility")
|
select(name="visibility")
|
||||||
option(value="public") パブリック
|
option(value="public") Public
|
||||||
option(value="home") ホーム
|
option(value="home") Home
|
||||||
option(value="followers") フォロワー
|
option(value="followers") Followers
|
||||||
option(value="direct") ダイレクト
|
option(value="direct") Direct
|
||||||
button(type="submit")= buttonText
|
button(type="submit")= buttonText
|
||||||
block
|
block
|
||||||
|
|
||||||
mixin nav()
|
mixin nav()
|
||||||
div
|
div
|
||||||
|[
|
|[
|
||||||
a(href="/") ホーム
|
a(href="/") Home
|
||||||
|] [
|
|] [
|
||||||
a(href="/ltl") ローカル
|
a(href="/ltl") Local
|
||||||
|] [
|
|] [
|
||||||
a(href="/stl") ソーシャル
|
a(href="/stl") Social
|
||||||
|] [
|
|] [
|
||||||
a(href="/gtl") グローバル
|
a(href="/gtl") Global
|
||||||
|] [
|
|] [
|
||||||
a(href="/notifications") 通知
|
a(href="/notifications") Notifications
|
||||||
|] [
|
|] [
|
||||||
a(href="/settings") 設定
|
a(href="/settings") Settings
|
||||||
|]
|
|]
|
||||||
|
|
||||||
mixin user-header(user, detail = false)
|
mixin user-header(user, detail = false)
|
||||||
if detail
|
if detail
|
||||||
if user.host
|
if user.host
|
||||||
.remote-caution ⚠ リモートのアカウントにつき、情報が正確では無い可能性があります。
|
.remote-caution ⚠️ Information may not be accurate for remote accounts.
|
||||||
a(href=user.url || user.uri, target="_blank", rel="noopener noreferrer") リモートで確認する
|
a(href=user.url || user.uri, target="_blank", rel="noopener noreferrer") Open on remote instance
|
||||||
if user.isSuspended
|
if user.isSuspended
|
||||||
.suspended ⚠ このアカウントは凍結されています
|
.suspended ⚠️ This account has been suspended.
|
||||||
if user.isSilenced
|
if user.isSilenced
|
||||||
.silenced ⚠ このアカウントはサイレンスされています
|
.silenced ⚠️ This account has been silenced.
|
||||||
+avatar(user)
|
+avatar(user)
|
||||||
.name: b=getUserName(user)
|
.name: b=getUserName(user)
|
||||||
|
|
|
|
||||||
span(style="color: gray")= getAcct(user)
|
span(style="color: gray")= getAcct(user)
|
||||||
if user.isFollowed
|
if user.isFollowed
|
||||||
span.is-followed フォローされています
|
span.is-followed フォローされています
|
||||||
|
|
||||||
if user.isLocked
|
if user.isLocked
|
||||||
span.lock
|
span.lock
|
||||||
if user.isAdmin
|
if user.isAdmin
|
||||||
span.bot [ADMIN]
|
span.bot [ADMIN]
|
||||||
else if user.isModerator
|
else if user.isModerator
|
||||||
span.bot [MOD]
|
span.bot [MOD]
|
||||||
if user.isBot
|
if user.isBot
|
||||||
span.bot [BOT]
|
span.bot [BOT]
|
||||||
if user.isCat
|
if user.isCat
|
||||||
span.bot [CAT]
|
span.bot [CAT]
|
||||||
if detail
|
if detail
|
||||||
if user.description
|
if user.description
|
||||||
.description !{mfmToHtml(user.description)}
|
.description !{mfmToHtml(user.description)}
|
||||||
|
@ -144,20 +146,21 @@ mixin user-header(user, detail = false)
|
||||||
if user.location
|
if user.location
|
||||||
.birthday 📍#{user.location}
|
.birthday 📍#{user.location}
|
||||||
if user.sex
|
if user.sex
|
||||||
.sex 性別: #{user.sex}
|
.sex Gender: #{user.sex}
|
||||||
dl
|
dl
|
||||||
each field in user.fields
|
each field in user.fields
|
||||||
dt !{mfmToHtml(field.name)}
|
dt !{mfmToHtml(field.name)}
|
||||||
dd !{mfmToHtml(field.value)}
|
dd !{mfmToHtml(field.value)}
|
||||||
|
|
||||||
.count
|
.count
|
||||||
a.notes(href="/" + getAcct(user)) #{user.notesCount} ノート
|
|[
|
||||||
|
|
a.notes(href="/" + getAcct(user)) #{user.notesCount} Notes
|
||||||
|
|]
|
||||||
//- a.following(href="/" + getAcct(user) + "/following")
|
//- a.following(href="/" + getAcct(user) + "/following")
|
||||||
| #{user.followingCount} フォロー
|
| [#{user.followingCount} Following]
|
||||||
|
|
|
|
||||||
//- a.followers(href="/" + getAcct(user) + "/followers")
|
//- a.followers(href="/" + getAcct(user) + "/followers")
|
||||||
| #{user.followersCount} フォロワー
|
| [#{user.followersCount} Followers]
|
||||||
|
|
||||||
mixin timeline(notes)
|
mixin timeline(notes)
|
||||||
each note in notes
|
each note in notes
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
p Simpkey は、JavaScript のいらない Misskey クライアントです。
|
p Simpkey is a Misskey client that requires no JavaScript.
|
||||||
p: a(href="https://github.com/xeltica/simpkey", target="_blank", rel="noopener noreferrer") リポジトリを見る
|
p: a(href="https://github.com/andrigamerita/simpkey", target="_blank", rel="noopener noreferrer") Source Code
|
||||||
h2 バージョン #{version}
|
h2 Release v#{version}
|
||||||
ul
|
ul
|
||||||
each val in changelog
|
each val in changelog
|
||||||
li= val
|
li= val
|
|
@ -1,6 +1,6 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h2 エラー
|
h2 Error
|
||||||
p= error || '不明なエラーです'
|
p= error || 'Unknown error'
|
||||||
p: a(href="/") トップページに戻る
|
p: a(href="/") Back to top page
|
|
@ -1,27 +1,27 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h2 ヘルプ
|
h2 Help
|
||||||
p Simpkey を使う上でよく聞かれそうな質問をまとめて回答する、なんとまあえらいページです
|
p This is a great page to answer frequently asked questions about using Simpkey!
|
||||||
h3 タイムラインが止まってる気がする
|
h3 I feel like the timeline is stuck.
|
||||||
p Simpkey はリアルタイムでタイムラインが動きません。投稿やリアクションをしたときのように、ページが再読込されないと最新のタイムラインが表示されないのです。
|
p Simpkey does not have a real-time timeline. The latest timeline is not displayed until the page is reloaded, like when you make a post or a reaction.
|
||||||
p ホーム ローカル などのボタンを手動で押すことでタイムラインを読み直すことができるはずなのでそれでお願いします。
|
p You should be able to reload the timeline by manually pressing a button such as home local, so please do that.
|
||||||
span(style="font-size: 0.8em; opacity: 0.4") 昔は手動リロードが当たり前だったんじゃよ(老害)
|
span(style="font-size:0.8em; opacity:0.4") (Manual reloading used to be the norm.)
|
||||||
h3 CW って何?
|
h3 What is CW?
|
||||||
p ノートの本文を隠す機能です。注釈を添えることができるので、ちょっとキツい話をする上での注意書きとか、袋とじとか、一発ギャグとかに使ってください。
|
p It is a function to hide the body of a note. It can be used to add annotations, so use it for notes on slightly harsh stories, baggage, one-shot gags, and so on.
|
||||||
p なお、注釈欄を埋めても CW のチェックボックスを切っていると適用されないので、くれぐれも確認を忘れないように
|
p Note that even if you fill in the annotation field, it will not be applied if the CW checkbox is unchecked, so please do not forget to check it!
|
||||||
h3 ハッシュタグが「ページが見つかりませんでした」と表示される
|
h3 Hashtags are displayed as "Page not found".
|
||||||
p 未実装なんです。ごめんなさい
|
p It's not implemented yet. Sorry.
|
||||||
h3 ノートの時間の前についている絵文字は何?
|
h3 What is the emoji before the time in the note?
|
||||||
p ノートの公開範囲を表すマークです。それぞれ次のような意味があります。
|
p These are marks that indicate the extent of the note's publication. They have the following meanings respectively.
|
||||||
ul
|
ul
|
||||||
li 🌐 - パブリック。誰でも見られる公開範囲
|
li 🌐 - Public. Public range that anyone can see.
|
||||||
li 🏠 - ホーム。投稿主のフォロワーのタイムラインと、自分のユーザーページにのみ表示されます。
|
li 🏠 - Home. Only visible on the timeline of the poster's followers and on their own user page.
|
||||||
li 🔒 - フォロワー。投稿主のフォロワーのタイムラインにのみ表示されます。
|
li 🔒 - Followers. Shows only on the timeline of the poster's followers.
|
||||||
li ✉️ - ダイレクト。指定した人のタイムラインにのみ表示されます。つまりあなた宛ということです。
|
li ✉️ - Direct. Appears only on the timeline of the person you specify. This means it is addressed to you.
|
||||||
li ❓ - 不明。Groundpolis など、特殊仕様の Misskey インスタンスにログインしていると見られるかもしれません。
|
li ❓ - Unknown; may be seen if you are logged into a specially designed instance of Misskey, such as Groundpolis.
|
||||||
li ☣ - ローカル限定。同じホストの人だけが見られる投稿です。
|
li ☣️ - Local only. Posts that can only be seen by people on the same host.
|
||||||
h3 Simpkey という名前の由来は?
|
h3 What is the origin of the name Simpkey?
|
||||||
p Simple + Misskey
|
p Simple + Misskey
|
||||||
h3 その他
|
h3 Other
|
||||||
p その他困ったことがあったら @ebi@misskey.io 宛にメンションで質問すれば答えます
|
p If you have any other problems, you can ask @ebi@misskey.io with a menshion and I'll answer!
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
p Simpkey へようこそ
|
p Welcome to Simpkey
|
||||||
p 使用するインスタンス、ユーザー名、パスワードを入力して、今すぐ始めましょう。
|
p To get started, enter your login data.
|
||||||
form(action="/", method="post")
|
form(action="/", method="post")
|
||||||
div: label インスタンス名:
|
div: label Instance Domain:
|
||||||
input(type="text", name="host", placeholder="例: misskey.io")
|
input(type="text", name="host", placeholder="例: misskey.io")
|
||||||
div: label ユーザー名:
|
div: label Username:
|
||||||
input(type="text", name="username")
|
input(type="text", name="username")
|
||||||
div: label パスワード:
|
div: label Password:
|
||||||
input(type="password", name="password")
|
input(type="password", name="password")
|
||||||
div: label 2段階認証コード (必要なら):
|
div: label 2FA Code (if needed):
|
||||||
input(type="text", name="token")
|
input(type="text", name="token")
|
||||||
p ログインする前に下部の「利用規約」「プライバシーポリシー」「ヘルプ」には目を通しておいてください。
|
p Before logging in, please read the "Terms of Use", "Privacy Policy", and "Help" at the bottom.
|
||||||
button(type="submit") ログイン
|
button(type="submit") Login!
|
|
@ -4,21 +4,25 @@ block header
|
||||||
+nav
|
+nav
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h2 通知
|
h2 Notifications
|
||||||
.notifications
|
.notifications
|
||||||
each val in notifications
|
each val in notifications
|
||||||
.notification
|
.notification
|
||||||
hr
|
hr
|
||||||
case val.type
|
case val.type
|
||||||
when 'follow'
|
when 'follow'
|
||||||
p #{getUserName(val.user)} さんにフォローされました
|
p
|
||||||
|
b #{getUserName(val.user)}
|
||||||
|
span is following you
|
||||||
when 'mention'
|
when 'mention'
|
||||||
when 'reply'
|
when 'reply'
|
||||||
when 'renote'
|
when 'renote'
|
||||||
when 'quote'
|
when 'quote'
|
||||||
+note(val.note)
|
+note(val.note)
|
||||||
when 'reaction'
|
when 'reaction'
|
||||||
p #{getUserName(val.user)} さんが #{val.reaction} とリアクションしました
|
p
|
||||||
|
b #{getUserName(val.user)}
|
||||||
|
span reacted with #{val.reaction}
|
||||||
+sub-note(val.note)
|
+sub-note(val.note)
|
||||||
when 'pollVote'
|
when 'pollVote'
|
||||||
p #{getUserName(val.user)} さんが投票しました
|
p #{getUserName(val.user)} さんが投票しました
|
||||||
|
@ -30,4 +34,4 @@ block content
|
||||||
when 'groupInvited'
|
when 'groupInvited'
|
||||||
when 'app'
|
when 'app'
|
||||||
default
|
default
|
||||||
p #{val.type} 通知(未実装)
|
p #{val.type} Notification (not yet implemented)
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h2 プライバシーポリシー
|
h2 Privacy Policy
|
||||||
p 本サイトのプライバシーポリシーを以下に示します。本サイトのサービスをご利用いただいた時点で、自動的にポリシーに同意したものとみなされます。
|
p The following is the privacy policy for this site. By using this site's services, you automatically agree to the policy.
|
||||||
|
|
||||||
h3 個人情報の利用目的
|
h3 Purpose of Use of Personal Information
|
||||||
p 本サイトでは、対象とする Misskey インスタンスにログインする際にユーザー名およびパスワードを入力する必要があります。
|
p The Site requires you to enter your user name and password when you log in to your target instance of Misskey.
|
||||||
p これらの情報は対象の Misskey インスタンスにログインするためだけに使用されます。本サイト自体は、ユーザーの入力したユーザー名・パスワードを一切収集致しません。
|
p This information is only used to log in to the applicable instance of Misskey. The Site itself does not collect any username/password entered by the user.
|
||||||
p また、本サイトではユーザーの IP アドレスを収集しています。収集された IP アドレスは、利用規約への違反を行ったユーザーの特定および処分の為に使用されます。
|
p The site also collects the user's IP address. The IP addresses collected are used to identify and take action against users who violate the Terms of Use.
|
||||||
|
|
||||||
h3 個人情報の第三者への開示
|
h3 Disclosure of Personal Information to Third Parties
|
||||||
p 悪質な違反行為を行ったユーザーに対する処罰の一環としてプロバイダーへの通報を行う場合や、法令に基づく要請がある場合を除き、収集した個人情報を外部に開示することはありません。また、個人情報の取扱を第三者に委託することもありません。
|
p Personal information collected will not be disclosed to outside parties, except when reporting malicious violations to providers as part of the punishment of users who have committed such violations, or when required by law. We also do not outsource the handling of personal information to third parties.
|
||||||
|
|
||||||
h3 免責事項
|
h3 Disclaimer
|
||||||
p 本サイトを通じてアクセスする Misskey インスタンスにつきましては、本プライバシーポリシーは適用されません。別途、当該インスタンスのプライバシーポリシーをご確認頂く必要があります。本サイトでは、アクセス先のインスタンスにて取り扱われる個人情報については一切の責任を負いません。
|
p This Privacy Policy does not apply to Misskey instances accessed through the Site. You should separately review the privacy policy of the instance in question. This site is not responsible for any personal information handled by the instances accessed through this site.
|
||||||
|
|
||||||
h3 変更について
|
h3 Changes
|
||||||
p 当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。
|
p This site will comply with Japanese laws and regulations applicable to personal information, and will review and improve the contents of this policy from time to time.
|
||||||
p 修正された最新のプライバシーポリシーは常に本ページにて開示されます。
|
p The latest privacy policy as amended will always be disclosed on this page.
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
if canReact
|
if canReact
|
||||||
h2 このノートにリアクションを押しますか?
|
h2 Want to react to this note?
|
||||||
+sub-note(note)
|
+sub-note(note)
|
||||||
form(action="/action/react", method="post")
|
form(action="/action/react", method="post")
|
||||||
each val in reactions
|
each val in reactions
|
||||||
div: label
|
div: label
|
||||||
input(type="radio", name="reaction" value=val)
|
input(type="radio", name="reaction" value=val)
|
||||||
!= val
|
!= val
|
||||||
div: label
|
div: label
|
||||||
input(type="radio", name="reaction", value="custom")
|
input(type="radio", name="reaction", value="custom")
|
||||||
input(type="text", name="customReaction")
|
input(type="text", name="customReaction")
|
||||||
input(type="hidden", name="noteId", value=note.id)
|
input(type="hidden", name="noteId", value=note.id)
|
||||||
|
|
||||||
button(type="submit") リアクションを押す
|
button(type="submit") React!
|
||||||
else
|
else
|
||||||
h2 このノートにはリアクションできません
|
h2 Can't react to this note
|
||||||
+sub-note(note)
|
+sub-note(note)
|
||||||
|
|
|
@ -2,10 +2,10 @@ extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
if canRenote
|
if canRenote
|
||||||
h2 このノートをリノートしますか?
|
h2 Want to renote this note?
|
||||||
+sub-note(note)
|
+sub-note(note)
|
||||||
+post-form('/action/create-note', "コメント(省略可能)", "リノート")
|
+post-form('/action/create-note', "Comment (optional)", "Renote")
|
||||||
input(type="hidden", name="renoteId", value=note.id)
|
input(type="hidden", name="renoteId", value=note.id)
|
||||||
else
|
else
|
||||||
h2 このノートはリノートできません
|
h2 This note can't be renoted
|
||||||
+sub-note(note)
|
+sub-note(note)
|
|
@ -1,7 +1,7 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h2 このノートに返信しますか?
|
h2 Want to reply to this note?
|
||||||
+sub-note(note)
|
+sub-note(note)
|
||||||
+post-form('/action/create-note', "何と返そうか?", "返信")
|
+post-form('/action/create-note', "What to reply with?", "Reply")
|
||||||
input(type="hidden", name="replyId", value=note.id)
|
input(type="hidden", name="replyId", value=note.id)
|
|
@ -1,10 +1,10 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block header
|
block header
|
||||||
+nav
|
+nav
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h2 設定
|
h2 Settings
|
||||||
h3 ユーザー
|
h3 User
|
||||||
form(action="/logout", method="post")
|
form(action="/logout", method="post")
|
||||||
button(type="submit") ログアウト
|
button(type="submit") Logout
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
extends _base
|
extends _base
|
||||||
|
|
||||||
block content
|
block content
|
||||||
h2 利用規約
|
h2 Terms of Use
|
||||||
p 本サイトの利用規約を以下に示します。本サイトのサービスをご利用いただいた時点で、自動的に本規約に同意したものとみなされます。
|
p The following are the Terms of Use for this site. By using the services on this site, you automatically agree to these terms and conditions.
|
||||||
|
|
||||||
h3 禁止行為
|
h3 Prohibited acts
|
||||||
p 以下に定める行為は固く禁じます。
|
p The following acts are strictly prohibited.
|
||||||
ul
|
ul
|
||||||
li サーバーに意図的に過大な負荷を掛ける行為
|
li Intentionally overloading the server
|
||||||
li サーバーソフトウェアの脆弱性を意図的に突くことによって不正なデータを生成したり、システムの一部または全部を使用できなくするといった迷惑行為
|
li Unsolicited acts such as intentionally exploiting server software vulnerabilities to generate unauthorized data or disable part or all of the system
|
||||||
li 接続先のサーバーの利用規約に反する行為
|
li Actions that violate the terms of service of the server to which the user is connecting.
|
||||||
li その他、運営が不適切と認める行為
|
li Other acts deemed inappropriate by the management
|
||||||
p 利用規約に反した場合、お使いのIPアドレスからのアクセスを禁止、悪質であればプロバイダーへの通報を行います。
|
p If you violate the Terms of Service, we will prohibit access from your IP address, and if it is malicious, we will report you to your provider.
|
||||||
|
|
|
@ -5,7 +5,7 @@ block header
|
||||||
|
|
||||||
block content
|
block content
|
||||||
+user-header(user)
|
+user-header(user)
|
||||||
+post-form("/action/create-note", "今なにしてる?", "ノート")
|
+post-form("/action/create-note", "What's on your mind?", "Note")
|
||||||
hr
|
hr
|
||||||
h2= timelineName
|
h2= timelineName
|
||||||
+timeline(notes)
|
+timeline(notes)
|
Loading…
Reference in New Issue