Files
suwayomi-material-you-webui/src/lib/ISOLanguageUtil.ts

56 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-01-11 17:18:42 +01:00
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { ISOLanguage, IsoLanguages } from '@/base/IsoLanguages.ts';
export type LanguageObject = ISOLanguage & { orgCode: string; isoCode: string };
export const DEFAULT_LANGUAGE = 'en';
export function getISOLanguageFor(code: string, orgCode: string = code, isoCode: string = code): LanguageObject | null {
if (IsoLanguages[code]) {
return {
...IsoLanguages[code],
orgCode,
isoCode,
};
}
return null;
}
export function getISOLanguage(code: string): LanguageObject | null {
return (
getISOLanguageFor(code) ??
getISOLanguageFor(code.toLowerCase(), code) ??
getISOLanguageFor(code.replace('-', '_'), code) ??
getISOLanguageFor(code.replace('_', '-'), code) ??
getISOLanguageFor(code.split('-')[0], code) ??
getISOLanguageFor(code.split('_')[0], code)
);
}
export const toUniqueISOLanguageCodes = (codes: string[]): string[] => {
const languages = codes.map((code) => getISOLanguage(code)).filter((code) => code !== null);
const languagesByIsoCode = Object.groupBy(languages, (language) => language.isoCode);
return Object.entries(languagesByIsoCode)
.filter(([, languagesOfIsoCode]) => !!languagesOfIsoCode?.length)
.map(([, languagesOfIsoCode]) => languagesOfIsoCode![0].orgCode);
};
export function getPreferredISOLanguageCodes(): readonly string[] {
const preferredLanguages = toUniqueISOLanguageCodes([...navigator.languages]);
if (!preferredLanguages.length) {
return [DEFAULT_LANGUAGE];
}
return preferredLanguages;
}