Solved

Multilingual Application written in Delphi

Posted on 1998-09-16
13
378 Views
Last Modified: 2010-04-06
I am currently writing an application in Delphi 3.  I would like to make the application multilingual.  The app contains  several forms (and more forms to be added in the future).  What is the common method of making a multilingual application?  For Example:  the menu item Exit <-- English
Quitter <-- French  and Quitos <-- Spanish (Please note that  the spanish text was simply for demonstration purposes!).

Also, note that in the future, more languages would be supported.
Thanks
0
Comment
Question by:psabourin
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 4
  • 2
13 Comments
 
LVL 35

Expert Comment

by:TimYates
ID: 1339969
Well, the usual method is to place all of the strings in the application into a string resource in a .res file (or .rc).  Then, these files can be included into the application in the following style:

{$IFDEF ENGLISH}
  {$R ENGSTR.RES}
{$ENDIF}
{$IFDEF SPANISH}
  {$R SPASTR.RES}
{$ENDIF}
.etc...

So long as all of the strings have the same resurce ID number, then it is just a case of copying each string to its related resource at run time...

Dont forget however, that if you wish to add languages such as Kanji (Japanese), then any character level string parsing that you perform (where you increment a pChar), must use the CharNext (or AnsiNext for 16 bit) functions as defined in the Windows API, as some characters are 2 bytes long...

Hope this is the answer you were looking for...

Tim.

PS:  Alas, Delphi does not include a resource editor, so you will have to use one that is included with another application such as BP7 for 16 bit, or MSDEV4 for 32 bit...
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339970
It usually is done by the resource file....Save the strings you'd need and then check the lanugage.....

Check this out....Here is an example....
let's say you want to support two languages...(English, Spanish)
-----English.RC--------
STRINGTABLE
BEGIN
  1, "Hello"
  2, "String Table"
  11, "First message"
  12, "Second message"
  13, "Third message"
  14, "Fourth message"
  15, "Fifth message"
  16, "Sixth message"
  17, "Seventh message"
  18, "Eighth message"
  19, "Ninth message"
  20, "Tenth message"
END
-------Spanish.RC---------
STRINGTABLE
BEGIN
  1, "Ciao"
  2, "Tabella Stringhe"
  11, "Primo messaggio"
  12, "Secondo messaggio"
  13, "Terzo messaggio"
  14, "Quarto messaggio"
  15, "Quinto messaggio"
  16, "Sesto messaggio"
  17, "Settimo messaggio"
  18, "Ottavo messaggio"
  19, "Nono messaggio"
  20, "Decimo messaggio"
END
----------Pas file(The code) to join it---------
unit StringF;
interface
uses
  SysUtils, Windows, Messages, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, Spin, ExtCtrls;
type
  TForm1 = class(TForm)
    ShowButton: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    HelloButton: TButton;
    Bevel1: TBevel;
    Bevel2: TBevel;
    procedure HelloButtonClick(Sender: TObject);
    procedure ShowButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
//The check for the languages follows.....
{$IFNDEF ITALIAN}
  {$R STABLE.RES}
{$ELSE}
  {$R STABLEIT.RES}
{$ENDIF}
procedure TForm1.HelloButtonClick(Sender: TObject);
var
  StrMsg: string;
begin
  StrMsg := LoadStr (1);
  if StrMsg <> '' then
    ShowMessage (StrMsg);
end;

procedure TForm1.ShowButtonClick(Sender: TObject);
var
  StrMsg: string;
begin
  StrMsg := LoadStr (10 + SpinEdit1.Value);
  if StrMsg <> '' then
    ShowMessage (StrMsg);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  StrTitle: string;
begin
  StrTitle := LoadStr (2);
  if StrTitle <> '' then
  begin
    Caption := StrTitle;
    Application.Title := StrTitle;
  end;
end;
end.
------------
That's all........
YOu can create all the strings and stuff in the same RC file.....for example.......

