Как использовать константы из языкового файла

L-e-o-N

Старожил
Возможно использовать константы, определённые в файле compiler:default.isl или нужно все константы определять в CustomMessage?
Пробовал так, но не работает:
{cm:WizardSelectComponents}
 

sergey3695

Ветеран
Модератор
@L-e-o-N,
code_language.pascal:
[Components]
Name: text; Description: {code:Descriptiontext1}; Types: full; Flags: fixed

[Code]
function Descriptiontext1(Param: string): string;
begin
  result:= SetupMessage(msgWizardSelectComponents);
end;
 

Crachlow

Старожил
Кто может подсказать как с помощью GetUILanguage и ActiveLanguage заставить инсталлятор, для русскоязычной группы как Беларусь, Украина, Казахстан и т.д., без запроса "Выберите язык установки", автоматом делать язык инсталлятора русским, для всех других Location английский?
 

vint56

Ветеран
Проверенный
function InitializeSetup: Boolean;
begin
if GetUILanguage = $0409 then
SuppressibleMsgBox('English', mbInformation, MB_OK, MB_OK);
if GetUILanguage = $0419 then
SuppressibleMsgBox('Русский', mbInformation, MB_OK, MB_OK);
Result := True;
end;
 

Crachlow

Старожил
Это понятно Это то, да не то. if GetUILanguage = $0419, if GetUILanguage = $0423 и т.д. then то применить Russian.isl ко всей форме
 

SBalykov

Старожил
Код:
[Setup]
AppName               =My appName
DefaultDirName        ={pf}\My appName
ShowLanguageDialog    =no
UsePreviousLanguage   =no
VersionInfoVersion    =1.0.0.0

[Languages]
// Подключение файлов языков установки
//=============================================================
Name: eng; MessagesFile: compiler:Languages\English.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[code_]

function InitializeSetup: Boolean;
begin
// Язык системы 
//=============================================================
if GetUILanguage = $0419 or GetUILanguage = $0422 or GetUILanguage = $0423 then
 ActiveLanguage = 'rus' else
 ActiveLanguage = 'eng';
  Result:= True;
end;
 

vint56

Ветеран
Проверенный
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Files]
Source: "compiler:Languages\Russian.isl"; DestDir: {tmp}; Flags: dontcopy;
Source: "compiler:Languages\English.isl"; DestDir: {tmp}; Flags: dontcopy

Код:
type
LCID = LongInt;

var
LangFile: String;

function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';
function InitializeSetup:boolean;
var
  lngF : String;
begin
  if GetSystemDefaultLCID = 1049 then
    lngF := 'Russian.isl'
   else
    lngF := 'English.isl';

  LangFile:= ExpandConstant('{tmp}\'+lngF);
  if not FileExists(LangFile) then ExtractTemporaryFile(lngF);
  Result:=True;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile); // и так для каждого статика и лейбела инсталла
    WelcomeLabel2.Caption:= GetIniString('Messages', 'WelcomeLabel2', '', LangFile); // и так для каждого статика и лейбела инсталла
  end;
end;
[/SPOILER]
 

Crachlow

Старожил
На ActiveLanguage = 'rus' выдает внутренняя ошибка. А вообще какое стоковое значение возвращает ActiveLanguage?
 

L-e-o-N

Старожил
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

[Files]
Source: "compiler:Languages\Russian.isl"; DestDir: {tmp}; Flags: dontcopy;
Source: "compiler:Languages\English.isl"; DestDir: {tmp}; Flags: dontcopy

Код:
type
LCID = LongInt;

var
LangFile: String;

function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';
function InitializeSetup:boolean;
var
  lngF : String;
