diff --git a/CHANGELOG.md b/CHANGELOG.md
index f669c0366e9c..cff0fc07cd21 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 5d345b88e686..ae27bd110b57 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 180f7f573200..913e67748808 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 c99118f9b23c..eb0ac43da712 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 bbc910a32a17..8b489c7a1178 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 ea16c9c2aec2..d2d939af1f43 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 5635e9965062..afc35bb825db 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,