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