Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Promena jezika celog programa

[es] :: C/C++ programiranje :: Promena jezika celog programa

Strane: 1 2

[ Pregleda: 4746 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Promena jezika celog programa03.11.2011. u 18:02 - pre 151 meseci
Imam zadatak uraditi neku aplikaciju ali ta aplikacija da ima mogucnost promenu jezika (pr. Menu->Jezik->SR, MKD, EN). Jer moze neka solucija kako to da odradim, dali da ima neki ini fajl gde pise koji jezik treba da podigne (pri startovanje app) pa u zavisnost od toga od drugi ini fajl da ocitava svaki "caption" elementa unutar aplikacije. Pri prvo podizanje programa bi imo da izabere koji jezik zeli, onda svako drugo podizanje preograma pravicu sporedbu jezika pri zadnje otvaranje i zatvaranje applikacije...Valjda ovo nije najbolje resenje :) Ako ima neka bolja ideja. Hvala
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Promena jezika celog programa03.11.2011. u 18:53 - pre 151 meseci
Jedan problem je gde čuvati informaciju o jeziku apikacije. Ovo je sitan problem. Može .ini fajl, može registry (moj omiljen), može čak i baza (ako u bazi već čuvaš i neke druge stvari).

Drugi problem je kako u birati različite jezike ako već imaš informaciju o jeziku. Ovo je malo veći problem. Prva stvar koja apsolutno olakšava rešenje problema je da aplikacija bude Unicode. Dalje, u Visual C++ okruženju (sa ili bez MFC-a) možeš da imaš takozvane resursne DLL-ove (resource DLL). Ovi DLL-ovi nemaju ni jednu funkciju, ali zato imaju string tabele, prozore, menije, ikone, i sve ostalo. Možeš za svaki jezik da napraviš jedan DLL, i na početku rada učitaš željeni DLL i ostatku programa kažeš da za sve što im treba od resursa vide u tom DLL-u.

Drugo rešenje bi bilo da imaš nekakav xml fajl za svaki jezik, i da u celom programu u letu radiš čitanje stringova iz odgovarajućeg fajla, i zamenu default teksta u prozorim i menijima. Morao bi u prozorima da zauzmeš više mesta za sve labele, za slučaj da na nekom jeziku neka labela zauzima više mesta. Ja nikad nisam ovako radio, ali tako je sad popularno u svetu.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa03.11.2011. u 18:56 - pre 151 meseci
Pogledaj i ovu temu, ako se ne varam, koristiš BCB:
http://www.elitesecurity.org/t302421-Visejezicni-program-kako

 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa03.11.2011. u 20:03 - pre 151 meseci
Ovaj kod (X Files sto je dao) je dosta dobar (bar tako se meni cini) podesi ti keybord, code page za zeljeni jezik i na sve elemente promeni napise...samo imam jedan nejasan deo koda

Code:

// MyStrings.rh                                                              
#define   IDS_CANCEL             27114 

// Strings.rc                                                            
#pragma code_page(1252) 
#include "MyStrings.rh" 

STRINGTABLE 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 
BEGIN 
  IDS_CANCEL, "Cancel" 
END 

STRINGTABLE 
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT 
BEGIN 
  IDS_CANCEL, "Zrusit" 
END 


Sada nisam toliko uputen bar nisam to jos izucio/cuo :S MyString.rh je? (Samo fajl u koi definisem sve "objekte"? ili) Isto tako String.rc to je neki resource fajl ili? u njega ukljucim MyString...Ako moze samo malo objasnenja ili tekst negde da procitam sto je to ustvari. Hvala

@mihajlo
Kako birati, po default ce se startuje sa nekim jezikom, onda biras to sto tebi odgovara i opet stavis u rg...svako sledece startovanje samo gledas koi je jezik i spored toga citas i reg :D (ako si na to mislio) :D Hvala vam na brzom odgovoru
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Promena jezika celog programa03.11.2011. u 20:47 - pre 151 meseci
Ne znam Borland tako da ne vredi da ti odgovaram.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.3gnet.mts.telekom.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa04.11.2011. u 06:45 - pre 151 meseci
Citat:
MyString.rh je?

MyString.rh je obican tekstualni fajl, u kome se definise identifikator stringa i jedinstveni broj.

Citat:
Isto tako String.rc to je neki resource fajl ili?

String.rc je klasican resursni fajl, koji u nasem primeru sadrzi uglavnom sadrzaj stringova, definisanih preko identifikatora. Ovaj fajl treba DODATI U PROJEKAT (Add to Project).


