style: some strings

This commit is contained in:
オスカー、 2023-12-16 04:32:12 +09:00
parent 50df8a2e6d
commit d0a95f4eac
No known key found for this signature in database
GPG Key ID: B1EFBBF5C93FF78F
6 changed files with 47 additions and 49 deletions

View File

@ -18,7 +18,7 @@ export const api = async <T extends Record<string, unknown> = Record<string, unk
try {
data = await axios.post<T>(`https://${host}/api/${endpoint}`, a).then(res => res.data);
} catch (e) {
printLog(`接続エラー: ${host}/api/${endpoint} リトライ中 (${i + 1} / ${RETRY_COUNT})\n${e}`, 'error');
printLog(`전송 오류: ${host}/api/${endpoint} - 재시도 중 (${i + 1} / ${RETRY_COUNT})\n${e}`, 'error');
await delay(3000);
continue;
}

View File

@ -51,8 +51,8 @@ export const sendNoteAlert = async (text: string, user: User) => {
*/
export const sendNotificationAlert = async (text: string, user: User) => {
const res = await api(user.host, 'notifications/create', {
header: 'Misskey Tools',
icon: 'https://i.imgur.com/B991yTl.png',
header: 'Misskey Tools on phater.live',
icon: 'https://on.phater.live/logo.png',
body: text,
}, user.token);

View File

@ -34,16 +34,16 @@ export const work = async () => {
const users = await Users.find();
const groupedUsers = groupBy(users, u => u.host);
printLog(`${users.length} アカウントのレート計算を開始します。`);
printLog(`${users.length}개의 계정을 발견, 레이팅을 계산하고 있습니다.`);
await calculateAllRating(groupedUsers);
Store.dispatch({ nowCalculating: false });
printLog(`${users.length} アカウントのアラート送信を開始します。`);
printLog(`${users.length}개의 계정 레이팅 계산 완료, 알림을 전송하고 있습니다.`);
await sendAllAlerts(groupedUsers);
printLog('ミス廃アラートワーカーは正常に完了しました。');
printLog('Misskey Tools on phater.live 알림 전송이 완료되었습니다.');
} catch (e) {
printLog('ミス廃アラートワーカーが異常終了しました。', 'error');
printLog('Misskey Tools on phater.live 알림 전송에 실패했습니다.', 'error');
printLog(e instanceof Error ? errorToString(e) : JSON.stringify(e, null, ' '), 'error');
} finally {
Store.dispatch({ nowCalculating: false });
@ -61,21 +61,21 @@ const calculateRating = async (host: string, users: User[]) => {
miUser = await api<MiUser>(user.host, 'i', {}, user.token);
} catch (e) {
if (!(e instanceof Error)) {
printLog('バグエラーオブジェクトはErrorを継承していないといけない', 'error');
printLog('문제 발생: 오류 객체는 Error를 상속하지 않아야 합니다.', 'error');
} else if (e instanceof MisskeyError) {
if (ERROR_CODES_USER_REMOVED.includes(e.error.code)) {
// ユーザーが削除されている場合、レコードからも消してとりやめ
printLog(`アカウント ${toAcct(user)} は削除されているか、凍結されているか、トークンを失効しています。そのため、本システムからアカウントを削除します。`, 'warn');
printLog(`${toAcct(user)} 게정이 삭제, 정지, 또는 토큰이 제거된 것으로 보이며, 시스템에서 계정이 제거되었습니다.`, 'warn');
await deleteUser(user.username, user.host);
} else {
printLog(`Misskey エラー: ${JSON.stringify(e.error)}`, 'error');
printLog(`Misskey 오류: ${JSON.stringify(e.error)}`, 'error');
}
} else if (e instanceof TimedOutError) {
printLog(`サーバー ${user.host} との接続に失敗したため、このサーバーのレート計算を中断します。`, 'error');
printLog(`${user.host} 인스턴스로의 연결에 실패하여 레이팅 계산을 중단합니다.`, 'error');
return;
} else {
// おそらく通信エラー
printLog(`不明なエラーが発生しました。\n${errorToString(e)}`, 'error');
printLog(`알 수 없는 오류가 발생했습니다.\n${errorToString(e)}`, 'error');
}
continue;
}
@ -83,7 +83,7 @@ const calculateRating = async (host: string, users: User[]) => {
await updateRating(user, miUser);
}
printLog(`${host} ユーザー(${users.length}人) のレート計算が完了しました。`);
printLog(`${host} 인스턴스의 사용자 ${users.length}명의 레이팅 계산이 완료되었습니다.`);
};
const sendAllAlerts = async (groupedUsers: [string, User[]][]) => {
@ -125,5 +125,5 @@ const sendAlerts = async (host: string, users: User[]) => {
]);
}
printLog(`${host} ユーザー(${users.length}人) へのアラート送信が完了しました。`);
printLog(`${host} 인스턴스의 사용자 ${users.length}명의 알림 전송이 완료되었습니다.`);
};