begin
  if GetSystemDefaultLCID = 1049 then
    lngF := 'Russian.isl'
   else
    lngF := 'English.isl';

  LangFile:= ExpandConstant('{tmp}\'+lngF);
  if not FileExists(LangFile) then ExtractTemporaryFile(lngF);
  Result:=True;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile); // и так для каждого статика и лейбела инсталла
    WelcomeLabel2.Caption:= GetIniString('Messages', 'WelcomeLabel2', '', LangFile); // и так для каждого статика и лейбела инсталла
  end;
end;
[/SPOILER]
Данный пример имеет один недостаток - каждый раз приходится вызывать GetIniString и передавать множество параметров. Улучшить его можно так:
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.
[Files]
Source: "compiler:Languages\Russian.isl"; DestDir: {tmp}; Flags: dontcopy;
Source: "compiler:Languages\English.isl; DestDir: {tmp}; Flags: dontcopy
[code]
type
LCID = LongInt;
var
LangFile: String;
function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';
function GetMessage(Param: string): string;
begin
  result:= GetIniString('Messages', Param, '', LangFile);
end;
function InitializeSetup:boolean;
var
  lngF : String;
begin
  if GetSystemDefaultLCID = 1049 then
    lngF := 'Russian.isl'
   else
    lngF := 'English.isl';
  LangFile:= ExpandConstant('{tmp}\'+lngF);
  if not FileExists(LangFile) then ExtractTemporaryFile(lngF);
  Result:=True;
end;
procedure InitializeWizard();
begin
  with WizardForm do
  begin
    WelcomeLabel1.Caption:= GetMessage('WelcomeLabel1'); // и так для каждого статика и лейбела инсталла
    WelcomeLabel2.Caption:= ExpandConstant('{code:GetMessage|WelcomeLabel2}'); // или так
  end;
end;
 

Crachlow

Старожил
А нельзя как то так:
[Languages]
Name: eng; MessagesFile: compiler:Languages\English.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: ukr; MessagesFile: compiler:Languages\Russian.isl
........................
repeat
case ActiveLanguage of
'ukr': ChangeLanguage('Russian');
'eng': ChangeLanguage('English');
'rus': ChangeLanguage('Russian');
end;
 

Crachlow

Старожил
А нельзя передать значение lngF в InitializeLanguageDialog() без показа самого окна?
 

Crachlow

Старожил
А нельзя как то так:
[Languages]
Name: eng; MessagesFile: compiler:Languages\English.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: ukr; MessagesFile: compiler:Languages\Russian.isl
........................
repeat
case ActiveLanguage of
'ukr': ChangeLanguage('Russian');
'eng': ChangeLanguage('English');
'rus': ChangeLanguage('Russian');
end;
Это не работает
 

Crachlow

Старожил
Код:
[Setup]
AppName               =My appName
DefaultDirName        ={pf}\My appName
ShowLanguageDialog    =no
UsePreviousLanguage   =no
VersionInfoVersion    =1.0.0.0

[Languages]
// Подключение файлов языков установки
//=============================================================
Name: eng; MessagesFile: compiler:Languages\English.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[code_]

function InitializeSetup: Boolean;
begin
// Язык системы
//=============================================================
if GetUILanguage = $0419 or GetUILanguage = $0422 or GetUILanguage = $0423 then
ActiveLanguage = 'rus' else
ActiveLanguage = 'eng';
  Result:= True;
end;
Это тоже не работает.
 

Crachlow

Старожил
Привет L-e-o-n. Давно тебя не слышал. А как на счет если переделать ru.isl и en.isl в .iss CustomMessages туда же поместить и подключить как модули из [Code}
 

L-e-o-N

Старожил
А нельзя передать значение lngF в InitializeLanguageDialog() без показа самого окна?
Возможно через WinApi симулировать выбор языка и нажатие кнопки OK, но это очень муторно. Если сделать всё достаточно быстро, то пользователь ничего не заметит (или его можно вообще сделать невидимым).
Для этого нужно создать второй поток, который найдёт окно выбора языка через функцию FindWindow, а затем, через необходимые функции сам установит нужный язык и нажмёт кнопку ОК.
 
Сверху