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
17void 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