Localization is an undocumented Bash feature.
A localized shell script echoes its text output in the language defined as the system's locale. A Linux user in Berlin, Germany, would get script output in German, whereas his cousin in Berlin, Maryland, would get output from the same script in English.
To create a localized script, use the following template to write all messages to the user (error messages, prompts, etc.).
| #!/bin/bash
# localized.sh
E_CDERROR=65
error()
{
  printf "$@" >&2
  exit $E_CDERROR
}
cd $var || error $"Can't cd to %s." "$var"
read -p $"Enter the value: " var
# ... | 
| bash$ bash -D localized.sh "Can't cd to %s." "Enter the value: " | 
| bash$ bash --dump-po-strings localized.sh #: a:6 msgid "Can't cd to %s." msgstr "" #: a:7 msgid "Enter the value: " msgstr "" | 
Now, build a language.po file for each language that the script will be translated into, specifying the msgstr. As an example:
fr.po:
| #: a:6 msgid "Can't cd to %s." msgstr "Impossible de se positionner dans le répertoire %s." #: a:7 msgid "Enter the value: " msgstr "Entrez la valeur : " | 
Then, run msgfmt.
msgfmt -o localized.sh.mo fr.po
Place the resulting localized.sh.mo file in the /usr/local/share/locale/fr/LC_MESSAGES directory, and at the beginning of the script, insert the lines:
| TEXTDOMAINDIR=/usr/local/share/locale TEXTDOMAIN=localized.sh | 
If a user on a French system runs the script, she will get French messages.
|  | With older versions of Bash or other shells, localization requires gettext, using the -s option. In this case, the script becomes: 
 | 
The TEXTDOMAIN and TEXTDOMAINDIR variables need to be exported to the environment.
---
This appendix written by Stephane Chazelas.