Delphi / C++Builder

Delphi and C++Builder localization for VCL applications.

Translate the forms and resource strings of the EXE, DLL, and BPL files you ship, with the DFM preview, check them, and write a localized EXE for each language or resource modules such as MyApp.DEU next to the unchanged EXE. No Delphi project, no rebuild.

Translated with another tool? See how migration works

Your build EXE MyApp.exe Lingobit Localizer Harbor Supply 12 New Order Neue Bestellung Customer: Kunde: Quantity: Menge: Create Cancel Erstellen Abbrechen The form as it is in the EXE, translated with its preview You ship EXE MyApp.exe DEde\ FRfr\ JAja\ A localized MyApp.exe in each language folder, or MyApp.DEU beside it Your build EXE MyApp.exe Translate in LingobitDFM preview Harbor Supply 12 New Order Neue Bestellung Customer: Kunde: Quantity: Menge: Create Cancel Erstellen Abbrechen You ship EXE MyApp.exe original DEde\ FRfr\ JAja\
Input
The .exe, .dll, and .bpl files you ship
Output
de\MyApp.exe, or MyApp.DEU next to the unchanged EXE
Runtime
Delphi loads MyApp.DEU by itself
Preview
Forms in the DFM preview
On this page

Tutorial

Localize a Delphi or C++Builder application, step by step.

Six steps from your EXE, DLL, and BPL files to a localized release.

Text in code Delphi ShowMessage('Saved.'); Stays in English in every language Extractor Text in resources Delphi ShowMessage(SSaved); PAS Messages.pas SSavedSaved. DE Gespeichert. Translated with the forms Text in code stays in English Delphi ShowMessage('Saved.'); Extractor Text in resources Delphi ShowMessage(SSaved); PAS Messages.pas SSavedSaved. DE Gespeichert. Translated with the forms
Pseudo Translate German Simulation · +30% Chinese Simulation Harbor Supply 12 Saved at 10:42 Orders ÖrderßÖ ?????? Customer: Cüßtömer:Cü 阿昂俩拉基豪拉恶: Quantity: Qüäntity:Qü 阿昂阿拉拉哈拉哟: Ship today Ship tödäyShi 俩色哈勒 拉基俄阿哟 Create Cancel CreäteC CäncelC 阿恶拉阿拉拉 阿阿拉阿拉瑟 Too long Still in English Not displayed Pseudo Translate German Simulation · +30% Chinese Simulation Harbor Supply 12 Saved at 10:42 Orders ÖrderßÖ ?????? Customer: Cüßtömer:Cü 阿昂俩拉基豪拉恶: Quantity: Qüäntity:Qü 阿昂阿拉拉哈拉哟: Ship today Ship tödäyShi 俩色哈勒 拉基俄阿哟 Create Cancel CreäteC CäncelC 阿恶拉阿拉拉 阿阿拉阿拉瑟 Too long Still in English Not displayed
  1. Text in code Delphi ShowMessage('Saved.'); Stays in English in every language Extractor Text in resources Delphi ShowMessage(SSaved); PAS Messages.pas SSavedSaved. DE Gespeichert. Translated with the forms Text in code stays in English Delphi ShowMessage('Saved.'); Extractor Text in resources Delphi ShowMessage(SSaved); PAS Messages.pas SSavedSaved. DE Gespeichert. Translated with the forms
  2. Pseudo Translate German Simulation · +30% Chinese Simulation Harbor Supply 12 Saved at 10:42 Orders ÖrderßÖ ?????? Customer: Cüßtömer:Cü 阿昂俩拉基豪拉恶: Quantity: Qüäntity:Qü 阿昂阿拉拉哈拉哟: Ship today Ship tödäyShi 俩色哈勒 拉基俄阿哟 Create Cancel CreäteC CäncelC 阿恶拉阿拉拉 阿阿拉阿拉瑟 Too long Still in English Not displayed Pseudo Translate German Simulation · +30% Chinese Simulation Harbor Supply 12 Saved at 10:42 Orders ÖrderßÖ ?????? Customer: Cüßtömer:Cü 阿昂俩拉基豪拉恶: Quantity: Qüäntity:Qü 阿昂阿拉拉哈拉哟: Ship today Ship tödäyShi 俩色哈勒 拉基俄阿哟 Create Cancel CreäteC CäncelC 阿恶拉阿拉拉 阿阿拉阿拉瑟 Too long Still in English Not displayed

