diff --git a/CHANGELOG.md b/CHANGELOG.md
index f669c0366e..cff0fc07cd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -38,6 +38,7 @@
- Enhance: 絵文字ピッカー・オートコンプリートで、完全一致した絵文字を優先的に表示するように
- Enhance: Playの説明欄にMFMを使えるように
- Enhance: チャンネルノートの場合は詳細ページからその前後のノートを見れるように
+- Enhance: 季節に応じた画面の演出を南半球でも利用できるように
- Enhance: タイムラインフィルターの設定をすべて保持できるように
- 今までの「TLに他の人への返信を含める」設定は一旦リセットされます
- Enhance: タイムラインフィルターに「センシティブなファイルを含むノートを表示」を追加
diff --git a/locales/index.d.ts b/locales/index.d.ts
index 5d345b88e6..ae27bd110b 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -4824,6 +4824,7 @@ export interface Locale extends ILocale {
* タイトルへ
*/
"backToTitle": string;
+ "hemisphere": string;
/**
* センシティブなファイルを含むノートを表示
*/
@@ -9420,6 +9421,11 @@ export interface Locale extends ILocale {
"description": string;
};
};
+ "_hemisphere": {
+ "N": string;
+ "S": string;
+ "caption": string;
+ };
"_reversi": {
/**
* リバーシ
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 180f7f5732..913e677488 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1202,6 +1202,7 @@ replaying: "リプレイ中"
ranking: "ランキング"
lastNDays: "直近{n}日"
backToTitle: "タイトルへ"
+hemisphere: "お住まいの地域"
withSensitive: "センシティブなファイルを含むノートを表示"
userSaysSomethingSensitive: "{name}のセンシティブなファイルを含む投稿"
enableHorizontalSwipe: "スワイプしてタブを切り替える"
@@ -2510,6 +2511,11 @@ _dataSaver:
title: "コードハイライト"
description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。"
+_hemisphere:
+ N: "北半球"
+ S: "南半球"
+ caption: "一部のクライアント設定で、季節を判定するために使用します。"
+
_reversi:
reversi: "リバーシ"
gameSettings: "対局の設定"
@@ -2551,3 +2557,4 @@ _reversi:
_offlineScreen:
title: "オフライン - サーバーに接続できません"
header: "サーバーに接続できません"
+
diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts
index c99118f9b2..eb0ac43da7 100644
--- a/packages/frontend/src/boot/main-boot.ts
+++ b/packages/frontend/src/boot/main-boot.ts
@@ -77,9 +77,18 @@ export async function mainBoot() {
if (defaultStore.state.enableSeasonalScreenEffect) {
const month = new Date().getMonth() + 1;
- if (month === 12 || month === 1) {
- const SnowfallEffect = (await import('@/scripts/snowfall-effect.js')).SnowfallEffect;
- new SnowfallEffect().render();
+ if (defaultStore.state.hemisphere === 'S') {
+ // ▼南半球
+ if (month === 7 || month === 8) {
+ const SnowfallEffect = (await import('@/scripts/snowfall-effect.js')).SnowfallEffect;
+ new SnowfallEffect().render();
+ }
+ } else {
+ // ▼北半球
+ if (month === 12 || month === 1) {
+ const SnowfallEffect = (await import('@/scripts/snowfall-effect.js')).SnowfallEffect;
+ new SnowfallEffect().render();
+ }
}
}
diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue
index bbc910a32a..8b489c7a11 100644
--- a/packages/frontend/src/pages/settings/general.vue
+++ b/packages/frontend/src/pages/settings/general.vue
@@ -17,6 +17,13 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+ {{ i18n.ts.hemisphere }}
+
+
+ {{ i18n.ts._hemisphere.caption }}
+
+
{{ i18n.ts.overridedDeviceKind }}
@@ -260,6 +267,7 @@ async function reloadAsk() {
unisonReload();
}
+const hemisphere = computed(defaultStore.makeGetterSetter('hemisphere'));
const overridedDeviceKind = computed(defaultStore.makeGetterSetter('overridedDeviceKind'));
const serverDisconnectedBehavior = computed(defaultStore.makeGetterSetter('serverDisconnectedBehavior'));
const showNoteActionsOnlyHover = computed(defaultStore.makeGetterSetter('showNoteActionsOnlyHover'));
@@ -322,6 +330,7 @@ watch(useSystemFont, () => {
});
watch([
+ hemisphere,
lang,
fontSize,
useSystemFont,
diff --git a/packages/frontend/src/scripts/intl-const.ts b/packages/frontend/src/scripts/intl-const.ts
index ea16c9c2ae..d2d939af1f 100644
--- a/packages/frontend/src/scripts/intl-const.ts
+++ b/packages/frontend/src/scripts/intl-const.ts
@@ -33,6 +33,10 @@ try {
}
export const dateTimeFormat = _dateTimeFormat;
+export const timeZone = dateTimeFormat.resolvedOptions().timeZone;
+
+export const hemisphere = /^(australia|pacific|antarctica|indian)\//i.test(timeZone) ? 'S' : 'N';
+
let _numberFormat: Intl.NumberFormat;
try {
_numberFormat = new Intl.NumberFormat(versatileLang);
diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts
index 5635e99650..afc35bb825 100644
--- a/packages/frontend/src/store.ts
+++ b/packages/frontend/src/store.ts
@@ -8,6 +8,7 @@ import * as Misskey from 'misskey-js';
import { miLocalStorage } from './local-storage.js';
import type { SoundType } from '@/scripts/sound.js';
import { Storage } from '@/pizzax.js';
+import { hemisphere } from '@/scripts/intl-const.js';
interface PostFormAction {
title: string,
@@ -429,6 +430,10 @@ export const defaultStore = markRaw(new Storage('base', {
sfxVolume: 1,
},
},
+ hemisphere: {
+ where: 'device',
+ default: hemisphere as 'N' | 'S',
+ },
enableHorizontalSwipe: {
where: 'device',
default: true,