Interfejs w kilku językach, ładowanie napisów

0

Piszę program (C/WinAPI) i chcę zrobić GUI w różnych językach (np. Polski, Angielski).

Mój pomysł to:

//(...)
unsigned int LanguageIndex = 0; //0=English, 1=Polish
char szMainDialogTexts[8][1024][512];

INT_PTR CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
            {
                //angielskie napisy
                FILE * pFile = NULL;
                fopen_s(&pFile, "english.txt", "r");

                int i = 0;

                while(!feof(pFile))
                {
                    fgets(szMainDialogTexts[0][i], 512, pFile);
                    i++;
                }

                fclose(pFile);

                //polskie napisy
                fopen_s(&pFile, "polish.txt", "r");

                i = 0;

                while(!feof(pFile))
                {
                    fgets(szMainDialogTexts[1][i], 512, pFile);
                    i++;
                }

                fclose(pFile);
            }
            break;
        case WM_COMMAND:
            switch(wParam)
            {
                case IDC_TESTBTN: //wyświetl napisy na kontrolce StaticText
                {
                    int i = 0;
                    while(lstrcmp(szMainDialogTexts[LanguageIndex][i], "eof") != 0)
                    {
                        SetDlgItemText(hwndDlg, IDC_LABEL1, szMainDialogTexts[LanguageIndex][i]);
                        Sleep(1000);
                        i++;
                    }
                }
                break;
                case IDC_CHANGEBTN: //zmień język, jak będzie wiecej jezykow to zrobie liste, albo RadioButton
                {
                    if(LanguageIndex == 0)
                        LanguageIndex = 1;
                    else if(LanguageIndex == 1)
                        LanguageIndex = 0;
                }
                break;
            }
            break;
        case WM_CLOSE:
            ExitProcess(0);
            break;
    }
    return 0;
}

//(...)

english.txt

Green
Good morning
I like You
eof

polish.txt

Zielony
Dzień dobry
Lubię Cię
eof

Powyższy kod działa.

Moje pytania:

  1. Czy powyższy kod nadaje się do użycia w programie, co o nim sądzicie?
  2. Nie chcę zaprzęgać dodatkowych bibliotek (XML czy coś), macie jakiś lepszy pomysł niż mój?
  3. Tablic na napisy ( np. char szMainDialogTexts[8][1024][512]; ) będzie tyle ile okien ma program, czy to nie będzie spowalniało aplikacji, albo zabierało dużo pamięci (takie duże wielowymiarowe tablice)?

Wszelkie sugestie, pomysły, komentarze, krytyka mile widziane.

pozdrawiam

1

Nie wyważaj otwartych drzwi, poczytaj o resource stringacha

0

Tyle, że ja chcę dać możliwość tłumaczenia interfejsu użytkownikowi oraz możliwość zmiany danego napisu w gotowym exe.

1

NIE MA nic prostszego niż podmiana resorsów w exe, kompilator res - darmowy.
Poza tym, twierdzisz że "ja chcę dać możliwość tłumaczenia interfejsu użytkownikowi" a w źródle otwierasz english.txt i polish.txt a jak zrobi tłumaczenie na chiński to ma podmienić polish.txt ?

0

Chodzi o to, że użytkownik/klient zna lepiej angielski ode mnie i on sobie to co ja wpisze do english.txt przetłumaczy to czego ja nie wiedziałem ew. poprawi to co ja wpisałem. Zrobie test dla pliku jezykowego o 1000 linijkach, jak będzie działało, to zostaje ten mój sposób.

1

W każdym razie nie jest tędy droga:
Wczytaj cały plik, podmień znaki '\n' na '\0' i powstawiaj to do:

std::map<std::pair<unsigned char,size_t>,const char *> Lang;
dodajesz: Lang[std::pair<unsigned char,size_t>('E',i)]=ptr; ptr+=strlen(ptr);
pobierasz: const char *ptr=Lang[std::pair<unsigned char,size_t>('E',i)];

lub wg twojego:

const char *szMainDialogTexts[8][1024];
szMainDialogTexts[Lang][i]=ptr; ptr+=strlen(ptr);

Mały przykład:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char *szMainDialogTexts[8][1024]={{0}};

void readLang(const char **text,const char *name)
  {
   FILE *fd;
   char *ptr,*end;
   size_t size;
   
   fd=fopen(name,"r");
   fseek(fd,0,SEEK_END);
   size=ftell(fd);
   fseek(fd,0,SEEK_SET);
   ptr=(char*)malloc(size+1);
   end=ptr+fread(ptr,1,size,fd);
   fclose(fd);
   *end=0;
   while(ptr<end)
     {
      *(text++)=ptr;
      ptr=strchr(ptr,'\n');
      if(!ptr) break;
      *(ptr++)=0;
     }
  }


int main()
  {
   readLang(szMainDialogTexts[0],"polish.txt");
   readLang(szMainDialogTexts[1],"english.txt");
   return 0;
  }
2

Skoro już piszesz w WinAPI, to może warto byłoby użyć tego samego mechanizmu, którego MS używa w Windowsach (MUI). Polega to na tym, że właściwy EXE nie ma wkompilowanych tekstów, ale są one automatycznie ładowane z plików o rozszerzeniu .mui. Nie czytałem jak to dokładnie zrobić, ale wiem że jest możliwość użycia MUI we własnych programach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1