Your build EXE MyApp.exe Project DE FR JA EXE MyApp.exe Forms TOrderForm TInvoiceForm String Table Version EXE Your build EXE MyApp.exe Project DE FR JA EXE MyApp.exe Forms TOrderForm TInvoiceForm String Table Version EXE
  1. Your build EXE MyApp.exe Project DE FR JA EXE MyApp.exe Forms TOrderForm TInvoiceForm String Table Version EXE Your build EXE MyApp.exe Project DE FR JA EXE MyApp.exe Forms TOrderForm TInvoiceForm String Table Version EXE

Project MyApp.exe TOrderForm TInvoiceForm String Table Harbor Supply Quantity: 12 Create Cancel New Order Neue Bestellung Customer: Kunde: SourceGerman New Order Neue Bestellung Customer: Kunde: Project MyApp.exe TOrderForm TInvoiceForm Harbor Supply Quantity: 12 Create Cancel New Order Neue Bestellung Customer: Kunde: SourceGerman New Order Neue Bestellung Customer: Kunde:
ProjectDEFRJAMyApp.exeFormsTOrderFormString Table PrepareTranslationTaskImportTranslationResults TranslatorDENew OrderNeue BestellungCustomer:Kunde:CreateErstellenSourceGermanNew OrderNeue BestellungCustomer:Kunde:Quantity:Menge:Validation on save Or their CAT toolXLIFF 1.2for the tool the translatoralready uses ProjectDEFRJAMyApp.exeFormsTOrderFormString Table PrepareTranslation Task TranslatorDENew OrderNeue BestellungCustomer:Kunde:CreateErstellenSourceGermanNew OrderNeue BestellungCustomer:Kunde:Quantity:Menge:Validation on save Or their CAT toolXLIFF 1.2for the tool the translatoralready uses ImportResults
Project Auto Translate Using Harbor Supply 12 New Order Neue Bestellung Customer: Kunde: Quantity: Menge: Ship today Noch heute versenden Create Cancel Erstellen Abbrechen DeepL… Google Translate… Azure Translator… Translation Memory… Terminology… Pseudo Translate… Project Auto Translate Using Harbor Supply 12 New Order Neue Bestellung Customer: Kunde: Quantity: Menge: Ship today Noch heute versenden Create Cancel Erstellen Abbrechen DeepL… Google Translate… Azure Translator… Translation Memory… Terminology… Pseudo Translate…
  1. Project MyApp.exe TOrderForm TInvoiceForm String Table Harbor Supply Quantity: 12 Create Cancel New Order Neue Bestellung Customer: Kunde: SourceGerman New Order Neue Bestellung Customer: Kunde: Project MyApp.exe TOrderForm TInvoiceForm Harbor Supply Quantity: 12 Create Cancel New Order Neue Bestellung Customer: Kunde: SourceGerman New Order Neue Bestellung Customer: Kunde:
  2. ProjectDEFRJAMyApp.exeFormsTOrderFormString Table PrepareTranslationTaskImportTranslationResults TranslatorDENew OrderNeue BestellungCustomer:Kunde:CreateErstellenSourceGermanNew OrderNeue BestellungCustomer:Kunde:Quantity:Menge:Validation on save Or their CAT toolXLIFF 1.2for the tool the translatoralready uses ProjectDEFRJAMyApp.exeFormsTOrderFormString Table PrepareTranslation Task TranslatorDENew OrderNeue BestellungCustomer:Kunde:CreateErstellenSourceGermanNew OrderNeue BestellungCustomer:Kunde:Quantity:Menge:Validation on save Or their CAT toolXLIFF 1.2for the tool the translatoralready uses ImportResults
  3. Project Auto Translate Using Harbor Supply 12 New Order Neue Bestellung Customer: Kunde: Quantity: Menge: Ship today Noch heute versenden Create Cancel Erstellen Abbrechen DeepL… Google Translate… Azure Translator… Translation Memory… Terminology… Pseudo Translate… Project Auto Translate Using Harbor Supply 12 New Order Neue Bestellung Customer: Kunde: Quantity: Menge: Ship today Noch heute versenden Create Cancel Erstellen Abbrechen DeepL… Google Translate… Azure Translator… Translation Memory… Terminology… Pseudo Translate…

