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])