Locale: try detecting with locale command

in case $LC_* envs are not set ( macOS )
This commit is contained in:
李通洲
2022-09-21 16:03:51 +08:00
parent 65ed48a1bc
commit f9fa482b83
3 changed files with 38 additions and 4 deletions
+5 -3
View File
@@ -6,16 +6,16 @@
#include <unistd.h>
#include <sys/wait.h>
void ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[])
const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[])
{
int pipes[2];
if(pipe(pipes) == -1)
return;
return "pipe() failed";
pid_t childPid = fork();
if(childPid == -1)
return;
return "fork() failed";
//Child
if(childPid == 0)
@@ -33,4 +33,6 @@ void ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[])
waitpid(childPid, NULL, 0);
ffAppendFDBuffer(pipes[0], buffer);
close(pipes[0]);
return NULL;
}
+1 -1
View File
@@ -5,6 +5,6 @@
#include "util/FFstrbuf.h"
void ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[]);
const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[]);
#endif
+32
View File
@@ -2,6 +2,8 @@
#include "common/properties.h"
#include "common/printing.h"
#include "common/caching.h"
#include "common/processing.h"
#include "common/parsing.h"
#include <stdlib.h>
@@ -21,6 +23,31 @@ static void getLocaleFromEnv(FFstrbuf* locale)
ffStrbufAppendS(locale, getenv("LC_MESSAGES"));
}
static void getLocaleFromCmd(FFstrbuf* locale)
{
FFstrbuf buffer;
ffStrbufInitA(&buffer, 0);
char* args[] = { "locale", NULL };
if(ffProcessAppendStdOut(&buffer, args) == NULL)
{
ffParsePropLines(buffer.chars, "LANG=\"", locale);
ffStrbufTrimRight(locale, '"');
if(locale->length == 0)
{
ffParsePropLines(buffer.chars, "LC_ALL=\"", locale);
ffStrbufTrimRight(locale, '"');
if(locale->length == 0)
{
ffParsePropLines(buffer.chars, "LC_MESSAGES=\"", locale);
ffStrbufTrimRight(locale, '"');
}
}
}
ffStrbufDestroy(&buffer);
}
void ffPrintLocale(FFinstance* instance)
{
if(ffPrintFromCache(instance, FF_LOCALE_MODULE_NAME, &instance->config.locale, FF_LOCALE_NUM_FORMAT_ARGS))
@@ -44,6 +71,11 @@ void ffPrintLocale(FFinstance* instance)
getLocaleFromEnv(&locale);
}
if(locale.length == 0)
{
getLocaleFromCmd(&locale);
}
if(locale.length == 0)
{
ffPrintError(instance, FF_LOCALE_MODULE_NAME, 0, &instance->config.locale, "No locale found");