Output · Validation Inconsistent format string SExportSummary Fixed Resource SExportSummary Source Export {0} pages to {1}. Export %d pages to %s. Export <b>all</b> pages. Export %1 pages to %2. German {0} Seiten nach {2} exportieren. %d Seiten nach %d exportieren. <b>Alle</i> Seiten exportieren. %1 Seiten nach %3 exportieren. {0} Seiten nach {1} exportieren. %d Seiten nach %s exportieren. <b>Alle</b> Seiten exportieren. %1 Seiten nach %2 exportieren. Output · Validation Inconsistent format string SExportSummary Fixed SExportSummary Source Export {0} pages to {1}. Export %d pages to %s. Export <b>all</b> pages. Export %1 pages to %2. German {0} Seiten nach {2} exportieren. %d Seiten nach %d exportieren. <b>Alle</i> Seiten exportieren. %1 Seiten nach %3 exportieren. {0} Seiten nach {1} exportieren. %d Seiten nach %s exportieren. <b>Alle</b> Seiten exportieren. %1 Seiten nach %2 exportieren.
MyApp · German ! An unexpected error occurred. OK Which translation causes it? German version: error Which translation causes it? All translations Run 1Error Run 2Works Run 3Error Run 4Works … Found Source Order {0} was saved. Translation Bestellung {1} wurde gespeichert. {1} instead of {0} makes the application fail. MyApp · German ! An unexpected error occurred. OK Which translation causes it? German version: error Which translation? All translations Run 1Error Run 2Works Run 3Error Run 4Works … Found Source Order {0} was saved. Translation Bestellung {1} wurde gespeichert. {1} instead of {0} makes the application fail.
  1. Output · Validation Inconsistent format string SExportSummary Fixed Resource SExportSummary Source Export {0} pages to {1}. Export %d pages to %s. Export <b>all</b> pages. Export %1 pages to %2. German {0} Seiten nach {2} exportieren. %d Seiten nach %d exportieren. <b>Alle</i> Seiten exportieren. %1 Seiten nach %3 exportieren. {0} Seiten nach {1} exportieren. %d Seiten nach %s exportieren. <b>Alle</b> Seiten exportieren. %1 Seiten nach %2 exportieren. Output · Validation Inconsistent format string SExportSummary Fixed SExportSummary Source Export {0} pages to {1}. Export %d pages to %s. Export <b>all</b> pages. Export %1 pages to %2. German {0} Seiten nach {2} exportieren. %d Seiten nach %d exportieren. <b>Alle</i> Seiten exportieren. %1 Seiten nach %3 exportieren. {0} Seiten nach {1} exportieren. %d Seiten nach %s exportieren. <b>Alle</b> Seiten exportieren. %1 Seiten nach %2 exportieren.
  2. MyApp · German ! An unexpected error occurred. OK Which translation causes it? German version: error Which translation causes it? All translations Run 1Error Run 2Works Run 3Error Run 4Works … Found Source Order {0} was saved. Translation Bestellung {1} wurde gespeichert. {1} instead of {0} makes the application fail. MyApp · German ! An unexpected error occurred. OK Which translation causes it? German version: error Which translation? All translations Run 1Error Run 2Works Run 3Error Run 4Works … Found Source Order {0} was saved. Translation Bestellung {1} wurde gespeichert. {1} instead of {0} makes the application fail.

