/* This file is part of GNU Anastasis (C) 2021-2022 Anastasis SARL GNU Anastasis is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Anastasis is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with GNU Anastasis; see the file COPYING. If not, see */ import { StorageState, buildStorageKey, useLocalStorage, } from "./useLocalStorage.js"; const MIN_LANG_COVERAGE_THRESHOLD = 90; /** * choose the best from the browser config based on the completeness * on the translation */ function getBrowserLang(completeness: Record): string | undefined { if (typeof window === "undefined") return undefined; if (window.navigator.language) { if (completeness[window.navigator.language] >= MIN_LANG_COVERAGE_THRESHOLD) { return window.navigator.language } } if (window.navigator.languages) { const match = Object.entries(completeness).filter(([code, value]) => { if (value < MIN_LANG_COVERAGE_THRESHOLD) return false; //do not consider langs below 90% return window.navigator.languages.findIndex(l => l.startsWith(code)) !== -1 }).map(([code, value]) => ({ code, value })) if (match.length > 0) { let max = match[0] match.forEach(v => { if (v.value > max.value) { max = v } }) return max.code } }; return undefined; } const langPreferenceKey = buildStorageKey("lang-preference"); export function useLang(initial: string | undefined, completeness: Record): Required { const defaultValue = (getBrowserLang(completeness) || initial || "en").substring(0, 2); return useLocalStorage(langPreferenceKey, defaultValue); }