diff --git a/locales/index.d.ts b/locales/index.d.ts
index b65bfe4e67..a529d5ef7a 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -5717,6 +5717,22 @@ export interface Locale extends ILocale {
* デバイス間でインストールしたテーマを同期
*/
"enableSyncThemesBetweenDevices": string;
+ /**
+ * サーバーと接続を確立し、リアルタイムでコンテンツを更新します。通信量とバッテリーの消費が多くなる場合があります。
+ */
+ "realtimeMode_description": string;
+ /**
+ * コンテンツの取得頻度
+ */
+ "contentsUpdateFrequency": string;
+ /**
+ * 高いほどリアルタイムにコンテンツが更新されますが、パフォーマンスが低下し、通信量とバッテリーの消費が多くなります。
+ */
+ "contentsUpdateFrequency_description": string;
+ /**
+ * リアルタイムモードがオンのときは、この設定に関わらずリアルタイムでコンテンツが更新されます。
+ */
+ "contentsUpdateFrequency_description2": string;
"_chat": {
/**
* 送信者の名前を表示
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index f9fa456a77..1ba9cc7ea0 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1429,6 +1429,10 @@ _settings:
ifOn: "オンのとき"
ifOff: "オフのとき"
enableSyncThemesBetweenDevices: "デバイス間でインストールしたテーマを同期"
+ realtimeMode_description: "サーバーと接続を確立し、リアルタイムでコンテンツを更新します。通信量とバッテリーの消費が多くなる場合があります。"
+ contentsUpdateFrequency: "コンテンツの取得頻度"
+ contentsUpdateFrequency_description: "高いほどリアルタイムにコンテンツが更新されますが、パフォーマンスが低下し、通信量とバッテリーの消費が多くなります。"
+ contentsUpdateFrequency_description2: "リアルタイムモードがオンのときは、この設定に関わらずリアルタイムでコンテンツが更新されます。"
_chat:
showSenderName: "送信者の名前を表示"
diff --git a/packages/frontend/src/components/MkNotifications.vue b/packages/frontend/src/components/MkNotifications.vue
index e7f42ce497..6b646e6b95 100644
--- a/packages/frontend/src/components/MkNotifications.vue
+++ b/packages/frontend/src/components/MkNotifications.vue
@@ -78,7 +78,12 @@ const paginator = usePagination({
},
});
-const POLLING_INTERVAL = 1000 * 15;
+const MIN_POLLING_INTERVAL = 1000 * 10;
+const POLLING_INTERVAL =
+ prefer.s.pollingInterval === 1 ? MIN_POLLING_INTERVAL :
+ prefer.s.pollingInterval === 2 ? MIN_POLLING_INTERVAL * 1.5 :
+ prefer.s.pollingInterval === 3 ? MIN_POLLING_INTERVAL * 1.5 * 1.5 :
+ MIN_POLLING_INTERVAL;
if (!store.s.realtimeMode) {
useInterval(async () => {
diff --git a/packages/frontend/src/components/MkTimeline.vue b/packages/frontend/src/components/MkTimeline.vue
index 9b28573712..d5f8becca7 100644
--- a/packages/frontend/src/components/MkTimeline.vue
+++ b/packages/frontend/src/components/MkTimeline.vue
@@ -109,7 +109,12 @@ type TimelineQueryType = {
let adInsertionCounter = 0;
-const POLLING_INTERVAL = 1000 * 15;
+const MIN_POLLING_INTERVAL = 1000 * 10;
+const POLLING_INTERVAL =
+ prefer.s.pollingInterval === 1 ? MIN_POLLING_INTERVAL :
+ prefer.s.pollingInterval === 2 ? MIN_POLLING_INTERVAL * 1.5 :
+ prefer.s.pollingInterval === 3 ? MIN_POLLING_INTERVAL * 1.5 * 1.5 :
+ MIN_POLLING_INTERVAL;
if (!store.s.realtimeMode) {
useInterval(async () => {
diff --git a/packages/frontend/src/pages/settings/preferences.vue b/packages/frontend/src/pages/settings/preferences.vue
index acdb9bb5a1..8480ff4ddb 100644
--- a/packages/frontend/src/pages/settings/preferences.vue
+++ b/packages/frontend/src/pages/settings/preferences.vue
@@ -41,6 +41,24 @@ SPDX-License-Identifier: AGPL-3.0-only
+