From eec1e28e8e7e35f8d3b692608f84b5cfa18624e7 Mon Sep 17 00:00:00 2001 From: William Oldham Date: Sat, 6 Jan 2024 10:42:48 +0000 Subject: [PATCH] Update language util to get region from the locale code where available --- src/utils/language.ts | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/utils/language.ts b/src/utils/language.ts index 5f05113c..4d31bc1d 100644 --- a/src/utils/language.ts +++ b/src/utils/language.ts @@ -5,19 +5,11 @@ const languageOrder = ["en", "hi", "fr", "de", "nl", "pt"]; // mapping of language code to country code. // multiple mappings can exist, since languages are spoken in multiple countries. -// This mapping purely exists to prioritize a country over another in languages. +// This mapping purely exists to prioritize a country over another in languages where the +// base language code does not contain a region (i.e. if the language code is zh-Hant where Hant is a script) // iso639_1 -> iso3166 Alpha-2 const countryPriority: Record = { - en: "us", - nl: "nl", - fr: "fr", - de: "de", - pt: "pt", - ar: "sa", - es: "es", zh: "cn", - ko: "kr", - ta: "lk", }; // list of iso639_1 Alpha-2 codes used as default languages @@ -89,7 +81,7 @@ function populateLanguageCode(language: string): string { } /** - * @param locale idk what kinda code this takes, anytihhng in ietf format I guess + * @param locale idk what kinda code this takes, anything in ietf format I guess * @returns pretty format for language, null if it no info can be found for language */ export function getPrettyLanguageNameFromLocale(locale: string): string | null { @@ -105,12 +97,12 @@ export function getPrettyLanguageNameFromLocale(locale: string): string | null { } /** - * Sort locale codes by occurance, rest on alphabetical order + * Sort locale codes by occurrence, rest on alphabetical order * @param langCodes list language codes to sort * @returns sorted version of inputted list */ export function sortLangCodes(langCodes: string[]) { - const languagesOrder = [...languageOrder].reverse(); // Reverse is neccesary, not sure why + const languagesOrder = [...languageOrder].reverse(); // Reverse is necessary, not sure why const results = langCodes.sort((a, b) => { const langOrderA = languagesOrder.findIndex( @@ -137,20 +129,34 @@ export function getCountryCodeForLocale(locale: string): string | null { const tag = getTag(locale, true); if (!tag?.language?.Subtag) return null; - // this function isnt async, so its garuanteed to work like this + // this function isn't async, so its guaranteed to work like this countryLanguages.getLanguage(tag.language.Subtag, (_err, lang) => { if (lang) output = lang; }); + if (!output) return null; const priority = countryPriority[output.iso639_1.toLowerCase()]; if (output.countries.length === 0) { return priority ?? null; } + + // If the language contains a region, check that against the countries and + // return the region if it matches + const regionSubtag = tag?.region?.Subtag.toLowerCase(); + if (regionSubtag) { + const regionCode = output.countries.find( + (c) => + c.code_2.toLowerCase() === regionSubtag || + c.code_3.toLowerCase() === regionSubtag, + ); + if (regionCode) return regionCode.code_2.toLowerCase(); + } + if (priority) { - const priotizedCountry = output.countries.find( + const prioritizedCountry = output.countries.find( (v) => v.code_2.toLowerCase() === priority, ); - if (priotizedCountry) return priotizedCountry.code_2.toLowerCase(); + if (prioritizedCountry) return prioritizedCountry.code_2.toLowerCase(); } return output.countries[0].code_2.toLowerCase(); }