---
title: Locales
layout: docs
permalink: /docs/locales/
---
The locale of the build system might affect the build products. While
it is important that developers have access to error messages in the
language of their choice, tools which output is influenced by the
current locale can make locale a source of reproducibility issues.
There are many aspects regarding locales (see [GNU libc locale(1)
manpage](https://manpages.debian.org/locale)). The ones that follow are the
most important ones to consider in the context of reproducible builds.
Time format
-----------
Several common time formatting functions will have output depending
on the current locale. On a POSIX system the formatting will depend on
the `LC_CTIME` environment variable, which can be overridden by
`LC_ALL`.
For build systems, it's thus best to use `LC_ALL` directly:
{% highlight sh %}
$ LC_ALL=C date -u -d '2015-10-21'
Wed Oct 21 00:00:00 UTC 2015
{% endhighlight %}
The system [timezone]({{ "/docs/timezones/" | relative_url }})
and `TZ` environment variable will also affect the output of time
formatting functions.
Collation order
---------------
Common sorting functions are affected by the `LC_COLLATE` environment
variable, which can be overridden by `LC_ALL`. Some locales can
be quite surprising.
This typically shows when using `sort`. The `fr_FR` locale will sort
independently of the character case:
{% highlight sh %}
$ echo B a c | tr ' ' '\n' | LC_ALL=fr_FR.UTF-8 sort
a
B
c
{% endhighlight %}
The `C` locale will sort according to the byte values and is always
available:
{% highlight sh %}
$ echo B a c | tr ' ' '\n' | LC_ALL=C sort
B
a
c
{% endhighlight %}
Default character encoding
--------------------------
The default system character encoding will affect both the input and
output of many tools. It is defined using the `LC_CTYPE` environment
variable, and can also be overridden using `LC_ALL`.
Here's an example when using `lynx` to convert HTML documentation into
text:
{% highlight sh %}
LC_ALL=fr_FR lynx -dump -width 72 docs.html | file -
/dev/stdin: ISO-8859 text
{% endhighlight %}
The `C.UTF-8` pseudo-locale can always be used to get the default strings with
UTF-8 output:
{% highlight sh %}
LC_ALL=C.UTF-8 lynx -dump -width 72 docs.html | file -
/dev/stdin: UTF-8 Unicode text
{% endhighlight %}