Pokušaću da ti uradim jedan test primer u vezi ovoga, samo da pronađem makar malo vremena...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.3gnet.mts.telekom.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa04.11.2011. u 09:03 - pre 151 meseci
--- RSTRINGS.RH (tekstualni fajl, sam ga kreiras) ---
Code:

#define IDS_FORM1    10000
#define IDS_BUTTON1  10001 
#define IDS_LABEL1   10002


--- RSTRINGS.RC (tekstualni fajl, sam ga kreiras i DODAJES u projekat) ---
Code:

#pragma code_page(1252)
#include "RStrings.RH"

STRINGTABLE
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
BEGIN
  IDS_FORM1,   "My form"
  IDS_BUTTON1, "My button"
  IDS_LABEL1,  "My label"
END

STRINGTABLE
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
BEGIN
  IDS_FORM1,   "Moja forma"
  IDS_BUTTON1, "Moj taster"
  IDS_LABEL1,  "Moj natpis"
END


--- PROJECT1.INI (tekstualni fajl za cuvanje informacije o izabranom jeziku, ne moras da pravis, bice autokreiran) ---
Code:

[Language]
ID=1


--- UNIT1.H (ovo je generisano u IDE-u, uz izmene koje sam uoci)---
Code:

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <IniFiles.hpp>

//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        TLabel *Label1;
        void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
        TIniFile *pIniFile;
        int IDLanguage;
        void PromeniJezik();

public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
        __fastcall ~TForm1();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



--- UNIT1.CPP ---
Code:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "RStrings.RH"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
    try
    {
        pIniFile = new TIniFile( ChangeFileExt( ParamStr(0), ".ini" ) );
        IDLanguage = pIniFile->ReadInteger( "Language", "ID", 0 );
    }
    catch ( const Exception &e )
    {
        IDLanguage = 0;
    }

    if ( pIniFile )
        delete pIniFile;

    PromeniJezik();
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
    try
    {
        pIniFile = new TIniFile( ChangeFileExt( ParamStr(0), ".ini" ) );
        pIniFile->WriteInteger( "Language", "ID", IDLanguage );
    }
    catch ( const Exception &e )
    {
        // ...
    }
    if ( pIniFile )
        delete pIniFile;

}
//---------------------------------------------------------------------------
static const TFontCharset CodepageToCharset( unsigned int cp )
{
   CHARSETINFO csi;

   if ( (cp == 0) || (!TranslateCharsetInfo( (unsigned long *)cp, &csi, TCI_SRCCODEPAGE )) )
   {
     return OEM_CHARSET;
   }
   return (TFontCharset)csi.ciCharset;
}
//---------------------------------------------------------------------------
static AnsiString InternalLoadStr( int ErrorCode )
{
   const int MaxResourceBufferSize = 4096;  // maximum resource string length is 4095 bytes
   char string[MaxResourceBufferSize];
   LoadString( GetModuleHandle(0), ErrorCode, string, MaxResourceBufferSize );
   return AnsiString( string );
}
//---------------------------------------------------------------------------
void TForm1::PromeniJezik()
{
    int CP;
    if ( IDLanguage == 0 )
    {
       SetThreadLocale( 0x0409 );  // U.S. English
       CP = 1250;
    }
    else
    {
       SetThreadLocale( 0x0405 );  // Czech local
       CP = 1252;
    }

    Form1->Font->Charset = CodepageToCharset( CP );
    Form1->Caption = InternalLoadStr( IDS_FORM1 );

    Button1->Font->Charset = CodepageToCharset( CP );
    Button1->Caption = InternalLoadStr( IDS_BUTTON1 );

    Label1->Font->Charset = CodepageToCharset( CP );
    Label1->Caption = InternalLoadStr( IDS_LABEL1 );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if ( IDLanguage == 1 )
        IDLanguage = 0;
    else
        IDLanguage = 1;

    PromeniJezik();
}
//---------------------------------------------------------------------------



E sad, tragedija je da ja tebe savetujem da radis ovako, kako je proizvodjac softvera i predvideo, a ja sam ne radim ovako :) Osnovna anomalija ovakvog koda je hardcode-iranost prevoda, tj nemogucnost dodavanja novog jezika BEZ rekompajliranja koda.

Tvoja kreativnost se sada moze ogledati u smestanju prevoda u neke zasebne fajlove i sl.

Za sada, poneta ovog koda je da vidis:
- kako se cuvaju konfiguraciona podesavanja u INI fajlovima. Slicno je i za Regystry.
- Kako se menja jezik

 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.3gnet.mts.telekom.rs.



+2790 Profil

icon Re: Promena jezika celog programa04.11.2011. u 10:28 - pre 151 meseci
Off topic:

Qt ima alat Qt Linguist za jednostavno pravljenje prevoda (pravljen za prevodioce koji nisu programeri) koji nisu hardkodovani.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa04.11.2011. u 12:16 - pre 151 meseci
Razgledao sam kod, od ujutru par puta sam piso (dok si postiro kod) kod i nekako slabo. Sad mi je jasno kako to uradito recimo samo sa ini fajlovima, ali sada me nervira sto ovaj kod kod mene ne funkcionise t.e neizvrsava se. Uvek "otvara" LANG_ENGLISH idetifikator i kad je ID=0 i kad je ID=1. A i kad promenim drugi idetifikator (tacnije LANG_MACEDONIAN) daje mi error na njega...sve sam odradio kako u kodu?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa04.11.2011. u 12:29 - pre 151 meseci
Stvarno ne znam o čemu se radi. Kod sam probao i radio je, mada ga nisam detaljnije testirao. Pamtio je promenu i startovao se onako kako je poslednji put podešeno. Sada ne mogu da ti ga pošaljem u celosti, jer nisam trenutno na računaru na kome sam ga uradio.

Što se tiče ćirilice (LANG_MACEDONIAN), pokušaj neku drugu, možda Rusku varijantu...

Pretpostavljam da su ovi fajlovi odgovorni za jezičke konstante:
c:\Program Files\Borland\CBuilder6\Include\winnt.h
c:\Program Files\Borland\CBuilder6\Include\winnt.rh

Pokušaj da uključiš (include) nešto of ovoga ispod linije:
#include "RStrings.RH"
...ili jednostavno redefiniši (define) prema specifikaciji koja je u ovim fajlovima.
 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa04.11.2011. u 18:17 - pre 151 meseci
Sve sam probao i nikako da proradi :S. Bas me zanima ucemu je problem...evo prikacen projekt ali sve je isto :S
Prikačeni fajlovi
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa04.11.2011. u 20:05 - pre 151 meseci
U pravu si, ovo ne radi na Win7!

Sada sam pogledao:

SetThreadLocale no longer changes GUI language in Vista
http://social.msdn.microsoft.c...c-900c-4c64-bdf8-fe94e46722e2/


Pokušaću da pronađem rešenje...

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa04.11.2011. u 20:24 - pre 151 meseci
Ok, sve ovo je dokaz da treba ići ka novijim rešenjima što se tiče višejezičke podrške.

Kod koji sam inicijalno ostavio, radiće na XP-u, ali neće na novijim OS-ovima.


Da bi se to prevazišlo, jedno od rešenja je sledeće. Treba napraviti posebnu funkciju, koja će utvrditi tip OS-a, i prema tome reagovati:
Code:

void SetThreadLocalSettings(LANGID Language, LANGID SubLanguage)
{

   OSVERSIONINFOEX osver;
   ZeroMemory(&osver, sizeof(osver));
   osver.dwOSVersionInfoSize = sizeof(osver);

   GetVersionEx((OSVERSIONINFO *)&osver);


   if ( (osver.dwMajorVersion > 5))
   {
      typedef LANGID (WINAPI *FNSetThreadUILanguage)(LANGID wReserved);
      FNSetThreadUILanguage fnPtr = (FNSetThreadUILanguage)GetProcAddress(GetModuleHandle("kernel32.dll"),"SetThreadUILanguage");
      // ako ovo gore nece da se kompajlira, pokusaj ovako:
      // FNSetThreadUILanguage fnPtr = (FNSetThreadUILanguage)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"SetThreadUILanguage");

      if(fnPtr)
      { // vista or 2008
         LANGID langid = (*fnPtr)(Language);
      }
      else
      { // fallback for XP
         ::SetThreadLocale(MAKELCID(MAKELANGID(Language, SubLanguage), SORT_DEFAULT));
      }
   }
   else
   { //XP
      ::SetThreadLocale(MAKELCID(MAKELANGID(Language, SubLanguage), SORT_DEFAULT));
   }
}


... i zatim, umesto:
Citat:

Code:

    int CP;
     if ( IDLanguage == 0 )
     {
        SetThreadLocale( 0x0409 );  // U.S. English
        CP = 1250;
     }
     else
     {
        SetThreadLocale( 0x0405 );  // Czech local
        CP = 1252;
     }


Treba:
Code:

    int CP;
     if ( IDLanguage == 0 )
     {
        SetThreadLocalSettings( 0x0409, SUBLANG_ENGLISH_US );  // U.S. English
        CP = 1250;
     }
     else
     {
        SetThreadLocalSettings( 0x0405, SUBLANG_DEFAULT );  // Czech local
        CP = 1252;
     }

 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa04.11.2011. u 21:32 - pre 151 meseci
