Skip to content

Instantly share code, notes, and snippets.

@yuriuliam
Last active April 2, 2022 19:33
Show Gist options
  • Save yuriuliam/7d80f6ce78bb7441081cf9f256b2ce56 to your computer and use it in GitHub Desktop.
Save yuriuliam/7d80f6ce78bb7441081cf9f256b2ce56 to your computer and use it in GitHub Desktop.
[TS/JS] some locale functions and utilities
type LocaleTag = "af-ZA" | "am-ET" | "ar-AE" | "ar-BH" | "ar-DZ" | "ar-EG" | "ar-IQ" | "ar-JO" | "ar-KW" | "ar-LB" | "ar-LY" | "ar-MA" | "ar-OM" | "ar-QA" | "ar-SA" | "ar-SD" | "ar-SY" | "ar-TN" | "ar-YE" | "arn-CL" | "as-IN" | "az-Cyrl-AZ" | "az-Latn-AZ" | "az-az" | "ba-RU" | "be-BY" | "bg-BG" | "bn-BD" | "bn-IN" | "bo-CN" | "br-FR" | "bs-Cyrl-BA" | "bs-Latn-BA" | "ca-ES" | "co-FR" | "cs-CZ" | "cy-GB" | "da-DK" | "de-AT" | "de-CH" | "de-DE" | "de-LI" | "de-LU" | "dsb-DE" | "dv-MV" | "el-CY" | "el-GR" | "en-029" | "en-AU" | "en-BZ" | "en-CA" | "en-GB" | "en-IE" | "en-IN" | "en-JM" | "en-MT" | "en-MY" | "en-NZ" | "en-PH" | "en-SG" | "en-TT" | "en-US" | "en-ZA" | "en-ZW" | "en-cb" | "es-AR" | "es-BO" | "es-CL" | "es-CO" | "es-CR" | "es-DO" | "es-EC" | "es-ES" | "es-GT" | "es-HN" | "es-MX" | "es-NI" | "es-PA" | "es-PE" | "es-PR" | "es-PY" | "es-SV" | "es-US" | "es-UY" | "es-VE" | "et-EE" | "eu-ES" | "fa-IR" | "fi-FI" | "fil-PH" | "fo-FO" | "fr-BE" | "fr-CA" | "fr-CH" | "fr-FR" | "fr-LU" | "fr-MC" | "fy-NL" | "ga-IE" | "gd-GB" | "gd-ie" | "gl-ES" | "gsw-FR" | "gu-IN" | "ha-Latn-NG" | "he-IL" | "hi-IN" | "hr-BA" | "hr-HR" | "hsb-DE" | "hu-HU" | "hy-AM" | "id-ID" | "ig-NG" | "ii-CN" | "in-ID" | "is-IS" | "it-CH" | "it-IT" | "iu-Cans-CA" | "iu-Latn-CA" | "iw-IL" | "ja-JP" | "ka-GE" | "kk-KZ" | "kl-GL" | "km-KH" | "kn-IN" | "ko-KR" | "kok-IN" | "ky-KG" | "lb-LU" | "lo-LA" | "lt-LT" | "lv-LV" | "mi-NZ" | "mk-MK" | "ml-IN" | "mn-MN" | "mn-Mong-CN" | "moh-CA" | "mr-IN" | "ms-BN" | "ms-MY" | "mt-MT" | "nb-NO" | "ne-NP" | "nl-BE" | "nl-NL" | "nn-NO" | "no-no" | "nso-ZA" | "oc-FR" | "or-IN" | "pa-IN" | "pl-PL" | "prs-AF" | "ps-AF" | "pt-BR" | "pt-PT" | "qut-GT" | "quz-BO" | "quz-EC" | "quz-PE" | "rm-CH" | "ro-RO" | "ro-mo" | "ru-RU" | "ru-mo" | "rw-RW" | "sa-IN" | "sah-RU" | "se-FI" | "se-NO" | "se-SE" | "si-LK" | "sk-SK" | "sl-SI" | "sma-NO" | "sma-SE" | "smj-NO" | "smj-SE" | "smn-FI" | "sms-FI" | "sq-AL" | "sr-BA" | "sr-CS" | "sr-Cyrl-BA" | "sr-Cyrl-CS" | "sr-Cyrl-ME" | "sr-Cyrl-RS" | "sr-Latn-BA" | "sr-Latn-CS" | "sr-Latn-ME" | "sr-Latn-RS" | "sr-ME" | "sr-RS" | "sr-sp" | "sv-FI" | "sv-SE" | "sw-KE" | "syr-SY" | "ta-IN" | "te-IN" | "tg-Cyrl-TJ" | "th-TH" | "tk-TM" | "tlh-QS" | "tn-ZA" | "tr-TR" | "tt-RU" | "tzm-Latn-DZ" | "ug-CN" | "uk-UA" | "ur-PK" | "uz-Cyrl-UZ" | "uz-Latn-UZ" | "uz-uz" | "vi-VN" | "wo-SN" | "xh-ZA" | "yo-NG" | "zh-CN" | "zh-HK" | "zh-MO" | "zh-SG" | "zh-TW" | "zu-ZA"
type FormatPriceOptions = Omit<Intl.NumberFormatOptions, 'style'>
type DateTimeOptions = Intl.DateTimeFormatOptions
const localeTags: Array<LocaleTag> = ["af-ZA", "am-ET", "ar-AE", "ar-BH", "ar-DZ", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SD", "ar-SY", "ar-TN", "ar-YE", "arn-CL", "as-IN", "az-Cyrl-AZ", "az-Latn-AZ", "az-az", "ba-RU", "be-BY", "bg-BG", "bn-BD", "bn-IN", "bo-CN", "br-FR", "bs-Cyrl-BA", "bs-Latn-BA", "ca-ES", "co-FR", "cs-CZ", "cy-GB", "da-DK", "de-AT", "de-CH", "de-DE", "de-LI", "de-LU", "dsb-DE", "dv-MV", "el-CY", "el-GR", "en-029", "en-AU", "en-BZ", "en-CA", "en-GB", "en-IE", "en-IN", "en-JM", "en-MT", "en-MY", "en-NZ", "en-PH", "en-SG", "en-TT", "en-US", "en-ZA", "en-ZW", "en-cb", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-DO", "es-EC", "es-ES", "es-GT", "es-HN", "es-MX", "es-NI", "es-PA", "es-PE", "es-PR", "es-PY", "es-SV", "es-US", "es-UY", "es-VE", "et-EE", "eu-ES", "fa-IR", "fi-FI", "fil-PH", "fo-FO", "fr-BE", "fr-CA", "fr-CH", "fr-FR", "fr-LU", "fr-MC", "fy-NL", "ga-IE", "gd-GB", "gd-ie", "gl-ES", "gsw-FR", "gu-IN", "ha-Latn-NG", "he-IL", "hi-IN", "hr-BA", "hr-HR", "hsb-DE", "hu-HU", "hy-AM", "id-ID", "ig-NG", "ii-CN", "in-ID", "is-IS", "it-CH", "it-IT", "iu-Cans-CA", "iu-Latn-CA", "iw-IL", "ja-JP", "ka-GE", "kk-KZ", "kl-GL", "km-KH", "kn-IN", "ko-KR", "kok-IN", "ky-KG", "lb-LU", "lo-LA", "lt-LT", "lv-LV", "mi-NZ", "mk-MK", "ml-IN", "mn-MN", "mn-Mong-CN", "moh-CA", "mr-IN", "ms-BN", "ms-MY", "mt-MT", "nb-NO", "ne-NP", "nl-BE", "nl-NL", "nn-NO", "no-no", "nso-ZA", "oc-FR", "or-IN", "pa-IN", "pl-PL", "prs-AF", "ps-AF", "pt-BR", "pt-PT", "qut-GT", "quz-BO", "quz-EC", "quz-PE", "rm-CH", "ro-RO", "ro-mo", "ru-RU", "ru-mo", "rw-RW", "sa-IN", "sah-RU", "se-FI", "se-NO", "se-SE", "si-LK", "sk-SK", "sl-SI", "sma-NO", "sma-SE", "smj-NO", "smj-SE", "smn-FI", "sms-FI", "sq-AL", "sr-BA", "sr-CS", "sr-Cyrl-BA", "sr-Cyrl-CS", "sr-Cyrl-ME", "sr-Cyrl-RS", "sr-Latn-BA", "sr-Latn-CS", "sr-Latn-ME", "sr-Latn-RS", "sr-ME", "sr-RS", "sr-sp", "sv-FI", "sv-SE", "sw-KE", "syr-SY", "ta-IN", "te-IN", "tg-Cyrl-TJ", "th-TH", "tk-TM", "tlh-QS", "tn-ZA", "tr-TR", "tt-RU", "tzm-Latn-DZ", "ug-CN", "uk-UA", "ur-PK", "uz-Cyrl-UZ", "uz-Latn-UZ", "uz-uz", "vi-VN", "wo-SN", "xh-ZA", "yo-NG", "zh-CN", "zh-HK", "zh-MO", "zh-SG", "zh-TW", "zu-ZA"]
/**
* Returns an array object with all Locales Data.
*
* @example
* const locales = getAllLocales()
* const usLocale = locales.find(locale => locale.baseName === 'en-US')
*
* console.log(usLocale) // Locale {language: 'en', region: 'US', baseName: 'en-US', …}
*
* @returns {Array<Intl.Locale>} The array object with all Locales Data.
*/
export function getAllLocales(): Array<Intl.Locale> {
return localeTags.map(localeTag => new Intl.Locale(localeTag))
}
/**
* Returns an array object with all Locale Tags.
*
* @example
* const localeTags = getAllLocaleTags()
*
* console.log(localeTags) // ["af-ZA", 'am-ET', 'ar-AE', …, 'zu-ZA']
*
* @returns {Array<string>} The array object with all Locale Tags.
*/
export function getAllLocaleTags(): Array<LocaleTag> {
return [...localeTags]
}
export function formatLocalePrice(value: number, locale: LocaleTag = 'en-US', options: FormatPriceOptions = {}) {
return new Intl.NumberFormat(locale, {
style: 'currency',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
...options
}).format(value)
}
export function formatLocaleDate(value: string | number | Date = Date.now(), locale: LocaleTag = 'en-US', options: DateTimeOptions = {}) {
if (typeof value === 'string') {
value = new Date(value)
}
return new Intl.DateTimeFormat(locale, {
...options
}).format(value)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment