A locale is a subset of a user's environment that indicates the user's
language and country, and some attendant preferences, such as the
formatting of dates. The units program attempts to determine
the locale from the POSIX setlocale function; if this cannot be done,
units examines the environment
variables LC_CTYPE and LANG.
On POSIX systems, a locale is of the form
_country, where language is the
two-character code from ISO 639-1 and country is the two-character
code from ISO 3166-1; language is lower case and country is
upper case. For example, the POSIX locale for the United Kingdom is
On systems running Microsoft Windows, the value returned by setlocale() is different from that on POSIX systems; units attempts to map the Windows value to a POSIX value by means of a table in the file locale_map.txt in the same directory as the other data files. The file includes entries for many combinations of language and country, and can be extended to include other combinations. The locale_map.txt file comprises two tab-separated columns; each entry is of the form
where POSIX-locale is as described above, and Windows-locale typically spells out both the language and country. For example, the entry for the United States is
English_United States en_US
You can force units to run in a desired locale by using the -l option.
In order to create unit definitions for a particular locale you begin a block of definitions in a unit datafile with ‘!locale’ followed by a locale name. The ‘!’ must be the first character on the line. The units program reads the following definitions only if the current locale matches. You end the block of localized units with ‘!endlocale’. Here is an example, which defines the British gallon.
!locale en_GB gallon 4.54609 liter !endlocale