Project MyApp.exe TOrderForm TInvoiceForm String Table DE FR JA Create Localized Files Run Localized Application Release folder EXE MyApp.exe BPL Reports.bpl unchanged DEde\MyApp.exe FRfr\MyApp.exe JAja\MyApp.exe Neue Bestellung Kunde: Harbor Supply Erstellen Abbrechen Project MyApp.exe TOrderForm TInvoiceForm Create Localized Files EXE MyApp.exe · Reports.bpl unchanged DEde\ FRfr\ JAja\ Run Localized Application Neue Bestellung Kunde: Harbor Supply Erstellen Abbrechen
New build EXE MyApp.exe DLL Core.dll no source code + Project Forms String Table Version DE FR JA = 新規注文 Nouvelle commande Neue Bestellung Kunde: Menge: Erstellen Run and test right away New build · no source code EXE DLL MyApp.exe Core.dll + Project Complete DE FR JA = Neue Bestellung Kunde: Erstellen Run and test right away
  1. Project MyApp.exe TOrderForm TInvoiceForm String Table DE FR JA Create Localized Files Run Localized Application Release folder EXE MyApp.exe BPL Reports.bpl unchanged DEde\MyApp.exe FRfr\MyApp.exe JAja\MyApp.exe Neue Bestellung Kunde: Harbor Supply Erstellen Abbrechen Project MyApp.exe TOrderForm TInvoiceForm Create Localized Files EXE MyApp.exe · Reports.bpl unchanged DEde\ FRfr\ JAja\ Run Localized Application Neue Bestellung Kunde: Harbor Supply Erstellen Abbrechen
  2. New build EXE MyApp.exe DLL Core.dll no source code + Project Forms String Table Version DE FR JA = 新規注文 Nouvelle commande Neue Bestellung Kunde: Menge: Erstellen Run and test right away New build · no source code EXE DLL MyApp.exe Core.dll + Project Complete DE FR JA = Neue Bestellung Kunde: Erstellen Run and test right away

MyApp.exe 1.0 1.1 New Order Customer: Client: Harbor Supply Quantity: 12 Ship today Gift wrap Create Cancel Project Scan for Changes Neue Bestellung Kunde: Updated Harbor Supply Menge: 12 Noch heute versenden Removed Gift wrap New Erstellen Abbrechen MyApp.exe 1.0 1.1 New Order Customer: Client: Harbor Supply Quantity: 12 Ship today Gift wrap Create Cancel Project Scan for Changes Neue Bestellung Kunde: Updated Harbor Supply Menge: 12 Noch heute versenden Removed Gift wrap New Erstellen Abbrechen
Translated earlier MyApp.exe de\ DE MyApp.exe fr\ FR MyApp.exe Project Not Translated Imported DE FR MyApp.exe Forms String Table Version Import from Localized Files Translated with another tool or long ago? Add your build: Lingobit finds the localized files and offers to import them. Import Translations from Localized Files Germande\MyApp.exe Frenchfr\MyApp.exe OK Cancel OK Translated earlier MyApp.exe de\ DE MyApp.exe fr\ FR MyApp.exe Project Not Translated Imported DE FR MyApp.exe Forms String Table Version Import from Localized Files Translated with another tool or long ago? Add your build: Lingobit offers the import. Import Translations from Localized Files Germande\MyApp.exe Frenchfr\MyApp.exe OK Cancel OK
  1. MyApp.exe 1.0 1.1 New Order Customer: Client: Harbor Supply Quantity: 12 Ship today Gift wrap Create Cancel Project Scan for Changes Neue Bestellung Kunde: Updated Harbor Supply Menge: 12 Noch heute versenden Removed Gift wrap New Erstellen Abbrechen MyApp.exe 1.0 1.1 New Order Customer: Client: Harbor Supply Quantity: 12 Ship today Gift wrap Create Cancel Project Scan for Changes Neue Bestellung Kunde: Updated Harbor Supply Menge: 12 Noch heute versenden Removed Gift wrap New Erstellen Abbrechen
  2. Translated earlier MyApp.exe de\ DE MyApp.exe fr\ FR MyApp.exe Project Not Translated Imported DE FR MyApp.exe Forms String Table Version Import from Localized Files Translated with another tool or long ago? Add your build: Lingobit finds the localized files and offers to import them. Import Translations from Localized Files Germande\MyApp.exe Frenchfr\MyApp.exe OK Cancel OK Translated earlier MyApp.exe de\ DE MyApp.exe fr\ FR MyApp.exe Project Not Translated Imported DE FR MyApp.exe Forms String Table Version Import from Localized Files Translated with another tool or long ago? Add your build: Lingobit offers the import. Import Translations from Localized Files Germande\MyApp.exe Frenchfr\MyApp.exe OK Cancel OK

