Comment trouver la langue configurée par l'utilisateur ? Il s'avère que, dans certaines situations, locale.getdefaultlocale() renvoie (None, None).
Une solution possible est de forcer la langue du système :

locale.setlocale(locale.LC_ALL, '')

Mais ça risque de pas être exact ou ne fonctionnera pas dans certains cas, comme par exemple un module packagé à l'aide au module Esky et py2app sur macOS. Je ne saurais pas dire pourquoi exactement, le bug est un peu « sioux ».

Voici d'autres alternatives précises, dans le sens où l'on récupère bien ce que l'utilisateur a configuré et non la langue par défaut du système d'exploitation.


GNU/Linux

La seule alternative sans modifier de variable d'environnement :

def current_locale() -> str:
    locale_, encoding = locale.getdefaultlocale()
    if not locale_:
        locale.setlocale(locale.LC_ALL, '')
        locale_, encoding = locale.getdefaultlocale()
    try:
        return '.'.join([locale_, encoding])
    except TypeError:
        return ''

macOS

La bibliothèque NSLocale permet de connaître la langue configurée par l'utilisateur. 2 façons de faire, 1 simple mais coûteuse en ressources à cause de l'installation du module pyobjc, et l'autre carrément plus légère au prix de quelques lignes de code supplémentaires.

Si vous disposez du module pyobjc :

from Foundation import NSLocale

def current_locale() -> str:
    lc_code = NSLocale.currentLocale()
    locale_ = NSLocale.localeIdentifier(lc_code)
    return locale_ + '.UTF-8'

Solution alternative, sans module tierce : Je n'ai pas encore trouvé comment faire à l'aide de ctypes, si tu as une idée, je suis preneur.

import ctypes

def current_locale() -> str:
    pass

Windows

Aucun module tierce non plus, on utilise GetUserDefaultUILanguage :

import ctypes

def current_locale() -> str:
    lc_code = ctypes.windll.kernel32.GetUserDefaultUILanguage()
    locale_ = locale.windows_locale[lc_code]
    _, encoding = locale.getdefaultlocale()
    return '.'.join([locale_, encoding])