1 | // This is an open source non-commercial project. Dear PVS-Studio, please check |
2 | // it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com |
3 | |
4 | #ifdef __APPLE__ |
5 | # define Boolean CFBoolean // Avoid conflict with API's Boolean |
6 | # include <CoreFoundation/CFLocale.h> |
7 | # include <CoreFoundation/CFString.h> |
8 | # undef Boolean |
9 | #endif |
10 | |
11 | #ifdef HAVE_LOCALE_H |
12 | # include <locale.h> |
13 | #endif |
14 | #include "nvim/os/lang.h" |
15 | #include "nvim/os/os.h" |
16 | |
17 | void lang_init(void) |
18 | { |
19 | #ifdef __APPLE__ |
20 | if (os_getenv("LANG" ) == NULL) { |
21 | const char *lang_region = NULL; |
22 | CFTypeRef cf_lang_region = NULL; |
23 | |
24 | CFLocaleRef cf_locale = CFLocaleCopyCurrent(); |
25 | if (cf_locale) { |
26 | cf_lang_region = CFLocaleGetValue(cf_locale, kCFLocaleIdentifier); |
27 | CFRetain(cf_lang_region); |
28 | lang_region = CFStringGetCStringPtr(cf_lang_region, |
29 | kCFStringEncodingUTF8); |
30 | CFRelease(cf_locale); |
31 | } else { |
32 | // Use the primary language defined in Preferences -> Language & Region |
33 | CFArrayRef cf_langs = CFLocaleCopyPreferredLanguages(); |
34 | if (cf_langs && CFArrayGetCount(cf_langs) > 0) { |
35 | cf_lang_region = CFArrayGetValueAtIndex(cf_langs, 0); |
36 | CFRetain(cf_lang_region); |
37 | CFRelease(cf_langs); |
38 | lang_region = CFStringGetCStringPtr(cf_lang_region, |
39 | kCFStringEncodingUTF8); |
40 | } else { |
41 | ELOG("$LANG is empty and your primary language cannot be inferred." ); |
42 | return; |
43 | } |
44 | } |
45 | |
46 | if (lang_region) { |
47 | os_setenv("LANG" , lang_region, true); |
48 | } else { |
49 | char buf[20] = { 0 }; |
50 | if (CFStringGetCString(cf_lang_region, buf, 20, |
51 | kCFStringEncodingUTF8)) { |
52 | os_setenv("LANG" , buf, true); |
53 | } |
54 | } |
55 | CFRelease(cf_lang_region); |
56 | # ifdef HAVE_LOCALE_H |
57 | setlocale(LC_ALL, "" ); |
58 | |
59 | # ifdef LC_NUMERIC |
60 | // Make sure strtod() uses a decimal point, not a comma. |
61 | setlocale(LC_NUMERIC, "C" ); |
62 | # endif |
63 | # endif |
64 | } |
65 | #endif |
66 | } |
67 | |