Lingobit reads the forms of your build and writes them back translated.

Delphi and C++Builder compile forms and resource strings into your EXE, DLL, and BPL files. Lingobit opens those files, shows each form and string table in one tree, and writes the same files with translated resources. Your Pascal and C++ code is not touched, and nothing is rebuilt.

Source code Build no source code · no rebuild Lingobit starts here What you ship EXE MyApp.exe DLL Core.dll Project MyApp.exe Dialogs Menus String Table Core.dll String Table Source code · Build Lingobit starts here EXE MyApp.exe DLL Core.dll Project MyApp.exe Dialogs Menus String Table Core.dll String Table

Lingobit does

  • Translates form captions, labels, hints, list items, and titles, resource strings, and version information.
  • Shows forms in the DFM preview, where you move and resize controls for longer text.
  • Checks overlapping controls, accelerators, placeholders, and more.
  • Writes a localized file for each language, or resource modules next to the EXE.

Your project keeps

  • The Pascal or C++ code and the build in RAD Studio.
  • Keeping messages in resourcestring sections, not in code.
  • The installer and the files it ships.
  • The final test in the running application.

Lingobit also opens .dfm files on their own, for a form that is not compiled yet.

Output options: choose by how you ship.

The default is a localized copy of each file in a language folder. Resource modules keep one EXE for every language, and Delphi picks the module for the Windows language by itself.

Localized EXE, DLL, or BPL files

Release folderEXEMyApp.exeoriginalDEde\MyApp.exeFRfr\MyApp.exeJAja\MyApp.exeUse when: each language hasits own deployment package.At run timeNeue BestellungKunde:Menge:ErstellenThe application in German Release folderEXEMyApp.exeoriginalDEde\MyApp.exeFRfr\MyApp.exeJAja\MyApp.exeUse when: each language hasits own deployment package.Neue BestellungKunde:Menge:Erstellen

Resource modules

Release folderEXEMyApp.exeunchangedDLLMyApp.DEUDLLMyApp.FRADLLMyApp.JPNUse when: one executable shouldsupport several languages.At run timeNeue BestellungKunde:Menge:ErstellenDelphi loads the modulefor the Windows language by itself Release folderEXEMyApp.exeunchangedDLLMyApp.DEUDLLMyApp.FRADLLMyApp.JPNUse when: one executable shouldsupport several languages.Neue BestellungKunde:Menge:ErstellenDelphi loads the modulefor the Windows language by itself

Reference

Delphi loads the resource module by itself.

At startup, the Delphi runtime looks next to MyApp.exe for a module named after the Windows language: MyApp.DEU for German (Germany), then MyApp.DE. Without one, the application uses the resources in its own EXE.

