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 }