master ohmu/fastfetch-openbsd / src / detection / locale / locale_windows.c
ohmu  ·  2026-10-15
 1#include "detection/locale/locale.h"
 2#include "common/debug.h"
 3#include "common/windows/unicode.h"
 4
 5#include <winnls.h>
 6
 7const char* ffDetectLocale(FFstrbuf* result) {
 8    ffStrbufAppendS(result, getenv("LC_ALL"));
 9    if (result->length > 0) {
10        return nullptr;
11    }
12
13    ffStrbufAppendS(result, getenv("LANG")); // Available in MSYS2 and Cygwin
14    if (result->length > 0) {
15        return nullptr;
16    }
17
18    wchar_t name[LOCALE_NAME_MAX_LENGTH];
19    int size = GetUserDefaultLocaleName(name, LOCALE_NAME_MAX_LENGTH);
20    if (size <= 1) { // including '\0'
21        FF_DEBUG("GetUserDefaultLocaleName() failed");
22        return "GetUserDefaultLocaleName() failed";
23    }
24    ffStrbufAppendNWS(result, (uint32_t) size - 1, name);
25    if (result->length > 2 && result->chars[2] == '-') { // Windows uses '-' instead of '_'
26        result->chars[2] = '_';
27    }
28
29    uint32_t codePage = instance.state.platform.initCP;
30    if (__builtin_expect(codePage != 0, true)) {
31        ffStrbufAppendC(result, '.');
32
33        switch (codePage) {
34            case CP_UTF8:
35                ffStrbufAppendS(result, "UTF-8");
36                break;
37            case CP_UTF7:
38                ffStrbufAppendS(result, "UTF-7");
39                break;
40            case 1200:
41                ffStrbufAppendS(result, "UTF-16LE");
42                break;
43            case 1201:
44                ffStrbufAppendS(result, "UTF-16BE");
45                break;
46            case 936:
47                ffStrbufAppendS(result, "GBK");
48                break;
49            case 54936:
50                ffStrbufAppendS(result, "GB18030");
51                break;
52            case 950:
53                ffStrbufAppendS(result, "BIG5");
54                break;
55            case 932:
56                ffStrbufAppendS(result, "Shift_JIS");
57                break;
58            case 949:
59                ffStrbufAppendS(result, "EUC-KR");
60                break;
61            case 20932:
62                ffStrbufAppendS(result, "EUC-JP");
63                break;
64
65            case 20866:
66                ffStrbufAppendS(result, "KOI8-R");
67                break;
68            case 21866:
69                ffStrbufAppendS(result, "KOI8-U");
70                break;
71            case 20127:
72                ffStrbufAppendS(result, "US-ASCII");
73                break;
74
75            case 874:
76            case 1250 ... 1258:
77                ffStrbufAppendS(result, "Windows-");
78                ffStrbufAppendUInt(result, codePage);
79                break;
80
81            default:
82                ffStrbufAppendS(result, "CP");
83                ffStrbufAppendUInt(result, codePage);
84                break;
85        }
86    }
87
88    return nullptr;
89}