Ovo radi i to dobro, zadatak koi smo imali bio je nad 1000 objekta (button, panel, label i.t.d) da promenimo caption...ispisali smo oko 800. Od klika do izmene ne proge ni sekunda :)...e sada one funkcije sam razumeo, ali ova nemam pojma sta radi :)) Hvala ti X Files
 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa04.11.2011. u 22:19 - pre 151 meseci
Ali opet se vracam kod idetifikatora, javlja gresku kod ruskog, srpskog, makedonskog...pogledao sam winnt.h i winnt.rh i tamo su tako definisani a opet izadje error?

Code:

[BRCC32 Error] Strings.rc(13): Not a positive short integer
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa04.11.2011. u 23:04 - pre 151 meseci
Dodaj:
#include "Winnt.RH"
... u RStrings.RC


Za "Serbian Latin":

--- RStrings.RC ---
Code:

#pragma code_page(1252)
#include "RStrings.RH"
#include "Winnt.RH"

 STRINGTABLE
 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 BEGIN
   IDS_FORM1,   "My form"
   IDS_BUTTON1, "My button"
   IDS_LABEL1,  "My label"
 END

 STRINGTABLE
 LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN
 BEGIN
   IDS_FORM1,   "Moja forma"
   IDS_BUTTON1, "Moj taster"
   IDS_LABEL1,  "Moj natpis"
 END


--- UNIT1.CPP ---
Code:

// ...
     int CP;
     if ( IDLanguage == 0 )
     {
        SetThreadLocalSettings( 0x0409, SUBLANG_ENGLISH_US );  // U.S. English
        CP = 1250;
     }
     else
     {
        SetThreadLocalSettings( 0x081a, SUBLANG_DEFAULT );  // Serbian Latin
        CP = 1252;
     }

// ...
 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa04.11.2011. u 23:25 - pre 151 meseci
To sam vec odradio...samo trazim kako kirilicu da uklopim, idetifikator stavim code page za kirilicu je 1251 ama izlaze prasalnici :D trazicu gde je cakica :D
 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa04.11.2011. u 23:54 - pre 151 meseci
Zezao me je idetifikator za sublanguage...trebalo bi ovako da bude (ako nekom pocetniku kako mene zatreba) X Files hvala ti mnogo

--- RStrings.RC ---
Code:

#pragma code_page(1252)
#include "RStrings.RH"
#include "winnt.rh"

STRINGTABLE
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
BEGIN
  IDS_FORM1,   "My form"
  IDS_BUTTON1, "My button"
  IDS_LABEL1,  "My label"
END

STRINGTABLE
LANGUAGE LANG_MACEDONIAN, SUBLANG_MACEDONIAN_MACEDONIA
BEGIN
  IDS_FORM1,   "Moja Forma"
  IDS_BUTTON1, "Batonče"
  IDS_LABEL1,  "LjNjEЅŠЃŽZDžČЌ"
END


--- UNIT1.CPP ---
Code:

int CP;
    if ( IDLanguage == 0 )
    {
       SetThreadLocalSettings( 0x0409, SUBLANG_ENGLISH_US );  // U.S. English
       CP = 1250;
    }
    if ( IDLanguage == 1 )
    {
       SetThreadLocalSettings( 0x042F, SUBLANG_MACEDONIAN_MACEDONIA );  // MKD
       CP = 1251;
    }



 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Promena jezika celog programa05.11.2011. u 10:23 - pre 151 meseci
Eto, lepo ako je proradilo.

Ipak, u perspektivi razmisli o tome da prevode držiš u sasvim zasebnim tekstualnim fajlovima, odvojenim od EXE-a ili DLL-a, tj. da budu "otvoreni" za editovanje spolja. Praksa je pokazala da je ovo praktičnije od rešenja koja se nude u okviru ekstenzija razvojnog okruženja. Na primer, pogledaj kako je to rešeno u ozbiljnijim softverima, tipa Total Commander-a...
 
Odgovor na temu

milan_sr
Milan Savov
Strumica

Član broj: 262218
Poruke: 108
92.55.109.*



+26 Profil

icon Re: Promena jezika celog programa05.11.2011. u 11:09 - pre 151 meseci
Dok sam radio sa ovim kodom probo sam problem resiti sa ini, to mi je dobro ispalo, u jednim fajlom cuvam id jezika u drugi ini prevode i u zavisnost sta odberem to citam. E sada kod mene "current language for non-unicode programs" stoi MKD...nisam proverio da smenim to pa da vidim kako bi radilo onda. Sto sa ovim kodom sto si ti postirao to je zaobidjeno...
 
Odgovor na temu

[es] :: C/C++ programiranje :: Promena jezika celog programa

Strane: 1 2

[ Pregleda: 4746 | Odgovora: 24 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.