--- 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