Back to systemd

This page has been obsoleted and replaced:


systemd 30 and newer include systemd-localed. This is a tiny daemon that can be used to control the system locale and keyboard mapping from user programs.

See systemd-localed.service(8) for more information.

The daemon is accessible via D-Bus:

$ gdbus introspect --system --dest org.freedesktop.locale1 --object-path /org/freedesktop/locale1
node /org/freedesktop/locale1 {
  interface org.freedesktop.locale1 {
      SetLocale(in  as locale,
                in  b user_interaction);
      SetVConsoleKeyboard(in  s keymap,
                          in  s keymap_toggle,
                          in  b convert,
                          in  b user_interaction);
      SetX11Keyboard(in  s layout,
                     in  s model,
                     in  s variant,
                     in  s options,
                     in  b convert,
                     in  b user_interaction);
      readonly as Locale = ['LANG=en_US.UTF-8'];
      readonly s VConsoleKeymap = 'de';
      readonly s VConsoleKeymapToggle = '';
      readonly s X11Layout = 'de';
      readonly s X11Model = '';
      readonly s X11Variant = '';
      readonly s X11Options = '';
  interface org.freedesktop.DBus.Properties {
  interface org.freedesktop.DBus.Introspectable {
  interface org.freedesktop.DBus.Peer {

Whenever the system locale or keymap is changed via the daemon PropertyChanged signals are sent out to which clients can subscribe.

Changing the system locale or keymap using this interface is authenticated via PolicyKit. The PolicyKit action for SetLocale() is org.freedesktop.locale1.set-locale. The PolicyKit action for SetX11Keyboard() and !SetVConsoleKeyboard() is org.freedesktop.locale1.set-keyboard.

The user_interaction boolean parameters can be used to control whether PolicyKit should interactively ask the user for authentication credentials if it needs to.

The system locale consists of an array of environment-variable-assignment-like strings. The following strings are known: LANG=, LC_CTYPE=, LC_NUMERIC=, LC_TIME=, LC_COLLATE=, LC_MONETARY=, LC_MESSAGES=, LC_PAPER=, LC_NAME=, LC_ADDRESS=, LC_TELEPHONE=, LC_MEASUREMENT=, LC_IDENTIFICATION=.

If you set a new system locale all old system locale settings will be dropped, and the new settings will be saved to disk. It will also be passed to the system manager, and subsequently started daemons will inherit the new system locale from it. Note that already running daemons will not learn about the new system locale.

The SetVConsoleKeyboard() call may be used to set the key mapping on the virtual console. Similarly, SetX11Keyboard() may be used to set the default key mapping of the X11 servers.

Note that SetVConsoleKeyboard() instantly applies the new keymapping to the console, while SetX11Keyboard() simply sets a default that may be used by later sessions.

The boolean argument convert may be set to optionally convert the console keyboard configuration to X11 keyboard mappings, resp. vice versa. If true and SetVConsoleKeyboard() is used the nearest X11 keyboard setting for the chosen console setting is set. If true and SetX11Keyboard() is used the nearest console keyboard setting for the chosen X11 setting is set. Usually it is hence sufficient to call one of the two functions.

For graphical UIs that need to set the system keyboard mapping simply invoke SetX11Keyboard(), set convert=true and ignore SetVConsoleKeyboard().

Use the empty string for the keymap parameters you wish not to set.

The sources for localed are available in git for review:

This D-Bus interface follows the usual interface versioning guidelines.