about summary refs log tree commit diff
path: root/src/locale
diff options
context:
space:
mode:
Diffstat (limited to 'src/locale')
-rw-r--r--src/locale/__tests__/helpers.test.ts12
-rw-r--r--src/locale/helpers.ts33
-rw-r--r--src/locale/i18n.ts23
-rw-r--r--src/locale/i18n.web.ts23
-rw-r--r--src/locale/languages.ts15
5 files changed, 72 insertions, 34 deletions
diff --git a/src/locale/__tests__/helpers.test.ts b/src/locale/__tests__/helpers.test.ts
new file mode 100644
index 000000000..d4bc6c338
--- /dev/null
+++ b/src/locale/__tests__/helpers.test.ts
@@ -0,0 +1,12 @@
+import {test, expect} from '@jest/globals'
+
+import {sanitizeAppLanguageSetting} from '#/locale/helpers'
+import {AppLanguage} from '#/locale/languages'
+
+test('sanitizeAppLanguageSetting', () => {
+  expect(sanitizeAppLanguageSetting('en')).toBe(AppLanguage.en)
+  expect(sanitizeAppLanguageSetting('hi')).toBe(AppLanguage.hi)
+  expect(sanitizeAppLanguageSetting('foo')).toBe(AppLanguage.en)
+  expect(sanitizeAppLanguageSetting('en,fr')).toBe(AppLanguage.en)
+  expect(sanitizeAppLanguageSetting('fr,en')).toBe(AppLanguage.en)
+})
diff --git a/src/locale/helpers.ts b/src/locale/helpers.ts
index 4d01459ab..d80cb5032 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,33 @@ 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 continue to 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. Since we don't know when
+ * this will happen, we should leave this here until we feel it's safe to
+ * remove, or we re-migrate their storage.
+ */
+export function sanitizeAppLanguageSetting(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 93d21f381..2e54b15ea 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 bc484f303..54963836b 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 cfcc60c5a..e45fdf42c 100644
--- a/src/locale/languages.ts
+++ b/src/locale/languages.ts
@@ -4,14 +4,19 @@ interface Language {
   name: string
 }
 
-interface AppLanguage {
-  code2: string
+export enum AppLanguage {
+  en = 'en',
+  hi = 'hi',
+}
+
+interface AppLanguageConfig {
+  code2: AppLanguage
   name: string
 }
 
-export const APP_LANGUAGES: AppLanguage[] = [
-  {code2: 'en', name: 'English'},
-  {code2: 'hi', name: 'हिंदी'},
+export const APP_LANGUAGES: AppLanguageConfig[] = [
+  {code2: AppLanguage.en, name: 'English'},
+  {code2: AppLanguage.hi, name: 'हिंदी'},
 ]
 
 export const LANGUAGES: Language[] = [