Нужна помощь в смене базового языка SAS.Планеты

Форум для обсуждения деталей разработки программы SAS.Планета

Модераторы: Tolik, zed, vdemidov

Re: Нужна помощь или хотя бы подсказка.

Сообщение Parasite » 13 окт 2010, 19:56

DJ VK писал(а):какой нибудь репозиторий, который хранится в отдельном файле рядом с программой, и добавлять в него только новые метки. А потом переводить один репозиторий на нужное количество языков. А при загрузке репозитория из файла подставлять нужный файл?

+1
Think Linux? :)

PS: именно так и предлагалось изначально в сасе. Но пока что так, как получилось (выше). Все лучше, чем никак - имхо.
The only difference between me and a mad man is that I am not mad. /Salvador Dali/
Аватара пользователя
Parasite
Администратор
 
Сообщения: 4532
ICQ: 15819243
Зарегистрирован: 23 окт 2008, 17:38
Благодарил (а): 57 раз.
Поблагодарили: 214 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение DJ VK » 14 окт 2010, 09:05

поставил пакет dxgettext. Открыл пример использования на билдере. Там текстовое поле и кнопка. нажимаешь кнопку - пишет Спасибо что нажали кнопку :lol: Это ж Hello world!
Вобще нихрена не понял, а перевод то как делается? :?:

p.s. интересная особенность. Если брать откомпилированный проект и извлекать из него формы из ресурсов (restorator, res hacker), то там получается форма с текстом Caption = 'Название'
Аватара пользователя
DJ VK
Специалист
 
Сообщения: 821
Зарегистрирован: 16 апр 2009, 13:57
Благодарил (а): 51 раз.
Поблагодарили: 80 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение vdemidov » 14 окт 2010, 10:33

DJ VK писал(а):Вобще нихрена не понял, а перевод то как делается?

Ну оно вроде как по языку винды по-дефолту определяет и берет соответствующий ленг файл, который может лежать в папочке locale или быть прилинкован к exe
Если подходящего ленг файла нет, то показывает просто базовые строки забитые в исходниках.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1166
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 92 раз.
Поблагодарили: 52 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение DJ VK » 14 окт 2010, 10:38

А как ее настроить чтоб она на английском работала? Где взять ленг файлы для него?
Последний раз редактировалось DJ VK 14 окт 2010, 11:01, всего редактировалось 1 раз.
Аватара пользователя
DJ VK
Специалист
 
Сообщения: 821
Зарегистрирован: 16 апр 2009, 13:57
Благодарил (а): 51 раз.
Поблагодарили: 80 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение vdemidov » 14 окт 2010, 10:57

DJ VK писал(а):А как ее настроить чтоб она на английском работала?

UseLanguage("en");
DJ VK писал(а):Где взять ленг файлы для него?

Хоть самому написать и скомпилить, хоть взять готовые, они вроде бы есть на сайте. Сам локализатор пользуется бинарным mo-файлом, который компилится из текстового po-файла при помощи poEdit или Gorm
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1166
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 92 раз.
Поблагодарили: 52 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение DJ VK » 14 окт 2010, 12:31

Итак код работы с DFM.

