Migrate to modern win32/winrt API for `localemodule`
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Feature or enhancement
Proposal:
AFAIK, CPython has dropped support for Windows 7 since 3.9.0, while _localemodule.c contains compatibility fix for Windows NT pre-4.0. Which flag was introduced since Windows 98.
Here I listed some modern way to get locale name in BCP-47 / RFC 1766 format, is it possible to replace the legacy hex code mapping?
- GlobalizationPreferences since Windows 10 (build 10240)
- GetUserDefaultLocaleName since Windows Vista / Windows Server 2008
import ctypes
from ctypes import wintypes
from locale import getdefaultlocale, getlocale, LC_CTYPE
import warnings
# Introduced since Windows 10, BCP-47
# depends on:
# - winrt-windows-system-userprofile
# - winrt-windows-foundation
# - winrt-windows-foundation-collections
from winrt.windows.system.userprofile import GlobalizationPreferences
warnings.filterwarnings("ignore", category=DeprecationWarning)
# Load kernel32.dll
kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
# Introduced since Windows Vista, RFC 1766
# Define GetUserDefaultLocaleName signature
# int GetUserDefaultLocaleName(LPWSTR lpLocaleName, int cchLocaleName);
kernel32.GetUserDefaultLocaleName.argtypes = [wintypes.LPWSTR, ctypes.c_int]
kernel32.GetUserDefaultLocaleName.restype = ctypes.c_int
# Allocate buffer for locale name
LOCALE_NAME_MAX_LENGTH = 85 # per Windows docs
def user_default_locale() -> str:
"""
Get user default locale encoded in BCP-47.
"""
buffer = ctypes.create_unicode_buffer(LOCALE_NAME_MAX_LENGTH)
# Call the function
result = kernel32.GetUserDefaultLocaleName(buffer, LOCALE_NAME_MAX_LENGTH)
if result == 0:
# Call failed
error_code = ctypes.get_last_error()
raise ctypes.WinError(error_code)
return buffer.value
def bcp47():
return GlobalizationPreferences.languages[0]
>>> getdefaultlocale()
('zh_CN', 'cp936')
>>> getlocale(LC_CTYPE)
('Chinese (Simplified)_China', '936')
>>> user_default_locale()
'zh-CN'
>>> bcp47()
'zh-Hans-CN'
Has this already been discussed elsewhere?
Yes
Links to previous discussion of this feature:
gh-90817 gh-130796 https://github.com/python/cpython/issues/123853#issuecomment-3132027944
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit Modules/_localemodule.c, insbesondere mit der Kompatibilitätszuordnung für Windows NT pre-4.0. Sieh dir die verknüpften Diskussionen in gh-90817, gh-130796 und issue 123853 an und vergleiche anschließend GetUserDefaultLocaleName mit GlobalizationPreferences. Die Arbeit ist erst abgeschlossen, wenn sich das Projekt auf eine moderne API geeinigt hat und die Zuordnung der alten Hex-Codes konsistent ersetzt wurde.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- c, python
- Bereich
- internationalization, operating-systems
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 25/100