Using the Linux locale command
The locale settings in Linux systems help ensure that information like dates and times are displayed in a format that makes sense in the context of where you live and what language you speak. Here’s how to use them.
NOTE: None of the commands described in this post will change your locale settings. Some merely use a different locale setting to display the response you might be seeing from a different location.
List your settings
If you’re in the US, you should see something like this when you use the locale command to list your settings:
$ locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
The en_US.UTF-8 settings in the above output all represent US English. If you’re in France, this response is more likely:
LANG=fr_FR.utf-8 LC_CTYPE="fr_FR.utf8" LC_NUMERIC="fr_FR.utf8" LC_TIME="fr_FR.utf8" LC_COLLATE="fr_FR.utf8" LC_MONETARY="fr_FR.utf8" LC_MESSAGES="fr_FR.utf8" LC_PAPER="fr_FR.utf8" LC_NAME="fr_FR.utf8" LC_ADDRESS="fr_FR.utf8" LC_TELEPHONE="fr_FR.utf8" LC_MEASUREMENT="fr_FR.utf8" LC_IDENTIFICATION="fr_FR.utf8" LC_ALL=fr_FR.utf8
Hundreds of lines of output will be displayed if you use the locale -a (list all locales) command since it lists locales from around the globe.
$ locale -a | wc -l 869
Here’s a sample:
$ locale -a | column | head -10 aa_DJ es_CO.iso88591 ms_MY.utf8 aa_DJ.iso88591 es_CO.utf8 mt_MT aa_DJ.utf8 es_CR mt_MT.iso88593 aa_ER es_CR.iso88591 mt_MT.utf8 aa_ER@saaho es_CR.utf8 my_MM aa_ER.utf8 es_CU my_MM.utf8 aa_ER.utf8@saaho es_CU.utf8 nan_TW aa_ET es_DO nan_TW@latin aa_ET.utf8 es_DO.iso88591 nan_TW.utf8 af_ZA es_DO.utf8 nan_TW.utf8@latin
Like the en_US settings shown above, these codes, stand for the language and county (e.g., aa_DJ stands for Afar, Djibouti). You can display a complete list with a command like the following that selects the portions on lines prior to the periods and limits the output to one of each before organizing the listing in columns:
$ locale -a | grep "." | awk -F. '{print $1}' | uniq | column aa_DJ ca_FR es_DO is_IS nhn_MX st_ZA aa_ER ca_IT es_EC it_CH niu_NU sv_FI aa_ET ce_RU es_ES it_IT niu_NZ sv_SE af_ZA chr_US es_GT iu_CA nl_AW sw_KE agr_PE ckb_IQ es_HN ja_JP nl_BE sw_TZ ak_GH cmn_TW es_MX japanese nl_NL szl_PL am_ET crh_UA es_NI kab_DZ nn_NO ta_IN an_ES csb_PL es_PA ka_GE no_NO ta_LK anp_IN cs_CZ es_PE kk_KZ nr_ZA tcy_IN ar_AE C es_PR kl_GL nso_ZA te_IN ar_BH cv_RU es_PY km_KH oc_FR tg_TJ ar_DZ cy_GB es_SV kn_IN om_ET the_NP ar_EG da_DK es_US kok_IN om_KE th_TH ar_IN de_AT es_UY ko_KR or_IN ti_ER ar_IQ de_BE es_VE korean os_RU ti_ET ar_JO de_CH et_EE ks_IN pa_IN tig_ER ar_KW de_DE eu_ES ku_TR pap_AW tk_TM ar_LB de_IT fa_IR kw_GB pap_CW tl_PH ar_LY de_LI ff_SN ky_KG pa_PK tn_ZA ar_MA de_LU fi_FI lb_LU pl_PL to_TO ar_OM doi_IN fil_PH lg_UG ps_AF tpi_PG ar_QA dsb_DE fo_FO li_BE pt_BR tr_CY ar_SA dv_MV fr_BE lij_IT pt_PT tr_TR ar_SD dz_BT fr_CA li_NL quz_PE ts_ZA ar_SS el_CY fr_CH ln_CD raj_IN tt_RU ar_SY el_GR fr_FR lo_LA ro_RO ug_CN ar_TN en_AG fr_LU lt_LT ru_RU uk_UA ar_YE en_AU fur_IT lv_LV ru_UA unm_US as_IN en_BW fy_DE lzh_TW rw_RW ur_IN ast_ES en_CA fy_NL mag_IN sah_RU ur_PK ayc_PE en_DK ga_IE mai_IN sa_IN uz_UZ az_AZ en_GB gd_GB mai_NP sat_IN ve_ZA az_IR en_HK gez_ER mfe_MU sc_IT vi_VN be_BY en_IE gez_ET mg_MG sd_IN wa_BE bem_ZM en_IL gl_ES mhr_RU se_NO wae_CH ber_DZ en_IN gu_IN mi_NZ sgs_LT wal_ET ber_MA en_NG gv_GB miq_NI shn_MM wo_SN bg_BG en_NZ hak_TW mjw_IN shs_CA xh_ZA bhb_IN en_PH ha_NG mk_MK sid_ET yi_US bho_IN en_SC he_IL ml_IN si_LK yo_NG bho_NP en_SG hif_FJ mni_IN sk_SK yue_HK bi_VU en_US hi_IN mn_MN sl_SI yuw_PG bn_BD en_ZA hne_IN mnw_MM sm_WS zh_CN bn_IN en_ZM hr_HR mr_IN so_DJ zh_HK bo_CN en_ZW hsb_DE ms_MY so_ET zh_SG bo_IN eo ht_HT mt_MT so_KE zh_TW br_FR es_AR hu_HU my_MM so_SO zu_ZA brx_IN es_BO hy_AM nan_TW sq_AL bs_BA es_CL ia_FR nb_NO sq_MK byn_ER es_CO id_ID nds_DE sr_ME ca_AD es_CR ig_NG nds_NL sr_RS ca_ES es_CU ik_CA ne_NP ss_ZA
Notice that only four of the codes don’t use two-part naming: “C” for the POSIX standards-compliant format, “eo” for “esperanto” (the world’s most widely spoken constructed international auxiliary language), Japanese and Korean .
Viewing and looping through months and days
I discovered recently that I the locale command can display the months of the year or the days of the week with commands like these:
$ locale mon January;February;March;April;May;June;July;August;September;October;November;December $ locale day Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday
The above commands make looping through the months of the year or the days of the week surprisingly easy. For example, to loop through the months, use a command like this:
$ months=`locale mon | sed 's/;/ /g'` <== turn semicolons into blanks $ for mo in $months > do > echo $mo > done January February March April May June July August September October November December
To loop through the days of the week, try this:
$ weekdays=`locale day | sed 's/;/ /g'` $ for day in $weekdays > do > echo $day > done Sunday Monday Tuesday Wednesday Thursday Friday Saturday
Change the lauguage used for months and days
You can also use a locale setting to display the months of the year or the days of the week in some other language. For example, to display the months in French, use a command like this one:
$ LC_ALL=fr_FR.utf8 locale mon janvier;février;mars;avril;mai;juin;juillet;août;septembre;octobre;novembre;décembre
To see the months in Swahili instead, do this:
$ LC_ALL=sw_TZ.utf8 locale mon Januari;Februari;Machi;Aprili;Mei;Juni;Julai;Agosti;Septemba;Oktoba;Novemba;Desemba
To list the current date and time in Russian and Italian, use commands like these:
$ LC_ALL=os_RU.utf8 date
Крс 02 Янв 2023 11:35:31 EST $ LC_ALL=it_IT.utf8 date dom 3 gen 2023, 16:29:10, EST
Wrap-Up
Your locale settings are in place to ensure that date, time, and related details are displayed in the format that makes sense to you. They can, as described in this post, also allow you to generate month-of-year and day-of-week loops and to display date/time information in other languages.
Copyright © 2023 IDG Communications, Inc.