Код: Выделить всё
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Memo1->Lines->Clear();
  FS->Dirs=Brows->Path;
  FS->Execute();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FSFound(TObject *Sender, PLMDSPFileRecord filedata)
{
  Memo1->Lines->Add(filedata->Directory+filedata->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FSEnd(TObject *Sender)
{
  while(Form1->Memo1->Lines->Count>0)
  {
    Form1->M->Lines->LoadFromFile(Form1->Memo1->Lines->operator [](0));
    Form1->M->Text=ProcessingDFM(Form1->M->Text);
    Form1->M->Lines->SaveToFile(Form1->Memo1->Lines->operator [](0));
    Form1->Memo1->Lines->Delete(0);
  }
  M->Lines->Clear();
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ProcessingDFM(AnsiString Text)
{
  int Addr=0;
  AnsiString Symb,Str;
  AnsiString NewText="";
  int Pos1=0,Pos2=0,LastPos=1;
  bool MultiString=false;
  bool AnsiMode=false;
  while(Addr<Text.Length()-1)
  {
    if(Pos1==0)
    {
      Symb=Text.SubString(Addr,3);
      if(Symb=="= #")
      {
          Pos1=Addr+2;
          Addr+=2;
      }
      if(Symb=="= '")
      {
          Pos1=Addr+2;
          Addr+=2;
          AnsiMode=true;
      }
      if(Pos1>0)
      {
          NewText=NewText+Text.SubString(LastPos,Pos1-LastPos);
      }
    }
    else
    {
      Symb=Text.SubString(Addr,2);
      if(Symb=="\r\n")
      {
          Pos2=Addr;
      }
      if(Pos2>0)
      {
        Str=Text.SubString(Pos1,Pos2-Pos1);
        Str=ToAnsi(Str);
        Str=Translate(Str);
        Str=ToDFM(Str);
        NewText=NewText+Str;
        LastPos=Pos2;
        Pos1=0;
        Pos2=0;
      }
    }
    Addr++;
    //Symb,Str
  }
  NewText=NewText+Text.SubString(LastPos,Text.Length()-LastPos+1);
  return NewText;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ToAnsi(AnsiString Str)
{
  ASymbol AS;
  WSymbol WS;
  AnsiString Symb=" ";
  char* CStr=Symb.c_str();
  bool AnsiMode=false;
  AnsiString Res="";
  AnsiString NumStr;
  int Addr=1;
  int Pos1=0,Pos2=0;
  while(Addr<=Str.Length())
  {
    Symb=Str.SubString(Addr,1);
    if(Symb=="#" && !AnsiMode)
    {
      if(Pos1==0)
      {
        Pos1=Addr+1;
      }
      else
      {
        Pos2=Addr;
        NumStr=Str.SubString(Pos1,Pos2-Pos1);
        WS.Code=(WORD)NumStr.ToInt();
        Res=Res+WideCharLenToString(&WS.Symb,1);
        Pos1=Pos2+1;
        Pos2=0;
      }
    }
    if(Symb=="'")
    {
      if(Pos1!=0 && !AnsiMode)
      {
        Pos2=Addr;
        NumStr=Str.SubString(Pos1,Pos2-Pos1);
        WS.Code=(WORD)NumStr.ToInt();
        Res=Res+WideCharLenToString(&WS.Symb,1);
        Pos1=Pos2+1;
        Pos2=0;
      }
      if(!AnsiMode)
      {
        Pos1=Addr+1;
        AnsiMode=true;
      }
      else
      {
        Pos2=Addr;
        Res=Res+Str.SubString(Pos1,Pos2-Pos1);
        AnsiMode=false;
        Pos1=0;
        Pos2=0;
      }
    }
    Addr++;
  }
  if(Pos1!=0 && !AnsiMode)
  {
        Pos2=Addr;
        NumStr=Str.SubString(Pos1,Pos2-Pos1);
        WS.Code=(WORD)NumStr.ToInt();
        Res=Res+WideCharLenToString(&WS.Symb,1);
  }
  return Res;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::Translate(AnsiString Text)
{
  return _(Text);
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::ToDFM(AnsiString Str)
{
  ASymbol AS;
  WSymbol WS;
  AnsiString Symb=" ";
  char* CStr=Symb.c_str();
  bool AnsiMode=false;
  AnsiString Res="";
  int Addr=1;
  while(Addr<=Str.Length())
  {
    Symb=Str.SubString(Addr,1);
    CStr=Symb.c_str();
    AS.Symb=*CStr;
    StringToWideChar(AS.Symb,&WS.Symb,sizeof(WideChar));
    if((WS.Code<0x80 && WS.Code>=0x20)&&(WS.Code!=0x27))
    {
      if(!AnsiMode)
      {
        AnsiMode=true;
        Res=Res+"'";
      }
      Res=Res+Symb;
    }
    else
    {
      if(AnsiMode)
      {
        AnsiMode=false;
        Res=Res+"'";
      }
      Res=Res+"#"+IntToStr(WS.Code);
    }
    Addr++;
  }
  if(AnsiMode)
  {
    AnsiMode=false;
    Res=Res+"'";
  }
  return Res;
}


В результате получается абсолютно такой же DFM.
Осталось переводилку подключить
Последний раз редактировалось DJ VK 14 окт 2010, 13:40, всего редактировалось 5 раз(а).
Аватара пользователя
DJ VK
Специалист
 
Сообщения: 821
Зарегистрирован: 16 апр 2009, 13:57
Благодарил (а): 51 раз.
Поблагодарили: 80 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение vdemidov » 14 окт 2010, 12:40

Сделайте пожалуйста консольный вариант и прицепите сюда скомпиленную версию, а то билдера у меня нет, а пределывать под студию нерационально. Что бы заработала переводилка, все что нужно это сделать UseLanguage("en"); перед началом работы, а в функции Translate написать return _(Text); и конечно не забыть взять папочку lacale из последней альфы и положить рядом с екзешником.
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1166
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 92 раз.
Поблагодарили: 52 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение DJ VK » 14 окт 2010, 12:56

Ну у меня все проще - выбрал папку и нажал кнопку, это проще сделать, я готовые компоненты беру... но если очень прижмет и консоль сделаю.
Скинь мне DFM для отладки, хочу сразу на реальных отладить.
Аватара пользователя
DJ VK
Специалист
 
Сообщения: 821
Зарегистрирован: 16 апр 2009, 13:57
Благодарил (а): 51 раз.
Поблагодарили: 80 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение vdemidov » 14 окт 2010, 13:10

DJ VK писал(а):Ну у меня все проще - выбрал папку и нажал кнопку, это проще сделать, я готовые компоненты беру... но если очень прижмет и консоль сделаю.

Ну мне без особой разницы. В любом случае мне в итоге exe нужен.
DJ VK писал(а):Скинь мне DFM для отладки, хочу сразу на реальных отладить.

Вот пара dfm, тестируйте. Спасибо
Вложения
SAS_Dev_dfm.rar
dfm-ки
(7.66 KiB) Скачиваний: 38
Чтобы понять программу, вы должны стать одновременно и машиной, и программой.
Аватара пользователя
vdemidov
Гуру
 
Сообщения: 1166
Зарегистрирован: 12 дек 2008, 13:10
Откуда: Киев
Благодарил (а): 92 раз.
Поблагодарили: 52 раз.

Re: Нужна помощь или хотя бы подсказка.

Сообщение DJ VK » 14 окт 2010, 13:40

Обнаружил неправильную обработку символов #128 - #255 и исправил. Теперь все в коде верно.
Итак, вот программа. В нее забросить папку локали из альфы.
Вложения
distr.rar
(499.49 KiB) Скачиваний: 46
Аватара пользователя
DJ VK
Специалист
 
Сообщения: 821
Зарегистрирован: 16 апр 2009, 13:57
Благодарил (а): 51 раз.
Поблагодарили: 80 раз.

Пред.След.

Вернуться в Раздел для разработчиков программы SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron