Summary
Commit bab0b45 [🔥] Remove in-app language settings removed the in-app language picker, the persisted locale preference, and the setLocalePreference / loadInitialLocale helpers. The runtime now resolves the locale once at module init from expo-localization and never re-reads it.
The three project documents still describe the old behavior, which makes onboarding / handoff misleading and breaks the user-stated invariant that CLAUDE.md / SnowLog.md should reflect current implementation.
Problem (concrete divergences)
README.md:70
設定画面からの手動切替(日本語 / English / デバイスに従う)に対応し、選択は端末ローカルに永続化する。
The settings screen for language no longer exists; selection is not persisted. Should describe device-locale-only behavior and mention CFBundleLocalizations for InfoPlist localization.
SnowLog.md
- §4.3 lists
settings/language as a Stack-managed screen — it has been deleted (src/app/_layout.tsx registers no such screen).
- §5.4 "i18n 初期ロケール解決" describes reading
appPreferenceRepository.getPreference("locale") and "ja" | "en" | "device" value handling — none of this happens; see src/i18n/index.ts:12-18.
- §7.7 lists 6 settings menu items including "言語設定". The actual menu has 5 navigable items (calendar / techniques / favoriteResorts / tags / duplicateCandidates) plus a maintenance row "不要ファイルを削除". See
src/app/(tabs)/settings/index.tsx:30-59.
- §13 item 8: "日英 2 言語の i18n 基盤が導入済みで、設定から手動切替できる" — manual switching removed.
- §14 entire i18n chapter describes
setLocalePreference, loadInitialLocale, the useSyncExternalStore-driven re-render of Stack screens, and the LocalePreference = SupportedLocale | "device" type. None of these symbols exist anymore (verified by grep across src/).
.claude/CLAUDE.md
- "Boot order" comment mentions "i18n
loadInitialLocale" — function does not exist.
- "i18n live updates" section claims
useTranslation returns { t, locale, preference, setPreference } and that setLocalePreference("ja"|"en"|"device") notifies subscribers. Actual return type is { t: ..., locale: SupportedLocale } — see src/i18n/useTranslation.ts:11-14.
app_preferences keys list includes locale — that key is no longer written.
- Screens table includes
settings/language.
Relevant files
README.md:70 — manual switching claim
SnowLog.md — §4.3, §5.4, §7.7, §13, §14
.claude/CLAUDE.md — boot order, i18n live updates section, app_preferences keys, screens list
src/i18n/index.ts:12-43 — actual i18n surface (only t, getCurrentLocale, getLocaleVersion, subscribeToLocale remain)
src/i18n/useTranslation.ts:11-38 — actual hook return type
src/i18n/types.ts — only SupportedLocale and SUPPORTED_LOCALES remain; LocalePreference and LOCALE_PREFERENCE_KEY are gone
Proposed fix
Update all three documents to describe the current, simpler behavior:
- Locale resolves once at module init via
expo-localization.getLocales()[0]?.languageCode, falling back to en for non-ja devices.
- There is no in-app language switch; users change language by changing iOS system language.
- The
useTranslation hook returns { t, locale } only.
app_preferences keys actually used today are weekStartDay, home_sort_order, capturedAt_repair_version, thumbnail_migration_version — remove locale from any list.
- Settings menu in §7.7 should reflect the 5 navigable items + storage cleanup (covered separately by the orphan-cleanup docs issue).
Whether to also remove the now-dead subscribeToLocale / getLocaleVersion plumbing is tracked separately (see follow-up tech-debt issue).
Acceptance criteria
- README.md no longer claims in-app language switching exists.
- SnowLog.md §4.3 / §5.4 / §7.7 / §13 / §14 match current code.
- CLAUDE.md boot order, i18n section, screens list, and
app_preferences keys match current code.
- Documentation describes the actual
useTranslation return shape.
Summary
Commit
bab0b45 [🔥] Remove in-app language settingsremoved the in-app language picker, the persistedlocalepreference, and thesetLocalePreference/loadInitialLocalehelpers. The runtime now resolves the locale once at module init fromexpo-localizationand never re-reads it.The three project documents still describe the old behavior, which makes onboarding / handoff misleading and breaks the user-stated invariant that CLAUDE.md / SnowLog.md should reflect current implementation.
Problem (concrete divergences)
README.md:70The settings screen for language no longer exists; selection is not persisted. Should describe device-locale-only behavior and mention
CFBundleLocalizationsfor InfoPlist localization.SnowLog.mdsettings/languageas a Stack-managed screen — it has been deleted (src/app/_layout.tsxregisters no such screen).appPreferenceRepository.getPreference("locale")and"ja" | "en" | "device"value handling — none of this happens; seesrc/i18n/index.ts:12-18.src/app/(tabs)/settings/index.tsx:30-59.setLocalePreference,loadInitialLocale, theuseSyncExternalStore-driven re-render of Stack screens, and theLocalePreference = SupportedLocale | "device"type. None of these symbols exist anymore (verified by grep acrosssrc/)..claude/CLAUDE.mdloadInitialLocale" — function does not exist.useTranslationreturns{ t, locale, preference, setPreference }and thatsetLocalePreference("ja"|"en"|"device")notifies subscribers. Actual return type is{ t: ..., locale: SupportedLocale }— seesrc/i18n/useTranslation.ts:11-14.app_preferenceskeys list includeslocale— that key is no longer written.settings/language.Relevant files
README.md:70— manual switching claimSnowLog.md— §4.3, §5.4, §7.7, §13, §14.claude/CLAUDE.md— boot order, i18n live updates section, app_preferences keys, screens listsrc/i18n/index.ts:12-43— actual i18n surface (onlyt,getCurrentLocale,getLocaleVersion,subscribeToLocaleremain)src/i18n/useTranslation.ts:11-38— actual hook return typesrc/i18n/types.ts— onlySupportedLocaleandSUPPORTED_LOCALESremain;LocalePreferenceandLOCALE_PREFERENCE_KEYare goneProposed fix
Update all three documents to describe the current, simpler behavior:
expo-localization.getLocales()[0]?.languageCode, falling back toenfor non-jadevices.useTranslationhook returns{ t, locale }only.app_preferenceskeys actually used today areweekStartDay,home_sort_order,capturedAt_repair_version,thumbnail_migration_version— removelocalefrom any list.Whether to also remove the now-dead
subscribeToLocale/getLocaleVersionplumbing is tracked separately (see follow-up tech-debt issue).Acceptance criteria
app_preferenceskeys match current code.useTranslationreturn shape.