macOS: Set LANG to en_US if cocoa reports language as en_* that is not a valid locale
Fixes #3899
This commit is contained in:
parent
276a82d1f7
commit
9e7253c179
@ -22,6 +22,11 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
|
|||||||
event which breaks some applications that grab the mouse but cant handle
|
event which breaks some applications that grab the mouse but cant handle
|
||||||
mouse events (:iss:`3902`)
|
mouse events (:iss:`3902`)
|
||||||
|
|
||||||
|
- macOS: When the language is set to English and the country to one for which
|
||||||
|
an English locale does not exist, set :envvar:`LANG` to ``en_US.UTF-8``
|
||||||
|
(:iss:`3899`)
|
||||||
|
|
||||||
|
|
||||||
0.22.2 [2021-08-02]
|
0.22.2 [2021-08-02]
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
|
|||||||
@ -66,6 +66,12 @@ Variables that influence kitty behavior
|
|||||||
|
|
||||||
Variables that kitty sets when running child programs
|
Variables that kitty sets when running child programs
|
||||||
|
|
||||||
|
.. envvar:: LANG
|
||||||
|
|
||||||
|
This is set only on macOS, and only if the country and language from the
|
||||||
|
macOS user settings form a valid locale.
|
||||||
|
|
||||||
|
|
||||||
.. envvar:: KITTY_WINDOW_ID
|
.. envvar:: KITTY_WINDOW_ID
|
||||||
|
|
||||||
An integer that is the id for the kitty :term:`window` the program is running in.
|
An integer that is the id for the kitty :term:`window` the program is running in.
|
||||||
|
|||||||
@ -574,12 +574,7 @@ cocoa_get_lang(PyObject UNUSED *self) {
|
|||||||
locale = [[NSLocale currentLocale] localeIdentifier];
|
locale = [[NSLocale currentLocale] localeIdentifier];
|
||||||
}
|
}
|
||||||
if (!locale) { Py_RETURN_NONE; }
|
if (!locale) { Py_RETURN_NONE; }
|
||||||
// Make sure the locale value is valid, that is it can be used
|
|
||||||
// to construct an actual locale
|
|
||||||
const char* locale_utf8 = [locale UTF8String];
|
const char* locale_utf8 = [locale UTF8String];
|
||||||
locale_t test_locale = newlocale(LC_ALL_MASK, locale_utf8, NULL);
|
|
||||||
if (!test_locale) { Py_RETURN_NONE; }
|
|
||||||
freelocale(test_locale);
|
|
||||||
return Py_BuildValue("s", locale_utf8);
|
return Py_BuildValue("s", locale_utf8);
|
||||||
|
|
||||||
} // autoreleasepool
|
} // autoreleasepool
|
||||||
|
|||||||
@ -23,6 +23,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <locale.h>
|
||||||
#ifdef WITH_PROFILER
|
#ifdef WITH_PROFILER
|
||||||
#include <gperftools/profiler.h>
|
#include <gperftools/profiler.h>
|
||||||
#endif
|
#endif
|
||||||
@ -156,6 +157,15 @@ wcwidth_wrap(PyObject UNUSED *self, PyObject *chr) {
|
|||||||
return PyLong_FromLong(wcwidth_std(PyLong_AsLong(chr)));
|
return PyLong_FromLong(wcwidth_std(PyLong_AsLong(chr)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject*
|
||||||
|
locale_is_valid(PyObject *self UNUSED, PyObject *args) {
|
||||||
|
char *name;
|
||||||
|
if (!PyArg_ParseTuple(args, "s", &name)) return NULL;
|
||||||
|
locale_t test_locale = newlocale(LC_ALL_MASK, name, NULL);
|
||||||
|
if (!test_locale) { Py_RETURN_FALSE; }
|
||||||
|
freelocale(test_locale);
|
||||||
|
Py_RETURN_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static PyMethodDef module_methods[] = {
|
static PyMethodDef module_methods[] = {
|
||||||
{"wcwidth", (PyCFunction)wcwidth_wrap, METH_O, ""},
|
{"wcwidth", (PyCFunction)wcwidth_wrap, METH_O, ""},
|
||||||
@ -169,6 +179,7 @@ static PyMethodDef module_methods[] = {
|
|||||||
{"parse_bytes", (PyCFunction)parse_bytes, METH_VARARGS, ""},
|
{"parse_bytes", (PyCFunction)parse_bytes, METH_VARARGS, ""},
|
||||||
{"parse_bytes_dump", (PyCFunction)parse_bytes_dump, METH_VARARGS, ""},
|
{"parse_bytes_dump", (PyCFunction)parse_bytes_dump, METH_VARARGS, ""},
|
||||||
{"redirect_std_streams", (PyCFunction)redirect_std_streams, METH_VARARGS, ""},
|
{"redirect_std_streams", (PyCFunction)redirect_std_streams, METH_VARARGS, ""},
|
||||||
|
{"locale_is_valid", (PyCFunction)locale_is_valid, METH_VARARGS, ""},
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
METHODB(user_cache_dir, METH_NOARGS),
|
METHODB(user_cache_dir, METH_NOARGS),
|
||||||
METHODB(process_group_map, METH_NOARGS),
|
METHODB(process_group_map, METH_NOARGS),
|
||||||
|
|||||||
@ -672,6 +672,10 @@ def cocoa_get_lang() -> Optional[str]:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def locale_is_valid(name: str) -> bool:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def mark_os_window_for_close(os_window_id: int, cr_type: int = 2) -> bool:
|
def mark_os_window_for_close(os_window_id: int, cr_type: int = 2) -> bool:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@ -195,10 +195,15 @@ run_app = AppRunner()
|
|||||||
def ensure_macos_locale() -> None:
|
def ensure_macos_locale() -> None:
|
||||||
# Ensure the LANG env var is set. See
|
# Ensure the LANG env var is set. See
|
||||||
# https://github.com/kovidgoyal/kitty/issues/90
|
# https://github.com/kovidgoyal/kitty/issues/90
|
||||||
from .fast_data_types import cocoa_get_lang
|
from .fast_data_types import cocoa_get_lang, locale_is_valid
|
||||||
if 'LANG' not in os.environ:
|
if 'LANG' not in os.environ:
|
||||||
lang = cocoa_get_lang()
|
lang = cocoa_get_lang()
|
||||||
if lang is not None:
|
if lang is not None:
|
||||||
|
if not locale_is_valid(lang):
|
||||||
|
if lang.startswith('en_'):
|
||||||
|
lang = 'en_US'
|
||||||
|
else:
|
||||||
|
log_error(f'Could not set LANG Cocoa returns language as: {lang}')
|
||||||
os.environ['LANG'] = lang + '.UTF-8'
|
os.environ['LANG'] = lang + '.UTF-8'
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user