View File

@ -137,7 +137,7 @@
"_template": {
"description": "전송되는 알림의 내용을 수정할 수 있습니다.",
"description2": "'#misshaialert' 해시태그가 자동으로 맨 아래에 추가됩니다.",
"default": "어제의 제 Misskey 사용량을 공개합니다!\n\n노트: {notesCount}({notesDelta})\n팔로우 : {followingCount}({followingDelta})\n팔로워 :{followersCount}({followersDelta})\n\n같이 [참여]({url})해보지 않으실래요?",
"default": "어제의 제 Misskey 사용량을 공개합니다!\n\n노트 : {notesCount} ({notesDelta})\n팔로잉 : {followingCount} ({followingDelta})\n팔로워 : {followersCount} ({followersDelta})\n\n같이 [참여]({url})해보지 않으실래요?",
"insertVariables": "변수 추가하기",
"insertVariablesHelp": "{ } 으로 감싼 문자열은 변수라고 하며 특별한 기능을 가집니다. 변수는 알림을 전송할 때 자동으로 변환됩니다.",
"_variables": {
@ -158,34 +158,34 @@
"sorry": "문제가 발생했습니다. 잠시 후 다시 시도해주세요.",
"additionalInfo": "추가 정보: ",
"hitorisskeyIsDenied": "Hitorisskey는 연동할 수 없습니다.",
"teapot": "I'm a teapot.",
"sessionRequired": "세션이 누락되었습니다.",
"tokenRequired": "토큰이 누락되었습니다.",
"invalidParameter": "매개변수가 올바르지 않습니다.",
"notAuthorized": "권한이 없습니다.",
"hostNotFound": "인스턴스에 접속할 수 없습니다. 호스트명이 올바른지, 인스턴스가 정상적으로 동작하는지 확인해 주세요.",
"teapot": "나는야 찻주전자",
"sessionRequired": "잘못된 세션이거나, 세션이 존재하지 않습니다.",
"tokenRequired": "잘못된 토큰이거나, 세션이 존재하지 않습니다.",
"invalidParameter": "잘못된 요청 내용입니다. 값을 확인 후 다시 시도하세요.",
"notAuthorized": "이 리소스에 접근할 권한이 없습니다.",
"hostNotFound": "인스턴스에 접속할 수 없습니다. 입력한 인스턴스 주소가 올바른지, API 요청이 가능한지 확인해주세요.",
"other": "알 수 없는 오류가 발생했습니다. Mastodon 인스턴스로 로그인을 시도했을 수 있습니다."
},
"_sendTest": {
"title": "테스트 알림을 보내시겠습니까?",
"message": "현재 설정으로 알림을 보냅니다. 보내기 전에 설정을 저장했는지 다시 한번 확인해 주세요.",
"message": "현재 '저장되어 있는' 설정으로 알림을 보냅니다. 변경한 내용이 있다면 먼저 설정을 저장해주세요.",
"yes": "보내기",
"no": "취소",
"success": "보냈습니다.",
"failure": "보내지 못했습니다."
"no": "취소하기",
"success": "테스트 알림을 전송했습니다!",
"failure": "테스트 알림 전송에 실패했습니다. 관리자에게 문의하세요."
},
"_logout": {
"title": "로그아웃하시겠습니까?",
"message": "로그아웃하더라도 알림 송신과 Misskey 계정 정보 수집은 정지되지 않습니다. Misskey Tools를 더 이상 이용하지 않으시려면 '계정 연동을 해제하기'를 눌러 주세요.",
"yes": "로그아웃",
"no": "취소"
"message": "로그아웃하더라도 알림 송신과 Misskey 계정 정보 수집은 계속 진행됩니다. Misskey Tools를 더 이상 이용하지 않으시려면 계정 연동을 해제해주세요.",
"yes": "로그아웃하기",
"no": "취소하기"
},
"_deactivate": {
"title": "계정 연동을 해제하시겠습니까?",
"message": "수집된 데이터나 개인 설정 등을 비롯한 모든 데이터가 삭제됩니다. 이 작업은 취소할 수 없습니다.",
"yes": "해제하기",
"no": "취소",
"success": "계정 연동을 해제했습니다. 메인 화면으로 돌아갑니다.",
"yes": "연동 해제하기",
"no": "취소하기",
"success": "계정 연동이 해제되었으며, 데이터가 모두 제거되었습니다. 안녕히 가세요!",
"failure": "계정 연동을 해제할 수 없습니다."
}
}

