options: new "english" option

Massimo Melina committed Dec 13, 2024 at 10:03 UTC 15685c30c62f50f1a38a0ba6dabaffbea798ca11
4 files changed +21 -9
frontend/src/i18n.ts
+4 -1
@@ -1,4 +1,7 @@
1 import { i18nFromTranslations } from '../../src/i18n'
2 import { getHFS } from '@hfs/shared'
3 +import { state } from './state'
4
4 -export default i18nFromTranslations(getHFS().lang || {})
\ No newline at end of file
5 +const i18n = i18nFromTranslations(getHFS().lang || {})
6 +i18n.state.disabled = state.disableTranslation
7 +export default i18n
\ No newline at end of file
frontend/src/options.ts
+10 -2
@@ -8,7 +8,7 @@ import { getHFS, hIcon, MAX_TILE_SIZE, SORT_BY_OPTIONS, THEME_OPTIONS } from './
8 import { MenuLink } from './menu'
9 import _ from 'lodash'
10 import i18n from './i18n'
11 -const { t } = i18n
11 +const { t, useI18N } = i18n
12
13 export function showOptions (){
14 newDialog({
@@ -20,6 +20,7 @@ export function showOptions (){
20
21 function Content(){
22 const snap = useSnapState()
23 + const {t} = useI18N()
24 return h(FlexV, { gap: '1.5em' },
25 snap.adminUrl && h(MenuLink, {
26 icon: 'admin',
@@ -74,7 +75,14 @@ export function showOptions (){
75 onChange(v) {
76 state.theme = v
77 }
77 - })
78 + }),
79 +
80 + h(Checkbox, {
81 + value: snap.disableTranslation,
82 + onChange(v) {
83 + i18n.state.disabled = state.disableTranslation = v
84 + }
85 + }, "English"),
86 )
87 }
88 }
src/cross.ts
+1
@@ -22,6 +22,7 @@ export const FRONTEND_OPTIONS = {
22 sort_numerics: false,
23 theme: '',
24 auto_play_seconds: 5,
25 + disableTranslation: false,
26 }
27 export const SORT_BY_OPTIONS = ['name', 'extension', 'size', 'time']
28 export const THEME_OPTIONS = { auto: '', light: 'light', dark: 'dark' }
src/i18n.ts
+6 -6
@@ -3,9 +3,10 @@
3 import { proxy, useSnapshot } from 'valtio'
4 import { watch } from 'valtio/utils'
5
6 -export function i18nFromTranslations(translations: Record<string, any>) {
6 +export function i18nFromTranslations(translations: Record<string, any>, embedded='en') {
7 const state = proxy({
8 - embedded: '',
8 + embedded,
9 + disabled: false,
10 translations, // all dictionaries
11 })
12 const searchLangs: string[] = []
@@ -35,7 +36,7 @@ export function i18nFromTranslations(translations: Record<string, any>) {
36 let selectedLang = '' // keep track of where we find the translation
37 const { embedded } = state
38 const langs = Object.keys(state.translations)
38 - for (const key of keys) {
39 + if (!state.disabled) for (const key of keys) {
40 for (const lang of searchLangs)
41 if (found = state.translations[selectedLang=lang]?.translate?.[key]) break
42 if (!warns.has(key) && langs.length && langs[0] !== embedded) {
@@ -113,10 +114,9 @@ export function i18nFromTranslations(translations: Record<string, any>) {
114
115 return {
116 t,
117 + state,
118 getLangs,
117 - i18nWrapperProps(embedded='en') {
118 - return { lang: getLangs()[0] || (state.embedded = embedded) }
119 - },
119 + i18nWrapperProps: () => ({ lang: getLangs()[0] || state.embedded }),
120 useI18N() { // the hook ensures translation is refreshed when language changes
121 useSnapshot(state)
122 return { t }