aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Hinz <mh.codebro@gmail.com>2022-04-28 20:56:44 +0200
committerMarco Hinz <mh.codebro@gmail.com>2022-04-28 23:36:12 +0200
commite038625b87dda2389d004017bd2dcf2b65bc40f6 (patch)
tree55a62cbc28e0f41ceabcf25af566184a73592113
parent521e91e1c420bd5c94c35908181dbba81e58dd0f (diff)
downloadrneovim-e038625b87dda2389d004017bd2dcf2b65bc40f6.tar.gz
rneovim-e038625b87dda2389d004017bd2dcf2b65bc40f6.tar.bz2
rneovim-e038625b87dda2389d004017bd2dcf2b65bc40f6.zip
fix(mac): use same $LANG fallback mechanism as Vim
In a locale "en_US", "en" is the language and "US" is the region. Before this change, we were too clever for our own good and tried to handle the region as well. But if the macOS primary language is set to "English" and the region to "Norway", we would end up with "en_NO", which is a locale that does not exist. Now we only take the language into account. Taking the example from above would yield "en_US", which is a sensible fallback. If the region is important to you, set $LANG and the more specific LC_* variables in your shell config or alternatively use `:help :language`. References https://github.com/neovim/neovim/issues/18292
-rwxr-xr-xsrc/nvim/CMakeLists.txt4
-rw-r--r--src/nvim/os/lang.c60
2 files changed, 17 insertions, 47 deletions
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 64de2ec7e0..2cf1bda45f 100755
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -16,8 +16,8 @@ if(WIN32)
# tell MinGW compiler to enable wmain
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework CoreFoundation")
- set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -framework CoreFoundation")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework CoreServices")
+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -framework CoreServices")
endif()
set(TOUCHES_DIR ${PROJECT_BINARY_DIR}/touches)
diff --git a/src/nvim/os/lang.c b/src/nvim/os/lang.c
index b63faacaae..28f43ff3af 100644
--- a/src/nvim/os/lang.c
+++ b/src/nvim/os/lang.c
@@ -3,9 +3,10 @@
#ifdef __APPLE__
# define Boolean CFBoolean // Avoid conflict with API's Boolean
-# include <CoreFoundation/CFLocale.h>
-# include <CoreFoundation/CFString.h>
+# define FileInfo CSFileInfo // Avoid conflict with API's Fileinfo
+# include <CoreServices/CoreServices.h>
# undef Boolean
+# undef FileInfo
#endif
#include "auto/config.h"
@@ -21,55 +22,24 @@ 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();
- 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;
- }
- }
-
char buf[50] = { 0 };
- bool set_lang;
- if (lang_region) {
- set_lang = true;
- xstrlcpy(buf, lang_region, sizeof(buf));
- } else {
- set_lang = CFStringGetCString(cf_lang_region, buf, 40,
- kCFStringEncodingUTF8);
- }
- if (set_lang) {
+
+ // $LANG is not set, either because it was unset or Nvim was started
+ // from the Dock. Query the system locale.
+ if (LocaleRefGetPartString(NULL,
+ kLocaleLanguageMask | kLocaleLanguageVariantMask |
+ kLocaleRegionMask | kLocaleRegionVariantMask,
+ sizeof(buf) - 10, buf) == noErr && *buf) {
if (strcasestr(buf, "utf-8") == NULL) {
xstrlcat(buf, ".UTF-8", sizeof(buf));
}
os_setenv("LANG", buf, true);
+ setlocale(LC_ALL, "");
+ // Make sure strtod() uses a decimal point, not a comma.
+ setlocale(LC_NUMERIC, "C");
+ } else {
+ ELOG("$LANG is empty and the macOS primary language cannot be inferred.");
}
- CFRelease(cf_lang_region);
-# ifdef HAVE_LOCALE_H
- setlocale(LC_ALL, "");
-
-# ifdef LC_NUMERIC
- // Make sure strtod() uses a decimal point, not a comma.
- setlocale(LC_NUMERIC, "C");
-# endif
-# endif
}
#endif
}