View File

@ -133,22 +133,22 @@ export const AdminPage: React.VFC = () => {
<div className="fade vstack">
{
!data.isAdmin ? (
<p>You are not an administrator and cannot open this page.</p>
<p> .</p>
) : (
<>
<div className="card shadow-2">
<div className="body">
<h1>Announcements</h1>
<h1></h1>
{!isEditMode && (
<label className="input-switch mb-2">
<input type="checkbox" checked={isDeleteMode} onChange={e => setDeleteMode(e.target.checked)}/>
<div className="switch"></div>
<span>Delete Mode</span>
<span> </span>
</label>
)}
{ !isEditMode ? (
<>
{isDeleteMode && <div className="ml-2 text-danger">Click the item to delete.</div>}
{isDeleteMode && <div className="ml-2 text-danger"> .</div>}
<div className="large menu">
{announcements.map(a => (
<button className="item fluid" key={a.id} onClick={() => {
@ -166,7 +166,7 @@ export const AdminPage: React.VFC = () => {
{!isDeleteMode && (
<button className="item fluid" onClick={() => setEditMode(true)}>
<i className="icon fas fa-plus" />
Create New
</button>
)}
</div>
@ -174,34 +174,34 @@ export const AdminPage: React.VFC = () => {
) : (
<div className="vstack">
<label className="input-field">
Title
<input type="text" value={draftTitle} onChange={e => setDraftTitle(e.target.value)} />
</label>
<label className="input-field">
Body
<textarea className="input-field" value={draftBody} rows={10} onChange={e => setDraftBody(e.target.value)}/>
</label>
<div className="hstack" style={{justifyContent: 'flex-end'}}>
<button className="btn primary" onClick={submitAnnouncement} disabled={!draftTitle || !draftBody}>
Submit
</button>
<button className="btn" onClick={() => {
selectAnnouncement(null);
setEditMode(false);
}}>
Cancel
</button>
</div>
</div>
)}
</div>
</div>
<h2>Misshai</h2>
<h2> </h2>
<div className="vstack">
<button className="btn danger" onClick={onClickStartMisshaiAlertWorkerButton}>
Misskey Tools
</button>
<h3></h3>
<h3> </h3>
{misshaiLog && <LogView log={misshaiLog} />}
</div>
</>

View File

@ -51,14 +51,12 @@ export const IndexSessionPage: React.VFC = () => {
<td>{score.data?.followersCount ?? '...'}</td>
<td>{score.data?.followersDelta ?? '...'}</td>
</tr>
<tr>
<td>{t('_missHai.rating')}</td>
<td>{session.data.rating}</td>
</tr>
</tbody>
</table>
<p>
<strong>
{t('_missHai.rating')}{': '}
</strong>
{session?.rating ?? '...'}
</p>
</section>
<section className="developerInfo">
<h2><i className="fas fa-circle-question"></i> {t('_developerInfo.title')}</h2>