1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Пара вопросов по компонентам и ини файлам

Тема в разделе "Inno Setup", создана пользователем 0040, 23 май 2018.

  1. Новичок

    Регистрация:
    17 сен 2017
    Сообщения:
    12
    Симпатии:
    3
    Здравствуйте. Подскажите пожалуйста
    Хочу реализовать смену языка игры посредством изменения значения в имеющимся ини-файле.

    почитал справку, темы на форуме и сделал следующее, но это не совсем то что надо. В этом примере трется все содержимое ИНИ файла, и создается секция, параметр и значение.
    Код (Text):

      begin
        if IsComponentSelected('text\ru') then
          SetIniString('Settings', 'language', 'russian', ExpandConstant('{app}\steam_emu.ini'))
    else
          SetIniString('Settings', 'language', 'english', ExpandConstant('{app}\steam_emu.ini'));
      end;
     
    Подскажите как найти и изменить значение, без перезаписи всего содержимого ини файла?



    И еще один вопросик
    Имеется компонент лист
    Код (Text):
    [Components]
    ; Язык текста
    Name: "text"; Description: "{code:FetchPhrase|Comp0}"; Types: full; Flags: fixed
    Name: "text\ru"; Description: "{code:FetchPhrase|Comp1}"; Flags: exclusive
    Name: "text\en"; Description: "{code:FetchPhrase|Comp2}"; Flags: exclusive
    ; Язык озвучки
    Name: "voice"; Description: "{code:FetchPhrase|Comp3}"; Types: full; Flags: fixed
    Name: "voice\ru"; Description: "{code:FetchPhrase|Comp4}"; Flags: exclusive
    Name: "voice\en"; Description: "{code:FetchPhrase|Comp5}"; Flags: exclusive
     
    в инсталляторе свободный выбор сочетания (енг текст + ру звук а это как бы глупо))). Как сделать так, чтоб при выборе английского текста озвучка становилась английской, а русская становилась неактивной (чтоб нельзя было ее выбрать) .

    Заранее благодарен
     
  2. Пользователь

    Регистрация:
    17 сен 2016
    Сообщения:
    54
    Симпатии:
    3
    [Ini]
    FileName: "{app}\steam_api.ini"; Section: "Settings"; Key: "Language"; String: "french"; Components: text\rus ;
    FileName: "{app}\steam_api.ini"; Section: "Settings"; Key: "Language"; String: "english"; Components: text\eng ;
    вот так чтобы не перезаписывать файл а редактировать то что нужно (разберешься)
    [Components]
    Name: text; Description: {cm:languageSetting}; Types: full; Flags: Fixed
    Name: text\rus; Description: {cm:compRU}; Flags: exclusive;
    Name: text\eng; Description: {cm:compEN}; Flags: exclusive;
     
  3. Новичок

    Регистрация:
    17 сен 2017
    Сообщения:
    12
    Симпатии:
    3
    не работает ни то ни другое
     
  4. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.143
    Симпатии:
    732
    а я для borderlands 2 так сделал, получилось прикольно :D
    я не пользуюсь секцией ini.
    Код (Inno):
    procedure RePlaceTextinFile(FilePath:string; find:string; replace1, replace2:string);
    var
      S: TStringList;
      i : Integer;
    begin
    if FileExists(FilePath) then begin
      S:=tstringlist.create;
      S.LoadFromFile(FilePath);
    for i := 0 to S.Count-1 do
    begin
    if S.Names[i]=find then
    begin
      S.Delete(i);
      S.Insert(i,replace1+'='+replace2);
    end;
    end;
      S.SaveToFile(FilePath);
    end;
    end;
     
    пример
    if not Russian then
    RePlaceTextinFile(ExpandConstant('{app}\Binaries\Win32\steam_api.ini'),'Language','Language','english');
    Код (Inno):
    [Setup]
    AppName=Example
    AppVerName=Example
    DefaultDirName={pf}\Example
    DefaultGroupName=Example
    OutputDir=.

    [Types]
    Name: full; Description: Full installation; Flags: iscustom

    [Components]
    Name: text; Description: Язык субтитров; Types: full; Flags: fixed
    Name: text\rus; Description: Русский; Flags: exclusive;
    Name: text\eng; Description: Английский; Flags: exclusive;
    Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
    Name: voice\rus; Description: Русский; Flags: exclusive;
    Name: voice\eng; Description: Английский; Flags: exclusive;

    [Languages]
    Name: russian; MessagesFile: compiler:Languages\Russian.isl

    [Code]
    var
      OldEvent_ComponentsListClickCheck: TNotifyEvent;

    procedure ComponentsListClickCheck(Sender: TObject);
    begin
      OldEvent_ComponentsListClickCheck(Sender);
    if TNewCheckListBox(Sender).Checked[2] then // Язык субтитров / Английский
      TNewCheckListBox(Sender).Checked[5]:= True; // Язык озвучки / Английский
    end;

    procedure InitializeWizard;
    begin
    with WizardForm.ComponentsList do begin
      OldEvent_ComponentsListClickCheck:=OnClickCheck;
      OnClickCheck:=@ComponentsListClickCheck;
    end;
    end;
     
     
  5. Ветеран Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    360
    Симпатии:
    388
    Пол:
    Мужской
    0040, на счет INI можно еще так:

    Код (Inno):
    [Setup]
    AppName=My Application
    AppVersion=1.5
    DefaultDirName={sd}\My Application

    [Files]
    Source: "MyIni.ini"; DestDir: "{app}";

    [Components]
    Name: "text"; Description: "Язык Озвучки"; Types: full;
    Name: "text\ru"; Description: "Русский"; Flags: exclusive
    Name: "text\en"; Description: "Английский"; Flags: exclusive

    [Code]
    procedure ChangeINIString(INIFile, Section, Key, Value: PAnsiChar);
    begin
    if not IsIniSectionEmpty(Section, ExpandConstant('{app}\'+INIFile)) then begin
      if IniKeyExists(Section, Key, ExpandConstant('{app}\'+INIFile)) then DeleteIniEntry(Section, Key, ExpandConstant('{app}\'+INIFile));
      SetIniString(Section, Key, Value, ExpandConstant('{app}\'+INIFile));
     end else SetIniString(Section, Key, Value, ExpandConstant('{app}\'+INIFile));
    end;

    procedure CurStepChanged(CurStep: TSetupStep);
    begin
      if CurStep = ssDone then
        if IsComponentSelected('text\ru') then ChangeINIString('MyIni.ini', 'Settings', 'Language', 'Russian')
        else ChangeINIString('MyIni.ini', 'Settings', 'Language', 'English');
    end;

    А на счет второго вопроса, ИМХО зачем создавать столько компонентов не дав пользователю выбора, проще слить в два (Русский Звук + Русский Текст) и (Английский звук + Английский Текст). ИМХО конечно же...
     
  6. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.143
    Симпатии:
    732
    а так выглядит понятнее
     
  7. Новичок

    Регистрация:
    17 сен 2017
    Сообщения:
    12
    Симпатии:
    3
    Nemko,
    положил свой ини файл (в нем прописано Language=english). выбираю РУ, ставлю. В результате в ини файле все так же Language=english
     
  8. Ветеран Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    360
    Симпатии:
    388
    Пол:
    Мужской
    0040, изменения происходят в каталоге {app} после установки, у меня все работает вроде.
     
  9. Новичок

    Регистрация:
    17 сен 2017
    Сообщения:
    12
    Симпатии:
    3
    а у меня почему то нет, ну да ладно.
    вариант с ини файлом от sergey3695 мне прекрасно подходит
     
  10. Новичок

    Регистрация:
    17 сен 2017
    Сообщения:
    12
    Симпатии:
    3
    спасибо большое.
    если не указать
    [files]
    Source: "steam_api.ini"; DestDir: "{app}";
    и не положить ини рядом с сетапом, то после установки ини файла в арр нет

    как можно сделать чтоб ини брался из распакованного архива, а не из сетапа?
     
  11. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.143
    Симпатии:
    732
    запаковать ini в архив? :dance:
     

Поделиться этой страницей