56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
|
|
/*
|
||
|
|
* 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;
|
||
|
|
}
|