From a147d56ae7f311a017e69b3f4b4e9549749bfa21 Mon Sep 17 00:00:00 2001 From: Essem Date: Sun, 25 Jun 2023 19:58:01 -0500 Subject: [PATCH 1/6] Render instance description as HTML --- packages/client/src/pages/about.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/client/src/pages/about.vue b/packages/client/src/pages/about.vue index 9234273a65..205f86cd48 100644 --- a/packages/client/src/pages/about.vue +++ b/packages/client/src/pages/about.vue @@ -52,9 +52,9 @@ - + From 0cac6f018d3501b3417276dc0773b6579620aea0 Mon Sep 17 00:00:00 2001 From: Syuilo Date: Sun, 2 Jul 2023 16:20:40 -0700 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20=E2=9A=A1=20make=20identicons?= =?UTF-8?q?=20and=20server=20metrics=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kainoa Kanter --- locales/en-US.yml | 2 + locales/ja-JP.yml | 46 +++++++++--------- packages/backend/assets/avatar.png | Bin 0 -> 14059 bytes .../1688280713783-add-meta-options.js | 21 ++++++++ packages/backend/src/daemons/server-stats.ts | 4 ++ packages/backend/src/models/entities/meta.ts | 10 ++++ .../src/server/api/endpoints/admin/meta.ts | 12 +++++ .../src/server/api/endpoints/server-info.ts | 21 +++++++- packages/backend/src/server/index.ts | 15 ++++-- packages/client/src/pages/admin/settings.vue | 17 +++++++ .../src/widgets/server-metric/index.vue | 2 +- 11 files changed, 122 insertions(+), 28 deletions(-) create mode 100644 packages/backend/assets/avatar.png create mode 100644 packages/backend/migration/1688280713783-add-meta-options.js diff --git a/locales/en-US.yml b/locales/en-US.yml index d493f332f5..c6c442df7c 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1112,6 +1112,8 @@ isModerator: "Moderator" isAdmin: "Administrator" isPatron: "Calckey Patron" reactionPickerSkinTone: "Preferred emoji skin tone" +enableServerMachineStats: "Enable server hardware statistics" +enableIdenticonGeneration: "Enable Identicon generation" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fa3c3f1cc1..b3bfa6665a 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1,6 +1,6 @@ _lang_: "日本語" headlineMisskey: "ずっと無料でオープンソースの非中央集権型ソーシャルメディアプラットフォーム🚀" -introMisskey: "ようこそ!Calckeyは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\ +introMisskey: "ようこそ!Firefishは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\ 「リアクション」機能で、皆の投稿に素早く反応を追加できます👍\n新しい世界を探検しよう🚀" monthAndDay: "{month}月 {day}日" search: "検索" @@ -146,7 +146,7 @@ settingGuide: "おすすめ設定" cacheRemoteFiles: "リモートのファイルをキャッシュする" cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクします。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。" flagAsBot: "Botとして設定" -flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Calckeyのシステム上での扱いがBotに合ったものになります。" +flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Firefishのシステム上での扱いがBotに合ったものになります。" flagAsCat: "あなたは…猫?😺" flagAsCatDescription: "このアカウントが猫であることを示す猫モードを有効にするには、このフラグをオンにします。" flagSpeakAsCat: "猫語で話す" @@ -213,7 +213,7 @@ noInstances: "サーバーがありません" editProfile: "プロフィールを編集" noteDeleteConfirm: "この投稿を削除しますか?" pinLimitExceeded: "これ以上ピン留めできません" -intro: "Calckeyのインストールが完了しました!管理者アカウントを作成しましょう。" +intro: "Firefishのインストールが完了しました!管理者アカウントを作成しましょう。" done: "完了" processing: "処理中" preview: "プレビュー" @@ -396,7 +396,7 @@ exploreFediverse: "Fediverseを探索" popularTags: "人気のタグ" userList: "リスト" about: "情報" -aboutMisskey: "Calckeyについて" +aboutMisskey: "Firefishについて" administrator: "管理者" token: "トークン" twoStepAuthentication: "二段階認証" @@ -543,7 +543,7 @@ sort: "ソート" ascendingOrder: "昇順" descendingOrder: "降順" scratchpad: "スクラッチパッド" -scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Calckeyと対話するコードの記述、実行、結果の確認ができます。" +scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Firefishと対話するコードの記述、実行、結果の確認ができます。" output: "出力" script: "スクリプト" disablePagesScript: "ページのスクリプトを無効にする" @@ -672,7 +672,7 @@ createNewClip: "新しいクリップを作成" unclip: "クリップ解除" confirmToUnclipAlreadyClippedNote: "この投稿はすでにクリップ「{name}」に含まれています。投稿をこのクリップから除外しますか?" public: "公開" -i18nInfo: "Calckeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。" +i18nInfo: "Firefishは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。" manageAccessTokens: "アクセストークンの管理" accountInfo: "アカウント情報" notesCount: "投稿の数" @@ -723,7 +723,7 @@ onlineUsersCount: "{n}人がオンライン" nUsers: "{n}ユーザー" nNotes: "{n}投稿" sendErrorReports: "エラーリポートを送信" -sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てられます。\n\ +sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がFirefishに共有され、ソフトウェアの品質向上に役立てられます。\n\ エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。" myTheme: "マイテーマ" backgroundColor: "背景" @@ -824,7 +824,7 @@ hashtags: "ハッシュタグ" troubleshooting: "トラブルシューティング" useBlurEffect: "UIにぼかし効果を使用" learnMore: "詳しく" -misskeyUpdated: "Calckeyが更新されました!" +misskeyUpdated: "Firefishが更新されました!" whatIsNew: "更新情報を見る" translate: "翻訳" translatedFrom: "{x}から翻訳" @@ -944,7 +944,7 @@ customMOTDDescription: "ユーザがページをロード/リロードするた customSplashIcons: "カスタムスプラッシュスクリーンアイコン" customSplashIconsDescription: "ユーザがページをロード/リロードするたびにランダムに表示される、改行で区切られたカスタムスプラッシュスクリーンアイコンの URL。画像は静的なURLで、できればすべて192x192にリサイズしてください。" -showUpdates: "Calckeyの更新時にポップアップを表示する" +showUpdates: "Firefishの更新時にポップアップを表示する" recommendedInstances: "おすすめサーバー" recommendedInstancesDescription: "おすすめタイムラインに表示するサーバーを改行区切りで入力してください。`https://`は書かず、ドメインのみを入力してください。" caption: "自動キャプション" @@ -952,7 +952,7 @@ splash: "スプラッシュスクリーン" updateAvailable: "アップデートがありますよ!" swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする" logoImageUrl: "ロゴのURL" -showAdminUpdates: "新しいCalckeyのバージョンが利用可能なときに通知する(管理者のみ)" +showAdminUpdates: "新しいFirefishのバージョンが利用可能なときに通知する(管理者のみ)" replayTutorial: "もう一度チュートリアルを見る" migration: "アカウントの引っ越し" moveTo: "このアカウントを新しいアカウントに引っ越す" @@ -977,7 +977,9 @@ customKaTeXMacroDescription: "数式入力を楽にするためのマクロを enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" preventAiLearning: "AIによる学習を防止" preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。" -noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。" +noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Firefishの動作を妨げるため、無効にしてください。" +enableServerMachineStats: "サーバーのマシン情報を公開する" +enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" @@ -1054,12 +1056,12 @@ _registry: domain: "ドメイン" createKey: "キーを作成" _aboutMisskey: - about: "Calckeyは、2022年に生まれたThatOneCalculatorによるMisskeyのforkです。" + about: "Firefishは、2022年に生まれたThatOneCalculatorによるMisskeyのforkです。" contributors: "主なコントリビューター" allContributors: "全てのコントリビューター" source: "ソースコード" - translation: "Calckeyを翻訳" - donate: "Calckeyに寄付" + translation: "Firefishを翻訳" + donate: "Firefishに寄付" morePatrons: "他にも多くの方が支援してくれています。ありがとうございます! 🥰" patrons: "支援者" _nsfw: @@ -1068,8 +1070,8 @@ _nsfw: force: "常にメディアを隠す" _mfm: cheatSheet: "MFMチートシート" - intro: "MFMは、MisskeyやCalckey、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。" - dummy: "CalckeyでFediverseの世界が広がります" + intro: "MFMは、MisskeyやFirefish、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。" + dummy: "FirefishでFediverseの世界が広がります" mention: "メンション" mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示せます。" hashtag: "ハッシュタグ" @@ -1291,7 +1293,7 @@ _time: hour: "時間" day: "日" _tutorial: - title: "Calckeyの使い方" + title: "Firefishの使い方" step1_1: "ようこそ!" step1_2: "使い始める前に、いくつか設定を済ませましょう。すぐできますよ!" step2_1: "最初に、あなたのプロフィールを作りましょう。" @@ -1309,8 +1311,8 @@ _tutorial: step5_6: "おすすめ{icon}タイムラインでは、管理人がおすすめするサーバーの投稿を見られます。" step5_7: "グローバル{icon}タイムラインでは、接続している他のすべてのサーバーからの投稿を見られます。" step6_1: "じゃあ、ここはどんな場所なの?" - step6_2: "実は、あなたはただCalckeyに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。" - step6_3: "それぞれのサーバーでは必ずしもCalckeyが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。" + step6_2: "実は、あなたはただFirefishに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。" + step6_3: "それぞれのサーバーでは必ずしもFirefishが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。" step6_4: "これで完了です。お楽しみください!" _2fa: alreadyRegistered: "既に設定は完了しています。" @@ -1889,7 +1891,7 @@ apps: "アプリ" _experiments: title: 試験的な機能 postImportsCaption: - ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 + ユーザーが過去の投稿をFirefish・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 enablePostImports: 投稿のインポートを有効にする sendModMail: モデレーション通知を送る deleted: 削除済み @@ -1904,7 +1906,7 @@ accessibility: アクセシビリティ jumpToPrevious: 前に戻る cw: 閲覧注意 silencedWarning: スパムの可能性があるため、これらのユーザーが所属するサーバーは管理者によりサイレンスされています。 -searchPlaceholder: Calckeyを検索 +searchPlaceholder: Firefishを検索 channelFederationWarn: 現時点では、チャンネルは他のサーバーへ連合しません listsDesc: リストでは指定したユーザーだけのタイムラインを作れます。リストには「タイムライン」のページからアクセスできます。 antennasDesc: "アンテナでは指定した条件に合致する投稿が表示されます。\nアンテナには「タイムライン」のページからアクセスできます。" @@ -1929,4 +1931,4 @@ video: 動画 isBot: このアカウントはBotです isLocked: このアカウントのフォローは承認制です isAdmin: 管理者 -isPatron: Calckey 後援者 +isPatron: Firefish 後援者 diff --git a/packages/backend/assets/avatar.png b/packages/backend/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..ee22bdb3c8e56d6e44c1a8eb3dec0d62bb427657 GIT binary patch literal 14059 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 NDa&ifRmoU}{|~xPiZcKJ literal 0 HcmV?d00001 diff --git a/packages/backend/migration/1688280713783-add-meta-options.js b/packages/backend/migration/1688280713783-add-meta-options.js new file mode 100644 index 0000000000..e97a95c423 --- /dev/null +++ b/packages/backend/migration/1688280713783-add-meta-options.js @@ -0,0 +1,21 @@ +export class AddMetaOptions1688280713783 { + name = "AddMetaOptions1688280713783"; + + async up(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`, + ); + } + + async down(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`, + ); + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`, + ); + } +} diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts index c936d619ab..ba74278762 100644 --- a/packages/backend/src/daemons/server-stats.ts +++ b/packages/backend/src/daemons/server-stats.ts @@ -1,6 +1,7 @@ import si from "systeminformation"; import Xev from "xev"; import * as osUtils from "os-utils"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import meilisearch from "../db/meilisearch.js"; const ev = new Xev(); @@ -20,6 +21,9 @@ export default function () { ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50)); }); + const meta = fetchMeta(); + if (!meta.enableServerMachineStats) return; + async function tick() { const cpu = await cpuUsage(); const memStats = await mem(); diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index dd3c5b3b72..200ef50552 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -546,4 +546,14 @@ export class Meta { default: {}, }) public experimentalFeatures: Record; + + @Column("boolean", { + default: false, + }) + public enableServerMachineStats: boolean; + + @Column("boolean", { + default: true, + }) + public enableIdenticonGeneration: boolean; } diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 3193301275..50317d4a81 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -481,6 +481,16 @@ export const meta = { }, }, }, + enableServerMachineStats: { + type: "boolean", + optional: false, + nullable: false, + }, + enableIdenticonGeneration: { + type: "boolean", + optional: false, + nullable: false, + }, }, }, } as const; @@ -592,5 +602,7 @@ export default define(meta, paramDef, async (ps, me) => { enableIpLogging: instance.enableIpLogging, enableActiveEmailValidation: instance.enableActiveEmailValidation, experimentalFeatures: instance.experimentalFeatures, + enableServerMachineStats: instance.enableServerMachineStats, + enableIdenticonGeneration: instance.enableIdenticonGeneration, }; }); diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index 81bb053db4..746eae6621 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -2,11 +2,13 @@ import * as os from "node:os"; import si from "systeminformation"; import define from "../define.js"; import meilisearch from "@/db/meilisearch.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { requireCredential: false, requireCredentialPrivateMode: true, - + allowGet: true, + cacheSec: 30, tags: ["meta"], } as const; @@ -29,6 +31,23 @@ export default define(meta, paramDef, async () => { } } + const instanceMeta = await fetchMeta(); + if (!instanceMeta.enableServerMachineStats) { + return { + machine: 'Not specified', + cpu: { + model: 'Not specified', + cores: 0, + }, + mem: { + total: 0, + }, + fs: { + total: 0, + used: 0, + }, + }; + } return { machine: os.hostname(), cpu: { diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 95d570eb3d..7f8d0ed718 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -16,6 +16,7 @@ import { IsNull } from "typeorm"; import config from "@/config/index.js"; import Logger from "@/services/logger.js"; import { UserProfiles, Users } from "@/models/index.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import { genIdenticon } from "@/misc/gen-identicon.js"; import { createTemp } from "@/misc/create-temp.js"; import { publishMainStream } from "@/services/stream.js"; @@ -125,10 +126,16 @@ router.get("/avatar/@:acct", async (ctx) => { }); router.get("/identicon/:x", async (ctx) => { - const [temp, cleanup] = await createTemp(); - await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); - ctx.set("Content-Type", "image/png"); - ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + const meta = await fetchMeta(); + if (meta.enableIdenticonGeneration) { + const [temp, cleanup] = await createTemp(); + await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); + ctx.set("Content-Type", "image/png"); + ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + } + else { + ctx.redirect("/static-assets/avatar.png") + } }); mastoRouter.get("/oauth/authorize", async (ctx) => { diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index e67c44b0a4..0e83250bac 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -343,6 +343,17 @@ + + + + + + + + + + + @@ -442,6 +453,8 @@ let libreTranslateApiUrl: string = $ref(""); let libreTranslateApiKey: string = $ref(""); let defaultReaction: string = $ref(""); let defaultReactionCustom: string = $ref(""); +let enableServerMachineStats: boolean = $ref(false); +let enableIdenticonGeneration: boolean = $ref(false); async function init() { const meta = await os.api("admin/meta"); @@ -482,6 +495,8 @@ async function init() { defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction) ? "" : meta.defaultReaction; + enableServerMachineStats = meta.enableServerMachineStats; + enableIdenticonGeneration = meta.enableIdenticonGeneration; } function save() { @@ -521,6 +536,8 @@ function save() { libreTranslateApiUrl, libreTranslateApiKey, defaultReaction, + enableServerMachineStats, + enableIdenticonGeneration, }).then(() => { fetchInstance(); }); diff --git a/packages/client/src/widgets/server-metric/index.vue b/packages/client/src/widgets/server-metric/index.vue index cf84212b1e..49dc59ea27 100644 --- a/packages/client/src/widgets/server-metric/index.vue +++ b/packages/client/src/widgets/server-metric/index.vue @@ -106,7 +106,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager( const meta = ref(null); -os.api("server-info", {}).then((res) => { +os.apiGet("server-info", {}).then((res) => { meta.value = res; }); From 59650933265dc141fd7f33a175e3e80b27494f95 Mon Sep 17 00:00:00 2001 From: Claire Date: Sun, 2 Jul 2023 17:03:48 +0000 Subject: [PATCH 3/6] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 96.8% (1757 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 6870571be8..fc508d6386 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1341,6 +1341,8 @@ _widgets: meiliIndexCount: 已索引的帖子 meiliSize: 索引大小 serverInfo: 服务器信息 + _userList: + chooseList: 选择一个列表 _cw: hide: "隐藏" show: "查看更多" @@ -1402,6 +1404,7 @@ _profile: metadataContent: "内容" changeAvatar: "修改头像" changeBanner: "修改横幅" + locationDescription: 如果你先输入你的城市,它将向其他用户显示您的当地时间。 _exportOrImport: allNotes: "所有帖子" followingList: "关注中" @@ -1768,6 +1771,9 @@ _notification: followBack: "回关" reply: "回复" renote: "转发" + reacted: 对你的帖子做出了回应 + voted: 在你的投票中投了票 + renoted: 推荐了你的帖子 _deck: alwaysShowMainColumn: "总是显示主列" columnAlign: "列对齐" @@ -1804,6 +1810,8 @@ _messaging: migration: 迁移 _experiments: title: 实验性功能 + postImportsCaption: 允许用户从过去的 Calckey、Misskey、Mastodon、Akkoma 和 Pleroma 帐户导入帖子。如果您的队列出现拥堵,则可能会导致加载速度减慢。 + enablePostImports: 启用帖子导入 license: 许可证 flagSpeakAsCatDescription: 在猫模式下你的帖子会喵化 allowedInstances: 白名单服务器 @@ -1813,11 +1821,11 @@ removeReaction: 移除你的回应 expandOnNoteClick: 点击打开帖子 expandOnNoteClickDesc: 如果禁用,你仍然可以在右键菜单中或通过点击时间戳打开帖子。 sendPushNotificationReadMessage: 删除已阅读的推送通知 -customMOTD: 自定义 MOTD(闪屏消息) +customMOTD: 自定义 MOTD(启动屏幕消息) sendPushNotificationReadMessageCaption: 短暂显示 "{emptyPushNotificationMessage}" 的通知,如果启用,可能会增加你的设备的耗电量。 adminCustomCssWarn: 仅当你知道此设置的作用时才应使用它。输入不正确的值可能会导致每个人的客户端停止正常运行。请在用户设置中进行测试来确保您的 CSS 正常工作。 -customMOTDDescription: 自定义MOTD(闪屏)消息,一行一个,每次用户加载/刷新页面时都会随机显示。 +customMOTDDescription: 自定义 MOTD(启动屏幕)消息,一行一个,每次用户加载/刷新页面时都会随机显示。 customSplashIconsDescription: 用换行符隔开的自定义闪屏图标的URL,在用户每次加载/重新加载页面时随机显示。请确保图片是在一个静态的 URL 上,最好全部调整为 192x192 的大小。 recommendedInstancesDescription: 推荐的服务器以换行符分隔,它们将出现在推荐的时间线中。不要添加 "https://",仅添加域名。 @@ -1889,6 +1897,8 @@ _skinTones: light: 浅色 yellow: 黄色 dark: 深色 + mediumLight: 中等偏淡 + mediumDark: 中等偏深 isModerator: 协作者 isAdmin: 管理员 findOtherInstance: 寻找其它服务器 @@ -1926,3 +1936,6 @@ _filters: followersOnly: 仅关注者 reactionPickerSkinTone: 首选的表情符号肤色 isPatron: Calckey 赞助 +_dialog: + charactersExceeded: 超出了最大字符数!当前:{current} / 限制:{max} + charactersBelow: 没有足够的字符!当前:{current} / 限制:{min} From b2932f77fa2963f0b562136c348571aad9e07c5d Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Sun, 2 Jul 2023 17:17:52 +0000 Subject: [PATCH 4/6] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 96.8% (1757 of 1814 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index fc508d6386..6903f447d0 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -13,7 +13,7 @@ ok: "OK" gotIt: "我明白了" cancel: "取消" enterUsername: "输入用户名" -renotedBy: "由 {user} 转贴" +renotedBy: "转发自 {user}" noNotes: "没有帖子" noNotifications: "无通知" instance: "服务器" @@ -44,7 +44,7 @@ copyContent: "复制内容" copyLink: "复制链接" delete: "删除" deleteAndEdit: "删除并编辑" -deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。" +deleteAndEditConfirm: "要删除此帖子并再次编辑吗?对此帖子的所有回应、转发和回复也将被删除。" addToList: "添加至列表" sendMessage: "发送" copyUsername: "复制用户名" @@ -97,7 +97,7 @@ enterEmoji: "输入表情符号" renote: "转发" unrenote: "取消转发" renoted: "已转发。" -cantRenote: "该帖无法转发。" +cantRenote: "此帖子无法转发。" cantReRenote: "转发无法被再次转发。" quote: "引用" pinnedNote: "已置顶的帖子" @@ -111,7 +111,7 @@ enableEmojiReaction: "启用表情符号回应" showEmojisInReactionNotifications: "在回应通知中显示表情符号" reactionSetting: "在选择器中显示的回应" reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" -rememberNoteVisibility: "保存上次设置的可见性" +rememberNoteVisibility: "保存帖子可见性设置" attachCancel: "删除附件" markAsSensitive: "标记为敏感内容" unmarkAsSensitive: "取消标记为敏感内容" @@ -141,7 +141,7 @@ emojiUrl: "表情符号地址" addEmoji: "添加表情符号" settingGuide: "推荐配置" cacheRemoteFiles: "远程文件缓存" -cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" +cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" flagAsBot: "这是一个机器人账号" flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。" flagAsCat: "将这个账户设定为一只猫" @@ -151,7 +151,7 @@ flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的 autoAcceptFollowed: "自动允许关注者的关注" addAccount: "添加账户" loginFailed: "登录失败" -showOnRemote: "转到所在实例显示" +showOnRemote: "转到所在服务器显示" general: "常规设置" wallpaper: "壁纸" setWallpaper: "设置壁纸" @@ -160,7 +160,7 @@ searchWith: "搜索:{q}" youHaveNoLists: "列表为空" followConfirm: "你确定要关注{name}吗?" proxyAccount: "代理账户" -proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该实例,因此将代之以代理账户。" +proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该服务器,因此将代之以代理账户。" host: "主机名" selectUser: "选择用户" recipient: "收件人" @@ -176,7 +176,7 @@ charts: "图表" perHour: "每小时" perDay: "每天" stopActivityDelivery: "停止发送活动" -blockThisInstance: "阻止此实例向本实例推流" +blockThisInstance: "屏蔽此服务器" operations: "操作" software: "软件" version: "版本" @@ -194,14 +194,14 @@ clearQueueConfirmText: "未送达的帖子将不会送达。 通常,您不需 clearCachedFiles: "清除缓存" clearCachedFilesConfirm: "确定要清除缓存文件?" blockedInstances: "已屏蔽的服务器" -blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。" +blockedInstancesDescription: "设定要屏蔽的服务器,以换行来进行分割。被屏蔽的服务器将无法与本服务器进行交换通讯。" muteAndBlock: "屏蔽/拉黑" mutedUsers: "已屏蔽用户" blockedUsers: "被拉黑的用户" noUsers: "无用户" editProfile: "编辑资料" noteDeleteConfirm: "要删除该帖子吗?" -pinLimitExceeded: "无法置顶更多了" +pinLimitExceeded: "无法置顶更多帖子了" intro: "Misskey的部署结束啦!填写管理员账号吧!" done: "完成" processing: "正在处理" @@ -217,9 +217,9 @@ all: "全部" subscribing: "已订阅" publishing: "直播中" notResponding: "没有响应" -instanceFollowing: "关注实例" -instanceFollowers: "关注实例" -instanceUsers: "实例用户" +instanceFollowing: "关注服务器" +instanceFollowers: "服务器的关注者" +instanceUsers: "此服务器的用户" changePassword: "修改密码" security: "安全" retypedNotMatch: "两次输入不一致!" @@ -340,7 +340,7 @@ basicInfo: "基本信息" pinnedUsers: "置顶用户" pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。" pinnedPages: "固定页面" -pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。" +pinnedPagesDescription: "输入您要固定到服务器首页的页面路径,以换行符分隔。" pinnedClipId: "置顶的便签ID" pinnedNotes: "已置顶的帖子" hcaptcha: "hCaptcha" @@ -424,7 +424,7 @@ text: "文本" enable: "启用" next: "下一个" retype: "重新输入" -noteOf: "{user}的帖子" +noteOf: "{user} 的帖子" inviteToGroup: "群组邀请" quoteAttached: "已引用" quoteQuestion: "是否引用此链接内容?" @@ -835,7 +835,7 @@ overridedDeviceKind: "设备类型" smartphone: "智能手机" tablet: "平板" auto: "自动" -themeColor: "主题颜色" +themeColor: "服务器滚动条颜色" size: "大小" numberOfColumn: "列数" searchByGoogle: "Google" From 703f28a1ab643e57290e5ae2d6df67e481e97560 Mon Sep 17 00:00:00 2001 From: Syuilo Date: Sun, 2 Jul 2023 16:20:40 -0700 Subject: [PATCH 5/6] =?UTF-8?q?refactor:=20=E2=9A=A1=20make=20identicons?= =?UTF-8?q?=20and=20server=20metrics=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kainoa Kanter --- locales/en-US.yml | 2 ++ locales/ja-JP.yml | 2 ++ packages/backend/assets/avatar.png | Bin 0 -> 14059 bytes .../1688280713783-add-meta-options.js | 21 ++++++++++++++++++ packages/backend/src/daemons/server-stats.ts | 4 ++++ packages/backend/src/models/entities/meta.ts | 10 +++++++++ .../src/server/api/endpoints/admin/meta.ts | 12 ++++++++++ .../src/server/api/endpoints/server-info.ts | 21 +++++++++++++++++- packages/backend/src/server/index.ts | 15 +++++++++---- packages/client/src/pages/admin/settings.vue | 17 ++++++++++++++ .../src/widgets/server-metric/index.vue | 2 +- 11 files changed, 100 insertions(+), 6 deletions(-) create mode 100644 packages/backend/assets/avatar.png create mode 100644 packages/backend/migration/1688280713783-add-meta-options.js diff --git a/locales/en-US.yml b/locales/en-US.yml index d493f332f5..c6c442df7c 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1112,6 +1112,8 @@ isModerator: "Moderator" isAdmin: "Administrator" isPatron: "Calckey Patron" reactionPickerSkinTone: "Preferred emoji skin tone" +enableServerMachineStats: "Enable server hardware statistics" +enableIdenticonGeneration: "Enable Identicon generation" _sensitiveMediaDetection: description: "Reduces the effort of server moderation through automatically recognizing diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fa3c3f1cc1..9f2f825e55 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -978,6 +978,8 @@ enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" preventAiLearning: "AIによる学習を防止" preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。" noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。" +enableServerMachineStats: "サーバーのマシン情報を公開する" +enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする" _sensitiveMediaDetection: description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" diff --git a/packages/backend/assets/avatar.png b/packages/backend/assets/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..ee22bdb3c8e56d6e44c1a8eb3dec0d62bb427657 GIT binary patch literal 14059 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 NDa&ifRmoU}{|~xPiZcKJ literal 0 HcmV?d00001 diff --git a/packages/backend/migration/1688280713783-add-meta-options.js b/packages/backend/migration/1688280713783-add-meta-options.js new file mode 100644 index 0000000000..e97a95c423 --- /dev/null +++ b/packages/backend/migration/1688280713783-add-meta-options.js @@ -0,0 +1,21 @@ +export class AddMetaOptions1688280713783 { + name = "AddMetaOptions1688280713783"; + + async up(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`, + ); + await queryRunner.query( + `ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`, + ); + } + + async down(queryRunner) { + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`, + ); + await queryRunner.query( + `ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`, + ); + } +} diff --git a/packages/backend/src/daemons/server-stats.ts b/packages/backend/src/daemons/server-stats.ts index c936d619ab..ba74278762 100644 --- a/packages/backend/src/daemons/server-stats.ts +++ b/packages/backend/src/daemons/server-stats.ts @@ -1,6 +1,7 @@ import si from "systeminformation"; import Xev from "xev"; import * as osUtils from "os-utils"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import meilisearch from "../db/meilisearch.js"; const ev = new Xev(); @@ -20,6 +21,9 @@ export default function () { ev.emit(`serverStatsLog:${x.id}`, log.slice(0, x.length || 50)); }); + const meta = fetchMeta(); + if (!meta.enableServerMachineStats) return; + async function tick() { const cpu = await cpuUsage(); const memStats = await mem(); diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index dd3c5b3b72..200ef50552 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -546,4 +546,14 @@ export class Meta { default: {}, }) public experimentalFeatures: Record; + + @Column("boolean", { + default: false, + }) + public enableServerMachineStats: boolean; + + @Column("boolean", { + default: true, + }) + public enableIdenticonGeneration: boolean; } diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 3193301275..50317d4a81 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -481,6 +481,16 @@ export const meta = { }, }, }, + enableServerMachineStats: { + type: "boolean", + optional: false, + nullable: false, + }, + enableIdenticonGeneration: { + type: "boolean", + optional: false, + nullable: false, + }, }, }, } as const; @@ -592,5 +602,7 @@ export default define(meta, paramDef, async (ps, me) => { enableIpLogging: instance.enableIpLogging, enableActiveEmailValidation: instance.enableActiveEmailValidation, experimentalFeatures: instance.experimentalFeatures, + enableServerMachineStats: instance.enableServerMachineStats, + enableIdenticonGeneration: instance.enableIdenticonGeneration, }; }); diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts index 81bb053db4..746eae6621 100644 --- a/packages/backend/src/server/api/endpoints/server-info.ts +++ b/packages/backend/src/server/api/endpoints/server-info.ts @@ -2,11 +2,13 @@ import * as os from "node:os"; import si from "systeminformation"; import define from "../define.js"; import meilisearch from "@/db/meilisearch.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; export const meta = { requireCredential: false, requireCredentialPrivateMode: true, - + allowGet: true, + cacheSec: 30, tags: ["meta"], } as const; @@ -29,6 +31,23 @@ export default define(meta, paramDef, async () => { } } + const instanceMeta = await fetchMeta(); + if (!instanceMeta.enableServerMachineStats) { + return { + machine: 'Not specified', + cpu: { + model: 'Not specified', + cores: 0, + }, + mem: { + total: 0, + }, + fs: { + total: 0, + used: 0, + }, + }; + } return { machine: os.hostname(), cpu: { diff --git a/packages/backend/src/server/index.ts b/packages/backend/src/server/index.ts index 95d570eb3d..7f8d0ed718 100644 --- a/packages/backend/src/server/index.ts +++ b/packages/backend/src/server/index.ts @@ -16,6 +16,7 @@ import { IsNull } from "typeorm"; import config from "@/config/index.js"; import Logger from "@/services/logger.js"; import { UserProfiles, Users } from "@/models/index.js"; +import { fetchMeta } from "@/misc/fetch-meta.js"; import { genIdenticon } from "@/misc/gen-identicon.js"; import { createTemp } from "@/misc/create-temp.js"; import { publishMainStream } from "@/services/stream.js"; @@ -125,10 +126,16 @@ router.get("/avatar/@:acct", async (ctx) => { }); router.get("/identicon/:x", async (ctx) => { - const [temp, cleanup] = await createTemp(); - await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); - ctx.set("Content-Type", "image/png"); - ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + const meta = await fetchMeta(); + if (meta.enableIdenticonGeneration) { + const [temp, cleanup] = await createTemp(); + await genIdenticon(ctx.params.x, fs.createWriteStream(temp)); + ctx.set("Content-Type", "image/png"); + ctx.body = fs.createReadStream(temp).on("close", () => cleanup()); + } + else { + ctx.redirect("/static-assets/avatar.png") + } }); mastoRouter.get("/oauth/authorize", async (ctx) => { diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue index e67c44b0a4..0e83250bac 100644 --- a/packages/client/src/pages/admin/settings.vue +++ b/packages/client/src/pages/admin/settings.vue @@ -343,6 +343,17 @@ + + + + + + + + + + + @@ -442,6 +453,8 @@ let libreTranslateApiUrl: string = $ref(""); let libreTranslateApiKey: string = $ref(""); let defaultReaction: string = $ref(""); let defaultReactionCustom: string = $ref(""); +let enableServerMachineStats: boolean = $ref(false); +let enableIdenticonGeneration: boolean = $ref(false); async function init() { const meta = await os.api("admin/meta"); @@ -482,6 +495,8 @@ async function init() { defaultReactionCustom = ["⭐", "👍", "❤️"].includes(meta.defaultReaction) ? "" : meta.defaultReaction; + enableServerMachineStats = meta.enableServerMachineStats; + enableIdenticonGeneration = meta.enableIdenticonGeneration; } function save() { @@ -521,6 +536,8 @@ function save() { libreTranslateApiUrl, libreTranslateApiKey, defaultReaction, + enableServerMachineStats, + enableIdenticonGeneration, }).then(() => { fetchInstance(); }); diff --git a/packages/client/src/widgets/server-metric/index.vue b/packages/client/src/widgets/server-metric/index.vue index cf84212b1e..49dc59ea27 100644 --- a/packages/client/src/widgets/server-metric/index.vue +++ b/packages/client/src/widgets/server-metric/index.vue @@ -106,7 +106,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager( const meta = ref(null); -os.api("server-info", {}).then((res) => { +os.apiGet("server-info", {}).then((res) => { meta.value = res; }); From 3434c23ae6a63b9bf472dbb55dd7ec59a13ffefd Mon Sep 17 00:00:00 2001 From: Poesty Li Date: Mon, 3 Jul 2023 01:25:50 +0000 Subject: [PATCH 6/6] chore: Translated using Weblate (Chinese (Simplified)) Currently translated at 97.4% (1769 of 1816 strings) Translation: Calckey/locales Translate-URL: https://hosted.weblate.org/projects/calckey/locales/zh_Hans/ --- locales/zh-CN.yml | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 6903f447d0..110149d737 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -10,7 +10,7 @@ password: "密码" forgotPassword: "忘记密码" fetchingAsApObject: "正在联邦宇宙查询中" ok: "OK" -gotIt: "我明白了" +gotIt: "知道了!" cancel: "取消" enterUsername: "输入用户名" renotedBy: "转发自 {user}" @@ -78,7 +78,7 @@ followsYou: "正在关注你" createList: "创建列表" manageLists: "管理列表" error: "错误" -somethingHappened: "出现了一些问题!" +somethingHappened: "发生了一个错误" retry: "重试" pageLoadError: "页面加载失败。" pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" @@ -202,7 +202,7 @@ noUsers: "无用户" editProfile: "编辑资料" noteDeleteConfirm: "要删除该帖子吗?" pinLimitExceeded: "无法置顶更多帖子了" -intro: "Misskey的部署结束啦!填写管理员账号吧!" +intro: "Calckey安装完成!请创建一个管理员用户。" done: "完成" processing: "正在处理" preview: "预览" @@ -222,10 +222,10 @@ instanceFollowers: "服务器的关注者" instanceUsers: "此服务器的用户" changePassword: "修改密码" security: "安全" -retypedNotMatch: "两次输入不一致!" +retypedNotMatch: "两次输入不匹配。" currentPassword: "现在的密码" newPassword: "新密码" -newPasswordRetype: "重新输入密码:" +newPasswordRetype: "重新输入新密码" attachFile: "插入附件" more: "更多!" featured: "热门" @@ -391,7 +391,7 @@ nUsersMentioned: "{n} 被提到" securityKey: "安全密钥" securityKeyName: "密钥名称" registerSecurityKey: "注册硬件安全密钥" -lastUsed: "最后使用:" +lastUsed: "上次使用" unregister: "删除账户" passwordLessLogin: "无密码登录" resetPassword: "重置密码" @@ -639,7 +639,7 @@ openInNewTab: "在新标签页中打开" openInSideView: "在侧边栏中打开" defaultNavigationBehaviour: "默认导航" editTheseSettingsMayBreakAccount: "编辑这些设置可以会损坏您的账号" -instanceTicker: "帖子的实例信息" +instanceTicker: "帖子的服务器信息" waitingFor: "等待{x}" random: "随机" system: "系统" @@ -759,7 +759,7 @@ instanceBlocking: "联邦管理" selectAccount: "选择账户" switchAccount: "切换账户" enabled: "已启用" -disabled: "已禁用 " +disabled: "已禁用" quickAction: "快捷操作" user: "用户" administration: "管理" @@ -875,7 +875,7 @@ statusbar: "状态栏" pleaseSelect: "请选择" reverse: "翻转" colored: "彩色" -refreshInterval: "刷新间隔" +refreshInterval: "更新间隔 " label: "标签" type: "类型" speed: "速度" @@ -1220,17 +1220,17 @@ _tutorial: step3_2: "你的主页和社交馈送是基于你所关注的人,所以试着先关注几个账户。{n点击个人资料右上角的加号圈就可以关注它。" step4_1: "让我们出去找你。" step4_2: "对于他们的第一条信息,有些人喜欢做{introduction}或一个简单的 \"hello world!\"" - step5_1: "时间限制,到处是时间限制!" - step5_2: "您的实例已启用各种时间线的{timelines}。" - step5_3: "主{icon}时间线是你可以看到你的订阅者的帖子的时间线。" - step5_4: "本地{icon}时间线是你可以看到实例中所有其他用户的信息的时间线。" - step5_5: "推荐的{icon}时间线 - 是时间轴,你可以看到管理员推荐的实例的信息" - step5_6: "社交{icon}时间线显示来自你的订阅者朋友的信息。" - step5_7: "全球{icon}时间线是你可以看到来自所有其他连接的实例的消息。" + step5_1: "时间线,无处不在的时间线!" + step5_2: "您的服务器已启用{timelines}种不同的时间线。" + step5_3: "主页{icon}时间线是你可以看到你关注账户的帖子的时间线。" + step5_4: "本地{icon}时间线是你可以看到此服务器上其它用户的帖子的时间线。" + step5_5: "社交{icon}时间线是主页和本地时间线的结合。" + step5_6: "推荐{icon}时间线是你可以看到管理员推荐服务器的帖子的时间线。" + step5_7: "全球{icon}时间线是你可以看到来自其它所有互联服务器的帖子的时间线。" step6_1: "那么,这里是什么地方?" - step6_2: "好吧,你不只是加入卡尔基。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络,被称为 \"实例\"" + step6_2: "好吧,你不只是加入Calckey。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络。" step6_3: "每个服务器的工作方式不同,并不是所有的服务器都运行Calckey。但这个人确实如此! 这有点复杂,但你很快就会明白的。" - step6_4: "现在去学习并享受乐趣!" + step6_4: "现在,去吧,去探索,去享受乐趣吧!" _2fa: alreadyRegistered: "此设备已被注册" registerTOTP: "注册设备" @@ -1292,7 +1292,7 @@ _permissions: _auth: shareAccess: "您要授权允许“{name}”访问您的帐户吗?" shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?" - permissionAsk: "这个应用程序需要以下权限" + permissionAsk: "此应用程序请求以下权限:" pleaseGoBack: "请返回到应用程序" callback: "回到应用程序" denied: "拒绝访问" @@ -1433,7 +1433,7 @@ _instanceCharts: usersTotal: "用户总计" notes: "帖子:增加/减少" notesTotal: "帖子总计" - ff: "关注/被关注:数量变化" + ff: "被关注用户/关注者的数量差异 " ffTotal: "关注/被关注者总计" cacheSize: "缓存大小:增加/减少" cacheSizeTotal: "缓存大小总计" @@ -1939,3 +1939,5 @@ isPatron: Calckey 赞助 _dialog: charactersExceeded: 超出了最大字符数!当前:{current} / 限制:{max} charactersBelow: 没有足够的字符!当前:{current} / 限制:{min} +enableIdenticonGeneration: 启用Identicon生成 +enableServerMachineStats: 启用服务器硬件统计