-----The RC(This example is shows the English & Bulgarian languages)------
STRINGTABLE
BEGIN
  1, "One"
  2, "Two"
  3, "Three"
  4, "Four"
  //Continue up to 9
 10, "Ten"
//Here start the Bulgarian...The # continues though....1..10, and now 11..20
  11, "Edno"
  12, "Dve"
  13, "Tri"
  14, "Chetiri"
  //Continue up to 19
 20, "Deset"
END
------And when you load it use something similar to this--------
unit StringF;
interface
uses
  SysUtils, Windows, Messages, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, Spin, ExtCtrls;
type
  TForm1 = class(TForm)
    ShowButton: TButton;
    SpinEdit1: TSpinEdit;
    Label1: TLabel;
    HelloButton: TButton;
    Bevel1: TBevel;
    Bevel2: TBevel;
    procedure HelloButtonClick(Sender: TObject);
    procedure ShowButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
private
  Bulgarian : Boolean;
end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
{$R STABLE.RES}
//The check for the languages follows.....
{$IFNDEF BULGARIAN}
  Bulgarian := False;
{$ELSE}
  Bulgarian := True;
{$ENDIF}
procedure TForm1.HelloButtonClick(Sender: TObject);
var
  StrMsg: string;
begin
if not Bulgarian then
  StrMsg := LoadStr (1)
else
  StrMsg := LoadStr (11);
  if StrMsg <> '' then
    ShowMessage (StrMsg);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  StrTitle: string;
begin
if Bulgarian then
  StrTitle := LoadStr (2)
else StrTitle := LoadStr(12);
  if StrTitle <> '' then
  begin
    Caption := StrTitle;
    Application.Title := StrTitle;
  end;
end;
end.
------------
Hope this helps....
0
 
LVL 35

Expert Comment

by:TimYates
ID: 1339971
Hmmm yes, that is it....

(a bit more complete than my answer)

*cough*

Tim.

0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 35

Expert Comment

by:TimYates
ID: 1339972
*grin*

Can we give Viktonet the points for all his extra work, and his better knowledge of languages?

Yours, in English only,

Tim.
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339973
Thanks Tim
0
 

Author Comment

by:psabourin
ID: 1339974
In the line: {$ifndef italian}  Where does italian come from?  Is this from Windows or an INI file of my program?  Right now, my program has a line like this in the INI file:
[Culture]
Language = 1

where 0 = English, 1 = French and 2 = Spanish.
Thanks

0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339975
Try this example......
You don't need to save the values in an INI files.... Windows has got the values of all langauges that are regsitered to your windows...

var
{$IFDEF ITALIAN}
      Italian : Boolean = True;
{$ELSE}
      Italian : Boolean = False;
{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);
begin
    If Italian then
        ShowMessage('We speak Italian language')
    else
        ShowMessage('We speak English language');
end;

Also try this,,,,,

Type in Windows. and when the list shows just type something like LANG_ or SUBLANG_ and you will see the names of some of the registered languages to your windows..

Regards,
Viktor Ivanov
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339976
Hello psabourin

planning to accept mine or Tim's answer???

//Vik
0
 
LVL 35

Expert Comment

by:TimYates
ID: 1339977
heh heh heh...

Tim.
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339978
heh heh heh...

Vik.
0
 

Author Comment

by:psabourin
ID: 1339979
Sorry, I was away from my computer for a while... I am planning on accepting Vik's answer.  How do I grade Vik's answer.  Right now it is only letting me accept Tim's?
Thanks
0
 
LVL 10

Expert Comment

by:viktornet
ID: 1339980
Hey..

In order to accept my answer you need to reject Tim's answer and then I'd answer the question so you can grade it....
0
 
LVL 10

Accepted Solution

by:
viktornet earned 50 total points
ID: 1339981
Thanks :-)
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…
Sometimes it takes a new vantage point, apart from our everyday security practices, to truly see our Active Directory (AD) vulnerabilities. We get used to implementing the same techniques and checking the same areas for a breach. This pattern can re…
Suggested Courses
Course of the Month5 days, 5 hours left to enroll

636 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question