✨(frontend) add language utility for "locale"
- Adds a helper for working with locales - More details in their annotations - Unnecessary, if in the future, the backend uses the same locales as the keys in the translations (ISO 639-1)
This commit is contained in:
@@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* @param {string} locale - The locale string, which can be in formats like de-DE, de-CH, de_DE, de-de, de_de, or de.
|
||||||
|
* @returns {string} The regionless ISO 639-1 code. => de
|
||||||
|
*/
|
||||||
|
export function convertLocaleToISO639_1(locale: string): string {
|
||||||
|
// Split the locale string by either a hyphen (-) or an underscore (_)
|
||||||
|
return locale.split(/[-_]/)[0].toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters the available locales to find those that match the search criteria.
|
||||||
|
*
|
||||||
|
* @param {readonly string[]} localesAvailable - The list of available locale strings to match against.
|
||||||
|
* @param {readonly string[]} localesToSearch - The list of locale strings to search for.
|
||||||
|
* @returns {string[]} Filtered list of localesAvailable that match localesToSearch, ordered by closest match.
|
||||||
|
*/
|
||||||
|
export function getMatchingLocales(
|
||||||
|
localesAvailable: readonly string[],
|
||||||
|
localesToSearch: readonly string[],
|
||||||
|
): string[] {
|
||||||
|
const matchingLocales: string[] = [];
|
||||||
|
for (const localeToSearch of localesToSearch) {
|
||||||
|
// Exact match (case-insensitive)
|
||||||
|
const exactMatches = localesAvailable.filter(
|
||||||
|
(localeAvailable) =>
|
||||||
|
localeAvailable.toLowerCase() === localeToSearch.toLowerCase(),
|
||||||
|
);
|
||||||
|
if (exactMatches.length > 0) {
|
||||||
|
for (const matchingLocale of exactMatches) {
|
||||||
|
if (!matchingLocales.includes(matchingLocale)) {
|
||||||
|
matchingLocales.push(matchingLocale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Soft match (ISO639-1 code)
|
||||||
|
const softMatches = localesAvailable.filter(
|
||||||
|
(localeAvailable) =>
|
||||||
|
convertLocaleToISO639_1(localeAvailable) ===
|
||||||
|
convertLocaleToISO639_1(localeToSearch),
|
||||||
|
);
|
||||||
|
for (const matchingLocale of softMatches) {
|
||||||
|
if (!matchingLocales.includes(matchingLocale)) {
|
||||||
|
matchingLocales.push(matchingLocale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return matchingLocales;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user