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}