WindowsGerman (Germany)de-DE Delphi looks forMyApp.DEUloadedMyApp.DEnextMyApp.exeif neither Your application Neue BestellungKunde:Menge:Erstellen The Delphi runtime loads the module at startup; no code of yours is needed. WindowsGerman (Germany)de-DE Delphi looks forMyApp.DEUloadedMyApp.DEnextMyApp.exeif neither Neue BestellungKunde:Menge: The Delphi runtime loads the moduleat startup; no code of yours is needed.
  • A localized EXE needs no loading code: the installer puts de\MyApp.exe in place, or a shortcut starts it.
  • A language without a country gets a two-letter module: neutral German gives MyApp.DE, which Delphi loads too.

Choose the language in your app.

Delphi follows the Windows language. To let users pick another one, save their choice where the runtime reads it at startup: a value in its Locales key under HKEY_CURRENT_USER, named after the full path of MyApp.exe. The key name depends on your Delphi version; Software\Borland\Locales is the one shown here.

  1. List the languages you ship from the modules next to MyApp.exe.
  2. Save the user's choice as the module extension, such as DEU.
  3. Restart the application: the runtime reads the choice before your code runs.
uses Registry;

procedure SaveLanguage(const Ext: string);   // 'DEU', 'FRA', ...
begin
  with TRegistry.Create do
  try
    OpenKey('Software\Borland\Locales', True);
    WriteString(ParamStr(0), Ext);   // used from the next start
  finally
    Free;
  end;
end;

Do and don't.

Do

  • Localize the Release build you ship, with its DLL and BPL files.
  • Keep messages in resourcestring sections; move hard-coded strings with Lingobit Extractor.
  • Keep form and component names stable between releases.
  • Leave room in forms, and resize controls in the DFM preview where German runs long.
  • Name each resource module after its EXE and keep it in the same folder.

Don't

  • Build messages from translated pieces in code.
  • Edit localized forms by hand: Create Localized Files writes them from your next build.
  • Send Pascal, C++, or DFM files to translators.

Troubleshooting.

Symptoms, causes, and what to do
SymptomLikely causeWhat to do
The application stays in English with resource modulesThe module is not next to MyApp.exe, its name does not match the EXE, or its language is not the Windows languageCheck the folder and the name, or save the language in the Locales key
Text is cut off in a formThe translation is longer than the controlRun Validation: it reports overlapping controls. Resize the control in the DFM preview
Two menu items share a shortcutThe translation repeats an accelerator letterValidation reports duplicate and missing accelerators
Create Localized Files reports characters that cannot be encodedVCL Unicode Support is Off, and the translation has characters outside the language's code pageFor a Unicode application (Delphi 2009 and later), set VCL Unicode Support to On; otherwise remove the characters
Japanese text shows as question marksThe application is not Unicode, and Windows shows its text in the system code pageTest with Japanese as the language for non-Unicode programs, or move the application to a Unicode Delphi version

More about Delphi and C++Builder localization.

DFM files as input

Lingobit also takes .dfm, .nfm, and .rtm form files. When you start from .dfm files, Create Localized Files writes a translated copy for each language, such as de\MainForm.dfm, and your team builds the localized forms in its own Delphi build or packaging process.

Use DFM files when localization must happen before compilation, when the team already has a DFM-based workflow, or when a legacy project cannot yet move to binary localization. Prefer binary localization when you want to localize the application exactly as it ships, without project files for translators or manual IDE steps for each language.

Delphi source code: preparation only

When user-facing strings are still hardcoded in Pascal code, developers move them into resourcestring declarations before localization starts; Lingobit Extractor finds them. Pascal source files are not the translator's handoff, and translation does not change event handlers, component logic, or application behavior.

unit AppResources;

interface

resourcestring
  SWelcomeMessage = 'Welcome';
  SSaveChanges = 'Save changes before closing?';

implementation

end.
Clear boundaries
  • Translators do not work in the Delphi IDE, and form preview is not an IDE replacement: forms are not redesigned there.
  • Lingobit does not redesign the application's internationalization or move hardcoded strings into resources for you.
  • The application decides between localized binaries and resource modules, packages them, and offers any language choice other than the Windows language.