diff --git a/src/locale/helpers.ts b/src/locale/helpers.ts index 4d01459ab2..b45ebc57e5 100644 --- a/src/locale/helpers.ts +++ b/src/locale/helpers.ts @@ -2,7 +2,11 @@ import {AppBskyFeedDefs, AppBskyFeedPost} from '@atproto/api' import lande from 'lande' import {hasProp} from 'lib/type-guards' import * as bcp47Match from 'bcp-47-match' -import {LANGUAGES_MAP_CODE2, LANGUAGES_MAP_CODE3} from './languages' +import { + AppLanguage, + LANGUAGES_MAP_CODE2, + LANGUAGES_MAP_CODE3, +} from './languages' export function code2ToCode3(lang: string): string { if (lang.length === 2) { @@ -85,14 +89,32 @@ export function getTranslatorLink(text: string, lang: string): string { )}` } -export function sanitizeAppLanguageSetting(appLanguage: string) { +/** + * Returns a valid `appLanguage` value from an arbitrary string. + * + * Contenxt: post-refactor, we populated some user's `appLanguage` setting with + * `postLanguage`, which can be a comma-separated list of values. This breaks + * `appLanguage` handling in the app, so we introduced this util to parse out a + * valid `appLanguage` from the pre-populated `postLanguage` values. The + * `appLanguage` will be incorrect until the user returns to language settings + * and selects a new option, at which point we'll re-save their choice, which + * should then be a valid option. + */ +export function sanitizeAppLanguageSetting( + appLanguage: AppLanguage | string, +): AppLanguage { const langs = appLanguage.split(',').filter(Boolean) for (const lang of langs) { - if (['en', 'hi'].includes(lang)) { - return lang + switch (lang) { + case 'en': + return AppLanguage.en + case 'hi': + return AppLanguage.hi + default: + continue } } - return 'en' + return AppLanguage.en } diff --git a/src/locale/i18n.ts b/src/locale/i18n.ts index 93d21f3817..2e54b15ea5 100644 --- a/src/locale/i18n.ts +++ b/src/locale/i18n.ts @@ -5,22 +5,21 @@ import {useLanguagePrefs} from '#/state/preferences' import {messages as messagesEn} from '#/locale/locales/en/messages' import {messages as messagesHi} from '#/locale/locales/hi/messages' import {sanitizeAppLanguageSetting} from '#/locale/helpers' - -export const locales = { - en: 'English', - hi: 'हिंदी', -} -export const defaultLocale = 'en' +import {AppLanguage} from '#/locale/languages' /** * We do a dynamic import of just the catalog that we need - * @param locale any locale string */ -export async function dynamicActivate(locale: string) { - if (locale === 'hi') { - i18n.loadAndActivate({locale, messages: messagesHi}) - } else { - i18n.loadAndActivate({locale, messages: messagesEn}) +export async function dynamicActivate(locale: AppLanguage) { + switch (locale) { + case AppLanguage.hi: { + i18n.loadAndActivate({locale, messages: messagesHi}) + break + } + default: { + i18n.loadAndActivate({locale, messages: messagesEn}) + break + } } } diff --git a/src/locale/i18n.web.ts b/src/locale/i18n.web.ts index bc484f3037..54963836b7 100644 --- a/src/locale/i18n.web.ts +++ b/src/locale/i18n.web.ts @@ -3,24 +3,23 @@ import {i18n} from '@lingui/core' import {useLanguagePrefs} from '#/state/preferences' import {sanitizeAppLanguageSetting} from '#/locale/helpers' - -export const locales = { - en: 'English', - hi: 'हिंदी', -} -export const defaultLocale = 'en' +import {AppLanguage} from '#/locale/languages' /** * We do a dynamic import of just the catalog that we need - * @param locale any locale string */ -export async function dynamicActivate(locale: string) { +export async function dynamicActivate(locale: AppLanguage) { let mod: any - if (locale === 'hi') { - mod = await import(`./locales/hi/messages`) - } else { - mod = await import(`./locales/en/messages`) + switch (locale) { + case AppLanguage.hi: { + mod = await import(`./locales/hi/messages`) + break + } + default: { + mod = await import(`./locales/en/messages`) + break + } } i18n.load(locale, mod.messages) diff --git a/src/locale/languages.ts b/src/locale/languages.ts index cfcc60c5aa..40821346f9 100644 --- a/src/locale/languages.ts +++ b/src/locale/languages.ts @@ -4,12 +4,17 @@ interface Language { name: string } -interface AppLanguage { +export enum AppLanguage { + en = 'en', + hi = 'hi', +} + +interface AppLanguageConfig { code2: string name: string } -export const APP_LANGUAGES: AppLanguage[] = [ +export const APP_LANGUAGES: AppLanguageConfig[] = [ {code2: 'en', name: 'English'}, {code2: 'hi', name: 'हिंदी'}, ]