LazUtils, Translations: simplified getting user language value in macOS (don't use setenv function, just use obtained identifier directly in GetLanguageID function), issue #40495

This commit is contained in:
Maxim Ganetsky 2023-09-11 03:29:37 +03:00
parent e2b8f45b62
commit 6ae07c2413

View File

@ -227,7 +227,7 @@ uses
{$IFDEF DARWIN} {$IFDEF DARWIN}
uses uses
MacOSAll, Unix; MacOSAll;
{$ENDIF} {$ENDIF}
function IsKey(Txt, Key: PChar): boolean; function IsKey(Txt, Key: PChar): boolean;
@ -540,6 +540,10 @@ function GetLanguageID: TLanguageID;
procedure GetLanguage; procedure GetLanguage;
var var
EnvVarContents: string; EnvVarContents: string;
{$IFDEF DARWIN}
cfLang: CFPropertyListRef;
lang: array[0..49] of char;
{$ENDIF}
begin begin
EnvVarContents := GetEnvironmentVariable('LC_ALL'); EnvVarContents := GetEnvironmentVariable('LC_ALL');
if Length(EnvVarContents) = 0 then if Length(EnvVarContents) = 0 then
@ -548,6 +552,21 @@ function GetLanguageID: TLanguageID;
if Length(EnvVarContents) = 0 then if Length(EnvVarContents) = 0 then
EnvVarContents := GetEnvironmentVariable('LANG'); EnvVarContents := GetEnvironmentVariable('LANG');
end; end;
{$IFDEF DARWIN}
// macOS does not set environment variables for GUI applications which are not started from terminal.
// Obtain language identifier in a different (but independent on settings in Application Bundle) way.
// AppleLocale property is expected to contain values in ISO formats, like `ru_RU`, `zh_CN`, `it_IT`.
if Length(EnvVarContents) = 0 then
begin
cfLang:= CFPreferencesCopyAppValue( CFSTR('AppleLocale'), CFSTR('') );
if Assigned(cfLang) then
begin
CFStringGetCString( cfLang, lang, SizeOf(lang), kCFStringEncodingUTF8 );
EnvVarContents := lang;
CFRelease( cfLang );
end;
end;
{$ENDIF}
// Even empty EnvVarContents is processed in order to return normalized ID // Even empty EnvVarContents is processed in order to return normalized ID
Result := GetLanguageIDFromLocaleName(EnvVarContents); Result := GetLanguageIDFromLocaleName(EnvVarContents);
end; end;
@ -1912,25 +1931,5 @@ begin
end; end;
end; end;
{$IFDEF DARWIN}
function setenv(const name:PAnsiChar; const value:PAnsiChar; overwrite:cint): cint; cdecl; external clib;
procedure FIX_MACOS_LANG_ENV_VAR;
var
cfLang: CFPropertyListRef;
lang: array[0..49] of char;
begin
cfLang:= CFPreferencesCopyAppValue( CFSTR('AppleLocale'), CFSTR('') );
if not Assigned(cfLang) then
exit;
CFStringGetCString( cfLang, lang, SizeOf(lang), kCFStringEncodingUTF8 );
setenv( 'LANG', lang, 0 );
CFRelease( cfLang );
end;
initialization
FIX_MACOS_LANG_ENV_VAR;
{$ENDIF}
end. end.