Handle LANG on macOS differently (bug#65908)
* src/nsterm.m (ns_init_locale): If LANG is set, try to use that, otherwise try to deduce what LANG should be. Check is the result is valid, and use LANG="en_US.UTF-8" if not.
This commit is contained in:
parent
6cf7e676e9
commit
aad8b5d78f
1 changed files with 22 additions and 19 deletions
41
src/nsterm.m
41
src/nsterm.m
|
@ -554,29 +554,32 @@ - (unsigned long)unsignedLong
|
|||
/* macOS doesn't set any environment variables for the locale when run
|
||||
from the GUI. Get the locale from the OS and set LANG. */
|
||||
{
|
||||
NSLocale *locale = [NSLocale currentLocale];
|
||||
|
||||
NSTRACE ("ns_init_locale");
|
||||
|
||||
/* If we were run from a terminal then assume an unset LANG variable
|
||||
is intentional and don't try to "fix" it. */
|
||||
if (!isatty (STDIN_FILENO))
|
||||
/* Either use LANG, if set, or try to construct LANG from
|
||||
NSLocale. */
|
||||
const char *lang = getenv ("LANG");
|
||||
if (lang == NULL || *lang == 0)
|
||||
{
|
||||
char *oldLocale = setlocale (LC_ALL, NULL);
|
||||
/* It seems macOS should probably use UTF-8 everywhere.
|
||||
'localeIdentifier' does not specify the encoding, and I can't
|
||||
find any way to get the OS to tell us which encoding to use,
|
||||
so hard-code '.UTF-8'. */
|
||||
NSString *localeID = [NSString stringWithFormat:@"%@.UTF-8",
|
||||
[locale localeIdentifier]];
|
||||
|
||||
/* Check the locale ID is valid and if so set LANG, but not if
|
||||
it is already set. */
|
||||
if (setlocale (LC_ALL, [localeID UTF8String]))
|
||||
setenv("LANG", [localeID UTF8String], 0);
|
||||
|
||||
setlocale (LC_ALL, oldLocale);
|
||||
const NSLocale *locale = [NSLocale currentLocale];
|
||||
const NSString *localeID = [NSString stringWithFormat:@"%@.UTF-8",
|
||||
[locale localeIdentifier]];
|
||||
lang = [localeID UTF8String];
|
||||
}
|
||||
|
||||
/* Check if LANG can be used for initializing the locale. If not,
|
||||
use a default setting. Note that Emacs' main will undo the
|
||||
setlocale below, initializing the locale from the
|
||||
environment. */
|
||||
if (setlocale (LC_ALL, lang) == NULL)
|
||||
{
|
||||
const char *const default_lang = "en_US.UTF-8";
|
||||
fprintf (stderr, "LANG=%s cannot be used, using %s instead.\n",
|
||||
lang, default_lang);
|
||||
lang = default_lang;
|
||||
}
|
||||
|
||||
setenv ("LANG", lang, 1);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue