diff options
author | Marco Hinz <mh.codebro+github@gmail.com> | 2018-12-11 21:58:35 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2018-12-11 21:58:35 +0100 |
commit | 57acfceabeb349377ce244de9b67732b21ed1d18 (patch) | |
tree | a0eabb5eec7e016d4e1090f64c678bef74e8f230 /src | |
parent | 5a90761e8a6365156e10be7ad5825c8f7f2f2dfb (diff) | |
download | rneovim-57acfceabeb349377ce244de9b67732b21ed1d18.tar.gz rneovim-57acfceabeb349377ce244de9b67732b21ed1d18.tar.bz2 rneovim-57acfceabeb349377ce244de9b67732b21ed1d18.zip |
macOS: infer primary language if $LANG is empty #9345
The macOS preferences have a section called `Language & Region`. There is always
at least one language defined, the primary language.
CFLocaleCopyPreferredLanguages() returns the languages defined in that section,
the first element being the primary language.
Use the primary language in case CFLocaleCopyCurrent() returns NULL.
In the case that the above fallback does not work either, which is very
unlikely, log the error and continue with an empty $LANG.
References #9134
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/os/lang.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/nvim/os/lang.c b/src/nvim/os/lang.c index 6b2a54ddbe..900cd1f53a 100644 --- a/src/nvim/os/lang.c +++ b/src/nvim/os/lang.c @@ -17,14 +17,31 @@ void lang_init(void) { #ifdef __APPLE__ if (os_getenv("LANG") == NULL) { + const char *lang_region = NULL; + CFTypeRef cf_lang_region = NULL; + CFLocaleRef cf_locale = CFLocaleCopyCurrent(); - CFTypeRef cf_lang_region = CFLocaleGetValue(cf_locale, - kCFLocaleIdentifier); - CFRetain(cf_lang_region); - CFRelease(cf_locale); + if (cf_locale) { + cf_lang_region = CFLocaleGetValue(cf_locale, kCFLocaleIdentifier); + CFRetain(cf_lang_region); + lang_region = CFStringGetCStringPtr(cf_lang_region, + kCFStringEncodingUTF8); + CFRelease(cf_locale); + } else { + // Use the primary language defined in Preferences -> Language & Region + CFArrayRef cf_langs = CFLocaleCopyPreferredLanguages(); + if (cf_langs && CFArrayGetCount(cf_langs) > 0) { + cf_lang_region = CFArrayGetValueAtIndex(cf_langs, 0); + CFRetain(cf_lang_region); + CFRelease(cf_langs); + lang_region = CFStringGetCStringPtr(cf_lang_region, + kCFStringEncodingUTF8); + } else { + ELOG("$LANG is empty and your primary language cannot be inferred."); + return; + } + } - const char *lang_region = CFStringGetCStringPtr(cf_lang_region, - kCFStringEncodingUTF8); if (lang_region) { os_setenv("LANG", lang_region, true); } else { |